[
  {
    "path": ".github/workflows/Release to server.yml",
    "content": "name: Release to Server\n\non:\n  release:\n    types: [published]\n\njobs:\n  deploy-installer:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: read\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Configure AWS Credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          role-to-assume: ${{ secrets.AWS_IAM_ROLE_TO_ASSUME }}\n          aws-region: ${{ secrets.AWS_REGION }}\n\n      - name: Get release version and installer name\n        id: get_version\n        run: |\n          VERSION=$(echo \"${{ github.event.release.tag_name }}\" | sed 's/^v//')\n          echo \"version=$VERSION\" >> $GITHUB_OUTPUT\n          echo \"local_installer_name=Game.Cheats.Manager.Setup.$VERSION.exe\" >> $GITHUB_OUTPUT\n          echo \"server_installer_name=Game Cheats Manager Setup $VERSION.exe\" >> $GITHUB_OUTPUT\n\n      - name: Download release asset\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          gh release download ${{ github.event.release.tag_name }} --pattern \"${{ steps.get_version.outputs.local_installer_name }}\"\n\n      - name: Delete previous stable installers from S3\n        env:\n          S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}\n          S3_GCM_PREFIX: \"GCM\"\n        run: |\n          aws s3 rm \"s3://${S3_BUCKET_NAME}/${S3_GCM_PREFIX}/\" \\\n            --recursive \\\n            --exclude \"*\" \\\n            --include \"Game Cheats Manager Setup*.exe\" \\\n            --exclude \"*beta*\"\n          echo \"Previous stable installers deleted from s3://${S3_BUCKET_NAME}/${S3_GCM_PREFIX}/\"\n\n      - name: Upload new installer to AWS S3\n        env:\n          S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}\n          S3_GCM_PREFIX: \"GCM\"\n        run: |\n          LOCAL_INSTALLER_NAME=\"${{ steps.get_version.outputs.local_installer_name }}\"\n          SERVER_INSTALLER_NAME=\"${{ steps.get_version.outputs.server_installer_name }}\"\n          aws s3 cp \"./${LOCAL_INSTALLER_NAME}\" \"s3://${S3_BUCKET_NAME}/${S3_GCM_PREFIX}/${SERVER_INSTALLER_NAME}\"\n          echo \"'${LOCAL_INSTALLER_NAME}' uploaded to s3://${S3_BUCKET_NAME}/${S3_GCM_PREFIX}/\"\n\n      - name: Create CloudFront Invalidation\n        env:\n          CLOUDFRONT_DISTRIBUTION_ID: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }}\n          S3_PREFIX_FOR_INVALIDATION: \"GCM\"\n        run: |\n          echo \"Creating invalidation for path /${S3_PREFIX_FOR_INVALIDATION}/*\"\n          aws cloudfront create-invalidation \\\n            --distribution-id $CLOUDFRONT_DISTRIBUTION_ID \\\n            --paths \"/${S3_PREFIX_FOR_INVALIDATION}/*\"\n"
  },
  {
    "path": ".gitignore",
    "content": "__pycache__\nsecret_config.py\n.venv\n.vscode\n.DS_Store\n*.mo\ndist/\ncompile.ps1\nutility.py\nResourceHacker.ini\nelevate.manifest\ncpp/"
  },
  {
    "path": "Game Trainers/.gitignore",
    "content": "build/\n.vscode/\nbin/\nobj/\n.venv/\n*.sln\n*.ps1\nMonoBridge.dll\nGCMInjection.dll\nIL2CPP.dll\ntrainers/**/*.ttf\nprocess_user_trainers.py\nuser_trainers.json\nuser_trainers.xlsx\ncompleted_trainers.txt\nUser Trainers/\ndocuments/*.txt\ndocuments/*.md"
  },
  {
    "path": "Game Trainers/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.15)\n\nproject(GameTrainers LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_MSVC_RUNTIME_LIBRARY \"MultiThreaded$<$<CONFIG:Debug>:Debug>\")\n\n# Trainer architecture requirements (format: \"TrainerName:architecture\")\n# Used by both CMakeLists.txt and build_all.ps1 (which parses this file)\nset(TRAINER_ARCHITECTURES\n    \"Arrow a Row Trainer:x64\"\n    \"DREDGE Trainer:x86\"\n    \"Feeding Frenzy 2_Shipwreck Showdown Trainer:x86\"\n    \"Headbangers_Rhythm Royale Trainer:x64\"\n    \"Heavy Weapon Trainer:x86\"\n    \"Inotia 4 Trainer:x64\"\n    \"Just Shapes & Beats Trainer:x64\"\n    \"Oil Rush Trainer:x86\"\n    \"Outland Trainer:x86\"\n    \"Plants vs. Zombies_GOTY Edition Trainer:x86\"\n    \"Plants vs. Zombies_Replanted Trainer:x64\"\n    \"PvZ2 Gardendless Trainer:x64\"\n    \"Wizard of Legend 2 Trainer:x64\"\n)\n\nadd_subdirectory(common)\n\n# Determine current platform\nif(CMAKE_GENERATOR_PLATFORM STREQUAL \"x64\" OR CMAKE_SIZEOF_VOID_P EQUAL 8)\n    set(CURRENT_PLATFORM \"x64\")\nelse()\n    set(CURRENT_PLATFORM \"x86\")\nendif()\n\nmessage(STATUS \"Building for platform: ${CURRENT_PLATFORM}\")\n\n# Add each game-specific trainer with architecture information\nforeach(TRAINER_SPEC ${TRAINER_ARCHITECTURES})\n    string(REPLACE \":\" \";\" TRAINER_PARTS ${TRAINER_SPEC})\n    list(GET TRAINER_PARTS 0 TRAINER_NAME)\n    list(GET TRAINER_PARTS 1 TRAINER_ARCH)\n    \n    set(TRAINER_DIR \"trainers/${TRAINER_NAME}\")\n    set(TRAINER_REQUIRED_ARCH ${TRAINER_ARCH})\n    \n    # Only add trainers matching the current platform\n    if(TRAINER_ARCH STREQUAL CURRENT_PLATFORM)\n        message(STATUS \"Adding: ${TRAINER_NAME} (${TRAINER_ARCH})\")\n        add_subdirectory(${TRAINER_DIR})\n    else()\n        message(STATUS \"Skipping: ${TRAINER_NAME} (requires ${TRAINER_ARCH}, building for ${CURRENT_PLATFORM})\")\n    endif()\nendforeach()"
  },
  {
    "path": "Game Trainers/common/CMakeLists.txt",
    "content": "add_library(Common INTERFACE)\n\n# Set include directories for Common\ntarget_include_directories(Common INTERFACE\n    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n    $<INSTALL_INTERFACE:include>\n)\n\n# Define FLTK library directory based on architecture\nif(CMAKE_SIZEOF_VOID_P EQUAL 8)\n    # 64-bit architecture\n    set(FLTK_LIB_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/libs/x64\")\n    set(FLTK_LIBS\n        \"${FLTK_LIB_DIR}/fltk.lib\"\n        \"${FLTK_LIB_DIR}/fltk_forms.lib\"\n        \"${FLTK_LIB_DIR}/fltk_images.lib\"\n        \"${FLTK_LIB_DIR}/fltk_png.lib\"\n        \"${FLTK_LIB_DIR}/fltk_z.lib\"\n    )\n    set(MONO_BRIDGE_DEST_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/libs/x64\")\n    set(MINHOOK_LIB \"${CMAKE_CURRENT_SOURCE_DIR}/libs/x64/libMinHook.x64.lib\")\nelse()\n    # 32-bit architecture\n    set(FLTK_LIB_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/libs/x86\")\n    set(FLTK_LIBS\n        \"${FLTK_LIB_DIR}/fltk.lib\"\n        \"${FLTK_LIB_DIR}/fltk_forms.lib\"\n        \"${FLTK_LIB_DIR}/fltk_images.lib\"\n        \"${FLTK_LIB_DIR}/fltk_png.lib\"\n        \"${FLTK_LIB_DIR}/fltk_z.lib\"\n    )\n    set(MONO_BRIDGE_DEST_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/libs/x86\")\n    set(MINHOOK_LIB \"${CMAKE_CURRENT_SOURCE_DIR}/libs/x86/libMinHook.x86.lib\")\nendif()\n\n# Link FLTK and Windows libraries to Common\ntarget_link_libraries(Common INTERFACE\n    ${FLTK_LIBS}\n    comctl32\n    gdiplus\n    ws2_32\n    shlwapi\n)\n\n# Define MonoBridge as a shared library\nadd_library(MonoBridge SHARED\n    \"${CMAKE_CURRENT_SOURCE_DIR}/include/MonoBridge.cpp\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/include/MonoBridge.def\"\n)\n\n# Link MonoBridge to Common\ntarget_link_libraries(MonoBridge PRIVATE Common)\n\n# Post-build command to move only MonoBridge.dll to the destination\nadd_custom_command(TARGET MonoBridge POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different\n        \"$<TARGET_FILE:MonoBridge>\"\n        \"${MONO_BRIDGE_DEST_DIR}/MonoBridge.dll\"\n    COMMENT \"Moving MonoBridge.dll to ${MONO_BRIDGE_DEST_DIR}\"\n)\n"
  },
  {
    "path": "Game Trainers/common/assets/elevate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n    <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n        <security>\n            <requestedPrivileges>\n                <requestedExecutionLevel level=\"requireAdministrator\" uiAccess=\"false\"/>\n            </requestedPrivileges>\n        </security>\n    </trustInfo>\n</assembly>"
  },
  {
    "path": "Game Trainers/common/include/CDPBase.h",
    "content": "// CDPBase.h\n// Base class for trainers targeting web-based desktop games (Tauri/WebView2, Electron, CEF, NW.js).\n// Communicates via Chrome DevTools Protocol (CDP) over a persistent WebSocket connection.\n// Derived classes implement game-specific cheat functions using executeJS().\n#pragma once\n\n#include <winsock2.h>\n#include <Windows.h>\n#include <winhttp.h>\n#include <string>\n#include <vector>\n#include <chrono>\n#include <iostream>\n#include <shlobj.h>\n#include <filesystem>\n#include <fstream>\n#include <nlohmann/json.hpp>\n\n#pragma comment(lib, \"winhttp.lib\")\n\nusing json = nlohmann::json;\n\n/// How the game process receives the remote debugging port argument.\nenum class CDPLaunchMethod\n{\n    /// WebView2 / Tauri: set env var WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS\n    WebView2EnvVar,\n    /// Electron / CEF / NW.js: append --remote-debugging-port=PORT to command line\n    CommandLineArg\n};\n\nclass CDPBase\n{\npublic:\n    std::string gamePath;\n\n    CDPBase(const std::string &settingsKey, CDPLaunchMethod method = CDPLaunchMethod::WebView2EnvVar)\n        : settingsKey_(settingsKey), launchMethod_(method)\n    {\n        loadSettings();\n    }\n\n    virtual ~CDPBase()\n    {\n        wsDisconnect();\n    }\n\n    // ============================================================\n    // FLTKUtils compatibility interface\n    // ============================================================\n\n    std::wstring getProcessName() const\n    {\n        return L\"localhost:\" + std::to_wstring(cdpPort_);\n    }\n\n    DWORD getProcessId() const\n    {\n        return lastCheckResult_ ? (DWORD)cdpPort_ : 0;\n    }\n\n    void cleanUp()\n    {\n        lastCheckResult_ = false;\n    }\n\n    /// Called periodically by FLTKUtils timer (~1s).\n    bool isProcessRunning()\n    {\n        if (!gameLaunched_)\n            return false;\n\n        auto now = std::chrono::steady_clock::now();\n        auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastCheckTime_).count();\n\n        if (elapsed < 3000)\n            return lastCheckResult_;\n\n        lastCheckTime_ = now;\n\n        if (wsHandle_)\n        {\n            std::string pingResult;\n            lastCheckResult_ = wsEvaluate(cachedWsPath_, \"1\", &pingResult);\n        }\n        else\n        {\n            // WebSocket is down — quick HTTP check first (fast fail if game is gone)\n            if (!checkCDP())\n            {\n                lastCheckResult_ = false;\n            }\n            else\n            {\n                // Game is still alive — try to reconnect WebSocket\n                if (cachedWsPath_.empty())\n                    discoverPageWsPath(cachedWsPath_);\n\n                if (!cachedWsPath_.empty())\n                    lastCheckResult_ = wsReconnect(cachedWsPath_);\n                else\n                    lastCheckResult_ = true; // CDP alive, just can't get WS yet\n            }\n        }\n\n        if (!lastCheckResult_)\n        {\n            cdpFailCount_++;\n            if (cdpFailCount_ >= 3)\n            {\n                wsDisconnect();\n                cachedWsPath_.clear();\n                gameLaunched_ = false;\n                cdpFailCount_ = 0;\n            }\n        }\n        else\n        {\n            cdpFailCount_ = 0;\n        }\n\n        return lastCheckResult_;\n    }\n\n    // ============================================================\n    // Game Launching\n    // ============================================================\n\n    bool launchGame()\n    {\n        if (gamePath.empty())\n            return false;\n\n        cdpPort_ = findFreePort(9222);\n\n        std::string workDir = gamePath;\n        size_t lastSlash = workDir.find_last_of(\"\\\\/\");\n        if (lastSlash != std::string::npos)\n            workDir = workDir.substr(0, lastSlash);\n\n        STARTUPINFOA si = {};\n        PROCESS_INFORMATION pi = {};\n        si.cb = sizeof(si);\n\n        bool ok = false;\n\n        if (launchMethod_ == CDPLaunchMethod::WebView2EnvVar)\n        {\n            std::string envVal = \"--remote-debugging-port=\" + std::to_string(cdpPort_);\n            SetEnvironmentVariableA(\"WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS\", envVal.c_str());\n\n            ok = CreateProcessA(\n                gamePath.c_str(), nullptr, nullptr, nullptr, FALSE,\n                CREATE_NEW_PROCESS_GROUP, nullptr, workDir.c_str(), &si, &pi);\n        }\n        else // CDPLaunchMethod::CommandLineArg\n        {\n            std::string cmdLine = \"\\\"\" + gamePath + \"\\\" --remote-debugging-port=\" + std::to_string(cdpPort_);\n            ok = CreateProcessA(\n                nullptr, cmdLine.data(), nullptr, nullptr, FALSE,\n                CREATE_NEW_PROCESS_GROUP, nullptr, workDir.c_str(), &si, &pi);\n        }\n\n        if (ok)\n        {\n            CloseHandle(pi.hProcess);\n            CloseHandle(pi.hThread);\n            gameLaunched_ = true;\n            saveSettings();\n        }\n\n        return ok;\n    }\n\n    // ============================================================\n    // Core JS Execution via CDP\n    // ============================================================\n\n    /// Execute JavaScript in the game's web context via CDP.\n    /// @param expression  JS code to evaluate (should return 'ok' on success)\n    /// @param result      Optional: receives the return value as string\n    /// @return true if JS executed and did NOT return a 'fail' string\n    bool executeJS(const std::string &expression, std::string *result = nullptr)\n    {\n        std::string safeExpr = \"try{\" + expression + \"}catch(_e){'fail: '+_e.message}\";\n\n        if (cachedWsPath_.empty())\n        {\n            if (!discoverPageWsPath(cachedWsPath_))\n            {\n                std::cerr << \"[!] Failed to discover CDP page target.\\n\";\n                return false;\n            }\n        }\n\n        std::string jsResult;\n        bool connected = wsEvaluate(cachedWsPath_, safeExpr, &jsResult);\n\n        if (!connected)\n        {\n            wsDisconnect();\n            cachedWsPath_.clear();\n            if (discoverPageWsPath(cachedWsPath_))\n                connected = wsEvaluate(cachedWsPath_, safeExpr, &jsResult);\n            if (!connected)\n                return false;\n        }\n\n        if (result)\n            *result = jsResult;\n\n        if (jsResult.size() >= 4 && jsResult.compare(0, 4, \"fail\") == 0)\n            return false;\n\n        return true;\n    }\n\n    // ============================================================\n    // Settings Persistence\n    // ============================================================\n\n    void saveSettings()\n    {\n        std::string path = getSettingsFilePath();\n        json settings;\n\n        std::ifstream ifile(path);\n        if (ifile.is_open())\n        {\n            try\n            {\n                ifile >> settings;\n            }\n            catch (...)\n            {\n            }\n            ifile.close();\n        }\n        else\n        {\n            std::filesystem::create_directories(std::filesystem::path(path).parent_path());\n        }\n\n        settings[\"game_path\"] = gamePath;\n\n        std::ofstream ofile(path);\n        ofile << settings.dump(4);\n    }\n\n    void loadSettings()\n    {\n        std::string path = getSettingsFilePath();\n        std::ifstream file(path);\n        if (!file.is_open())\n            return;\n\n        try\n        {\n            json settings;\n            file >> settings;\n\n            if (settings.contains(\"game_path\"))\n                gamePath = settings[\"game_path\"].get<std::string>();\n        }\n        catch (...)\n        {\n        }\n    }\n\nprivate:\n    std::string settingsKey_;\n    CDPLaunchMethod launchMethod_;\n\n    int cdpPort_ = 9222;\n    bool gameLaunched_ = false;\n    bool lastCheckResult_ = false;\n    int cdpFailCount_ = 0;\n    std::string cachedWsPath_;\n    std::chrono::steady_clock::time_point lastCheckTime_;\n\n    // Persistent WebSocket connection handles\n    HINTERNET wsSession_ = nullptr;\n    HINTERNET wsConnect_ = nullptr;\n    HINTERNET wsHandle_ = nullptr;\n    int nextMsgId_ = 1;\n\n    std::string getSettingsFilePath()\n    {\n        PWSTR appdata = nullptr;\n        SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &appdata);\n        std::filesystem::path dir(appdata);\n        CoTaskMemFree(appdata);\n        return (dir / \"GCM Settings\" / (settingsKey_ + \".json\")).string();\n    }\n\n    int findFreePort(int startPort)\n    {\n        for (int port = startPort; port < startPort + 100; ++port)\n        {\n            SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n            if (sock == INVALID_SOCKET)\n                continue;\n\n            sockaddr_in addr = {};\n            addr.sin_family = AF_INET;\n            addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);\n            addr.sin_port = htons((u_short)port);\n\n            int result = bind(sock, (sockaddr *)&addr, sizeof(addr));\n            closesocket(sock);\n\n            if (result == 0)\n                return port;\n        }\n        return startPort;\n    }\n\n    // ============================================================\n    // CDP HTTP / WebSocket Implementation\n    // ============================================================\n\n    bool checkCDP()\n    {\n        HINTERNET hSession = WinHttpOpen(L\"CDPTrainer\", WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);\n        if (!hSession)\n            return false;\n\n        DWORD connectTimeout = 200;\n        DWORD ioTimeout = 300;\n        WinHttpSetOption(hSession, WINHTTP_OPTION_CONNECT_TIMEOUT, &connectTimeout, sizeof(connectTimeout));\n        WinHttpSetOption(hSession, WINHTTP_OPTION_RECEIVE_TIMEOUT, &ioTimeout, sizeof(ioTimeout));\n        WinHttpSetOption(hSession, WINHTTP_OPTION_SEND_TIMEOUT, &ioTimeout, sizeof(ioTimeout));\n\n        HINTERNET hConnect = WinHttpConnect(hSession, L\"localhost\", (INTERNET_PORT)cdpPort_, 0);\n        if (!hConnect)\n        {\n            WinHttpCloseHandle(hSession);\n            return false;\n        }\n\n        HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\"GET\", L\"/json/version\",\n                                                NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);\n        if (!hRequest)\n        {\n            WinHttpCloseHandle(hConnect);\n            WinHttpCloseHandle(hSession);\n            return false;\n        }\n\n        bool ok = false;\n        if (WinHttpSendRequest(hRequest, NULL, 0, NULL, 0, 0, 0) &&\n            WinHttpReceiveResponse(hRequest, NULL))\n        {\n            DWORD statusCode = 0;\n            DWORD sz = sizeof(statusCode);\n            WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,\n                                NULL, &statusCode, &sz, NULL);\n            ok = (statusCode == 200);\n        }\n\n        WinHttpCloseHandle(hRequest);\n        WinHttpCloseHandle(hConnect);\n        WinHttpCloseHandle(hSession);\n        return ok;\n    }\n\n    std::string httpGet(const wchar_t *path)\n    {\n        HINTERNET hSession = WinHttpOpen(L\"CDPTrainer\", WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);\n        if (!hSession)\n            return \"\";\n\n        DWORD timeout = 500;\n        WinHttpSetOption(hSession, WINHTTP_OPTION_CONNECT_TIMEOUT, &timeout, sizeof(timeout));\n        WinHttpSetOption(hSession, WINHTTP_OPTION_RECEIVE_TIMEOUT, &timeout, sizeof(timeout));\n        WinHttpSetOption(hSession, WINHTTP_OPTION_SEND_TIMEOUT, &timeout, sizeof(timeout));\n\n        HINTERNET hConnect = WinHttpConnect(hSession, L\"localhost\", (INTERNET_PORT)cdpPort_, 0);\n        if (!hConnect)\n        {\n            WinHttpCloseHandle(hSession);\n            return \"\";\n        }\n\n        HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\"GET\", path,\n                                                NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);\n        if (!hRequest)\n        {\n            WinHttpCloseHandle(hConnect);\n            WinHttpCloseHandle(hSession);\n            return \"\";\n        }\n\n        std::string body;\n        if (WinHttpSendRequest(hRequest, NULL, 0, NULL, 0, 0, 0) &&\n            WinHttpReceiveResponse(hRequest, NULL))\n        {\n            DWORD avail = 0;\n            while (WinHttpQueryDataAvailable(hRequest, &avail) && avail > 0)\n            {\n                std::vector<char> buf(avail);\n                DWORD bytesRead = 0;\n                WinHttpReadData(hRequest, buf.data(), avail, &bytesRead);\n                body.append(buf.data(), bytesRead);\n            }\n        }\n\n        WinHttpCloseHandle(hRequest);\n        WinHttpCloseHandle(hConnect);\n        WinHttpCloseHandle(hSession);\n        return body;\n    }\n\n    bool discoverPageWsPath(std::string &outPath)\n    {\n        std::string body = httpGet(L\"/json\");\n        if (body.empty())\n            return false;\n\n        json targets = json::parse(body, nullptr, false);\n        if (targets.is_discarded() || !targets.is_array())\n            return false;\n\n        for (auto &target : targets)\n        {\n            if (target.value(\"type\", \"\") == \"page\")\n            {\n                std::string wsUrl = target.value(\"webSocketDebuggerUrl\", \"\");\n                if (wsUrl.empty())\n                    continue;\n\n                size_t pathStart = wsUrl.find('/', wsUrl.find(\"//\") + 2);\n                if (pathStart != std::string::npos)\n                {\n                    outPath = wsUrl.substr(pathStart);\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    bool wsEvaluate(const std::string &wsPath, const std::string &expression, std::string *result)\n    {\n        if (!wsHandle_ && !wsReconnect(wsPath))\n            return false;\n\n        int msgId = nextMsgId_++;\n\n        json msg = {\n            {\"id\", msgId},\n            {\"method\", \"Runtime.evaluate\"},\n            {\"params\", {{\"expression\", expression}, {\"returnByValue\", true}, {\"awaitPromise\", false}}}};\n        std::string msgStr = msg.dump();\n\n        DWORD err = WinHttpWebSocketSend(wsHandle_,\n                                         WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE,\n                                         (PVOID)msgStr.c_str(), (DWORD)msgStr.size());\n\n        if (err != ERROR_SUCCESS)\n        {\n            wsDisconnect();\n            return false;\n        }\n\n        for (int attempts = 0; attempts < 50; attempts++)\n        {\n            std::string response = wsReadMessage(wsHandle_);\n            if (response.empty())\n            {\n                wsDisconnect();\n                return false;\n            }\n\n            json resp = json::parse(response, nullptr, false);\n            if (resp.is_discarded())\n                continue;\n\n            if (resp.contains(\"id\") && resp[\"id\"].get<int>() == msgId)\n            {\n                if (result && resp.contains(\"result\") && resp[\"result\"].contains(\"result\"))\n                {\n                    auto &val = resp[\"result\"][\"result\"];\n                    if (val.contains(\"value\"))\n                    {\n                        if (val[\"value\"].is_string())\n                            *result = val[\"value\"].get<std::string>();\n                        else\n                            *result = val[\"value\"].dump();\n                    }\n                }\n                return true;\n            }\n        }\n\n        wsDisconnect();\n        return false;\n    }\n\n    bool wsReconnect(const std::string &wsPath)\n    {\n        wsDisconnect();\n\n        wsSession_ = WinHttpOpen(L\"CDPTrainer\", WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);\n        if (!wsSession_)\n            return false;\n\n        DWORD connectTimeout = 500;\n        DWORD sendRecvTimeout = 3000;\n        WinHttpSetOption(wsSession_, WINHTTP_OPTION_CONNECT_TIMEOUT, &connectTimeout, sizeof(connectTimeout));\n        WinHttpSetOption(wsSession_, WINHTTP_OPTION_RECEIVE_TIMEOUT, &sendRecvTimeout, sizeof(sendRecvTimeout));\n        WinHttpSetOption(wsSession_, WINHTTP_OPTION_SEND_TIMEOUT, &sendRecvTimeout, sizeof(sendRecvTimeout));\n\n        wsConnect_ = WinHttpConnect(wsSession_, L\"localhost\", (INTERNET_PORT)cdpPort_, 0);\n        if (!wsConnect_)\n        {\n            wsDisconnect();\n            return false;\n        }\n\n        std::wstring wPath(wsPath.begin(), wsPath.end());\n        HINTERNET hRequest = WinHttpOpenRequest(wsConnect_, L\"GET\", wPath.c_str(),\n                                                NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);\n        if (!hRequest)\n        {\n            wsDisconnect();\n            return false;\n        }\n\n        WinHttpSetOption(hRequest, WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET, NULL, 0);\n\n        if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, 0) ||\n            !WinHttpReceiveResponse(hRequest, NULL))\n        {\n            WinHttpCloseHandle(hRequest);\n            wsDisconnect();\n            return false;\n        }\n\n        wsHandle_ = WinHttpWebSocketCompleteUpgrade(hRequest, 0);\n        WinHttpCloseHandle(hRequest);\n\n        if (!wsHandle_)\n        {\n            wsDisconnect();\n            return false;\n        }\n\n        return true;\n    }\n\n    void wsDisconnect()\n    {\n        if (wsHandle_)\n        {\n            WinHttpCloseHandle(wsHandle_);\n            wsHandle_ = nullptr;\n        }\n        if (wsConnect_)\n        {\n            WinHttpCloseHandle(wsConnect_);\n            wsConnect_ = nullptr;\n        }\n        if (wsSession_)\n        {\n            WinHttpCloseHandle(wsSession_);\n            wsSession_ = nullptr;\n        }\n    }\n\n    std::string wsReadMessage(HINTERNET hWs)\n    {\n        std::string message;\n        char buffer[8192];\n        DWORD bytesRead = 0;\n        WINHTTP_WEB_SOCKET_BUFFER_TYPE bufferType;\n\n        do\n        {\n            DWORD err = WinHttpWebSocketReceive(hWs, buffer, sizeof(buffer), &bytesRead, &bufferType);\n            if (err != ERROR_SUCCESS)\n                return \"\";\n\n            if (bufferType == WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE)\n                return \"\";\n\n            message.append(buffer, bytesRead);\n        } while (bufferType == WINHTTP_WEB_SOCKET_UTF8_FRAGMENT_BUFFER_TYPE ||\n                 bufferType == WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE);\n\n        return message;\n    }\n};\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Enumerations.H",
    "content": "//\n// Enumerations for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2025 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n    This file contains type definitions and general enumerations.\n */\n\n#ifndef Fl_Enumerations_H\n#define Fl_Enumerations_H\n\n/*\n ******************************************************************************\n * FL_ABI_VERSION is defined by configure or CMake since FLTK 1.3.4.\n * It is written to FL/fl_config.h and #included here.\n ******************************************************************************\n * For more informations on FL_ABI_VERSION see README.abi-version.txt.\n ******************************************************************************\n */\n\n#include <FL/fl_config.h>\n\n#  include \"Fl_Export.H\"\n#  include \"fl_types.h\"\n#  include <FL/platform_types.h> // for FL_COMMAND and FL_CONTROL\n\n// Current FLTK version: 1.4.2\n\n/** \\name Version Numbers\n\n    FLTK defines some constants to help the programmer to\n    find out, for which FLTK version a program is compiled.\n\n    The following constants are defined:\n */\n/**@{*/\n\n/**\n   The major release version of this FLTK library.\n   \\see FL_VERSION\n */\n#define FL_MAJOR_VERSION        1\n\n/**\n   The minor release version for this library.\n\n   FLTK remains mostly source-code compatible between minor version changes.\n */\n#define FL_MINOR_VERSION        4\n\n/**\n   The patch version for this library.\n\n   FLTK remains binary compatible between patches.\n */\n#define FL_PATCH_VERSION        2\n\n/**\n    The FLTK version number as a \\em double.\n\n    FL_VERSION is a \\em double that describes the major, minor, and patch\n    version numbers.\n\n    Version 1.2.3 is actually stored as 1.0203 to allow for more than 9\n    minor and patch releases.\n\n    \\deprecated This \\p double version number is retained for compatibility\n    with existing program code. New code should use \\em int FL_API_VERSION\n    instead. FL_VERSION is deprecated because comparisons of floating point\n    values may fail due to rounding errors. However, there are currently no\n    plans to remove this deprecated constant.\n\n    FL_VERSION is equivalent to <em>(double)FL_API_VERSION / 10000</em>.\n\n    \\see Fl::version() (deprecated as well)\n    \\see FL_API_VERSION\n    \\see Fl::api_version()\n */\n#define FL_VERSION      ( (double)FL_MAJOR_VERSION + \\\n                          (double)FL_MINOR_VERSION * 0.01 + \\\n                          (double)FL_PATCH_VERSION * 0.0001 )\n\n/**\n    The FLTK API version number as an \\em int.\n\n    FL_API_VERSION is an \\em int that describes the major, minor, and patch\n    version numbers.\n\n    Version 1.2.3 is actually stored as 10203 to allow for more than 9\n    minor and patch releases.\n\n    The FL_MAJOR_VERSION, FL_MINOR_VERSION, and FL_PATCH_VERSION constants\n    give the integral values for the major, minor, and patch releases\n    respectively.\n\n    \\note FL_API_VERSION is intended to replace the deprecated\n    \\em double FL_VERSION.\n\n    \\see Fl::api_version()\n */\n#define FL_API_VERSION (FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100 + FL_PATCH_VERSION)\n\n/**\n    The FLTK ABI (Application Binary Interface) version number as an \\em int.\n\n    FL_ABI_VERSION is an \\em int that describes the major, minor, and patch\n    ABI version numbers in the same format as FL_API_VERSION.\n\n    The ABI version number \\p FL_ABI_VERSION is usually the same as the\n    API version \\p FL_API_VERSION with the last two digits set to '00'.\n\n    FLTK retains the ABI (Application Binary Interface) during patch\n    releases of the same major and minor versions. Examples:\n\n    \\verbatim\n      FLTK Version  FL_API_VERSION  FL_ABI_VERSION  FL_VERSION (deprecated)\n        1.3.0          10300           10300           1.0300\n        1.3.4          10304           10300           1.0304\n    \\endverbatim\n\n    Version 1.2.3 is actually stored as 10203 to allow for more than 9\n    minor and patch releases.\n\n    The FL_MAJOR_VERSION, FL_MINOR_VERSION, and FL_PATCH_VERSION constants\n    give the integral values for the major, minor, and patch releases\n    respectively.\n\n    To enable new ABI-breaking features in patch releases you can configure\n    FLTK to use a higher FL_ABI_VERSION.\n\n    \\see README.abi-version.txt\n */\n#ifndef FL_ABI_VERSION\n#define FL_ABI_VERSION (FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100)\n#endif\n\n/*\n  Check if FL_ABI_VERSION is out of allowed range; redefine if necessary.\n\n  This is done to prevent users from defining an illegal ABI version.\n\n  Rule: FL_MAJOR_VERSION * 10000 + FL_MINOR_VERSION * 100\n          <= FL_ABI_VERSION <= FL_API_VERSION.\n\n  Example (FLTK 1.3.4):\n\n    10300 <= FL_ABI_VERSION <= 10304\n\n  Note: configure + CMake can be used to define FL_ABI_VERSION, but they\n  do not check validity. This is done here.\n*/\n\n#if FL_ABI_VERSION < FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100\n\n# undef FL_ABI_VERSION\n# define FL_ABI_VERSION (FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100)\n\n#elif FL_ABI_VERSION > FL_API_VERSION\n\n# undef FL_ABI_VERSION\n# define FL_ABI_VERSION FL_API_VERSION\n\n#endif\n\n/**@}*/  // group: Version Numbers\n\n/**\n    Every time a user moves the mouse pointer, clicks a button,\n    or presses a key, an event is generated and sent to your\n    application. Events can also come from other programs like the\n    window manager.\n\n    Events are identified by the integer argument passed to the\n    Fl_Widget::handle() virtual method. Other information about the\n    most recent event is stored in static locations and acquired by\n    calling the Fl::event_*() methods. This static information remains\n    valid until the next event is read from the window system, so it\n    is ok to look at it outside of the handle() method.\n\n    Event numbers can be converted to their actual names using the\n    \\ref fl_eventnames[] array defined in \\#include &lt;FL/names.h&gt;\n\n    \\see Fl::event_text(), Fl::event_key(), class Fl::\n */\n// DEV NOTE: Keep this list in sync with FL/names.h\nenum Fl_Event { // events\n  /** No event. */\n  FL_NO_EVENT           = 0,\n\n  /** A mouse button has gone down with the mouse pointing at this\n      widget. You can find out what button by calling Fl::event_button().\n      You find out the mouse position by calling Fl::event_x() and\n      Fl::event_y().\n\n      A widget indicates that it \"wants\" the mouse click by returning non-zero\n      from its Fl_Widget::handle() method. It will then become the\n      Fl::pushed() widget and will get FL_DRAG and the matching FL_RELEASE events.\n      If Fl_Widget::handle() returns zero then FLTK will try sending the FL_PUSH\n      to another widget.\n   */\n  FL_PUSH               = 1,\n\n  /** A mouse button has been released. You can find out what button by\n      calling Fl::event_button().\n\n      In order to receive the FL_RELEASE event, the widget must return\n      non-zero when handling FL_PUSH.\n   */\n  FL_RELEASE            = 2,\n\n  /** The mouse has been moved to point at this widget.  This can\n      be used for highlighting feedback.  If a widget wants to\n      highlight or otherwise track the mouse, it indicates this by\n      returning non-zero from its handle() method. It then\n      becomes the Fl::belowmouse() widget and will receive\n      FL_MOVE and FL_LEAVE events.\n   */\n  FL_ENTER              = 3,\n\n  /** The mouse has moved out of the widget.\n      In order to receive the FL_LEAVE event, the widget must\n      return non-zero when handling FL_ENTER.\n   */\n  FL_LEAVE              = 4,\n\n  /** The mouse has moved with a button held down. The current button state\n      is in Fl::event_state(). The mouse position is in Fl::event_x() and\n      Fl::event_y().\n\n      In order to receive FL_DRAG events, the widget must return non-zero\n      when handling FL_PUSH.\n   */\n  FL_DRAG               = 5,\n\n  /** This indicates an <I>attempt</I> to give a widget the keyboard focus.\n\n      If a widget wants the focus, it should change itself to display the\n      fact that it has the focus, and return non-zero from its handle() method.\n      It then becomes the Fl::focus() widget and gets FL_KEYDOWN, FL_KEYUP,\n      and FL_UNFOCUS events.\n\n      The focus will change either because the window manager changed which\n      window gets the focus, or because the user tried to navigate using tab,\n      arrows, or other keys. You can check Fl::event_key() to figure out why\n      it moved. For navigation it will be the key pressed and for interaction\n      with the window manager it will be zero.\n   */\n  FL_FOCUS              = 6,\n\n  /** This event is sent to the previous Fl::focus() widget when another\n      widget gets the focus or the window loses focus.\n   */\n  FL_UNFOCUS            = 7,\n\n  /** A key was pressed (FL_KEYDOWN) or released (FL_KEYUP).\n      Fl_KEYBOARD is a synonym for FL_KEYDOWN.\n      The key can be found in Fl::event_key().\n      The text that the key should insert can be found with Fl::event_text()\n      and its length is in Fl::event_length(). If you use the key handle()\n      should return 1. If you return zero then FLTK assumes you ignored the\n      key and will then attempt to send it to a parent widget. If none of\n      them want it, it will change the event into a FL_SHORTCUT event.\n\n      To receive FL_KEYBOARD events you must also respond to the FL_FOCUS\n      and FL_UNFOCUS events.\n\n      If you are writing a text-editing widget you may also want to call\n      the Fl::compose() function to translate individual keystrokes into\n      non-ASCII characters.\n\n      FL_KEYUP events are sent to the widget that currently has focus. This\n      is not necessarily the same widget that received the corresponding\n      FL_KEYDOWN event because focus may have changed between events.\n   */\n  FL_KEYDOWN            = 8,\n\n  /** Equivalent to FL_KEYDOWN.\n      \\see FL_KEYDOWN\n   */\n  FL_KEYBOARD           = 8,\n\n  /** Key release event.\n      \\see FL_KEYDOWN\n   */\n  FL_KEYUP              = 9,\n\n  /** The user clicked the close button of a window.\n      This event is used internally only to trigger the callback of\n      Fl_Window derived classed. The default callback closes the\n      window calling Fl_Window::hide().\n   */\n  FL_CLOSE              = 10,\n\n  /** The mouse has moved without any mouse buttons held down.\n      This event is sent to the Fl::belowmouse() widget.\n\n      In order to receive FL_MOVE events, the widget must return\n      non-zero when handling FL_ENTER.\n   */\n  FL_MOVE               = 11,\n\n  /** If the Fl::focus() widget is zero or ignores an FL_KEYBOARD\n      event then FLTK tries sending this event to every widget it\n      can, until one of them returns non-zero. FL_SHORTCUT is first\n      sent to the Fl::belowmouse() widget, then its parents and siblings,\n      and eventually to every widget in the window, trying to find an\n      object that returns non-zero. FLTK tries really hard to not to ignore\n      any keystrokes!\n\n      You can also make \"global\" shortcuts by using Fl::add_handler(). A\n      global shortcut will work no matter what windows are displayed or\n      which one has the focus.\n   */\n  FL_SHORTCUT           = 12,\n\n  /** This widget is no longer active, due to Fl_Widget::deactivate()\n      being called on it or one of its parents. Fl_Widget::active() may\n      still be true after this, the widget is only active if Fl_Widget::active()\n      is true on it and all its parents (use Fl_Widget::active_r() to check this).\n   */\n  FL_DEACTIVATE         = 13,\n\n  /** This widget is now active, due to Fl_Widget::activate() being\n      called on it or one of its parents.\n   */\n  FL_ACTIVATE           = 14,\n\n  /** This widget is no longer visible, due to Fl_Widget::hide() being\n      called on it or one of its parents, or due to a parent window being\n      minimized.  Fl_Widget::visible() may still be true after this, but the\n      widget is visible only if visible() is true for it and all its\n      parents (use Fl_Widget::visible_r() to check this).\n   */\n  FL_HIDE               = 15,\n\n  /** This widget is visible again, due to Fl_Widget::show() being called on\n      it or one of its parents, or due to a parent window being restored.\n      Child Fl_Windows respond to this by actually creating the window if not\n      done already, so if you subclass a window, be sure to pass FL_SHOW\n      to the base class Fl_Widget::handle() method!\n   */\n  FL_SHOW               = 16,\n\n  /** You should get this event some time after you call Fl::paste().\n      The contents of Fl::event_text() is the text to insert and the number\n      of characters is in Fl::event_length().\n   */\n  FL_PASTE              = 17,\n\n  /** The Fl::selection_owner() will get this event before the selection is\n      moved to another widget. This indicates that some other widget or program\n      has claimed the selection. Motif programs used this to clear the selection\n      indication. Most modern programs ignore this.\n   */\n  FL_SELECTIONCLEAR     = 18,\n\n  /** The user has moved the mouse wheel. The Fl::event_dx() and Fl::event_dy()\n      methods can be used to find the amount to scroll horizontally and vertically.\n   */\n  FL_MOUSEWHEEL         = 19,\n\n  /** The mouse has been moved to point at this widget. A widget that is\n      interested in receiving drag'n'drop data must return 1 to receive\n      FL_DND_DRAG, FL_DND_LEAVE and FL_DND_RELEASE events.\n   */\n  FL_DND_ENTER          = 20,\n\n  /** The mouse has been moved inside a widget while dragging data.  A\n      widget that is interested in receiving drag'n'drop data should\n      indicate the possible drop position.\n   */\n  FL_DND_DRAG           = 21,\n\n  /** The mouse has moved out of the widget.\n   */\n  FL_DND_LEAVE          = 22,\n\n  /** The user has released the mouse button dropping data into the widget.\n      If the widget returns 1, it will receive the data in the immediately\n      following FL_PASTE event.\n   */\n  FL_DND_RELEASE        = 23,\n  /** The screen configuration (number, positions) was changed.\n   Use Fl::add_handler() to be notified of this event.\n   */\n  FL_SCREEN_CONFIGURATION_CHANGED = 24,\n  /** The fullscreen state of the window has changed.\n   This event is sent to the window's handle method.\n   */\n  FL_FULLSCREEN         = 25,\n  /** The user has made a zoom/pinch/magnification gesture (Mac OS platform only).\n      The Fl::event_dy() method can be used to find magnification amount,\n      Fl::event_x() and Fl::event_y() are set as well.\n      This event is sent to the window's handle method.\n     */\n  FL_ZOOM_GESTURE       = 26,\n  /** A zoom event (ctrl/+/-/0/ or cmd/+/-/0/) was processed.\n   Use Fl::add_handler() to be notified of this event.\n   */\n  FL_ZOOM_EVENT         = 27\n  // DEV NOTE: Keep this list in sync with FL/names.h\n};\n\n/** \\name When Conditions */\n/**@{*/\n/** These constants determine when a callback is performed.\n\n    Fl_When is a bit field. Some values are merely shortcuts for common bit\n    combinations. New flags may be added in the future, so it's important to\n    mask the required bit when reading via \\p when().\n\n    \\note Some widgets may not fully support \\p FL_WHEN_... flags.\n\n    \\see Fl_Widget::when(), Fl::callback_reason(), Fl_Callback_Reason, Fl_Widget::do_callback()\n */\nenum Fl_When { // Fl_Widget::when():\n  FL_WHEN_NEVER             =  0, ///< Never call the callback\n  FL_WHEN_CHANGED           =  1, ///< Do the callback only when the widget value changes\n  FL_WHEN_NOT_CHANGED       =  2, ///< Do the callback whenever the user interacts with the widget\n  FL_WHEN_RELEASE           =  4, ///< Do the callback when the button or key is released and the value changes\n  FL_WHEN_RELEASE_ALWAYS    =  6, ///< Do the callback when the button or key is released, even if the value doesn't change\n  FL_WHEN_ENTER_KEY         =  8, ///< Do the callback when the user presses the ENTER key and the value changes\n  FL_WHEN_ENTER_KEY_ALWAYS  = 10, ///< Do the callback when the user presses the ENTER key, even if the value doesn't change\n  FL_WHEN_ENTER_KEY_CHANGED = 11, ///< Do callbacks whether the value changed or not, and when the ENTER key is pressed\n  FL_WHEN_CLOSED            = 16  ///< Do the callback when a child of Fl_Tabs is closed\n};\n/**@}*/          // group: When Conditions\n\n\n/** \\name Callback Reasons */\n/**@{*/\n/** These constants describe why a callback is performed.\n\n    \\see Fl::callback_reason(), Fl_Widget::when(), Fl_When\n */\nenum Fl_Callback_Reason {\n  FL_REASON_UNKNOWN=0,    ///< unknown or unset reason\n  FL_REASON_SELECTED,     ///< an item was selected\n  FL_REASON_DESELECTED,   ///< an item was de-selected\n  FL_REASON_RESELECTED,   ///< an item was re-selected (double-clicked).\n  FL_REASON_OPENED,       ///< an item was opened\n  FL_REASON_CLOSED,       ///< an item was closed\n  FL_REASON_DRAGGED,      ///< an item was dragged into a new place\n  FL_REASON_CANCELLED,    ///< a dialog was cancelled\n  FL_REASON_CHANGED,      ///< the value of the widget was modified\n  FL_REASON_GOT_FOCUS,    ///< a widget received focus\n  FL_REASON_LOST_FOCUS,   ///< a widget lost focus\n  FL_REASON_RELEASED,     ///< the mouse button was released\n  FL_REASON_ENTER_KEY,    ///< user finished input pressing Enter\n  FL_REASON_USER = 32     ///< user defined callback reasons\n};\n/**@}*/          // group: Callback Reasons\n\n\n/** \\name Names of Non-ASCII keys and mouse buttons\n\n    The following constants define the names of non-ASCII keys on the\n    keyboard and of mouse buttons for FL_KEYBOARD and FL_SHORTCUT events.\n\n    \\see Fl::event_key() and Fl::get_key(int) (use ASCII letters for all other keys):\n */\n\n/**@{*/\n\n// FIXME: These codes collide with valid Unicode keys\n\n#define FL_Button       0xfee8  ///< A mouse button; use <tt>FL_Button + n</tt> for mouse button \\c n.\n#define FL_BackSpace    0xff08  ///< The backspace key.\n#define FL_Tab          0xff09  ///< The tab key.\n#define FL_Iso_Key      0xff0c  ///< The additional key of ISO keyboards.\n#define FL_Enter        0xff0d  ///< The enter key.\n#define FL_Pause        0xff13  ///< The pause key.\n#define FL_Scroll_Lock  0xff14  ///< The scroll lock key.\n#define FL_Escape       0xff1b  ///< The escape key.\n#define FL_Kana         0xff2e  ///< The Kana key of JIS keyboards.\n#define FL_Eisu         0xff2f  ///< The Eisu key of JIS keyboards.\n#define FL_Yen          0xff30  ///< The Yen key of JIS keyboards.\n#define FL_JIS_Underscore 0xff31 ///< The underscore key of JIS keyboards.\n#define FL_Home         0xff50  ///< The home key.\n#define FL_Left         0xff51  ///< The left arrow key.\n#define FL_Up           0xff52  ///< The up arrow key.\n#define FL_Right        0xff53  ///< The right arrow key.\n#define FL_Down         0xff54  ///< The down arrow key.\n#define FL_Page_Up      0xff55  ///< The page-up key.\n#define FL_Page_Down    0xff56  ///< The page-down key.\n#define FL_End          0xff57  ///< The end key.\n#define FL_Print        0xff61  ///< The print (or print-screen) key.\n#define FL_Insert       0xff63  ///< The insert key.\n#define FL_Menu         0xff67  ///< The menu key.\n#define FL_Help         0xff68  ///< The 'help' key on Mac keyboards\n#define FL_Num_Lock     0xff7f  ///< The num lock key.\n#define FL_KP           0xff80  ///< One of the keypad numbers; use FL_KP + 'n' for digit n.\n#define FL_KP_Enter     0xff8d  ///< The enter key on the keypad, same as Fl_KP+'\\\\r'.\n#define FL_KP_Last      0xffbd  ///< The last keypad key; use to range-check keypad.\n#define FL_F            0xffbd  ///< One of the function keys; use FL_F + n for function key n.\n#define FL_F_Last       0xffe0  ///< The last function key; use to range-check function keys.\n#define FL_Shift_L      0xffe1  ///< The lefthand shift key.\n#define FL_Shift_R      0xffe2  ///< The righthand shift key.\n#define FL_Control_L    0xffe3  ///< The lefthand control key.\n#define FL_Control_R    0xffe4  ///< The righthand control key.\n#define FL_Caps_Lock    0xffe5  ///< The caps lock key.\n#define FL_Meta_L       0xffe7  ///< The left meta/Windows key.\n#define FL_Meta_R       0xffe8  ///< The right meta/Windows key.\n#define FL_Alt_L        0xffe9  ///< The left alt key.\n#define FL_Alt_R        0xffea  ///< The right alt key.\n#define FL_Delete       0xffff  ///< The delete key.\n#define FL_Alt_Gr       0xfe03  ///< The AltGr key on some international keyboards.\n\n// These use the Private Use Area (PUA) of the Basic Multilingual Plane\n// of Unicode. Guaranteed not to conflict with a proper Unicode character.\n\n// These primarily map to the XFree86 keysym range\n#define FL_Volume_Down  0xEF11   ///< Volume control down\n#define FL_Volume_Mute  0xEF12   ///< Mute sound from the system\n#define FL_Volume_Up    0xEF13   ///< Volume control up\n#define FL_Media_Play   0xEF14   ///< Start playing of audio\n#define FL_Media_Stop   0xEF15   ///< Stop playing audio\n#define FL_Media_Prev   0xEF16   ///< Previous track\n#define FL_Media_Next   0xEF17   ///< Next track\n#define FL_Home_Page    0xEF18   ///< Display user's home page\n#define FL_Mail         0xEF19   ///< Invoke user's mail program\n#define FL_Search       0xEF1B   ///< Search\n#define FL_Back         0xEF26   ///< Like back on a browser\n#define FL_Forward      0xEF27   ///< Like forward on a browser\n#define FL_Stop         0xEF28   ///< Stop current operation\n#define FL_Refresh      0xEF29   ///< Refresh the page\n#define FL_Sleep        0xEF2F   ///< Put system to sleep\n#define FL_Favorites    0xEF30   ///< Show favorite locations\n\n/**@}*/  // group: Non-ASCII key names\n\n/** \\name Mouse Buttons\n\n    These constants define the button numbers for FL_PUSH and FL_RELEASE events.\n\n    \\see Fl::event_button()\n*/\n\n/**@{*/\n\n#define FL_LEFT_MOUSE     1       ///< The left mouse button\n#define FL_MIDDLE_MOUSE   2       ///< The middle mouse button\n#define FL_RIGHT_MOUSE    3       ///< The right mouse button\n#define FL_BACK_MOUSE     4       ///< The back mouse button (side button 1)\n#define FL_FORWARD_MOUSE  5       ///< The forward mouse button (side button 2)\n\n/**@}*/          // group: Mouse Buttons\n\n\n/** \\name       Event States\n\n        The following constants define bits in the Fl::event_state() value.\n*/\n\n/**@{*/          // group: Event States\n\n// FIXME: it would be nice to have the modifiers in the upper 8 bits so that\n//        a unicode key (21 bits) can be sent as an unsigned with the modifiers.\n\n#define FL_SHIFT        0x00010000      ///< One of the shift keys is down\n#define FL_CAPS_LOCK    0x00020000      ///< The caps lock is on\n#define FL_CTRL         0x00040000      ///< One of the ctrl keys is down\n#define FL_ALT          0x00080000      ///< One of the alt keys is down\n#define FL_NUM_LOCK     0x00100000      ///< The num lock is on\n                                        // most X servers do this?\n#define FL_META         0x00400000      ///< One of the meta/Windows keys is down\n                                        // correct for XFree86\n#define FL_SCROLL_LOCK  0x00800000      ///< The scroll lock is on\n                                        // correct for XFree86\n// Mouse buttons\n\n#define FL_BUTTON1      0x01000000        ///< Mouse button 1 is pushed (L)\n#define FL_BUTTON2      0x02000000        ///< Mouse button 2 is pushed (M)\n#define FL_BUTTON3      0x04000000        ///< Mouse button 3 is pushed (R)\n#define FL_BUTTON4      0x08000000        ///< Mouse button 4 is pushed (BACK)\n#define FL_BUTTON5      0x10000000        ///< Mouse button 5 is pushed (FORWARD)\n#define FL_BUTTONS      0x1f000000        ///< Bitmask: any mouse button (1-5) is pushed\n\n#define FL_BUTTON(n)   (0x00800000<<(n))  ///< Mouse button n (n = 1..5) is pushed,\n                                          ///< *undefined* if n outside 1..5\n\n#define FL_KEY_MASK     0x0000ffff      ///< All keys are 16 bit for now\n                                        //   FIXME: Unicode needs 21 bits!\n\n/**@}*/          // group: Event States\n\n/** \\name Box Types\n    \\brief FLTK standard box types\n\n    This enum defines the standard box types included with FLTK.\n\n   \\note The documented \\p enum \\p Fl_Boxtype contains some values (names)\n      with leading underscores, e.g. \\p \\b _FL_SHADOW_BOX. This is due to\n      technical reasons - please use the same values (names) without the\n      leading underscore in your code! Enum values with leading underscores\n      are reserved for internal use and subject to change without notice!\n\n    FL_NO_BOX means nothing is drawn at all, so whatever is already\n    on the screen remains. The FL_..._FRAME types only draw their edges,\n    leaving the interior unchanged. The blue color in the image below\n    is the area that is not drawn by the frame types.\n\n    \\anchor boxTypesImage\n    \\image html  boxtypes.png \"FLTK Standard Box Types\"\n    \\image latex boxtypes.png \"FLTK Standard Box Types\" width=12cm\n\n    \\note       Not all box types are depicted in the figure above.\n                See enum  \\ref Fl_Boxtype below for the complete list of box types.\n    \\see Fl::get_system_colors()\n*/\n\n/**@{*/          // group: Box Types\n\n/**\n    \\brief FLTK standard box types\n\n    This enum defines the standard box types included with FLTK.\n\n   \\note The documented \\p enum \\p Fl_Boxtype contains some values (names)\n      with leading underscores, e.g. \\p \\b _FL_SHADOW_BOX. This is due to\n      technical reasons - please use the same values (names) without the\n      leading underscore in your code! Enum values with leading underscores\n      are reserved for internal use and subject to change without notice!\n*/\nenum Fl_Boxtype { // boxtypes (if you change these you must also change fl_boxtype.cxx):\n\n  FL_NO_BOX = 0,                ///< nothing is drawn at all, this box is invisible\n  FL_FLAT_BOX,                  ///< a flat box\n  FL_UP_BOX,                    ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_DOWN_BOX,                  ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_UP_FRAME,                  ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_DOWN_FRAME,                ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_THIN_UP_BOX,               ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_THIN_DOWN_BOX,             ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_THIN_UP_FRAME,             ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_THIN_DOWN_FRAME,           ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_ENGRAVED_BOX,              ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_EMBOSSED_BOX,              ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_ENGRAVED_FRAME,            ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_EMBOSSED_FRAME,            ///< see figure [Standard Box Types](@ref boxTypesImage)\n  FL_BORDER_BOX,                ///< see figure [Standard Box Types](@ref boxTypesImage)\n  _FL_SHADOW_BOX,               ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_SHADOW_BOX\n  FL_BORDER_FRAME,              ///< see figure [Standard Box Types](@ref boxTypesImage)\n  _FL_SHADOW_FRAME,             ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_SHADOW_FRAME\n  _FL_ROUNDED_BOX,              ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_ROUNDED_BOX\n  _FL_RSHADOW_BOX,              ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_RSHADOW_BOX\n  _FL_ROUNDED_FRAME,            ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_ROUNDED_FRAME\n  _FL_RFLAT_BOX,                ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_RFLAT_BOX\n  _FL_ROUND_UP_BOX,             ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_ROUND_UP_BOX\n  _FL_ROUND_DOWN_BOX,           ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_ROUND_DOWN_BOX\n  _FL_DIAMOND_UP_BOX,           ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_DIAMOND_UP_BOX\n  _FL_DIAMOND_DOWN_BOX,         ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_DIAMOND_DOWN_BOX\n  _FL_OVAL_BOX,                 ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_OVAL_BOX\n  _FL_OSHADOW_BOX,              ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_OSHADOW_BOX\n  _FL_OVAL_FRAME,               ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_OVAL_FRAME\n  _FL_OFLAT_BOX,                ///< see figure [Standard Box Types](@ref boxTypesImage), use FL_OFLAT_BOX\n  _FL_PLASTIC_UP_BOX,           ///< plastic version of FL_UP_BOX, use FL_PLASTIC_UP_BOX\n  _FL_PLASTIC_DOWN_BOX,         ///< plastic version of FL_DOWN_BOX, use FL_PLASTIC_DOWN_BOX\n  _FL_PLASTIC_UP_FRAME,         ///< plastic version of FL_UP_FRAME, use FL_PLASTIC_UP_FRAME\n  _FL_PLASTIC_DOWN_FRAME,       ///< plastic version of FL_DOWN_FRAME, use FL_PLASTIC_DOWN_FRAME\n  _FL_PLASTIC_THIN_UP_BOX,      ///< plastic version of FL_THIN_UP_BOX, use FL_PLASTIC_THIN_UP_BOX\n  _FL_PLASTIC_THIN_DOWN_BOX,    ///< plastic version of FL_THIN_DOWN_BOX, use FL_PLASTIC_THIN_DOWN_BOX\n  _FL_PLASTIC_ROUND_UP_BOX,     ///< plastic version of FL_ROUND_UP_BOX, use FL_PLASTIC_ROUND_UP_BOX\n  _FL_PLASTIC_ROUND_DOWN_BOX,   ///< plastic version of FL_ROUND_DOWN_BOX, use FL_PLASTIC_ROUND_DOWN_BOX\n  _FL_GTK_UP_BOX,               ///< gtk+ version of FL_UP_BOX, use FL_GTK_UP_BOX\n  _FL_GTK_DOWN_BOX,             ///< gtk+ version of FL_DOWN_BOX, use FL_GTK_DOWN_BOX\n  _FL_GTK_UP_FRAME,             ///< gtk+ version of FL_UP_FRAME, use FL_GTK_UP_FRAME\n  _FL_GTK_DOWN_FRAME,           ///< gtk+ version of FL_DOWN_FRAME, use FL_GTK_DOWN_FRAME\n  _FL_GTK_THIN_UP_BOX,          ///< gtk+ version of FL_THIN_UP_BOX, use FL_GTK_THIN_UP_BOX\n  _FL_GTK_THIN_DOWN_BOX,        ///< gtk+ version of FL_THIN_DOWN_BOX, use FL_GTK_THIN_DOWN_BOX\n  _FL_GTK_THIN_UP_FRAME,        ///< gtk+ version of FL_THIN_UP_FRAME, use FL_GTK_THIN_UP_FRAME\n  _FL_GTK_THIN_DOWN_FRAME,      ///< gtk+ version of FL_THIN_DOWN_FRAME, use FL_GTK_THIN_DOWN_FRAME\n  _FL_GTK_ROUND_UP_BOX,         ///< gtk+ version of FL_ROUND_UP_BOX, use FL_GTK_ROUND_UP_BOX\n  _FL_GTK_ROUND_DOWN_BOX,       ///< gtk+ version of FL_ROUND_DOWN_BOX, use FL_GTK_ROUND_DOWN_BOX\n  _FL_GLEAM_UP_BOX,             ///< gleam version of FL_UP_BOX, use FL_GLEAM_UP_BOX\n  _FL_GLEAM_DOWN_BOX,           ///< gleam version of FL_DOWN_BOX, use FL_GLEAM_DOWN_BOX\n  _FL_GLEAM_UP_FRAME,           ///< gleam version of FL_UP_FRAME, use FL_GLEAM_UP_FRAME\n  _FL_GLEAM_DOWN_FRAME,         ///< gleam version of FL_DOWN_FRAME, use FL_GLEAM_DOWN_FRAME\n  _FL_GLEAM_THIN_UP_BOX,        ///< gleam version of FL_THIN_UP_BOX, use FL_GLEAM_THIN_UP_BOX\n  _FL_GLEAM_THIN_DOWN_BOX,      ///< gleam version of FL_THIN_DOWN_BOX, use FL_GLEAM_THIN_DOWN_BOX\n  _FL_GLEAM_ROUND_UP_BOX,       ///< gleam version of FL_ROUND_UP_BOX, use FL_GLEAM_ROUND_UP_BOX\n  _FL_GLEAM_ROUND_DOWN_BOX,     ///< gleam version of FL_ROUND_DOWN_BOX, use FL_GLEAM_ROUND_DOWN_BOX\n  _FL_OXY_UP_BOX,               ///< oxy version of FL_UP_BOX, use FL_OXY_UP_BOX\n  _FL_OXY_DOWN_BOX,             ///< oxy version of FL_DOWN_BOX, use FL_OXY_DOWN_BOX\n  _FL_OXY_UP_FRAME,             ///< oxy version of FL_UP_FRAME, use FL_OXY_UP_FRAME\n  _FL_OXY_DOWN_FRAME,           ///< oxy version of FL_DOWN_FRAME, use FL_OXY_DOWN_FRAME\n  _FL_OXY_THIN_UP_BOX,          ///< oxy version of FL_THIN_UP_BOX, use FL_OXY_THIN_UP_BOX\n  _FL_OXY_THIN_DOWN_BOX,        ///< oxy version of FL_THIN_DOWN_BOX, use FL_OXY_THIN_DOWN_BOX\n  _FL_OXY_THIN_UP_FRAME,        ///< oxy version of FL_THIN_UP_FRAME, use FL_OXY_THIN_UP_FRAME\n  _FL_OXY_THIN_DOWN_FRAME,      ///< oxy version of FL_THIN_DOWN_FRAME, use FL_OXY_THIN_DOWN_FRAME\n  _FL_OXY_ROUND_UP_BOX,         ///< oxy version of FL_ROUND_UP_BOX, use FL_OXY_ROUND_UP_BOX\n  _FL_OXY_ROUND_DOWN_BOX,       ///< oxy version of FL_ROUND_DOWN_BOX, use FL_OXY_ROUND_DOWN_BOX\n  _FL_OXY_BUTTON_UP_BOX,        ///< FL_OXY_BUTTON_UP_BOX (new boxtype ?), use FL_OXY_BUTTON_UP_BOX\n  _FL_OXY_BUTTON_DOWN_BOX,      ///< FL_OXY_BUTTON_DOWN_BOX (new boxtype ?), use FL_OXY_BUTTON_DOWN_BOX\n  FL_FREE_BOXTYPE,              ///< the first free box type for creation of new box types\n  FL_MAX_BOXTYPE = 255          ///< highest legal index for a box type\n};\n\n#ifndef FL_DOXYGEN\n\nextern FL_EXPORT Fl_Boxtype fl_define_FL_ROUND_UP_BOX();\n#define FL_ROUND_UP_BOX fl_define_FL_ROUND_UP_BOX()\n#define FL_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_ROUND_UP_BOX()+1)\nextern FL_EXPORT Fl_Boxtype fl_define_FL_SHADOW_BOX();\n#define FL_SHADOW_BOX fl_define_FL_SHADOW_BOX()\n#define FL_SHADOW_FRAME (Fl_Boxtype)(fl_define_FL_SHADOW_BOX()+2)\nextern FL_EXPORT Fl_Boxtype fl_define_FL_ROUNDED_BOX();\n#define FL_ROUNDED_BOX fl_define_FL_ROUNDED_BOX()\n#define FL_ROUNDED_FRAME (Fl_Boxtype)(fl_define_FL_ROUNDED_BOX()+2)\nextern FL_EXPORT Fl_Boxtype fl_define_FL_RFLAT_BOX();\n#define FL_RFLAT_BOX fl_define_FL_RFLAT_BOX()\nextern FL_EXPORT Fl_Boxtype fl_define_FL_RSHADOW_BOX();\n#define FL_RSHADOW_BOX fl_define_FL_RSHADOW_BOX()\nextern FL_EXPORT Fl_Boxtype fl_define_FL_DIAMOND_BOX();\n#define FL_DIAMOND_UP_BOX fl_define_FL_DIAMOND_BOX()\n#define FL_DIAMOND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_DIAMOND_BOX()+1)\nextern FL_EXPORT Fl_Boxtype fl_define_FL_OVAL_BOX();\n#define FL_OVAL_BOX fl_define_FL_OVAL_BOX()\n#define FL_OSHADOW_BOX (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+1)\n#define FL_OVAL_FRAME (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+2)\n#define FL_OFLAT_BOX (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+3)\n\nextern FL_EXPORT Fl_Boxtype fl_define_FL_PLASTIC_UP_BOX();\n#define FL_PLASTIC_UP_BOX fl_define_FL_PLASTIC_UP_BOX()\n#define FL_PLASTIC_DOWN_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+1)\n#define FL_PLASTIC_UP_FRAME (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+2)\n#define FL_PLASTIC_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+3)\n#define FL_PLASTIC_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+4)\n#define FL_PLASTIC_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+5)\n#define FL_PLASTIC_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+6)\n#define FL_PLASTIC_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+7)\n\nextern FL_EXPORT Fl_Boxtype fl_define_FL_GTK_UP_BOX();\n#define FL_GTK_UP_BOX fl_define_FL_GTK_UP_BOX()\n#define FL_GTK_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+1)\n#define FL_GTK_UP_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+2)\n#define FL_GTK_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+3)\n#define FL_GTK_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+4)\n#define FL_GTK_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+5)\n#define FL_GTK_THIN_UP_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+6)\n#define FL_GTK_THIN_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+7)\n#define FL_GTK_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+8)\n#define FL_GTK_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+9)\n\nextern FL_EXPORT Fl_Boxtype fl_define_FL_GLEAM_UP_BOX();\n#define FL_GLEAM_UP_BOX fl_define_FL_GLEAM_UP_BOX()\n#define FL_GLEAM_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+1)\n#define FL_GLEAM_UP_FRAME (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+2)\n#define FL_GLEAM_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+3)\n#define FL_GLEAM_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+4)\n#define FL_GLEAM_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+5)\n#define FL_GLEAM_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+6)\n#define FL_GLEAM_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GLEAM_UP_BOX()+7)\n\nextern FL_EXPORT Fl_Boxtype fl_define_FL_OXY_UP_BOX();\n#define FL_OXY_UP_BOX fl_define_FL_OXY_UP_BOX()\n#define FL_OXY_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+1)\n#define FL_OXY_UP_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+2)\n#define FL_OXY_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+3)\n#define FL_OXY_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+4)\n#define FL_OXY_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+5)\n#define FL_OXY_THIN_UP_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+6)\n#define FL_OXY_THIN_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+7)\n#define FL_OXY_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+8)\n#define FL_OXY_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+9)\n#define FL_OXY_BUTTON_UP_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+10)\n#define FL_OXY_BUTTON_DOWN_BOX (Fl_Boxtype)(fl_define_FL_OXY_UP_BOX()+11)\n\n#endif // ! FL_DOXYGEN\n\n// conversions of box types to other boxtypes:\n/**\n  Get the filled version of a frame.\n  If no filled version of a given frame exists, the behavior of this function\n  is undefined and some random box or frame is returned.\n */\ninline Fl_Boxtype fl_box(Fl_Boxtype b) {\n  return (Fl_Boxtype)((b<FL_UP_BOX||b%4>1)?b:(b-2));\n}\n/**\n  Get the \"pressed\" or \"down\" version of a box.\n  If no \"down\" version of a given box exists, the behavior of this function\n  is undefined and some random box or frame is returned.\n */\ninline Fl_Boxtype fl_down(Fl_Boxtype b) {\n  return (Fl_Boxtype)((b<FL_UP_BOX)?b:(b|1));\n}\n/**\n  Get the unfilled, frame only version of a box.\n  If no frame version of a given box exists, the behavior of this function\n  is undefined and some random box or frame is returned.\n */\ninline Fl_Boxtype fl_frame(Fl_Boxtype b) {\n  return (Fl_Boxtype)((b%4<2)?b:(b+2));\n}\n\n// back-compatibility box types:\n#define FL_FRAME FL_ENGRAVED_FRAME\n#define FL_FRAME_BOX FL_ENGRAVED_BOX\n#define FL_CIRCLE_BOX FL_ROUND_DOWN_BOX\n#define FL_DIAMOND_BOX FL_DIAMOND_DOWN_BOX\n\n/**@}*/  // group: Box Types\n\n/**\n   The labeltype() method sets the type of the label.\n\n   \\note The documented \\p enum \\p Fl_Labeltype contains some values (names)\n      with leading underscores, e.g. \\p \\b _FL_IMAGE_LABEL. This is due to\n      technical reasons - please use the same values (names) without the\n      leading underscore in your code! Enum values with leading underscores\n      are reserved for internal use and subject to change without notice!\n\n   The following standard label types are included:\n*/\nenum Fl_Labeltype {    // labeltypes:\n  FL_NORMAL_LABEL = 0, ///< draws the text (0)\n  FL_NO_LABEL,         ///< does nothing\n  _FL_SHADOW_LABEL,    ///< draws a drop shadow under the text\n  _FL_ENGRAVED_LABEL,  ///< draws edges as though the text is engraved\n  _FL_EMBOSSED_LABEL,  ///< draws edges as though the text is raised\n  _FL_MULTI_LABEL,     ///< draws a composite label \\see Fl_Multi_Label\n  _FL_ICON_LABEL,      ///< draws the icon associated with the text\n  _FL_IMAGE_LABEL,     ///< the label displays an \"icon\" based on a Fl_Image\n\n  FL_FREE_LABELTYPE    ///< first free labeltype to use for creating own labeltypes\n};\n\n/**\n  Sets the current label type and returns its corresponding Fl_Labeltype value.\n  @{\n*/\n\n/** FL_SYMBOL_LABEL is an alias for FL_NORMAL_LABEL.\n\n  '@' symbols can be drawn with normal labels as well.\\n\n  This definition is for historical reasons only (forms compatibility).\n  You should use FL_NORMAL_LABEL instead.\n*/\n#define FL_SYMBOL_LABEL FL_NORMAL_LABEL\n/**\n  Initializes the internal table entry for FL_SHADOW_LABEL and returns\n  its internal value. Internal use only.\n*/\nextern Fl_Labeltype FL_EXPORT fl_define_FL_SHADOW_LABEL();\n/**\n  Draws a label with shadows behind the text.\n*/\n#define FL_SHADOW_LABEL fl_define_FL_SHADOW_LABEL()\n\n/**\n  Initializes the internal table entry for FL_ENGRAVED_LABEL and returns\n  its internal value. Internal use only.\n*/\nextern Fl_Labeltype FL_EXPORT fl_define_FL_ENGRAVED_LABEL();\n/**\n  Draws a label with engraved text.\n*/\n#define FL_ENGRAVED_LABEL fl_define_FL_ENGRAVED_LABEL()\n\n/**\n  Initializes the internal table entry for FL_EMBOSSED_LABEL and returns\n  its internal value. Internal use only.\n*/\nextern Fl_Labeltype FL_EXPORT fl_define_FL_EMBOSSED_LABEL();\n/**\n  Draws a label with embossed text.\n*/\n#define FL_EMBOSSED_LABEL fl_define_FL_EMBOSSED_LABEL()\n\n/**\n  Initializes the internal table entry for FL_MULTI_LABEL and returns\n  its internal value. Internal use only.\n*/\nextern Fl_Labeltype FL_EXPORT fl_define_FL_MULTI_LABEL();\n/**\n  Draws a label that can comprise several parts like text and images.\n  \\see Fl_Multi_Label\n*/\n#define FL_MULTI_LABEL fl_define_FL_MULTI_LABEL()\n\n/**\n  Initializes the internal table entry for FL_ICON_LABEL and returns\n  its internal value. Internal use only.\n*/\nextern Fl_Labeltype FL_EXPORT fl_define_FL_ICON_LABEL();\n/**\n  Draws an icon as the label.\n*/\n#define FL_ICON_LABEL fl_define_FL_ICON_LABEL()\n\n/**\n  Initializes the internal table entry for FL_IMAGE_LABEL and returns\n  its internal value. Internal use only.\n*/\nextern Fl_Labeltype FL_EXPORT fl_define_FL_IMAGE_LABEL();\n/**\n  Draws an image (Fl_Image) as the label.\n  This is useful for one particular part of an Fl_Multi_Label.\n  Use Fl_Widget::image() and/or Fl_Widget::deimage() for normal widgets\n  with images as labels.\n*/\n#define FL_IMAGE_LABEL fl_define_FL_IMAGE_LABEL()\n\n/** @} */\n\n/** \\name Alignment Flags\n  Flags to control the label alignment.\n\n  This controls how the label is displayed next to or inside the widget.\n  The default value is FL_ALIGN_CENTER (0) for most widgets, which centers\n  the label inside the widget.\n\n  All alignment flags use the common prefix \"FL_ALIGN_\". In the following\n  descriptions this prefix is sometimes omitted for brevity.\n\n  Flags can be or'd to achieve a combination of alignments, but there\n  are some \\e \"magic values\" (e.g. combinations of TOP and BOTTOM and of\n  LEFT and RIGHT) that have special meanings (see below). For instance:\\n\n  FL_ALIGN_TOP_LEFT == (FL_ALIGN_TOP | FL_ALIGN_LEFT) != FL_ALIGN_LEFT_TOP.\n\n  \\code\n    Outside alignments (FL_ALIGN_INSIDE is not set):\n\n               TOP_LEFT        TOP       TOP_RIGHT\n               +---------------------------------+\n       LEFT_TOP|                                 |RIGHT_TOP\n               |                                 |\n           LEFT|             CENTER              |RIGHT\n               |                                 |\n    LEFT_BOTTOM|                                 |RIGHT_BOTTOM\n               +---------------------------------+\n               BOTTOM_LEFT   BOTTOM   BOTTOM_RIGHT\n\n    Inside alignments (FL_ALIGN_INSIDE is set):\n\n               +---------------------------------+\n               |TOP_LEFT       TOP      TOP_RIGHT|\n               |                                 |\n               |LEFT         CENTER         RIGHT|\n               |                                 |\n               |BOTTOM_LEFT  BOTTOM  BOTTOM_RIGHT|\n               +---------------------------------+\n  \\endcode\n  \\see Fl_Align, #FL_ALIGN_CENTER, etc.\n\n  \\note\n    -# Bit positions not defined in the following constants of type\n       \\p Fl_Align are reserved for future extensions. Do not use.\n    -# The \\e \"magic values\" (FL_ALIGN_)LEFT_TOP, RIGHT_TOP, LEFT_BOTTOM,\n       and RIGHT_BOTTOM must not be used together with FL_ALIGN_INSIDE.\n       Use TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, or BOTTOM_RIGHT instead.\n    -# Although bits can be or'd together there are some unused/illegal\n       combinations, for instance:\n      - setting both FL_ALIGN_TOP and FL_ALIGN_BOTTOM in combinations other\n        than those given in the \\p Fl_Align constants below (magic values)\n      - setting both FL_ALIGN_LEFT and FL_ALIGN_RIGHT in combinations other\n        than those given in the \\p Fl_Align constants below (magic values)\n      - using one of the \"magic values\" (2) together with FL_ALIGN_INSIDE\n  \\note\n    Using illegal bit combinations or undefined bits may yield unexpected\n    behavior, and this behavior may be changed without notice in future\n    FLTK versions.\n */\n/**@{*/\n/** FLTK type for alignment control. */\ntypedef unsigned Fl_Align;\n\n  /** Align the label horizontally in the middle. */\nconst Fl_Align FL_ALIGN_CENTER          = 0x0000;\n\n  /** Align the label at the top of the widget. Inside labels appear below the top,\n      outside labels are drawn on top of the widget. */\nconst Fl_Align FL_ALIGN_TOP             = 0x0001;\n\n  /** Align the label at the bottom of the widget. */\nconst Fl_Align FL_ALIGN_BOTTOM          = 0x0002;\n\n  /** Align the label at the left of the widget. Inside labels appear left-justified\n      starting at the left side of the widget, outside labels are right-justified and\n      drawn to the left of the widget. */\nconst Fl_Align FL_ALIGN_LEFT            = 0x0004;\n\n  /** Align the label to the right of the widget. */\nconst Fl_Align FL_ALIGN_RIGHT           = 0x0008;\n\n  /** Draw the label inside of the widget. */\nconst Fl_Align FL_ALIGN_INSIDE          = 0x0010;\n\n  /** If the label contains an image, draw the text on top of the image. */\nconst Fl_Align FL_ALIGN_TEXT_OVER_IMAGE = 0x0020;\n\n  /** If the label contains an image, draw the text below the image. */\nconst Fl_Align FL_ALIGN_IMAGE_OVER_TEXT = 0x0000;\n\n  /** All parts of the label that are larger than the widget will not be drawn. */\nconst Fl_Align FL_ALIGN_CLIP            = 0x0040;\n\n  /** Wrap text that does not fit the width of the widget. */\nconst Fl_Align FL_ALIGN_WRAP            = 0x0080;\n\n  /** If the label contains an image, draw the text to the right of the image. */\nconst Fl_Align FL_ALIGN_IMAGE_NEXT_TO_TEXT = 0x0100;\n\n  /** If the label contains an image, draw the text to the left of the image. */\nconst Fl_Align FL_ALIGN_TEXT_NEXT_TO_IMAGE = 0x0120;\n\n/** If the label contains an image, draw the image or deimage in the background. */\nconst Fl_Align FL_ALIGN_IMAGE_BACKDROP  = 0x0200;\n\nconst Fl_Align FL_ALIGN_TOP_LEFT        = FL_ALIGN_TOP | FL_ALIGN_LEFT;\nconst Fl_Align FL_ALIGN_TOP_RIGHT       = FL_ALIGN_TOP | FL_ALIGN_RIGHT;\nconst Fl_Align FL_ALIGN_BOTTOM_LEFT     = FL_ALIGN_BOTTOM | FL_ALIGN_LEFT;\nconst Fl_Align FL_ALIGN_BOTTOM_RIGHT    = FL_ALIGN_BOTTOM | FL_ALIGN_RIGHT;\n\n/** Outside only, left of widget, top position, magic value: TOP | BOTTOM | LEFT. */\nconst Fl_Align FL_ALIGN_LEFT_TOP        = 0x0007;\n\n/** Outside only, right of widget, top position, magic value: TOP | BOTTOM | RIGHT. */\nconst Fl_Align FL_ALIGN_RIGHT_TOP       = 0x000b;\n\n/** Outside only, left of widget, bottom position, magic value: TOP | LEFT | RIGHT. */\nconst Fl_Align FL_ALIGN_LEFT_BOTTOM     = 0x000d;\n\n/** Outside only, right of widget, bottom position, magic value: BOTTOM | LEFT | RIGHT. */\nconst Fl_Align FL_ALIGN_RIGHT_BOTTOM    = 0x000e;\n\n/** Nothing, same as FL_ALIGN_CENTER, for back compatibility. */\nconst Fl_Align FL_ALIGN_NOWRAP          = 0x0000;\n\n/** Mask value to test for TOP, BOTTOM, LEFT, and RIGHT flags. */\nconst Fl_Align FL_ALIGN_POSITION_MASK   = 0x000f;\n\n/** Mask value to test for image alignment flags. */\nconst Fl_Align FL_ALIGN_IMAGE_MASK      = 0x0320;\n/**@}*/\n\n\n/** \\name Font Numbers\n    The following constants define the standard FLTK fonts:\n */\n/**@{*/\n/** A font number is an index into the internal font table. */\ntypedef int Fl_Font;\n\nconst Fl_Font FL_HELVETICA              = 0;    ///< Helvetica (or Arial) normal (0)\nconst Fl_Font FL_HELVETICA_BOLD         = 1;    ///< Helvetica (or Arial) bold\nconst Fl_Font FL_HELVETICA_ITALIC       = 2;    ///< Helvetica (or Arial) oblique\nconst Fl_Font FL_HELVETICA_BOLD_ITALIC  = 3;    ///< Helvetica (or Arial) bold-oblique\nconst Fl_Font FL_COURIER                = 4;    ///< Courier normal\nconst Fl_Font FL_COURIER_BOLD           = 5;    ///< Courier bold\nconst Fl_Font FL_COURIER_ITALIC         = 6;    ///< Courier italic\nconst Fl_Font FL_COURIER_BOLD_ITALIC    = 7;    ///< Courier bold-italic\nconst Fl_Font FL_TIMES                  = 8;    ///< Times roman\nconst Fl_Font FL_TIMES_BOLD             = 9;    ///< Times roman bold\nconst Fl_Font FL_TIMES_ITALIC           = 10;   ///< Times roman italic\nconst Fl_Font FL_TIMES_BOLD_ITALIC      = 11;   ///< Times roman bold-italic\nconst Fl_Font FL_SYMBOL                 = 12;   ///< Standard symbol font\nconst Fl_Font FL_SCREEN                 = 13;   ///< Default monospaced screen font\nconst Fl_Font FL_SCREEN_BOLD            = 14;   ///< Default monospaced bold screen font\nconst Fl_Font FL_ZAPF_DINGBATS          = 15;   ///< Zapf-dingbats font\n\nconst Fl_Font FL_FREE_FONT              = 16;   ///< first one to allocate\nconst Fl_Font FL_BOLD                   = 1;    ///< add this to Helvetica, Courier, or Times\nconst Fl_Font FL_ITALIC                 = 2;    ///< add this to Helvetica, Courier, or Times\nconst Fl_Font FL_BOLD_ITALIC            = 3;    ///< add this to Helvetica, Courier, or Times\n\n/**@}*/\n\n/** Size of a font in pixels.\n    This is the approximate height of a font in pixels.\n */\ntypedef int Fl_Fontsize;\n\nextern FL_EXPORT Fl_Fontsize FL_NORMAL_SIZE;    ///< normal font size\n\n/** \\name Colors\n    The Fl_Color type holds an FLTK color value.\n\n    Colors are either 8-bit indexes into a <a href=\"fltk-colormap.png\">virtual colormap</a>\n    or 24-bit RGB color values. (See \\ref drawing_colors for the default FLTK colormap)\n\n    Color indices occupy the lower 8 bits of the value, while\n    RGB colors occupy the upper 24 bits, for a byte organization of RGBI.\n\n<pre>\n Fl_Color => 0xrrggbbii\n                | | | |\n                | | | +--- \\ref drawing_colors \"index\" between 0 and 255\n                | | +----- blue color component (8 bit)\n                | +------- green component (8 bit)\n                +--------- red component (8 bit)\n </pre>\n\n    A color can have either an index or an rgb value. Colors with rgb set\n    and an index >0 are reserved for special use.\n\n */\n/**@{*/\n/** An FLTK color value; see also \\ref drawing_colors  */\ntypedef unsigned int Fl_Color;\n\n// Standard colors. These are used as default colors in widgets and altered as necessary\nconst Fl_Color FL_FOREGROUND_COLOR  = 0;        ///< the default foreground color (0) used for labels and text\nconst Fl_Color FL_BACKGROUND2_COLOR = 7;        ///< the default background color for text, list, and valuator widgets\nconst Fl_Color FL_INACTIVE_COLOR    = 8;        ///< the inactive foreground color\nconst Fl_Color FL_SELECTION_COLOR   = 15;       ///< the default selection/highlight color\n\n  // boxtypes generally limit themselves to these colors so\n  // the whole ramp is not allocated:\n\nconst Fl_Color FL_GRAY0   = 32;                 // 'A'\nconst Fl_Color FL_DARK3   = 39;                 // 'H'\nconst Fl_Color FL_DARK2   = 45;                 // 'N'\nconst Fl_Color FL_DARK1   = 47;                 // 'P'\n/** Default background color */\nconst Fl_Color FL_BACKGROUND_COLOR  = 49;       // 'R' default background color\nconst Fl_Color FL_LIGHT1  = 50;                 // 'S'\nconst Fl_Color FL_LIGHT2  = 52;                 // 'U'\nconst Fl_Color FL_LIGHT3  = 54;                 // 'W'\n\n  // FLTK provides a 5x8x5 color cube that is used with colormap visuals\n\nconst Fl_Color FL_BLACK   = 56;\nconst Fl_Color FL_RED     = 88;\nconst Fl_Color FL_GREEN   = 63;\nconst Fl_Color FL_YELLOW  = 95;\nconst Fl_Color FL_BLUE    = 216;\nconst Fl_Color FL_MAGENTA = 248;\nconst Fl_Color FL_CYAN    = 223;\nconst Fl_Color FL_DARK_RED = 72;\n\nconst Fl_Color FL_DARK_GREEN    = 60;\nconst Fl_Color FL_DARK_YELLOW   = 76;\nconst Fl_Color FL_DARK_BLUE     = 136;\nconst Fl_Color FL_DARK_MAGENTA  = 152;\nconst Fl_Color FL_DARK_CYAN     = 140;\n\nconst Fl_Color FL_WHITE         = 255;\n\n/** Colors numbered between FL_FREE_COLOR and FL_FREE_COLOR + FL_NUM_FREE_COLOR - 1\nare free for the user to be given any value using Fl::set_color(). */\n#define FL_FREE_COLOR     (Fl_Color)16\n#define FL_NUM_FREE_COLOR 16\n#define FL_GRAY_RAMP      (Fl_Color)32\n#define FL_NUM_GRAY       24\n#define FL_GRAY           FL_BACKGROUND_COLOR\n#define FL_COLOR_CUBE     (Fl_Color)56\n#define FL_NUM_RED        5\n#define FL_NUM_GREEN      8\n#define FL_NUM_BLUE       5\n\nFL_EXPORT Fl_Color fl_inactive(Fl_Color c);\n\n/**\n  Type of a custom fl_contrast() function.\n\n  Use this signature to define your own custom fl_contrast() function together\n  with fl_contrast_mode(FL_CONTRAST_CUSTOM).\n  Example:\n  \\code\n    Fl_Color my_contrast(Fl_Color fg, Fl_Color bg, int context, int size) {\n      // calculate contrast and ...\n      return color;\n    }\n    // call this early in your main() program:\n    fl_contrast_function(my_contrast);\n    fl_contrast_mode(FL_CONTRAST_CUSTOM);\n    fl_contrast_level(50); // optional, must be called after fl_contrast_mode()\n  \\endcode\n\n  For parameters and types see fl_contrast(Fl_Color, Fl_Color, int, int).\n\n  \\see fl_contrast(Fl_Color, Fl_Color, int, int)\n  \\see fl_contrast_mode(int)\n*/\ntypedef Fl_Color (Fl_Contrast_Function)(Fl_Color, Fl_Color, int, int);\n\nFL_EXPORT void fl_contrast_function(Fl_Contrast_Function *f);\n\n/**\n  Define the possible modes to calculate fl_contrast().\n*/\nenum Fl_Contrast_Mode {\n  FL_CONTRAST_NONE = 0,     ///< always return foreground color\n  FL_CONTRAST_LEGACY,       ///< legacy (FLTK 1.3.x) contrast function\n  FL_CONTRAST_CIELAB,       ///< new (FLTK 1.4.0) default function\n  FL_CONTRAST_CUSTOM,       ///< optional custom contrast function\n  FL_CONTRAST_LAST          ///< internal use only (invalid contrast mode)\n};\n\n// The following functions are defined and documented in src/fl_contrast.cxx\n\nFL_EXPORT void fl_contrast_level(int level);\nFL_EXPORT int fl_contrast_level();\nFL_EXPORT void fl_contrast_mode(int mode);\nFL_EXPORT int fl_contrast_mode();\n\nFL_EXPORT Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg, int context = 0, int size = 0);\n\nFL_EXPORT double fl_lightness(Fl_Color color);\nFL_EXPORT double fl_luminance(Fl_Color color);\n\n// Other color functions are defined and documented in src/fl_color.cxx\n\nFL_EXPORT Fl_Color fl_color_average(Fl_Color c1, Fl_Color c2, float weight);\n\n/** Returns a lighter version of the specified color. */\ninline Fl_Color fl_lighter(Fl_Color c) { return fl_color_average(c, FL_WHITE, .67f); }\n\n/** Returns a darker version of the specified color. */\ninline Fl_Color fl_darker(Fl_Color c) { return fl_color_average(c, FL_BLACK, .67f); }\n\n/** Returns the 24-bit color value closest to \\p r, \\p g, \\p b. */\ninline Fl_Color fl_rgb_color(uchar r, uchar g, uchar b) {\n  if (!r && !g && !b) return FL_BLACK;\n  else return (Fl_Color)(((((r << 8) | g) << 8) | b) << 8);\n}\n\n/** Returns the 24-bit color value closest to \\p g (grayscale). */\ninline Fl_Color fl_rgb_color(uchar g) {\n  if (!g) return FL_BLACK;\n  else return (Fl_Color)(((((g << 8) | g) << 8) | g) << 8);\n}\n\n/** Returns a gray color value from black (i == 0) to white (i == FL_NUM_GRAY - 1).\n    FL_NUM_GRAY is defined to be 24 in the current FLTK release.\n    To get the closest FLTK gray value to an 8-bit grayscale color 'I' use:\n\n \\code\n   fl_gray_ramp(I * (FL_NUM_GRAY - 1) / 255)\n \\endcode\n*/\ninline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}\n\n/** Returns a color out of the color cube.\n\n  \\p r must be in the range 0 to FL_NUM_RED (5) minus 1,\n  \\p g must be in the range 0 to FL_NUM_GREEN (8) minus 1,\n  \\p b must be in the range 0 to FL_NUM_BLUE (5) minus 1.\n\n  To get the closest color to a 8-bit set of R,G,B values use:\n\n  \\code\n    fl_color_cube(R * (FL_NUM_RED - 1) / 255,\n       G * (FL_NUM_GREEN - 1) / 255,\n       B * (FL_NUM_BLUE - 1) / 255);\n  \\endcode\n */\ninline Fl_Color fl_color_cube(int r, int g, int b) {\n  return (Fl_Color)((b*FL_NUM_RED + r) * FL_NUM_GREEN + g + FL_COLOR_CUBE);}\n\n/**@}*/          // group: Colors\n\n/** \\name Cursors */\n/**@{*/\n\n/** The following constants define the mouse cursors that are available in FLTK.\n\n    Cursors are provided by the system when available, or bitmaps built into\n    FLTK as a fallback.\n*/\n/* FIXME: We should renumber these, but that will break the ABI */\nenum Fl_Cursor {\n  FL_CURSOR_DEFAULT    =  0, /**< the default cursor, usually an arrow: ↖*/ // U+2196\n  FL_CURSOR_ARROW      = 35, /**< an arrow pointer: ↖*/ // U+2196\n  FL_CURSOR_CROSS      = 66, /**< crosshair: ＋*/ // U+FF0B\n  FL_CURSOR_WAIT       = 76, /**< busy indicator (for instance hourglass): ⌚,⌛*/ // U+231A, U+231B\n  FL_CURSOR_INSERT     = 77, /**< I-beam: ⌶*/ // U+2336\n  FL_CURSOR_HAND       = 31, /**< pointing hand: ☜*/ // U+261C\n  FL_CURSOR_HELP       = 47, /**< question mark pointer:  ?*/\n  FL_CURSOR_MOVE       = 27, /**< 4-pointed arrow or hand: ✥, ✋*/ // U+2725, U+270B\n\n  /* Resize indicators */\n  FL_CURSOR_NS         = 78, /**< up/down resize: ⇕ */ // U+21D5\n  FL_CURSOR_WE         = 79, /**< left/right resize: ⇔*/ // U+21D4\n  FL_CURSOR_NWSE       = 80, /**< diagonal resize: ⤡*/ // U+2921\n  FL_CURSOR_NESW       = 81, /**< diagonal resize: ⤢*/ // U+2922\n  FL_CURSOR_N          = 70, /**< upwards resize: ⤒*/ // U+2912\n  FL_CURSOR_NE         = 69, /**< upwards, right resize: ↗*/ // U+2197\n  FL_CURSOR_E          = 49, /**< rightwards resize: ⇥*/ // U+21E5\n  FL_CURSOR_SE         =  8, /**< downwards, right resize: ⇲*/ // U+21F2\n  FL_CURSOR_S          =  9, /**< downwards resize: ⤓*/ // U+2913\n  FL_CURSOR_SW         =  7, /**< downwards, left resize: ↙*/ // U+2199\n  FL_CURSOR_W          = 36, /**< leftwards resize: ⇤*/ // U+21E4\n  FL_CURSOR_NW         = 68, /**< upwards, left resize: ⇱*/ // U+21F1\n\n  FL_CURSOR_NONE       =255  /**< invisible. */\n};\n/**@}*/          // group: Cursors\n\n/** FD \"when\" conditions */\nenum { // values for \"when\" passed to Fl::add_fd()\n  FL_READ   = 1, /**< Call the callback when there is data to be read. */\n  FL_WRITE  = 4, /**< Call the callback when data can be written without blocking. */\n  FL_EXCEPT = 8  /**< Call the callback if an exception occurs on the file. */\n};\n\n/** visual types and Fl_Gl_Window::mode() (values match Glut) */\nenum Fl_Mode {\n  FL_RGB        = 0,\n  FL_INDEX      = 1,\n  FL_SINGLE     = 0,\n  FL_DOUBLE     = 2,\n  FL_ACCUM      = 4,\n  FL_ALPHA      = 8,\n  FL_DEPTH      = 16,\n  FL_STENCIL    = 32,\n  FL_RGB8       = 64,\n  FL_MULTISAMPLE= 128,\n  FL_STEREO     = 256,\n  FL_FAKE_SINGLE = 512, // Fake single buffered windows using double-buffer\n  FL_OPENGL3    = 1024\n};\n\n// image alpha blending\n\n#define FL_IMAGE_WITH_ALPHA 0x40000000\n\n/** Damage masks */\nenum Fl_Damage {\n  FL_DAMAGE_CHILD    = 0x01, /**< A child needs to be redrawn. */\n  FL_DAMAGE_EXPOSE   = 0x02, /**< The window was exposed. */\n  FL_DAMAGE_SCROLL   = 0x04, /**< The Fl_Scroll widget was scrolled. Used by other widgets for other widget specific damages. */\n  FL_DAMAGE_OVERLAY  = 0x08, /**< The overlay planes need to be redrawn. */\n  FL_DAMAGE_USER1    = 0x10, /**< First user-defined damage bit. */\n  FL_DAMAGE_USER2    = 0x20, /**< Second user-defined damage bit. */\n  FL_DAMAGE_ALL      = 0x80  /**< Everything needs to be redrawn. */\n};\n\n// FLTK 1.0.x compatibility definitions (FLTK_1_0_COMPAT) dropped in 1.4.0\n\n/** Arrow types define the type of arrow drawing function.\n\n  FLTK schemes can draw several graphical elements in their particular way.\n  One of these elements is an arrow type that can be in different GUI\n  elements like scrollbars, choice buttons, and FLTK's Fl_Return_Button.\n\n  \\note This enum is not yet stable (as of FLTK 1.4.0) and may be changed\n    without notice as necessary.\n\n  \\since 1.4.0\n*/\n\nenum Fl_Arrow_Type {\n  FL_ARROW_SINGLE = 0x01, ///< Single arrow, e.g. in Fl_Scrollbar\n  FL_ARROW_DOUBLE = 0x02, ///< Double arrow, e.g. in Fl_Counter\n  FL_ARROW_CHOICE = 0x03, ///< Dropdown box, e.g. in Fl_Choice\n  FL_ARROW_RETURN = 0x04  ///< Return arrow, e.g. in Fl_Return_Button\n};\n\n/** Fl_Orientation describes the orientation of a GUI element.\n\n  FLTK schemes can draw several graphical elements, for instance arrows,\n  pointing at different directions. This enum defines the direction\n  to use for drawing a particular GUI element.\n\n  The definition of this enum was chosen such that the enum value can\n  be multiplied by 45 to get a rotation angle in degrees starting\n  at the horizontal axis (0 = right, 1 = NE, 2 = up, ...) that can be\n  used with fl_rotate(). Note: angle is counter-clockwise in degrees.\n\n  The 'unspecified' value \\b FL_ORIENT_NONE shall be used for elements\n  that would usually not be rotated, like the return arrow of the\n  Fl_Return_Button. It can still be used as an angle though since it is\n  the same value as \\p FL_ORIENT_RIGHT (0 degrees).\n\n  \\note This enum is not yet stable (as of FLTK 1.4.0) and may be changed\n    without notice as necessary.\n\n  \\since 1.4.0\n*/\n\nenum Fl_Orientation {\n  FL_ORIENT_NONE  = 0x00, ///< GUI element direction is unspecified\n  FL_ORIENT_RIGHT = 0x00, ///< GUI element pointing right (  0°)\n  FL_ORIENT_NE    = 0x01, ///< GUI element pointing NE    ( 45°)\n  FL_ORIENT_UP    = 0x02, ///< GUI element pointing up    ( 90°)\n  FL_ORIENT_NW    = 0x03, ///< GUI element pointing NW    (135°)\n  FL_ORIENT_LEFT  = 0x04, ///< GUI element pointing left  (180°)\n  FL_ORIENT_SW    = 0x05, ///< GUI element pointing SW    (225°)\n  FL_ORIENT_DOWN  = 0x06, ///< GUI element pointing down  (270°)\n  FL_ORIENT_SE    = 0x07  ///< GUI element pointing SE    (315°)\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl.H",
    "content": "//\n// Main header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file FL/Fl.H\n  \\brief Fl static class.\n*/\n\n#ifndef Fl_H\n#  define Fl_H\n\n#include <FL/fl_config.h> // build configuration\n#include <FL/Fl_Export.H>\n#include <FL/platform_types.h> // for FL_SOCKET\n#include <FL/fl_casts.H>       // experimental\n\n#ifdef FLTK_HAVE_CAIRO\n# include <FL/Fl_Cairo.H>\n#endif\n\n#  include \"fl_utf8.h\"\n#  include \"Enumerations.H\"\n#  ifndef Fl_Object\n#    define Fl_Object Fl_Widget /**< for back compatibility - use Fl_Widget! */\n#  endif\n\n#  ifdef check\n#    undef check\n#  endif\n\n#  ifdef BSD\n#    undef BSD\n#  endif\n\n#include <string.h> // FIXME: Fl::is_scheme(): strcmp needs string.h\n\nclass Fl_Widget;\nclass Fl_Window;\nclass Fl_Image;\nstruct Fl_Label;\nclass Fl_Screen_Driver;\nclass Fl_System_Driver;\n\n// Pointers you can use to change FLTK to another language.\n// Note: Similar pointers are defined in FL/fl_ask.H and src/fl_ask.cxx\n\nextern FL_EXPORT const char* fl_local_alt;   ///< string pointer used in shortcuts, you can change it to another language\nextern FL_EXPORT const char* fl_local_ctrl;  ///< string pointer used in shortcuts, you can change it to another language\nextern FL_EXPORT const char* fl_local_meta;  ///< string pointer used in shortcuts, you can change it to another language\nextern FL_EXPORT const char* fl_local_shift; ///< string pointer used in shortcuts, you can change it to another language\n\n/** \\defgroup  callback_functions  Callback Function Typedefs\n\n  \\brief Typedefs defined in <FL/Fl.H> for callback or handler functions passed as function parameters.\n\n  FLTK uses callback functions as parameters for some function calls, e.g. to\n  set up global event handlers (Fl::add_handler()), to add a timeout handler\n  (Fl::add_timeout()), and many more.\n\n  The typedefs defined in this group describe the function parameters used to set\n  up or clear the callback functions and should also be referenced to define the\n  callback function to handle such events in the user's code.\n\n  \\see  Fl::add_handler(), Fl::add_timeout(), Fl::repeat_timeout(),\n        Fl::remove_timeout() and others\n\n  @{\n*/\n\n/** Signature of some label drawing functions passed as parameters */\ntypedef void (Fl_Label_Draw_F)(const Fl_Label *label, int x, int y, int w, int h, Fl_Align align);\n\n/** Signature of some label measurement functions passed as parameters */\ntypedef void (Fl_Label_Measure_F)(const Fl_Label *label, int &width, int &height);\n\n/** Signature of some box drawing functions passed as parameters */\ntypedef void (Fl_Box_Draw_F)(int x, int y, int w, int h, Fl_Color color);\n\n/** Signature of box focus frame drawing functions */\ntypedef void (Fl_Box_Draw_Focus_F)(Fl_Boxtype bt, int x, int y, int w, int h, Fl_Color fg, Fl_Color bg);\n\n/** Signature of timeout callback functions passed as parameters.\n  Please see Fl::add_timeout() for details.\n*/\ntypedef void (*Fl_Timeout_Handler)(void *data);\n\n/** Signature of some wakeup callback functions passed as parameters */\ntypedef void (*Fl_Awake_Handler)(void *data);\n\n/** Signature of add_idle callback functions passed as parameters */\ntypedef void (*Fl_Idle_Handler)(void *data);\n\n/** Signature of set_idle callback functions passed as parameters */\ntypedef void (*Fl_Old_Idle_Handler)();\n\n/** Signature of add_fd functions passed as parameters */\ntypedef void (*Fl_FD_Handler)(FL_SOCKET fd, void *data);\n\n/** Signature of add_handler functions passed as parameters */\ntypedef int (*Fl_Event_Handler)(int event);\n\n/** Signature of add_system_handler functions passed as parameters */\ntypedef int (*Fl_System_Handler)(void *event, void *data);\n\n/** Signature of set_abort functions passed as parameters */\ntypedef void (*Fl_Abort_Handler)(const char *format,...);\n\n/** Signature of set_atclose functions passed as parameters */\ntypedef void (*Fl_Atclose_Handler)(Fl_Window *window, void *data);\n\n/** Signature of args functions passed as parameters */\ntypedef int (*Fl_Args_Handler)(int argc, char **argv, int &i);\n\n/** Signature of event_dispatch functions passed as parameters.\n    \\see Fl::event_dispatch(Fl_Event_Dispatch) */\ntypedef int (*Fl_Event_Dispatch)(int event, Fl_Window *w);\n\n/** Signature of add_clipboard_notify functions passed as parameters */\ntypedef void (*Fl_Clipboard_Notify_Handler)(int source, void *data);\n\n/** @} */ /* group callback_functions */\n\n\n/**\n  The Fl is the FLTK global (static) class containing\n  state information and global methods for the current application.\n*/\nclass FL_EXPORT Fl {\n  friend class Fl_System_Driver;\n  Fl() {} // no constructor!\n\nprivate:\n\n  static int use_high_res_GL_;\n  static int draw_GL_text_with_textures_;\n  static int box_shadow_width_;\n  static int box_border_radius_max_;\n  static int selection_to_clipboard_;\n\npublic:\n\n  static Fl_Screen_Driver *screen_driver();\n  static Fl_System_Driver *system_driver();\n#ifdef __APPLE__ // deprecated in 1.4 - only for compatibility with 1.3\n  static void reset_marked_text();\n  static void insertion_point_location(int x, int y, int height);\n#endif\n\n\n  /** Get the box shadow width of all \"shadow\" boxtypes in pixels.\n    \\since 1.4.0\n  */\n  static int box_shadow_width() { return box_shadow_width_; }\n  /** Set the box shadow width of all \"shadow\" boxtypes in pixels.\n    Must be at least 1, default = 3. There is no upper limit.\n    \\since 1.4.0\n  */\n  static void box_shadow_width(int W) { box_shadow_width_ = W < 1 ? 1 : W; }\n\n  /** Get the maximum border radius of all \"rounded\" boxtypes in pixels.\n      \\since 1.4.0\n  */\n  static int box_border_radius_max() { return box_border_radius_max_; }\n  /** Set the maximum border radius of all \"rounded\" boxtypes in pixels.\n    Must be at least 5, default = 15.\n\n    \\note This does \\b not apply to the \"round\" boxtypes which have really round sides\n      (i.e. composed of half circles) as opposed to \"rounded\" boxtypes that have only\n      rounded corners with a straight border between corners.\n\n    The box border radius of \"rounded\" boxtypes is typically calculated as about 2/5 of\n    the box height or width, whichever is smaller. The upper limit can be set by this\n    method for all \"rounded\" boxtypes.\n    \\since 1.4.0\n  */\n  static void box_border_radius_max(int R) { box_border_radius_max_ = R < 5 ? 5 : R; }\n\npublic: // should be private!\n\n#ifndef FL_DOXYGEN\n  static int e_number;\n  static int e_x;\n  static int e_y;\n  static int e_x_root;\n  static int e_y_root;\n  static int e_dx;\n  static int e_dy;\n  static int e_state;\n  static int e_clicks;\n  static int e_is_click;\n  static int e_keysym;\n  static char* e_text;\n  static int e_length;\n  static void *e_clipboard_data;\n  static const char *e_clipboard_type;\n  static Fl_Event_Dispatch e_dispatch;\n  static Fl_Callback_Reason callback_reason_;\n  static Fl_Widget* belowmouse_;\n  static Fl_Widget* pushed_;\n  static Fl_Widget* focus_;\n  static int damage_;\n  static Fl_Widget* selection_owner_;\n  static Fl_Window* modal_;\n  static Fl_Window* grab_;\n  static int compose_state; // used for dead keys (Windows) or marked text (MacOS)\n  static void call_screen_init(); // recompute screen number and dimensions\n#endif // FL_DOXYGEN\n\n\n  /**\n    If true then flush() will do something.\n  */\n  static void damage(int d) {damage_ = d;}\n\npublic:\n  /** Enumerator for global FLTK options.\n      These options can be set system wide, per user, or for the running\n      application only.\n      \\see Fl::option(Fl_Option, bool)\n      \\see Fl::option(Fl_Option)\n  */\n  typedef enum {\n      /// When switched on, moving the text cursor beyond the start or end of\n      /// a text in a text widget will change focus to the next text widget.\n      /// (This is considered 'old' behavior)\n      ///\n      /// When switched off (default), the cursor will stop at the end of the text.\n      /// Pressing Tab or Ctrl-Tab will advance the keyboard focus.\n      ///\n      /// See also: Fl_Input_::tab_nav()\n      ///\n    OPTION_ARROW_FOCUS = 0,\n      // When switched on, FLTK will use the file chooser dialog that comes\n      // with your operating system whenever possible. When switched off, FLTK\n      // will present its own file chooser.\n      // \\todo implement me\n    // OPTION_NATIVE_FILECHOOSER,\n      // When Filechooser Preview is enabled, the FLTK or native file chooser\n      // will show a preview of a selected file (if possible) before the user\n      // decides to choose the file.\n      // \\todo implement me\n    //OPTION_FILECHOOSER_PREVIEW,\n      /// If visible focus is switched on (default), FLTK will draw a dotted rectangle\n      /// inside the widget that will receive the next keystroke. If switched\n      /// off, no such indicator will be drawn and keyboard navigation\n      /// is disabled.\n    OPTION_VISIBLE_FOCUS,\n      /// If text drag-and-drop is enabled (default), the user can select and drag text\n      /// from any text widget. If disabled, no dragging is possible, however\n      /// dropping text from other applications still works.\n    OPTION_DND_TEXT,\n      /// If tooltips are enabled (default), hovering the mouse over a widget with a\n      /// tooltip text will open a little tooltip window until the mouse leaves\n      /// the widget. If disabled, no tooltip is shown.\n    OPTION_SHOW_TOOLTIPS,\n     /// When switched on (default), Fl_Native_File_Chooser runs GTK file dialogs\n     /// if the GTK library is available on the platform (linux/unix only).\n     /// When switched off, GTK file dialogs aren't used even if the GTK library is available.\n    OPTION_FNFC_USES_GTK,\n    /// Meaningful for the Wayland/X11 platform only. When switched on, the library uses a Zenity-based file dialog.\n    /// When switched off (default), no zenity-based file dialog is used.\n    OPTION_FNFC_USES_ZENITY,\n    /// Meaningful for the Wayland/X11 platform only.\n    /// When switched on, the library uses a kdialog-based file dialog if command 'kdialog' is available on the running system.\n    /// When switched off (default), no kdialog-based file dialog is used.\n    OPTION_FNFC_USES_KDIALOG,\n    /// When switched on (default), Fl_Printer runs the GTK printer dialog\n    /// if the GTK library is available on the platform (linux/unix only).\n    /// When switched off, the GTK printer dialog isn't used even if the GTK library is available.\n    OPTION_PRINTER_USES_GTK,\n    /// When switched on (default), the library shows in a transient yellow window the zoom factor\n    /// value.\n    /// When switched off, no such window gets displayed.\n    OPTION_SHOW_SCALING,\n    /// When switched on and when the keyboard in use has '+' in the shifted position of its key,\n    /// pressing that key and ctrl triggers the zoom-in operation.\n    /// When switched off (default), the zoom-in operation requires that also the shift key is pressed.\n    /// Under macOS, this option has no effect because the OS itself generates ⌘= followed\n    /// by ⌘+ when pressing ⌘ and the '=|+' key without pressing shift.\n    OPTION_SIMPLE_ZOOM_SHORTCUT,\n      // don't change this, leave it always as the last element\n      /// For internal use only.\n    OPTION_LAST\n  } Fl_Option;\n\nprivate:\n  static unsigned char options_[OPTION_LAST];\n  static unsigned char options_read_;\n  static int program_should_quit_; // non-zero means the program was asked to cleanly terminate\n\npublic:\n  /*\n   Return a global setting for all FLTK applications, possibly overridden\n   by a setting specifically for this application.\n   */\n  static bool option(Fl_Option opt);\n\n  /*\n   Override an option while the application is running.\n   */\n  static void option(Fl_Option opt, bool val);\n\n  /**\n    The currently executing idle callback function: DO NOT USE THIS DIRECTLY!\n\n    This is now used as part of a higher level system allowing multiple\n    idle callback functions to be called.\n    \\see add_idle(), remove_idle()\n  */\n  static void (*idle)();\n\n#ifndef FL_DOXYGEN\nprivate:\n  static Fl_Awake_Handler *awake_ring_;\n  static void **awake_data_;\n  static int awake_ring_size_;\n  static int awake_ring_head_;\n  static int awake_ring_tail_;\npublic:\n  static const char* scheme_;\n  static Fl_Image* scheme_bg_;\n\n  static int e_original_keysym; // late addition\n  static int scrollbar_size_;\n  static int menu_linespacing_; // STR #2927\n#endif\n\n\n  static int add_awake_handler_(Fl_Awake_Handler, void*);\n  static int get_awake_handler_(Fl_Awake_Handler&, void*&);\n\npublic:\n\n  // API version number\n  static double version();\n  static int api_version();\n\n  // ABI version number\n  static int abi_version();\n\n  /**\n    Returns whether the runtime library ABI version is correct.\n\n    This enables you to check the ABI version of the linked FLTK\n    library at runtime.\n\n    Returns 1 (true) if the compiled ABI version (in the header files)\n    and the linked library ABI version (used at runtime) are the same,\n    0 (false) otherwise.\n\n    Argument \\p val can be used to query a particular library ABI version.\n    Use for instance 10303 to query if the runtime library is compatible\n    with FLTK ABI version 1.3.3. This is rarely useful.\n\n    The default \\p val argument is FL_ABI_VERSION, which checks the version\n    defined at configure time (i.e. in the header files at program\n    compilation time) against the linked library version used at runtime.\n    This is particularly useful if you linked with a shared object library,\n    but it also concerns static linking.\n\n    \\see Fl::abi_version()\n  */\n  static inline int abi_check(const int val = FL_ABI_VERSION) {\n    return val == abi_version();\n  }\n\n  // argument parsers:\n  static int arg(int argc, char **argv, int& i);\n  static int args(int argc, char **argv, int& i, Fl_Args_Handler cb = 0);\n  static void args(int argc, char **argv);\n  /**\n    Usage string displayed if Fl::args() detects an invalid argument.\n    This may be changed to point to customized text at run-time.\n  */\n  static const char* const help;\n\n  // things called by initialization:\n  static void display(const char*);\n  static int visual(int);\n  /**\n    This does the same thing as Fl::visual(int) but also requires OpenGL\n    drawing to work. This <I>must</I> be done if you want to draw in\n    normal windows with OpenGL with gl_start() and gl_end().\n    It may be useful to call this so your X windows use the same visual\n    as an Fl_Gl_Window, which on some servers will reduce colormap flashing.\n\n    See Fl_Gl_Window for a list of additional values for the argument.\n  */\n  static int gl_visual(int, int *alist=0); // platform dependent\n  static void own_colormap();\n  static void get_system_colors();\n  static void foreground(uchar, uchar, uchar);\n  static void background(uchar, uchar, uchar);\n  static void background2(uchar, uchar, uchar);\n\n  // schemes:\n  static int scheme(const char *name);\n  /** See void scheme(const char *name) */\n  static const char* scheme() {return scheme_;}\n\n  /** Returns whether the current scheme is the given name.\n\n    This is a fast inline convenience function to support scheme-specific\n    code in widgets, e.g. in their draw() methods, if required.\n\n    Use a valid scheme name, not \\p NULL (although \\p NULL is allowed,\n    this is not a useful argument - see below).\n\n    If Fl::scheme() has not been set or has been set to the default\n    scheme (\"none\" or \"base\"), then this will always return 0 regardless\n    of the argument, because Fl::scheme() is \\p NULL in this case.\n\n    \\note The stored scheme name is always lowercase, and this method will\n    do a case-sensitive compare, so you \\b must provide a lowercase string to\n    return the correct value. This is intentional for performance reasons.\n\n    Example:\n    \\code\n      if (Fl::is_scheme(\"gtk+\")) { your_code_here(); }\n    \\endcode\n\n    \\param[in] name \\b lowercase string of requested scheme name.\n\n    \\return 1 if the given scheme is active, 0 otherwise.\n\n    \\see Fl::scheme(const char *name)\n  */\n  static int is_scheme(const char *name) {\n    return (scheme_ && name && !strcmp(name,scheme_));\n  }\n\n  static int reload_scheme(); // defined in 'src/Fl_get_system_colors.cxx'\n\n  static int scrollbar_size();\n  static void scrollbar_size(int W);\n  static int menu_linespacing();\n  static void menu_linespacing(int H);\n\n  // execution:\n  static int wait();\n  static double wait(double time);\n  static int check();\n  static int ready();\n  static int run();\n  /** Returns non-zero when a request for program termination was received and accepted.\n   On the MacOS platform, the \"Quit xxx\" item of the application menu is such a request,\n   that is considered accepted when all windows are closed. On other platforms, this function\n   returns 0 until \\p Fl::program_should_quit(1) is called.\n   \\version 1.4.0\n   */\n  static int program_should_quit() {return program_should_quit_;}\n  /** Indicate to the FLTK library whether a program termination request was received and accepted.\n  A program may set this to 1, for example, while performing a platform-independent command asking the program to cleanly\n  terminate, similarly to the \"Quit xxx\" item of the application menu under MacOS.\n   \\version 1.4.0\n   */\n  static void program_should_quit(int should_i) { program_should_quit_ = should_i; }\n  static void hide_all_windows();\n\n  static Fl_Widget* readqueue();\n\n  //\n  // cross-platform timer support\n  //\n\n  static void add_timeout(double t, Fl_Timeout_Handler cb, void *data = 0);\n  static void repeat_timeout(double t, Fl_Timeout_Handler cb, void *data = 0);\n  static int  has_timeout(Fl_Timeout_Handler cb, void *data = 0);\n  static void remove_timeout(Fl_Timeout_Handler cb, void *data = 0);\n  static int remove_next_timeout(Fl_Timeout_Handler cb, void *data = 0, void **data_return = 0);\n\n  static void add_check(Fl_Timeout_Handler, void* = 0);\n  static int  has_check(Fl_Timeout_Handler, void* = 0);\n  static void remove_check(Fl_Timeout_Handler, void* = 0);\n\n  static Fl_Timestamp now(double offset = 0);\n  static double seconds_since(Fl_Timestamp& then);\n  static double seconds_between(Fl_Timestamp& back, Fl_Timestamp& further_back);\n  static long ticks_since(Fl_Timestamp& then);\n  static long ticks_between(Fl_Timestamp& back, Fl_Timestamp& further_back);\n\n  // private\n  static void run_idle();\n  static void run_checks();\n  static void add_fd(int fd, int when, Fl_FD_Handler cb, void* = 0); // platform dependent\n  static void add_fd(int fd, Fl_FD_Handler cb, void* = 0); // platform dependent\n  /** Removes a file descriptor handler. */\n  static void remove_fd(int, int when); // platform dependent\n  /** Removes a file descriptor handler. */\n  static void remove_fd(int); // platform dependent\n\n  static void add_idle(Fl_Idle_Handler cb, void* data = 0);\n  static int  has_idle(Fl_Idle_Handler cb, void* data = 0);\n  static void remove_idle(Fl_Idle_Handler cb, void* data = 0);\n  /** If true then flush() will do something. */\n  static int damage() {return damage_;}\n  static void redraw();\n  static void flush();\n  /** \\addtogroup group_comdlg\n    @{ */\n  /**\n  FLTK calls Fl::warning() to output a warning message.\n\n  The default version on Windows returns \\e without printing a warning\n  message, because Windows programs normally don't have stderr (a console\n  window) enabled.\n\n  The default version on all other platforms prints the warning message to stderr.\n\n  You can override the behavior by setting the function pointer to your\n  own routine.\n\n  Fl::warning() means that there was a recoverable problem, the display may\n  be messed up, but the user can probably keep working - all X protocol\n  errors call this, for example. The default implementation returns after\n  displaying the message.\n   \\note \\#include <FL/Fl.H>\n  */\n  static void (*warning)(const char*, ...);\n  /**\n  FLTK calls Fl::error() to output a normal error message.\n\n  The default version on Windows displays the error message in a MessageBox window.\n\n  The default version on all other platforms prints the error message to stderr.\n\n  You can override the behavior by setting the function pointer to your\n  own routine.\n\n  Fl::error() means there is a recoverable error such as the inability to read\n  an image file. The default implementation returns after displaying the message.\n   \\note \\#include <FL/Fl.H>\n  */\n  static void (*error)(const char*, ...);\n  /**\n  FLTK calls Fl::fatal() to output a fatal error message.\n\n  The default version on Windows displays the error message in a MessageBox window.\n\n  The default version on all other platforms prints the error message to stderr.\n\n  You can override the behavior by setting the function pointer to your\n  own routine.\n\n  Fl::fatal() must not return, as FLTK is in an unusable state, however your\n  version may be able to use longjmp or an exception to continue, as long as\n  it does not call FLTK again. The default implementation exits with status 1\n  after displaying the message.\n   \\note \\#include <FL/Fl.H>\n  */\n  static void (*fatal)(const char*, ...);\n  /** @} */\n\n  /** \\defgroup  fl_windows Windows handling functions\n      \\brief Windows and standard dialogs handling declared in <FL/Fl.H>\n    @{ */\n  static Fl_Window* first_window();\n  static void first_window(Fl_Window*);\n  static Fl_Window* next_window(const Fl_Window*);\n\n  /**\n    Returns the top-most modal() window currently shown.\n\n    This is the most recently shown() window with modal() true, or NULL\n    if there are no modal() windows shown().\n    The modal() window has its handle() method called\n    for all events, and no other windows will have handle()\n    called (grab() overrides this).\n  */\n  static Fl_Window* modal() {return modal_;}\n  /** Returns the window that currently receives all events.\n\n   \\return The window that currently receives all events,\n   or NULL if event grabbing is currently OFF.\n  */\n  static Fl_Window* grab() {return grab_;}\n  /** Selects the window to grab.\n   This is used when pop-up menu systems are active.\n\n   Send all events to the passed window no matter where the pointer or\n   focus is (including in other programs). The window <I>does not have\n   to be shown()</I> , this lets the handle() method of a\n   \"dummy\" window override all event handling and allows you to\n   map and unmap a complex set of windows (under both X and Windows\n   <I>some</I> window must be mapped because the system interface needs a\n   window id).\n\n   If grab() is on it will also affect show() of windows by doing\n   system-specific operations (on X it turns on override-redirect).\n   These are designed to make menus popup reliably\n   and faster on the system.\n\n   To turn off grabbing do Fl::grab(0).\n\n   <I>Be careful that your program does not enter an infinite loop\n   while grab() is on.  On X this will lock up your screen!</I>\n   To avoid this potential lockup, all newer operating systems seem to\n   limit mouse pointer grabbing to the time during which a mouse button\n   is held down. Some OS's may not support grabbing at all.\n   */\n  static void grab(Fl_Window*); // platform dependent\n  /** @} */\n\n  /** \\defgroup fl_events Events handling functions\n        Fl class events handling API declared in <FL/Fl.H>\n        @{\n  */\n  // event information:\n  /**\n    Returns the last event that was processed. This can be used\n    to determine if a callback is being done in response to a\n    keypress, mouse click, etc.\n  */\n  static int event()            {return e_number;}\n  /**\n    Returns the mouse position of the event relative to the Fl_Window\n    it was passed to.\n  */\n  static int event_x()  {return e_x;}\n  /**\n    Returns the mouse position of the event relative to the Fl_Window\n    it was passed to.\n  */\n  static int event_y()  {return e_y;}\n  /**\n    Returns the mouse position on the screen of the event.  To find the\n    absolute position of an Fl_Window on the screen, use the\n    difference between event_x_root(),event_y_root() and\n    event_x(),event_y().\n  */\n  static int event_x_root()     {return e_x_root;}\n  /**\n    Returns the mouse position on the screen of the event.  To find the\n    absolute position of an Fl_Window on the screen, use the\n    difference between event_x_root(),event_y_root() and\n    event_x(),event_y().\n  */\n  static int event_y_root()     {return e_y_root;}\n  /**\n    Returns the current horizontal mouse scrolling associated with the\n    FL_MOUSEWHEEL event. Right is positive.\n  */\n  static int event_dx() {return e_dx;}\n  /**\n    Returns the current vertical mouse scrolling associated with the\n    FL_MOUSEWHEEL event. Down is positive.\n  */\n  static int event_dy() {return e_dy;}\n  /**\n    Return where the mouse is on the screen by doing a round-trip query to\n    the server.  You should use Fl::event_x_root() and\n    Fl::event_y_root() if possible, but this is necessary if you are\n    not sure if a mouse event has been processed recently (such as to\n    position your first window).  If the display is not open, this will\n    open it.\n  */\n  static void get_mouse(int &,int &);\n  /**\n    Returns non zero if we had a double click event.\n    \\retval Non-zero if the most recent FL_PUSH or FL_KEYBOARD was a \"double click\".\n    \\retval  N-1 for  N clicks.\n    A double click is counted if the same button is pressed\n    again while event_is_click() is true.\n\n   */\n  static int event_clicks()     {return e_clicks;}\n  /**\n    Manually sets the number returned by Fl::event_clicks().\n    This can be used to set it to zero so that\n    later code does not think an item was double-clicked.\n    \\param[in] i corresponds to no double-click if 0, i+1 mouse clicks otherwise\n    \\see int event_clicks()\n  */\n  static void event_clicks(int i) {e_clicks = i;}\n  /**\n  Returns non-zero if the mouse has not moved far enough\n  and not enough time has passed since the last FL_PUSH or\n  FL_KEYBOARD event for it to be considered a \"drag\" rather than a\n  \"click\".  You can test this on FL_DRAG, FL_RELEASE,\n  and FL_MOVE events.\n  */\n  static int event_is_click()   {return e_is_click;}\n  /**\n   Clears the value returned by Fl::event_is_click().\n   Useful to prevent the <I>next</I>\n   click from being counted as a double-click or to make a popup menu\n   pick an item with a single click.  Don't pass non-zero to this.\n  */\n  static void event_is_click(int i) {e_is_click = i;}\n  /**\n    Gets which particular mouse button caused the current event.\n\n    This returns garbage if the most recent event was not a FL_PUSH or FL_RELEASE event.\n    \\retval FL_LEFT_MOUSE\n    \\retval FL_MIDDLE_MOUSE\n    \\retval FL_RIGHT_MOUSE\n    \\retval FL_BACK_MOUSE\n    \\retval FL_FORWARD_MOUSE\n    \\see Fl::event_buttons(), Fl::event_state()\n  */\n  static int event_button() { return e_keysym - FL_Button; }\n  /**\n    Returns the keyboard and mouse button states of the last event.\n\n    This is a bitfield of what shift states were on and what mouse buttons\n    were held down during the most recent event.\n\n    \\note FLTK platforms differ in what Fl::event_state() returns when it is called\n      while a modifier key or mouse button is being pressed or released.\n\n  - Under X11 and Wayland, Fl::event_state() indicates the state of the modifier keys and\n    mouse buttons just \\b prior to the event. Thus, during the \\c FL_KEYDOWN event generated\n    when pressing the shift key, for example, the \\c FL_SHIFT bit of event_state() is 0 and\n    becomes 1 only at the next event which can be any other event, including e.g. \\c FL_MOVE.\n  - Under other platforms the reported state of modifier keys or mouse buttons includes that\n    of the key or button being pressed or released.\n  - Fl::event_state() returns the same value under all platforms when it's called while a\n    non-modifier key (e.g. a letter or function key) is being pressed or released.\n  - X servers do not agree on shift states, and \\c FL_NUM_LOCK, \\c FL_META, and \\c FL_SCROLL_LOCK\n    may not work.\n  - The values were selected to match the XFree86 server on Linux.\n\n  \\note This inconsistency \\b may be fixed (on X11 and Wayland) in a later release.\n\n  The legal event state bits are:\n\n    | Device   | State Bit      | Key or Button           | Since  |\n    |----------|----------------|-------------------------|--------|\n    | Keyboard | FL_SHIFT       | Shift                   |        |\n    | Keyboard | FL_CAPS_LOCK   | Caps Lock               |        |\n    | Keyboard | FL_CTRL        | Ctrl                    |        |\n    | Keyboard | FL_ALT         | Alt                     |        |\n    | Keyboard | FL_NUM_LOCK    | Num Lock                |        |\n    | Keyboard | FL_META        | Meta, e.g. \"Windows\"    |        |\n    | Keyboard | FL_SCROLL_LOCK | Scroll Lock             |        |\n    | Mouse    | FL_BUTTON1     | left button             |        |\n    | Mouse    | FL_BUTTON2     | middle button           |        |\n    | Mouse    | FL_BUTTON3     | right button            |        |\n    | Mouse    | FL_BUTTON4     | side button 1 (back)    | 1.3.10 |\n    | Mouse    | FL_BUTTON5     | side button 2 (forward) | 1.3.10 |\n  */\n  static int event_state()      {return e_state;}\n\n  /** Returns non-zero if any of the passed event state bits are turned on.\n\n    Use \\p mask to pass the event states you're interested in.\n    The legal event state bits are defined in Fl::event_state().\n  */\n  static int event_state(int mask) {return e_state&mask;}\n  /**\n    Gets which key on the keyboard was last pushed.\n\n    The returned integer 'key code' is not necessarily a text\n    equivalent for the keystroke. For instance: if someone presses '5' on the\n    numeric keypad with numlock on, Fl::event_key() may return the 'key code'\n    for this key, and NOT the character '5'. To always get the '5', use Fl::event_text() instead.\n\n    \\returns an integer 'key code', or 0 if the last event was not a key press or release.\n    \\see int event_key(int), event_text(), compose(int&).\n  */\n  static int event_key()        {return e_keysym;}\n  /**\n    Returns the keycode of the last key event, regardless of the NumLock state.\n\n    If NumLock is deactivated, FLTK translates events from the\n    numeric keypad into the corresponding arrow key events.\n    event_key() returns the translated key code, whereas\n    event_original_key() returns the keycode before NumLock translation.\n  */\n  static int event_original_key(){return e_original_keysym;}\n  /**\n    Returns true if the given \\p key was held\n    down (or pressed) <I>during</I> the last event.  This is constant until\n    the next event is read from the server.\n\n    Fl::get_key(int) returns true if the given key is held down <I>now</I>.\n    Under X this requires a round-trip to the server and is <I>much</I>\n    slower than Fl::event_key(int).\n\n    Keys are identified by the <I>unshifted</I> values. FLTK defines a\n    set of symbols that should work on most modern machines for every key\n    on the keyboard:\n\n    \\li All keys on the main keyboard producing a printable ASCII\n        character use the value of that ASCII character (as though shift,\n        ctrl, and caps lock were not on). The space bar is 32.\n    \\li All keys on the numeric keypad producing a printable ASCII\n        character use the value of that ASCII character plus FL_KP\n        (e.g., FL_KP + '4', FL_KP + '/').\n        The highest possible value is FL_KP_Last so you can\n        range-check to see if something is  on the keypad.\n    \\li All numbered function keys use the number on the function key plus\n        FL_F.  The highest possible number is FL_F_Last, so you\n        can range-check a value.\n    \\li Buttons on the mouse are considered keys, and use the button\n        number (where the left button is 1) plus FL_Button.\n    \\li All other keys on the keypad have a symbol: FL_Escape,\n        FL_BackSpace, FL_Tab, FL_Enter, FL_Print, FL_Scroll_Lock, FL_Pause,\n        FL_Insert, FL_Home, FL_Page_Up, FL_Delete, FL_End, FL_Page_Down,\n        FL_Left, FL_Up, FL_Right, FL_Down, FL_Iso_Key, FL_Shift_L, FL_Shift_R,\n        FL_Control_L, FL_Control_R, FL_Caps_Lock, FL_Alt_L, FL_Alt_R,\n        FL_Meta_L, FL_Meta_R, FL_Menu, FL_Num_Lock, FL_KP_Enter.  Be\n        careful not to confuse these with the very similar, but all-caps,\n        symbols used by Fl::event_state().\n\n    On X Fl::get_key(FL_Button+n) does not work.\n\n    On Windows Fl::get_key(FL_KP_Enter) and Fl::event_key(FL_KP_Enter) do not work.\n  */\n  static int event_key(int key);\n  /**\n    Returns true if the given \\p key is held down <I>now</I>.\n    Under X this requires a round-trip to the server and is <I>much</I>\n    slower than Fl::event_key(int). \\see event_key(int)\n  */\n  static int get_key(int key); // platform dependent\n  /**\n    Returns the text associated with the current event, including FL_PASTE or FL_DND_RELEASE events.\n    This can be used in response to FL_KEYUP, FL_KEYDOWN, FL_PASTE, and FL_DND_RELEASE.\n\n    When responding to FL_KEYUP/FL_KEYDOWN, use this function instead of Fl::event_key()\n    to get the text equivalent of keystrokes suitable for inserting into strings\n    and text widgets.\n\n    The returned string is guaranteed to be NULL terminated.\n    However, see Fl::event_length() for the actual length of the string,\n    in case the string itself contains NULLs that are part of the text data.\n\n    \\returns A NULL terminated text string equivalent of the last keystroke.\n   */\n  static const char* event_text() {return e_text;}\n  /**\n    Returns the length of the text in Fl::event_text(). There\n    will always be a nul at this position in the text. However there may\n    be a nul before that if the keystroke translates to a nul character or\n    you paste a nul character.\n  */\n  static int event_length() {return e_length;}\n\n  /** During an FL_PASTE event of non-textual data, returns a pointer to the pasted data.\n   The returned data is an Fl_RGB_Image * when the result of Fl::event_clipboard_type() is Fl::clipboard_image.\n   */\n  static void *event_clipboard() { return e_clipboard_data; }\n  /** Returns the type of the pasted data during an FL_PASTE event.\n   This type can be Fl::clipboard_plain_text or Fl::clipboard_image.\n   */\n  static const char *event_clipboard_type() {return e_clipboard_type; }\n\n\n  static int compose(int &del);\n  static void compose_reset();\n  static int event_inside(int,int,int,int);\n  static int event_inside(const Fl_Widget*);\n  static int test_shortcut(Fl_Shortcut);\n\n  static void enable_im();\n  static void disable_im();\n\n  // event destinations:\n  static int handle(int, Fl_Window*);\n  static int handle_(int, Fl_Window*);\n  /**  Gets the widget that is below the mouse.\n       \\see  belowmouse(Fl_Widget*) */\n  static Fl_Widget* belowmouse() {return belowmouse_;}\n  static void belowmouse(Fl_Widget*);\n  /** Gets the widget that is being pushed.\n      \\see void pushed(Fl_Widget*) */\n  static Fl_Widget* pushed()    {return pushed_;}\n  static void pushed(Fl_Widget*);\n  /** Gets the current Fl::focus() widget. \\sa Fl::focus(Fl_Widget*) */\n  static Fl_Widget* focus()     {return focus_;}\n  static void focus(Fl_Widget*);\n  static void add_handler(Fl_Event_Handler ha);\n  static void add_handler(Fl_Event_Handler ha, Fl_Event_Handler before);\n  static Fl_Event_Handler last_handler();\n  static void remove_handler(Fl_Event_Handler h);\n  static void add_system_handler(Fl_System_Handler h, void *data);\n  static void remove_system_handler(Fl_System_Handler h);\n  static void event_dispatch(Fl_Event_Dispatch d);\n  static Fl_Event_Dispatch event_dispatch();\n  static Fl_Callback_Reason callback_reason();\n  /** @} */\n\n  /** \\defgroup  fl_clipboard  Selection & Clipboard functions\n        FLTK global copy/cut/paste functions declared in <FL/Fl.H>\n   @{ */\n\n  /**\n    Copies data to the selection buffer, the clipboard, or both.\n\n    The \\p destination can be:\n     - 0: selection buffer (see note below)\n     - 1: clipboard\n     - 2: both\n\n    The selection buffer exists only on the X11 platform and is used for middle-mouse\n    pastes and for drag-and-drop selections. The clipboard is used for traditional\n    copy/cut/paste operations. On all other platforms the selection buffer\n    (\\p destination = 0) is mapped to the clipboard, i.e. on platforms other than X11\n    all \\p destinations are equivalent and the data is always copied to the clipboard.\n\n    \\note Please see Fl::selection_to_clipboard() to enable duplication of the\n      selection buffer to the clipboard on X11, i.e. if \\p destination = 0\n      (selection buffer) \\b and Fl::selection_to_clipboard() is enabled, then\n      the data is copied to both the selection buffer and the clipboard.\n      This makes the X11 behavior similar to other platforms but keeps the\n      selection buffer for X11 specific inter process communication.\n\n    \\p type should always be \\p Fl::clipboard_plain_text which is the default.\n    Other values are ignored and reserved for future extensions.\n\n    \\note This function is, at present, intended only to copy UTF-8 encoded\n      textual data. To copy graphical data, use the Fl_Copy_Surface class.\n      The \\p type argument may allow to copy other kinds of data in the future.\n\n    \\param[in]  stuff       text data to be copied\n    \\param[in]  len         the number of relevant bytes in \\p stuff\n    \\param[in]  destination 0 = selection, 1 = clipboard, 2 = both (see description)\n    \\param[in]  type        usually plain text (see description)\n\n    \\internal\n      Documented here because it is platform dependent (calls the platform driver):\n    \\code\n      Fl::screen_driver()->copy(stuff, len, clipboard, type);\n    \\endcode\n  */\n  static void copy(const char *stuff, int len, int destination = 0,\n                   const char *type = Fl::clipboard_plain_text);\n\n  /**\n    Copies selections on X11 directly to the clipboard if enabled.\n\n    This method can be called on all platforms. Other platforms than X11 are\n    not affected by this feature.\n\n    If this is switched on (\\p mode = 1), Fl::copy() copies all data to the\n    clipboard regardless of its \\p destination argument. If the destination is 0\n    (selection buffer) data is copied to both the selection buffer and the clipboard.\n\n    Drag and drop is also affected since drag-and-drop data is copied to the selection\n    buffer.\n\n    You can use this to make the experience of data selection and copying more like\n    that on other platforms (Windows, macOS, and even Wayland).\n\n    The default operation mode is the standard X11 behavior (disabled).\n\n    \\note This feature is experimental and enabling it may have unexpected side effects.\n      It is your own responsibility if you enable it.\n\n    \\since 1.4.0\n\n    \\param[in]  mode  1 = enable selection_to_clipboard, 0 = disable selection_to_clipboard\n\n    \\see copy(const char *, int, int, const char *)\n  */\n  static void selection_to_clipboard(int mode) {\n    selection_to_clipboard_ = mode ? 1 : 0;\n  }\n\n  /**\n    \\brief Returns the current selection_to_clipboard mode.\n\n    \\see void selection_to_clipboard(int)\n  */\n  static int selection_to_clipboard() { return selection_to_clipboard_; }\n\n  /**\n   Pastes the data from the selection buffer (\\p source is 0) or the clipboard\n   (\\p source is 1) into \\p receiver.\n\n   The selection buffer (\\p source is 0) is used for middle-mouse pastes and for\n   drag-and-drop selections. The clipboard (\\p source is 1) is used for\n   copy/cut/paste operations.\n\n   If \\p source is 1, the optional \\p type argument indicates what type of data is requested from the clipboard.\n   At present, Fl::clipboard_plain_text (requesting text data) and\n   Fl::clipboard_image (requesting image data) are possible.\n   Set things up so the handle function of the \\p receiver widget will be called with an FL_PASTE event some\n   time in the future if the clipboard does contain data of the requested type.\n\n   The handle function of \\p receiver can process the FL_PASTE event as follows:\n   \\li If the \\p receiver widget is known to only receive text data, the text string\n   from the specified \\p source is in Fl::event_text() with UTF-8 encoding, and the\n   number of bytes is in Fl::event_length(). If Fl::paste() gets called during the\n   drop step of a files-drag-and-drop operation,\n   Fl::event_text() contains a list of filenames (see \\ref events_dnd).\n   \\li If the \\p receiver widget can potentially receive non-text data, use\n   Fl::event_clipboard_type() to determine what sort of data is being sent.\n   If Fl::event_clipboard_type() returns Fl::clipboard_plain_text, proceed as above.\n   It it returns Fl::clipboard_image, the pointer returned by Fl::event_clipboard()\n   can be safely cast to type Fl_RGB_Image * to obtain a pointer to the pasted image.\n   If \\p receiver accepts the clipboard image, receiver.handle() should return 1 and the\n   application should take ownership of this image (that is, delete it after use).\n   Conversely, if receiver.handle() returns 0, the application must not use the image.\n\n   The receiver should be prepared to be called \\e directly by this, or for\n   it to happen \\e later, or possibly <i>not at all</i>.  This\n   allows the window system to take as long as necessary to retrieve\n   the paste buffer (or even to screw up completely) without complex\n   and error-prone synchronization code in FLTK.\n\n   \\par Platform details for image data:\n   \\li Unix/Linux platform: Clipboard images in PNG or BMP formats are recognized. Requires linking with the fltk_images library.\n   \\li Windows platform: Both bitmap and vectorial (Enhanced metafile) data from clipboard\n   can be pasted as image data.\n   \\li Mac OS X platform: Both bitmap (TIFF) and vectorial (PDF) data from clipboard\n   can be pasted as image data.\n   */\n  static void paste(Fl_Widget &receiver, int source, const char *type = Fl::clipboard_plain_text);\n\n  /**\n  FLTK will call the registered callback whenever there is a change to the\n  selection buffer or the clipboard. The source argument indicates which\n  of the two has changed. Only changes by other applications are reported.\n\n  Example:\n  \\code\n    void clip_callback(int source, void *data) {\n        if ( source == 0 ) printf(\"CLIP CALLBACK: selection buffer changed\\n\");\n        if ( source == 1 ) printf(\"CLIP CALLBACK: clipboard changed\\n\");\n    }\n    [..]\n    int main() {\n        [..]\n        Fl::add_clipboard_notify(clip_callback);\n        [..]\n    }\n  \\endcode\n  \\note Some systems require polling to monitor the clipboard and may\n  therefore have some delay in detecting changes.\n  */\n  static void add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data = 0);\n  /**\n  Stop calling the specified callback when there are changes to the selection\n  buffer or the clipboard.\n  */\n  static void remove_clipboard_notify(Fl_Clipboard_Notify_Handler h);\n  /** Returns non 0 if the clipboard contains data matching \\p type.\n   The clipboard can contain both text and image data;  in that situation this function\n   returns non 0 to both requests.\n   This function is \\e not meant to check whether the clipboard is empty.\n   This function does not allow to query the selection buffer because FLTK\n   allows to copy/paste non-textual data only from/to the clipboard.\n   \\param type can be Fl::clipboard_plain_text or Fl::clipboard_image.\n   */\n  static int clipboard_contains(const char *type);\n  /**  Denotes plain textual data\n   */\n  static char const * const clipboard_plain_text;\n  /**  Denotes image data\n   */\n  static char const * const clipboard_image;\n\n  /**\n    Initiate a Drag And Drop operation. The selection buffer should be\n    filled with relevant data before calling this method. FLTK will\n    then initiate the system wide drag and drop handling. Dropped data\n    will be marked as <i>text</i>.\n\n    Create a selection first using:\n    Fl::copy(const char *stuff, int len, 0)\n  */\n  static int dnd(); // platform dependent\n\n  // These are for back-compatibility only:\n  /**  back-compatibility only: Gets the widget owning the current selection\n       \\see Fl_Widget* selection_owner(Fl_Widget*) */\n  static Fl_Widget* selection_owner() {return selection_owner_;}\n  static void selection_owner(Fl_Widget*);\n  static void selection(Fl_Widget &owner, const char*, int len);\n  static void paste(Fl_Widget &receiver);\n/** @} */\n\n\n/** \\defgroup  fl_screen  Screen functions\n Fl global screen functions declared in <FL/Fl.H>.\n\n FLTK supports high-DPI screens using a screen scaling factor.\n The scaling factor is initialized by the library to a value\n based on information obtained from the OS. If this initial value\n is not satisfactory, the FLTK_SCALING_FACTOR environment variable\n can be set to a value FLTK will multiply to the OS-given value.\n The 2 variants of functions Fl::screen_scale() allow to programmatically get and set\n scaling factor values. The scaling factor value can be further changed at runtime\n by typing \\c Ctrl/+/-/0/ (\\c Cmd/+/-/0/ under macOS).\n See \\ref events_fl_shortcut for more details about these shortcuts.\n     @{ */\n  static int x(); // via screen driver\n  static int y(); // via screen driver\n  static int w(); // via screen driver\n  static int h(); // via screen driver\n\n  // multi-head support:\n  static int screen_count(); // via screen driver\n  static void screen_xywh(int &X, int &Y, int &W, int &H); // via screen driver\n  static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my); // via screen driver\n  static void screen_xywh(int &X, int &Y, int &W, int &H, int n); // via screen driver\n  static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh); // via screen driver\n  static int screen_num(int x, int y); // via screen driver\n  static int screen_num(int x, int y, int w, int h); // via screen driver\n  static void screen_dpi(float &h, float &v, int n=0); // via screen driver\n  static void screen_work_area(int &X, int &Y, int &W, int &H, int mx, int my); // via screen driver\n  static void screen_work_area(int &X, int &Y, int &W, int &H, int n); // via screen driver\n  static void screen_work_area(int &X, int &Y, int &W, int &H); // via screen driver\n  static float screen_scale(int n); // via screen driver\n  static void screen_scale(int n, float factor); // via screen driver\n  static int screen_scaling_supported();\n  static void keyboard_screen_scaling(int value);\n\n/**   @} */\n\n\n  /** \\defgroup  fl_attributes  Color & Font functions\n        fl global color, font functions.\n   These functions are declared in <FL/Fl.H> or <FL/fl_draw.H>.\n     @{ */\n\n  // color map:\n  static void   set_color(Fl_Color, uchar, uchar, uchar);\n  static void   set_color(Fl_Color, uchar, uchar, uchar, uchar);\n  /**\n    Sets an entry in the fl_color index table. You can set it to any\n    8-bit RGB color. The color is not allocated until fl_color(i) is used.\n  */\n  static void   set_color(Fl_Color i, unsigned c); // platform dependent\n  static unsigned get_color(Fl_Color i);\n  static void   get_color(Fl_Color i, uchar &red, uchar &green, uchar &blue);\n  static void   get_color(Fl_Color i, uchar &red, uchar &green, uchar &blue, uchar &alpha);\n  /**\n    Frees the specified color from the colormap, if applicable.\n    If overlay is non-zero then the color is freed from the\n    overlay colormap.\n  */\n  static void   free_color(Fl_Color i, int overlay = 0); // platform dependent\n\n  // fonts:\n  static const char* get_font(Fl_Font);\n  /**\n    Get a human-readable string describing the family of this face.  This\n    is useful if you are presenting a choice to the user.  There is no\n    guarantee that each face has a different name.  The return value points\n    to a static buffer that is overwritten each call.\n\n    The integer pointed to by \\p attributes (if the pointer is not\n    zero) is set to zero, FL_BOLD or FL_ITALIC or\n    FL_BOLD | FL_ITALIC.  To locate a \"family\" of fonts, search\n    forward and back for a set with non-zero attributes, these faces along\n    with the face with a zero attribute before them constitute a family.\n  */\n  static const char* get_font_name(Fl_Font, int* attributes = 0);\n  /**\n    Return an array of sizes in \\p sizep.  The return value is the\n    length of this array.  The sizes are sorted from smallest to largest\n    and indicate what sizes can be given to fl_font() that will\n    be matched exactly (fl_font() will pick the closest size for\n    other sizes).  A zero in the first location of the array indicates a\n    scalable font, where any size works, although the array may list sizes\n    that work \"better\" than others.  Warning: the returned array\n    points at a static buffer that is overwritten each call.  Under X this\n    will open the display.\n  */\n  static int get_font_sizes(Fl_Font, int*& sizep);\n  static void set_font(Fl_Font, const char*);\n  static void set_font(Fl_Font, Fl_Font);\n  /**\n    FLTK will open the display, and add every fonts on the server to the\n    face table.  It will attempt to put \"families\" of faces together, so\n    that the normal one is first, followed by bold, italic, and bold\n    italic.\n\n    The only argument to this function is somewhat obsolete since FLTK and most\n    underlying operating systems move to support Unicode. For completeness,\n    following is the original documentation and a few updates:\n\n    On X11, the optional argument is a string to describe the set of fonts to\n    add.  Passing NULL will select only fonts that have the\n    ISO8859-1 character set (and are thus usable by normal text).  Passing\n    \"-*\" will select all fonts with any encoding as long as they have\n    normal X font names with dashes in them.  Passing \"*\" will list every\n    font that exists (on X this may produce some strange output).  Other\n    values may be useful but are system dependent.\n\n    With the Xft option on Linux, this parameter is ignored.\n\n    With Windows, `NULL` selects fonts with ANSI_CHARSET encoding and non-NULL\n    selects all fonts.\n\n    On macOS, this parameter is ignored.\n\n    The return value is how many faces are in the table after this is done.\n  */\n  static Fl_Font set_fonts(const char* = 0); // platform dependent\n\n  /**   @} */\n /** \\defgroup  fl_drawings  Drawing functions\n  FLTK global graphics and GUI drawing functions.\n  These functions are declared in <FL/fl_draw.H>,\n  and in <FL/platform.H> for offscreen buffer-related ones.\n     @{ */\n  // <Hack to re-order the 'Drawing functions' group>\n /** @} */\n\n  // labeltypes:\n  static void set_labeltype(Fl_Labeltype,Fl_Label_Draw_F*,Fl_Label_Measure_F*);\n  /** Sets the functions to call to draw and measure a specific labeltype. */\n  static void set_labeltype(Fl_Labeltype, Fl_Labeltype from); // is it defined ?\n\n  // boxtypes:\n  static Fl_Box_Draw_F *get_boxtype(Fl_Boxtype);\n  static void set_boxtype(Fl_Boxtype, Fl_Box_Draw_F*,\n                          uchar, uchar, uchar, uchar,\n                          Fl_Box_Draw_Focus_F* =NULL);\n  static void set_boxtype(Fl_Boxtype, Fl_Boxtype from);\n  static int box_dx(Fl_Boxtype);\n  static int box_dy(Fl_Boxtype);\n  static int box_dw(Fl_Boxtype);\n  static int box_dh(Fl_Boxtype);\n\n  static int draw_box_active();\n  static Fl_Color box_color(Fl_Color);\n  static void set_box_color(Fl_Color);\n\n  // back compatibility:\n  /** \\addtogroup fl_windows\n    @{ */\n  /** For back compatibility, sets the void Fl::fatal handler callback */\n  static void set_abort(Fl_Abort_Handler f) {fatal = f;}\n  static void (*atclose)(Fl_Window*,void*);\n  static void default_atclose(Fl_Window*,void*);\n  /** For back compatibility, sets the Fl::atclose handler callback. You\n      can now simply change the callback for the window instead.\n      \\see Fl_Window::callback(Fl_Callback*) */\n  static void set_atclose(Fl_Atclose_Handler f) {atclose = f;}\n  /**   @} */\n\n  /** \\addtogroup fl_events\n    @{ */\n  /** Returns non-zero if the Shift key is pressed. */\n  static int event_shift() {return e_state&FL_SHIFT;}\n  /** Returns non-zero if the Control key is pressed. */\n  static int event_ctrl() {return e_state&FL_CTRL;}\n  /** Returns non-zero if the FL_COMMAND key is pressed, either FL_CTRL or on OSX FL_META. */\n  static int event_command() {return e_state&FL_COMMAND;}\n  /** Returns non-zero if the Alt key is pressed. */\n  static int event_alt() {return e_state&FL_ALT;}\n  /**\n    Returns the mouse buttons state bits; if non-zero, then at least one\n    button is pressed now.  This function returns the button state at the\n    time of the event. During an FL_RELEASE event, the state\n    of the released button will be 0. To find out, which button\n    caused an FL_RELEASE event, you can use Fl::event_button() instead.\n    \\return a bit mask value like { [FL_BUTTON1] | [FL_BUTTON2] | ... | [FL_BUTTON5] }\n  */\n  static int event_buttons() {return e_state & FL_BUTTONS;}\n  /**\n    Returns non-zero if mouse button 1 is currently held down.\n    For more details, see Fl::event_buttons().\n  */\n  static int event_button1() {return e_state & FL_BUTTON1;}\n  /**\n    Returns non-zero if mouse button 2 is currently held down.\n    For more details, see Fl::event_buttons().\n  */\n  static int event_button2() {return e_state & FL_BUTTON2;}\n  /**\n    Returns non-zero if mouse button 3 is currently held down.\n    For more details, see Fl::event_buttons().\n  */\n  static int event_button3() {return e_state & FL_BUTTON3;}\n  /**\n    Returns non-zero if mouse button 4 is currently held down.\n    For more details, see Fl::event_buttons().\n  */\n  static int event_button4() {return e_state & FL_BUTTON4;}\n  /**\n    Returns non-zero if mouse button 5 is currently held down.\n    For more details, see Fl::event_buttons().\n  */\n  static int event_button5() {return e_state & FL_BUTTON5;}\n  /**   @} */\n\n  /**\n    Sets an idle callback.\n\n    \\deprecated This method is obsolete - use the add_idle() method instead.\n  */\n  static void set_idle(Fl_Old_Idle_Handler cb) {idle = cb;}\n  /** See grab(Fl_Window*) */\n  static void grab(Fl_Window& win) {grab(&win);}\n  /** Releases the current grabbed window, equals grab(0).\n  \\deprecated Use Fl::grab(0) instead.\n  \\see grab(Fl_Window*) */\n  static void release() {grab(0);}\n\n  // Visible focus methods...\n  /**\n    Gets or sets the visible keyboard focus on buttons and other\n    non-text widgets. The default mode is to enable keyboard focus\n    for all widgets.\n  */\n  static void visible_focus(int v) { option(OPTION_VISIBLE_FOCUS, (v!=0)); }\n  /**\n    Gets or sets the visible keyboard focus on buttons and other\n    non-text widgets. The default mode is to enable keyboard focus\n    for all widgets.\n  */\n  static int  visible_focus() { return option(OPTION_VISIBLE_FOCUS); }\n\n  // Drag-n-drop text operation methods...\n  /**\n    Sets whether drag and drop text operations are supported.\n    This specifically affects whether selected text can\n    be dragged from text fields or dragged within a text field as a\n    cut/paste shortcut.\n  */\n  static void dnd_text_ops(int v) { option(OPTION_DND_TEXT, (v!=0)); }\n  /**\n    Gets whether drag and drop text operations are\n    supported. This returns whether selected text can\n    be dragged from text fields or dragged within a text field as a\n    cut/paste shortcut.\n  */\n  static int  dnd_text_ops() { return option(OPTION_DND_TEXT); }\n  /** \\defgroup fl_multithread Multithreading support functions\n        fl multithreading support functions declared in <FL/Fl.H>\n   @{ */\n\n  // Multithreading support:\n  static int lock();\n  static void unlock();\n  static void awake(void* message = 0);\n  /** See void awake(void* message=0). */\n  static int awake(Fl_Awake_Handler cb, void* message = 0);\n  /**\n    The thread_message() method returns the last message\n    that was sent from a child by the awake() method.\n\n    See also: \\ref advanced_multithreading\n  */\n  static void* thread_message(); // platform dependent\n  /** @} */\n\n  /** \\defgroup fl_del_widget Safe widget deletion support functions\n\n    These functions, declared in <FL/Fl.H>, support deletion of widgets inside callbacks.\n\n    Fl::delete_widget() should be called when deleting widgets\n    or complete widget trees (Fl_Group, Fl_Window, ...) inside\n    callbacks.\n\n    The other functions are intended for internal use. The preferred\n    way to use them is by using the helper class Fl_Widget_Tracker.\n\n    The following is to show how it works ...\n\n    There are three groups of related methods:\n\n      -# scheduled widget deletion\n        - Fl::delete_widget() schedules widgets for deletion\n        - Fl::do_widget_deletion() deletes all scheduled widgets\n      -# widget watch list (\"smart pointers\")\n        - Fl::watch_widget_pointer() adds a widget pointer to the watch list\n        - Fl::release_widget_pointer() removes a widget pointer from the watch list\n        - Fl::clear_widget_pointer() clears a widget pointer \\e in the watch list\n      -# the class Fl_Widget_Tracker:\n        - the constructor calls Fl::watch_widget_pointer()\n        - the destructor calls Fl::release_widget_pointer()\n        - the access methods can be used to test, if a widget has been deleted\n          \\see Fl_Widget_Tracker.\n\n   @{ */\n  // Widget deletion:\n  static void delete_widget(Fl_Widget *w);\n  static void do_widget_deletion();\n  static void watch_widget_pointer(Fl_Widget *&w);\n  static void release_widget_pointer(Fl_Widget *&w);\n  static void clear_widget_pointer(Fl_Widget const *w);\n  /** @} */\n\n  /**  sets whether GL windows should be drawn at high resolution on Apple\n   computers with retina displays\n   \\version 1.3.4\n   */\n  static void use_high_res_GL(int val) { use_high_res_GL_ = val; }\n  /**  returns whether GL windows should be drawn at high resolution on Apple\n   computers with retina displays.\n   Default is no.\n   \\version 1.3.4\n   */\n  static int use_high_res_GL() { return use_high_res_GL_; }\n\n  /**  sets whether OpenGL uses textures to draw all text.\n   By default, FLTK draws OpenGL text using textures, if the necessary\n   hardware support is available. Call \\p Fl::draw_GL_text_with_textures(0)\n   once in your program before the first call to gl_font() to have FLTK\n   draw instead OpenGL text using a legacy, platform-dependent procedure.\n   It's recommended not to deactivate textures under the MacOS platform\n   because the MacOS legacy procedure is extremely rudimentary.\n   \\param val use 0 to prevent FLTK from drawing GL text with textures\n   \\see gl_texture_pile_height(int max)\n   \\version 1.4.0\n   */\n  static void draw_GL_text_with_textures(int val) { draw_GL_text_with_textures_ = val; }\n\n  /**  returns whether whether OpenGL uses textures to draw all text.\n   Default is yes.\n   \\see draw_GL_text_with_textures(int val)\n   \\version 1.4.0\n   */\n  static int draw_GL_text_with_textures() { return draw_GL_text_with_textures_; }\n\n  static int system(const char *command);\n\n  // Convert Windows commandline arguments to UTF-8 (documented in src/Fl.cxx)\n  static int args_to_utf8(int argc, char ** &argv);\n\n#ifdef FLTK_HAVE_CAIRO\n  /** \\defgroup group_cairo Cairo Support Functions and Classes\n      @{\n  */\npublic:\n  // Cairo support API\n\n  static cairo_t *cairo_make_current(Fl_Window *w);\n\n  /** When FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true,\n    any current window dc is linked to a current Cairo context.\n    This is not the default, because it may not be necessary\n    to add Cairo support to all fltk supported windows.\n    When you wish to associate a Cairo context in this mode,\n    you need to call explicitly in your draw() overridden method,\n    Fl::cairo_make_current(Fl_Window*). This will create a Cairo context\n    only for this Window.\n    Still in custom Cairo application it is possible to handle\n    completely this process automatically by setting \\p alink to true.\n    In this last case, you don't need anymore to call Fl::cairo_make_current().\n    You can use Fl::cairo_cc() to get the current Cairo context anytime.\n\n    \\note Only available when configure has the --enable-cairo option\n  */\n  static void cairo_autolink_context(bool alink) {\n    cairo_state_.autolink(alink);\n  }\n\n  /**\n    Gets the current autolink mode for Cairo support.\n    \\retval false if no Cairo context autolink is made for each window.\n    \\retval true if any fltk window is attached a Cairo context when it\n    is current. \\see void cairo_autolink_context(bool alink)\n    \\note Only available when configure has the --enable-cairo option\n */\n  static bool cairo_autolink_context() {\n    return cairo_state_.autolink();\n  }\n\n  /** Gets the current Cairo context linked with a fltk window. */\n  static cairo_t *cairo_cc() {\n    return cairo_state_.cc();\n  }\n\n  /** Sets the current Cairo context to \\p c.\n    Set \\p own to true if you want fltk to handle this cc deletion.\n    \\note Only available when configure has the --enable-Cairo option\n  */\n  static void cairo_cc(cairo_t *c, bool own=false) {\n    cairo_state_.cc(c, own);\n  }\n\n  /** Flush Cairo drawings on Cairo context \\p c.\n    This is \\b required on Windows if you use the Cairo context provided\n    by the \"Cairo autolink\" option. Call this when all your drawings on\n    the Cairo context are finished. This is maybe not necessary on other\n    platforms than Windows but it does no harm if you call it always.\n\n    You don't need to use this if you use an Fl_Cairo_Window which does\n    this automatically after the draw callback returns.\n\n    Code example for \"Cairo autolink\" mode:\n\n    In the overridden draw() method of your subclass of Fl_Window or any\n    widget:\n    \\code\n      cairo_t *cc = Fl::cairo_cc();   // get the \"autolink\" Cairo context\n      // ... your Cairo drawings are here ...\n      Fl::cairo_flush(cc);            // flush Cairo drawings to the device\n    \\endcode\n\n    If you configure FLTK with \\c '--enable-cairo' or CMake option\n    \\c 'FLTK_OPTION_CAIRO_WINDOW' (i.e. without \\c '--enable-cairoext' or CMake option\n    \\c 'FLTK_OPTION_CAIRO_EXT') or if you don't enable the \\c 'autolink' Cairo\n    context you may do the equivalent to use Cairo drawings in an\n    overridden draw() method of derived classes by using\n    \\code\n      // get the  Cairo context for the \\c window\n      cairo_t *cc = Fl::cairo_make_current(window);\n      // ... your Cairo drawings are here ...\n      Fl::cairo_flush(cc); // flush Cairo drawings to the device\n    \\endcode\n    \\see Fl::cairo_autolink_context(bool)\n    \\see Fl::cairo_make_current(Fl_Window*);\n  */\n  static void cairo_flush(cairo_t *c) {\n    // flush Cairo drawings: necessary at least for Windows\n    cairo_surface_t *s = cairo_get_target(c);\n    cairo_surface_flush(s);\n  }\n\nprivate:\n  static cairo_t *cairo_make_current(void *gc);\n  static cairo_t *cairo_make_current(void *gc, int W, int H);\n  static Fl_Cairo_State cairo_state_;\n\npublic:\n  /** @} */\n\n#endif // FLTK_HAVE_CAIRO\n\n};\n\n/**\n  This class should be used to control safe widget deletion.\n\n  You can use an Fl_Widget_Tracker object to watch another widget, if you\n  need to know whether this widget has been deleted during a callback.\n\n  This simplifies the use of the \"safe widget deletion\" methods\n  Fl::watch_widget_pointer() and Fl::release_widget_pointer() and\n  makes their use more reliable, because the destructor automatically\n  releases the widget pointer from the widget watch list.\n\n  Fl_Widget_Tracker is intended to be used as an automatic (local/stack)\n  variable, such that its destructor is called when the object's\n  scope is left. This ensures that no stale widget pointers are\n  left in the widget watch list (see example below).\n\n  You can also create Fl_Widget_Tracker objects with \\c new, but then it\n  is your responsibility to delete the object (and thus remove the\n  widget pointer from the watch list) when it is no longer needed.\n\n  Example:\n\n  \\code\n  int MyClass::handle (int event) {\n\n    if (...) {\n      Fl_Widget_Tracker wp(this);           // watch myself\n      do_callback();                        // call the callback\n\n      if (wp.deleted()) return 1;           // exit, if deleted\n\n      // Now we are sure that the widget has not been deleted,\n      // and it is safe to access the widget:\n\n      box(FL_FLAT_BOX);\n      color(FL_WHITE);\n      redraw();\n    }\n  }\n  \\endcode\n\n*/\nclass FL_EXPORT Fl_Widget_Tracker {\n\n  Fl_Widget* wp_;\n\npublic:\n\n  Fl_Widget_Tracker(Fl_Widget *wi);\n  ~Fl_Widget_Tracker();\n\n  /**\n    Returns a pointer to the watched widget.\n\n    This pointer is \\c NULL, if the widget has been deleted.\n  */\n  Fl_Widget *widget() {return wp_;}\n\n  /**\n    Returns 1, if the watched widget has been deleted.\n\n    This is a convenience method. You can also use something like\n\n    <tt>  if (wp.widget() == 0) // ...</tt>\n\n    where \\p wp is an Fl_Widget_Tracker object.\n  */\n  int deleted() {return wp_ == 0;}\n\n  /**\n    Returns 1, if the watched widget exists (has not been deleted).\n\n    This is a convenience method. You can also use something like\n\n    <tt>  if (wp.widget() != 0) // ...</tt>\n\n    where \\p wp is an Fl_Widget_Tracker object.\n  */\n  int exists()  {return wp_ != 0;}\n\n};\n\n /** \\defgroup  fl_unicode  Unicode and UTF-8 functions\n        fl global Unicode and UTF-8 handling functions declared in <FL/fl_utf8.h>\n     @{ */\n /** @} */\n\n#endif // !Fl_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Adjuster.H",
    "content": "//\n// Adjuster widget header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Adjuster widget . */\n\n// 3-button \"slider\", made for Nuke\n\n#ifndef Fl_Adjuster_H\n#define Fl_Adjuster_H\n\n#ifndef Fl_Valuator_H\n#include \"Fl_Valuator.H\"\n#endif\n\n/**\n  The Fl_Adjuster widget was stolen from Prisms, and has proven\n  to be very useful for values that need a large dynamic range.\n  \\image html adjuster1.png\n  \\image latex adjuster1.png \"Fl_Adjuster\" width=4cm\n  <P>When you  press a button and drag to the right the value increases.\n  When you drag  to the left it decreases.  The largest button adjusts by\n  100 *  step(), the next by 10 * step() and that\n  smallest button  by step().  Clicking on the buttons\n  increments by 10 times the  amount dragging by a pixel does. Shift +\n  click decrements by 10 times  the amount.\n*/\nclass FL_EXPORT Fl_Adjuster : public Fl_Valuator {\n  int drag;\n  int ix;\n  int soft_;\nprotected:\n  void draw() FL_OVERRIDE;\n  int handle(int) FL_OVERRIDE;\n  void value_damage() FL_OVERRIDE;\npublic:\n  Fl_Adjuster(int X,int Y,int W,int H,const char *l=0);\n  /**\n    If \"soft\" is turned on, the user is allowed to drag the value outside\n    the range.  If they drag the value to one of the ends, let go, then\n    grab again and continue to drag, they can get to any value.  Default is\n    one.\n  */\n  void soft(int s) {soft_ = s;}\n  /**\n    If \"soft\" is turned on, the user is allowed to drag the value outside\n    the range.  If they drag the value to one of the ends, let go, then\n    grab again and continue to drag, they can get to any value.  Default is\n    one.\n  */\n  int soft() const {return soft_;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Anim_GIF_Image.H",
    "content": "//\n// Fl_Anim_GIF_Image class header for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2016-2023 by Christian Grabner <wcout@gmx.net>.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Anim_Gif_Image_H\n#define Fl_Anim_Gif_Image_H\n\n// forward declarations\nclass Fl_Image;\nclass Fl_Widget;\n\n#include <FL/Fl_GIF_Image.H>\n\n// Load and display animated GIF images\nclass FL_EXPORT Fl_Anim_GIF_Image : public Fl_GIF_Image {\n\n  class FrameInfo; // internal helper class\n\npublic:\n\n  /**\n   When opening an Fl_Anim_GIF_Image there are some options\n   that can be passed in a `flags` value.\n   */\n  enum Flags {\n    /**\n     This flag indicates to the loader that it should not start\n     the animation immediately after successful load, which is\n     the default.\n     It can be started later using the \\ref start() method.\n     */\n    DONT_START = 1,\n    /**\n     This flag indicates to the loader that it should not\n     resize the canvas widget of the animation to the dimensions\n     of the animation, which is the default.\n     Needed for special use cases.\n     */\n    DONT_RESIZE_CANVAS = 2,\n    /**\n     This flag indicates to the loader that it should not\n     set the animation as \\ref image() member of the canvas widget,\n     which is the default.\n     Needed for special use cases.\n     */\n    DONT_SET_AS_IMAGE = 4,\n    /**\n     Often frames change just a small area of the animation canvas.\n     This flag indicates to the loader to try using less memory\n     by storing frame data not as canvas-sized images but use the\n     sizes defined in the GIF file.\n     The drawbacks are higher cpu usage during playback and maybe\n     minor artifacts when resized.\n     */\n    OPTIMIZE_MEMORY = 8,\n    /**\n     This flag can be used to print informations about the\n     decoding process to the console.\n     */\n    LOG_FLAG = 64,\n    /**\n     This flag can be used to print even more informations about\n     the decoding process to the console.\n     */\n    DEBUG_FLAG = 128\n  };\n\n  // -- constructors and destructor\n  Fl_Anim_GIF_Image(const char *filename, Fl_Widget *canvas = 0, unsigned short flags = 0);\n  Fl_Anim_GIF_Image(const char* imagename, const unsigned char *data,\n                    const size_t length, Fl_Widget *canvas = 0,\n                    unsigned short flags = 0);\n  Fl_Anim_GIF_Image();\n  ~Fl_Anim_GIF_Image() FL_OVERRIDE;\n\n  // -- file handling\n  bool load(const char *name, const unsigned char *imgdata=NULL, size_t imglength=0);\n  bool valid() const;\n\n  // -- getters and setters\n  void frame_uncache(bool uncache);\n  bool frame_uncache() const;\n  double delay(int frame_) const;\n  void delay(int frame, double delay);\n  void canvas(Fl_Widget *canvas, unsigned short flags = 0);\n  Fl_Widget *canvas() const;\n  int canvas_w() const;\n  int canvas_h() const;\n  bool is_animated() const;\n  const char *name() const;\n  void speed(double speed);\n  double speed() const;\n\n  // -- animation\n  int frames() const;\n  void frame(int frame);\n  int frame() const;\n  Fl_Image *image() const;\n  Fl_Image *image(int frame) const;\n  bool start();\n  bool stop();\n  bool next();\n\n  /** Return if the animation is currently running or stopped.\n   \\return true if the animation is running\n   */\n  bool playing() const { return valid() && Fl::has_timeout(cb_animate, (void *)this); }\n\n  // -- image data\n  Fl_Anim_GIF_Image& resize(int w, int h);\n  Fl_Anim_GIF_Image& resize(double scale);\n  int frame_x(int frame) const;\n  int frame_y(int frame) const;\n  int frame_w(int frame) const;\n  int frame_h(int frame) const;\n\n  // -- overridden methods\n  void color_average(Fl_Color c, float i) FL_OVERRIDE;\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const { return Fl_Pixmap::copy(); }\n  void desaturate() FL_OVERRIDE;\n  void draw(int x, int y, int w, int h, int cx = 0, int cy = 0) FL_OVERRIDE;\n  void uncache() FL_OVERRIDE;\n\n  // -- debugging and logging\n  int debug() const;\n\n  // -- static methods\n  static int frame_count(const char *name, const unsigned char *imgdata = NULL, size_t imglength = 0);\n\n  /**\n   The loop flag can be used to (dis-)allow loop count.\n   If set (which is the default), the animation will be\n   stopped after the number of repeats specified in the\n   GIF file (typically this count is set to 'forever' anyway).\n   If cleared the animation will always be 'forever',\n   regardless of what is specified in the GIF file.\n   */\n  static bool loop;\n\n  /**\n   The min_delay value can be used to set a minimum value\n   for the frame delay for playback. This is to prevent\n   CPU hogs caused by images with very low delay rates.\n   This is a global value for all Fl_Anim_GIF_Image objects.\n   */\n  static double min_delay;\n\nprotected:\n\n  bool next_frame();\n  void clear_frames();\n  void set_frame(int frame);\n\n  static void cb_animate(void *d);\n  void scale_frame();\n  void set_frame();\n  void on_frame_data(Fl_GIF_Image::GIF_FRAME &f) FL_OVERRIDE;\n  void on_extension_data(Fl_GIF_Image::GIF_FRAME &f) FL_OVERRIDE;\n\nprivate:\n\n  char *name_;\n  unsigned short flags_;\n  Fl_Widget *canvas_;\n  bool uncache_;\n  bool valid_;\n  int frame_; // current frame\n  double speed_;\n  FrameInfo *fi_;\n};\n\n#endif // Fl_Anim_Gif_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_BMP_Image.H",
    "content": "//\n// BMP image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_BMP_Image widget . */\n\n#ifndef Fl_BMP_Image_H\n#define Fl_BMP_Image_H\n#  include \"Fl_Image.H\"\n\n/**\n The Fl_BMP_Image class supports loading, caching,\n and drawing of Windows Bitmap (BMP) image files.\n */\nclass FL_EXPORT Fl_BMP_Image : public Fl_RGB_Image {\n\npublic:\n\n  Fl_BMP_Image(const char* filename);\n  Fl_BMP_Image(const char* imagename, const unsigned char *data, const long length = -1);\n\nprotected:\n\n  void load_bmp_(class Fl_Image_Reader &rdr, int ico_height = 0, int ico_width = 0);\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Bitmap.H",
    "content": "//\n// Bitmap header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2017 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Bitmap widget . */\n\n#ifndef Fl_Bitmap_H\n#define Fl_Bitmap_H\n#include \"Fl_Image.H\"\n#include \"Fl_Widget.H\" // for fl_uintptr_t\n\nclass Fl_Widget;\nstruct Fl_Menu_Item;\n\n/**\n  The Fl_Bitmap class supports caching and drawing of mono-color\n  (bitmap) images. Images are drawn using the current color.\n*/\nclass FL_EXPORT Fl_Bitmap : public Fl_Image {\n  friend class Fl_Graphics_Driver;\npublic:\n  /** pointer to raw bitmap data */\n  const uchar *array;\n  /** Non-zero if array points to bitmap data allocated internally */\n  int alloc_array;\n\nprivate:\n  /** for internal use */\n  fl_uintptr_t id_;\n  int cache_w_, cache_h_; // size of bitmap when cached\n\npublic:\n  /** The constructors create a new bitmap from the specified bitmap data.\n   \\see Fl_Bitmap(const uchar *bits, int bits_length, int W, int H) */\n  Fl_Bitmap(const uchar *bits, int W, int H) :\n    Fl_Image(W,H,0), array(bits), alloc_array(0), id_(0), cache_w_(0),cache_h_(0) {data((const char **)&array, 1);}\n  /** The constructors create a new bitmap from the specified bitmap data.\n   \\see Fl_Bitmap(const char *bits, int bits_length, int W, int H) */\n  Fl_Bitmap(const char *bits, int W, int H) :\n    Fl_Image(W,H,0), array((const uchar *)bits), alloc_array(0), id_(0), cache_w_(0),cache_h_(0) {data((const char **)&array, 1);}\n  Fl_Bitmap(const uchar *bits, int bits_length, int W, int H);\n  Fl_Bitmap(const char *bits, int bits_length, int W, int H);\n  virtual ~Fl_Bitmap();\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const { return Fl_Image::copy(); }\n  void draw(int X, int Y, int W, int H, int cx=0, int cy=0) FL_OVERRIDE;\n  void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);}\n  void label(Fl_Widget*w) FL_OVERRIDE;\n  void label(Fl_Menu_Item*m) FL_OVERRIDE;\n  void uncache() FL_OVERRIDE;\n  int cache_w() {return cache_w_;}\n  int cache_h() {return cache_h_;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Box.H",
    "content": "//\n// Box header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2025 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file FL/Fl_Box.H\n  \\brief Fl_Box widget.\n*/\n\n#ifndef Fl_Box_H\n#define Fl_Box_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n/**\n  This widget simply draws its box, and possibly its label.\n\n  Putting it before some other widgets and making it big enough to surround\n  them will let you draw a frame around them.\n*/\nclass FL_EXPORT Fl_Box : public Fl_Widget {\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  /**\n    Creates a new Fl_Box widget with the given coordinates, size, and label.\n\n    This constructor sets box() to FL_NO_BOX, which means it is invisible.\n\n    However such widgets are useful as placeholders or Fl_Group::resizable()\n    values. To change the box to something visible, use box(Fl_Boxtype).\n\n    The destructor removes the box from its parent group.\n\n    \\param[in] X, Y the position of the widget relative to the enclosing window\n    \\param[in] W, H size of the widget in pixels\n    \\param[in] L    optional text for the widget label (default: no label)\n\n    \\see Fl_Box(Fl_Boxtype b, int X, int Y, int W, int H, const char *L)\n  */\n  Fl_Box(int X, int Y, int W, int H, const char *L = 0);\n\n  /**\n    Creates a new Fl_Box widget with the given boxtype, coordinates, size, and label.\n\n    This constructor sets box() to the given Fl_Boxtype \\c B.\n\n    You must also specify a label but it can be \\c nullptr (0, NULL) if you\n    don't want or need a visible label.\n\n    The destructor removes the box from its parent group.\n\n    \\param[in] B    boxtype of the widget\n    \\param[in] X, Y the position of the widget relative to the enclosing window\n    \\param[in] W, H size of the widget in pixels\n    \\param[in] L    optional text for the widget label (see description)\n\n    \\see Fl_Box(int X, int Y, int W, int H, const char *L)\n  */\n  Fl_Box(Fl_Boxtype B, int X, int Y, int W, int H, const char *L);\n\n  int handle(int) FL_OVERRIDE;\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Browser.H",
    "content": "//\n// Browser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Browser widget . */\n\n// Forms-compatible browser.  Probably useful for other\n// lists of textual data.  Notice that the line numbers\n// start from 1, and 0 means \"no line\".\n\n#ifndef Fl_Browser_H\n#define Fl_Browser_H\n\n#include \"Fl_Browser_.H\"\n#include \"Fl_Image.H\"\n\nstruct FL_BLINE;\n\n/**\n  The Fl_Browser widget displays a scrolling list of text\n  lines, and manages all the storage for the text.  This is not a text\n  editor or spreadsheet!  But it is useful for showing a vertical list of\n  named objects to the user.\n\n  \\image html  fl_hold_browser.png \"Fl_Hold_Browser\"\n  \\image latex fl_hold_browser.png \"Fl_Hold_Browser\" width=4cm\n\n  \\par\n\n  \\image html  fl_multi_browser.png \"Fl_Multi_Browser\"\n  \\image latex fl_multi_browser.png \"Fl_Multi_Browser\" width=4cm\n\n  Each line in the browser is identified by number. <I>The numbers\n  start at one</I> (this is so that zero can be reserved for \"no line\" in\n  the selective browsers). <I>Unless otherwise noted, the methods do not\n  check to see if the passed line number is in range and legal.  It must\n  always be greater than zero and &lt;= size().</I>\n\n  Each line contains a null-terminated string of text and a void *\n  data pointer.  The text string is displayed, the void *\n  pointer can be used by the callbacks to reference the object the text\n  describes.\n\n  The base class does nothing when the user clicks on it.  The\n  subclasses\n  Fl_Select_Browser,\n  Fl_Hold_Browser, and\n  Fl_Multi_Browser react to user clicks to select lines in\n  the browser and do callbacks.\n\n  The base class\n  Fl_Browser_ provides the scrolling and selection mechanisms of\n  this and all the subclasses, but the dimensions and appearance of each\n  item are determined by the subclass. You can use Fl_Browser_\n  to display information other than text, or text that is dynamically\n  produced from your own data structures. If you find that loading the\n  browser is a lot of work or is inefficient, you may want to make a\n  subclass of Fl_Browser_.\n\n  Some common coding patterns used for working with Fl_Browser:\n  \\code\n      // How to loop through all the items in the browser\n      for ( int t=1; t<=browser->size(); t++ ) {       // index 1 based..!\n          printf(\"item #%d, label='%s'\\n\", t, browser->text(t));\n      }\n  \\endcode\n\n  Note: If you are <I>subclassing</I> Fl_Browser, it's more efficient\n  to use the protected methods item_first() and item_next(), since\n  Fl_Browser internally uses linked lists to manage the browser's items.\n  For more info, see find_item(int).\n*/\nclass FL_EXPORT Fl_Browser : public Fl_Browser_ {\n\n  FL_BLINE *first;              // the array of lines\n  FL_BLINE *last;\n  FL_BLINE *cache;\n  int cacheline;                // line number of cache\n  int lines;                    // Number of lines\n  int full_height_;\n  const int* column_widths_;\n  char format_char_;            // alternative to @-sign\n  char column_char_;            // alternative to tab\n\nprotected:\n\n  // required routines for Fl_Browser_ subclass:\n  void* item_first() const FL_OVERRIDE;\n  void* item_next(void* item) const FL_OVERRIDE;\n  void* item_prev(void* item) const FL_OVERRIDE;\n  void* item_last()const FL_OVERRIDE;\n  int item_selected(void* item) const FL_OVERRIDE;\n  void item_select(void* item, int val) FL_OVERRIDE;\n  int item_height(void* item) const FL_OVERRIDE;\n  int item_width(void* item) const FL_OVERRIDE;\n  void item_draw(void* item, int X, int Y, int W, int H) const FL_OVERRIDE;\n  int full_height() const FL_OVERRIDE;\n  int incr_height() const FL_OVERRIDE;\n  const char *item_text(void *item) const FL_OVERRIDE;\n  /** Swap the items \\p a and \\p b.\n      You must call redraw() to make any changes visible.\n      \\param[in] a,b the items to be swapped.\n      \\see swap(int,int), item_swap()\n   */\n  void item_swap(void *a, void *b) FL_OVERRIDE { swap((FL_BLINE*)a, (FL_BLINE*)b); }\n  /** Return the item at specified \\p line.\n      \\param[in] line The line of the item to return. (1 based)\n      \\returns The item, or NULL if line out of range.\n      \\see item_at(), find_line(), lineno()\n   */\n  void *item_at(int line) const FL_OVERRIDE { return (void*)find_line(line); }\n\n  FL_BLINE* find_line(int line) const ;\n  FL_BLINE* _remove(int line) ;\n  void insert(int line, FL_BLINE* item);\n  int lineno(void *item) const ;\n  void swap(FL_BLINE *a, FL_BLINE *b);\n\npublic:\n\n  void remove(int line);\n  void add(const char* newtext, void* d = 0);\n  void insert(int line, const char* newtext, void* d = 0);\n  void move(int to, int from);\n  int  load(const char* filename);\n  void swap(int a, int b);\n  void clear();\n\n  /**\n    Returns how many lines are in the browser.\n    The last line number is equal to this.\n    Returns 0 if browser is empty.\n  */\n  int size() const { return lines; }\n  void size(int W, int H) { Fl_Widget::size(W, H); }\n\n  /**\n    Gets the default text size (in pixels) for the lines in the browser.\n  */\n  Fl_Fontsize textsize() const { return Fl_Browser_::textsize(); }\n\n  /*\n    Sets the default text size for the lines in the browser to newSize.\n    Defined and documented in Fl_Browser.cxx\n  */\n  void textsize(Fl_Fontsize newSize);\n\n  int topline() const ;\n  /** For internal use only? */\n  enum Fl_Line_Position { TOP, BOTTOM, MIDDLE };\n  void lineposition(int line, Fl_Line_Position pos);\n  /**\n    Scrolls the browser so the top item in the browser\n    is showing the specified \\p line.\n    \\param[in] line The line to be displayed at the top.\n    \\see topline(), middleline(), bottomline(), displayed(), lineposition()\n   */\n  void topline(int line) { lineposition(line, TOP); }\n  /**\n    Scrolls the browser so the bottom item in the browser\n    is showing the specified \\p line.\n    \\param[in] line The line to be displayed at the bottom.\n    \\see topline(), middleline(), bottomline(), displayed(), lineposition()\n   */\n  void bottomline(int line) { lineposition(line, BOTTOM); }\n  /**\n    Scrolls the browser so the middle item in the browser\n    is showing the specified \\p line.\n    \\param[in] line The line to be displayed in the middle.\n    \\see topline(), middleline(), bottomline(), displayed(), lineposition()\n   */\n  void middleline(int line) { lineposition(line, MIDDLE); }\n\n  int select(int line, int val=1);\n  int selected(int line) const ;\n  void show(int line);\n  /** Shows the entire Fl_Browser widget -- opposite of hide(). */\n  void show() FL_OVERRIDE { Fl_Widget::show(); }\n  void hide(int line);\n  /** Hides the entire Fl_Browser widget -- opposite of show(). */\n  void hide() FL_OVERRIDE { Fl_Widget::hide(); }\n  int visible(int line) const ;\n\n  int value() const ;\n  /**\n    Sets the browser's value(), which selects the specified \\p line.\n    This is the same as calling select(line).\n    \\see select(), selected(), value(), item_select(), item_selected()\n   */\n  void value(int line) { select(line); }\n  const char* text(int line) const ;\n  void text(int line, const char* newtext);\n  void* data(int line) const ;\n  void data(int line, void* d);\n\n  Fl_Browser(int X, int Y, int W, int H, const char *L = 0);\n  /**\n    The destructor deletes all list items and destroys the browser.\n   */\n  ~Fl_Browser() { clear(); }\n\n  /**\n    Gets the current format code prefix character, which by default is '\\@'.\n    A string of formatting codes at the start of each column are stripped off\n    and used to modify how the rest of the line is printed:\n\n    \\li <tt>'\\@.'</tt> Print rest of line, don't look for more '\\@' signs\n    \\li <tt>'\\@\\@'</tt> Doubling the format character prints the format\n      character once, followed by the rest of line\n    \\li <tt>'\\@l'</tt> Use a LARGE (24 point) font\n    \\li <tt>'\\@m'</tt> Use a medium large (18 point) font\n    \\li <tt>'\\@s'</tt> Use a <SMALL>small</SMALL> (11 point) font\n    \\li <tt>'\\@b'</tt> Use a <B>bold</B> font (adds FL_BOLD to font)\n    \\li <tt>'\\@i'</tt> Use an <I>italic</I> font (adds FL_ITALIC to font)\n    \\li <tt>'\\@f' or '\\@t'</tt> Use a fixed-pitch\n    font (sets font to FL_COURIER)\n    \\li <tt>'\\@c'</tt> Center the line horizontally\n    \\li <tt>'\\@r'</tt> Right-justify the text\n    \\li <tt>'\\@N'</tt> Use fl_inactive_color() to draw the text\n    \\li <tt>'\\@B0', '\\@B1', ... '\\@B255'</tt> Fill the background with\n      fl_color(n)\n    \\li <tt>'\\@C0', '\\@C1', ... '\\@C255'</tt> Use fl_color(n) to draw the text\n    \\li <tt>'\\@F0', '\\@F1', ...</tt> Use fl_font(n) to draw the text\n    \\li <tt>'\\@S1', '\\@S2', ...</tt> Use point size n to draw the text\n    \\li <tt>'\\@u' or '\\@_'</tt> Underline the text.\n    \\li <tt>'\\@-'</tt> draw an engraved line through the middle.\n\n    Notice that the '\\@.' command can be used to reliably\n    terminate the parsing.  To print a random string in a random color, use\n    <tt>sprintf(\"@C%d@.%s\", color, string)</tt> and it will work even if the\n    string starts with a digit or has the format character in it.\n  */\n  char format_char() const { return format_char_; }\n  /**\n    Sets the current format code prefix character to \\p c.\n    The default prefix is '\\@'.  Set the prefix to 0 to disable formatting.\n    \\see format_char() for list of '\\@' codes\n  */\n  void format_char(char c) { format_char_ = c; }\n  /**\n    Gets the current column separator character.\n    The default is '\\\\t' (tab).\n    \\see column_char(), column_widths()\n  */\n  char column_char() const { return column_char_; }\n  /**\n    Sets the column separator to c.\n    This will only have an effect if you also set column_widths().\n    The default is '\\\\t' (tab).\n    \\see column_char(), column_widths()\n  */\n  void column_char(char c) { column_char_ = c; }\n  /**\n    Gets the current column width array.\n    This array is zero-terminated and specifies the widths in pixels of\n    each column. The text is split at each column_char() and each part is\n    formatted into it's own column.  After the last column any remaining\n    text is formatted into the space between the last column and the\n    right edge of the browser, even if the text contains instances of\n    column_char() .  The default value is a one-element array of just\n    a zero, which means there are no columns.\n\n    Example:\n    \\code\n  Fl_Browser *b = new Fl_Browser(..);\n  static int widths[] = { 50, 50, 50, 70, 70, 40, 40, 70, 70, 50, 0 };  // widths for each column\n  b->column_widths(widths); // assign array to widget\n  b->column_char('\\t');     // use tab as the column character\n  b->add(\"USER\\tPID\\tCPU\\tMEM\\tVSZ\\tRSS\\tTTY\\tSTAT\\tSTART\\tTIME\\tCOMMAND\");\n  b->add(\"root\\t2888\\t0.0\\t0.0\\t1352\\t0\\ttty3\\tSW\\tAug15\\t0:00\\t@b@f/sbin/mingetty tty3\");\n  b->add(\"root\\t13115\\t0.0\\t0.0\\t1352\\t0\\ttty2\\tSW\\tAug30\\t0:00\\t@b@f/sbin/mingetty tty2\");\n  [..]\n    \\endcode\n    \\see column_char(), column_widths()\n  */\n  const int* column_widths() const { return column_widths_; }\n  /**\n    Sets the current array to \\p arr.  Make sure the last entry is zero.\n    \\see column_char(), column_widths()\n  */\n  void column_widths(const int* arr) { column_widths_ = arr; }\n\n  /**\n    Returns non-zero if \\p line has been scrolled to a position where it is being displayed.\n    Checks to see if the item's vertical position is within the top and bottom\n    edges of the display window. This does NOT take into account the hide()/show()\n    status of the widget or item.\n    \\param[in] line The line to be checked\n    \\returns 1 if visible, 0 if not visible.\n    \\see topline(), middleline(), bottomline(), displayed(), lineposition()\n  */\n  int displayed(int line) const { return Fl_Browser_::displayed(find_line(line)); }\n\n  /**\n    Make the item at the specified \\p line visible().\n    Functionally similar to show(int line).\n    If \\p line is out of range, redisplay top or bottom of list as appropriate.\n    \\param[in] line The line to be made visible.\n    \\see show(int), hide(int), display(), visible(), make_visible()\n  */\n  void make_visible(int line) {\n    if (line < 1) Fl_Browser_::display(find_line(1));\n    else if (line > lines) Fl_Browser_::display(find_line(lines));\n    else Fl_Browser_::display(find_line(line));\n  }\n\n  // icon support\n  void icon(int line, Fl_Image* icon);\n  Fl_Image* icon(int line) const;\n  void remove_icon(int line);\n\n  /** For back compatibility only. */\n  void replace(int a, const char* b) { text(a, b); }\n  void display(int line, int val=1);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Browser_.H",
    "content": "//\n// Common browser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2016 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Browser_ widget . */\n\n// Yes, I know this should be a template...\n\n#ifndef Fl_Browser__H\n#define Fl_Browser__H\n\n#ifndef Fl_Group_H\n#include \"Fl_Group.H\"\n#endif\n#include \"Fl_Scrollbar.H\"\n#include <FL/Fl.H>              // Fl::scrollbar_size()\n\n#define FL_NORMAL_BROWSER       0       /**< type() of Fl_Browser */\n#define FL_SELECT_BROWSER       1       /**< type() of FL_Select_Browser */\n#define FL_HOLD_BROWSER         2       /**< type() of Fl_Hold_Browser */\n#define FL_MULTI_BROWSER        3       /**< type() of Fl_Multi_Browser */\n\n#define FL_SORT_ASCENDING       0       /**< sort browser items in ascending alphabetic order. */\n#define FL_SORT_DESCENDING      1       /**< sort in descending order */\n#define FL_SORT_CASEINSENSITIVE 0x2     /**< sort case insensitively */\n\n/**\n  This is the base class for browsers.  To be useful it must be\n  subclassed and several virtual functions defined.  The Forms-compatible\n  browser and the file chooser's browser are subclassed off of this.\n\n  This has been designed so that the subclass has complete control\n  over the storage of the data, although because next() and\n  prev() functions are used to index, it works best as a linked list\n  or as a large block of characters in which the line breaks must be\n  searched for.\n\n  A great deal of work has been done so that the \"height\" of a data\n  object does not need to be determined until it is drawn.  This is\n  useful if actually figuring out the size of an object requires\n  accessing image data or doing stat() on a file or doing some\n  other slow operation.\n\n  Callbacks are called when the value changes with \\p FL_REASON_CHANGED.\n  If \\p FL_WHEN_RELEASE is set, callbacks are called when the mouse button is\n  released with \\p FL_REASON_CHANGED or \\p FL_REASON_RESELECTED if the selection\n  did not change. If \\p FL_WHEN_ENTER_KEY is set, callbacks are also called when\n  key presses or double clicks change the selection.\n\nKeyboard navigation of browser items\n------------------------------------\n\n  The keyboard navigation of browser items is only possible if\n  visible_focus() is enabled. If disabled, the widget rejects keyboard focus;\n  Tab and Shift-Tab focus navigation will skip the widget.\n\n  In 'Select' and 'Normal' mode, the widget rejects keyboard focus;\n  no navigation keys are supported (other than scrollbar positioning).\n\n  In 'Hold' mode, the widget accepts keyboard focus, and Up/Down arrow\n  keys can navigate the selected item.\n\n  In 'Multi' mode, the widget accepts keyboard focus, and Up/Down arrow\n  keys navigate the focus box; Space toggles the current item's selection,\n  Enter selects only the current item (deselects all others).  If Shift\n  (or Ctrl) is combined with Up/Down arrow keys, the current item's\n  selection state is extended to the next item. In this way one can\n  extend a selection or de-selection.\n*/\nclass FL_EXPORT Fl_Browser_ : public Fl_Group {\n  int position_;        // where user wants it scrolled to\n  int real_position_;   // the current vertical scrolling position\n  int hposition_;       // where user wants it panned to\n  int real_hposition_;  // the current horizontal scrolling position\n  int offset_;          // how far down top_ item the real_position is\n  int max_width;        // widest object seen so far\n  uchar has_scrollbar_; // which scrollbars are enabled\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  Fl_Color textcolor_;\n  void* top_;           // which item scrolling position is in\n  void* selection_;     // which is selected (except for FL_MULTI_BROWSER)\n  void *redraw1,*redraw2; // minimal update pointers\n  void* max_width_item; // which item has max_width_\n  int scrollbar_size_;  // size of scrollbar trough\n  int linespacing_;\n\n  void update_top();\n\nprotected:\n\n  // All of the following must be supplied by the subclass:\n  /**\n    This method must be provided by the subclass\n    to return the first item in the list.\n    \\see item_first(), item_next(), item_last(), item_prev()\n   */\n  virtual void *item_first() const = 0;\n  /**\n    This method must be provided by the subclass\n    to return the item in the list after \\p item.\n    \\see item_first(), item_next(), item_last(), item_prev()\n   */\n  virtual void *item_next(void *item) const = 0;\n  /**\n    This method must be provided by the subclass\n    to return the item in the list before \\p item.\n    \\see item_first(), item_next(), item_last(), item_prev()\n   */\n  virtual void *item_prev(void *item) const = 0;\n  /**\n    This method must be provided by the subclass\n    to return the last item in the list.\n    \\see item_first(), item_next(), item_last(), item_prev()\n   */\n  virtual void *item_last() const { return 0L; }\n  /**\n    This method must be provided by the subclass to return\n    the height of \\p item in pixels.\n    Allow for two additional pixels for the list selection box.\n    \\param[in] item The item whose height is returned.\n    \\returns The height of the specified \\p item in pixels.\n    \\see item_height(), item_width(), item_quick_height()\n  */\n  virtual int item_height(void *item) const = 0;\n  /**\n    This method must be provided by the subclass to return the width of the\n    \\p item in pixels.  Allow for two additional pixels for the list\n    selection box.\n    \\param[in] item The item whose width is returned.\n    \\returns The width of the item in pixels.\n  */\n  virtual int item_width(void *item) const = 0;\n  virtual int item_quick_height(void *item) const ;\n  /**\n    This method must be provided by the subclass to draw the \\p item\n    in the area indicated by \\p X, \\p Y, \\p W, \\p H.\n  */\n  virtual void item_draw(void *item,int X,int Y,int W,int H) const = 0;\n  /**\n    This optional method returns a string (label) that may be used for sorting.\n    \\param[in] item The item whose label text is returned.\n    \\returns The item's text label. (Can be NULL if blank)\n   */\n  virtual const char *item_text(void *item) const { (void)item; return 0L; }\n  /**\n    This optional method should be provided by the subclass\n    to efficiently swap browser items \\p a and \\p b, such as for sorting.\n    \\param[in] a,b The two items to be swapped.\n   */\n  virtual void item_swap(void *a,void *b) { (void)a; (void)b; }\n  /**\n    This method must be provided by the subclass\n    to return the item for the specified \\p index.\n    \\param[in] index The \\p index of the item to be returned\n    \\returns The item at the specified \\p index.\n   */\n  virtual void *item_at(int index) const { (void)index; return 0L; }\n  // you don't have to provide these but it may help speed it up:\n  virtual int full_width() const ;      // current width of all items\n  virtual int full_height() const ;     // current height of all items\n  virtual int incr_height() const ;     // average height of an item\n  // These only need to be done by subclass if you want a multi-browser:\n  virtual void item_select(void *item,int val=1);\n  virtual int item_selected(void *item) const ;\n\n  // things the subclass may want to call:\n  /**\n    Returns the item that appears at the top of the list.\n   */\n  void *top() const { return top_; }\n  /**\n    Returns the item currently selected, or NULL if there is no selection.\n\n    For multiple selection browsers this call returns the currently focused item,\n    even if it is not selected. To find all selected items, call\n    Fl_Multi_Browser::selected() for every item in question.\n  */\n  void *selection() const { return selection_; }\n  void new_list(); // completely clobber all data, as though list replaced\n  void deleting(void *item); // get rid of any pointers to item\n  void replacing(void *a,void *b); // change a pointers to b\n  void swapping(void *a,void *b); // exchange pointers a and b\n  void inserting(void *a,void *b); // insert b near a\n  int displayed(void *item) const ; // true if this item is visible\n  void redraw_line(void *item); // minimal update, no change in size\n  /**\n    This method will cause the entire list to be redrawn.\n    \\see redraw_lines(), redraw_line()\n   */\n  void redraw_lines() { damage(FL_DAMAGE_SCROLL); } // redraw all of them\n  void bbox(int &X,int &Y,int &W,int &H) const;\n  int leftedge() const; // x position after scrollbar & border\n  void *find_item(int ypos); // item under mouse\n\n  void draw() FL_OVERRIDE;\n  Fl_Browser_(int X,int Y,int W,int H,const char *L=0);\n\npublic:\n\n  /**\n    Vertical scrollbar. Public, so that it can be accessed directly.\n\n    Use `scrollbar_left()` or `scrollbar_right()` to change what side\n    the vertical scrollbar is drawn on.\n\n    Use `scrollbar.align(int)` (see `Fl_Widget::align(Fl_Align)`)\n    to change what side either of the scrollbars is drawn on.\n\n    If the `FL_ALIGN_LEFT` bit is on, the vertical scrollbar is on\n    the left. If the `FL_ALIGN_TOP` bit is on, the horizontal\n    scrollbar is on the top. Note that only the alignment flags in\n    scrollbar are considered. The flags in hscrollbar however\n    are ignored.\n   */\n  Fl_Scrollbar scrollbar;\n  /**\n    Horizontal scrollbar. Public, so that it can be accessed directly.\n   */\n  Fl_Scrollbar hscrollbar;\n\n  int handle(int event) FL_OVERRIDE;\n  void resize(int X,int Y,int W,int H) FL_OVERRIDE;\n\n  int select(void *item,int val=1,int docallbacks=0);\n  int select_only(void *item,int docallbacks=0);\n  int deselect(int docallbacks=0);\n  /**\n    Gets the vertical scroll position of the list as a pixel position \\p pos.\n    The position returned is how many pixels of the list are scrolled off the top edge\n    of the screen.  Example: A position of '3' indicates the top 3 pixels of\n    the list are scrolled off the top edge of the screen.\n    \\see position(), hposition()\n  */\n  int vposition() const { return position_; }\n  FL_DEPRECATED(\"since 1.4.0 - use vposition() instead\",\n  int position() const) { return vposition(); }\n\n  void vposition(int pos); // scroll to here\n  FL_DEPRECATED(\"since 1.4.0 - use vposition(pos) instead\",\n  void position(int pos)) { return vposition(pos); }\n  void position(int x, int y) { Fl_Group::position(x, y); }\n\n  /**\n    Gets the horizontal scroll position of the list as a pixel position \\p pos.\n    The position returned is how many pixels of the list are scrolled off the left edge\n    of the screen. Example: A position of '18' indicates the left 18 pixels of\n    the list are scrolled off the left edge of the screen.\n    \\see position(), hposition()\n  */\n  int hposition() const { return hposition_; }\n  void hposition(int); // pan to here\n  void display(void *item); // scroll so this item is shown\n\n  /**\n    Values for has_scrollbar().\n   */\n  /** Anonymous enum bit flags for has_scrollbar().\n     -  bit 0: horizontal\n     -  bit 1: vertical\n     -  bit 2: 'always' (to be combined with bits 0 and 1)\n     -  bit 3-31: reserved for future use\n   */\n  enum { // values for has_scrollbar()\n    HORIZONTAL = 1,             ///< Only show horizontal scrollbar.\n    VERTICAL = 2,               ///< Only show vertical scrollbar.\n    BOTH = 3,                   ///< Show both scrollbars. (default)\n    ALWAYS_ON = 4,              ///< Specified scrollbar(s) should 'always' be shown (to be used with HORIZONTAL/VERTICAL)\n    HORIZONTAL_ALWAYS = 5,      ///< Horizontal scrollbar always on.\n    VERTICAL_ALWAYS = 6,        ///< Vertical scrollbar always on.\n    BOTH_ALWAYS = 7             ///< Both scrollbars always on.\n  };\n  /**\n    Returns the current scrollbar mode, see Fl_Browser_::has_scrollbar(uchar)\n   */\n  uchar has_scrollbar() const { return has_scrollbar_; }\n  /**\n    Sets whether the widget should have scrollbars or not (default Fl_Browser_::BOTH).\n    By default you can scroll in both directions, and the scrollbars\n    disappear if the data will fit in the widget.\n    has_scrollbar() changes this based on the value of \\p mode:\n\n    - 0 - No scrollbars.\n\n    - Fl_Browser_::HORIZONTAL - Only a horizontal scrollbar.\n\n    - Fl_Browser_::VERTICAL - Only a vertical scrollbar.\n\n    - Fl_Browser_::BOTH - The default is both scrollbars.\n\n    - Fl_Browser_::HORIZONTAL_ALWAYS - Horizontal scrollbar always on,\n      vertical always off.\n\n    - Fl_Browser_::VERTICAL_ALWAYS - Vertical scrollbar always on,\n      horizontal always off.\n\n    - Fl_Browser_::BOTH_ALWAYS - Both always on.\n  */\n  void has_scrollbar(uchar mode) { has_scrollbar_ = mode; }\n\n  /**\n    Gets the default text font for the lines in the browser.\n    \\see textfont(), textsize(), textcolor()\n  */\n  Fl_Font textfont() const { return textfont_; }\n  /**\n    Sets the default text font for the lines in the browser to \\p font.\n  */\n  void textfont(Fl_Font font) { textfont_ = font; }\n\n  /**\n    Gets the default text size (in pixels) for the lines in the browser.\n  */\n  Fl_Fontsize textsize() const { return textsize_; }\n  /**\n    Sets the default text size (in pixels) for the lines in the browser to \\p size.\n  */\n  void textsize(Fl_Fontsize newSize) { textsize_ = newSize; }\n\n  /**\n    Gets the default text color for the lines in the browser.\n  */\n  Fl_Color textcolor() const { return textcolor_; }\n  /**\n    Sets the default text color for the lines in the browser to color \\p col.\n  */\n  void textcolor(Fl_Color col) { textcolor_ = col; }\n\n  /**\n    Gets the current size of the scrollbars' troughs, in pixels.\n\n    If this value is zero (default), this widget will use the\n    Fl::scrollbar_size() value as the scrollbar's width.\n\n    \\returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.\n    \\see Fl::scrollbar_size(int)\n  */\n  int scrollbar_size() const {\n      return(scrollbar_size_);\n  }\n  /**\n    Sets the pixel size of the scrollbars' troughs to \\p newSize, in pixels.\n\n    Normally you should not need this method, and should use\n    Fl::scrollbar_size(int) instead to manage the size of ALL\n    your widgets' scrollbars. This ensures your application\n    has a consistent UI, is the default behavior, and is normally\n    what you want.\n\n    Only use THIS method if you really need to override the global\n    scrollbar size. The need for this should be rare.\n\n    Setting \\p newSize to the special value of 0 causes the widget to\n    track the global Fl::scrollbar_size(), which is the default.\n\n    \\param[in] newSize Sets the scrollbar size in pixels.\\n\n                    If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()\n    \\see Fl::scrollbar_size()\n  */\n  void scrollbar_size(int newSize) {\n      scrollbar_size_ = newSize;\n  }\n  /**\n    Returns the global value Fl::scrollbar_size().\n   \\deprecated Use scrollbar_size() instead.\n    \\todo This method should eventually be removed in 1.4+\n  */\n  int scrollbar_width() const {\n      return(Fl::scrollbar_size());\n  }\n  /**\n    Sets the global Fl::scrollbar_size(), and forces this instance of the widget to use it.\n   \\deprecated Use scrollbar_size() instead.\n    \\todo This method should eventually be removed in 1.4+\n  */\n  void scrollbar_width(int width) {\n      Fl::scrollbar_size(width);\n      scrollbar_size_ = 0;\n  }\n  /**\n    Moves the vertical scrollbar to the righthand side of the list.\n    For back compatibility.\n  */\n  void scrollbar_right() { scrollbar.align(FL_ALIGN_RIGHT); }\n  /**\n    Moves the vertical scrollbar to the lefthand side of the list.\n    For back compatibility.\n  */\n  void scrollbar_left() { scrollbar.align(FL_ALIGN_LEFT); }\n  void sort(int flags=0);\n\n  /**\n   Add some space between browser lines.\n   \\param[in] pixels number of additional pixels between lines.\n   */\n  void linespacing(int pixels) { linespacing_ = pixels; }\n\n  /** Return the height of additional spacing between browser lines.\n   \\return spacing height in pixel units.\n   */\n  int linespacing() const { return linespacing_; }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Button.H",
    "content": "//\n// Button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2014 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Button widget . */\n\n#ifndef Fl_Button_H\n#define Fl_Button_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n// values for type()\n#define FL_NORMAL_BUTTON        0   /**< value() will be set to 1 during the press of the button and\n                                         reverts back to 0 when the button is released */\n#define FL_TOGGLE_BUTTON        1   ///< value() toggles between 0 and 1 at every click of the button\n#define FL_RADIO_BUTTON         (FL_RESERVED_TYPE+2) /**< is set to 1 at button press, and all other\n                                         buttons in the same group with <tt>type() == FL_RADIO_BUTTON</tt>\n                                         are set to zero.*/\n#define FL_HIDDEN_BUTTON        3   ///< for Forms compatibility\n\nextern FL_EXPORT Fl_Shortcut fl_old_shortcut(const char*);\n\nclass Fl_Widget_Tracker;\n\n/**\n  \\class Fl_Button\n  \\brief Buttons generate callbacks when they are clicked by the user.\n\n  You control exactly when and how by changing the values for type(uchar) and\n  when(uchar).  Buttons can also generate callbacks in response to \\c FL_SHORTCUT\n  events.  The button can either have an explicit shortcut(int s) value or a\n  letter shortcut can be indicated in the label() with an '\\&' character\n  before it.  For the label shortcut it does not matter if \\e Alt is held\n  down, but if you have an input field in the same window, the user will have\n  to hold down the \\e Alt key so that the input field does not eat the event\n  first as an \\c FL_KEYBOARD event.\n  \\see Fl_Widget::shortcut_label(int)\n\n  For an Fl_Button object, the type() call returns one of:\n  \\li \\c FL_NORMAL_BUTTON (0): value() remains unchanged after button press.\n  \\li \\c FL_TOGGLE_BUTTON: value() is inverted after button press.\n  \\li \\c FL_RADIO_BUTTON: value() is set to 1 after button press, and all other\n         buttons in the current group with <tt>type() == FL_RADIO_BUTTON</tt>\n         are set to zero.\n\n  For an Fl_Button object, the following when() values are useful, the default\n  being \\c FL_WHEN_RELEASE:\n  \\li \\c 0: The callback is not done, instead changed() is turned on.\n  \\li \\c FL_WHEN_RELEASE: The callback is done after the user successfully\n         clicks the button, or when a shortcut is typed. The reason is\n         \\p FL_REASON_RELEASED.\n  \\li \\c FL_WHEN_CHANGED: The callback is done each time the value() changes\n         (when the user pushes and releases the button, and as the mouse is\n         dragged around in and out of the button). The reason is set to\n         \\p FL_REASON_CHANGED\n  \\li \\c FL_WHEN_NOT_CHANGED: The callback is done when the mouse button is\n         released, but the value did not changed. The reason is set to\n         \\p FL_REASON_SELECTED\n*/\n\nclass FL_EXPORT Fl_Button : public Fl_Widget {\n\n  int shortcut_;\n  char value_;\n  char oldval;\n  uchar down_box_;\n  uchar compact_;\n\nprotected:\n\n  static Fl_Widget_Tracker *key_release_tracker;\n  static void key_release_timeout(void*);\n  void simulate_key_action();\n\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  int handle(int) FL_OVERRIDE;\n\n  Fl_Button(int X, int Y, int W, int H, const char *L = 0);\n\n  int value(int v);\n\n  /**\n    Returns the current value of the button (0 or 1).\n   */\n  char value() const {return value_;}\n\n  /**\n    Same as \\c value(1).\n    \\see value(int v)\n   */\n  int set() {return value(1);}\n\n  /**\n    Same as \\c value(0).\n    \\see value(int v)\n   */\n  int clear() {return value(0);}\n\n  void setonly(); // this should only be called on FL_RADIO_BUTTONs\n\n  /**\n    Returns the current shortcut key for the button.\n    \\retval int\n   */\n  int shortcut() const {return shortcut_;}\n\n  /**\n    Sets the shortcut key to \\c s.\n    Setting this overrides the use of '\\&' in the label().\n    The value is a bitwise OR of a key and a set of shift flags, for example:\n    <tt>FL_ALT | 'a'</tt>, or\n    <tt>FL_ALT | (FL_F + 10)</tt>, or just\n    <tt>'a'</tt>.\n    A value of 0 disables the shortcut.\n\n    The key can be any value returned by Fl::event_key(), but will usually be\n    an ASCII letter.  Use a lower-case letter unless you require the shift key\n    to be held down.\n\n    The shift flags can be any set of values accepted by Fl::event_state().\n    If the bit is on, that shift key must be pushed.  Meta, Alt, Ctrl, and\n    Shift must be off if they are not in the shift flags (zero for the other\n    bits indicates a \"don't care\" setting).\n    \\param[in] s bitwise OR of key and shift flags\n   */\n  void shortcut(int s) {shortcut_ = s;}\n\n  /**\n    Returns the current down box type, which is drawn when value() is non-zero.\n    \\retval Fl_Boxtype\n   */\n  Fl_Boxtype down_box() const {return (Fl_Boxtype)down_box_;}\n\n  /**\n    Sets the down box type. The default value of 0 causes FLTK to figure out\n    the correct matching down version of box().\n\n    Some derived classes (e.g. Fl_Round_Button and Fl_Light_Button use\n    down_box() for special purposes. See docs of these classes.\n\n    \\param[in] b down box type\n   */\n  void down_box(Fl_Boxtype b) {down_box_ = b;}\n\n  /// (for backwards compatibility)\n  void shortcut(const char *s) {shortcut(fl_old_shortcut(s));}\n\n  /// (for backwards compatibility)\n  Fl_Color down_color() const {return selection_color();}\n\n  /// (for backwards compatibility)\n  void down_color(unsigned c) {selection_color(c);}\n\n  // handle flag for compact buttons, documentation in source code\n  void compact(uchar v);\n\n  /// Return true if buttons are rendered as compact buttons.\n  /// \\return 0 if compact mode is off, 1 if it is on\n  /// \\see compact(bool)\n  uchar compact() { return compact_; }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Cairo.H",
    "content": "//\n// Main Cairo support header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file Fl_Cairo.H\n  Cairo is currently supported for the following platforms:\n    Windows, macOS, Unix/Linux (X11 + Wayland).\n\n  \\note In FLTK 1.3.x this header file (Fl_Cairo.H) included the platform\n    specific Cairo headers. This is no longer true since 1.4.0.\n\n  This header file is platform agnostic. If you need platform specific Cairo\n  headers you need to \\#include them in your source file.\n\n  To use FLTK's builtin Cairo support you need to <tt>\\#include \\<FL/Fl.H></tt>\n  \\b before you include any other FLTK header which is officially required anyway.\n  Since FLTK 1.4.0 the preprocessor constants \\p FLTK_HAVE_CAIRO and/or\n  \\p FLTK_HAVE_CAIROEXT are defined in \\<FL/Fl.H> by including \\<FL/fl_config.h>.\n*/\n\n#ifndef FL_CAIRO_H\n#define FL_CAIRO_H\n\n#include <FL/Fl.H>\n\n# ifdef FLTK_HAVE_CAIRO\n\n# include <cairo.h>\n\n/**\n  \\addtogroup group_cairo\n  @{\n*/\n\n/**\n  Contains all the necessary info on the current cairo context.\n  A private internal & unique corresponding object is created to\n  permit cairo context state handling while keeping it opaque.\n  For internal use only.\n  \\note Only available when configure has the --enable-cairo or\n       --enable-cairoext option or one or both of the CMake options\n       FLTK_OPTION_CAIRO_WINDOW or FLTK_OPTION_CAIRO_EXT is set (ON)\n*/\nclass FL_EXPORT Fl_Cairo_State {\npublic:\n  Fl_Cairo_State()\n    : cc_(0)\n    , own_cc_(false)\n    , autolink_(false)\n    , window_(0)\n    , gc_(0) {}\n\n  // access attributes\n  cairo_t *cc() const { return cc_; }         ///< Gets the current cairo context\n  bool autolink() const { return autolink_; } ///< Gets the autolink option. See Fl::cairo_autolink_context(bool)\n  /** Sets the current cairo context.\n\n      \\p own == \\e true (the default) indicates that the cairo context \\p c\n      will be deleted by FLTK internally when another cc is set later.\n\n      \\p own == \\e false indicates cc deletion is handled externally\n      by the user program.\n  */\n  void cc(cairo_t *c, bool own = true) {\n    if (cc_ && own_cc_)\n      cairo_destroy(cc_);\n    cc_ = c;\n    if (!cc_)\n      window_ = 0;\n    own_cc_ = own;\n  }\n  void autolink(bool b);                   ///< Sets the autolink option, only available with --enable-cairoext\n  void window(void *w) { window_ = w; }    ///< Sets the window \\p w to keep track on\n  void *window() const { return window_; } ///< Gets the last window attached to a cc\n  void gc(void *c) { gc_ = c; }            ///< Sets the gc \\p c to keep track on\n  void *gc() const { return gc_; }         ///< Gets the last gc attached to a cc\n\nprivate:\n  cairo_t *cc_;        // contains the unique autoupdated cairo context\n  bool own_cc_;        // indicates whether we must delete the cc, useful for internal cleanup\n  bool autolink_;      // false by default, prevents the automatic cairo mapping on fltk windows\n                       // for custom cairo implementations.\n  void *window_, *gc_; // for keeping track internally of last win+gc treated\n};\n\n/** @} */\n\n#endif // FLTK_HAVE_CAIRO\n#endif // FL_CAIRO_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Cairo_Window.H",
    "content": "//\n// Fl_Cairo_Window header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file FL/Fl_Cairo_Window.H\n  \\brief Fl_Cairo_Window, an FLTK window incorporating a Cairo draw callback.\n*/\n\n#ifndef FL_CAIRO_WINDOW_H\n# define FL_CAIRO_WINDOW_H\n\n#include <FL/fl_config.h>\n\n# ifdef FLTK_HAVE_CAIRO\n\n// Cairo is currently supported for the following platforms:\n// Win32, Apple Quartz, X11, Wayland\n\n#  include <FL/Fl.H>\n#  include <FL/Fl_Double_Window.H>\n\n/**\n   \\addtogroup group_cairo\n   @{\n*/\n\n/**\n  This defines an FLTK window with Cairo support.\n\n  This class overloads the virtual draw() method for you,\n  so that the only thing you have to do is to provide your Cairo code.\n  All Cairo context handling is achieved transparently.\n\n  The default coordinate system for Cairo drawing commands within Fl_Cairo_Window\n  is FLTK's coordinate system, where the `x,y,w,h` values are relative to the\n  top/left corner of the Fl_Cairo_Window, as one would expect with regular\n  FLTK drawing commands, e.g.: `(0 ≤ x ≤ w-1), (0 ≤ y ≤ h-1)`.\n  \\b Example:\n  \\code\n  static void my_cairo_draw_cb(Fl_Cairo_Window *window, cairo_t *cr) {\n    // Draw an \"X\"\n    const double xmax = (window->w() - 1);\n    const double ymax = (window->h() - 1);\n    cairo_set_line_width(cr, 1.00);                               // line width for drawing\n    cairo_set_source_rgb(cr, 1.0, 0.5, 0.0);                      // orange\n    cairo_move_to(cr, 0.0, 0.0);  cairo_line_to(cr, xmax, ymax);  // draw diagonal \"\\\"\n    cairo_move_to(cr, 0.0, ymax); cairo_line_to(cr, xmax, 0.0);   // draw diagonal \"/\"\n    cairo_stroke(cr);                                             // stroke the lines\n  }\n  \\endcode\n\n  The FLTK coordinate system differs from the default native Cairo coordinate system\n  which uses normalized `(0.0 … 1.0)` values for x and y, e.g.: `(0 ≤ x ≤ 1.0), (0 ≤ y ≤ 1.0)`.\n  So beware of this when copy/pasting Cairo example programs that assume normalized values.\n  If need be, you can revert to the Cairo coordinate system by simply calling `cairo_scale()`\n  with the widget's `w()` and `h()` values. \\b Example:\n\n  \\code\n  static void my_cairo_draw_cb(Fl_Cairo_Window *window, cairo_t *cr) {\n    cairo_scale(cr, window->w(), window->h());    // use Cairo's default coordinate system\n    [..use 0.0 to 1.0 values from here on..]\n  }\n  \\endcode\n\n  \\see examples/cairo-draw-x.cxx\n  \\see test/cairo_test.cxx\n\n  \\note Class Fl_Cairo_Window requires the FLTK library to have been built with\n  CMake option FLTK_OPTION_CAIRO_WINDOW or configure --enable-cairo.\n\n  \\note You can alternatively define your custom Cairo FLTK window,\n  and thus at least override the draw() method to provide custom Cairo\n  support. In this case you will probably use Fl::cairo_make_current(Fl_Window*)\n  to attach a context to your window. You should do this only when your window is\n  the current window. \\see Fl_Window::current()\n*/\nclass FL_EXPORT Fl_Cairo_Window : public Fl_Double_Window {\n\npublic:\n  Fl_Cairo_Window(int W, int H, const char *L = 0)\n    : Fl_Double_Window(W, H, L), draw_cb_(0) {}\n  Fl_Cairo_Window(int X, int Y, int W, int H, const char *L = 0)\n    : Fl_Double_Window(X, Y, W, H, L), draw_cb_(0) {}\n\nprotected:\n  /** Overloaded to provide Cairo callback support. */\n  void draw() FL_OVERRIDE {\n    Fl_Double_Window::draw();\n    if (draw_cb_) { // call the Cairo draw callback\n      // manual method ? if yes explicitly get a cairo_context here\n      if (!Fl::cairo_autolink_context())\n        Fl::cairo_make_current(this);\n      draw_cb_(this, Fl::cairo_cc());\n      // flush Cairo drawings: necessary at least for Windows\n      Fl::cairo_flush(Fl::cairo_cc());\n    }\n  }\n\npublic:\n  /** The Cairo draw callback prototype you need to implement. */\n  typedef void (*cairo_draw_cb) (Fl_Cairo_Window* self, cairo_t* def);\n\n  /**\n    You must provide a draw callback that implements your Cairo rendering.\n    This method permits you to set your Cairo callback to \\p cb.\n  */\n  void set_draw_cb(cairo_draw_cb cb) { draw_cb_ = cb; }\nprivate:\n    cairo_draw_cb draw_cb_;\n};\n\n\n/** @} */\n\n# endif // FLTK_HAVE_CAIRO\n#endif // FL_CAIRO_WINDOW_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Chart.H",
    "content": "//\n// Fl_Chart widget header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file FL/Fl_Chart.H\n  \\brief Fl_Chart widget.\n*/\n\n#ifndef Fl_Chart_H\n#define Fl_Chart_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n// values for type()\n#define FL_BAR_CHART            0     ///< type() for Bar Chart variant\n#define FL_HORBAR_CHART         1     ///< type() for Horizontal Bar Chart variant\n#define FL_LINE_CHART           2     ///< type() for Line Chart variant\n#define FL_FILL_CHART           3     ///< type() for Fill Line Chart variant\n#define FL_SPIKE_CHART          4     ///< type() for Spike Chart variant\n#define FL_PIE_CHART            5     ///< type() for Pie Chart variant\n#define FL_SPECIALPIE_CHART     6     ///< type() for Special Pie Chart variant\n\n#define FL_FILLED_CHART FL_FILL_CHART ///< for compatibility\n\n#define FL_CHART_MAX          128     ///< max entries per chart\n#define FL_CHART_LABEL_MAX     18     ///< max label length for entry\n\n/** For internal use only. */\nstruct FL_CHART_ENTRY {\n  float val;                        ///< For internal use only.\n  unsigned col;                     ///< For internal use only.\n  char str[FL_CHART_LABEL_MAX + 1]; ///< For internal use only.\n};\n\n/**\n  \\class Fl_Chart\n  \\brief Fl_Chart displays simple charts.\n  It is provided for Forms compatibility.\n\n  \\image html charts.png\n  \\image latex charts.png  \"Fl_Chart\" width=10cm\n\n  \\todo Refactor Fl_Chart::type() information.\n\n  The type of an Fl_Chart object can be set using type(uchar t) to:\n\n  | Chart Type          | Description                                                                                     |\n  |---------------------|-------------------------------------------------------------------------------------------------|\n  | FL_BAR_CHART        | Each sample value is drawn as a vertical bar.                                                   |\n  | FL_FILLED_CHART     | The chart is filled from the bottom of the graph to the sample values.                          |\n  | FL_HORBAR_CHART     | Each sample value is drawn as a horizontal bar.                                                 |\n  | FL_LINE_CHART       | The chart is drawn as a polyline with vertices at each sample value.                            |\n  | FL_PIE_CHART        | A pie chart is drawn with each sample value being drawn as a proportionate slice in the circle. |\n  | FL_SPECIALPIE_CHART | Like \\c FL_PIE_CHART, but the first slice is separated from the pie.                            |\n  | FL_SPIKE_CHART      | Each sample value is drawn as a vertical line.                                                  |\n*/\nclass FL_EXPORT Fl_Chart : public Fl_Widget {\n  int numb;\n  int maxnumb;\n  int sizenumb;\n  FL_CHART_ENTRY *entries;\n  double min, max;\n  uchar autosize_;\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  Fl_Color textcolor_;\n\nprotected:\n  void draw() FL_OVERRIDE;\n\n  // (static) protected draw methods (STR 2022)\n  // these methods are documented in src/Fl_Chart.cxx\n\n  static void draw_barchart(int x, int y, int w, int h, int numb, FL_CHART_ENTRY entries[],\n                            double min, double max, int autosize, int maxnumb, Fl_Color textcolor);\n\n  static void draw_horbarchart(int x, int y, int w, int h, int numb, FL_CHART_ENTRY entries[],\n                               double min, double max, int autosize, int maxnumb,\n                               Fl_Color textcolor);\n\n  static void draw_linechart(int type, int x, int y, int w, int h, int numb,\n                             FL_CHART_ENTRY entries[], double min, double max, int autosize,\n                             int maxnumb, Fl_Color textcolor);\n\n  static void draw_piechart(int x, int y, int w, int h, int numb, FL_CHART_ENTRY entries[],\n                            int special, Fl_Color textcolor);\n\npublic:\n  Fl_Chart(int X, int Y, int W, int H, const char *L = 0);\n\n  ~Fl_Chart();\n\n  void clear();\n\n  void add(double val, const char *str = 0, unsigned col = 0);\n\n  void insert(int ind, double val, const char *str = 0, unsigned col = 0);\n\n  void replace(int ind, double val, const char *str = 0, unsigned col = 0);\n\n  /**\n    Gets the lower and upper bounds of the chart values.\n    \\param[out] a, b are set to lower, upper\n   */\n  void bounds(double *a, double *b) const {\n    *a = min;\n    *b = max;\n  }\n\n  void bounds(double a, double b);\n\n  /**\n    Returns the number of data values in the chart.\n  */\n  int size() const { return numb; }\n\n  /**\n    Sets the widget size (width, height).\n\n    This is the same as calling Fl_Widget::size(int W, int H);\n\n    \\param[in]  W,H   new width and height of the widget\n  */\n  void size(int W, int H) { Fl_Widget::size(W, H); }\n\n  /**\n    Gets the maximum number of data values for a chart.\n   */\n  int maxsize() const { return maxnumb; }\n\n  void maxsize(int m);\n\n  /** Gets the chart's text font */\n  Fl_Font textfont() const { return textfont_; }\n\n  /** Sets the chart's text font to \\p s. */\n  void textfont(Fl_Font s) { textfont_ = s; }\n\n  /** Gets the chart's text size */\n  Fl_Fontsize textsize() const { return textsize_; }\n\n  /** Sets the chart's text size to \\p s. */\n  void textsize(Fl_Fontsize s) { textsize_ = s; }\n\n  /** Gets the chart's text color */\n  Fl_Color textcolor() const { return textcolor_; }\n\n  /** Sets the chart's text color to \\p n. */\n  void textcolor(Fl_Color n) { textcolor_ = n; }\n\n  /**\n    Gets whether the chart will automatically adjust the bounds of the chart.\n    \\returns non-zero if auto-sizing is enabled and zero if disabled.\n   */\n  uchar autosize() const { return autosize_; }\n\n  /**\n    Sets whether the chart will automatically adjust the bounds of the chart.\n    \\param[in] n non-zero to enable automatic resizing, zero to disable.\n   */\n  void autosize(uchar n) { autosize_ = n; }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Check_Browser.H",
    "content": "//\n// Fl_Check_Browser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2020 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Check_Browser widget . */\n\n#ifndef Fl_Check_Browser_H\n#define Fl_Check_Browser_H\n\n#include \"Fl.H\"\n#include \"Fl_Browser_.H\"\n\n/**\n  The Fl_Check_Browser widget displays a scrolling list of text\n  lines that may be selected and/or checked by the user.\n*/\nclass FL_EXPORT Fl_Check_Browser : public Fl_Browser_ {\n\nprotected:\n  /* required routines for Fl_Browser_ subclass: */\n  void *item_first() const FL_OVERRIDE;\n  void *item_next(void *) const FL_OVERRIDE;\n  void *item_prev(void *) const FL_OVERRIDE;\n  int item_height(void *) const FL_OVERRIDE;\n  int item_width(void *) const FL_OVERRIDE;\n  void item_draw(void *, int, int, int, int) const FL_OVERRIDE;\n  void item_select(void *, int) FL_OVERRIDE;\n  int item_selected(void *) const FL_OVERRIDE;\n  const char *item_text(void *item) const FL_OVERRIDE;\n\npublic:\n  void *item_at(int index) const FL_OVERRIDE;\n  void item_swap(int ia, int ib);\n  void item_swap(void *a, void *b) FL_OVERRIDE;\n\n  /* private data */\n\npublic: // IRIX 5.3 C++ compiler doesn't support private structures...\n\n#ifndef FL_DOXYGEN\n  /** For internal use only. */\n  struct cb_item {\n    cb_item *next;        /**< For internal use only. */\n    cb_item *prev;        /**< For internal use only. */\n    char checked;         /**< For internal use only. */\n    char selected;        /**< For internal use only. */\n    char *text;           /**< For internal use only. */\n  };\n#endif // !FL_DOXYGEN\n\nprivate:\n  cb_item *first;\n  cb_item *last;\n  cb_item *cache;\n  int cached_item;\n  int nitems_;\n  int nchecked_;\n  cb_item *find_item(int) const;\n  int lineno(cb_item *) const;\n\npublic:\n  Fl_Check_Browser(int x, int y, int w, int h, const char *l = 0);\n  /** The destructor deletes all list items and destroys the browser. */\n  ~Fl_Check_Browser() { clear(); }\n  int add(char *s);               // add an (unchecked) item\n  int add(char *s, int b);        // add an item and set checked\n                                  // both return the new nitems()\n  int remove(int item);           // delete an item. Returns nitems()\n\n  // inline const char * methods to avoid breaking binary compatibility...\n  /** See int Fl_Check_Browser::add(char *s) */\n  int add(const char *s) { return add((char *)s); }\n  /** See int Fl_Check_Browser::add(char *s) */\n  int add(const char *s, int b) { return add((char *)s, b); }\n\n  void clear();                   // delete all items\n  /**\n    Returns how many lines are in the browser.  The last line number is equal to\n    this.\n  */\n  int nitems() const { return nitems_; }\n  /** Returns how many items are currently checked. */\n  int nchecked() const { return nchecked_; }\n  int checked(int item) const;\n  void checked(int item, int b);\n  /** Equivalent to Fl_Check_Browser::checked(item, 1). */\n  void set_checked(int item) { checked(item, 1); }\n  void check_all();\n  void check_none();\n  int value() const;              // currently selected item\n  char *text(int item) const;     // returns pointer to internal buffer\n\nprotected:\n  int handle(int) FL_OVERRIDE;\n};\n\n#endif // Fl_Check_Browser_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Check_Button.H",
    "content": "//\n// Check button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2014 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Check_Button_H\n#define Fl_Check_Button_H\n\n#include \"Fl_Light_Button.H\"\n\n/*\n  class: Fl_Check_Button.\n\n  A button with a \"checkmark\" to show its status.\n*/\n\nclass FL_EXPORT Fl_Check_Button : public Fl_Light_Button {\npublic:\n  Fl_Check_Button(int X, int Y, int W, int H, const char *L = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Choice.H",
    "content": "//\n// Choice header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Choice widget . */\n\n#ifndef Fl_Choice_H\n#define Fl_Choice_H\n\n#include \"Fl_Menu_.H\"\n\n/**\n  \\class Fl_Choice\n  \\brief A button that is used to pop up a menu.\n\n  \\image html choice.png\n  \\image latex choice.png  \"Fl_Choice\" width=4cm\n\n  This is a button that, when pushed, pops up a menu (or hierarchy of menus)\n  defined by an array of Fl_Menu_Item objects.\n  Motif calls this an OptionButton.\n\n  The only difference between this and a Fl_Menu_Button is that the name of\n  the most recent chosen menu item is displayed inside the box, while the\n  label is displayed outside the box. However, since the use of this is most\n  often to control a single variable rather than do individual callbacks,\n  some of the Fl_Menu_Button methods are redescribed here in those terms.\n\n  When the user clicks a menu item, value() is set to that item\n  and then:\n\n      - The item's callback is done if one has been set; the\n        Fl_Choice is passed as the Fl_Widget* argument,\n        along with any userdata configured for the callback.\n\n      - If the item does not have a callback, the Fl_Choice widget's\n        callback is done instead, along with any userdata configured\n        for it.  The callback can determine which item was picked using\n        value(), mvalue(), item_pathname(), etc.\n\n  All three mouse buttons pop up the menu. The Forms behavior of the first\n  two buttons to increment/decrement the choice is not implemented.  This\n  could be added with a subclass, however.\n\n  The menu will also pop up in response to shortcuts indicated by putting\n  a '\\&' character in the label().  See Fl_Button::shortcut(int s) for a\n  description of this.\n\n  Typing the shortcut() of any of the items will do exactly the same as when\n  you pick the item with the mouse.  The '\\&' character in item names are\n  only looked at when the menu is popped up, however.\n\n  The inherited Fl_Widget::changed() and related methods can be used as follows:\n  \\li <tt>int Fl_Widget::changed() const</tt>\n      This value is true when the user picks a different value. <em>It is turned\n      off by value() and just before doing a callback (the callback can turn\n      it back on if desired).</em>\n  \\li <tt>void Fl_Widget::set_changed()</tt>\n      This method sets the changed() flag.\n  \\li <tt>void Fl_Widget::clear_changed()</tt>\n      This method clears the changed() flag.\n\n The inherited Fl_Menu_::down_box() methods can be used as follows:\n  \\li <tt>Fl_Boxtype Fl_Menu_::down_box() const</tt>\n      Gets the current down box, which is used when the menu is popped up.\n      The default down box type is \\c FL_DOWN_BOX.\n  \\li <tt>void Fl_Menu_::down_box(Fl_Boxtype b)</tt>\n      Sets the current down box type to \\p b.\n\n Simple example:\n \\par\n \\code\n   #include <FL/Fl.H>\n   #include <FL/Fl_Window.H>\n   #include <FL/Fl_Choice.H>\n   int main() {\n     Fl_Window *win = new Fl_Window(300,200);\n     Fl_Choice *choice = new Fl_Choice(100,10,100,25,\"Choice:\");\n     choice->add(\"Zero\");\n     choice->add(\"One\");\n     choice->add(\"Two\");\n     choice->add(\"Three\");\n     choice->value(2);    // make \"Two\" selected by default (zero based!)\n     win->end();\n     win->show();\n     return Fl::run();\n   }\n \\endcode\n\n */\nclass FL_EXPORT Fl_Choice : public Fl_Menu_ {\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  int handle(int) FL_OVERRIDE;\n\n  Fl_Choice(int X, int Y, int W, int H, const char *L = 0);\n\n  /**\n    Gets the index of the last item chosen by the user.\n    The index is -1 initially.\n   */\n  int value() const {return Fl_Menu_::value();}\n\n  int value(int v);\n\n  int value(const Fl_Menu_Item* v);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Clock.H",
    "content": "//\n// Clock header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2017 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Clock, Fl_Clock_Output widgets . */\n\n#ifndef Fl_Clock_H\n#define Fl_Clock_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n// Values for type():\n// Please change doxygen documentation below (class Fl_Clock_Output)\n// accordingly as well when changing the following type values:\n\n#define FL_SQUARE_CLOCK         0       /**< type() of Square Clock variant */\n#define FL_ROUND_CLOCK          1       /**< type() of Round Clock variant */\n#define FL_ANALOG_CLOCK FL_SQUARE_CLOCK /**< An analog clock is square */\n#define FL_DIGITAL_CLOCK FL_SQUARE_CLOCK /**< Not yet implemented */\n\n// fabien: Please keep the horizontal formatting of both images in class desc,\n// don't lose vertical space for nothing!\n\n/**\n  \\class Fl_Clock_Output\n  \\brief This widget can be used to display a program-supplied time.\n\n  The time shown on the clock is not updated. To display the current time,\n  use Fl_Clock instead.\n\n  \\htmlonly <BR>  <table align=CENTER border=1 cellpadding=5 >\n  <caption align=bottom>type() FL_SQUARE_CLOCK and FL_ROUND_CLOCK </caption> <TR><TD> \\endhtmlonly\n  \\image html clock.png\n  \\htmlonly </TD> <TD> \\endhtmlonly\n  \\image html round_clock.png\n  \\htmlonly </TD> </TR> </table> \\endhtmlonly\n  \\image latex clock.png \"FL_SQUARE_CLOCK type\" width=4cm\n  \\image latex round_clock.png \"FL_ROUND_CLOCK type\" width=4cm\n\n  Values for clock type() (\\#include \\<FL/Clock.H\\>):\n\n  \\code\n    #define FL_SQUARE_CLOCK             0       // Square Clock variant\n    #define FL_ROUND_CLOCK              1       // Round Clock variant\n    #define FL_ANALOG_CLOCK FL_SQUARE_CLOCK     // An analog clock is square\n    #define FL_DIGITAL_CLOCK FL_SQUARE_CLOCK    // Not yet implemented\n  \\endcode\n\n */\nclass FL_EXPORT Fl_Clock_Output : public Fl_Widget {\n  int hour_, minute_, second_;\n  ulong value_;\n  int shadow_; // draw shadows of hands\n  void drawhands(Fl_Color,Fl_Color); // part of draw\nprotected:\n  void draw() FL_OVERRIDE;\n  void draw(int X, int Y, int W, int H);\npublic:\n\n  Fl_Clock_Output(int X, int Y, int W, int H, const char *L = 0);\n\n  void value(ulong v);  // set to this Unix time\n\n  void value(int H, int m, int s);\n\n  /**\n    Returns the displayed time.\n    Returns the time in seconds since the UNIX epoch (January 1, 1970).\n    \\see value(ulong)\n   */\n  ulong value() const {return value_;}\n\n  /**\n    Returns the displayed hour (0 to 23).\n    \\see value(), minute(), second()\n   */\n  int hour() const {return hour_;}\n\n  /**\n    Returns the displayed minute (0 to 59).\n    \\see value(), hour(), second()\n   */\n  int minute() const {return minute_;}\n\n  /**\n    Returns the displayed second (0 to 60, 60=leap second).\n    \\see value(), hour(), minute()\n   */\n  int second() const {return second_;}\n\n  /**\n    Returns the shadow drawing mode of the hands.\n\n    \\returns    shadow drawing mode of the hands\n    \\retval 0   no shadows\n    \\retval 1   draw shadows of hands (default)\n  */\n  int shadow() const {return shadow_;}\n\n  /**\n    Sets the shadow drawing mode of the hands.\n\n    Enables (1) or disables (0) drawing the hands with shadows.\n\n    Values except 0 and 1 are reserved for future extensions and\n    yield undefined behavior.\n\n    The default is to draw the shadows (1).\n\n    \\param[in]  mode    1 = shadows (default), 0 = no shadows\n  */\n  void shadow(int mode) { shadow_ = mode ? 1 : 0; }\n};\n\n// a Fl_Clock displays the current time always by using a timeout:\n\n/**\n  \\class Fl_Clock\n  \\brief This widget provides a round analog clock display.\n\n  Fl_Clock is provided for Forms compatibility.\n  It installs a 1-second timeout callback using Fl::add_timeout().\n  You can choose the rounded or square type of the clock with type().\n  Please see Fl_Clock_Output widget for applicable values.\n\n  \\htmlonly <BR>  <table align=CENTER border=1 cellpadding=5 >\n  <caption align=bottom>type() FL_SQUARE_CLOCK and FL_ROUND_CLOCK </caption> <TR><TD> \\endhtmlonly\n  \\image html clock.png\n  \\htmlonly </TD> <TD> \\endhtmlonly\n  \\image html round_clock.png\n  \\htmlonly </TD> </TR> </table> \\endhtmlonly\n  \\image latex clock.png \"FL_SQUARE_CLOCK type\" width=4cm\n  \\image latex round_clock.png \"FL_ROUND_CLOCK type\" width=4cm\n\n  \\see class Fl_Clock_Output\n */\nclass FL_EXPORT Fl_Clock : public Fl_Clock_Output {\npublic:\n  int handle(int) FL_OVERRIDE;\n\n  Fl_Clock(int X, int Y, int W, int H,  const char *L = 0);\n\n  Fl_Clock(uchar t, int X, int Y, int W, int H, const char *L);\n\n  ~Fl_Clock();\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Color_Chooser.H",
    "content": "//\n// Color chooser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2019 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   Fl_Color_Chooser widget . */\n\n// The color chooser object and the color chooser popup.  The popup\n// is just a window containing a single color chooser and some boxes\n// to indicate the current and cancelled color.\n\n#ifndef Fl_Color_Chooser_H\n#define Fl_Color_Chooser_H\n\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Box.H>\n#include <FL/Fl_Return_Button.H>\n#include <FL/Fl_Choice.H>\n#include <FL/Fl_Value_Input.H>\n\n#ifndef FL_DOXYGEN\n\n/** For internal use only */\nclass FL_EXPORT Flcc_HueBox : public Fl_Widget {\n  int px, py;\nprotected:\n  void draw() FL_OVERRIDE;\n  int handle_key(int);\npublic:\n  int handle(int) FL_OVERRIDE;\n  Flcc_HueBox(int X, int Y, int W, int H) : Fl_Widget(X,Y,W,H) {\n  px = py = 0;}\n};\n\n/** For internal use only */\nclass FL_EXPORT Flcc_ValueBox : public Fl_Widget {\n  int py;\nprotected:\n  void draw() FL_OVERRIDE;\n  int handle_key(int);\npublic:\n  int handle(int) FL_OVERRIDE;\n  Flcc_ValueBox(int X, int Y, int W, int H) : Fl_Widget(X,Y,W,H) {\n  py = 0;}\n};\n\n/** For internal use only */\nclass FL_EXPORT Flcc_Value_Input : public Fl_Value_Input {\npublic:\n  int format(char*) FL_OVERRIDE;\n  Flcc_Value_Input(int X, int Y, int W, int H) : Fl_Value_Input(X,Y,W,H) {}\n};\n\n#endif // !FL_DOXYGEN\n\n/** \\addtogroup group_comdlg\n    @{ */\n\n/**\n  \\class Fl_Color_Chooser\n  \\brief The Fl_Color_Chooser widget provides a standard RGB color chooser.\n\n  \\image html fl_color_chooser.jpg\n  \\image latex fl_color_chooser.jpg \"fl_color_chooser()\" width=5cm\n\n  You can place any number of the widgets into a panel of your own design.\n  The diagram shows the widget as part of a color chooser dialog created by\n  the fl_color_chooser() function. The Fl_Color_Chooser widget contains the\n  hue box, value slider, and rgb input fields from the above diagram (it\n  does not have the color chips or the Cancel or OK buttons).\n  The callback is done every time the user changes the rgb value. It is not\n  done if they move the hue control in a way that produces the \\e same rgb\n  value, such as when saturation or value is zero.\n\n  The fl_color_chooser() function pops up a window to let the user pick an\n  arbitrary RGB color. They can pick the hue and saturation in the \"hue box\"\n  on the left (hold down CTRL to just change the saturation), and the\n  brightness using the vertical slider. Or they can type the 8-bit numbers\n  into the RGB Fl_Value_Input fields, or drag the mouse across them to adjust\n  them.  The pull-down menu lets the user set the input fields to show RGB,\n  HSV, or 8-bit RGB (0 to 255).\n\n  The user can press CTRL-C to copy the currently selected color value as\n  text in RGB hex format with leading zeroes to the clipboard, for instance\n  \\p FL_GREEN would be '00FF00' (since FLTK 1.4.0).\n\n  fl_color_chooser() returns non-zero if the user picks ok, and updates the\n  RGB values.  If the user picks cancel or closes the window this returns\n  zero and leaves RGB unchanged.\n\n  If you use the color chooser on an 8-bit screen, it will allocate all the\n  available colors, leaving you no space to exactly represent the color the\n  user picks! You can however use fl_rectf() to fill a region with a simulated\n  color using dithering.\n\n  Callback reasons can be \\c FL_REASON_DRAGGED, \\c FL_REASON_CHANGED, or\n  \\c FL_REASON_RESELECTED.\n */\n/** @} */\nclass FL_EXPORT Fl_Color_Chooser : public Fl_Group {\n  Flcc_HueBox huebox;\n  Flcc_ValueBox valuebox;\n  Fl_Choice choice;\n  Flcc_Value_Input rvalue;\n  Flcc_Value_Input gvalue;\n  Flcc_Value_Input bvalue;\n  Fl_Box resize_box;\n  double hue_, saturation_, value_;\n  double r_, g_, b_;\n  void set_valuators();\n  static void rgb_cb(Fl_Widget*, void*);\n  static void mode_cb(Fl_Widget*, void*);\npublic:\n\n  int handle(int e) FL_OVERRIDE;\n\n  /**\n   Returns which Fl_Color_Chooser variant is currently active\n   \\return color modes are rgb(0), byte(1), hex(2), or hsv(3)\n   */\n  int mode() {return choice.value();}\n\n  /**\n   Set which Fl_Color_Chooser variant is currently active\n   \\param[in] newMode color modes are rgb(0), byte(1), hex(2), or hsv(3)\n   */\n  void mode(int newMode);\n\n  /**\n    Returns the current hue.\n    0 <= hue < 6. Zero is red, one is yellow, two is green, etc.\n    <em>This value is convenient for the internal calculations - some other\n    systems consider hue to run from zero to one, or from 0 to 360.</em>\n   */\n  double hue() const {return hue_;}\n\n  /**\n    Returns the saturation.\n    0 <= saturation <= 1.\n   */\n  double saturation() const {return saturation_;}\n\n  /**\n    Returns the value/brightness.\n    0 <= value <= 1.\n   */\n  double value() const {return value_;}\n\n  /**\n    Returns the current red value.\n    0 <= r <= 1.\n   */\n  double r() const {return r_;}\n\n  /**\n    Returns the current green value.\n    0 <= g <= 1.\n   */\n  double g() const {return g_;}\n\n  /**\n    Returns the current blue value.\n    0 <= b <= 1.\n   */\n  double b() const {return b_;}\n\n  int hsv(double H, double S, double V);\n\n  int rgb(double R, double G, double B);\n\n  static void hsv2rgb(double H, double S, double V, double& R, double& G, double& B);\n\n  static void rgb2hsv(double R, double G, double B, double& H, double& S, double& V);\n\n  Fl_Color_Chooser(int X, int Y, int W, int H, const char *L = 0);\n};\n\nFL_EXPORT int fl_color_chooser(const char* name, double& r, double& g, double& b, int m=-1);\nFL_EXPORT int fl_color_chooser(const char* name, uchar& r, uchar& g, uchar& b, int m=-1);\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Copy_Surface.H",
    "content": "//\n// Copy-to-clipboard code for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Copy_Surface_H\n#define Fl_Copy_Surface_H\n\n#include <FL/Fl_Widget_Surface.H>\n\n/** Supports copying of graphical data to the clipboard.\n\n <br> After creation of an Fl_Copy_Surface object, make it the current drawing surface calling Fl_Surface_Device::push_current(), and all subsequent graphics requests\n will be recorded in the clipboard. It's possible to draw widgets (using Fl_Copy_Surface::draw()\n ) or to use any of the \\ref fl_drawings or the \\ref fl_attributes.\n Finally, delete the Fl_Copy_Surface object to load the clipboard with the graphical data.\n <br> Fl_Gl_Window 's can be copied to the clipboard as well.\n <br> Usage example:\n \\code\n Fl_Widget *g = ...; // a widget you want to copy to the clipboard\n Fl_Copy_Surface *copy_surf = new Fl_Copy_Surface(g->w(), g->h()); // create an Fl_Copy_Surface object\n Fl_Surface_Device::push_current(copy_surf); // direct graphics requests to the clipboard\n fl_color(FL_WHITE); fl_rectf(0, 0, g->w(), g->h()); // draw a white background\n copy_surf->draw(g); // draw the g widget in the clipboard\n Fl_Surface_Device::pop_current();  // direct graphics requests back to their previous destination\n delete copy_surf; // after this, the clipboard is loaded\n \\endcode\n Platform details:\n \\li Windows: Transparent RGB images copy without transparency.\n The graphical data are copied to the clipboard in two formats: 1) as an 'enhanced metafile';\n 2) as a color bitmap. Applications to which the clipboard content is pasted can use the format\n that suits them best.\n \\li Mac OS: The graphical data are copied to the clipboard (a.k.a. pasteboard) in two 'flavors':\n 1) in vectorial form as PDF data; 2) in bitmap form as a TIFF image.\n Applications to which the clipboard content is pasted can use the flavor that suits them best.\n \\li X11 and Wayland: the graphical data are copied to the clipboard as an image in BMP format.\n*/\nclass FL_EXPORT Fl_Copy_Surface : public Fl_Widget_Surface {\nprivate:\n  class Fl_Copy_Surface_Driver *platform_surface;\nprotected:\n  void translate(int x, int y) FL_OVERRIDE;\n  void untranslate() FL_OVERRIDE;\npublic:\n  Fl_Copy_Surface(int w, int h);\n  ~Fl_Copy_Surface();\n  void set_current() FL_OVERRIDE;\n  bool is_current() FL_OVERRIDE;\n  /** Returns the pixel width of the copy surface */\n  int w();\n  /** Returns the pixel height of the copy surface */\n  int h();\n  void origin(int *x, int *y) FL_OVERRIDE;\n  void origin(int x, int y) FL_OVERRIDE;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n};\n\n\n/**\n \\cond DriverDev\n \\addtogroup DriverDeveloper\n \\{\n */\n\n/**\n A base class describing the interface between FLTK and draw-to-clipboard operations.\n\n This class is only for internal use by the FLTK library.\n\n A supported platform should implement the virtual methods of this class\n in order to support drawing to the clipboard through class Fl_Copy_Surface.\n */\nclass Fl_Copy_Surface_Driver : public Fl_Widget_Surface {\n  friend class Fl_Copy_Surface;\nprotected:\n  int width;\n  int height;\n  Fl_Copy_Surface_Driver(int w, int h) : Fl_Widget_Surface(NULL), width(w), height(h) {}\n  virtual ~Fl_Copy_Surface_Driver() {}\n  void set_current() FL_OVERRIDE = 0;\n  void translate(int x, int y) FL_OVERRIDE = 0;\n  void untranslate() FL_OVERRIDE = 0;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  /** Each platform implements this function its own way.\n   It returns an object implementing all virtual functions\n   of class Fl_Copy_Surface_Driver for the platform.\n   */\n  static Fl_Copy_Surface_Driver *newCopySurfaceDriver(int w, int h);\n};\n\n/**\n \\}\n \\endcond\n */\n\n#endif // Fl_Copy_Surface_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Counter.H",
    "content": "//\n// Counter header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Counter widget . */\n\n// A numerical value with up/down step buttons.  From Forms.\n\n#ifndef Fl_Counter_H\n#define Fl_Counter_H\n\n#ifndef Fl_Valuator_H\n#include \"Fl_Valuator.H\"\n#endif\n\n// values for type():\n#define FL_NORMAL_COUNTER       0       /**< type() for counter with fast buttons */\n#define FL_SIMPLE_COUNTER       1       /**< type() for counter without fast buttons */\n\n/**\n  Controls a single floating point value with button (or keyboard) arrows.\n  Double arrows buttons achieve larger steps than simple arrows.\n  \\see Fl_Spinner for value input with vertical step arrows.\n  \\image html counter.png\n  \\image latex counter.png \"Fl_Counter\" width=4cm\n\n  The type of an Fl_Counter object can be set using Fl_Widget::type(uchar) to:\n  \\li \\c FL_NORMAL_COUNTER: Displays a counter with 4 arrow buttons.\n  \\li \\c FL_SIMPLE_COUNTER: Displays a counter with only 2 arrow buttons.\n*/\nclass FL_EXPORT Fl_Counter : public Fl_Valuator {\n\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  Fl_Color textcolor_;\n  double lstep_;\n  uchar mouseobj_;\n  static void repeat_callback(void *);\n  int calc_mouseobj();\n  void increment_cb();\n\nprotected:\n\n  void draw() FL_OVERRIDE;\n  // compute widths of arrow boxes\n  void arrow_widths(int &w1, int &w2);\n\npublic:\n\n  int handle(int) FL_OVERRIDE;\n\n  Fl_Counter(int X, int Y, int W, int H, const char* L = 0);\n  ~Fl_Counter();\n\n  /**\n    Sets the increment for the large step buttons.\n    The default value is 1.0.\n    \\param[in] a large step increment.\n  */\n  void lstep(double a) {lstep_ = a;}\n\n  /**\n    Sets the increments for the normal and large step buttons.\n    \\param[in] a, b normal and large step increments.\n  */\n  void step(double a,double b) {Fl_Valuator::step(a); lstep_ = b;}\n\n  /**\n    Sets the increment for the normal step buttons.\n    \\param[in] a normal step increment.\n  */\n  void step(double a) {Fl_Valuator::step(a);}\n\n  /**\n    Returns the increment for normal step buttons.\n   */\n  double step() const {return Fl_Valuator::step();}\n\n  /** Gets the text font */\n  Fl_Font textfont() const {return textfont_;}\n  /** Sets the text font to \\p s */\n  void textfont(Fl_Font s) {textfont_ = s;}\n\n  /** Gets the font size */\n  Fl_Fontsize textsize() const {return textsize_;}\n  /** Sets the font size to \\p s */\n  void textsize(Fl_Fontsize s) {textsize_ = s;}\n\n  /** Gets the font color */\n  Fl_Color textcolor() const {return textcolor_;}\n  /** Sets the font color to \\p s */\n  void textcolor(Fl_Color s) {textcolor_ = s;}\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Device.H",
    "content": "//\n// Definition of classes Fl_Surface_Device, Fl_Display_Device\n// for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2010-2021 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file Fl_Device.H\n \\brief declaration of classes Fl_Surface_Device, Fl_Display_Device, Fl_Device_Plugin.\n*/\n\n#ifndef Fl_Device_H\n#define Fl_Device_H\n\n#include <FL/Fl_Plugin.H>\n#include <FL/platform_types.h>\n\nclass Fl_Graphics_Driver;\nclass Fl_RGB_Image;\nclass Fl_Widget;\nclass Fl_Image_Surface;\n\n/**\n A drawing surface that's susceptible to receive graphical output.\n Any FLTK application has at any time a current drawing surface to which all drawing requests are directed.\n The current surface is given by Fl_Surface_Device::surface().\n When main() begins running, the current drawing surface has been set to the computer's display,\n an instance of the Fl_Display_Device class.\n\n A drawing surface other than the computer's display, is typically used as follows:\n <ol><li> Create \\c surface, an object from an Fl_Surface_Device derived class (e.g., Fl_Image_Surface, Fl_Printer, Fl_Copy_Surface).\n <li> Call \\c Fl_Surface_Device::push_current(surface); to redirect all graphics requests to\n \\c surface which becomes the new current drawing surface (not necessary with classes Fl_Printer / Fl_PostScript_File_Device /\n Fl_PDF_File_Surface because it is done by Fl_Paged_Device::begin_page()).\n <li> At this point all of the \\ref fl_drawings (e.g., fl_rect()) or the \\ref fl_attributes or \\ref drawing_images functions\n (e.g., fl_draw_image(), Fl_Image::draw()) operate on the new current drawing surface.\n It's also possible to draw to the current surface any widget with Fl_Widget_Surface::draw(Fl_Widget*, int, int), a window and its\n titlebar with Fl_Widget_Surface::draw_decorated_window(), or the content of a rectangular zone of a window\n with Fl_Widget_Surface::print_window_part().\n <li> After all drawing requests have been performed, redirect graphics requests back to their previous destination\n with \\c Fl_Surface_Device::pop_current(); (not necessary with classes Fl_Printer / Fl_PostScript_File_Device / Fl_PDF_File_Surface).\n <li> Delete \\c surface.\n </ol>\n For back-compatibility, it is also possible to use the Fl_Surface_Device::set_current() member function\n to change the current drawing surface, once to the new surface, once to the previous one.\n */\nclass FL_EXPORT Fl_Surface_Device {\n  /** The graphics driver in use by this surface. */\n  Fl_Graphics_Driver *pGraphicsDriver;\n  static Fl_Surface_Device *surface_; // the surface that currently receives graphics requests\n  static Fl_Surface_Device *default_surface(); // create surface if none exists yet\nprotected:\n  /** FLTK calls this each time a surface ceases to be the current drawing surface.\n   This member function is mostly of interest to developers of new Fl_Surface_Device derived classes.\n   It allows to perform surface-specific operations necessary when this surface ceases to be current.\n   Each implementation should end with a call to Fl_Surface_Device::end_current(). */\n  virtual void end_current() { surface_ = 0;}\n  /** Constructor that sets the graphics driver to use for the created surface. */\n  Fl_Surface_Device(Fl_Graphics_Driver *graphics_driver) {pGraphicsDriver = graphics_driver; }\n  /** Sets the graphics driver of this drawing surface. */\n  inline void driver(Fl_Graphics_Driver *graphics_driver) {pGraphicsDriver = graphics_driver;}\npublic:\n  virtual void set_current(void);\n  virtual bool is_current();\n  /** \\brief Returns the graphics driver of this drawing surface. */\n  inline Fl_Graphics_Driver *driver() {return pGraphicsDriver; }\n  /** The current drawing surface.\n   In other words, the Fl_Surface_Device object that currently receives all graphics requests.\n   \\note It's possible to transiently remove the GUI scaling factor in place in the current\n   drawing surface with \\ref fl_override_scale(). */\n  static inline Fl_Surface_Device *surface() {\n    return surface_ ? surface_ : default_surface();\n  }\n  /** \\brief The destructor. */\n  virtual ~Fl_Surface_Device();\n  static void push_current(Fl_Surface_Device *new_current);\n  static Fl_Surface_Device *pop_current();\n};\n\n/**\n The computer's display.\n When FLTK begins to access the computer's display, it creates an object of class Fl_Display_Device and makes\n it the current drawing surface.\n */\nclass FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {\n  Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);\npublic:\n  static Fl_Display_Device *display_device();\n};\n\n/**\n This plugin socket allows the integration of new device drivers for special\n window or screen types.\n This class is not intended for use outside the FLTK library.\n It is currently used to provide an automated printing\n service and screen capture for OpenGL windows, if linked with fltk_gl.\n */\nclass Fl_Device_Plugin : public Fl_Plugin {\npublic:\n  /** \\brief The constructor */\n  Fl_Device_Plugin(const char *pluginName)\n  : Fl_Plugin(klass(), pluginName) { }\n  /** \\brief Returns the class name */\n  virtual const char *klass() { return \"fltk:device\"; }\n  /** \\brief Returns the plugin name */\n  virtual const char *name() = 0;\n  /** \\brief Prints a widget */\n  virtual int print(Fl_Widget* w) = 0;\n  /** Captures a rectangle of a widget as an image\n   \\return The captured pixels as an RGB image\n   */\n  virtual Fl_RGB_Image* rectangle_capture(Fl_Widget *widget, int x, int y, int w, int h) = 0;\n  /** Returns the OpenGL plugin */\n  static Fl_Device_Plugin *opengl_plugin();\n};\n\n#endif // Fl_Device_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Dial.H",
    "content": "//\n// Dial header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Dial widget . */\n\n#ifndef Fl_Dial_H\n#define Fl_Dial_H\n\n#ifndef Fl_Valuator_H\n#include \"Fl_Valuator.H\"\n#endif\n\n// values for type():\n#define FL_NORMAL_DIAL  0       /**< type() for dial variant with dot */\n#define FL_LINE_DIAL    1       /**< type() for dial variant with line */\n#define FL_FILL_DIAL    2       /**< type() for dial variant with filled arc */\n\n/**\n  The Fl_Dial widget provides a circular dial to control a\n  single floating point value.\n  \\image html dial.png\n  \\image latex dial.png \"Fl_Dial\" width=4cm\n  Use type() to set the type of the dial to:\n  <UL>\n  <LI>FL_NORMAL_DIAL - Draws a normal dial with a knob. </LI>\n  <LI>FL_LINE_DIAL - Draws a dial with a line. </LI>\n  <LI>FL_FILL_DIAL - Draws a dial with a filled arc. </LI>\n  </UL>\n\n*/\nclass FL_EXPORT Fl_Dial : public Fl_Valuator {\n\n  short a1,a2;\n\nprotected:\n\n  // these allow subclasses to put the dial in a smaller area:\n  void draw(int X, int Y, int W, int H);\n  int handle(int event, int X, int Y, int W, int H);\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  int handle(int) FL_OVERRIDE;\n  /**\n    Creates a new Fl_Dial widget using the given position, size,\n    and label string. The default type is FL_NORMAL_DIAL.\n  */\n  Fl_Dial(int x,int y,int w,int h, const char *l = 0);\n  /**\n     Sets Or gets the angles used for the minimum and maximum values.  The default\n     values are 45 and 315 (0 degrees is straight down and the angles\n     progress clockwise).  Normally angle1 is less than angle2, but if you\n     reverse them the dial moves counter-clockwise.\n  */\n  short angle1() const {return a1;}\n  /** See short angle1() const */\n  void angle1(short a) {a1 = a;}\n  /** See short angle1() const */\n  short angle2() const {return a2;}\n  /** See short angle1() const */\n  void angle2(short a) {a2 = a;}\n  /** See short angle1() const */\n  void angles(short a, short b) {a1 = a; a2 = b;}\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Double_Window.H",
    "content": "//\n// Double-buffered window header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Double_Window widget . */\n\n#ifndef Fl_Double_Window_H\n#define Fl_Double_Window_H\n\n#include \"Fl_Window.H\"\n\n/**\n  The Fl_Double_Window provides a double-buffered window.\n  It will draw the window data into an off-screen pixmap, and then\n  copy it to the on-screen window.\n*/\nclass FL_EXPORT Fl_Double_Window : public Fl_Window\n{\npublic:\n  Fl_Double_Window *as_double_window() FL_OVERRIDE {return this; }\n  void show() FL_OVERRIDE;\n  /** Same as Fl_Window::show(int a, char **b) */\n  void show(int a, char **b) {Fl_Window::show(a,b);}\n  void resize(int,int,int,int) FL_OVERRIDE;\n  void hide() FL_OVERRIDE;\n  void flush() FL_OVERRIDE;\n  ~Fl_Double_Window();\n\n  /**\n   Creates a new Fl_Double_Window widget using the given\n   position, size, and label (title) string.\n  */\n  Fl_Double_Window(int W, int H, const char *l = 0);\n\n  /**\n   See  Fl_Double_Window::Fl_Double_Window(int w, int h, const char *label = 0)\n  */\n  Fl_Double_Window(int X, int Y, int W, int H, const char *l = 0);\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Export.H",
    "content": "/*\n * Windows DLL export .\n *\n * Copyright 1998-2018 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n#ifndef Fl_Export_H\n#  define Fl_Export_H\n\n/*\n * The following is used when building DLLs under Windows\n * and when building .so's under unix/linux.\n */\n\n#  if defined(FL_DLL)\n#    ifdef FL_LIBRARY\n#      define FL_EXPORT __declspec(dllexport)\n#    else\n#      define FL_EXPORT __declspec(dllimport)\n#    endif /* FL_LIBRARY */\n#  elif __GNUC__ >= 4\n#    define FL_EXPORT __attribute__ ((visibility (\"default\")))\n#  else\n#    define FL_EXPORT\n#  endif /* FL_DLL */\n\n#endif /* !Fl_Export_H */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_File_Browser.H",
    "content": "//\n// FileBrowser definitions.\n//\n// Copyright 1999-2010 by Michael Sweet.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_File_Browser widget . */\n\n//\n// Include necessary header files...\n//\n\n#ifndef _Fl_File_Browser_H_\n#  define _Fl_File_Browser_H_\n\n#  include \"Fl_Browser.H\"\n#  include \"Fl_File_Icon.H\"\n#  include \"filename.H\"\n\n\n//\n// Fl_File_Browser class...\n//\n\n/** The Fl_File_Browser widget displays a list of filenames, optionally with file-specific icons. */\nclass FL_EXPORT Fl_File_Browser : public Fl_Browser {\n\n  int           filetype_;\n  const char    *directory_;\n  uchar         iconsize_;\n  const char    *pattern_;\n  const char    *errmsg_;\n\n  int   full_height() const FL_OVERRIDE;\n  int   item_height(void *) const FL_OVERRIDE;\n  int   item_width(void *) const FL_OVERRIDE;\n  void  item_draw(void *, int, int, int, int) const FL_OVERRIDE;\n  int   incr_height() const FL_OVERRIDE { return (item_height(0) + linespacing()); }\n\npublic:\n  enum { FILES, DIRECTORIES };\n\n  Fl_File_Browser(int, int, int, int, const char * = 0);\n  ~Fl_File_Browser();\n\n  /**    Sets or gets the size of the icons. The default size is 20 pixels.  */\n  uchar         iconsize() const { return (iconsize_); }\n  /**    Sets or gets the size of the icons. The default size is 20 pixels.  */\n  void          iconsize(uchar s) { iconsize_ = s; redraw(); }\n\n  /**\n    Sets or gets the filename filter. The pattern matching uses\n    the fl_filename_match()\n    function in FLTK.\n  */\n  void  filter(const char *pattern);\n  /**\n    Sets or gets the filename filter. The pattern matching uses\n    the fl_filename_match()\n    function in FLTK.\n  */\n  const char    *filter() const { return (pattern_); }\n  int           load(const char *directory, Fl_File_Sort_F *sort = fl_numericsort);\n  Fl_Fontsize  textsize() const { return Fl_Browser::textsize(); }\n  void          textsize(Fl_Fontsize s) { Fl_Browser::textsize(s); iconsize_ = (uchar)(3 * s / 2); }\n\n  /**\n    Sets or gets the file browser type, FILES or\n    DIRECTORIES. When set to FILES, both\n    files and directories are shown. Otherwise only directories are\n    shown.\n  */\n  int           filetype() const { return (filetype_); }\n  /**\n    Sets or gets the file browser type, FILES or\n    DIRECTORIES. When set to FILES, both\n    files and directories are shown. Otherwise only directories are\n    shown.\n  */\n  void          filetype(int t) { filetype_ = t; }\n  void errmsg(const char *emsg);\n  /**\n    Returns OS error messages, or NULL if none. Use when advised.\n   */\n  const char* errmsg() const { return errmsg_; }\n};\n\n#endif // !_Fl_File_Browser_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_File_Chooser.H",
    "content": "//\n// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n// =======================================================================\n//  DO NOT EDIT FL/Fl_File_Chooser.H and src/Fl_File_Chooser.cxx !!!\n// =======================================================================\n//  Please use fluid to change src/Fl_File_Chooser.fl interactively\n//  and then use fluid to \"write code\" or edit and use fluid -c .\n// =======================================================================\n//\n\n// generated by Fast Light User Interface Designer (fluid) version 1.0402\n\n#ifndef Fl_File_Chooser_H\n#define Fl_File_Chooser_H\n#include <FL/Fl.H>\n#include <FL/Fl_Double_Window.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Choice.H>\n#include <FL/Fl_Menu_Button.H>\n#include <FL/Fl_Button.H>\n#include <FL/Fl_Preferences.H>\n#include <FL/Fl_Tile.H>\n#include <FL/Fl_File_Browser.H>\n#include <FL/Fl_Box.H>\n#include <FL/Fl_Check_Button.H>\n#include <FL/Fl_File_Input.H>\n#include <FL/Fl_Return_Button.H>\n#include <FL/fl_ask.H>\n\nclass FL_EXPORT Fl_File_Chooser {\npublic:\n  /**\n   \\enum Type\n   Determines the type of file chooser presented to the user.\n  */\n  enum Type {\n    SINGLE    = 0, ///< Select a single, existing file.\n    MULTI     = 1, ///< Select one or more existing files.\n    CREATE    = 2, ///< When used alone, select a single, existing file or specify a new filename.\n                   ///< Can be combined with DIRECTORY (e.g. CREATE|DIRECTORY) to have the same\n                   ///< effect for directories.\n    DIRECTORY = 4  ///< Select a single, existing directory. Can be combined with CREATE.\n  };\nprivate:\n  static Fl_Preferences *prefs_;\n  void (*callback_)(Fl_File_Chooser*, void *);\n  void *data_;\n  char directory_[FL_PATH_MAX];\n  char pattern_[FL_PATH_MAX];\n  char preview_text_[2048];\n  int type_;\n  void favoritesButtonCB();\n  void favoritesCB(Fl_Widget *w);\n  void fileListCB();\n  void fileNameCB();\n  void newdir();\n  static void previewCB(Fl_File_Chooser *fc);\n  void showChoiceCB();\n  void update_favorites();\n  void update_preview();\npublic:\n  Fl_File_Chooser(const char *pathname, const char *pattern, int type_val, const char *title);\nprivate:\n  Fl_Double_Window *window;\n  inline void cb_window_i(Fl_Double_Window*, void*);\n  static void cb_window(Fl_Double_Window*, void*);\n  Fl_Choice *showChoice;\n  inline void cb_showChoice_i(Fl_Choice*, void*);\n  static void cb_showChoice(Fl_Choice*, void*);\n  Fl_Menu_Button *favoritesButton;\n  inline void cb_favoritesButton_i(Fl_Menu_Button*, void*);\n  static void cb_favoritesButton(Fl_Menu_Button*, void*);\npublic:\n  Fl_Button *newButton;\nprivate:\n  inline void cb_newButton_i(Fl_Button*, void*);\n  static void cb_newButton(Fl_Button*, void*);\n  inline void cb__i(Fl_Tile*, void*);\n  static void cb_(Fl_Tile*, void*);\n  Fl_File_Browser *fileList;\n  inline void cb_fileList_i(Fl_File_Browser*, void*);\n  static void cb_fileList(Fl_File_Browser*, void*);\n  Fl_Box *errorBox;\n  Fl_Box *previewBox;\npublic:\n  Fl_Check_Button *previewButton;\nprivate:\n  inline void cb_previewButton_i(Fl_Check_Button*, void*);\n  static void cb_previewButton(Fl_Check_Button*, void*);\npublic:\n  Fl_Check_Button *showHiddenButton;\nprivate:\n  inline void cb_showHiddenButton_i(Fl_Check_Button*, void*);\n  static void cb_showHiddenButton(Fl_Check_Button*, void*);\n  Fl_File_Input *fileName;\n  inline void cb_fileName_i(Fl_File_Input*, void*);\n  static void cb_fileName(Fl_File_Input*, void*);\n  Fl_Return_Button *okButton;\n  inline void cb_okButton_i(Fl_Return_Button*, void*);\n  static void cb_okButton(Fl_Return_Button*, void*);\n  Fl_Button *cancelButton;\n  inline void cb_cancelButton_i(Fl_Button*, void*);\n  static void cb_cancelButton(Fl_Button*, void*);\n  Fl_Double_Window *favWindow;\n  Fl_File_Browser *favList;\n  inline void cb_favList_i(Fl_File_Browser*, void*);\n  static void cb_favList(Fl_File_Browser*, void*);\n  Fl_Button *favUpButton;\n  inline void cb_favUpButton_i(Fl_Button*, void*);\n  static void cb_favUpButton(Fl_Button*, void*);\n  Fl_Button *favDeleteButton;\n  inline void cb_favDeleteButton_i(Fl_Button*, void*);\n  static void cb_favDeleteButton(Fl_Button*, void*);\n  Fl_Button *favDownButton;\n  inline void cb_favDownButton_i(Fl_Button*, void*);\n  static void cb_favDownButton(Fl_Button*, void*);\n  Fl_Button *favCancelButton;\n  inline void cb_favCancelButton_i(Fl_Button*, void*);\n  static void cb_favCancelButton(Fl_Button*, void*);\n  Fl_Return_Button *favOkButton;\n  inline void cb_favOkButton_i(Fl_Return_Button*, void*);\n  static void cb_favOkButton(Fl_Return_Button*, void*);\npublic:\n  ~Fl_File_Chooser();\n  void callback(void (*cb)(Fl_File_Chooser *, void *), void *d = 0);\n  void color(Fl_Color c);\n  Fl_Color color();\n  int count();\n  void directory(const char *d);\n  char * directory();\n  void filter(const char *p);\n  const char * filter();\n  int filter_value();\n  void filter_value(int f);\n  void iconsize(uchar s);\n  uchar iconsize();\n  void label(const char *l);\n  const char * label();\n  void ok_label(const char *l);\n  const char * ok_label();\n  void preview(int e);\n  int preview() const { return previewButton->value(); }\nprivate:\n  void showHidden(int e);\n  void remove_hidden_files();\npublic:\n  void rescan();\n  void rescan_keep_filename();\n  void show();\n  void hide();\n  int shown();\n  void textcolor(Fl_Color c);\n  Fl_Color textcolor();\n  void textfont(Fl_Font f);\n  Fl_Font textfont();\n  void textsize(Fl_Fontsize s);\n  Fl_Fontsize textsize();\n  void type(int t);\n  int type();\n  void * user_data() const;\n  void user_data(void *d);\n  const char *value(int f = 1);\n  void value(const char *filename);\n  int visible();\n  void position(int x, int y);\n  int x() const;\n  int y() const;\n  int w() const;\n  int h() const;\n  void size(int w, int h);\n  void resize(int x, int y, int w, int h);\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *add_favorites_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *all_files_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *custom_filter_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *existing_file_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *favorites_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *filename_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *filesystems_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *manage_favorites_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *new_directory_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *new_directory_tooltip;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *preview_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *save_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *show_label;\n  /**\n   [standard text may be customized at run-time]\n  */\n  static const char *hidden_label;\n  /**\n   the sort function that is used when loading\n   the contents of a directory.\n  */\n  static Fl_File_Sort_F *sort;\nprivate:\n  Fl_Widget* ext_group;\npublic:\n  Fl_Widget* add_extra(Fl_Widget* gr);\nprotected:\n  void show_error_box(int val);\n};\nFL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0);\nFL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0);\nFL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*));\nFL_EXPORT void fl_file_chooser_ok_label(const char*l);\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_File_Icon.H",
    "content": "//\n// Fl_File_Icon definitions.\n//\n// Copyright 1999-2010 by Michael Sweet.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_File_Icon widget . */\n\n//\n// Include necessary header files...\n//\n\n#ifndef _Fl_Fl_File_Icon_H_\n#  define _Fl_Fl_File_Icon_H_\n\n#  include \"Fl.H\"\n\n\n//\n// Special color value for the icon color.\n//\n\n#  define FL_ICON_COLOR (Fl_Color)0xffffffff    /**< icon color [background?]*/\n\n\n//\n// Fl_File_Icon class...\n//\n\n/**\n  The Fl_File_Icon class manages icon images that can be used\n  as labels in other widgets and as icons in the FileBrowser widget.\n*/\nclass FL_EXPORT Fl_File_Icon {                  //// Icon data\n\n  static Fl_File_Icon *first_;  // Pointer to first icon/filetype\n  Fl_File_Icon  *next_;         // Pointer to next icon/filetype\n  const char    *pattern_;      // Pattern string\n  int           type_;          // Match only if directory or file?\n  int           num_data_;      // Number of data elements\n  int           alloc_data_;    // Number of allocated elements\n  short         *data_;         // Icon data\n\n  public:\n\n  enum                          // File types\n  {\n    ANY,                        // Any kind of file\n    PLAIN,                      // Only plain files\n    FIFO,                       // Only named pipes\n    DEVICE,                     // Only character and block devices\n    LINK,                       // Only symbolic links\n    DIRECTORY                   // Only directories\n  };\n\n  enum                          // Data opcodes\n  {\n    END,                        // End of primitive/icon\n    COLOR,                      // Followed by color value (2 shorts)\n    LINE,                       // Start of line\n    CLOSEDLINE,                 // Start of closed line\n    POLYGON,                    // Start of polygon\n    OUTLINEPOLYGON,             // Followed by outline color (2 shorts)\n    VERTEX                      // Followed by scaled X,Y\n  };\n\n  Fl_File_Icon(const char *p, int t, int nd = 0, short *d = 0);\n  ~Fl_File_Icon();\n\n  short         *add(short d);\n\n  /**\n    Adds a color value to the icon array, returning a pointer to it.\n    \\param[in] c color value\n  */\n  short         *add_color(Fl_Color c)\n                { short *d = add((short)COLOR); add((short)(c >> 16)); add((short)c); return (d); }\n\n  /**\n    Adds a vertex value to the icon array, returning a pointer to it.\n    The integer version accepts coordinates from 0 to 10000.\n    The origin (0.0) is in the lower-lefthand corner of the icon.\n    \\param[in] x, y vertex coordinates\n  */\n  short         *add_vertex(int x, int y)\n                { short *d = add((short)VERTEX); add((short)x); add((short)y); return (d); }\n\n  /**\n    Adds a vertex value to the icon array, returning a pointer to it.\n    The floating point version goes from 0.0 to 1.0.\n    The origin (0.0) is in the lower-lefthand corner of the icon.\n    \\param[in] x, y vertex coordinates\n  */\n  short         *add_vertex(float x, float y)\n                { short *d = add((short)VERTEX); add((short)(x * 10000.0));\n                  add((short)(y * 10000.0)); return (d); }\n\n  /** Clears all icon data from the icon.*/\n  void          clear() { num_data_ = 0; }\n\n  void          draw(int x, int y, int w, int h, Fl_Color ic, int active = 1);\n\n  void          label(Fl_Widget *w);\n\n  static void   labeltype(const Fl_Label *o, int x, int y, int w, int h, Fl_Align a);\n  void          load(const char *f);\n  int           load_fti(const char *fti);\n  int           load_image(const char *i);\n\n  /** Returns next file icon object. See Fl_File_Icon::first() */\n  Fl_File_Icon  *next() { return (next_); }\n\n  /** Returns the filename matching pattern for the icon.*/\n  const char    *pattern() { return (pattern_); }\n\n  /**  Returns the number of words of data used by the icon.*/\n  int           size() { return (num_data_); }\n\n  /**\n    Returns the filetype associated with the icon, which can be one of the\n    following:\n\n    \\li Fl_File_Icon::ANY, any kind of file.\n    \\li Fl_File_Icon::PLAIN, plain files.\n    \\li Fl_File_Icon::FIFO, named pipes.\n    \\li Fl_File_Icon::DEVICE, character and block devices.\n    \\li Fl_File_Icon::LINK, symbolic links.\n    \\li Fl_File_Icon::DIRECTORY, directories.\n  */\n  int           type() { return (type_); }\n\n  /**  Returns the data array for the icon.*/\n  short         *value() { return (data_); }\n\n  static Fl_File_Icon *find(const char *filename, int filetype = ANY);\n\n  /** Returns a pointer to the first icon in the list.*/\n  static Fl_File_Icon *first() { return (first_); }\n  static void   load_system_icons(void);\n};\n\n#endif // !_Fl_Fl_File_Icon_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_File_Input.H",
    "content": "//\n// File_Input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n// Original version Copyright 1998 by Curtis Edwards.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_File_Input widget . */\n\n#ifndef Fl_File_Input_H\n#  define Fl_File_Input_H\n\n#  include <FL/Fl_Input.H>\n\n/**\n  \\class Fl_File_Input\n  \\brief This widget displays a pathname in a text input field.\n\n  A navigation bar located above the input field allows the user to\n  navigate upward in the directory tree.\n  You may want to handle FL_WHEN_CHANGED events for tracking text changes\n  and also FL_WHEN_RELEASE for button release when changing to parent dir.\n  FL_WHEN_RELEASE callback won't be called if the directory clicked\n  is the same as the current one.\n\n  \\image html Fl_File_Input.png\n  \\image latex Fl_File_Input.png \"Fl_File_Input\"  width=6cm\n\n  \\note As all Fl_Input derived objects, Fl_File_Input may call its callback\n  when losing focus (see FL_UNFOCUS) to update its state like its cursor shape.\n  One resulting side effect is that you should call clear_changed() early in your callback\n  to avoid reentrant calls if you plan to show another window or dialog box in the callback.\n*/\nclass FL_EXPORT Fl_File_Input : public Fl_Input {\n\n  char          ok_entry_;\n  uchar         down_box_;\n  short         buttons_[200];\n  short         pressed_;\n\n  void          draw_buttons();\n  int           handle_button(int event);\n  void          update_buttons();\n\npublic:\n\n  Fl_File_Input(int X, int Y, int W, int H, const char *L=0);\n\n  int handle(int event) FL_OVERRIDE;\n\nprotected:\n  void draw() FL_OVERRIDE;\n\npublic:\n  /** Gets the box type used for the navigation bar. */\n  Fl_Boxtype    down_box() const { return (Fl_Boxtype)down_box_; }\n  /** Sets the box type to use for the navigation bar.  */\n  void          down_box(Fl_Boxtype b) { down_box_ = b; }\n\n  /**\n    Gets the current error color.\n\n    Returns \\p FL_RED since FLTK 1.4.0 (default in 1.3.x).\n    Retained for backwards compatibility.\n\n    \\deprecated Will be removed in FLTK 1.5.0 or higher.\n    \\todo Remove Fl_File_Input::errorcolor() in FLTK 1.5.0 or higher.\n  */\n  Fl_Color      errorcolor() const { return FL_RED; }\n\n  /**\n    Sets the current error color to \\p c.\n\n    Does nothing since FLTK 1.4.0. Retained for backwards compatibility.\n\n    \\deprecated Will be removed in FLTK 1.5.0 or higher.\n    \\todo Remove Fl_File_Input::errorcolor(Fl_Color) in FLTK 1.5.0 or higher.\n    */\n  void          errorcolor(Fl_Color c) {(void)c;}\n\n  int   value(const char *str);\n  int   value(const char *str, int len);\n\n  /**\n    Returns the current value, which is a pointer to an internal buffer\n    and is valid only until the next event is handled.\n  */\n  const char    *value() { return Fl_Input_::value(); }\n};\n\n#endif // !Fl_File_Input_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Fill_Dial.H",
    "content": "//\n// Filled dial header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Fill_Dial widget . */\n\n#ifndef Fl_Fill_Dial_H\n#define Fl_Fill_Dial_H\n\n#include \"Fl_Dial.H\"\n\n/** Draws a dial with a filled arc */\nclass FL_EXPORT Fl_Fill_Dial : public Fl_Dial {\npublic:\n  /** Creates a filled dial, also setting its type to FL_FILL_DIAL. */\n  Fl_Fill_Dial(int X,int Y,int W,int H, const char *L = NULL);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Fill_Slider.H",
    "content": "//\n// Filled slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Fill_Slider widget . */\n\n#ifndef Fl_Fill_Slider_H\n#define Fl_Fill_Slider_H\n\n#include \"Fl_Slider.H\"\n/** Widget that draws a filled horizontal  slider,  useful as a progress or value meter*/\nclass FL_EXPORT Fl_Fill_Slider : public Fl_Slider {\npublic:\n  /** Creates the slider from its position,size and optional title. */\n  Fl_Fill_Slider(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Flex.H",
    "content": "//\n// Fl_Flex widget header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2020 by Karsten Pedersen\n// Copyright 2022-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Flex_H\n#define Fl_Flex_H\n\n#include <FL/Fl_Group.H>\n\n/**\n  Fl_Flex is a container (layout) widget for one row or one column of widgets.\n\n  It provides flexible positioning of its children either in one row or in one\n  column.\n\n  Fl_Flex is designed to be as simple as possible. You can set individual widget\n  sizes or let Fl_Flex position and size the widgets to fit in the container.\n  All \"flexible\" (i.e. non-fixed size) widgets are assigned the same width or\n  height, respectively. For details see below.\n\n  You can set the margins \\b around all children at the inner side of the box\n  frame (if any). Fl_Flex supports setting different margin sizes on top,\n  bottom, left, and right sides.\n  The default margin size is 0 on all edges of the container.\n\n  You can set the gap size \\b between all children. The gap size is always the\n  same between all of its children. This is similar to the 'spacing' of Fl_Pack.\n  The default gap size is 0.\n\n  Fl_Flex can either consist of a single row, i.e. \\p type(Fl_Flex::HORIZONTAL)\n  or a single column, i.e. \\p type(Fl_Flex::VERTICAL). The default value is\n  Fl_Flex::VERTICAL for consistency with Fl_Pack but you can use \\p type()\n  to assign a row (Fl_Flex::HORIZONTAL) layout.\n\n  If type() == Fl_Flex::HORIZONTAL widgets are resized horizontally to fit in\n  the container and their height is the full Fl_Flex height minus border size\n  and margins. You can set a fixed widget width by using fixed().\n\n  If type() == Fl_Flex::VERTICAL widgets are resized vertically to fit in\n  the container and their width is the full Fl_Flex width minus border size\n  and margins. You can set a fixed widget height by using fixed().\n\n  To create arbitrary spacing you can use invisible boxes of flexible or\n  fixed sizes (see example below).\n\n  Alternate constructors let you specify the layout as Fl_Flex::HORIZONTAL or\n  Fl_Flex::VERTICAL directly. Fl_Flex::ROW is an alias of Fl_Flex::HORIZONTAL\n  and Fl_Flex::COLUMN is an alias of Fl_Flex::VERTICAL.\n\n  The default box type is FL_NO_BOX as inherited from Fl_Group. You \\b may\n  need to set a box type with a solid background depending on your layout.\n\n  \\b Important: You should always make sure that the Fl_Flex container cannot\n  be resized smaller than its designed minimal size. This can usually be done by\n  setting a size_range() on the window as shown in the example below. Fl_Flex\n  does not take care of sensible sizes. If it is resized too small the behavior\n  is undefined, i.e. widgets may overlap and/or shrink to zero size.\n\n  \\b Hint: In many cases Fl_Flex can be used as a drop-in replacement\n  for Fl_Pack. This is the recommended single row/column container\n  since FLTK 1.4.0. Its resizing behavior is much more predictable\n  than that of Fl_Pack which <i>\"resizes itself to shrink-wrap itself\n  around all of the children\"</i>.\n\n  Fl_Flex containers can be nested so you can create flexible layouts with\n  multiple columns and rows. However, if your UI design is more complex you\n  may want to use Fl_Grid instead.\n\n  Example:\n  \\image html Fl_Flex_simple.png\n  \\image latex  Fl_Flex_simple.png \"Fl_Flex\" width=6cm\n\n  Example code:\n  \\code\n  #include <FL/Fl.H>\n  #include <FL/Fl_Double_Window.H>\n  #include <FL/Fl_Flex.H>\n  #include <FL/Fl_Box.H>\n  #include <FL/Fl_Button.H>\n\n  int main(int argc, char **argv) {\n    Fl_Double_Window window(410, 40, \"Simple Fl_Flex Demo\");\n    Fl_Flex flex(5, 5, 400, 30, Fl_Flex::HORIZONTAL);\n    Fl_Button b1(0, 0, 0, 0, \"File\");\n    Fl_Button b2(0, 0, 0, 0, \"Save\");\n    Fl_Box    bx(0, 0, 0, 0);\n    Fl_Button b3(0, 0, 0, 0, \"Exit\");\n    flex.fixed(bx, 60); // set fix width of invisible box\n    flex.gap(10);\n    flex.end();\n    window.resizable(flex);\n    window.end();\n    window.size_range(300, 30);\n    window.show(argc, argv);\n    return Fl::run();\n  }\n  \\endcode\n\n  \\since 1.4.0\n*/\nclass FL_EXPORT Fl_Flex : public Fl_Group {\n\n  int margin_left_;           // left margin\n  int margin_top_;            // top margin\n  int margin_right_;          // right margin\n  int margin_bottom_;         // bottom margin\n  int gap_;                   // gap between widgets\n  int fixed_size_size_;       // number of fixed size widgets in array\n  int fixed_size_alloc_;      // allocated size of fixed size array\n  Fl_Widget **fixed_size_;    // array of fixed size widgets\n  bool need_layout_;          // true if layout needs to be calculated\n\npublic:\n\n  enum { // values for type(int)\n    VERTICAL   = 0,     ///< vertical layout (one column)\n    HORIZONTAL = 1,     ///< horizontal layout (one row)\n    COLUMN     = 0,     ///< alias for VERTICAL\n    ROW        = 1      ///< alias for HORIZONTAL\n  };\n\n  // FLTK standard constructor\n  Fl_Flex(int X, int Y, int W, int H, const char *L = 0);\n\n  // original Fl_Flex constructors:\n  // backwards compatible if direction enums { ROW | COLUMN } are used\n\n  Fl_Flex(int direction);\n  Fl_Flex(int w, int h, int direction);\n  Fl_Flex(int x, int y, int w, int h, int direction);\n\n  virtual ~Fl_Flex();\n\n  virtual void end();\n  void resize(int x, int y, int w, int h) FL_OVERRIDE;\n\n  /**\n    Set the horizontal or vertical size of a child widget.\n\n    \\param[in]  w     widget to be affected\n    \\param[in]  size  width (Fl_Flex::HORIZONTAL) or height (Fl_Flex::VERTICAL)\n\n    \\see fixed(Fl_Widget *w, int size)\n  */\n  void fixed(Fl_Widget &w, int size) {\n    fixed(&w, size);\n  }\n\n  void fixed(Fl_Widget *w, int size);\n  int fixed(Fl_Widget *w) const;\n\nprotected:\n\n  void init(int t = VERTICAL);\n\n  virtual int alloc_size(int size) const;\n\n  void on_remove(int) FL_OVERRIDE;\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  /**\n    Set or reset the request to calculate the layout of children.\n\n    This is intended for internal use but can also be used by user\n    code to request layout calculation before the widget is drawn.\n\n    Call this if you changed attributes or sizes of children to ensure\n    that the layout is calculated properly. Changing other Fl_Flex\n    attributes or resizing the widget does this automatically.\n\n    \\note Never call this with '\\c set == 0' because this would defeat its\n      purpose to recalculate the layout before the widget is drawn.\n  */\n  void need_layout(int set) {\n    if (set) need_layout_ = true;\n    else need_layout_ = false;\n  }\n\n  /**\n    Returns whether layout calculation is required.\n\n    This should rarely be needed by user code. Used internally in draw().\n  */\n  bool need_layout() const {\n    return need_layout_;\n  }\n\n  /** Returns the left margin size of the widget.\n\n    This returns the \\b left margin of the widget which is not necessarily\n    the same as all other margins.\n\n    \\note This method is useful if you never set different margin sizes.\n\n    \\see int margin(int *left, int *top, int *right, int *bottom)\n      to get all four margin values.\n    \\return  size of left margin.\n  */\n  int margin() const { return margin_left_; }\n\n  /** Returns all (four) margin sizes of the widget.\n\n    All margin sizes are returned in the given arguments. If any argument\n    is \\p NULL the respective value is not returned.\n\n    \\param[in]  left    returns left margin if not \\p NULL\n    \\param[in]  top     returns top margin if not \\p NULL\n    \\param[in]  right   returns right margin if not \\p NULL\n    \\param[in]  bottom  returns bottom margin if not \\p NULL\n\n    \\return     whether all margins are equal\n    \\retval  1  all margins have the same size\n    \\retval  0  at least one margin has a different size\n  */\n  int margin(int *left, int *top, int *right, int *bottom) const {\n    if (left) *left = margin_left_;\n    if (top) *top = margin_top_;\n    if (right) *right = margin_right_;\n    if (bottom) *bottom = margin_bottom_;\n    if (margin_left_ == margin_top_ && margin_top_ == margin_right_ && margin_right_ == margin_bottom_)\n      return 1;\n    return 0;\n  }\n\n  /** Set the margin and optionally the gap size of the widget.\n    This method can be used to set both the margin and the gap size.\n\n    If you don't use the second parameter \\p g or supply a negative value\n    the gap size is not changed.\n\n    The margin is the free space inside the widget border \\b around all child widgets.\n\n    This method sets the margin to the same size at all four edges of the Fl_Flex widget.\n\n    The gap size \\p g is the free space \\b between child widgets. Negative values\n    do not change the gap value. This is the default if this argument is omitted.\n\n    \\param[in]    m   margin size, must be \\>= 0\n    \\param[in]    g   gap size (ignored, if negative)\n\n    \\see gap(int)\n  */\n\n  void margin(int m, int g = -1) {\n    if (m < 0)\n      m = 0;\n    margin_left_ = margin_top_ = margin_right_ = margin_bottom_ = m;\n    if (g >= 0)\n      gap_ = g;\n    need_layout(1);\n  }\n\n  /** Set the margin sizes at all four edges of the Fl_Flex widget.\n\n    The margin is the free space inside the widget border \\b around all child widgets.\n\n    You must use all four parameters of this method to set the four margins in the\n    order \\p left, \\p top, \\p right, \\p bottom. Negative values are set to 0 (zero).\n\n    To set all margins to equal sizes, use margin(int m) which sets all four margins\n    to the same size.\n\n    \\param[in]    left,top,right,bottom   margin sizes, must be \\>= 0\n\n    \\see margin(int, int)\n  */\n  void margin(int left, int top, int right, int bottom) {\n    margin_left_   = left < 0 ? 0 : left;\n    margin_top_    = top < 0 ? 0 : top;\n    margin_right_  = right < 0 ? 0 : right;\n    margin_bottom_ = bottom < 0 ? 0 : bottom;\n    need_layout(1);\n  }\n\n  /** Return the gap size of the widget.\n    \\return gap size between all child widgets.\n  */\n  int gap() const {\n    return gap_;\n  }\n\n  /**\n    Set the gap size of the widget.\n\n    The gap size is some free space \\b between child widgets.\n    The size must be \\>= 0. Negative values are clamped to 0.\n\n    \\param[in]  g   gap size\n  */\n  void gap(int g) {\n    gap_ = g < 0 ? 0 : g;\n    need_layout(1);\n  }\n\n  /** Returns non-zero (true) if Fl_Flex alignment is horizontal (row mode).\n\n    \\returns non-zero if Fl_Flex alignment is horizontal\n    \\retval 1   if type() == Fl_Flex::HORIZONTAL\n    \\retval 0   if type() == Fl_Flex::VERTICAL\n\n    See class Fl_Flex documentation for details.\n  */\n  int horizontal() const {\n    return type() == Fl_Flex::HORIZONTAL ? 1 : 0;\n  }\n\n  // Calculate the layout of the widget and redraw it.\n  void layout();\n\n  /**\n    Gets the number of extra pixels of blank space that are added\n    between the children.\n\n    This method is the same as 'int gap()' and is defined to enable\n    using Fl_Flex as a drop-in replacement of Fl_Pack.\n\n    \\see int gap()\n  */\n  int spacing() const {\n    return gap_;\n  }\n\n  /**\n    Sets the number of extra pixels of blank space that are added\n    between the children.\n\n    This method is the same as 'gap(int)' and is defined to enable\n    using Fl_Flex as a drop-in replacement of Fl_Pack.\n\n    \\see void gap(int)\n  */\n  void spacing(int i) {\n    gap(i);\n    need_layout(1);\n  }\n\n};\n\n#endif // Fl_Flex_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Float_Input.H",
    "content": "//\n// Floating point input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2011 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Float_Input widget . */\n\n#ifndef Fl_Float_Input_H\n#define Fl_Float_Input_H\n\n#include \"Fl_Input.H\"\n\n/**\n  The Fl_Float_Input class is a subclass of Fl_Input\n  that only allows the user to type floating point numbers (sign,\n  digits, decimal point, more digits, 'E' or 'e', sign, digits).\n*/\nclass FL_EXPORT Fl_Float_Input : public Fl_Input {\npublic:\n  /**\n    Creates a new Fl_Float_Input widget using the given position,\n    size, and label string. The default boxtype is FL_DOWN_BOX.\n\n    Inherited destructor destroys the widget and any value associated with it.\n  */\n  Fl_Float_Input(int X,int Y,int W,int H,const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_FormsBitmap.H",
    "content": "//\n// Forms bitmap header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_FormsBitmap widget . */\n\n#ifndef Fl_FormsBitmap_H\n#define Fl_FormsBitmap_H\n\n#include \"Fl_Bitmap.H\"\n\n/**\n    Forms compatibility Bitmap Image Widget\n*/\nclass FL_EXPORT Fl_FormsBitmap : public Fl_Widget {\n    Fl_Bitmap *b;\nprotected:\n    void draw() FL_OVERRIDE;\npublic:\n    Fl_FormsBitmap(Fl_Boxtype, int, int, int, int, const char * = 0);\n    void set(int W, int H, const uchar *bits);\n    /** Sets a new bitmap. */\n    void bitmap(Fl_Bitmap *B) {b = B;}\n    /** Gets a the current associated Fl_Bitmap objects. */\n    Fl_Bitmap *bitmap() const {return b;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_FormsPixmap.H",
    "content": "//\n// Forms pixmap header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_FormsPixmap widget . */\n\n#ifndef Fl_FormsPixmap_H\n#define Fl_FormsPixmap_H\n\n#include \"Fl_Pixmap.H\"\n\n/**\n  \\class Fl_FormsPixmap\n  \\brief Forms pixmap drawing routines\n*/\nclass FL_EXPORT Fl_FormsPixmap : public Fl_Widget {\n    Fl_Pixmap *b;\nprotected:\n    void draw() FL_OVERRIDE;\npublic:\n    Fl_FormsPixmap(Fl_Boxtype t, int X, int Y, int W, int H, const char *L= 0);\n\n    void set(/*const*/char * const * bits);\n\n    /**\n      Set the internal pixmap pointer to an existing pixmap.\n      \\param[in] B existing pixmap\n    */\n    void Pixmap(Fl_Pixmap *B) {b = B;}\n\n    /** Get the internal pixmap pointer. */\n    Fl_Pixmap *Pixmap() const {return b;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Free.H",
    "content": "//\n// Forms free header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Free widget . */\n\n#ifndef Fl_Free_H\n#define Fl_Free_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n#define FL_NORMAL_FREE          1 /**< normal event handling */\n#define FL_SLEEPING_FREE        2 /**< deactivate event handling */\n#define FL_INPUT_FREE           3 /**< accepts FL_FOCUS events */\n#define FL_CONTINUOUS_FREE      4 /**< repeated timeout handling */\n#define FL_ALL_FREE             5 /**< FL_INPUT_FREE and FL_CONTINOUS_FREE */\n\n/** appropriate signature for handle function */\ntypedef int (*FL_HANDLEPTR)(Fl_Widget *, int , float, float, char);\n\n/**\n  Emulation of the Forms \"free\" widget.\n\n  This emulation allows the free demo to run, and appears to be useful for\n  porting programs written in Forms which use the free widget or make\n  subclasses of the Forms widgets.\n\n  There are five types of free, which determine when the handle function\n  is called:\n\n  \\li \\c FL_NORMAL_FREE      normal event handling.\n  \\li \\c FL_SLEEPING_FREE    deactivates event handling (widget is inactive).\n  \\li \\c FL_INPUT_FREE       accepts FL_FOCUS events.\n  \\li \\c FL_CONTINUOUS_FREE  sets a timeout callback 100 times a second and\n                             provides an FL_STEP event. This has obvious\n                             detrimental effects on machine performance.\n  \\li \\c FL_ALL_FREE         same as FL_INPUT_FREE and FL_CONTINUOUS_FREE.\n\n*/\nclass FL_EXPORT Fl_Free : public Fl_Widget {\n    FL_HANDLEPTR hfunc;\n    static void step(void *);\nprotected:\n    void draw() FL_OVERRIDE;\npublic:\n    int handle(int e) FL_OVERRIDE;\n  Fl_Free(uchar t,int X,int Y,int W,int H,const char *L,FL_HANDLEPTR hdl);\n  ~Fl_Free();\n};\n\n// old event names for compatibility:\n#define FL_MOUSE        FL_DRAG /**< for backward compatibility */\n#define FL_DRAW         100     /**< for backward compatibility [UNUSED]*/\n#define FL_STEP         101     /**< for backward compatibility */\n#define FL_FREEMEM      102     /**< for backward compatibility [UNUSED]*/\n#define FL_FREEZE       103     /**< for backward compatibility [UNUSED]*/\n#define FL_THAW         104     /**< for backward compatibility [UNUSED]*/\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_GIF_Image.H",
    "content": "//\n// GIF image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_GIF_Image widget . */\n\n#ifndef Fl_GIF_Image_H\n#define Fl_GIF_Image_H\n#  include \"Fl_Pixmap.H\"\n\n/**\n The Fl_GIF_Image class supports loading, caching,\n and drawing of Compuserve GIF<SUP>SM</SUP> images. The class\n loads the first image and supports transparency.\n */\nclass FL_EXPORT Fl_GIF_Image : public Fl_Pixmap {\n\npublic:\n\n  Fl_GIF_Image(const char* filename);\n  // deprecated constructor w/o length (for backwards compatibility)\n  Fl_GIF_Image(const char* imagename, const unsigned char *data);\n  // constructor with length (since 1.4.0)\n  Fl_GIF_Image(const char* imagename, const unsigned char *data, const size_t length);\n\n  static bool is_animated(const char *name_);\n  /** Sets how the shared image core routine should treat animated GIF files.\n   The default is to treat them as ordinary GIF's e.g. it creates a Fl_GIF_Image object.\n   If this variable is set, then an animated GIF object Fl_Anim_GIF_Image is created.\n   */\n  static bool animate;\n\nprotected:\n\n  // Protected constructors needed for animated GIF support through Fl_Anim_GIF_Image.\n  Fl_GIF_Image(const char* filename, bool anim);\n  Fl_GIF_Image(const char* imagename, const unsigned char *data, const size_t length, bool anim);\n  // Protected default constructor needed for Fl_Anim_GIF_Image.\n  Fl_GIF_Image();\n\n  void load_gif_(class Fl_Image_Reader &rdr, bool anim=false);\n\n  void load(const char* filename, bool anim);\n  void load(const char* imagename, const unsigned char *data, const size_t length, bool anim);\n\n  // Internal structure to \"glue\" animated GIF support into Fl_GIF_Image.\n  // This data is passed during decoding to the Fl_Anim_GIF_Image class.\n  struct GIF_FRAME {\n    int ifrm, width, height, x, y, w, h,\n        clrs, bkgd, trans,\n        dispose, delay;\n    const uchar *bptr;\n    const struct CPAL {\n      uchar r, g, b;\n    } *cpal;\n    GIF_FRAME(int frame, uchar *data) : ifrm(frame), bptr(data) {}\n    GIF_FRAME(int frame, int W, int H, int fx, int fy, int fw, int fh, uchar *data) :\n      ifrm(frame), width(W), height(H), x(fx), y(fy), w(fw), h(fh), bptr(data) {}\n    void disposal(int mode, int time) { dispose = mode; this->delay = time; }\n    void colors(int nclrs, int bg, int tp) { clrs = nclrs; bkgd = bg; trans = tp; }\n  };\n\n  // Internal virtual methods, which are called during decoding to pass data\n  // to the Fl_Anim_GIF_Image class.\n  virtual void on_frame_data(GIF_FRAME &) {}\n  virtual void on_extension_data(GIF_FRAME &) {}\n\nprivate:\n\n  void lzw_decode(Fl_Image_Reader &rdr, uchar *Image, int Width, int Height, int CodeSize, int ColorMapSize, int Interlace);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Gl_Window.H",
    "content": "//\n// OpenGL header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Gl_Window widget . */\n\n#ifndef Fl_Gl_Window_H\n#define Fl_Gl_Window_H\n\n#include \"Fl_Window.H\"\n\nclass Fl_Gl_Choice; // structure to hold result of glXChooseVisual\nclass Fl_Gl_Window_Driver;\n/**\n  The Fl_Gl_Window widget sets things up so OpenGL works.\n\n  It also keeps an OpenGL \"context\" for that window, so that changes to the\n  lighting and projection may be reused between redraws. Fl_Gl_Window\n  also flushes the OpenGL streams and swaps buffers after draw() returns.\n\n  OpenGL hardware typically provides some overlay bit planes, which\n  are very useful for drawing UI controls atop your 3D graphics.  If the\n  overlay hardware is not provided, FLTK tries to simulate the overlay.\n  This works pretty well if your graphics are double buffered, but not\n  very well for single-buffered.\n\n  Please note that the FLTK drawing and clipping functions\n  will not work inside an Fl_Gl_Window. All drawing\n  should be done using OpenGL calls exclusively.\n\n  \\see \\ref opengl_highdpi\n\n  \\note FLTK 1.4 introduces a driver system for graphic calls. It is now possible\n  to add a selection of widgets to an OpenGL window. The widgets will draw on top\n  of any OpenGL rendering. The number of supported widgets will increase as the\n  driver development improves. Program test/cube.cxx illustrates how to do that.\n\n  \\note FLTK expects that when an Fl_Gl_Window is a child of a parent Fl_Window,\n  the child window lies entirely inside its parent window. If that's not the case, what\n  happens to the part of the GL subwindow which leaks outside its parent is undefined\n  and susceptible to be platform-specific.\n*/\nclass FL_EXPORT Fl_Gl_Window : public Fl_Window {\n  friend class Fl_Gl_Window_Driver;\n  Fl_Gl_Window_Driver *pGlWindowDriver;\n\n  int mode_;\n  const int *alist;\n  Fl_Gl_Choice *g;\n  GLContext context_;\n  char valid_f_;\n  char damage1_; // damage() of back buffer\n  virtual void draw_overlay();\n  void init();\n\n  void *overlay;\n\n  static int can_do(int, const int *);\n  int mode(int, const int *);\n  static int gl_plugin_linkage();\nprotected:\n  void draw_begin();\n  void draw() FL_OVERRIDE;\n  void draw_end();\n\npublic:\n  void show() FL_OVERRIDE;\n  /** Same as Fl_Window::show(int a, char **b) */\n  void show(int a, char **b) {Fl_Window::show(a,b);}\n  void flush() FL_OVERRIDE;\n  void hide() FL_OVERRIDE;\n  void resize(int,int,int,int) FL_OVERRIDE;\n  int handle(int) FL_OVERRIDE;\n\n  /**\n    Is turned off when FLTK creates a new context for this window or\n    when the window resizes, and is turned on \\e after draw() is called.\n    You can use this inside your draw() method to avoid unnecessarily\n    initializing the OpenGL context. Just do this:\n    \\code\n    void mywindow::draw() {\n     if (!valid()) {\n       glViewport(0,0,pixel_w(),pixel_h());\n       glFrustum(...);\n       ...other initialization...\n     }\n     if (!context_valid()) {\n       ...load textures, etc. ...\n     }\n     ... draw your geometry here ...\n    }\n    \\endcode\n\n    You can turn valid() on by calling valid(1).  You\n    should only do this after fixing the transformation inside a draw()\n    or after make_current().  This is done automatically after\n    draw() returns.\n  */\n  char valid() const {return valid_f_ & 1;}\n  /**\n    See char Fl_Gl_Window::valid() const\n  */\n  void valid(char v) {if (v) valid_f_ |= 1; else valid_f_ &= 0xfe;}\n  void invalidate();\n\n  /**\n    Will only be set if the\n    OpenGL context is created or recreated. It differs from\n    Fl_Gl_Window::valid() which is also set whenever the context\n    changes size.\n  */\n  char context_valid() const {return valid_f_ & 2;}\n  /**\n    See char Fl_Gl_Window::context_valid() const\n  */\n  void context_valid(char v) {if (v) valid_f_ |= 2; else valid_f_ &= 0xfd;}\n\n  /**  Returns non-zero if the hardware supports the given OpenGL mode. */\n  static int can_do(int m) {return can_do(m,0);}\n  /**  Returns non-zero if the hardware supports the given OpenGL mode.\n   \\see Fl_Gl_Window::mode(const int *a) */\n  static int can_do(const int *m) {return can_do(0, m);}\n  /**  Returns non-zero if the hardware supports the current OpenGL mode. */\n  int can_do() {return can_do(mode_,alist);}\n  /** Returns the current OpenGL capabilities of the window.\n   Don't use this if capabilities were set through Fl_Gl_Window::mode(const int *a).\n   */\n  Fl_Mode mode() const {return (Fl_Mode)mode_;}\n  /**\n   Set or change the OpenGL capabilities of the window.  The value can be\n   any of the following OR'd together:\n\n   - \\c FL_RGB - RGB color (not indexed)\n   - \\c FL_RGB8 - RGB color with at least 8 bits of each color\n   - \\c FL_INDEX - Indexed mode\n   - \\c FL_SINGLE - not double buffered\n   - \\c FL_DOUBLE - double buffered\n   - \\c FL_ACCUM - accumulation buffer\n   - \\c FL_ALPHA - alpha channel in color\n   - \\c FL_DEPTH - depth buffer\n   - \\c FL_STENCIL - stencil buffer\n   - \\c FL_MULTISAMPLE - multisample antialiasing\n   - \\c FL_OPENGL3 - use OpenGL version 3.0 or more.\n\n   FL_RGB and FL_SINGLE have a value of zero, so they\n   are \"on\" unless you give FL_INDEX or FL_DOUBLE.\n\n   If the desired combination cannot be done, FLTK will try turning off\n   FL_MULTISAMPLE.  If this also fails the show() will call\n   Fl::error() and not show the window.\n\n   You can change the mode while the window is displayed.  This is most\n   useful for turning double-buffering on and off.  Under X this will\n   cause the old X window to be destroyed and a new one to be created.  If\n   this is a top-level window this will unfortunately also cause the\n   window to blink, raise to the top, and be de-iconized, and the xid()\n   will change, possibly breaking other code.  It is best to make the GL\n   window a child of another window if you wish to do this!\n\n   mode() must not be called within draw() since it\n   changes the current context.\n\n   The FL_OPENGL3 flag is recommended to use OpenGL version 3 or more.\n   This flag is required (not just recommended) if  GL ≥ 3.0 is in use\n   and at least one of these conditions applies:\n   - the program runs on the macOS platform;\n   - the Fl_Gl_Window has child widgets.\n\n   See more details in \\ref opengl3.\n\n   \\version the <tt>FL_OPENGL3</tt> flag appeared in version 1.3.4\n   */\n  int mode(int a) {return mode(a,0);}\n  /** Set the OpenGL capabilities of the window using platform-specific data.\n   \\param a zero-ending array of platform-specific attributes and attribute values\n   <p><b>Unix/Linux platform</b>: attributes are GLX attributes adequate for the 3rd argument of\n   the <tt>glXChooseVisual()</tt> function (e.g., <tt>GLX_DOUBLEBUFFER</tt>, defined by including <GL/glx.h>).\n   \\note What attributes are adequate here is subject to change.\n   The preferred, stable public API is Fl_Gl_Window::mode(int a).\n   <p><b>Windows platform</b>: this member function is of no use.\n   <p><b>Mac OS X platform</b>: attributes belong to the <tt>CGLPixelFormatAttribute</tt> enumeration\n   (defined by including <tt><OpenGL/OpenGL.h></tt>, e.g., <tt>kCGLPFADoubleBuffer</tt>)\n   and may be followed by adequate attribute values.\n   */\n  int mode(const int *a) {return mode(0, a);}\n  /** Returns a pointer to the window's OpenGL rendering context.\n   \\see void context(GLContext c, int destroy_flag)\n  */\n  GLContext context() const {return context_;}\n  void context(GLContext, int destroy_flag = 0);\n  void make_current();\n  void swap_buffers();\n  void swap_interval(int);\n  int swap_interval() const;\n  void ortho();\n\n  int can_do_overlay();\n  void redraw_overlay();\n  void hide_overlay();\n  void make_overlay_current();\n\n  // Note: Doxygen docs in Fl_Widget.H to avoid redundancy.\n  Fl_Gl_Window* as_gl_window() FL_OVERRIDE { return this; }\n  Fl_Gl_Window const* as_gl_window() const FL_OVERRIDE { return this; }\n\n  float pixels_per_unit();\n  /** Gives the window width in OpenGL pixels.\n   When an Fl_Gl_Window is mapped to a HighDPI display, the value given by Fl_Gl_Window::w()\n   which is expressed in FLTK units, may differ from the window width in pixels.\n   Calls to OpenGL functions expecting pixel values (\\em e.g., \\c glViewport) should therefore\n   use pixel_w() rather than w().\n   Method pixel_w() detects when the GUI is rescaled or when the window has been moved\n   between low and high resolution displays and automatically adjusts the returned value.\n   \\version 1.3.4\n   */\n  int pixel_w() { return int(pixels_per_unit() * w() + 0.5f); }\n  /** Gives the window height in OpenGL pixels.\n   When an Fl_Gl_Window is mapped to a HighDPI display, the value given by Fl_Gl_Window::h()\n   which is expressed in FLTK units, may differ from the window height in pixels.\n   Calls to OpenGL functions expecting pixel values (\\em e.g., \\c glViewport) should therefore\n   use pixel_h() rather than h().\n   Method pixel_h() detects when the GUI is rescaled or when the window has been moved\n   between low and high resolution displays and automatically adjusts the returned value.\n   \\version 1.3.4\n   */\n  int pixel_h() { return int(pixels_per_unit() * h() + 0.5f); }\n\n  ~Fl_Gl_Window();\n  /**\n    Creates a new Fl_Gl_Window widget using the given size, and label string.\n    The default boxtype is FL_NO_BOX. The default mode is FL_RGB|FL_DOUBLE|FL_DEPTH.\n  */\n  Fl_Gl_Window(int W, int H, const char *l=0) : Fl_Window(W,H,l) {init();}\n  /**\n    Creates a new Fl_Gl_Window widget using the given position,\n    size, and label string. The default boxtype is FL_NO_BOX. The\n    default mode is FL_RGB|FL_DOUBLE|FL_DEPTH.\n  */\n\n  Fl_Gl_Window(int X, int Y, int W, int H, const char *l=0)\n    : Fl_Window(X,Y,W,H,l) {init();}\n};\n\n#endif // Fl_Gl_Window_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Graphics_Driver.H",
    "content": "//\n// Declaration of classes Fl_Graphics_Driver, Fl_Scalable_Graphics_Driver,\n// and Fl_Font_Descriptor for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2010-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/**\n \\cond DriverDev\n \\addtogroup DriverDeveloper\n \\{\n */\n\n/** \\file Fl_Graphics_Driver.H\n \\brief Declaration of class Fl_Graphics_Driver.\n*/\n\n#ifndef FL_GRAPHICS_DRIVER_H\n#define FL_GRAPHICS_DRIVER_H\n\n#include <FL/Fl_Device.H>\n#include <FL/Fl_Image.H>\n#include <FL/Fl_Bitmap.H>\n#include <FL/Fl_Pixmap.H>\n#include <FL/Fl_RGB_Image.H>\n\nclass Fl_Graphics_Driver;\nclass Fl_Font_Descriptor;\nclass Fl_Image_Surface;\nFL_EXPORT extern Fl_Graphics_Driver *fl_graphics_driver;\n\n/**\n signature of image generation callback function.\n \\param[in]  data  user data passed to function\n \\param[in]  x,y,w position and width of scan line in image\n \\param[out] buf   buffer for generated image data. You must copy \\p w\n pixels from scanline \\p y, starting at pixel \\p x\n to this buffer.\n */\ntypedef void (*Fl_Draw_Image_Cb)(void* data,int x,int y,int w,uchar* buf);\n\nstruct Fl_Fontdesc;\ntypedef struct _PangoFontDescription PangoFontDescription;\n\n// FIXME: The following constants are deprecated and will be removed in FLTK 1.5.0\n// in favor of dynamic clipping stack allocation. This needs C++11 features.\n// See issue #1139: \"FL_REGION_STACK_SIZE could be increased\"\n// and issue #1140: \"Fix static array allocation\".\n\n#if FL_ABI_VERSION >= 10401\n# define FL_REGION_STACK_SIZE 64\n#else\n# define FL_REGION_STACK_SIZE 10\n#endif\n\n#define FL_MATRIX_STACK_SIZE 32\n\n/**\n An abstract class subclassed for each graphics driver FLTK uses.\n Typically, FLTK applications do not use directly objects from this class. Rather, they perform\n drawing operations (e.g., fl_rectf()) that operate on the current drawing surface (see Fl_Surface_Device).\n Drawing operations are functionally presented in \\ref drawing and as function lists\n in the \\ref fl_drawings and \\ref fl_attributes modules.\n\n <tt>Fl_Surface_Device::surface()->driver()</tt>\n gives at any time the graphics driver used by all drawing operations.\n For compatibility with older FLTK versions, the \\ref fl_graphics_driver global variable gives the same result.\n Its value changes when\n drawing operations are directed to another drawing surface by Fl_Surface_Device::push_current() /\n Fl_Surface_Device::pop_current() / Fl_Surface_Device::set_current().\n\n The Fl_Graphics_Driver class is essential for developers of the FLTK library.\n Each platform supported by FLTK requires to create a derived class of Fl_Graphics_Driver that\n implements all its virtual member functions according to the platform.\n */\nclass FL_EXPORT Fl_Graphics_Driver {\n  friend class Fl_Surface_Device;\n  friend class Fl_Pixmap;\n  friend class Fl_Bitmap;\n  friend class Fl_RGB_Image;\n  friend class Fl_SVG_Image;\n  friend void fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L);\n  friend void fl_draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D, int L);\n  friend void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);\n  friend void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);\n  friend void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);\n  friend int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg);\n  friend FL_EXPORT int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg);\n  friend FL_EXPORT void gl_start();\n  /* ============== Implementation note about image drawing =========================\n   A graphics driver can implement up to 6 virtual member functions to draw images:\n   virtual void draw_pixmap(Fl_Pixmap *pxm,int XP, int YP, int WP, int HP, int cx, int cy)\n   virtual void draw_bitmap(Fl_Bitmap *bm,int XP, int YP, int WP, int HP, int cx, int cy)\n   virtual void draw_rgb(Fl_RGB_Image *rgb,int XP, int YP, int WP, int HP, int cx, int cy)\nand\n   virtual void draw_fixed(Fl_Pixmap *pxm,int XP, int YP, int WP, int HP, int cx, int cy)\n   virtual void draw_fixed(Fl_Bitmap *bm,int XP, int YP, int WP, int HP, int cx, int cy)\n   virtual void draw_fixed(Fl_RGB_Image *rgb,int XP, int YP, int WP, int HP, int cx, int cy)\n   - The 1st group of functions is used when the driver can directly map the image data,\n   sized at data_w() x data_h(), to the image drawing area, sized at w()*scale x h()*scale\n   where scale is the current GUI scale factor.\n   - If the driver does not support such scale-and-draw operation for a given image type,\n   it should implement the draw_fixed() function which is called by the library after the\n   image has been internally resized to the drawing size and cached.\n   - The platform-independent Fl_Graphics_Driver class implements the 1st group of functions.\n   Each resizes the image, caches it, and calls the platform-specific implementation of\n   draw_fixed(image-class *,....) with the cached image.\n   - Consider an image object, say from class Fl_RGB_Image. Fl_RGB_Image::draw()\n   calls the virtual member function draw_rgb(Fl_RGB_Image *,....). If Fl_XXX_Graphics_Driver\n   re-implements this function, this code runs and is expected to draw the image\n   adequately scaled to its drawing size. If Fl_XXX_Graphics_Driver does not re-implement\n   this function, Fl_Graphics_Driver::draw_rgb(Fl_RGB_Image *,....) runs. It internally\n   resizes the image, caches it, and calls Fl_XXX_Graphics_Driver::draw_fixed(Fl_RGB_Image *,....)\n   that draws the image from its cached form which already has the adequate size.\n   - Some drivers implement, for a given image class, only the function of the 1st group or\n   only draw_fixed() as in these examples:\n   - Fl_Quartz_Graphics_Driver implements only draw_rgb(Fl_RGB_Image *,....) because it\n   can perform the scale-and-draw operation whatever the RGB image and the required scaling.\n   - Fl_Xlib_Graphics_Driver implements only draw_fixed(Fl_Pixmap *,....). The library\n   takes care of resizing and caching the Pixmap to the adequate drawing size.\n   - Some drivers implement, for a given image class, the function of both groups, e.g. :\n   Fl_GDI_Graphics_Driver implements both draw_rgb(Fl_RGB_Image *,....) and\n   draw_fixed(Fl_RGB_Image *,....) because scale-and-draw may require function Alphablend()\n   from MSIMG32.DLL. In the absence of that, the draw_rgb() implementation calls\n   Fl_Graphics_Driver::draw_rgb() which runs Fl_GDI_Graphics_Driver::draw_fixed(Fl_RGB_Image*,...).\n\n   Graphics drivers also implement cache(Fl_Pixmap*), cache(Fl_Bitmap*) and cache(Fl_RGB_Image*)\n   to compute the cached form of all image types, and uncache(Fl_RGB_Image *,...),\n   uncache_pixmap(fl_uintptr_t) and delete_bitmask(fl_uintptr_t) to destroy cached image forms.\n   Graphics drivers that use the mask_ variable of class Fl_Pixmap to cache an Fl_Pixmap\n   object also reimplement the uchar **Fl_Graphics_Driver::mask_bitmap() member function.\n   */\nprivate:\n  virtual void draw_fixed(Fl_Pixmap *pxm,int XP, int YP, int WP, int HP, int cx, int cy);\n  virtual void draw_fixed(Fl_Bitmap *bm,int XP, int YP, int WP, int HP, int cx, int cy);\n  virtual void draw_fixed(Fl_RGB_Image *rgb,int XP, int YP, int WP, int HP, int cx, int cy);\n  // the default implementation of make_unused_color_() is most probably enough\n  virtual void make_unused_color_(unsigned char &r, unsigned char &g, unsigned char &b, int color_count, void **data);\n  // some platforms may need to reimplement this\n  virtual void set_current_();\n  void draw_image_general_(const uchar *buf, int X, int Y, int W, int H, int D, int L);\n  void draw_image_mono_general_(const uchar *buf, int X, int Y, int W, int H, int D, int L);\n  float scale_; // scale between FLTK and drawing coordinates: drawing = FLTK * scale_\npublic:\n  /** Creates the graphics driver that is used for core operations. */\n  static Fl_Graphics_Driver *newMainGraphicsDriver();\n  /** A 2D coordinate transformation matrix */\n  struct matrix {double a, b, c, d, x, y;};\n  /** Features that a derived class may possess.  */\n  typedef enum {\n    NATIVE = 1, /**< native graphics driver for the platform */\n    PRINTER = 2 /**< graphics driver for a printer drawing surface */\n  } driver_feature;\n\nprotected:\n  int fl_clip_state_number; ///< For internal use by FLTK\n  static const matrix m0; ///< For internal use by FLTK\n  Fl_Font font_; ///< current font\n  Fl_Fontsize size_; ///< current font size\n  Fl_Color color_; ///< current color\n  int sptr;///< For internal use by FLTK\n  static const int matrix_stack_size = FL_MATRIX_STACK_SIZE; ///< For internal use by FLTK\n  matrix stack[FL_MATRIX_STACK_SIZE]; ///< For internal use by FLTK\n  matrix m; ///< current transformation matrix\n  int n; ///< For internal use by FLTK\n  int gap_; ///< For internal use by FLTK\n  enum SHAPE {NONE=0, LINE, LOOP, POLYGON, POINTS, COMPLEX_POLYGON} what;\n  int rstackptr; ///< For internal use by FLTK\n  static const int region_stack_max = FL_REGION_STACK_SIZE - 1; ///< For internal use by FLTK\n  Fl_Region rstack[FL_REGION_STACK_SIZE]; ///< For internal use by FLTK\n  Fl_Font_Descriptor *font_descriptor_; ///< For internal use by FLTK\n  int p_size;\n  typedef struct { float x; float y; } XPOINT;\n  XPOINT *xpoint;\n  virtual void global_gc();\n  virtual void cache(Fl_Pixmap *img);\n  virtual void cache(Fl_Bitmap *img);\n  virtual void cache(Fl_RGB_Image *img);\n  virtual void uncache(Fl_RGB_Image *img, fl_uintptr_t &id_, fl_uintptr_t &mask_);\n  // --- implementation is in src/drivers/xxx/Fl_xxx_Graphics_Driver_image.cxx\n  virtual void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);\n  virtual void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);\n  virtual void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);\n  virtual void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);\n  virtual void draw_rgb(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy);\n  virtual void draw_pixmap(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy);\n  virtual void draw_bitmap(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy);\n  virtual void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);\n\n  /** For internal library use only */\n  static void change_image_size(Fl_Image *img, int W, int H) {\n    img->w(W);\n    img->h(H);\n  }\n  // Support function for image drawing\n  virtual void uncache_pixmap(fl_uintptr_t p);\n  // accessor functions to protected image members\n  int start_image(Fl_Image *img, int XP, int YP, int WP, int HP, int &cx, int &cy,\n                int &X, int &Y, int &W, int &H);\n  /** Accessor to a private member variable of Fl_RGB_Image */\n  static fl_uintptr_t* id(Fl_RGB_Image *rgb) {return &(rgb->id_);}\n  /** Accessor to a private member variable of Fl_Pixmap */\n  static fl_uintptr_t* id(Fl_Pixmap *pm) {return &(pm->id_);}\n  /** Accessor to a private member variable of Fl_Bitmap */\n  static fl_uintptr_t* id(Fl_Bitmap *bm) {return &(bm->id_);}\n  /** Accessor to a private member variable of Fl_RGB_Image */\n  static fl_uintptr_t* mask(Fl_RGB_Image *rgb) {return &(rgb->mask_);}\n  /** Accessor to a private member variable of Fl_Pixmap */\n  static fl_uintptr_t* mask(Fl_Pixmap *pm) {return &(pm->mask_);}\n  /** Accessor to private member variables of Fl_Pixmap */\n  static void cache_w_h(Fl_Pixmap *pm, int*& pwidth, int*& pheight) {\n    pwidth = &(pm->cache_w_);\n    pheight = &(pm->cache_h_);\n  }\n  /** Accessor to private member variables of Fl_Bitmap */\n  static void cache_w_h(Fl_Bitmap *bm, int*& pwidth, int*& pheight) {\n    pwidth = &(bm->cache_w_);\n    pheight = &(bm->cache_h_);\n  }\n  /** Accessor to private member variables of Fl_RGB_Image */\n  static void cache_w_h(Fl_RGB_Image *rgb, int*& pwidth, int*& pheight) {\n    pwidth = &(rgb->cache_w_);\n    pheight = &(rgb->cache_h_);\n  }\n  static Fl_Offscreen get_offscreen_and_delete_image_surface(Fl_Image_Surface*);\n  /** For internal library use only */\n  static void draw_empty(Fl_Image* img, int X, int Y) {img->draw_empty(X, Y);}\n\n  Fl_Graphics_Driver();\n  virtual void cache_size(Fl_Image *img, int &width, int &height);\n  void cache_size_finalize(Fl_Image *img, int &width, int &height);\n  static unsigned need_pixmap_bg_color;\npublic:\n  virtual ~Fl_Graphics_Driver();\n  static Fl_Graphics_Driver &default_driver();\n  // support of \"complex shapes\"\n  void push_matrix();\n  void pop_matrix();\n  void load_identity();\n  void load_matrix(double a, double b, double c, double d, double x, double y);\n  void mult_matrix(double a, double b, double c, double d, double x, double y);\n  void rotate(double d);\n  void translate(double x,double y);\n  double transform_x(double x, double y);\n  double transform_y(double x, double y);\n  double transform_dx(double x, double y);\n  double transform_dy(double x, double y);\n  /** Return the current Fl_Font_Descriptor */\n  inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}\n  /** Set the current Fl_Font_Descriptor */\n  inline void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}\n  /** Current scale factor between FLTK and drawing units: drawing = FLTK * scale() */\n  float scale() { return scale_; }\n  /** Sets the current value of the scaling factor */\n  virtual void scale(float f);\n  /** Return whether the graphics driver can do alpha blending */\n  virtual char can_do_alpha_blending();\n  virtual void point(int x, int y);\n  virtual void rect(int x, int y, int w, int h);\n  virtual void focus_rect(int x, int y, int w, int h);\n  virtual void rectf(int x, int y, int w, int h);\n  virtual void _rbox(int fill, int x, int y, int w, int h, int r);\n  virtual void rounded_rect(int x, int y, int w, int h, int r);\n  virtual void rounded_rectf(int x, int y, int w, int h, int r);\n  // the default implementation is most likely enough\n  virtual void colored_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b);\n  virtual void line(int x, int y, int x1, int y1);\n  /** see fl_line(int, int, int, int, int, int) */\n  virtual void line(int x, int y, int x1, int y1, int x2, int y2);\n  /** see fl_xyline(int, int, int) */\n  virtual void xyline(int x, int y, int x1);\n  /** see fl_xyline(int, int, int, int) */\n  virtual void xyline(int x, int y, int x1, int y2);\n  /** see fl_xyline(int, int, int, int, int) */\n  virtual void xyline(int x, int y, int x1, int y2, int x3);\n  /** see fl_yxline(int, int, int) */\n  virtual void yxline(int x, int y, int y1);\n  /** see fl_yxline(int, int, int, int) */\n  virtual void yxline(int x, int y, int y1, int x2);\n  /** see fl_yxline(int, int, int, int, int) */\n  virtual void yxline(int x, int y, int y1, int x2, int y3);\n  /** see fl_loop(int, int, int, int, int, int) */\n  virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2);\n  /** see fl_loop(int, int, int, int, int, int, int, int) */\n  virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);\n  virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2);\n  /** see fl_polygon(int, int, int, int, int, int, int, int) */\n  virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);\n  // --- clipping\n  virtual void push_clip(int x, int y, int w, int h);\n  virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);\n  virtual int not_clipped(int x, int y, int w, int h);\n  /** see fl_push_no_clip() */\n  virtual void push_no_clip();                  // has default implementation\n  /** see fl_pop_clip() */\n  virtual void pop_clip();                      // has default implementation\n  virtual Fl_Region clip_region();              // has default implementation\n  virtual void clip_region(Fl_Region r);        // has default implementation\n  virtual void restore_clip();\n  virtual void begin_points();\n  virtual void begin_line();\n  virtual void begin_loop();\n  virtual void begin_polygon();\n  virtual void begin_complex_polygon();\n  virtual void transformed_vertex(double xf, double yf);\n  virtual void transformed_vertex0(float x, float y);\n  virtual void vertex(double x, double y);\n  virtual void end_points();\n  virtual void end_line();\n  virtual void end_loop();\n  virtual void fixloop();\n  virtual void end_polygon();\n  virtual void end_complex_polygon();\n  // default implementation is most probably enough\n  virtual bool can_fill_non_convex_polygon() { return true; }\n  virtual void gap();\n  virtual void circle(double x, double y, double r);\n  virtual void arc(double x, double y, double r, double start, double end);\n  virtual void arc(int x, int y, int w, int h, double a1, double a2);\n  virtual void pie(int x, int y, int w, int h, double a1, double a2);\n  // To support fl_draw_circle(int x, int y, int d, Fl_Color color),\n  // the default implementation is most probably enough.\n  virtual void draw_circle(int x, int y, int d, Fl_Color c);\n  virtual void curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3);\n  virtual void line_style(int style, int width=0, char* dashes=0);\n  virtual void color(Fl_Color c);\n  virtual void set_color(Fl_Color i, unsigned int c);\n  virtual void free_color(Fl_Color i, int overlay);\n  virtual Fl_Color color();\n  virtual void color(uchar r, uchar g, uchar b);\n  virtual void draw(const char *str, int nChars, int x, int y);\n  virtual void draw(const char *str, int nChars, float x, float y);\n  virtual void draw(int angle, const char *str, int nChars, int x, int y);\n  virtual void rtl_draw(const char *str, int nChars, int x, int y);\n  virtual int has_feature(driver_feature feature);\n  virtual void font(Fl_Font face, Fl_Fontsize fsize);\n  virtual Fl_Font font();\n  virtual Fl_Fontsize size();\n  virtual double width(const char *str, int nChars);\n  virtual double width(unsigned int c);\n  virtual void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);\n  virtual int height();\n  virtual int descent();\n  virtual void gc(void*);\n  virtual void *gc(void);\n  virtual uchar **mask_bitmap();\n  // default implementation may be enough\n  virtual float scale_font_for_PostScript(Fl_Font_Descriptor *desc, int s);\n  // default implementation may be enough\n  virtual float scale_bitmap_for_PostScript();\n  // each platform implements these 3 functions its own way\n  virtual void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h);\n  virtual Fl_Region XRectangleRegion(int x, int y, int w, int h);\n  virtual void XDestroyRegion(Fl_Region r);\n  virtual const char* get_font_name(Fl_Font fnum, int* ap);\n  virtual int get_font_sizes(Fl_Font fnum, int*& sizep);\n  virtual Fl_Font set_fonts(const char *name);\n  virtual Fl_Fontdesc* calc_fl_fonts(void);\n  virtual unsigned font_desc_size();\n  virtual const char *font_name(int num);\n  virtual void font_name(int num, const char *name);\n  // Defaut implementation may be enough\n  virtual void overlay_rect(int x, int y, int w , int h);\n  virtual float override_scale();\n  virtual void restore_scale(float);\n  virtual PangoFontDescription* pango_font_description() { return NULL; }\n  virtual void antialias(int state);\n  virtual int antialias();\n  virtual void delete_bitmask(fl_uintptr_t bm);\n};\n\n#ifndef FL_DOXYGEN\n\n/* This class is not part of FLTK's public API.\n Platforms usually define a derived class called Fl_XXX_Font_Descriptor\n containing extra platform-specific data/functions.\n This is a class for an actual system font, with junk to\n help choose it and info on character sizes.  Each Fl_Fontdesc has a\n linked list of these.  These are created the first time each system\n font/size combination is used.\n */\nclass Fl_Font_Descriptor {\npublic:\n  /** linked list for this Fl_Fontdesc */\n  Fl_Font_Descriptor *next;\n  Fl_Fontsize size; /**< font size */\n  Fl_Font_Descriptor(const char* fontname, Fl_Fontsize size);\n  virtual FL_EXPORT ~Fl_Font_Descriptor() {}\n  int ascent, descent;\n  unsigned int listbase;// base of display list, 0 = none\n};\n\n// This struct is not part of FLTK's public API.\nstruct Fl_Fontdesc {\n  const char *name;\n  char fontname[128];  // \"Pretty\" font name\n  Fl_Font_Descriptor *first;  // linked list of sizes of this style\n};\n\n/* Abstract class Fl_Scalable_Graphics_Driver is platform-independent.\n It supports the scaling of all graphics coordinates by a\n float factor helpful to support HiDPI displays.\n This class does :\n - compute scaled coordinates\n - scale the cached offscreen of image objects\n - scale the pixel arrays used when performing direct image draws\n - call the member functions of a platform-specific,\n Fl_Scalable_Graphics_Driver-derived class that do the drawings with adequately\n scaled coordinates. The member functions are named with the _unscaled suffix.\n - scale and unscale the clipping region.\n\n This class is presently used by the X11 and Windows platforms to support HiDPI displays.\n In the future, it may also be used by other platforms.\n */\nclass FL_EXPORT Fl_Scalable_Graphics_Driver : public Fl_Graphics_Driver {\n  Fl_Fontsize fontsize_; // scale-independent font size value\npublic:\n  Fl_Scalable_Graphics_Driver();\n  static int floor(int x, float s);\n  inline int floor(int x) { return Fl_Scalable_Graphics_Driver::floor(x, scale()); }\nprotected:\n  int line_width_;\n  virtual Fl_Region scale_clip(float f);\n  void unscale_clip(Fl_Region r);\n  void point(int x, int y) FL_OVERRIDE;\n  virtual void point_unscaled(float x, float y);\n  void rect(int x, int y, int w, int h) FL_OVERRIDE;\n  void rectf(int x, int y, int w, int h) FL_OVERRIDE;\n  virtual void rect_unscaled(int x, int y, int w, int h);\n  virtual void rectf_unscaled(int x, int y, int w, int h);\n  void line(int x, int y, int x1, int y1) FL_OVERRIDE;\n  virtual void line_unscaled(int x, int y, int x1, int y1);\n  void line(int x, int y, int x1, int y1, int x2, int y2) FL_OVERRIDE;\n  virtual void line_unscaled(int x, int y, int x1, int y1, int x2, int y2);\n  void xyline(int x, int y, int x1) FL_OVERRIDE;\n  virtual void xyline_unscaled(int x, int y, int x1);\n  void xyline(int x, int y, int x1, int y2) FL_OVERRIDE {Fl_Graphics_Driver::xyline(x, y, x1, y2);}\n  void xyline(int x, int y, int x1, int y2, int x3) FL_OVERRIDE {Fl_Graphics_Driver::xyline(x, y, x1, y2, x3);}\n  void yxline(int x, int y, int y1) FL_OVERRIDE;\n  virtual void yxline_unscaled(int x, int y, int y1);\n  void yxline(int x, int y, int y1, int x2) FL_OVERRIDE {Fl_Graphics_Driver::yxline(x, y, y1, x2);}\n  void yxline(int x, int y, int y1, int x2, int y3) FL_OVERRIDE {Fl_Graphics_Driver::yxline(x, y, y1, x2, y3);}\n  void loop(int x0, int y0, int x1, int y1, int x2, int y2) FL_OVERRIDE;\n  virtual void loop_unscaled(int x0, int y0, int x1, int y1, int x2, int y2);\n  void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) FL_OVERRIDE;\n  virtual void loop_unscaled(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);\n  void polygon(int x0, int y0, int x1, int y1, int x2, int y2) FL_OVERRIDE;\n  virtual void polygon_unscaled(int x0, int y0, int x1, int y1, int x2, int y2);\n  void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) FL_OVERRIDE;\n  virtual void polygon_unscaled(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);\n  void circle(double x, double y, double r) FL_OVERRIDE;\n  virtual void ellipse_unscaled(double xt, double yt, double rx, double ry);\n  void font(Fl_Font face, Fl_Fontsize size) FL_OVERRIDE;\n  Fl_Font font() FL_OVERRIDE;\n  virtual void font_unscaled(Fl_Font face, Fl_Fontsize size);\n  double width(const char *str, int n) FL_OVERRIDE;\n  double width(unsigned int c) FL_OVERRIDE;\n  virtual double width_unscaled(const char *str, int n);\n  virtual double width_unscaled(unsigned int c);\n  Fl_Fontsize size() FL_OVERRIDE;\n  virtual Fl_Fontsize size_unscaled();\n  void text_extents(const char *str, int n, int &dx, int &dy, int &w, int &h) FL_OVERRIDE;\n  virtual void text_extents_unscaled(const char *str, int n, int &dx, int &dy, int &w, int &h);\n  int height() FL_OVERRIDE;\n  int descent() FL_OVERRIDE;\n  virtual int height_unscaled();\n  virtual int descent_unscaled();\n  void draw(const char *str, int n, int x, int y) FL_OVERRIDE;\n  virtual void draw_unscaled(const char *str, int n, int x, int y);\n  void draw(int angle, const char *str, int n, int x, int y) FL_OVERRIDE;\n  virtual void draw_unscaled(int angle, const char *str, int n, int x, int y);\n  void draw(const char *str, int nChars, float x, float y) FL_OVERRIDE;\n  void rtl_draw(const char* str, int n, int x, int y) FL_OVERRIDE;\n  virtual void rtl_draw_unscaled(const char* str, int n, int x, int y);\n  void arc(double x, double y, double r, double start, double end) FL_OVERRIDE;\n  void arc(int x, int y, int w, int h, double a1, double a2) FL_OVERRIDE;\n  virtual void arc_unscaled(int x, int y, int w, int h, double a1, double a2);\n  void pie(int x, int y, int w, int h, double a1, double a2) FL_OVERRIDE;\n  virtual void pie_unscaled(int x, int y, int w, int h, double a1, double a2);\n  void draw_circle(int x, int y, int d, Fl_Color c) FL_OVERRIDE;\n  void line_style(int style, int width=0, char* dashes=0) FL_OVERRIDE;\n  virtual void line_style_unscaled(int style, int width, char* dashes);\n  void draw_image_rescale(void *buf, Fl_Draw_Image_Cb cb, int X, int Y, int W, int H, int D, int L, bool mono);\n  virtual void draw_image_unscaled(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);\n  virtual void draw_image_unscaled(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);\n  void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0) FL_OVERRIDE;\n  void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3) FL_OVERRIDE;\n  virtual void draw_image_mono_unscaled(const uchar* buf, int x, int y, int w, int h, int d, int l);\n  void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0) FL_OVERRIDE;\n  virtual void draw_image_mono_unscaled(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1);\n  void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1) FL_OVERRIDE;\n\n  void transformed_vertex(double xf, double yf) FL_OVERRIDE;\n  void vertex(double x, double y) FL_OVERRIDE;\n  float override_scale() FL_OVERRIDE;\n  void restore_scale(float) FL_OVERRIDE;\n  virtual void *change_pen_width(int lwidth);\n  virtual void reset_pen_width(void *data);\n};\n#endif // FL_DOXYGEN\n\n#endif // FL_GRAPHICS_DRIVER_H\n\n/**\n \\}\n \\endcond\n */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Grid.H",
    "content": "//\n// Fl_Grid widget header for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2021-2022 by Albrecht Schlosser.\n// Copyright 2022-2025 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef _FL_FL_GRID_H_\n#define _FL_FL_GRID_H_\n\n/** \\file FL/Fl_Grid.H\n  Fl_Grid container widget.\n*/\n\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Rect.H>\n\n/** Fl_Grid type for child widget alignment control. */\ntypedef unsigned short Fl_Grid_Align;\n\n/** Align the widget in the middle of the cell (default). */\nconst Fl_Grid_Align  FL_GRID_CENTER          = 0x0000;\n\n/** Align the widget at the top of the cell. */\nconst Fl_Grid_Align  FL_GRID_TOP             = 0x0001;\n\n/** Align the widget at the bottom of the cell. */\nconst Fl_Grid_Align  FL_GRID_BOTTOM          = 0x0002;\n\n/** Align the widget at the left side of the cell. */\nconst Fl_Grid_Align  FL_GRID_LEFT            = 0x0004;\n\n/** Align the widget at the right side of the cell. */\nconst Fl_Grid_Align  FL_GRID_RIGHT           = 0x0008;\n\n/** Stretch the widget horizontally to fill the cell. */\nconst Fl_Grid_Align  FL_GRID_HORIZONTAL      = 0x0010;\n\n/** Stretch the widget vertically to fill the cell. */\nconst Fl_Grid_Align  FL_GRID_VERTICAL        = 0x0020;\n\n/** Stretch the widget in both directions to fill the cell. */\nconst Fl_Grid_Align  FL_GRID_FILL            = 0x0030;\n\n/** Stretch the widget proportionally. */\nconst Fl_Grid_Align  FL_GRID_PROPORTIONAL    = 0x0040;\n\nconst Fl_Grid_Align  FL_GRID_TOP_LEFT        =  FL_GRID_TOP |  FL_GRID_LEFT;\nconst Fl_Grid_Align  FL_GRID_TOP_RIGHT       =  FL_GRID_TOP |  FL_GRID_RIGHT;\nconst Fl_Grid_Align  FL_GRID_BOTTOM_LEFT     =  FL_GRID_BOTTOM |  FL_GRID_LEFT;\nconst Fl_Grid_Align  FL_GRID_BOTTOM_RIGHT    =  FL_GRID_BOTTOM |  FL_GRID_RIGHT;\n\n/**\n  Fl_Grid is a container (layout) widget with multiple columns and rows.\n\n  This container widget features very flexible layouts in columns and rows\n  w/o the need to position each child widget in x/y coordinates.\n\n  Widgets are assigned to grid cells (column, row) with their minimal sizes\n  in \\p w() and \\p h(). The \\p x() and \\p y() positions are ignored and can\n  be (0, 0). Fl_Grid calculates widget positions and resizes the widgets to\n  fit into the grid. It is possible to create a single row or column of\n  widgets with Fl_Grid.\n\n  You should design your grid with the smallest possible sizes of all widgets\n  in mind. Fl_Grid will automatically assign additional space to cells\n  according to some rules (described later) when resizing the Fl_Grid widget.\n\n  \\b Hint: You should set a minimum window size to make sure the Fl_Grid is\n    never resized below its minimal sizes. Resizing below the given widget\n    sizes results in undefined behavior.\n\n  Fl_Grid and other container widgets (e.g. Fl_Group) can be nested. One main\n  advantage of this usage is that widget coordinates in embedded Fl_Group\n  widgets become relative to the group and will be positioned as expected.\n  \\todo This (relative group coordinates of nested groups of Fl_Grid)\n    needs explanation and maybe an example.\n\n  Fl_Grid child widgets are handled by its base class Fl_Group but Fl_Grid\n  stores additional data corresponding to each widget in internal grid cells.\n\n  Fl_Grid children are allowed to span multiple columns and rows like HTML\n  \\<table\\> cells. Individual children can have fixed sizes or be aligned\n  inside their cells (left, right, top, bottom, and more) and/or follow\n  their cell sizes when the Fl_Grid container is resized.\n\n  Note to resizing: since Fl_Grid uses its own layout algorithm the normal\n  Fl_Group::resizable() widget is ignored (if set). Calling init_sizes()\n  is not necessary.\n\n  \\note Fl_Grid is, as of FLTK 1.4.x, still in experimental state and should\n    be used with caution. The API can still be changed although it is assumed\n    to be almost stable - as stable as possible for a first release.\n\n  Example: Simple 3x3 Fl_Grid with five buttons:\n  \\n\n  \\code\n  #include <FL/Fl.H>\n  #include <FL/Fl_Double_Window.H>\n  #include <FL/Fl_Grid.H>\n  #include <FL/Fl_Button.H>\n\n  int main(int argc, char **argv) {\n    Fl_Double_Window *win = new Fl_Double_Window(320, 180, \"3x3 Fl_Grid with Buttons\");\n    // create the Fl_Grid container with five buttons\n    Fl_Grid *grid = new Fl_Grid(0, 0, win->w(), win->h());\n    grid->layout(3, 3, 10, 10);\n    grid->color(FL_WHITE);\n    Fl_Button *b0 = new Fl_Button(0, 0, 0, 0, \"New\");\n    Fl_Button *b1 = new Fl_Button(0, 0, 0, 0, \"Options\");\n    Fl_Button *b3 = new Fl_Button(0, 0, 0, 0, \"About\");\n    Fl_Button *b4 = new Fl_Button(0, 0, 0, 0, \"Help\");\n    Fl_Button *b6 = new Fl_Button(0, 0, 0, 0, \"Quit\");\n    // assign buttons to grid positions\n    grid->widget(b0, 0, 0);\n    grid->widget(b1, 0, 2);\n    grid->widget(b3, 1, 1);\n    grid->widget(b4, 2, 0);\n    grid->widget(b6, 2, 2);\n    grid->show_grid(0);     // 1 to display grid helper lines\n    grid->end();\n    win->end();\n    win->resizable(grid);\n    win->size_range(300, 100);\n    win->show(argc, argv);\n    return Fl::run();\n  }\n  \\endcode\n\n  \\image html  Fl_Grid.png\n  \\image latex Fl_Grid.png \"Simple 3x3 Fl_Grid\" width=7cm\n\n  \\image html  Fl_Grid_show_grid_1.png\n  \\image latex Fl_Grid_show_grid_1.png \"show_grid() set to 1\" width=7cm\n\n*/\nclass FL_EXPORT Fl_Grid : public Fl_Group {\n  friend class Fl_Grid_Type;\n\npublic:\n  class Cell {\n    friend class Fl_Grid;\n  private:\n    Cell *next_;                // next cell in the same row\n    short row_;                 // row number\n    short col_;                 // column number\n    short rowspan_;             // row span (1 - n)\n    short colspan_;             // column span (1 - n)\n    Fl_Grid_Align align_;       // widget alignment in its cell\n    Fl_Widget *widget_;         // assigned widget\n    int w_;                     // minimal widget width\n    int h_;                     // minimal widget height\n\n  public:\n\n    void Cell_() {              // common initialization\n      next_ = NULL;\n      row_ = 0;\n      col_ = 0;\n      rowspan_ = 1;\n      colspan_ = 1;\n      widget_ = NULL;\n      w_ = 0;\n      h_ = 0;\n      align_ = 0;\n    }\n\n    Cell(int row, int col) {    // constructor\n      Cell_();\n      row_ = row;\n      col_ = col;\n    }\n\n    Cell(Fl_Widget *w, int row, int col) {  // widget assignment\n      Cell_();\n      widget_ = w;\n      row_ = row;\n      col_ = col;\n    }\n\n    /**\n      The destructor deletes the cell.\n\n      \\todo Fl_Grid's cell destructor should remove the cell from the grid.\n            Currently it does nothing!\n    */\n    ~Cell() {}\n\n    /**\n      Returns the next widget cell of the same row of this cell.\n    */\n    Cell *next() {\n      return next_;\n    }\n\n    /**\n      Sets the \\c next pointer of a grid's cell.\n\n      \\b Internal use only!\n\n      Do not use this method, it may corrupt the allocated memory.\n\n      \\internal\n        This method is public due to issue #937 but should be private or\n        at least protected. For more info see GitHub issue #937.\n    */\n    void next(Cell *c) {\n      next_ = c;\n    }\n\n    Fl_Widget *widget() const { return widget_; }\n\n    short row() const { return row_; }\n    short col() const { return col_; }\n\n    void rowspan(short v) { rowspan_ = v; }\n    void colspan(short v) { colspan_ = v; }\n    short rowspan() const { return rowspan_; }\n    short colspan() const { return colspan_; }\n\n    void align(Fl_Grid_Align align) { align_ = align; }\n    Fl_Grid_Align align() const { return align_; }\n\n    void minimum_size(int w, int h) { if (w>=0) w_ = w; if (h>=0) h_ = h; }\n    void minimum_size(int *w, int *h) const { if (w) *w = w_; if (h) *h = h_; }\n  }; // class Cell\n\nprivate:\n  class Row;\n  class Col;\n  short rows_;\n  short cols_;\n\n  short margin_left_;         // left margin\n  short margin_top_;          // top margin\n  short margin_right_;        // right margin\n  short margin_bottom_;       // bottom margin\n  short gap_row_;             // gap between rows\n  short gap_col_;             // gap between columns\n  Fl_Rect old_size;           // only for resize callback (TBD)\n  Col  *Cols_;                // array of columns\n  Row  *Rows_;                // array of rows\n  bool need_layout_;          // true if layout needs to be calculated\n\nprotected:\n  Fl_Color grid_color;        // color for drawing the grid lines (design helper)\n  bool draw_grid_;            // draw the grid for testing / design\n\nprotected:\n  void init();\n  Cell *add_cell(int row, int col);\n  void remove_cell(int row, int col);\n\npublic:\n  Fl_Grid(int X, int Y, int W, int H, const char *L = 0);\n  virtual ~Fl_Grid();\n\n  // define and manage the layout and resizing\n\n  virtual void layout(int rows, int cols, int margin = -1, int gap = -1);\n  virtual void layout();\n  virtual void clear_layout();\n  virtual void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n\n  short rows() const { return rows_; }\n  short cols() const { return cols_; }\n\n  /**\n    Request or reset the request to calculate the layout of children.\n\n    If called with \\p true (1) this calls redraw() to schedule a\n    full draw(). When draw is eventually called, the layout is\n    (re)calculated before actually drawing the widget.\n\n    \\param[in]  set   1 to request layout calculation,\\n\n                      0 to reset the request\n  */\n  void need_layout(int set) {\n    if (set) {\n      need_layout_ = true;\n      redraw();\n    }\n    else {\n      need_layout_ = false;\n    }\n  }\n\n  /**\n    Return whether layout calculation is required.\n  */\n  bool need_layout() const {\n    return need_layout_;\n  }\n\nprotected:\n  virtual void draw() FL_OVERRIDE;\n  void on_remove(int) FL_OVERRIDE;\n  virtual void draw_grid();           // draw grid lines for debugging\n\npublic:\n\n  // get and set individual margins\n\n  virtual void margin(int left, int top = -1, int right = -1, int bottom = -1);\n  int margin(int *left, int *top, int *right, int *bottom) const;\n\n  // get and set default row and column gaps for all rows and columns, respectively\n\n  virtual void gap(int row_gap, int col_gap = -1);   // set default row and column gap(s)\n  void gap(int *row_gap, int *col_gap) const;\n\n  // find cells, get cell pointers\n\n  Fl_Grid::Cell* cell(int row, int col) const;\n  Fl_Grid::Cell* cell(Fl_Widget *widget) const;\n\n  // assign a widget to a cell\n\n  Fl_Grid::Cell* widget(Fl_Widget *wi, int row, int col, Fl_Grid_Align align = FL_GRID_FILL);\n  Fl_Grid::Cell* widget(Fl_Widget *wi, int row, int col, int rowspan, int colspan, Fl_Grid_Align align = FL_GRID_FILL);\n\n  // set minimal column and row sizes (widths and heights, respectively),\n  // set row and column specific gaps and weights\n\n  void col_width(int col, int value);\n  void col_width(const int *value, size_t size);\n  int col_width(int col) const;\n\n  void col_weight(int col, int value);\n  void col_weight(const int *value, size_t size);\n  int col_weight(int col) const;\n\n  void col_gap(int col, int value);\n  void col_gap(const int *value, size_t size);\n  int col_gap(int col) const;\n\n  void row_height(int row, int value);\n  void row_height(const int *value, size_t size);\n  int row_height(int row) const;\n\n  void row_weight(int row, int value);\n  void row_weight(const int *value, size_t size);\n  int row_weight(int row) const;\n\n  void row_gap(int row, int value);\n  void row_gap(const int *value, size_t size);\n  int row_gap(int row) const;\n\n  int computed_col_width(int col) const;\n  int computed_row_height(int row) const;\n\n  /**\n    Enable or disable drawing of the grid helper lines for visualization.\n\n    Use this method during the design stage of your Fl_Grid widget or\n    for debugging if widgets are not positioned as intended.\n\n    The default is a light green color but you can change it for better\n    contrast if needed, see show_grid(int set, Fl_Color col).\n\n    \\note You can define the environment variable \\c FLTK_GRID_DEBUG=1\n      to set show_grid(1) for all Fl_Grid widgets at construction time.\n      This enables you to debug the grid layout w/o changing code.\n\n    \\param[in]  set   1 (true) = draw, 0 = don't draw the grid\n\n    \\see show_grid(int set, Fl_Color col)\n  */\n  void show_grid(int set) {\n    draw_grid_ = set ? true : false;\n  }\n\n  /**\n    Enable or disable drawing of the grid helper lines for visualization.\n\n    This method also sets the color used for the helper lines.\n\n    The default is a light green color but you can change it to any color\n    for better contrast if needed.\n\n    \\param[in]  set   1 (true) = draw, 0 = don't draw the grid\n    \\param[in]  col   color to use for the grid helper lines\n\n    \\see show_grid(int set)\n  */\n  void show_grid(int set, Fl_Color col) {\n    draw_grid_ = set ? true : false;\n    grid_color = col;\n  }\n\n  void debug(int level = 127);\n\n}; // class Fl_Grid\n\n#endif // _FL_FL_GRID_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Group.H",
    "content": "//\n// Group header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n  \\brief Fl_Group and Fl_End classes.\n*/\n\n#ifndef Fl_Group_H\n#define Fl_Group_H\n\n#include \"Fl_Widget.H\"\n\n// Don't #include Fl_Rect.H because this would introduce lots\n// of unnecessary dependencies on Fl_Rect.H\nclass Fl_Rect;\n\n\n/**\n  The Fl_Group class is the main FLTK container widget. It maintains\n  an array of child widgets. These children can themselves be any widget\n  including Fl_Group. The most important subclass of Fl_Group\n  is Fl_Window, however groups can also be used to control radio buttons\n  or to enforce resize behavior.\n\n  The tab and arrow keys are used to move the focus between widgets of\n  this group, and to other groups. The only modifier grabbed is shift\n  (for shift-tab), so that ctrl-tab, alt-up, and such are free\n  for the app to use as shortcuts.\n\n  To remove a widget from the group and destroy it, in 1.3.x (and up)\n  you can simply use:\n  \\code\n  delete some_widget;\n  \\endcode\n  ..and this will trigger proper scheduling of the widget's removal\n  from its parent group.\n\n  If used as a child of \\p Fl_Tabs, setting \\p when(FL_WHEN_CLOSED) will\n  enable the Close button in the corresponding tab. If the user clicks the\n  Close button, the callback of this group will be called with the callback\n  reason \\p FL_REASON_CLOSED.\n*/\nclass FL_EXPORT Fl_Group : public Fl_Widget {\n\n  union {\n    Fl_Widget** array_; // used if group has two or more children or NULL\n    Fl_Widget* child1_; // used if group has one child or NULL\n  };\n  Fl_Widget* savedfocus_;\n  Fl_Widget* resizable_;\n  int children_;\n  Fl_Rect *bounds_; // remembered initial sizes of children\n  int *sizes_; // remembered initial sizes of children (FLTK 1.3 compat.)\n\n  int navigation(int);\n  static Fl_Group *current_;\n\n  // unimplemented copy ctor and assignment operator\n  Fl_Group(const Fl_Group&);\n  Fl_Group& operator=(const Fl_Group&);\n\nprotected:\n  void draw() FL_OVERRIDE;\n  void draw_child(Fl_Widget& widget) const;\n  void draw_children();\n  void draw_outside_label(const Fl_Widget& widget) const ;\n  void update_child(Fl_Widget& widget) const;\n  Fl_Rect *bounds();\n  int  *sizes(); // FLTK 1.3 compatibility\n  virtual int on_insert(Fl_Widget*, int);\n  virtual int on_move(int, int);\n  virtual void on_remove(int);\n\npublic:\n\n  int handle(int) FL_OVERRIDE;\n  void begin();\n  void end();\n  static Fl_Group *current();\n  static void current(Fl_Group *g);\n\n  /**\n    Returns how many child widgets the group has.\n  */\n  int children() const { return children_; }\n\n  /**\n    Returns the n'th child.\n\n    Returns \\c NULL if \\c n is out of range (since FLTK 1.4.0).\n\n    <i>No range checking was done in FLTK 1.3 and older versions!</i>\n\n    \\param[in]  n   index of child (0 .. children() - 1)\n    \\return     pointer to the n'th child or NULL if out of range\n  */\n  Fl_Widget *child(int n) const {\n    if (n < 0 || n > children() - 1) return NULL;\n    return array()[n];\n  }\n\n  int find(const Fl_Widget*) const;\n  /**\n    See int Fl_Group::find(const Fl_Widget *w) const\n  */\n  int find(const Fl_Widget& o) const {return find(&o);}\n  Fl_Widget* const* array() const;\n\n  void resize(int,int,int,int) FL_OVERRIDE;\n  /**\n    Creates a new Fl_Group widget using the given position, size,\n    and label string. The default boxtype is FL_NO_BOX.\n  */\n  Fl_Group(int,int,int,int, const char * = 0);\n  virtual ~Fl_Group();\n  void add(Fl_Widget&);\n  /**\n    See void Fl_Group::add(Fl_Widget &w)\n  */\n  void add(Fl_Widget* o) {add(*o);}\n  void insert(Fl_Widget&, int i);\n  /**\n    This does insert(w, find(before)).  This will append the\n    widget if \\p before is not in the group.\n  */\n  void insert(Fl_Widget& o, Fl_Widget* before) {insert(o,find(before));}\n  void remove(int index);\n  void remove(Fl_Widget&);\n  /**\n    Removes the widget \\p o from the group.\n    \\sa void remove(Fl_Widget&)\n  */\n  void remove(Fl_Widget* o) {remove(*o);}\n  void clear();\n\n  /* delete child n (by index) */\n  virtual int delete_child(int n);\n\n  /**\n    Sets the group's resizable widget.\n    See void Fl_Group::resizable(Fl_Widget *o)\n  */\n  void resizable(Fl_Widget& o) {resizable_ = &o;}\n  /**\n    The resizable widget defines both the resizing box and the resizing\n    behavior of the group and its children.\n\n    If the resizable is NULL the group's size is fixed and all of the widgets\n    in the group remain a fixed size and distance from the top-left corner.\n    This is the default for groups derived from Fl_Window and Fl_Pack.\n\n    The resizable may be set to the group itself, in which case all of the\n    widgets that are its direct children are resized proportionally.\n    This is the default value for Fl_Group.\n\n    The resizable widget defines the resizing box for the group, which could\n    be the group itself or one of the group's direct children. When the\n    group is resized it calculates a new size and position for all of its\n    children. Widgets that are horizontally or vertically inside the\n    dimensions of the box are scaled to the new size. Widgets outside the\n    box are moved.\n\n    \\note The resizable of a group \\b must be one of\n      - NULL\n      - the group itself\n      - a direct child of the group.\n    \\note If you set any other widget that is not a direct child of the group as\n      its resizable then the behavior is undefined. This is \\b not checked by\n      Fl_Group for historical reasons.\n\n    In these examples the gray area is the resizable:\n\n    \\image html resizebox1.png\n\n    <br>\n\n    \\image html resizebox2.png\n\n    \\image latex resizebox1.png \"before resize\"  width=4cm\n\n    \\image latex resizebox2.png \"after resize\"   width=4.85cm\n\n    It is possible to achieve any type of resize behavior by using an\n    invisible Fl_Box as the resizable and/or by using a hierarchy of\n    Fl_Group widgets, each with their own resizing strategies.\n\n    See the \\ref resize chapter for more examples and detailed explanation.\n\n    \\note The resizable() widget of a window can also affect the window's\n      resizing behavior if Fl_Window::size_range() is not called. Please\n      see Fl_Window::default_size_range() for more information on how the\n      default size range is calculated.\n\n    \\see Fl_Window::size_range()\n    \\see Fl_Window::default_size_range()\n  */\n  void resizable(Fl_Widget* o) {resizable_ = o;}\n  /**\n    Returns the group's resizable widget.\n    See void Fl_Group::resizable(Fl_Widget *o)\n  */\n  Fl_Widget* resizable() const {return resizable_;}\n  /**\n    Adds a widget to the group and makes it the resizable widget.\n  */\n  void add_resizable(Fl_Widget& o) {resizable_ = &o; add(o);}\n  void init_sizes();\n\n  /**\n    Controls whether the group widget clips the drawing of\n    child widgets to its bounding box.\n\n    Set \\p c to 1 if you want to clip the child widgets to the\n    bounding box.\n\n    The default is to not clip (0) the drawing of child widgets.\n  */\n  void clip_children(int c) { if (c) set_flag(CLIP_CHILDREN); else clear_flag(CLIP_CHILDREN); }\n  /**\n    Returns the current clipping mode.\n\n    \\return true, if clipping is enabled, false otherwise.\n\n    \\see void Fl_Group::clip_children(int c)\n  */\n  unsigned int clip_children() { return (flags() & CLIP_CHILDREN) != 0; }\n\n  // Note: Doxygen docs in Fl_Widget.H to avoid redundancy.\n  Fl_Group* as_group() FL_OVERRIDE { return this; }\n  Fl_Group const* as_group() const FL_OVERRIDE { return this; }\n\n  // back compatibility functions:\n\n  /**\n    \\deprecated This is for backwards compatibility only. You should use\n    \\e W->%take_focus() instead.\n    \\sa Fl_Widget::take_focus();\n  */\n  void focus(Fl_Widget* W) {W->take_focus();}\n\n  /** This is for forms compatibility only */\n  Fl_Widget* & _ddfdesign_kludge() {return resizable_;}\n\n  /** This is for forms compatibility only */\n  void forms_end();\n};\n\n// dummy class used to end child groups in constructors for complex\n// subclasses of Fl_Group:\n/**\n  This is a dummy class that allows you to end a Fl_Group in a constructor list of a\n  class:\n  \\code\n  class MyClass {\n    Fl_Group group;\n    Fl_Button button_in_group;\n    Fl_End end;\n    Fl_Button button_outside_group;\n    MyClass();\n  };\n  MyClass::MyClass() :\n    group(10,10,100,100),\n    button_in_group(20,20,60,30),\n    end(),\n    button_outside_group(10,120,60,30) {\n    [..ctor code..]\n  }\n  \\endcode\n*/\nclass FL_EXPORT Fl_End {\npublic:\n  /** All it does is calling Fl_Group::current()->end() */\n  Fl_End() {Fl_Group::current()->end();}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Help_Dialog.H",
    "content": "//\n// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2021 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n// ========================================================================\n//  DO NOT EDIT FL/Fl_Help_Dialog.H and src/Fl_Help_Dialog.cxx !!!\n// ========================================================================\n//  Please use fluid to change src/Fl_Help_Dialog.fl interactively\n//  and then use fluid to \"write code\" or edit and use fluid -c .\n// ========================================================================\n//\n\n// generated by Fast Light User Interface Designer (fluid) version 1.0402\n\n#ifndef Fl_Help_Dialog_H\n#define Fl_Help_Dialog_H\n#include <FL/Fl.H>\n#include <FL/Fl_Double_Window.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Button.H>\n#include <FL/Fl_Input.H>\n#include <FL/Fl_Box.H>\n#include <FL/Fl_Help_View.H>\n\nclass FL_EXPORT Fl_Help_Dialog {\n  int index_;\n  int max_;\n  int line_[100]; // FIXME: we must remove those static numbers\n  char file_[100][FL_PATH_MAX]; // FIXME: we must remove those static numbers\n  int find_pos_;\npublic:\n  Fl_Help_Dialog();\nprivate:\n  Fl_Double_Window *window_;\n  Fl_Button *back_;\n  inline void cb_back__i(Fl_Button*, void*);\n  static void cb_back_(Fl_Button*, void*);\n  Fl_Button *forward_;\n  inline void cb_forward__i(Fl_Button*, void*);\n  static void cb_forward_(Fl_Button*, void*);\n  Fl_Button *smaller_;\n  inline void cb_smaller__i(Fl_Button*, void*);\n  static void cb_smaller_(Fl_Button*, void*);\n  Fl_Button *larger_;\n  inline void cb_larger__i(Fl_Button*, void*);\n  static void cb_larger_(Fl_Button*, void*);\n  Fl_Input *find_;\n  inline void cb_find__i(Fl_Input*, void*);\n  static void cb_find_(Fl_Input*, void*);\n  Fl_Help_View *view_;\n  inline void cb_view__i(Fl_Help_View*, void*);\n  static void cb_view_(Fl_Help_View*, void*);\npublic:\n  ~Fl_Help_Dialog();\n  int h();\n  void hide();\n  int load(const char *f);\n  void position(int xx, int yy);\n  void resize(int xx, int yy, int ww, int hh);\n  void show();\n  void show(int argc, char **argv);\n  void textsize(Fl_Fontsize s);\n  Fl_Fontsize textsize();\n  void topline(const char *n);\n  void topline(int n);\n  void value(const char *f);\n  const char * value() const;\n  int visible();\n  int w();\n  int x();\n  int y();\n};\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Help_View.H",
    "content": "//\n// Help Viewer widget definitions.\n//\n// Copyright 1997-2010 by Easy Software Products.\n// Image support by Matthias Melcher, Copyright 2000-2009.\n// Copyright 2011-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Help_View widget . */\n\n#ifndef Fl_Help_View_H\n#define Fl_Help_View_H\n\n//\n// Include necessary header files...\n//\n\n#include \"Fl.H\"\n#include \"Fl_Group.H\"\n#include \"Fl_Scrollbar.H\"\n#include \"fl_draw.H\"\n#include \"filename.H\"\n\nclass Fl_Shared_Image;\n//\n// Fl_Help_Func type - link callback function for files...\n//\n\ntypedef const char *(Fl_Help_Func)(Fl_Widget *, const char *);\n\n//\n// Fl_Help_Block structure...\n//\n\nstruct Fl_Help_Block {\n  const char    *start,         // Start of text\n                *end;           // End of text\n  uchar         border;         // Draw border?\n  Fl_Color      bgcolor;        // Background color\n  int           x,              // Indentation/starting X coordinate\n                y,              // Starting Y coordinate\n                w,              // Width\n                h;              // Height\n  int           line[32];       // Left starting position for each line\n  int           ol;             // is ordered list <OL> element\n  int           ol_num;         // item number in ordered list\n};\n\n//\n// Fl_Help_Link structure...\n//\n/** Definition of a link for the html viewer. */\nstruct Fl_Help_Link {\n  char          filename[192],  ///< Reference filename\n                name[32];       ///< Link target (blank if none)\n  int           x,              ///< X offset of link text\n                y,              ///< Y offset of link text\n                w,              ///< Width of link text\n                h;              ///< Height of link text\n};\n\n/*\n * Fl_Help_View font stack opaque implementation\n */\n\n/** Fl_Help_View font stack element definition. */\nstruct FL_EXPORT Fl_Help_Font_Style {\n  Fl_Font      f;  ///< Font\n  Fl_Fontsize  s;  ///< Font Size\n  Fl_Color     c;  ///< Font Color\n  void get(Fl_Font &afont, Fl_Fontsize &asize, Fl_Color &acolor) {afont=f; asize=s; acolor=c;} ///< Gets current font attributes\n  void set(Fl_Font afont, Fl_Fontsize asize, Fl_Color acolor) {f=afont; s=asize; c=acolor;} ///< Sets current font attributes\n  Fl_Help_Font_Style(Fl_Font afont, Fl_Fontsize asize, Fl_Color acolor) {set(afont, asize, acolor);}\n  Fl_Help_Font_Style(){} // For in table use\n};\n\n/** Fl_Help_View font stack definition. */\nconst size_t MAX_FL_HELP_FS_ELTS = 100;\n\nstruct FL_EXPORT Fl_Help_Font_Stack {\n  /** font stack construction, initialize attributes. */\n  Fl_Help_Font_Stack() {\n    nfonts_ = 0;\n  }\n\n  void init(Fl_Font f, Fl_Fontsize s, Fl_Color c) {\n    nfonts_ = 0;\n    elts_[nfonts_].set(f, s, c);\n    fl_font(f, s);\n    fl_color(c);\n  }\n  /** Gets the top (current) element on the stack. */\n  void top(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) { elts_[nfonts_].get(f, s, c); }\n  /** Pushes the font style triplet on the stack, also calls fl_font() & fl_color() adequately */\n  void push(Fl_Font f, Fl_Fontsize s, Fl_Color c) {\n    if (nfonts_ <  MAX_FL_HELP_FS_ELTS-1) nfonts_ ++;\n    elts_[nfonts_].set(f, s, c);\n    fl_font(f, s); fl_color(c);\n  }\n  /** Pops from the stack the font style triplet and calls fl_font() & fl_color() adequately */\n  void pop(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) {\n    if (nfonts_ > 0) nfonts_ --;\n    top(f, s, c);\n    fl_font(f, s); fl_color(c);\n  }\n  /** Gets the current count of font style elements in the stack. */\n  size_t count() const {return nfonts_;} // Gets the current number of fonts in the stack\n\nprotected:\n  size_t nfonts_;               ///< current number of fonts in stack\n  Fl_Help_Font_Style elts_[MAX_FL_HELP_FS_ELTS]; ///< font elements\n};\n\n/** Fl_Help_Target structure */\n\nstruct Fl_Help_Target {\n  char          name[32];       ///< Target name\n  int           y;              ///< Y offset of target\n};\n\n/**\n  The Fl_Help_View widget displays HTML text. Most HTML 2.0\n  elements are supported, as well as a primitive implementation of tables.\n  GIF, JPEG, and PNG images are displayed inline.\n\n  Supported HTML tags:\n     - A: HREF/NAME\n     - B\n     - BODY: BGCOLOR/TEXT/LINK\n     - BR\n     - CENTER\n     - CODE\n     - DD\n     - DL\n     - DT\n     - EM\n     - FONT: COLOR/SIZE/FACE=(helvetica/arial/sans/times/serif/symbol/courier)\n     - H1/H2/H3/H4/H5/H6\n     - HEAD\n     - HR\n     - I\n     - IMG: SRC/WIDTH/HEIGHT/ALT\n     - KBD\n     - LI\n     - OL\n     - P\n     - PRE\n     - STRONG\n     - TABLE: TH/TD/TR/BORDER/BGCOLOR/COLSPAN/ALIGN=CENTER|RIGHT|LEFT\n     - TITLE\n     - TT\n     - U\n     - UL\n     - VAR\n\n  Supported color names:\n     - black,red,green,yellow,blue,magenta,fuchsia,cyan,aqua,white,gray,grey,lime,maroon,navy,olive,purple,silver,teal.\n\n  Supported urls:\n     - Internal: file:\n     - External: http: ftp: https: ipp: mailto: news:\n\n  Quoted char names:\n     - Aacute aacute Acirc acirc acute AElig aelig Agrave agrave amp Aring aring Atilde atilde Auml auml\n     - brvbar bull\n     - Ccedil ccedil cedil cent copy curren\n     - dagger deg divide\n     - Eacute eacute Ecirc ecirc Egrave egrave ETH eth Euml euml euro\n     - frac12 frac14 frac34\n     - gt\n     - Iacute iacute Icirc icirc iexcl Igrave igrave iquest Iuml iuml\n     - laquo lt\n     - macr micro middot\n     - nbsp not Ntilde ntilde\n     - Oacute oacute Ocirc ocirc Ograve ograve ordf ordm Oslash oslash Otilde otilde Ouml ouml\n     - para permil plusmn pound\n     - quot\n     - raquo reg\n     - sect shy sup1 sup2 sup3 szlig\n     - THORN thorn times trade\n     - Uacute uacute Ucirc ucirc Ugrave ugrave uml Uuml uuml\n     - Yacute yacute\n     - yen Yuml yuml\n\n  \\note You can't effectively set the box() to FL_NO_BOX, this would result\n    in FL_DOWN_BOX being used as the boxtype of the widget. This is unexpected\n    but can't be changed for backwards compatibility. If you don't want a frame\n    around the widget you can use FL_FLAT_BOX instead.\n*/\nclass FL_EXPORT Fl_Help_View : public Fl_Group {        // Help viewer widget\n\n  enum { RIGHT = -1, CENTER, LEFT };    ///< Alignments\n\n  char          title_[1024];           ///< Title string\n  Fl_Color      defcolor_,              ///< Default text color\n                bgcolor_,               ///< Background color\n                textcolor_,             ///< Text color\n                linkcolor_;             ///< Link color\n  Fl_Font       textfont_;              ///< Default font for text\n  Fl_Fontsize  textsize_;               ///< Default font size\n  const char    *value_;                ///< HTML text value\n  Fl_Help_Font_Stack fstack_;           ///< font stack management\n  int           nblocks_,               ///< Number of blocks/paragraphs\n                ablocks_;               ///< Allocated blocks\n  Fl_Help_Block *blocks_;               ///< Blocks\n\n  Fl_Help_Func  *link_;                 ///< Link transform function\n\n  int           nlinks_,                ///< Number of links\n                alinks_;                ///< Allocated links\n  Fl_Help_Link  *links_;                ///< Links\n\n  int           ntargets_,              ///< Number of targets\n                atargets_;              ///< Allocated targets\n  Fl_Help_Target *targets_;             ///< Targets\n\n#if FL_ABI_VERSION >= 10401\n  char          directory_[2 * FL_PATH_MAX + 15]; ///< Directory for current file\n#else\n  char          directory_[FL_PATH_MAX]; ///< Directory for current file\n#endif\n\n  char          filename_[FL_PATH_MAX]; ///< Current filename\n  int           topline_,               ///< Top line in document\n                leftline_,              ///< Lefthand position\n                size_,                  ///< Total document length\n                hsize_,                 ///< Maximum document width\n                scrollbar_size_;        ///< Size for both scrollbars\n  Fl_Scrollbar  scrollbar_,             ///< Vertical scrollbar for document\n                hscrollbar_;            ///< Horizontal scrollbar\n\n  static int    selection_first_;\n  static int    selection_last_;\n  static int    selection_push_first_;\n  static int    selection_push_last_;\n  static int    selection_drag_first_;\n  static int    selection_drag_last_;\n  static int    selected_;\n  static int    draw_mode_;\n  static int    mouse_x_;\n  static int    mouse_y_;\n  static int    current_pos_;\n  static Fl_Help_View *current_view_;\n  static Fl_Color hv_selection_color_;\n  static Fl_Color hv_selection_text_color_;\n\n\n  void initfont(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) { f = textfont_; s = textsize_; c = textcolor_; fstack_.init(f, s, c); }\n  void pushfont(Fl_Font f, Fl_Fontsize s) {fstack_.push(f, s, textcolor_);}\n  void pushfont(Fl_Font f, Fl_Fontsize s, Fl_Color c) {fstack_.push(f, s, c);}\n  void popfont(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) {fstack_.pop(f, s, c);}\n\n  Fl_Help_Block *add_block(const char *s, int xx, int yy, int ww, int hh, uchar border = 0);\n  void          add_link(const char *n, int xx, int yy, int ww, int hh);\n  void          add_target(const char *n, int yy);\n  static int    compare_targets(const Fl_Help_Target *t0, const Fl_Help_Target *t1);\n  int           do_align(Fl_Help_Block *block, int line, int xx, int a, int &l);\nprotected:\n  void          draw() FL_OVERRIDE;\nprivate:\n  void          format();\n  void          format_table(int *table_width, int *columns, const char *table);\n  void          free_data();\n  int           get_align(const char *p, int a);\n  const char    *get_attr(const char *p, const char *n, char *buf, int bufsize);\n  Fl_Color      get_color(const char *n, Fl_Color c);\n  Fl_Shared_Image *get_image(const char *name, int W, int H);\n  int           get_length(const char *l);\npublic:\n  int           handle(int) FL_OVERRIDE;\nprivate:\n\n  void          hv_draw(const char *t, int x, int y, int entity_extra_length = 0);\n  char          begin_selection();\n  char          extend_selection();\n  void          end_selection(int c=0);\n  void          clear_global_selection();\n  Fl_Help_Link  *find_link(int, int);\n  void          follow_link(Fl_Help_Link*);\n\npublic:\n\n  static const char *copy_menu_text;\n\n  Fl_Help_View(int xx, int yy, int ww, int hh, const char *l = 0);\n  ~Fl_Help_View();\n  /** Returns the current directory for the text in the buffer. */\n  const char    *directory() const { if (directory_[0]) return (directory_);\n                                        else return ((const char *)0); }\n  /** Returns the current filename for the text in the buffer. */\n  const char    *filename() const { if (filename_[0]) return (filename_);\n                                        else return ((const char *)0); }\n  int           find(const char *s, int p = 0);\n  /**\n    This method assigns a callback function to use when a link is\n    followed or a file is loaded (via Fl_Help_View::load()) that\n    requires a different file or path.\n\n    The callback function receives a pointer to the Fl_Help_View\n    widget and the URI or full pathname for the file in question.\n    It must return a pathname that can be opened as a local file or NULL:\n\n    \\code\n    const char *fn(Fl_Widget *w, const char *uri);\n    \\endcode\n\n    The link function can be used to retrieve remote or virtual\n    documents, returning a temporary file that contains the actual\n    data. If the link function returns NULL, the value of\n    the Fl_Help_View widget will remain unchanged.\n\n    If the link callback cannot handle the URI scheme, it should\n    return the uri value unchanged or set the value() of the widget\n    before returning NULL.\n  */\n  void          link(Fl_Help_Func *fn) { link_ = fn; }\n  int           load(const char *f);\n  void          resize(int,int,int,int) FL_OVERRIDE;\n  /** Gets the size of the help view. */\n  int           size() const { return (size_); }\n  void          size(int W, int H) { Fl_Widget::size(W, H); }\n  /** Sets the default text color. */\n  void          textcolor(Fl_Color c) { if (textcolor_ == defcolor_) textcolor_ = c; defcolor_ = c; }\n  /** Returns the current default text color. */\n  Fl_Color      textcolor() const { return (defcolor_); }\n  /** Sets the default text font. */\n  void          textfont(Fl_Font f) { textfont_ = f; format(); }\n  /** Returns the current default text font. */\n  Fl_Font       textfont() const { return (textfont_); }\n  /** Sets the default text size. */\n  void          textsize(Fl_Fontsize s) { textsize_ = s; format(); }\n  /** Gets the default text size. */\n  Fl_Fontsize  textsize() const { return (textsize_); }\n  /** Returns the current document title, or NULL if there is no title. */\n  const char    *title() { return (title_); }\n  void          topline(const char *n);\n  void          topline(int);\n  /** Returns the current top line in pixels. */\n  int           topline() const { return (topline_); }\n  void          leftline(int);\n  /** Gets the left position in pixels. */\n  int           leftline() const { return (leftline_); }\n  void          value(const char *val);\n  /** Returns the current buffer contents. */\n  const char    *value() const { return (value_); }\n  void          clear_selection();\n  void          select_all();\n  /**\n    Gets the current size of the scrollbars' troughs, in pixels.\n\n    If this value is zero (default), this widget will use the\n    Fl::scrollbar_size() value as the scrollbar's width.\n\n    \\returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.\n    \\see Fl::scrollbar_size(int)\n  */\n  int scrollbar_size() const {\n      return(scrollbar_size_);\n  }\n  /**\n    Sets the pixel size of the scrollbars' troughs to \\p newSize, in pixels.\n\n    Normally you should not need this method, and should use\n    Fl::scrollbar_size(int) instead to manage the size of ALL\n    your widgets' scrollbars. This ensures your application\n    has a consistent UI, is the default behavior, and is normally\n    what you want.\n\n    Only use THIS method if you really need to override the global\n    scrollbar size. The need for this should be rare.\n\n    Setting \\p newSize to the special value of 0 causes the widget to\n    track the global Fl::scrollbar_size(), which is the default.\n\n    \\param[in] newSize Sets the scrollbar size in pixels.\\n\n                    If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()\n    \\see Fl::scrollbar_size()\n  */\n  void scrollbar_size(int newSize) {\n      scrollbar_size_ = newSize;\n  }\n\n  // Check if the user selected text in this view.\n  int text_selected();\n\n  // If text is selected in this view, copy it to a clipboard.\n  int copy(int clipboard=1);\n};\n\n#endif // !Fl_Help_View_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Hold_Browser.H",
    "content": "//\n// Hold browser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Hold_Browser widget . */\n\n#ifndef Fl_Hold_Browser_H\n#define Fl_Hold_Browser_H\n\n#include \"Fl_Browser.H\"\n\n/**\n  The Fl_Hold_Browser is a subclass of Fl_Browser which lets the user\n  select a single item, or no items by clicking on the empty space.\n\n  \\image html  fl_hold_browser.png \"Fl_Hold_Browser\"\n  \\image latex fl_hold_browser.png \"Fl_Hold_Browser\" width=4cm\n\n  As long as the mouse button is held down the item\n  pointed to by it is highlighted, and this highlighting remains on when\n  the mouse button is released. Normally the callback is done when the\n  user releases the mouse, but you can change this with when().\n  <P>See Fl_Browser for methods to add and remove lines from the browser.\n*/\nclass FL_EXPORT Fl_Hold_Browser : public Fl_Browser {\npublic:\n  /**\n    Creates a new Fl_Hold_Browser widget using the given\n    position, size, and label string. The default boxtype is FL_DOWN_BOX.\n    The constructor specializes Fl_Browser() by setting the type to FL_HOLD_BROWSER.\n    The destructor destroys the widget and frees all memory that has been allocated.\n */\n  Fl_Hold_Browser(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Hor_Fill_Slider.H",
    "content": "//\n// Horizontal fill slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Hor_Fill_Slider widget . */\n\n#ifndef Fl_Hor_Fill_Slider_H\n#define Fl_Hor_Fill_Slider_H\n\n#include \"Fl_Slider.H\"\n\nclass FL_EXPORT Fl_Hor_Fill_Slider : public Fl_Slider {\npublic:\n  Fl_Hor_Fill_Slider(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Hor_Nice_Slider.H",
    "content": "//\n// Horizontal \"nice\" slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Hor_Nice_Slider widget . */\n\n#ifndef Fl_Hor_Nice_Slider_H\n#define Fl_Hor_Nice_Slider_H\n\n#include \"Fl_Slider.H\"\n\n/** \\class Fl_Hor_Nice_Slider\n\n \\brief Single thumb tab slider\n\n \\image html fl_hor_nice_slider.png \"Fl_Hor_Nice_Slider with various Fl::scheme() values\"\n \\image latex fl_hor_nice_slider.png \"Fl_Hor_Nice_Slider with various Fl::scheme() values\" width=6cm\n\n**/\n\nclass FL_EXPORT Fl_Hor_Nice_Slider : public Fl_Slider {\npublic:\n  Fl_Hor_Nice_Slider(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Hor_Slider.H",
    "content": "//\n// Horizontal slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2011 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Hor_Slider widget . */\n\n#ifndef Fl_Hor_Slider_H\n#define Fl_Hor_Slider_H\n\n#include \"Fl_Slider.H\"\n\n/** Horizontal Slider class.\n\n  \\see class Fl_Slider.\n*/\nclass FL_EXPORT Fl_Hor_Slider : public Fl_Slider {\npublic:\n\n  /**\n    Creates a new Fl_Hor_Slider widget using the given position,\n    size, and label string.\n  */\n  Fl_Hor_Slider(int X,int Y,int W,int H,const char *l=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Hor_Value_Slider.H",
    "content": "//\n// Horizontal value slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Hor_Value_Slider widget . */\n\n#ifndef Fl_Hor_Value_Slider_H\n#define Fl_Hor_Value_Slider_H\n\n#include \"Fl_Value_Slider.H\"\n\nclass FL_EXPORT Fl_Hor_Value_Slider : public Fl_Value_Slider {\npublic:\n  Fl_Hor_Value_Slider(int X,int Y,int W,int H,const char *l=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_ICO_Image.H",
    "content": "//\n// ICO image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2022-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     http://www.fltk.org/COPYING.php\n//\n// Please report all bugs and problems on the following page:\n//\n//     http://www.fltk.org/str.php\n//\n\n// https://en.wikipedia.org/wiki/ICO_(file_format)\n// http://www.daubnet.com/en/file-format-ico\n\n#ifndef Fl_ICO_Image_H\n#  define Fl_ICO_Image_H\n#  include \"Fl_BMP_Image.H\"\n\n/**\n The Fl_ICO_Image class supports loading, caching, and drawing of Windows icon (.ico) files.\n */\nclass FL_EXPORT Fl_ICO_Image : public Fl_BMP_Image {\n\npublic:\n  /** Windows ICONDIRENTRY structure  */\n   struct IconDirEntry {\n    int bWidth;         ///<  Image width\n    int bHeight;        ///<  Image height\n    int bColorCount;    ///<  Number of colors (0 if  ≥ 8bpp)\n    int bReserved;      ///<  Reserved\n    int wPlanes;        ///<  Color Planes\n    int wBitCount;      ///<  Bits per pixel\n    int dwBytesInRes;   ///<  Resource size in bytes\n    int dwImageOffset;  ///<  Offset to the image\n  };\n\n  Fl_ICO_Image(const char *filename, int id = -1, const unsigned char *data = NULL, const size_t datasize = 0);\n  ~Fl_ICO_Image();\n\n  /** Returns the number of icons of various resolutions present in the ICO object. */\n  int idcount() const { return idcount_; }\n\n  /** Returns the array of idcount() loaded IconDirEntry structures. */\n  const IconDirEntry * icondirentry() const { return icondirentry_; }\n\nprivate:\n  int idcount_;\n  struct IconDirEntry *icondirentry_;\n  void load_ico_(class Fl_Image_Reader &rdr, int id);\n};\n\n#endif // Fl_ICO_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Image.H",
    "content": "//\n// Image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   Fl_Image, Fl_RGB_Image classes. */\n\n#ifndef Fl_Image_H\n#define Fl_Image_H\n\n#include \"Enumerations.H\"\n#include \"Fl_Widget.H\" // for fl_uintptr_t\n\nclass Fl_Widget;\nclass Fl_Pixmap;\nstruct Fl_Menu_Item;\nstruct Fl_Label;\nclass Fl_RGB_Image;\n\n\n/** \\enum Fl_RGB_Scaling\n The scaling algorithm to use for RGB images.\n*/\nenum Fl_RGB_Scaling {\n  FL_RGB_SCALING_NEAREST = 0, ///< default RGB image scaling algorithm\n  FL_RGB_SCALING_BILINEAR     ///< more accurate, but slower RGB image scaling algorithm\n};\n\n\n/**\n  Base class for image caching, scaling and drawing.\n\n  Fl_Image is the base class used for caching, scaling and drawing all kinds of\n  images in FLTK. This class keeps track of common image data such as the pixels,\n  colormap, width, height, and depth. Virtual methods are used to provide\n  type-specific image handling.\n\n  Each image possesses two (width, height) pairs:\n   -# The width and height of the raw image data are returned by data_w() and\n      data_h(). These values are set when the image is created and remain unchanged.\n   -# The width and height of the area filled by the image when it gets drawn are\n      returned by w() and h(). These values are equal to data_w() and data_h() when\n      the image is created and can be changed by the scale() member function.\n\n  Since the Fl_Image class does not support image drawing by itself, calling the\n  Fl_Image::draw() method results in a box with an X in it being drawn instead.\n*/\nclass FL_EXPORT Fl_Image {\n  friend class Fl_Graphics_Driver;\npublic:\n  static const int ERR_NO_IMAGE       = -1;\n  static const int ERR_FILE_ACCESS    = -2;\n  static const int ERR_FORMAT         = -3;\n  static const int ERR_MEMORY_ACCESS  = -4;\n\nprivate:\n  int w_, h_, d_, ld_, count_;\n  int data_w_, data_h_;\n  const char * const *data_;\n  static Fl_RGB_Scaling RGB_scaling_; // method used when copying RGB images\n  static Fl_RGB_Scaling scaling_algorithm_; // method used to rescale RGB source images before drawing\n  // Forbid use of copy constructor and assign operator\n  Fl_Image & operator=(const Fl_Image &);\n  Fl_Image(const Fl_Image &);\n  // Presently redefined in Fl_SVG_Image\n  virtual void cache_size_(int &/*width*/, int &/*height*/) {}\n\nprotected:\n\n  /**\n   Sets the width of the image data.\n   This protected function sets both image widths: the width of the image data returned by data_w() and\n   the image drawing width in FLTK units returned by w().\n   */\n  void w(int W) {w_ = W; data_w_ = W;}\n  /**\n   Sets the height of the image data.\n   This protected function sets both image heights: the height of the image data returned by data_h() and\n   the image drawing height in FLTK units returned by h().\n   */\n  void h(int H) {h_ = H; data_h_ = H;}\n  /**\n   Sets the current image depth.\n   */\n  void d(int D) {d_ = D;}\n  /**\n    Sets the current line data size in bytes.\n\n    Color images may contain extra data (padding) that is included after every\n    line of color image data and is normally not present.\n\n    If \\p LD is zero, then line data size is assumed to be data_w() * d() bytes.\n\n    If \\p LD is non-zero, then it must be positive and larger than data_w() * d()\n    to account for the extra data per line.\n   */\n  void ld(int LD) {ld_ = LD;}\n  /**\n    Sets the current data pointer and count of pointers in the array.\n\n    There can be 0, 1, or more pointers to actual image data in an image.\n\n   \\see const char* const* data(), count(), w(), h(), data_w(), data_h(), d(), ld()\n  */\n  void data(const char * const *p, int c) {data_ = p; count_ = c;}\n  void draw_empty(int X, int Y);\n\n  static void labeltype(const Fl_Label *lo, int lx, int ly, int lw, int lh, Fl_Align la);\n  static void measure(const Fl_Label *lo, int &lw, int &lh);\n  int draw_scaled(int X, int Y, int W, int H);\n\npublic:\n\n  /**\n   Returns the current image drawing width in FLTK units.\n   The values of w() and data_w() are identical unless scale() has been called\n   after which they may differ.\n   */\n  int w() const {return w_;}\n  /**\n   Returns the current image drawing height in FLTK units.\n   The values of h() and data_h() are identical unless scale() has been called\n   after which they may differ.\n   */\n  int h() const {return h_;}\n  /**\n   Returns the width of the image data.\n   */\n  int data_w() const {return data_w_;}\n  /**\n   Returns the height of the image data.\n   */\n  int data_h() const {return data_h_;}\n  /**\n   Returns the image depth.\n   The return value will be 0 for bitmaps, 1 for\n   pixmaps, and 1 to 4 for color images.</P>\n   */\n  int d() const {return d_;}\n  /**\n   Returns the current line data size in bytes.\n   \\see ld(int)\n   */\n  int ld() const {return ld_;}\n  /**\n    Returns the number of data values associated with the image.\n\n    The value will be 0 for images with no associated data, 1 for\n    bitmap and color images, and greater than 2 for pixmap images.\n\n    \\see data()\n  */\n  int count() const {return count_;}\n  /**\n    Returns a pointer to the current image data array.\n\n    There can be 0, 1, or more pointers to actual image data in an image.\n\n    Use the count() method to find the size of the data array. You must\n    not dereference the data() pointer if count() equals zero.\n\n    \\note data() \\b may return NULL.\n\n    Example:\n\n    Fl_RGB_Image has exactly one pointer which points at the R, G, B [, A]\n    data array of the image. The total size of this array depends on\n    several attributes like data_w(), data_h(), d() and ld() and is basically\n    data_w() * data_h() * d() but there are exceptions if ld() is non-zero:\n    see description of ld(). Since FLTK 1.4.0 w() and h() are no longer\n    significant for the image data size if scale() has been called on the\n    image to set a different display size.\n\n    Other image types have different numbers and types of data pointers\n    which are implementation details and not documented here.\n\n    \\see count(), w(), h(), data_w(), data_h(), d(), ld()\n  */\n  const char * const *data() const {return data_;}\n  int fail() const;\n  /**\n    Releases an Fl_Image - the same as '\\p delete \\p this'.\n\n    This virtual method is for almost all image classes the same as calling\n    \\code\n      delete image;\n    \\endcode\n    where image is an \\p Fl_Image \\p * pointer.\n\n    However, for subclass Fl_Shared_Image and its subclasses this virtual\n    method is reimplemented and maintains shared images.\n\n    This virtual method makes it possible to \\p destroy all image types in\n    the same way by calling\n    \\code\n      image->release();\n    \\endcode\n\n    Reasoning: If you have an 'Fl_Image *' base class pointer and don't know\n    if the object is one of the class Fl_Shared_Image or any other subclass\n    of Fl_Image (for instance Fl_RGB_Image) then you can't just use operator\n    delete since this is not appropriate for Fl_Shared_Image objects.\n\n    The virtual method release() handles this properly.\n\n    \\since 1.4.0 in the base class Fl_Image and virtual in Fl_Shared_Image\n  */\n  virtual void release() {\n    delete this;\n  }\n\n  /** Returns whether an image is an Fl_Shared_Image or not.\n\n    This virtual method returns a pointer to an Fl_Shared_Image if this\n    object is an instance of Fl_Shared_Image or NULL if not. This can be\n    used to detect if a given Fl_Image object is a shared image, i.e.\n    derived from Fl_Shared_Image.\n\n    \\since 1.4.0\n  */\n  virtual class Fl_Shared_Image *as_shared_image() {\n    return 0;\n  }\n\n  Fl_Image(int W, int H, int D);\n  virtual ~Fl_Image();\n  virtual Fl_Image *copy(int W, int H) const;\n  /**\n    Creates a copy of the image in the same size.\n\n    The new image should be released when you are done with it.\n\n    This does exactly the same as 'Fl_Image::copy(int W, int H) const' where\n    \\p W and \\p H are the width and height of the source image, respectively.\n    This applies also to all subclasses of Fl_Image in the FLTK library.\n\n    The following two copy() calls are equivalent:\n    \\code\n      Fl_Image *img1 = new Fl_Image(...);\n      // ...\n      Fl_Image *img2 = img1->copy();\n      Fl_Image *img3 = img1->copy(img1->w(), img1->h())\n    \\endcode\n\n    For details see 'Fl_Image::copy(int w, int h) const'.\n    \\see Fl_Image::release()\n\n    \\note Since FLTK 1.4.0 this method is 'const'. If you derive your own class\n      from Fl_Image or any subclass your overridden methods of 'Fl_Image::copy() const'\n      and 'Fl_Image::copy(int, int) const' \\b must also be 'const' for inheritance\n      to work properly. This is different than in FLTK 1.3.x and earlier where these\n      methods have not been 'const'.\n  */\n  Fl_Image *copy() const { return copy(w(), h()); }\n  virtual void color_average(Fl_Color c, float i);\n  /**\n   The inactive() method calls\n   color_average(\\ref FL_BACKGROUND_COLOR, 0.33f) to produce\n   an image that appears grayed out.\n\n   An internal copy is made of the original image before\n   changes are applied, to avoid modifying the original image.\n\n   \\note The RGB color of \\ref FL_BACKGROUND_COLOR may change when the\n   connection to the display is made. See fl_open_display().\n   */\n  void inactive() { color_average(FL_GRAY, .33f); }\n  virtual void desaturate();\n  virtual void label(Fl_Widget*w);\n  virtual void label(Fl_Menu_Item*m);\n  /**\n   Draws the image to the current drawing surface with a bounding box.\n   Arguments <tt>X,Y,W,H</tt> specify\n   a bounding box for the image, with the origin\n   (upper-left corner) of the image offset by the \\c cx\n   and \\c cy arguments.\n\n   In other words:  <tt>fl_push_clip(X,Y,W,H)</tt> is applied,\n   the image is drawn with its upper-left corner at <tt>X-cx,Y-cy</tt> and its own width and height,\n   <tt>fl_pop_clip</tt><tt>()</tt> is applied.\n   */\n  virtual void draw(int X, int Y, int W, int H, int cx=0, int cy=0); // platform dependent\n  /**\n   Draws the image to the current drawing surface.\n   \\param X, Y specify the upper-lefthand corner of the image.\n   */\n  void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} // platform dependent\n  virtual void uncache();\n\n  // used by fl_define_FL_IMAGE_LABEL() to avoid 'friend' declaration\n  static Fl_Labeltype define_FL_IMAGE_LABEL();\n\n  // set RGB image scaling method\n  static void RGB_scaling(Fl_RGB_Scaling);\n  // get RGB image scaling method\n  static Fl_RGB_Scaling RGB_scaling();\n\n  // set the image drawing size\n  virtual void scale(int width, int height, int proportional = 1, int can_expand = 0);\n  /** Sets what algorithm is used when resizing a source image to draw it.\n   The default algorithm is FL_RGB_SCALING_BILINEAR.\n   Drawing an Fl_Image is sometimes performed by first resizing the source image\n   and then drawing the resized copy. This occurs, e.g., when drawing to screen under X11\n   without Xrender support after having called scale().\n   This function controls what method is used when the image to be resized is an Fl_RGB_Image.\n   \\version 1.4\n   */\n  static void scaling_algorithm(Fl_RGB_Scaling algorithm) {scaling_algorithm_ = algorithm; }\n  /** Gets what algorithm is used when resizing a source image to draw it. */\n  static Fl_RGB_Scaling scaling_algorithm() {return scaling_algorithm_;}\n  static bool register_images_done;\n};\n\nclass Fl_SVG_Image;\n\n/**\n  The Fl_RGB_Image class supports caching and drawing\n  of full-color images with 1 to 4 channels of color information.\n  Images with an even number of channels are assumed to contain\n  alpha information, which is used to blend the image with the\n  contents of the screen.\n\n  Fl_RGB_Image is defined in\n  &lt;FL/Fl_Image.H&gt;, however for compatibility reasons\n  &lt;FL/Fl_RGB_Image.H&gt; should be included.\n*/\nclass FL_EXPORT Fl_RGB_Image : public Fl_Image {\n  friend class Fl_Graphics_Driver;\n  static size_t max_size_;\npublic:\n\n  /** Points to the start of the object's data array\n   \\see class Fl_SVG_Image which delays initialization of this member variable.\n   */\n  const uchar *array;\n  /** If non-zero, the object's data array is delete[]'d when deleting the object.\n   */\n  int alloc_array;\n\nprivate:\n  // These two variables are used to cache the image and mask for the main display graphics driver\n  fl_uintptr_t id_;\n  fl_uintptr_t mask_;\n  int cache_w_, cache_h_; // size of image when cached\npublic:\n\n  Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0);\n  Fl_RGB_Image(const uchar *bits, int bits_length, int W, int H, int D, int LD);\n  Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY);\n  ~Fl_RGB_Image() FL_OVERRIDE;\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const { return Fl_Image::copy(); }\n  void color_average(Fl_Color c, float i) FL_OVERRIDE;\n  void desaturate() FL_OVERRIDE;\n  void draw(int X, int Y, int W, int H, int cx=0, int cy=0) FL_OVERRIDE;\n  void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);}\n  void label(Fl_Widget*w) FL_OVERRIDE;\n  void label(Fl_Menu_Item*m) FL_OVERRIDE;\n  void uncache() FL_OVERRIDE;\n  int cache_w() {return cache_w_;}\n  int cache_h() {return cache_h_;}\n  /** Sets the maximum allowed image size in bytes when creating an Fl_RGB_Image object.\n\n   The image size in bytes of an Fl_RGB_Image object is the value of the product w() * h() * d().\n   If this product exceeds size, the created object of a derived class of Fl_RGB_Image\n   won't be loaded with the image data.\n   This does not apply to direct RGB image creation with\n   Fl_RGB_Image::Fl_RGB_Image(const uchar *bits, int W, int H, int D, int LD).\n   The default max_size() value is essentially infinite.\n   */\n  static void max_size(size_t size) { max_size_ = size;}\n  /** Returns the maximum allowed image size in bytes when creating an Fl_RGB_Image object.\n\n   \\sa  void Fl_RGB_Image::max_size(size_t)\n   */\n  static size_t max_size() {return max_size_;}\n  /** Returns whether an image is an Fl_SVG_Image or not.\n  This virtual method returns a pointer to the Fl_SVG_Image if this object is an instance of Fl_SVG_Image or NULL if not. */\n  virtual Fl_SVG_Image *as_svg_image() { return NULL; }\n  /** Makes sure the object is fully initialized.\n   In particular, makes sure member variable \\ref array is non-null. */\n  virtual void normalize() {}\n};\n\n#endif // !Fl_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Image_Surface.H",
    "content": "//\n// Draw-to-image code for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2016 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Image_Surface_H\n#define Fl_Image_Surface_H\n\n#include <FL/Fl_Widget_Surface.H>\n#include <FL/Fl_Image.H>\n#include <FL/Fl_Shared_Image.H>\n#include <FL/platform_types.h> // for Fl_Offscreen\n\n\n/**\n \\brief Directs all graphics requests to an Fl_Image.\n\n After creation of an Fl_Image_Surface object, make it the current drawing\n surface calling Fl_Surface_Device::push_current(), and all\n subsequent graphics requests will be recorded in the image. It's possible to\n draw widgets (using Fl_Image_Surface::draw()) or to use any of the\n \\ref fl_drawings or the \\ref fl_attributes. Finally, call image() on the object\n to obtain a newly allocated Fl_RGB_Image object.\n Fl_Gl_Window objects can be drawn in the image as well.\n\n Usage example:\n \\code\n // this is the widget that you want to draw into an image\n Fl_Widget *g = ...;\n\n // create an Fl_Image_Surface object\n Fl_Image_Surface *image_surface = new Fl_Image_Surface(g->w(), g->h());\n\n // direct all further graphics requests to the image\n Fl_Surface_Device::push_current(image_surface);\n\n // draw a white background\n fl_color(FL_WHITE);\n fl_rectf(0, 0, g->w(), g->h());\n\n // draw the g widget in the image\n image_surface->draw(g);\n\n // get the resulting image\n Fl_RGB_Image* image = image_surface->image();\n\n // direct graphics requests back to their previous destination\n Fl_Surface_Device::pop_current();\n\n // delete the image_surface object, but not the image itself\n delete image_surface;\n \\endcode\n*/\nclass FL_EXPORT Fl_Image_Surface : public Fl_Widget_Surface {\n  friend class Fl_Graphics_Driver;\nprivate:\n  class Fl_Image_Surface_Driver *platform_surface;\n  Fl_Offscreen get_offscreen_before_delete_();\nprotected:\n  void translate(int x, int y) FL_OVERRIDE;\n  void untranslate() FL_OVERRIDE;\npublic:\n  Fl_Image_Surface(int w, int h, int high_res = 0, Fl_Offscreen off = 0);\n  ~Fl_Image_Surface();\n  void set_current() FL_OVERRIDE;\n  bool is_current() FL_OVERRIDE;\n  Fl_RGB_Image *image();\n  Fl_Shared_Image *highres_image();\n  void origin(int *x, int *y) FL_OVERRIDE;\n  void origin(int x, int y) FL_OVERRIDE;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  Fl_Offscreen offscreen();\n  void rescale();\n  void mask(const Fl_RGB_Image *);\n};\n\n\n/**\n \\cond DriverDev\n \\addtogroup DriverDeveloper\n \\{\n */\n\n/** A base class describing the interface between FLTK and draw-to-image operations.\n This class is only for internal use by the FLTK library.\n A supported platform should implement the virtual methods of this class\n in order to support drawing to an Fl_RGB_Image through class Fl_Image_Surface.\n */\nclass Fl_Image_Surface_Driver : public Fl_Widget_Surface {\n  friend class Fl_Image_Surface;\nprivate:\n  Fl_Image_Surface *image_surface_;\nprotected:\n  int width;\n  int height;\n  Fl_Offscreen offscreen;\n  int external_offscreen;\n  Fl_Image_Surface_Driver(int w, int h, int /*high_res*/, Fl_Offscreen off) : Fl_Widget_Surface(NULL), width(w), height(h), offscreen(off) {external_offscreen = (off != 0);}\n  virtual ~Fl_Image_Surface_Driver() {}\n  static void copy_with_mask(Fl_RGB_Image* mask, uchar *dib_dst, uchar *dib_src,\n                             int line_size, bool bottom_to_top);\n  static Fl_RGB_Image *RGB3_to_RGB1(const Fl_RGB_Image *rgb3, int W, int H);\n  void set_current() FL_OVERRIDE = 0;\n  void translate(int x, int y) FL_OVERRIDE = 0;\n  void untranslate() FL_OVERRIDE = 0;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  virtual Fl_RGB_Image *image() = 0;\n  virtual void mask(const Fl_RGB_Image *) {}\n  /** Each platform implements this function its own way.\n   It returns an object implementing all virtual functions\n   of class Fl_Image_Surface_Driver for the plaform.\n   */\n  static Fl_Image_Surface_Driver *newImageSurfaceDriver(int w, int h, int high_res, Fl_Offscreen off);\npublic:\n  /** Returns pointer to the associated Fl_Image_Surface object */\n  Fl_Image_Surface *image_surface() { return image_surface_; }\n};\n\n/**\n \\}\n \\endcond\n */\n\n#endif // Fl_Image_Surface_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Input.H",
    "content": "//\n// Input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Input widget . */\n\n#ifndef Fl_Input_H\n#define Fl_Input_H\n\n#include \"Fl_Input_.H\"\n\n/**\n  This is the FLTK text input widget. It displays a single line\n  of text and lets the user edit it. Normally it is drawn with an\n  inset box and a white background. The text may contain any\n  characters, and will correctly display any UTF text, using\n  ^X notation for unprintable control characters. It assumes the\n  font can draw any characters of the used scripts, which is true\n  for standard fonts under Windows and Mac OS X.\n  Characters can be input using the keyboard or the character palette/map.\n  Character composition is done using dead keys and/or a compose\n  key as defined by the operating system.\n  <P>\n  <!-- DON'T use the class name in the caption, or doxygen 1.8.x will fail. -->\n  <TABLE WIDTH=\"90%\" BORDER=\"1\" SUMMARY=\"Fl_Input keyboard and mouse bindings.\">\n    <CAPTION ALIGN=\"TOP\">Keyboard and mouse bindings.</CAPTION>\n    <TR><TD NOWRAP=\"NOWRAP\" WIDTH=\"1%\">\n      <B>Mouse button 1</B>\n    </TD><TD>\n      Moves the cursor to this point.\n      Drag selects characters.\n      Double click selects words.\n      Triple click selects all line.\n      Shift+click extends the selection.\n      When you select text it is automatically copied to the selection buffer.\n    </TD></TR><TR><TD NOWRAP=\"NOWRAP\">\n      <B>Mouse button 2</B>\n    </TD><TD>\n      Insert the selection buffer at the point clicked.\n      You can also select a region and replace it with the selection buffer\n      by selecting the region with mouse button 2.\n    </TD></TR><TR><TD NOWRAP=\"NOWRAP\">\n      <B>Mouse button 3</B>\n    </TD><TD>\n      Currently acts like button 1.\n    </TD></TR><TR><TD NOWRAP=\"NOWRAP\">\n      <B>Backspace</B>\n    </TD><TD>\n      Deletes one character to the left, or deletes the selected region.\n    </TD></TR><TR><TD NOWRAP=\"NOWRAP\">\n      <B>Delete</B>\n    </TD><TD>\n      Deletes one character to the right, or deletes the selected region.\n      Combine with Shift for equivalent of ^X (copy+cut).\n    </TD></TR><TR><TD NOWRAP=\"NOWRAP\">\n      <B>Enter</b>\n    </TD><TD>\n      May cause the callback, see when().\n  </TD></TR></TABLE>\n\n  <P>\n\n  <TABLE WIDTH=\"90%\" BORDER=\"1\" SUMMARY=\"Fl_Input platform specific keyboard bindings.\">\n    <CAPTION ALIGN=\"TOP\">Platform specific keyboard bindings.</CAPTION>\n  <TR>\n    <TD NOWRAP=\"NOWRAP\" WIDTH=\"1%\"><B> Windows/Linux </B></TD>\n    <TD NOWRAP=\"NOWRAP\" WIDTH=\"1%\"><B> Mac </B></TD>\n    <TD NOWRAP=\"NOWRAP\"           ><B> Function </B></TD>\n\n  </TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^A </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-A </B></TD>\n    <TD>\n      <B>Selects all text in the widget.</B>\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^C </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-C </B></TD>\n    <TD>\n      <B>Copy the current selection to the clipboard.</B>\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^I </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> ^I </B></TD>\n    <TD>\n      <B>Insert a tab.</B>\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^J </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> ^J </B></TD>\n    <TD>\n      <B>Insert a Line Feed.</B> <BR>\n      (Similar to literal 'Enter' character)\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^L </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> ^L </B></TD>\n    <TD>\n      <B>Insert a Form Feed.</B>\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^M </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> ^M </B></TD>\n    <TD>\n      <B>Insert a Carriage Return.</B>\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^V,<BR>Shift-Insert </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-V </B></TD>\n    <TD>\n      <B>Paste the clipboard.</B> <BR>\n      (Macs keyboards don't have \"Insert\" keys,\n      but if they did, Shift-Insert would work)\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^X,<BR>Shift-Delete </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-X,<BR>Shift-Delete </B></TD>\n    <TD>\n      <B>Cut.</B> <BR>\n      Copy the selection to the clipboard and delete it.\n      (If there's no selection, Shift-Delete acts like Delete)\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> ^Z </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-Z </B></TD>\n    <TD>\n      <B>Undo.</B> <BR>\n      This is a single-level undo mechanism, but all adjacent\n      deletions and insertions are concatenated into a single \"undo\".\n      Often this will undo a lot more than you expected.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Shift-^Z </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Shift-Command-Z </B></TD>\n    <TD>\n      <B>Redo.</B> <BR>\n      Currently same behavior as ^Z.\n      Reserved for future multilevel undo/redo.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Arrow Keys </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Arrow Keys </B></TD>\n    <TD>\n      <B>Standard cursor movement.</B> <BR>\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Home </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-Up,<BR>Command-Left </B></TD>\n    <TD>\n      <B>Move to start of line.</B> <BR>\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> End </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-Down,<BR>Command-Right </B></TD>\n    <TD>\n      <B>Move to end of line.</B> <BR>\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B>Ctrl-Home</B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B>Command-Up,<BR>Command-PgUp,<BR>Ctrl-Left</B></TD>\n    <TD>\n      <B>Move to top of document/field.</B> <BR>\n      In single line input, moves to start of line.\n      In multiline input, moves to start of top line.\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Ctrl-End </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Command-End,<BR>Command-PgDn,<BR>Ctrl-Right</B></TD>\n    <TD>\n      <B>Move to bottom of document/field.</B> <BR>\n      In single line input, moves to end of line.\n      In multiline input, moves to end of last line.\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Ctrl-Left </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Alt-Left </B></TD>\n    <TD>\n      <B>Word left.</B> <BR>\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Ctrl-Right </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Alt-Right </B></TD>\n    <TD>\n      <B>Word right.</B> <BR>\n      Can be combined with Shift to extend selection.\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Ctrl-Backspace </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Alt-Backspace </B></TD>\n    <TD>\n      <B>Delete word left.</B>\n\n  </TD></TR><TR>\n    <TD NOWRAP=\"NOWRAP\"><B> Ctrl-Delete </B></TD>\n    <TD NOWRAP=\"NOWRAP\"><B> Alt-Delete </B></TD>\n    <TD>\n      <B>Delete word right.</B>\n\n  </TD></TR></TABLE>\n  */\nclass FL_EXPORT Fl_Input : public Fl_Input_ {\n  friend class Fl_Screen_Driver;\n  friend class Fl_Cocoa_Screen_Driver; // Not ideal, but probably no other platform will use it\n  int shift_position(int p);\n  int shift_up_down_position(int p);\n  void handle_mouse(int keepmark=0);\n\n  // Private keyboard functions\n  int kf_lines_up(int repeat_num);\n  int kf_lines_down(int repeat_num);\n  int kf_page_up();\n  int kf_page_down();\n  int kf_insert_toggle();\n  int kf_delete_word_right();\n  int kf_delete_word_left();\n  int kf_delete_sol();\n  int kf_delete_eol();\n  int kf_delete_char_right();\n  int kf_delete_char_left();\n  int kf_move_sol();\n  int kf_move_eol();\n  int kf_clear_eol();\n  int kf_move_char_left();\n  int kf_move_char_right();\n  int kf_move_word_left();\n  int kf_move_word_right();\n  int kf_move_up_and_sol();\n  int kf_move_down_and_eol();\n  int kf_top();\n  int kf_bottom();\n  int kf_select_all();\n  int kf_undo();\n  int kf_redo();\n  int kf_copy();\n  int kf_paste();\n  int kf_copy_cut();\n\nprotected:\n  void draw() FL_OVERRIDE;\n  int handle_key();\n  int handle_rmb();\n\npublic:\n  int handle(int) FL_OVERRIDE;\n  Fl_Input(int,int,int,int,const char * = 0);\n  static const char *cut_menu_text;\n  static const char *copy_menu_text;\n  static const char *paste_menu_text;\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Input_.H",
    "content": "//\n// Input base class header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2015 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Input_ widget . */\n\n#ifndef Fl_Input__H\n#define Fl_Input__H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n#define FL_NORMAL_INPUT         0\n#define FL_FLOAT_INPUT          1\n#define FL_INT_INPUT            2\n#define FL_HIDDEN_INPUT         3\n#define FL_MULTILINE_INPUT      4\n#define FL_SECRET_INPUT         5\n#define FL_INPUT_TYPE           7\n#define FL_INPUT_READONLY       8\n#define FL_NORMAL_OUTPUT        (FL_NORMAL_INPUT | FL_INPUT_READONLY)\n#define FL_MULTILINE_OUTPUT     (FL_MULTILINE_INPUT | FL_INPUT_READONLY)\n#define FL_INPUT_WRAP           16\n#define FL_MULTILINE_INPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_WRAP)\n#define FL_MULTILINE_OUTPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_READONLY | FL_INPUT_WRAP)\n\nclass Fl_Input_Undo_Action;\nclass Fl_Input_Undo_Action_List;\n\n/**\n  This class provides a low-overhead text input field.\n\n  This is a virtual base class below Fl_Input. It has all\n  the same interfaces, but lacks the handle() and\n  draw() method. You may want to subclass it if you are\n  one of those people who likes to change how the editing keys\n  work. It may also be useful for adding scrollbars\n  to the input field.\n\n  This can act like any of the subclasses of Fl_Input, by\n  setting type() to one of the following values:\n\n  \\code\n  #define FL_NORMAL_INPUT          0\n  #define FL_FLOAT_INPUT           1\n  #define FL_INT_INPUT             2\n  #define FL_MULTILINE_INPUT       4\n  #define FL_SECRET_INPUT          5\n  #define FL_INPUT_TYPE            7\n  #define FL_INPUT_READONLY        8\n  #define FL_NORMAL_OUTPUT         (FL_NORMAL_INPUT | FL_INPUT_READONLY)\n  #define FL_MULTILINE_OUTPUT      (FL_MULTILINE_INPUT | FL_INPUT_READONLY)\n  #define FL_INPUT_WRAP            16\n  #define FL_MULTILINE_INPUT_WRAP  (FL_MULTILINE_INPUT | FL_INPUT_WRAP)\n  #define FL_MULTILINE_OUTPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_READONLY | FL_INPUT_WRAP)\n  \\endcode\n\n  All variables that represent an index into a text buffer are byte-oriented,\n  not character oriented, counting from 0 (at or before the first character)\n  to size() (at the end of the buffer, after the last byte). Since UTF-8\n  characters can be up to six bytes long, simply incrementing such an index\n  will not reliably advance to the next character in the text buffer.\n\n  Indices and pointers into the text buffer should always point at a 7 bit ASCII\n  character or the beginning of a UTF-8 character sequence. Behavior for false\n  UTF-8 sequences and pointers into the middle of a sequence are undefined.\n\n  \\see Fl_Text_Display, Fl_Text_Editor for more powerful text handling widgets\n  \\see Fl_Widget::shortcut_label(int)\n\n  \\internal\n  When porting this widget from ASCII to UTF-8, previously legal pointers into\n  the text of this widget can become illegal by pointing into the middle of\n  a UTF-8 sequence. This is not a big problem for Fl_Input_ because all code\n  in this module is quite tolerant. It could be problematic though when deriving\n  from this class because no feedback for illegal pointers is given. Additionally,\n  a careless \"copy\" call can put partial UTF-8 sequences into the clipboard.\n\n  None of these issues should be disastrous. Nevertheless, we should\n  discuss how FLTK should handle false UTF-8 sequences and pointers.\n*/\nclass FL_EXPORT Fl_Input_ : public Fl_Widget {\n\n  /** \\internal Storage for the text field. */\n  const char* value_;\n\n  /** \\internal Buffer memory for expanded text. \\see expand() */\n  char* buffer;\n\n  /** \\internal Size of text in bytes in the \\p value_ field. */\n  int size_;\n\n  /** \\internal Current size of internal value() buffer in bytes. */\n  int bufsize;\n\n  /** \\internal Position of the cursor in the document. */\n  int position_;\n\n  /** \\internal Position of the other end of the selected text.\n      If \\p position_ equals \\p mark_, no text is selected */\n  int mark_;\n\n  /** \\internal Behavior of Tab key in multiline input widget.\n      If enabled (default) Tab causes focus nav, otherwise Tab is inserted\n      as a character. */\n  int tab_nav_;\n\n  /** \\internal Offset to text origin within widget bounds */\n  int xscroll_, yscroll_;\n\n  /** \\internal Minimal update pointer. Display requires redraw from here to the end\n      of the buffer. */\n  int mu_p;\n\n  /** \\internal Maximum number of (UTF-8) characters a user can input. */\n  int maximum_size_;\n\n  /** \\internal Shortcut key that will fetch focus for this widget. */\n  int shortcut_;\n\n  /** \\internal This is set if no text but only the cursor needs updating. */\n  uchar erase_cursor_only;\n\n  /** \\internal The font used for the entire text. */\n  Fl_Font textfont_;\n\n  /** \\internal Height of the font used for the entire text. */\n  Fl_Fontsize textsize_;\n\n  /** \\internal color of the entire text */\n  Fl_Color textcolor_;\n\n  /** \\internal color of the text cursor */\n  Fl_Color cursor_color_;\n\n  /** \\internal local undo event */\n  Fl_Input_Undo_Action* undo_;\n  Fl_Input_Undo_Action_List* undo_list_;\n  Fl_Input_Undo_Action_List* redo_list_;\n\n  /** \\internal Horizontal cursor position in pixels while moving up or down. */\n  static double up_down_pos;\n\n  /** \\internal Flag to remember last cursor move. */\n  static int was_up_down;\n\n  /* Convert a given text segment into the text that will be rendered on screen. */\n  const char* expand(const char*, char*) const;\n\n  /* Calculates the width in pixels of part of a text buffer. */\n  double expandpos(const char*, const char*, const char*, int*) const;\n\n  /* Mark a range of characters for update. */\n  void minimal_update(int, int);\n\n  /* Mark a range of characters for update. */\n  void minimal_update(int p);\n\n  /* Copy the value from a possibly static entry into the internal buffer. */\n  void put_in_buffer(int newsize);\n\n  /* Set the current font and font size. */\n  void setfont() const;\n\nprotected:\n\n  /* Find the start of a word. */\n  int word_start(int i) const;\n\n  /* Find the end of a word. */\n  int word_end(int i) const;\n\n  /* Find the start of a line. */\n  int line_start(int i) const;\n\n  /* Find the end of a line. */\n  int line_end(int i) const;\n\n  /* Draw the text in the passed bounding box. */\n  void drawtext(int, int, int, int);\n\n  /* Draw the text in the passed bounding box. */\n  void drawtext(int, int, int, int, bool draw_active);\n\n  /* Move the cursor to the column given by up_down_pos. */\n  int up_down_position(int, int keepmark=0);\n\n  /* Handle mouse clicks and mouse moves. */\n  void handle_mouse(int, int, int, int, int keepmark=0);\n\n  /* Handle all kinds of text field related events. */\n  int handletext(int e, int, int, int, int);\n\n  /* Check the when() field and do a callback if indicated. */\n  void maybe_do_callback(Fl_Callback_Reason reason = FL_REASON_UNKNOWN);\n\n  /** \\internal Horizontal offset of text to left edge of widget. */\n  int xscroll() const {return xscroll_;}\n\n  /** \\internal Vertical offset of text to top edge of widget. */\n  int yscroll() const {return yscroll_;}\n  void yscroll(int yOffset) { yscroll_ = yOffset; damage(FL_DAMAGE_EXPOSE);}\n\n  /* Return the number of lines displayed on a single page.  */\n  int linesPerPage();\n\n  /* Apply the current undo/redo operation, called from undo() or redo() */\n  int apply_undo();\n\npublic:\n\n  /* Change the size of the widget. */\n  void resize(int, int, int, int) FL_OVERRIDE;\n\n  /* Constructor */\n  Fl_Input_(int, int, int, int, const char* = 0);\n\n  /* Destructor */\n  ~Fl_Input_();\n\n  /* Changes the widget text. */\n  int value(const char*);\n\n  /* Changes the widget text. */\n  int value(const char*, int);\n\n  /* Changes the widget text. */\n  int value(int value);\n\n  /* Changes the widget text. */\n  int value(double value);\n\n  /* Changes the widget text. */\n  int static_value(const char*);\n\n  /* Changes the widget text. */\n  int static_value(const char*, int);\n\n  /**\n      Returns the text displayed in the widget.\n\n      This function returns the current value, which is a pointer\n      to the internal buffer and is valid only until the next event is\n      handled.\n\n      \\return pointer to an internal buffer - do not free() this\n      \\see Fl_Input_::value(const char*)\n  */\n  const char* value() const {return value_;}\n\n  int ivalue() const;\n\n  double dvalue() const;\n\n  /* Returns the Unicode character at index \\p i. */\n  unsigned int index(int i) const;\n\n  /**\n    Returns the number of bytes in value().\n\n    This may be greater than <tt>strlen(value())</tt> if there are\n    \\c nul characters in the text.\n\n    \\return number of bytes in the text\n  */\n  int size() const {return size_;}\n\n  /** Sets the width and height of this widget.\n    \\param [in] W, H new width and height\n    \\see Fl_Widget::size(int, int) */\n  void size(int W, int H) { Fl_Widget::size(W, H); }\n\n  /** Gets the maximum length of the input field in characters.\n    \\see maximum_size(int). */\n  int maximum_size() const {return maximum_size_;}\n\n  /** Sets the maximum length of the input field in characters.\n\n    This limits the number of <b>characters</b> that can be inserted\n    in the widget.\n\n    Since FLTK 1.3 this is different than the buffer size, since one\n    character can be more than one byte in UTF-8 encoding. In FLTK 1.1\n    this was the same (one byte = one character).\n  */\n  void maximum_size(int m) {maximum_size_ = m;}\n\n  /** Gets the position of the text cursor.\n    \\return the cursor position as an index in the range 0..size()\n    \\see insert_position(int, int)\n  */\n  int insert_position() const { return position_; }\n  FL_DEPRECATED(\"since 1.4.0 - use insert_position() instead\",\n  int position() const ) { return insert_position(); }\n\n  /** Gets the current selection mark.\n    \\return index into the text */\n  int mark() const {return mark_;}\n\n  /* Sets the index for the cursor and mark. */\n  int insert_position(int p, int m);\n  FL_DEPRECATED(\"since 1.4.0 - use insert_position(p, m) or Fl_Widget::position(x, y) instead\",\n  int position(int p, int m)) { return insert_position(p, m); }\n\n  /** Sets the cursor position and mark.\n    position(n) is the same as <tt>position(n, n)</tt>.\n    \\param p new index for cursor and mark\n    \\return 0 if no positions changed\n    \\see insert_position(int, int), insert_position(), mark(int)\n  */\n  int insert_position(int p) { return insert_position(p, p); }\n  FL_DEPRECATED(\"since 1.4.0 - use insert_position(p) instead\",\n  int position(int p)) { return insert_position(p); }\n\n  /** Sets the current selection mark.\n    mark(n) is the same as <tt>insert_position(insert_position(),n)</tt>.\n    \\param m new index of the mark\n    \\return 0 if the mark did not change\n    \\see insert_position(), insert_position(int, int) */\n  int mark(int m) {return insert_position(insert_position(), m);}\n\n  /* Deletes text from \\p b to \\p e and inserts the new string \\p text. */\n  int replace(int b, int e, const char *text, int ilen=0);\n\n  /**\n    Deletes the current selection.\n\n    This function deletes the currently selected text\n    \\e without storing it in the clipboard. To use the clipboard,\n    you may call copy() first or copy_cuts() after\n    this call.\n\n    \\return 0 if no data was copied\n  */\n  int cut() {return replace(insert_position(), mark(), 0);}\n\n  /**\n    Deletes the next \\p n bytes rounded to characters before or after the cursor.\n\n    This function deletes the currently selected text\n    \\e without storing it in the clipboard. To use the clipboard,\n    you may call copy() first or copy_cuts() after\n    this call.\n\n    \\param n number of bytes rounded to full characters and clamped to the buffer.\n           A negative number will cut characters to the left of the cursor.\n    \\return 0 if no data was copied\n  */\n  int cut(int n) {return replace(insert_position(), insert_position()+n, 0);}\n\n  /**\n    Deletes all characters between index \\p a and \\p b.\n\n    This function deletes the currently selected text\n    \\e without storing it in the clipboard. To use the clipboard,\n    you may call copy() first or copy_cuts() after\n    this call.\n\n    \\param a, b range of bytes rounded to full characters and clamped to the buffer\n    \\return 0 if no data was copied\n  */\n  int cut(int a, int b) {return replace(a, b, 0);}\n\n  /**\n    Inserts text at the cursor position.\n\n    This function inserts the string in \\p t at the cursor\n    position() and moves the new position and mark to\n    the end of the inserted text.\n\n    \\param [in] t text that will be inserted\n    \\param [in] l length of text, or 0 if the string is terminated by \\c nul.\n    \\return 0 if no text was inserted\n  */\n  int insert(const char* t, int l=0){return replace(position_, mark_, t, l);}\n\n  /* Append text at the end. */\n  int append(const char* t, int l=0, char keep_selection=0);\n\n  /* Put the current selection into the clipboard. */\n  int copy(int clipboard);\n\n  /* Undo previous changes to the text buffer. */\n  int undo();\n\n  /* Return true if the last operation can be undone. */\n  bool can_undo() const;\n\n  /* Redo previous undo operations. */\n  int redo();\n\n  /* Return true if there is a redo action in the list. */\n  bool can_redo() const;\n\n  /* Copy the yank buffer to the clipboard. */\n  int copy_cuts();\n\n  /** Return the shortcut key associated with this widget.\n    \\return shortcut keystroke\n    \\see Fl_Button::shortcut() */\n  int shortcut() const {return shortcut_;}\n\n  /**\n    Sets the shortcut key associated with this widget.\n    Pressing the shortcut key gives text editing focus to this widget.\n    \\param [in] s new shortcut keystroke\n    \\see Fl_Button::shortcut()\n  */\n  void shortcut(int s) {shortcut_ = s;}\n\n  /** Gets the font of the text in the input field.\n    \\return the current Fl_Font index */\n  Fl_Font textfont() const {return textfont_;}\n\n  /** Sets the font of the text in the input field.\n    The text font defaults to \\c FL_HELVETICA.\n    \\param [in] s the new text font */\n  void textfont(Fl_Font s) {textfont_ = s;}\n\n  /** Gets the size of the text in the input field.\n    \\return the text height in pixels */\n  Fl_Fontsize textsize() const {return textsize_;}\n\n  /** Sets the size of the text in the input field.\n    The text height defaults to \\c FL_NORMAL_SIZE.\n    \\param [in] s the new font height in pixel units */\n  void textsize(Fl_Fontsize s) {textsize_ = s;}\n\n  /** Gets the color of the text in the input field.\n    \\return the text color\n    \\see textcolor(Fl_Color) */\n  Fl_Color textcolor() const {return textcolor_;}\n\n  /** Sets the color of the text in the input field.\n    The text color defaults to \\c FL_FOREGROUND_COLOR.\n    \\param [in] n new text color\n    \\see textcolor() */\n  void textcolor(Fl_Color n) {textcolor_ = n;}\n\n  /** Gets the color of the cursor.\n    \\return the current cursor color */\n  Fl_Color cursor_color() const {return cursor_color_;}\n\n  /** Sets the color of the cursor.\n    The default color for the cursor is \\c FL_BLACK.\n    \\param [in] n the new cursor color */\n  void cursor_color(Fl_Color n) {cursor_color_ = n;}\n\n  /** Gets the input field type.\n    \\return the current input type */\n  int input_type() const {return type() & FL_INPUT_TYPE; }\n\n  /** Sets the input field type.\n    A redraw() is required to reformat the input field.\n    \\param [in] t new input type */\n  void input_type(int t) { type((uchar)(t | readonly())); }\n\n  /** Gets the read-only state of the input field.\n    \\return non-zero if this widget is read-only */\n  int readonly() const { return type() & FL_INPUT_READONLY; }\n\n  /** Sets the read-only state of the input field.\n    \\param [in] b if \\p b is 0, the text in this widget can be edited by the user */\n  void readonly(int b) { if (b) type((uchar)(type() | FL_INPUT_READONLY));\n                         else type((uchar)(type() & ~FL_INPUT_READONLY)); }\n\n  /**\n    Gets  the word wrapping state of the input field.\n    Word wrap is only functional with multi-line input fields.\n  */\n  int wrap() const { return type() & FL_INPUT_WRAP; }\n\n  /**\n    Sets the word wrapping state of the input field.\n    Word wrap is only functional with multi-line input fields.\n  */\n  void wrap(int b) { if (b) type((uchar)(type() | FL_INPUT_WRAP));\n                         else type((uchar)(type() & ~FL_INPUT_WRAP)); }\n\n  /**\n    Sets whether the Tab key does focus navigation,\n    or inserts tab characters into Fl_Multiline_Input.\n\n    By default this flag is enabled to provide the 'normal' behavior\n    most users expect; Tab navigates focus to the next widget.\n    To inserting an actual Tab character, users can use Ctrl-I\n    or copy/paste.\n\n    Disabling this flag gives the old FLTK behavior where Tab\n    inserts a tab character into the text field, in which case\n    only the mouse can be used to navigate to the next field.\n\n    History: This flag was provided for backwards support of FLTK's old 1.1.x\n    behavior where Tab inserts a tab character instead of navigating\n    focus to the next widget. This behavior was unique to Fl_Multiline_Input.\n    With the advent of Fl_Text_Editor, this old behavior has been deprecated.\n\n    \\param [in] val If \\p val is 1, Tab advances focus (default).<BR>\n                    If \\p val is 0, Tab inserts a tab character (old FLTK behavior).\n\n    \\see tab_nav(), Fl::OPTION_ARROW_FOCUS.\n  */\n  void tab_nav(int val) {\n    tab_nav_ = val;\n  }\n\n  /**\n    Gets whether the Tab key causes focus navigation in multiline input fields or not.\n\n    If enabled (default), hitting Tab causes focus navigation to the next widget.\n\n    If disabled, hitting Tab inserts a tab character into the text field.\n    \\returns 1 if Tab advances focus (default), 0 if Tab inserts tab characters.\n\n    \\see tab_nav(int), Fl::OPTION_ARROW_FOCUS.\n  */\n  int tab_nav() const {\n    return tab_nav_;\n  }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Input_Choice.H",
    "content": "//\n// An input/chooser widget.\n//            ______________  ____\n//           |              || __ |\n//           | input area   || \\/ |\n//           |______________||____|\n//\n// Copyright 2004 by Greg Ercolano.\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Input_Choice widget . */\n\n#ifndef Fl_Input_Choice_H\n#define Fl_Input_Choice_H\n\n#include <FL/Fl.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Input.H>\n#include <FL/Fl_Menu_Button.H>\n\n/*\n  A combination of the input widget and a menu button.\n\n  The user can either type into the input area, or use the\n  menu button chooser on the right to choose an item which loads\n  the input area with the selected text.\n\n  Note: doxygen docs in src/Fl_Input_Choice.cxx\n*/\n\nclass FL_EXPORT Fl_Input_Choice : public Fl_Group {\n\n  // Private class to handle slightly 'special' behavior of menu button\n  class InputMenuButton : public Fl_Menu_Button {\n    void draw() FL_OVERRIDE;\n    const Fl_Menu_Item* popup();\n  public:\n    InputMenuButton(int X, int Y, int W, int H, const char *L=0);\n    int handle(int e) FL_OVERRIDE;\n  };\n\n  Fl_Input *inp_;\n  InputMenuButton *menu_;\n\n  // note: this is used by the Fl_Input_Choice ctor.\n  static void menu_cb(Fl_Widget*, void *data);\n\n  // note: this is used by the Fl_Input_Choice ctor.\n  static void inp_cb(Fl_Widget*, void *data);\n\nprotected:\n  // Custom resize behavior -- input stretches, menu button doesn't\n\n  /** The methods inp_x(), inp_y(), inp_w() and inp_h() return the\n      desired position and size of the internal Fl_Input widget.\n      These can be overridden by a subclass to redefine positioning.\n      See code example in the Description for subclassing details.\n  */\n  virtual int inp_x() const { return(x() + Fl::box_dx(box())); }\n  /** See inp_x() for info. */\n  virtual int inp_y() const { return(y() + Fl::box_dy(box())); }\n  /** See inp_x() for info. */\n  virtual int inp_w() const { return(w() - Fl::box_dw(box()) - menu_w()); }\n  /** See inp_x() for info. */\n  virtual int inp_h() const { return(h() - Fl::box_dh(box())); }\n\n  /** The methods menu_x(), menu_y(), menu_w() and menu_h() return the\n      desired position and size of the internal Fl_Menu_Button widget.\n      These can be overridden by a subclass to redefine positioning.\n      See code example in the Description for subclassing details.\n  */\n  virtual int menu_x() const { return x() + w() - menu_w() - Fl::box_dx(box()); }\n  /** See menu_x() for info. */\n  virtual int menu_y() const { return y() + Fl::box_dy(box()); }\n  /** See menu_x() for info. */\n  virtual int menu_w() const { return 20; }\n  /** See menu_x() for info. */\n  virtual int menu_h() const { return h() - Fl::box_dh(box()); }\n\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  Fl_Input_Choice(int X, int Y, int W, int H, const char *L=0);\n\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n\n  /** Adds an item to the menu.\n    When any item is selected, the Fl_Input_Choice callback() is invoked,\n    which can do something with the selected item.\n\n    You can access the more complex Fl_Menu_Button::add() methods\n    (setting item-specific callbacks, userdata, etc), via menubutton(). Example:\n    \\code\n    Fl_Input_Choice *choice = new Fl_Input_Choice(100,10,120,25,\"Fonts\");\n    Fl_Menu_Button *mb = choice->menubutton();             // use Fl_Input_Choice's Fl_Menu_Button\n    mb->add(\"Helvetica\", 0, MyFont_CB,     (void*)mydata); // use Fl_Menu_Button's add() methods\n    mb->add(\"Courier\",   0, MyFont_CB,     (void*)mydata);\n    mb->add(\"More..\",    0, FontDialog_CB, (void*)mydata);\n    \\endcode\n  */\n  void add(const char *s) { menu_->add(s); }\n\n  /** Returns the combined changed() state of the input and menu button widget. */\n  int changed() const { return inp_->changed() | Fl_Widget::changed(); }\n\n  // Clears the changed() state of both input and menu button widgets.\n  void clear_changed();\n\n  // Sets the changed() state of both input and menu button widgets.\n  void set_changed();\n\n  /** Removes all items from the menu. */\n  void clear() { menu_->clear(); }\n\n  /** Gets the box type of the menu button */\n  Fl_Boxtype down_box() const { return (menu_->down_box()); }\n\n  /** Sets the box type of the menu button */\n  void down_box(Fl_Boxtype b) { menu_->down_box(b); }\n\n  /** Gets the Fl_Menu_Item array used for the menu. */\n  const Fl_Menu_Item *menu() { return (menu_->menu()); }\n\n  /** Sets the Fl_Menu_Item array used for the menu. */\n  void menu(const Fl_Menu_Item *m) { menu_->menu(m); }\n\n  /// Gets the Fl_Input text field's text color.\n  Fl_Color textcolor() const { return (inp_->textcolor());}\n\n  /// Sets the Fl_Input text field's text color to \\p c.\n  void textcolor(Fl_Color c) { inp_->textcolor(c);}\n\n  /// Gets the Fl_Input text field's font style.\n  Fl_Font textfont() const { return (inp_->textfont());}\n\n  /// Sets the Fl_Input text field's font style to \\p f.\n  void textfont(Fl_Font f) { inp_->textfont(f);}\n\n  /// Gets the Fl_Input text field's font size\n  Fl_Fontsize textsize() const { return (inp_->textsize()); }\n\n  /// Sets the Fl_Input text field's font size to \\p s.\n  void textsize(Fl_Fontsize s) { inp_->textsize(s); }\n\n  /// Returns the Fl_Input text field's current contents.\n  const char* value() const { return (inp_->value()); }\n\n  /** Sets the Fl_Input text field's contents to \\p val.\n\n    Note it is possible to set the value() to one that is not\n    in the menubutton's list of choices.\n\n    Setting the value() does NOT affect the menubutton's selection.\n    If that's needed, call update_menubutton() after setting value().\n\n    \\see void value(int val), update_menubutton()\n  */\n  void value(const char *val) { inp_->value(val); }\n\n  /* Chooses item# \\p val in the menu, and sets the Fl_Input text field\n    to that value. Any previous text is cleared. */\n  void value(int val);\n\n  int update_menubutton();\n\n  /** Returns a pointer to the internal Fl_Menu_Button widget.\n    This can be used to access any of the methods of the menu button, e.g.\n    \\code\n    Fl_Input_Choice *choice = new Fl_Input_Choice(100,10,120,25,\"Choice:\");\n    [..]\n    // Print all the items in the choice menu\n    for ( int t=0; t<choice->menubutton()->size(); t++ ) {\n       const Fl_Menu_Item &item = choice->menubutton()->menu()[t];\n       printf(\"item %d -- label=%s\\n\", t, item.label() ? item.label() : \"(Null)\");\n    }\n    \\endcode\n  */\n  Fl_Menu_Button *menubutton() { return menu_; }\n\n  /** Returns a pointer to the internal Fl_Input widget.\n    This can be used to directly access all of the Fl_Input widget's methods.\n  */\n  Fl_Input *input() { return inp_; }\n};\n\n#endif // !Fl_Input_Choice_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Int_Input.H",
    "content": "//\n// Integer input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Int_Input widget . */\n\n#ifndef Fl_Int_Input_H\n#define Fl_Int_Input_H\n\n#include \"Fl_Input.H\"\n\n/**\n  The Fl_Int_Input class is a subclass of Fl_Input that only allows\n  the user to type decimal digits (or hex numbers of the form 0xaef).\n*/\nclass FL_EXPORT Fl_Int_Input : public Fl_Input {\npublic:\n  /**\n    Creates a new Fl_Int_Input widget using the given position,\n    size, and label string. The default boxtype is FL_DOWN_BOX.\n\n    Inherited destructor destroys the widget and any value associated with it.\n  */\n  Fl_Int_Input(int X,int Y,int W,int H,const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_JPEG_Image.H",
    "content": "//\n// JPEG image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_JPEG_Image class . */\n\n#ifndef Fl_JPEG_Image_H\n#define Fl_JPEG_Image_H\n#  include \"Fl_Image.H\"\n\n/**\n The Fl_JPEG_Image class supports loading, caching,\n and drawing of Joint Photographic Experts Group (JPEG) File\n Interchange Format (JFIF) images. The class supports grayscale\n and color (RGB) JPEG image files.\n */\nclass FL_EXPORT Fl_JPEG_Image : public Fl_RGB_Image {\n\npublic:\n\n  Fl_JPEG_Image(const char *filename);\n  Fl_JPEG_Image(const char *name, const unsigned char *data, int data_length=-1);\n\nprotected:\n\n  void load_jpg_(const char *filename, const char *sharename, const unsigned char *data, int data_length=-1);\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Light_Button.H",
    "content": "//\n// Lighted button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Light_Button widget . */\n\n#ifndef Fl_Light_Button_H\n#define Fl_Light_Button_H\n\n#include \"Fl_Button.H\"\n\n/**\n  This subclass displays the \"on\" state by turning on a light,\n  rather than drawing pushed in.  The shape of the  \"light\"\n  is initially set to FL_DOWN_BOX.  The color of the light when\n  on is controlled with selection_color(), which defaults to FL_YELLOW.\n\n  Buttons generate callbacks when they are clicked by the user.  You\n  control exactly when and how by changing the values for type() and when().\n  \\image html  Fl_Light_Button.png\n  \\image latex Fl_Light_Button.png \"Fl_Light_Button\" width=4cm\n*/\nclass FL_EXPORT Fl_Light_Button : public Fl_Button {\nprotected:\n    void draw() FL_OVERRIDE;\npublic:\n    int handle(int) FL_OVERRIDE;\n    Fl_Light_Button(int x,int y,int w,int h,const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Line_Dial.H",
    "content": "//\n// Line dial header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Line_Dial widget . */\n\n#ifndef Fl_Line_Dial_H\n#define Fl_Line_Dial_H\n\n#include \"Fl_Dial.H\"\n\nclass FL_EXPORT Fl_Line_Dial : public Fl_Dial {\npublic:\n  Fl_Line_Dial(int X,int Y,int W,int H, const char *L = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Menu.H",
    "content": "//\n// Old menu header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// this include file is for back compatibility only\n#include \"Fl_Menu_Item.H\"\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Menu_.H",
    "content": "//\n// Menu base class header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Menu_ widget . */\n\n#ifndef Fl_Menu__H\n#define Fl_Menu__H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n#include \"Fl_Menu_Item.H\"\n\n/**\n  Base class of all widgets that have a menu in FLTK.\n\n  Currently FLTK provides you with Fl_Menu_Button, Fl_Menu_Bar, and Fl_Choice.\n\n  The class contains a pointer to an array of structures of type Fl_Menu_Item.\n  The array may either be supplied directly by the user program, or it may\n  be \"private\": a dynamically allocated array managed by the Fl_Menu_.\n\n  When the user clicks a menu item, value() is set to that item\n  and then:\n\n    - If the Fl_Menu_Item has a callback set, that callback\n      is invoked with any userdata configured for it.\n      (The Fl_Menu_ widget's callback is NOT invoked.)\n\n    - For any Fl_Menu_Items that \\b don't have a callback set,\n      the Fl_Menu_ widget's callback is invoked with any userdata\n      configured for it. The callback can determine which item\n      was picked using value(), mvalue(), item_pathname(), etc.\n\n  The line spacing between menu items can be controlled with the global setting\n  Fl::menu_linespacing().\n \\see Fl_Widget::shortcut_label(int)\n*/\nclass FL_EXPORT Fl_Menu_ : public Fl_Widget {\n\n  Fl_Menu_Item *menu_;\n  const Fl_Menu_Item *value_;\n  const Fl_Menu_Item *prev_value_;\n\nprotected:\n\n  uchar alloc;                  // flag indicates if menu_ is a dynamic copy (=1) or not (=0)\n  uchar down_box_;\n  Fl_Boxtype menu_box_;\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  Fl_Color textcolor_;\n\n  int item_pathname_(char *name, int namelen, const Fl_Menu_Item *finditem,\n                     const Fl_Menu_Item *menu=0) const;\npublic:\n  Fl_Menu_(int,int,int,int,const char * =0);\n  ~Fl_Menu_();\n\n  int item_pathname(char *name, int namelen, const Fl_Menu_Item *finditem=0) const;\n  const Fl_Menu_Item* picked(const Fl_Menu_Item*);\n  const Fl_Menu_Item* find_item(const char *name);\n  const Fl_Menu_Item* find_item(Fl_Callback*);\n  const Fl_Menu_Item* find_item_with_user_data(void*);\n  const Fl_Menu_Item* find_item_with_argument(long);\n  int find_index(const char *name) const;\n  int find_index(const Fl_Menu_Item *item) const;\n  int find_index(Fl_Callback *cb) const;\n\n  /**\n    Returns the menu item with the entered shortcut (key value).\n\n    This searches the complete menu() for a shortcut that matches the\n    entered key value.  It must be called for a FL_KEYBOARD or FL_SHORTCUT\n    event.\n\n    If a match is found, the menu's callback will be called.\n\n    \\return matched Fl_Menu_Item or NULL.\n  */\n  const Fl_Menu_Item* test_shortcut() {return picked(menu()->test_shortcut());}\n  void global();\n\n  /**\n    Returns a pointer to the array of Fl_Menu_Items.  This will either be\n    the value passed to menu(value) or the private copy or an internal\n    (temporary) location (see note below).\n\n    \\note <b>Implementation details - may be changed in the future.</b>\n      All modifications of the menu array are done by copying the entire\n      menu array to an internal storage for optimization of memory\n      allocations, for instance when using add() or insert(). While this\n      is done, menu() returns the pointer to this internal location. The\n      entire menu will be copied back to private storage when needed,\n      i.e. when \\b another Fl_Menu_ is modified. You can force this\n      reallocation after you're done with all menu modifications by calling\n      Fl_Menu_::menu_end() to make sure menu() returns a permanent pointer\n      to private storage (until the menu is modified again).\n      Note also that some menu methods (e.g. Fl_Menu_Button::popup()) call\n      menu_end() internally to ensure a consistent menu array while the\n      menu is open.\n\n    \\see size() -- returns the size of the Fl_Menu_Item array.\n    \\see menu_end() -- finish %menu modifications (optional)\n\n    \\b Example: How to walk the array:\n    \\code\n    for ( int t=0; t<menubar->size(); t++ ) {                // walk array of items\n        const Fl_Menu_Item &item = menubar->menu()[t];       // get each item\n        fprintf(stderr, \"item #%d -- label=%s, value=%s type=%s\\n\",\n            t,\n            item.label() ? item.label() : \"(Null)\",          // menu terminators have NULL labels\n            (item.flags & FL_MENU_VALUE) ? \"set\" : \"clear\",  // value of toggle or radio items\n            (item.flags & FL_SUBMENU) ? \"Submenu\" : \"Item\"); // see if item is a submenu or actual item\n    }\n    \\endcode\n\n  */\n  const Fl_Menu_Item *menu() const {return menu_;}\n  const Fl_Menu_Item *menu_end(); // in src/Fl_Menu_add.cxx\n  void menu(const Fl_Menu_Item *m);\n  void copy(const Fl_Menu_Item *m, void* user_data = 0);\n  int insert(int index, const char*, int shortcut, Fl_Callback*, void* = 0, int = 0);\n  int  add(const char*, int shortcut, Fl_Callback*, void* = 0, int = 0); // see src/Fl_Menu_add.cxx\n  /** See int Fl_Menu_::add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0) */\n  int  add(const char* a, const char* b, Fl_Callback* c, void* d = 0, int e = 0) {\n      return add(a,fl_old_shortcut(b),c,d,e);\n  }\n  /** See int Fl_Menu_::insert(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0) */\n  int insert(int index, const char* a, const char* b, Fl_Callback* c, void* d = 0, int e = 0) {\n      return insert(index,a,fl_old_shortcut(b),c,d,e);\n  }\n  int  add(const char *);\n  int  size() const ;\n  void size(int W, int H) { Fl_Widget::size(W, H); }\n  void clear();\n  int clear_submenu(int index);\n  void replace(int,const char *);\n  void remove(int);\n  /** Change the shortcut of item \\p i to \\p s. */\n  void shortcut(int i, int s) {menu_[i].shortcut(s);}\n  /** Set the flags of item i.  For a list of the flags, see Fl_Menu_Item.  */\n  void mode(int i,int fl) {menu_[i].flags = fl;}\n  /** Get the flags of item i.  For a list of the flags, see Fl_Menu_Item.  */\n  int  mode(int i) const {return menu_[i].flags;}\n\n  /** Return a pointer to the last menu item that was picked.  */\n  const Fl_Menu_Item *mvalue() const {return value_;}\n\n  /** Return a pointer to the menu item that was picked before the current one was picked.\n    This call gives developers additional details how a user changed a choice in the Fl_Choice widget.\n  */\n  const Fl_Menu_Item *prev_mvalue() const {return prev_value_;}\n  // Return the index into the menu() of the last item chosen by the user or -1.\n  int value() const;\n  // Set the internal value_ of the menu to the given Fl_Menu_Item.\n  int value(const Fl_Menu_Item*);\n  /**\n    Set the value of the menu to index \\c i.\n\n    The \\e value of the menu is the index into the menu() of the last\n    item chosen by the user or -1.\n\n    It is \\c -1 initially (if no item has been chosen) or if the chosen\n    menu item is part of a submenu addressed by an FL_SUBMENU_POINTER.\n\n    \\note All menu items are located in a contiguous array of Fl_Menu_Item's\n      unless an item has the FL_SUBMENU_POINTER flag which redirects the\n      submenu to an independent submenu array. This submenu array is not\n      counted in the size() of the menu, and menu items in this submenu can't\n      return a valid index into the \\b main menu. Therefore menu items that\n      are located in such a submenu return -1 when value() is called.\n      This may be changed in a future version.\n\n    You can set the value as an integer or with a pointer to a menu item.\n    The integer value is restricted to the main menu array (0..size()-1)\n    whereas the menu item can be any menu item, even one in a detached\n    submenu (see note about FL_SUBMENU_POINTER above).\n\n    \\param[in] i  Index of the menu item in the main menu array.\\n\n                  Values outside 0..size()-1 are ignored (return 0).\n\n    \\return   Whether the new value is different than the old one.\n    \\retval 0 The value didn't change.\n    \\retval 1 The value was changed.\n\n    \\see int value(const Fl_Menu_Item*)\n    \\see int value()\n    \\see const Fl_Menu_Item *mvalue()\n  */\n  int value(int i) {\n    if (!menu_ || i < 0 || i >= size())\n      return 0;\n    return value(menu_ + i);\n  }\n\n  /** Returns the title of the last item chosen.  */\n  const char *text() const {return value_ ? value_->text : 0;}\n  /** Returns the title of item i.  */\n  const char *text(int i) const {return menu_[i].text;}\n\n  /** Gets the current font of menu item labels.  */\n  Fl_Font textfont() const {return textfont_;}\n  /**  Sets the current font of menu item labels.  */\n  void textfont(Fl_Font c) {textfont_=c;}\n  /**  Gets the font size of menu item labels.  */\n  Fl_Fontsize textsize() const {return textsize_;}\n  /**  Sets the font size of menu item labels.  */\n  void textsize(Fl_Fontsize c) {textsize_=c;}\n  /** Get the current color of menu item labels.  */\n  Fl_Color textcolor() const {return textcolor_;}\n  /** Sets the current color of menu item labels. */\n  void textcolor(Fl_Color c) {textcolor_=c;}\n\n  /**\n    This box type is used to surround the currently-selected items in the\n    menus.\n  */\n  Fl_Boxtype down_box() const {return (Fl_Boxtype)down_box_;}\n  /** Sets the box type used to surround the currently-selected items in the menus.  */\n  void down_box(Fl_Boxtype b) {down_box_ = b;}\n\n  /** Get the box type for the menu popup windows.\n   \\return the box type, or FL_NO_BOX if Fl_Menu_::box() is to be used instead\n   */\n  Fl_Boxtype menu_box() const { return menu_box_; }\n  /** Set the box type for the menu popup windows.\n   If menu_box set to FL_NO_BOX, the menu window will use Fl_Menu_::box() instead.\n   \\param[in] b new box type or FL_NO_BOX\n   */\n  void menu_box(Fl_Boxtype b) { menu_box_ = b; }\n\n  /** For back compatibility, same as selection_color() */\n  Fl_Color down_color() const {return selection_color();}\n  /** For back compatibility, same as selection_color() */\n  void down_color(unsigned c) {selection_color(c);}\n  void setonly(Fl_Menu_Item* item);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Menu_Bar.H",
    "content": "//\n// Menu bar header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2017 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Menu_Bar widget . */\n\n#ifndef Fl_Menu_Bar_H\n#define Fl_Menu_Bar_H\n\n#include \"Fl_Menu_.H\"\n\n/**\n  This widget provides a standard menubar interface.  Usually you will\n  put this widget along the top edge of your window.  The height of the\n  widget should be 30 for the menu titles to draw correctly with the\n  default font.\n\n  The items on the bar and the menus they bring up are defined by a\n  single Fl_Menu_Item array.\n  Because a Fl_Menu_Item array defines a hierarchy, the\n  top level menu defines the items in the menubar, while the submenus\n  define the pull-down menus. Sub-sub menus and lower pop up to the right\n  of the submenus.\n\n  \\image html  menubar.png\n  \\image latex  menubar.png \" menubar\" width=12cm\n\n  If there is an item in the top menu that is not a title of a\n  submenu, then it acts like a \"button\" in the menubar.  Clicking on it\n  will pick it.\n\n  When the user clicks a menu item, value() is set to that item\n  and then:\n\n    - The item's callback is done if one has been set; the\n      Fl_Menu_Bar is passed as the Fl_Widget* argument,\n      along with any userdata configured for the callback.\n\n    - If the item does not have a callback, the Fl_Menu_Bar's callback\n      is done instead, along with any userdata configured for the callback.\n      The callback can determine which item was picked using\n      value(), mvalue(), item_pathname(), etc.\n\n  Submenus will also pop up in response to shortcuts indicated by\n  putting a '&' character in the name field of the menu item. If you put a\n  '&' character in a top-level \"button\" then the shortcut picks it.  The\n  '&' character in submenus is ignored until the menu is popped up.\n\n  Typing the shortcut() of any of the menu items will cause\n  callbacks exactly the same as when you pick the item with the mouse.\n */\nclass FL_EXPORT Fl_Menu_Bar : public Fl_Menu_ {\n  friend class Fl_Sys_Menu_Bar_Driver;\nprotected:\n    void draw() FL_OVERRIDE;\npublic:\n    int handle(int) FL_OVERRIDE;\n  /**\n    Creates a new Fl_Menu_Bar widget using the given position,\n    size, and label string. The default boxtype is FL_UP_BOX.\n\n    The constructor sets menu() to NULL.  See\n    Fl_Menu_ for the methods to set or change the menu.\n\n    labelsize(), labelfont(), and labelcolor()\n    are used to control how the menubar items are drawn.  They are\n    initialized from the Fl_Menu static variables, but you can\n    change them if desired.\n\n    label() is ignored unless you change align() to\n    put it outside the menubar.\n\n    The destructor removes the Fl_Menu_Bar widget and all of its\n    menu items.\n  */\n  Fl_Menu_Bar(int X, int Y, int W, int H, const char *l=0);\n  /** Updates the menu bar after any change to its items.\n   This is useful when the menu bar can be an Fl_Sys_Menu_Bar object.\n   */\n  virtual void update() {}\n  /**\n   Opens the 1st level submenu of the menubar corresponding to \\c item.\n   \\since 1.4.0\n   */\n  virtual void play_menu(const Fl_Menu_Item *item);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Menu_Button.H",
    "content": "//\n// Menu button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Menu_Button widget . */\n\n#ifndef Fl_Menu_Button_H\n#define Fl_Menu_Button_H\n\n#include \"Fl_Menu_.H\"\n\n/**\n  This is a button that when pushed pops up a menu (or hierarchy of\n  menus) defined by an array of\n  Fl_Menu_Item objects.\n  \\image html  menu_button.png\n  \\image latex  menu_button.png \" menu_button\" width=5cm\n  <P>Normally any mouse button will pop up a menu and it is lined up\n  below the button as shown in the picture.  However an Fl_Menu_Button\n  may also control a pop-up menu.  This is done by setting the type().\n  If type() is zero a normal menu button is produced.\n  If it is nonzero then this is a pop-up menu. The bits in type() indicate\n  what mouse buttons pop up the menu (see Fl_Menu_Button::popup_buttons). </P>\n  <P>The menu will also pop up in response to shortcuts indicated by\n  putting a '&' character in the label(). </P>\n  <P>Typing the shortcut() of any of the menu items will cause\n  callbacks exactly the same as when you pick the item with the mouse.\n  The '&' character in menu item names are only looked at when the menu is\n  popped up, however. </P>\n\n  When the user clicks a menu item, value() is set to that item\n  and then:\n\n  - The item's callback is done if one has been set; the\n    Fl_Menu_Button is passed as the Fl_Widget* argument,\n    along with any userdata configured for the callback.\n\n  - If the item does not have a callback, the Fl_Menu_Button's callback\n    is done instead, along with any userdata configured for it.\n    The callback can determine which item was picked using\n    value(), mvalue(), item_pathname(), etc.\n*/\nclass FL_EXPORT Fl_Menu_Button : public Fl_Menu_ {\nprotected:\n  void draw() FL_OVERRIDE;\n  static Fl_Menu_Button* pressed_menu_button_;\npublic:\n  /**\n   \\brief indicate what mouse buttons pop up the menu.\n\n   Values for type() used to indicate what mouse buttons pop up the menu.\n   Fl_Menu_Button::POPUP3 is usually what you want.\n   */\n  enum popup_buttons {POPUP1 = 1, /**< pops up with the mouse 1st button. */\n    POPUP2,  /**< pops up with the mouse 2nd button. */\n    POPUP12, /**< pops up with the mouse 1st or 2nd buttons. */\n    POPUP3,   /**< pops up with the mouse 3rd button. */\n    POPUP13,  /**< pops up with the mouse 1st or 3rd buttons. */\n    POPUP23,  /**< pops up with the mouse 2nd or 3rd buttons. */\n    POPUP123 /**< pops up with any mouse button. */\n  };\n  int handle(int) FL_OVERRIDE;\n  const Fl_Menu_Item* popup();\n  Fl_Menu_Button(int,int,int,int,const char * =0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Menu_Item.H",
    "content": "//\n// Menu item header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Menu_Item_H\n#define Fl_Menu_Item_H\n\n#include <FL/Fl_Widget.H>\n#include <FL/Fl_Image.H>\n#include <FL/Fl_Multi_Label.H>\n#include <FL/platform_types.h> // for FL_COMMAND and FL_CONTROL\n\n// doxygen needs the following line to enable e.g. ::FL_MENU_TOGGLE to link to the enums\n/// @file\n\nenum { // values for flags:\n  FL_MENU_INACTIVE   = 1,          ///< Deactivate menu item (gray out)\n  FL_MENU_TOGGLE     = 2,          ///< Item is a checkbox toggle (shows checkbox for on/off state)\n  FL_MENU_VALUE      = 4,          ///< The on/off state for checkbox/radio buttons (if set, state is 'on')\n  FL_MENU_RADIO      = 8,          ///< Item is a radio button (one checkbox of many can be on)\n  FL_MENU_INVISIBLE  = 0x10,       ///< Item will not show up (shortcut will work)\n  FL_SUBMENU_POINTER = 0x20,       ///< Indicates user_data() is a pointer to another menu array\n  FL_SUBMENU         = 0x40,       ///< Item is a submenu to other items\n  FL_MENU_DIVIDER    = 0x80,       ///< Creates divider line below this item. Also ends a group of radio buttons\n  FL_MENU_HORIZONTAL = 0x100       ///< ??? -- reserved, internal (do not use)\n  ///< Note: \\b ALL other bits in \\p flags are reserved: do not use them for your own purposes!\n};\n\nextern FL_EXPORT Fl_Shortcut fl_old_shortcut(const char*);\n\nclass Fl_Menu_;\n\n/**\n  The Fl_Menu_Item structure defines a single menu item that\n  is used by the Fl_Menu_ class.\n  \\code\n  struct Fl_Menu_Item {\n   const char*   text;     // label()\n   int           shortcut_;\n   Fl_Callback*  callback_;\n   void*         user_data_;\n   int           flags;\n   uchar         labeltype_;\n   uchar         labelfont_;\n   uchar         labelsize_;\n   uchar         labelcolor_;\n  };\n\n  enum { // values for flags:\n   FL_MENU_INACTIVE   = 1,          // Deactivate menu item (gray out)\n   FL_MENU_TOGGLE     = 2,          // Item is a checkbox toggle (shows checkbox for on/off state)\n   FL_MENU_VALUE      = 4,          // The on/off state for checkbox/radio buttons (if set, state is 'on')\n   FL_MENU_RADIO      = 8,          // Item is a radio button (one checkbox of many can be on)\n   FL_MENU_INVISIBLE  = 0x10,       // Item will not show up (shortcut will work)\n   FL_SUBMENU_POINTER = 0x20,       // Indicates user_data() is a pointer to another menu array\n   FL_SUBMENU         = 0x40,       // This item is a submenu to other items\n   FL_MENU_DIVIDER    = 0x80,       // Creates divider line below this item. Also ends a group of radio buttons.\n   FL_MENU_HORIZONTAL = 0x100       // ??? -- reserved, internal (do not use)\n  };\n  \\endcode\n\n  \\note \\b All other bits in \\p flags are reserved for FLTK usage, do not use any bits of the\n    \\p flags variable for your own purposes. Even \\b undocumented bits can be used for internal\n    purposes in this or any future FLTK version.\n\n  Some \\p flags bits may be changed during runtime by user code, particularly if you need to change\n  the value of a menu item (ON/OFF) or make it active or inactive. Such changes must be done with\n  caution so they don't affect other (maybe undocumented) bits, i.e. you need to make proper bit\n  operations to set or clear only these particular bits.\n\n  Typically menu items are statically defined; for example:\n  \\code\n  Fl_Menu_Item popup[] = {\n   {\"&alpha\",    FL_ALT+'a', the_cb, (void*)1},\n   {\"&beta\",     FL_ALT+'b', the_cb, (void*)2},\n   {\"gamma\",     FL_ALT+'c', the_cb, (void*)3, FL_MENU_DIVIDER},\n   {\"&strange\",  0,          strange_cb},\n   {\"&charm\",    0,          charm_cb},\n   {\"&truth\",    0,          truth_cb},\n   {\"b&eauty\",   0,          beauty_cb},\n   {\"sub&menu\",  0,          0, 0, FL_SUBMENU},\n   {\"one\"},\n   {\"two\"},\n   {\"three\"},\n   {0},\n   {\"inactive\", FL_ALT+'i', 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER},\n   {\"invisible\",FL_ALT+'i', 0, 0, FL_MENU_INVISIBLE},\n   {\"check\",    FL_ALT+'i', 0, 0, FL_MENU_TOGGLE|FL_MENU_VALUE},\n   {\"box\",      FL_ALT+'i', 0, 0, FL_MENU_TOGGLE},\n   {0}};\n  \\endcode\n  produces:\n\n  \\image html   menu.png\n  \\image latex  menu.png \"menu\" width=10cm\n\n  A submenu title is identified by the bit FL_SUBMENU in the\n  flags field, and ends with a label() that is NULL.\n  You can nest menus to any depth.  A pointer to the first item in the\n  submenu can be treated as an Fl_Menu array itself.  It is also\n  possible to make separate submenu arrays with FL_SUBMENU_POINTER flags.\n\n  You should use the method functions to access structure members and\n  not access them directly to avoid compatibility problems with future\n  releases of FLTK.\n\n  \\note Adding menu items with insert(), add(), or any of its overloaded\n    variants copies the entire menu to internal storage. Using the\n    memory of a static menu array after that would access unused (but not\n    released) memory and thus have no effect.\n*/\nstruct FL_EXPORT Fl_Menu_Item {\n  const char *text;         ///< menu item text, returned by label()\n  int shortcut_;            ///< menu item shortcut\n  Fl_Callback *callback_;   ///< menu item callback\n  void *user_data_;         ///< menu item user_data for the menu's callback\n  int flags;                ///< menu item flags like FL_MENU_TOGGLE, FL_MENU_RADIO\n  uchar labeltype_;         ///< how the menu item text looks like\n  Fl_Font labelfont_;       ///< which font for this menu item text\n  Fl_Fontsize labelsize_;   ///< size of menu item text\n  Fl_Color labelcolor_;     ///< menu item text color\n\n  // advance N items, skipping submenus:\n  const Fl_Menu_Item *next(int=1) const;\n\n  /**\n    Advances a pointer by n items through a menu array, skipping\n    the contents of submenus and invisible items. There are two calls so\n    that you can advance through const and non-const data.\n  */\n  Fl_Menu_Item *next(int i=1) {\n    return (Fl_Menu_Item*)(((const Fl_Menu_Item*)this)->next(i));}\n\n  /** Returns the first menu item, same as next(0). */\n  const Fl_Menu_Item *first() const { return next(0); }\n\n  /** Returns the first menu item, same as next(0). */\n  Fl_Menu_Item *first() { return next(0); }\n\n  // methods on menu items:\n  /**\n    Returns the title (label) of the menu item.\n\n    A NULL here indicates the end of the menu (or of a submenu).\n    A '&' in the item will print an underscore under the next letter,\n    and if the menu is popped up that letter will be a \"shortcut\" to\n    pick that item. To get a real '&' put two in a row.\n\n    The returned value depends on the labeltype() that has been used\n    to store the label.\n\n    \\returns  A pointer to the label cast to (const char *)\n\n    \\retval (a)   A pointer to text (const char *)\n    \\retval (b)   A pointer to an image (Fl_Image *)\n    \\retval (c)   A pointer to a \"multi label\" (Fl_Multi_Label *)\n    \\retval NULL  End of menu or submenu\n\n    \\see Fl_Menu_Item::label(const char *)\n    \\see Fl_Menu_Item::label(Fl_Labeltype, const char *)\n    \\see Fl_Menu_Item::image_label(const Fl_Image *)\n    \\see Fl_Menu_Item::multi_label(const Fl_Multi_Label *)\n    \\see Fl_Multi_Label::label(Fl_Menu_Item *)\n  */\n  const char* label() const { return text; }\n\n  /**\n    Sets the title (label) of the menu item.\n\n    \\note This does \\b not change the labeltype() for backwards compatibility.\n      Take care to assign the correct labeltype() if you assign different\n      label types to the same menu item sequentially.\n\n    The default labeltype() is FL_NORMAL_LABEL.\n\n    \\see label(Fl_Labeltype, const char*)\n    \\see const char* Fl_Menu_Item::label() const\n  */\n  void label(const char* a) { text = a; }\n\n  /**\n    Sets the title (label) and the label type of the menu item.\n\n    The default Fl_Labeltype when using Fl_Menu_Item::label(const char* a)\n    is FL_NORMAL_LABEL but you can set any other label type, for instance\n    FL_EMBOSSED_LABEL.\n\n    Special labeltypes are:\n\n      - FL_ICON_LABEL:  draws the icon (Fl_Image) associated with the text\n      - FL_IMAGE_LABEL: draws the image (Fl_Image) associated with the text\n      - FL_MULTI_LABEL: draws multiple parts side by side, see Fl_Multi_Label\n\n    \\see const char* Fl_Menu_Item::label() const\n  */\n  void label(Fl_Labeltype a, const char* b) {\n    labeltype_ = a;\n    text = b;\n  }\n\n  /**\n    Sets the title (label()) and labeltype() to an Fl_Multi_Label.\n\n    This sets the labeltype() to \\_FL_MULTI_LABEL (note the leading\n    underscore).\n\n    \\see const char* Fl_Menu_Item::label() const\n\n    \\since 1.4.0\n\n    \\internal Overloading Fl_Menu_Item::image() would lead to ambiguities\n      when used like `item->label(0)`, hence we need our own method name.\n      Otherwise existing programs might not compile w/o error (e.g. fluid).\n  */\n  void multi_label(const Fl_Multi_Label *ml) {\n    label(FL_MULTI_LABEL, (const char *)ml);\n  }\n\n  /**\n    Sets the title (label()) to an icon or image.\n\n    This sets the labeltype() to \\_FL_IMAGE_LABEL (note the leading\n    underscore).\n\n    \\see const char* Fl_Menu_Item::label() const\n\n    \\since 1.4.0\n\n    \\internal Overloading Fl_Menu_Item::image() would lead to ambiguities\n      when used like `item->label(0)`, hence we need our own method name.\n      Otherwise existing programs might not compile w/o error (e.g. fluid).\n  */\n  void image_label(const Fl_Image *image) {\n    label(FL_IMAGE_LABEL, (const char *)image);\n  }\n\n  /**\n    Returns the menu item's labeltype.\n    A labeltype identifies a routine that draws the label of the\n    widget.  This can be used for special effects such as emboss, or to use\n    the label() pointer as another form of data such as a bitmap.\n    The value FL_NORMAL_LABEL prints the label as text.\n  */\n  Fl_Labeltype labeltype() const {return (Fl_Labeltype)labeltype_;}\n\n  /**\n    Sets the menu item's labeltype.\n    A labeltype identifies a routine that draws the label of the\n    widget.  This can be used for special effects such as emboss, or to use\n    the label() pointer as another form of data such as a bitmap.\n    The value FL_NORMAL_LABEL prints the label as text.\n  */\n  void labeltype(Fl_Labeltype a) {labeltype_ = a;}\n\n  /**\n    Gets the menu item's label color.\n    This color is passed to the labeltype routine, and is typically the\n    color of the label text.  This defaults to FL_BLACK.  If this\n    color is not black fltk will \\b not use overlay bitplanes to draw\n    the menu - this is so that images put in the menu draw correctly.\n  */\n  Fl_Color labelcolor() const {return labelcolor_;}\n\n  /**\n    Sets the menu item's label color.\n    \\see Fl_Color Fl_Menu_Item::labelcolor() const\n  */\n  void labelcolor(Fl_Color a) {labelcolor_ = a;}\n  /**\n    Gets the menu item's label font.\n    Fonts are identified by small 8-bit indexes into a table. See the\n    enumeration list for predefined fonts. The default value is a\n    Helvetica font. The function Fl::set_font() can define new fonts.\n  */\n  Fl_Font labelfont() const {return labelfont_;}\n\n  /**\n    Sets the menu item's label font.\n    Fonts are identified by small 8-bit indexes into a table. See the\n    enumeration list for predefined fonts. The default value is a\n    Helvetica font.  The function Fl::set_font() can define new fonts.\n  */\n  void labelfont(Fl_Font a) {labelfont_ = a;}\n\n  /** Gets the label font pixel size/height. */\n  Fl_Fontsize labelsize() const {return labelsize_;}\n\n  /** Sets the label font pixel size/height.*/\n  void labelsize(Fl_Fontsize a) {labelsize_ = a;}\n\n  /**\n    Returns the callback function that is set for the menu item.\n    Each item has space for a callback function and an argument for that\n    function. Due to back compatibility, the Fl_Menu_Item itself\n    is not passed to the callback, instead you have to get it by calling\n    ((Fl_Menu_*)w)->mvalue() where w is the widget argument.\n  */\n  Fl_Callback_p callback() const {return callback_;}\n\n  /**\n    Sets the menu item's callback function and userdata() argument.\n    \\see Fl_Callback_p Fl_MenuItem::callback() const\n  */\n  void callback(Fl_Callback* c, void* p) {callback_=c; user_data_=p;}\n\n  /**\n    Sets the menu item's callback function.\n    This method does not set the userdata() argument.\n    \\see Fl_Callback_p Fl_MenuItem::callback() const\n   */\n  void callback(Fl_Callback* c) {callback_=c;}\n\n  /**\n    Sets the menu item's callback function.\n    This method does not set the userdata() argument.\n    \\see Fl_Callback_p Fl_MenuItem::callback() const\n   */\n  void callback(Fl_Callback0 *c) {\n    callback_ = (Fl_Callback *)(void *)c;\n  }\n\n  /**\n    Sets the menu item's callback function and userdata() argument.\n    The argument \\p is cast to void* and stored as the userdata()\n    for the menu item's callback function.\n    \\see Fl_Callback_p Fl_MenuItem::callback() const\n   */\n  void callback(Fl_Callback1 *c, long p = 0) {\n    callback_ = (Fl_Callback *)(void *)c;\n    user_data_ = (void *)(fl_intptr_t)p;\n  }\n\n  /**\n    Gets the user_data() argument that is sent to the callback function.\n  */\n  void* user_data() const {return user_data_;}\n  /**\n    Sets the user_data() argument that is sent to the callback function.\n  */\n  void user_data(void* v) {user_data_ = v;}\n  /**\n    Gets the user_data() argument that is sent to the callback function.\n    For convenience you can also define the callback as taking a long\n    argument.  This method casts the stored userdata() argument to long\n    and returns it as a \\e long value.\n  */\n  long argument() const {return (long)(fl_intptr_t)user_data_;}\n  /**\n    Sets the user_data() argument that is sent to the callback function.\n    For convenience you can also define the callback as taking a long\n    argument.  This method casts the given argument \\p v to void*\n    and stores it in the menu item's userdata() member.\n    This may not be portable to some machines.\n  */\n  void argument(long v) {user_data_ = (void*)(fl_intptr_t)v;}\n\n  /** Gets what key combination shortcut will trigger the menu item. */\n  int shortcut() const {return shortcut_;}\n\n  /**\n    Sets exactly what key combination will trigger the menu item.  The\n    value is a logical 'or' of a key and a set of shift flags, for instance\n    FL_ALT+'a' or FL_ALT+FL_F+10 or just 'a'.  A value of\n    zero disables the shortcut.\n\n    The key can be any value returned by Fl::event_key(), but will usually\n    be an ASCII letter. Use a lower-case letter unless you require the shift\n    key to be held down.\n\n    The shift flags can be any set of values accepted by Fl::event_state().\n    If the bit is on that shift key must be pushed.  Meta, Alt, Ctrl,\n    and Shift must be off if they are not in the shift flags (zero for the\n    other bits indicates a \"don't care\" setting).\n  */\n  void shortcut(int s) {shortcut_ = s;}\n  /**\n    Returns true if either FL_SUBMENU or FL_SUBMENU_POINTER\n    is on in the flags. FL_SUBMENU indicates an embedded submenu\n    that goes from the next item through the next one with a NULL\n    label(). FL_SUBMENU_POINTER indicates that user_data()\n    is a pointer to another menu array.\n  */\n  int submenu() const {return flags&(FL_SUBMENU|FL_SUBMENU_POINTER);}\n  /**\n    Returns true if a checkbox will be drawn next to this item.\n    This is true if FL_MENU_TOGGLE or FL_MENU_RADIO is set in the flags.\n  */\n  int checkbox() const {return flags&FL_MENU_TOGGLE;}\n  /**\n    Returns true if this item is a radio item.\n    When a radio button is selected all \"adjacent\" radio buttons are\n    turned off.  A set of radio items is delimited by an item that has\n    radio() false, or by an item with FL_MENU_DIVIDER turned on.\n  */\n  int radio() const {return flags&FL_MENU_RADIO;}\n  /** Returns the current value of the check or radio item.\n      This is zero (0) if the menu item is not checked and non-zero otherwise.\n      \\since 1.4.0 this method returns 1 if the item is checked but you\n        should not rely on a particular value, only zero or non-zero.\n      \\note The returned value for a checked menu item was FL_MENU_VALUE (4)\n        before FLTK 1.4.0.\n  */\n  int value() const {return (flags & FL_MENU_VALUE) ? 1 : 0;}\n\n  /** Sets the current value of the check or radio item. */\n  void value(int v) { v ? set() : clear(); }\n\n  /**\n    Turns the check or radio item \"on\" for the menu item. Note that this\n    does not turn off any adjacent radio items like setonly() does.\n  */\n  void set() {flags |= FL_MENU_VALUE;}\n\n  /** Turns the check or radio item \"off\" for the menu item. */\n  void clear() {flags &= ~FL_MENU_VALUE;}\n\n  void setonly(Fl_Menu_Item const* first = NULL);\n\n  /** Gets the visibility of an item. */\n  int visible() const {return !(flags&FL_MENU_INVISIBLE);}\n\n  /** Makes an item visible in the menu. */\n  void show() {flags &= ~FL_MENU_INVISIBLE;}\n\n  /** Hides an item in the menu. */\n  void hide() {flags |= FL_MENU_INVISIBLE;}\n\n  /** Gets whether or not the item can be picked. */\n  int active() const {return !(flags&FL_MENU_INACTIVE);}\n\n  /** Allows a menu item to be picked. */\n  void activate() {flags &= ~FL_MENU_INACTIVE;}\n  /**\n    Prevents a menu item from being picked. Note that this will also cause\n    the menu item to appear grayed-out.\n  */\n  void deactivate() {flags |= FL_MENU_INACTIVE;}\n  /** Returns non 0 if FL_INACTIVE and FL_INVISIBLE are cleared, 0 otherwise. */\n  int activevisible() const {return !(flags & (FL_MENU_INACTIVE|FL_MENU_INVISIBLE));}\n\n  // compatibility for FLUID so it can set the image of a menu item...\n\n  /** Compatibility API for FLUID, same as image->label(this).\n\n    \\note This method is intended for internal use by fluid and may\n      not do what you expect.\n  */\n  void image(Fl_Image* image) {image->label(this);}\n\n  /** Compatibility API for FLUID, same as image.label(this).\n\n    \\note This method is intended for internal use by fluid and may\n      not do what you expect.\n  */\n  void image(Fl_Image& image) {image.label(this);}\n\n  // used by menubar:\n  int measure(int* h, const Fl_Menu_*) const;\n  void draw(int x, int y, int w, int h, const Fl_Menu_*, int t=0) const;\n\n  // popup menus without using an Fl_Menu_ widget:\n  const Fl_Menu_Item* popup(\n    int X, int Y,\n    const char *title = 0,\n    const Fl_Menu_Item* picked=0,\n    const Fl_Menu_* = 0) const;\n  const Fl_Menu_Item* pulldown(\n    int X, int Y, int W, int H,\n    const Fl_Menu_Item* picked = 0,\n    const Fl_Menu_* = 0,\n    const Fl_Menu_Item* title = 0,\n    int menubar=0) const;\n  const Fl_Menu_Item* test_shortcut() const;\n  const Fl_Menu_Item* find_shortcut(int *ip=0, const bool require_alt = false) const;\n\n  /**\n    Calls the Fl_Menu_Item item's callback, and provides the Fl_Widget argument.\n    The callback is called with the stored user_data() as its second argument.\n    You must first check that callback() is non-zero before calling this.\n  */\n  void do_callback(Fl_Widget* o) const {Fl::callback_reason_=FL_REASON_SELECTED; callback_(o, user_data_);}\n\n  /**\n    Calls the Fl_Menu_Item item's callback, and provides the Fl_Widget argument.\n    This call overrides the callback's second argument with the given value \\p arg.\n    You must first check that callback() is non-zero before calling this.\n  */\n  void do_callback(Fl_Widget* o,void* arg) const {Fl::callback_reason_=FL_REASON_SELECTED; callback_(o, arg);}\n\n  /**\n    Calls the Fl_Menu_Item item's callback, and provides the Fl_Widget argument.\n    This call overrides the callback's second argument with the\n    given value \\p arg. long \\p arg is cast to void* when calling\n    the callback.\n    You must first check that callback() is non-zero before calling this.\n  */\n  void do_callback(Fl_Widget* o,long arg) const {Fl::callback_reason_=FL_REASON_SELECTED; callback_(o, (void*)(fl_intptr_t)arg);}\n\n  /** Back compatibility only.\n    \\deprecated\n      Please use Fl_Menu_Item::value() instead.\n      This method will be removed in FLTK 1.5.0 or later.\n    \\see value()\n  */\n  inline int checked() const {return value();}\n\n  /** Back compatibility only.\n    \\deprecated\n      Please use Fl_Menu_Item::set() instead.\n      This method will be removed in FLTK 1.5.0 or later.\n    \\see set()\n  */\n  inline void check() {set();}\n\n  /** Back compatibility only.\n    \\deprecated\n      Please use Fl_Menu_Item::clear() instead.\n      This method will be removed in FLTK 1.5.0 or later.\n    \\see clear()\n  */\n  inline void uncheck() {clear();}\n\n  int insert(int,const char*,int,Fl_Callback*,void* =0, int =0);\n  int add(const char*, int shortcut, Fl_Callback*, void* =0, int = 0);\n\n  /** See int add(const char*, int shortcut, Fl_Callback*, void*, int) */\n  int add(const char*a, const char* b, Fl_Callback* c,\n          void* d = 0, int e = 0) {\n    return add(a,fl_old_shortcut(b),c,d,e);}\n\n  int size() const ;\n};\n\ntypedef Fl_Menu_Item Fl_Menu; // back compatibility\n\nenum {  // back-compatibility enum:\n  FL_PUP_NONE   = 0,\n  FL_PUP_GREY   = FL_MENU_INACTIVE,\n  FL_PUP_GRAY   = FL_MENU_INACTIVE,\n  FL_MENU_BOX   = FL_MENU_TOGGLE,\n  FL_PUP_BOX    = FL_MENU_TOGGLE,\n  FL_MENU_CHECK = FL_MENU_VALUE,\n  FL_PUP_CHECK  = FL_MENU_VALUE,\n  FL_PUP_RADIO  = FL_MENU_RADIO,\n  FL_PUP_INVISIBLE = FL_MENU_INVISIBLE,\n  FL_PUP_SUBMENU = FL_SUBMENU_POINTER\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Menu_Window.H",
    "content": "//\n// Menu window header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Menu_Window widget . */\n\n#ifndef Fl_Menu_Window_H\n#define Fl_Menu_Window_H\n\n#include \"Fl_Single_Window.H\"\n\n/**\n  The Fl_Menu_Window widget is a window type used for menus. By\n  default the window is drawn in the hardware overlay planes if they are\n  available so that the menu don't force the rest of the window to\n  redraw.\n*/\nclass FL_EXPORT Fl_Menu_Window : public Fl_Single_Window {\npublic:\n  ~Fl_Menu_Window();\n  /** Creates a new Fl_Menu_Window widget using the given size, and label string. */\n  Fl_Menu_Window(int W, int H, const char *l = 0);\n  /** Creates a new Fl_Menu_Window widget using the given position, size, and label string. */\n  Fl_Menu_Window(int X, int Y, int W, int H, const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Multi_Browser.H",
    "content": "//\n// Multi browser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Multi_Browser widget . */\n\n#ifndef Fl_Multi_Browser_H\n#define Fl_Multi_Browser_H\n\n#include \"Fl_Browser.H\"\n\n/**\n  The Fl_Multi_Browser class is a subclass of Fl_Browser\n  which lets the user select any set of the lines.\n\n  \\image html  fl_multi_browser.png \"Fl_Multi_Browser\"\n  \\image latex fl_multi_browser.png \"Fl_Multi_Browser\" width=4cm\n\n  The user interface is Macintosh style: clicking an item turns off all the others and\n  selects that one, dragging selects all the items the mouse moves over,\n  and ctrl + click (Cmd+click on the Mac OS platform) toggles the items.\n  Shift + click extends the selection until the clicked item.\n  This is different from how forms did it.\n  Normally the callback is done when the user releases the\n  mouse, but you can change this with when().\n  <P>See Fl_Browser for methods to add and remove lines from the browser.\n*/\nclass FL_EXPORT Fl_Multi_Browser : public Fl_Browser {\npublic:\n  /**\n    Creates a new Fl_Multi_Browser widget using the given\n    position, size, and label string. The default boxtype is FL_DOWN_BOX.\n    The constructor specializes Fl_Browser() by setting the type to FL_MULTI_BROWSER.\n    The destructor destroys the widget and frees all memory that has been allocated.\n  */\n    Fl_Multi_Browser(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Multi_Label.H",
    "content": "//\n// Multi-label header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Multi_Label_H\n#define Fl_Multi_Label_H\n\nclass Fl_Widget;\nstruct Fl_Menu_Item;\n\n/** Allows a mixed text and/or graphics label to be applied to an Fl_Menu_Item or Fl_Widget.\n\n  Most regular FLTK widgets now support the ability to associate both images and text\n  with a label but some special cases, notably the non-widget Fl_Menu_Item objects, do not.\n  Fl_Multi_Label may be used to create menu items that have an icon and text, which would\n  not normally be possible for an Fl_Menu_Item.\n  For example, Fl_Multi_Label is used in the New->Code submenu in fluid, and others.\n\n  \\image html Fl_Multi_Label-menu-item.png \"Menu items with icons using Fl_Multi_Label\"\n  \\image latex Fl_Multi_Label-menu-item.png \"Menu items with icons using Fl_Multi_Label\" width=4cm\n\n  Each Fl_Multi_Label holds two elements, \\p labela and \\p labelb; each may hold either a\n  text label (const char*) or an image (Fl_Image*). When displayed, \\p labela is drawn first\n  and \\p labelb is drawn immediately to its right.\n\n  More complex labels can be constructed by setting labelb as another Fl_Multi_Label and\n  thus chaining up a series of label elements.\n\n  When assigning a label element to one of \\p labela or \\p labelb, they should be\n  explicitly cast to (const char*) if they are not of that type already.\n\n  \\note An Fl_Multi_Label object and all its components (label text, images, chained\n    Fl_Multi_Label's and their linked objects) must exist during the lifetime of the\n    widget or menu item they are assigned to. It is the responsibility of the user's\n    code to release these linked objects if necessary after the widget or menu is deleted.\n\n  Example Use: Fl_Menu_Bar\n  \\code\n    Fl_Pixmap *image = new Fl_Pixmap(..);     // image for menu item; any Fl_Image based widget\n    Fl_Menu_Bar *menu = new Fl_Menu_Bar(..);  // can be any Fl_Menu_ oriented widget (Fl_Choice, Fl_Menu_Button..)\n\n    // Create a menu item\n    int i = menu->add(\"File/New\", ..);\n    Fl_Menu_Item *item = (Fl_Menu_Item*)&(menu->menu()[i]);\n\n    // Create a multi label, assign it an image + text\n    Fl_Multi_Label *ml = new Fl_Multi_Label;\n\n    // Left side of label is an image\n    ml->typea  = FL_IMAGE_LABEL;\n    ml->labela = (const char*)image;           // any Fl_Image widget: Fl_Pixmap, Fl_PNG_Image, etc..\n\n    // Right side of label is label text\n    ml->typeb  = FL_NORMAL_LABEL;\n    ml->labelb = item->label();\n\n    // Assign the multilabel to the menu item\n    // ml->label(item); // deprecated since 1.4.0; backwards compatible with 1.3.x\n    item->label(ml);    // new method since 1.4.0\n  \\endcode\n\n  \\see Fl_Label and Fl_Labeltype and examples/howto-menu-with-images.cxx\n*/\nstruct FL_EXPORT Fl_Multi_Label {\n  /** Holds the \"leftmost\" of the two elements in the composite label.\n      Typically this would be assigned either a text string (const char*),\n      a (Fl_Image*) or a (Fl_Multi_Label*). */\n  const char* labela;\n  /** Holds the \"rightmost\" of the two elements in the composite label.\n      Typically this would be assigned either a text string (const char*),\n      a (Fl_Image*) or a (Fl_Multi_Label*). */\n  const char* labelb;\n  /** Holds the \"type\" of labela.\n    Typically this is set to FL_NORMAL_LABEL for a text label,\n    FL_IMAGE_LABEL for an image (based on Fl_image) or FL_MULTI_LABEL\n    if \"chaining\" multiple Fl_Multi_Label elements together. */\n  uchar typea;\n  /** Holds the \"type\" of labelb.\n    Typically this is set to FL_NORMAL_LABEL for a text label,\n    FL_IMAGE_LABEL for an image (based on Fl_image) or FL_MULTI_LABEL\n    if \"chaining\" multiple Fl_Multi_Label elements together. */\n  uchar typeb;\n\n  // This method is used to associate a Fl_Multi_Label with a Fl_Widget.\n  void label(Fl_Widget*);\n\n  // This method is used to associate a Fl_Multi_Label with a Fl_Menu_Item.\n  void label(Fl_Menu_Item*);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Multiline_Input.H",
    "content": "//\n// Multiline input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2011 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Multiline_Input widget . */\n\n#ifndef Fl_Multiline_Input_H\n#define Fl_Multiline_Input_H\n\n#include \"Fl_Input.H\"\n\n/**\n  This input field displays '\\\\n' characters as new lines rather than ^J,\n  and accepts the Return, Tab, and up and down arrow keys.  This is for\n  editing multiline text.\n\n  This is far from the nirvana of text editors, and is probably only\n  good for small bits of text, 10 lines at most. Note that this widget\n  does not support scrollbars or per-character color control.\n\n  If you are presenting large amounts of text and need scrollbars\n  or full color control of characters, you probably want Fl_Text_Editor\n  instead.\n\n  In FLTK 1.3.x, the default behavior of the 'Tab' key was changed\n  to support consistent focus navigation. To get the older FLTK 1.1.x\n  behavior, set Fl_Input_::tab_nav() to 0. Newer programs should consider using\n  Fl_Text_Editor.\n*/\nclass FL_EXPORT Fl_Multiline_Input : public Fl_Input {\npublic:\n  /**\n    Creates a new Fl_Multiline_Input widget using the given\n    position, size, and label string. The default boxtype is FL_DOWN_BOX.\n\n    Inherited destructor destroys the widget and any value associated with it.\n  */\n  Fl_Multiline_Input(int X,int Y,int W,int H,const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Multiline_Output.H",
    "content": "//\n// Multi line output header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2011 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Multiline_Output widget . */\n\n#ifndef Fl_Multiline_Output_H\n#define Fl_Multiline_Output_H\n\n#include \"Fl_Output.H\"\n\n/**\n  This widget is a subclass of Fl_Output that displays multiple\n  lines of text. It also displays tab characters as whitespace to the\n  next column.\n\n  Note that this widget does not support scrollbars, or per-character\n  color control.\n\n  If you are presenting large amounts of read-only text\n  and need scrollbars, or full color control of characters,\n  then use Fl_Text_Display. If you want to display HTML text,\n  use Fl_Help_View.\n\n  A caret cursor (^) shows the keyboard navigation mark\n  for keyboard selection of the output text, e.g. Arrow Keys\n  to move the cursor, Shift + Arrow Keys to create a text\n  selection, and '^C' to copy the selected text to the paste buffer.\n  The caret cursor can be disabled by disabling the widget's\n  \"visible focus\" using clear_visible_focus(), inherited from the\n  Fl_Widget base class. Doing this also disables the widget's\n  keyboard navigation.\n*/\nclass FL_EXPORT Fl_Multiline_Output : public Fl_Output {\npublic:\n\n  /**\n    Creates a new Fl_Multiline_Output widget using the given position,\n    size, and label string. The default boxtype is FL_DOWN_BOX.\n\n    Inherited destructor destroys the widget and any value associated with it.\n  */\n  Fl_Multiline_Output(int X,int Y,int W,int H,const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Native_File_Chooser.H",
    "content": "//\n// FLTK native OS file chooser widget\n//\n// Copyright 2004 Greg Ercolano.\n// Copyright 2005-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   Fl_Native_File_Chooser widget. */\n\n/* Implementation note:\n\n class Fl_Native_File_Chooser  <== public API used by applications\n\n class Fl_Native_File_Chooser_Driver   <== virtual API that a platform may implement\n                                           this API has a do-nothing default implementation\n\n        class Fl_Native_File_Chooser_FLTK_Driver   <== this API implementation is the default FLTK file chooser\n                class Fl_GTK_Native_File_Chooser_Driver  <== this API implementation runs a GTK file chooser\n                class Fl_Kdialog_Native_File_Chooser_Driver  <== this API implementation runs a KDE file chooser\n                                        it is determined at run-time if the GTK dynamic libraries are available\n                                        and the KDE file chooser runs under the KDE desktop\n\n        class Fl_Quartz_Native_File_Chooser_Driver  <== this API implementation runs a Mac OS X file chooser\n\n        class Fl_WinAPI_Native_File_Chooser_Driver  <== this API implementation runs a Windows file chooser\n\n\n Each platform must implement the constructor of the Fl_Native_File_Chooser class.\n This particular implementation:\n\n Fl_Native_File_Chooser::Fl_Native_File_Chooser(int val) {\n  platform_fnfc = new Fl_Native_File_Chooser_FLTK_Driver(val);\n }\n\n can be used by any platform.\n No more code is required. The cross-platform Fl_Native_File_Chooser_FLTK.cxx file must be compiled in libfltk,\n and the default FLTK file chooser will be used.\n\n This other implementation:\n Fl_Native_File_Chooser::Fl_Native_File_Chooser(int val) {\n   platform_fnfc = 0;\n }\n can be used by a platform that needs no file chooser.\n */\n\n#ifndef FL_NATIVE_FILE_CHOOSER_H\n#define FL_NATIVE_FILE_CHOOSER_H\n\n#include <FL/Fl_Export.H>\n#include <FL/Fl_File_Chooser.H>\n\nclass Fl_Native_File_Chooser_Driver;\n\n/**\n This class lets an FLTK application easily and consistently access\n the operating system's native file chooser. Some operating systems\n have very complex and specific file choosers that many users want\n access to specifically, instead of FLTK's default file chooser(s).\n\n In cases where there is no native file browser, FLTK's own file browser\n is used instead.\n\n To use this widget, use the following include in your code:\n \\code\n #include <FL/Fl_Native_File_Chooser.H>\n \\endcode\n\n The following example shows how to pick a single file:\n \\code\n // Create and post the local native file chooser\n #include <FL/Fl_Native_File_Chooser.H>\n [..]\n Fl_Native_File_Chooser fnfc;\n fnfc.title(\"Pick a file\");\n fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);\n fnfc.filter(\"Text\\t*.txt\\n\"\n             \"C Files\\t*.{cxx,h,c}\");\n fnfc.directory(\"/var/tmp\");           // default directory to use\n // Show native chooser\n switch ( fnfc.show() ) {\n   case -1: printf(\"ERROR: %s\\n\", fnfc.errmsg());    break;  // ERROR\n   case  1: printf(\"CANCEL\\n\");                      break;  // CANCEL\n   default: printf(\"PICKED: %s\\n\", fnfc.filename()); break;  // FILE CHOSEN\n }\n \\endcode\n\n The Fl_Native_File_Chooser widget transmits UTF-8 encoded filenames to its user. It is\n recommended to open files that may have non-ASCII names with the fl_fopen() or\n fl_open() utility functions that handle these names in a cross-platform way\n (whereas the standard fopen()/open() functions fail on the Windows platform\n to open files with a non-ASCII name).\n\n <B>Platform Specific Caveats</B>\n\n - Under X11/Wayland the dialog is chosen as follows:\n -# If command \\p zenity is available at run-time and if \\p Fl::option(OPTION_FNFC_USES_ZENITY) is\n turned on, the \\p zenity -based dialog opens. This is expected to be more appropriate\n than other dialog forms for sandboxed apps, but member function filter_value() is not effective.\n -# Else if the app runs under the KDE desktop\n and if \\p Fl::option(OPTION_FNFC_USES_KDIALOG) is turned on,\n and if command \\p kdialog is available at run-time, the \\p kdialog -based dialog opens.\n Member function filter_value() is not effective with this dialog.\n -# Else if the GTK library is available at run-time on the computer and if \\p Fl::option(OPTION_FNFC_USES_GTK) is\n not turned off, the GTK-styled dialog opens. Call fl_register_images() to add  a \"Preview\" button to this dialog.\n Use the static public attributes of class Fl_File_Chooser to localize the browser.\n -# Otherwise, FLTK's own dialog produced by the Fl_File_Chooser class opens.\n Call fl_register_images() to add  a \"Preview\" button to it.\n It's best if you also call Fl_File_Icon::load_system_icons()\n at the start of main(), to enable the nicer looking file browser widgets.\n Use the static public attributes of class Fl_File_Chooser to localize the browser.\n\n - Some operating systems support certain OS specific options; see\n Fl_Native_File_Chooser::options() for a list.\n\n \\image html Fl_Native_File_Chooser.png \"The Fl_Native_File_Chooser on different platforms.\"\n \\image latex Fl_Native_File_Chooser.png \"The Fl_Native_File_Chooser on different platforms\" width=14cm\n\n */\nclass FL_EXPORT Fl_Native_File_Chooser {\nprivate:\n  Fl_Native_File_Chooser_Driver *platform_fnfc;\npublic:\n  enum Type {\n    BROWSE_FILE = 0,                    ///< browse files (lets user choose one file)\n    BROWSE_DIRECTORY,                   ///< browse directories (lets user choose one directory)\n    BROWSE_MULTI_FILE,                  ///< browse files (lets user choose multiple files)\n    BROWSE_MULTI_DIRECTORY,             ///< browse directories (lets user choose multiple directories)\n    BROWSE_SAVE_FILE,                   ///< browse to save a file\n    BROWSE_SAVE_DIRECTORY               ///< browse to save a directory\n  };\n  enum Option {\n    NO_OPTIONS     = 0x0000,            ///< no options enabled\n    SAVEAS_CONFIRM = 0x0001,            ///< Show native 'Save As' overwrite confirm dialog\n    NEW_FOLDER     = 0x0002,            ///< Show 'New Folder' icon (if supported)\n    PREVIEW        = 0x0004,            ///< enable preview mode (if supported)\n    USE_FILTER_EXT = 0x0008             ///< Chooser filter presets the output file extension (if supported)\n  };\n  static const char *file_exists_message;\n\n  /**\n   The constructor. Internally allocates the native widgets.\n   Optional \\p val presets the type of browser this will be,\n   which can also be changed with type().\n   */\n  Fl_Native_File_Chooser(int val = BROWSE_FILE); // each platorm implements it\n  ~Fl_Native_File_Chooser();\n  void type(int t);\n  int type() const ;\n  void options(int o);\n  int options() const;\n  int count() const;\n  const char *filename() const ;\n  const char *filename(int i) const ;\n  void directory(const char *val) ;\n  const char *directory() const;\n  void title(const char *t);\n  const char* title() const;\n  const char *filter() const ;\n  void filter(const char *f);\n  int filters() const ;\n  void filter_value(int i) ;\n  int filter_value() const ;\n  void preset_file(const char*f) ;\n  const char* preset_file() const;\n  const char *errmsg() const ;\n  int show() ;\n  };\n\n/**\n \\cond DriverDev\n \\addtogroup DriverDeveloper\n \\{\n */\n\n/** Represents the interface between FLTK and a native file chooser.\n This class is only for internal use by the FLTK library.\n A platform that wants to provide a native file chooser implements all virtual methods\n of this class. Each platform supported by FLTK must also implement the constructor of the\n Fl_Native_File_Chooser class.\n */\nclass Fl_Native_File_Chooser_Driver {\nprotected:\n  static void chrcat(char *s, char c);\n  static char *strapp(char *s, const char *val);\n  static char *strfree(char *val);\n  static char *strnew(const char *val);\npublic:\n  Fl_Native_File_Chooser_Driver(int) {}\n  virtual ~Fl_Native_File_Chooser_Driver() {}\n  virtual void type(int) {}\n  virtual int type() const  {return 0;}\n  virtual void options(int) {}\n  virtual int options() const {return 0;}\n  virtual int count() const {return 0;}\n  virtual const char *filename() const  {return 0;}\n  virtual const char *filename(int) const  {return 0;}\n  virtual void directory(const char *)  {}\n  virtual const char *directory() const {return 0;}\n  virtual void title(const char *) {}\n  virtual const char* title() const {return 0;}\n  virtual const char *filter() const  {return 0;}\n  virtual void filter(const char *) {}\n  virtual int filters() const  {return 0;}\n  virtual void filter_value(int)  {}\n  virtual int filter_value() const  {return 0;}\n  virtual void preset_file(const char*)  {}\n  virtual const char* preset_file() const {return 0;}\n  virtual const char *errmsg() const  {return 0;}\n  virtual int show()  {return 1;}\n};\n\n/** A cross-platform implementation of Fl_Native_File_Chooser_Driver.\n This implementation uses a Fl_File_Chooser object as file chooser.\n\n Any platform can support the Fl_Native_File_Chooser class by implementing\n its constructor as follows:\n \\code\n Fl_Native_File_Chooser::Fl_Native_File_Chooser(int type) {\n   platform_fnfc = new Fl_Native_File_Chooser_FLTK_Driver(type);\n }\n\\endcode\n */\nclass Fl_Native_File_Chooser_FLTK_Driver : public Fl_Native_File_Chooser_Driver {\nprivate:\n  void errmsg(const char *msg);\n  int type_fl_file(int val);\n  int exist_dialog();\n  void parse_filter();\nprotected:\n  int   _btype;                 // kind-of browser to show()\n  int   _options;               // general options\n  int   _nfilters;\n  char *_filter;                // user supplied filter\n  char *_parsedfilt;            // parsed filter\n  int   _filtvalue;             // selected filter\n  char *_preset_file;\n  char *_prevvalue;             // Returned filename\n  char *_directory;\n  char *_errmsg;                // error message\n  Fl_File_Chooser *_file_chooser;\npublic:\n  Fl_Native_File_Chooser_FLTK_Driver(int val);\n  virtual ~Fl_Native_File_Chooser_FLTK_Driver();\n  void type(int t) FL_OVERRIDE;\n  int type() const FL_OVERRIDE;\n  void options(int o) FL_OVERRIDE;\n  int options() const FL_OVERRIDE;\n  int count() const FL_OVERRIDE;\n  const char *filename() const FL_OVERRIDE;\n  const char *filename(int i) const FL_OVERRIDE;\n  void directory(const char *val) FL_OVERRIDE;\n  const char *directory() const FL_OVERRIDE;\n  void title(const char *t) FL_OVERRIDE;\n  const char* title() const FL_OVERRIDE;\n  const char *filter() const FL_OVERRIDE;\n  void filter(const char *f) FL_OVERRIDE;\n  int filters() const FL_OVERRIDE;\n  void filter_value(int i) FL_OVERRIDE;\n  int filter_value() const FL_OVERRIDE;\n  void preset_file(const char*f) FL_OVERRIDE;\n  const char* preset_file() const FL_OVERRIDE;\n  const char *errmsg() const FL_OVERRIDE;\n  int show() FL_OVERRIDE;\n};\n\n/**\n \\}\n \\endcond\n */\n\n\n#endif /*FL_NATIVE_FILE_CHOOSER_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Nice_Slider.H",
    "content": "//\n// \"Nice\" slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Nice_Slider widget . */\n\n#ifndef Fl_Nice_Slider_H\n#define Fl_Nice_Slider_H\n\n#include \"Fl_Slider.H\"\n\nclass FL_EXPORT Fl_Nice_Slider : public Fl_Slider {\npublic:\n  Fl_Nice_Slider(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Object.H",
    "content": "//\n// Old Fl_Object header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// This file is provided for back compatibility only.  Please use Fl_Widget\n#ifndef Fl_Object\n#define Fl_Object Fl_Widget\n#endif\n#include \"Fl_Widget.H\"\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Output.H",
    "content": "//\n// Output header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Output widget . */\n\n#ifndef Fl_Output_H\n#define Fl_Output_H\n\n#include \"Fl_Input.H\"\n/**\n  This widget displays a piece of text.\n\n  When you set the value() , Fl_Output does a strcpy() to its own storage,\n  which is useful for program-generated values.  The user may select\n  portions of the text using the mouse and paste the contents into other\n  fields or programs.\n\n  \\image html text.png\n  \\image latex text.png \"Fl_Output\" width=8cm\n\n  There is a single subclass, Fl_Multiline_Output, which allows you to\n  display multiple lines of text. Fl_Multiline_Output does not provide\n  scroll bars. If a more complete text editing widget is needed, use\n  Fl_Text_Display instead.\n\n  The text may contain any characters except \\\\0, and will correctly\n  display anything, using ^X notation for unprintable control characters\n  and \\\\nnn notation for unprintable characters with the high bit set. It\n  assumes the font can draw any characters in the ISO-Latin1 character set.\n*/\nclass FL_EXPORT Fl_Output : public Fl_Input {\npublic:\n  /**\n    Creates a new Fl_Output widget using the given position,\n    size, and label string. The default boxtype is FL_DOWN_BOX.\n\n    Inherited destructor destroys the widget and any value associated with it.\n  */\n\n    Fl_Output(int X,int Y,int W,int H, const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Overlay_Window.H",
    "content": "//\n// Overlay window header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Overlay_Window class . */\n\n#ifndef Fl_Overlay_Window_H\n#define Fl_Overlay_Window_H\n\n#include \"Fl_Double_Window.H\"\n\n/**\n  This window provides double buffering and also the ability to draw the\n  \"overlay\" which is another picture placed on top of the main image. The\n  overlay is designed to be a rapidly-changing but simple graphic such as\n  a mouse selection box. Fl_Overlay_Window uses the overlay\n  planes provided by your graphics hardware if they are available.\n  <P>If no hardware support is found the overlay is simulated by drawing\n  directly into the on-screen copy of the double-buffered window, and\n  \"erased\" by copying the backbuffer over it again.  This means the\n  overlay will blink if you change the image in the window.\n*/\nclass FL_EXPORT Fl_Overlay_Window : public Fl_Double_Window {\n#ifndef FL_DOXYGEN\n  friend class _Fl_Overlay;\n  friend class Fl_Window_Driver;\n#endif\npublic:\n  /**\n   You must subclass Fl_Overlay_Window and provide this method.\n   It is just like a draw() method, except it draws the overlay.\n   The overlay will have already been \"cleared\" when this is called.  You\n   can use any of the routines described in &lt;FL/fl_draw.H&gt;.\n   */\n  virtual void draw_overlay() = 0;\nprivate:\n  Fl_Window *overlay_;\npublic:\n  void show() FL_OVERRIDE;\n  void hide() FL_OVERRIDE;\n  void flush() FL_OVERRIDE;\n  void resize(int,int,int,int) FL_OVERRIDE;\n  ~Fl_Overlay_Window();\n  /** Returns non-zero if there's hardware overlay support */\n  int can_do_overlay();\n  void redraw_overlay();\nprotected:\n  /**\n   See Fl_Overlay_Window::Fl_Overlay_Window(int X, int Y, int W, int H, const char *l=0)\n   */\n  Fl_Overlay_Window(int W, int H, const char *l=0);\n  /**\n   Creates a new Fl_Overlay_Window widget using the given\n   position, size, and label (title) string. If the\n   positions (x,y) are not given, then the window manager\n   will choose them.\n   */\n  Fl_Overlay_Window(int X, int Y, int W, int H, const char *l=0);\npublic:\n  /** Same as Fl_Window::show(int a, char **b) */\n  void show(int a, char **b) {Fl_Double_Window::show(a,b);}\n  Fl_Overlay_Window *as_overlay_window() FL_OVERRIDE {return this; }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_PDF_File_Surface.H",
    "content": "//\n// Declaration of class Fl_PDF_File_Surface for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef PDF_FILE_SURFACE_H\n#define PDF_FILE_SURFACE_H\n\n#include <FL/Fl_Paged_Device.H>\n\n/**\n To send graphical output to a PDF file.\n Class Fl_PDF_File_Surface is used exactly as the Fl_Printer class except for its 2 member functions begin_job()  and begin_document().\n <p><b>Platform notes:</b>\n - Windows:  requires \"Microsoft Print to PDF\" available in Windows 10 and later.\n - Wayland/X11: requires the FLTK library was built with FLTK_USE_PANGO=1.\n - macOS:  requires macOS 10.9 or later.\n <p>If the running platform doesn't fulfill the requirement above, the program runs but doesn't output any PDF.\n*/\nclass FL_EXPORT Fl_PDF_File_Surface : public Fl_Paged_Device {\nprivate:\n  const char **out_filename_;\n  Fl_Paged_Device *platform_surface_;\n  static Fl_Paged_Device *new_platform_pdf_surface_(const char ***);\npublic:\n  /** \\name These attributes are useful for the Wayland/X11 platform only.\n   \\{\n   */\n  static const char * format_dialog_title;\n  static const char * format_dialog_page_size;\n  static const char * format_dialog_orientation;\n  static const char * format_dialog_default;\n  /** \\} */\n  Fl_PDF_File_Surface();\n  ~Fl_PDF_File_Surface();\n  /** Prepare to draw to a PDF document identified with a file chooser.\n   A dialog opens to select the location and name of the output PDF document\n   as well as its page format and orientation.\n   \\param defaultfilename Default name for the PDF document\n   \\param perr NULL or address of a string that receives a message in case of error.\n   To be deleted[] after use.\n   \\return 0 for success, 1 when the user cancelled the operation, 2 when an error occurred.\n   */\n  int begin_job(const char* defaultfilename, char **perr = NULL);\n  /** Don't use for this class */\n  int begin_job(int, int *, int *, char **) FL_OVERRIDE {return 1;}\n  /** Prepare to draw to a PDF document identified by its pathname.\n   \\param pathname Path name for the PDF document\n   \\param format The paper format for the PDF document\n   \\param layout The orientation for the PDF document\n   \\param perr NULL or address of a string that receives a message in case of error.\n   To be deleted[] after use.\n   \\return 0 for success, 2 when an error occurred.\n   */\n  int begin_document(const char* pathname,\n                enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,\n                enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT,\n                char **perr = NULL);\n  int printable_rect(int *w, int *h) FL_OVERRIDE { return platform_surface_->printable_rect(w,h); }\n  void margins(int *left, int *top, int *right, int *bottom) FL_OVERRIDE {\n    platform_surface_->margins(left,top,right,bottom);\n  }\n  void origin(int x, int y) FL_OVERRIDE {platform_surface_->origin(x, y);}\n  void origin(int *x, int *y) FL_OVERRIDE {platform_surface_->origin(x, y);}\n  void scale(float s_x, float s_y = 0) FL_OVERRIDE {platform_surface_->scale(s_x, s_y);}\n  void rotate(float angle) FL_OVERRIDE {platform_surface_->rotate(angle);}\n  void translate(int x, int y) FL_OVERRIDE {platform_surface_->translate(x, y);}\n  void untranslate() FL_OVERRIDE {platform_surface_->untranslate();};\n  int begin_page(void) FL_OVERRIDE {return platform_surface_->begin_page();}\n  int end_page(void) FL_OVERRIDE {return platform_surface_->end_page();}\n  void end_job(void) FL_OVERRIDE {return platform_surface_->end_job();}\n  /** Returns the name of the PDF document */\n  inline const char *pdf_filename() { return *out_filename_; }\n  void set_current() FL_OVERRIDE { if (platform_surface_) platform_surface_->set_current(); }\n  bool is_current() FL_OVERRIDE { return surface() == platform_surface_; }\n};\n\n#endif // PDF_FILE_SURFACE_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_PNG_Image.H",
    "content": "//\n// PNG image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_PNG_Image class . */\n\n#ifndef Fl_PNG_Image_H\n#define Fl_PNG_Image_H\n#  include \"Fl_Image.H\"\n\n/**\n  The Fl_PNG_Image class supports loading, caching,\n  and drawing of Portable Network Graphics (PNG) image files. The\n  class loads color-mapped and full-color images and handles color-\n  and alpha-based transparency.\n*/\nclass FL_EXPORT Fl_PNG_Image : public Fl_RGB_Image {\n  friend class Fl_ICO_Image;\npublic:\n\n  Fl_PNG_Image(const char* filename);\n  Fl_PNG_Image (const char *name_png, const unsigned char *buffer, int datasize);\nprivate:\n  Fl_PNG_Image(const char *filename, int offset); // used by Fl_ICO_Image\n  void load_png_(const char *name_png, int offset, const unsigned char *buffer_png, int datasize);\n};\n\n// Support functions to write PNG image files (since 1.4.0)\n\nFL_EXPORT int fl_write_png(const char *filename, Fl_RGB_Image *img);\nFL_EXPORT int fl_write_png(const char *filename, const char *pixels, int w, int h, int d=3, int ld=0);\nFL_EXPORT int fl_write_png(const char *filename, const unsigned char *pixels, int w, int h, int d=3, int ld=0);\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_PNM_Image.H",
    "content": "//\n// PNM image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_PNM_Image class . */\n\n#ifndef Fl_PNM_Image_H\n#define Fl_PNM_Image_H\n#  include \"Fl_Image.H\"\n\n/**\n  The Fl_PNM_Image class supports loading, caching,\n  and drawing of Portable Anymap (PNM, PBM, PGM, PPM) image files. The class\n  loads bitmap, grayscale, and full-color images in both ASCII and\n  binary formats.\n*/\nclass FL_EXPORT Fl_PNM_Image : public Fl_RGB_Image {\n\n  public:\n\n  Fl_PNM_Image(const char* filename);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Pack.H",
    "content": "//\n// Pack header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2020 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Pack widget . */\n\n#ifndef Fl_Pack_H\n#define Fl_Pack_H\n\n#include <FL/Fl_Group.H>\n\n/**\n  This widget was designed to add the functionality of compressing and\n  aligning widgets.\n\n  If type() is Fl_Pack::HORIZONTAL all the children are\n  resized to the height of the Fl_Pack, and are moved next to\n  each other horizontally. If type() is not Fl_Pack::HORIZONTAL\n  then the children are resized to the width and are stacked below each\n  other.  Then the Fl_Pack resizes itself to surround the child widgets.\n\n  You may want to put the Fl_Pack inside an Fl_Scroll.\n\n  The \\p 'resizable()' for Fl_Pack is set to NULL by default. Its behavior\n  is slightly different than in a normal Fl_Group widget: only if the\n  resizable() widget is the last widget in the group it is extended to take\n  the full available width or height, respectively, of the Fl_Pack group.\n\n  \\note You can nest Fl_Pack widgets or put them inside Fl_Scroll widgets\n    or inside other group widgets but their behavior can sometimes be\n    <i>\"surprising\"</i>. This is partly due to the fact that Fl_Pack widgets\n    resize themselves during their draw() operation, trying to react on\n    their child widgets resizing themselves during \\b their draw() operations\n    which can be confusing. If you want to achieve special resize behavior\n    of nested group widgets it can sometimes be easier to derive your own\n    specialized group widget than to try to make nested Fl_Pack widgets\n    behave as expected.\n\n  \\see Fl_Group::resizable()\n*/\nclass FL_EXPORT Fl_Pack : public Fl_Group {\n  int spacing_;\n\npublic:\n  enum { // values for type(int)\n    VERTICAL = 0,\n    HORIZONTAL = 1\n  };\n\nprotected:\n  void draw() FL_OVERRIDE;\n\npublic:\n  Fl_Pack(int X, int Y, int W, int H, const char *L = 0);\n\n  /**\n    Gets the number of extra pixels of blank space that are added\n    between the children.\n  */\n  int spacing() const {return spacing_;}\n\n  /**\n    Sets the number of extra pixels of blank space that are added\n    between the children.\n  */\n  void spacing(int i) {spacing_ = i;}\n\n  /** Returns non-zero if Fl_Pack alignment is horizontal.\n\n    \\returns non-zero if Fl_Pack alignment is horizontal (Fl_Pack::HORIZONTAL)\n\n    \\note Currently the return value is the same as Fl_Group::type(), but\n      this may change in the future. Do not set any other values than the\n      following with Fl_Pack::type():\n      - Fl_Pack::VERTICAL (Default)\n      - Fl_Pack::HORIZONTAL\n\n    See class Fl_Pack documentation for details.\n  */\n  uchar horizontal() const {return type();}\n\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n  /** Deletes all child widgets with Fl_Group::clear().\n  And  sets to NULL the resizable() widget. */\n  void clear() { Fl_Group::clear(); resizable(NULL); }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Paged_Device.H",
    "content": "//\n// Printing support for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2010-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file Fl_Paged_Device.H\n \\brief declaration of class Fl_Paged_Device.\n */\n\n#ifndef Fl_Paged_Device_H\n#define Fl_Paged_Device_H\n\n#include <FL/Fl_Widget_Surface.H>\n\n\n/** \\brief Number of elements in enum Page_Format */\n#define NO_PAGE_FORMATS 30 /* MSVC6 compilation fix */\n\n/**\n \\brief Represents page-structured drawing surfaces.\n\n This class has no public constructor: don't instantiate it; use Fl_Printer\n or Fl_PostScript_File_Device instead.\n */\nclass FL_EXPORT Fl_Paged_Device : public Fl_Widget_Surface {\nprotected:\n  /** \\brief The constructor */\n  Fl_Paged_Device() : Fl_Widget_Surface(NULL) {}\npublic:\n  /**\n   Possible page formats.\n   All paper formats with pre-defined width and height. The Fl_Paged_Device::page_formats array gives these widths and heights.\n   */\n  enum Page_Format {\n    A0 = 0, /**<  A0 format */\n    A1, /**<  A1 format */\n    A2, /**<  A2 format */\n    A3, /**<  A3 format */\n    A4, /**<  A4 format */\n    A5, /**<  A5 format */\n    A6, /**<  A6 format */\n    A7, /**<  A7 format */\n    A8, /**<  A8 format */\n    A9, /**<  A9 format */\n    B0, /**<  B0 format */\n    B1, /**<  B1 format */\n    B2, /**<  B2 format */\n    B3, /**<  B3 format */\n    B4, /**<  B4 format */\n    B5, /**<  B5 format */\n    B6, /**<  B6 format */\n    B7, /**<  B7 format */\n    B8, /**<  B8 format */\n    B9, /**<  B9 format */\n    B10, /**<  B10 format */\n    C5E,\n    DLE,\n    EXECUTIVE, /**<   Executive format */\n    FOLIO, /**<  Folio  format */\n    LEDGER, /**<  Ledger  format */\n    LEGAL, /**<  Legal format */\n    LETTER, /**<  Letter format */\n    TABLOID, /**<   Tabloid format */\n    ENVELOPE,\n    MEDIA = 0x1000\n  };\n  /**\n   \\brief Possible page layouts.\n   */\n  enum Page_Layout {\n    PORTRAIT = 0,  /**< Portrait orientation */\n    LANDSCAPE = 0x100,   /**< Landscape orientation */\n    REVERSED = 0x200,  /**< Reversed orientation */\n    ORIENTATION = 0x300 /**<  orientation */\n  };\n\n  /** \\brief width, height and name of a page format\n */\n  typedef struct {\n    /** \\brief width in points */\n    int width;\n    /** \\brief height in points */\n    int height;\n    /** \\brief format name */\n    const char *name;\n  } page_format;\n  /** \\brief width, height and name of all elements of the enum \\ref Page_Format.\n   */\n  static const page_format page_formats[NO_PAGE_FORMATS];\n  /** \\brief The destructor */\n  virtual ~Fl_Paged_Device() {}\n  virtual int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message = NULL);\n  /** Synonym of begin_job(int pagecount, int *frompage, int *topage, char **perr_message).\n   For API compatibility with FLTK 1.3.x */\n  int start_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message = NULL) {\n    return begin_job(pagecount, frompage, topage, perr_message);\n  }\n  virtual int begin_page(void);\n  /** Synonym of begin_page().\n   For API compatibility with FLTK 1.3.x */\n  int start_page() {return begin_page();}\n  virtual void margins(int *left, int *top, int *right, int *bottom);\n  virtual void scale(float scale_x, float scale_y = 0.);\n  virtual void rotate(float angle);\n  /** Synonym of draw(Fl_Widget*, int, int) */\n  void print_widget(Fl_Widget* widget, int delta_x = 0, int delta_y = 0) {draw(widget, delta_x, delta_y);}\n  /** Synonym of draw_decorated_window(Fl_Window*, int, int) */\n  void print_window(Fl_Window *win, int x_off = 0, int y_off = 0) {\n    draw_decorated_window(win, x_off, y_off);\n  }\n  virtual int end_page (void);\n  virtual void end_job (void);\n};\n\n#endif // Fl_Paged_Device_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Pixmap.H",
    "content": "//\n// Pixmap header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2017 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Pixmap widget . */\n\n#ifndef Fl_Pixmap_H\n#define Fl_Pixmap_H\n#  include \"Fl_Image.H\"\n\nclass Fl_Widget;\nstruct Fl_Menu_Item;\n\n// Older C++ compilers don't support the explicit keyword... :(\n#  if defined(__sgi) && !defined(_COMPILER_VERSION)\n#    define explicit\n#  endif // __sgi && !_COMPILER_VERSION\n\n/**\n  The Fl_Pixmap class supports caching and drawing of colormap\n  (pixmap) images, including transparency.\n*/\nclass FL_EXPORT Fl_Pixmap : public Fl_Image {\n  friend class Fl_Graphics_Driver;\n  void copy_data();\n  void delete_data();\n  void set_data(const char * const *p);\n\nprotected:\n  void measure();\n\npublic:\n\n  int alloc_data; // Non-zero if data was allocated\n\nprivate:\n  // for internal use\n  fl_uintptr_t id_;\n  fl_uintptr_t mask_;\n  int cache_w_, cache_h_; // size of pixmap when cached\n\npublic:\n\n  /**    The constructors create a new pixmap from the specified XPM data.  */\n  explicit Fl_Pixmap(char * const * D) : Fl_Image(-1,0,1), alloc_data(0), id_(0), mask_(0) {set_data((const char*const*)D); measure();}\n  /**    The constructors create a new pixmap from the specified XPM data.  */\n  explicit Fl_Pixmap(uchar* const * D) : Fl_Image(-1,0,1), alloc_data(0), id_(0), mask_(0) {set_data((const char*const*)D); measure();}\n  /**    The constructors create a new pixmap from the specified XPM data.  */\n  explicit Fl_Pixmap(const char * const * D) : Fl_Image(-1,0,1), alloc_data(0), id_(0), mask_(0) {set_data((const char*const*)D); measure();}\n  /**    The constructors create a new pixmap from the specified XPM data.  */\n  explicit Fl_Pixmap(const uchar* const * D) : Fl_Image(-1,0,1), alloc_data(0), id_(0), mask_(0) {set_data((const char*const*)D); measure();}\n  virtual ~Fl_Pixmap();\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const { return Fl_Image::copy(); }\n  void color_average(Fl_Color c, float i) FL_OVERRIDE;\n  void desaturate() FL_OVERRIDE;\n  void draw(int X, int Y, int W, int H, int cx=0, int cy=0) FL_OVERRIDE;\n  void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);}\n  void label(Fl_Widget*w) FL_OVERRIDE;\n  void label(Fl_Menu_Item*m) FL_OVERRIDE;\n  void uncache() FL_OVERRIDE;\n  int cache_w() {return cache_w_;}\n  int cache_h() {return cache_h_;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Plugin.H",
    "content": "//\n// A Plugin system for FLTK, implemented in Fl_Preferences.cxx.\n//\n// Copyright 2002-2023 by Matthias Melcher.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Plugin class . */\n\n#ifndef Fl_Plugin_H\n#  define Fl_Plugin_H\n\n#  include \"Fl_Preferences.H\"\n\n\n/**\n \\brief Fl_Plugin allows link-time and run-time integration of binary modules.\n\n Fl_Plugin and Fl_Plugin_Manager provide a small and simple solution for\n linking C++ classes at run-time, or optionally linking modules at compile\n time without the need to change the main application.\n\n Fl_Plugin_Manager uses static initialization to create the plugin interface\n early during startup. Plugins are stored in a temporary database, organized\n in classes.\n\n Plugins should derive a new class from Fl_Plugin as a base:\n \\code\n class My_Plugin : public Fl_Plugin {\n public:\n   My_Plugin() : Fl_Plugin(\"effects\", \"blur\") { }\n   void do_something(...);\n };\n My_Plugin blur_plugin();\n \\endcode\n\n Plugins can be put into modules and either linked before distribution, or loaded\n from dynamically linkable files. An Fl_Plugin_Manager is used to list and\n access all currently loaded plugins.\n \\code\n Fl_Plugin_Manager mgr(\"effects\");\n int i, n = mgr.plugins();\n for (i=0; i<n; i++) {\n   My_Plugin *pin = (My_Plugin*)mgr.plugin(i);\n   pin->do_something();\n }\n \\endcode\n */\nclass FL_EXPORT Fl_Plugin  {\n  Fl_Preferences::ID id;\npublic:\n  Fl_Plugin(const char *klass, const char *name);\n  virtual ~Fl_Plugin();\n};\n\n\n/**\n \\brief Fl_Plugin_Manager manages link-time and run-time plugin binaries.\n \\see Fl_Plugin\n */\nclass FL_EXPORT Fl_Plugin_Manager : public Fl_Preferences {\npublic:\n  Fl_Plugin_Manager(const char *klass);\n  ~Fl_Plugin_Manager();\n\n  /** \\brief Return the number of plugins in the klass.\n   */\n  int plugins() { return groups(); }\n  Fl_Plugin *plugin(int index);\n  Fl_Plugin *plugin(const char *name);\n  Fl_Preferences::ID addPlugin(const char *name, Fl_Plugin *plugin);\n\n  static void removePlugin(Fl_Preferences::ID id);\n  static int load(const char *filename);\n  static int loadAll(const char *dirpath, const char *pattern=0);\n};\n\n\n#endif // !Fl_Preferences_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Positioner.H",
    "content": "//\n// Positioner header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Positioner widget . */\n\n#ifndef Fl_Positioner_H\n#define Fl_Positioner_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n/**\n  This class is provided for Forms compatibility.  It provides 2D input.\n  It would be useful if this could be put atop another widget so that the\n  crosshairs are on top, but this is not implemented.  The color of the\n  crosshairs is selection_color().\n  \\image html  positioner.png\n  \\image latex positioner.png \"Fl_Positioner\" width=4cm\n*/\nclass FL_EXPORT Fl_Positioner : public Fl_Widget {\n\n  double xmin, ymin;\n  double xmax, ymax;\n  double xvalue_, yvalue_;\n  double xstep_, ystep_;\n\nprotected:\n\n  // these allow subclasses to put the dial in a smaller area:\n  void draw(int, int, int, int);\n  int handle(int, int, int, int, int);\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  int handle(int) FL_OVERRIDE;\n  /**\n    Creates a new Fl_Positioner widget using the given position,\n    size, and label string. The default boxtype is FL_NO_BOX.\n  */\n  Fl_Positioner(int x,int y,int w,int h, const char *l=0);\n  /** Gets the X axis coordinate.*/\n  double xvalue() const {return xvalue_;}\n  /** Gets the Y axis coordinate.*/\n  double yvalue() const {return yvalue_;}\n  int xvalue(double);\n  int yvalue(double);\n  int value(double,double);\n  void xbounds(double, double);\n  /** Gets the X axis minimum */\n  double xminimum() const {return xmin;}\n  /** Same as xbounds(a, xmaximum()) */\n  void xminimum(double a) {xbounds(a,xmax);}\n  /** Gets the X axis maximum */\n  double xmaximum() const {return xmax;}\n  /** Same as xbounds(xminimum(), a) */\n  void xmaximum(double a) {xbounds(xmin,a);}\n  void ybounds(double, double);\n  /** Gets the Y axis minimum */\n  double yminimum() const {return ymin;}\n  /** Same as ybounds(a, ymaximum()) */\n  void yminimum(double a) {ybounds(a, ymax);}\n  /** Gets the Y axis maximum */\n  double ymaximum() const {return ymax;}\n  /** Same as ybounds(ymininimum(), a) */\n  void ymaximum(double a) {ybounds(ymin, a);}\n  /** Sets the stepping value for the X axis.*/\n  void xstep(double a) {xstep_ = a;}\n  /** Sets the stepping value for the Y axis.*/\n  void ystep(double a) {ystep_ = a;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_PostScript.H",
    "content": "//\n// Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2010-2020 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file Fl_PostScript.H\n \\brief declaration of classes Fl_PostScript_File_Device and Fl_EPS_File_Surface.\n */\n\n#ifndef Fl_PostScript_H\n#define Fl_PostScript_H\n\n#include <FL/Fl_Paged_Device.H>\n#include <FL/fl_draw.H>\n#include <stdarg.h>\n\n/** Signature of functions FLTK may use to close FILE variables after PostScript/EPS output.\n A non-null return value indicates output error.\n \\see Fl_PostScript_File_Device::close_command() and Fl_EPS_File_Surface::Fl_EPS_File_Surface().\n */\nextern \"C\" {\n  typedef int (*Fl_PostScript_Close_Command)(FILE *);\n}\n\nclass Fl_PostScript_Graphics_Driver;\n\n/**\n To send graphical output to a PostScript file.\n This class is used exactly as the Fl_Printer class except for the begin_job() call,\n two variants of which are usable and allow to specify what page format and layout are desired.\n\n <br><b>Processing of text</b>: Text uses vectorial fonts under the X11 + Pango and the Wayland platforms.\n With other platforms, only text restricted to the Latin alphabet (and a few other characters\n listed in the table below) and to FLTK standard fonts is vectorized.  All other unicode characters\n or all other fonts (FL_FREE_FONT and above) are output as a bitmap.\n FLTK standard fonts are output using the corresponding PostScript standard fonts.\n The latin alphabet means all unicode characters between U+0020 and U+017F, or, in other words,\n the ASCII, Latin-1 Supplement and Latin Extended-A charts.\n \\htmlonly\n <table border=1>\n <caption>Extra characters supported by standard PostScript fonts</caption>\n <tr> <th>Char</th><th>Codepoint</th><th>Name</th>  <th>Char</th><th>Codepoint</th><th>Name</th> <th>Char</th><th>Codepoint</th><th>Name</th></tr>\n <tr><td>ƒ</td><td>U+0192</td><td>florin</td><td>‚</td><td>U+201A</td><td>quotesinglbase</td><td>™</td><td>U+2122</td><td>trademark</td></tr>\n <tr><td>ˆ</td><td>U+02C6</td><td>circumflex</td><td>“</td><td>U+201C</td><td>quotedblleft</td><td>∂</td><td>U+2202</td><td>partialdiff</td></tr>\n <tr><td>ˇ</td><td>U+02C7</td><td>caron</td><td>”</td><td>U+201D</td><td>quotedblright</td><td>Δ</td><td>U+2206</td><td>Delta</td></tr>\n <tr><td>˘</td><td>U+02D8</td><td>breve</td><td>„</td><td>U+201E</td><td>quotedblbase</td><td>∑</td><td>U+2211</td><td>summation</td></tr>\n <tr><td>˙</td><td>U+02D9</td><td>dotaccent</td><td>†</td><td>U+2020</td><td>dagger</td><td>√</td><td>U+221A</td><td>radical</td></tr>\n <tr><td>˚</td><td>U+02DA</td><td>ring</td><td>‡</td><td>U+2021</td><td>daggerdbl</td><td>∞</td><td>U+221E</td><td>infinity</td></tr>\n <tr><td>˛</td><td>U+02DB</td><td>ogonek</td><td>•</td><td>U+2022</td><td>bullet</td><td>≠</td><td>U+2260</td><td>notequal</td></tr>\n <tr><td>˜</td><td>U+02DC</td><td>tilde</td><td>…</td><td>U+2026</td><td>ellipsis</td><td>≤</td><td>U+2264</td><td>lessequal</td></tr>\n <tr><td>˝</td><td>U+02DD</td><td>hungarumlaut</td><td>‰</td><td>U+2030</td><td>perthousand</td><td>≥</td><td>U+2265</td><td>greaterequal</td></tr>\n <tr><td>–</td><td>U+2013</td><td>endash</td><td>‹</td><td>U+2039</td><td>guilsinglleft</td><td>◊</td><td>U+25CA</td><td>lozenge</td></tr>\n <tr><td>—</td><td>U+2014</td><td>emdash</td><td>›</td><td>U+203A</td><td>guilsinglright</td><td>ﬁ</td><td>U+FB01</td><td>fi</td></tr>\n <tr><td>‘</td><td>U+2018</td><td>quoteleft</td><td>/</td><td>U+2044</td><td>fraction</td><td>ﬂ</td><td>U+FB02</td><td>fl</td></tr>\n <tr><td>’</td><td>U+2019</td><td>quoteright</td><td>€</td><td>U+20AC</td><td>Euro</td><td></td><td>U+F8FF</td><td>apple (macOS only)</td></tr>\n </table>\n \\endhtmlonly\n\n \\image latex extraPSchars.png \"Extra characters supported by standard PostScript fonts\" width=16cm\n\n <b>Processing of transparent Fl_RGB_Image objects</b>: Under the X11 + Pango and the Wayland platforms,\n these objects are output with their exact transparency. With other platforms, these objects\n are drawn blended to white color. Class Fl_EPS_File_Surface 's constructor allows to set another\n background color for blending.\n\n */\nclass FL_EXPORT Fl_PostScript_File_Device : public Fl_Paged_Device {\nprivate:\n  // memorize the display's current font to restore it when the object ceases being current\n  Fl_Font display_font_;\n  Fl_Fontsize display_size_;\nprotected:\n  /**\n   \\brief Returns the PostScript driver of this drawing surface.\n   */\n  inline Fl_PostScript_Graphics_Driver *driver() { return (Fl_PostScript_Graphics_Driver*)Fl_Surface_Device::driver(); }\npublic:\n  /** The constructor. */\n    Fl_PostScript_File_Device();\n  /** The destructor. */\n  ~Fl_PostScript_File_Device();\n  /** Don't use with this class. */\n  int begin_job(int pagecount, int* from, int* to, char **perr_message) FL_OVERRIDE;\n  /** Begins the session where all graphics requests will go to a local PostScript file.\n   Opens a file dialog to select an output PostScript file.\n   This member function makes end_job() close the resulting PostScript file and display an\n   alert message with fl_alert() in case of any output error.\n   @param pagecount The total number of pages to be created. Use 0 if this number is unknown when this function is called.\n   @param format Desired page format.\n   @param layout Desired page layout.\n   @return 0 if OK, 1 if user cancelled the file dialog, 2 if fopen failed on user-selected output file.\n   */\n int begin_job(int pagecount = 0, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,\n                enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT);\n  /** Synonym of begin_job().\n   For API compatibility with FLTK 1.3.x */\n  int start_job(int pagecount = 0, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,\n                enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT) {\n    return begin_job(pagecount, format, layout);\n  }\n  /** Begins the session where all graphics requests will go to FILE pointer.\n   This member function prevents end_job() from closing \\p ps_output, so the user can check with \\p ferror(ps_output)\n   for output errors.\n   @param ps_output A writable FILE pointer that will receive PostScript output and that should not be closed\n   until after end_job() has been called.\n   @param pagecount The total number of pages to be created. Use 0 if this number is unknown when this function is called.\n   @param format Desired page format.\n   @param layout Desired page layout.\n   @return always 0.\n   */\n  int begin_job(FILE *ps_output, int pagecount = 0, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,\n                enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT);\n  /** Synonym of begin_job().\n   For API compatibility with FLTK 1.3.x */\n  int start_job(FILE *ps_output, int pagecount = 0, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,\n                enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT) {\n    return begin_job(ps_output, pagecount, format, layout);\n  }\n\n  int begin_page (void) FL_OVERRIDE;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  void margins(int *left, int *top, int *right, int *bottom) FL_OVERRIDE;\n  void origin(int *x, int *y) FL_OVERRIDE;\n  void origin(int x, int y) FL_OVERRIDE;\n  void scale (float scale_x, float scale_y = 0.) FL_OVERRIDE;\n  void rotate(float angle) FL_OVERRIDE;\n  void translate(int x, int y) FL_OVERRIDE;\n  void untranslate(void) FL_OVERRIDE;\n  int end_page (void) FL_OVERRIDE;\n  /** Completes all PostScript output.\n   This also closes with \\p fclose() the underlying file() unless close_command() was used to set another function.\n   */\n  void end_job(void) FL_OVERRIDE;\n  /** Label of the PostScript file chooser window */\n  static const char *file_chooser_title;\n  /** Returns the underlying FILE* receiving all PostScript data */\n  FILE *file();\n  /** Sets the function end_job() calls to close the file() */\n  void close_command(Fl_PostScript_Close_Command cmd);\n  void set_current() FL_OVERRIDE;\n  void end_current() FL_OVERRIDE;\n};\n\n/** Encapsulated PostScript drawing surface.\n This drawing surface allows to store any FLTK graphics in vectorial form in an \"Encapsulated PostScript\" file.\n \\n Usage example:\n \\code\n   Fl_Window *win = ...// Window to draw to an .eps file\n   int ww = win->decorated_w();\n   int wh = win->decorated_h();\n   FILE *eps = fl_fopen(\"/path/to/mywindow.eps\", \"w\");\n   if (eps) {\n     Fl_EPS_File_Surface *surface = new Fl_EPS_File_Surface(ww, wh, eps, win->color());\n     Fl_Surface_Device::push_current(surface);\n     surface->draw_decorated_window(win);\n     Fl_Surface_Device::pop_current();\n     delete surface; // the .eps file is not complete until the destructor was run\n   }\n \\endcode\n */\nclass FL_EXPORT Fl_EPS_File_Surface : public Fl_Widget_Surface {\nprotected:\n  /** Returns the PostScript driver of this drawing surface. */\n  inline Fl_PostScript_Graphics_Driver *driver() { return (Fl_PostScript_Graphics_Driver*)Fl_Surface_Device::driver(); }\npublic:\n  /**\n  Constructor.\n  \\param width,height Width and height of the EPS drawing area\n  \\param eps_output A writable FILE pointer where the Encapsulated PostScript data will be sent\n   \\param background Color expected to cover the background of the EPS drawing area.\n   This parameter affects only the drawing of transparent Fl_RGB_Image objects:\n   transparent areas of RGB images are blended with the \\p background color.\n   Under the X11 + pango platform, transparent RGB images are correctly blended to their background,\n   thus this parameter has no effect.\n   \\param closef If not NULL, the destructor or close() will call \\p closef(eps_output) after all\n    EPS data has been sent. If NULL, \\p fclose(eps_output) is called instead. This allows to close the FILE\n    pointer by, e.g., \\p pclose, or, using a function such as \\p \"int keep_open(FILE*){return 0;}\", to keep it open after\n    completion of all output to \\p eps_output. Function \\p closef should return non zero to indicate an error.\n  */\n  Fl_EPS_File_Surface(int width, int height, FILE *eps_output,\n                      Fl_Color background = FL_WHITE, Fl_PostScript_Close_Command closef = NULL);\n  /**\n   Destructor.\n   By default, the destructor closes with function \\p fclose() the underlying FILE. See the constructor for how\n   to close it differently or to keep it open. Use close() before object destruction to receive the status code\n   of output operations. If close() is not used and if EPS output results in error, the destructor displays an alert message\n   with fl_alert().\n   */\n  ~Fl_EPS_File_Surface();\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  /** Returns the underlying FILE pointer */\n  FILE *file();\n  void origin(int x, int y) FL_OVERRIDE;\n  void origin(int *px, int *py) FL_OVERRIDE;\n  void translate(int x, int y) FL_OVERRIDE;\n  void untranslate() FL_OVERRIDE;\n  /** Completes all EPS output.\n   The only operation possible with the Fl_EPS_File_Surface object after calling close() is its destruction.\n   \\return The status code of output operations to the FILE object. 0 indicates success. */\n  int close();\n};\n\n#endif // Fl_PostScript_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Preferences.H",
    "content": "//\n// Preferences implementation for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2002-2023 by Matthias Melcher.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Preferences class . */\n\n#ifndef Fl_Preferences_H\n#  define Fl_Preferences_H\n\n#  include <stdio.h>\n#  include \"Fl_Export.H\"\n#  include \"fl_attr.h\"\n\n//class Fl_String;\n#if (FLTK_USE_STD)\n#include <string>\n#endif\n\n/**\n \\brief Fl_Preferences store user settings between application starts.\n\n FLTK Preferences are similar to the Registry on Windows and Preferences on\n MacOS, providing a simple method to store customizable user settings between\n application launches. A typical use is storing the last window position or a\n history of previously used documents.\n\n Preferences are organized in a hierarchy of groups. Every group can contain\n more groups and any number of key/value pairs. Keys can be text strings\n containing ASCII letters, digits, periods, and underscores. Forward slashes\n in a key name are treated as subgroups, i.e. the key 'window/width' would\n actually refer to the key 'width' inside the group 'window'.\n\n Keys have a unique name within their group. A value can be any string including\n control characters 0x00 to 0x1f, 0x7f, and UTF-8 octets.\n\n Several methods allow setting and getting numerical values and binary data.\n\n Preferences files are the same across platforms. User comments in preference\n files are preserved. Filenames are unique for each application by using a\n vendor/application naming scheme. The developer app must provide default values\n for all entries to ensure proper operation should preferences be corrupted\n or not yet exist.\n\n \\note The format of preferences files is not part of the FLTK specification\n and intentionally undocumented. The only valid way to read or write prefs\n files is via the API from your app. The fact that the current\n implementation looks like human-readable text is purely coincidental and\n may change at any time. Preferences files are not meant to be created\n or edited \"by hand.\"\n\n FLTK preferences are not meant to replace a fully featured database. No merging\n of data takes place. If several instances of an app access the same database at\n the same time, only the most recent changes will persist.\n\n Preferences should not be used to store document data. The .prefs file should\n be kept small for performance reasons. One application can have multiple\n preferences files. Extensive binary data however should be stored in separate\n files: see \\a Fl_Preferences::get_userdata_path() .\n\n Fl_Preferences are not thread-safe. They can temporarily change the locale\n on some platforms during read and write access, which also changes it\n temporarily in other threads of the same app.\n\n Typically a preferences database is read at startup, and then reopened and\n written at app shutdown:\n ```\n int appWindowWidth, appWindowHeight;\n\n void launch() {\n   Fl_Preferences app(Fl_Preferences::USER_L, \"matthiasm.com\", \"hello\");\n   // 'app' constructor will be called, reading data from .prefs file\n   Fl_Preferences window(app, \"window\");\n   window.get(\"width\", appWindowWidth, 800);\n   window.get(\"height\", appWindowHeight, 600);\n   // 'app' destructor will be called. This will write data to the\n   // .prefs file if any preferences were changed or added\n }\n\n void quit() {\n   Fl_Preferences app(Fl_Preferences::USER_L, \"matthiasm.com\", \"hello\");\n   Fl_Preferences window(app, \"window\");\n   window.set(\"width\", appWindowWidth);\n   window.set(\"height\", appWindowHeight);\n }\n ```\n\n \\see Fl_Preferences::Fl_Preferences(Root root, const char *vendor, const char *application)\n\n \\see As a special case, Fl_Preferences can be memory mapped and not be associated\n with a file on disk. See\n Fl_Preferences::Fl_Preferences(Fl_Preferences *parent, const char *group)\n and Fl_Preferences::MEMORY for more details on memory mapped preferences.\n\n   \\note Starting with FLTK 1.3, preferences databases are expected to\n     be in UTF-8 encoding. Previous databases were stored in the\n     current character set or code page which renders them incompatible\n     for text entries using international characters.\n\n   \\note Starting with FLTK 1.4, searching a valid path to store\n     the preference files has changed slightly. Please see\n     Fl_Preferences::Fl_Preferences(Root, const char*, const char*)\n     for details.\n\n   \\note Starting with FLTK 1.4, preference files should be created with\n     `SYSTEM_L` or `USER_L` to be interchangeable between computers with\n     differing locale settings. The legacy modes, `LOCAL` and `SYSTEM`, will\n     read and write floating point values using the decimal point of the\n     current locale. As a result, a fp-value would be written '3,1415' on a\n     German machine, and would be read back as '3.0' on a US machine because\n     the comma would not be recognized as an alternative decimal point.\n */\nclass FL_EXPORT Fl_Preferences {\n\npublic:\n  /**\n     Define the scope of the preferences.\n   */\n  enum Root {\n    UNKNOWN_ROOT_TYPE = -1,            ///< Returned if storage could not be determined.\n    SYSTEM            =  0,            ///< Preferences are used system-wide. Deprecated, see SYSTEM_L\n    USER,                              ///< Preferences apply only to the current user. Deprecated, see USER_L\n    MEMORY,                            ///< Returned if querying memory mapped preferences\n    ROOT_MASK     = 0x00FF,            ///< Mask for the values above\n    CORE          = 0x0100,            ///< OR'd by FLTK to read and write core library preferences and options\n    C_LOCALE      = 0x1000,            ///< This flag should always be set to ensure that floating point values\n                                       ///< are written and read correctly independently of the current locale\n    CLEAR         = 0x2000,            ///< Don't read a possibly existing database. Instead, start with an empty set of preferences.\n    SYSTEM_L      = SYSTEM | C_LOCALE, ///< Preferences are used system-wide, locale independent\n    USER_L        = USER | C_LOCALE,   ///< Preferences apply only to the current user, locale independent\n    CORE_SYSTEM_L = CORE | SYSTEM_L,   ///< Same as CORE | SYSTEM | C_LOCALE\n    CORE_USER_L   = CORE | USER_L,     ///< Same as CORE | USER | C_LOCALE\n    CORE_SYSTEM   = CORE | SYSTEM,     ///< Deprecated, same as CORE | SYSTEM. Use CORE_SYSTEM_L instead.\n    CORE_USER     = CORE | USER        ///< Deprecated, same as CORE | USER. Use CORE_USER_L instead.\n  };\n\n  /**\n   Every Fl_Preferences-Group has a unique ID.\n\n   ID's can be retrieved from an Fl_Preferences-Group and can then be used\n   to create more Fl_Preference references to the same data set, as long as the\n   database remains open.\n   */\n  typedef void *ID;\n\n  static const char *new_UUID();\n\n  /** Set this if no call to Fl_Preferences shall access the file system.\n   @see Fl_Preferences::file_access(unsigned int)\n   @see Fl_Preferences::file_access()\n   */\n  static const unsigned int NONE = 0x0000;\n  /** Set this if it is OK for applications to read user preference files. */\n  static const unsigned int USER_READ_OK = 0x0001;\n  /** Set this if it is OK for applications to create and write user preference files. */\n  static const unsigned int USER_WRITE_OK = 0x0002;\n  /** Set this if it is OK for applications to read, create, and write user preference files. */\n  static const unsigned int USER_OK = USER_READ_OK | USER_WRITE_OK;\n  /** Set this if it is OK for applications to read system wide preference files. */\n  static const unsigned int SYSTEM_READ_OK = 0x0004;\n  /** Set this if it is OK for applications to create and write system wide preference files. */\n  static const unsigned int SYSTEM_WRITE_OK = 0x0008;\n  /** Set this if it is OK for applications to read, create, and write system wide preference files. */\n  static const unsigned int SYSTEM_OK = SYSTEM_READ_OK | SYSTEM_WRITE_OK;\n  /** Set this if it is OK for applications to read, create, and write any kind of preference files. */\n  static const unsigned int APP_OK = SYSTEM_OK | USER_OK;\n  /** Set this if it is OK for FLTK to read preference files. USER_READ_OK and/or SYSTEM_READ_OK must also be set. */\n  static const unsigned int CORE_READ_OK = 0x0010;\n  /** Set this if it is OK for FLTK to create or write preference files. USER_WRITE_OK and/or SYSTEM_WRITE_OK must also be set. */\n  static const unsigned int CORE_WRITE_OK = 0x0020;\n  /** Set this if it is OK for FLTK to read, create, or write preference files. */\n  static const unsigned int CORE_OK = CORE_READ_OK | CORE_WRITE_OK;\n  /** Set this to allow FLTK and applications to read preference files. */\n  static const unsigned int ALL_READ_OK = USER_READ_OK | SYSTEM_READ_OK | CORE_READ_OK;\n  /** Set this to allow FLTK and applications to create and write preference files. */\n  static const unsigned int ALL_WRITE_OK = USER_WRITE_OK | SYSTEM_WRITE_OK | CORE_WRITE_OK;\n  /** Set this to give FLTK and applications permission to read, write, and create preference files. */\n  static const unsigned int ALL = ALL_READ_OK | ALL_WRITE_OK;\n\n  static void file_access(unsigned int flags);\n  static unsigned int file_access();\n  static Root filename( char *buffer, size_t buffer_size, Root root, const char *vendor, const char *application );\n\n  Fl_Preferences( Root root, const char *vendor, const char *application );\n  Fl_Preferences( const char *path, const char *vendor, const char *application, Root flags );\n  Fl_Preferences( Fl_Preferences &parent, const char *group );\n  Fl_Preferences( Fl_Preferences *parent, const char *group );\n  Fl_Preferences( Fl_Preferences &parent, int groupIndex );\n  Fl_Preferences( Fl_Preferences *parent, int groupIndex );\n  Fl_Preferences(const Fl_Preferences&);\n  Fl_Preferences( ID id );\n  virtual ~Fl_Preferences();\n\n  FL_DEPRECATED(\"since 1.4.0 - use Fl_Preferences(path, vendor, application, flags) instead\",\n                Fl_Preferences( const char *path, const char *vendor, const char *application ) );\n\n  Root filename( char *buffer, size_t buffer_size);\n\n  /** Return an ID that can later be reused to open more references to this dataset.\n   */\n  ID id() { return (ID)node; }\n\n  /** Remove the group with this ID from a database.\n   */\n  static char remove(ID id_) { return ((Node*)id_)->remove(); }\n\n  /** Return the name of this entry.\n   */\n  const char *name() { return node->name(); }\n\n  /** Return the full path to this entry.\n   */\n  const char *path() { return node->path(); }\n\n  int groups();\n  const char *group( int num_group );\n  char group_exists( const char *key );\n  char delete_group( const char *group );\n  char delete_all_groups();\n\n  int entries();\n  const char *entry( int index );\n  char entry_exists( const char *key );\n  char delete_entry( const char *entry );\n  char delete_all_entries();\n\n  char clear();\n\n  char set( const char *entry, int value );\n  char set( const char *entry, float value );\n  char set( const char *entry, float value, int precision );\n  char set( const char *entry, double value );\n  char set( const char *entry, double value, int precision );\n  char set( const char *entry, const char *value );\n  char set( const char *entry, const void *value, int size );\n\n  char get( const char *entry, int &value, int defaultValue );\n  char get( const char *entry, float &value,  float defaultValue );\n  char get( const char *entry, double &value, double defaultValue );\n  char get( const char *entry, char *&value,  const char *defaultValue );\n  char get( const char *entry, char *value,   const char *defaultValue, int maxSize );\n  char get( const char *entry, void *&value,  const void *defaultValue, int defaultSize );\n  char get( const char *entry, void *value,   const void *defaultValue, int defaultSize, int maxSize );\n  char get( const char *entry, void *value,   const void *defaultValue, int defaultSize, int *size );\n\n//  char set( const char *entry, const Fl_String &value );\n//  char get( const char *entry, Fl_String &value, const Fl_String &defaultValue );\n\n#if (FLTK_USE_STD)\n  char set( const char *entry, const std::string &value );\n  char get( const char *entry, std::string &value, const std::string &defaultValue );\n#endif\n\n  int size( const char *entry );\n\n  char get_userdata_path( char *path, int pathlen );\n\n  int flush();\n\n  int dirty();\n\n  /** \\cond PRIVATE */\n  static const char *newUUID() { return new_UUID(); }\n  char groupExists( const char *key ) { return group_exists(key); }\n  char deleteGroup( const char *group ) { return delete_group(group); }\n  char deleteAllGroups() { return delete_all_groups(); }\n  char entryExists( const char *key ) { return entry_exists(key); }\n  char deleteEntry( const char *entry ) { return delete_entry(entry); }\n  char deleteAllEntries() { return delete_all_entries(); }\n  char getUserdataPath( char *path, int pathlen ) { return get_userdata_path(path, pathlen); }\n  /** \\endcond */\n\n  /**\n     'Name' provides a simple method to create numerical or more complex\n     procedural names for entries and groups on the fly.\n\n     Example: prefs.set(Fl_Preferences::Name(\"File%d\",i),file[i]);.\n\n     See test/preferences.cxx as a sample for writing arrays into preferences.\n\n     'Name' is actually implemented as a class inside Fl_Preferences. It casts\n     into const char* and gets automatically destroyed after the enclosing call\n     ends.\n   */\n  class FL_EXPORT Name {\n\n    char *data_;\n\n  public:\n    Name( unsigned int n );\n    Name( const char *format, ... );\n\n    /**\n       Return the Name as a \"C\" string.\n       \\internal\n     */\n    operator const char *() { return data_; }\n    ~Name();\n  };\n\n  /** \\internal An entry associates a preference name to its corresponding value */\n  struct Entry {\n    char *name, *value;\n  };\n\nprivate:\n  Fl_Preferences() : node(0), rootNode(0) { }\n  Fl_Preferences &operator=(const Fl_Preferences&);\n\n  static char nameBuffer[128];\n  static char uuidBuffer[40];\n  static Fl_Preferences *runtimePrefs;\n  static unsigned int fileAccess_;\n\npublic:  // older Sun compilers need this (public definition of the following classes)\n  class RootNode;\n\n  class FL_EXPORT Node {        // a node contains a list to all its entries\n                                // and all means to manage the tree structure\n    Node *first_child_, *next_;\n    union {                     // these two are mutually exclusive\n      Node *parent_;            // top_ bit clear\n      RootNode *root_node_;     // top_ bit set\n    };\n    char *path_;\n    Entry *entry_;\n    int nEntry_, NEntry_;\n    unsigned char dirty_:1;\n    unsigned char top_:1;\n    unsigned char indexed_:1;\n    // indexing routines\n    Node **index_;\n    int nIndex_, NIndex_;\n    void createIndex();\n    void updateIndex();\n    void deleteIndex();\n  public:\n    static int lastEntrySet;\n  public:\n    Node( const char *path );\n    ~Node();\n    // node methods\n    int write( FILE *f );\n    const char *name();\n    const char *path() { return path_; }\n    Node *find( const char *path );\n    Node *search( const char *path, int offset=0 );\n    Node *childNode( int ix );\n    Node *addChild( const char *path );\n    void setParent( Node *parent );\n    Node *parent() { return top_?0L:parent_; }\n    void setRoot(RootNode *r) { root_node_ = r; top_ = 1; }\n    RootNode *findRoot();\n    char remove();\n    char dirty();\n    void clearDirtyFlags();\n    void deleteAllChildren();\n    // entry methods\n    int nChildren();\n    const char *child( int ix );\n    void set( const char *name, const char *value );\n    void set( const char *line );\n    void add( const char *line );\n    const char *get( const char *name );\n    int getEntry( const char *name );\n    char deleteEntry( const char *name );\n    void deleteAllEntries();\n    int nEntry() { return nEntry_; }\n    Entry &entry(int i) { return entry_[i]; }\n  };\n  friend class Node;\n\n  class FL_EXPORT RootNode {    // the root node manages file paths and basic reading and writing\n    Fl_Preferences *prefs_;\n    char *filename_;\n    char *vendor_, *application_;\n    Root root_type_;\n  public:\n    RootNode( Fl_Preferences *, Root root, const char *vendor, const char *application );\n    RootNode( Fl_Preferences *, const char *path, const char *vendor, const char *application, Root flags );\n    RootNode( Fl_Preferences * );\n    ~RootNode();\n    int read();\n    int write();\n    char getPath( char *path, int pathlen );\n    char *filename() { return filename_; }\n    Root root() { return root_type_; }\n  };\n  friend class RootNode;\n\nprotected:\n  Node *node;\n  RootNode *rootNode;\n};\n\n#endif // !Fl_Preferences_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Printer.H",
    "content": "//\n// Printing support for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2010-2016 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file Fl_Printer.H\n \\brief declaration of class Fl_Printer.\n */\n\n#ifndef Fl_Printer_H\n#define Fl_Printer_H\n\n#include <FL/Fl_Paged_Device.H>\n\n/**\n \\brief OS-independent print support.\n Fl_Printer allows to use all drawing, color, text, image, and clip FLTK functions, and to have them operate\n on printed page(s). There are two main, non exclusive, ways to use it.\n <ul><li>Print any widget (standard, custom, Fl_Window, Fl_Gl_Window) as it appears\n on screen, with optional translation, scaling and rotation. This is done by calling print_widget(),\n print_window() or print_window_part().\n <li>Use a series of FLTK graphics commands (e.g., font, text, lines, colors, clip, image) to\n compose a page appropriately shaped for printing.\n </ul>\n In both cases, begin by begin_job(), begin_page(), printable_rect() and origin() calls\n and finish by end_page() and end_job() calls.\n <p>Example of use: print a widget centered in a page\n \\code\n #include <FL/Fl_Printer.H>\n #include <FL/fl_draw.H>\n int width, height;\n Fl_Widget *widget = ...  // a widget we want printed\n Fl_Printer *printer = new Fl_Printer();\n if (printer->begin_job(1) == 0) {\n  printer->begin_page();\n  printer->printable_rect(&width, &height);\n  fl_color(FL_BLACK);\n  fl_line_style(FL_SOLID, 2);\n  fl_rect(0, 0, width, height);\n  fl_font(FL_COURIER, 12);\n  time_t now; time(&now); fl_draw(ctime(&now), 0, fl_height());\n  printer->origin(width/2, height/2);\n  printer->print_widget(widget, -widget->w()/2, -widget->h()/2);\n  printer->end_page();\n  printer->end_job();\n }\n delete printer;\n \\endcode\n <p>Recommended method to refresh GUI while printing :\n \\code\n printer->begin_job(0);\n ……\n Fl_Surface_Device::push_current(Fl_Display_Device::display_device());\n Fl::check(); // or any operation that draws to display\n Fl_Surface_Device::pop_current();\n ……\n printer->end_job();\n \\endcode\n <b>Platform specifics</b>\n <ul>\n <li>X11 and Wayland platforms:\n <ul><li>FLTK expresses all graphics data using (Level 2) PostScript and sends that to the selected printer.\n See class Fl_PostScript_File_Device for a description of how text and transparent images appear in print.\n <li>If the GTK library is available at run-time, class Fl_Printer runs GTK's printer dialog which allows to set\n printer, paper size and orientation.\n <li>If the GTK library is not available, or if Fl::option(Fl::OPTION_PRINTER_USES_GTK) has been turned off,\n class Fl_Printer runs FLTK's print dialog.\n <ul>\n <li>Unless it has been previously changed, the default paper size is A4.\n To change that, press the \"Properties\" button of the \"Print\" dialog window\n opened by an Fl_Printer::begin_job() call. This opens a \"Printer Properties\" window where it's\n possible to select the adequate paper size. Finally press the \"Save\" button therein to assign\n the chosen paper size to the chosen printer for this and all further print operations.\n <li>Use the static public attributes of this class to set the print dialog to other languages\n than English. For example, the \"Printer:\" dialog item Fl_Printer::dialog_printer can be set to French with:\n \\code\n Fl_Printer::dialog_printer = \"Imprimante:\";\n \\endcode\n before creation of the Fl_Printer object.\n <li>Use Fl_PostScript_File_Device::file_chooser_title to customize the title of the file chooser dialog that opens\n when using the \"Print To File\" option of the print dialog.\n </ul>\n </ul>\n <li>Windows platform: Transparent Fl_RGB_Image 's don't print with exact transparency on most printers\n (a workaround is to use print_window_part() ).\n Fl_RGB_Image 's don't rotate() well.\n <li>Mac OS X platform: all graphics requests print as on display and accept rotation and scaling.\n </ul>\n */\nclass FL_EXPORT Fl_Printer : public Fl_Paged_Device {\nprivate:\n  Fl_Paged_Device *printer;\n  /** Each platform implements this function its own way */\n  static Fl_Paged_Device* newPrinterDriver(void);\npublic:\n  /** The constructor */\n  Fl_Printer(void);\n  int begin_job(int pagecount = 0, int *frompage = NULL, int *topage = NULL, char **perr_message = NULL) FL_OVERRIDE;\n  int begin_page(void) FL_OVERRIDE;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  void margins(int *left, int *top, int *right, int *bottom) FL_OVERRIDE;\n  void origin(int *x, int *y) FL_OVERRIDE;\n  void origin(int x, int y) FL_OVERRIDE;\n  void scale(float scale_x, float scale_y = 0.) FL_OVERRIDE;\n  void rotate(float angle) FL_OVERRIDE;\n  void translate(int x, int y) FL_OVERRIDE;\n  void untranslate(void) FL_OVERRIDE;\n  int end_page (void) FL_OVERRIDE;\n  void end_job (void) FL_OVERRIDE;\n  void set_current(void) FL_OVERRIDE;\n  bool is_current() FL_OVERRIDE;\n\n  /** \\name These attributes are useful for the Linux/Unix platform only.\n   \\{\n   */\n  static const char *dialog_title;\n  static const char *dialog_printer;\n  static const char *dialog_range;\n  static const char *dialog_copies;\n  static const char *dialog_all;\n  static const char *dialog_pages;\n  static const char *dialog_from;\n  static const char *dialog_to;\n  static const char *dialog_properties;\n  static const char *dialog_copyNo;\n  static const char *dialog_print_button;\n  static const char *dialog_cancel_button;\n  static const char *dialog_print_to_file;\n  static const char *property_title;\n  static const char *property_pagesize;\n  static const char *property_mode;\n  static const char *property_use;\n  static const char *property_save;\n  static const char *property_cancel;\n  /** \\} */\n  /** The destructor */\n  ~Fl_Printer(void);\n};\n\n#endif // Fl_Printer_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Progress.H",
    "content": "//\n// Progress bar widget definitions.\n//\n// Copyright 2000-2010 by Michael Sweet.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Progress widget . */\n\n#ifndef _Fl_Progress_H_\n#  define _Fl_Progress_H_\n\n//\n// Include necessary headers.\n//\n\n#include \"Fl_Widget.H\"\n\n\n//\n// Progress class...\n//\n/**\n    Displays a progress bar for the user.\n*/\nclass FL_EXPORT Fl_Progress : public Fl_Widget {\n\n  float value_,\n        minimum_,\n        maximum_;\n\n  protected:\n\n  void draw() FL_OVERRIDE;\n\n  public:\n\n  Fl_Progress(int x, int y, int w, int h, const char *l = 0);\n\n  /** Sets the maximum value in the progress widget.  */\n  void  maximum(float v) { maximum_ = v; redraw(); }\n  /** Gets the maximum value in the progress widget.  */\n  float maximum() const { return (maximum_); }\n\n  /** Sets the minimum value in the progress widget.  */\n  void  minimum(float v) { minimum_ = v; redraw(); }\n  /** Gets the minimum value in the progress widget.  */\n  float minimum() const { return (minimum_); }\n\n  /** Sets the current value in the progress widget.  */\n  void  value(float v) { value_ = v; redraw(); }\n  /** Gets the current value in the progress widget.  */\n  float value() const { return (value_); }\n};\n\n#endif // !_Fl_Progress_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_RGB_Image.H",
    "content": "//\n// RGB Image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_RGB_Image_H\n# define Fl_RGB_Image_H\n# include \"Fl_Image.H\"\n#endif // !Fl_RGB_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Radio_Button.H",
    "content": "//\n// Radio button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2014 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Radio_Button widget . */\n\n#ifndef Fl_Radio_Button_H\n#define Fl_Radio_Button_H\n\n#include \"Fl_Button.H\"\n\nclass FL_EXPORT Fl_Radio_Button : public Fl_Button {\npublic:\n  Fl_Radio_Button(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Radio_Light_Button.H",
    "content": "//\n// Radio light button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2014 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Radio_Light_Button widget . */\n\n#ifndef Fl_Radio_Light_Button_H\n#define Fl_Radio_Light_Button_H\n\n#include \"Fl_Light_Button.H\"\n\nclass FL_EXPORT Fl_Radio_Light_Button : public Fl_Light_Button {\npublic:\n  Fl_Radio_Light_Button(int X,int Y,int W,int H,const char *l=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Radio_Round_Button.H",
    "content": "//\n// Radio round button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2014 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Radio_Round_Button widget . */\n\n#ifndef Fl_Radio_Round_Button_H\n#define Fl_Radio_Round_Button_H\n\n#include \"Fl_Round_Button.H\"\n\nclass FL_EXPORT Fl_Radio_Round_Button : public Fl_Round_Button {\npublic:\n  Fl_Radio_Round_Button(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Rect.H",
    "content": "//\n// Fl_Rect header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Rect_H\n#define Fl_Rect_H\n\n#include <FL/Fl_Widget.H>       // for c'tor based on Fl_Widget\n\n/**\n  Rectangle with standard FLTK coordinates (X, Y, W, H).\n\n  This may be used internally, for overloaded widget constructors and other\n  overloaded methods like fl_measure(), fl_text_extents(), fl_rect(),\n  fl_rectf(), and maybe more.\n*/\n\nclass FL_EXPORT Fl_Rect {\n\n  int x_;\n  int y_;\n  int w_;\n  int h_;\n\npublic:\n\n  /** The default constructor creates an empty rectangle (x = y = w = h = 0). */\n  Fl_Rect()\n          : x_(0), y_(0), w_(0), h_(0) {}\n\n  /** This constructor creates a rectangle with x = y = 0 and\n    the given width and height. */\n  Fl_Rect(int W, int H)\n          : x_(0), y_(0), w_(W), h_(H) {}\n\n  /** This constructor creates a rectangle with the given x,y coordinates\n    and the given width and height. */\n  Fl_Rect(int X, int Y, int W, int H)\n          : x_(X), y_(Y), w_(W), h_(H) {}\n\n  /** This constructor creates a rectangle with the given x,y coordinates\n    and the given width and height reduced by the box frame size.\n\n    This is the same as using the constructor w/o \\p bt and subsequently\n    calling inset(\\p bt).\n  */\n  Fl_Rect(int X, int Y, int W, int H, Fl_Boxtype bt)\n          : x_(X), y_(Y), w_(W), h_(H) {\n    inset(bt);\n  }\n\n  /** This constructor creates a rectangle based on a widget's position and size. */\n  Fl_Rect (const Fl_Widget& widget)\n          : x_(widget.x()), y_(widget.y()), w_(widget.w()), h_(widget.h()) {}\n\n  /** This constructor creates a rectangle based on a widget's position and size. */\n  Fl_Rect (const Fl_Widget* const widget)\n          : x_(widget->x()), y_(widget->y()), w_(widget->w()), h_(widget->h()) {}\n\n  int x() const { return x_; }          ///< gets the x coordinate (left edge)\n  int y() const { return y_; }          ///< gets the y coordinate (top edge)\n  int w() const { return w_; }          ///< gets the width\n  int h() const { return h_; }          ///< gets the height\n\n  /** gets the right edge (x + w).\n    \\note r() and b() are coordinates \\b outside the area of the rectangle.\n  */\n  int r() const { return x_ + w_; }\n  /** gets the bottom edge (y + h).\n    \\note r() and b() are coordinates \\b outside the area of the rectangle.\n  */\n  int b() const { return y_ + h_; }\n\n  void x(int X) { x_ = X; }             ///< sets the x coordinate (left edge)\n  void y(int Y) { y_ = Y; }             ///< sets the y coordinate (top edge)\n  void w(int W) { w_ = W; }             ///< sets the width\n  void h(int H) { h_ = H; }             ///< sets the height\n\n  void r(int R) { w_ = R - x_; }        ///< sets the width based on R and x\n  void b(int B) { h_ = B - y_; }        ///< sets the height based on B and y\n\n  /** Move all edges in by \\p d.\n\n    Shrinks the rectangle by \\p d at all sides keeping the center of the\n    rectangle at the same spot.\n\n    If \\p d is negative, the rectangle is enlarged.\n\n    If \\p d \\>= w() or h() the result is undefined, i.e. an\n    invalid or empty rectangle.\n  */\n  void inset(int d) {\n    x_ += d;\n    y_ += d;\n    w_ -= 2 * d;\n    h_ -= 2 * d;\n  }\n\n  /** Move all edges in by the frame size of box type \\p bt.\n\n    Shrinks the rectangle at all sides by the frame width or height of the\n    given box type \\p bt.\n\n    This method uses the frame sizes given by the box type \\p bt using\n    - Fl::box_dx(bt)\n    - Fl::box_dy(bt)\n    - Fl::box_dw(bt)\n    - Fl::box_dh(bt)\n\n    If the rectangle is smaller than the frame sizes the result is undefined,\n    i.e. an invalid or empty rectangle.\n  */\n  void inset(Fl_Boxtype bt) {\n    x_ += Fl::box_dx(bt);\n    y_ += Fl::box_dy(bt);\n    w_ -= Fl::box_dw(bt);\n    h_ -= Fl::box_dh(bt);\n  }\n\n  /** Move all edges in by \\p left, \\p top, \\p right, \\p bottom.\n\n    Shrinks the rectangle on all sides keeping the center of the\n    rectangle at the same spot.\n\n    If any value is negative, the rectangle is enlarged.\n\n    Values are not range checked; it is possible to create\n    an invalid or empty rectangle.\n  */\n  void inset(int left, int top, int right, int bottom) {\n    x_ += left;\n    y_ += top;\n    w_ -= (left + right);\n    h_ -= (top + bottom);\n  }\n\n  friend bool operator==(const Fl_Rect& lhs, const Fl_Rect& rhs) {\n    return (lhs.x_==rhs.x_) && (lhs.y_==rhs.y_) && (lhs.w_==rhs.w_) && (lhs.h_==rhs.h_);\n  }\n\n  friend bool operator!=(const Fl_Rect& lhs, const Fl_Rect& rhs) {\n    return !(lhs==rhs);\n  }\n\n}; // class Fl_Rect\n\n#endif // Fl_Rect_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Repeat_Button.H",
    "content": "//\n// Repeat button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Repeat_Button widget . */\n\n#ifndef Fl_Repeat_Button_H\n#define Fl_Repeat_Button_H\n#include \"Fl.H\"\n#include \"Fl_Button.H\"\n\n/**\n  The Fl_Repeat_Button is a subclass of Fl_Button that\n  generates a callback when it is pressed and then repeatedly generates\n  callbacks as long as it is held down.  The speed of the repeat is fixed\n  and depends on the implementation.\n*/\nclass FL_EXPORT Fl_Repeat_Button : public Fl_Button {\n  static void repeat_callback(void *);\npublic:\n  int handle(int) FL_OVERRIDE;\n  /**\n    Creates a new Fl_Repeat_Button widget using the given\n    position, size, and label string. The default boxtype is FL_UP_BOX.\n    Deletes the button.\n  */\n  Fl_Repeat_Button(int X,int Y,int W,int H,const char *l=0);\n\n  void deactivate() {\n    Fl::remove_timeout(repeat_callback,this);\n    Fl_Button::deactivate();\n  }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Return_Button.H",
    "content": "//\n// Return button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Return_Button widget . */\n\n#ifndef Fl_Return_Button_H\n#define Fl_Return_Button_H\n#include \"Fl_Button.H\"\n\n/**\n  The Fl_Return_Button is a subclass of Fl_Button that\n  generates a callback when it is pressed or when the user presses the\n  Enter key.  A carriage-return symbol is drawn next to the button label.\n  \\image html Fl_Return_Button.png\n  \\image latex Fl_Return_Button.png \"Fl_Return_Button\" width=4cm\n*/\nclass FL_EXPORT Fl_Return_Button : public Fl_Button {\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  int handle(int) FL_OVERRIDE;\n  /**\n    Creates a new Fl_Return_Button widget using the given\n    position, size, and label string. The default boxtype is FL_UP_BOX.\n    <P> The inherited destructor deletes the button.\n  */\n  Fl_Return_Button(int X, int Y, int W, int H,const char *l=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Roller.H",
    "content": "//\n// Roller header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Roller widget . */\n\n#ifndef Fl_Roller_H\n#define Fl_Roller_H\n\n#ifndef Fl_Valuator_H\n#include \"Fl_Valuator.H\"\n#endif\n\n/**\n  The Fl_Roller widget is a \"dolly\" control commonly used to\n  move 3D objects.\n\n  The roller can be controlled by clicking and dragging the mouse, by the\n  corresponding arrow keys when the roller has the keyboard focus, or by the\n  mouse wheels when the mouse pointer is positioned over the roller widget.\n\n  \\image html Fl_Roller.png\n  \\image latex Fl_Roller.png \"Fl_Roller\" width=4cm\n*/\nclass FL_EXPORT Fl_Roller : public Fl_Valuator {\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  int handle(int) FL_OVERRIDE;\n  Fl_Roller(int X,int Y,int W,int H,const char* L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Round_Button.H",
    "content": "//\n// Round button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Round_Button_H\n#define Fl_Round_Button_H\n\n#include \"Fl_Light_Button.H\"\n\n/**\n  Buttons generate callbacks when they are clicked by the user.  You\n  control exactly when and how by changing the values for type()\n  and when().\n  \\image html  Fl_Round_Button.png\n  \\image latex Fl_Round_Button.png \"Fl_Round_Button\" width=4cm\n  The Fl_Round_Button subclass displays the \"on\" state by\n  turning on a light, rather than drawing pushed in.  The shape of the\n  \"light\" is initially set to FL_ROUND_DOWN_BOX.  The color of the light\n  when on is controlled with selection_color(), which defaults to\n  FL_FOREGROUND_COLOR.\n*/\nclass FL_EXPORT Fl_Round_Button : public Fl_Light_Button {\npublic:\n  Fl_Round_Button(int x,int y,int w,int h,const char *l = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Round_Clock.H",
    "content": "//\n// Round clock header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Round_Clock widget . */\n\n#ifndef Fl_Round_Clock_H\n#define Fl_Round_Clock_H\n\n#include \"Fl_Clock.H\"\n\n/** A clock widget of type FL_ROUND_CLOCK. Has no box. */\nclass FL_EXPORT Fl_Round_Clock : public Fl_Clock {\npublic:\n  /** Creates the clock widget, setting his type and box. */\n  Fl_Round_Clock(int X,int Y,int W,int H, const char *L = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_SVG_File_Surface.H",
    "content": "//\n// Declaration of Fl_SVG_File_Surface in the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2020 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_SVG_File_Surface_H\n#define Fl_SVG_File_Surface_H\n\n#include <FL/Fl_Widget_Surface.H>\n#include <stdio.h>\n\n/** A drawing surface producing a Scalable Vector Graphics (SVG) file.\n This drawing surface allows to store any FLTK graphics in vectorial form in a \"Scalable Vector Graphics\" file.\n \\n Usage example:\n \\code\n   Fl_Window *win = ...// Window to draw to a .svg file\n   int ww = win->decorated_w();\n   int wh = win->decorated_h();\n   FILE *svg = fl_fopen(\"/path/to/mywindow.svg\", \"w\");\n   if (svg) {\n     Fl_SVG_File_Surface *surface = new Fl_SVG_File_Surface(ww, wh, svg);\n     Fl_Surface_Device::push_current(surface);\n     fl_color(FL_WHITE);\n     fl_rectf(0, 0, ww, wh);\n     surface->draw_decorated_window(win);\n     Fl_Surface_Device::pop_current();\n     delete surface; // the .svg file is not complete until the destructor was run\n     fclose(svg);\n   }\n \\endcode\n \\note FLTK uses the PNG and JPEG libraries to encode images to the SVG format.\n For this reason, class Fl_SVG_File_Surface is placed in the fltk_images library.\n If JPEG is not available at application build time, PNG is enough (but produces a quite larger output).\n If PNG isn't available either, images don't appear in the SVG output.\n*/\nclass FL_EXPORT Fl_SVG_File_Surface : public Fl_Widget_Surface {\n  int width_, height_;\n  int (*closef_)(FILE*);\npublic:\n  /**\n  Constructor of the SVG drawing surface.\n  \\param width,height Width and height of the graphics area in FLTK drawing units\n  \\param svg A writable FILE pointer where the SVG data are to be sent. The resulting SVG data are not complete until after destruction of the Fl_SVG_File_Surface object or after calling close().\n  \\param closef If not NULL,  the destructor and close() will call \\p closef(svg) after all\n    SVG data has been sent. If NULL, \\p fclose(svg) is called instead. This allows to close the FILE\n    pointer by, e.g., \\p pclose, or, using a function such as \\p \"int keep_open(FILE*){return 0;}\", to keep it open after\n    completion of all output to \\p svg. Function \\p closef should return non zero to indicate an error.\n   */\n  Fl_SVG_File_Surface(int width, int height, FILE *svg, int (*closef)(FILE*) = NULL);\n  /**\n   Destructor.\n   The underlying FILE pointer is processed as by close().\n   */\n  ~Fl_SVG_File_Surface();\n  /** Returns the underlying FILE pointer */\n  FILE *file();\n  void origin(int x, int y) FL_OVERRIDE;\n  void origin(int *x, int *y) FL_OVERRIDE;\n  void translate(int x, int y) FL_OVERRIDE;\n  void untranslate() FL_OVERRIDE;\n  int printable_rect(int *w, int *h) FL_OVERRIDE;\n  /** Closes the FILE pointer where SVG data is output.\n  The underlying FILE is closed by function fclose() unless another function was set at object's construction time.\n  The only operation possible after this on the Fl_SVG_File_Surface object is its destruction.\n  \\return The value returned by the closing function call. */\n  int close();\n};\n\n#endif /* Fl_SVG_File_Surface_H */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_SVG_Image.H",
    "content": "//\n// SVG Image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2017-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef FL_SVG_IMAGE_H\n#define FL_SVG_IMAGE_H\n\n#include <FL/Fl_Image.H>\n\nstruct NSVGimage;\n\n/** The Fl_SVG_Image class supports loading, caching and drawing of scalable vector graphics (SVG) images.\n The FLTK library performs parsing and rasterization of SVG data using a modified version\n of the \\c nanosvg software (https://github.com/memononen/nanosvg).\n The software modification allows the option to change the image ratio\n while performing rasterization.\n\n Use Fl_Image::fail() to check if the Fl_SVG_Image failed to load. fail() returns ERR_FILE_ACCESS\n if the file could not be opened or read, and ERR_FORMAT if the SVG format could not be decoded.\n If the image has loaded correctly, w(), h(), and d() should return values greater than zero.\n\n Rasterization is not done until the image is first drawn or resize() or normalize() is called. Therefore,\n \\ref array is NULL until then. The delayed rasterization ensures an Fl_SVG_Image is always rasterized\n to the exact screen resolution at which it is drawn.\n\n The Fl_SVG_Image class draws images computed by \\c nanosvg with the following known limitations\n\n  - text between \\c <text\\> and </text\\> marks,\n  - \\c image elements, and\n  - <use\\> statements\n\n are not rendered.\n\n The FLTK library can optionally be built without SVG support; in that case,\n class Fl_SVG_Image is unavailable.\n\n Example of displaying a hard-coded svg file:\n \\code\n  #include <FL/Fl.H>\n  #include <FL/Fl_Window.H>\n  #include <FL/Fl_Box.H>\n  #include <FL/Fl_SVG_Image.H>\n\n  // A black rotated rectangle\n  const char *svg_data = \"<svg viewBox=\\\"0 0 200 200\\\" version = \\\"1.1\\\">\\n\"\n                         \"<rect x=\\\"25\\\" y=\\\"50\\\" width=\\\"150\\\" height=\\\"100\\\" fill=\\\"black\\\" \"\n                         \"transform=\\\"rotate(45 100 100)\\\"> </svg>\\n\";\n\n  int main(int argc, char **argv) {\n    Fl_SVG_Image *svg = new Fl_SVG_Image(0, svg_data);       // create SVG object\n    Fl_Window    *win = new Fl_Window(720, 486, \"svg test\");\n    Fl_Box       *box = new Fl_Box(0, 0, win->w(), win->h());\n    box->image(svg);  // assign svg object to Fl_Box\n    win->end();\n    win->show(argc,argv);\n    return(Fl::run());\n  }\n \\endcode\n\n Example of displaying an svg image from a file:\n \\code\n  #include <errno.h>   // errno\n  #include <string.h>  // strerror\n  #include <FL/Fl.H>\n  #include <FL/Fl_Window.H>\n  #include <FL/Fl_Box.H>\n  #include <FL/Fl_SVG_Image.H>\n  #include <FL/fl_message.H>\n  int main(int argc, char **argv) {\n    Fl_Window *win = new Fl_Window(720, 486, \"svg test\");\n    Fl_Box    *box = new Fl_Box(0, 0, win->w(), win->h());\n\n    // Load svg image from disk, assign to a box\n    const char *svgpath = \"/var/tmp/simple.svg\";\n    Fl_SVG_Image *svg = new Fl_SVG_Image(svgpath);  // load SVG object from disk\n    switch (svg->fail()) {\n      case Fl_Image::ERR_FILE_ACCESS:\n        // File couldn't load? show path + os error to user\n        fl_alert(\"%s: %s\", svgpath, strerror(errno));\n        return 1;\n      case Fl_Image::ERR_FORMAT:\n        // Parsing error\n        fl_alert(\"%s: couldn't decode image\", svgpath);\n        return 1;\n    }\n    box->image(svg);  // assign svg object to box\n\n    win->end();\n    win->show(argc,argv);\n    return(Fl::run());\n  }\n \\endcode\n\n Example of fitting an svg image to a resizable Fl_Box:\n \\code\n  #include <FL/Fl_Window.H>\n  #include <FL/Fl_SVG_Image.H>\n  #include <FL/Fl_Box.H>\n\n  class resizable_box : public Fl_Box {\n  public:\n    resizable_box(int w, int h) : Fl_Box(0, 0, w, h, NULL) {}\n    virtual void resize(int x, int y, int w, int h) {\n      image()->scale(w, h, 1, 1); // p3 = proportional, p4 = can_expand\n      Fl_Box::resize(x, y, w, h);\n    }\n  };\n\n  int main(int argc, char **argv) {\n    Fl_Window *win = new Fl_Window(130, 130);\n    resizable_box *box = new resizable_box(win->w(), win->h());\n    Fl_SVG_Image *svg = new Fl_SVG_Image(\"/path/to/image.svg\");\n    box->image(svg);\n    svg->scale(box->w(), box->h());\n    win->end();\n    win->resizable(win);\n    win->show(argc, argv);\n    return Fl::run();\n  }\n \\endcode\n\n */\nclass FL_EXPORT Fl_SVG_Image : public Fl_RGB_Image {\nprivate:\n  typedef struct {\n    NSVGimage* svg_image;\n    int ref_count;\n  } counted_NSVGimage;\n  counted_NSVGimage* counted_svg_image_;\n  bool rasterized_;\n  int raster_w_, raster_h_;\n  bool to_desaturate_;\n  Fl_Color average_color_;\n  float average_weight_;\n  float svg_scaling_(int W, int H);\n  void rasterize_(int W, int H);\n  void cache_size_(int &width, int &height) FL_OVERRIDE;\n  void init_(const char *name, const unsigned char *filedata, size_t length);\n  Fl_SVG_Image(const Fl_SVG_Image *source);\npublic:\n  /** Set this to \\c false to allow image re-scaling that alters the image aspect ratio.\n   Upon object creation, proportional is set to \\c true, and the aspect ratio is kept constant.*/\n  bool proportional;\n  Fl_SVG_Image(const char *filename);\n  Fl_SVG_Image(const char *sharedname, const char *svg_data);\n  Fl_SVG_Image(const char *sharedname, const unsigned char *svg_data, size_t length);\n  virtual ~Fl_SVG_Image();\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const {\n    return Fl_Image::copy();\n  }\n  void resize(int width, int height);\n  void desaturate() FL_OVERRIDE;\n  void color_average(Fl_Color c, float i) FL_OVERRIDE;\n  void draw(int X, int Y, int W, int H, int cx = 0, int cy = 0) FL_OVERRIDE;\n  void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); }\n  Fl_SVG_Image *as_svg_image() FL_OVERRIDE { return this; }\n  void normalize() FL_OVERRIDE;\n};\n\n#endif // FL_SVG_IMAGE_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Scheme.H",
    "content": "//\n// Scheme header for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2022-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef FL_Fl_Scheme_H_\n#define FL_Fl_Scheme_H_\n\n#include <FL/Fl.H>\n\nclass Fl_Scheme {\n\nprivate:\n\n  static const char **names_;           // registered scheme names\n  static int num_schemes_;              // number of registered schemes\n  static int alloc_size_;               // number of allocated scheme name entries\n\nprotected:\n\n  // const char *name_;                 // the scheme's name\n\n  // protected constructor - not yet implemented\n  // Fl_Scheme(const char *name);\n\npublic:\n\n  // Static methods.\n\n  // Some of these methods will replace the scheme related methods of class Fl,\n  // for instance Fl::scheme() and Fl::is_scheme().\n  // Backwards compatibility must be kept though.\n\n  static const char **names();\n\n  /**\n    Return the number of currently registered schemes.\n\n    \\return  Number of registered schemes.\n  */\n  static int num_schemes() {\n    if (!names_) names(); // force initialization\n    return num_schemes_;\n  }\n\n  // Adding a scheme name must be a public static method in FLTK 1.4.0.\n  // This will later be protected or replaced by another method name.\n\n  static int add_scheme_name(const char *name);\n\n}; // class Fl_Scheme\n\n#endif // FL_Fl_Scheme_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Scheme_Choice.H",
    "content": "//\n// Scheme Choice header for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2022-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef FL_Fl_Scheme_Choice_H_\n#define FL_Fl_Scheme_Choice_H_\n\n#include <FL/Fl.H>\n#include <FL/Fl_Scheme.H>\n#include <FL/Fl_Choice.H>\n\nclass FL_EXPORT Fl_Scheme_Choice : public Fl_Choice {\n\nprotected:\n  static void scheme_cb_(Fl_Widget *w, void *);\n\npublic:\n  Fl_Scheme_Choice(int X, int Y, int W, int H, const char *L = 0);\n  int handle(int event) FL_OVERRIDE;\n\n  // set the current value according to the active scheme\n  virtual void init_value();\n\n}; // class Fl_Scheme_Choice\n\n#endif // FL_Fl_Scheme_Choice_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Scroll.H",
    "content": "//\n// Fl_Scroll header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Scroll widget . */\n\n#ifndef Fl_Scroll_H\n#define Fl_Scroll_H\n\n#include \"Fl_Group.H\"\n#include \"Fl_Scrollbar.H\"\n\n/**\n  This container widget lets you maneuver around a set of widgets much\n  larger than your window.  If the child widgets are larger than the size\n  of this object then scrollbars will appear so that you can scroll over\n  to them:\n  \\image html Fl_Scroll.png\n  \\image latex  Fl_Scroll.png \"Fl_Scroll\" width=4cm\n\n  If all of the child widgets are packed together into a solid\n  rectangle then you want to set box() to FL_NO_BOX or\n  one of the _FRAME types. This will result in the best output.\n  However, if the child widgets are a sparse arrangement you must\n  set box() to a real _BOX type. This can result in some\n  blinking during redrawing, but that can be solved by using a\n  Fl_Double_Window.\n\n  The Fl_Scroll widget calculates the bounding box of all its children\n  by using their widget positions and sizes (x, y, w, h). Outside labels\n  are not considered. If you need outside labels of any widgets or free\n  space outside of this bounding box you can add a tiny invisible Fl_Box\n  at the relevant corner(s) of the Fl_Scroll widget, for instance:\n  \\code\n    Fl_Scroll scroll(100, 100, 200, 200); // Fl_Scroll at (100, 100)\n    Fl_Box(100, 100, 1, 1);               // Fl_Box in top left corner\n    Fl_Input(150, 120, 60, 30, \"Input:\"); // left most widget with label\n    // ... more widgets ...\n    scroll.end();\n  \\endcode\n\n  By default you can scroll in both directions, and the scrollbars\n  disappear if the data will fit in the area of the scroll.\n\n  Use Fl_Scroll::type() to change this as follows :\n\n  - 0                            - No scrollbars\n  - Fl_Scroll::HORIZONTAL        - Only a horizontal scrollbar.\n  - Fl_Scroll::VERTICAL          - Only a vertical scrollbar.\n  - Fl_Scroll::BOTH              - The default is both scrollbars.\n  - Fl_Scroll::HORIZONTAL_ALWAYS - Horizontal scrollbar always on, vertical always off.\n  - Fl_Scroll::VERTICAL_ALWAYS   - Vertical scrollbar always on, horizontal always off.\n  - Fl_Scroll::BOTH_ALWAYS       - Both always on.\n\n  Use <B> scrollbar.align(int) ( see void Fl_Widget::align(Fl_Align) ) :</B>\n  to change what side the scrollbars are drawn on.\n\n  If the FL_ALIGN_LEFT bit is on, the vertical scrollbar is on the left.\n  If the FL_ALIGN_TOP bit is on, the horizontal scrollbar is on\n  the top. Note that only the alignment flags in scrollbar are\n  considered. The flags in hscrollbar however are ignored.\n\n  This widget can also be used to pan around a single child widget\n  \"canvas\".  This child widget should be of your own class, with a\n  draw() method that draws the contents.  The scrolling is done by\n  changing the x() and y() of the widget, so this child\n  must use the x() and y() to position its drawing.\n  To speed up drawing it should test fl_not_clipped(int x,int y,int w,int h)\n  to find out if a particular area of the widget must be drawn.\n\n  Another very useful child is a single Fl_Pack, which is itself a group\n  that packs its children together and changes size to surround them.\n  Filling the Fl_Pack with Fl_Tabs groups (and then putting\n  normal widgets inside those) gives you a very powerful scrolling list\n  of individually-openable panels.\n\n  Fluid lets you create these, but you can only lay out objects that\n  fit inside the Fl_Scroll without scrolling.  Be sure to leave\n  space for the scrollbars, as Fluid won't show these either.\n\n  <I>You cannot use Fl_Window as a child of this since the\n  clipping is not conveyed to it when drawn, and it will draw over the\n  scrollbars and neighboring objects.</I>\n*/\nclass FL_EXPORT Fl_Scroll : public Fl_Group {\n\n  int xposition_, yposition_;\n  int oldx, oldy;\n  int scrollbar_size_;\n  static void hscrollbar_cb(Fl_Widget*, void*);\n  static void scrollbar_cb(Fl_Widget*, void*);\n  static void draw_clip(void*,int,int,int,int);\n\nprotected:      //  (STR#1895)\n\n  /// A local struct to manage a region defined by xywh\n  typedef struct { int x,y,w,h; } Fl_Region_XYWH;\n\n  /// A local struct to manage a region defined by left/right/top/bottom\n  typedef struct {\n    int l;              ///< (l)eft \"x\" position, aka x1\n    int r;              ///< (r)ight \"x\" position, aka x2\n    int t;              ///< (t)op \"y\" position, aka y1\n    int b;              ///< (b)ottom \"y\" position, aka y2\n  } Fl_Region_LRTB;\n\n  /// A local struct to manage a scrollbar's xywh region and tab values\n  typedef struct {\n    int x,y,w,h;\n    int pos;            ///< scrollbar tab's \"position of first line displayed\"\n    int size;           ///< scrollbar tab's \"size of window in lines\"\n    int first;          ///< scrollbar tab's \"number of first line\"\n    int total;          ///< scrollbar tab's \"total number of lines\"\n  } Fl_Scrollbar_Data;\n\n  /**\n    Structure to manage scrollbar and widget interior sizes.\n    This is filled out by recalc_scrollbars() for use in calculations\n    that need to know the visible scroll area size, etc.\n    \\version 1.3.3\n  */\n  typedef struct {\n    int scrollsize;             ///< the effective scrollbar thickness (local or global)\n    Fl_Region_XYWH innerbox;    ///< widget's inner box, excluding scrollbars\n    Fl_Region_XYWH innerchild;  ///< widget's inner box, including scrollbars\n    Fl_Region_LRTB child;       ///< child bounding box: left/right/top/bottom\n    int hneeded;                ///< horizontal scrollbar visibility\n    int vneeded;                ///< vertical scrollbar visibility\n    Fl_Scrollbar_Data hscroll;  ///< horizontal scrollbar region + values\n    Fl_Scrollbar_Data vscroll;  ///< vertical scrollbar region + values\n  } ScrollInfo;\n  void recalc_scrollbars(ScrollInfo &si) const;\n\nprotected:\n\n  int on_insert(Fl_Widget*, int) FL_OVERRIDE;\n  int on_move(int, int) FL_OVERRIDE;\n  void fix_scrollbar_order();\n  void bbox(int&,int&,int&,int&) const;\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  Fl_Scrollbar scrollbar;\n  Fl_Scrollbar hscrollbar;\n\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n  int handle(int) FL_OVERRIDE;\n\n  Fl_Scroll(int X, int Y, int W, int H, const char *L = 0);\n  virtual ~Fl_Scroll();\n\n  enum { // values for type()\n    HORIZONTAL = 1,\n    VERTICAL = 2,\n    BOTH = 3,\n    ALWAYS_ON = 4,\n    HORIZONTAL_ALWAYS = 5,\n    VERTICAL_ALWAYS = 6,\n    BOTH_ALWAYS = 7\n  };\n\n  /**    Gets the current horizontal scrolling position.  */\n  int xposition() const {return xposition_;}\n  /**    Gets the current vertical scrolling position.  */\n  int yposition() const {return yposition_;}\n  void scroll_to(int, int);\n  void clear();\n\n  /* delete child n (by index) */\n  int delete_child(int n) FL_OVERRIDE;\n\n  /**\n    Gets the current size of the scrollbars' troughs, in pixels.\n\n    If this value is zero (default), this widget will use the\n    Fl::scrollbar_size() value as the scrollbar's width.\n\n    \\returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.\n    \\see Fl::scrollbar_size(int)\n  */\n  int scrollbar_size() const {\n      return(scrollbar_size_);\n  }\n  /**\n    Sets the pixel size of the scrollbars' troughs to \\p newSize, in pixels.\n\n    Normally you should not need this method, and should use\n    Fl::scrollbar_size(int) instead to manage the size of ALL\n    your widgets' scrollbars. This ensures your application\n    has a consistent UI, is the default behavior, and is normally\n    what you want.\n\n    Only use THIS method if you really need to override the global\n    scrollbar size. The need for this should be rare.\n\n    Setting \\p newSize to the special value of 0 causes the widget to\n    track the global Fl::scrollbar_size(), which is the default.\n\n    \\param[in] newSize Sets the scrollbar size in pixels.\\n\n                    If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()\n    \\see Fl::scrollbar_size()\n  */\n  void scrollbar_size(int newSize) {\n      if ( newSize != scrollbar_size_ ) redraw();\n      scrollbar_size_ = newSize;\n  }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Scrollbar.H",
    "content": "//\n// Scroll bar header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Scrollbar widget . */\n\n#ifndef Fl_Scrollbar_H\n#define Fl_Scrollbar_H\n\n#include \"Fl_Slider.H\"\n\n/**\n  The Fl_Scrollbar widget displays a slider with arrow buttons at\n  the ends of the scrollbar. Clicking on the arrows move up/left and\n  down/right by linesize(). Scrollbars also accept FL_SHORTCUT events:\n  the arrows move by linesize(), and vertical scrollbars take Page\n  Up/Down (they move by the page size minus linesize()) and Home/End\n  (they jump to the top or bottom).\n\n  Scrollbars have step(1) preset (they always return integers). If\n  desired you can set the step() to non-integer values. You will then\n  have to use casts to get at the floating-point versions of value()\n  from Fl_Slider.\n\n  \\image html  scrollbar.png\n  \\image latex scrollbar.png \"Fl_Scrollbar\" width=4cm\n*/\nclass FL_EXPORT Fl_Scrollbar : public Fl_Slider {\n\n  int linesize_;\n  int pushed_;\n  static void timeout_cb(void*);\n  void increment_cb();\nprotected:\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  Fl_Scrollbar(int X,int Y,int W,int H, const char *L = 0);\n  ~Fl_Scrollbar();\n  int handle(int) FL_OVERRIDE;\n\n  /**\n    Gets the integer value (position) of the slider in the scrollbar.\n    You can get the floating point value with Fl_Slider::value().\n\n    \\see Fl_Scrollbar::value(int p)\n    \\see Fl_Scrollbar::value(int pos, int size, int first, int total)\n  */\n  int value() const {return int(Fl_Slider::value());}\n\n  /**\n    Sets the value (position) of the slider in the scrollbar.\n\n    \\see Fl_Scrollbar::value()\n    \\see Fl_Scrollbar::value(int pos, int size, int first, int total)\n  */\n  int value(int p) {return int(Fl_Slider::value((double)p));}\n\n  /**\n    Sets the position, size and range of the slider in the scrollbar.\n    \\param[in] pos   position, first line displayed\n    \\param[in] windowSize  number of lines displayed\n    \\param[in] first_line number of first line\n    \\param[in] total_lines total number of lines\n\n    You should call this every time your window changes size, your data\n    changes size, or your scroll position changes (even if in response\n    to a callback from this scrollbar).\n    All necessary calls to redraw() are done.\n\n    Calls Fl_Slider::scrollvalue(int pos, int size, int first, int total).\n  */\n  int value(int pos, int windowSize, int first_line, int total_lines) {\n    return scrollvalue(pos, windowSize, first_line, total_lines);\n  }\n\n  /**\n    Get the size of step, in lines, that the arror keys move.\n  */\n  int linesize() const {return linesize_;}\n\n  /**\n    This number controls how big the steps are that the arrow keys do.\n    In addition page up/down move by the size last sent to value()\n    minus one linesize().  The default is 16.\n  */\n  void linesize(int i) {linesize_ = i;}\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Secret_Input.H",
    "content": "//\n// Secret input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2011 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Secret_Input widget . */\n\n#ifndef Fl_Secret_Input_H\n#define Fl_Secret_Input_H\n\n#include \"Fl_Input.H\"\n\n/**\n  The Fl_Secret_Input class is a subclass of Fl_Input that displays its\n  input as a string of placeholders. Depending on the platform this\n  placeholder is either the asterisk ('*') or the Unicode bullet\n  character (U+2022).\n\n  This subclass is usually used to receive passwords and other \"secret\" information.\n*/\nclass FL_EXPORT Fl_Secret_Input : public Fl_Input {\npublic:\n  /**\n    Creates a new Fl_Secret_Input widget using the given\n    position, size, and label string. The default boxtype is FL_DOWN_BOX.\n\n    Inherited destructor destroys the widget and any value associated with it.\n  */\n  Fl_Secret_Input(int X,int Y,int W,int H,const char *l = 0);\n  int handle(int) FL_OVERRIDE;\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Select_Browser.H",
    "content": "//\n// Select browser header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Select_Browser widget . */\n\n#ifndef Fl_Select_Browser_H\n#define Fl_Select_Browser_H\n\n#include \"Fl_Browser.H\"\n\n/**\n  The class is a subclass of Fl_Browser\n  which lets the user select a single item, or no items by clicking on\n  the empty space.  As long as the mouse button is held down on an\n  unselected item it is highlighted. Normally the callback is done when the\n  user presses the mouse, but you can change this with when().\n  <P>See Fl_Browser for  methods to add and remove lines from the browser.\n*/\nclass FL_EXPORT Fl_Select_Browser : public Fl_Browser {\npublic:\n  /**\n    Creates a new Fl_Select_Browser widget using the given\n    position, size, and label string. The default boxtype is FL_DOWN_BOX.\n    The constructor specializes Fl_Browser() by setting the type to FL_SELECT_BROWSER.\n    The destructor destroys the widget and frees all memory that has been allocated.\n  */\n  Fl_Select_Browser(int X,int Y,int W,int H,const char *L=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Shared_Image.H",
    "content": "//\n// Shared image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   Fl_Shared_Image class. */\n\n#ifndef Fl_Shared_Image_H\n#  define Fl_Shared_Image_H\n\n#  include \"Fl_Image.H\"\n\n#undef SHIM_DEBUG\n\n/** Test function (typedef) for adding new shared image formats.\n\n  This defines the function type you can use to add a handler for unknown\n  image formats that can be opened and loaded as an Fl_Shared_Image.\n\n  fl_register_images() adds all image formats known to FLTK.\n  Call Fl_Shared_Image::add_handler() to add your own check function to\n  the list of known image formats.\n\n  Your function will be passed the filename (\\p name), some \\p header\n  bytes already read from the image file and the size \\p headerlen of the\n  data read. The max value of size is implementation dependent. If your\n  handler function needs to check more bytes you must open the image file\n  yourself.\n\n  The provided buffer \\p header must not be overwritten.\n\n  If your handler function can identify the file type you must open the\n  file and return a valid Fl_Image or derived type, otherwise you must\n  return \\c NULL.\n  Example:\n  \\code\n    static Fl_Image *check_my_image(const char *name,\n                                    uchar *header,\n                                    int headerlen) {\n      // (test image type using header and headerlen)\n      if (known) {\n        // (load image data from file \\p name)\n        return new Fl_RGB_Image(data, ...);\n      } else\n        return 0;\n    }\n    // add your handler:\n    Fl_Shared_Image::add_handler(check_my_image);\n  \\endcode\n\n  \\param[in]    name        filename to be checked and opened if applicable\n  \\param[in]    header      portion of the file that has already been read\n  \\param[in]    headerlen   length of provided \\p header data\n\n  \\returns      valid Fl_Image or \\c NULL.\n\n  \\see Fl_Shared_Image::add_handler()\n*/\ntypedef Fl_Image *(*Fl_Shared_Handler)(const char *name,\n                                       uchar *header,\n                                       int headerlen);\n\n/**\n  This class supports caching, loading, and drawing of image files.\n\n  Most applications will also want to link against the fltk_images library\n  and call the fl_register_images() function to support standard image\n  formats such as BMP, GIF, JPEG, PNG, and SVG (unless the library was built\n  with the option removing SVG support).\n\n  Images can be requested (loaded) with Fl_Shared_Image::get(), find(),\n  and some other methods. All images are cached in an internal list of\n  shared images and should be released when they are no longer needed.\n  A refcount is used to determine if a released image is to be destroyed\n  with delete.\n\n  \\see fl_register_image()\n  \\see Fl_Shared_Image::get()\n  \\see Fl_Shared_Image::find()\n  \\see Fl_Shared_Image::release()\n*/\nclass FL_EXPORT Fl_Shared_Image : public Fl_Image {\n\n  friend class Fl_JPEG_Image;\n  friend class Fl_PNG_Image;\n  friend class Fl_SVG_Image;\n  friend class Fl_Graphics_Driver;\n\nprotected:\n\n  static Fl_Shared_Image **images_;     // Shared images\n  static int    num_images_;            // Number of shared images\n  static int    alloc_images_;          // Allocated shared images\n  static Fl_Shared_Handler *handlers_;  // Additional format handlers\n  static int    num_handlers_;          // Number of format handlers\n  static int    alloc_handlers_;        // Allocated format handlers\n\n  const char    *name_;                 // Name of image file\n  int           original_;              // Original image?\n  int           refcount_;              // Number of times this image has been used\n  Fl_Image      *image_;                // The image that is shared\n  int           alloc_image_;           // Was the image allocated?\n\n  static int    compare(Fl_Shared_Image **i0, Fl_Shared_Image **i1);\n\n  // Use get() and release() to load/delete images in memory...\n  Fl_Shared_Image();\n  Fl_Shared_Image(const char *n, Fl_Image *img = 0);\n  virtual ~Fl_Shared_Image();\n  void add();\n  void update();\n  Fl_Shared_Image *copy_(int W, int H) const;\n\npublic:\n#ifdef SHIM_DEBUG\n  static void print_pool();\n#endif\n\n  /** Returns the filename of the shared image */\n  const char    *name() { return name_; }\n\n  /** Returns the number of references of this shared image.\n    When reference is below 1, the image is deleted.\n  */\n  int           refcount() { return refcount_; }\n\n  /** Returns whether this is an original image.\n    Images loaded from a file or from memory are marked \\p original as\n    opposed to images created as a copy of another image with different\n    size (width or height).\n    \\note This is useful for debugging (rarely used in user code).\n    \\since FLTK 1.4.0\n  */\n  int original() { return original_; }\n\n  void  release() FL_OVERRIDE;\n  virtual void  reload();\n\n  Fl_Shared_Image *as_shared_image() FL_OVERRIDE {\n    return this;\n  }\n\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const;\n  Fl_Image *copy();\n\n  void color_average(Fl_Color c, float i) FL_OVERRIDE;\n  void desaturate() FL_OVERRIDE;\n  void draw(int X, int Y, int W, int H, int cx = 0, int cy = 0) FL_OVERRIDE;\n  void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); }\n  void uncache() FL_OVERRIDE;\n\n  static Fl_Shared_Image *find(const char *name, int W = 0, int H = 0);\n  static Fl_Shared_Image *get(const char *name, int W = 0, int H = 0);\n  static Fl_Shared_Image *get(Fl_RGB_Image *rgb, int own_it = 1);\n  static Fl_Shared_Image **images();\n  static int            num_images();\n  static void           add_handler(Fl_Shared_Handler f);\n  static void           remove_handler(Fl_Shared_Handler f);\n\n  /**\n    Returns a pointer to the internal Fl_Image object.\n\n    The output is a pointer to the \\p internal image ('Fl_Image' or subclass)\n    which can be used to inspect or copy the image.\n\n    <b>Do not try to modify the image!</b> You can copy the image though\n    if you want or need to change any attributes, size etc. If all you\n    need to do is to resize the image you should use\n    Fl_Shared_Image::copy(int, int) instead.\n\n    \\note The internal image (pointer) is protected for good reasons, e.g.\n      to prevent access to the image so it can't be modified by user code.\n      \\b DO \\b NOT cast away the 'const' attribute to modify the image.\n\n    User code should rarely need this method. Use with caution.\n\n    \\return  const Fl_Image* image, the internal Fl_Image\n\n    \\since 1.4.0\n  */\n  const Fl_Image *image() const { return image_; }\n\n}; // class Fl_Shared_Image\n\n//\n// The following function is provided in the fltk_images library and\n// registers all of the \"extra\" image file formats that are not part\n// of the core FLTK library...\n//\n\nFL_EXPORT extern void fl_register_images();\n\n#endif // !Fl_Shared_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Shortcut_Button.H",
    "content": "//\n// Shortcut Button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Shortcut_Button_H\n#define Fl_Shortcut_Button_H\n\n#include <FL/Fl_Button.H>\n\nclass FL_EXPORT Fl_Shortcut_Button : public Fl_Button {\nprivate:\n  bool hot_, pre_hot_, default_set_, handle_default_button_;\n  Fl_Shortcut pre_esc_;\n  Fl_Shortcut default_shortcut_;\nprotected:\n  Fl_Shortcut shortcut_value;\n  void do_end_hot_callback();\n  int handle(int) FL_OVERRIDE;\n  void draw() FL_OVERRIDE;\npublic:\n  Fl_Shortcut_Button(int X,int Y,int W,int H, const char* l = 0);\n  void value(Fl_Shortcut shortcut);\n  Fl_Shortcut value();\n#if 0\n  // Default shortcut settings are disabled until successful review of the UI\n  void default_value(Fl_Shortcut shortcut);\n  Fl_Shortcut default_value();\n  void default_clear();\n#endif\n};\n\n#endif // Fl_Shortcut_Button_H\n\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Simple_Counter.H",
    "content": "//\n// Simple counter header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Simple_Counter widget . */\n\n#ifndef Fl_Simple_Counter_H\n#define Fl_Simple_Counter_H\n\n#include \"Fl_Counter.H\"\n/**\n  This widget creates a counter with only 2 arrow buttons\n  \\image html counter.png\n  \\image latex  counter.png \"Fl_Simple_Counter\" width=4cm\n*/\nclass FL_EXPORT Fl_Simple_Counter : public Fl_Counter {\npublic:\n  Fl_Simple_Counter(int X,int Y,int W,int H, const char *L = 0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Single_Window.H",
    "content": "//\n// Single-buffered window header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Single_Window class . */\n\n#ifndef Fl_Single_Window_H\n#define Fl_Single_Window_H\n\n#include \"Fl_Window.H\"\n\n/**\n  This is the same as Fl_Window.  However, it is possible that\n  some implementations will provide double-buffered windows by default.\n  This subclass can be used to force single-buffering.  This may be\n  useful for modifying existing programs that use incremental update, or\n  for some types of image data, such as a movie flipbook.\n*/\nclass FL_EXPORT Fl_Single_Window : public Fl_Window {\npublic:\n  void show() FL_OVERRIDE;\n  /** Same as Fl_Window::show(int argc, char **argv) */\n  void show(int argc, char **argv) { Fl_Window::show(argc, argv);}\n\n   /**\n    Creates a new Fl_Single_Window widget using the given\n    size, and label (title) string.\n  */\n  Fl_Single_Window(int W, int H, const char *l=0);\n\n  /**\n    Creates a new Fl_Single_Window widget using the given\n    position, size, and label (title) string.\n  */\n  Fl_Single_Window(int X, int Y, int W, int H, const char *l=0);\n\n  /**\n    Same as Fl_Window::make_current()\n  */\n  void make_current() { Fl_Window::make_current(); }\n\n  /**\n    Same as Fl_Window::flush()\n  */\n  void flush() FL_OVERRIDE { Fl_Window::flush(); }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Slider.H",
    "content": "//\n// Slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Slider widget . */\n\n#ifndef Fl_Slider_H\n#define Fl_Slider_H\n\n#ifndef Fl_Valuator_H\n#include \"Fl_Valuator.H\"\n#endif\n\n// values for type(), lowest bit indicate horizontal:\n#define FL_VERT_SLIDER          0\n#define FL_HOR_SLIDER           1\n#define FL_VERT_FILL_SLIDER     2\n#define FL_HOR_FILL_SLIDER      3\n#define FL_VERT_NICE_SLIDER     4\n#define FL_HOR_NICE_SLIDER      5\n\n/**\n  The Fl_Slider widget contains a sliding knob inside a box. It is\n  often used as a scrollbar.  Moving the box all the way to the\n  top/left sets it to the minimum(), and to the bottom/right to the\n  maximum().  The minimum() may be greater than the maximum() to\n  reverse the slider direction.\n\n  Use void Fl_Widget::type(int) to set how the slider is drawn,\n  which can be one of the following:\n\n  \\li FL_VERTICAL - Draws a vertical slider (this is the default).\n  \\li FL_HORIZONTAL - Draws a horizontal slider.\n  \\li FL_VERT_FILL_SLIDER - Draws a filled vertical slider,\n      useful as a progress or value meter.\n  \\li FL_HOR_FILL_SLIDER - Draws a filled horizontal  slider,\n      useful as a progress or value meter.\n  \\li FL_VERT_NICE_SLIDER - Draws a vertical slider with  a nice\n      looking control knob.\n  \\li FL_HOR_NICE_SLIDER - Draws a horizontal slider with  a\n      nice looking control knob.\n\n  \\image html  slider.png\n  \\image latex slider.png \"Fl_Slider\" width=4cm\n*/\nclass FL_EXPORT Fl_Slider : public Fl_Valuator {\n\n  float slider_size_;\n  uchar slider_;\n  void _Fl_Slider();\n  void draw_bg(int, int, int, int);\n\nprotected:\n\n  // these allow subclasses to put the slider in a smaller area:\n  void draw(int, int, int, int);\n  int handle(int, int, int, int, int);\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  int handle(int) FL_OVERRIDE;\n  Fl_Slider(int X,int Y,int W,int H, const char *L = 0);\n  Fl_Slider(uchar t,int X,int Y,int W,int H, const char *L);\n\n  int scrollvalue(int pos,int size,int first,int total);\n  void bounds(double a, double b);\n\n  /**\n    Get the dimensions of the moving piece of slider.\n  */\n  float slider_size() const {return slider_size_;}\n\n  /**\n    Set the dimensions of the moving piece of slider. This is\n    the fraction of the size of the entire widget. If you set this\n    to 1 then the slider cannot move.  The default value is .08.\n\n    For the \"fill\" sliders this is the size of the area around the\n    end that causes a drag effect rather than causing the slider to\n    jump to the mouse.\n  */\n  void slider_size(double v);\n\n  /** Gets the slider box type. */\n  Fl_Boxtype slider() const {return (Fl_Boxtype)slider_;}\n\n  /** Sets the slider box type. */\n  void slider(Fl_Boxtype c) {slider_ = c;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Spinner.H",
    "content": "//\n// Spinner widget for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Spinner widget . */\n\n#ifndef Fl_Spinner_H\n#define Fl_Spinner_H\n\n#include <FL/Enumerations.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Input.H>\n#include <FL/Fl_Repeat_Button.H>\n\n/**\n  This widget is a combination of a numerical input widget and repeat buttons.\n\n  The user can either type into the input area or use the buttons to\n  change the value.\n\n  \\image html Fl_Spinner.png \"Fl_Spinner widget\"\n  \\image latex Fl_Spinner.png \"Fl_Spinner widget\" width=6cm\n*/\nclass FL_EXPORT Fl_Spinner : public Fl_Group {\n\n  double        value_;                 // Current value\n  double        minimum_;               // Minimum value\n  double        maximum_;               // Maximum value\n  double        step_;                  // Amount to add/subtract for up/down\n  const char    *format_;               // Format string for input field\n  int           wrap_;                  // wrap around at bounds (1/0)\n\nprivate:\n\n  static void sb_cb(Fl_Widget *w, Fl_Spinner *sb); // internal callback\n  void update();                                   // update input field\n\nprotected:\n\n  // This class works like Fl_Input but ignores FL_Up and FL_Down key\n  // presses so they are handled by its parent, the Fl_Spinner widget.\n  // See STR #2989.\n\n  class FL_EXPORT Fl_Spinner_Input : public Fl_Input {\n  public:\n    Fl_Spinner_Input(int X, int Y, int W, int H)\n    : Fl_Input(X, Y, W, H) {}\n    int handle(int event) FL_OVERRIDE; // implemented in src/Fl_Spinner.cxx\n  };\n\n  Fl_Spinner_Input input_;              // Input field for the value\n  Fl_Repeat_Button\n                up_button_,             // Up button\n                down_button_;           // Down button\n\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  // Constructor\n  Fl_Spinner(int X, int Y, int W, int H, const char *L = 0);\n  // Event handling\n  int handle(int event) FL_OVERRIDE;\n  // Resize group and subwidgets\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n\n  /** Returns the format string for the value. */\n  const char *format() const { return (format_); }\n\n  /** Sets the format string for the value. */\n  void format(const char *f) { format_ = f; update(); }\n\n  /** Gets the maximum value of the widget. */\n  double maximum() const { return (maximum_); }\n\n  /** Sets the maximum value of the widget. */\n  void maximum(double m) { maximum_ = m; }\n\n  /** Gets the minimum value of the widget. */\n  double minimum() const { return (minimum_); }\n\n  /** Sets the minimum value of the widget. */\n  void minimum(double m) { minimum_ = m; }\n\n  /** Sets the minimum and maximum values for the widget. */\n  void range(double a, double b) { minimum_ = a; maximum_ = b; }\n\n  // Sets the amount to change the value when the user clicks a button.\n  // Docs in src/Fl_Spinner.cxx\n  void step(double s);\n\n  /**\n    Gets the amount to change the value when the user clicks a button.\n    \\see Fl_Spinner::step(double)\n  */\n  double step() const { return (step_); }\n\n  /** Sets whether the spinner wraps around at upper and lower bounds.\n\n    If wrap mode is on the spinner value is set to the minimum() or\n    maximum() if the value exceeds the upper or lower bounds, resp., if\n    it was changed by one of the buttons or the FL_Up or FL_Down keys.\n\n    The spinner stops at the upper and lower bounds if wrap mode is off.\n\n    The default wrap mode is on for backwards compatibility with\n    FLTK 1.3.x and older versions.\n\n    \\note Wrap mode does not apply to the input field if the input value\n          is edited directly as a number. The input value is always\n          clipped to the allowed range as if wrap mode was off when the\n          input field is left (i.e. loses focus).\n\n    \\see minimum(), maximum()\n\n    \\param[in] set non-zero sets wrap mode, zero resets wrap mode\n\n    \\since 1.4.0\n  */\n  void wrap(int set) { wrap_ = set ? 1 : 0; }\n\n  /** Gets the wrap mode of the Fl_Spinner widget.\n    \\see void wrap(int)\n    \\since 1.4.0\n  */\n  int wrap() const { return wrap_; }\n\n  /** Gets the color of the text in the input field. */\n  Fl_Color textcolor() const { return (input_.textcolor()); }\n\n  /** Sets the color of the text in the input field. */\n  void textcolor(Fl_Color c) { input_.textcolor(c); }\n\n  /** Gets the font of the text in the input field. */\n  Fl_Font textfont() const { return (input_.textfont()); }\n\n  /** Sets the font of the text in the input field. */\n  void textfont(Fl_Font f) { input_.textfont(f); }\n\n  /** Gets the size of the text in the input field. */\n  Fl_Fontsize textsize() const { return (input_.textsize()); }\n\n  /** Sets the size of the text in the input field. */\n  void textsize(Fl_Fontsize s) { input_.textsize(s); }\n\n  // Sets the numeric representation in the input field.\n  // Docs see src/Fl_Spinner.cxx\n  void type(uchar v);\n\n  /** Gets the numeric representation in the input field.\n    \\see Fl_Spinner::type(uchar)\n  */\n  uchar type() const { return (input_.type()); }\n\n  /** Gets the current value of the widget. */\n  double value() const { return (value_); }\n\n  /**\n    Sets the current value of the input widget.\n    Before setting value to a non-integer value, the spinner\n    type() should be changed to floating point.\n  */\n  void value(double v) { value_ = v; update(); }\n\n  /**\n    Sets the background color of the spinner widget's input field.\n  */\n  void color(Fl_Color v) { input_.color(v); }\n\n  /**\n    Returns the background color of the spinner widget's input field.\n  */\n  Fl_Color color() const { return(input_.color()); }\n\n  /**\n    Sets the selection color of the spinner widget's input field.\n  */\n  void selection_color(Fl_Color val) { input_.selection_color(val); }\n\n  /**\n    Returns the selection color of the spinner widget's input field.\n  */\n  Fl_Color selection_color() const { return input_.selection_color(); }\n\n  /**\n   Sets the maximum width of the input field.\n   */\n  void maximum_size(int m) { if (m > 0) input_.maximum_size(m); }\n\n  /**\n   Returns the maximum width of the input field.\n   */\n  int maximum_size() const { return input_.maximum_size(); }\n};\n\n#endif // !Fl_Spinner_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Sys_Menu_Bar.H",
    "content": "//\n// MacOS system menu bar header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2017 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n Definition of class Fl_Sys_Menu_Bar.\n */\n\n\n#ifndef Fl_Sys_Menu_Bar_H\n#define Fl_Sys_Menu_Bar_H\n\n#include <FL/Fl_Menu_Bar.H>\n\nclass Fl_Sys_Menu_Bar_Driver;\n\n/**\n A class to create and modify menus that appear on macOS in the menu bar at the top of the screen.\n\n On other than macOS platforms, Fl_Sys_Menu_Bar is a synonym of class Fl_Menu_Bar.\n\n On the macOS  platform, replace Fl_Menu_Bar with Fl_Sys_Menu_Bar, and\n a system menu at the top of the screen will be available. This menu will match an array\n of Fl_Menu_Item's exactly as in all other FLTK menus (except for the submenu with the\n application's own name and the 'Window' menu; see below). There is, though, an important difference between\n an Fl_Sys_Menu_Bar object under macOS and under other platforms: only a single object\n from this class can be created, because macOS uses a single system menu bar. Therefore,\n porting to macOS an app that creates, on other platforms,  several Fl_Menu_Bar objects, one for each of several windows,\n is more complex that just replacing Fl_Menu_Bar by Fl_Sys_Menu_Bar.\n\n  On the macOS platform, the system menu bar of any FLTK app begins with the Application\n  menu which the FLTK library automatically constructs. Functions\n  Fl_Mac_App_Menu::custom_application_menu_items() and Fl_Sys_Menu_Bar::about() can be used to further customize\n  the Application menu. The FLTK library also automatically constructs and handles a Window menu which can be\n  further customized (or even removed) calling\n  Fl_Sys_Menu_Bar::window_menu_style(window_menu_style_enum style).\n  Other member functions of this class allow the app to generate the rest of the system menu bar.\n  It is recommended to localize the system menu bar using the standard Mac OS X localization procedure\n  (see \\ref osissues_localize).\n\n Changes to the menu state are immediately visible in the menubar when they are made\n using member functions of the Fl_Sys_Menu_Bar class. Other changes (e.g., by a call to\n Fl_Menu_Item::set()) should be followed by a call to update() to be\n visible in the menubar across all platforms. macOS global variable \\ref fl_sys_menu_bar points to\n the unique, current system menu bar.\n\n A few FLTK menu features are not supported by the Mac System menu:\n  \\li no symbolic labels\n  \\li no embossed labels\n  \\li no font sizes\n\n As described above, the submenu with the application's own name (usually\n the second submenu from the left, immediately following the \"Apple\" submenu)\n is a special case, and can be managed with\n Fl_Mac_App_Menu::custom_application_menu_items().\n For example, to make your own \"Appname -> Preferences\" dialog, you might use:\n\n \\code\n #include <FL/platform.H>        // for Fl_Mac_App_Menu class\n #include <FL/Fl_Sys_Menu_Bar.H> // for Fl_Menu_Item\n :\n void prefs_cb(Fl_Widget *w, void *data) {\n   // ..Open your preferences dialog here..\n }\n :\n int main(..) {\n    :\n    // Items to add to the application menu\n    static Fl_Menu_Item appitems[] = {\n       { \"Preferences\", 0, prefs_cb, 0, 0 },\n       { 0 }, { 0 }\n     };\n     Fl_Mac_App_Menu::custom_application_menu_items(appitems);  // adds it\n  }\n \\endcode\n\n ..the result being:\n\n \\image html mac-app-menu-preferences.png  \"Mac Application submenu\"\n \\image latex mac-app-menu-preferences.png \"Mac Application submenu\" width=4cm\n\n  */\nclass FL_EXPORT Fl_Sys_Menu_Bar : public Fl_Menu_Bar {\n  static Fl_Sys_Menu_Bar_Driver *driver();\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  /** Possible styles of the Window menu in the system menu bar */\n  typedef enum {\n    no_window_menu = 0,     ///< No Window menu in the system menu bar\n    tabbing_mode_none,      ///< No tabbed windows, but the system menu bar contains a Window menu\n    tabbing_mode_automatic, ///< Windows are created by themselves but can be tabbed later\n    tabbing_mode_preferred  ///< Windows are tabbed when created\n  } window_menu_style_enum;\n  Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l=0);\n  virtual ~Fl_Sys_Menu_Bar();\n  /** Return the system menu's array of Fl_Menu_Item's\n   */\n  const Fl_Menu_Item *menu() const {return Fl_Menu_::menu();}\n  void menu(const Fl_Menu_Item *m);\n  void update() FL_OVERRIDE;\n  void play_menu(const Fl_Menu_Item *) FL_OVERRIDE;\n  int add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0);\n  /** Adds a new menu item.\n   \\see Fl_Menu_::add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0)\n   */\n  int add(const char* label, const char* shortcut, Fl_Callback* cb, void *user_data=0, int flags=0) {\n    return add(label, fl_old_shortcut(shortcut), cb, user_data, flags);\n    }\n  int add(const char* str);\n  int insert(int index, const char* label, int shortcut, Fl_Callback *cb, void *user_data=0, int flags=0);\n  /** Insert a new menu item.\n   \\see Fl_Menu_::insert(int index, const char* label, const char* shortcut, Fl_Callback *cb, void *user_data=0, int flags=0)\n   */\n  int insert(int index, const char* label, const char* shortcut, Fl_Callback *cb, void *user_data=0, int flags=0) {\n    return insert(index, label, fl_old_shortcut(shortcut), cb, user_data, flags);\n    }\n  void remove(int n);\n  void replace(int index, const char *name);\n  void clear();\n  int clear_submenu(int index);\n  void  mode (int i, int fl);\n  /** Gets the flags of item i.\n   */\n  int mode(int i) const { return Fl_Menu_::mode(i); }\n  void shortcut (int i, int s);\n  void setonly (Fl_Menu_Item *item);\n  static void about(Fl_Callback *cb, void *data);\n\n  static window_menu_style_enum window_menu_style();\n  static void window_menu_style(window_menu_style_enum style);\n  static void create_window_menu();\n};\n\n/** The system menu bar.\n */\nextern Fl_Sys_Menu_Bar *fl_sys_menu_bar;\n\n#endif // Fl_Sys_Menu_Bar_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Table.H",
    "content": "//\n// Fl_Table -- A table widget for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 2002 by Greg Ercolano.\n// Copyright (c) 2004 O'ksi'D\n// Copyright 2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef _FL_TABLE_H\n#define _FL_TABLE_H\n\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Scroll.H>\n\n// EXPERIMENTAL\n// We use either std::vector or the private class Fl_Int_Vector\n// depending on the build option FLTK_OPTION_STD or --enable-use_std.\n// This option allows to use std::string and std::vector in FLTK 1.4.x\n\n#if (FLTK_USE_STD)\n#include <vector>\ntypedef std::vector<int> Fl_Int_Vector;\n#else\nclass Fl_Int_Vector; // private class declared in src/Fl_Int_Vector.H\n#endif\n\n/**\n  A table of widgets or other content.\n\n  This is the base class for table widgets.\n\n  To be useful it must be subclassed and several virtual functions defined.\n  Normally applications use widgets derived from this widget, and do not use this\n  widget directly; this widget is usually too low level to be used directly by\n  applications.\n\n  This widget does \\em not handle the data in the table. The draw_cell()\n  method must be overridden by a subclass to manage drawing the contents of\n  the cells.\n\n  This widget can be used in several ways:\n\n  - As a custom widget; see examples/table-simple.cxx and test/table.cxx.\n    Very optimal for even extremely large tables.\n  - As a table made up of a single FLTK widget instanced all over the table,\n    simulating a numeric spreadsheet. See examples/table-spreadsheet.cxx and\n    examples/table-spreadsheet-with-keyboard-nav.cxx. Optimal for large tables.\n  - As a regular container of FLTK widgets, one widget per cell.\n    See examples/table-as-container.cxx. \\em Not recommended for large tables.\n\n  \\image html table-simple.png\n  \\image latex table-simple.png \"table-simple example\" width=6cm\n\n  \\image html table-as-container.png\n  \\image latex table-as-container.png \"table-as-container example\" width=6cm\n\n  When acting as part of a custom widget, events on the cells and/or headings\n  generate callbacks when they are clicked by the user. You control when events\n  are generated based on the setting for Fl_Table::when().\n\n  When acting as a container for FLTK widgets, the FLTK widgets maintain\n  themselves. Although the draw_cell() method must be overridden, its contents\n  can be very simple. See the draw_cell() code in examples/table-simple.cxx.\n\n  The following variables are available to classes deriving from Fl_Table:\n\n  \\anchor table_dimensions_diagram\n  \\image html table-dimensions.png\n  \\image latex table-dimensions.png \"Fl_Table Dimensions\" width=6cm\n\n  <table border=0>\n  <tr><td>x()/y()/w()/h()</td>\n  <td>Fl_Table widget's outer dimension. The outer edge of the border of the\n  Fl_Table. (Red in the diagram above)</td></tr>\n\n  <tr><td>wix/wiy/wiw/wih</td>\n  <td>Fl_Table widget's inner dimension. The inner edge of the border of the\n  Fl_Table. eg. if the Fl_Table's box() is FL_NO_BOX, these values are the same\n  as x()/y()/w()/h(). (Yellow in the diagram above)</td></tr>\n\n  <tr><td>tox/toy/tow/toh</td>\n  <td>The table's outer dimension. The outer edge of the border around the cells,\n  but inside the row/col headings and scrollbars. (Green in the diagram above)\n  </td></tr>\n\n  <tr><td>tix/tiy/tiw/tih</td>\n  <td>The table's inner dimension. The inner edge of the border around the cells,\n  but inside the row/col headings and scrollbars. AKA the table's clip region.\n  eg. if the table_box() is FL_NO_BOX, these values are the same as\n  tox/toy/tow/toh. (Blue in the diagram above)\n  </td></tr></table>\n\n  CORE DEVELOPERS\n\n  - Greg Ercolano : 12/16/2002 - initial implementation 12/16/02. Fl_Table, Fl_Table_Row, docs.\n  - Jean-Marc Lienher : 02/22/2004 - added keyboard nav + mouse selection, and ported Fl_Table into fltk-utf8-1.1.4\n\n  OTHER CONTRIBUTORS\n\n  - Inspired by the Feb 2000 version of FLVW's Flvw_Table widget. Mucho thanks to those folks.\n  - Mister Satan : 04/07/2003 - MinGW porting mods, and singleinput.cxx; a cool Fl_Input oriented spreadsheet example\n  - Marek Paliwoda : 01/08/2003 - Porting mods for Borland\n  - Ori Berger : 03/16/2006 - Optimizations for >500k rows/cols\n\n  LICENSE\n\n  Greg kindly gave his permission to integrate Fl_Table and Fl_Table_Row\n  into FLTK, allowing FLTK license to apply while his widgets are part\n  of the library. [updated by Greg, 04/26/17]\n*/\nclass FL_EXPORT Fl_Table : public Fl_Group {\npublic:\n  /**\n    The context bit flags for Fl_Table related callbacks.\n\n    Should be used in draw_cell() to determine what's being drawn,\n    or in a callback() to determine where a recent event occurred.\n  */\n  enum TableContext {\n    CONTEXT_NONE       = 0,     ///< no known context\n    CONTEXT_STARTPAGE  = 0x01,  ///< before the table is redrawn\n    CONTEXT_ENDPAGE    = 0x02,  ///< after the table is redrawn\n    CONTEXT_ROW_HEADER = 0x04,  ///< drawing or event occurred in the row header\n    CONTEXT_COL_HEADER = 0x08,  ///< drawing or event occurred in the col header\n    CONTEXT_CELL       = 0x10,  ///< drawing or event occurred in a cell\n    CONTEXT_TABLE      = 0x20,  ///< drawing or event occurred in a dead zone of table\n    CONTEXT_RC_RESIZE  = 0x40   ///< column or row is being resized\n  };\n\nprivate:\n  int _rows, _cols;     // total rows/cols\n  int _row_header_w;    // width of row header\n  int _col_header_h;    // height of column header\n  int _row_position;    // last row_position set (not necessarily == toprow!)\n  int _col_position;    // last col_position set (not necessarily == leftcol!)\n\n  char _row_header;     // row header enabled?\n  char _col_header;     // col header enabled?\n  char _row_resize;     // row resizing enabled?\n  char _col_resize;     // col resizing enabled?\n  int _row_resize_min;  // row minimum resizing height (default=1)\n  int _col_resize_min;  // col minimum resizing width (default=1)\n\n  // OPTIMIZATION: partial row/column redraw variables\n  int _redraw_toprow;\n  int _redraw_botrow;\n  int _redraw_leftcol;\n  int _redraw_rightcol;\n  Fl_Color _row_header_color;\n  Fl_Color _col_header_color;\n\n  int _auto_drag;\n  int _selecting;\n  int _scrollbar_size;\n  enum {\n    TABCELLNAV = 1<<0                   ///> tab cell navigation flag\n  };\n  unsigned int flags_;\n\n  Fl_Int_Vector *_colwidths;            // column widths in pixels\n  Fl_Int_Vector *_rowheights;           // row heights in pixels\n\n  // number of columns and rows == size of corresponding vectors\n  int col_size();                       // size of the column widths vector\n  int row_size();                       // size of the row heights vector\n\n  Fl_Cursor _last_cursor;               // last mouse cursor before changed to 'resize' cursor\n\n  // EVENT CALLBACK DATA\n  TableContext _callback_context;       // event context\n  int _callback_row, _callback_col;     // event row/col\n\n  // handle() state variables.\n  //    Put here instead of local statics in handle(), so more\n  //    than one Fl_Table can exist without crosstalk between them.\n  //\n  int _resizing_col;                    // column being dragged\n  int _resizing_row;                    // row being dragged\n  int _dragging_x;                      // starting x position for horiz drag\n  int _dragging_y;                      // starting y position for vert drag\n  int _last_row;                        // last row we FL_PUSH'ed\n\n  // Redraw single cell\n  void _redraw_cell(TableContext context, int R, int C);\n\n  void _start_auto_drag();\n  void _stop_auto_drag();\n  void _auto_drag_cb();\n  static void _auto_drag_cb2(void *d);\n\nprotected:\n  enum ResizeFlag {\n    RESIZE_NONE      = 0,\n    RESIZE_COL_LEFT  = 1,\n    RESIZE_COL_RIGHT = 2,\n    RESIZE_ROW_ABOVE = 3,\n    RESIZE_ROW_BELOW = 4\n  };\n\n  int table_w;                          ///< table's virtual width (in pixels)\n  int table_h;                          ///< table's virtual height (in pixels)\n  int toprow;                           ///< top row# of currently visible table on screen\n  int botrow;                           ///< bottom row# of currently visible table on screen\n  int leftcol;                          ///< left column# of currently visible table on screen\n  int rightcol;                         ///< right column# of currently visible table on screen\n\n  // selection\n  int current_row;                      ///< selection cursor's current row (-1 if none)\n  int current_col;                      ///< selection cursor's current column (-1 if none)\n  int select_row;                       ///< extended selection row (-1 if none)\n  int select_col;                       ///< extended selection column (-1 if none)\n\n  // OPTIMIZATION: Precomputed scroll positions for the toprow/leftcol\n  int toprow_scrollpos;                 ///< precomputed scroll position for top row\n  int leftcol_scrollpos;                ///< precomputed scroll position for left column\n\n  // Data table's inner dimension\n  int tix;      ///< Data table's inner x dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int tiy;      ///< Data table's inner y dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int tiw;      ///< Data table's inner w dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int tih;      ///< Data table's inner h dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n\n  // Data table's outer dimension\n  int tox;      ///< Data table's outer x dimension, outside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int toy;      ///< Data table's outer y dimension, outside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int tow;      ///< Data table's outer w dimension, outside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int toh;      ///< Data table's outer h dimension, outside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n\n  // Table widget's inner dimension\n  int wix;      ///< Table widget's inner x dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int wiy;      ///< Table widget's inner y dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int wiw;      ///< Table widget's inner w dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n  int wih;      ///< Table widget's inner h dimension, inside bounding box. See \\ref table_dimensions_diagram \"Table Dimension Diagram\"\n\n  Fl_Scroll *table;                             ///< child Fl_Scroll widget container for child fltk widgets (if any)\n  Fl_Scrollbar *vscrollbar;                     ///< child vertical scrollbar widget\n  Fl_Scrollbar *hscrollbar;                     ///< child horizontal scrollbar widget\n\n  // Fltk\n  int handle(int e) FL_OVERRIDE;        // fltk handle() FL_OVERRIDE\n\n  // Class maintenance\n  void recalc_dimensions();\n  void table_resized();                         // table resized; recalc\n  void table_scrolled();                        // table scrolled; recalc\n  void get_bounds(TableContext context,         // return x/y/w/h bounds for context\n                  int &X, int &Y, int &W, int &H);\n  void change_cursor(Fl_Cursor newcursor);      // change mouse cursor to some other shape\n  TableContext cursor2rowcol(int &R, int &C, ResizeFlag &resizeflag);\n  int find_cell(TableContext context,           // find cell's x/y/w/h given r/c\n                int R, int C, int &X, int &Y, int &W, int &H);\n  int row_col_clamp(TableContext context, int &R, int &C);\n  // clamp r/c to known universe\n\n  /**\n    Subclass should override this method to handle drawing the cells.\n\n    This method will be called whenever the table is redrawn, once per cell.\n\n    Only cells that are completely (or partially) visible will be told to draw.\n\n    \\p context will be one of the following:\n\n    <table border=1>\n    <tr>\n    <td>\\p Fl_Table::CONTEXT_STARTPAGE</td>\n    <td>When table, or parts of the table, are about to be redrawn.<br>\n        Use to initialize static data, such as font selections.<p>\n        R/C will be zero,<br>\n        X/Y/W/H will be the dimensions of the table's entire data area.<br>\n        (Useful for locking a database before accessing; see\n        also visible_cells())</td>\n    </tr><tr>\n    <td>\\p Fl_Table::CONTEXT_ENDPAGE</td>\n    <td>When table has completed being redrawn.<br>\n        R/C will be zero, X/Y/W/H dimensions of table's data area.<br>\n        (Useful for unlocking a database after accessing)</td>\n    </tr><tr>\n    <td>\\p Fl_Table::CONTEXT_ROW_HEADER</td>\n    <td>Whenever a row header cell needs to be drawn.<br>\n        R will be the row number of the header being redrawn,<br>\n        C will be zero,<br>\n        X/Y/W/H will be the fltk drawing area of the row header in the window </td>\n    </tr><tr>\n    <td>\\p Fl_Table::CONTEXT_COL_HEADER</td>\n    <td>Whenever a column header cell needs to be drawn.<br>\n        R will be zero, <br>\n        C will be the column number of the header being redrawn,<br>\n        X/Y/W/H will be the fltk drawing area of the column header in the window </td>\n    </tr><tr>\n    <td>\\p Fl_Table::CONTEXT_CELL</td>\n    <td>Whenever a data cell in the table needs to be drawn.<br>\n        R/C will be the row/column of the cell to be drawn,<br>\n        X/Y/W/H will be the fltk drawing area of the cell in the window </td>\n    </tr><tr>\n    <td>\\p Fl_Table::CONTEXT_RC_RESIZE</td>\n    <td>Whenever table or row/column is resized or scrolled,\n        either interactively or via col_width() or row_height().<br>\n        R/C/X/Y/W/H will all be zero.\n        <p>\n        Useful for fltk containers that need to resize or move\n        the child fltk widgets.</td>\n    </tr>\n    </table>\n\n    \\p R and \\p C will be set to the row and column number\n    of the cell being drawn. In the case of row headers, \\p C will be \\a 0.\n    In the case of column headers, \\p R will be \\a 0.\n\n    <tt>X/Y/W/H</tt> will be the position and dimensions of where the cell\n    should be drawn.\n\n    In the case of custom widgets, a minimal draw_cell() override might\n    look like the following. With custom widgets it is up to the caller to handle\n    drawing everything within the dimensions of the cell, including handling the\n    selection color.  Note all clipping must be handled as well; this allows drawing\n    outside the dimensions of the cell if so desired for 'custom effects'.\n\n    \\code\n    // This is called whenever Fl_Table wants you to draw a cell\n    void MyTable::draw_cell(TableContext context, int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0) {\n        static char s[40];\n        sprintf(s, \"%d/%d\", R, C);             // text for each cell\n        switch ( context ) {\n           case CONTEXT_STARTPAGE:             // Fl_Table telling us it's starting to draw page\n               fl_font(FL_HELVETICA, 16);\n               return;\n\n           case CONTEXT_ROW_HEADER:            // Fl_Table telling us to draw row/col headers\n           case CONTEXT_COL_HEADER:\n               fl_push_clip(X, Y, W, H);\n               {\n                   fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, color());\n                   fl_color(FL_BLACK);\n                   fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);\n               }\n               fl_pop_clip();\n               return;\n\n           case CONTEXT_CELL:                  // Fl_Table telling us to draw cells\n               fl_push_clip(X, Y, W, H);\n               {\n                   // BG COLOR\n                   fl_color(is_selected(R, C) ? selection_color() : FL_WHITE);\n                   fl_rectf(X, Y, W, H);\n\n                   // TEXT\n                   fl_color(FL_BLACK);\n                   fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);\n\n                   // BORDER\n                   fl_color(FL_LIGHT2);\n                   fl_rect(X, Y, W, H);\n               }\n               fl_pop_clip();\n               return;\n\n           default:\n               return;\n       }\n       //NOTREACHED\n   }\n   \\endcode\n   */\n  virtual void draw_cell(TableContext context, int R=0, int C=0,\n                         int X=0, int Y=0, int W=0, int H=0)\n  { (void)context; (void)R; (void)C; (void)X; (void)Y; (void)W; (void)H;}                                           // overridden by deriving class\n\n  long row_scroll_position(int row);            // find scroll position of row (in pixels)\n  long col_scroll_position(int col);            // find scroll position of col (in pixels)\n\n  /**\n   Does the table contain any child fltk widgets?\n  */\n  int is_fltk_container() {                     // does table contain fltk widgets?\n    return( Fl_Group::children() > 3 );         // (ie. more than box and 2 scrollbars?)\n  }\n\n  static void scroll_cb(Fl_Widget*,void*);      // h/v scrollbar callback\n\n  void damage_zone(int r1, int c1, int r2, int c2, int r3 = 0, int c3 = 0);\n\n  /**\n   Define region of cells to be redrawn by specified range of rows/cols,\n   and then sets damage(DAMAGE_CHILD).  Extends any previously defined range to redraw.\n  */\n  void redraw_range(int topRow, int botRow, int leftCol, int rightCol) {\n    if ( _redraw_toprow == -1 ) {\n      // Initialize redraw range\n      _redraw_toprow = topRow;\n      _redraw_botrow = botRow;\n      _redraw_leftcol = leftCol;\n      _redraw_rightcol = rightCol;\n    } else {\n      // Extend redraw range\n      if ( topRow < _redraw_toprow ) _redraw_toprow = topRow;\n      if ( botRow > _redraw_botrow ) _redraw_botrow = botRow;\n      if ( leftCol < _redraw_leftcol ) _redraw_leftcol = leftCol;\n      if ( rightCol > _redraw_rightcol ) _redraw_rightcol = rightCol;\n    }\n    // Indicate partial redraw needed of some cells\n    damage(FL_DAMAGE_CHILD);\n  }\n\n  // draw() has to be protected per FLTK convention (was public in 1.3.x)\n  void draw() FL_OVERRIDE;\n\npublic:\n  Fl_Table(int X, int Y, int W, int H, const char *l=0);\n  ~Fl_Table();\n\n  /**\n   Clears the table to zero rows (rows(0)), zero columns (cols(0)), and clears\n   any widgets (table->clear()) that were added with begin()/end() or add()/insert()/etc.\n   \\see rows(int), cols(int)\n  */\n  virtual void clear() {\n    rows(0);\n    cols(0);\n    table->clear();\n  }\n\n  // \\todo: add topline(), middleline(), bottomline()\n\n  /**\n   Sets the kind of box drawn around the data table,\n   the default being FL_NO_BOX. Changing this value will cause the table\n   to redraw.\n  */\n  inline void table_box(Fl_Boxtype val) {\n    table->box(val);\n    table_resized();\n  }\n\n  /**\n   Returns the current box type used for the data table.\n  */\n  inline Fl_Boxtype table_box( void ) {\n    return(table->box());\n  }\n\n  virtual void rows(int val);                   // set number of rows\n\n  /**\n   Returns the number of rows in the table.\n  */\n  inline int rows() {\n    return(_rows);\n  }\n\n  virtual void cols(int val);                   // set number of columns\n\n  /**\n   Get the number of columns in the table.\n  */\n  inline int cols() {\n    return(_cols);\n  }\n\n  /**\n    Returns the range of row and column numbers for all visible\n    and partially visible cells in the table.\n\n    These values can be used e.g. by your draw_cell() routine during\n    CONTEXT_STARTPAGE to figure out what cells are about to be redrawn\n    for the purposes of locking the data from a database before it's drawn.\n\n    \\code\n           leftcol             rightcol\n              :                   :\n    toprow .. .-------------------.\n              |                   |\n              |  V I S I B L E    |\n              |                   |\n              |    T A B L E      |\n              |                   |\n    botrow .. '-------------------`\n    \\endcode\n\n    e.g. in a table where the visible rows are 5-20, and the\n    visible columns are 100-120, then those variables would be:\n\n    - toprow = 5\n    - botrow = 20\n    - leftcol = 100\n    - rightcol = 120\n  */\n  inline void visible_cells(int& r1, int& r2, int& c1, int& c2) {\n    r1 = toprow;\n    r2 = botrow;\n    c1 = leftcol;\n    c2 = rightcol;\n  }\n\n  /**\n    Returns 1 if someone is interactively resizing a row or column.\n    You can currently call this only from within your callback().\n  */\n  int is_interactive_resize() {\n    return(_resizing_row != -1 || _resizing_col != -1);\n  }\n\n  /**\n    Returns if row resizing by the user is allowed.\n  */\n  inline int row_resize() {\n    return(_row_resize);\n  }\n\n  /**\n    Allows/disallows row resizing by the user.\n    1=allow interactive resizing, 0=disallow interactive resizing.\n    Since interactive resizing is done via the row headers,\n    row_header() must also be enabled to allow resizing.\n  */\n  void row_resize(int flag) {                   // enable row resizing\n    _row_resize = flag;\n  }\n\n  /**\n    Returns if column resizing by the user is allowed.\n  */\n  inline int col_resize() {\n    return(_col_resize);\n  }\n\n  /**\n    Allows/disallows column resizing by the user.\n    1=allow interactive resizing, 0=disallow interactive resizing.\n    Since interactive resizing is done via the column headers,\n    \\p col_header() must also be enabled to allow resizing.\n  */\n  void col_resize(int flag) {                   // enable col resizing\n    _col_resize = flag;\n  }\n\n  /**\n    Returns the current column minimum resize value.\n  */\n  inline int col_resize_min() {                 // column minimum resizing width\n    return(_col_resize_min);\n  }\n\n  /**\n    Sets the current column minimum resize value.\n    This is used to prevent the user from interactively resizing\n    any column to be smaller than 'pixels'. Must be a value >=1.\n  */\n  void col_resize_min(int val) {\n    _col_resize_min = ( val < 1 ) ? 1 : val;\n  }\n\n  /**\n    Returns the current row minimum resize value.\n  */\n  inline int row_resize_min() {                 // column minimum resizing width\n    return(_row_resize_min);\n  }\n\n  /**\n    Sets the current row minimum resize value.\n    This is used to prevent the user from interactively resizing\n    any row to be smaller than 'pixels'. Must be a value >=1.\n  */\n  void row_resize_min(int val) {\n    _row_resize_min = ( val < 1 ) ? 1 : val;\n  }\n\n  /**\n    Returns if row headers are enabled or not.\n  */\n  inline int row_header() {                     // set/get row header enable flag\n    return(_row_header);\n  }\n\n  /**\n    Enables/disables showing the row headers. 1=enabled, 0=disabled.\n    If changed, the table is redrawn.\n  */\n  void row_header(int flag) {\n    _row_header = flag;\n    table_resized();\n    redraw();\n  }\n\n  /**\n    Returns if column headers are enabled or not.\n  */\n  inline int col_header() {                     // set/get col header enable flag\n    return(_col_header);\n  }\n\n  /**\n    Enable or disable column headers.\n    If changed, the table is redrawn.\n  */\n  void col_header(int flag) {\n    _col_header = flag;\n    table_resized();\n    redraw();\n  }\n\n  /**\n    Sets the height in pixels for column headers and redraws the table.\n  */\n  inline void col_header_height(int height) {   // set/get col header height\n    _col_header_h = height;\n    table_resized();\n    redraw();\n  }\n\n  /**\n    Gets the column header height.\n  */\n  inline int col_header_height() {\n    return(_col_header_h);\n  }\n\n  /**\n    Sets the row header width to n and causes the screen to redraw.\n  */\n  inline void row_header_width(int width) {     // set/get row header width\n    _row_header_w = width;\n    table_resized();\n    redraw();\n  }\n\n  /**\n    Returns the current row header width (in pixels).\n  */\n  inline int row_header_width() {\n    return(_row_header_w);\n  }\n\n  /**\n    Sets the row header color and causes the screen to redraw.\n  */\n  inline void row_header_color(Fl_Color val) {  // set/get row header color\n    _row_header_color = val;\n    redraw();\n  }\n\n  /**\n    Returns the current row header color.\n  */\n  inline Fl_Color row_header_color() {\n    return(_row_header_color);\n  }\n\n  /**\n    Sets the color for column headers and redraws the table.\n  */\n  inline void col_header_color(Fl_Color val) {  // set/get col header color\n    _col_header_color = val;\n    redraw();\n  }\n\n  /**\n    Gets the color for column headers.\n  */\n  inline Fl_Color col_header_color() {\n    return(_col_header_color);\n  }\n\n  void row_height(int row, int height);         // set row height in pixels\n\n  // Returns the current height of the specified row as a value in pixels.\n  int row_height(int row);\n\n  void col_width(int col, int width);           // set a column's width in pixels\n\n  // Returns the current width of the specified column in pixels.\n  int col_width(int col);\n\n  /**\n    Convenience method to set the height of all rows to the\n    same value, in pixels. The screen is redrawn.\n  */\n  void row_height_all(int height) {             // set all row/col heights\n    for ( int r=0; r<rows(); r++ ) {\n      row_height(r, height);\n    }\n  }\n\n  /**\n    Convenience method to set the width of all columns to the\n    same value, in pixels. The screen is redrawn.\n  */\n  void col_width_all(int width) {\n    for ( int c=0; c<cols(); c++ ) {\n      col_width(c, width);\n    }\n  }\n\n  void row_position(int row);                   // set/get table's current scroll position\n  void col_position(int col);\n\n  /**\n    Returns the current row scroll position as a row number.\n  */\n  int row_position() {\n    return(_row_position);\n  }\n\n  /**\n    Returns the current column scroll position as a column number.\n  */\n  int col_position() {\n    return(_col_position);\n  }\n\n  /**\n    Sets which row should be at the top of the table,\n    scrolling as necessary, and the table is redrawn. If the table\n    cannot be scrolled that far, it is scrolled as far as possible.\n  */\n  inline void top_row(int row) {                // set/get top row (deprecated)\n    row_position(row);\n  }\n\n  /**\n    Returns the current top row shown in the table.\n    This row may be partially obscured.\n  */\n  inline int top_row() {\n    return(row_position());\n  }\n  int is_selected(int r, int c);                // selected cell\n  void get_selection(int &row_top, int &col_left, int &row_bot, int &col_right);\n  void set_selection(int row_top, int col_left, int row_bot, int col_right);\n  int move_cursor(int R, int C, int shiftselect);\n  int move_cursor(int R, int C);\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE; // fltk resize() FL_OVERRIDE\n\n  // This crashes sortapp() during init.\n  //  void box(Fl_Boxtype val) {\n  //    Fl_Group::box(val);\n  //    if ( table ) {\n  //      resize(x(), y(), w(), h());\n  //    }\n  //  }\n  //  Fl_Boxtype box(void) const {\n  //    return(Fl_Group::box());\n  //  }\n\n  // Child group management\n\n  /**\n    Resets the internal array of widget sizes and positions.\n    \\sa Fl_Group::init_sizes()\n  */\n  void init_sizes() {\n    table->init_sizes();\n    table->redraw();\n  }\n\n  /**\n    The specified widget is removed from its current group (if any)\n    and added to the end of Fl_Table's group.\n  */\n  void add(Fl_Widget& wgt) {\n    table->add(wgt);\n    if ( table->children() > 2 ) {\n      table->show();\n    } else {\n      table->hide();\n    }\n  }\n\n  /**\n    The specified widget is removed from its current group (if any)\n    and added to the end of Fl_Table's group.\n  */\n  void add(Fl_Widget* wgt) {\n    add(*wgt);\n  }\n\n  /**\n    The specified widget is removed from its current group (if any)\n    and inserted into the Fl_Table's group at position 'n'.\n  */\n  void insert(Fl_Widget& wgt, int n) {\n    table->insert(wgt,n);\n  }\n\n  /**\n    The specified widget is removed from its current group (if any)\n    and inserted into Fl_Table's group before widget 'w2'.\n    This will append if 'w2' is not in Fl_Table's group.\n  */\n  void insert(Fl_Widget& wgt, Fl_Widget* w2) {\n    table->insert(wgt,w2);\n  }\n\n  /**\n    The specified widget is removed from Fl_Table's group.\n  */\n  void remove(Fl_Widget& wgt) {\n    table->remove(wgt);\n  }\n\n  // (doxygen will substitute Fl_Group's docs here)\n  void begin() {\n    table->begin();\n  }\n\n  // (doxygen will substitute Fl_Group's docs here)\n  void end() {\n    table->end();\n    // HACK: Avoid showing Fl_Scroll; seems to erase screen\n    //       causing unnecessary flicker, even if its box() is FL_NO_BOX.\n    //\n    if ( table->children() > 2 ) {\n      table->show();\n    } else {\n      table->hide();\n    }\n    Fl_Group::current(Fl_Group::parent());\n  }\n\n  /**\n    Returns a pointer to the array of children. <I>This pointer is only\n    valid until the next time a child is added or removed.</I>\n  */\n  Fl_Widget*const* array() {\n    return(table->array());\n  }\n\n  /**\n    Returns the child widget by an index.\n\n    When using the Fl_Table as a container for FLTK widgets, this method returns\n    the widget pointer from the internal array of widgets in the container.\n\n    Typically used in loops, eg:\n    \\code\n    for ( int i=0; i<children(); i++ ) {\n      Fl_Widget *w = child(i);\n      [..]\n    }\n    \\endcode\n  */\n  Fl_Widget *child(int n) const {\n    return(table->child(n));\n  }\n\n  /**\n    Returns the number of children in the table.\n\n    When using the Fl_Table as a container for FLTK widgets, this method returns\n    how many child widgets the table has.\n\n    \\see child(int)\n  */\n  int children() const {\n    return(table->children()-2);    // -2: skip Fl_Scroll's h/v scrollbar widgets\n  }\n\n  // (doxygen will substitute Fl_Group's docs here)\n  int find(const Fl_Widget *wgt) const {\n    return(table->find(wgt));\n  }\n\n  // (doxygen will substitute Fl_Group's docs here)\n  int find(const Fl_Widget &wgt) const {\n    return(table->find(wgt));\n  }\n\n  // CALLBACKS\n\n  /**\n    Returns the current row the event occurred on.\n\n    This function should only be used from within the user's callback function.\n  */\n  int callback_row() {\n    return(_callback_row);\n  }\n\n  /**\n    Returns the current column the event occurred on.\n\n    This function should only be used from within the user's callback function.\n  */\n  int callback_col() {\n    return(_callback_col);\n  }\n\n  /**\n    Returns the current 'table context'.\n\n    This function should only be used from within the user's callback function.\n  */\n  TableContext callback_context() {\n    return(_callback_context);\n  }\n\n  /**\n    Calls the widget callback.\n\n    Saves the specified 'context', 'row', and 'col' values, so that the user's\n    callback can then access them with the member functions\n    callback_context(), callback_row() and callback_col().\n  */\n  void do_callback(TableContext context, int row, int col) {\n    _callback_context = context;\n    _callback_row = row;\n    _callback_col = col;\n    Fl_Widget::do_callback();\n  }\n\n#ifdef FL_DOXYGEN\n  /**\n    The Fl_Widget::when() function is used to set a group of flags, determining\n    when the widget callback is called:\n\n    <table border=1>\n    <tr>\n    <td>\\p FL_WHEN_CHANGED</td>\n    <td>\n    callback() will be called when rows or columns are resized (interactively or\n    via col_width() or row_height()), passing CONTEXT_RC_RESIZE via\n    callback_context().\n    </td>\n    </tr><tr>\n    <td>\\p FL_WHEN_RELEASE</td>\n    <td>\n    callback() will be called during FL_RELEASE events, such as when someone\n    releases a mouse button somewhere on the table.\n    </td>\n    </tr>\n    </table>\n\n    The callback() routine is sent a TableContext that indicates the context the\n    event occurred in, such as in a cell, in a header, or elsewhere on the table.\n    When an event occurs in a cell or header, callback_row() and\n    callback_col() can be used to determine the row and column. The callback\n    can also look at the regular fltk event values (ie. Fl::event() and\n    Fl::event_button()) to determine what kind of event is occurring.\n  */\n  void when(Fl_When flags);\n#endif\n\n#ifdef FL_DOXYGEN\n  /**\n    Callbacks will be called depending on the setting of Fl_Widget::when().\n\n    Callback functions should use the following functions to determine the\n    context/row/column:\n\n    - Fl_Table::callback_row() returns current row\n    - Fl_Table::callback_col() returns current column\n    - Fl_Table::callback_context() returns current table context\n\n    callback_row() and callback_col() will be set to the row and column number the\n    event occurred on. If someone clicked on a row header, \\p col will be \\a 0.\n    If someone clicked on a column header, \\p row will be \\a 0.\n\n    callback_context() will return one of the following:\n\n    <table border=1>\n    <tr><td><tt>Fl_Table::CONTEXT_ROW_HEADER</tt></td>\n    <td>Someone clicked on a row header. Excludes resizing.</td>\n    </tr><tr>\n    <td><tt>Fl_Table::CONTEXT_COL_HEADER</tt></td>\n    <td>Someone clicked on a column header. Excludes resizing.</td>\n    </tr><tr>\n    <td><tt>Fl_Table::CONTEXT_CELL</tt></td>\n    <td>\n    Someone clicked on a cell.\n\n    To receive callbacks for FL_RELEASE events, you must set\n    when(FL_WHEN_RELEASE).\n    </td>\n    </tr><tr>\n    <td><tt>Fl_Table::CONTEXT_RC_RESIZE</tt></td>\n    <td>\n    Someone is resizing rows/columns either interactively,\n    or via the col_width() or row_height() API.\n\n    Use is_interactive_resize()\n    to determine interactive resizing.\n\n    If resizing a column, R=0 and C=column being resized.\n\n    If resizing a row, C=0 and R=row being resized.\n\n    NOTE: To receive resize events, you must set when(FL_WHEN_CHANGED).\n    </td>\n    </tr>\n    </table>\n\n    \\code\n    class MyTable : public Fl_Table {\n      [..]\n    private:\n      // Handle events that happen on the table\n      void event_callback2() {\n        int R = callback_row(),                         // row where event occurred\n        C = callback_col();                             // column where event occurred\n        TableContext context = callback_context();      // which part of table\n        fprintf(stderr, \"callback: Row=%d Col=%d Context=%d Event=%d\\n\",\n                R, C, (int)context, (int)Fl::event());\n      }\n\n      // Actual static callback\n      static void event_callback(Fl_Widget*, void* data) {\n        MyTable *o = (MyTable*)data;\n        o->event_callback2();\n      }\n\n    public:\n      // Constructor\n      MyTable() {\n        [..]\n        table.callback(&event_callback, (void*)this);   // setup callback\n        table.when(FL_WHEN_CHANGED|FL_WHEN_RELEASE);    // when to call it\n      }\n    };\n    \\endcode\n  */\n  void callback(Fl_Widget*, void*);\n#endif\n\n  /**\n    Gets the current size of the scrollbars' troughs, in pixels.\n\n    If this value is zero (default), this widget will use the\n    Fl::scrollbar_size() value as the scrollbar's width.\n\n    \\returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.\n    \\see Fl::scrollbar_size(int)\n  */\n  int scrollbar_size() const {\n      return(_scrollbar_size);\n  }\n\n  /**\n    Sets the pixel size of the scrollbars' troughs to \\p newSize, in pixels.\n\n    Normally you should not need this method, and should use\n    Fl::scrollbar_size(int) instead to manage the size of ALL your\n    widgets' scrollbars. This ensures your application has a consistent\n    UI, is the default behavior, and is normally what you want.\n\n    Only use THIS method if you really need to override the global\n    scrollbar size. The need for this should be rare.\n\n    Setting \\p newSize to the special value of 0 causes the widget to\n    track the global Fl::scrollbar_size(), which is the default.\n\n    \\param[in] newSize Sets the scrollbar size in pixels.\\n\n                    If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()\n    \\see Fl::scrollbar_size()\n  */\n  void scrollbar_size(int newSize) {\n      if ( newSize != _scrollbar_size ) redraw();\n      _scrollbar_size = newSize;\n  }\n\n  /**\n    Flag to control if Tab navigates table cells or not.\n\n    If on, Tab key navigates table cells.\n    If off, Tab key navigates fltk widget focus. (default)\n\n    As of fltk 1.3, the default behavior of the Tab key is to navigate focus off\n    of the current widget, and on to the next one.  But in some applications,\n    it's useful for Tab to be used to navigate cells in the Fl_Table.\n\n    \\param [in] val If \\p val is 1, Tab key navigates cells in table, not fltk widgets.<BR>\n                    If \\p val is 0, Tab key will advance focus to the next fltk widget (default), and does not navigate cells in table.\n  */\n  void tab_cell_nav(int val) {\n    if ( val ) flags_ |=  TABCELLNAV;\n    else       flags_ &= ~TABCELLNAV;\n  }\n\n  /**\n    Get state of table's 'Tab' key cell navigation flag.\n\n    \\returns 1 if Tab configured to navigate cells in table<br>0 to navigate widget focus (default)\n\n    \\see tab_cell_nav(int)\n  */\n  int tab_cell_nav() const {\n    return(flags_ & TABCELLNAV ? 1 : 0);\n  }\n};\n\n#endif /*_FL_TABLE_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Table_Row.H",
    "content": "//\n\n#ifndef _FL_TABLE_ROW_H\n#define _FL_TABLE_ROW_H\n\n//\n// Fl_Table_Row -- A row oriented table widget for the Fast Light Tool Kit (FLTK).\n//\n//    A class specializing in a table of rows.\n//    Handles row-specific selection behavior.\n//\n// Copyright 2002 by Greg Ercolano.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#include <FL/Fl_Table.H>\n\n/**\n A table with row selection capabilities.\n\n This class implements a simple table with the ability to select\n rows.  This widget is similar to an Fl_Browser with columns.  Most\n methods of importance will be found in the Fl_Table widget, such\n as Fl_Table::rows() and Fl_Table::cols().\n\n To be useful it must be subclassed and at minimum the draw_cell()\n method must be overridden to provide the content of the cells. This widget\n does \\em not manage the cell's data content; it is up to the parent\n class's draw_cell() method override to provide this.\n\n Events on the cells and/or headings generate callbacks when they are\n clicked by the user.  You control when events are generated based on\n the values you supply for Fl_Table::when().\n */\nclass FL_EXPORT Fl_Table_Row : public Fl_Table {\npublic:\n  enum TableRowSelectMode {\n    SELECT_NONE,                // no selection allowed\n    SELECT_SINGLE,              // single row selection\n    SELECT_MULTI                // multiple row selection (default)\n  };\nprivate:\n  // An STL-ish vector without templates\n  class FL_EXPORT CharVector {\n    char *arr;\n    int _size;\n    void init() {\n      arr = 0;\n      _size = 0;\n    }\n    void copy(char *newarr, int newsize);\n  public:\n    CharVector() {                              // CTOR\n      init();\n    }\n    ~CharVector();                              // DTOR\n    CharVector(CharVector&o) {                  // COPY CTOR\n      init();\n      copy(o.arr, o._size);\n    }\n    CharVector& operator=(CharVector&o) {       // ASSIGN\n      init();\n      copy(o.arr, o._size);\n      return(*this);\n    }\n    char operator[](int x) const {\n      return(arr[x]);\n    }\n    char& operator[](int x) {\n      return(arr[x]);\n    }\n    int size() {\n      return(_size);\n    }\n    void size(int count);\n    char pop_back() {\n      char tmp = arr[_size-1];\n      _size--;\n      return(tmp);\n    }\n    void push_back(char val) {\n      int x = _size;\n      size(_size+1);\n      arr[x] = val;\n    }\n    char back() {\n      return(arr[_size-1]);\n    }\n  };\n\n  CharVector _rowselect;                // selection flag for each row\n\n  // handle() state variables.\n  //    Put here instead of local statics in handle(), so more\n  //    than one instance can exist without crosstalk between.\n  //\n  int _dragging_select;         // dragging out a selection?\n  int _last_row;\n  int _last_y;                  // last event's Y position\n  int _last_push_x;             // last PUSH event's X position\n  int _last_push_y;             // last PUSH event's Y position\n\n  TableRowSelectMode _selectmode;\n\nprotected:\n  int handle(int event) FL_OVERRIDE;\n  int find_cell(TableContext context,           // find cell's x/y/w/h given r/c\n                int R, int C, int &X, int &Y, int &W, int &H) {\n    return(Fl_Table::find_cell(context, R, C, X, Y, W, H));\n  }\n\npublic:\n  /**\n   The constructor for the Fl_Table_Row.\n   This creates an empty table with no rows or columns,\n   with headers and row/column resize behavior disabled.\n   */\n  Fl_Table_Row(int X, int Y, int W, int H, const char *l=0) : Fl_Table(X,Y,W,H,l) {\n    _dragging_select = 0;\n    _last_row        = -1;\n    _last_y          = -1;\n    _last_push_x     = -1;\n    _last_push_y     = -1;\n    _selectmode      = SELECT_MULTI;\n  }\n\n  /**\n   The destructor for the Fl_Table_Row.\n   Destroys the table and its associated widgets.\n   */\n  ~Fl_Table_Row() { }\n\n  void rows(int val) FL_OVERRIDE; // set number of rows\n  int rows() {                          // get number of rows\n    return(Fl_Table::rows());\n  }\n\n  /**\n   Sets the table selection mode.\n\n   - \\p Fl_Table_Row::SELECT_NONE - No selection allowed\n   - \\p Fl_Table_Row::SELECT_SINGLE - Only single rows can be selected\n   - \\p Fl_Table_Row::SELECT_MULTI - Multiple rows can be selected\n   */\n  void type(TableRowSelectMode val);    // set selection mode\n\n  TableRowSelectMode type() const {     // get selection mode\n    return(_selectmode);\n  }\n\n  // Checks to see if 'row' is selected. Returns 1 if selected, 0 if not.\n  int row_selected(int row);\n\n  // Changes the selection state for 'row', depending on the value of 'flag'.\n  int select_row(int row, int flag = 1);\n\n  /**\n   This convenience function changes the selection state\n   for \\em all rows based on 'flag'. 0=deselect, 1=select, 2=toggle existing state.\n   */\n  void select_all_rows(int flag=1);     // all rows to a known state\n\n  void clear() FL_OVERRIDE {\n    rows(0);            // implies clearing selection\n    cols(0);\n    Fl_Table::clear();  // clear the table\n  }\n};\n\n#endif /*_FL_TABLE_ROW_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tabs.H",
    "content": "//\n// Tab header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Tabs widget . */\n\n#ifndef Fl_Tabs_H\n#define Fl_Tabs_H\n\n#include \"Fl_Group.H\"\n\nstruct Fl_Menu_Item;\n\n/**\n  The Fl_Tabs widget is a container widget that displays a set of tabs, with\n  each tab representing a different child widget. The user can select a tab by\n  clicking on it, and the corresponding child widget will be displayed.\n  The Fl_Tabs widget is useful for organizing a large number of controls or\n  other widgets into a compact space, allowing the user to switch between\n  different sets of controls as needed.\n\n  \\image html  tabs.png\n  \\image latex tabs.png \"Fl_Tabs\" width=8cm\n\n  Clicking the tab makes a child visible() by calling show() on it, and all\n  other children are made invisible by calling hide() on them. Usually the\n  children are Fl_Group widgets containing several widgets themselves.\n\n  Each child makes a card, and its label() is printed\n  on the card tab, including the label font and style.  The\n  selection color of that child is used to color the tab, while\n  the color of the child determines the background color of the pane.\n  '&' in labels are used to prefix a shortcut that is drawn underlined and\n  that activates the corresponding tab; repeated '&&' avoids that.\n\n  The size of the tabs is controlled by the bounding box of the\n  children (there should be some space between the children and\n  the edge of the Fl_Tabs), and the tabs may be placed\n  \"inverted\" on the bottom - this is determined by which\n  gap is larger. It is easiest to lay this out in FLUID, using the\n  FLUID browser to select each child group and resize them until\n  the tabs look the way you want them to.\n\n  \\b Note: The widgets contained in each child should leave some clear space\n  (five pixels as of FLTK 1.4.x) at the top or bottom of the group (where the\n  tabs are displayed). Otherwise drawing the children may interfere with the\n  selection border between the tabs and the children. This is particularly\n  important if the child group is an Fl_Scroll widget: either the Fl_Scroll\n  widget must be inset by five pixels relative to other children or it can\n  be wrapped inside another Fl_Group and inset by five pixels within this\n  group so the contents of the Fl_Scroll widget are kept away from the tabs\n  by this amount.\n  <!-- See GitHub issue #1175. -->\n\n  The background area behind and to the right of the tabs is\n  \"transparent\", exposing the background detail of the parent. The\n  value of Fl_Tabs::box() does not affect this area. So if Fl_Tabs is\n  resized by itself without the parent, force the appropriate parent\n  (visible behind the tabs) to redraw() to prevent artifacts.\n\n  See \"Resizing Caveats\" below on how to keep tab heights constant.\n  See \"Callback's Use Of when()\" on how to control the details\n  of how clicks invoke the callback().\n\n  A typical use of the Fl_Tabs widget:\n\n  \\par\n  \\code\n      // Typical use of Fl_Tabs\n      Fl_Tabs *tabs = new Fl_Tabs(10,10,300,200);\n      {\n          Fl_Group *grp1 = new Fl_Group(20,30,280,170,\"Tab1\");\n          {\n              ..widgets that go in tab#1..\n          }\n          grp1->end();\n          Fl_Group *grp2 = new Fl_Group(20,30,280,170,\"Tab2\");\n          {\n              ..widgets that go in tab#2..\n          }\n          grp2->end();\n      }\n      tabs->end();\n  \\endcode\n\n  \\b Default \\b Appearance\n\n  The appearance of each \"tab\" is taken from the label() and color() of the\n  child group corresponding to that \"tab\" and panel. Where the \"tabs\" appear\n  depends on the position and size of the child groups that make up the\n  panels within the Fl_Tabs widget, i.e. whether there is more space above\n  or below them. The height of the \"tabs\" depends on how much free space\n  is available.\n\n  \\image html  tabs_default.png \"Fl_Tabs Default Appearance\"\n  \\image latex tabs_default.png \"Fl_Tabs Default Appearance\" width=8cm\n\n  \\b Highlighting \\b The \\b Selected \\b Tab\n\n  The selected \"tab\" can be highlighted further by setting the\n  selection_color() of the Fl_Tab itself, e.g.\n\n  \\par\n  \\code\n  ..\n  tabs = new Fl_Tabs(..);\n  tabs->selection_color(FL_DARK3);\n  ..\n  \\endcode\n\n  The result of the above looks like:\n  \\image html  tabs_selection.png \"Highlighting the selected tab\"\n  \\image latex tabs_selection.png \"Highlighting the selected tab\" width=8cm\n\n  \\b Uniform \\b Tab \\b and \\b Panel \\b Appearance\n\n  In order to have uniform tab and panel appearance, not only must the color()\n  and selection_color() for each child group be set, but also the\n  selection_color() of the Fl_Tab itself any time a new \"tab\" is selected.\n  This can be achieved within the Fl_Tab callback, e.g.\n\n  \\par\n  \\code\n  void MyTabCallback(Fl_Widget *w, void*) {\n    Fl_Tabs *tabs = (Fl_Tabs*)w;\n    // When tab changed, make sure it has same color as its group\n    tabs->selection_color( (tabs->value())->color() );\n  }\n  ..\n  int main(..) {\n    // Define tabs widget\n    tabs = new Fl_Tabs(..);\n    tabs->callback(MyTabCallback);\n\n    // Create three tabs each colored differently\n    grp1 = new Fl_Group(.. \"One\");\n     grp1->color(9);\n     grp1->selection_color(9);\n    grp1->end();\n\n    grp2 = new Fl_Group(.. \"Two\");\n     grp2->color(10);\n     grp2->selection_color(10);\n    grp2->end();\n\n    grp3 = new Fl_Group(.. \"Three\");\n     grp3->color(14);\n     grp3->selection_color(14);\n    grp3->end();\n    ..\n    // Make sure default tab has same color as its group\n    tabs->selection_color( (tab->value())->color() );\n    ..\n    return Fl::run();\n  }\n  \\endcode\n\n  The result of the above looks like:\n  \\image html  tabs_uniform.png \"Fl_Tabs with uniform colors\"\n  \\image latex tabs_uniform.png \"Fl_Tabs with uniform colors\" width=8cm\n\n  If Fl_Tabs has no children, the widget will be drawn as a flat rectangle\n  in the background color set by \\ref color().\n\n  \\b Close \\b Button \\b on \\b Tabs\n\n  The Fl_Tabs widget allows you to specify that a child widget should display\n  a close button in its tab. If the \\ref FL_WHEN_CLOSED flag is set for the\n  child widget, an \"X\" symbol will be displayed to the left of the label text\n  in the tab. When the close button is clicked, the child widget's callback\n  function will be called with the \\ref FL_REASON_CLOSED reason. It is then\n  the responsibility of the child widget to remove itself from the\n  Fl_Tabs container.\n\n  Tabs that are in a compressed state will not display a close button until\n  they are fully expanded.\n\n  \\b Overflowing \\b Tabs\n\n  When the combined width of the tabs exceeds that of the Fl_Tabs widget, the\n  tabs will overflow. Fl_Tabs provides four options for managing tabs overflow:\n\n  - Fl_Tabs::OVERFLOW_COMPRESS: proportionally compress the tabs to the left and right\n    of the selected tab until they all fit within the widget.\n  - Fl_Tabs::OVERFLOW_CLIP: clip any tabs that extend beyond the right edge of the\n    Fl_Tabs widget, making some tabs unreachable.\n  - Fl_Tabs::OVERFLOW_PULLDOWN: don't compress the tabs but instead generate a\n    pulldown menu at the right end of the tabs area, displaying all available tabs.\n  - Fl_Tabs::OVERFLOW_DRAG: maintain the tabs' original sizes, allowing horizontal\n    dragging of the tabs area using the mouse, a horizontal mouse wheel,\n    or the horizontal scrolling gesture on touchpads.\n\n  \\b Resizing \\b Caveats\n\n  When Fl_Tabs is resized vertically, the default behavior scales the\n  tab's height as well as its children.  To keep the tab height constant\n  during resizing, set the tab widget's resizable() to one of the tab's\n  child groups, i.e.\n\n  \\par\n  \\code\n    tabs = new Fl_Tabs(..);\n    grp1 = new Fl_Group(..);\n    ..\n    grp2 = new Fl_Group(..);\n    ..\n    tabs->end();\n    tabs->resizable(grp1);      // keeps tab height constant\n  \\endcode\n\n  \\par Callback's Use Of when()\n\n  As of FLTK 1.3.3, Fl_Tabs() supports the following flags for when():\n\n    - \\ref FL_WHEN_NEVER       -- callback never invoked (all flags off)\n    - \\ref FL_WHEN_CHANGED     -- if flag set, invokes callback when a tab has been changed (on click or keyboard navigation)\n    - \\ref FL_WHEN_NOT_CHANGED -- if flag set, invokes callback when the tabs remain unchanged (on click or keyboard navigation)\n    - \\ref FL_WHEN_RELEASE     -- if flag set, invokes callback on RELEASE of mouse button or keyboard navigation\n\n  Notes:\n\n    -#  The above flags can be logically OR-ed (|) or added (+) to combine behaviors.\n    -#  The default value for when() is \\ref FL_WHEN_RELEASE (inherited from Fl_Widget).\n    -#  If \\ref FL_WHEN_RELEASE is the \\em only flag specified,\n        the behavior will be as if (\\ref FL_WHEN_RELEASE|\\ref FL_WHEN_CHANGED) was specified.\n    -#  The value of changed() will be valid during the callback.\n    -#  If both \\ref FL_WHEN_CHANGED and \\ref FL_WHEN_NOT_CHANGED are specified,\n        the callback is invoked whether the tab has been changed or not.\n        The changed() method can be used to determine the cause.\n    -#  \\ref FL_WHEN_NOT_CHANGED can happen if someone clicks on an already selected tab,\n        or if a keyboard navigation attempt results in no change to the tabs,\n        such as using the arrow keys while at the left or right end of the tabs.\n    -#  \\ref Fl::callback_reason() returns FL_REASON_SELECTED or FL_REASON_RESELECTED\n*/\nclass FL_EXPORT Fl_Tabs : public Fl_Group {\n\n  Fl_Widget *push_;\n\nprotected:\n\n  int overflow_type;    ///< \\see OVERFLOW_COMPRESS, OVERFLOW_CLIP, etc.\n  int tab_offset;       ///< for pulldown and drag overflow, this is the horizontal offset when the tabs bar is dragged by the user\n  int *tab_pos;         ///< Array of x-offsets of tabs per child + 1 \\see tab_positions()\n  int *tab_width;       ///< Array of widths of tabs per child \\see tab_positions()\n  int *tab_flags;       ///< Array of tab flag of tabs per child \\see tab_positions()\n  int tab_count;        ///< Array size of tab positions etc. \\see tab_positions()\n  Fl_Align tab_align_;  ///< tab label alignment\n  int has_overflow_menu;///< set in OVERFLOW_PULLDOWN mode if tabs overflow. The actual menu array is created only on demand\n\n  void take_focus(Fl_Widget *o);\n  int maybe_do_callback(Fl_Widget *o);\n  void check_overflow_menu();\n  void handle_overflow_menu();\n  void draw_overflow_menu_button();\n\n  int on_insert(Fl_Widget*, int) FL_OVERRIDE;\n  int on_move(int, int) FL_OVERRIDE;\n  void on_remove(int) FL_OVERRIDE;\n\n  virtual void redraw_tabs();\n  virtual int tab_positions();  // allocate and calculate tab positions\n  virtual void clear_tab_positions();\n  virtual void draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int flags, int sel);\n  virtual int tab_height();\n  virtual int hit_close(Fl_Widget *o, int event_x, int event_y);\n  virtual int hit_overflow_menu(int event_x, int event_y);\n  virtual int hit_tabs_area(int event_x, int event_y);\n\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  Fl_Tabs(int X, int Y, int W, int H, const char *L = 0);\n  ~Fl_Tabs() FL_OVERRIDE;\n\n  void resize(int, int, int, int) FL_OVERRIDE;\n  void show() FL_OVERRIDE;\n\n  int handle(int) FL_OVERRIDE;\n  Fl_Widget *value();\n  int value(Fl_Widget *);\n\n  /**\n    Returns the tab group for the tab the user has currently down-clicked on\n    and remains over until FL_RELEASE. Otherwise, returns NULL.\n\n    While the user is down-clicked on a tab, the return value is the tab group\n    for that tab. But as soon as the user releases, or drags off the tab with\n    the button still down, the return value will be NULL.\n\n    \\see push(Fl_Widget*).\n  */\n  Fl_Widget *push() const { return push_; }\n  int push(Fl_Widget *);\n\n  virtual Fl_Widget *which(int event_x, int event_y);\n  void client_area(int &rx, int &ry, int &rw, int &rh, int tabh=0);\n\n  /**\n    Sets the tab label alignment.\n\n    The default is FL_ALIGN_CENTER so tab labels are centered, but since\n    the label space is measured (per label) to fit the labels, there\n    wouldn't be any difference if labels were aligned left or right.\n\n    If you want to show an image (icon) next to the group's label you can\n    set a different label alignment. FL_ALIGN_IMAGE_NEXT_TO_TEXT is the\n    recommended alignment to show the icon left of the text.\n  */\n  void tab_align(Fl_Align a) { tab_align_ = a; }\n\n  /**\n    Gets the tab label alignment.\n\n    \\see tab_align(Fl_Align)\n  */\n  Fl_Align tab_align() const { return tab_align_; }\n\n  enum {\n    OVERFLOW_COMPRESS = 0,  ///< Tabs will be compressed and overlaid on top of each other.\n    OVERFLOW_CLIP,          ///< Only the first tabs that fit will be displayed.\n    OVERFLOW_PULLDOWN,      ///< Tabs that do not fit will be placed in a pull-down menu.\n    OVERFLOW_DRAG           ///< The tab bar can be dragged horizontally to reveal additional tabs.\n  };\n\n  void handle_overflow(int ov);\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Terminal.H",
    "content": "//\n// Fl_Terminal - A terminal widget for Fast Light Tool Kit (FLTK).\n//\n// Copyright 2022 by Greg Ercolano.\n// Copyright 2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   Fl_Terminal widget.\n*/\n\n#ifndef Fl_Terminal_H\n#define Fl_Terminal_H\n\n#include <FL/Fl.H>\n#include <FL/Fl_Window.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Scrollbar.H>\n#include <FL/Fl_Rect.H>\n\n#include <stdarg.h>             // va_list (MinGW)\n\n/** \\class Fl_Terminal\n\n  \\brief Terminal widget supporting Unicode/utf-8, ANSI/xterm escape codes with full RGB color control.\n\n  \\section Fl_Terminal\n\n  \\image html Fl_Terminal-demo.png \"Fl_Terminal widget showing a linux manual page\"\n  \\image latex Fl_Terminal-demo.png \"Fl_Terminal widget showing a linux manual page\" width=6cm\n\n  Fl_Terminal is an output-only text widget supporting ASCII and UTF-8/Unicode.\n  It supports most terminal text features, such as most VT100/xterm style escape sequences\n  (see \\ref Fl_Terminal_escape_codes), text colors/attributes, scrollback history, mouse selection, etc.\n\n  It is recommended that accessing features such as setting text colors and cursor positioning\n  is best done with ANSI/XTERM escape sequences.  But if one sets ansi(false) then this is\n  not possible, so the public API can be used for common operations, e.g.\n  \\par\n  Public API              | ESC code equivalent      | Description                 |\n  ------------------------|--------------------------|-----------------------------|\n  clear_screen_home()     | ESC [ H ESC [ 2 J        | Clear screen, home cursor   |\n  cursor_home()           | ESC [ H                  | Home the cursor             |\n  clear_history()         | ESC [ 3 J                | Clear scrollback history    |\n  reset_terminal()        | ESC [ c                  | Reset terminal              |\n\n  To access more advanced API calls, one can derive a class from Fl_Terminal to\n  access protected methods manipulate the terminal more directly, e.g.\n  \\par\n  Protected API                | ESC code equiv.  | Description                             |\n  -----------------------------|------------------|-----------------------------------------|\n  current_style()              | ESC [ # m        | Set text attributes                     |\n  clear_eod()                  | ESC [ 0 J        | Clear from cursor to end of display     |\n  clear_sod()                  | ESC [ 1 J        | Clear from cursor to start of display   |\n  clear_eol()                  | ESC [ 0 K        | Clear from cursor to end of line        |\n  clear_sol()                  | ESC [ 1 K        | Clear from cursor to start of line      |\n  clear_line()                 | ESC [ 2 K        | Clear line cursor is on                 |\n  scroll(int) // >0 for up     | ESC [ 1 S        | Scroll up one line                      |\n  scroll(int) // <0 for down   | ESC [ 1 T        | Scroll down one line                    |\n  cursor_left()                | ESC [ 1 D        | Move cursor left (no wrap)              |\n  cursor_right()               | ESC [ 1 C        | Move cursor right (no wrap)             |\n  cursor_up()                  | ESC [ 1 B        | Move cursor up (no scroll or wrap)      |\n  cursor_down()                | ESC [ 1 A        | Move cursor down (no scroll or wrap)    |\n  cursor_row() cursor_col()    | ESC [ # ; # H    | Move cursor to row# / column#           |\n  insert_char()                | ESC [ # @        | Insert a char at cursor position        |\n  delete_chars()               | ESC [ # P        | Delete chars at cursor position         |\n  insert_rows()                | ESC [ # L        | Insert rows at cursor position          |\n  delete_rows()                | ESC [ # M        | Delete rows at cursor position          |\n  etc...                       | etc...           | etc...                                  |\n\n  Many commonly used API functions are public, such as textfgcolor() for setting\n  text colors. Others, such as cursor_up() are protected to prevent common misuse, and are\n  available only to subclasses.\n\n  Some common operations:\n  - Set the terminal's background color, see color(Fl_Color)\n  - Set the terminal's default text color, see textfgcolor_default(Fl_Color)\n  - Printing text to the terminal, see Fl_Terminal::printf() and Fl_Terminal::append()\n  - Clearing the screen, see clear()\n  - Getting the terminal's buffer contents, see text()\n  - Getting single utf8 characters by row/col from the terminal display, see utf8_char_at_disp()\n  - Getting the text from a text selection, see get_selection()\n\n  For applications that need input support, the widget can be subclassed to provide\n  keyboard input, and advanced features like pseudo ttys, termio, serial port I/O, etc.,\n  as such features are beyond the scope of FLTK.\n\n  \\subsection Fl_Terminal_Examples Examples\n\n  \\par\n  \\code\n    //\n    // Fl_Terminal: Simple Use\n    //\n    Fl_Terminal *tty = new Fl_Terminal(...);\n    :\n    tty->append(\"Hello world.\\n\");                      // simple strings\n    tty->append(\"\\033[31mThis text is red.\\033[0m\\n\");  // colored text\n    tty->append(\"\\033[32mThis text is green.\\033[0m\\n\");\n    tty->printf(\"The value of x is %.02f\\n\", x);        // printf() formatting\n  \\endcode\n  \\par\n  There are also public methods for doing what most \"\\033[\" escape codes do,\n  so that if ansi(bool) is set to \"false\", one can still change text colors\n  or clear the screen via application control, e.g.\n  \\par\n  \\code\n     tty->home();                  // home the cursor\n     tty->clear_screen();          // clear the screen\n     tty->textfgcolor(0xff000000); // change the text color to RED\n     tty->textbgcolor(0x0000ff00); // change the background color to BLUE\n     //                 ├┘├┘├┘\n     //                 R G B\n  \\endcode\n  \\par\n  When creating the widget, the width/height determine the default column\n  and row count for the terminal's display based on the current font size.\n  The column width determines where text will wrap.\n  \\par\n  You can specify wider column sizes than the screen using\n  display_columns(colwidth). When this value is larger than\n  the widget's width, text will wrap off-screen, and can be revealed by\n  resizing the widget wider.\n\n  \\subsection Fl_Terminal_Writing Writing To Terminal From Applications\n\n  \\par\n  An application needing terminal output as part of its user interface\n  can instance Fl_Terminal, and write text strings with:\n  \\par\n     - append() to append strings\n     - printf() to append formatted strings\n  \\par\n  Single character output can be done with:\n  \\par\n     - print_char() to print a single ASCII/UTF-8 char at the cursor\n     - plot_char() to put single ASCII/UTF-8 char at an x,y position\n  \\par\n\n  \\subsection Fl_Terminal_Attributes Text Attributes\n  \\par\n  The terminal's text supports these attributes:\n  \\par\n  - Italic - italicized text: <TT>\\\\033[3m</TT>\n  - Bold - brighter/thicker text: <TT>\\\\033[1m</TT>\n  - Dim - lower brightness text: <TT>\\\\033[2m</TT>\n  - Underline - text that is underlined: <TT>\\\\033[4m</TT>\n  - Strikeout - text that has a line through the text: <TT>\\\\033[9m</TT>\n  - Inverse - text whose background and foreground colors are swapped: <TT>\\\\033[7m</TT>\n  - Normal - normal text: <TT>\\\\033[0m</TT>\n  \\par\n  \\image html Fl_Terminal-utf8-demo.png \"Fl_Terminal screen\"\n  \\image latex Fl_Terminal-utf8-demo.png \"Fl_Terminal screen\" width=6cm\n\n  \\subsection Fl_Terminal_Colors Text and Background Colors\n\n  \\par\n  There's at least two ways to specify colors for text and background colors:\n  \\par\n  - 3 bit / 8 Color Values\n  - Full 24 bit R/G/B colors\n  \\par\n  Example of 3 bit colors:\n  \\image html  Fl_Terminal-3bit-colors.png \"Fl_Terminal 3 bit colors\"\n  \\image latex Fl_Terminal-3bit-colors.png \"Fl_Terminal 3 bit colors\" width=6cm\n  \\par\n  Example application source code using 3 bit colors:\n  \\code\n    //\n    // Text colors\n    //\n    tty->append(\"\\033[31m Red text.\\033[0m\\n\");   // Print red text..\n    tty->append(\"\\033[32m Green text.\\033[0m\\n\");\n    :\n    tty->append(\"\\033[36m Cyan text.\\033[0m\\n\");\n    tty->append(\"\\033[37m White text.\\033[0m\\n\");\n    //\n    // Background colors\n    //\n    tty->append(\"\\033[41m Red Background.\\033[0m\\n\");  // background will be red\n    tty->append(\"\\033[42m Green Background.\\033[0m\\n\");\n    :\n    tty->append(\"\\033[46m Cyan Background.\\033[0m\\n\");\n    tty->append(\"\\033[47m White Background.\\033[0m\\n\");\n  \\endcode\n  \\par\n  Example of 24 bit colors:\n  \\image html  Fl_Terminal-24bit-colors.png \"Fl_Terminal 24 bit colors\"\n  \\image latex Fl_Terminal-24bit-colors.png \"Fl_Terminal 24 bit colors\" width=6cm\n  \\par\n  Example application source code using 24 bit colors:\n  \\code\n    //\n    // 24 bit Text Color\n    //\n    tty->append(\"\\033[38;2;0;0;255m Text is BLUE.\\033[0m\\n\");                // RGB: R=0,   G=0,  B=255\n    tty->append(\"\\033[38;2;255;0;0m Text is RED.\\033[0m\\n\");                 // RGB: R=255, G=0,  B=0\n    tty->append(\"\\033[38;2;127;64;0m Text is DARK ORANGE.\\033[0m\\n\");        // RGB: R=127, G=64, B=0\n    //\n    // 24 bit Background Color\n    //\n    tty->append(\"\\033[48;2;0;0;255m Background is BLUE.\\033[0m\\n\");          // RGB: R=0,   G=0,  B=255\n    tty->append(\"\\033[48;2;255;0;0m Background is RED.\\033[0m\\n\");           // RGB: R=255, G=0,  B=0\n    tty->append(\"\\033[48;2;127;64;0m Background is DARK ORANGE.\\033[0m\\n\");  // RGB: R=127, G=64, B=0\n  \\endcode\n  \\par\n  For more on the ANSI escape codes, see \\ref Fl_Terminal_escape_codes.\n\n  \\subsection Fl_Terminal_Features Features\n\n  \\par\n  Most standard terminal behaviors are supported, e.g.\n  \\par\n     - ASCII + UTF-8/Unicode\n     - scrollback history management\n     - mouse selection + copy/paste (^C, ^A)\n     - autoscroll during selection\n  \\par\n  Most popular ANSI/DEC VT100/Xterm escape sequences are supported (see \\ref Fl_Terminal_escape_codes), including:\n     - per-character colors for text and background\n     - per-character text attributes: bold/dim, underline, strikeout\n     - scrolling up/down\n     - character insert/delete for characters/rows/screen\n     - clearing characters/rows/screen\n  \\par\n  Does not (yet) support:\n     - programmable regions (scroll regions and attribute blocks)\n     - dynamic line wrap (where resizing display dynamically re-wraps long lines)\n  \\par\n  Will likely never implement as part of this widget:\n     - pty/termio management (such features should be _subclassed_)\n     - Different per-character font family + sizes (font family/size is global only)\n     - variable width fonts\n  \\par\n  Regarding the font family+size; the way the terminal is currently designed,\n  the font family and size must not vary within text; rows have to be consistent\n  height. Varying widths are tricky too, esp. when it comes to moving the cursor\n  up/down within a column; varying *widths* are supported (due to Unicode characters\n  sometimes being \"wide\", but not heights.\n\n  \\subsection Fl_Terminal_Margins Margins\n\n  \\par\n  The margins define the amount of space (in pixels) around the outside of the\n  text display area, the space between the widget's inner edge (inside the box())\n  and the text display area's outer edge. The margins can be inspected and changed\n  with the margin_left(), margin_right(), margin_top() and margin_bottom() methods.\n  \\par\n  \\code\n·\n     TERMINAL WIDGET (Fl_Terminal)\n     ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━┓\n     ┃                          ↑ margin_top                                ┃   ┃\n     ┃     TEXT DISPLAY AREA    ↓                                           ┃   ┃\n     ┃     ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬─▴─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐     ┃   ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ S ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ c ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ display_rows ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ r ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ o ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ l ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ l ┃\n     ┃     │◄── display_columns ─────────┼───────────────────────────►│     ┃   ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ B ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ a ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃ r ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃   ┃\n     ┃     ├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤     ┃   ┃\n     ┃◄─┬─►├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼ │ ┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤◄─┬─►┃   ┃\n     ┃  │  └┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴─▾─┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘  │  ┃   ┃\n     ┃ margin_left              ↑                              margin_right ┃   ┃\n     ┃                          ↓ margin_bottom                             ┃   ┃\n     ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━┛\n                                Fl_Terminal Margins\n\n\n                             ░░░░░░░░░░░░░░░░░░░░░░░░░\n                             ░░░░░░░░░░░░░░░░░░░░░░░░░\n                             ░░░░░░:::::::::::::░░░░░◉\n                             ░░░░░░::##:::::##:◉░░░░░░╲\n                             ░░░░░░::###:::###::╲░░░░░ ╲\n                             ░░░░░░::####:####::░╲░░░░  Fl_Terminal::color()\n                             ░░░░░░::##:###:##::░░╲░░░\n                             ░░░░░░::##::#::##::░░░╲░░\n                             ░░░░░░::##:.:::##::░░░░╲░\n                             ░░░░░░::##:::::#◉::░░░░░╲\n                             ░░░░░░:::::::::::╲:░░░░░░╲\n                             ░░░░░░░░░░░░░░░░░░╲░░░░░░ Fl_Terminal::textbgcolor()\n                             ░░░░░░░░░░░░░░░░░░░╲░░░░░\n                                                 ╲\n                                                  Fl_Terminal::textfgcolor()\n·\n  \\endcode\n\n  \\subsection Fl_Terminal_Caveats Caveats\n\n  \\par\n  - This widget is not a full terminal emulator; it does not do stdio redirection,\n    pseudo ttys/termios/character cooking, keyboard input processing, full\n    curses(3) support. However, such features CAN be implemented with subclassing.\n    \\par\n  - The printf() and vprintf() functions are limited to strings no longer than\n    1024 characters (including NULL). For printing longer strings, use append()\n    which has no string limits.\n    \\par\n  - For background colors textbgcolor() and textbgcolor_default(), the special\n    color value 0xffffffff lets the widget's box() color() show through behind\n    the text.\n**/\n\nclass FL_EXPORT Fl_Terminal : public Fl_Group {\n  //////////////////////////////////////\n  ////// Fl_Terminal Public Enums //////\n  //////////////////////////////////////\npublic:\n  /**\n    \\enum RedrawStyle\n    Determines when Fl_Terminal calls redraw() if new text is added.\n    RATE_LIMITED is the recommended setting, using redraw_rate(float) to determine\n    the maximum rate of redraws.\n    \\see redraw_style(), redraw_rate()\n  */\n  enum RedrawStyle {\n    NO_REDRAW=0,        ///< app must call redraw() as needed to update text to screen\n    RATE_LIMITED,       ///< timer controlled redraws. (DEFAULT)\n    PER_WRITE           ///< redraw triggered after *every* append() / printf() / etc. operation\n  };\n\n  /**\n    \\enum Attrib\n    Bits for the per-character attributes, which control text features\n    such as italic, bold, underlined text, etc.\n\n    NOTE: enum names with a leading underbar must not be used, and are\n    reserved for future use.\n  */\n  enum Attrib {\n    NORMAL      = 0x00,   ///< all attributes off\n    BOLD        = 0x01,   ///< bold text: uses bold font, color brighter than normal\n    DIM         = 0x02,   ///< dim text; color slightly darker than normal\n    ITALIC      = 0x04,   ///< italic font text\n    UNDERLINE   = 0x08,   ///< underlined text\n    _RESERVED_1 = 0x10,   ///< <EM>(reserved for internal future use)</EM>\n    INVERSE     = 0x20,   ///< inverse text; fg/bg color are swapped\n    _RESERVED_2 = 0x40,   ///< <EM>(reserved for internal future use)</EM>\n    STRIKEOUT   = 0x80    ///< strikeout text\n  };\n\n  /**\n    \\enum CharFlags\n    Per-character 8 bit flags (uchar) used to manage special states for characters.\n  */\n  enum CharFlags {\n    FG_XTERM   = 0x01,    ///< this char's fg color is an XTERM color; can be affected by Dim+Bold\n    BG_XTERM   = 0x02,    ///< this char's bg color is an XTERM color; can be affected by Dim+Bold\n    EOL        = 0x04,    ///< TODO: char at EOL, used for line re-wrap during screen resizing\n    RESV_A     = 0x08,\n    RESV_B     = 0x10,\n    RESV_C     = 0x20,\n    RESV_D     = 0x40,\n    RESV_E     = 0x80,\n    COLORMASK  = (FG_XTERM | BG_XTERM)\n  };\n\n  /**\n    \\enum OutFlags\n    Output translation flags for special control character translations.\n  */\n  enum OutFlags {\n    OFF        = 0x00,     ///< no output translation\n    CR_TO_LF   = 0x01,     ///< carriage return generates a vertical line-feed (\\\\r -> \\\\n)\n    LF_TO_CR   = 0x02,     ///< line-feed generates a carriage return (\\\\n -> \\\\r)\n    LF_TO_CRLF = 0x04      ///< line-feed generates a carriage return line-feed (\\\\n -> \\\\r\\\\n)\n  };\n\n  /**\n    \\enum ScrollbarStyle\n    Behavior of scrollbars\n  */\n  enum ScrollbarStyle {\n    SCROLLBAR_OFF  = 0x00, ///< scrollbar always invisible\n    SCROLLBAR_AUTO = 0x01, ///< scrollbar visible if widget resized in a way that hides columns (default)\n    SCROLLBAR_ON   = 0x02  ///< scrollbar always visible\n  };\n\n  ///////////////////////////////////////////////////////////////\n  //////\n  ////// Fl_Terminal Protected Classes\n  //////\n  ///////////////////////////////////////////////////////////////\nprotected:\n  // Margin Class ////////////////////////////////////////////\n  //\n  // Class to manage the terminal's margins\n  //\n  class FL_EXPORT Margin {\n    int left_, right_, top_, bottom_;\n  public:\n    Margin(void) { left_ = right_ = top_ = bottom_ = 3; }\n    int left(void)   const { return left_;   }\n    int right(void)  const { return right_;  }\n    int top(void)    const { return top_;    }\n    int bottom(void) const { return bottom_; }\n    void left(int val)     { left_   = val;  }\n    void right(int val)    { right_  = val;  }\n    void top(int val)      { top_    = val;  }\n    void bottom(int val)   { bottom_ = val;  }\n  };\n\n  // CharStyle Class ////////////////////////////////////////////\n  //\n  // Class to manage the terminal's character style\n  // This includes the font, color, and some cached internal\n  // info for optimized drawing speed.\n  //\n  class FL_EXPORT CharStyle {\n    uchar       attrib_;           // bold, underline..\n    uchar       charflags_;        // CharFlags (xterm color management)\n    Fl_Color    fgcolor_;          // foreground color for text\n    Fl_Color    bgcolor_;          // background color for text\n    Fl_Color    defaultfgcolor_;   // default fg color used by ESC[0m\n    Fl_Color    defaultbgcolor_;   // default bg color used by ESC[0m\n    Fl_Font     fontface_;         // font face\n    Fl_Fontsize fontsize_;         // font size\n    int         fontheight_;       // font height (in pixels)\n    int         fontdescent_;      // font descent (pixels below font baseline)\n    int         charwidth_;        // width of a fixed width ASCII character\n  public:\n    CharStyle(bool fontsize_defer);\n    uchar attrib(void) const            { return attrib_; }\n    uchar charflags(void) const         { return charflags_; }\n    // Colors - All access to colors are by Fl_Color only.\n    //          There are three ways to SET colors: Fl_Color, rgb, xterm(uchar)\n    //\n    Fl_Color fltk_fg_color(uchar ci);\n    Fl_Color fltk_bg_color(uchar ci);\n    Fl_Color fgcolor(void) const;\n    Fl_Color bgcolor(void) const;\n    Fl_Color defaultfgcolor(void) const { return defaultfgcolor_; }\n    Fl_Color defaultbgcolor(void) const { return defaultbgcolor_; }\n    Fl_Font fontface(void) const        { return fontface_; }\n    Fl_Fontsize fontsize(void) const    { return fontsize_; }\n    int  fontheight(void) const         { return fontheight_; }\n    int  fontdescent(void) const        { return fontdescent_; }\n    int  charwidth(void) const          { return charwidth_; }\n    uchar colorbits_only(uchar inflags) const;\n    void attrib(uchar val)              { attrib_    = val; }\n    void charflags(uchar val)           { charflags_ = val; }\n    void set_charflag(uchar val)        { charflags_ |= val; }\n    void clr_charflag(uchar val)        { charflags_ &= ~val; }\n    // Non-xterm colors\n    void fgcolor(int r,int g,int b)     { fgcolor_ = (r<<24) | (g<<16) | (b<<8); clr_charflag(FG_XTERM); }\n    void bgcolor(int r,int g,int b)     { bgcolor_ = (r<<24) | (g<<16) | (b<<8); clr_charflag(BG_XTERM); }\n    void fgcolor(Fl_Color val)          { fgcolor_ = val;                        clr_charflag(FG_XTERM); }\n    void bgcolor(Fl_Color val)          { bgcolor_ = val;                        clr_charflag(BG_XTERM); }\n    // Xterm colors\n    void fgcolor_xterm(Fl_Color val)    { fgcolor_ = val;                        set_charflag(FG_XTERM); }\n    void bgcolor_xterm(Fl_Color val)    { bgcolor_ = val;                        set_charflag(BG_XTERM); }\n    void fgcolor_xterm(uchar val);\n    void bgcolor_xterm(uchar val);\n    //\n    void defaultfgcolor(Fl_Color val)   { defaultfgcolor_ = val; }\n    void defaultbgcolor(Fl_Color val)   { defaultbgcolor_ = val; }\n    void fontface(Fl_Font val)          { fontface_ = val; update(); }\n    void fontsize(Fl_Fontsize val)      { fontsize_ = val; update(); }\n    void update(void);\n    void update_fake(void);\n    // SGR MODES: Set Graphics Rendition\n    void sgr_reset(void) {                         // e.g. ESC[0m\n      attrib(Fl_Terminal::NORMAL);\n      if (charflags() & FG_XTERM) fgcolor_xterm(defaultfgcolor_);\n      else                        fgcolor(defaultfgcolor_);\n      if (charflags() & BG_XTERM) bgcolor_xterm(defaultbgcolor_);\n      else                        bgcolor(defaultbgcolor_);\n    }\n    int  onoff(bool flag, Attrib a) { return (flag ? (attrib_ | a) : (attrib_ & ~a)); }\n    void sgr_bold(bool val)      { attrib_ = onoff(val, Fl_Terminal::BOLD);      } // e.g. ESC[1m\n    void sgr_dim(bool val)       { attrib_ = onoff(val, Fl_Terminal::DIM);       } // e.g. ESC[2m\n    void sgr_italic(bool val)    { attrib_ = onoff(val, Fl_Terminal::ITALIC);    } // e.g. ESC[3m\n    void sgr_underline(bool val) { attrib_ = onoff(val, Fl_Terminal::UNDERLINE); } // e.g. ESC[3m\n    void sgr_dbl_under(bool val) { attrib_ = onoff(val, Fl_Terminal::UNDERLINE); } // e.g. ESC[21m (TODO!)\n    void sgr_blink(bool val)     { (void)val; /* NOT IMPLEMENTED */              } // e.g. ESC[5m\n    void sgr_inverse(bool val)   { attrib_ = onoff(val, Fl_Terminal::INVERSE);   } // e.g. ESC[7m\n    void sgr_strike(bool val)    { attrib_ = onoff(val, Fl_Terminal::STRIKEOUT); } // e.g. ESC[9m\n  };\n\nprotected:\n  // Cursor Class ///////////////////////////////////////////////////////////\n  //\n  // Class to manage the terminal's cursor position, color, etc.\n  //\n  class FL_EXPORT Cursor {\n    int      col_;      // cursor's current col (x) position on display\n    int      row_;      // cursor's current row (y) position on display\n    int      h_;        // cursor's height (affected by font size)\n    Fl_Color fgcolor_;  // cursor's fg color (color of text, if any)\n    Fl_Color bgcolor_;  // cursor's bg color\n  public:\n    Cursor(void) {\n      col_     = 0;\n      row_     = 0;\n      h_       = 10;\n      fgcolor_ = 0xfffff000;   // wht\n      bgcolor_ = 0x00d00000;   // grn\n    }\n    int col(void) const          { return col_; }\n    int row(void) const          { return row_; }\n    int h(void) const            { return h_; }\n    Fl_Color fgcolor(void) const { return fgcolor_; }\n    Fl_Color bgcolor(void) const { return bgcolor_; }\n    void col(int val)            { col_ = val >= 0 ? val : 0; }\n    void row(int val)            { row_ = val >= 0 ? val : 0; }\n    void h(int val)              { h_   = val; }\n    void fgcolor(Fl_Color val)   { fgcolor_ = val; }\n    void bgcolor(Fl_Color val)   { bgcolor_ = val; }\n    int  left(void)              { col_ = (col_>0) ? (col_-1) : 0; return col_; }\n    int  right(void)             { return ++col_; }\n    int  up(void)                { row_ = (row_>0) ? (row_-1) : 0; return row_; }\n    int  down(void)              { return ++row_; }\n    bool is_rowcol(int drow,int dcol) const;\n    void scroll(int nrows);\n    void home(void) { row_ = 0; col_ = 0; }\n  };\n\n  // Utf8Char Class ///////////////////////////////////////////////////////////\n  //\n  //    Class to manage the terminal's individual UTF-8 characters.\n  //    Includes fg/bg color, attributes (BOLD, UNDERLINE..)\n  //\n  class FL_EXPORT Utf8Char {\n    static const int max_utf8_ = 4; // RFC 3629 paraphrased: In UTF-8, chars are encoded with 1 to 4 octets\n    char     text_[max_utf8_];      // memory for actual ASCII or UTF-8 byte contents\n    uchar    len_;                  // length of bytes in text_[] buffer; 1 for ASCII, >1 for UTF-8\n    uchar    attrib_;               // attribute bits for this char (bold, underline..)\n    uchar    charflags_;            // CharFlags (xterm colors management)\n    Fl_Color fgcolor_;              // fltk fg color (supports 8color or 24bit color set w/ESC[37;<r>;<g>;<b>m)\n    Fl_Color bgcolor_;              // fltk bg color (supports 8color or 24bit color set w/ESC[47;<r>;<g>;<b>m)\n    // Private methods\n    void text_utf8_(const char *text, int len);\n    Fl_Color attr_color_(Fl_Color col, const Fl_Widget *grp) const;\n  public:\n    // Public methods\n    Utf8Char(void);                             // ctor\n    Utf8Char(const Utf8Char& o);                // copy ctor\n    ~Utf8Char(void);                            // dtor\n    Utf8Char& operator=(const Utf8Char& o);     // assignment\n    inline int max_utf8() const { return max_utf8_; }\n    void text_utf8(const char *text, int len, const CharStyle& style);\n    void text_ascii(char c, const CharStyle& style);\n    void fl_font_set(const CharStyle& style) const;\n\n    // Return the UTF-8 text string for this character.\n    //   Use length() to get number of bytes in string, which will be 1 for ASCII chars.\n    //\n    const char* text_utf8(void) const { return text_; }\n    // Return the attribute for this char\n    uchar attrib(void)    const { return attrib_; }\n    uchar charflags(void) const { return charflags_; }\n    Fl_Color fgcolor(void) const;\n    Fl_Color bgcolor(void) const;\n    // Return the length of this character in bytes (UTF-8 can be multibyte..)\n    int length(void) const { return int(len_); }\n    double pwidth(void) const;\n    int pwidth_int(void) const;\n    // Clear the character to a 'space'\n    void clear(const CharStyle& style) { text_utf8(\" \", 1, style); charflags_ = 0; attrib_ = 0; }\n    bool is_char(char c) const { return *text_ == c; }\n    void show_char(void) const { ::printf(\"%.*s\", len_, text_); }\n    void show_char_info(void) const { ::fprintf(stderr, \"UTF-8('%.*s', len=%d)\\n\", len_, text_, len_); }\n    Fl_Color attr_fg_color(const Fl_Widget *grp) const;\n    Fl_Color attr_bg_color(const Fl_Widget *grp) const;\n  };\n\n  // RingBuffer Class ///////////////////////////////////////////////////\n  //\n  // Manages ring with indexed row/col and \"history\" vs. \"display\" concepts.\n  //\n  class FL_EXPORT RingBuffer {\n    Utf8Char *ring_chars_;    // the ring UTF-8 char buffer\n    int ring_rows_;           // #rows in ring total\n    int ring_cols_;           // #columns in ring/hist/disp\n    int nchars_;              // #chars in ring (ring_rows*ring_cols)\n    int hist_rows_;           // #rows in history\n    int hist_use_;            // #rows in use by history\n    int disp_rows_;           // #rows in display\n    int offset_;              // index offset (used for 'scrolling')\n\nprivate:\n    void new_copy(int drows, int dcols, int hrows, const CharStyle& style);\n    //DEBUG    void write_row(FILE *fp, Utf8Char *u8c, int cols) const {\n    //DEBUG      cols = (cols != 0) ? cols : ring_cols();\n    //DEBUG      for ( int col=0; col<cols; col++, u8c++ ) {\n    //DEBUG        ::fprintf(fp, \"%.*s\", u8c->length(), u8c->text_utf8());\n    //DEBUG      }\n    //DEBUG    }\n  public:\n    void clear(void);\n    void clear_hist(void);\n    RingBuffer(void);\n    RingBuffer(int drows, int dcols, int hrows);\n    ~RingBuffer(void);\n\n    // Methods to access ring\n    //\n    //    The 'offset' concept allows the 'history' and 'display'\n    //    to be scrolled indefinitely. The 'offset' is applied\n    //    to all the row accesses, and are clamped to within their bounds.\n    //\n    //    For 'raw' access to the ring (without the offset concept),\n    //    use the ring_chars() method, and walk from 0 - ring_rows().\n    //\n    //          _____________\n    //         |             | <- hist_srow()  <- ring_srow()\n    //         |   H i s t   |\n    //         |             |\n    //         |_____________| <- hist_erow()\n    //         |             | <- disp_srow()\n    //         |   D i s p   |\n    //         |             |\n    //         |_____________| <- disp_erow()  <- ring_erow()\n    //\n    //          \\___________/\n    //           ring_cols()\n    //           hist_cols()\n    //           disp_cols()\n    //\n    inline int ring_rows(void) const { return ring_rows_; }\n    inline int ring_cols(void) const { return ring_cols_; }\n    inline int ring_srow(void) const { return(0); }\n    inline int ring_erow(void) const { return(ring_rows_ - 1); }\n    inline int hist_rows(void) const { return hist_rows_; }\n    inline int hist_cols(void) const { return ring_cols_; }\n    inline int hist_srow(void) const { return((offset_ + 0) % ring_rows_); }\n    inline int hist_erow(void) const { return((offset_ + hist_rows_ - 1) % ring_rows_); }\n    inline int disp_rows(void) const { return disp_rows_; }\n    inline int disp_cols(void) const { return ring_cols_; }\n    inline int disp_srow(void) const { return((offset_ + hist_rows_) % ring_rows_); }\n    inline int disp_erow(void) const { return((offset_ + hist_rows_ + disp_rows_ - 1) % ring_rows_); }\n    inline int offset(void)    const { return offset_; }\n    void offset_adjust(int rows);\n    void hist_rows(int val) { hist_rows_ = val; }\n    void disp_rows(int val) { disp_rows_ = val; }\n\n    // History use\n    inline int  hist_use(void)  const       { return hist_use_; }\n    inline void hist_use(int val)           { hist_use_ = val; }\n    inline int  hist_use_srow(void) const   { return((offset_ + hist_rows_ - hist_use_) % ring_rows_); }\n    inline Utf8Char *ring_chars(void)       { return ring_chars_; }  // access ring buffer directly\n    inline Utf8Char *ring_chars(void) const { return ring_chars_; }  // access ring buffer directly\n\n    bool is_hist_ring_row(int grow) const;\n    bool is_disp_ring_row(int grow) const;\n    //DEBUG void show_ring_info(void) const;\n    void move_disp_row(int src_row, int dst_row);\n    void clear_disp_rows(int sdrow, int edrow, const CharStyle& style);\n    void scroll(int rows, const CharStyle& style);\n\n    const Utf8Char* u8c_ring_row(int row) const;\n    const Utf8Char* u8c_hist_row(int hrow) const;\n    const Utf8Char* u8c_hist_use_row(int hurow) const;\n    const Utf8Char* u8c_disp_row(int drow) const;\n    // Non-const versions of the above methods\n    //   Using \"Effective C++\" ugly-as-hell syntax technique.\n    //\n    Utf8Char* u8c_ring_row(int row);\n    Utf8Char* u8c_hist_row(int hrow);\n    Utf8Char* u8c_hist_use_row(int hurow);\n    Utf8Char* u8c_disp_row(int drow);\n\n    void create(int drows, int dcols, int hrows);\n    void resize(int drows, int dcols, int hrows, const CharStyle& style);\n\n    void change_disp_rows(int drows, const CharStyle& style);\n    void change_disp_cols(int dcols, const CharStyle& style);\n  };\n\n  // Selection Class ///////////////////////////////////////////////////\n  //\n  // Class to manage mouse selection\n  //\n  class FL_EXPORT Selection {\n    Fl_Terminal *terminal_;\n    int srow_, scol_, erow_, ecol_;     // selection start/end. NOTE: start *might* be > end\n    int push_row_, push_col_;           // global row/col for last FL_PUSH\n    bool push_char_right_;\n    Fl_Color selectionbgcolor_;\n    Fl_Color selectionfgcolor_;\n    int state_ ;                        // 0=none, 1=started, 2=extended, 3=done\n    bool is_selection_;                 // false: no selection\n  public:\n    Selection(Fl_Terminal *terminal);\n    int srow(void) const { return srow_; }\n    int scol(void) const { return scol_; }\n    int erow(void) const { return erow_; }\n    int ecol(void) const { return ecol_; }\n    void push_clear() { push_row_ = push_col_ = -1; push_char_right_ = false; }\n    void push_rowcol(int row,int col,bool char_right) {\n      push_row_ = row; push_col_ = col; push_char_right_ = char_right; }\n    void start_push() { start(push_row_, push_col_, push_char_right_); }\n    bool dragged_off(int row,int col,bool char_right) {\n      return (push_row_ != row) || (push_col_+push_char_right_ != col+char_right); }\n    void selectionfgcolor(Fl_Color val) { selectionfgcolor_ = val; }\n    void selectionbgcolor(Fl_Color val) { selectionbgcolor_ = val; }\n    Fl_Color selectionfgcolor(void) const { return selectionfgcolor_; }\n    Fl_Color selectionbgcolor(void) const { return selectionbgcolor_; }\n    bool is_selection(void) const { return is_selection_; }\n    bool get_selection(int &srow,int &scol,int &erow,int &ecol) const; // guarantees return (start < end)\n    bool start(int row, int col, bool char_right);\n    bool extend(int row, int col, bool char_right);\n    void end(void);\n    void select(int srow, int scol, int erow, int ecol);\n    bool clear(void);\n    int  state(void) const { return state_; }\n    void scroll(int nrows);\n  };\n\n  // EscapeSeq Class ///////////////////////////////////////////////////\n  //\n  // Class to handle parsing ESC sequences\n  //\n  // Holds all state information for parsing esc sequences,\n  // so sequences can span multiple block read(2) operations, etc.\n  // Handling of parsed sequences is NOT handled in this class,\n  // just the parsing of the sequences and managing generic integers.\n  //\n  class FL_EXPORT EscapeSeq {\n  public:\n    // EscapeSeq Constants\n    // Maximums\n    static const int maxbuff   = 80;  // character buffer\n    static const int maxvals   = 20;  // integer value buffer\n    // Return codes\n    static const int success   = 0;   // operation succeeded\n    static const int fail      = -1;  // operation failed\n    static const int completed = 1;   // multi-step operation completed successfully\n  private:\n    char  esc_mode_;                  // escape parsing mode state\n    char  csi_;                       // This is an ESC[.. sequence (Ctrl Seq Introducer)\n    char  buff_[maxbuff];             // escape sequence being parsed\n    char *buffp_;                     // parsing ptr into buff[]\n    char *buffendp_;                  // end of buff[] (ptr to last valid buff char)\n    char *valbuffp_;                  // pointer to first char in buff of integer being parsed\n    int   vals_[maxvals];             // value array for parsing #'s in ESC[#;#;#..\n    int   vali_;                      // parsing index into vals_[], 0 if none\n    int   save_row_, save_col_;       // used by ESC[s/u for save/restore\n\n    int append_buff(char c);\n    int append_val(void);\n\n  public:\n    EscapeSeq(void);\n    void reset(void);\n    char esc_mode(void) const;\n    void esc_mode(char val);\n    int  total_vals(void) const;\n    int  val(int i) const;\n    int  defvalmax(int dval, int max) const;\n    bool parse_in_progress(void) const;\n    bool is_csi(void) const;\n    int  parse(char c);\n    void save_cursor(int row, int col);\n    void restore_cursor(int &row, int &col);\n  };\n\n  // Partial UTF-8 Buffer Class ////////////////////////////////////////////\n  //\n  // Class to manage buffering partial UTF-8 characters between write calls.\n  //\n  class FL_EXPORT PartialUtf8Buf {\n    char buf_[10];      // buffer partial UTF-8 encoded char\n    int  buflen_;       // length of buffered UTF-8 encoded char\n    int  clen_;         // final byte length of a UTF-8 char\n  public:\n    void clear(void) { buflen_ = clen_ = 0; }    // clear the buffer\n    PartialUtf8Buf(void) { clear(); }            // Ctor\n    // Is byte 'c' in the middle of a UTF-8 encoded byte sequence?\n    bool is_continuation(char c) {\n      //           Byte 1    Byte 2    Byte 3   ..etc..\n      //   ASCII:  0xxxxxxx\n      // UTF8(2):  110xxxxx  10xxxxxx\n      // UTF8(3):  1110xxxx  10xxxxxx  10xxxxxx\n      // UTF8(4):  11110xxx  10xxxxxx  10xxxxxx  10xxxxxx\n      // UTF8(5):  111110xx  10xxxxxx  10xxxxxx  10xxxxxx  10xxxxxx\n      // UTF8(6):  1111110x  10xxxxxx  10xxxxxx  10xxxxxx  10xxxxxx  10xxxxxx\n      //           \\______/  \\______________________________________________/\n      //          Start byte           Continuation bytes\n      //                               (c & 0xc0) == 0x80\n      return ((c & 0xc0) == 0x80);\n    }\n    // Access buffer\n    const char* buf(void) const { return buf_; }\n    // Access buffer length\n    int buflen(void)      const { return buflen_; }\n    // Append bytes of a partial UTF-8 string to the buffer.\n    //\n    // Returns:\n    //   - true if done OK. Use is_complete() to see if a complete char received.\n    //   - false if buffer overrun occurred, class is clear()ed.\n    //\n    // An appropriate response to 'false' would be to print the\n    // \"unknown character\" and skip all subsequent UTF-8 continuation chars.\n    //\n    bool append(const char* p, int len) {\n      if (len <= 0) return true;                       // ignore silly requests: say we did but dont\n      if (buflen_ + len >= (int)sizeof(buf_))          // overrun check\n        { clear(); return false; }                     // clear self, return false\n      if (!buflen_) clen_ = fl_utf8len(*p);            // first byte? save char len for later\n      while (len>0) { buf_[buflen_++] = *p++; len--; } // append byte to buffer\n      return true;\n    }\n    bool is_complete(void) const { return (buflen_ && (buflen_ == clen_)); }\n  };\n\n  ///////////////////////////////////////////////////////////////\n  //////\n  ////// Fl_Terminal members + methods\n  //////\n  ///////////////////////////////////////////////////////////////\npublic:\n  /**\n    Vertical scrollbar. This is public so it can be accessed directly, e.g.\n\n    - \\ref Fl_Scrollbar::value(void) \"scrollbar->value(void)\" returns the row offset\n      from the bottom of the display, 0 being the bottom (default).\n    - \\ref Fl_Scrollbar::value(int) \"scrollbar->value(int)\" similarly sets the row offset,\n      which should be in the range [0 .. Fl_Scrollbar::maximum()].\n    - \\ref Fl_Scrollbar::step(double) \"scrollbar->step(double)\" sets the smoothness\n      of scrolling, default is 0.25 for 4 steps of motion per column.\n\n    \\todo Support scrollbar_left/right() - See Fl_Browser_::scrollbar docs\n    \\todo Support new ScrollbarStyle\n   */\n  Fl_Scrollbar  *scrollbar;         // vertical scrollbar (value: rows above disp_chars[])\n  /**\n    Horizontal scrollbar. This is public so it can be accessed directly, e.g.\n\n    - \\ref Fl_Scrollbar::value(void) \"hscrollbar->value(void)\" returns the column offset\n      position from the left edge of the display; 0 being the left edge (default).\n    - \\ref Fl_Scrollbar::value(int) \"hscrollbar->value(int)\" similarly sets the column offset,\n      which should be in the range [0 .. Fl_Scrollbar::maximum()].\n    - \\ref Fl_Scrollbar::step(double) \"hscrollbar->step(double)\" sets the smoothness\n      of scrolling, default is 0.25 for 4 steps of motion per column.\n   */\n  Fl_Scrollbar  *hscrollbar;        // horizontal scrollbar\nprivate:\n  // Special utf8 symbols\n  const char    *error_char_;       // utf8 string shown for invalid utf8, bad ANSI, etc\n  bool           fontsize_defer_;   // flag defers font calcs until first draw() (issue 837)\n  int            scrollbar_size_;   // local preference for scrollbar size\n  ScrollbarStyle hscrollbar_style_;\n  CharStyle     *current_style_;    // current font, attrib, color..\n  OutFlags       oflags_;           // output translation flags (CR_TO_LF, LF_TO_CR, LF_TO_CRLF)\n\n  // A ring buffer is used for the terminal's history (hist) and display (disp) buffer.\n  //    See README-Fl_Terminal.txt, section \"RING BUFFER DESCRIPTION\" for diagrams/info.\n  //\n  // Ring buffer\n  RingBuffer     ring_;             // terminal history/display ring buffer\n  Cursor         cursor_;           // terminal cursor (position, color, etc)\n  Margin         margin_;           // terminal margins (top,left,bottom,right)\n  Selection      select_;           // mouse selection\n  EscapeSeq      escseq;            // Escape sequence parsing (ESC[ xterm/vt100)\n  bool           show_unknown_;     // if true, show unknown chars as '¿' (default off)\n  bool           ansi_;             // if true, parse ansi codes (default on)\n  char          *tabstops_;         // array of tab stops (0|1)   \\__ TODO: This should probably\n  int            tabstops_size_;    // size of tabstops[] array   /         be a class \"TabStops\".\n  Fl_Rect        scrn_;             // terminal screen xywh inside box(), margins, and scrollbar\n  int            autoscroll_dir_;   // 0=autoscroll timer off, 3=scrolling up, 4=scrolling down\n  int            autoscroll_amt_;   // #pixels above or below edge, used for autoscroll speed\n  RedrawStyle    redraw_style_;     // NO_REDRAW, RATE_LIMITED, PER_WRITE\n  float          redraw_rate_;      // maximum redraw rate in seconds, default=0.10\n  bool           redraw_modified_;  // display modified; used by update_cb() to rate limit redraws\n  bool           redraw_timer_;     // if true, redraw timer is running\n  PartialUtf8Buf pub_;              // handles Partial Utf8 Buffer (pub)\n\nprotected:\n  // Ring buffer management\n  const Utf8Char* u8c_ring_row(int grow) const;\n  const Utf8Char* u8c_hist_row(int hrow) const;\n  const Utf8Char* u8c_hist_use_row(int hrow) const;\n  const Utf8Char* u8c_disp_row(int drow) const;\n  // Non-const versions of the above.\n  //     \"Effective C++\" says: implement non-const method to cast away const\n  //\n  Utf8Char* u8c_ring_row(int grow);\n  Utf8Char* u8c_hist_row(int hrow);\n  Utf8Char* u8c_hist_use_row(int hurow);\n  Utf8Char* u8c_disp_row(int drow);\n  Utf8Char* u8c_cursor(void);\nprivate:\n  void create_ring(int drows, int dcols, int hrows);\n  void init_(int X,int Y,int W,int H,const char*L,int rows,int cols,int hist,bool fontsize_defer);\n  // Tabstops\n  void init_tabstops(int newsize);\n  void default_tabstops(void);\n  void clear_all_tabstops(void);\n  void set_tabstop(void);\n  void clear_tabstop(void);\n  // Updates\n  void update_screen_xywh(void);\n  void update_screen(bool font_changed);\n  void set_scrollbar_params(Fl_Scrollbar* scroll, int min, int max);\n  void update_scrollbar(void);\n  // Resize\n  void resize_display_rows(int drows);\n  void resize_display_columns(int dcols);\n  void refit_disp_to_screen(void);\n  // Callbacks\n  static void scrollbar_cb(Fl_Widget*, void*);    // scrollbar manipulation\n  static void autoscroll_timer_cb(void*);         // mouse drag autoscroll\n  void        autoscroll_timer_cb2(void);\n  static void redraw_timer_cb(void*);             // redraw rate limiting timer\n  void        redraw_timer_cb2(void);\n\n  // Screen management\nprotected:\n  CharStyle& current_style(void) const;\n  void current_style(const CharStyle& sty);\nprivate:\n  int  x_to_glob_col(int X, int grow, int &gcol, bool &gcr) const;\n  int  xy_to_glob_rowcol(int X, int Y, int &grow, int &gcol, bool &gcr) const;\nprotected:\n  int  w_to_col(int W) const;\n  int  h_to_row(int H) const;\n  // API: Display clear operations\n  void clear_sod(void);\n  void clear_eod(void);\n  void clear_eol(void);\n  void clear_sol(void);\n  void clear_line(int row);\n  void clear_line(void);\n  const Utf8Char* walk_selection(const Utf8Char *u8c, int &row, int &col) const;\n  bool get_selection(int &srow,int &scol,int &erow,int &ecol) const;\n  bool is_selection(void) const;\n  bool is_inside_selection(int row,int col) const;\nprivate:\n  bool is_hist_ring_row(int grow) const;\n  bool is_disp_ring_row(int grow) const;\npublic:\n  int  selection_text_len(void) const;\n  const char* selection_text(void) const;\nprotected:\n  void clear_mouse_selection(void);\n  bool selection_extend(int X,int Y);\n  void select_word(int grow, int gcol);\n  void select_line(int grow);\n  void scroll(int rows);\n  void insert_rows(int count);\n  void delete_rows(int count);\n  void insert_char_eol(char c, int drow, int dcol, int rep);\n  void insert_char(char c, int rep);\n  void delete_chars(int drow, int dcol, int rep);\n  void delete_chars(int rep);\npublic:\n // API: Terminal operations\n  void clear(void);\n  void clear(Fl_Color val);\n  void clear_screen(bool scroll_to_hist=true);      // ESC [ 2 J\n  void clear_screen_home(bool scroll_to_hist=true); // ESC [ H ESC [ 2 J\n  void clear_history(void);                         // ESC [ 3 J\n  void reset_terminal(void);                        // ESC c\n  void cursor_home(void);                           // ESC [ 0 H\n // API: Cursor\n  void cursorfgcolor(Fl_Color val);\n  void cursorbgcolor(Fl_Color val);\n  Fl_Color cursorfgcolor(void) const;\n  Fl_Color cursorbgcolor(void) const;\nprotected:\n  void cursor_row(int row);\n  void cursor_col(int col);\npublic:\n  int  cursor_row(void) const;\n  int  cursor_col(void) const;\nprotected:\n  void cursor_up(int count=1, bool do_scroll=false);\n  void cursor_down(int count=1, bool do_scroll=false);\n  void cursor_left(int count=1);\n  void cursor_right(int count=1, bool do_scroll=false);\n  void cursor_eol(void);\n  void cursor_sol(void);\n  void cursor_cr(void);\n  void cursor_crlf(int count=1);\n  void cursor_tab_right(int count=1);\n  void cursor_tab_left(int count=1);\n  void save_cursor(void);\n  void restore_cursor(void);\n  // Output translation\npublic:\n  void output_translate(Fl_Terminal::OutFlags val);\n  Fl_Terminal::OutFlags output_translate(void) const;\nprivate:\n  void handle_lf(void);\n  void handle_cr(void);\n  void handle_esc(void);\n  // Printing\n  void handle_ctrl(char c);\n  bool is_printable(char c);\n  bool is_ctrl(char c);\n  void handle_SGR(void);\n  void handle_DECRARA(void);\n  void handle_escseq(char c);\n  // --\n  void display_modified(void);\n  void display_modified_clear(void);\n  void clear_char_at_disp(int drow, int dcol);\n  const Utf8Char* utf8_char_at_disp(int drow, int dcol) const;\n  const Utf8Char* utf8_char_at_glob(int grow, int gcol) const;\n  void repeat_char(char c, int rep);\n  void utf8_cache_clear(void);\n  void utf8_cache_flush(void);\n  // API: Character display output\npublic:\n  void plot_char(const char *text, int len, int drow, int dcol);\n  void plot_char(char c, int drow, int dcol);\n  void print_char(const char *text, int len=-1);\n  void print_char(char c);\n  // API: String display output\n  void append_utf8(const char *buf, int len=-1);\n  void append_ascii(const char *s);\n  void append(const char *s, int len=-1);\nprotected:\n  int handle_unknown_char(void);\n  int handle_unknown_char(int drow, int dcol);\n  // Drawing\n  void draw_row_bg(int grow, int X, int Y) const;\n  void draw_row(int grow, int Y) const;\n  void draw_buff(int Y) const;\nprivate:\n  void handle_selection_autoscroll(void);\n  int  handle_selection(int e);\npublic:\n  // FLTK: draw(), resize(), handle()\n  void draw(void) FL_OVERRIDE;\n  void resize(int X,int Y,int W,int H) FL_OVERRIDE;\n  int  handle(int e) FL_OVERRIDE;\n  const char* text(bool lines_below_cursor=false) const;\n\nprotected:\n  // Internal short names\n  //   Don't make these public, but allow internals and\n  //   derived classes to maintain brevity.\n  //\n  /// Return the number of rows in the ring buffer.\n  inline int ring_rows(void) const { return ring_.ring_rows(); }\n  /// Return the number of columns in the ring buffer.\n  inline int ring_cols(void) const { return ring_.ring_cols(); }\n  /// Return the starting row# in the ring buffer. (Always 0)\n  inline int ring_srow(void) const { return ring_.ring_srow(); }\n  /// Return the ending row# in the ring buffer (Always ring_rows()-1)\n  inline int ring_erow(void) const { return ring_.ring_erow(); }\n  /// Return the number of rows in the scrollback history.\n  inline int hist_rows(void) const { return ring_.hist_rows(); }\n  /// Return the number of columns in the scrollback history.\n  inline int hist_cols(void) const { return ring_.hist_cols(); }\n  /// Return the starting row# of the scrollback history.\n  inline int hist_srow(void) const { return ring_.hist_srow(); }\n  /// Return the ending row# of the scrollback history.\n  inline int hist_erow(void) const { return ring_.hist_erow(); }\n  /// Return number of rows in use by the scrollback history.\n  inline int hist_use(void)  const { return ring_.hist_use();  }\n  /// Return the starting row of the \"in use\" scrollback history.\n  inline int hist_use_srow(void) const { return ring_.hist_use_srow(); }\n  /// Return the number of rows in the display area.\n  inline int disp_rows(void) const { return ring_.disp_rows(); }\n  /// Return the number of columns in the display area.\n  inline int disp_cols(void) const { return ring_.disp_cols(); }\n  /// Return the starting row# in the display area.\n  inline int disp_srow(void) const { return ring_.disp_srow(); }\n  /// Return the ending row# in the display area.\n  inline int disp_erow(void) const { return ring_.disp_erow(); }\n  /// Returns the current offset into the ring buffer.\n  inline int offset(void) const    { return ring_.offset(); }\n\n  // TODO: CLEAN UP WHAT'S PUBLIC, AND WHAT SHOULD BE 'PROTECTED' AND 'PRIVATE'\n  //       Some of the public stuff should, quite simply, \"not be\".\n\n  // API: Terminal features\npublic:\n  // API: Scrollbar\n  int   scrollbar_size(void) const;\n  void  scrollbar_size(int val);\n  int   scrollbar_actual_size(void) const;\n  void  hscrollbar_style(ScrollbarStyle val);\n  ScrollbarStyle hscrollbar_style(void) const;\n  // API: History\n  int   history_rows(void) const;\n  void  history_rows(int val);\n  int   history_use(void) const;\n  // API: Display\n  int   display_rows(void) const;\n  void  display_rows(int val);\n  int   display_columns(void) const;\n  void  display_columns(int val);\n  // API: Box\n  /// Sets the box type, updates terminal margins et al. Default is FL_DOWN_FRAME.\n  ///\n  /// FL_XXX_FRAME types are handled in a special way by this widget, and guarantee\n  /// the background is a flat field.\n  ///\n  /// FL_XXX_BOX may draw gradients as inherited by Fl::scheme().\n  ///\n  void  box(Fl_Boxtype val) { Fl_Group::box(val); update_screen(false); }\n  /// Returns the current box type.\n  Fl_Boxtype box(void) const { return Fl_Group::box(); }\n  // API: Margins\n  /// Return the left margin; see \\ref Fl_Terminal_Margins.\n  int   margin_left(void)   const  { return margin_.left();   }\n  /// Return the right margin; see \\ref Fl_Terminal_Margins.\n  int   margin_right(void)  const  { return margin_.right();  }\n  /// Return the top margin; see \\ref Fl_Terminal_Margins.\n  int   margin_top(void)    const  { return margin_.top();    }\n  /// Return the bottom margin; see \\ref Fl_Terminal_Margins.\n  int   margin_bottom(void) const  { return margin_.bottom(); }\n  void  margin_left(int val);\n  void  margin_right(int val);\n  void  margin_top(int val);\n  void  margin_bottom(int val);\n  // API: Text font/size/color\n  void  textfont(Fl_Font val);\n  void  textsize(Fl_Fontsize val);\n  void  textcolor(Fl_Color val);\n  void  color(Fl_Color val);\n  void  textfgcolor(Fl_Color val);\n  void  textbgcolor(Fl_Color val);\n  void  textfgcolor_default(Fl_Color val);\n  void  textbgcolor_default(Fl_Color val);\n  /// Return text font used to draw all text in the terminal.\n  Fl_Font     textfont(void)      const { return current_style_->fontface(); }\n  /// Return text font size used to draw all text in the terminal.\n  Fl_Fontsize textsize(void)      const { return current_style_->fontsize(); }\n  /// Return base widget Fl_Group's box() color()\n  Fl_Color    color(void)         const { return Fl_Group::color(); }\n  /// Return textcolor(). This is a convenience method that returns textfgcolor_default()\n  Fl_Color    textcolor(void)     const { return textfgcolor_default(); }\n  /// Return text's current foreground color.\n  Fl_Color    textfgcolor(void)   const { return current_style_->fgcolor(); }\n  /// Return text's current background color.\n  Fl_Color    textbgcolor(void)   const { return current_style_->bgcolor(); }\n  /// Return text's default foreground color. \\see textfgcolor()\n  Fl_Color    textfgcolor_default(void)   const { return current_style_->defaultfgcolor(); }\n  /// Return text's default background color. \\see textbgcolor()\n  Fl_Color    textbgcolor_default(void)   const { return current_style_->defaultbgcolor(); }\n  void        textfgcolor_xterm(uchar val);\n  void        textbgcolor_xterm(uchar val);\n  /// Set mouse selection foreground color.\n  void selectionfgcolor(Fl_Color val) { select_.selectionfgcolor(val); }\n  /// Set mouse selection background color.\n  void selectionbgcolor(Fl_Color val) { select_.selectionbgcolor(val); }\n  /// Get mouse selection foreground color.\n  Fl_Color selectionfgcolor(void) const { return select_.selectionfgcolor(); }\n  /// Get mouse selection background color.\n  Fl_Color selectionbgcolor(void) const { return select_.selectionbgcolor(); }\n  // API: Text attrib\n  void textattrib(uchar val);\n  uchar textattrib() const;\n  // API: Redraw style/rate\n  RedrawStyle redraw_style(void) const;\n  void  redraw_style(RedrawStyle val);\nprivate:\n  bool  is_redraw_style(RedrawStyle val) { return redraw_style_ == val; }\npublic:\n  float redraw_rate(void) const;\n  void  redraw_rate(float val);\n  // API: Show unknown/invalid utf8/ANSI sequences with an error character (¿).\n  bool  show_unknown(void) const;\n  void  show_unknown(bool val);\n  /// Sets the \"error character\" utf8 string shown for invalid utf8\n  /// or bad ANSI sequences if show_unknown() is true. Default: \"¿\".\n  /// \\see show_unknown(bool)\n  void error_char(const char* val) { error_char_ = val; }\n  /// Returns the \"error character\" utf8 string, which is shown for invalid utf8\n  /// or bad ANSI sequences if show_unknown() is true. \\see show_unknown(bool)\n  const char* error_char(void) const { return error_char_; }\n  // API: ANSI sequences\n  bool  ansi(void) const;\n  void  ansi(bool val);\n  // Fl_Simple_Terminal API compatibility\n  int   history_lines(void) const;\n  void  history_lines(int val);\n  // API: printf()\n  void  printf(const char *fmt, ...);\n  void  vprintf(const char *fmt, va_list ap);\n  // Ctor\n  Fl_Terminal(int X,int Y,int W,int H,const char*L=0);\n  Fl_Terminal(int X,int Y,int W,int H,const char*L,int rows,int cols,int hist);\n  // Dtor\n  ~Fl_Terminal(void);\n  // Debugging features\n//DEBUG  void show_ring_info() const { ring_.show_ring_info(); }\n//DEBUG  void write_row(FILE *fp, Utf8Char *u8c, int cols) const;\n//DEBUG  void show_buffers(RingBuffer *a, RingBuffer *b=0) const;\n};\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Text_Buffer.H",
    "content": "//\n// Header file for Fl_Text_Buffer class.\n//\n// Copyright 2001-2023 by Bill Spitzak and others.\n// Original code Copyright Mark Edel.  Permission to distribute under\n// the LGPL for the FLTK library granted by Mark Edel.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n Fl_Text_Buffer, Fl_Text_Selection widget . */\n\n#ifndef FL_TEXT_BUFFER_H\n#define FL_TEXT_BUFFER_H\n\n#include <stdarg.h>     /* va_list */\n#include \"fl_attr.h\"    /* Doxygen can't find <FL/fl_attr.h> */\n\n#undef ASSERT_UTF8\n\n#ifdef ASSERT_UTF8\n# include <assert.h>\n# define IS_UTF8_ALIGNED(a) if (a && *a) assert(fl_utf8len(*(a))>0);\n# define IS_UTF8_ALIGNED2(a, b) if (b>=0 && b<a->length()) assert(fl_utf8len(a->byte_at(b))>0);\n#else\n# define IS_UTF8_ALIGNED(a)\n# define IS_UTF8_ALIGNED2(a, b)\n#endif\n\n\n/*\n \"character size\" is the size of a UTF-8 character in bytes\n \"character width\" is the width of a Unicode character in pixels\n \"column\" was originally defined as a character offset from the left margin.\n It was identical to the byte offset. In UTF-8, we have neither a byte offset\n nor truly fixed width fonts (*). Column could be a pixel value multiplied with\n an average character width (which is a bearable approximation).\n\n * in Unicode, there are no fixed width fonts! Even if the ASCII characters may\n   happen to be all the same width in pixels, Chinese characters surely are not.\n   There are plenty of exceptions, like ligatures, that make special handling of\n   \"fixed\" character widths a nightmare. I decided to remove all references to\n   fixed fonts and see \"columns\" as a multiple of the average width of a\n   character in the main font.\n     - Matthias\n */\n\n\n/* Maximum length in characters of a tab or control character expansion\n   of a single buffer character */\n#define FL_TEXT_MAX_EXP_CHAR_LEN 20\n\n#include \"Fl_Export.H\"\n\nclass Fl_Text_Undo_Action_List;\nclass Fl_Text_Undo_Action;\n\n/**\n  \\class Fl_Text_Selection\n  \\brief This is an internal class for Fl_Text_Buffer to manage text selections.\n\n  All methods use byte (not UTF-8 character) offsets and start at 0. This\n  class works correctly with UTF-8 strings assuming that the parameters\n  for all calls are on character boundaries.\n\n  If the selection is inactive (not currently used), then selected()\n  returns \\p false and start() and end() return 0 (zero).\n\n  The stored offsets are in ascending order, hence the following conditions\n  are true (pseudo code):\n  \\code\n    if ( !selected() ) :  (start() == 0) && (end() == 0) && (start() == end())\n    if (  selected() ) :  start() < end()\n    always             :  0 <= start() <= end()\n    always             :  length() == end() - start()\n  \\endcode\n\n  The selection size in bytes can always (unconditionally) be computed by\n  \\code\n    int size = sel->end() - sel->start();\n  \\endcode\n\n  \\see length()\n\n  \\note\n    The \\b protected member variables \\p mStart and \\p mEnd are not\n    necessarily 0 (zero) if mSelected == \\p false because they are\n    not cleared when \\p selected(false) is called (as of Jul 2017).\n    This may be changed in the future.\n*/\nclass FL_EXPORT Fl_Text_Selection {\n  friend class Fl_Text_Buffer;\n\npublic:\n\n  // Sets the selection range and selected().\n  void set(int startpos, int endpos);\n\n  // Updates a selection after text was modified.\n  void update(int pos, int nDeleted, int nInserted);\n\n  /**\n    \\brief Returns the byte offset to the first selected character.\n\n    The returned offset is only valid if selected() returns true.\n    If the selection is not valid the returned offset is 0 since FLTK 1.4.0.\n\n    \\note In FLTK 1.3.x the returned offset could be non-zero even if\n      selected() would have returned 0.\n\n    \\return byte offset or 0 if not selected.\n  */\n  int start() const { return mSelected ? mStart : 0; }\n\n  /**\n    \\brief Returns the byte offset to the character after the last selected character.\n\n    The returned offset is only valid if selected() returns true (non-zero).\n    The offset is 0 if no text is selected (since FLTK 1.4.0).\n\n    \\note In FLTK 1.3.x the returned offset could be non-zero even if\n      selected() would have returned 0.\n\n    \\return byte offset or 0 if not selected.\n  */\n  int end() const { return mSelected ? mEnd : 0; }\n\n  /**\n   \\brief Returns true if any text is selected.\n   \\return  \\p true if any text has been selected, or \\p false\n            if no text is selected.\n  */\n  bool selected() const { return mSelected; }\n\n  /**\n    \\brief Modifies the 'selected' flag.\n    \\param b new flag\n  */\n  void selected(bool b) { mSelected = b; }\n\n  /**\n    \\brief Returns the size in bytes of the selection.\n\n    This is a convenience method. It always returns the same as\n    \\code\n      end() - start()\n    \\endcode\n    and it returns 0 if selected() == false.\n\n    \\return size in bytes or 0 if not selected.\n\n    \\since FLTK 1.4.0\n  */\n  int length() const { return mSelected ? mEnd - mStart : 0; }\n\n  // Returns true if position \\p pos is in this Fl_Text_Selection.\n  int includes(int pos) const;\n\n  // Returns true if selected() and the positions of this selection.\n  int selected(int *startpos, int *endpos) const;\n  FL_DEPRECATED(\"since 1.4.0 - use selected(startpos, endpos) instead\",\n  int position(int *startpos, int *endpos) const) { return selected(startpos, endpos); }\n\nprotected:\n\n  int mStart;         ///< byte offset to the first selected character\n  int mEnd;           ///< byte offset to the character after the last selected character\n  bool mSelected;     ///< this flag is set if any text is selected\n};\n\n\ntypedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted,\n                                  int nRestyled, const char* deletedText,\n                                  void* cbArg);\n\n\ntypedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg);\n\n\n/**\n This class manages Unicode text displayed in one or more Fl_Text_Display widgets.\n\n All text in Fl_Text_Buffer must be encoded in UTF-8. All indices used in the\n function calls must be aligned to the start of a UTF-8 sequence. All indices\n and pointers returned will be aligned. All functions that return a single\n character will return that in an unsigned int in UCS-4 encoding.\n\n The Fl_Text_Buffer class is used by the Fl_Text_Display and Fl_Text_Editor\n to manage complex text data and is based upon the excellent NEdit text\n editor engine - see https://sourceforge.net/projects/nedit/.\n */\nclass FL_EXPORT Fl_Text_Buffer {\npublic:\n\n  /**\n   Create an empty text buffer of a pre-determined size.\n   \\param requestedSize use this to avoid unnecessary re-allocation\n    if you know exactly how much the buffer will need to hold\n   \\param preferredGapSize Initial size for the buffer gap (empty space\n    in the buffer where text might be inserted\n    if the user is typing sequential characters)\n   */\n  Fl_Text_Buffer(int requestedSize = 0, int preferredGapSize = 1024);\n\n  /**\n   Frees a text buffer\n   */\n  ~Fl_Text_Buffer();\n\n  /**\n   \\brief Returns the number of bytes in the buffer.\n   \\return size of text in bytes\n   */\n  int length() const { return mLength; }\n\n  /**\n   \\brief Get a copy of the entire contents of the text buffer.\n   Memory is allocated to contain the returned string, which the caller\n   must free.\n   \\return newly allocated text buffer - must be free'd, text is UTF-8\n   */\n  char* text() const;\n\n  /**\n   Replaces the entire contents of the text buffer.\n   \\param text Text must be valid UTF-8. If null, an empty string is substituted.\n   */\n  void text(const char* text);\n\n  /**\n   \\brief Get a copy of a part of the text buffer.\n   Return a copy of the text between \\p start and \\p end character positions\n   from text buffer \\p buf. Positions start at 0, and the range does not\n   include the character pointed to by \\p end.\n   When you are done with the text, free it using the free() function.\n   \\param start byte offset to first character\n   \\param end byte offset after last character in range\n   \\return newly allocated text buffer - must be free'd, text is UTF-8\n   */\n  char* text_range(int start, int end) const;\n\n  /**\n   Returns the character at the specified position \\p pos in the buffer.\n   Positions start at 0.\n   \\param pos byte offset into buffer, \\p pos must be at a UTF-8 character boundary\n   \\return Unicode UCS-4 encoded character\n   */\n  unsigned int char_at(int pos) const;\n\n  /**\n   Returns the raw byte at the specified position pos in the buffer.\n   Positions start at 0.\n   \\param pos byte offset into buffer\n   \\return unencoded raw byte\n   */\n  char byte_at(int pos) const;\n\n  /**\n   Convert a byte offset in buffer into a memory address.\n   \\param pos byte offset into buffer\n   \\return byte offset converted to a memory address\n   */\n  const char *address(int pos) const\n  { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; }\n\n  /**\n   Convert a byte offset in buffer into a memory address.\n   \\param pos byte offset into buffer\n   \\return byte offset converted to a memory address\n   */\n  char *address(int pos)\n  { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; }\n\n  /**\n   Inserts null-terminated string \\p text at position \\p pos.\n   \\param pos insertion position as byte offset (must be UTF-8 character aligned)\n   \\param text UTF-8 encoded text\n   \\param insertedLength number of bytes to insert, or -1 to indicate \\p text is null-terminated\n   */\n  void insert(int pos, const char* text, int insertedLength = -1);\n\n  /**\n   Appends the text string to the end of the buffer.\n   \\param t UTF-8 encoded text\n   \\param addedLength number of bytes to append, or -1 to indicate \\p t is null-terminated\n   */\n  void append(const char* t, int addedLength = -1) { insert(length(), t, addedLength); }\n\n  void vprintf(const char *fmt, va_list ap);\n  void printf(const char* fmt, ...);\n\n  /**\n   Deletes a range of characters in the buffer.\n   \\param start byte offset to first character to be removed\n   \\param end byte offset to character after last character to be removed\n   */\n  void remove(int start, int end);\n\n  /**\n   Deletes the characters between \\p start and \\p end, and inserts the\n   null-terminated string \\p text in their place in the buffer.\n   \\param start byte offset to first character to be removed and new insert position\n   \\param end byte offset to character after last character to be removed\n   \\param text UTF-8 encoded text\n   \\param insertedLength number of bytes to insert, or -1 to indicate \\p text is null-terminated\n   */\n  void replace(int start, int end, const char *text, int insertedLength = -1);\n\n  /**\n   Copies text from another Fl_Text_Buffer to this one.\n   \\param fromBuf source text buffer, may be the same as this\n   \\param fromStart byte offset into buffer\n   \\param fromEnd byte offset into buffer\n   \\param toPos destination byte offset into buffer\n   */\n  void copy(Fl_Text_Buffer* fromBuf, int fromStart, int fromEnd, int toPos);\n\n  /**\n   Undo text modification according to the undo variables or insert text\n   from the undo buffer\n   */\n  int undo(int *cp=0);\n\n  /**\n   Check if undo is enabled and if the last action can be undone.\n   \\see canUndo()\n   */\n  bool can_undo() const;\n\n  /**\n   Redo previous undo action.\n   */\n  int redo(int *cp=0);\n\n  /**\n   Check if undo is enabled and if the last undo action can be redone.\n   \\see canUndo()\n   */\n  bool can_redo() const;\n\n  /**\n   Enable or disable undo actions for this text buffer.\n   Undo actions are enable for text buffer by default. If used as a style buffer\n   in Fl_Text_Display, undo actions are disabled as they are handled by the\n   text buffer.\n   \\see can_undo()\n   */\n  void canUndo(char flag=1);\n\n  /**\n   Inserts a file at the specified position.\n   Returns\n    - 0 on success\n    - non-zero on error (strerror() contains reason)\n    - 1 indicates open for read failed (no data loaded)\n    - 2 indicates error occurred while reading data (data was partially loaded)\n\n   File can be UTF-8 or CP1252 encoded.\n   If the input file is not UTF-8 encoded, the Fl_Text_Buffer widget will\n   contain data transcoded to UTF-8. By default, the message\n   Fl_Text_Buffer::file_encoding_warning_message\n   will warn the user about this.\n   \\see input_file_was_transcoded and transcoding_warning_action.\n   */\n  int insertfile(const char *file, int pos, int buflen = 128*1024);\n\n  /**\n   Appends the named file to the end of the buffer. See also insertfile().\n   */\n  int appendfile(const char *file, int buflen = 128*1024)\n  { return insertfile(file, length(), buflen); }\n\n  /**\n   Loads a text file into the buffer. See also insertfile().\n   */\n  int loadfile(const char *file, int buflen = 128*1024)\n  { select(0, length()); remove_selection(); return appendfile(file, buflen); }\n\n  /**\n   Writes the specified portions of the text buffer to a file.\n   Returns\n    - 0 on success\n    - non-zero on error (strerror() contains reason)\n    - 1 indicates open for write failed (no data saved)\n    - 2 indicates error occurred while writing data (data was partially saved)\n\n   \\see savefile(const char *file, int buflen)\n   */\n  int outputfile(const char *file, int start, int end, int buflen = 128*1024);\n\n  /**\n   Saves a text file from the current buffer.\n   Returns\n    - 0 on success\n    - non-zero on error (strerror() contains reason)\n    - 1 indicates open for write failed (no data saved)\n    - 2 indicates error occurred while writing data (data was partially saved)\n\n   \\see outputfile(const char *file, int start, int end, int buflen)\n   */\n  int savefile(const char *file, int buflen = 128*1024)\n  { return outputfile(file, 0, length(), buflen); }\n\n  /**\n   Gets the tab width.\n\n   The tab width is measured in characters. The pixel position is\n   calculated using an average character width.\n   */\n  int tab_distance() const { return mTabDist; }\n\n  /**\n   Set the hardware tab distance (width) used by all displays for this buffer,\n   and used in computing offsets for rectangular selection operations.\n   */\n  void tab_distance(int tabDist);\n\n  /**\n   Selects a range of characters in the buffer.\n   */\n  void select(int start, int end);\n\n  /**\n   Returns a non-zero value if text has been selected, 0 otherwise.\n   */\n  int selected() const { return mPrimary.selected(); }\n\n  /**\n   Cancels any previous selection on the primary text selection object.\n   */\n  void unselect();\n\n  /**\n   Gets the selection position.\n   */\n  int selection_position(int* start, int* end);\n\n  /**\n   Returns the currently selected text.\n\n   When you are done with the text, free it using the free() function.\n   */\n  char* selection_text();\n\n  /**\n   Removes the text in the primary selection.\n   */\n  void remove_selection();\n\n  /**\n   Replaces the text in the primary selection.\n   */\n  void replace_selection(const char* text);\n\n  /**\n   Selects a range of characters in the secondary selection.\n   */\n  void secondary_select(int start, int end);\n\n  /**\n   Returns a non-zero value if text has been selected in the secondary\n   text selection, 0 otherwise.\n   */\n  int secondary_selected() { return mSecondary.selected(); }\n\n  /**\n   Clears any selection in the secondary text selection object.\n   */\n  void secondary_unselect();\n\n  /**\n   Returns the current selection in the secondary text selection object.\n   */\n  int secondary_selection_position(int* start, int* end);\n\n  /**\n   Returns the text in the secondary selection.\n\n   When you are done with the text, free it using the free() function.\n   */\n  char* secondary_selection_text();\n\n  /**\n   Removes the text from the buffer corresponding to the secondary text\n   selection object.\n   */\n  void remove_secondary_selection();\n\n  /**\n   Replaces the text from the buffer corresponding to the secondary\n   text selection object with the new string \\p text.\n   */\n  void replace_secondary_selection(const char* text);\n\n  /**\n   Highlights the specified text within the buffer.\n   */\n  void highlight(int start, int end);\n\n  /**\n   Returns a non-zero value if text has been highlighted, 0 otherwise.\n   */\n  int highlight() { return mHighlight.selected(); }\n\n  /**\n   Unhighlights text in the buffer.\n   */\n  void unhighlight();\n\n  /**\n   Highlights the specified text between \\p start and \\p end within the buffer.\n   */\n  int highlight_position(int* start, int* end);\n\n  /**\n   Returns the highlighted text.\n\n   When you are done with the text, free it using the free() function.\n   */\n  char* highlight_text();\n\n  /**\n   Adds a callback function that is called whenever the text buffer is modified.\n\n   The callback function is declared as follows:\n\n   \\code\n   typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted,\n      int nRestyled, const char* deletedText,\n      void* cbArg);\n   \\endcode\n   */\n  void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg);\n\n  /**\n   Removes a modify callback.\n   */\n  void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg);\n\n  /**\n   Calls all modify callbacks that have been registered using\n   the add_modify_callback() method.\n   */\n  void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); }\n\n  /**\n   Adds a callback routine to be called before text is deleted from the buffer.\n   */\n  void add_predelete_callback(Fl_Text_Predelete_Cb bufPredelCB, void* cbArg);\n\n  /**\n   Removes a callback routine \\p bufPreDeleteCB associated with argument \\p cbArg\n   to be called before text is deleted from the buffer.\n   */\n  void remove_predelete_callback(Fl_Text_Predelete_Cb predelCB, void* cbArg);\n\n  /**\n   Calls the stored pre-delete callback procedure(s) for this buffer to update\n   the changed area(s) on the screen and any other listeners.\n   */\n  void call_predelete_callbacks() { call_predelete_callbacks(0, 0); }\n\n  /**\n   Returns the text from the entire line containing the specified\n   character position.\n\n   When you are done with the text, free it using the free() function.\n   \\param pos byte index into buffer\n   \\return copy of UTF-8 text, must be free'd\n   */\n  char* line_text(int pos) const;\n\n  /**\n   Returns the position of the start of the line containing position \\p pos.\n   \\param pos byte index into buffer\n   \\return byte offset to line start\n   */\n  int line_start(int pos) const;\n\n  /**\n   Finds and returns the position of the end of the line containing position\n   \\p pos (which is either a pointer to the newline character ending the line\n   or a pointer to one character beyond the end of the buffer).\n   \\param pos byte index into buffer\n   \\return byte offset to line end\n   */\n  int line_end(int pos) const;\n\n  /**\n   Returns the position corresponding to the start of the word.\n   \\param pos byte index into buffer\n   \\return byte offset to word start\n   */\n  int word_start(int pos) const;\n\n  /**\n   Returns the position corresponding to the end of the word.\n   \\param pos byte index into buffer\n   \\return byte offset to word end\n   */\n  int word_end(int pos) const;\n\n  /**\n   Count the number of displayed characters between buffer position\n   \\p lineStartPos and \\p targetPos.\n\n   Displayed characters are the characters shown on the screen to represent\n   characters in the buffer, where tabs and control characters are expanded.\n   */\n  int count_displayed_characters(int lineStartPos, int targetPos) const;\n\n  /**\n   Count forward from buffer position \\p startPos in displayed characters.\n\n   Displayed characters are the characters shown on the screen to represent\n   characters in the buffer, where tabs and control characters are expanded.\n   \\param lineStartPos byte offset into buffer\n   \\param nChars number of bytes that are sent to the display\n   \\return byte offset in input after all output bytes are sent\n   */\n  int skip_displayed_characters(int lineStartPos, int nChars);\n\n  /**\n   Counts the number of newlines between \\p startPos and \\p endPos in buffer.\n   The character at position \\p endPos is not counted.\n   */\n  int count_lines(int startPos, int endPos) const;\n\n  /**\n   Estimate the number of newlines between \\p startPos and \\p endPos in buffer.\n   This call takes line wrapping into account. It assumes a line break at every\n   `lineLen` characters after the beginning of a line.\n   */\n  int estimate_lines(int startPos, int endPos, int lineLen) const;\n\n  /**\n   Finds the first character of the line \\p nLines forward from \\p startPos\n   in the buffer and returns its position.\n   */\n  int skip_lines(int startPos, int nLines);\n\n  /**\n   Finds and returns the position of the first character of the line \\p nLines\n   backwards from \\p startPos (not counting the character pointed to by\n   \\p startpos if that is a newline) in the buffer.\n   \\p nLines == 0 means find the beginning of the line.\n   */\n  int rewind_lines(int startPos, int nLines);\n\n  /**\n   Finds the next occurrence of the specified character.\n   Search forwards in buffer for character \\p searchChar, starting\n   with the character \\p startPos, and returning the result in \\p foundPos.\n   Returns 1 if found, 0 if not.\n   The difference between this and search_forward() is that it's optimized\n   for single characters. The overall performance of the text widget is\n   dependent on its ability to count lines quickly, hence searching for a\n   single character: newline.\n   \\param startPos byte offset to start position\n   \\param searchChar UCS-4 character that we want to find\n   \\param foundPos byte offset where the character was found\n   \\return 1 if found, 0 if not\n   */\n  int findchar_forward(int startPos, unsigned searchChar, int* foundPos) const;\n\n  /**\n   Search backwards in buffer \\p buf for character \\p searchChar, starting\n   with the character \\e before \\p startPos, returning the result in \\p foundPos.\n\n   Returns 1 if found, 0 if not.  The difference between this and\n   search_backward() is that it's optimized for single characters.  The\n   overall performance of the text widget is dependent on its ability to\n   count lines quickly, hence searching for a single character: newline.\n   \\param startPos byte offset to start position\n   \\param searchChar UCS-4 character that we want to find\n   \\param foundPos byte offset where the character was found\n   \\return 1 if found, 0 if not\n   */\n  int findchar_backward(int startPos, unsigned int searchChar, int* foundPos) const;\n\n  /**\n   Search forwards in buffer for string \\p searchString, starting with the\n   character \\p startPos, and returning the result in \\p foundPos.\n\n   Returns 1 if found, 0 if not.\n   \\param startPos byte offset to start position\n   \\param searchString UTF-8 string that we want to find\n   \\param foundPos byte offset where the string was found\n   \\param matchCase if set, match character case\n   \\return 1 if found, 0 if not\n   */\n  int search_forward(int startPos, const char* searchString, int* foundPos,\n                     int matchCase = 0) const;\n\n  /**\n   Search backwards in buffer for string \\p searchString, starting with\n   the character \\e at \\p startPos, returning the result in \\p foundPos.\n\n   Returns 1 if found, 0 if not.\n   \\param startPos byte offset to start position\n   \\param searchString UTF-8 string that we want to find\n   \\param foundPos byte offset where the string was found\n   \\param matchCase if set, match character case\n   \\return 1 if found, 0 if not\n   */\n  int search_backward(int startPos, const char* searchString, int* foundPos,\n                      int matchCase = 0) const;\n\n  /**\n   Returns the primary selection.\n   */\n  const Fl_Text_Selection* primary_selection() const { return &mPrimary; }\n\n  /**\n   Returns the primary selection.\n   */\n  Fl_Text_Selection* primary_selection() { return &mPrimary; }\n\n  /**\n   Returns the secondary selection.\n   */\n  const Fl_Text_Selection* secondary_selection() const { return &mSecondary; }\n\n  /**\n   Returns the current highlight selection.\n   */\n  const Fl_Text_Selection* highlight_selection() const { return &mHighlight; }\n\n  /**\n   Returns the index of the previous character.\n   \\param ix index to the current character\n   */\n  int prev_char(int ix) const;\n  int prev_char_clipped(int ix) const;\n\n  /**\n   Returns the index of the next character.\n   \\param ix index to the current character\n   */\n  int next_char(int ix) const;\n  int next_char_clipped(int ix) const;\n\n  /**\n   Align an index into the buffer to the current or previous UTF-8 boundary.\n   */\n  int utf8_align(int) const;\n\n  /**\n   \\brief true if the loaded file has been transcoded to UTF-8.\n   */\n  int input_file_was_transcoded;\n\n  /** This message may be displayed using the fl_alert() function when a file\n   which was not UTF-8 encoded is input.\n   */\n  static const char* file_encoding_warning_message;\n\n  /**\n   \\brief Pointer to a function called after reading a non UTF-8 encoded file.\n\n   This function is called after reading a file if the file content\n   was transcoded to UTF-8. Its default implementation calls fl_alert()\n   with the text of \\ref file_encoding_warning_message. No warning message is\n   displayed if this pointer is set to NULL. Use \\ref input_file_was_transcoded\n   to be informed if file input required transcoding to UTF-8.\n   */\n  void (*transcoding_warning_action)(Fl_Text_Buffer*);\n  bool is_word_separator(int pos) const;\n\nprotected:\n\n  /**\n   Calls the stored modify callback procedure(s) for this buffer to update the\n   changed area(s) on the screen and any other listeners.\n   */\n  void call_modify_callbacks(int pos, int nDeleted, int nInserted,\n                             int nRestyled, const char* deletedText) const;\n\n  /**\n   Calls the stored pre-delete callback procedure(s) for this buffer to update\n   the changed area(s) on the screen and any other listeners.\n   */\n  void call_predelete_callbacks(int pos, int nDeleted) const;\n\n  /**\n   Internal (non-redisplaying) version of insert().\n\n   Returns the length of text inserted (this is just strlen(\\p text) if\n   \\p insertedLength == -1, however\n   this calculation can be expensive and the length will be required by any\n   caller who will continue on to call redisplay). \\p pos must be contiguous\n   with the existing text in the buffer (i.e. not past the end).\n   \\return the number of bytes inserted\n   */\n  int insert_(int pos, const char* text, int insertedLength = -1);\n\n  /**\n   Internal (non-redisplaying) version of remove().\n\n   Removes the contents of the buffer between \\p start and \\p end (and moves\n   the gap to the site of the delete).\n   */\n  void remove_(int start, int end);\n\n  /**\n   Calls the stored redisplay procedure(s) for this buffer to update the\n   screen for a change in a selection.\n   */\n  void redisplay_selection(Fl_Text_Selection* oldSelection,\n                           Fl_Text_Selection* newSelection) const;\n\n  /**\n   Move the gap to start at a new position.\n   */\n  void move_gap(int pos);\n\n  /**\n   Reallocates the text storage in the buffer to have a gap starting at \\p newGapStart\n   and a gap size of \\p newGapLen, preserving the buffer's current contents.\n   */\n  void reallocate_with_gap(int newGapStart, int newGapLen);\n\n  char* selection_text_(Fl_Text_Selection* sel) const;\n\n  /**\n   Removes the text from the buffer corresponding to \\p sel.\n   */\n  void remove_selection_(Fl_Text_Selection* sel);\n\n  /**\n   Replaces the \\p text in selection \\p sel.\n   */\n  void replace_selection_(Fl_Text_Selection* sel, const char* text);\n\n  /**\n   Updates all of the selections in the buffer for changes in the buffer's text\n   */\n  void update_selections(int pos, int nDeleted, int nInserted);\n\n  /**\n   Apply the current undo/redo operation, called from undo() or redo().\n   */\n  int apply_undo(Fl_Text_Undo_Action* action, int* cursorPos);\n\n  Fl_Text_Selection mPrimary;     /**< highlighted areas */\n  Fl_Text_Selection mSecondary;   /**< highlighted areas */\n  Fl_Text_Selection mHighlight;   /**< highlighted areas */\n  int mLength;                    /**< length of the text in the buffer (the length\n                                       of the buffer itself must be calculated:\n                                       gapEnd - gapStart + length) */\n  char* mBuf;                     /**< allocated memory where the text is stored */\n  int mGapStart;                  /**< points to the first character of the gap */\n  int mGapEnd;                    /**< points to the first character after the gap */\n  // The hardware tab distance used by all displays for this buffer,\n  // and used in computing offsets for rectangular selection operations.\n  int mTabDist;                   /**< equiv. number of characters in a tab */\n  int mNModifyProcs;              /**< number of modify-redisplay procs attached */\n  Fl_Text_Modify_Cb *mModifyProcs;/**< procedures to call when buffer is\n                                       modified to redisplay contents */\n  void** mCbArgs;                 /**< caller arguments for modifyProcs above */\n  int mNPredeleteProcs;           /**< number of pre-delete procs attached */\n  Fl_Text_Predelete_Cb *mPredeleteProcs; /**< procedure to call before text is deleted\n                                       from the buffer; at most one is supported. */\n  void **mPredeleteCbArgs;        /**< caller argument for pre-delete proc above */\n  int mCursorPosHint;             /**< hint for reasonable cursor position after\n                                       a buffer modification operation */\n  char mCanUndo;                  /**< if this buffer is used for attributes, it must\n                                       not do any undo calls */\n  int mPreferredGapSize;          /**< the default allocation for the text gap is 1024\n                                       bytes and should only be increased if frequent\n                                       and large changes in buffer size are expected */\n  Fl_Text_Undo_Action* mUndo;     /**< local undo event */\n  Fl_Text_Undo_Action_List* mUndoList; /**< List of undo event */\n  Fl_Text_Undo_Action_List* mRedoList; /**< List of redo event */\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Text_Display.H",
    "content": "//\n// Header file for Fl_Text_Display class.\n//\n// Copyright 2001-2023 by Bill Spitzak and others.\n// Original code Copyright Mark Edel.  Permission to distribute under\n// the LGPL for the FLTK library granted by Mark Edel.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n Fl_Text_Display widget . */\n\n#ifndef FL_TEXT_DISPLAY_H\n#define FL_TEXT_DISPLAY_H\n\n#include <FL/Fl.H>              // Fl::scrollbar_size()\n#include \"fl_draw.H\"\n#include \"Fl_Group.H\"\n#include \"Fl_Widget.H\"\n#include \"Fl_Scrollbar.H\"\n#include \"Fl_Text_Buffer.H\"\n\n/**\n \\brief Rich text display widget.\n\n This is the FLTK text display widget. It allows the user to view\n multiple lines of text and supports highlighting, word wrap, mixes\n of font faces and colors, line numbers and scrolling.  The buffer\n that is displayed in the widget is managed by the Fl_Text_Buffer\n class. A single Text Buffer can be displayed by multiple Text\n Displays.\n\n \\image html editor.png \"Fl_Text_Display widget\"\n \\image latex editor.png \"Fl_Text_Display widget\" width=10cm\n <BR><BR>\n \\image html editor-linenumbers.png \"Fl_Text_Display widget with line numbers enabled\"\n \\image latex editor-linenumbers.png \"Fl_Text_Display widget with line numbers enabled\" width=10cm\n\n \\b Example \\b Use\n \\code\n     #include <FL/Fl_Text_Display.H>\n     ..\n     int main() {\n         ..\n         Fl_Text_Buffer *buff = new Fl_Text_Buffer();\n         Fl_Text_Display *disp = new Fl_Text_Display(10, 10, 640, 480);\n         disp->buffer(buff);                 // attach text buffer to display widget\n         buff->text(\"line one\\nline two\");   // add some text to buffer\n         ..\n     }\n \\endcode\n\n \\b Features\n\n - Word wrap: wrap_mode(), wrapped_column(), wrapped_row()\n - Font control: textfont(), textsize(), textcolor()\n - Font styling: highlight_data()\n - Cursor: cursor_style(), show_cursor(), hide_cursor(), cursor_color()\n - Line numbers: linenumber_width(), linenumber_font(),\n   linenumber_size(), linenumber_fgcolor(), linenumber_bgcolor(),\n   linenumber_align(), linenumber_format()\n\n Note that other features may be available via Fl_Text_Editor\n and Fl_Text_Buffer classes.\n\n \\note Line numbers were added in FLTK 1.3.3.\n \\see Fl_Widget::shortcut_label(int)\n */\nclass FL_EXPORT Fl_Text_Display: public Fl_Group {\n\npublic:\n\n  /**\n   text display cursor shapes enumeration\n   */\n  enum {\n    NORMAL_CURSOR,    /**< I-beam */\n    CARET_CURSOR,     /**< caret under the text */\n    DIM_CURSOR,       /**< dim I-beam */\n    BLOCK_CURSOR,     /**< unfille box under the current character */\n    HEAVY_CURSOR,     /**< thick I-beam */\n    SIMPLE_CURSOR    /**< as cursor as Fl_Input cursor */\n  };\n\n  /**\n   the character position is the left edge of a character, whereas\n   the cursor is thought to be between the centers of two consecutive\n   characters.\n   */\n  enum {\n    CURSOR_POS,\n    CHARACTER_POS\n  };\n\n  /**\n   drag types - they match Fl::event_clicks() so that single clicking to\n   start a collection selects by character, double clicking selects by\n   word and triple clicking selects by line.\n   */\n  enum {\n    DRAG_NONE = -2,\n    DRAG_START_DND = -1,\n    DRAG_CHAR = 0,\n    DRAG_WORD = 1,\n    DRAG_LINE = 2\n  };\n\n  /**\n   wrap types - used in wrap_mode()\n   */\n  enum {\n    WRAP_NONE,      /**< don't wrap text at all */\n    WRAP_AT_COLUMN, /**< wrap text at the given text column */\n    WRAP_AT_PIXEL,  /**< wrap text at a pixel position */\n    WRAP_AT_BOUNDS  /**< wrap text so that it fits into the widget width */\n  };\n\n  friend int fl_text_drag_prepare(int pos, int key, Fl_Text_Display* d);\n  friend void fl_text_drag_me(int pos, Fl_Text_Display* d);\n\n  typedef void (*Unfinished_Style_Cb)(int, void *);\n\n  /**\n   This structure associates the color, font, and font size of a string to draw\n   with an attribute mask matching attr.\n\n   There must be one entry for each style that can be used in an\n   Fl_Text_Display for displaying text. The style table is an array of\n   struct Style_Table_Entry.\n\n   The style table is associated with an Fl_Text_Display by using\n   Fl_Text_Display::highlight_data().\n\n   \\see Fl_Text_Display::highlight_data()\n   */\n  struct Style_Table_Entry {\n    Fl_Color    color;    ///< text color\n    Fl_Font     font;     ///< text font\n    Fl_Fontsize size;     ///< text font size\n    unsigned    attr;     ///< further attributes for the text style (see `ATTR_BGCOLOR`, etc.)\n    Fl_Color    bgcolor;  ///< text background color if `ATTR_BGCOLOR` or `ATTR_BGCOLOR_EXT` is set\n  };\n\n  /**\n   attribute flags in `Style_Table_Entry.attr`\n   */\n  enum {\n    ATTR_BGCOLOR        = 0x0001, ///< use the background color in the `bgcolor` field\n    ATTR_BGCOLOR_EXT_   = 0x0002, ///< (internal use)\n    ATTR_BGCOLOR_EXT    = 0x0003, ///< extend background color to the end of the line\n    ATTR_UNDERLINE      = 0x0004, ///< a single underline, underline types are mutually exclusive\n    ATTR_GRAMMAR        = 0x0008, ///< grammar suggestion (blue dotted underline)\n    ATTR_SPELLING       = 0x000C, ///< spelling suggestion (red dotted underline)\n    ATTR_STRIKE_THROUGH = 0x0010, ///< line through the middle of the text\n    ATTR_LINES_MASK     = 0x001C  ///< the mask for all underline and strike through types\n  };\n\n  Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);\n  ~Fl_Text_Display();\n\n  int handle(int e) FL_OVERRIDE;\n\n  void buffer(Fl_Text_Buffer* buf);\n\n  /**\n   Sets the current text buffer associated with the text widget.\n   Multiple text widgets can be associated with the same text buffer.\n   \\param buf new text buffer\n   \\see Fl_Text_Display::buffer(Fl_Text_Buffer* buf)\n   */\n  void buffer(Fl_Text_Buffer& buf) { buffer(&buf); }\n\n  /**\n   Gets the current text buffer associated with the text widget.\n   Multiple text widgets can be associated with the same text buffer.\n   \\return current text buffer\n   \\see Fl_Text_Display::buffer(Fl_Text_Buffer* buf)\n   \\see Fl_Text_Display::buffer(Fl_Text_Buffer& buf)\n   */\n  Fl_Text_Buffer* buffer() const { return mBuffer; }\n  /**\n   Gets the current style buffer associated with the text widget.\n   Multiple text widgets can be associated with the same style buffer.\n   \\return current style buffer\n   \\see Fl_Text_Display::highlight_data()\n   */\n  Fl_Text_Buffer* style_buffer() const { return mStyleBuffer; }\n\n  void redisplay_range(int start, int end);\n  void scroll(int topLineNum, int horizOffset);\n  void insert(const char* text);\n  void overstrike(const char* text);\n  void insert_position(int newPos);\n\n  /**\n    Gets the position of the text insertion cursor for text display.\n\n    The insert position is the byte count (offset) from the beginning\n    of the text buffer (starting with 0). Returns 0 (zero) if no buffer\n    is associated to the text display. Returns buffer()->length() if the\n    insert position is at the end of the buffer.\n\n    \\returns insert position index into text buffer\n    \\see insert_position(int)\n  */\n  int insert_position() const { return mCursorPos; }\n  int position_to_xy(int pos, int* x, int* y) const;\n\n  int in_selection(int x, int y) const;\n  void show_insert_position();\n\n  int move_right();\n  int move_left();\n  int move_up();\n  int move_down();\n  int count_lines(int start, int end, bool start_pos_is_line_start) const;\n  int line_start(int pos) const;\n  int line_end(int startPos, bool startPosIsLineStart) const;\n  int skip_lines(int startPos, int nLines, bool startPosIsLineStart);\n  int rewind_lines(int startPos, int nLines);\n  void next_word(void);\n  void previous_word(void);\n\n  void show_cursor(int b = 1);\n\n  /**\n   Hides the text cursor.\n   */\n  void hide_cursor() { show_cursor(0); }\n\n  void cursor_style(int style);\n  int cursor_style() const { return mCursorStyle; }\n\n  /**\n   Gets the text cursor color.\n   \\return cursor color\n   */\n  Fl_Color cursor_color() const {return mCursor_color;}\n\n  /**\n   Sets the text cursor color.\n   \\param n new cursor color\n   */\n  void cursor_color(Fl_Color n) {mCursor_color = n;}\n\n  /**\n    Returns the global value Fl::scrollbar_size() unless a specific scrollbar_width_ has been set.\n   \\deprecated Use scrollbar_size() instead.\n    \\todo This method should eventually be removed.\n  */\n  int scrollbar_width() const {\n      return scrollbar_width_ ? scrollbar_width_ : Fl::scrollbar_size();\n  }\n\n  /**\n    Sets the global Fl::scrollbar_size(), and forces this instance of the widget to use it.\n   \\deprecated Use scrollbar_size() instead.\n    \\todo This method should eventually be removed\n  */\n  void scrollbar_width(int width) {\n      Fl::scrollbar_size(width);\n      scrollbar_width_ = 0;\n  }\n\n  /**\n    Gets the current size of the scrollbars' troughs, in pixels.\n\n    If this value is zero (default), this widget will use the\n    Fl::scrollbar_size() value as the scrollbar's width.\n\n    \\returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.\n    \\see Fl::scrollbar_size(int)\n  */\n  int scrollbar_size() const {\n      return(scrollbar_width_);\n  }\n\n  /**\n    Sets the pixel size of the scrollbars' troughs to \\p newSize, in pixels.\n\n    Normally you should not need this method, and should use\n    Fl::scrollbar_size(int) instead to manage the size of ALL\n    your widgets' scrollbars. This ensures your application\n    has a consistent UI, is the default behavior, and is normally\n    what you want.\n\n    Only use THIS method if you really need to override the global\n    scrollbar size. The need for this should be rare.\n\n    Setting \\p newSize to the special value of 0 causes the widget to\n    track the global Fl::scrollbar_size(), which is the default.\n\n    \\param[in] newSize Sets the scrollbar size in pixels.\\n\n                    If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()\n    \\see Fl::scrollbar_size()\n  */\n  void scrollbar_size(int newSize) {\n      scrollbar_width_ = newSize;\n  }\n\n  /**\n   Gets the scrollbar alignment type.\n   \\return scrollbar alignment\n   */\n  Fl_Align scrollbar_align() const { return scrollbar_align_; }\n\n  /**\n   Sets the scrollbar alignment type.\n   \\param a new scrollbar alignment\n   */\n  void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; }\n\n  /**\n   Moves the insert position to the beginning of the current word.\n   \\param pos start calculation at this index\n   \\return beginning of the words\n   */\n  int word_start(int pos) const { return buffer()->word_start(pos); }\n\n  /**\n   Moves the insert position to the end of the current word.\n   \\param pos start calculation at this index\n   \\return index of first character after the end of the word\n   */\n  int word_end(int pos) const { return buffer()->word_end(pos); }\n\n\n  void highlight_data(Fl_Text_Buffer *styleBuffer,\n                      const Style_Table_Entry *styleTable,\n                      int nStyles, char unfinishedStyle,\n                      Unfinished_Style_Cb unfinishedHighlightCB,\n                      void *cbArg);\n\n  int position_style(int lineStartPos, int lineLen, int lineIndex) const;\n\n  /**\n   \\todo FIXME : get set methods pointing on shortcut_\n   have no effects as shortcut_ is unused in this class and derived!\n   \\return the current shortcut key\n   */\n  int shortcut() const {return shortcut_;}\n\n  /**\n   \\todo FIXME : get set methods pointing on shortcut_\n   have no effects as shortcut_ is unused in this class and derived!\n   \\param s the new shortcut key\n   */\n  void shortcut(int s) {shortcut_ = s;}\n\n  /**\n   Gets the default font used when drawing text in the widget.\n   \\return current text font face unless overridden by a style\n   */\n  Fl_Font textfont() const {return textfont_;}\n\n  /**\n   Sets the default font used when drawing text in the widget.\n   \\param s default text font face\n   */\n  void textfont(Fl_Font s) {textfont_ = s; mColumnScale = 0; }\n\n  /**\n   Gets the default size of text in the widget.\n   \\return current text height unless overridden by a style\n   */\n  Fl_Fontsize textsize() const {return textsize_;}\n\n  /**\n   Sets the default size of text in the widget.\n   \\param s new text size\n   */\n  void textsize(Fl_Fontsize s) {textsize_ = s; mColumnScale = 0; }\n\n  /**\n   Gets the default color of text in the widget.\n   \\return text color unless overridden by a style\n   */\n  Fl_Color textcolor() const {return textcolor_;}\n\n  /**\n   Sets the default color of text in the widget.\n   \\param n new text color\n   */\n  void textcolor(Fl_Color n) {textcolor_ = n;}\n\n  /**\n   Sets the underline color for style attribute ATTR_GRAMMAR.\n   \\param color underline color\n   */\n  void grammar_underline_color(Fl_Color color) { grammar_underline_color_ = color; }\n\n  /**\n   Gets the underline color for style attribute ATTR_GRAMMAR.\n   \\return underline color\n   */\n  Fl_Color grammar_underline_color() const { return grammar_underline_color_;}\n\n  /**\n   Sets the underline color for style attribute ATTR_SPELLING.\n   \\param color underline color\n   */\n  void spelling_underline_color(Fl_Color color) { spelling_underline_color_ = color; }\n\n  /**\n   Gets the underline color for style attribute ATTR_SPELLING.\n   \\return underline color\n   */\n  Fl_Color spelling_underline_color() const { return spelling_underline_color_;}\n\n  /**\n   Sets the background color for the secondary selection block.\n   \\param color background color\n   */\n  void secondary_selection_color(Fl_Color color) { secondary_selection_color_ = color; }\n\n  /**\n   Gets the background color for the secondary selection block.\n   \\return background color color\n   */\n  Fl_Color secondary_selection_color() const { return secondary_selection_color_;}\n\n  int wrapped_column(int row, int column) const;\n  int wrapped_row(int row) const;\n  void wrap_mode(int wrap, int wrap_margin);\n\n  virtual void recalc_display();\n  virtual void display_needs_recalc();\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n\n  /**\n   Convert an x pixel position into a column number.\n   \\param x number of pixels from the left margin\n   \\return an approximate column number based on the main font\n   */\n  double x_to_col(double x) const;\n\n  /**\n   Convert a column number into an x pixel position.\n   \\param col an approximate column number based on the main font\n   \\return number of pixels from the left margin to the left of an\n           average sized character\n   */\n  double col_to_x(double col) const;\n\n  void linenumber_width(int width);\n  int linenumber_width() const;\n  void linenumber_font(Fl_Font val);\n  Fl_Font linenumber_font() const;\n  void linenumber_size(Fl_Fontsize val);\n  Fl_Fontsize linenumber_size() const;\n  void linenumber_fgcolor(Fl_Color val);\n  Fl_Color linenumber_fgcolor() const;\n  void linenumber_bgcolor(Fl_Color val);\n  Fl_Color linenumber_bgcolor() const;\n  void linenumber_align(Fl_Align val);\n  Fl_Align linenumber_align() const;\n  void linenumber_format(const char* val);\n  const char* linenumber_format() const;\n\nprotected:\n  // Most (all?) of this stuff should only be called from resize() or\n  // draw().\n  // Anything with \"vline\" indicates thats it deals with currently\n  // visible lines.\n\n  void draw() FL_OVERRIDE;\n  void draw_text(int X, int Y, int W, int H);\n  void draw_range(int start, int end);\n  void draw_cursor(int, int);\n\n  void draw_string(int style, int x, int y, int toX, const char *string,\n                   int nChars) const;\n\n  void draw_vline(int visLineNum, int leftClip, int rightClip,\n                  int leftCharIndex, int rightCharIndex);\n\n  int find_x(const char *s, int len, int style, int x) const;\n\n  enum {\n    DRAW_LINE,\n    FIND_INDEX,\n    FIND_INDEX_FROM_ZERO,\n    GET_WIDTH,\n    FIND_CURSOR_INDEX   // STR #2788\n  };\n\n  int handle_vline(int mode,\n                   int lineStart, int lineLen, int leftChar, int rightChar,\n                   int topClip, int bottomClip,\n                   int leftClip, int rightClip) const;\n\n  int handle_rmb(int readonly);\n\n  void draw_line_numbers(bool clearAll);\n\n  void clear_rect(int style, int x, int y, int width, int height) const;\n  void display_insert();\n\n  void offset_line_starts(int newTopLineNum);\n\n  void calc_line_starts(int startLine, int endLine);\n\n  void update_line_starts(int pos, int charsInserted, int charsDeleted,\n                          int linesInserted, int linesDeleted, int *scrolled);\n\n  void calc_last_char();\n\n  int position_to_line( int pos, int* lineNum ) const;\n  double string_width(const char* string, int length, int style) const;\n\n  static void scroll_timer_cb(void*);\n\n  static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg);\n  static void buffer_modified_cb(int pos, int nInserted, int nDeleted,\n                                 int nRestyled, const char* deletedText,\n                                 void* cbArg);\n\n  static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display* d);\n  static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display* d);\n  void update_v_scrollbar();\n  void update_h_scrollbar();\n  int measure_vline(int visLineNum) const;\n  int longest_vline() const;\n  int empty_vlines() const;\n  int vline_length(int visLineNum) const;\n  int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const;\n\n  void xy_to_rowcol(int x, int y, int* row, int* column,\n                    int PosType = CHARACTER_POS) const;\n  void maintain_absolute_top_line_number(int state);\npublic:\n  int get_absolute_top_line_number() const;\n  int scroll_row() { return mTopLineNum; }\n  int scroll_col() { return mHorizOffset; }\nprotected:\n  void absolute_top_line_number(int oldFirstChar);\n  int maintaining_absolute_top_line_number() const;\n  void reset_absolute_top_line_number();\n  int position_to_linecol(int pos, int* lineNum, int* column) const;\n  int scroll_(int topLineNum, int horizOffset);\n\n  void extend_range_for_styles(int* start, int* end);\n\n  void find_wrap_range(const char *deletedText, int pos, int nInserted,\n                       int nDeleted, int *modRangeStart, int *modRangeEnd,\n                       int *linesInserted, int *linesDeleted);\n  void measure_deleted_lines(int pos, int nDeleted);\n  void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos,\n                            int maxLines, bool startPosIsLineStart,\n                            int styleBufOffset, int *retPos, int *retLines,\n                            int *retLineStart, int *retLineEnd,\n                            bool countLastLineMissingNewLine = true) const;\n  void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd,\n                     int *nextLineStart) const;\n  double measure_proportional_character(const char *s, int colNum, int pos) const;\n  int wrap_uses_character(int lineEndPos) const;\n\n  int damage_range1_start, damage_range1_end;\n  int damage_range2_start, damage_range2_end;\n  int mCursorPos;\n  int mCursorOn;\n  int mCursorOldY;              /* Y pos. of cursor for blanking */\n  int mCursorToHint;            /* Tells the buffer modified callback\n                                 where to move the cursor, to reduce\n                                 the number of redraw calls */\n  int mCursorStyle;             /* One of enum cursorStyles above */\n  int mCursorPreferredXPos;     /* Pixel position for vert. cursor movement */\n  int mNVisibleLines;           /* # of visible (displayed) lines. This is\n                                   also the size of the mLineStarts[] array. */\n  int mNBufferLines;            /* # of newlines in the buffer, or number of\n                                   wraps if line wrapping is enabled. Note that\n                                   partial lines at the end of the buffer are\n                                   not counted, so you may want to add 1. */\n  Fl_Text_Buffer* mBuffer;      /* Contains text to be displayed */\n  Fl_Text_Buffer* mStyleBuffer; /* Optional parallel buffer containing\n                                 color and font information */\n  int mFirstChar, mLastChar;    /* Buffer positions of first and last\n                                 displayed character (lastChar points\n                                 either to a newline or one character\n                                 beyond the end of the buffer) */\n  int mContinuousWrap;          /* Wrap long lines when displaying */\n  int mWrapMarginPix;           /* Margin in # of pixels for\n                                 wrapping in continuousWrap mode */\n  int* mLineStarts;             /* Array of the size mNVisibleLines.\n                                   This array only keeps track of lines\n                                   within the display area. Each entry\n                                   contains the starting character offset\n                                   (from the beginning of the text buffer)\n                                   for each /visible/ line.\n                                   If wrap enabled, points to the beginning\n                                   of each wrap. So a long line wrapping\n                                   into 3 separate lines in the display\n                                   will take up 3 separate array entries. */\n  int mTopLineNum;              /* Line number of top displayed line\n                                 of file (first line of file is 1) */\n  int mAbsTopLineNum;           /* In continuous wrap mode, the line\n                                  number of the top line if the text\n                                  were not wrapped (note that this is\n                                  only maintained as needed). */\n  int mNeedAbsTopLineNum;       /* Externally settable flag to continue\n                                 maintaining absTopLineNum even if\n                                 it isn't needed for line # display */\n  int mHorizOffset;             /* Horizontal scroll pos. in pixels */\n  int mTopLineNumHint;          /* Line number of top displayed line\n                                 of file (first line of file is 1) */\n  int mHorizOffsetHint;         /* Horizontal scroll pos. in pixels */\n  int mNStyles;                 /* Number of entries in styleTable */\n  const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for\n                                         coloring/syntax-highlighting */\n  char mUnfinishedStyle;        /* Style buffer entry which triggers\n                                 on-the-fly reparsing of region */\n  Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse \"unfinished\" */\n  /* regions */\n  void* mHighlightCBArg;        /* Arg to unfinishedHighlightCB */\n\n  int mMaxsize;\n\n  int mSuppressResync;          /* Suppress resynchronization of line\n                                 starts during buffer updates */\n  int mNLinesDeleted;           /* Number of lines deleted during\n                                 buffer modification (only used\n                                 when resynchronization is suppressed) */\n  int mModifyingTabDistance;    /* Whether tab distance is being modified XXX: UNUSED */\n\n  mutable double mColumnScale; /* Width in pixels of an average character. This\n                                 value is calculated as needed (lazy eval); it\n                                 needs to be mutable so that it can be calculated\n                                 within a method marked as \"const\" */\n\n  bool display_needs_recalc_;  /* Set to true when the display needs\n                                 to be recalculated. */\n\n  Fl_Color mCursor_color;\n\n  Fl_Scrollbar* mHScrollBar;\n  Fl_Scrollbar* mVScrollBar;\n  int scrollbar_width_;         // size of scrollbar trough (behavior changed in 1.4)\n  Fl_Align scrollbar_align_;\n  int dragPos, dragType, dragging;\n  int display_insert_position_hint;\n  struct { int x, y, w, h; } text_area;\n\n  int shortcut_;\n\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  Fl_Color textcolor_;\n  Fl_Color grammar_underline_color_;\n  Fl_Color spelling_underline_color_;\n  Fl_Color secondary_selection_color_;\n\n  // Line number margin and width\n  int mLineNumLeft, mLineNumWidth;\n\n  // Line number font/colors\n  Fl_Font     linenumber_font_;\n  Fl_Fontsize linenumber_size_;\n  Fl_Color    linenumber_fgcolor_;\n  Fl_Color    linenumber_bgcolor_;\n  Fl_Align    linenumber_align_;\n  const char* linenumber_format_;\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Text_Editor.H",
    "content": "//\n// Header file for Fl_Text_Editor class.\n//\n// Copyright 2001-2023 by Bill Spitzak and others.\n// Original code Copyright Mark Edel.  Permission to distribute under\n// the LGPL for the FLTK library granted by Mark Edel.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Text_Editor widget . */\n\n\n#ifndef FL_TEXT_EDITOR_H\n#define FL_TEXT_EDITOR_H\n\n#include \"Fl_Text_Display.H\"\n\n// key will match in any state\n#define FL_TEXT_EDITOR_ANY_STATE  (-1L)\n\n/**\n  This is the FLTK text editor widget.\n\n  It allows the user to edit multiple lines of text and supports highlighting\n  and scrolling. The buffer that is displayed in the widget is managed\n  by the Fl_Text_Buffer class.\n*/\nclass FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {\n  public:\n    /** Key function binding callback type. */\n    typedef int (*Key_Func)(int key, Fl_Text_Editor* editor);\n\n    /** Simple linked list item associating a key/state to a function. */\n    struct Key_Binding {\n      int          key;         ///< the key pressed\n      int          state;       ///< the state of key modifiers\n      Key_Func     function;    ///< associated function\n      Key_Binding* next;        ///< next key binding in the list\n    };\n\n    Fl_Text_Editor(int X, int Y, int W, int H, const char* l = 0);\n    ~Fl_Text_Editor() { remove_all_key_bindings(); }\n    int handle(int e) FL_OVERRIDE;\n    /**\n        Sets the current insert mode; if non-zero, new text\n        is inserted before the current cursor position. Otherwise, new\n        text replaces text at the current cursor position.\n    */\n    void insert_mode(int b) { insert_mode_ = b; }\n    /**\n        Gets the current insert mode; if non-zero, new text\n        is inserted before the current cursor position. Otherwise, new\n        text replaces text at the current cursor position.\n    */\n    int insert_mode() { return insert_mode_; }\n    void tab_nav(int val);\n    int tab_nav() const;\n    void add_key_binding(int key, int state, Key_Func f, Key_Binding** list);\n    /** Adds a \\p key of state \\p state with the function \\p f. */\n    void add_key_binding(int key, int state, Key_Func f)\n      { add_key_binding(key, state, f, &key_bindings); }\n    void remove_key_binding(int key, int state, Key_Binding** list);\n    /** Removes the key binding associated with the key \"key\" of state \"state\". */\n    void remove_key_binding(int key, int state)\n      { remove_key_binding(key, state, &key_bindings); }\n    void remove_all_key_bindings(Key_Binding** list);\n    /** Removes all of the key bindings associated with the text editor or list. */\n    void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); }\n    void add_default_key_bindings(Key_Binding** list);\n    Key_Func bound_key_function(int key, int state, Key_Binding* list) const;\n    /**  Returns the function associated with a key binding. */\n    Key_Func bound_key_function(int key, int state) const\n      { return bound_key_function(key, state, key_bindings); }\n    /**  Sets the default key function for unassigned keys. */\n    void default_key_function(Key_Func f) { default_key_function_ = f; }\n\n    // functions for the built in default bindings\n    static int kf_default(int c, Fl_Text_Editor* e);\n    static int kf_ignore(int c, Fl_Text_Editor* e);\n    static int kf_backspace(int c, Fl_Text_Editor* e);\n    static int kf_enter(int c, Fl_Text_Editor* e);\n    static int kf_move(int c, Fl_Text_Editor* e);\n    static int kf_shift_move(int c, Fl_Text_Editor* e);\n    static int kf_ctrl_move(int c, Fl_Text_Editor* e);\n    static int kf_c_s_move(int c, Fl_Text_Editor* e);\n    static int kf_meta_move(int c, Fl_Text_Editor* e);\n    static int kf_m_s_move(int c, Fl_Text_Editor* e);\n    static int kf_home(int, Fl_Text_Editor* e);\n    static int kf_end(int c, Fl_Text_Editor* e);\n    static int kf_left(int c, Fl_Text_Editor* e);\n    static int kf_up(int c, Fl_Text_Editor* e);\n    static int kf_right(int c, Fl_Text_Editor* e);\n    static int kf_down(int c, Fl_Text_Editor* e);\n    static int kf_page_up(int c, Fl_Text_Editor* e);\n    static int kf_page_down(int c, Fl_Text_Editor* e);\n    static int kf_insert(int c, Fl_Text_Editor* e);\n    static int kf_delete(int c, Fl_Text_Editor* e);\n    static int kf_copy(int c, Fl_Text_Editor* e);\n    static int kf_cut(int c, Fl_Text_Editor* e);\n    static int kf_paste(int c, Fl_Text_Editor* e);\n    static int kf_select_all(int c, Fl_Text_Editor* e);\n    static int kf_undo(int c, Fl_Text_Editor* e);\n    static int kf_redo(int c, Fl_Text_Editor* e);\n\n  protected:\n    int handle_key();\n    void maybe_do_callback(Fl_Callback_Reason reason = FL_REASON_CHANGED);\n\n#ifndef FL_DOXYGEN\n    int insert_mode_;\n    Key_Binding* key_bindings;\n#endif\n\n    /** Global key binding list.\n\n      Derived classes can add key bindings for all Fl_Text_Editor widgets\n      by adding a Key_Binding to this list.\n\n      \\see add_key_binding(int key, int state, Key_Func f, Key_Binding** list);\n    */\n    static Key_Binding* global_key_bindings;\n\n#ifndef FL_DOXYGEN\n    Key_Func default_key_function_;\n#endif\n};\n\n#endif\n\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tile.H",
    "content": "//\n// Tile header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file. If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Tile_H\n#define Fl_Tile_H\n\n#include \"Fl_Group.H\"\n\n/*\n  The Fl_Tile class lets you resize its children by dragging\n  the border between them.\n*/\n\nclass FL_EXPORT Fl_Tile : public Fl_Group {\npublic:\n  int handle(int event) FL_OVERRIDE;\n  Fl_Tile(int X, int Y, int W, int H, const char *L=0);\n  ~Fl_Tile() FL_OVERRIDE;\n  void resize(int X, int Y, int W, int H) FL_OVERRIDE;\n  virtual void move_intersection(int oldx, int oldy, int newx, int newy);\n  virtual void drag_intersection(int oldx, int oldy, int newx, int newy);\n  FL_DEPRECATED(\"since 1.4.0 - use move_intersection(p) instead\",\n  void position(int oldx, int oldy, int newx, int newy)) { move_intersection(oldx, oldy, newx, newy); }\n  void position(int x, int y) { Fl_Group::position(x, y); }\n  void size_range(int index, int minw, int minh, int maxw=0x7FFFFFFF, int maxh=0x7FFFFFFF);\n  void size_range(Fl_Widget *w , int minw, int minh, int maxw=0x7FFFFFFF, int maxh=0x7FFFFFFF);\n  void init_size_range(int default_min_w = -1, int default_min_h = -1);\n\nprotected:\n  int cursor_;                  ///< current cursor index (0..3)\n  Fl_Cursor *cursors_;          ///< points at the array of 4 cursors (may be overridden)\n\n  /** Returns the cursor for cursor index n.\n    \\see Fl_Tile::set_cursor(int)\n  */\n\n  Fl_Cursor cursor(int n) {\n    return cursors_[n];\n  }\n\n  void set_cursor(int n);       // set one of n (0..3) cursors\n\n  typedef struct { int minw, minh, maxw, maxh; } Size_Range;\n\n  Size_Range *size_range_;\n  int size_range_size_, size_range_capacity_;\n  int default_min_w_, default_min_h_;\n  void request_shrink_l(int old_l, int &new_l, Fl_Rect *final_size);\n  void request_shrink_r(int old_r, int &new_r, Fl_Rect *final_size);\n  void request_shrink_t(int old_t, int &new_t, Fl_Rect *final_size);\n  void request_shrink_b(int old_b, int &new_b, Fl_Rect *final_size);\n  void request_grow_l(int old_l, int &new_l, Fl_Rect *final_size);\n  void request_grow_r(int old_r, int &new_r, Fl_Rect *final_size);\n  void request_grow_t(int old_t, int &new_t, Fl_Rect *final_size);\n  void request_grow_b(int old_b, int &new_b, Fl_Rect *final_size);\n\n  int on_insert(Fl_Widget*, int) FL_OVERRIDE;\n  int on_move(int, int) FL_OVERRIDE;\n  void on_remove(int) FL_OVERRIDE;\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tiled_Image.H",
    "content": "//\n// Tiled image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2015 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Tiled_Image widget . */\n\n#ifndef Fl_Tiled_Image_H\n#  define Fl_Tiled_Image_H\n\n#  include \"Fl_Image.H\"\n\n\n/**\n  This class supports tiling of images over a specified area.\n\n  The source (tile) image is \\b not copied unless you call the\n  color_average(), desaturate(), or inactive() methods.\n*/\nclass FL_EXPORT Fl_Tiled_Image : public Fl_Image {\nprotected:\n\n  Fl_Image      *image_;                // The image that is tiled\n  int           alloc_image_;           // Did we allocate this image?\n\npublic:\n  Fl_Tiled_Image(Fl_Image *i, int W = 0, int H = 0);\n  virtual ~Fl_Tiled_Image();\n\n  Fl_Image *copy(int W, int H) const FL_OVERRIDE;\n  Fl_Image *copy() const {\n    return Fl_Image::copy();\n  }\n  void color_average(Fl_Color c, float i) FL_OVERRIDE;\n  void desaturate() FL_OVERRIDE;\n  void draw(int X, int Y, int W, int H, int cx = 0, int cy = 0) FL_OVERRIDE;\n  void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); }\n  /** Gets The image that is tiled */\n  Fl_Image *image() { return image_; }\n};\n\n#endif // !Fl_Tiled_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Timer.H",
    "content": "//\n// Timer header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Timer widget . */\n\n#ifndef Fl_Timer_H\n#define Fl_Timer_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n// values for type():\n#define FL_NORMAL_TIMER         0\n#define FL_VALUE_TIMER          1\n#define FL_HIDDEN_TIMER         2\n\n/**\n  This is provided only to emulate the Forms Timer widget.  It works by\n  making a timeout callback every 1/5 second.  This is wasteful and\n  inaccurate if you just want something to happen a fixed time in the\n  future.  You should directly call\n  Fl::add_timeout() instead.\n*/\nclass FL_EXPORT Fl_Timer : public Fl_Widget {\n  static void stepcb(void *);\n  void step();\n  char on, direction_;\n  double delay, total;\n  long lastsec,lastusec;\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  int handle(int) FL_OVERRIDE;\n  Fl_Timer(uchar t,int x,int y,int w,int h, const char *l);\n  ~Fl_Timer();\n  void value(double);\n  /** See void Fl_Timer::value(double)  */\n  double value() const {return delay>0.0?delay:0.0;}\n  /**\n    Gets or sets the direction of the timer.  If the direction is zero\n    then the timer will count up, otherwise it will count down from the\n    initial value().\n  */\n  char direction() const {return direction_;}\n  /**\n    Gets or sets the direction of the timer.  If the direction is zero\n    then the timer will count up, otherwise it will count down from the\n    initial value().\n  */\n  void direction(char d) {direction_ = d;}\n  /**    Gets or sets whether the timer is suspended.  */\n  char suspended() const {return !on;}\n  void suspended(char d);\n};\n\n#endif\n\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Toggle_Button.H",
    "content": "//\n// Toggle button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Toggle_Button widget . */\n\n#ifndef Fl_Toggle_Button_H\n#define Fl_Toggle_Button_H\n\n#include \"Fl_Button.H\"\n\n/**\n  The toggle button is a push button that needs to be clicked once\n  to toggle on, and one more time to toggle off.\n  The Fl_Toggle_Button subclass displays the \"on\" state by\n  drawing a pushed-in button.</P>\n  <P>Buttons generate callbacks when they are clicked by the user.  You\n  control exactly when and how by changing the values for type()\n  and when().\n*/\nclass FL_EXPORT Fl_Toggle_Button : public Fl_Button {\npublic:\n  /**\n    Creates a new Fl_Toggle_Button widget using the given\n    position, size, and label string.\n    <P>The inherited destructor deletes the toggle button.\n  */\n  Fl_Toggle_Button(int X,int Y,int W,int H,const char *l=0);\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Toggle_Light_Button.H",
    "content": "//\n// Toggle light button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// provided for back-compatibility only\n\n#ifndef Fl_Toggle_Light_Button\n#include \"Fl_Light_Button.H\"\n#define Fl_Toggle_Light_Button Fl_Light_Button\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Toggle_Round_Button.H",
    "content": "//\n// Toggle round button header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// provided for back-compatibility only\n\n#ifndef Fl_Toggle_Round_Button\n#include \"Fl_Round_Button.H\"\n#define Fl_Toggle_Round_Button Fl_Round_Button\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tooltip.H",
    "content": "//\n// Tooltip header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2011 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Tooltip widget . */\n\n#ifndef Fl_Tooltip_H\n#define Fl_Tooltip_H\n\n#include <FL/Fl.H>\n#include <FL/Fl_Widget.H>\n\n/**\n  The Fl_Tooltip class provides tooltip support for\n  all FLTK widgets. It contains only static methods.\n\n  \\image html tooltip-options.png \"Fl_Tooltip Options\"\n  \\image latex src/tooltip-options.png \"Fl_Tooltip Options\" width=6cm\n\n*/\nclass FL_EXPORT Fl_Tooltip {\n  friend class Fl_TooltipBox;\npublic:\n  /**    Gets the tooltip delay. The default delay is 1.0 seconds.  */\n  static float delay() { return delay_; }\n  /**    Sets the tooltip delay. The default delay is 1.0 seconds.  */\n  static void delay(float f) { delay_ = f; }\n  /**    Gets the time until an open tooltip hides again. The default delay is 12.0 seconds.  */\n  static float hidedelay() { return hidedelay_; }\n  /**    Sets the time until an open tooltip hides again. The default delay is 12.0 seconds.  */\n  static void hidedelay(float f) { hidedelay_ = f; }\n  /**\n    Gets the tooltip hover delay, the delay between tooltips.\n    The default delay is 0.2 seconds.\n  */\n  static float hoverdelay() { return hoverdelay_; }\n  /**\n    Sets the tooltip hover delay, the delay between tooltips.\n    The default delay is 0.2 seconds.\n  */\n  static void hoverdelay(float f) { hoverdelay_ = f; }\n  /**    Returns non-zero if tooltips are enabled.  */\n  static int enabled() { return Fl::option(Fl::OPTION_SHOW_TOOLTIPS); }\n  /**    Enables tooltips on all widgets (or disables if <i>b</i> is false).  */\n  static void enable(int b = 1) { Fl::option(Fl::OPTION_SHOW_TOOLTIPS, (b!=0));}\n  /**    Same as enable(0), disables tooltips on all widgets.  */\n  static void disable() { enable(0); }\n  static void (*enter)(Fl_Widget* w);\n  static void enter_area(Fl_Widget* w, int X, int Y, int W, int H, const char* tip);\n  static void (*exit)(Fl_Widget *w);\n  /** Gets the current widget target */\n  static Fl_Widget* current() {return widget_;}\n  static void current(Fl_Widget*);\n\n  /**    Gets the typeface for the tooltip text.  */\n  static Fl_Font font() { return font_; }\n  /**    Sets the typeface for the tooltip text.  */\n  static void font(Fl_Font i) { font_ = i; }\n  /**    Gets the size of the tooltip text.  */\n  static Fl_Fontsize size() { return (size_ == -1 ? FL_NORMAL_SIZE : size_); }\n  /**    Sets the size of the tooltip text.  */\n  static void size(Fl_Fontsize s) { size_ = s; }\n  /** Gets the background color for tooltips. The default background color is a pale yellow.  */\n  static Fl_Color color() { return color_; }\n  /** Sets the background color for tooltips. The default background color is a pale yellow.  */\n  static void color(Fl_Color c) { color_ = c; }\n  /** Gets the color of the text in the tooltip. The default is  black. */\n  static Fl_Color textcolor() { return textcolor_; }\n  /** Sets the color of the text in the tooltip. The default is  black. */\n  static void textcolor(Fl_Color c) { textcolor_ = c; }\n  /** Gets the amount of extra space left/right of the tooltip's text. Default is 3. */\n  static int margin_width() { return margin_width_; }\n  /** Sets the amount of extra space left/right of the tooltip's text. Default is 3. */\n  static void margin_width(int v) { margin_width_ = v; }\n  /** Gets the amount of extra space above and below the tooltip's text. Default is 3. */\n  static int margin_height() { return margin_height_; }\n  /** Sets the amount of extra space above and below the tooltip's text. Default is 3. */\n  static void margin_height(int v) { margin_height_ = v; }\n  /** Gets the maximum width for tooltip's text before it word wraps. Default is 400. */\n  static int wrap_width() { return wrap_width_; }\n  /** Sets the maximum width for tooltip's text before it word wraps. Default is 400. */\n  static void wrap_width(int v) { wrap_width_ = v; }\n  /** Returns the window that is used for tooltips */\n  static Fl_Window* current_window(void);\n\n  // These should not be public, but Fl_Widget::tooltip() needs them...\n  // fabien: made it private with only a friend function access\nprivate:\n  friend void Fl_Widget::tooltip(const char *);\n  friend void Fl_Widget::copy_tooltip(const char *);\n  static void enter_(Fl_Widget* w);\n  static void exit_(Fl_Widget *w);\n  static void set_enter_exit_once_();\n\nprivate:\n  static float delay_; //!< delay before a tooltip is shown\n  static float hidedelay_; //!< delay until tooltip is closed again\n  static float hoverdelay_; //!< delay between tooltips\n  static Fl_Color color_;\n  static Fl_Color textcolor_;\n  static Fl_Font font_;\n  static Fl_Fontsize size_;\n  static Fl_Widget* widget_; //!< Keeps track of the current target widget\n  static int margin_width_;     //!< distance around tooltip text left+right\n  static int margin_height_;    //!< distance around tooltip text top+bottom\n  static int wrap_width_;       //!< maximum width of tooltip text before it word wraps\n  static const int draw_symbols_; // 1 = draw @-symbols in tooltips, 0 = no\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tree.H",
    "content": "//\n\n#ifndef FL_TREE_H\n#define FL_TREE_H\n\n#include <FL/Fl.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Scrollbar.H>\n#include <FL/fl_draw.H>\n\n#include <FL/Fl_Tree_Item.H>\n#include <FL/Fl_Tree_Prefs.H>\n\n//////////////////////\n// FL/Fl_Tree.H\n//////////////////////\n//\n// Fl_Tree -- This file is part of the Fl_Tree widget for FLTK\n// Copyright (C) 2009-2010 by Greg Ercolano.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n///\n/// \\file\n/// \\brief This file contains the definitions of the Fl_Tree class\n///\n\n/** \\class Fl_Tree\n\n \\brief Tree widget.\n\n \\image html tree-simple.png \"Fl_Tree example program\"\n \\image latex tree-simple.png \"Fl_Tree example program\" width=4cm\n\n \\code\n Fl_Tree                                         // Top level widget\n    |--- Fl_Tree_Item                            // Items in the tree\n    |--- Fl_Tree_Prefs                           // Preferences for the tree\n              |--- Fl_Tree_Connector (enum)      // Connection modes\n              |--- Fl_Tree_Select (enum)         // Selection modes\n              |--- Fl_Tree_Sort (enum)           // Sort behavior\n \\endcode\n\n Similar to Fl_Browser, Fl_Tree is a browser of Fl_Tree_Item's arranged\n in a parented hierarchy, or 'tree'. Subtrees can be expanded or closed.\n Items can be added, deleted, inserted, sorted and re-ordered.\n\n The tree items may also contain other FLTK widgets, like buttons, input fields,\n or even \"custom\" widgets.\n\n The callback() is invoked depending on the value of when():\n\n - FL_WHEN_RELEASE -- callback invoked when left mouse button is released on an item\n - FL_WHEN_CHANGED -- callback invoked when left mouse changes selection state\n\n The simple way to define a tree:\n \\par\n \\code\n #include <FL/Fl_Tree.H>\n [..]\n Fl_Tree tree(X,Y,W,H);\n tree.begin();\n   tree.add(\"Flintstones/Fred\");\n   tree.add(\"Flintstones/Wilma\");\n   tree.add(\"Flintstones/Pebbles\");\n   tree.add(\"Simpsons/Homer\");\n   tree.add(\"Simpsons/Marge\");\n   tree.add(\"Simpsons/Bart\");\n   tree.add(\"Simpsons/Lisa\");\n tree.end();\n \\endcode\n\n \\par FEATURES\n Items can be added with add(),<BR>\n removed with remove(),<BR>\n completely cleared with clear(),<BR>\n inserted with insert() and insert_above(),<BR>\n selected/deselected with select() and deselect(),<BR>\n open/closed with open() and close(),<BR>\n positioned on the screen with show_item_top(), show_item_middle() and\n show_item_bottom(),<BR>\n item children can be swapped around with Fl_Tree_Item::swap_children(),<BR>\n items can be moved around with Fl_Tree_Item::move(),<BR>\n an item's children can be walked with Fl_Tree_Item::first() and Fl_Tree_Item::next(),\n an item's children can be indexed directly with Fl_Tree_Item::child()\n and Fl_Tree_Item::children(),<BR>\n items can be moved from one subtree to another with Fl_Tree_Item::deparent()\n and Fl_Tree_Item::reparent(),<BR>\n sorting can be controlled when items are add()ed via sortorder().<BR>\n You can walk the entire tree with first() and next().<BR>\n You can walk visible items with first_visible_item()\n and next_visible_item().<BR>\n You can walk selected items with first_selected_item() and\n next_selected_item().<BR>\n Items can be found by their pathname using find_item(const char*),\n and an item's pathname can be found with item_pathname().<BR>\n The selected items' colors are controlled by selection_color()\n (inherited from Fl_Widget).<BR>\n A hook is provided to allow you to redefine how item's labels are drawn\n via Fl_Tree::item_draw_callback().<BR>\n Items can be interactively dragged using FL_TREE_SELECT_SINGLE_DRAGGABLE.\n\n \\par SELECTION OF ITEMS\n The tree can have different selection behaviors controlled by selectmode().\n The background color used for selected items is the Fl_Tree::selection_color().\n The foreground color for selected items is controlled internally with fl_contrast().\n\n \\par CHILD WIDGETS\n FLTK widgets (including custom widgets) can be assigned to tree items via\n Fl_Tree_Item::widget().\n \\par\n When an Fl_Tree_Item::widget() is defined, the default behavior is for the\n widget() to be shown in place of the item's label (if it has one).\n Only the widget()'s width will be used; the widget()'s x() and y() position\n will be managed by the tree, and the h() will track the item's height.\n This default behavior can be altered (ABI 1.3.1):\n Setting Fl_Tree::item_draw_mode()'s FL_TREE_ITEM_DRAW_LABEL_AND_WIDGET flag\n causes the label + widget to be displayed together in that order, and\n adding the FL_TREE_ITEM_HEIGHT_FROM_WIDGET flag causes widget's height\n to define the widget()'s height.\n\n \\par ICONS\n The tree's open/close icons can be redefined with\n Fl_Tree::openicon(), Fl_Tree::closeicon(). User icons\n can either be changed globally with Fl_Tree::usericon(),\n or on a per-item basis with Fl_Tree_Item::usericon().\n \\par\n Various default preferences can be globally manipulated via Fl_Tree_Prefs,\n including colors, margins, icons, connection lines, etc.\n\n \\par FONTS AND COLORS\n When adding new items to the tree, the new items get the\n defaults for fonts and colors from:\n \\par\n - Fl_Tree::item_labelfont() -- The default item label font (default: FL_HELVETICA)\n - Fl_Tree::item_labelsize() -- The default item label size (default: FL_NORMAL_SIZE)\n - Fl_Tree::item_labelfgcolor() -- The default item label foreground color (default: FL_FOREGROUND_COLOR)\n - Fl_Tree::item_labelbgcolor() -- The default item label background color (default: 0xffffffff, which tree uses as 'transparent')\n \\par\n Each item (Fl_Tree_Item) inherits a copy of these font/color attributes when created,\n and each item has its own methods to let the app change these values on a per-item basis\n using methods of the same name:\n \\par\n - Fl_Tree_Item::labelfont() -- The item's label font (default: FL_HELVETICA)\n - Fl_Tree_Item::labelsize() -- The item's label size (default: FL_NORMAL_SIZE)\n - Fl_Tree_Item::labelfgcolor() -- The item's label foreground color (default: FL_FOREGROUND_COLOR)\n - Fl_Tree_Item::labelbgcolor() -- The item's label background color (default: 0xffffffff, which uses the tree's own bg color)\n\n \\par CALLBACKS\n The tree's callback() will be invoked when items change state or are open/closed.\n when() controls when mouse/keyboard events invoke the callback.\n callback_item() and callback_reason() can be used to determine the cause of the callback. e.g.\n \\par\n \\code\n void MyTreeCallback(Fl_Widget *w, void *data) {\n   Fl_Tree      *tree = (Fl_Tree*)w;\n   Fl_Tree_Item *item = (Fl_Tree_Item*)tree->callback_item();   // get selected item\n   switch ( tree->callback_reason() ) {\n     case FL_TREE_REASON_SELECTED: [..]\n     case FL_TREE_REASON_DESELECTED: [..]\n     case FL_TREE_REASON_RESELECTED: [..]\n     case FL_TREE_REASON_OPENED: [..]\n     case FL_TREE_REASON_CLOSED: [..]\n   }\n   :\n }\n \\endcode\n\n \\par SIMPLE EXAMPLES\n To find all the selected items:\n \\par\n \\code\n for ( Fl_Tree_Item *i=first_selected_item(); i; i=next_selected_item(i) )\n   printf(\"Item %s is selected\\n\", i->label());\n \\endcode\n \\par\n     To get an item's full menu pathname, use Fl_Tree::item_pathname(), e.g.\n \\par\n \\code\n [..]\n char pathname[256] = \"???\";\n tree->item_pathname(pathname, sizeof(pathname), item);         // eg. \"Parent/Child/Item\"\n [..]\n \\endcode\n \\par\n To walk all the items of the tree from top to bottom:\n \\par\n \\code\n // Walk all the items in the tree, and print their labels\n for ( Fl_Tree_Item *item = tree->first(); item; item = tree->next(item) ) {\n     printf(\"Item: %s\\n\", item->label());\n }\n \\endcode\n \\par\n To recursively walk all the children of a particular item,\n define a function that uses recursion:\n \\par\n \\code\n // Find all of the item's children and print an indented report of their labels\n void my_print_all_children(Fl_Tree_Item *item, int indent=0) {\n     for ( int t=0; t<item->children(); t++ ) {\n         printf(\"%*s Item: %s\\n\", indent, \"\", item->child(t)->label());\n         my_print_all_children(item->child(t), indent+4);   // recurse\n     }\n }\n \\endcode\n \\par\n To change the default label font and color when creating new items:\n \\par\n \\code\n tree = new Fl_Tree(..);\n tree->item_labelfont(FL_COURIER);      // Use Courier font for all new items\n tree->item_labelfgcolor(FL_RED);       // Use red color for labels of all new items\n [..]\n // Now create the items in the tree using the above defaults.\n tree->add(\"Aaa\");\n tree->add(\"Bbb\");\n \\endcode\n \\par\n To change the font and color of all existing items in the tree:\n \\par\n \\code\n // Change the font and color of all items currently in the tree\n for ( Fl_Tree_Item *item = tree->first(); item; item = tree->next(item) ) {\n     item->labelfont(FL_COURIER);\n     item->labelcolor(FL_RED);\n }\n \\endcode\n\n \\par DISPLAY DESCRIPTION\n The following image shows the tree's various visual elements\n and the methods that control them:\n \\par\n \\image html tree-elements.png\n \\image latex tree-elements.png \"Fl_Tree elements\" width=6cm\n \\par\n The following shows the protected dimension variables 'tree inner' (tix..)\n and 'tree outer' (tox..):\n \\image html tree-dimensions.png \"Fl_Tree inner/outer dimensions\" width=6cm\n \\image latex tree-dimensions.png \"Fl_Tree inner/outer dimensions\" width=6cm\n\n \\par KEYBOARD BINDINGS\n The following table lists keyboard bindings for navigating the tree:\n \\par\n Keyboard                | FL_TREE_SELECT_MULTI        | FL_TREE_SELECT_SINGLE       | FL_TREE_SELECT_NONE         |\n ------------------------|-----------------------------|-----------------------------|-----------------------------|\n Ctrl-A (Linux/Windows)  | Select all items            | N/A                         | N/A                         |\n Command-A (Mac)         | Select all items            | N/A                         | N/A                         |\n Space                   | Selects item                | Selects item                | N/A                         |\n Ctrl-Space              | Toggle item                 | Toggle item                 | N/A                         |\n Shift-Space             | Extends selection           | Selects item                | N/A                         |\n Enter                   | Toggles open/close          | Toggles open/close          | Toggles open/close          |\n Ctrl-Enter              | Toggles open/close          | Toggles open/close          | Toggles open/close          |\n Shift-Enter             | Toggles open/close          | Toggles open/close          | Toggles open/close          |\n Right / Left            | Open/Close item             | Open/Close item             | Open/Close item             |\n Up / Down               | Move focus box up/down      | Move focus box up/down      | N/A                         |\n Shift-Up / Shift-Down   | Extend selection up/down    | Move focus up/down          | N/A                         |\n Home / End              | Move to top/bottom of tree  | Move to top/bottom of tree  | Move to top/bottom of tree  |\n PageUp / PageDown       | Page up/down                | Page up/down                | Page up/down                |\n\n*/\n\n/// \\enum Fl_Tree_Reason\n/// The reason the callback was invoked.\n///\nenum Fl_Tree_Reason {\n  FL_TREE_REASON_NONE       = FL_REASON_UNKNOWN,        ///< unknown reason\n  FL_TREE_REASON_SELECTED   = FL_REASON_SELECTED,       ///< an item was selected\n  FL_TREE_REASON_DESELECTED = FL_REASON_DESELECTED,     ///< an item was de-selected\n  FL_TREE_REASON_RESELECTED = FL_REASON_RESELECTED,     ///< an item was re-selected (double-clicked).\n                                ///< See ::Fl_Tree_Item_Reselect_Mode to enable this.\n  FL_TREE_REASON_OPENED     = FL_REASON_OPENED,         ///< an item was opened\n  FL_TREE_REASON_CLOSED     = FL_REASON_CLOSED,         ///< an item was closed\n  FL_TREE_REASON_DRAGGED    = FL_REASON_DRAGGED         ///< an item was dragged into a new place\n};\n\nclass FL_EXPORT Fl_Tree : public Fl_Group {\n  friend class Fl_Tree_Item;\n  Fl_Tree_Item  *_root;                         // can be null!\n  Fl_Tree_Item  *_item_focus;                   // item that has focus box\n  Fl_Tree_Item  *_callback_item;                // item invoked during callback (can be NULL)\n  Fl_Tree_Reason _callback_reason;              // reason for the callback\n  Fl_Tree_Prefs  _prefs;                        // all the tree's settings\n  int            _scrollbar_size;               // size of scrollbar trough\n  Fl_Tree_Item  *_lastselect;                   // last selected item\n  char           _lastpushed;                   // FL_PUSH occurred on: 0=nothing, 1=open/close, 2=usericon, 3=label\n  void fix_scrollbar_order();\n\nprotected:\n  Fl_Scrollbar *_vscroll;       ///< Vertical scrollbar\n  Fl_Scrollbar *_hscroll;       ///< Horizontal scrollbar\n  int _tox,_toy,_tow,_toh;      ///< Tree widget outer xywh dimension: outside scrollbars, inside widget border\n  int _tix,_tiy,_tiw,_tih;      ///< Tree widget inner xywh dimension: inside borders + scrollbars\n\n  /// the calculated width of the entire tree hierarchy. See calc_tree()\n  int _tree_w;\n  /// the calculated height of the entire tree hierarchy. See calc_tree()\n  int _tree_h;\n  void item_clicked(Fl_Tree_Item* val);\n  void do_callback_for_item(Fl_Tree_Item* item, Fl_Tree_Reason reason);\n\n  // next_visible_item() and extend_selection() moved to 'public' in ABI 1.3.3\n  // undocmented draw_tree() dropped -- draw() does all the work now\n\n  // draw() has to be protected per FLTK convention (was public in 1.3.x)\n  void draw() FL_OVERRIDE;\n\npublic:\n  Fl_Tree(int X, int Y, int W, int H, const char *L=0);\n  ~Fl_Tree();\n  int handle(int e) FL_OVERRIDE;\n  void show_self();\n  void resize(int,int,int,int) FL_OVERRIDE;\n\n  ///////////////////////\n  // root methods\n  ///////////////////////\n  void root_label(const char *new_label);\n  Fl_Tree_Item* root();\n  void root(Fl_Tree_Item *newitem);\n  const Fl_Tree_Prefs& prefs() const { return _prefs; }\n\n  ////////////////////////////////\n  // Item creation/removal methods\n  ////////////////////////////////\n  Fl_Tree_Item *add(const char *path, Fl_Tree_Item *newitem=0);\n  Fl_Tree_Item* add(Fl_Tree_Item *parent_item, const char *name);\n  Fl_Tree_Item *insert_above(Fl_Tree_Item *above, const char *name);\n  Fl_Tree_Item* insert(Fl_Tree_Item *item, const char *name, int pos);\n  int remove(Fl_Tree_Item *item);\n  void clear();\n  void clear_children(Fl_Tree_Item *item);\n\n  ////////////////////////\n  // Item lookup methods\n  ////////////////////////\n  Fl_Tree_Item *find_item(const char *path);\n  const Fl_Tree_Item *find_item(const char *path) const;\n  int item_pathname(char *pathname, int pathnamelen, const Fl_Tree_Item *item) const;\n  const Fl_Tree_Item* find_clicked(int yonly=0) const;\n  Fl_Tree_Item* find_clicked(int yonly=0);\n  Fl_Tree_Item *item_clicked();\n  Fl_Tree_Item *first();\n  Fl_Tree_Item *first_visible();                // deprecated in ABI 10303\n  Fl_Tree_Item *first_visible_item();\n  Fl_Tree_Item *next(Fl_Tree_Item *item=0);\n  Fl_Tree_Item *prev(Fl_Tree_Item *item=0);\n  Fl_Tree_Item *last();\n  Fl_Tree_Item *last_visible();                 // deprecated in ABI 10303\n  Fl_Tree_Item *last_visible_item();\n  Fl_Tree_Item *next_visible_item(Fl_Tree_Item *start, int dir);        // made public in 1.3.3 ABI\n  Fl_Tree_Item *first_selected_item();\n  Fl_Tree_Item *last_selected_item();\n  Fl_Tree_Item *next_item(Fl_Tree_Item *item, int dir=FL_Down, bool visible=false);\n  Fl_Tree_Item *next_selected_item(Fl_Tree_Item *item=0, int dir=FL_Down);\n  int get_selected_items(Fl_Tree_Item_Array &items);\n\n  //////////////////////////\n  // Item open/close methods\n  //////////////////////////\n  int open(Fl_Tree_Item *item, int docallback=1);\n  int open(const char *path, int docallback=1);\n  void open_toggle(Fl_Tree_Item *item, int docallback=1);\n  int close(Fl_Tree_Item *item, int docallback=1);\n  int close(const char *path, int docallback=1);\n  int is_open(Fl_Tree_Item *item) const;\n  int is_open(const char *path) const;\n  int is_close(Fl_Tree_Item *item) const;\n  int is_close(const char *path) const;\n\n  /////////////////////////\n  // Item selection methods\n  /////////////////////////\n  int select(Fl_Tree_Item *item, int docallback=1);\n  int select(const char *path, int docallback=1);\n  void select_toggle(Fl_Tree_Item *item, int docallback=1);\n  int deselect(Fl_Tree_Item *item, int docallback=1);\n  int deselect(const char *path, int docallback=1);\n  int deselect_all(Fl_Tree_Item *item=0, int docallback=1);\n  int select_only(Fl_Tree_Item *selitem, int docallback=1);\n  int select_all(Fl_Tree_Item *item=0, int docallback=1);\n  int extend_selection_dir(Fl_Tree_Item *from,\n                           Fl_Tree_Item *to,\n                           int dir,\n                           int val,\n                           bool visible);\n  int extend_selection(Fl_Tree_Item *from,\n                       Fl_Tree_Item *to,\n                       int val=1,\n                       bool visible=false);\n  void set_item_focus(Fl_Tree_Item *item);\n  Fl_Tree_Item *get_item_focus() const;\n  int is_selected(Fl_Tree_Item *item) const;\n  int is_selected(const char *path);\n\n  /////////////////////////////////\n  // Item attribute related methods\n  /////////////////////////////////\n  Fl_Font     item_labelfont() const;\n  void        item_labelfont(Fl_Font val);\n  Fl_Fontsize item_labelsize() const;\n  void        item_labelsize(Fl_Fontsize val);\n  Fl_Color    item_labelfgcolor(void) const;\n  void        item_labelfgcolor(Fl_Color val);\n  Fl_Color    item_labelbgcolor(void) const;\n  void        item_labelbgcolor(Fl_Color val);\n  Fl_Color connectorcolor() const;\n  void connectorcolor(Fl_Color val);\n  int marginleft() const;\n  void marginleft(int val);\n  int margintop() const;\n  void margintop(int val);\n  int marginbottom() const;\n  void marginbottom(int val);\n  int linespacing() const;\n  void linespacing(int val);\n  int openchild_marginbottom() const;\n  void openchild_marginbottom(int val);\n  int usericonmarginleft() const;\n  void usericonmarginleft(int val);\n  int labelmarginleft() const;\n  void labelmarginleft(int val);\n  int widgetmarginleft() const;\n  void widgetmarginleft(int val);\n  int connectorwidth() const;\n  void connectorwidth(int val);\n  Fl_Image* usericon() const;\n  void usericon(Fl_Image *val);\n  Fl_Image* openicon() const;\n  void openicon(Fl_Image *val);\n  Fl_Image* closeicon() const;\n  void closeicon(Fl_Image *val);\n  int showcollapse() const;\n  void showcollapse(int val);\n  int showroot() const;\n  void showroot(int val);\n  Fl_Tree_Connector connectorstyle() const;\n  void connectorstyle(Fl_Tree_Connector val);\n  Fl_Tree_Sort sortorder() const;\n  void sortorder(Fl_Tree_Sort val);\n  Fl_Boxtype selectbox() const;\n  void selectbox(Fl_Boxtype val);\n  Fl_Tree_Select selectmode() const;\n  void selectmode(Fl_Tree_Select val);\n  Fl_Tree_Item_Reselect_Mode item_reselect_mode() const;\n  void item_reselect_mode(Fl_Tree_Item_Reselect_Mode mode);\n  Fl_Tree_Item_Draw_Mode item_draw_mode() const;\n  void item_draw_mode(Fl_Tree_Item_Draw_Mode mode);\n  void item_draw_mode(int mode);\n  void calc_dimensions();\n  void calc_tree();\n  void recalc_tree();\n  int displayed(Fl_Tree_Item *item);\n  void show_item(Fl_Tree_Item *item, int yoff);\n  void show_item(Fl_Tree_Item *item);\n  void show_item_top(Fl_Tree_Item *item);\n  void show_item_middle(Fl_Tree_Item *item);\n  void show_item_bottom(Fl_Tree_Item *item);\n  void display(Fl_Tree_Item *item);\n  int  vposition() const;\n  void vposition(int pos);\n  int  hposition() const;\n  void hposition(int pos);\n\n  int is_scrollbar(Fl_Widget *w);\n  int scrollbar_size() const;\n  void scrollbar_size(int size);\n  int is_vscroll_visible() const;\n  int is_hscroll_visible() const;\n\n  ///////////////////////\n  // callback related\n  ///////////////////////\n  void callback_item(Fl_Tree_Item* item);\n  Fl_Tree_Item* callback_item();\n  void callback_reason(Fl_Tree_Reason reason);\n  Fl_Tree_Reason callback_reason() const;\n\n  /// Load FLTK preferences\n  void load(class Fl_Preferences&);\n};\n\n#endif /*FL_TREE_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tree_Item.H",
    "content": "//\n\n#ifndef FL_TREE_ITEM_H\n#define FL_TREE_ITEM_H\n\n#include <FL/Fl.H>\n#include <FL/Fl_Widget.H>\n#include <FL/Fl_Image.H>\n#include <FL/fl_draw.H>\n\n#include <FL/Fl_Tree_Item_Array.H>\n#include <FL/Fl_Tree_Prefs.H>\n\n//////////////////////\n// FL/Fl_Tree_Item.H\n//////////////////////\n//\n// Fl_Tree -- This file is part of the Fl_Tree widget for FLTK\n// Copyright (C) 2009-2010 by Greg Ercolano.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n///\n/// \\file\n/// \\brief This file contains the definitions for Fl_Tree_Item\n///\n\n/// \\class Fl_Tree_Item\n/// \\brief Tree widget item.\n///\n/// This class is a single tree item, and manages all of the item's attributes.\n/// Fl_Tree_Item is used by Fl_Tree, which is comprised of many instances of Fl_Tree_Item.\n///\n/// Fl_Tree_Item is hierarchical; it dynamically manages an Fl_Tree_Item_Array of children\n/// that are themselves instances of Fl_Tree_Item. Each item can have zero or more children.\n/// When an item has children, close() and open() can be used to hide or show them.\n///\n/// Items have their own attributes; font size, face, color.\n/// Items maintain their own hierarchy of children.\n///\n/// When you make changes to items, you'll need to tell the tree to redraw()\n/// for the changes to show up.\n///\n/// New 1.3.3 ABI feature:\n/// You can define custom items by either adding a custom widget to the item\n/// with Fl_Tree_Item::widget(), or override the draw_item_content() method\n/// if you want to just redefine how the label is drawn.\n///\n/// The following shows the Fl_Tree_Item's dimensions, useful when overriding\n/// the draw_item_content() method:\n///\n///   \\image html  Fl_Tree_Item-dimensions.png \"Fl_Tree_Item's internal dimensions.\" width=6cm\n///   \\image latex Fl_Tree_Item-dimensions.png \"Fl_Tree_Item's internal dimensions.\" width=6cm\n///\nclass Fl_Tree;\nclass FL_EXPORT Fl_Tree_Item {\n  Fl_Tree                *_tree;                // parent tree\n  const char             *_label;               // label (memory managed)\n  Fl_Font                 _labelfont;           // label's font face\n  Fl_Fontsize             _labelsize;           // label's font size\n  Fl_Color                _labelfgcolor;        // label's fg color\n  Fl_Color                _labelbgcolor;        // label's bg color (0xffffffff is 'transparent')\n  /// \\enum Fl_Tree_Item_Flags\n  enum Fl_Tree_Item_Flags {\n    OPEN                = 1<<0,         ///> item is open\n    VISIBLE             = 1<<1,         ///> item is visible\n    ACTIVE              = 1<<2,         ///> item is active\n    SELECTED            = 1<<3          ///> item is selected\n  };\n  unsigned short _flags;                // misc flags\n  int                     _xywh[4];             // xywh of this widget (if visible)\n  int                     _collapse_xywh[4];    // xywh of collapse icon (if visible)\n  int                     _label_xywh[4];       // xywh of label\n  Fl_Widget              *_widget;              // item's label widget (optional)\n  Fl_Image               *_usericon;            // item's user-specific icon (optional)\n  Fl_Image               *_userdeicon;          // deactivated usericon\n  Fl_Tree_Item_Array      _children;            // array of child items\n  Fl_Tree_Item           *_parent;              // parent item (=0 if root)\n  void                   *_userdata;            // user data that can be associated with an item\n  Fl_Tree_Item           *_prev_sibling;        // previous sibling (same level)\n  Fl_Tree_Item           *_next_sibling;        // next sibling (same level)\n  // Protected methods\nprotected:\n  void _Init(const Fl_Tree_Prefs &prefs, Fl_Tree *tree);\n  void show_widgets();\n  void hide_widgets();\n  void draw_vertical_connector(int x, int y1, int y2, const Fl_Tree_Prefs &prefs);\n  void draw_horizontal_connector(int x1, int x2, int y, const Fl_Tree_Prefs &prefs);\n  void recalc_tree();\n  int calc_item_height(const Fl_Tree_Prefs &prefs) const;\n  Fl_Color drawfgcolor() const;\n  Fl_Color drawbgcolor() const;\n\npublic:\n  Fl_Tree_Item(const Fl_Tree_Prefs &prefs);     // CTOR -- backwards compatible\n  Fl_Tree_Item(Fl_Tree *tree);                  // CTOR -- ABI 1.3.3+\n  virtual ~Fl_Tree_Item();                      // DTOR -- ABI 1.3.3+\n  Fl_Tree_Item(const Fl_Tree_Item *o);          // COPY CTOR\n  /// The item's x position relative to the window\n  int x() const { return(_xywh[0]); }\n  /// The item's y position relative to the window\n  int y() const { return(_xywh[1]); }\n  /// The entire item's width to right edge of Fl_Tree's inner width\n  /// within scrollbars.\n  int w() const { return(_xywh[2]); }\n  /// The item's height\n  int h() const { return(_xywh[3]); }\n  /// The item's label x position relative to the window\n  /// \\version 1.3.3\n  int label_x() const { return(_label_xywh[0]); }\n  /// The item's label y position relative to the window\n  /// \\version 1.3.3\n  int label_y() const { return(_label_xywh[1]); }\n  /// The item's maximum label width to right edge of Fl_Tree's inner width\n  /// within scrollbars.\n  /// \\version 1.3.3\n  int label_w() const { return(_label_xywh[2]); }\n  /// The item's label height\n  /// \\version 1.3.3\n  int label_h() const { return(_label_xywh[3]); }\n  virtual int draw_item_content(int render);\n  void draw(int X, int &Y, int W, Fl_Tree_Item *itemfocus,\n            int &tree_item_xmax, int lastchild=1, int render=1);\n  void show_self(const char *indent = \"\") const;\n  void label(const char *val);\n  const char *label() const;\n\n  /// Set a user-data value for the item.\n  inline void user_data( void* data ) { _userdata = data; }\n\n  /// Retrieve the user-data value that has been assigned to the item.\n  inline void* user_data() const { return _userdata; }\n\n  /// Set item's label font face.\n  void labelfont(Fl_Font val) {\n    _labelfont = val;\n    recalc_tree();              // may change tree geometry\n  }\n  /// Get item's label font face.\n  Fl_Font labelfont() const {\n    return(_labelfont);\n  }\n  /// Set item's label font size.\n  void labelsize(Fl_Fontsize val) {\n    _labelsize = val;\n    recalc_tree();              // may change tree geometry\n  }\n  /// Get item's label font size.\n  Fl_Fontsize labelsize() const {\n    return(_labelsize);\n  }\n  /// Set item's label foreground text color.\n  void labelfgcolor(Fl_Color val) {\n    _labelfgcolor = val;\n  }\n  /// Return item's label foreground text color.\n  Fl_Color labelfgcolor() const {\n    return(_labelfgcolor);\n  }\n  /// Set item's label text color. Alias for labelfgcolor(Fl_Color)).\n  void labelcolor(Fl_Color val) {\n     labelfgcolor(val);\n  }\n  /// Return item's label text color. Alias for labelfgcolor() const).\n  Fl_Color labelcolor() const {\n    return labelfgcolor();\n  }\n  /// Set item's label background color.\n  /// A special case is made for color 0xffffffff which uses the parent tree's bg color.\n  void labelbgcolor(Fl_Color val) {\n    _labelbgcolor = val;\n  }\n  /// Return item's label background text color.\n  /// If the color is 0xffffffff, the default behavior is the parent tree's\n  /// bg color will be used. (An overloaded draw_item_content() can override\n  /// this behavior.)\n  Fl_Color labelbgcolor() const {\n    return(_labelbgcolor);\n  }\n  /// Assign an FLTK widget to this item.\n  void widget(Fl_Widget *val) {\n    _widget = val;\n    recalc_tree();              // may change tree geometry\n  }\n  /// Return FLTK widget assigned to this item.\n  Fl_Widget *widget() const {\n    return(_widget);\n  }\n  /// Return the number of children this item has.\n  int children() const {\n    return(_children.total());\n  }\n  /// Return the child item for the given 'index'.\n  Fl_Tree_Item *child(int index) {\n    return(_children[index]);\n  }\n  /// Return the const child item for the given 'index'.\n  const Fl_Tree_Item *child(int t) const;\n  /// See if this item has children.\n  int has_children() const {\n    return(children());\n  }\n  int find_child(const char *name);\n  int find_child(Fl_Tree_Item *item);\n  int remove_child(Fl_Tree_Item *item);\n  int remove_child(const char *new_label);\n  void clear_children();\n  void swap_children(int ax, int bx);\n  int swap_children(Fl_Tree_Item *a, Fl_Tree_Item *b);\n  const Fl_Tree_Item *find_child_item(const char *name) const;\n        Fl_Tree_Item *find_child_item(const char *name);\n  const Fl_Tree_Item *find_child_item(char **arr) const;\n        Fl_Tree_Item *find_child_item(char **arr);\n  const Fl_Tree_Item *find_item(char **arr) const;\n        Fl_Tree_Item *find_item(char **arr);\n  //////////////////\n  // Adding items\n  //////////////////\n  Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs,\n                    const char *new_label,\n                    Fl_Tree_Item *newitem);\n  Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs,\n                    const char *new_label);\n  Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs,\n                    char **arr,\n                    Fl_Tree_Item *newitem);\n  Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs,\n                    char **arr);\n  Fl_Tree_Item *replace(Fl_Tree_Item *new_item);\n  Fl_Tree_Item *replace_child(Fl_Tree_Item *olditem, Fl_Tree_Item *newitem);\n  Fl_Tree_Item *insert(const Fl_Tree_Prefs &prefs, const char *new_label, int pos=0);\n  Fl_Tree_Item *insert_above(const Fl_Tree_Prefs &prefs, const char *new_label);\n  Fl_Tree_Item* deparent(int index);\n  int reparent(Fl_Tree_Item *newchild, int index);\n  int move(int to, int from);\n  int move(Fl_Tree_Item *item, int op=0, int pos=0);\n  int move_above(Fl_Tree_Item *item);\n  int move_below(Fl_Tree_Item *item);\n  int move_into(Fl_Tree_Item *item, int pos=0);\n  int depth() const;\n  Fl_Tree_Item *prev();\n  Fl_Tree_Item *next();\n  Fl_Tree_Item *next_sibling();\n  Fl_Tree_Item *prev_sibling();\n  void update_prev_next(int index);\n  Fl_Tree_Item *next_displayed(Fl_Tree_Prefs &prefs);   // deprecated\n  Fl_Tree_Item *prev_displayed(Fl_Tree_Prefs &prefs);   // deprecated\n  Fl_Tree_Item *next_visible(Fl_Tree_Prefs &prefs);\n  Fl_Tree_Item *prev_visible(Fl_Tree_Prefs &prefs);\n\n  /// Return the parent for this item. Returns NULL if we are the root.\n  Fl_Tree_Item *parent() {\n    return(_parent);\n  }\n  /// Return the const parent for this item. Returns NULL if we are the root.\n  const Fl_Tree_Item *parent() const {\n    return(_parent);\n  }\n  /// Set the parent for this item.\n  /// Should only be used by Fl_Tree's internals.\n  ///\n  void parent(Fl_Tree_Item *val) {\n    _parent = val;\n  }\n  const Fl_Tree_Prefs& prefs() const;\n  /// Return the tree for this item.\n  /// \\version 1.3.3\n  const Fl_Tree *tree() const {\n    return(_tree);\n  }\n  /// Return the tree for this item.\n  /// \\version 1.3.4\n  Fl_Tree *tree() {\n    return(_tree);\n  }\n  //////////////////\n  // State\n  //////////////////\n  void open();\n  void close();\n  /// See if the item is 'open'.\n  int is_open() const {\n    return(is_flag(OPEN));\n  }\n  /// See if the item is 'closed'.\n  int is_close() const {\n    return(is_flag(OPEN)?0:1);\n  }\n  /// Toggle the item's open/closed state.\n  void open_toggle() {\n    is_open()?close():open();   // handles calling recalc_tree()\n  }\n  /// Change the item's selection state to the optionally specified 'val'.\n  /// If 'val' is not specified, the item will be selected.\n  ///\n  void select(int val=1) {\n    set_flag(SELECTED, val);\n  }\n  /// Toggle the item's selection state.\n  void select_toggle() {\n    if ( is_selected() ) {\n      deselect();       // deselect if selected\n    } else {\n      select();         // select if deselected\n    }\n  }\n  /// Select item and all its children.\n  ///     Returns count of how many items were in the 'deselected' state,\n  ///     ie. how many items were \"changed\".\n  ///\n  int select_all() {\n    int count = 0;\n    if ( ! is_selected() ) {\n      select();\n      ++count;\n    }\n    for ( int t=0; t<children(); t++ ) {\n      count += child(t)->select_all();\n    }\n    return(count);\n  }\n  /// Disable the item's selection state.\n  void deselect() {\n    set_flag(SELECTED, 0);\n  }\n  /// Deselect item and all its children.\n  ///     Returns count of how many items were in the 'selected' state,\n  ///     ie. how many items were \"changed\".\n  ///\n  int deselect_all() {\n    int count = 0;\n    if ( is_selected() ) {\n      deselect();\n      ++count;\n    }\n    for ( int t=0; t<children(); t++ ) {\n      count += child(t)->deselect_all();\n    }\n    return(count);\n  }\n  /// See if the item is selected.\n  char is_selected() const {\n    return(is_flag(SELECTED));\n  }\n  /// Change the item's activation state to the optionally specified 'val'.\n  ///\n  /// When deactivated, the item will be 'grayed out'; the callback()\n  /// won't be invoked if the user clicks on the label. If a widget()\n  /// is associated with the item, its activation state will be changed as well.\n  ///\n  /// If 'val' is not specified, the item will be activated.\n  ///\n  void activate(int val=1) {\n    set_flag(ACTIVE,val);\n    if ( _widget && val != (int)_widget->active() ) {\n      if ( val ) {\n        _widget->activate();\n      } else {\n        _widget->deactivate();\n      }\n      _widget->redraw();\n    }\n  }\n  /// Deactivate the item; the callback() won't be invoked when clicked.\n  /// Same as activate(0)\n  ///\n  void deactivate() {\n    activate(0);\n  }\n  /// See if the item is activated.\n  char is_activated() const {\n    return(is_flag(ACTIVE));\n  }\n  /// See if the item is activated. Alias for is_activated().\n  char is_active() const {\n    return(is_activated());\n  }\n  /// See if the item is visible. Alias for is_visible().\n  int visible() const {\n    return(is_visible());\n  }\n  /// See if the item is visible.\n  int is_visible() const {\n    return(is_flag(VISIBLE));\n  }\n  /// See if item and all its parents are open() and visible().\n  /// Alias for is_visible_r().\n  /// \\returns\n  ///    1 -- item and its parents are open() and visible()\n  ///    0 -- item (or one of its parents) are not visible or close()ed.\n  ///\n  int visible_r() const {\n    return(is_visible_r());\n  }\n  int is_visible_r() const;\n\n  /// Set the item's user icon to an Fl_Image. Use '0' to disable.\n  /// No internal copy is made, caller must manage icon's memory.\n  ///\n  /// Note, if you expect your items to be deactivated(),\n  /// use userdeicon(Fl_Image*) to set up a 'grayed out' version of your icon\n  /// to be used for display.\n  ///\n  /// \\see userdeicon(Fl_Image*)\n  ///\n  void usericon(Fl_Image *val) {\n    _usericon = val;\n    recalc_tree();              // may change tree geometry\n  }\n  /// Get the item's user icon as an Fl_Image. Returns '0' if disabled.\n  Fl_Image *usericon() const {\n    return(_usericon);\n  }\n  /// Set the usericon to draw when the item is deactivated. Use '0' to disable.\n  /// No internal copy is made; caller must manage icon's memory.\n  ///\n  /// To create a typical 'grayed out' version of your usericon image,\n  /// you can do the following:\n  ///\n  /// \\code\n  ///      // Create tree + usericon for items\n  ///      Fl_Tree *tree = new Fl_Tree(..);\n  ///      Fl_Image *usr_icon = new Fl_Pixmap(..); // your usericon\n  ///      Fl_Image *de_icon  = usr_icon->copy();  // make a copy, and..\n  ///      de_icon->inactive();                    // make it 'grayed out'\n  ///      ...\n  ///      for ( .. ) {                 // item loop..\n  ///        item = tree->add(\"...\");   // create new item\n  ///        item->usericon(usr_icon);  // assign usericon to items\n  ///        item->userdeicon(de_icon); // assign userdeicon to items\n  ///        ..\n  ///      }\n  /// \\endcode\n  ///\n  /// In the above example, the app should 'delete' the two icons\n  /// when they're no longer needed (e.g. after the tree is destroyed)\n  ///\n  /// \\version 1.3.4\n  ///\n  void userdeicon(Fl_Image* val) {\n    _userdeicon = val;\n  }\n  /// Return the deactivated version of the user icon, if any.\n  /// Returns 0 if none.\n  Fl_Image* userdeicon() const {\n    return _userdeicon;\n  }\n  //////////////////\n  // Events\n  //////////////////\n  const Fl_Tree_Item* find_clicked(const Fl_Tree_Prefs &prefs, int yonly=0) const;\n  Fl_Tree_Item* find_clicked(const Fl_Tree_Prefs &prefs, int yonly=0);\n  int event_on_item(const Fl_Tree_Prefs &prefs) const;\n  int event_on_collapse_icon(const Fl_Tree_Prefs &prefs) const;\n  int event_on_user_icon(const Fl_Tree_Prefs &prefs) const;\n  int event_on_label(const Fl_Tree_Prefs &prefs) const;\n  /// Is this item the root of the tree?\n  int is_root() const {\n    return(_parent==0?1:0);\n  }\n\n  // Protected methods\n  // TODO: move these to top 'protected:' section\nprotected:\n  /// Set a flag to an on or off value. val is 0 or 1.\n  inline void set_flag(unsigned short flag,int val) {\n    if ( flag==OPEN || flag==VISIBLE ) {\n      recalc_tree();            // may change tree geometry\n    }\n    if ( val ) _flags |= flag; else _flags &= ~flag;\n  }\n  /// See if flag set. Returns 0 or 1.\n  inline int is_flag(unsigned short val) const {\n    return(_flags & val ? 1 : 0);\n  }\n\n};\n\n#endif /*FL_TREE_ITEM_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tree_Item_Array.H",
    "content": "//\n\n#ifndef _FL_TREE_ITEM_ARRAY_H\n#define _FL_TREE_ITEM_ARRAY_H\n\n#include <FL/Fl.H>\n#include \"Fl_Export.H\"\n\nclass FL_EXPORT Fl_Tree_Item;   // forward decl must *precede* first doxygen comment block\n                                // or doxygen will not document our class..\n\n//////////////////////////\n// FL/Fl_Tree_Item_Array.H\n//////////////////////////\n//\n// Fl_Tree -- This file is part of the Fl_Tree widget for FLTK\n// Copyright (C) 2009-2010 by Greg Ercolano.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n///\n/// \\file\n/// \\brief This file defines a class that manages an array of Fl_Tree_Item pointers.\n///\n\n/// \\brief Manages an array of Fl_Tree_Item pointers.\n///\n/// Because FLTK 1.x.x. has mandated that templates and STL not be used,\n/// we use this class to dynamically manage the arrays.\n///\n/// None of the methods do range checking on index values; the caller\n/// must be sure that index values are within the range 0<index<total()\n/// (unless otherwise noted).\n///\n\nclass FL_EXPORT Fl_Tree_Item_Array {\n  Fl_Tree_Item **_items;        // items array\n  int _total;                   // #items in array\n  int _size;                    // #items *allocated* for array\n  int _chunksize;               // #items to enlarge mem allocation\n  enum {\n    MANAGE_ITEM = 1             ///> manage the Fl_Tree_Item's internals (internal use only)\n  };\n  char _flags;                  // flags to control behavior\n  void enlarge(int count);\npublic:\n  Fl_Tree_Item_Array(int new_chunksize = 10);           // CTOR\n  ~Fl_Tree_Item_Array();                                // DTOR\n  Fl_Tree_Item_Array(const Fl_Tree_Item_Array *o);      // COPY CTOR\n  /// Return the item and index \\p i.\n  Fl_Tree_Item *operator[](int i) {\n    return(_items[i]);\n  }\n  /// Const version of operator[](int i)\n  const Fl_Tree_Item *operator[](int i) const {\n    return(_items[i]);\n  }\n  /// Return the total items in the array, or 0 if empty.\n  int total() const {\n    return(_total);\n  }\n  /// Swap the two items at index positions \\p ax and \\p bx.\n  void swap(int ax, int bx);\n  int move(int to, int from);\n  int deparent(int pos);\n  int reparent(Fl_Tree_Item *item, Fl_Tree_Item *newparent, int pos);\n  void clear();\n  void add(Fl_Tree_Item *val);\n  void insert(int pos, Fl_Tree_Item *new_item);\n  void replace(int pos, Fl_Tree_Item *new_item);\n  void remove(int index);\n  int  remove(Fl_Tree_Item *item);\n  /// Option to control if Fl_Tree_Item_Array's destructor will also destroy the Fl_Tree_Item's.\n  /// If set: items and item array is destroyed.\n  /// If clear: only the item array is destroyed, not items themselves.\n  void manage_item_destroy(int val) {\n    if ( val ) _flags |= MANAGE_ITEM; else _flags &= ~MANAGE_ITEM;\n  }\n  int manage_item_destroy() const {\n    return _flags & MANAGE_ITEM ? 1 : 0;\n  }\n};\n\n#endif /*_FL_TREE_ITEM_ARRAY_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Tree_Prefs.H",
    "content": "//\n\n#ifndef FL_TREE_PREFS_H\n#define FL_TREE_PREFS_H\n\n#include <FL/Fl.H>      // needed for ABI version features (via Enumerations.H)\n\n//////////////////////\n// FL/Fl_Tree_Prefs.H\n//////////////////////\n//\n// Fl_Tree_Prefs -- This file is part of the Fl_Tree widget for FLTK\n// Copyright (C) 2009-2010 by Greg Ercolano.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n///\n/// \\file\n/// \\brief This file contains the definitions for Fl_Tree's preferences.\n///\n/// \\code\n///                  Fl_Tree_Prefs\n///                       :\n///                  .....:.......\n///                  :           :\n///               Fl_Tree        :\n///                  |_____ Fl_Tree_Item\n///\n/// \\endcode\n///\n\n/// \\class Fl_Tree_Prefs\n/// \\brief Tree widget's preferences.\n\n/// \\enum Fl_Tree_Sort\n/// Sort order options for items added to the tree\n///\nenum Fl_Tree_Sort {\n  FL_TREE_SORT_NONE=0,          ///< No sorting; items are added in the order defined (default).\n  FL_TREE_SORT_ASCENDING=1,     ///< Add items in ascending sort order.\n  FL_TREE_SORT_DESCENDING=2     ///< Add items in descending sort order.\n};\n\n/// \\enum Fl_Tree_Connector\n/// Defines the style of connection lines between items.\n///\nenum Fl_Tree_Connector {\n  FL_TREE_CONNECTOR_NONE=0,     ///< Use no lines connecting items\n  FL_TREE_CONNECTOR_DOTTED=1,   ///< Use dotted lines connecting items (default)\n  FL_TREE_CONNECTOR_SOLID=2     ///< Use solid lines connecting items\n};\n\n/// \\enum Fl_Tree_Select\n/// Tree selection style.\n///\nenum Fl_Tree_Select {\n  FL_TREE_SELECT_NONE=0,            ///< Nothing selected when items are clicked\n  FL_TREE_SELECT_SINGLE=1,          ///< Single item selected when item is clicked (default)\n  FL_TREE_SELECT_MULTI=2,           ///< Multiple items can be selected by clicking\n                                    ///< with SHIFT, CTRL or mouse drags.\n  FL_TREE_SELECT_SINGLE_DRAGGABLE=3 ///< Single items may be selected, and they may be\n                                    ///< reordered by mouse drag.\n};\n\n/// \\enum Fl_Tree_Item_Reselect_Mode\n/// Defines the ways an item can be (re) selected\n/// via item_reselect_mode().\n///\nenum Fl_Tree_Item_Reselect_Mode {\n  FL_TREE_SELECTABLE_ONCE=0,    ///< Item can only be selected once (default)\n  FL_TREE_SELECTABLE_ALWAYS     ///< Enables FL_TREE_REASON_RESELECTED events for callbacks\n};\n\n/// \\enum Fl_Tree_Item_Draw_Mode\n/// Bit flags that control how item's labels and widget()s are drawn in the tree\n/// via item_draw_mode().\n///\nenum Fl_Tree_Item_Draw_Mode {\n  FL_TREE_ITEM_DRAW_DEFAULT=0,          ///< If widget() defined, draw in place of label,\n                                        ///< and widget() tracks item height (default)\n  FL_TREE_ITEM_DRAW_LABEL_AND_WIDGET=1, ///< If widget() defined, include label to the left of the widget\n  FL_TREE_ITEM_HEIGHT_FROM_WIDGET=2     ///< If widget() defined, widget()'s height controls item's height\n};\n\nclass Fl_Tree_Item;\ntypedef void (Fl_Tree_Item_Draw_Callback)(Fl_Tree_Item*, void*);\n\n/// \\class Fl_Tree_Prefs\n///\n/// \\brief Fl_Tree's Preferences class.\n///\n/// This class manages the Fl_Tree's defaults.\n/// You should probably be using the methods in Fl_Tree\n/// instead of trying to accessing tree's preferences settings directly.\n///\nclass FL_EXPORT Fl_Tree_Prefs {\n  Fl_Font _labelfont;                   // label's font face\n  Fl_Fontsize _labelsize;               // label's font size\n  int _margintop;                       // --\n  int _marginleft;                      //   |- tree's controllable margins\n  int _marginbottom;                    // --\n  int _openchild_marginbottom;          // extra space below an open child tree\n  int _usericonmarginleft;              // space to left of user icon (if any)\n  int _labelmarginleft;                 // space to left of label\n  int _widgetmarginleft;                // space to left of widget\n  int _connectorwidth;                  // connector width (right of open/close icon)\n  int _linespacing;                     // vertical space between lines\n  // Colors\n  Fl_Color _labelfgcolor;               // label's foreground color\n  Fl_Color _labelbgcolor;               // label's background color\n  Fl_Color _connectorcolor;             // connector dotted line color\n  Fl_Tree_Connector _connectorstyle;    // connector line style\n  Fl_Image *_openimage;                 // the 'open' icon [+]\n  Fl_Image *_closeimage;                // the 'close' icon [-]\n  Fl_Image *_userimage;                 // user's own icon\n  Fl_Image *_opendeimage;               // deactivated 'open' icon\n  Fl_Image *_closedeimage;              // deactivated 'close' icon\n  Fl_Image *_userdeimage;               // deactivated user icon\n  char _showcollapse;                   // 1=show collapse icons, 0=don't\n  char _showroot;                       // show the root item as part of the tree\n  Fl_Tree_Sort   _sortorder;            // none, ascening, descending, etc.\n  Fl_Boxtype     _selectbox;            // selection box type\n  Fl_Tree_Select _selectmode;           // selection mode\n  Fl_Tree_Item_Reselect_Mode _itemreselectmode; // controls item selection callback() behavior\n  Fl_Tree_Item_Draw_Mode     _itemdrawmode;     // controls how items draw label + widget()\n  Fl_Tree_Item_Draw_Callback *_itemdrawcallback;        // callback to handle drawing items (0=none)\n  void                       *_itemdrawuserdata;        // data for drawing items (0=none)\npublic:\n  Fl_Tree_Prefs();\n  ~Fl_Tree_Prefs();\n\n  ////////////////////////////\n  // Labels\n  ////////////////////////////\n  /// Return the label's font.\n  inline Fl_Font item_labelfont() const { return(_labelfont); }\n  /// Set the label's font to \\p val.\n  inline void item_labelfont(Fl_Font val) { _labelfont = val; }\n  /// Return the label's size in pixels.\n  inline Fl_Fontsize item_labelsize() const { return(_labelsize); }\n  /// Set the label's size in pixels to \\p val.\n  inline void item_labelsize(Fl_Fontsize val) { _labelsize = val; }\n  /// Get the default label foreground color\n  inline Fl_Color item_labelfgcolor() const { return(_labelfgcolor); }\n  /// Set the default label foreground color\n  inline void item_labelfgcolor(Fl_Color val) { _labelfgcolor = val; }\n  /// Get the default label background color.\n  ///    This returns the Fl_Tree::color() unless item_labelbgcolor()\n  ///    has been set explicitly.\n  ///\n  inline Fl_Color item_labelbgcolor() const {\n    return _labelbgcolor;\n  }\n  /// Set the default label background color.\n  ///     Once set, overrides the default behavior of using Fl_Tree::color().\n  ///\n  inline void item_labelbgcolor(Fl_Color val) {\n    _labelbgcolor = val;\n  }\n\n  /////////////////\n  // Obsolete names - for 1.3.0 backwards compat\n  /////////////////\n  /// Obsolete: Return the label's font. Please use item_labelfont() instead.\n  inline Fl_Font labelfont() const { return(_labelfont); }\n  /// Obsolete: Set the label's font to \\p val. Please use item_labelfont(Fl_Font) instead.\n  inline void labelfont(Fl_Font val) { _labelfont = val; }\n  /// Obsolete: Return the label's size in pixels. Please use item_labelsize() instead.\n  inline Fl_Fontsize labelsize() const { return(_labelsize); }\n  /// Obsolete: Set the label's size in pixels to \\p val. Please use item_labelsize(Fl_Fontsize) instead.\n  inline void labelsize(Fl_Fontsize val) { _labelsize = val; }\n  /// Obsolete: Get the default label foreground color. Please use item_labelfgcolor() instead.\n  inline Fl_Color labelfgcolor() const { return(_labelfgcolor); }\n  /// Obsolete: Set the default label foreground color. Please use item_labelfgcolor(Fl_Color) instead.\n  inline void labelfgcolor(Fl_Color val) { _labelfgcolor = val; }\n  /// Obsolete: Get the default label background color. Please use item_labelbgcolor() instead.\n  inline Fl_Color labelbgcolor() const { return(item_labelbgcolor()); }\n  /// Obsolete: Set the default label background color. Please use item_labelbgcolor(Fl_Color) instead.\n  inline void labelbgcolor(Fl_Color val) { item_labelbgcolor(val); }\n\n  ////////////////////////////\n  // Margins\n  ////////////////////////////\n  /// Get the left margin's value in pixels\n  inline int marginleft() const {\n    return(_marginleft);\n  }\n  /// Set the left margin's value in pixels\n  inline void marginleft(int val) {\n    _marginleft = val;\n  }\n  /// Get the top margin's value in pixels\n  inline int margintop() const {\n    return(_margintop);\n  }\n  /// Set the top margin's value in pixels\n  inline void margintop(int val) {\n    _margintop = val;\n  }\n  /// Get the bottom margin's value in pixels.\n  /// This is the extra distance the vertical scroller lets you travel.\n  inline int marginbottom() const {\n    return(_marginbottom);\n  }\n  /// Set the bottom margin's value in pixels\n  /// This is the extra distance the vertical scroller lets you travel.\n  inline void marginbottom(int val) {\n    _marginbottom = val;\n  }\n  /// Get the margin below an open child in pixels\n  inline int openchild_marginbottom() const {\n    return(_openchild_marginbottom);\n  }\n  /// Set the margin below an open child in pixels\n  inline void openchild_marginbottom(int val) {\n    _openchild_marginbottom = val;\n  }\n  /// Get the user icon's left margin value in pixels\n  inline int usericonmarginleft() const {\n    return(_usericonmarginleft);\n  }\n  /// Set the user icon's left margin value in pixels\n  inline void usericonmarginleft(int val) {\n    _usericonmarginleft = val;\n  }\n  /// Get the label's left margin value in pixels\n  inline int labelmarginleft() const {\n    return(_labelmarginleft);\n  }\n  /// Set the label's left margin value in pixels\n  inline void labelmarginleft(int val) {\n    _labelmarginleft = val;\n  }\n  /// Get the widget()'s left margin value in pixels\n  inline int widgetmarginleft() const {\n    return(_widgetmarginleft);\n  }\n  /// Set the widget's left margin value in pixels\n  inline void widgetmarginleft(int val) {\n    _widgetmarginleft = val;\n  }\n  /// Get the line spacing value in pixels\n  inline int linespacing() const {\n    return(_linespacing);\n  }\n  /// Set the line spacing value in pixels\n  inline void linespacing(int val) {\n    _linespacing = val;\n  }\n\n  ////////////////////////////\n  // Colors and Styles\n  ////////////////////////////\n  /// Get the connector color used for tree connection lines.\n  inline Fl_Color connectorcolor() const {\n    return(_connectorcolor);\n  }\n  /// Set the connector color used for tree connection lines.\n  inline void connectorcolor(Fl_Color val) {\n    _connectorcolor = val;\n  }\n  /// Get the connector style.\n  inline Fl_Tree_Connector connectorstyle() const {\n    return(_connectorstyle);\n  }\n  /// Set the connector style.\n  inline void connectorstyle(Fl_Tree_Connector val) {\n    _connectorstyle = val;\n  }\n  /// Set the connector style [integer].\n  inline void connectorstyle(int val) {\n    _connectorstyle = Fl_Tree_Connector(val);\n  }\n  /// Get the tree connection line's width.\n  inline int connectorwidth() const {\n    return(_connectorwidth);\n  }\n  /// Set the tree connection line's width.\n  inline void connectorwidth(int val) {\n    _connectorwidth = val;\n  }\n\n  ////////////////////////////\n  // Icons\n  ////////////////////////////\n  /// Get the current default 'open' icon.\n  ///     Returns the Fl_Image* of the icon, or 0 if none.\n  ///\n  inline Fl_Image *openicon() const {\n    return(_openimage);\n  }\n  inline int openicon_w() const { return _openimage ? _openimage->w() : 11; }\n  inline int openicon_h() const { return _openimage ? _openimage->h() : 11; }\n  void openicon(Fl_Image *val);\n  /// Gets the default 'close' icon\n  ///     Returns the Fl_Image* of the icon, or 0 if none.\n  ///\n  inline Fl_Image *closeicon() const {\n    return(_closeimage);\n  }\n  inline int closeicon_w() const { return _closeimage ? _closeimage->w() : 11; }\n  inline int closeicon_h() const { return _closeimage ? _closeimage->h() : 11; }\n  void closeicon(Fl_Image *val);\n  /// Gets the default 'user icon' (default is 0)\n  inline Fl_Image *usericon() const {\n    return(_userimage);\n  }\n  /// Sets the default 'user icon'\n  ///     Returns the Fl_Image* of the icon, or 0 if none (default).\n  ///\n  inline void usericon(Fl_Image *val) {\n    _userimage = val;\n    // Update deactivated version of icon..\n    if ( _userdeimage ) delete _userdeimage;\n    if ( _userimage ) {\n      _userdeimage = _userimage->copy();\n      _userdeimage->inactive();\n    } else {\n      _userdeimage = 0;\n    }\n  }\n\n  /// Return the deactivated version of the open icon, if any.\n  /// Returns 0 if none.\n  inline Fl_Image *opendeicon() const {\n    return _opendeimage;\n  }\n  /// Return the deactivated version of the close icon, if any.\n  /// Returns 0 if none.\n  inline Fl_Image *closedeicon() const {\n    return _closedeimage;\n  }\n  /// Return the deactivated version of the user icon, if any.\n  /// Returns 0 if none.\n  inline Fl_Image *userdeicon() const {\n    return _userdeimage;\n  }\n\n  ////////////////////////////\n  // Options\n  ////////////////////////////\n  /// Returns 1 if the collapse icon is enabled, 0 if not.\n  inline char showcollapse() const {\n    return(_showcollapse);\n  }\n  /// Set if we should show the collapse icon or not.\n  /// If collapse icons are disabled, the user will not be able\n  /// to interactively collapse items in the tree, unless the application\n  /// provides some other means via open() and close().\n  ///\n  /// \\param[in] val 1: shows collapse icons (default),\\n\n  ///                0: hides collapse icons.\n  ///\n  inline void showcollapse(int val) {\n    _showcollapse = val;\n  }\n  /// Get the default sort order value\n  inline Fl_Tree_Sort sortorder() const {\n    return(_sortorder);\n  }\n  /// Set the default sort order value.\n  ///     Defines the order new items appear when add()ed to the tree.\n  ///     See Fl_Tree_Sort for possible values.\n  ///\n  inline void sortorder(Fl_Tree_Sort val) {\n    _sortorder = val;\n  }\n  /// Get the default selection box's box drawing style as an Fl_Boxtype.\n  inline Fl_Boxtype selectbox() const {\n    return(_selectbox);\n  }\n  /// Set the default selection box's box drawing style to \\p val.\n  inline void selectbox(Fl_Boxtype val) {\n    _selectbox = val;\n  }\n  /// Returns 1 if the root item is to be shown, or 0 if not.\n  inline int showroot() const {\n    return(int(_showroot));\n  }\n  /// Set if the root item should be shown or not.\n  /// \\param[in] val 1 -- show the root item (default)\\n\n  ///                0 -- hide the root item.\n  ///\n  inline void showroot(int val) {\n    _showroot = char(val);\n  }\n  /// Get the selection mode used for the tree\n  inline Fl_Tree_Select selectmode() const {\n    return(_selectmode);\n  }\n  /// Set the selection mode used for the tree to \\p val.\n  ///     This affects how items in the tree are selected\n  ///     when clicked on and dragged over by the mouse.\n  ///     See Fl_Tree_Select for possible values.\n  ///\n  inline void selectmode(Fl_Tree_Select val) {\n    _selectmode = val;\n  }\n  /// Returns the current item re/selection mode\n  Fl_Tree_Item_Reselect_Mode item_reselect_mode() const {\n    return _itemreselectmode;\n  }\n  /// Sets the item re/selection mode\n  void item_reselect_mode(Fl_Tree_Item_Reselect_Mode mode) {\n    _itemreselectmode = mode;\n  }\n  /// Get the 'item draw mode' used for the tree\n  inline Fl_Tree_Item_Draw_Mode item_draw_mode() const {\n    return(_itemdrawmode);\n  }\n  /// Set the 'item draw mode' used for the tree to \\p val.\n  ///     This affects how items in the tree are drawn,\n  ///     such as when a widget() is defined.\n  ///     See Fl_Tree_Item_Draw_Mode for possible values.\n  ///\n  inline void item_draw_mode(Fl_Tree_Item_Draw_Mode val) {\n    _itemdrawmode = val;\n  }\n  void item_draw_callback(Fl_Tree_Item_Draw_Callback *cb, void *data=0) {\n    _itemdrawcallback = cb;\n    _itemdrawuserdata = data;\n  }\n  Fl_Tree_Item_Draw_Callback* item_draw_callback() const {\n    return(_itemdrawcallback);\n  }\n  void* item_draw_user_data() const {\n    return(_itemdrawuserdata);\n  }\n  void do_item_draw_callback(Fl_Tree_Item *o) const {\n    _itemdrawcallback(o, _itemdrawuserdata);\n  }\n};\n\n#endif /*FL_TREE_PREFS_H*/\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Valuator.H",
    "content": "//\n// Valuator header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Valuator widget . */\n\n#ifndef Fl_Valuator_H\n#define Fl_Valuator_H\n\n#ifndef Fl_Widget_H\n#include \"Fl_Widget.H\"\n#endif\n\n// shared type() values for classes that work in both directions:\n#define FL_VERTICAL             0 ///< The valuator can work vertically\n#define FL_HORIZONTAL           1 ///< The valuator can work horizontally\n\n/**\n  The Fl_Valuator class controls a single floating-point value\n  and provides a consistent interface to set the value, range, and step,\n  and insures that callbacks are done the same for every object.\n\n  There are probably more of these classes in FLTK than any others:\n\n  \\image html  valuators.png\n  \\image latex valuators.png \"Valuators derived from Fl_Valuators\" width=10cm\n\n  In the above diagram each box surrounds an actual subclass.  These\n  are further differentiated by setting the type() of the widget to\n  the symbolic value labeling the widget.\n  The ones labelled \"0\" are the default versions with a type(0).\n  For consistency the symbol FL_VERTICAL is defined as zero.\n*/\nclass FL_EXPORT Fl_Valuator : public Fl_Widget {\n\n  double value_;\n  double previous_value_;\n  double min, max; // truncates to this range *after* rounding\n  double A; int B; // rounds to multiples of A/B, or no rounding if A is zero\n\nprotected:\n  /** Tells if the valuator is an FL_HORIZONTAL one */\n  int horizontal() const {return type()& FL_HORIZONTAL;}\n  Fl_Valuator(int X, int Y, int W, int H, const char* L);\n\n  /** Gets the previous floating point value before an event changed it */\n  double previous_value() const {return previous_value_;}\n  /** Stores the current value in the previous value */\n  void handle_push() {previous_value_ = value_;}\n  double softclamp(double);\n  void handle_drag(double newvalue);\n  void handle_release(); // use drag() value\n  virtual void value_damage(); // cause damage() due to value() changing\n  /** Sets the current floating point value. */\n  void set_value(double v) {value_ = v;}\n\npublic:\n\n  /** Destructor is accessible despite protected constructor. */\n  ~Fl_Valuator() FL_OVERRIDE { }\n    /**    Sets the minimum (a) and maximum (b) values for the valuator widget. */\n    void bounds(double a, double b) {min=a; max=b;}\n    /**    Gets the minimum value for the valuator.  */\n    double minimum() const {return min;}\n    /**    Sets the minimum value for the valuator.  */\n    void minimum(double a) {min = a;}\n    /**    Gets the maximum value for the valuator.  */\n    double maximum() const {return max;}\n    /**    Sets the maximum value for the valuator.  */\n    void maximum(double a) {max = a;}\n  /**\n    Sets the minimum and maximum values for the valuator. When\n    the user manipulates the widget, the value is limited to this\n    range. This clamping is done <I>after</I> rounding to the step\n    value (this makes a difference if the range is not a multiple of\n    the step).\n\n    The minimum may be greater than the maximum. This has the\n    effect of \"reversing\" the object so the larger values\n    are in the opposite direction. This also switches which end of\n    the filled sliders is filled.\n\n    Some widgets consider this a \"soft\" range.  This\n    means they will stop at the range, but if the user releases and\n    grabs the control again and tries to move it further, it is\n    allowed.\n\n    The range may affect the display. You must redraw()\n    the widget after changing the range.\n  */\n  void range(double a, double b) {min = a; max = b;}\n  /**    See double Fl_Valuator::step() const   */\n  void step(int a) {A = a; B = 1;}\n  /**    See double Fl_Valuator::step() const   */\n  void step(double a, int b) {A = a; B = b;}\n  void step(double s);\n  /**\n    Gets or sets the step value. As the user moves the mouse the\n    value is rounded to the nearest multiple of the step value. This\n    is done \\e before clamping it to the range. For most widgets\n    the default step is zero.\n\n    For precision the step is stored as the ratio of a double \\p A and\n    an integer \\p B = A/B. You can set these values directly. Currently\n    setting a floating point value sets the nearest A/1 or 1/B value\n    possible.\n  */\n  double step() const {return A/B;}\n  void precision(int digits);\n\n  /** Gets the floating point(double) value. See int value(double) */\n  double value() const {return value_;}\n  int value(double);\n\n  virtual int format(char*);\n  double round(double); // round to nearest multiple of step\n  double clamp(double); // keep in range\n  double increment(double, int); // add n*step to value\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Value_Input.H",
    "content": "//\n// Value input header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Value_Input widget . */\n\n#ifndef Fl_Value_Input_H\n#define Fl_Value_Input_H\n\n#include \"Fl_Valuator.H\"\n#include \"Fl_Input.H\"\n\n/**\n  The Fl_Value_Input widget displays a numeric value.\n  The user can click in the text field and edit it - there is in\n  fact a hidden Fl_Input widget with\n  type(FL_FLOAT_INPUT) or type(FL_INT_INPUT) in\n  there - and when they hit return or tab the value updates to\n  what they typed and the callback is done.\n\n  <P>If step() is non-zero and integral, then the range of numbers\n  is limited to integers instead of floating point numbers. As\n  well as displaying the value as an integer, typed input is also\n  limited to integer values, even if the hidden Fl_Input widget\n  is of type(FL_FLOAT_INPUT).</P>\n\n  <P>If step() is non-zero, the user can also drag the\n  mouse across the object and thus slide the value. The left\n  button moves one step() per pixel, the middle by 10\n  * step(), and the right button by 100 * step(). It\n  is therefore impossible to select text by dragging across it,\n  although clicking can still move the insertion cursor.</P>\n\n  If step() is non-zero and integral, then the range\n  of numbers are limited to integers instead of floating point\n  values.\n\n  \\image html Fl_Value_Input.png\n  \\image latex  Fl_Value_Input.png \"Fl_Value_Input\" width=4cm\n\n  \\see Fl_Widget::shortcut_label(int)\n*/\nclass FL_EXPORT Fl_Value_Input : public Fl_Valuator {\npublic:\n  /* This is the encapsulated Fl_input attribute to which\n  this class delegates the value font, color and shortcut */\n  Fl_Input input;\nprivate:\n  char soft_;\n  static void input_cb(Fl_Widget*,void*);\n  void value_damage() FL_OVERRIDE; // cause damage() due to value() changing\npublic:\n  int handle(int) FL_OVERRIDE;\nprotected:\n  void draw() FL_OVERRIDE;\npublic:\n  void resize(int,int,int,int) FL_OVERRIDE;\n  Fl_Value_Input(int x,int y,int w,int h,const char *l=0);\n  ~Fl_Value_Input();\n\n  /** See void Fl_Value_Input::soft(char s) */\n  void soft(char s) {soft_ = s;}\n  /**\n    If \"soft\" is turned on, the user is allowed to drag\n    the value outside the range. If they drag the value to one of\n    the ends, let go, then grab again and continue to drag, they can\n    get to any value. The default is true.\n  */\n  char soft() const {return soft_;}\n  /**\n   Returns the current shortcut key for the Input.\n   \\see Fl_Value_Input::shortcut(int)\n  */\n  int shortcut() const {return input.shortcut();}\n  /**\n   Sets the shortcut key to \\p s. Setting this\n   overrides the use of '&' in the label().  The value is a bitwise\n   OR of a key and a set of shift flags, for example FL_ALT | 'a'\n   , FL_ALT | (FL_F + 10), or just 'a'.  A value\n   of 0 disables the shortcut.\n\n   The key can be any value returned by\n   Fl::event_key(), but will usually be an ASCII letter.  Use\n   a lower-case letter unless you require the shift key to be held down.\n\n   The shift flags can be any set of values accepted by\n   Fl::event_state().  If the bit is on that shift key must\n   be pushed.  Meta, Alt, Ctrl, and Shift must be off if they are not in\n   the shift flags (zero for the other bits indicates a \"don't care\"\n   setting).\n   */\n  void shortcut(int s) {input.shortcut(s);}\n\n  /** Gets the typeface of the text in the value box.  */\n  Fl_Font textfont() const {return input.textfont();}\n  /** Sets the typeface of the text in the value box.  */\n  void textfont(Fl_Font s) {input.textfont(s);}\n  /** Gets the size of the text in the value box.  */\n  Fl_Fontsize textsize() const {return input.textsize();}\n  /** Sets the size of the text in the value box.  */\n  void textsize(Fl_Fontsize s) {input.textsize(s);}\n  /** Gets the color of the text in the value box.  */\n  Fl_Color textcolor() const {return input.textcolor();}\n  /** Sets the color of the text in the value box.*/\n  void textcolor(Fl_Color n) {input.textcolor(n);}\n  /** Gets the color of the text cursor. The text cursor is black by default. */\n  Fl_Color cursor_color() const {return input.cursor_color();}\n  /** Sets the color of the text cursor. The text cursor is black by default. */\n  void cursor_color(Fl_Color n) {input.cursor_color(n);}\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Value_Output.H",
    "content": "//\n// Value output header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Value_Output widget . */\n\n#ifndef Fl_Value_Output_H\n#define Fl_Value_Output_H\n\n#ifndef Fl_Valuator_H\n#include \"Fl_Valuator.H\"\n#endif\n\n/**\n  The Fl_Value_Output widget displays a floating point value.\n  If step() is not zero, the user can adjust the value by\n  dragging the mouse left and right.  The left button moves one step()\n  per pixel, the middle by 10 * step(), and the right button by\n  100 * step().\n  <P>This is much lighter-weight than\n  Fl_Value_Input because it contains no text editing code or\n  character buffer. </P>\n  \\image html  Fl_Value_Output.png\n  \\image latex Fl_Value_Output.png \"Fl_Value_Output\" width=4cm\n*/\nclass FL_EXPORT Fl_Value_Output : public Fl_Valuator {\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  uchar soft_;\n  Fl_Color textcolor_;\n\nprotected:\n  void draw() FL_OVERRIDE;\n\npublic:\n  int handle(int) FL_OVERRIDE;\n  Fl_Value_Output(int x,int y,int w,int h,const char *l=0);\n\n  /**\n    If \"soft\" is turned on, the user is allowed to drag the value outside\n    the range.  If they drag the value to one of the ends, let go, then\n    grab again and continue to drag, they can get to any value.  Default is\n    one.\n  */\n  void soft(uchar s) {soft_ = s;}\n  /**\n    If \"soft\" is turned on, the user is allowed to drag the value outside\n    the range.  If they drag the value to one of the ends, let go, then\n    grab again and continue to drag, they can get to any value.  Default is\n    one.\n  */\n  uchar soft() const {return soft_;}\n\n  /**    Gets the typeface of the text in the value box.  */\n  Fl_Font textfont() const {return textfont_;}\n  /**    Sets the typeface of the text in the value box.  */\n  void textfont(Fl_Font s) {textfont_ = s;}\n  /**    Gets the size of the text in the value box.  */\n  Fl_Fontsize textsize() const {return textsize_;}\n  void textsize(Fl_Fontsize s) {textsize_ = s;}\n  /**    Sets the color of the text in the value box.  */\n  Fl_Color textcolor() const {return textcolor_;}\n  /**    Gets the color of the text in the value box.  */\n  void textcolor(Fl_Color s) {textcolor_ = s;}\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Value_Slider.H",
    "content": "//\n// Value Slider header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Value_Slider widget . */\n\n#ifndef Fl_Value_Slider_H\n#define Fl_Value_Slider_H\n\n#include \"Fl_Slider.H\"\n\n/**\n  The Fl_Value_Slider widget is a Fl_Slider widget\n  with a box displaying the current value.\n  \\image html  value_slider.png\n  \\image latex value_slider.png \"Fl_Value_Slider\" width=4cm\n*/\nclass FL_EXPORT Fl_Value_Slider : public Fl_Slider {\n  Fl_Font textfont_;\n  Fl_Fontsize textsize_;\n  Fl_Color textcolor_;\n  short value_width_;\n  short value_height_;\n\nprotected:\n  void draw() FL_OVERRIDE;\n\npublic:\n  int handle(int) FL_OVERRIDE;\n  Fl_Value_Slider(int x, int y, int w, int h, const char *l = 0);\n\n  /** Gets the typeface of the text in the value box. */\n  Fl_Font textfont() const { return textfont_; }\n\n  /** Sets the typeface of the text in the value box. */\n  void textfont(Fl_Font s) { textfont_ = s; }\n\n  /** Gets the size of the text in the value box. */\n  Fl_Fontsize textsize() const { return textsize_; }\n\n  /** Sets the size of the text in the value box. */\n  void textsize(Fl_Fontsize s) { textsize_ = s; }\n\n  /** Gets the color of the text in the value box. */\n  Fl_Color textcolor() const { return textcolor_; }\n\n  /** Sets the color of the text in the value box. */\n  void textcolor(Fl_Color s) { textcolor_ = s; }\n\n  /** Sets the width of the value box in pixels (horizontal mode only).\n\n    Limited range checking is applied but drawing errors may occur if\n    the size \\p s is set too high or too low, particularly if the widget\n    is resized (later).\n\n    The programmer is responsible for setting sensible values and\n    widget sizes.\n\n    The default value set by the constructor is 35.\n\n    \\param[in]  s  new width of the value box\n\n    \\since 1.4.0\n  */\n  void value_width(int s) {\n    if (s > w() - 10)\n      s = w() - 10;\n    if (s < 10)\n      s = 10;\n    value_width_ = (short)s;\n  }\n\n  /** Gets the width of the value box in pixels (horizontal mode only).\n\n    \\since 1.4.0\n  */\n  int value_width() const { return (value_width_); }\n\n  /** Sets the height of the value box in pixels (vertical mode only).\n\n    Limited range checking is applied but drawing errors may occur if\n    the size \\p s is set too high or too low, particularly if the widget\n    is resized (later).\n\n    The programmer is responsible for setting sensible values and\n    widget sizes.\n\n    The default value set by the constructor is 25.\n\n    \\param[in]  s  new height of the value box\n\n    \\since 1.4.0\n  */\n  void value_height(int s) {\n    if (s > h() - 10)\n      s = h() - 10;\n    if (s < 10)\n      s = 10;\n    value_height_ = (short)s;\n  }\n  /** Gets the height of the value box in pixels (vertical mode only).\n\n    \\since 1.4.0\n  */\n  int value_height() const { return (value_height_); }\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Widget.H",
    "content": "//\n// Widget header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/**\n  \\file FL/Fl_Widget.H\n  \\brief Fl_Widget and Fl_Label classes.\n*/\n\n#ifndef Fl_Widget_H\n#define Fl_Widget_H\n\n#include \"Fl.H\"\n\nclass Fl_Widget;\nclass Fl_Window;\nclass Fl_Group;\nclass Fl_Image;\n\n/** Default callback type definition for all fltk widgets (by far the most used) */\ntypedef void (Fl_Callback )(Fl_Widget*, void*);\n/** Default callback type pointer definition for all fltk widgets */\ntypedef Fl_Callback* Fl_Callback_p; // needed for BORLAND\n/** One parameter callback type definition passing only the widget */\ntypedef void (Fl_Callback0)(Fl_Widget*);\n/** Callback type definition passing the widget and a long data value */\ntypedef void (Fl_Callback1)(Fl_Widget*, long);\n\n/** This struct stores all information for a text or mixed graphics label.\n\n    \\todo There is an aspiration that the Fl_Label type will become a widget by itself.\n          That way we will be avoiding a lot of code duplication by handling labels in\n          a similar fashion to widgets containing text. We also provide an easy\n          interface for very complex labels, containing html or vector graphics.\n          However, this re-factoring is not in place in this release.\n */\nstruct FL_EXPORT Fl_Label {\n  /** label text */\n  const char* value;\n  /** optional image for an active label */\n  Fl_Image* image;\n  /** optional image for a deactivated label */\n  Fl_Image* deimage;\n  /** label font used in text */\n  Fl_Font font;\n  /** size of label font */\n  Fl_Fontsize size;\n  /** text color */\n  Fl_Color color;\n  /** alignment of label */\n  Fl_Align align_;\n  /** type of label. \\see Fl_Labeltype */\n  uchar type;\n  /** Spacing between label and the horizontally aligned side of the widget. */\n  signed char h_margin_;\n  /** Spacing between label and the vertically aligned side of the widget. */\n  signed char v_margin_;\n  /** Spacing between an image and the label text */\n  uchar spacing;\n\n  /** Draws the label aligned to the given box */\n  void draw(int,int,int,int, Fl_Align) const ;\n  void measure(int &w, int &h) const ;\n};\n\n\n/** A class prototype that allows for additional data in callbacks.\n\n Users can derive this class and pass objects of such derived classes to widget callbacks.\n Widgets can take ownership of the callback data, deleting the data when the widget\n itself is deleted.\n\n The destructor of this class is virtual, allowing for additional code to\n deallocate resources when the user data is deleted.\n\n \\see FL_FUNCTION_CALLBACK_3, FL_METHOD_CALLBACK_1, FL_INLINE_CALLBACK_2\n \\see Fl_Widget::callback(Fl_Callback*, Fl_Callback_User_Data*, bool)\n \\see Fl_Widget::user_data(Fl_Callback_User_Data*, bool)\n */\nclass FL_EXPORT Fl_Callback_User_Data {\nprotected:\n  Fl_Callback_User_Data() {} ///< Protected constructor\npublic:\n  virtual ~Fl_Callback_User_Data() { } ///< Destructor\n};\n\n\n/** Fl_Widget is the base class for all widgets in FLTK.\n\n    You can't create one of these because the constructor is not public.\n    However you can subclass it.\n\n    All \"property\" accessing methods, such as color(), parent(), or argument()\n    are implemented as trivial inline functions and thus are as fast and small\n    as accessing fields in a structure. Unless otherwise noted, the property\n    setting methods such as color(n) or label(s) are also trivial inline\n    functions, even if they change the widget's appearance. It is up to the\n    user code to call redraw() after these.\n */\nclass FL_EXPORT Fl_Widget {\n  friend class Fl_Group;\n\n  Fl_Group* parent_;\n  Fl_Callback* callback_;\n  void* user_data_;\n  int x_,y_,w_,h_;\n  Fl_Label label_;\n  unsigned int flags_;\n  Fl_Color color_;\n  Fl_Color color2_;\n  uchar type_;\n  uchar damage_;\n  uchar box_;\n  uchar when_;\n\n  const char *tooltip_;\n\n  /** unimplemented copy ctor */\n  Fl_Widget(const Fl_Widget &);\n  /** unimplemented assignment operator */\n  Fl_Widget& operator=(const Fl_Widget &);\n\nprotected:\n\n  /** Creates a widget at the given position and size.\n\n      The Fl_Widget is a protected constructor, but all derived widgets have a\n      matching public constructor. It takes a value for x(), y(), w(), h(), and\n      an optional value for label().\n\n      \\param[in] x, y the position of the widget relative to the enclosing window\n      \\param[in] w, h size of the widget in pixels\n      \\param[in] label optional text for the widget label\n   */\n  Fl_Widget(int x, int y, int w, int h, const char *label=0L);\n\n  /** Internal use only. Use position(int,int), size(int,int) or resize(int,int,int,int) instead. */\n  void x(int v) {x_ = v;}\n  /** Internal use only. Use position(int,int), size(int,int) or resize(int,int,int,int) instead. */\n  void y(int v) {y_ = v;}\n  /** Internal use only. Use position(int,int), size(int,int) or resize(int,int,int,int) instead. */\n  void w(int v) {w_ = v;}\n  /** Internal use only. Use position(int,int), size(int,int) or resize(int,int,int,int) instead. */\n  void h(int v) {h_ = v;}\n  /** Gets the widget flags mask */\n  unsigned int flags() const {return flags_;}\n  /** Sets a flag in the flags mask */\n  void set_flag(unsigned int c) {flags_ |= c;}\n  /** Clears a flag in the flags mask */\n  void clear_flag(unsigned int c) {flags_ &= ~c;}\n  /** flags possible values enumeration.\n      See activate(), output(), visible(), changed(), set_visible_focus()\n  */\n  enum {\n        INACTIVE        = 1<<0,   ///< the widget can't receive focus, and is disabled but potentially visible\n        INVISIBLE       = 1<<1,   ///< the widget is not drawn, but can receive a few special events\n        OUTPUT          = 1<<2,   ///< for output only\n        NOBORDER        = 1<<3,   ///< don't draw a decoration (Fl_Window)\n        FORCE_POSITION  = 1<<4,   ///< don't let the window manager position the window (Fl_Window)\n        NON_MODAL       = 1<<5,   ///< this is a hovering toolbar window (Fl_Window)\n        SHORTCUT_LABEL  = 1<<6,   ///< the label contains a shortcut we need to draw\n        CHANGED         = 1<<7,   ///< the widget value changed\n        OVERRIDE        = 1<<8,   ///< position window on top (Fl_Window)\n        VISIBLE_FOCUS   = 1<<9,   ///< accepts keyboard focus navigation if the widget can have the focus\n        COPIED_LABEL    = 1<<10,  ///< the widget label is internally copied, its destruction is handled by the widget\n        CLIP_CHILDREN   = 1<<11,  ///< all drawing within this widget will be clipped (Fl_Group)\n        MENU_WINDOW     = 1<<12,  ///< a temporary popup window, dismissed by clicking outside (Fl_Window)\n        TOOLTIP_WINDOW  = 1<<13,  ///< a temporary popup, transparent to events, and dismissed easily (Fl_Window)\n        MODAL           = 1<<14,  ///< a window blocking input to all other windows (Fl_Window)\n        NO_OVERLAY      = 1<<15,  ///< window not using a hardware overlay plane (Fl_Menu_Window)\n        GROUP_RELATIVE  = 1<<16,  ///< Reserved, not implemented. DO NOT USE.\n        COPIED_TOOLTIP  = 1<<17,  ///< the widget tooltip is internally copied, its destruction is handled by the widget\n        FULLSCREEN      = 1<<18,  ///< a fullscreen window (Fl_Window)\n        MAC_USE_ACCENTS_MENU = 1<<19, ///< On the macOS platform, pressing and holding a key on the keyboard opens an accented-character menu window (Fl_Input_, Fl_Text_Editor)\n        NEEDS_KEYBOARD  = 1<<20,  ///< set on touch screen devices if a widget needs a keyboard when it gets the focus. Reserved, not yet used in 1.4.0. \\see Fl_Widget::needs_keyboard()\n        IMAGE_BOUND     = 1<<21,  ///< binding the image to the widget will transfer ownership, so that the widget will delete the image when it is no longer needed\n        DEIMAGE_BOUND   = 1<<22,  ///< bind the inactive image to the widget, so the widget deletes the image when it is no longer needed\n        AUTO_DELETE_USER_DATA = 1<<23, ///< automatically call `delete` on the user_data pointer when destroying this widget; if set, user_data must point to a class derived from the class Fl_Callback_User_Data\n        MAXIMIZED       = 1<<24,  ///< a maximized Fl_Window\n        POPUP           = 1<<25,  ///< popup window (i.e., positioned relatively to another mapped window)\n        // Note to devs: add new FLTK core flags above this line (up to 1<<28).\n\n        // Three more flags, reserved for user code\n\n        USERFLAG3       = 1<<29,  ///< reserved for 3rd party extensions\n        USERFLAG2       = 1<<30,  ///< reserved for 3rd party extensions\n        USERFLAG1       = 1<<31   ///< reserved for 3rd party extensions\n  };\n  void draw_box() const;\n  void draw_box(Fl_Boxtype t, Fl_Color c) const;\n  void draw_box(Fl_Boxtype t, int x,int y,int w,int h, Fl_Color c) const;\n  void draw_backdrop() const;\n\n  /** Draws a focus rectangle around the widget.\n    This method uses the widget's boxtype and coordinates and its\n    background color color().\n    \\see Fl_Widget::draw_focus(Fl_Boxtype, int, int, int, int, Fl_Color) const\n  */\n  void draw_focus() const {\n    draw_focus(box(), x(), y(), w(), h(), color());\n  }\n\n  /** Draws a focus rectangle around the widget.\n    This method uses the given boxtype and coordinates and the widget's\n    background color color().\n    \\see Fl_Widget::draw_focus(Fl_Boxtype, int, int, int, int, Fl_Color) const\n  */\n  void draw_focus(Fl_Boxtype t, int X, int Y, int W, int H) const {\n    draw_focus(t, X, Y, W, H, color());\n\n  }\n  // See documentation in Fl_Widget.cxx\n  void draw_focus(Fl_Boxtype t, int x, int y, int w, int h, Fl_Color bg) const;\n\n  void draw_label() const;\n  void draw_label(int, int, int, int) const;\n\npublic:\n\n  /** Destroys the widget.\n      Destroying single widgets is not very common. You almost always want to\n      destroy the parent group instead, which will destroy all of the child widgets\n      and groups in that group.\n\n      \\since FLTK 1.3, the widget's destructor removes the widget from its parent\n      group, if it is member of a group.\n   */\n  virtual ~Fl_Widget();\n\n  /** Draws the widget.\n      Never call this function directly. FLTK will schedule redrawing whenever\n      needed. If your widget must be redrawn as soon as possible, call redraw()\n      instead.\n\n      Override this function to draw your own widgets.\n\n      If you ever need to call another widget's draw method <I>from within your\n      own draw() method</I>, e.g. for an embedded scrollbar, you can do it\n      (because draw() is virtual) like this:\n\n      \\code\n        Fl_Widget *s = &scrollbar; // scrollbar is an embedded Fl_Scrollbar\n        s->draw();                 // calls Fl_Scrollbar::draw()\n      \\endcode\n   */\n  virtual void draw() = 0;\n\n  /** Handles the specified event.\n      You normally don't call this method directly, but instead let FLTK do\n      it when the user interacts with the widget.\n\n      When implemented in a widget, this function must return 0 if the\n      widget does not use the event or 1 otherwise.\n\n      Most of the time, you want to call the inherited handle() method in\n      your overridden method so that you don't short-circuit events that you\n      don't handle. In this last case you should return the callee retval.\n\n      One exception to the rule in the previous paragraph is if you really\n      want to \\e override the behavior of the base class. This requires\n      knowledge of the details of the inherited class.\n\n      In rare cases you may want to return 1 from your handle() method\n      although you don't really handle the event. The effect would be to\n      \\e filter event processing, for instance if you want to dismiss\n      non-numeric characters (keypresses) in a numeric input widget. You\n      may \"ring the bell\" or show another visual indication or drop the\n      event silently. In such a case you must not call the handle() method\n      of the base class and tell FLTK that you \\e consumed the event by\n      returning 1 even if you didn't \\e do anything with it.\n\n      \\param[in] event the kind of event received\n      \\retval 0 if the event was not used or understood\n      \\retval 1 if the event was used and can be deleted\n      \\see Fl_Event\n   */\n  virtual int handle(int event);\n\n  /** Returns whether the current label was assigned with copy_label().\n\n      This can be useful for temporarily overwriting the widget's label\n      and restoring it later.\n\n      \\retval 0 current label was assigned with label().\n      \\retval 1 current label was assigned with copy_label().\n  */\n  int is_label_copied() const {return ((flags_ & COPIED_LABEL) ? 1 : 0);}\n\n  /**\n    Sets whether this widget needs a keyboard.\n\n    Set this on touch screen devices if a widget needs a keyboard when it gets the focus.\n\n    \\note This flag can be set but is not yet \\b used in FLTK 1.4.0. It is intended to be\n      used in the future on real touch devices.\n\n    \\param[in]  needs   Set this to true or false\n\n    \\internal Needs implementations in screen driver methods:\n      \\see Fl::screen_driver()->request_keyboard();\n      \\see Fl::screen_driver()->release_keyboard();\n  */\n  void needs_keyboard(bool needs) {\n    if (needs) set_flag(NEEDS_KEYBOARD);\n    else clear_flag(NEEDS_KEYBOARD);\n  }\n\n  /**\n    Returns whether this widget needs a keyboard.\n    \\return  true or false\n    \\see needs_keyboard(bool)\n  */\n  bool needs_keyboard() const {\n    return (flags_ & NEEDS_KEYBOARD);\n  }\n\n  /** Returns a pointer to the parent widget.\n      Usually this is a Fl_Group or Fl_Window.\n      \\retval NULL if the widget has no parent\n      \\see Fl_Group::add(Fl_Widget*)\n   */\n  Fl_Group* parent() const {return parent_;}\n\n  /** Internal use only - \"for hacks only\".\n\n      It is \\em \\b STRONGLY recommended not to use this method, because it\n      short-circuits Fl_Group's normal widget adding and removing methods,\n      if the widget is already a child widget of another Fl_Group.\n\n      Use Fl_Group::add(Fl_Widget*) and/or Fl_Group::remove(Fl_Widget*) instead.\n  */\n  void parent(Fl_Group* p) {parent_ = p;} // for hacks only, use Fl_Group::add()\n\n  /** Gets the widget type.\n      Returns the widget type value, which gives some information about the derived widget class\n      to which the object belongs. Noticeably, the condition <tt>type() >= FL_WINDOW</tt> indicates\n      a widget is an Fl_Window or derived object.\n   */\n  uchar type() const {return type_;}\n\n  /** Sets the widget type.\n      \\see type()\n   */\n  void type(uchar t) {type_ = t;}\n\n  /** Gets the widget position in its window.\n      \\return the x position relative to the window\n   */\n  int x() const {return x_;}\n\n  /** Gets the widget position in its window.\n      \\return the y position relative to the window\n   */\n  int y() const {return y_;}\n\n  /** Gets the widget width.\n      \\return the width of the widget in pixels.\n   */\n  int w() const {return w_;}\n\n  /** Gets the widget height.\n      \\return the height of the widget in pixels.\n   */\n  int h() const {return h_;}\n\n  /** Changes the size or position of the widget.\n\n      This is a virtual function so that the widget may implement its\n      own handling of resizing. The default version does \\e not\n      call the redraw() method, but instead relies on the parent widget\n      to do so because the parent may know a faster way to update the\n      display, such as scrolling from the old position.\n\n      Some window managers under X11 call resize() a lot more often\n      than needed. Please verify that the position or size of a widget\n      did actually change before doing any extensive calculations.\n\n      position(X, Y) is a shortcut for resize(X, Y, w(), h()),\n      and size(W, H) is a shortcut for resize(x(), y(), W, H).\n\n      \\param[in] x, y new position relative to the parent window\n      \\param[in] w, h new size\n      \\see position(int,int), size(int,int)\n   */\n  virtual void resize(int x, int y, int w, int h);\n\n  /** Internal use only. */\n  int damage_resize(int,int,int,int);\n\n  /** Repositions the window or widget.\n\n      position(X, Y) is a shortcut for resize(X, Y, w(), h()).\n\n      \\param[in] X, Y new position relative to the parent window\n      \\see resize(int,int,int,int), size(int,int)\n   */\n  void position(int X,int Y) {resize(X,Y,w_,h_);}\n\n  /** Changes the size of the widget.\n\n      size(W, H) is a shortcut for resize(x(), y(), W, H).\n\n      \\param[in] W, H new size\n      \\see position(int,int), resize(int,int,int,int)\n   */\n  void size(int W,int H) {resize(x_,y_,W,H);}\n\n  /** Gets the label alignment.\n\n      \\return label alignment\n      \\see label(), align(Fl_Align), Fl_Align\n   */\n  Fl_Align align() const {return label_.align_;}\n\n  /** Sets the label alignment.\n      This controls how the label is displayed next to or inside the widget.\n      The default value is FL_ALIGN_CENTER, which centers the label inside\n      the widget.\n      \\param[in] alignment new label alignment\n      \\see align(), Fl_Align\n   */\n  void align(Fl_Align alignment) {label_.align_ = alignment;}\n\n  /** Gets the box type of the widget.\n      \\return the current box type\n      \\see box(Fl_Boxtype), Fl_Boxtype\n   */\n  Fl_Boxtype box() const {return (Fl_Boxtype)box_;}\n\n  /** Sets the box type for the widget.\n      This identifies a routine that draws the background of the widget.\n      See Fl_Boxtype for the available types. The default depends on the\n      widget, but is usually FL_NO_BOX or FL_UP_BOX.\n      \\param[in] new_box the new box type\n      \\see box(), Fl_Boxtype\n   */\n  void box(Fl_Boxtype new_box) {box_ = new_box;}\n\n  /** Gets the background color of the widget.\n      \\return current background color\n      \\see color(Fl_Color), color(Fl_Color, Fl_Color)\n   */\n  Fl_Color color() const {return color_;}\n\n  /** Sets the background color of the widget.\n      The color is passed to the box routine. The color is either an index into\n      an internal table of RGB colors or an RGB color value generated using\n      fl_rgb_color().\n\n      The default for most widgets is FL_BACKGROUND_COLOR. Use Fl::set_color()\n      to redefine colors in the color map.\n      \\param[in] bg background color\n      \\see color(), color(Fl_Color, Fl_Color), selection_color(Fl_Color)\n   */\n  void color(Fl_Color bg) {color_ = bg;}\n\n  /** Gets the selection color.\n      \\return the current selection color\n      \\see selection_color(Fl_Color), color(Fl_Color, Fl_Color)\n   */\n  Fl_Color selection_color() const {return color2_;}\n\n  /** Sets the selection color.\n      The selection color is defined for Forms compatibility and is usually\n      used to color the widget when it is selected, although some widgets\n      use this color for other purposes. You can set both colors at once\n      with color(Fl_Color bg, Fl_Color sel).\n      \\param[in] a the new selection color\n      \\see selection_color(), color(Fl_Color, Fl_Color)\n   */\n  void selection_color(Fl_Color a) {color2_ = a;}\n\n  /** Sets the background and selection color of the widget.\n\n      The two color form sets both the background and selection colors.\n      \\param[in] bg background color\n      \\param[in] sel selection color\n      \\see color(unsigned), selection_color(unsigned)\n   */\n  void color(Fl_Color bg, Fl_Color sel) {color_=bg; color2_=sel;}\n\n  /** Gets the current label text.\n      \\return a pointer to the current label text\n      \\see label(const char *), copy_label(const char *)\n   */\n  const char* label() const {return label_.value;}\n\n  /** Sets the current label pointer.\n\n      The label is shown somewhere on or next to the widget.\n      See \\ref common_labels for details about what can be put in a label.\n      The passed pointer is stored unchanged in the widget (the string is \\em not copied), so if\n      you need to set the label to a formatted value, make sure the buffer is\n      static, global, or allocated. The copy_label() method can be used\n      to make a copy of the label string automatically.\n      \\param[in] text pointer to new label text\n      \\see copy_label()\n   */\n  void label(const char* text);\n\n  /** Sets the current label.\n      Unlike label(), this method allocates a copy of the label\n      string instead of using the original string pointer.\n\n      The internal copy will automatically be freed whenever you assign\n      a new label or when the widget is destroyed.\n\n      \\param[in] new_label the new label text\n      \\see label()\n   */\n  void copy_label(const char *new_label);\n\n  /** Shortcut to set the label text and type in one call.\n      \\see label(const char *), labeltype(Fl_Labeltype)\n   */\n  void label(Fl_Labeltype a, const char* b) {label_.type = a; label_.value = b;}\n\n  /** Gets the label type.\n      \\return the current label type.\n      \\see Fl_Labeltype\n   */\n  Fl_Labeltype labeltype() const {return (Fl_Labeltype)label_.type;}\n\n  /** Sets the label type.\n      The label type identifies the function that draws the label of the widget.\n      This is generally used for special effects such as embossing or for using\n      the label() pointer as another form of data such as an icon. The value\n      FL_NORMAL_LABEL prints the label as plain text.\n      \\param[in] a new label type\n      \\see Fl_Labeltype\n   */\n  void labeltype(Fl_Labeltype a) {label_.type = a;}\n\n  /** Gets the label color.\n      The default color is FL_FOREGROUND_COLOR.\n      \\return the current label color\n   */\n  Fl_Color labelcolor() const {return label_.color;}\n\n  /** Sets the label color.\n      The default color is FL_FOREGROUND_COLOR.\n      \\param[in] c the new label color\n   */\n  void labelcolor(Fl_Color c) {label_.color=c;}\n\n  /** Gets the font to use.\n      Fonts are identified by indexes into a table. The default value\n      uses a Helvetica typeface (Arial for Microsoft&reg; Windows&reg;).\n      The function Fl::set_font() can define new typefaces.\n      \\return current font used by the label\n      \\see Fl_Font\n   */\n  Fl_Font labelfont() const {return label_.font;}\n\n  /** Sets the font to use.\n      Fonts are identified by indexes into a table. The default value\n      uses a Helvetica typeface (Arial for Microsoft&reg; Windows&reg;).\n      The function Fl::set_font() can define new typefaces.\n      \\param[in] f the new font for the label\n      \\see Fl_Font\n   */\n  void labelfont(Fl_Font f) {label_.font=f;}\n\n  /** Gets the font size in pixels.\n      The default size is 14 pixels.\n      \\return the current font size\n   */\n  Fl_Fontsize labelsize() const {return label_.size;}\n\n  /** Sets the font size in pixels.\n      \\param[in] pix the new font size\n      \\see Fl_Fontsize labelsize()\n   */\n  void labelsize(Fl_Fontsize pix) {label_.size=pix;}\n\n  /** Gets the image that is used as part of the widget label when in the active state.\n      \\return the current image\n   */\n  Fl_Image* image() {return label_.image;}\n\n  /** Gets the image that is used as part of the widget label when in the active state.\n      \\return the current image\n   */\n  const Fl_Image* image() const {return label_.image;}\n\n  /** Sets the image to use as part of the widget label when in the active state.\n\n   The caller is responsible for making sure \\p img is not deleted  while it's used by the widget,\n   and, if appropriate, for deleting it after the widget's deletion.\n\n   Calling image() with a new image will delete the old image if it\n   was bound, and set the new image without binding it. If old and new are\n   the same, the image will not be deleted, but it will be unbound.\n\n   Calling image() with NULL will delete the old image if\n   it was bound and not set a new image.\n\n   \\param[in] img the new image for the label\n   \\see bind_image(Fl_Image* img)\n   */\n  void image(Fl_Image* img);\n\n  /** Sets the image to use as part of the widget label when in the active state.\n   \\param[in] img the new image for the label\n   \\see void image(Fl_Image* img)\n   */\n  void image(Fl_Image& img);\n\n  /** Sets the image to use as part of the widget label when in the active state.\n\n   The image will be bound to the widget. When the widget is deleted, the\n   image will be deleted as well.\n\n   Calling bind_image() with a new image will delete the old image if it\n   was bound, and then set the new image, and bind that. If old and new image\n   are the same, nothing happens.\n\n   Calling bind_image() with NULL will delete the old image if\n   it was bound and not set a new image.\n\n   \\param[in] img the new image for the label\n   \\see void image(Fl_Image* img)\n   */\n  void bind_image(Fl_Image* img);\n\n  /** Bind the image to the widget, so the widget will delete the image when it is no longer needed.\n   \\param f 1: mark the image as bound, 0: mark the image as managed by the user\n   \\see image_bound(), bind_deimage()\n   */\n  void bind_image(int f) { if (f) set_flag(IMAGE_BOUND); else clear_flag(IMAGE_BOUND); }\n\n  /** Returns whether the image is managed by the widget.\n   \\retval 0 if the image is not bound to the widget\n   \\retval 1 if the image will be deleted when the widget is deleted\n   \\see deimage_bound(), bind_image()\n   */\n  int image_bound() const {return ((flags_ & IMAGE_BOUND) ? 1 : 0);}\n\n  /** Gets the image that is used as part of the widget label when in the inactive state.\n      \\return the current image for the deactivated widget\n   */\n  Fl_Image* deimage() {return label_.deimage;}\n\n  /** Gets the image that is used as part of the widget label when in the inactive state.\n      \\return the current image for the deactivated widget\n   */\n  const Fl_Image* deimage() const {return label_.deimage;}\n\n  /** Sets the image to use as part of the widget label when in the inactive state.\n   \\param[in] img the new image for the deactivated widget\n   \\note The caller is responsible for making sure \\p img is not deleted  while it's used by the widget,\n   and, if appropriate, for deleting it after the widget's deletion.\n   \\see void bind_deimage(Fl_Image* img)\n   */\n  void deimage(Fl_Image* img);\n\n  /** Sets the image to use as part of the widget label when in the inactive state.\n   \\param[in] img the new image for the deactivated widget\n   \\see void deimage(Fl_Image* img)\n   */\n  void deimage(Fl_Image& img);\n\n  /** Sets the image to use as part of the widget label when in the inactive state.\n   \\param[in] img the new image for the deactivated widget\n   \\note The image will be bound to the widget. When the widget is deleted, the\n   image will be deleted as well.\n   \\see void deimage(Fl_Image* img)\n   */\n  void bind_deimage(Fl_Image* img);\n\n  /** Returns whether the inactive image is managed by the widget.\n   \\retval 0 if the image is not bound to the widget\n   \\retval 1 if the image will be deleted when the widget is deleted\n   \\see image_bound(), bind_deimage()\n   */\n  int deimage_bound() const {return ((flags_ & DEIMAGE_BOUND) ? 1 : 0);}\n\n  /** Bind the inactive image to the widget, so the widget will delete the image when it is no longer needed.\n   \\param f 1: mark the image as bound, 0: mark the image as managed by the user\n   \\see deimage_bound(), bind_image()\n   */\n  void bind_deimage(int f) { if (f) set_flag(DEIMAGE_BOUND); else clear_flag(DEIMAGE_BOUND); }\n\n  /** Set the gap between the label and the image in pixels.\n   This value is limited to 0..255.\n   \\param[in] gap spacing in pixels\n   */\n  void label_image_spacing(int gap) { label_.spacing = (uchar)gap; }\n\n  /** Return the gap size between the label and the image.\n   \\return spacing in pixels\n   */\n  int label_image_spacing() { return label_.spacing; }\n\n  /** Set the spacing between the label and the horizontal edge of the widget.\n   \\param[in] px gap in pixels\n   */\n  void horizontal_label_margin(int px) { label_.h_margin_ = (signed char)px; }\n\n  /** Get the spacing between the label and the horizontal edge of the widget.\n   \\return px gap in pixels\n   */\n  int horizontal_label_margin() { return label_.h_margin_; }\n\n  /** Set the spacing between the label and the vertical edge of the widget.\n   \\param[in] px gap in pixels\n   */\n  void vertical_label_margin(int px) { label_.v_margin_ = (signed char)px; }\n\n  /** Get the spacing between the label and the vertical edge of the widget.\n   \\return px gap in pixels\n   */\n  int vertical_label_margin() { return label_.v_margin_; }\n\n  /** Gets the current tooltip text.\n      \\return a pointer to the tooltip text or NULL\n      \\see tooltip(const char*), copy_tooltip(const char*)\n   */\n  const char *tooltip() const {return tooltip_;}\n\n  void tooltip(const char *text);               // see Fl_Tooltip\n  void copy_tooltip(const char *text);          // see Fl_Tooltip\n\n  /** Gets the current callback function for the widget.\n      Each widget has a single callback.\n      \\return current callback\n   */\n  Fl_Callback_p callback() const {return callback_;}\n\n  /** Sets the current callback function and data for the widget.\n      Each widget has a single callback.\n      \\param[in] cb new callback\n      \\param[in] p user data\n   */\n  void callback(Fl_Callback* cb, void* p) {\n    callback_ = cb;\n    user_data(p);\n  }\n\n  /** Sets the current callback function and managed user data for the widget.\n   Setting auto_free will transfer ownership of the callback user data to the\n   widget. Deleting the widget will then also delete the user data.\n   \\param[in] cb new callback\n   \\param[in] p user data\n   \\param[in] auto_free if set, the widget will free user data when destroyed\n   */\n  void callback(Fl_Callback* cb, Fl_Callback_User_Data* p, bool auto_free) {\n    callback_ = cb;\n    user_data(p, auto_free);\n  }\n\n  /** Sets the current callback function for the widget.\n      Each widget has a single callback.\n      \\param[in] cb new callback\n   */\n  void callback(Fl_Callback* cb) {callback_ = cb;}\n\n  /** Sets the current callback function for the widget.\n      Each widget has a single callback.\n      \\param[in] cb new callback\n   */\n  void callback(Fl_Callback0* cb) {\n    callback_ = (Fl_Callback*)(fl_intptr_t)(cb);\n  }\n\n  /** Sets the current callback function for the widget.\n      Each widget has a single callback.\n      \\param[in] cb new callback\n      \\param[in] p user data\n   */\n  void callback(Fl_Callback1* cb, long p = 0) {\n    callback_ = (Fl_Callback*)(fl_intptr_t)(cb);\n    user_data((void*)(fl_intptr_t)p);\n  }\n\n  /** Gets the user data for this widget.\n      Gets the current user data (void *) argument that is passed to the callback function.\n      \\return user data as a pointer\n   */\n  void* user_data() const {return user_data_;}\n\n  /** \\brief Sets the user data for this widget. */\n  void user_data(void* v);\n\n  /** \\brief Sets the user data for this widget. */\n  void user_data(Fl_Callback_User_Data* v, bool auto_free);\n\n  /** Gets the current user data (long) argument that is passed to the callback function.\n\n    \\note On platforms with <tt>sizeof(long) \\< sizeof(void*)</tt>, particularly\n          on Windows 64-bit platforms, this method can truncate stored addresses\n          \\p (void*) to the size of a \\p long value. Use with care and only\n          if you are sure that the stored user_data value fits in a \\p long\n          value because it was stored with argument(long) or another method\n          using only \\p long values. You may want to use user_data() instead.\n\n    \\see user_data()\n  */\n  long argument() const {return (long)(fl_intptr_t)user_data_;}\n\n  /** Sets the current user data (long) argument that is passed to the callback function.\n\n    \\see argument()\n   */\n  void argument(long v) {user_data((void*)(fl_intptr_t)v);}\n\n  /** Returns the conditions under which the callback is called.\n\n      You can set the flags with when(uchar), the default value is\n      FL_WHEN_RELEASE.\n\n      \\return set of flags\n      \\see when(uchar), Fl_When, do_callback(), Fl::callback_reason()\n   */\n  Fl_When when() const {return (Fl_When)when_;}\n\n  /** Sets the flags used to decide when a callback is called.\n\n     This controls when callbacks are done. The following values are useful,\n     the default value is FL_WHEN_RELEASE:\n\n     \\li 0: The callback is not done, but changed() is turned on.\n     \\li FL_WHEN_CHANGED: The callback is done each time the text is\n         changed by the user.\n     \\li FL_WHEN_RELEASE: The callback will be done when this widget loses\n         the focus, including when the window is unmapped. This is a useful\n         value for text fields in a panel where doing the callback on every\n         change is wasteful. However the callback will also happen if the\n         mouse is moved out of the window, which means it should not do\n         anything visible (like pop up an error message).\n         You might do better setting this to zero, and scanning all the\n         items for changed() when the OK button on a panel is pressed.\n     \\li FL_WHEN_ENTER_KEY: If the user types the Enter key, the entire\n         text is selected, and the callback is done if the text has changed.\n         Normally the Enter key will navigate to the next field (or insert\n         a newline for a Fl_Multiline_Input) - this changes the behavior.\n     \\li FL_WHEN_ENTER_KEY|FL_WHEN_NOT_CHANGED: The Enter key will do the\n         callback even if the text has not changed. Useful for command fields.\n     \\li \\ref FL_WHEN_CLOSED : If the user requests that the widget is closed,\n         the callback is called with \\ref FL_REASON_CLOSED. The \\ref Fl_Tabs\n         widget checks this flag on its children to determine whether to display\n         a close button on the tab of that widget.\n\n      Fl_Widget::when() is a set of bitflags used by subclasses of\n      Fl_Widget to decide when to do the callback.\n\n      If the value is zero then the callback is never done. Other values\n      are described  in the individual widgets. This field is in the base\n      class so that you can scan a panel and do_callback() on all the ones\n      that don't do their own callbacks in response to an \"OK\" button.\n      \\param[in] i set of flags\n      \\see Fl_When, do_callback(), Fl::callback_reason()\n   */\n  void when(uchar i) {when_ = i;}\n\n  /** Returns whether a widget is visible.\n      \\retval 0 if the widget is not drawn and hence invisible.\n      \\see show(), hide(), visible_r()\n   */\n  unsigned int visible() const {return !(flags_&INVISIBLE);}\n\n  /** Returns whether a widget and all its parents are visible.\n      \\retval 0 if the widget or any of its parents are invisible.\n      \\see show(), hide(), visible()\n   */\n  int visible_r() const;\n\n  /** Makes a widget visible.\n\n      An invisible widget never gets redrawn and does not get keyboard\n      or mouse events, but can receive a few other events like FL_SHOW.\n\n      The visible() method returns true if the widget is set to be\n      visible. The visible_r() method returns true if the widget and\n      all of its parents are visible. A widget is only visible if\n      visible() is true on it <I>and all of its parents</I>.\n\n      Changing it will send FL_SHOW or FL_HIDE events to the widget.\n      <I>Do not change it if the parent is not visible, as this\n      will send false FL_SHOW or FL_HIDE events to the widget</I>.\n      redraw() is called if necessary on this or the parent.\n\n      \\see hide(), visible(), visible_r()\n   */\n  virtual void show();\n\n  /** Makes a widget invisible.\n      \\see show(), visible(), visible_r()\n   */\n  virtual void hide();\n\n  /** Makes the widget visible.\n      You must still redraw the parent widget to see a change in the\n      window. Normally you want to use the show() method instead.\n   */\n  void set_visible() {flags_ &= ~INVISIBLE;}\n\n  /** Hides the widget.\n      You must still redraw the parent to see a change in the window.\n      Normally you want to use the hide() method instead.\n   */\n  void clear_visible() {flags_ |= INVISIBLE;}\n\n  /** Returns whether the widget is active.\n      \\retval 0 if the widget is inactive\n      \\see active_r(), activate(), deactivate()\n   */\n  unsigned int active() const {return !(flags_&INACTIVE);}\n\n  /** Returns whether the widget and all of its parents are active.\n      \\retval 0 if this or any of the parent widgets are inactive\n      \\see active(), activate(), deactivate()\n   */\n  int active_r() const;\n\n  /** Activates the widget.\n      Changing this value will send FL_ACTIVATE to the widget if\n      active_r() is true.\n      \\see active(), active_r(), deactivate()\n   */\n  void activate();\n\n  /** Deactivates the widget.\n      Inactive widgets will be drawn \"grayed out\", e.g. with less contrast\n      than the active widget. Inactive widgets will not receive any keyboard\n      or mouse button events. Other events (including FL_ENTER, FL_MOVE,\n      FL_LEAVE, FL_SHORTCUT, and others) will still be sent. A widget is\n      only active if active() is true on it <I>and all of its parents</I>.\n\n      Changing this value will send FL_DEACTIVATE to the widget if\n      active_r() is true.\n\n      Currently you cannot deactivate Fl_Window widgets.\n\n      \\see activate(), active(), active_r()\n   */\n  void deactivate();\n\n  /** Returns if a widget is used for output only.\n      output() means the same as !active() except it does not change how the\n      widget is drawn. The widget will not receive any events. This is useful\n      for making scrollbars or buttons that work as displays rather than input\n      devices.\n      \\retval 0 if the widget is used for input and output\n      \\see set_output(), clear_output()\n   */\n  unsigned int output() const {return (flags_&OUTPUT);}\n\n  /** Sets a widget to output only.\n      \\see output(), clear_output()\n   */\n  void set_output() {flags_ |= OUTPUT;}\n\n  /** Sets a widget to accept input.\n      \\see set_output(), output()\n   */\n  void clear_output() {flags_ &= ~OUTPUT;}\n\n  /** Returns if the widget is able to take events.\n      This is the same as (active() && !output() && visible())\n      but is faster.\n      \\retval 0 if the widget takes no events\n   */\n  unsigned int takesevents() const {return !(flags_&(INACTIVE|INVISIBLE|OUTPUT));}\n\n  /**\n      Checks if the widget value changed since the last callback.\n\n      \"Changed\" is a flag that is turned on when the user changes the value\n      stored in the widget. This is only used by subclasses of Fl_Widget that\n      store values, but is in the base class so it is easier to scan all the\n      widgets in a panel and do_callback() on the changed ones in response\n      to an \"OK\" button.\n\n      Most widgets turn this flag off when they do the callback, and when\n      the program sets the stored value.\n\n      \\note do_callback() turns this flag off after the callback.\n\n      \\retval 0 if the value did not change\n      \\see set_changed(), clear_changed()\n      \\see do_callback(Fl_Widget *widget, void *data)\n   */\n  unsigned int changed() const {return flags_ & CHANGED;}\n\n  /** Marks the value of the widget as changed.\n      \\see changed(), clear_changed()\n   */\n  void set_changed() {flags_ |= CHANGED;}\n\n  /** Marks the value of the widget as unchanged.\n      \\see changed(), set_changed()\n   */\n  void clear_changed() {flags_ &= ~CHANGED;}\n\n  /** Marks the widget as inactive without sending events or changing focus.\n      This is mainly for specialized use, for normal cases you want deactivate().\n      \\see deactivate()\n   */\n  void clear_active() {flags_ |= INACTIVE;}\n\n  /** Marks the widget as active without sending events or changing focus.\n      This is mainly for specialized use, for normal cases you want activate().\n      \\see activate()\n   */\n  void set_active() {flags_ &= ~INACTIVE;}\n\n  /** Gives the widget the keyboard focus.\n      Tries to make this widget be the Fl::focus() widget, by first sending\n      it an FL_FOCUS event, and if it returns non-zero, setting\n      Fl::focus() to this widget. You should use this method to\n      assign the focus to a widget.\n      \\return true if the widget accepted the focus.\n   */\n  int take_focus();\n\n  /** Enables keyboard focus navigation with this widget.\n      Note, however, that this will not necessarily mean that the widget\n      will accept focus, but for widgets that can accept focus, this method\n      enables it if it has been disabled.\n      \\see visible_focus(), clear_visible_focus(), visible_focus(int)\n   */\n  void set_visible_focus() { flags_ |= VISIBLE_FOCUS; }\n\n  /** Disables keyboard focus navigation with this widget.\n      Normally, all widgets participate in keyboard focus navigation.\n      \\see set_visible_focus(), visible_focus(), visible_focus(int)\n   */\n  void clear_visible_focus() { flags_ &= ~VISIBLE_FOCUS; }\n\n  /** Modifies keyboard focus navigation.\n      \\param[in] v set or clear visible focus\n      \\see set_visible_focus(), clear_visible_focus(), visible_focus()\n   */\n  void visible_focus(int v) { if (v) set_visible_focus(); else clear_visible_focus(); }\n\n  /** Checks whether this widget has a visible focus.\n      \\retval 0 if this widget has no visible focus.\n      \\see visible_focus(int), set_visible_focus(), clear_visible_focus()\n   */\n  unsigned int visible_focus() const { return flags_ & VISIBLE_FOCUS; }\n\n  /** The default callback for all widgets that don't set a callback.\n\n    This callback function puts a pointer to the widget on the queue\n    returned by Fl::readqueue(). This is the default for all widgets\n    if you don't set a callback.\n\n    You can avoid the overhead of this default handling if you set the\n    callback to \\p NULL explicitly.\n\n    Relying on the default callback and reading the callback queue with\n    Fl::readqueue() is not recommended. If you need a callback, you should\n    set one with Fl_Widget::callback(Fl_Callback *cb, void *data)\n    or one of its variants.\n\n    \\param[in] widget the Fl_Widget given to the callback\n    \\param[in] data user data associated with that callback\n\n    \\see callback(), Fl::readqueue()\n    \\see do_callback(Fl_Widget *widget, void *data)\n   */\n  static void default_callback(Fl_Widget *widget, void *data);\n\n  /** Calls the widget callback function with default arguments.\n\n    This is the same as calling\n    \\code\n      do_callback(this, user_data(), reason);\n    \\endcode\n\n    \\param[in] reason give a reason to why this callback was called, defaults to \\ref FL_REASON_UNKNOWN\n\n    \\see callback()\n    \\see do_callback(Fl_Widget *widget, void *data, Fl_Callback_Reason reason), Fl_Callback_Reason\n  */\n  void do_callback(Fl_Callback_Reason reason=FL_REASON_UNKNOWN) {do_callback(this, user_data_, reason);}\n\n  /** Calls the widget callback function with arbitrary arguments.\n    \\param[in] widget call the callback with \\p widget as the first argument\n    \\param[in] arg call the callback with \\p arg as the user data (second) argument\n    \\param[in] reason give a reason to why this callback was called, defaults to \\ref FL_REASON_UNKNOWN\n    \\see callback()\n    \\see do_callback(Fl_Widget *widget, void *data), Fl_Callback_Reason\n  */\n  void do_callback(Fl_Widget *widget, long arg, Fl_Callback_Reason reason=FL_REASON_UNKNOWN) {\n    do_callback(widget, (void*)(fl_intptr_t)arg, reason);\n  }\n\n  void do_callback(Fl_Widget *widget, void *arg = 0, Fl_Callback_Reason reason=FL_REASON_UNKNOWN);\n\n  /* Internal use only. */\n  int test_shortcut();\n  /* Internal use only. */\n  static unsigned int label_shortcut(const char *t);\n  /* Internal use only. */\n  static int test_shortcut(const char*, const bool require_alt = false);\n  /* Internal use only. */\n  void _set_fullscreen() {flags_ |= FULLSCREEN;}\n  void _clear_fullscreen() {flags_ &= ~FULLSCREEN;}\n\n  /** Checks if w is a child of this widget.\n      \\param[in] w potential child widget\n      \\return Returns 1 if \\p w is a child of this widget, or is\n      equal to this widget. Returns 0 if \\p w is NULL.\n   */\n  int contains(const Fl_Widget *w) const ;\n\n  /** Checks if this widget is a child of \\p wgt.\n      Returns 1 if this widget is a child of \\p wgt, or is\n      equal to \\p wgt. Returns 0 if \\p wgt is NULL.\n      \\param[in] wgt the possible parent widget.\n      \\see contains()\n   */\n  int inside(const Fl_Widget *wgt) const {return wgt ? wgt->contains(this) : 0;}\n\n  /** Schedules the drawing of the widget.\n      Marks the widget as needing its draw() routine called.\n   */\n  void redraw();\n\n  /** Schedules the drawing of the label.\n     Marks the widget or the parent as needing a redraw for the label area\n     of a widget.\n   */\n  void redraw_label();\n\n  /** Returns non-zero if draw() needs to be called.\n      The damage value is actually a bit field that the widget\n      subclass can use to figure out what parts to draw.\n      \\return a bitmap of flags describing the kind of damage to the widget\n      \\see damage(uchar), clear_damage(uchar)\n   */\n  uchar damage() const {return damage_;}\n\n  /** Clears or sets the damage flags.\n      Damage flags are cleared when parts of the widget drawing is repaired.\n\n      The optional argument \\p c specifies the bits that <b>are set</b>\n      after the call (default: 0) and \\b not the bits that are cleared!\n\n      \\note Therefore it is possible to set damage bits with this method, but\n      this should be avoided. Use damage(uchar) instead.\n\n      \\param[in] c new bitmask of damage flags (default: 0)\n      \\see damage(uchar), damage()\n   */\n  void clear_damage(uchar c = 0) {damage_ = c;}\n\n  /** Sets the damage bits for the widget.\n      Setting damage bits will schedule the widget for the next redraw.\n      \\param[in] c bitmask of flags to set\n      \\see damage(), clear_damage(uchar)\n   */\n  void damage(uchar c);\n\n  /** Sets the damage bits for an area inside the widget.\n      Setting damage bits will schedule the widget for the next redraw.\n      \\param[in] c bitmask of flags to set\n      \\param[in] x, y, w, h size of damaged area\n      \\see damage(), clear_damage(uchar)\n   */\n  void damage(uchar c, int x, int y, int w, int h);\n\n  void draw_label(int, int, int, int, Fl_Align) const;\n\n  /** Sets width ww and height hh accordingly with the label size.\n      Labels with images will return w() and h() of the image.\n\n      This calls fl_measure() internally. For more information about\n      the arguments \\p ww and \\p hh and word wrapping\n      \\see fl_measure(const char*, int&, int&, int)\n   */\n  void measure_label(int& ww, int& hh) const {label_.measure(ww, hh);}\n\n  Fl_Window* window() const ;\n  Fl_Window* top_window() const;\n  Fl_Window* top_window_offset(int& xoff, int& yoff) const;\n\n  /** Returns an Fl_Group pointer if this widget is an Fl_Group.\n\n      Use this method if you have a widget (pointer) and need to\n      know whether this widget is derived from Fl_Group. If it returns\n      non-NULL, then the widget in question is derived from Fl_Group,\n      and you can use the returned pointer to access its children\n      or other Fl_Group-specific methods.\n\n      Example:\n      \\code\n      void my_callback (Fl_Widget *w, void *) {\n        Fl_Group *g = w->as_group();\n        if (g)\n          printf (\"This group has %d children\\n\", g->children());\n        else\n          printf (\"This widget is not a group!\\n\");\n      }\n      \\endcode\n\n      \\retval NULL if this widget is not derived from Fl_Group.\n      \\note This method is provided to avoid dynamic_cast.\n      \\see Fl_Widget::as_window(), Fl_Widget::as_gl_window()\n   */\n  virtual Fl_Group* as_group() { return NULL; }\n  virtual Fl_Group const* as_group() const { return NULL; }\n\n  /** Returns an Fl_Window pointer if this widget is an Fl_Window.\n\n      Use this method if you have a widget (pointer) and need to\n      know whether this widget is derived from Fl_Window. If it returns\n      non-NULL, then the widget in question is derived from Fl_Window,\n      and you can use the returned pointer to access its children\n      or other Fl_Window-specific methods.\n\n      \\retval NULL if this widget is not derived from Fl_Window.\n      \\note This method is provided to avoid dynamic_cast.\n      \\see Fl_Widget::as_group(), Fl_Widget::as_gl_window()\n   */\n  virtual Fl_Window* as_window() { return 0; }\n  virtual Fl_Window const* as_window() const { return NULL; }\n\n  /** Returns an Fl_Gl_Window pointer if this widget is an Fl_Gl_Window.\n\n      Use this method if you have a widget (pointer) and need to\n      know whether this widget is derived from Fl_Gl_Window. If it returns\n      non-NULL, then the widget in question is derived from Fl_Gl_Window.\n\n      \\retval NULL if this widget is not derived from Fl_Gl_Window.\n      \\note This method is provided to avoid dynamic_cast.\n      \\see Fl_Widget::as_group(), Fl_Widget::as_window()\n   */\n  virtual class Fl_Gl_Window* as_gl_window() { return NULL; }\n  virtual class Fl_Gl_Window const* as_gl_window() const { return NULL; }\n\n  /** Returns non zero if MAC_USE_ACCENTS_MENU flag is set, 0 otherwise.\n   */\n  int use_accents_menu() { return flags() & MAC_USE_ACCENTS_MENU; }\n\n  /** For back compatibility only.\n      \\deprecated Use selection_color() instead.\n  */\n  Fl_Color color2() const {return (Fl_Color)color2_;}\n\n  /** For back compatibility only.\n      \\deprecated Use selection_color(unsigned) instead.\n  */\n  void color2(unsigned a) {color2_ = a;}\n\n  /** Sets whether the widget's label uses '&' to indicate shortcuts.\n   By default, all objects of classes Fl_Menu_ (and derivatives), Fl_Button (and derivatives),\n   Fl_Text_Display, Fl_Value_Input, and Fl_Input_ (and derivatives)\n   use character '&' in their label, unless '&' is repeated,\n   to indicate shortcuts: '&' does not appear in the drawn label,\n   the next character after '&' in the label is drawn underlined, and typing this character\n   triggers the corresponding menu window, button, or other widget. If the label contains 2 consecutive '&',\n   only one is drawn and the next character is not underlined and not used as a shortcut.\n   If \\p value is set to 0, all these labels don't process character '&' as indicating a shortcut:\n   '&' is drawn in the label, the next character is not underlined and does not define a shortcut.\n   */\n  void shortcut_label(int value) {\n    if (value)\n      set_flag(SHORTCUT_LABEL);\n    else\n      clear_flag(SHORTCUT_LABEL);\n  }\n\n  /** Returns whether the widget's label uses '&' to indicate shortcuts.\n   \\see void shortcut_label(int value) */\n  int shortcut_label() const { return flags_ & SHORTCUT_LABEL; }\n};\n\n/**\n    Reserved type numbers (necessary for my cheapo RTTI) start here.\n    Grep the header files for \"RESERVED_TYPE\" to find the next available\n    number.\n*/\n#define FL_RESERVED_TYPE 100\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Widget_Surface.H",
    "content": "//\n// Drivers code for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2016 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef Fl_Widget_Surface_h\n#define Fl_Widget_Surface_h\n\n#include <FL/Fl_Device.H>\n#include <FL/Fl_Window.H>\n\n/** A surface on which any FLTK widget can be drawn.\n */\nclass FL_EXPORT Fl_Widget_Surface : public Fl_Surface_Device {\nprivate:\n  void traverse(Fl_Widget *widget); // finds subwindows of widget and prints them\nprotected:\n  /** \\brief horizontal offset to the origin of graphics coordinates */\n  int x_offset;\n  /** \\brief vertical offset to the origin of graphics coordinates */\n  int y_offset;\n  Fl_Widget_Surface(Fl_Graphics_Driver *d);\npublic:\n  virtual void translate(int x, int y);\n  virtual void untranslate();\n  void draw(Fl_Widget* widget, int delta_x = 0, int delta_y = 0);\n  void draw_decorated_window(Fl_Window *win, int x_offset = 0, int y_offset = 0);\n  void print_window_part(Fl_Window *win, int x, int y, int w, int h, int delta_x = 0, int delta_y = 0);\n  virtual int printable_rect(int *w, int *h);\n  virtual void origin(int x, int y);\n  virtual void origin(int *x, int *y);\n};\n\n#endif /* Fl_Widget_Surface_h */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Window.H",
    "content": "//\n// Window header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   Fl_Window widget . */\n\n#ifndef Fl_Window_H\n#define Fl_Window_H\n\n#include <FL/Fl.H>\n#include <FL/Fl_Group.H>\n#include <FL/Fl_Bitmap.H>\n\n#define FL_WINDOW 0xF0          ///< window type id: all subclasses have type() >= this\n#define FL_DOUBLE_WINDOW 0xF1   ///< double window type id\n\nclass Fl_X;\nclass Fl_Window_Driver;\nclass Fl_RGB_Image;\nclass Fl_Double_Window;\n\n/**\n  This widget produces an actual window.  This can either be a main\n  window, with a border and title and all the window management controls,\n  or a \"subwindow\" inside a window.  This is controlled by whether or not\n  the window has a parent().\n\n  Once you create a window, you usually add children Fl_Widget's to it\n  by using window->add(child) for each new widget.\n  See Fl_Group for more information on how to add and remove children.\n\n  There are several subclasses of Fl_Window that provide\n  double-buffering, overlay, menu, and OpenGL support.\n\n  The window's callback is done if the user tries to close a window\n  using the window manager and Fl::modal() is zero or equal to the\n  window. Fl_Window has a default callback that calls Fl_Window::hide().\n  Callback reasons can be \\p FL_REASON_CANCELLED if the Escape key was pressed,\n  or \\p FL_REASON_CLOSED when the close button is clicked. \\p FL_WHEN_...\n  flags are ignored.\n*/\nclass FL_EXPORT Fl_Window : public Fl_Group {\n  friend class Fl_X;\n  friend class Fl_Window_Driver;\nprivate:\n  static char *default_xclass_;\n  static char show_next_window_iconic_; // 1 means create next window in iconic form\n\n  int no_fullscreen_x;\n  int no_fullscreen_y;\n  int no_fullscreen_w;\n  int no_fullscreen_h;\n  int fullscreen_screen_top;\n  int fullscreen_screen_bottom;\n  int fullscreen_screen_left;\n  int fullscreen_screen_right;\n\n  // TODO: it would make sense to merge the use of Fl_X and Fl_Window_Driver, maybe simply by\n  // TODO: deriving Fl_Window_Driver from Fl_X. However, there are a lot of historic kludges\n  // TODO: for some platforms around Fl_X.\n  Fl_X *flx_; // points at the system-specific stuff, but exists only after the window is mapped\n  Fl_Window_Driver *pWindowDriver; // points at the system-specific stuff at window creation time\n\n  const char* iconlabel_;\n  char* xclass_;\n\n  // private size_range stuff:\n  int minw_, minh_, maxw_, maxh_;\n  int dw_, dh_, aspect_;\n  uchar size_range_set_;        // true (1) if size_range() has been set or calculated\n\n  // cursor stuff\n  Fl_Cursor cursor_default;\n\n  void _Fl_Window(); // constructor innards\n\n  // unimplemented copy ctor and assignment operator\n  Fl_Window(const Fl_Window&);\n  Fl_Window& operator=(const Fl_Window&);\n\n  void is_maximized_(bool b);\n\nprotected:\n\n  /** Stores the last window that was made current. See current() const */\n  static Fl_Window *current_;\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  /** Forces the window to be drawn, this window is also made current and calls draw(). */\n  virtual void flush();\n\nprotected:\n\n  /**\n    Sets an internal flag that tells FLTK and the window manager to\n    honor position requests.\n\n    This is used internally and should not be needed by user code.\n\n    \\param[in] force 1 to set the FORCE_POSITION flag, 0 to clear it\n  */\n  void force_position(int force) {\n    if (force) set_flag(FORCE_POSITION);\n    else clear_flag(FORCE_POSITION);\n  }\n  /**\n    Returns the internal state of the window's FORCE_POSITION flag.\n\n    \\retval 1 if flag is set\n    \\retval 0 otherwise\n\n    \\see force_position(int)\n  */\n  int force_position() const { return ((flags() & FORCE_POSITION)?1:0); }\n\n  void free_icons();\n\n  void default_size_range();  // calculate size_range() if not set explicitly\n  int is_resizable();         // calculate size_range() and return whether this is resizable\n\npublic:\n\n  /**\n    Creates a window from the given width \\p w, height \\p h, and \\p title.\n    If Fl_Group::current() is not NULL, the window is created as a\n    subwindow of the parent window.\n\n    The (w, h) form of the constructor creates a top-level window\n    and asks the window manager to position the window. The (x, y, w, h)\n    form of the constructor either creates a subwindow or a\n    top-level window at the specified location (x, y), subject to window\n    manager configuration. If you do not specify the position of the\n    window, the window manager will pick a place to show the window\n    or allow the user to pick a location. Use position(x, y)\n    or hotspot() before calling show() to request a\n    position on the screen. See Fl_Window::resize()\n    for some more details on positioning windows.\n\n    Top-level windows initially have visible() set to 0\n    and parent() set to NULL. Subwindows initially\n    have visible() set to 1 and parent() set to\n    the parent window pointer.\n\n    Fl_Widget::box() defaults to FL_FLAT_BOX. If you plan to\n    completely fill the window with children widgets you should\n    change this to FL_NO_BOX. If you turn the window border off\n    you may want to change this to FL_UP_BOX.\n\n    \\see Fl_Window(int x, int y, int w, int h, const char *title)\n  */\n    Fl_Window(int w, int h, const char *title = 0);\n  /** Creates a window from the given position (x, y), size (w, h) and title.\n\n   On a multi-screen system, the values computed by\n   Fl::screen_xywh(int &X, int &Y, int &W, int &H, int n) can be used to\n   discover the coordinates of the area of screen \\#n.\n   When these screens have various scale factor\n   values, an \\p (x, y) pair may not be enough to specify the targeted screen\n   for the window, because the same \\p (x,y) pair can belong to several screens.\n   In that situation, a call to Fl_Window::screen_num(int) is to be used to identify\n   unambiguously the targeted screen.\n\n    \\see Fl_Window(int w, int h, const char *title)\n    \\see Fl::screen_xywh(int &X, int &Y, int &W, int &H, int n)\n\n   \\note Under Wayland, it's generally not possible for the client app to control\n   the position of a window in the system. It's possible to specify on what screen\n   should the compositor place a fullscreen window. It's also possible to make an\n   Fl_Window the child of another window or group and control with \\p x and \\p y\n   its screen position relatively to the enclosing window. Apply member function\n   Fl_Window::allow_expand_outside_parent() to the child window to allow it\n   to expand partially or totally outside its parent.\n  */\n    Fl_Window(int x, int y, int w, int h, const char *title = 0);\n  /**\n    The destructor <I>also deletes all the children</I>. This allows a\n    whole tree to be deleted at once, without having to keep a pointer to\n    all the children in the user code. A kludge has been done so the\n    Fl_Window and all of its children can be automatic (local)\n    variables, but you must declare the Fl_Window <I>first</I> so\n    that it is destroyed last.\n  */\n    virtual ~Fl_Window();\n\n  int handle(int) FL_OVERRIDE;\n\n  /**\n    Changes the size and position of the window.  If shown() is true,\n    these changes are communicated to the window server (which may\n    refuse that size and cause a further resize).  If shown() is\n    false, the size and position are used when show() is called.\n    See Fl_Group for the effect of resizing on the child widgets.\n\n    You can also call the Fl_Widget methods size(x,y) and position(w,h),\n    which are inline wrappers for this virtual function.\n\n    A top-level window can not force, but merely suggest a position and\n    size to the operating system. The window manager may not be willing or\n    able to display a window at the desired position or with the given\n    dimensions. It is up to the application developer to verify window\n    parameters after the resize request.\n  */\n  void resize(int X,int Y,int W,int H) FL_OVERRIDE;\n  /** Sets whether or not the window manager border is around the window.\n  The default value is true. The macOS platform ignores requests to change the\n  border state of a fullscreen or maximized window.\n   <I>With some X window\n  managers, this does not work after show() has been called.</I>\n  */\n  void border(int b);\n  /**\n    Fast inline function to turn the window manager border\n    off. It only works before show() is called.\n  */\n  void clear_border()   {set_flag(NOBORDER);}\n  /** Returns whether the window possesses a border */\n  unsigned int border() const   {return !(flags() & NOBORDER);}\n  /** Activates the flags NOBORDER|OVERRIDE */\n  void set_override()   {set_flag(NOBORDER|OVERRIDE);}\n  /** Returns non zero if OVERRIDE flag is set, 0 otherwise. */\n  unsigned int override() const  { return flags()&OVERRIDE; }\n  /**\n    A \"modal\" window, when shown(), will prevent any events from\n    being delivered to other windows in the same program, and will also\n    remain on top of the other windows (if the X window manager supports\n    the \"transient for\" property).  Several modal windows may be shown at\n    once, in which case only the last one shown gets events.  You can see\n    which window (if any) is modal by calling Fl::modal().\n  */\n  void set_modal()      {set_flag(MODAL);}\n  /**  Returns true if this window is modal.  */\n  unsigned int modal() const    {return flags() & MODAL;}\n  /**\n    A \"non-modal\" window (terminology borrowed from Microsoft Windows)\n    acts like a modal() one in that it remains on top, but it has\n    no effect on event delivery.  There are <I>three</I> states for a\n    window: modal, non-modal, and normal.\n  */\n  void set_non_modal()  {set_flag(NON_MODAL);}\n  /**  Returns true if this window is modal or non-modal. */\n  unsigned int non_modal() const {return flags() & (NON_MODAL|MODAL);}\n\n  /**\n    Clears the \"modal\" flags and converts a \"modal\" or \"non-modal\"\n    window back into a \"normal\" window.\n\n    Note that there are <I>three</I> states for a window: modal,\n    non-modal, and normal.\n\n    You can not change the \"modality\" of a window whilst\n    it is shown, so it is necessary to first hide() the window,\n    change its \"modality\" as required, then re-show the window\n    for the new state to take effect.\n\n    This method can also be used to change a \"modal\" window into a\n    \"non-modal\" one. On several supported platforms, the \"modal\" state\n    over-rides the \"non-modal\" state, so the \"modal\" state must be\n    cleared before the window can be set into the \"non-modal\"\n    state.\n    In general, the following sequence should work:\n\n    \\code\n    win->hide();\n    win->clear_modal_states();\n    // Set win to new state as desired, or leave \"normal\", e.g...\n    win->set_non_modal();\n    win->show();\n    \\endcode\n\n    \\note Under some window managers, the sequence of hiding the\n    window and changing its modality will often cause it to be\n    re-displayed at a different position when it is subsequently\n    shown. This is an irritating feature but appears to be\n    unavoidable at present.\n    As a result we would advise to use this method only when\n    absolutely necessary.\n\n    \\see void set_modal(), void set_non_modal()\n  */\n  void clear_modal_states() {clear_flag(NON_MODAL | MODAL);}\n\n  /**\n    Marks the window as a menu window.\n\n    This is intended for internal use, but it can also be used if you\n    write your own menu handling. However, this is not recommended.\n\n    This flag is used for correct \"parenting\" of windows in communication\n    with the windowing system. Modern X window managers can use different\n    flags to distinguish menu and tooltip windows from normal windows.\n\n    This must be called before the window is shown and cannot be changed\n    later.\n  */\n  void set_menu_window()        {set_flag(MENU_WINDOW);}\n\n  /**  Returns true if this window is a menu window. */\n  unsigned int menu_window() const {return flags() & MENU_WINDOW;}\n\n  /**\n    Marks the window as a tooltip window.\n\n    This is intended for internal use, but it can also be used if you\n    write your own tooltip handling. However, this is not recommended.\n\n    This flag is used for correct \"parenting\" of windows in communication\n    with the windowing system. Modern X window managers can use different\n    flags to distinguish menu and tooltip windows from normal windows.\n\n    This must be called before the window is shown and cannot be changed\n    later.\n\n    \\note Since Fl_Tooltip_Window is derived from Fl_Menu_Window, this\n    also \\b clears the menu_window() state.\n  */\n  void set_tooltip_window()     { set_flag(TOOLTIP_WINDOW);\n                                  clear_flag(MENU_WINDOW); }\n  /**  Returns true if this window is a tooltip window. */\n  unsigned int tooltip_window() const {return flags() & TOOLTIP_WINDOW;}\n\n  /**\n    Positions the window so that the mouse is pointing at the given\n    position, or at the center of the given widget, which may be the\n    window itself.  If the optional offscreen parameter is\n    non-zero, then the window is allowed to extend off the screen (this\n    does not work with some X window managers). \\see position()\n  */\n  void hotspot(int x, int y, int offscreen = 0);\n  /** See void Fl_Window::hotspot(int x, int y, int offscreen = 0) */\n  void hotspot(const Fl_Widget*, int offscreen = 0);\n  /** See void Fl_Window::hotspot(int x, int y, int offscreen = 0) */\n  void hotspot(const Fl_Widget& p, int offscreen = 0) {hotspot(&p,offscreen);}\n\n  /**\n    Undoes the effect of a previous resize() or show() so that the next time\n    show() is called the window manager is free to position the window.\n\n    This is for Forms compatibility only.\n\n    \\deprecated please use force_position(0) instead\n  */\n  void free_position()  {clear_flag(FORCE_POSITION);}\n\n  void size_range(int minw, int minh, int maxw=0, int maxh=0, int dw=0, int dh=0, int aspect=0);\n\n  uchar get_size_range(int *minw, int *minh, int *maxw=NULL, int *maxh=NULL, int *dw=NULL, int *dh=NULL, int *aspect=NULL);\n\n  /** See void Fl_Window::label(const char*)   */\n  const char* label() const     {return Fl_Widget::label();}\n  /**  See void Fl_Window::iconlabel(const char*)   */\n  const char* iconlabel() const {return iconlabel_;}\n  /** Sets the window title bar label. */\n  void label(const char*);\n  /** Sets the icon label. */\n  void iconlabel(const char*);\n  /** Sets the icon label. */\n  void label(const char* label, const char* iconlabel); // platform dependent\n  void copy_label(const char* a);\n\n  static void default_xclass(const char*);\n  static const char *default_xclass();\n  const char* xclass() const;\n  void xclass(const char* c);\n\n  static void default_icon(const Fl_RGB_Image*);\n  static void default_icons(const Fl_RGB_Image*[], int);\n  void icon(const Fl_RGB_Image*);\n  void icons(const Fl_RGB_Image*[], int);\n\n#if defined(_WIN32) || defined(FL_DOXYGEN)\n  typedef struct HICON__* HICON;\n  // These 2 member functions break the driver model but are kept for back compatibility.\n  // They are implemented in Fl_win32.cxx\n\n  /** Sets the default window icons (Windows platform only).\n\n   Convenience function to set the default icons using Windows'\n   native HICON icon handles.\n\n   The given icons are copied. You can free the icons immediately after\n   this call.\n\n   \\param[in] big_icon default large icon for all windows\n   subsequently created\n   \\param[in] small_icon default small icon for all windows\n   subsequently created\n\n   \\see Fl_Window::default_icon(const Fl_RGB_Image *)\n   \\see Fl_Window::default_icons(const Fl_RGB_Image *[], int)\n   \\see Fl_Window::icon(const Fl_RGB_Image *)\n   \\see Fl_Window::icons(const Fl_RGB_Image *[], int)\n   \\see Fl_Window::icons(HICON, HICON)\n   */\n  static void default_icons(HICON big_icon, HICON small_icon);\n\n  /** Sets the window icons using HICON handles (Windows platform only).\n\n   The given icons are copied. You can free the icons immediately after\n   this call.\n\n   \\param[in] big_icon large window icon\n   \\param[in] small_icon  small window icon\n   */\n  void icons(HICON big_icon, HICON small_icon);\n#endif // defined(_WIN32) || defined(FL_DOXYGEN)\n\n  /* for legacy compatibility */\n  const void* icon() const;\n  void icon(const void * ic);\n\n  /**\n    Returns non-zero if show() has been called (but not hide()\n    ). You can tell if a window is iconified with (w->shown()\n    && !w->visible()).\n  */\n  int shown() {return flx_ != 0;}\n  /**\n    Puts the window on the screen. This has the side\n    effect of opening the display, if not done before.\n\n    If the window is already shown then it is restored and raised to the\n    top.  This is really convenient because your program can call show()\n    at any time, even if the window is already up.  It also means that\n    show() serves the purpose of raise() in other toolkits.\n\n    Fl_Window::show(int argc, char **argv) is used for top-level\n    windows and allows standard arguments to be parsed from the\n    command-line.\n\n    \\note For some obscure reasons Fl_Window::show() resets the current\n    group by calling Fl_Group::current(0). The comments in the code\n    say \"get rid of very common user bug: forgot end()\". Although\n    this is true it may have unwanted side effects if you show() an\n    unrelated window (maybe for an error message or warning) while\n    building a window or any other group widget.\n\n    \\todo Check if we can remove resetting the current group in a later\n    FLTK version (after 1.3.x). This may break \"already broken\" programs\n    though if they rely on this \"feature\".\n\n    \\see Fl_Window::show(int argc, char **argv)\n  */\n  void show() FL_OVERRIDE;\n  /**\n    Removes the window from the screen.  If the window is already hidden or\n    has not been shown then this does nothing and is harmless.\n  */\n  void hide() FL_OVERRIDE;\n  /**\n    Puts the window on the screen with show() and parses command-line arguments.\n\n    This call should be used for top-level windows, at least for the\n    first (main) window. It allows standard arguments to be parsed, as done by Fl::args(int, char **),\n    from the command-line. You can use \\p argc and \\p argv from\n    main(int argc, char **argv) for this call.\n\n    This call also sets up some system-specific internal variables, that is,\n    it sets FL_SELECTION_COLOR and calls Fl::background(), Fl::background2(), Fl::foreground()\n    with default or X resources-given values, and calls Fl::scheme(const char *) for the current scheme.\n    On X11, it also calls Fl::dnd_text_ops(int), Fl_Tooltip::enable(int),\n    Fl::visible_focus(int) with X resources-given values.\n\n    \\param argc command-line argument count, usually from main()\n    \\param argv command-line argument vector, usually from main()\n\n    \\see virtual void Fl_Window::show()\n    \\see Fl::args(int, char **)\n  */\n  void show(int argc, char **argv);\n\n  // Enables synchronous show(), docs in Fl_Window.cxx\n  void wait_for_expose();\n\n  /**\n    Makes the window completely fill one or more screens, without any\n    window manager border visible.  You must use fullscreen_off() to\n    undo this.\n\n    \\note On some platforms, this can result in the keyboard being\n    grabbed. The window may also be recreated, meaning hide() and\n    show() will be called.\n\n    \\see void Fl_Window::fullscreen_screens()\n  */\n  void fullscreen();\n  /**\n    Turns off any side effects of fullscreen()\n  */\n  void fullscreen_off();\n  /**\n    Turns off any side effects of fullscreen() and does\n    resize(x,y,w,h).\n  */\n  void fullscreen_off(int X,int Y,int W,int H);\n  /**\n    Returns non zero if FULLSCREEN flag is set, 0 otherwise.\n  */\n  unsigned int fullscreen_active() const { return flags() & FULLSCREEN; }\n  /**\n    Sets which screens should be used when this window is in fullscreen\n    mode. The window will be resized to the top of the screen with index\n    \\p top, the bottom of the screen with index \\p bottom, etc.\n\n    If this method is never called, or if any argument is < 0, then the\n    window will be resized to fill the screen it is currently on.\n\n    \\see void Fl_Window::fullscreen()\n    */\n  void fullscreen_screens(int top, int bottom, int left, int right);\n\n  void maximize();\n  void un_maximize();\n  /** Returns whether the window is currently maximized */\n  unsigned int maximize_active() const { return flags() & MAXIMIZED; }\npublic:\n  /**\n    Iconifies the window.  If you call this when shown() is false\n    it will show() it as an icon.  If the window is already\n    iconified this does nothing.\n\n    Call show() to restore the window.\n\n    When a window is iconified/restored (either by these calls or by the\n    user) the handle() method is called with FL_HIDE and\n    FL_SHOW events and visible() is turned on and off.\n\n    There is no way to control what is drawn in the icon except with the\n    string passed to Fl_Window::xclass().  You should not rely on\n    window managers displaying the icons.\n  */\n  void iconize();\n\n  int x_root() const ;\n  int y_root() const ;\n\n static Fl_Window *current();\n  /**\n    Sets things up so that the drawing functions in <FL/fl_draw.H> will go\n    into this window. This is useful for incremental update of windows, such\n    as in an idle callback, which will make your program behave much better\n    if it draws a slow graphic. <B>Danger: incremental update is very hard to\n    debug and maintain!</B>\n\n    This method only works for the Fl_Window and Fl_Gl_Window derived classes.\n  */\n  void make_current();\n\n  void cursor(Fl_Cursor);\n  void cursor(const Fl_RGB_Image*, int, int);\n  void default_cursor(Fl_Cursor);\n\n  /* for legacy compatibility */\n  void cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE);\n  void default_cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE);\n\n  static void default_callback(Fl_Window*, void* v);\n\n  /** Returns the window width including any frame added by the window manager.\n\n   Same as w() if applied to a subwindow, or if window is not yet mapped.\n   \\see decorated_h().\n   */\n  int decorated_w() const;\n\n  /** Returns the window height including any window title bar and any frame\n   added by the window manager.\n\n   Same as h() if applied to a subwindow, or if window is not yet mapped.\n   \\note Under X11, FLTK is able to compute the size of window titlebars and borders\n   only if these decoration elements are strictly X11-based. When that's not the case,\n   decorated_h() returns the same value as h() and decorated_w() as w(), and FLTK\n   cannot access window decorations.\n\n   \\note Under X11 again, the values returned by decorated_h() and decorated_w()\n   may not be reliable <b> during a resize operation</b>. The size of decoration elements\n   of a window is best computed when the window is first mapped.\n   */\n  int decorated_h() const;\n\n  // Note: Doxygen docs in Fl_Widget.H to avoid redundancy.\n  Fl_Window* as_window() FL_OVERRIDE { return this; }\n  Fl_Window const* as_window() const FL_OVERRIDE { return this; }\n\n  /**\n   Return non-null if this is an Fl_Overlay_Window object.\n   */\n  virtual class Fl_Overlay_Window *as_overlay_window() {return 0L; }\n\n  /**\n   Return non-null if this is an Fl_Double_Window object.\n   */\n  virtual class Fl_Double_Window *as_double_window() {return 0L;}\n\n  void shape(const Fl_Image* img);\n  void shape(const Fl_Image& b);\n  const Fl_Image *shape();\n  void draw_backdrop();\n  int screen_num();\n  void screen_num(int screen_num);\n  static bool is_a_rescale();\n  fl_uintptr_t os_id();\n\n  /**\n    Sets a static flag whether the next window should be opened iconified.\n\n    \\note This is an <b>internal function</b>, you should not use this in user code.\n\n    Please use Fl_Window::iconize() instead.\n  */\n  static void show_next_window_iconic(char stat) {\n    show_next_window_iconic_ = stat ? 1 : 0;\n  }\n\n  /**\n    Returns the static flag whether the next window should be opened iconified.\n\n    \\note This is an <b>internal function</b>, you should not use this in user code.\n\n    Please use Fl_Window::iconize() to iconify a window.\n  */\n  static char show_next_window_iconic() {\n    return show_next_window_iconic_;\n  }\n\n  void allow_expand_outside_parent();\n\n};\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_Wizard.H",
    "content": "//\n// Fl_Wizard widget definitions.\n//\n// Copyright 1999-2010 by Easy Software Products.\n// Copyright 2011-2020 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_Wizard widget . */\n\n//\n// Include necessary header files...\n//\n\n#ifndef _Fl_Wizard_H_\n#define _Fl_Wizard_H_\n\n#include <FL/Fl_Group.H>\n\n/**\n  This widget is based off the Fl_Tabs widget, but instead of\n  displaying tabs it only changes \"tabs\" under program control.\n\n  Its primary purpose is to support \"wizards\" that step a user\n  through configuration or troubleshooting tasks.\n\n  As with Fl_Tabs, wizard panes are composed of child (usually\n  Fl_Group) widgets. Navigation buttons must be added separately.\n*/\nclass FL_EXPORT Fl_Wizard : public Fl_Group {\n\n  Fl_Widget *value_;\n\nprotected:\n\n  void draw() FL_OVERRIDE;\n\npublic:\n\n  Fl_Wizard(int, int, int, int, const char * = 0);\n\n  void next();\n  void prev();\n  Fl_Widget *value();\n  void value(Fl_Widget *);\n};\n\n#endif // !_Fl_Wizard_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_XBM_Image.H",
    "content": "//\n// XBM image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n   Fl_XBM_Image class . */\n\n#ifndef Fl_XBM_Image_H\n#define Fl_XBM_Image_H\n#  include \"Fl_Bitmap.H\"\n\n/**\n  The Fl_XBM_Image class supports loading, caching,\n  and drawing of X Bitmap (XBM) bitmap files.\n*/\nclass FL_EXPORT Fl_XBM_Image : public Fl_Bitmap {\n\n  public:\n\n  Fl_XBM_Image(const char* filename);\n};\n\n#endif // !Fl_XBM_Image_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Fl_XPM_Image.H",
    "content": "//\n// XPM image header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/* \\file\n\n   Fl_XPM_Image class . */\n\n#ifndef Fl_XPM_Image_H\n#define Fl_XPM_Image_H\n#  include \"Fl_Pixmap.H\"\n\n/**\n  The Fl_XPM_Image class supports loading, caching,\n  and drawing of X Pixmap (XPM) images, including transparency.\n*/\nclass FL_EXPORT Fl_XPM_Image : public Fl_Pixmap {\n\n  public:\n\n  Fl_XPM_Image(const char* filename);\n};\n\n#endif // !Fl_XPM_Image\n"
  },
  {
    "path": "Game Trainers/common/include/FL/Makefile.in",
    "content": "#\n# Header Makefile for the Fast Light Tool Kit (FLTK).\n#\n# Copyright 1998-2021 by Bill Spitzak and others.\n#\n# This library is free software. Distribution and use rights are outlined in\n# the file \"COPYING\" which should have been included with this file.  If this\n# file is missing or damaged, see the license at:\n#\n#      https://www.fltk.org/COPYING.php\n#\n# Please see the following page on how to report bugs and issues:\n#\n#      https://www.fltk.org/bugs.php\n#\n\ninclude ../makeinclude\n\nall:\n\nclean:\n\ndepend:\n\ninstall:\n\techo \"Installing include files in $(DESTDIR)$(includedir)...\"\n\t$(RMDIR) \"$(DESTDIR)$(includedir)/FL\"\n\t$(INSTALL_DIR) \"$(DESTDIR)$(includedir)/FL\"\n\tfor file in *.[hH]; do \\\n\t\t$(INSTALL_DATA) $$file \"$(DESTDIR)$(includedir)/FL\"; \\\n\tdone\n@HLINKS@\tcd \"$(DESTDIR)$(includedir)/FL\";\\\n@HLINKS@\tfor file in *.H; do\\\n@HLINKS@\t\t$(RM) \"`basename $$file H`h\";\\\n@HLINKS@\t\t$(LN) $$file \"`basename $$file H`h\";\\\n@HLINKS@\tdone\n@HLINKS@\t$(RM) \"$(DESTDIR)$(includedir)/FL/fl_file_chooser.H\"\n@HLINKS@\t$(LN) Fl_File_Chooser.H \"$(DESTDIR)$(includedir)/FL/fl_file_chooser.H\"\n@HLINKS@\t$(RM) \"$(DESTDIR)$(includedir)/FL/fl_file_chooser.h\"\n@HLINKS@\t$(LN) Fl_File_Chooser.H \"$(DESTDIR)$(includedir)/FL/fl_file_chooser.h\"\n@HLINKS@\t$(RM) \"$(DESTDIR)$(includedir)/Fl\"\n@HLINKS@\t$(LN) FL \"$(DESTDIR)$(includedir)/Fl\"\n\nuninstall:\n\techo \"Uninstalling include files...\"\n\t$(RMDIR) \"$(DESTDIR)$(includedir)/FL\"\n@HLINKS@\t$(RM) \"$(DESTDIR)$(includedir)/Fl\"\n"
  },
  {
    "path": "Game Trainers/common/include/FL/README.Xcode",
    "content": "All FLTK header files are in the FL subdirectory of the fltk.framework.\nImage header files are located in \"fltk.framework/Headers/FL/images/\".\n"
  },
  {
    "path": "Game Trainers/common/include/FL/filename.H",
    "content": "/*\n * Filename header file for the Fast Light Tool Kit (FLTK).\n *\n * Copyright 1998-2023 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n/*\n * Note to devs:\n * Under Windows, we include filename.H from numericsort.c; this should probably change.\n * This implies that we need C-style comments and '#ifdef __cplusplus ... #endif'\n */\n\n/** \\file\n  File names and URI utility functions.\n*/\n\n#ifndef FL_FILENAME_H\n#  define FL_FILENAME_H\n\n#include \"Fl_Export.H\"\n#include <FL/platform_types.h>\n\n#ifdef __cplusplus\n\n// The following include is not (yet) used in FLTK 1.4\n// In FLTK 1.5 or 4.0 using std::string would be default.\n// #include <string>\n\n#endif /* __cplusplus */\n\n/** \\addtogroup filenames File names and URI utility functions\n File names and URI functions defined in <FL/filename.H>\n    @{ */\n\n#  define FL_PATH_MAX 2048 /**< all path buffers should use this length */\n/** Gets the file name from a path.\n    Similar to basename(3), exceptions shown below.\n    \\code\n    #include <FL/filename.H>\n    [..]\n    const char *out;\n    out = fl_filename_name(\"/usr/lib\");     // out=\"lib\"\n    out = fl_filename_name(\"/usr/\");        // out=\"\"      (basename(3) returns \"usr\" instead)\n    out = fl_filename_name(\"/usr\");         // out=\"usr\"\n    out = fl_filename_name(\"/\");            // out=\"\"      (basename(3) returns \"/\" instead)\n    out = fl_filename_name(\".\");            // out=\".\"\n    out = fl_filename_name(\"..\");           // out=\"..\"\n    \\endcode\n    \\return a pointer to the char after the last slash, or to \\p filename if there is none.\n */\nFL_EXPORT const char *fl_filename_name(const char * filename);\nFL_EXPORT const char *fl_filename_ext(const char *buf);\nFL_EXPORT char *fl_filename_setext(char *to, int tolen, const char *ext);\nFL_EXPORT int fl_filename_expand(char *to, int tolen, const char *from);\nFL_EXPORT int fl_filename_absolute(char *to, int tolen, const char *from);\nFL_EXPORT int fl_filename_relative(char *to, int tolen, const char *from);\nFL_EXPORT int fl_filename_match(const char *name, const char *pattern);\nFL_EXPORT int fl_filename_isdir(const char *name);\n\n#  if defined(__cplusplus)\n\nFL_EXPORT int fl_filename_absolute(char *to, int tolen, const char *from, const char *cwd);\nFL_EXPORT int fl_filename_relative(char *to, int tolen, const char *from, const char *cwd);\n\n\n// FIXME: We can't do this in 1.4.x - enable this block in 1.5 or higher.\n// See fluid/fluid_filename.{h|cxx} for an implementation using Fl_String.\n\n// FL_EXPORT std::string fl_filename_name(const std::string &filename);\n// FL_EXPORT std::string fl_filename_path(const std::string &filename);\n// FL_EXPORT std::string fl_filename_ext(const std::string &filename);\n// FL_EXPORT std::string fl_filename_setext(const std::string &filename, const std::string &new_extension);\n// FL_EXPORT std::string fl_filename_expand(const std::string &from);\n// FL_EXPORT std::string fl_filename_absolute(const std::string &from);\n// FL_EXPORT std::string fl_filename_absolute(const std::string &from, const std::string &base);\n// FL_EXPORT std::string fl_filename_relative(const std::string &from);\n// FL_EXPORT std::string fl_filename_relative(const std::string &from, const std::string &base);\n// FL_EXPORT std::string fl_getcwd();\n\n#  endif /* defined(__cplusplus) */\n\n#  if defined(__cplusplus) && !defined(FL_DOXYGEN)\n/*\n * Under Windows, we include filename.H from numericsort.c; this should probably change...\n */\n\ninline char *fl_filename_setext(char *to, const char *ext) { return fl_filename_setext(to, FL_PATH_MAX, ext); }\ninline int fl_filename_expand(char *to, const char *from) { return fl_filename_expand(to, FL_PATH_MAX, from); }\ninline int fl_filename_absolute(char *to, const char *from) { return fl_filename_absolute(to, FL_PATH_MAX, from); }\ninline int fl_filename_relative(char *to, const char *from) { return fl_filename_relative(to, FL_PATH_MAX, from); }\n#  endif /* __cplusplus */\n\n#  if defined (__cplusplus)\nextern \"C\" {\n#  endif /* __cplusplus */\n\n#  if !defined(FL_DOXYGEN)\nFL_EXPORT int fl_alphasort(struct dirent **, struct dirent **);\nFL_EXPORT int fl_casealphasort(struct dirent **, struct dirent **);\nFL_EXPORT int fl_casenumericsort(struct dirent **, struct dirent **);\nFL_EXPORT int fl_numericsort(struct dirent **, struct dirent **);\n#  endif\n\ntypedef int (Fl_File_Sort_F)(struct dirent **, struct dirent **); /**< File sorting function. \\see fl_filename_list() */\n\n#  if defined(__cplusplus)\n}\n\n/*\n * Portable \"scandir\" function.  Ugly but necessary...\n */\n\nFL_EXPORT int fl_filename_list(const char *d, struct dirent ***l,\n                               Fl_File_Sort_F *s = fl_numericsort);\nFL_EXPORT void fl_filename_free_list(struct dirent ***l, int n);\n\n/*\n * Generic function to open a Uniform Resource Identifier (URI) using a\n * system-defined program (added in FLTK 1.1.8)\n */\n\nFL_EXPORT int   fl_open_uri(const char *uri, char *msg = (char *)0,\n                            int msglen = 0);\n\nFL_EXPORT void fl_decode_uri(char *uri);\n\n#  endif /* __cplusplus */\n\n/*\n * Note: FLTK 1.0.x compatibility definitions (FLTK_1_0_COMPAT) dropped in 1.4.0\n */\n\n#endif /* FL_FILENAME_H */\n\n/** @} */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_ask.H",
    "content": "//\n// Standard dialog header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file fl_ask.H\n  API for common dialogs.\n*/\n\n#ifndef _FL_fl_ask_H_\n#define _FL_fl_ask_H_\n\n#include <FL/Enumerations.H>\n#include <FL/fl_attr.h>\n\n#if (FLTK_USE_STD)\n#include <string>\n#endif\n\nclass Fl_Widget;\n\n/** Defines the different system beeps available.\n\n  Some systems may play different sounds or use different sound volume\n  depending on the Fl_Beep value. The implementation is platform dependent.\n\n  \\sa fl_beep(int)\n*/\nenum Fl_Beep {\n  FL_BEEP_DEFAULT = 0, ///< Default beep.\n  FL_BEEP_MESSAGE,     ///< Message beep.\n  FL_BEEP_ERROR,       ///< Error beep.\n  FL_BEEP_QUESTION,    ///< Question beep.\n  FL_BEEP_PASSWORD,    ///< Password beep.\n  FL_BEEP_NOTIFICATION ///< Notification beep.\n};\n\nFL_EXPORT void fl_beep(int type = FL_BEEP_DEFAULT);\nFL_EXPORT void fl_message(const char *, ...) __fl_attr((__format__(__printf__, 1, 2)));\nFL_EXPORT void fl_alert(const char *, ...) __fl_attr((__format__(__printf__, 1, 2)));\n\n// fl_ask() is deprecated since it uses \"Yes\" and \"No\" for the buttons,\n// which does not conform to the current FLTK Human Interface Guidelines.\n// Use fl_choice() or fl_choice_n() with the appropriate verbs instead.\n\nFL_EXPORT int fl_ask(const char *, ...) __fl_attr((__format__(__printf__, 1, 2), __deprecated__));\n\nFL_EXPORT int fl_choice(const char *q, const char *b0, const char *b1, const char *b2, ...)\n    __fl_attr((__format__(__printf__, 1, 5)));\nFL_EXPORT const char *fl_input(const char *label, const char *deflt = 0, ...) __fl_attr((__format__(__printf__, 1, 3)));\nFL_EXPORT const char *fl_password(const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 1, 3)));\n\n// since FLTK 1.3.8:\n// - fl_choice_n()     with extended return value (-2, -1, 0, 1, 2)\n\nFL_EXPORT int fl_choice_n(const char *q, const char *b0, const char *b1, const char *b2, ...)\n    __fl_attr((__format__(__printf__, 1, 5)));\n\n// since FLTK 1.4.0: with 'maxchar' to limit input size\n\nFL_EXPORT const char *fl_input(int maxchar, const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 2, 4)));\n\nFL_EXPORT const char *fl_password(int maxchar, const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 2, 4)));\n\n// since FLTK 1.4.0 -- only with option FLTK_USE_STD\n\n// - fl_input_str()    with limited input size, returns std::string\n// - fl_password_str() with limited input size, returns std::string\n\n#if (FLTK_USE_STD)\n\nFL_EXPORT std::string fl_input_str(int maxchar, const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 2, 4)));\n\nFL_EXPORT std::string fl_input_str(int &ret, int maxchar, const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 3, 5)));\n\nFL_EXPORT std::string fl_password_str(int maxchar, const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 2, 4)));\n\nFL_EXPORT std::string fl_password_str(int &ret, int maxchar, const char *label, const char *deflt = 0, ...)\n    __fl_attr((__format__(__printf__, 3, 5)));\n\n#endif\n\nFL_EXPORT Fl_Widget *fl_message_icon();\nextern FL_EXPORT Fl_Font fl_message_font_;\nextern FL_EXPORT Fl_Fontsize fl_message_size_;\ninline void fl_message_font(Fl_Font f, Fl_Fontsize s) {\n  fl_message_font_ = f;\n  fl_message_size_ = s;\n}\n\nFL_EXPORT void fl_message_hotspot(int enable);\nFL_EXPORT int fl_message_hotspot(void);\n\n// since FLTK 1.4.0: fl_message_position()\n\nFL_EXPORT void fl_message_position(const int x, const int y, const int center = 0);\nFL_EXPORT void fl_message_position(Fl_Widget *widget);\nFL_EXPORT int fl_message_position(int *x = 0, int *y = 0);\n\n/** \\see fl_message_position(Fl_Widget *widget). */\ninline void fl_message_position(Fl_Widget &widget) {\n  fl_message_position(&widget);\n}\n\nFL_EXPORT void fl_message_title(const char *title);\nFL_EXPORT void fl_message_title_default(const char *title);\n\nFL_EXPORT void fl_message_icon_label(const char *str);\n\n// pointers you can use to change FLTK to another language:\nextern FL_EXPORT const char *fl_no;\nextern FL_EXPORT const char *fl_yes;\nextern FL_EXPORT const char *fl_ok;\nextern FL_EXPORT const char *fl_cancel;\nextern FL_EXPORT const char *fl_close;\n\n#endif // !_FL_fl_ask_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_attr.h",
    "content": "/*\n * Function attribute declarations for the Fast Light Tool Kit (FLTK).\n *\n * Copyright 1998-2024 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n/**\n \\file fl_attr.h\n This file defines compiler-specific macros\n*/\n\n#ifndef _FL_fl_attr_h_\n#define _FL_fl_attr_h_\n\n\n/**\n This section lists macros for Doxygen documentation only. The next section\n will define the actual macros based on the compile used and based on the\n capabilities of the version of that compiler.\n */\n#ifdef FL_DOXYGEN\n\n\n/** To be used in prototypes with a variable list of arguments.\n This macro helps detection of mismatches between format string and\n argument list at compilation time.\n\n Usage example: FL/fl_ask.H\n */\n#define __fl_attr(x)\n\n/**\n  This macro makes it safe to use the C++11 keyword \\c override with\n  older compilers.\n*/\n#define FL_OVERRIDE override\n\n/**\n Enclosing a function or method in FL_DEPRECATED marks it as no longer\n recommended. This macro syntax can not be used if the return type contains\n a comma, which is not the case in FLTK.\n\n \\code\n FL_DEPRECATED(\"Outdated, don't use\", int position()) { return position_; }\n \\endcode\n */\n#define FL_DEPRECATED(msg, func) \\\n  /##*##* \\deprecated msg *##/ \\\n  func\n\n\n#else /* FL_DOXYGEN */\n\n// If FL_NO_DEPRECATED is defined FLTK 1.4 can compile 1.3.x code without\n// issuing several \"deprecated\" warnings (1.3 \"compatibility\" mode).\n// FL_DEPRECATED will be defined as a no-op.\n\n// If FL_NO_DEPRECATED is not defined (default) FLTK 1.4 will issue several\n// \"deprecated\" warnings depending on the compiler in use: FL_DEPRECATED\n// will be defined according to the capabilities of the compiler (below).\n// The definition below this comment must match the one at the end of this file.\n\n#if defined(FL_NO_DEPRECATED)\n#define FL_DEPRECATED(msg, func) func\n#endif\n\n#ifdef __cplusplus\n\n/*\n  Declare macros specific to Visual Studio.\n\n  Visual Studio defines __cplusplus = '199711L' in all its versions which is\n  not helpful for us here. For VS version number encoding see:\n  https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros\n\n  This document specifies that the macro _MSVC_LANG is defined since\n  \"Visual Studio 2015 Update 3\" as 201402L (default) and undefined in\n  earlier versions. It can be used to determine the C++ standard as\n  specified by the /std:c++ compiler option:\n\n  - /std:c++14      201402L  (also if /std:c++ is not used)\n  - /std:c++17      201703L\n  - /std:c++20      202002L\n  - /std:c++latest  a \"higher, unspecified value\" (docs of VS 2022)\n\n  As of this writing (02/2023) _MSVC_LANG is not yet used in this file\n  but it is documented for future use.\n*/\n\n#if defined(_MSC_VER)\n\n#if (_MSC_VER >= 1900) // Visual Studio 2015 (14.0)\n#ifndef FL_OVERRIDE\n#define FL_OVERRIDE override\n#endif\n#endif // Visual Studio 2015 (14.0)\n\n#if (_MSC_VER >= 1400) // Visual Studio 2005 (8.0)\n#ifndef FL_DEPRECATED\n#define FL_DEPRECATED(msg, func) __declspec(deprecated(msg)) func\n#endif\n#endif // Visual Studio 2005 (8.0)\n\n#if (_MSC_VER >= 1310) // Visual Studio .NET 2003 (7.1)\n#ifndef FL_DEPRECATED\n#define FL_DEPRECATED(msg, func) __declspec(deprecated) func\n#endif\n#endif // Visual Studio .NET 2003 (7.1)\n\n#endif // Visual Studio\n\n\n/*\n Declare macros specific to the C++ standard used.\n\n Macros may have been declared already in previous sections.\n */\n#if (__cplusplus >= 202002L) // C++20\n#endif // C++20\n\n#if (__cplusplus >= 201703L) // C++17\n#endif // C++17\n\n#if (__cplusplus >= 201402L) // C++14\n#ifndef FL_DEPRECATED\n#define FL_DEPRECATED(msg, func) [[deprecated(msg)]] func\n#endif\n#endif // C++14\n\n#if (__cplusplus >= 201103L) // C++11\n#ifndef FL_OVERRIDE\n#define FL_OVERRIDE override\n#endif\n#endif // C+11\n\n#if (__cplusplus >= 199711L) // C++89\n#endif // C++89\n\n#endif // __cplusplus\n\n/*\n Declare macros specific to clang\n\n Macros may have been declared already in previous sections.\n */\n#if defined(__clang__)\n\n#define FL_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)\n\n// -- nothing yet --\n\n#endif /* __clang__ */\n\n\n/*\n Declare macros specific to gcc.\n\n Macros may have been declared already in previous sections.\n */\n#if defined(__GNUC__)\n\n#define FL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n\n#ifndef __fl_attr\n#define __fl_attr(x) __attribute__ (x)\n#endif\n\n#if FL_GCC_VERSION > 40500 /* gcc 4.5.0 */\n#ifndef FL_DEPRECATED\n#define FL_DEPRECATED(msg, func) func __attribute__((deprecated(msg)))\n#endif\n#endif /* gcc 4.5.0 */\n\n#if FL_GCC_VERSION >= 30400 /* gcc 3.4.0 */\n#ifndef FL_DEPRECATED\n#define FL_DEPRECATED(msg, func) func __attribute__((deprecated))\n#endif\n#endif /* gcc 3.4.0 */\n\n#endif /* __GNUC__ */\n\n\n/*\n If a macro was not defined in any of the sections above, set it to no-op here.\n */\n\n#ifndef __fl_attr\n#define __fl_attr(x)\n#endif\n\n#ifndef FL_OVERRIDE\n#define FL_OVERRIDE\n#endif\n\n#ifndef FL_DEPRECATED\n#define FL_DEPRECATED(msg, func) func\n#endif\n\n\n#endif /* FL_DOXYGEN */\n\n\n#endif /* !_FL_fl_attr_h_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_callback_macros.H",
    "content": "/*\n * Macros for easy callbacks for the Fast Light Tool Kit (FLTK).\n *\n * Copyright 2023 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n#ifndef _FL_FL_CALLBACK_MACROS_H_\n#define _FL_FL_CALLBACK_MACROS_H_\n\n#include <stdlib.h>\n\n/**\n \\file fl_callback_macros.H\n This file provides macros for easy function and method callbacks\n with multiple type safe arguments.\n*/\n\n#ifdef FL_DOXYGEN\n\n/**\n \\brief Declare a C function callback with custom parameters.\n\n You can declare a plain C function callback or a static method callback with\n custom parameters using this macro. It simplifies the process of calling\n arbitrary functions with up to five custom parameters. The macro generates\n code that ensures type safety and expands FLTK's standard callbacks, which\n are limited to a single `void*` or `long` argument.\n\n To use the macro, you provide the widget that will handle the callback as the\n first argument. The second argument can be either a regular function or a\n static method in any class.\n\n Following these arguments, you can include up to five pairs, where each\n pair consists of a type and a value. For example,\n `int, 3` specifies an integer parameter with a value of 3. If you need to\n pass two arguments, you can use two pairs, like this:\n `int, 3, int, 4`. The last digit of the macro name must be the same as\n the number of pairs (0..5)\n\n Whenever the code generated by the macro is called, the custom parameters are\n duplicated and marked for automatic deallocation using `delete` when the\n callback widget is destroyed.\n\n \\code{.cpp}\n #include <FL/fl_callback_macros.H>\n ...\n Fl_Button *btn1 = new Fl_Button(10, 10, 100, 20, \"Beep\");\n FL_FUNCTION_CALLBACK_0(btn1, fl_beep);\n ...\n Fl_Button *btn2 = new Fl_Button(10, 40, 100, 20, \"Hello\");\n FL_FUNCTION_CALLBACK_5(btn2,\n   fl_message,\n   const char *, \"Hello\\n%d %d %d %d\",\n   int, 1,  int, 2,  int, 3,  int, 4\n );\n \\endcode\n\n You can find a small demonstration program showcasing the usage of\n `FL_*_CALLBACK_*` in the `examples/callbacks.cxx` file.\n\n \\param WIDGET the widget that will call the callback\n \\param FUNC a C/C++ function or a static class method\n \\param TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2 a list of zero to five type/value pairs, all separated by commas\n\n \\see FL_METHOD_CALLBACK_1, FL_INLINE_CALLBACK_2\n */\n#define FL_FUNCTION_CALLBACK_3(WIDGET, FUNC, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2)\n\n/**\n \\brief Declare a non-static class method callback with custom parameters.\n\n You can declare a callback for a non-static class method with custom parameters\n using this macro. It provides a convenient way to call arbitrary methods in\n any class, overcoming FLTK's limitation of passing only a single `void*` or\n `long` argument. Furthermore, it ensures type safety.\n\n The first argument of the macro specifies the widget that will handle the\n callback. The second argument indicates the class type to be called. The\n third argument must be a pointer to an instance of that class. The\n fourth argument is the name of the method within the class. That method must be\n public and should not be static.\n\n Following these arguments, you can include up to five pairs, where each\n pair consists of a type and a value. For example,\n `int, 3` specifies an integer parameter with a value of 3. If you need to\n pass two arguments, you can use two pairs, like this:\n `int, 3, int, 4`. The last digit of the macro name must be the same as\n the number of pairs (0..5)\n\n Whenever the code generated by the macro is called, the custom parameters are\n duplicated and marked for automatic deallocation using `delete` when the\n callback widget is destroyed.\n\n \\code{.cpp}\n #include <FL/fl_callback_macros.H>\n ...\n Fl_Button *btn = new Fl_Button(10, 10, 100, 20, \"Test\");\n FL_METHOD_CALLBACK_1(btn, Fl_Button, btn, color, Fl_Color, FL_GREEN);\n \\endcode\n\n You can find a small demonstration program showcasing the usage of\n `FL_*_CALLBACK_*` in the `examples/callbacks.cxx` file.\n\n \\param WIDGET the widget that will call the callback\n \\param CLASS the class type\n \\param SELF a pointer to an instance of the class\n \\param METH a C++ class method that must be public and not static\n \\param TYPE0, VALUE0 a list of zero to five type/value pairs, all separated by commas\n\n \\see FL_FUNCTION_CALLBACK_3, FL_INLINE_CALLBACK_2\n */\n#define FL_METHOD_CALLBACK_1(WIDGET, CLASS, SELF, METH, TYPE0, VALUE0)\n\n/**\n \\brief Creates code to declare a callback function in line with instantiating a widget.\n\n You can use this macro to create a function as a callback, allowing you to\n define the callback function right where the widget and callback are declared,\n similar to a Lambda function.\n\n The first argument of the macro specifies the widget that will handle the\n callback. Next, you can include up to five triplets, where each triplet\n consists of a type, a parameter name, and a value. For example, `int, x, 3`\n specifies an integer parameter with a value of 3. If you need to pass two\n arguments, you can use two triplets, such as `int, x, 3, int, y, 4`. The last\n digit of the macro name must be the same as the number of triplets (0..5).\n\n The last argument is the actual function body itself.\n\n The function body is limited to a syntax that the macro preprocessor can\n handle. It should include the leading '{' and trailing '}' and may contain\n local variable declarations, use global variables and functions, and use also\n the variables listed and initialized in the argument triples of the macro.\n Very large function bodies should be avoided because they may exceed the\n admissible size of a macro argument.\n\n Whenever the code generated by the macro is called, the custom parameters are\n duplicated and marked for automatic deallocation using `delete` when the\n callback widget is destroyed.\n\n \\code{.cpp}\n #include <FL/fl_callback_macros.H>\n ...\n Fl_Button *btn = new Fl_Button(10, 10, 100, 20, \"Test\");\n FL_INLINE_CALLBACK_1(btn,\n   const char *, name, btn->label(),\n   {\n     fl_message(\"Greetings from the %s button\", name);\n   }\n );\n \\endcode\n\n You can find a small demonstration program showcasing the usage of\n `FL_*_CALLBACK_*` in the `examples/callbacks.cxx` file.\n\n \\param WIDGET the widget that will call the callback\n \\param TYPE0 the type of the first parameter in the function call\n \\param NAME0 an arbitrary variable name that can be used as a parameter in the function body\n \\param VALUE0 a constant value or a variable; the value of the variable is copied when the callback is created\n \\param TYPE1, NAME1, VALUE1 as above; there are six macros that support 0 to 5 parameters\n \\param LAMBDA the function body within the limits of the C macro preprocessor\n\n \\see FL_METHOD_CALLBACK_1, FL_FUNCTION_CALLBACK_3\n */\n#define FL_INLINE_CALLBACK_2(WIDGET, TYPE0, NAME0, VALUE0, TYPE1, NAME1, VALUE1, LAMBDA)\n\n#else // FL_DOXYGEN\n\n/*\n These two macros make it possible to call macros with names that are created\n by concatenating the name in x and (in this context) the number in y.\n */\n#define _FL_CBD_CONCAT_IMPL(x, y) x##y\n#define _FL_CBD_CONCAT(x, y) _FL_CBD_CONCAT_IMPL(x, y)\n\n/*\n Create a unique name for the derived class based on the current source code\n line number.\n */\n#define _FL_CBD_CLASS_NAME _FL_CBD_CONCAT(Fl_Callback_User_Data_,__LINE__)\n\n\n/*\n These macros create boilerplate code for callbacks to functions and\n  static class methods with up to five arguments.\n\n  This macro invocation for example\n  ```\n  FL_FUNCTION_CALLBACK_2( func_cb_btn_2, hello_2_args_cb,\n                          const char *, text, \"FLTK\",\n                          int, number, 2 );\n  ```\n  will generate the following code:\n\n  ```\n  do {\n    class Fl_Callback_User_Data_92 : public Fl_Callback_User_Data {\n      public:\n        const char * p0_;\n        int p1_;\n        static void cb(Fl_Widget *w, void *user_data) {\n          Fl_Callback_User_Data_92 *d = (Fl_Callback_User_Data_92*)user_data;\n          hello_2_args_cb(d->p0_, d->p1_);\n        };\n        Fl_Callback_User_Data_92(const char * p0, int p1)\n        : p0_(p0),\n          p1_(p1)\n        { }\n    };\n    func_cb_btn_2->callback(Fl_Callback_User_Data_92::cb,\n                            new Fl_Callback_User_Data_92(\"FLTK\", 2),\n                            true);\n  } while(0)\n  ```\n\n  Clicking the Fl_Button `func_cb_btn_2` will call `hello_2_args_cb(\"FLTK\", 2)`.\n  Deleting the button will also delete the data that was created in our\n  boilerplate code.\n */\n#define FL_FUNCTION_CALLBACK_5(WIDGET, FUNC, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2, TYPE3, VALUE3, TYPE4, VALUE4) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; TYPE3 p3_; TYPE4 p4_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        FUNC(d->p0_, d->p1_, d->p2_, d->p3_, d->p4_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1, TYPE2 p2, TYPE3 p3, TYPE4 p4) \\\n      : p0_(p0), p1_(p1), p2_(p2), p3_(p3), p4_(p4) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1, VALUE2, VALUE3, VALUE4), true); \\\n  } while(0)\n\n#define FL_FUNCTION_CALLBACK_4(WIDGET, FUNC, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2, TYPE3, VALUE3) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; TYPE3 p3_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        FUNC(d->p0_, d->p1_, d->p2_, d->p3_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1, TYPE2 p2, TYPE3 p3) \\\n      : p0_(p0), p1_(p1), p2_(p2), p3_(p3) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1, VALUE2, VALUE3), true); \\\n  } while(0)\n\n#define FL_FUNCTION_CALLBACK_3(WIDGET, FUNC, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        FUNC(d->p0_, d->p1_, d->p2_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1, TYPE2 p2) \\\n      : p0_(p0), p1_(p1), p2_(p2) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1, VALUE2), true); \\\n  } while(0)\n\n#define FL_FUNCTION_CALLBACK_2(WIDGET, FUNC, TYPE0, VALUE0, TYPE1, VALUE1) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        FUNC(d->p0_, d->p1_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1) \\\n      : p0_(p0), p1_(p1) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1), true); \\\n  } while(0)\n\n#define FL_FUNCTION_CALLBACK_1(WIDGET, FUNC, TYPE0, VALUE0) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        FUNC(d->p0_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0) \\\n      : p0_(p0) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0), true); \\\n  } while(0)\n\n#define FL_FUNCTION_CALLBACK_0(WIDGET, FUNC) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        FUNC(); \\\n      }; \\\n      _FL_CBD_CLASS_NAME() { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(), true); \\\n  } while(0)\n\n/*\n These macros create boilerplate code for callbacks to class methods\n  with up to five arguments.\n\n  This macro invocation for example\n  ```\n  FL_METHOD_CALLBACK_4(btn,\n                       MyWindow, win, resize,\n                       int, test_x+10,\n                       int, test_y+10,\n                       int, 320,\n                       int, 400);\n  ```\n  will generate the following code:\n\n  ```\n  do {\n    class Fl_Callback_User_Data_73 : public Fl_Callback_User_Data {\n    public:\n      int p0_;\n      int p1_;\n      int p2_;\n      int p3_;\n      MyWindow *self_;\n      static void cb(Fl_Widget *w, void *user_data) {\n        Fl_Callback_User_Data_73 *d = (Fl_Callback_User_Data_73*)user_data;\n        d->self_->resize(d->p0_, d->p1_, d->p2_, d->p3_);\n      };\n      Fl_Callback_User_Data_73(MyWindow *self, int p0, int p1, int p2, int p3)\n      : self_(self), p0_(p0), p1_(p1), p2_(p2), p3_(p3) { }\n    };\n    btn->callback(Fl_Callback_User_Data_73::cb,\n                  new Fl_Callback_User_Data_73(win, test_x+10, test_y+10, 320, 400),\n                  true);\n  } while(0);\n  ```\n\n  Clicking the Fl_Button `btn` will call\n  `win->resize(test_x+10, test_y+10, 320, 400);`.\n  Deleting the button will also delete the data that was created in our\n  boilerplate code.\n */\n\n#define FL_METHOD_CALLBACK_5(WIDGET, CLASS, SELF, METHOD, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2, TYPE3, VALUE3, TYPE4, VALUE4) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      CLASS *self_; \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; TYPE3 p3_; TYPE4 p4_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        d->self_->METHOD(d->p0_, d->p1_, d->p2_, d->p3_, d->p4_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(CLASS *self, TYPE0 p0, TYPE1 p1, TYPE2 p2, TYPE3 p3, TYPE4 p4) \\\n      : self_(self), p0_(p0), p1_(p1), p2_(p2), p3_(p3), p4_(p4) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(SELF, VALUE0, VALUE1, VALUE2, VALUE3, VALUE4), true); \\\n  } while(0)\n\n#define FL_METHOD_CALLBACK_4(WIDGET, CLASS, SELF, METHOD, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2, TYPE3, VALUE3) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      CLASS *self_; \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; TYPE3 p3_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        d->self_->METHOD(d->p0_, d->p1_, d->p2_, d->p3_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(CLASS *self, TYPE0 p0, TYPE1 p1, TYPE2 p2, TYPE3 p3) \\\n      : self_(self), p0_(p0), p1_(p1), p2_(p2), p3_(p3) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(SELF, VALUE0, VALUE1, VALUE2, VALUE3), true); \\\n  } while(0)\n\n#define FL_METHOD_CALLBACK_3(WIDGET, CLASS, SELF, METHOD, TYPE0, VALUE0, TYPE1, VALUE1, TYPE2, VALUE2) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      CLASS *self_; \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        d->self_->METHOD(d->p0_, d->p1_, d->p2_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(CLASS *self, TYPE0 p0, TYPE1 p1, TYPE2 p2) \\\n      : self_(self), p0_(p0), p1_(p1), p2_(p2) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(SELF, VALUE0, VALUE1, VALUE2), true); \\\n  } while(0)\n\n#define FL_METHOD_CALLBACK_2(WIDGET, CLASS, SELF, METHOD, TYPE0, VALUE0, TYPE1, VALUE1) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      CLASS *self_; \\\n      TYPE0 p0_; TYPE1 p1_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        d->self_->METHOD(d->p0_, d->p1_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(CLASS *self, TYPE0 p0, TYPE1 p1) \\\n      : self_(self), p0_(p0), p1_(p1) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(SELF, VALUE0, VALUE1), true); \\\n  } while(0)\n\n#define FL_METHOD_CALLBACK_1(WIDGET, CLASS, SELF, METHOD, TYPE0, VALUE0) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      CLASS *self_; \\\n      TYPE0 p0_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        d->self_->METHOD(d->p0_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(CLASS *self, TYPE0 p0) \\\n      : self_(self), p0_(p0) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(SELF, VALUE0), true); \\\n  } while(0)\n\n#define FL_METHOD_CALLBACK_0(WIDGET, CLASS, SELF, METHOD) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      CLASS *self_; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        d->self_->METHOD(); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(CLASS *self) \\\n      : self_(self) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(SELF), true); \\\n  } while(0)\n\n/*\n  These macros create boilerplate code for callback functions inlined into\n  the widget creation code (similar to lambda functions in C++11 and up)\n  with up to five arguments.\n\n  This macro invocation for example\n  ```\n  FL_INLINE_CALLBACK_2(           // callback has two parameters\n    btn,                          // attach callback to this button\n    const char *, text, \"FLTK\",   // first parameter (type, name, value)\n    int, number, 2,               // second parameter\n      {                           // function body\n        fl_message(\"We received the message %s with %d!\", text, number);\n      }\n    );\n  ```\n  will generate the following code:\n  ```\n  do {\n    class Fl_Callback_User_Data_133 : public Fl_Callback_User_Data {\n    public:\n      const char * p0_;           // store first parameter here\n      int p1_;                    // store second parameter here\n      // lambda style function\n      static void fn(const char * text, int number ) {\n        fl_message(\"We received the message %s with %d!\", text, number);\n      };\n      // FLTK style callback\n      static void cb(Fl_Widget *w, void *user_data) {\n        Fl_Callback_User_Data_133 *d = (Fl_Callback_User_Data_133*)user_data;\n        fn(d->p0_, d->p1_);\n      };\n      // class constructor\n      Fl_Callback_User_Data_133(const char * p0, int p1)\n      : p0_(p0),                  // copy parameter 0\n        p1_(p1)                   // copy parameter 1\n      { }                         // constructor body\n    };\n    // connect our class to the widget callback\n    btn->callback(Fl_Callback_User_Data_133::cb,\n                  new Fl_Callback_User_Data_133(\"FLTK\", 2),\n                  true);\n  } while(0);                     // user code adds semicolon\n  ```\n\n  Clicking the Fl_Button `btn` will call\n `fl_message(\"We received the message %s with %d!\", \"FLTK\", 2);`.\n  Deleting the button will also delete the data that was created in our\n  boilerplate code.\n */\n\n#define FL_INLINE_CALLBACK_5(WIDGET, TYPE0, NAME0, VALUE0, TYPE1, NAME1, VALUE1, TYPE2, NAME2, VALUE2, TYPE3, NAME3, VALUE3, TYPE4, NAME4, VALUE4, LAMBDA) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; TYPE3 p3_; TYPE4 p4_; \\\n      static void fn(TYPE0 NAME0, TYPE1 NAME1, TYPE2 NAME2, TYPE3 NAME3, TYPE4 NAME4) \\\n        LAMBDA; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        _FL_CBD_CLASS_NAME::fn(d->p0_, d->p1_, d->p2_, d->p3_, d->p4_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1, TYPE2 p2, TYPE3 p3, TYPE4 p4) \\\n      : p0_(p0), p1_(p1), p2_(p2), p3_(p3), p4_(p4) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1, VALUE2, VALUE3, VALUE4), true); \\\n  } while(0)\n\n#define FL_INLINE_CALLBACK_4(WIDGET, TYPE0, NAME0, VALUE0, TYPE1, NAME1, VALUE1, TYPE2, NAME2, VALUE2, TYPE3, NAME3, VALUE3, LAMBDA) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; TYPE3 p3_; \\\n      static void fn(TYPE0 NAME0, TYPE1 NAME1, TYPE2 NAME2, TYPE3 NAME3) \\\n        LAMBDA; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        _FL_CBD_CLASS_NAME::fn(d->p0_, d->p1_, d->p2_, d->p3_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1, TYPE2 p2, TYPE3 p3) \\\n      : p0_(p0), p1_(p1), p2_(p2), p3_(p3) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1, VALUE2, VALUE3), true); \\\n  } while(0)\n\n#define FL_INLINE_CALLBACK_3(WIDGET, TYPE0, NAME0, VALUE0, TYPE1, NAME1, VALUE1, TYPE2, NAME2, VALUE2, LAMBDA) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; TYPE2 p2_; \\\n      static void fn(TYPE0 NAME0, TYPE1 NAME1, TYPE2 NAME2) \\\n        LAMBDA; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        _FL_CBD_CLASS_NAME::fn(d->p0_, d->p1_, d->p2_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1, TYPE2 p2) \\\n      : p0_(p0), p1_(p1), p2_(p2) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1, VALUE2), true); \\\n  } while(0)\n\n#define FL_INLINE_CALLBACK_2(WIDGET, TYPE0, NAME0, VALUE0, TYPE1, NAME1, VALUE1, LAMBDA) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; TYPE1 p1_; \\\n      static void fn(TYPE0 NAME0, TYPE1 NAME1) \\\n        LAMBDA; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        _FL_CBD_CLASS_NAME::fn(d->p0_, d->p1_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0, TYPE1 p1) \\\n      : p0_(p0), p1_(p1) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0, VALUE1), true); \\\n  } while(0)\n\n#define FL_INLINE_CALLBACK_1(WIDGET, TYPE0, NAME0, VALUE0, LAMBDA) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n      TYPE0 p0_; \\\n      static void fn(TYPE0 NAME0) \\\n        LAMBDA; \\\n      static void cb(Fl_Widget *w, void *user_data) { \\\n        _FL_CBD_CLASS_NAME *d = (_FL_CBD_CLASS_NAME*)user_data; \\\n        _FL_CBD_CLASS_NAME::fn(d->p0_); \\\n      }; \\\n      _FL_CBD_CLASS_NAME(TYPE0 p0) \\\n      : p0_(p0) { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(VALUE0), true); \\\n  } while(0)\n\n#define FL_INLINE_CALLBACK_0(WIDGET, LAMBDA) \\\n  do { \\\n    class _FL_CBD_CLASS_NAME : public Fl_Callback_User_Data { \\\n    public: \\\n    static void fn() \\\n      LAMBDA; \\\n    static void cb(Fl_Widget *w, void *user_data) { \\\n      _FL_CBD_CLASS_NAME::fn(); \\\n    }; \\\n    _FL_CBD_CLASS_NAME() { }; \\\n    }; \\\n    WIDGET->callback(_FL_CBD_CLASS_NAME::cb, new _FL_CBD_CLASS_NAME(), true); \\\n  } while(0)\n\n#endif // FL_DOXYGEN\n\n#endif /* !_FL_FL_CALLBACK_MACROS_H_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_casts.H",
    "content": "//\n// Experimental inline \"cast functions\" for the Fast Light Toolkit (FLTK).\n// See also issue #109: \"VS2017 warnings when building fltk 1.4.x\"\n//\n// Copyright 1998-2021 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef _FL_fl_casts_H_\n#define _FL_fl_casts_H_\n\n#include <FL/platform_types.h>\n\ninline char fl_char(void *v)             { return (char)(fl_intptr_t)v; }\ninline int  fl_int(void *v)              { return (int)(fl_intptr_t)v; }\ninline long fl_long(void *v)             { return (long)(fl_intptr_t)v; }\n\ninline unsigned char fl_uchar(void *v)   { return (unsigned char)(fl_uintptr_t)v; }\ninline unsigned int  fl_uint(void *v)    { return (unsigned int)(fl_uintptr_t)v; }\ninline unsigned long fl_ulong(void *v)   { return (unsigned long)(fl_uintptr_t)v; }\n\n// the following conversions can be used to silence MSVC warning C4312:\n// 'type cast': conversion from '<type>' to 'void *' of greater size\n\ninline void *fl_voidptr(int v)           { return (void *)(fl_intptr_t)v; }\ninline void *fl_voidptr(unsigned int v)  { return (void *)(fl_uintptr_t)v; }\ninline void *fl_voidptr(long v)          { return (void *)(fl_intptr_t)v; }\ninline void *fl_voidptr(unsigned long v) { return (void *)(fl_uintptr_t)v; }\n\n#endif /* _FL_fl_casts_H_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_config.h",
    "content": "/* FL/fl_config.h.  Generated from fl_config.cmake.in by CMake.  */\n/*\n * Build configuration file for the Fast Light Tool Kit (FLTK).\n *\n * Copyright 1998-2024 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n#ifndef _FL_fl_config_h_\n#define _FL_fl_config_h_\n\n/*\n * FL_ABI_VERSION (ABI version)\n *\n * define FL_ABI_VERSION: 1xxyy for 1.x.y (xx,yy with leading zero)\n*/\n\n/* #undef FL_ABI_VERSION */\n\n\n/*\n * FLTK_HAVE_CAIRO\n *\n * Do we have the Cairo library available?\n*/\n\n/* #undef FLTK_HAVE_CAIRO */\n\n\n/*\n * FLTK_HAVE_CAIROEXT\n *\n * Do we have the Cairo library available and want extended Cairo use in FLTK ?\n * This implies to link cairo.lib in all FLTK based apps.\n*/\n\n/* #undef FLTK_HAVE_CAIROEXT */\n\n\n/*\n * FLTK_HAVE_FORMS\n *\n * Do we have the Forms compatibility library available?\n*/\n\n#define FLTK_HAVE_FORMS 1\n\n\n/*\n * FLTK_USE_X11\n *\n * Do we use X11 for the current platform?\n *\n */\n\n/* #undef FLTK_USE_X11 */\n\n\n/*\n * FLTK_USE_CAIRO\n *\n * Do we use Cairo to draw to the display?\n *\n */\n \n/* #undef FLTK_USE_CAIRO */\n\n\n/*\n * FLTK_USE_WAYLAND\n *\n * Do we use Wayland for the current platform?\n *\n */\n\n/* #undef FLTK_USE_WAYLAND */\n\n\n/*\n * FLTK_USE_STD\n *\n * May we use std::string and std::vector for the current build?\n *\n * This is a build configuration option which allows FLTK to add some\n * features based on std::string and std::vector in FLTK 1.4.x\n *\n */\n\n#define FLTK_USE_STD 1\n\n\n/*\n * FLTK_USE_SVG\n *\n * Do we want FLTK to read and write SVG-formatted files ?\n *\n */\n\n#define FLTK_USE_SVG 1\n\n\n#endif /* _FL_fl_config_h_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_draw.H",
    "content": "//\n// Portable drawing function header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/**\n  \\file fl_draw.H\n  \\brief utility header to pull drawing functions together\n*/\n\n#ifndef fl_draw_H\n#define fl_draw_H\n\n#include <FL/Enumerations.H>       // color names\n#include <FL/Fl_Graphics_Driver.H> // fl_graphics_driver + Fl_Region\n#include <FL/Fl_Rect.H>\n\n// Image class...\nclass Fl_Image;\nclass Fl_Window;\n\n// Label flags...\nFL_EXPORT extern char fl_draw_shortcut;\n\n/** \\addtogroup fl_attributes\n    @{\n*/\n\n// Colors:\n/**\n  Set the color for all subsequent drawing operations.\n  For color-mapped displays, a color cell will be allocated out of\n  \\p fl_colormap the first time you use a color. If the colormap fills up\n  then a least-squares algorithm is used to find the closest color.\n  If no valid graphical context (fl_gc) is available,\n  the foreground is not set for the current window.\n  \\param[in] c color\n*/\ninline void fl_color(Fl_Color c) {\n  fl_graphics_driver->color(c);\n} // select indexed color\n/** for back compatibility - use fl_color(Fl_Color c) instead */\ninline void fl_color(int c) {\n  fl_color((Fl_Color)c);\n}\n/**\n  Set the color for all subsequent drawing operations.\n  The closest possible match to the RGB color is used.\n  The RGB color is used directly on TrueColor displays.\n  For colormap visuals the nearest index in the gray\n  ramp or color cube is used.\n  If no valid graphical context (fl_gc) is available,\n  the foreground is not set for the current window.\n  \\param[in] r,g,b color components\n*/\ninline void fl_color(uchar r, uchar g, uchar b) {\n  fl_graphics_driver->color(r, g, b);\n}\n/**\n  Return the last fl_color() that was set.\n  This can be used for state save/restore.\n*/\ninline Fl_Color fl_color() {\n  return fl_graphics_driver->color();\n}\n/** @} */\n\n/** \\addtogroup fl_drawings\n    @{\n*/\n// clip:\n/**\n  Intersect the current clip region with a rectangle and push this\n  new region onto the stack.\n  \\param[in] x,y,w,h position and size\n*/\ninline void fl_push_clip(int x, int y, int w, int h) {\n  fl_graphics_driver->push_clip(x, y, w, h);\n}\n/**\n  Intersect the current clip region with a rectangle and push this\n  new region onto the stack (deprecated).\n  \\param[in] x,y,w,h position and size\n  \\deprecated\n    Please use fl_push_clip(int x, int y, int w, int h) instead.\n    fl_clip(int, int, int, int) will be removed in FLTK 1.5.\n*/\ninline void fl_clip(int x, int y, int w, int h) {\n  fl_graphics_driver->push_clip(x, y, w, h);\n}\n/**\n  Push an empty clip region onto the stack so nothing will be clipped.\n*/\ninline void fl_push_no_clip() {\n  fl_graphics_driver->push_no_clip();\n}\n/**\n  Restore the previous clip region.\n\n  You must call fl_pop_clip() once for every time you call fl_push_clip().\n  Unpredictable results may occur if the clip stack is not empty when\n  you return to FLTK.\n*/\ninline void fl_pop_clip() {\n  fl_graphics_driver->pop_clip();\n}\n\n/**\n  Does the rectangle intersect the current clip region?\n\n  \\param[in] x,y,w,h position and size of rectangle\n\n  \\returns non-zero if any of the rectangle intersects the current clip\n    region. If this returns 0 you don't have to draw the object.\n\n  \\note Under X this returns 2 if the rectangle is partially clipped\n    and 1 if it is entirely inside the clip region.\n\n  \\see fl_clip_box()\n*/\ninline int fl_not_clipped(int x, int y, int w, int h) {\n  return fl_graphics_driver->not_clipped(x, y, w, h);\n}\n\n/**\n  Intersect a rectangle with the current clip region and return the\n  bounding box of the result.\n\n  Returns non-zero if the resulting rectangle is different to the original.\n  The given rectangle <tt>(x, y, w, h)</tt> \\e should be entirely inside its\n  window, otherwise the result may be unexpected, i.e. this function \\e may\n  not clip the rectangle to the window coordinates and size. In particular\n  \\p x and \\p y \\e should not be negative.\n\n  The resulting bounding box can be used to limit the necessary drawing to\n  this rectangle.\n\n  Example:\n  \\code\n    void MyGroup::draw() {\n      int X = 0, Y = 0, W = 0, H = 0;\n      int ret = fl_clip_box(x(), y(), w(), h(), X, Y, W, H);\n      if (ret == 0) { // entire group is visible (not clipped)\n        // full drawing code here\n      } else { // parts of this group are clipped\n        // partial drawing code here (uses X, Y, W, and H to test)\n      }\n    }\n  \\endcode\n\n  \\p W and \\p H are set to zero if the rectangle is completely outside the\n    clipping region. In this case \\p X and \\p Y are undefined and should\n    not be used. Possible values are <tt>(0, 0)</tt>, <tt>(x, y)</tt>,\n    or anything else (platform dependent).\n\n  \\note This function is platform-dependent. If the given rectangle is not\n    entirely inside the window, the results are not guaranteed to be the\n    same on all platforms.\n\n  \\param[in]  x,y,w,h position and size of rectangle\n  \\param[out] X,Y,W,H position and size of resulting bounding box.\n\n  \\returns Non-zero if the resulting rectangle is different to the original.\n\n  \\see fl_not_clipped()\n*/\ninline int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H) {\n  return fl_graphics_driver->clip_box(x, y, w, h, X, Y, W, H);\n}\n\n/** Undo any clobbering of the clip region done by your program. */\ninline void fl_restore_clip() {\n  fl_graphics_driver->restore_clip();\n}\n\n/**\n  Replace the top of the clipping stack with a clipping region of any shape.\n\n  Fl_Region is an operating system specific type.\n  \\note This function is mostly intended for internal use by the FLTK library\n  when drawing to the display.\n  Its effect can be null if the current drawing surface is not the display.\n  \\param[in] r clipping region\n*/\ninline void fl_clip_region(Fl_Region r) {\n  fl_graphics_driver->clip_region(r);\n}\n\n/**\n  Return the current clipping region.\n  \\note This function is mostly intended for internal use by the FLTK library\n  when drawing to the display.\n  Its return value can be always NULL if the current drawing surface is not the display.\n*/\ninline Fl_Region fl_clip_region() {\n  return fl_graphics_driver->clip_region();\n}\n\n\n// points:\n/**\n  Draw a single pixel at the given coordinates\n*/\ninline void fl_point(int x, int y) {\n  fl_graphics_driver->point(x, y);\n}\n\n// line type:\n/**\n  Set how to draw lines (the \"pen\").\n\n  If you change this it is your responsibility to set it back to the default\n  using \\c fl_line_style(0).\n\n  \\image html  fl_line_style.png \"fl_line_style() styles\"\n  \\image latex fl_line_style.png \"fl_line_style() styles\" width=12cm\n\n  \\param[in] style A bitmask which is a bitwise-OR of \\ref LineStyles \"Line Styles\",\n    a cap style, and a join style. If you don't specify a dash type you\n    will get a solid line. If you don't specify a cap or join type\n    you will get a system-defined default of whatever value is fastest.\n  \\param[in] width The thickness of the lines in pixels. Zero results in the\n    system defined default, which on both X and Windows is somewhat\n    different and nicer than 1.\n  \\param[in] dashes A pointer to an array of dash lengths, measured in pixels.\n    The first location is how long to draw a solid portion, the next\n    is how long to draw the gap, then the solid, etc. It is terminated\n    with a zero-length entry. A \\c NULL pointer or a zero-length\n    array results in a solid line. Odd array sizes are not supported\n    and result in undefined behavior.\n\n  \\note Because of how line styles are implemented on Win32 systems,\n    you \\e must set the line style \\e after setting the drawing\n    color. If you set the color after the line style you will lose\n    the line style settings.\n\n  \\note The \\p dashes array does not work under the (unsupported!) operating\n    systems Windows 95, 98 or Me, since those operating systems do not\n    support complex line styles.\n*/\ninline void fl_line_style(int style, int width = 0, char *dashes = 0) {\n  fl_graphics_driver->line_style(style, width, dashes);\n}\n\n/// \\anchor LineStyles\n///\n///  \\image html  fl_line_style.png \"fl_line_style() styles\"\n///  \\image latex fl_line_style.png \"fl_line_style() styles\" width=12cm\n///\nenum {\n  FL_SOLID      = 0,      ///< line style: solid line\n  FL_DASH       = 1,      ///< line style: 75% dashed line\n  FL_DOT        = 2,      ///< line style: 50% pixel dotted\n  FL_DASHDOT    = 3,      ///< line style: dash / dot pattern\n  FL_DASHDOTDOT = 4,      ///< line style: dash / two dot pattern\n\n  FL_CAP_FLAT   = 0x100,  ///< cap style: end is flat\n  FL_CAP_ROUND  = 0x200,  ///< cap style: end is round\n  FL_CAP_SQUARE = 0x300,  ///< cap style: end wraps end point\n\n  FL_JOIN_MITER = 0x1000, ///< join style: line join extends to a point\n  FL_JOIN_ROUND = 0x2000, ///< join style: line join is rounded\n  FL_JOIN_BEVEL = 0x3000  ///< join style: line join is tidied\n};\n\n/**\n  Turn antialiased line drawings ON or OFF, if supported by platform.\n  Currently, only the Windows platform allows to change whether line drawings\n  are antialiased. Turning it OFF may accelerate heavy drawing operations.\n*/\ninline void fl_antialias(int state) {\n  fl_graphics_driver->antialias(state);\n}\n\n/** Return whether line drawings are currently antialiased. */\ninline int fl_antialias() {\n  return fl_graphics_driver->antialias();\n}\n\n// rectangles tweaked to exactly fill the pixel rectangle:\n\n/**\n  Draw a border \\e inside the given bounding box.\n  This function is meant for quick drawing of simple boxes. The behavior is\n  undefined for line widths that are not 1.\n*/\ninline void fl_rect(int x, int y, int w, int h) {\n  fl_graphics_driver->rect(x, y, w, h);\n}\n\n/**\n Draw a rounded border \\e inside the given bounding box.\n The radius code is optimized for speed and works best for values between\n 5 and 15 units.\n */\ninline void fl_rounded_rect(int x, int y, int w, int h, int r) {\n  fl_graphics_driver->rounded_rect(x, y, w, h, r);\n}\n\n/**\n  Draw a border \\e inside the given bounding box.\n  This is the same as fl_rect(int x, int y, int w, int h) but with\n  Fl_Rect \\p r as input argument.\n*/\ninline void fl_rect(Fl_Rect r) {\n  fl_rect(r.x(), r.y(), r.w(), r.h());\n}\n\n/** Draw a dotted rectangle, used to indicate keyboard focus on a widget.\n\n  This method draws the rectangle in the current color and independent of\n  the Fl::visible_focus() option. You may need to set the current color\n  with fl_color() before you call this.\n*/\ninline void fl_focus_rect(int x, int y, int w, int h) {\n  fl_graphics_driver->focus_rect(x, y, w, h);\n}\n\n/** Draw with passed color a border \\e inside the given bounding box.\n \\warning The current color is changed to \\p c upon return.\n*/\ninline void fl_rect(int x, int y, int w, int h, Fl_Color c) {\n  fl_color(c);\n  fl_rect(x, y, w, h);\n}\n\n/** Color with current color a rectangle that exactly fills the given bounding box. */\ninline void fl_rectf(int x, int y, int w, int h) {\n  fl_graphics_driver->rectf(x, y, w, h);\n}\n\n/** Color with current color a rounded rectangle that exactly fills the given bounding box.\n The radius code is optimized for speed and works best for values between\n 5 and 15 units.\n*/\ninline void fl_rounded_rectf(int x, int y, int w, int h, int r) {\n  fl_graphics_driver->rounded_rectf(x, y, w, h, r);\n}\n\n/** Color with passed color a rectangle that exactly fills the given bounding box.\n \\warning The current color is changed to \\p c upon return.\n*/\ninline void fl_rectf(int x, int y, int w, int h, Fl_Color c) {\n  fl_color(c);\n  fl_rectf(x, y, w, h);\n}\n\n/** Color with current color a rectangle that exactly fills the given bounding box. */\ninline void fl_rectf(Fl_Rect r) {\n  fl_graphics_driver->rectf(r.x(), r.y(), r.w(), r.h());\n}\n\n/** Color with passed color a rectangle that exactly fills the given bounding box.\n \\warning The current color is changed to \\p c upon return.\n*/\ninline void fl_rectf(Fl_Rect r, Fl_Color c) {\n  fl_color(c);\n  fl_rectf(r);\n}\n\n/**\n  Color a rectangle with \"exactly\" the passed <tt>r,g,b</tt> color.\n  On screens with less than 24 bits of color this is done by drawing a\n  solid-colored block using fl_draw_image() so that the correct color\n  shade is produced. On other screens, the current color is changed\n  to \\p fl_color(r,g,b) upon return.\n*/\ninline void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {\n  fl_graphics_driver->colored_rectf(x, y, w, h, r, g, b);\n}\n\n/**\n  Color a rectangle with \"exactly\" the passed <tt>r,g,b</tt> color.\n  This is the same as fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b)\n  but with Fl_Rect \\p bb (bounding box) as argument instead of (x, y, w, h).\n  \\see fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b)\n*/\ninline void fl_rectf(Fl_Rect bb, uchar r, uchar g, uchar b) {\n  fl_graphics_driver->colored_rectf(bb.x(), bb.y(), bb.w(), bb.h(), r, g, b);\n}\n\n// line segments:\n/**\n  Draw a line from (x,y) to (x1,y1)\n*/\ninline void fl_line(int x, int y, int x1, int y1) {\n  fl_graphics_driver->line(x, y, x1, y1);\n}\n/**\n  Draw a line from (x,y) to (x1,y1) and another from (x1,y1) to (x2,y2)\n*/\ninline void fl_line(int x, int y, int x1, int y1, int x2, int y2) {\n  fl_graphics_driver->line(x, y, x1, y1, x2, y2);\n}\n\n// closed line segments:\n/**\n  Outline a 3-sided polygon with lines\n*/\ninline void fl_loop(int x, int y, int x1, int y1, int x2, int y2) {\n  fl_graphics_driver->loop(x, y, x1, y1, x2, y2);\n}\n/**\n  Outline a 4-sided polygon with lines\n*/\ninline void fl_loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {\n  fl_graphics_driver->loop(x, y, x1, y1, x2, y2, x3, y3);\n}\n\n// filled polygons\n/**\n  Fill a 3-sided polygon.\n*/\ninline void fl_polygon(int x, int y, int x1, int y1, int x2, int y2) {\n  fl_graphics_driver->polygon(x, y, x1, y1, x2, y2);\n}\n/**\n  Fill a 4-sided polygon. The polygon must be convex.\n*/\ninline void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {\n  fl_graphics_driver->polygon(x, y, x1, y1, x2, y2, x3, y3);\n}\n\n// draw rectilinear lines, horizontal segment first:\n/**\n  Draw a horizontal line from (x,y) to (x1,y).\n*/\ninline void fl_xyline(int x, int y, int x1) {\n  fl_graphics_driver->xyline(x, y, x1);\n}\n/**\n  Draw a horizontal line from (x,y) to (x1,y), then vertical from (x1,y) to (x1,y2).\n*/\ninline void fl_xyline(int x, int y, int x1, int y2) {\n  fl_graphics_driver->xyline(x, y, x1, y2);\n}\n/**\n  Draw a horizontal line from (x,y) to (x1,y), then a vertical from (x1,y) to (x1,y2)\n  and then another horizontal from (x1,y2) to (x3,y2).\n*/\ninline void fl_xyline(int x, int y, int x1, int y2, int x3) {\n  fl_graphics_driver->xyline(x, y, x1, y2, x3);\n}\n\n// draw rectilinear lines, vertical segment first:\n/**\n  Draw a vertical line from (x,y) to (x,y1)\n*/\ninline void fl_yxline(int x, int y, int y1) {\n  fl_graphics_driver->yxline(x, y, y1);\n}\n/**\n  Draw a vertical line from (x,y) to (x,y1), then a horizontal from (x,y1) to (x2,y1).\n*/\ninline void fl_yxline(int x, int y, int y1, int x2) {\n  fl_graphics_driver->yxline(x, y, y1, x2);\n}\n/**\n  Draw a vertical line from (x,y) to (x,y1), then a horizontal from (x,y1)\n  to (x2,y1), then another vertical from (x2,y1) to (x2,y3).\n*/\ninline void fl_yxline(int x, int y, int y1, int x2, int y3) {\n  fl_graphics_driver->yxline(x, y, y1, x2, y3);\n}\n\n// circular lines and pie slices (code in fl_arci.C):\n/**\n  Draw ellipse sections using integer coordinates.\n\n  These functions match the rather limited circle drawing code provided by X\n  and Windows. The advantage over using fl_arc with floating point coordinates\n  is that they are faster because they often use the hardware, and they draw\n  much nicer small circles, since the small sizes are often hard-coded bitmaps.\n\n  If a complete circle is drawn it will fit inside the passed bounding box.\n  The two angles are measured in degrees counter-clockwise from 3 o'clock and\n  are the starting and ending angle of the arc, \\p a2 must be greater or equal\n  to \\p a1.\n\n  fl_arc() draws a series of lines to approximate the arc. Notice that the\n  integer version of fl_arc() has a different number of arguments than the\n  double version fl_arc(double x, double y, double r, double start, double end)\n\n  \\param[in] x,y,w,h bounding box of complete circle\n  \\param[in] a1,a2 start and end angles of arc measured in degrees\n  counter-clockwise from 3 o'clock. \\p a2 must be greater\n  than or equal to \\p a1.\n\n  \\image html  fl_pie_arc_diagram.png \"fl_pie() and fl_arc()\"\n  \\image latex fl_pie_arc_diagram.png \"fl_pie() and fl_arc()\" width=4cm\n*/\ninline void fl_arc(int x, int y, int w, int h, double a1, double a2) {\n  fl_graphics_driver->arc(x, y, w, h, a1, a2);\n}\n/**\n  Draw filled ellipse sections using integer coordinates.\n\n  Like fl_arc(), but fl_pie() draws a filled-in pie slice.\n  This slice may extend outside the line drawn by fl_arc();\n  to avoid this use w - 1 and h - 1.\n\n  \\param[in] x,y,w,h bounding box of complete circle\n  \\param[in] a1,a2 start and end angles of arc measured in degrees\n    counter-clockwise from 3 o'clock. \\p a2 must be greater\n    than or equal to \\p a1.\n\n  \\image html  fl_pie_arc_diagram.png \"fl_pie() and fl_arc()\"\n  \\image latex fl_pie_arc_diagram.png \"fl_pie() and fl_arc()\" width=4cm\n*/\ninline void fl_pie(int x, int y, int w, int h, double a1, double a2) {\n  fl_graphics_driver->pie(x, y, w, h, a1, a2);\n}\n/** fl_chord declaration is a place holder - the function does not yet exist */\nFL_EXPORT void fl_chord(int x, int y, int w, int h, double a1, double a2); // nyi\n\n// scalable drawing code (code in fl_vertex.cxx and fl_arc.cxx):\n/**\n  Save the current transformation matrix on the stack.\n  The maximum depth of the stack is 32.\n*/\ninline void fl_push_matrix() {\n  fl_graphics_driver->push_matrix();\n}\n/**\n  Restore the current transformation matrix from the stack.\n*/\ninline void fl_pop_matrix() {\n  fl_graphics_driver->pop_matrix();\n}\n/**\n  Concatenate scaling transformation onto the current one.\n  \\param[in] x,y scale factors in x-direction and y-direction\n*/\ninline void fl_scale(double x, double y) {\n  fl_graphics_driver->mult_matrix(x, 0, 0, y, 0, 0);\n}\n/**\n  Concatenate scaling transformation onto the current one.\n  \\param[in] x scale factor in both x-direction and y-direction\n*/\ninline void fl_scale(double x) {\n  fl_graphics_driver->mult_matrix(x, 0, 0, x, 0, 0);\n}\n/**\n  Concatenate translation transformation onto the current one.\n  \\param[in] x,y translation factor in x-direction and y-direction\n*/\ninline void fl_translate(double x, double y) {\n  fl_graphics_driver->translate(x, y);\n}\n/**\n  Concatenate rotation transformation onto the current one.\n  \\param[in] d - rotation angle, counter-clockwise in degrees (not radians)\n*/\ninline void fl_rotate(double d) {\n  fl_graphics_driver->rotate(d);\n}\n/**\n  Set the transformation matrix to identity.\n */\ninline void fl_load_identity() {\n  fl_graphics_driver->load_identity();\n}\n/**\n Set the current transformation matrix.\n \\param[in] a,b,c,d,x,y transformation matrix elements\n */\ninline void fl_load_matrix(double a, double b, double c, double d, double x, double y) {\n  fl_graphics_driver->load_matrix(a, b, c, d, x, y);\n}\n/**\n  Concatenate another transformation onto the current one.\n\n  \\param[in] a,b,c,d,x,y transformation matrix elements such that\n <tt> X' = aX + cY + x </tt> and <tt> Y' = bX +dY + y </tt>\n*/\ninline void fl_mult_matrix(double a, double b, double c, double d, double x, double y) {\n  fl_graphics_driver->mult_matrix(a, b, c, d, x, y);\n}\n/**\n  Start drawing a list of points. Points are added to the list with fl_vertex().\n*/\ninline void fl_begin_points() {\n  fl_graphics_driver->begin_points();\n}\n/**\n  Start drawing a list of lines.\n*/\ninline void fl_begin_line() {\n  fl_graphics_driver->begin_line();\n}\n/**\n  Start drawing a closed sequence of lines.\n*/\ninline void fl_begin_loop() {\n  fl_graphics_driver->begin_loop();\n}\n/**\n  Start drawing a convex filled polygon.\n*/\ninline void fl_begin_polygon() {\n  fl_graphics_driver->begin_polygon();\n}\n/**\n  Add a single vertex to the current path.\n  \\param[in] x,y coordinate\n*/\ninline void fl_vertex(double x, double y) {\n  fl_graphics_driver->vertex(x, y);\n}\n/**\n  Add a series of points on a Bézier curve to the path.\n  The curve ends (and two of the points) are at X0,Y0 and X3,Y3.\n  \\param[in] X0,Y0 curve start point\n  \\param[in] X1,Y1 curve control point\n  \\param[in] X2,Y2 curve control point\n  \\param[in] X3,Y3 curve end point\n*/\ninline void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3) {\n  fl_graphics_driver->curve(X0, Y0, X1, Y1, X2, Y2, X3, Y3);\n}\n/**\n  Add a series of points to the current path on the arc of a circle.\n\n  The arc is drawn counter-clockwise from 3 o'clock. If \\p end is less than\n  \\p start then it draws the arc in a clockwise direction. To draw an arc across\n  the 3 o'clock line, \\p start and \\p end can be greater than 360 or less than 0.\n  For example, to draw a counter-clockwise arc from 6 to 12 o'clock, \\p start\n  would be -90 deg, and \\p end would be at +90 deg.\n\n  You can get elliptical paths by using scale and rotate before calling fl_arc().\n\n  \\param[in] x, y, r center and radius of circular arc\n  \\param[in] start, end angles of start and end of arc measured in degrees\n\n  \\image html  fl_arc_xyr_diagram.png \"fl_arc(x,y,r,a1,a2)\"\n  \\image latex fl_arc_xyr_diagram.png \"fl_arc(x,y,r,a1,a2)\" width=6cm\n\n  Examples:\n  \\code\n    // Draw an arc of points\n    fl_begin_points();\n    fl_arc(100.0, 100.0, 50.0, 0.0, 180.0);\n    fl_end_points();\n\n    // Draw arc with a line\n    fl_begin_line();\n    fl_arc(200.0, 100.0, 50.0, 0.0, 180.0);\n    fl_end_line();\n\n    // Draw filled arc\n    fl_begin_polygon();\n    fl_arc(300.0, 100.0, 50.0, 0.0, 180.0);\n    fl_end_polygon();\n  \\endcode\n*/\ninline void fl_arc(double x, double y, double r, double start, double end) {\n  fl_graphics_driver->arc(x, y, r, start, end);\n}\n/**\n  fl_circle(x,y,r) is equivalent to fl_arc(x,y,r,0,360), but may be faster.\n \\param[in] x,y,r center and radius of circle\n\n \\note fl_circle() is best used as part of the \\ref drawing_complex  API, that is,\n flanked by fl_begin_XXX() and fl_end_XXX() calls where XXX can be 'loop' or 'polygon'\n to draw, respectively a circle or a disk. Transformation functions (e.g., fl_scale(double, double))\n can be also used for fl_circle() to draw empty of filled ellipses.\n It must be the \\e only thing in the path: if you want a circle as part of\n a complex polygon you must use fl_arc().\n <br>Nevertheless, fl_circle() can also be used by itself to draw circles.\n*/\ninline void fl_circle(double x, double y, double r) {\n  fl_graphics_driver->circle(x, y, r);\n}\n/**\n  End list of points, and draw.\n*/\ninline void fl_end_points() {\n  fl_graphics_driver->end_points();\n}\n/**\n  End list of lines, and draw.\n*/\ninline void fl_end_line() {\n  fl_graphics_driver->end_line();\n}\n/**\n  End closed sequence of lines, and draw.\n*/\ninline void fl_end_loop() {\n  fl_graphics_driver->end_loop();\n}\n/**\n  End convex filled polygon, and draw.\n*/\ninline void fl_end_polygon() {\n  fl_graphics_driver->end_polygon();\n}\n/**\n  Start drawing a complex filled polygon.\n\n  The polygon may be concave, may have holes in it, or may be several\n  disconnected pieces. Call fl_gap() to separate loops of the path.\n\n  To outline the polygon, use fl_begin_loop() and replace each fl_gap()\n  with fl_end_loop();fl_begin_loop() pairs.\n\n  \\note For portability, you should only draw polygons that appear the same\n    whether \"even/odd\" or \"non-zero\" winding rules are used to fill them.\n    Holes should be drawn in the opposite direction to the outside loop.\n*/\ninline void fl_begin_complex_polygon() {\n  fl_graphics_driver->begin_complex_polygon();\n}\n/**\n  Separate loops of the path.\n\n  It is unnecessary but harmless to call fl_gap() before the first vertex,\n  after the last vertex, or several times in a row.\n*/\ninline void fl_gap() {\n  fl_graphics_driver->gap();\n}\n/**\n  End complex filled polygon, and draw.\n*/\ninline void fl_end_complex_polygon() {\n  fl_graphics_driver->end_complex_polygon();\n}\n// get and use transformed positions:\n/**\n  Transform coordinate using the current transformation matrix.\n  \\param[in] x,y coordinate\n*/\ninline double fl_transform_x(double x, double y) {\n  return fl_graphics_driver->transform_x(x, y);\n}\n/**\n  Transform coordinate using the current transformation matrix.\n  \\param[in] x,y coordinate\n*/\ninline double fl_transform_y(double x, double y) {\n  return fl_graphics_driver->transform_y(x, y);\n}\n/**\n  Transform distance using current transformation matrix.\n  \\param[in] x,y coordinate\n*/\ninline double fl_transform_dx(double x, double y) {\n  return fl_graphics_driver->transform_dx(x, y);\n}\n/**\n  Transform distance using current transformation matrix.\n  \\param[in] x,y coordinate\n*/\ninline double fl_transform_dy(double x, double y) {\n  return fl_graphics_driver->transform_dy(x, y);\n}\n/**\n  Add coordinate pair to the vertex list without further transformations.\n  \\param[in] xf,yf transformed coordinate\n*/\ninline void fl_transformed_vertex(double xf, double yf) {\n  fl_graphics_driver->transformed_vertex(xf, yf);\n}\n\n/** Copy a rectangular area of the given offscreen buffer into the current drawing destination.\n  \\param x,y        position where to draw the copied rectangle\n  \\param w,h        size of the copied rectangle\n  \\param pixmap     offscreen buffer containing the rectangle to copy\n  \\param srcx,srcy  origin in offscreen buffer of rectangle to copy\n*/\ninline void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) {\n  fl_graphics_driver->copy_offscreen(x, y, w, h, pixmap, srcx, srcy);\n}\n\nFL_EXPORT Fl_Offscreen fl_create_offscreen(int w, int h);\nFL_EXPORT void fl_begin_offscreen(Fl_Offscreen b);\nFL_EXPORT void fl_end_offscreen(void);\nFL_EXPORT void fl_delete_offscreen(Fl_Offscreen bitmap);\nFL_EXPORT void fl_rescale_offscreen(Fl_Offscreen &ctx);\n\n/** @} */\n\n/** \\addtogroup  fl_attributes\n    @{ */\n/* NOTE: doxygen comments here to avoid triplication in os-specific sources */\n\n// Fonts:\n/*\n  Set the current font, which is then used in various drawing routines.\n  Implemented and documented in src/fl_draw.cxx\n*/\nFL_EXPORT void fl_font(Fl_Font face, Fl_Fontsize fsize);\n\n/**\n  Return the \\p face set by the most recent call to fl_font().\n  This can be used to save/restore the font.\n*/\ninline Fl_Font fl_font() {\n  return fl_graphics_driver->font();\n}\n/**\n  Return the \\p size set by the most recent call to fl_font().\n  This can be used to save/restore the font.\n*/\ninline Fl_Fontsize fl_size() {\n  return fl_graphics_driver->size();\n}\n\n// Information you can get about the current font:\n/**\n  Return the recommended minimum line spacing for the current font.\n  You can also use the value of \\p size passed to fl_font().\n*/\ninline int fl_height() {\n  return fl_graphics_driver->height();\n}\nFL_EXPORT int fl_height(int font, int size);\n/**\n  Return the recommended distance above the bottom of a fl_height() tall\n  box to draw the text at so it looks centered vertically in that box.\n*/\ninline int fl_descent() {\n  return fl_graphics_driver->descent();\n}\n/** Return the typographical width of a nul-terminated string\n    using the current font face and size.\n*/\nFL_EXPORT double fl_width(const char *txt);\n\n/** Return the typographical width of a sequence of \\p n characters\n    using the current font face and size.\n*/\ninline double fl_width(const char *txt, int n) {\n  return fl_graphics_driver->width(txt, n);\n}\n/** Return the typographical width of a single character\n    using the current font face and size.\n\n  \\note If a valid fl_gc is NOT found then it uses the first window gc,\n  or the screen gc if no fltk window is available when called.\n*/\ninline double fl_width(unsigned int c) {\n  return fl_graphics_driver->width(c);\n}\n/** Determine the minimum pixel dimensions of a nul-terminated string\n    using the current fl_font().\n\n  Usage: given a string \"txt\" drawn using fl_draw(txt, x, y) you would determine\n  its pixel extents on the display using fl_text_extents(txt, dx, dy, wo, ho)\n  such that a bounding box that exactly fits around the text could be drawn with\n  fl_rect(x+dx, y+dy, wo, ho). Note the dx, dy values hold the offset of the first\n  \"colored in\" pixel of the string, from the draw origin.\n\n  Note the desired font and font size must be set with fl_font() before calling\n  this function.\n\n  This differs slightly from fl_measure() in that the dx/dy values are also\n  returned.\n\n  No FLTK symbol expansion will be performed.\n\n  Example use:\n  \\code\n    int dx,dy,W,H;\n    fl_font(FL_HELVETICA, 12);                   // set font face+size first\n    fl_text_extents(\"Some text\", dx, dy, W, H);  // get width and height of string\n    printf(\"text's width=%d, height=%d\\n\", W, H);\n  \\endcode\n*/\nFL_EXPORT void fl_text_extents(const char *, int &dx, int &dy, int &w, int &h);\n\n/** Determine the minimum pixel dimensions of a sequence of \\p n characters\n    (bytes) using the current fl_font().\n\n  \\note The string length is measured in bytes, not (UTF-8) characters.\n  \\see fl_text_extents(const char*, int& dx, int& dy, int& w, int& h)\n*/\ninline void fl_text_extents(const char *t, int n, int &dx, int &dy, int &w, int &h) {\n  fl_graphics_driver->text_extents(t, n, dx, dy, w, h);\n}\n\n// font encoding:\n// Note: doxygen comments here to avoid duplication for os-specific cases\n/**\n  Convert text from Windows/X11 latin1 character set to local encoding.\n  \\param[in] t character string (latin1 encoding)\n  \\param[in] n optional number of characters (bytes) to convert (default is all)\n  \\returns pointer to internal buffer containing converted characters\n*/\nFL_EXPORT const char *fl_latin1_to_local(const char *t, int n = -1);\n/**\n  Convert text from local encoding to Windows/X11 latin1 character set.\n  \\param[in] t character string (local encoding)\n  \\param[in] n optional number of characters (bytes) to convert (default is all)\n  \\returns pointer to internal buffer containing converted characters\n*/\nFL_EXPORT const char *fl_local_to_latin1(const char *t, int n = -1);\n/**\n  Convert text from Mac Roman character set to local encoding.\n  \\param[in] t character string (Mac Roman encoding)\n  \\param[in] n optional number of characters to convert (default is all)\n  \\returns pointer to internal buffer containing converted characters\n*/\nFL_EXPORT const char *fl_mac_roman_to_local(const char *t, int n = -1);\n/**\n  Convert text from local encoding to Mac Roman character set.\n  \\param[in] t character string (local encoding)\n  \\param[in] n optional number of characters to convert (default is all)\n  \\returns pointer to internal buffer containing converted characters\n*/\nFL_EXPORT const char *fl_local_to_mac_roman(const char *t, int n = -1);\n/** @} */\n\n/** \\addtogroup  fl_drawings\n    @{ */\n\nFL_EXPORT float fl_override_scale();\n\nFL_EXPORT void fl_restore_scale(float s);\n\n/**\n  Draw a nul-terminated UTF-8 string starting at the given \\p x, \\p y location.\n\n  Text is aligned to the left and to the baseline of the font.\n  To align to the bottom, subtract fl_descent() from \\p y.\n  To align to the top, subtract fl_descent() and add fl_height().\n  This version of fl_draw provides direct access to the text drawing\n  function of the underlying OS. It does not apply any special handling\n  to control characters.\n*/\nFL_EXPORT void fl_draw(const char *str, int x, int y);\n/**\n  Draw a nul-terminated UTF-8 string starting at the given \\p x, \\p y\n  location and rotating \\p angle degrees counter-clockwise.\n  This version of fl_draw provides direct access to the text drawing\n  function of the underlying OS and is supported by all fltk platforms except\n  X11 without Xft.\n*/\nFL_EXPORT void fl_draw(int angle, const char *str, int x, int y);\n/**\n  Draws starting at the given \\p x, \\p y location a UTF-8 string of length \\p n bytes.\n*/\ninline void fl_draw(const char *str, int n, int x, int y) {\n  fl_graphics_driver->draw(str, n, x, y);\n}\n/**\n  Draw at the given \\p x, \\p y location a UTF-8 string of length \\p n bytes\n  rotating \\p angle degrees counter-clockwise.\n\n  \\note When using X11 (Unix, Linux, Cygwin et al.) this needs Xft to work.\n        Under plain X11 (w/o Xft) rotated text is not supported by FLTK.\n        A warning will be issued to stderr at runtime (only once) if you\n        use this method with an angle other than 0.\n*/\ninline void fl_draw(int angle, const char *str, int n, int x, int y) {\n  fl_graphics_driver->draw(angle, str, n, x, y);\n}\n/**\n  Draw a UTF-8 string of length \\p n bytes right to left starting at the given \\p x, \\p y location.\n*/\ninline void fl_rtl_draw(const char *str, int n, int x, int y) {\n  fl_graphics_driver->rtl_draw(str, n, x, y);\n}\nFL_EXPORT void fl_measure(const char *str, int &x, int &y, int draw_symbols = 1);\n/**\n  Fancy string drawing function which is used to draw all the labels.\n\n  The string is formatted and aligned inside the passed box.\n  Handles '\\\\t' and '\\\\n', expands all other control characters to '^X',\n  and aligns inside or against the edges of the box.\n  See Fl_Widget::align() for values of \\p align. The value FL_ALIGN_INSIDE\n  is ignored, as this function always prints inside the box.\n  If \\p img is provided and is not \\p NULL, the image is drawn above or\n  below the text as specified by the \\p align value.\n  The \\p draw_symbols argument specifies whether or not to look for symbol\n  names starting with the '\\@' character'\n\n \\param[in] str UTF-8 string, can start and end with an '\\@sym' symbol,\n            can contain '\\\\n'\n \\param[in] x,y,w,h bounding box\n \\param[in] align label and image alignment in bounding box\n \\param[in] img pointer to image\n \\param[in] draw_symbols if true, interprete leading and trailing '\\@sym'\n            as graphical symbols\n \\param[in] spacing spacing between text and image\n */\nFL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h,\n                       Fl_Align align, Fl_Image *img = 0,\n                       int draw_symbols = 1, int spacing = 0);\n/**\n The same as fl_draw(const char*,int,int,int,int,Fl_Align,Fl_Image*,int) with\n the addition of the \\p callthis parameter, which is a pointer to a text drawing\n function such as fl_draw(const char*, int, int, int) to do the real work.\n\n \\param[in] str UTF-8 string, can start and end with an '\\@sym' symbol,\n can contain '\\\\n'\n \\param[in] x,y,w,h bounding box\n \\param[in] align label and image alignment in bounding box\n \\param[in] callthis pointer to text drawing function\n \\param[in] img pointer to image\n \\param[in] draw_symbols if true, interprete leading and trailing '\\@sym'\n as graphical symbols\n \\param[in] spacing spacing between text and image\n */\nFL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h, Fl_Align align,\n                       void (*callthis)(const char *, int, int, int),\n                       Fl_Image *img = 0, int draw_symbols = 1, int spacing = 0);\n\n// boxtypes:\n\nFL_EXPORT void fl_frame(const char *s, int x, int y, int w, int h);\nFL_EXPORT void fl_frame2(const char *s, int x, int y, int w, int h);\nFL_EXPORT void fl_draw_box(Fl_Boxtype, int x, int y, int w, int h, Fl_Color);\nFL_EXPORT void fl_draw_box_focus(Fl_Boxtype, int x, int y, int w, int h, Fl_Color, Fl_Color);\n\n// basic GUI objects (check marks, arrows, more to come ...):\n\n// Draw a check mark in the given color inside the bounding box bb.\nvoid fl_draw_check(Fl_Rect bb, Fl_Color col);\n\n// Draw one or more \"arrows\" (triangles)\nFL_EXPORT void fl_draw_arrow(Fl_Rect bb, Fl_Arrow_Type t, Fl_Orientation o, Fl_Color color);\n\n// Draw a potentially small, filled circle\nFL_EXPORT void fl_draw_circle(int x, int y, int d, Fl_Color color);\n\n// Draw the full \"radio button\" of a radio menu entry or radio button\n// This requires scheme specific handling (particularly gtk+ scheme)\nFL_EXPORT void fl_draw_radio(int x, int y, int d, Fl_Color color);\n\n// images:\n\n/**\n  Draw an 8-bit per color RGB or luminance image.\n  \\param[in] buf points at the \"r\" data of the top-left pixel.\n                 Color data must be in <tt>r,g,b</tt> order.\n                 Luminance data is only one <tt>gray</tt> byte.\n  \\param[in] X,Y position where to put top-left corner of image\n  \\param[in] W,H size of the image\n  \\param[in] D   delta to add to the pointer between pixels. It may be\n                 any value greater than or equal to 1, or it can be\n                 negative to flip the image horizontally\n  \\param[in] L   delta to add to the pointer between lines (if 0 is\n                 passed it uses \\p W * \\p D), and may be larger than\n                 \\p W * \\p D to crop data, or negative to flip the\n                 image vertically\n\n  It is highly recommended that you put the following code before the\n  first <tt>show()</tt> of \\e any window in your program to get rid of\n  the dithering if possible:\n  \\code\n  Fl::visual(FL_RGB);\n  \\endcode\n\n  Gray scale (1-channel) images may be drawn. This is done if\n  <tt>abs(D)</tt> is less than 3, or by calling fl_draw_image_mono().\n  Only one 8-bit sample is used for each pixel, and on screens with\n  different numbers of bits for red, green, and blue only gray colors\n  are used. Setting \\p D greater than 1 will let you display one channel\n  of a color image.\n\n  \\par Note:\n  The X version does not support all possible visuals. If FLTK cannot\n  draw the image in the current visual it will abort. FLTK supports\n  any visual of 8 bits or less, and all common TrueColor visuals up\n  to 32 bits.\n*/\ninline void fl_draw_image(const uchar *buf, int X, int Y, int W, int H, int D = 3, int L = 0) {\n  fl_graphics_driver->draw_image_general_(buf, X, Y, W, H, D, L);\n}\n\n/**\n  Draw a gray-scale (1 channel) image.\n  \\see fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L)\n*/\ninline void fl_draw_image_mono(const uchar *buf, int X, int Y, int W, int H, int D = 1, int L = 0) {\n  fl_graphics_driver->draw_image_mono_general_(buf, X, Y, W, H, D, L);\n}\n\n/**\n  Draw an image using a callback function to generate image data.\n\n  You can generate the image as it is being drawn, or do arbitrary\n  decompression of stored data, provided it can be decompressed to\n  individual scan lines.\n\n  \\param[in] cb   callback function to generate scan line data\n  \\param[in] data user data passed to callback function\n  \\param[in] X,Y  screen position of top left pixel\n  \\param[in] W,H  image width and height\n  \\param[in] D    data size per pixel in bytes (must be greater than 0)\n\n  \\see fl_draw_image(const uchar* buf, int X, int Y, int W, int H, int D, int L)\n\n  The callback function \\p cb is called with the <tt>void*</tt> \\p data\n  user data pointer to allow access to a structure of information about\n  the image, and the \\p x, \\p y, and \\p w of the scan line desired from\n  the image. 0,0 is the upper-left corner of the image, not \\p x, \\p y.\n  A pointer to a buffer to put the data into is passed. You must copy\n  \\p w pixels from scanline \\p y, starting at pixel \\p x, to this buffer.\n\n  Due to cropping, less than the whole image may be requested. So \\p x\n  may be greater than zero, the first \\p y may be greater than zero,\n  and \\p w may be less than \\p W. The buffer is long enough to store\n  the entire \\p W * \\p D pixels, this is for convenience with some\n  decompression schemes where you must decompress the entire line at\n  once: decompress it into the buffer, and then if \\p x is not zero,\n  copy the data over so the \\p x'th pixel is at the start of the buffer.\n\n  You can assume the \\p y's will be consecutive, except the first one\n  may be greater than zero.\n\n  If \\p D is 4 or more, you must fill in the unused bytes with zero.\n*/\ninline void fl_draw_image(Fl_Draw_Image_Cb cb, void *data, int X, int Y, int W, int H, int D = 3) {\n  fl_graphics_driver->draw_image(cb, data, X, Y, W, H, D);\n}\n\n/**\n  Draw a gray-scale image using a callback function to generate image data.\n  \\see fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D)\n*/\ninline void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void *data, int X, int Y, int W, int H, int D = 1) {\n  fl_graphics_driver->draw_image_mono(cb, data, X, Y, W, H, D);\n}\n\n/**\n  Check whether platform supports true alpha blending for RGBA images.\n  \\returns 1 if true alpha blending supported by platform\n  \\returns 0 not supported so FLTK will use screen door transparency\n*/\ninline char fl_can_do_alpha_blending() {\n  return Fl_Graphics_Driver::default_driver().can_do_alpha_blending();\n}\n\nFL_EXPORT uchar *fl_read_image(uchar *p, int X, int Y, int W, int H, int alpha = 0);\nFL_EXPORT Fl_RGB_Image *fl_capture_window(Fl_Window *win, int x, int y, int w, int h);\n\n// pixmaps:\n/**\n  Draw XPM image data, with the top-left corner at the given position.\n  The image is dithered on 8-bit displays so you won't lose color\n  space for programs displaying both images and pixmaps.\n\n  \\param[in] data pointer to XPM image data\n  \\param[in] x,y  position of top-left corner\n  \\param[in] bg   background color\n\n  \\returns 0 if there was any error decoding the XPM data.\n*/\nFL_EXPORT int fl_draw_pixmap(const char *const *data, int x, int y, Fl_Color bg = FL_GRAY);\n/**\n  Draw XPM image data, with the top-left corner at the given position.\n  \\see fl_draw_pixmap(const char* const* data, int x, int y, Fl_Color bg)\n*/\ninline int fl_draw_pixmap(/*const*/ char *const *data, int x, int y, Fl_Color bg = FL_GRAY) {\n  return fl_draw_pixmap((const char *const *)data, x, y, bg);\n}\nFL_EXPORT int fl_measure_pixmap(/*const*/ char *const *data, int &w, int &h);\nFL_EXPORT int fl_measure_pixmap(const char *const *cdata, int &w, int &h);\n\n// other:\nFL_EXPORT void fl_scroll(int X, int Y, int W, int H, int dx, int dy,\n                         void (*draw_area)(void *, int, int, int, int), void *data);\nFL_EXPORT const char *fl_shortcut_label(unsigned int shortcut);\nFL_EXPORT const char *fl_shortcut_label(unsigned int shortcut, const char **eom);\nFL_EXPORT unsigned int fl_old_shortcut(const char *s);\nFL_EXPORT void fl_overlay_rect(int x, int y, int w, int h);\nFL_EXPORT void fl_overlay_clear();\nFL_EXPORT void fl_cursor(Fl_Cursor);\nFL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg, Fl_Color bg = FL_WHITE);\nFL_EXPORT const char *fl_expand_text(const char *from, char *buf, int maxbuf, double maxw,\n                                     int &n, double &width, int wrap, int draw_symbols = 0);\n\n// XIM:\nFL_EXPORT void fl_set_status(int X, int Y, int W, int H);\n/** Inform text input methods about the current text insertion cursor.\n \\param font Font currently in use in text input.\n \\param size Size of the current font.\n \\param X,Y Position of the bottom of the current text insertion cursor.\n \\param W,H Width and height of the current text insertion cursor.\n \\param win Points to the Fl_Window object containing the current text widget, or NULL.\n */\nFL_EXPORT void fl_set_spot(int font, int size, int X, int Y, int W, int H, Fl_Window *win = 0);\n/** Resets marked text.\n\n In many languages, typing a character can involve multiple keystrokes. For\n example, the Ä can be composed of two dots (¨) on top of the\n character, followed by the letter A (on a Mac with U.S. keyboard, you'd\n type Alt-U, Shift-A. To inform the user that the dots may be followed by\n another character, the ¨ is underlined).\n\n Call this function if character composition needs to be aborted for some\n reason. One such example would be the text input widget losing focus.\n */\nFL_EXPORT void fl_reset_spot(void);\n\n\n// XForms symbols:\nFL_EXPORT int fl_draw_symbol(const char *label, int x, int y, int w, int h, Fl_Color);\nFL_EXPORT int fl_add_symbol(const char *name, void (*drawit)(Fl_Color), int scalable);\n/** @} */\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_message.H",
    "content": "//\n// Standard message header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef _FL_fl_message_H_\n#define _FL_fl_message_H_\n\n#include \"fl_ask.H\"\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_show_colormap.H",
    "content": "//\n// Colormap picker header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/** \\file\n   The fl_show_colormap() function hides the implementation classes used\n   to provide the popup window and color selection mechanism.\n*/\n\n#ifndef fl_show_colormap_H\n#define fl_show_colormap_H\n\n/* doxygen comment here to avoid exposing ColorMenu in fl_show_colormap.cxx\n*/\n\n/** \\addtogroup  fl_attributes\n    @{ */\n\n/**\n  \\brief Pops up a window to let the user pick a colormap entry.\n  \\image html fl_show_colormap.png\n  \\image latex fl_show_colormap.png \"fl_show_colormap\" height=10cm\n  \\param[in] oldcol color to be highlighted when grid is shown.\n  \\retval Fl_Color value of the chosen colormap entry.\n  \\see Fl_Color_Chooser\n*/\nFL_EXPORT Fl_Color fl_show_colormap(Fl_Color oldcol);\n\n/** @} */\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_show_input.H",
    "content": "//\n// Standard input dialog header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#include \"fl_ask.H\"\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_string_functions.h",
    "content": "/*\n * Platform agnostic string portability functions for the Fast Light Tool Kit (FLTK).\n *\n * Copyright 2020-2022 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n/**\n  \\file fl_string_functions.h\n  Public header for FLTK's platform-agnostic string handling.\n*/\n\n#ifndef _FL_fl_string_functions_h_\n#define _FL_fl_string_functions_h_\n\n#include \"Fl_Export.H\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stddef.h>  // size_t\n\n/** \\defgroup fl_string  String handling functions\n String handling functions declared in <FL/fl_string_functions.h>\n    @{\n*/\n\nFL_EXPORT char* fl_strdup(const char *s);\n\nFL_EXPORT size_t fl_strlcpy(char *, const char *, size_t);\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n\n#endif /* _FL_fl_string_functions_h_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_types.h",
    "content": "/*\n * Simple \"C\"-style types for the Fast Light Tool Kit (FLTK).\n *\n * Copyright 1998-2020 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n/** \\file\n *  This file contains simple \"C\"-style type definitions.\n */\n\n#ifndef FL_TYPES_H\n#define FL_TYPES_H\n\n#include \"fl_attr.h\"\n\n/** \\name       Miscellaneous */\n/**@{*/  /* group: Miscellaneous */\n\n/** unsigned char */\ntypedef unsigned char uchar;\n/** unsigned long */\ntypedef unsigned long ulong;\n\n/** 16-bit Unicode character + 8-bit indicator for keyboard flags.\n\n  \\note This \\b should be 24-bit Unicode character + 8-bit indicator for\n    keyboard flags. The upper 8 bits are currently unused but reserved.\n\n  Due to compatibility issues this type and all FLTK \\b shortcuts can only\n  be used with 16-bit Unicode characters (<tt>U+0000 .. U+FFFF</tt>) and\n  not with the full range of unicode characters (<tt>U+0000 .. U+10FFFF</tt>).\n\n  This is caused by the bit flags \\c FL_SHIFT, \\c FL_CTRL, \\c FL_ALT, and\n  \\c FL_META being all in the range <tt>0x010000 .. 0x400000</tt>.\n\n  \\todo Discuss and decide whether we can \"shift\" these special keyboard\n    flags to the upper byte to enable full 21-bit Unicode characters\n    (<tt>U+0000 .. U+10FFFF</tt>) plus the keyboard indicator bits as this\n    was originally intended. This would be possible if we could rely on \\b all\n    programs being coded with symbolic names and not hard coded bit values.\n\n  \\internal Can we do the move for 1.4 or, if not, for any later version\n    that is allowed to break the ABI?\n*/\ntypedef unsigned int Fl_Shortcut;\n\n/**@}*/  /* group: Miscellaneous */\n\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/FL/fl_utf8.h",
    "content": "/*\n * Author: Jean-Marc Lienher ( http://oksid.ch )\n * Copyright 2000-2010 by O'ksi'D.\n * Copyright 2016-2021 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n/* Merged in some functionality from the fltk-2 version. IMM.\n * The following code is an attempt to merge the functions incorporated in FLTK2\n * with the functions provided in OksiD's fltk-1.1.6-utf8 port\n */\n\n/**\n  \\file fl_utf8.h\n  \\brief header for Unicode and UTF-8 character handling\n*/\n\n#ifndef _HAVE_FL_UTF8_HDR_\n#define _HAVE_FL_UTF8_HDR_\n\n#include \"Fl_Export.H\"\n#include \"fl_types.h\"\n#include <stdio.h>      // FILE *fl_fopen()\n#include <sys/stat.h>   // struct stat\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** \\addtogroup fl_unicode\n    @{\n*/\n\n/* F2: comes from FLTK2 */\n/* OD: comes from OksiD */\n\n/**\n  Return the number of bytes needed to encode the given UCS4 character in UTF-8.\n  \\param [in] ucs UCS4 encoded character\n  \\return number of bytes required\n */\nFL_EXPORT int fl_utf8bytes(unsigned ucs);\n\n/* OD: returns the byte length of the first UTF-8 char sequence (returns -1 if not valid) */\nFL_EXPORT int fl_utf8len(char c);\n\n/* OD: returns the byte length of the first UTF-8 char sequence (returns +1 if not valid) */\nFL_EXPORT int fl_utf8len1(char c);\n\n/* OD: returns the byte length of a UTF-8 text */\nFL_EXPORT int fl_utf8strlen(const char *text, int len);\n\n/* OD: returns the number of Unicode chars in the UTF-8 string */\nFL_EXPORT int fl_utf_nb_char(const unsigned char *buf, int len);\n\n/* F2: Convert the next UTF-8 char-sequence into a Unicode value (and say how many bytes were used) */\nFL_EXPORT unsigned fl_utf8decode(const char* p, const char* end, int* len);\n\n/* F2: Encode a Unicode value into a UTF-8 sequence, return the number of bytes used */\nFL_EXPORT int fl_utf8encode(unsigned ucs, char* buf);\n\n/* F2: Move forward to the next valid UTF-8 sequence start betwen start and end */\nFL_EXPORT const char* fl_utf8fwd(const char* p, const char* start, const char* end);\n\n/* F2: Move backward to the previous valid UTF-8 sequence start */\nFL_EXPORT const char* fl_utf8back(const char* p, const char* start, const char* end);\n\n/* XX: Convert a single 32-bit Unicode value into UTF16 */\nFL_EXPORT unsigned fl_ucs_to_Utf16(const unsigned ucs, unsigned short *dst, const unsigned dstlen);\n\n/* F2: Convert a UTF-8 string into UTF16 */\nFL_EXPORT unsigned fl_utf8toUtf16(const char* src, unsigned srclen, unsigned short* dst, unsigned dstlen);\n\n/* F2: Convert a UTF-8 string into a wide character string - makes UTF16 on win32, \"UCS4\" elsewhere */\nFL_EXPORT unsigned fl_utf8towc(const char *src, unsigned srclen, wchar_t *dst, unsigned dstlen);\n\n/* F2: Convert a wide character string to UTF-8 - takes in UTF16 on win32, \"UCS4\" elsewhere */\nFL_EXPORT unsigned fl_utf8fromwc(char *dst, unsigned dstlen, const wchar_t *src, unsigned srclen);\n\n/* F2: Convert a UTF-8 string into ASCII, eliding untranslatable glyphs */\nFL_EXPORT unsigned fl_utf8toa (const char *src, unsigned srclen, char *dst, unsigned dstlen);\n\n/* F2: Convert 8859-1 string to UTF-8 */\nFL_EXPORT unsigned fl_utf8froma (char *dst, unsigned dstlen, const char *src, unsigned srclen);\n\n/* F2: Returns true if the current O/S locale is UTF-8 */\nFL_EXPORT int fl_utf8locale(void);\n\n/* F2: Examine the first len characters of src, to determine if the input text is UTF-8 or not\n * NOTE: The value returned is not simply boolean - it contains information about the probable\n * type of the src text. */\nFL_EXPORT int fl_utf8test(const char *src, unsigned len);\n\n/* XX: return width of \"raw\" ucs character in columns.\n * for internal use only */\nFL_EXPORT int fl_wcwidth_(unsigned int ucs);\n\n/* XX: return width of UTF-8 character string in columns.\n * NOTE: this may also do C1 control character (0x80 to 0x9f) to CP1252 mapping,\n * depending on original build options */\nFL_EXPORT int fl_wcwidth(const char *src);\n\n/* OD: Return true if the character is non-spacing */\nFL_EXPORT unsigned int fl_nonspacing(unsigned int ucs);\n\n/* F2: Convert UTF-8 to a local multi-byte encoding - mainly for win32? */\nFL_EXPORT unsigned fl_utf8to_mb(const char *src, unsigned srclen, char *dst, unsigned dstlen);\n/* OD: Convert UTF-8 to a local multi-byte encoding */\nFL_EXPORT char* fl_utf2mbcs(const char *src);\n\n/* F2: Convert a local multi-byte encoding to UTF-8 - mainly for win32? */\nFL_EXPORT unsigned fl_utf8from_mb(char *dst, unsigned dstlen, const char *src, unsigned srclen);\n\n/*****************************************************************************/\n#ifdef _WIN32\n/* these two Windows-only functions are kept for API compatibility */\n/* OD: Attempt to convert the UTF-8 string to the current locale */\nFL_EXPORT char *fl_utf8_to_locale(const char *s, int len, unsigned int codepage);\n\n/* OD: Attempt to convert a string in the current locale to UTF-8 */\nFL_EXPORT char *fl_locale_to_utf8(const char *s, int len, unsigned int codepage);\n#endif /* _WIN32 */\n\n/*****************************************************************************\n * The following functions are intended to provide portable, UTF-8 aware\n * versions of standard functions\n */\n\n/* OD: UTF-8 aware strncasecmp - converts to lower case Unicode and tests */\nFL_EXPORT int fl_utf_strncasecmp(const char *s1, const char *s2, int n);\n\n/* OD: UTF-8 aware strcasecmp - converts to Unicode and tests */\nFL_EXPORT int fl_utf_strcasecmp(const char *s1, const char *s2);\n\n/* OD: return the Unicode lower case value of ucs */\nFL_EXPORT int fl_tolower(unsigned int ucs);\n\n/* OD: return the Unicode upper case value of ucs */\nFL_EXPORT int fl_toupper(unsigned int ucs);\n\n/* OD: converts the UTF-8 string to the lower case equivalent */\nFL_EXPORT int fl_utf_tolower(const unsigned char *str, int len, char *buf);\n\n/* OD: converts the UTF-8 string to the upper case equivalent */\nFL_EXPORT int fl_utf_toupper(const unsigned char *str, int len, char *buf);\n\n/* OD: Portable UTF-8 aware chmod wrapper */\nFL_EXPORT int fl_chmod(const char* f, int mode);\n\n/* OD: Portable UTF-8 aware access wrapper */\nFL_EXPORT int fl_access(const char* f, int mode);\n\n/* OD: Portable UTF-8 aware stat wrapper */\nFL_EXPORT int fl_stat(const char *path, struct stat *buffer);\n\n/* OD: Portable UTF-8 aware getcwd wrapper */\nFL_EXPORT char *fl_getcwd(char *buf, int len);\n\n/* Portable UTF-8 aware chdir wrapper */\nFL_EXPORT int fl_chdir(const char *path);\n\n/* OD: Portable UTF-8 aware fopen wrapper */\nFL_EXPORT FILE *fl_fopen(const char *f, const char *mode);\n\n/* OD: Portable UTF-8 aware system wrapper */\nFL_EXPORT int fl_system(const char* f);\n\n/* OD: Portable UTF-8 aware execvp wrapper */\nFL_EXPORT int fl_execvp(const char *file, char *const *argv);\n\n/* OD: Portable UTF-8 aware open wrapper */\nFL_EXPORT int fl_open(const char *fname, int oflags, ...);\n\nFL_EXPORT int fl_open_ext(const char *fname, int binary, int oflags, ...);\n\n/* Portable wrapper around unix-style close() function */\nFL_EXPORT int fl_close_fd(int fd);\n\n/* OD: Portable UTF-8 aware unlink wrapper */\nFL_EXPORT int fl_unlink(const char *fname);\n\n/* OD: Portable UTF-8 aware rmdir wrapper */\nFL_EXPORT int fl_rmdir(const char *f);\n\n/* OD: Portable UTF-8 aware getenv wrapper */\nFL_EXPORT char* fl_getenv(const char *name);\n\n/* Portable UTF-8 aware putenv wrapper */\nFL_EXPORT int fl_putenv(const char *var);\n\n/* OD: Portable UTF-8 aware mkdir wrapper */\nFL_EXPORT int fl_mkdir(const char* f, int mode);\n\n/* OD: Portable UTF-8 aware rename wrapper */\nFL_EXPORT int fl_rename(const char* f, const char *t);\n\n\n/* OD: Given a full pathname, this will create the directory path needed to hold the file named */\nFL_EXPORT void fl_make_path_for_file( const char *path );\n\n/* OD: recursively create a path in the file system */\nFL_EXPORT char fl_make_path( const char *path );\n\n\n/** @} */\n\n/*****************************************************************************/\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n\n#endif /* _HAVE_FL_UTF8_HDR_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/forms.H",
    "content": "//\n// Forms emulation header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef __FORMS_H__\n#define __FORMS_H__\n\n#include \"Fl.H\"\n#include \"Fl_Group.H\"\n#include \"Fl_Window.H\"\n#include \"fl_draw.H\"\n\ntypedef Fl_Widget FL_OBJECT;\ntypedef Fl_Window FL_FORM;\n\n////////////////////////////////////////////////////////////////\n// Random constants & symbols defined by forms.h file:\n\n#ifndef NULL\n#define NULL 0\n#endif\n#ifndef FALSE\n#define FALSE 0\n#define TRUE 1\n#endif\n\n#define FL_ON           1\n#define FL_OK           1\n#define FL_VALID        1\n#define FL_PREEMPT      1\n#define FL_AUTO         2\n#define FL_WHEN_NEEDED  FL_AUTO\n#define FL_OFF          0\n#define FL_NONE         0\n#define FL_CANCEL       0\n#define FL_INVALID      0\n#define FL_IGNORE       -1\n// #define FL_CLOSE     -2 // this variable is never used in FLTK Forms. It is removed\n                           // because it conflicts with the window FL_CLOSE event\n\n#define FL_LCOL         FL_BLACK\n#define FL_COL1         FL_GRAY\n#define FL_MCOL         FL_LIGHT1\n#define FL_LEFT_BCOL    FL_LIGHT3 // 53 is better match\n#define FL_TOP_BCOL     FL_LIGHT2 // 51\n#define FL_BOTTOM_BCOL  FL_DARK2  // 40\n#define FL_RIGHT_BCOL   FL_DARK3  // 36\n#define FL_INACTIVE     FL_INACTIVE_COLOR\n#define FL_INACTIVE_COL FL_INACTIVE_COLOR\n#define FL_FREE_COL1    FL_FREE_COLOR\n#define FL_FREE_COL2    ((Fl_Color)(FL_FREE_COLOR+1))\n#define FL_FREE_COL3    ((Fl_Color)(FL_FREE_COLOR+2))\n#define FL_FREE_COL4    ((Fl_Color)(FL_FREE_COLOR+3))\n#define FL_FREE_COL5    ((Fl_Color)(FL_FREE_COLOR+4))\n#define FL_FREE_COL6    ((Fl_Color)(FL_FREE_COLOR+5))\n#define FL_FREE_COL7    ((Fl_Color)(FL_FREE_COLOR+6))\n#define FL_FREE_COL8    ((Fl_Color)(FL_FREE_COLOR+7))\n#define FL_FREE_COL9    ((Fl_Color)(FL_FREE_COLOR+8))\n#define FL_FREE_COL10   ((Fl_Color)(FL_FREE_COLOR+9))\n#define FL_FREE_COL11   ((Fl_Color)(FL_FREE_COLOR+10))\n#define FL_FREE_COL12   ((Fl_Color)(FL_FREE_COLOR+11))\n#define FL_FREE_COL13   ((Fl_Color)(FL_FREE_COLOR+12))\n#define FL_FREE_COL14   ((Fl_Color)(FL_FREE_COLOR+13))\n#define FL_FREE_COL15   ((Fl_Color)(FL_FREE_COLOR+14))\n#define FL_FREE_COL16   ((Fl_Color)(FL_FREE_COLOR+15))\n#define FL_TOMATO       ((Fl_Color)(131))\n#define FL_INDIANRED    ((Fl_Color)(164))\n#define FL_SLATEBLUE    ((Fl_Color)(195))\n#define FL_DARKGOLD     ((Fl_Color)(84))\n#define FL_PALEGREEN    ((Fl_Color)(157))\n#define FL_ORCHID       ((Fl_Color)(203))\n#define FL_DARKCYAN     ((Fl_Color)(189))\n#define FL_DARKTOMATO   ((Fl_Color)(113))\n#define FL_WHEAT        ((Fl_Color)(174))\n\n#define FL_ALIGN_BESIDE FL_ALIGN_INSIDE\n\n#define FL_PUP_TOGGLE   2 // FL_MENU_TOGGLE\n#define FL_PUP_INACTIVE 1 // FL_MENU_INACTIVE\n#define FL_NO_FRAME     FL_NO_BOX\n#define FL_ROUNDED3D_UPBOX      FL_ROUND_UP_BOX\n#define FL_ROUNDED3D_DOWNBOX    FL_ROUND_DOWN_BOX\n#define FL_OVAL3D_UPBOX         FL_ROUND_UP_BOX\n#define FL_OVAL3D_DOWNBOX       FL_ROUND_DOWN_BOX\n\n#define FL_MBUTTON1     1\n#define FL_LEFTMOUSE    1\n#define FL_MBUTTON2     2\n#define FL_MIDDLEMOUSE  2\n#define FL_MBUTTON3     3\n#define FL_RIGHTMOUSE   3\n#define FL_MBUTTON4     4\n#define FL_MBUTTON5     5\n\n#define FL_INVALID_STYLE 255\n#define FL_NORMAL_STYLE FL_HELVETICA\n#define FL_BOLD_STYLE   FL_HELVETICA_BOLD\n#define FL_ITALIC_STYLE FL_HELVETICA_ITALIC\n#define FL_BOLDITALIC_STYLE FL_HELVETICA_BOLD_ITALIC\n#define FL_FIXED_STYLE  FL_COURIER\n#define FL_FIXEDBOLD_STYLE FL_COURIER_BOLD\n#define FL_FIXEDITALIC_STYLE FL_COURIER_ITALIC\n#define FL_FIXEDBOLDITALIC_STYLE FL_COURIER_BOLD_ITALIC\n#define FL_TIMES_STYLE  FL_TIMES\n#define FL_TIMESBOLD_STYLE FL_TIMES_BOLD\n#define FL_TIMESITALIC_STYLE FL_TIMES_ITALIC\n#define FL_TIMESBOLDITALIC_STYLE FL_TIMES_BOLD_ITALIC\n\n// hacks to change the labeltype() when passed to fl_set_object_lstyle():\n#define FL_SHADOW_STYLE         (FL_SHADOW_LABEL<<8)\n#define FL_ENGRAVED_STYLE       (FL_ENGRAVED_LABEL<<8)\n#define FL_EMBOSSED_STYLE       (FL_EMBOSSED_LABEL<<0)\n\n// size values are different from XForms, match older Forms:\n#define FL_TINY_SIZE    8\n#define FL_SMALL_SIZE   11 // 10\n//#define FL_NORMAL_SIZE        14 // 12\n#define FL_MEDIUM_SIZE  18 // 14\n#define FL_LARGE_SIZE   24 // 18\n#define FL_HUGE_SIZE    32 // 24\n#define FL_DEFAULT_SIZE FL_SMALL_SIZE\n#define FL_TINY_FONT    FL_TINY_SIZE\n#define FL_SMALL_FONT   FL_SMALL_SIZE\n#define FL_NORMAL_FONT  FL_NORMAL_SIZE\n#define FL_MEDIUM_FONT  FL_MEDIUM_SIZE\n#define FL_LARGE_FONT   FL_LARGE_SIZE\n#define FL_HUGE_FONT    FL_HUGE_SIZE\n#define FL_NORMAL_FONT1 FL_SMALL_FONT\n#define FL_NORMAL_FONT2 FL_NORMAL_FONT\n#define FL_DEFAULT_FONT FL_SMALL_FONT\n\n#define FL_RETURN_END_CHANGED   FL_WHEN_RELEASE\n#define FL_RETURN_CHANGED       FL_WHEN_CHANGED\n#define FL_RETURN_END           FL_WHEN_RELEASE_ALWAYS\n#define FL_RETURN_ALWAYS        (FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED)\n\n#define FL_BOUND_WIDTH  3\n\ntypedef int FL_Coord;\ntypedef int FL_COLOR;\n\n////////////////////////////////////////////////////////////////\n// fltk interaction:\n\n#define FL_CMD_OPT void\nextern FL_EXPORT void fl_initialize(int*, char*[], const char*, FL_CMD_OPT*, int);\ninline void fl_finish() {}\n\ntypedef void (*FL_IO_CALLBACK) (FL_SOCKET, void*);\ninline void fl_add_io_callback(int fd, short w, FL_IO_CALLBACK cb, void* v) {\n  Fl::add_fd(fd, w, cb, v);}\ninline void fl_remove_io_callback(int fd, short, FL_IO_CALLBACK) {\n  Fl::remove_fd(fd);} // removes all the callbacks!\n\n// type of callback is different and no \"id\" number is returned:\ninline void fl_add_timeout(long msec, void (*cb)(void*), void* v) {\n  Fl::add_timeout(msec*.001, cb, v);}\ninline void fl_remove_timeout(int) {}\n\n// type of callback is different!\ninline void fl_set_idle_callback(void (*cb)()) {Fl::set_idle(cb);}\n\nFL_EXPORT Fl_Widget* fl_do_forms(void);\nFL_EXPORT Fl_Widget* fl_check_forms();\ninline Fl_Widget* fl_do_only_forms(void) {return fl_do_forms();}\ninline Fl_Widget* fl_check_only_forms(void) {return fl_check_forms();}\n\n// because of new redraw behavior, these are no-ops:\ninline void fl_freeze_object(Fl_Widget*) {}\ninline void fl_unfreeze_object(Fl_Widget*) {}\ninline void fl_freeze_form(Fl_Window*) {}\ninline void fl_unfreeze_form(Fl_Window*) {}\ninline void fl_freeze_all_forms() {}\ninline void fl_unfreeze_all_forms() {}\n\ninline void fl_set_focus_object(Fl_Window*, Fl_Widget* o) {Fl::focus(o);}\ninline void fl_reset_focus_object(Fl_Widget* o) {Fl::focus(o);}\n#define fl_set_object_focus fl_set_focus_object\n\n// void fl_set_form_atclose(Fl_Window*w,int (*cb)(Fl_Window*,void*),void* v)\n// void fl_set_atclose(int (*cb)(Fl_Window*,void*),void*)\n// fl_set_form_atactivate/atdeactivate not implemented!\n\n////////////////////////////////////////////////////////////////\n// Fl_Widget:\n\ninline void fl_set_object_boxtype(Fl_Widget* o, Fl_Boxtype a) {o->box(a);}\ninline void fl_set_object_lsize(Fl_Widget* o,int s) {o->labelsize(s);}\n\n/* forms lib font indexes must be byte sized - extract correct byte from style word */\ninline void fl_set_object_lstyle(Fl_Widget* o,int a) {\n  o->labelfont((Fl_Font)(a&0xff)); o->labeltype((Fl_Labeltype)(a>>8));}\ninline void fl_set_object_lcol(Fl_Widget* o, Fl_Color a) {o->labelcolor(a);}\n#define fl_set_object_lcolor  fl_set_object_lcol\ninline void fl_set_object_lalign(Fl_Widget* o, Fl_Align a) {o->align(a);}\n#define fl_set_object_align fl_set_object_lalign\ninline void fl_set_object_color(Fl_Widget* o,Fl_Color a,Fl_Color b) {o->color(a,b);}\ninline void fl_set_object_label(Fl_Widget* o, const char* a) {o->label(a); o->redraw();}\ninline void fl_set_object_position(Fl_Widget*o,int x,int y) {o->position(x,y);}\ninline void fl_set_object_size(Fl_Widget* o, int w, int h) {o->size(w,h);}\ninline void fl_set_object_geometry(Fl_Widget* o,int x,int y,int w,int h) {o->resize(x,y,w,h);}\n\ninline void fl_get_object_geometry(Fl_Widget* o,int*x,int*y,int*w,int*h) {\n  *x = o->x(); *y = o->y(); *w = o->w(); *h = o->h();}\ninline void fl_get_object_position(Fl_Widget* o,int*x,int*y) {\n  *x = o->x(); *y = o->y();}\n\ntypedef void (*Forms_CB)(Fl_Widget*, long);\ninline void fl_set_object_callback(Fl_Widget*o,Forms_CB c,long a) {o->callback(c,a);}\n#define fl_set_call_back      fl_set_object_callback\ninline void fl_call_object_callback(Fl_Widget* o) {o->do_callback();}\ninline void fl_trigger_object(Fl_Widget* o) {o->do_callback();}\ninline void fl_set_object_return(Fl_Widget* o, int v) {\n  o->when((Fl_When)(v|FL_WHEN_RELEASE));}\n\ninline void fl_redraw_object(Fl_Widget* o) {o->redraw();}\ninline void fl_show_object(Fl_Widget* o) {o->show();}\ninline void fl_hide_object(Fl_Widget* o) {o->hide();}\ninline void fl_free_object(Fl_Widget* x) {delete x;}\ninline void fl_delete_object(Fl_Widget* o) {o->parent()->remove(*o);}\ninline void fl_activate_object(Fl_Widget* o) {o->activate();}\ninline void fl_deactivate_object(Fl_Widget* o) {o->deactivate();}\n\ninline void fl_add_object(Fl_Window* f, Fl_Widget* x) {f->add(x);}\ninline void fl_insert_object(Fl_Widget* o, Fl_Widget* b) {b->parent()->insert(*o,b);}\n\ninline Fl_Window* FL_ObjWin(Fl_Widget* o) {return o->window();}\n\n////////////////////////////////////////////////////////////////\n// things that appered in the demos a lot that I don't emulate, but\n// I did not want to edit out of all the demos...\n\ninline int fl_get_border_width() {return 3;}\ninline void fl_set_border_width(int) {}\ninline void fl_set_object_dblbuffer(Fl_Widget*, int) {}\ninline void fl_set_form_dblbuffer(Fl_Window*, int) {}\n\n////////////////////////////////////////////////////////////////\n// Fl_Window:\n\ninline void fl_free_form(Fl_Window* x) {delete x;}\ninline void fl_redraw_form(Fl_Window* f) {f->redraw();}\n\ninline Fl_Window* fl_bgn_form(Fl_Boxtype b,int w,int h) {\n  Fl_Window* g = new Fl_Window(w,h,0);\n  g->box(b);\n  return g;\n}\nFL_EXPORT void fl_end_form();\ninline void fl_addto_form(Fl_Window* f) {f->begin();}\ninline Fl_Group* fl_bgn_group() {return new Fl_Group(0,0,0,0,0);}\ninline void fl_end_group() {Fl_Group::current()->forms_end();}\ninline void fl_addto_group(Fl_Widget* o) {((Fl_Group* )o)->begin();}\n#define resizebox _ddfdesign_kludge()\n\ninline void fl_scale_form(Fl_Window* f, double x, double y) {\n  f->resizable(f); f->size(int(f->w()*x),int(f->h()*y));}\ninline void fl_set_form_position(Fl_Window* f,int x,int y) {f->position(x,y);}\ninline void fl_set_form_size(Fl_Window* f, int w, int h) {f->size(w,h);}\ninline void fl_set_form_geometry(Fl_Window* f,int x,int y,int w,int h) {\n  f->resize(x,y,w,h);}\n#define fl_set_initial_placement fl_set_form_geometry\ninline void fl_adjust_form_size(Fl_Window*) {}\n\nFL_EXPORT void fl_show_form(Fl_Window* f,int p,int b,const char* n);\nenum {  // \"p\" argument values:\n  FL_PLACE_FREE = 0,    // make resizable\n  FL_PLACE_MOUSE = 1,   // mouse centered on form\n  FL_PLACE_CENTER = 2,  // center of the screen\n  FL_PLACE_POSITION = 4,// fixed position, resizable\n  FL_PLACE_SIZE = 8,    // fixed size, normal fltk behavior\n  FL_PLACE_GEOMETRY =16,// fixed size and position\n  FL_PLACE_ASPECT = 32, // keep aspect ratio (ignored)\n  FL_PLACE_FULLSCREEN=64,// fill screen\n  FL_PLACE_HOTSPOT = 128,// enables hotspot\n  FL_PLACE_ICONIC = 256,// iconic (ignored)\n  FL_FREE_SIZE=(1<<14), // force resizable\n  FL_FIX_SIZE =(1<<15)  // force off resizable\n};\n#define FL_PLACE_FREE_CENTER (FL_PLACE_CENTER|FL_FREE_SIZE)\n#define FL_PLACE_CENTERFREE  (FL_PLACE_CENTER|FL_FREE_SIZE)\nenum {  // \"b\" arguement values:\n  FL_NOBORDER = 0,\n  FL_FULLBORDER,\n  FL_TRANSIENT\n//FL_MODAL = (1<<8)     // not implemented yet in Forms\n};\ninline void fl_set_form_hotspot(Fl_Window* w,int x,int y) {w->hotspot(x,y);}\ninline void fl_set_form_hotobject(Fl_Window* w, Fl_Widget* o) {w->hotspot(o);}\nextern FL_EXPORT char fl_flip;  // in forms.C\ninline void fl_flip_yorigin() {fl_flip = 1;}\n\n#define fl_prepare_form_window fl_show_form\ninline void fl_show_form_window(Fl_Window*) {}\n\ninline void fl_raise_form(Fl_Window* f) {f->show();}\n\ninline void fl_hide_form(Fl_Window* f) {f->hide();}\ninline void fl_pop_form(Fl_Window* f) {f->show();}\n\nextern FL_EXPORT char fl_modal_next; // in forms.C\ninline void fl_activate_all_forms() {}\ninline void fl_deactivate_all_forms() {fl_modal_next = 1;}\ninline void fl_deactivate_form(Fl_Window*w) {w->deactivate();}\ninline void fl_activate_form(Fl_Window*w) {w->activate();}\n\ninline void fl_set_form_title(Fl_Window* f, const char* s) {f->label(s);}\ninline void fl_title_form(Fl_Window* f, const char* s) {f->label(s);}\n\ntypedef void (*Forms_FormCB)(Fl_Widget*);\ninline void fl_set_form_callback(Fl_Window* f,Forms_FormCB c) {f->callback(c);}\n#define fl_set_form_call_back fl_set_form_callback\n\ninline void fl_init() {}\nFL_EXPORT void fl_set_graphics_mode(int,int);\n\ninline int fl_form_is_visible(Fl_Window* f) {return f->visible();}\n\ninline int fl_mouse_button() {return Fl::event_button();}\n#define fl_mousebutton fl_mouse_button\n\n#define fl_free       free\n#define fl_malloc     malloc\n#define fl_calloc     calloc\n#define fl_realloc    realloc\n\n////////////////////////////////////////////////////////////////\n// Drawing functions.  Only usable inside an Fl_Free object?\n\ninline void fl_drw_box(Fl_Boxtype b,int x,int y,int w,int h,Fl_Color bgc,int=3) {\n    fl_draw_box(b,x,y,w,h,bgc);}\ninline void fl_drw_frame(Fl_Boxtype b,int x,int y,int w,int h,Fl_Color bgc,int=3) {\n    fl_draw_box(b,x,y,w,h,bgc);}\n\ninline void fl_drw_text(Fl_Align align, int x, int y, int w, int h,\n                  Fl_Color fgcolor, int size, Fl_Font style,\n                  const char* s) {\n  fl_font(style,size);\n  fl_color(fgcolor);\n  fl_draw(s,x,y,w,h,align);\n}\n\n// this does not work except for CENTER...\ninline void fl_drw_text_beside(Fl_Align align, int x, int y, int w, int h,\n                  Fl_Color fgcolor, int size, Fl_Font style,\n                  const char* s) {\n  fl_font(style,size);\n  fl_color(fgcolor);\n  fl_draw(s,x,y,w,h,align);\n}\n\ninline void fl_set_font_name(Fl_Font n,const char* s) {Fl::set_font(n,s);}\n\ninline void fl_mapcolor(Fl_Color c, uchar r, uchar g, uchar b) {Fl::set_color(c,r,g,b);}\n\n#define fl_set_clipping(x,y,w,h) fl_push_clip(x,y,w,h)\n#define fl_unset_clipping() fl_pop_clip()\n\n////////////////////////////////////////////////////////////////\n// Forms classes:\n\ninline Fl_Widget* fl_add_new(Fl_Widget* p) {return p;}\ninline Fl_Widget* fl_add_new(uchar t,Fl_Widget* p) {p->type(t); return p;}\n\n#define forms_constructor(type,name) \\\ninline type* name(uchar t,int x,int y,int w,int h,const char* l) { \\\n return (type*)(fl_add_new(t, new type(x,y,w,h,l)));}\n#define forms_constructort(type,name) \\\ninline type* name(uchar t,int x,int y,int w,int h,const char* l) { \\\n return (type*)(fl_add_new(new type(t,x,y,w,h,l)));}\n#define forms_constructorb(type,name) \\\ninline type* name(Fl_Boxtype t,int x,int y,int w,int h,const char* l) { \\\n return (type*)(fl_add_new(new type(t,x,y,w,h,l)));}\n\n#include \"Fl_FormsBitmap.H\"\n#define FL_NORMAL_BITMAP FL_NO_BOX\nforms_constructorb(Fl_FormsBitmap, fl_add_bitmap)\ninline void fl_set_bitmap_data(Fl_Widget* o, int w, int h, const uchar* b) {\n    ((Fl_FormsBitmap*)o)->set(w,h,b);\n}\n\n#include \"Fl_FormsPixmap.H\"\n#define FL_NORMAL_PIXMAP FL_NO_BOX\nforms_constructorb(Fl_FormsPixmap, fl_add_pixmap)\ninline void fl_set_pixmap_data(Fl_Widget* o, char*const* b) {\n    ((Fl_FormsPixmap*)o)->set(b);\n}\n//inline void fl_set_pixmap_file(Fl_Widget*, const char*);\ninline void fl_set_pixmap_align(Fl_Widget* o,Fl_Align a,int,int) {o->align(a);}\n//inline void fl_set_pixmap_colorcloseness(int, int, int);\n\n#include \"Fl_Box.H\"\nforms_constructorb(Fl_Box, fl_add_box)\n\n#include \"Fl_Browser.H\"\nforms_constructor(Fl_Browser, fl_add_browser)\n\ninline void fl_clear_browser(Fl_Widget* o) {\n    ((Fl_Browser*)o)->clear();}\ninline void fl_add_browser_line(Fl_Widget* o, const char* s) {\n    ((Fl_Browser*)o)->add(s);}\ninline void fl_addto_browser(Fl_Widget* o, const char* s) {\n    ((Fl_Browser*)o)->add(s);} /* should also scroll to bottom */\n//inline void fl_addto_browser_chars(Fl_Widget*, const char*)\n//#define fl_append_browser fl_addto_browser_chars\ninline void fl_insert_browser_line(Fl_Widget* o, int n, const char* s) {\n    ((Fl_Browser*)o)->insert(n,s);}\ninline void fl_delete_browser_line(Fl_Widget* o, int n) {\n    ((Fl_Browser*)o)->remove(n);}\ninline void fl_replace_browser_line(Fl_Widget* o, int n, const char* s) {\n    ((Fl_Browser*)o)->replace(n,s);}\ninline char* fl_get_browser_line(Fl_Widget* o, int n) {\n    return (char*)(((Fl_Browser*)o)->text(n));}\ninline int fl_load_browser(Fl_Widget* o, const char* f) {\n    return ((Fl_Browser*)o)->load(f);}\ninline void fl_select_browser_line(Fl_Widget* o, int n) {\n    ((Fl_Browser*)o)->select(n,1);}\ninline void fl_deselect_browser_line(Fl_Widget* o, int n) {\n    ((Fl_Browser*)o)->select(n,0);}\ninline void fl_deselect_browser(Fl_Widget* o) {\n    ((Fl_Browser*)o)->deselect();}\ninline int fl_isselected_browser_line(Fl_Widget* o, int n) {\n    return ((Fl_Browser*)o)->selected(n);}\ninline int fl_get_browser_topline(Fl_Widget* o) {\n    return ((Fl_Browser*)o)->topline();}\ninline int fl_get_browser(Fl_Widget* o) {\n    return ((Fl_Browser*)o)->value();}\ninline int fl_get_browser_maxline(Fl_Widget* o) {\n    return ((Fl_Browser*)o)->size();}\n//linline int fl_get_browser_screenlines(Fl_Widget*);\ninline void fl_set_browser_topline(Fl_Widget* o, int n) {\n    ((Fl_Browser*)o)->topline(n);}\ninline void fl_set_browser_fontsize(Fl_Widget* o, int s) {\n    ((Fl_Browser*)o)->textsize(s);}\ninline void fl_set_browser_fontstyle(Fl_Widget* o, Fl_Font s) {\n    ((Fl_Browser*)o)->textfont(s);}\ninline void fl_set_browser_specialkey(Fl_Widget* o, char c) {\n    ((Fl_Browser*)o)->format_char(c);}\n//inline void fl_set_browser_vscrollbar(Fl_Widget*, int);\n//inline void fl_set_browser_hscrollbar(Fl_Widget*, int);\n//inline void fl_set_browser_leftslider(Fl_Widget*, int);\n//#define fl_set_browser_leftscrollbar fl_set_browser_leftslider\n//inline void fl_set_browser_line_selectable(Fl_Widget*, int, int);\n//inline void fl_get_browser_dimension(Fl_Widget*,int*,int*,int*,int*);\n//inline void fl_set_browser_dblclick_callback(Fl_Widget*,FL_CALLBACKPTR,long);\n//inline void fl_set_browser_xoffset(Fl_Widget*, FL_Coord);\n//inline void fl_set_browser_scrollbarsize(Fl_Widget*, int, int);\ninline void fl_setdisplayed_browser_line(Fl_Widget* o, int n, int i) {\n    ((Fl_Browser*)o)->display(n,i);}\ninline int fl_isdisplayed_browser_line(Fl_Widget* o, int n) {\n    return ((Fl_Browser*)o)->displayed(n);}\n\n#include \"Fl_Button.H\"\n\n#define FL_NORMAL_BUTTON        0\n#define FL_TOUCH_BUTTON         4\n#define FL_INOUT_BUTTON         5\n#define FL_RETURN_BUTTON        6\n#define FL_HIDDEN_RET_BUTTON    7\n#define FL_PUSH_BUTTON          FL_TOGGLE_BUTTON\n#define FL_MENU_BUTTON          9\n\nFL_EXPORT Fl_Button* fl_add_button(uchar t,int x,int y,int w,int h,const char* l);\ninline int fl_get_button(Fl_Widget* b) {return ((Fl_Button*)b)->value();}\ninline void fl_set_button(Fl_Widget* b, int v) {((Fl_Button*)b)->value(v);}\ninline int fl_get_button_numb(Fl_Widget*) {return Fl::event_button();}\ninline void fl_set_button_shortcut(Fl_Widget* b, const char* s,int=0) {\n    ((Fl_Button*)b)->shortcut(s);}\n//#define fl_set_object_shortcut(b,s) fl_set_button_shortcut(b,s)\n\n#include \"Fl_Light_Button.H\"\nforms_constructor(Fl_Light_Button, fl_add_lightbutton)\n\n#include \"Fl_Round_Button.H\"\nforms_constructor(Fl_Round_Button, fl_add_roundbutton)\nforms_constructor(Fl_Round_Button, fl_add_round3dbutton)\n\n#include \"Fl_Check_Button.H\"\nforms_constructor(Fl_Check_Button, fl_add_checkbutton)\n\ninline Fl_Widget* fl_add_bitmapbutton(int t,int x,int y,int w,int h,const char* l) {Fl_Widget* o = fl_add_button(t,x,y,w,h,l); return o;}\ninline void fl_set_bitmapbutton_data(Fl_Widget* o,int a,int b,uchar* c) {\n  (new Fl_Bitmap(c,a,b))->label(o);}  // does not delete old Fl_Bitmap!\n\ninline Fl_Widget* fl_add_pixmapbutton(int t,int x,int y,int w,int h,const char* l) {Fl_Widget* o = fl_add_button(t,x,y,w,h,l); return o;}\ninline void fl_set_pixmapbutton_data(Fl_Widget* o, const char*const* c) {\n  (new Fl_Pixmap(c))->label(o);}  // does not delete old Fl_Pixmap!\n\n// Fl_Canvas object not yet implemented!\n\n#include \"Fl_Chart.H\"\n\nforms_constructor(Fl_Chart, fl_add_chart)\ninline void fl_clear_chart(Fl_Widget* o) {\n  ((Fl_Chart*)o)->clear();}\ninline void fl_add_chart_value(Fl_Widget* o,double v,const char* s,uchar c){\n  ((Fl_Chart*)o)->add(v,s,c);}\ninline void fl_insert_chart_value(Fl_Widget* o, int i, double v, const char* s, uchar c) {\n  ((Fl_Chart*)o)->insert(i,v,s,c);}\ninline void fl_replace_chart_value(Fl_Widget* o, int i, double v, const char* s, uchar c) {\n  ((Fl_Chart*)o)->replace(i,v,s,c);}\ninline void fl_set_chart_bounds(Fl_Widget* o, double a, double b) {\n  ((Fl_Chart*)o)->bounds(a,b);}\ninline void fl_set_chart_maxnumb(Fl_Widget* o, int v) {\n  ((Fl_Chart*)o)->maxsize(v);}\ninline void fl_set_chart_autosize(Fl_Widget* o, int v) {\n  ((Fl_Chart*)o)->autosize(v);}\ninline void fl_set_chart_lstyle(Fl_Widget* o, Fl_Font v) {\n  ((Fl_Chart*)o)->textfont(v);}\ninline void fl_set_chart_lsize(Fl_Widget* o, int v) {\n  ((Fl_Chart*)o)->textsize(v);}\ninline void fl_set_chart_lcolor(Fl_Widget* o, Fl_Color v) {\n  ((Fl_Chart*)o)->textcolor(v);}\n#define fl_set_chart_lcol   fl_set_chart_lcolor\n\n#include \"Fl_Choice.H\"\n\n#define FL_NORMAL_CHOICE        0\n#define FL_NORMAL_CHOICE2       0\n#define FL_DROPLIST_CHOICE      0\n\nforms_constructor(Fl_Choice, fl_add_choice)\ninline void fl_clear_choice(Fl_Widget* o) {\n    ((Fl_Choice*)o)->clear();}\ninline void fl_addto_choice(Fl_Widget* o, const char* s) {\n    ((Fl_Choice*)o)->add(s);}\ninline void fl_replace_choice(Fl_Widget* o, int i, const char* s) {\n    ((Fl_Choice*)o)->replace(i-1,s);}\ninline void fl_delete_choice(Fl_Widget* o, int i) {\n    ((Fl_Choice*)o)->remove(i-1);}\ninline void fl_set_choice(Fl_Widget* o, int i) {\n    ((Fl_Choice*)o)->value(i-1);}\n// inline void fl_set_choice_text(Fl_Widget*, const char*);\ninline int fl_get_choice(Fl_Widget* o) {\n    return ((Fl_Choice*)o)->value()+1;}\n// inline const char* fl_get_choice_item_text(Fl_Widget*, int);\n// inline int fl_get_choice_maxitems(Fl_Widget*);\ninline const char* fl_get_choice_text(Fl_Widget* o) {\n    return ((Fl_Choice*)o)->text();}\ninline void fl_set_choice_fontsize(Fl_Widget* o, int x) {\n    ((Fl_Choice*)o)->textsize(x);}\ninline void fl_set_choice_fontstyle(Fl_Widget* o, Fl_Font x) {\n    ((Fl_Choice*)o)->textfont(x);}\n// inline void fl_set_choice_item_mode(Fl_Widget*, int, unsigned);\n// inline void fl_set_choice_item_shortcut(Fl_Widget*, int, const char*);\n\n#include \"Fl_Clock.H\"\nforms_constructort(Fl_Clock, fl_add_clock)\ninline void fl_get_clock(Fl_Widget* o, int* h, int* m, int* s) {\n    *h = ((Fl_Clock*)o)->hour();\n    *m = ((Fl_Clock*)o)->minute();\n    *s = ((Fl_Clock*)o)->second();\n}\n\n#include \"Fl_Counter.H\"\nforms_constructor(Fl_Counter, fl_add_counter)\ninline void fl_set_counter_value(Fl_Widget* o, double v) {\n    ((Fl_Counter*)o)->value(v);}\ninline void fl_set_counter_bounds(Fl_Widget* o, double a, double b) {\n    ((Fl_Counter*)o)->bounds(a,b);}\ninline void fl_set_counter_step(Fl_Widget* o, double a, double b) {\n    ((Fl_Counter*)o)->step(a,b);}\ninline void fl_set_counter_precision(Fl_Widget* o, int v) {\n    ((Fl_Counter*)o)->precision(v);}\ninline void fl_set_counter_return(Fl_Widget* o, int v) {\n    ((Fl_Counter*)o)->when((Fl_When)(v|FL_WHEN_RELEASE));}\ninline double fl_get_counter_value(Fl_Widget* o) {\n    return ((Fl_Counter*)o)->value();}\ninline void fl_get_counter_bounds(Fl_Widget* o, float* a, float* b) {\n  *a = float(((Fl_Counter*)o)->minimum());\n  *b = float(((Fl_Counter*)o)->maximum());\n}\n//inline void fl_set_counter_filter(Fl_Widget*,const char* (*)(Fl_Widget*,double,int));\n\n// Cursor stuff cannot be emulated because it uses X stuff\ninline void fl_set_cursor(Fl_Window* w, Fl_Cursor c) {w->cursor(c);}\n#define FL_INVISIBLE_CURSOR FL_CURSOR_NONE\n#define FL_DEFAULT_CURSOR FL_CURSOR_DEFAULT\n\n#include \"Fl_Dial.H\"\n\n#define FL_DIAL_COL1 FL_GRAY\n#define FL_DIAL_COL2 37\n\nforms_constructor(Fl_Dial, fl_add_dial)\ninline void fl_set_dial_value(Fl_Widget* o, double v) {\n  ((Fl_Dial*)o)->value(v);}\ninline double fl_get_dial_value(Fl_Widget* o) {\n  return ((Fl_Dial*)o)->value();}\ninline void fl_set_dial_bounds(Fl_Widget* o, double a, double b) {\n  ((Fl_Dial*)o)->bounds(a, b);}\ninline void fl_get_dial_bounds(Fl_Widget* o, float* a, float* b) {\n  *a = float(((Fl_Dial*)o)->minimum());\n  *b = float(((Fl_Dial*)o)->maximum());\n}\ninline void fl_set_dial_return(Fl_Widget* o, int i) {\n  ((Fl_Dial*)o)->when((Fl_When)(i|FL_WHEN_RELEASE));}\ninline void fl_set_dial_angles(Fl_Widget* o, int a, int b) {\n  ((Fl_Dial*)o)->angles((short)a, (short)b);}\n//inline void fl_set_dial_cross(Fl_Widget* o, int);\n// inline void fl_set_dial_direction(Fl_Widget* o, uchar d) {\n//   ((Fl_Dial*)o)->direction(d);}\ninline void fl_set_dial_step(Fl_Widget* o, double v) {\n  ((Fl_Dial*)o)->step(v);}\n\n// Frames:\n\ninline Fl_Widget* fl_add_frame(Fl_Boxtype i,int x,int y,int w,int h,const char* l) {\n  return fl_add_box(i,x-3,y-3,w+6,h+6,l);}\n\n// labelframe nyi\ninline Fl_Widget* fl_add_labelframe(Fl_Boxtype i,int x,int y,int w,int h,const char* l) {\n  Fl_Widget* o = fl_add_box(i,x-3,y-3,w+6,h+6,l);\n  o->align(FL_ALIGN_TOP_LEFT);\n  return o;\n}\n\n#include \"Fl_Free.H\"\ninline Fl_Free*\nfl_add_free(int t,double x,double y,double w,double h,const char* l,\n            FL_HANDLEPTR hdl) {\n return (Fl_Free*)(fl_add_new(\n   new Fl_Free(t,int(x),int(y),int(w),int(h),l,hdl)));\n}\n\n#include \"fl_ask.H\"\n#include \"fl_show_colormap.H\"\n\ninline int fl_show_question(const char* c, int = 0) {return fl_choice(\"%s\",fl_no,fl_yes,0L,c);}\nFL_EXPORT void fl_show_message(const char *,const char *,const char *);\nFL_EXPORT void fl_show_alert(const char *,const char *,const char *,int=0);\nFL_EXPORT int fl_show_question(const char *,const char *,const char *);\ninline const char *fl_show_input(const char *l,const char*d=0) {return fl_input(\"%s\",d,l);}\nFL_EXPORT /*const*/ char *fl_show_simple_input(const char *label, const char *deflt = 0);\nFL_EXPORT int fl_show_choice(\n    const char *m1,\n    const char *m2,\n    const char *m3,\n    int numb,\n    const char *b0,\n    const char *b1,\n    const char *b2);\n\ninline void fl_set_goodies_font(Fl_Font a, Fl_Fontsize b) {fl_message_font(a,b);}\n#define fl_show_messages fl_message\ninline int fl_show_choices(const char* c,int n,const char* b1,const char* b2,\n                           const char* b3, int) {\n  return fl_show_choice(0,c,0,n,b1,b2,b3);\n}\n\n#include \"filename.H\"\n#include \"Fl_File_Chooser.H\"\ninline int do_matching(char* a, const char* b) {return fl_filename_match(a,b);}\n\n// Forms-compatible file chooser (implementation in fselect.C):\nFL_EXPORT char* fl_show_file_selector(const char* message,const char* dir,\n                            const char* pat,const char* fname);\nFL_EXPORT char* fl_get_directory();\nFL_EXPORT char* fl_get_pattern();\nFL_EXPORT char* fl_get_filename();\n\n#include \"Fl_Input.H\"\nforms_constructor(Fl_Input, fl_add_input)\ninline void fl_set_input(Fl_Widget* o, const char* v) {\n    ((Fl_Input*)o)->value(v);}\ninline void fl_set_input_return(Fl_Widget* o, int x) {\n    ((Fl_Input*)o)->when((Fl_When)(x | FL_WHEN_RELEASE));}\ninline void fl_set_input_color(Fl_Widget* o, Fl_Color a, Fl_Color b) {\n    ((Fl_Input*)o)->textcolor(a);\n    ((Fl_Input*)o)->cursor_color(b);\n}\n// inline void fl_set_input_scroll(Fl_Widget*, int);\ninline void fl_set_input_cursorpos(Fl_Widget* o, int x, int /*y*/) {\n  ((Fl_Input*)o)->insert_position(x);}\n// inline void fl_set_input_selected(Fl_Widget*, int);\n// inline void fl_set_input_selected_range(Fl_Widget*, int, int);\n// inline void fl_set_input_maxchars(Fl_Widget*, int);\n// inline void fl_set_input_format(Fl_Widget*, int, int);\n// inline void fl_set_input_hscrollbar(Fl_Widget*, int);\n// inline void fl_set_input_vscrollbar(Fl_Widget*, int);\n// inline void fl_set_input_xoffset(Fl_Widget*, int);\n// inline void fl_set_input_topline(Fl_Widget*, int);\n// inline void fl_set_input_scrollbarsize(Fl_Widget*, int, int);\n// inline int fl_get_input_topline(Fl_Widget*);\n// inline int fl_get_input_screenlines(Fl_Widget*);\ninline int fl_get_input_cursorpos(Fl_Widget* o, int*x, int*y) {\n  *x = ((Fl_Input*)o)->insert_position(); *y = 0; return *x;}\n// inline int fl_get_input_numberoflines(Fl_Widget*);\n// inline void fl_get_input_format(Fl_Widget*, int*, int*);\ninline const char* fl_get_input(Fl_Widget* o) {return ((Fl_Input*)o)->value();}\n\n#include \"Fl_Menu_Button.H\"\n\n// types are not implemented, they all act like FL_PUSH_MENU:\n#define FL_TOUCH_MENU           0\n#define FL_PUSH_MENU            1\n#define FL_PULLDOWN_MENU        2\nforms_constructor(Fl_Menu_Button, fl_add_menu)\n\ninline void fl_clear_menu(Fl_Widget* o) {\n    ((Fl_Menu_Button*)o)->clear();}\ninline void fl_set_menu(Fl_Widget* o, const char* s) {\n    ((Fl_Menu_Button*)o)->clear(); ((Fl_Menu_Button*)o)->add(s);}\ninline void fl_addto_menu(Fl_Widget* o, const char* s) {\n    ((Fl_Menu_Button*)o)->add(s);}\ninline void fl_replace_menu_item(Fl_Widget* o, int i, const char* s) {\n    ((Fl_Menu_Button*)o)->replace(i-1,s);}\ninline void fl_delete_menu_item(Fl_Widget* o, int i) {\n    ((Fl_Menu_Button*)o)->remove(i-1);}\ninline void fl_set_menu_item_shortcut(Fl_Widget* o, int i, const char* s) {\n    ((Fl_Menu_Button*)o)->shortcut(i-1,fl_old_shortcut(s));}\ninline void fl_set_menu_item_mode(Fl_Widget* o, int i, long x) {\n    ((Fl_Menu_Button*)o)->mode(i-1,(int)x);}\ninline void fl_show_menu_symbol(Fl_Widget*, int ) {\n/*    ((Fl_Menu_Button*)o)->show_menu_symbol(i); */}\n// inline void fl_set_menu_popup(Fl_Widget*, int);\ninline int fl_get_menu(Fl_Widget* o) {\n    return ((Fl_Menu_Button*)o)->value()+1;}\ninline const char* fl_get_menu_item_text(Fl_Widget* o, int i) {\n    return ((Fl_Menu_Button*)o)->text(i);}\ninline int fl_get_menu_maxitems(Fl_Widget* o) {\n    return ((Fl_Menu_Button*)o)->size();}\ninline int fl_get_menu_item_mode(Fl_Widget* o, int i) {\n    return ((Fl_Menu_Button*)o)->mode(i);}\ninline const char* fl_get_menu_text(Fl_Widget* o) {\n    return ((Fl_Menu_Button*)o)->text();}\n\n#include \"Fl_Positioner.H\"\n#define FL_NORMAL_POSITIONER    0\nforms_constructor(Fl_Positioner, fl_add_positioner)\ninline void fl_set_positioner_xvalue(Fl_Widget* o, double v) {\n    ((Fl_Positioner*)o)->xvalue(v);}\ninline double fl_get_positioner_xvalue(Fl_Widget* o) {\n    return ((Fl_Positioner*)o)->xvalue();}\ninline void fl_set_positioner_xbounds(Fl_Widget* o, double a, double b) {\n    ((Fl_Positioner*)o)->xbounds(a,b);}\ninline void fl_get_positioner_xbounds(Fl_Widget* o, float* a, float* b) {\n  *a = float(((Fl_Positioner*)o)->xminimum());\n  *b = float(((Fl_Positioner*)o)->xmaximum());\n}\ninline void fl_set_positioner_yvalue(Fl_Widget* o, double v) {\n    ((Fl_Positioner*)o)->yvalue(v);}\ninline double fl_get_positioner_yvalue(Fl_Widget* o) {\n    return ((Fl_Positioner*)o)->yvalue();}\ninline void fl_set_positioner_ybounds(Fl_Widget* o, double a, double b) {\n    ((Fl_Positioner*)o)->ybounds(a,b);}\ninline void fl_get_positioner_ybounds(Fl_Widget* o, float* a, float* b) {\n  *a = float(((Fl_Positioner*)o)->yminimum());\n  *b = float(((Fl_Positioner*)o)->ymaximum());\n}\ninline void fl_set_positioner_xstep(Fl_Widget* o, double v) {\n    ((Fl_Positioner*)o)->xstep(v);}\ninline void fl_set_positioner_ystep(Fl_Widget* o, double v) {\n    ((Fl_Positioner*)o)->ystep(v);}\ninline void fl_set_positioner_return(Fl_Widget* o, int v) {\n    ((Fl_Positioner*)o)->when((Fl_When)(v|FL_WHEN_RELEASE));}\n\n#include \"Fl_Slider.H\"\n\n#define FL_HOR_BROWSER_SLIDER FL_HOR_SLIDER\n#define FL_VERT_BROWSER_SLIDER FL_VERT_SLIDER\n\nforms_constructort(Fl_Slider, fl_add_slider)\n#define FL_SLIDER_COL1 FL_GRAY\ninline void fl_set_slider_value(Fl_Widget* o, double v) {\n    ((Fl_Slider*)o)->value(v);}\ninline double fl_get_slider_value(Fl_Widget* o) {\n    return ((Fl_Slider*)o)->value();}\ninline void fl_set_slider_bounds(Fl_Widget* o, double a, double b) {\n    ((Fl_Slider*)o)->bounds(a, b);}\ninline void fl_get_slider_bounds(Fl_Widget* o, float* a, float* b) {\n  *a = float(((Fl_Slider*)o)->minimum());\n  *b = float(((Fl_Slider*)o)->maximum());\n}\ninline void fl_set_slider_return(Fl_Widget* o, int i) {\n    ((Fl_Slider*)o)->when((Fl_When)(i|FL_WHEN_RELEASE));}\ninline void fl_set_slider_step(Fl_Widget* o, double v) {\n    ((Fl_Slider*)o)->step(v);}\n// inline void fl_set_slider_increment(Fl_Widget* o, double v, double);\ninline void fl_set_slider_size(Fl_Widget* o, double v) {\n    ((Fl_Slider*)o)->slider_size(v);}\n\n#include \"Fl_Value_Slider.H\"\nforms_constructor(Fl_Value_Slider, fl_add_valslider)\n\ninline void fl_set_slider_precision(Fl_Widget* o, int i) {\n    ((Fl_Value_Slider*)o)->precision(i);}\n// filter function!\n\n// The forms text object was the same as an Fl_Box except it inverted the\n// meaning of FL_ALIGN_INSIDE.  Implementation in forms.cxx\nclass FL_EXPORT Fl_FormsText : public Fl_Widget {\nprotected:\n    void draw() FL_OVERRIDE;\npublic:\n    Fl_FormsText(Fl_Boxtype b, int X, int Y, int W, int H, const char* l=0)\n        : Fl_Widget(X,Y,W,H,l) {box(b); align(FL_ALIGN_LEFT);}\n};\n#define FL_NORMAL_TEXT FL_NO_BOX\nforms_constructorb(Fl_FormsText, fl_add_text)\n\n#include \"Fl_Timer.H\"\nforms_constructort(Fl_Timer, fl_add_timer)\ninline void fl_set_timer(Fl_Widget* o, double v) {((Fl_Timer*)o)->value(v);}\ninline double fl_get_timer(Fl_Widget* o) {return ((Fl_Timer*)o)->value();}\ninline void fl_suspend_timer(Fl_Widget* o) {((Fl_Timer*)o)->suspended(1);}\ninline void fl_resume_timer(Fl_Widget* o) {((Fl_Timer*)o)->suspended(0);}\ninline void fl_set_timer_countup(Fl_Widget* o,char d) {((Fl_Timer*)o)->direction(d);}\nvoid FL_EXPORT fl_gettime(long* sec, long* usec);\n\n// Fl_XYPlot nyi\n\n\n// stuff from DDForms:\n\ninline int fl_double_click() {return Fl::event_clicks();}\ninline void fl_draw() {Fl::flush();}\n\n#endif  /* define __FORMS_H__ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/gl.h",
    "content": "//\n// OpenGL header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2018 by Bill Spitzak and others.\n//\n// You must include this instead of GL/gl.h to get the Microsoft\n// APIENTRY stuff included (from <windows.h>) prior to the OpenGL\n// header files.\n//\n// This file also provides \"missing\" OpenGL functions, and\n// gl_start() and gl_finish() to allow OpenGL to be used in any window\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n/**\n \\file gl.h\n This file defines wrapper functions for OpenGL in FLTK\n\n To use OpenGL from within an FLTK application you MUST use gl_visual()\n to select the default visual before doing show() on any windows. Mesa\n will crash if you try to use a visual not returned by glxChooseVisual.\n\n Historically, this did not always work well with Fl_Double_Window's!\n It can try to draw into the front buffer.\n Depending on the system this might either\n crash or do nothing (when pixmaps are being used as back buffer\n and GL is being done by hardware), work correctly (when GL is done\n with software, such as Mesa), or draw into the front buffer and\n be erased when the buffers are swapped (when double buffer hardware\n is being used)\n */\n\n#ifndef FL_gl_H\n#  define FL_gl_H\n\n#  include \"Enumerations.H\" // for color names\n#  ifdef _WIN32\n#    include <windows.h>\n#  endif\n#  ifndef APIENTRY\n#    if defined(__CYGWIN__)\n#      define APIENTRY __attribute__ ((__stdcall__))\n#    else\n#      define APIENTRY\n#    endif\n#  endif\n\n#  ifdef __APPLE__ // PORTME: OpenGL path abstraction\n#    ifndef GL_SILENCE_DEPRECATION\n#      define GL_SILENCE_DEPRECATION 1\n#    endif\n#    if !defined(__gl3_h_) // make sure OpenGL/gl3.h was not included before\n#      include <OpenGL/gl.h>\n#    endif\n#  else\n#    include <GL/gl.h>\n#  endif  // __APPLE__ // PORTME: OpenGL Path abstraction\n\nFL_EXPORT void gl_start();\nFL_EXPORT void gl_finish();\n\nFL_EXPORT void gl_color(Fl_Color i);\n/** back compatibility */\ninline void gl_color(int c) {gl_color((Fl_Color)c);}\n\nFL_EXPORT void gl_rect(int x,int y,int w,int h);\nFL_EXPORT void gl_rectf(int x,int y,int w,int h);\n\nFL_EXPORT void gl_font(int fontid, int size);\nFL_EXPORT int  gl_height();\nFL_EXPORT int  gl_descent();\nFL_EXPORT double gl_width(const char *);\nFL_EXPORT double gl_width(const char *, int n);\nFL_EXPORT double gl_width(uchar);\n\nFL_EXPORT void gl_draw(const char*);\nFL_EXPORT void gl_draw(const char*, int n);\nFL_EXPORT void gl_draw(const char*, int x, int y);\nFL_EXPORT void gl_draw(const char*, float x, float y);\nFL_EXPORT void gl_draw(const char*, int n, int x, int y);\nFL_EXPORT void gl_draw(const char*, int n, float x, float y);\nFL_EXPORT void gl_draw(const char*, int x, int y, int w, int h, Fl_Align);\nFL_EXPORT void gl_measure(const char*, int& x, int& y);\nFL_EXPORT void gl_texture_pile_height(int max);\nFL_EXPORT int  gl_texture_pile_height();\nFL_EXPORT void gl_texture_reset();\n\nFL_EXPORT void gl_draw_image(const uchar *, int x,int y,int w,int h, int d=3, int ld=0);\n\n#endif // !FL_gl_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/gl2opengl.h",
    "content": "/*      gl.h\n\n        GL to OpenGL translator.\n        If you include this, you might be able to port old GL programs.\n        There are also much better emulators available on the net.\n\n*/\n\n#ifndef _FL_gl2opengl_h_\n#define _FL_gl2opengl_h_\n\n#include <FL/gl.h>\n#include \"gl_draw.H\"\n\ninline void clear() {glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);}\n#define RGBcolor(r,g,b) glColor3ub(r,g,b)\n#define bgnline() glBegin(GL_LINE_STRIP)\n#define bgnpolygon() glBegin(GL_POLYGON)\n#define bgnclosedline() glBegin(GL_LINE_LOOP)\n#define endline() glEnd()\n#define endpolygon() glEnd()\n#define endclosedline() glEnd()\n#define v2f(v) glVertex2fv(v)\n#define v2s(v) glVertex2sv(v)\n#define cmov(x,y,z) glRasterPos3f(x,y,z)\n#define charstr(s) gl_draw(s)\n#define fmprstr(s) gl_draw(s)\ntypedef float Matrix[4][4];\ninline void pushmatrix() {glPushMatrix();}\ninline void popmatrix() {glPopMatrix();}\ninline void multmatrix(Matrix m) {glMultMatrixf((float *)m);}\ninline void color(int n) {glIndexi(n);}\ninline void rect(int x,int y,int r,int t) {gl_rect(x,y,r-x,t-y);}\ninline void rectf(int x,int y,int r,int t) {glRectf(x,y,r+1,t+1);}\ninline void recti(int x,int y,int r,int t) {gl_rect(x,y,r-x,t-y);}\ninline void rectfi(int x,int y,int r,int t) {glRecti(x,y,r+1,t+1);}\ninline void rects(int x,int y,int r,int t) {gl_rect(x,y,r-x,t-y);}\ninline void rectfs(int x,int y,int r,int t) {glRects(x,y,r+1,t+1);}\n\n#endif /* _FL_gl2opengl_h_ */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/gl_draw.H",
    "content": "//\n// OpenGL header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#include \"gl.h\"\n\nextern FL_EXPORT void gl_remove_displaylist_fonts();\n"
  },
  {
    "path": "Game Trainers/common/include/FL/glu.h",
    "content": "//\n// GLu header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2010 by Bill Spitzak and others.\n//\n// You must include this instead of GL/gl.h to get the Microsoft\n// APIENTRY stuff included (from <windows.h>) prior to the OpenGL\n// header files.\n//\n// This file also provides \"missing\" OpenGL functions, and\n// gl_start() and gl_finish() to allow OpenGL to be used in any window\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#ifndef FL_glu_H\n#  define FL_glu_H\n\n#  include \"Enumerations.H\" // for color names\n#  ifdef _WIN32\n#    include <windows.h>\n#  endif\n#  ifndef APIENTRY\n#    if defined(__CYGWIN__)\n#      define APIENTRY __attribute__ ((__stdcall__))\n#    else\n#      define APIENTRY\n#    endif\n#  endif\n\n#  ifdef __APPLE__  // PORTME: OpenGL Path abstraction\n#    include <OpenGL/glu.h>\n#  else\n#    include <GL/glu.h>\n#  endif\n\n#endif // !FL_glu_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/glut.H",
    "content": "//\n// GLUT emulation header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// Emulation of GLUT using fltk.\n\n// GLUT is Copyright (c) Mark J. Kilgard, 1994, 1995, 1996:\n// \"This program is freely distributable without licensing fees  and is\n// provided without guarantee or warrantee expressed or  implied. This\n// program is -not- in the public domain.\"\n\n// Although I have copied the GLUT API, none of my code is based on\n// any GLUT implementation details and is therefore covered by the LGPL.\n\n// Commented out lines indicate parts of GLUT that are not emulated.\n\n// Notes: as pointed out in STR #3458 the current GLUT window,\n// i.e. the global static variable 'glut_window' can be NULL ...\n//  (a) if not (yet) initialized\n//  (b) if the current GLUT window is deleted at any time.\n// The FLTK implementation silently ignores function calls if the current\n// window is NULL to avoid dereferencing a NULL pointer. This is obviously\n// compatible with GLUT version 3.7 according to comment #5 on STR #3458.\n// According to the same comment FreeGLUT 3.0 would issue an error message\n// and quit.\n// Albrecht-S, Oct 2023\n\n#ifndef _FL_glut_H_\n#  define _FL_glut_H_\n\n#  include \"gl.h\"\n\n\n#  include \"Fl.H\"\n#  include \"Fl_Gl_Window.H\"\n\n/**\n  GLUT is emulated using this window class and these static variables\n  (plus several more static variables hidden in glut_compatibility.cxx):\n*/\nclass FL_EXPORT Fl_Glut_Window : public Fl_Gl_Window {\n  void _init();\n  int mouse_down;\nprotected:\n  void draw() FL_OVERRIDE;\n  void draw_overlay() FL_OVERRIDE;\n  int handle(int) FL_OVERRIDE;\npublic: // so the inline functions work\n  int number;\n  int menu[3];\n  void make_current();\n  void (*display)();\n  void (*overlaydisplay)();\n  void (*reshape)(int w, int h);\n  void (*keyboard)(uchar, int x, int y);\n  void (*mouse)(int b, int state, int x, int y);\n  void (*motion)(int x, int y);\n  void (*passivemotion)(int x, int y);\n  void (*entry)(int);\n  void (*visibility)(int);\n  void (*special)(int, int x, int y);\n  Fl_Glut_Window(int w, int h, const char *t=0);\n  Fl_Glut_Window(int x, int y, int w, int h, const char *t=0);\n  ~Fl_Glut_Window();\n};\n\nextern FL_EXPORT Fl_Glut_Window *glut_window;   // the current window\nextern FL_EXPORT int glut_menu;                 // the current menu\n\n// function pointers that are not per-window:\nextern FL_EXPORT void (*glut_idle_function)();\nextern FL_EXPORT void (*glut_menustate_function)(int);\nextern FL_EXPORT void (*glut_menustatus_function)(int,int,int);\n\n////////////////////////////////////////////////////////////////\n\n//#  define GLUT_API_VERSION This does not match any version of GLUT exactly...\n\nFL_EXPORT void glutInit(int *argcp, char **argv); // creates first window\n\nFL_EXPORT void glutInitDisplayMode(unsigned int mode);\n// the FL_ symbols have the same value as the GLUT ones:\n#  define GLUT_RGB            FL_RGB\n#  define GLUT_RGBA           FL_RGB\n#  define GLUT_INDEX          FL_INDEX\n#  define GLUT_SINGLE         FL_SINGLE\n#  define GLUT_DOUBLE         FL_DOUBLE\n#  define GLUT_ACCUM          FL_ACCUM\n#  define GLUT_ALPHA          FL_ALPHA\n#  define GLUT_DEPTH          FL_DEPTH\n#  define GLUT_STENCIL        FL_STENCIL\n#  define GLUT_MULTISAMPLE    FL_MULTISAMPLE\n#  define GLUT_STEREO         FL_STEREO\n// #  define GLUT_LUMINANCE   512\n\nFL_EXPORT void glutInitWindowPosition(int x, int y);\n\nFL_EXPORT void glutInitWindowSize(int w, int h);\n\nFL_EXPORT void glutMainLoop();\n\nFL_EXPORT int glutCreateWindow(char *title);\nFL_EXPORT int glutCreateWindow(const char *title);\n\nFL_EXPORT int glutCreateSubWindow(int win, int x, int y, int width, int height);\n\nFL_EXPORT void glutDestroyWindow(int win);\n\ninline void glutPostRedisplay() {\n  if (glut_window) glut_window->redraw();\n}\n\nFL_EXPORT void glutPostWindowRedisplay(int win);\n\nFL_EXPORT void glutSwapBuffers();\n\ninline int glutGetWindow() {\n  return glut_window ? glut_window->number : 0;\n}\n\nFL_EXPORT void glutSetWindow(int win);\n\ninline void glutSetWindowTitle(char *t) {\n  if (glut_window) glut_window->label(t);\n}\n\ninline void glutSetIconTitle(char *t) {\n  if (glut_window) glut_window->iconlabel(t);\n}\n\ninline void glutPositionWindow(int x, int y) {\n  if (glut_window) glut_window->position(x,y);\n}\n\ninline void glutReshapeWindow(int w, int h) {\n  if (glut_window) glut_window->size(w,h);\n}\n\ninline void glutPopWindow() {\n  if (glut_window) glut_window->show();\n}\n\ninline void glutPushWindow() { /* do nothing */ }\n\ninline void glutIconifyWindow() {\n  if (glut_window) glut_window->iconize();\n}\n\ninline void glutShowWindow() {\n  if (glut_window) glut_window->show();\n}\n\ninline void glutHideWindow() {\n  if (glut_window) glut_window->hide();\n}\n\ninline void glutFullScreen() {\n  if (glut_window) glut_window->fullscreen();\n}\n\ninline void glutSetCursor(Fl_Cursor cursor) {\n  if (glut_window) glut_window->cursor(cursor);\n}\n\n// notice that the numeric values are different than glut:\n#  define GLUT_CURSOR_RIGHT_ARROW               ((Fl_Cursor)2)\n#  define GLUT_CURSOR_LEFT_ARROW                ((Fl_Cursor)67)\n#  define GLUT_CURSOR_INFO                      FL_CURSOR_HAND\n#  define GLUT_CURSOR_DESTROY                   ((Fl_Cursor)45)\n#  define GLUT_CURSOR_HELP                      FL_CURSOR_HELP\n#  define GLUT_CURSOR_CYCLE                     ((Fl_Cursor)26)\n#  define GLUT_CURSOR_SPRAY                     ((Fl_Cursor)63)\n#  define GLUT_CURSOR_WAIT                      FL_CURSOR_WAIT\n#  define GLUT_CURSOR_TEXT                      FL_CURSOR_INSERT\n#  define GLUT_CURSOR_CROSSHAIR                 FL_CURSOR_CROSS\n#  define GLUT_CURSOR_UP_DOWN                   FL_CURSOR_NS\n#  define GLUT_CURSOR_LEFT_RIGHT                FL_CURSOR_WE\n#  define GLUT_CURSOR_TOP_SIDE                  FL_CURSOR_N\n#  define GLUT_CURSOR_BOTTOM_SIDE               FL_CURSOR_S\n#  define GLUT_CURSOR_LEFT_SIDE                 FL_CURSOR_W\n#  define GLUT_CURSOR_RIGHT_SIDE                FL_CURSOR_E\n#  define GLUT_CURSOR_TOP_LEFT_CORNER           FL_CURSOR_NW\n#  define GLUT_CURSOR_TOP_RIGHT_CORNER          FL_CURSOR_NE\n#  define GLUT_CURSOR_BOTTOM_RIGHT_CORNER       FL_CURSOR_SE\n#  define GLUT_CURSOR_BOTTOM_LEFT_CORNER        FL_CURSOR_SW\n#  define GLUT_CURSOR_INHERIT                   FL_CURSOR_DEFAULT\n#  define GLUT_CURSOR_NONE                      FL_CURSOR_NONE\n#  define GLUT_CURSOR_FULL_CROSSHAIR            FL_CURSOR_CROSS\n\ninline void glutWarpPointer(int, int) { /* do nothing */ }\n\ninline void glutEstablishOverlay() {\n  if (glut_window) glut_window->make_overlay_current();\n}\n\ninline void glutRemoveOverlay() {\n  if (glut_window) glut_window->hide_overlay();\n}\n\ninline void glutUseLayer(GLenum layer) {\n  if (!glut_window)\n    return;\n  layer ? glut_window->make_overlay_current() : glut_window->make_current();\n}\n\nenum {GLUT_NORMAL, GLUT_OVERLAY};\n\ninline void glutPostOverlayRedisplay() {\n  if (glut_window) glut_window->redraw_overlay();\n}\n\ninline void glutShowOverlay() {\n  if (glut_window) glut_window->redraw_overlay();\n}\n\ninline void glutHideOverlay() {\n  if (glut_window) glut_window->hide_overlay();\n}\n\nFL_EXPORT int glutCreateMenu(void (*)(int));\n\nFL_EXPORT void glutDestroyMenu(int menu);\n\ninline int glutGetMenu() {return glut_menu;}\n\ninline void glutSetMenu(int m) {glut_menu = m;}\n\nFL_EXPORT void glutAddMenuEntry(const char *label, int value);\n\nFL_EXPORT void glutAddSubMenu(char *label, int submenu);\n\nFL_EXPORT void glutChangeToMenuEntry(int item, char *labela, int value);\n\nFL_EXPORT void glutChangeToSubMenu(int item, char *label, int submenu);\n\nFL_EXPORT void glutRemoveMenuItem(int item);\n\ninline void glutAttachMenu(int b) {\n  if (glut_window) glut_window->menu[b] = glut_menu;\n}\n\ninline void glutDetachMenu(int b) {\n  if (glut_window) glut_window->menu[b] = 0;\n}\n\ninline void glutDisplayFunc(void (*f)()) {\n  if (glut_window) glut_window->display = f;\n}\n\ninline void glutReshapeFunc(void (*f)(int w, int h)) {\n  if (glut_window) glut_window->reshape = f;\n}\n\ninline void glutKeyboardFunc(void (*f)(uchar key, int x, int y)) {\n  if (glut_window) glut_window->keyboard = f;\n}\n\ninline void glutMouseFunc(void (*f)(int b, int state, int x, int y)) {\n  if (glut_window) glut_window->mouse = f;\n}\n\n#  define GLUT_LEFT_BUTTON              0\n#  define GLUT_MIDDLE_BUTTON            1\n#  define GLUT_RIGHT_BUTTON             2\n#  define GLUT_DOWN                     0\n#  define GLUT_UP                       1\n\ninline void glutMotionFunc(void (*f)(int x, int y)) {\n  if (glut_window) glut_window->motion = f;\n}\n\ninline void glutPassiveMotionFunc(void (*f)(int x, int y)) {\n  if (glut_window) glut_window->passivemotion = f;\n}\n\ninline void glutEntryFunc(void (*f)(int s)) {\n  if (glut_window) glut_window->entry = f;\n}\n\nenum {GLUT_LEFT, GLUT_ENTERED};\n\ninline void glutVisibilityFunc(void (*f)(int s)) {\n  if (glut_window) glut_window->visibility = f;\n}\nenum {GLUT_NOT_VISIBLE, GLUT_VISIBLE};\n\nFL_EXPORT void glutIdleFunc(void (*f)());\n\ninline void glutTimerFunc(unsigned int msec, void (*f)(int), int value) {\n  Fl::add_timeout(msec*.001, (void (*)(void *))f, (void *)(fl_intptr_t)value);\n}\n\ninline void glutMenuStateFunc(void (*f)(int state)) {\n  glut_menustate_function = f;}\n\ninline void glutMenuStatusFunc(void (*f)(int status, int x, int y)) {\n  glut_menustatus_function = f;}\nenum {GLUT_MENU_NOT_IN_USE, GLUT_MENU_IN_USE};\n\ninline void glutSpecialFunc(void (*f)(int key, int x, int y)) {\n  if (glut_window) glut_window->special = f;\n}\n\n#  define GLUT_KEY_F1                   1\n#  define GLUT_KEY_F2                   2\n#  define GLUT_KEY_F3                   3\n#  define GLUT_KEY_F4                   4\n#  define GLUT_KEY_F5                   5\n#  define GLUT_KEY_F6                   6\n#  define GLUT_KEY_F7                   7\n#  define GLUT_KEY_F8                   8\n#  define GLUT_KEY_F9                   9\n#  define GLUT_KEY_F10                  10\n#  define GLUT_KEY_F11                  11\n#  define GLUT_KEY_F12                  12\n// WARNING: Different values than GLUT uses:\n#  define GLUT_KEY_LEFT                 FL_Left\n#  define GLUT_KEY_UP                   FL_Up\n#  define GLUT_KEY_RIGHT                FL_Right\n#  define GLUT_KEY_DOWN                 FL_Down\n#  define GLUT_KEY_PAGE_UP              FL_Page_Up\n#  define GLUT_KEY_PAGE_DOWN            FL_Page_Down\n#  define GLUT_KEY_HOME                 FL_Home\n#  define GLUT_KEY_END                  FL_End\n#  define GLUT_KEY_INSERT               FL_Insert\n\n// inline void glutSpaceballMotionFunc(void (*)(int x, int y, int z));\n\n// inline void glutSpaceballRotateFunc(void (*)(int x, int y, int z));\n\n// inline void glutSpaceballButtonFunc(void (*)(int button, int state));\n\n// inline void glutButtonBoxFunc(void (*)(int button, int state));\n\n// inline void glutDialsFunc(void (*)(int dial, int value));\n\n// inline void glutTabletMotionFunc(void (*)(int x, int y));\n\n// inline void glutTabletButtonFunc(void (*)(int button, int state, int x, int y));\n\ninline void glutOverlayDisplayFunc(void (*f)()) {\n  if (glut_window) glut_window->overlaydisplay = f;\n}\n\n// inline void glutWindowStatusFunc(void (*)(int state));\n// enum {GLUT_HIDDEN, GLUT_FULLY_RETAINED, GLUT_PARTIALLY_RETAINED,\n//       GLUT_FULLY_COVERED};\n\n// inline void glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);\n\n// inline GLfloat glutGetColor(int ndx, int component);\n// #define GLUT_RED                     0\n// #define GLUT_GREEN                   1\n// #define GLUT_BLUE                    2\n\n// inline void glutCopyColormap(int win);\n\n// Warning: values are changed from GLUT!\n// Also relies on the GL_ symbols having values greater than 100\nFL_EXPORT int glutGet(GLenum type);\nenum {\n  GLUT_RETURN_ZERO = 0,\n  GLUT_WINDOW_X,\n  GLUT_WINDOW_Y,\n  GLUT_WINDOW_WIDTH,\n  GLUT_WINDOW_HEIGHT,\n  GLUT_WINDOW_PARENT,\n  GLUT_SCREEN_WIDTH,\n  GLUT_SCREEN_HEIGHT,\n  GLUT_MENU_NUM_ITEMS,\n  GLUT_DISPLAY_MODE_POSSIBLE,\n  GLUT_INIT_WINDOW_X,\n  GLUT_INIT_WINDOW_Y,\n  GLUT_INIT_WINDOW_WIDTH,\n  GLUT_INIT_WINDOW_HEIGHT,\n  GLUT_INIT_DISPLAY_MODE,\n  GLUT_WINDOW_BUFFER_SIZE,\n  GLUT_VERSION,\n//GLUT_WINDOW_NUM_CHILDREN,\n//GLUT_WINDOW_CURSOR,\n//GLUT_SCREEN_WIDTH_MM,\n//GLUT_SCREEN_HEIGHT_MM,\n  GLUT_ELAPSED_TIME\n};\n\n#  define GLUT_WINDOW_STENCIL_SIZE      GL_STENCIL_BITS\n#  define GLUT_WINDOW_DEPTH_SIZE        GL_DEPTH_BITS\n#  define GLUT_WINDOW_RED_SIZE          GL_RED_BITS\n#  define GLUT_WINDOW_GREEN_SIZE        GL_GREEN_BITS\n#  define GLUT_WINDOW_BLUE_SIZE         GL_BLUE_BITS\n#  define GLUT_WINDOW_ALPHA_SIZE        GL_ALPHA_BITS\n#  define GLUT_WINDOW_ACCUM_RED_SIZE    GL_ACCUM_RED_BITS\n#  define GLUT_WINDOW_ACCUM_GREEN_SIZE  GL_ACCUM_GREEN_BITS\n#  define GLUT_WINDOW_ACCUM_BLUE_SIZE   GL_ACCUM_BLUE_BITS\n#  define GLUT_WINDOW_ACCUM_ALPHA_SIZE  GL_ACCUM_ALPHA_BITS\n#  define GLUT_WINDOW_DOUBLEBUFFER      GL_DOUBLEBUFFER\n#  define GLUT_WINDOW_RGBA              GL_RGBA\n#  define GLUT_WINDOW_COLORMAP_SIZE     GL_INDEX_BITS\n#  ifdef GL_SAMPLES_SGIS\n#    define GLUT_WINDOW_NUM_SAMPLES     GL_SAMPLES_SGIS\n#  else\n#    define GLUT_WINDOW_NUM_SAMPLES     GLUT_RETURN_ZERO\n#  endif\n#  define GLUT_WINDOW_STEREO            GL_STEREO\n\n#  define GLUT_HAS_KEYBOARD             600\n#  define GLUT_HAS_MOUSE                601\n#  define GLUT_HAS_SPACEBALL            602\n#  define GLUT_HAS_DIAL_AND_BUTTON_BOX  603\n#  define GLUT_HAS_TABLET               604\n#  define GLUT_NUM_MOUSE_BUTTONS        605\n#  define GLUT_NUM_SPACEBALL_BUTTONS    606\n#  define GLUT_NUM_BUTTON_BOX_BUTTONS   607\n#  define GLUT_NUM_DIALS                608\n#  define GLUT_NUM_TABLET_BUTTONS       609\nFL_EXPORT int glutDeviceGet(GLenum type);\n\n// WARNING: these values are different than GLUT uses:\n#  define GLUT_ACTIVE_SHIFT               FL_SHIFT\n#  define GLUT_ACTIVE_CTRL                FL_CTRL\n#  define GLUT_ACTIVE_ALT                 FL_ALT\n\ninline int glutGetModifiers() {\n  return Fl::event_state() & (GLUT_ACTIVE_SHIFT | GLUT_ACTIVE_CTRL | GLUT_ACTIVE_ALT);\n}\n\nFL_EXPORT int glutLayerGet(GLenum);\n#  define GLUT_OVERLAY_POSSIBLE         800\n//#define GLUT_LAYER_IN_USE             801\n//#define GLUT_HAS_OVERLAY              802\n#  define GLUT_TRANSPARENT_INDEX        803\n#  define GLUT_NORMAL_DAMAGED           804\n#  define GLUT_OVERLAY_DAMAGED          805\n\nextern \"C\" {\ntypedef void (*GLUTproc)();\n}\n\nFL_EXPORT GLUTproc glutGetProcAddress(const char *procName);\n\n// inline int glutVideoResizeGet(GLenum param);\n// #define GLUT_VIDEO_RESIZE_POSSIBLE     900\n// #define GLUT_VIDEO_RESIZE_IN_USE       901\n// #define GLUT_VIDEO_RESIZE_X_DELTA      902\n// #define GLUT_VIDEO_RESIZE_Y_DELTA      903\n// #define GLUT_VIDEO_RESIZE_WIDTH_DELTA  904\n// #define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 905\n// #define GLUT_VIDEO_RESIZE_X            906\n// #define GLUT_VIDEO_RESIZE_Y            907\n// #define GLUT_VIDEO_RESIZE_WIDTH        908\n// #define GLUT_VIDEO_RESIZE_HEIGHT       909\n\n// inline void glutSetupVideoResizing();\n\n// inline void glutStopVideoResizing();\n\n// inline void glutVideoResize(int x, int y, int width, int height);\n\n// inline void glutVideoPan(int x, int y, int width, int height);\n\n// Font argument must be a void* for compatibility, so...\n/** fltk glut font/size attributes used in the glutXXX functions */\nstruct Fl_Glut_Bitmap_Font {Fl_Font font; Fl_Fontsize size;};\n\nextern FL_EXPORT struct Fl_Glut_Bitmap_Font\n  glutBitmap9By15, glutBitmap8By13, glutBitmapTimesRoman10,\n  glutBitmapTimesRoman24, glutBitmapHelvetica10, glutBitmapHelvetica12,\n  glutBitmapHelvetica18;\n#  define GLUT_BITMAP_9_BY_15             (&glutBitmap9By15)\n#  define GLUT_BITMAP_8_BY_13             (&glutBitmap8By13)\n#  define GLUT_BITMAP_TIMES_ROMAN_10      (&glutBitmapTimesRoman10)\n#  define GLUT_BITMAP_TIMES_ROMAN_24      (&glutBitmapTimesRoman24)\n#  define GLUT_BITMAP_HELVETICA_10        (&glutBitmapHelvetica10)\n#  define GLUT_BITMAP_HELVETICA_12        (&glutBitmapHelvetica12)\n#  define GLUT_BITMAP_HELVETICA_18        (&glutBitmapHelvetica18)\n\nFL_EXPORT void glutBitmapCharacter(void *font, int character);\nFL_EXPORT int glutBitmapHeight(void *font);\nFL_EXPORT int glutBitmapLength(void *font, const unsigned char *string);\nFL_EXPORT void glutBitmapString(void *font, const unsigned char *string);\nFL_EXPORT int glutBitmapWidth(void *font, int character);\n\nFL_EXPORT int glutExtensionSupported(char *name);\n\n/* GLUT stroked font sub-API */\nstruct Fl_Glut_StrokeVertex {\n  GLfloat X, Y;\n};\n\nstruct Fl_Glut_StrokeStrip {\n  int Number;\n  const Fl_Glut_StrokeVertex* Vertices;\n};\n\nstruct Fl_Glut_StrokeChar {\n  GLfloat Right;\n  int Number;\n  const Fl_Glut_StrokeStrip* Strips;\n};\n\nstruct Fl_Glut_StrokeFont {\n  char* Name;                           // The source font name\n  int Quantity;                         // Number of chars in font\n  GLfloat Height;                       // Height of the characters\n  const Fl_Glut_StrokeChar** Characters;// The characters mapping\n};\nextern FL_EXPORT Fl_Glut_StrokeFont glutStrokeRoman;\nextern FL_EXPORT Fl_Glut_StrokeFont glutStrokeMonoRoman;\n#  define GLUT_STROKE_ROMAN             (&glutStrokeRoman)\n#  define GLUT_STROKE_MONO_ROMAN        (&glutStrokeMonoRoman)\n\nFL_EXPORT void glutStrokeCharacter(void *font, int character);\nFL_EXPORT GLfloat glutStrokeHeight(void *font);\nFL_EXPORT int glutStrokeLength(void *font, const unsigned char *string);\nFL_EXPORT void glutStrokeString(void *font, const unsigned char *string);\nFL_EXPORT int glutStrokeWidth(void *font, int character);\n\n/* GLUT pre-built models sub-API */\nFL_EXPORT void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);\nFL_EXPORT void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);\nFL_EXPORT void glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);\nFL_EXPORT void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);\nFL_EXPORT void glutWireCube(GLdouble size);\nFL_EXPORT void glutSolidCube(GLdouble size);\nFL_EXPORT void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);\nFL_EXPORT void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);\nFL_EXPORT void glutWireDodecahedron();\nFL_EXPORT void glutSolidDodecahedron();\nFL_EXPORT void glutWireTeapot(GLdouble size);\nFL_EXPORT void glutSolidTeapot(GLdouble size);\nFL_EXPORT void glutWireOctahedron();\nFL_EXPORT void glutSolidOctahedron();\nFL_EXPORT void glutWireTetrahedron();\nFL_EXPORT void glutSolidTetrahedron();\nFL_EXPORT void glutWireIcosahedron();\nFL_EXPORT void glutSolidIcosahedron();\n\n#endif // !_FL_glut_H_\n"
  },
  {
    "path": "Game Trainers/common/include/FL/mac.H",
    "content": "//\n// Mac header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2018 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// Do not directly include this file, instead use <FL/platform.H>.  It will\n// include this file if \"__APPLE__\" is defined.  This is to encourage\n// portability of even the system-specific code...\n#ifndef FL_DOXYGEN\n\n#if !defined(FL_PLATFORM_H)\n#  error \"Never use <FL/mac.H> directly; include <FL/platform.H> instead.\"\n#endif // !FL_PLATFORM_H\n\n#ifdef __OBJC__\n  @class NSOpenGLContext;\n#  ifndef GL_SILENCE_DEPRECATION\n#    define GL_SILENCE_DEPRECATION 1\n#  endif\n#elif defined(__cplusplus)\n  class NSOpenGLContext;\n#endif /* __OBJC__ */\nextern NSOpenGLContext *fl_mac_glcontext(GLContext rc);\n\n#ifdef __OBJC__\n@class FLWindow; // a subclass of the NSWindow Cocoa class\ntypedef FLWindow *Window;\n#else\ntypedef class FLWindow *Window; // pointer to the FLWindow objective-c class\n#endif // __OBJC__\n\n#include <FL/Fl_Widget.H> // for Fl_Callback\n\n#if (defined(FL_LIBRARY) || defined(FL_INTERNALS)) // this part must be compiled when building the FLTK libraries\n\n// Standard MacOS C/C++ includes...\n#include <ApplicationServices/ApplicationServices.h>\n#undef check // because of Fl::check()\n\n#ifndef MAC_OS_X_VERSION_10_4\n#define MAC_OS_X_VERSION_10_4 1040\n#endif\n#ifndef MAC_OS_X_VERSION_10_5\n#define MAC_OS_X_VERSION_10_5 1050\n#endif\n#ifndef MAC_OS_X_VERSION_10_6\n#define MAC_OS_X_VERSION_10_6 1060\n#endif\n#ifndef MAC_OS_X_VERSION_10_7\n#define MAC_OS_X_VERSION_10_7 1070\n#endif\n#ifndef MAC_OS_X_VERSION_10_8\n#define MAC_OS_X_VERSION_10_8 1080\n#endif\n#ifndef MAC_OS_X_VERSION_10_9\n#define MAC_OS_X_VERSION_10_9 1090\n#endif\n#ifndef MAC_OS_X_VERSION_10_10\n#define MAC_OS_X_VERSION_10_10 101000\n#endif\n#ifndef MAC_OS_X_VERSION_10_11\n#define MAC_OS_X_VERSION_10_11 101100\n#endif\n#ifndef MAC_OS_X_VERSION_10_12\n#define MAC_OS_X_VERSION_10_12 101200\n#endif\n#ifndef MAC_OS_X_VERSION_10_13\n#define MAC_OS_X_VERSION_10_13 101300\n#endif\n#ifndef MAC_OS_X_VERSION_10_14\n#define MAC_OS_X_VERSION_10_14 101400\n#endif\n#ifndef MAC_OS_X_VERSION_10_15\n#define MAC_OS_X_VERSION_10_15 101500\n#endif\n#ifndef MAC_OS_X_VERSION_10_16\n#define MAC_OS_X_VERSION_10_16 101600\n#endif\n#ifndef MAC_OS_VERSION_11_0\n#define MAC_OS_VERSION_11_0 110000\n#endif\n#ifndef MAC_OS_VERSION_12_0\n#define MAC_OS_VERSION_12_0 120000\n#endif\n#ifndef MAC_OS_VERSION_13_0\n#define MAC_OS_VERSION_13_0 130000\n#endif\n#ifndef MAC_OS_VERSION_14_0\n#define MAC_OS_VERSION_14_0 140000\n#endif\n#ifndef MAC_OS_VERSION_15_0\n#define MAC_OS_VERSION_15_0 150000\n#endif\n\n\n#ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h\n#if defined(__LP64__) && __LP64__\ntypedef long NSInteger;\ntypedef unsigned long NSUInteger;\n#else\ntypedef int NSInteger;\ntypedef unsigned int NSUInteger;\n#endif\n#endif\n\n#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4\ntypedef CGImageAlphaInfo CGBitmapInfo;\n#endif\n\nstruct flCocoaRegion {\n  int count;\n  CGRect *rects;\n}; // a region is the union of a series of rectangles\n\n#ifndef CGFLOAT_DEFINED //appears with 10.5 in CGBase.h\n#if defined(__LP64__) && __LP64__\ntypedef double CGFloat;\n#else\ntypedef float CGFloat;\n#endif\n#endif // CGFLOAT_DEFINED\n\n#else\n\ntypedef struct CGContext* CGContextRef;\n\n#endif // FL_LIBRARY || FL_INTERNALS\n\nextern CGContextRef fl_gc;\n\n#endif // FL_DOXYGEN\n/** \\file\n Mac OS X-specific symbols.\n */\n\n/** \\defgroup group_macosx Mac OS X-specific symbols\n Mac OS X-specific symbols declared in <FL/platform.H>\n \\sa \\ref osissues_macos\n \\{ */\n\n/**\n Attaches a callback to the \"About myprog\" item of the system application menu.\n For back-compatibility.\n Equivalent to Fl_Sys_Menu_Bar::about(Fl_Callback *cb, void *user_data).\n */\nvoid fl_mac_set_about(Fl_Callback *cb, void *user_data, int shortcut = 0);\n\n/** Returns the macOS-specific graphics context for the current window */\nextern CGContextRef fl_mac_gc();\n/** Returns the macOS-specific window reference corresponding to the given Fl_Window object */\nextern FLWindow *fl_mac_xid(const Fl_Window *win);\n/** Returns the Fl_Window corresponding to the given macOS-specific window reference */\nextern Fl_Window *fl_mac_find(FLWindow *);\nclass Fl_Gl_Window;\n\n/** The version number of the running Mac OS X (e.g., 100604 for 10.6.4, 101300 for 10.13, 140102 for 14.1.2).\n FLTK initializes this global variable before main() begins running. If\n the value is needed in a static initializer, a previous call to Fl::system_driver()\n makes sure \\ref fl_mac_os_version has been initialized.\n */\nextern int fl_mac_os_version;\n\nstruct Fl_Menu_Item;\n\nclass Fl_Mac_App_Menu {\npublic:\n  /** Localizable text for the \"About xxx\" application menu item */\n  static const char *about;\n  /** Localizable text for the \"Print Front Window\" application menu item.\n   This menu item and next one won't be displayed if Fl_Mac_App_Menu::print\n   is set to an empty string.\n   */\n  static const char *print;\n  /** Localizable text for the \"Print Front Window\" application menu item. */\n  static const char *print_no_titlebar;\n  /** Localizable text for the \"Toggle print titlebar\" application menu item. */\n  static const char *toggle_print_titlebar;\n  /** Localizable text for the \"Services\" application menu item */\n  static const char *services;\n  /** Localizable text for the \"Hide xxx\" application menu item */\n  static const char *hide;\n  /** Localizable text for the \"Hide Others\" application menu item */\n  static const char *hide_others;\n  /** Localizable text for the \"Show All\" application menu item */\n  static const char *show;\n  /** Localizable text for the \"Quit xxx\" application menu item */\n  static const char *quit;\n  /** Adds custom menu item(s) to the application menu of the system menu bar.\n   They are positioned after the \"Print Front Window / Toggle printing of titlebar\" items, or at their place\n   if they were removed with <tt>Fl_Mac_App_Menu::print = \"\"</tt>.\n   \\param m zero-ending array of Fl_Menu_Item 's.\n   */\n  static void custom_application_menu_items(const Fl_Menu_Item *m);\n};\n\n/** @} */\n\n"
  },
  {
    "path": "Game Trainers/common/include/FL/math.h",
    "content": "//\n// Math header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2020 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// Xcode on macOS includes files by recursing down into directories.\n// This code catches the cycle and directly includes the required file.\n#ifdef fl_math_h_cyclic_include\n#  include \"/usr/include/math.h\"\n#endif\n\n#ifndef fl_math_h\n#  define fl_math_h\n\n#  define fl_math_h_cyclic_include\n#  include <math.h>\n#  undef fl_math_h_cyclic_include\n\n#  ifndef M_PI\n#    define M_PI            3.14159265358979323846\n#    define M_PI_2          1.57079632679489661923\n#    define M_PI_4          0.78539816339744830962\n#    define M_1_PI          0.31830988618379067154\n#    define M_2_PI          0.63661977236758134308\n#  endif // !M_PI\n\n#  ifndef M_SQRT2\n#    define M_SQRT2         1.41421356237309504880\n#    define M_SQRT1_2       0.70710678118654752440\n#  endif // !M_SQRT2\n\n#  if (defined(_WIN32) || defined(CRAY)) && !defined(__MINGW32__)\n\ninline double rint(double v) {return floor(v+.5);}\ninline double copysign(double a, double b) {return b<0 ? -a : a;}\n\n#  endif // (_WIN32 || CRAY) && !__MINGW32__\n\n#endif // !fl_math_h\n"
  },
  {
    "path": "Game Trainers/common/include/FL/names.h",
    "content": "//\n// Event and other names header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2024 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// Thanks to Greg Ercolano for this addition.\n\n/**\n \\file names.h\n This file defines arrays of human readable names for FLTK symbolic constants.\n*/\n\n#ifndef FL_NAMES_H\n#define FL_NAMES_H\n\n/** \\defgroup fl_events Events handling functions\n    @{\n */\n\n/**\n  This is an array of event names you can use to convert event numbers into names.\n\n  The array gets defined inline wherever your '\\#include <FL/names.h>' appears.\n\n  \\b Example:\n  \\code\n  #include <FL/names.h>         // array will be defined here\n  int MyClass::handle(int e) {\n      printf(\"Event was %s (%d)\\n\", fl_eventnames[e], e);\n      // ..resulting output might be e.g. \"Event was FL_PUSH (1)\"..\n      [..]\n  }\n  \\endcode\n */\nconst char * const fl_eventnames[] =\n{\n  \"FL_NO_EVENT\",\n  \"FL_PUSH\",\n  \"FL_RELEASE\",\n  \"FL_ENTER\",\n  \"FL_LEAVE\",\n  \"FL_DRAG\",\n  \"FL_FOCUS\",\n  \"FL_UNFOCUS\",\n  \"FL_KEYDOWN\",\n  \"FL_KEYUP\",\n  \"FL_CLOSE\",\n  \"FL_MOVE\",\n  \"FL_SHORTCUT\",\n  \"FL_DEACTIVATE\",\n  \"FL_ACTIVATE\",\n  \"FL_HIDE\",\n  \"FL_SHOW\",\n  \"FL_PASTE\",\n  \"FL_SELECTIONCLEAR\",\n  \"FL_MOUSEWHEEL\",\n  \"FL_DND_ENTER\",\n  \"FL_DND_DRAG\",\n  \"FL_DND_LEAVE\",\n  \"FL_DND_RELEASE\",\n  \"FL_SCREEN_CONFIGURATION_CHANGED\",\n  \"FL_FULLSCREEN\",\n  \"FL_ZOOM_GESTURE\",\n  \"FL_ZOOM_EVENT\",\n  \"FL_EVENT_28\", // not yet defined, just in case it /will/ be defined ...\n  \"FL_EVENT_29\", // not yet defined, just in case it /will/ be defined ...\n  \"FL_EVENT_30\"  // not yet defined, just in case it /will/ be defined ...\n};\n\n/**\n  This is an array of font names you can use to convert font numbers into names.\n\n  The array gets defined inline wherever your '\\#include <FL/names.h>' appears.\n\n  \\b Example:\n  \\code\n  #include <FL/names.h>         // array will be defined here\n  int MyClass::my_callback(Fl_Widget *w, void*) {\n      int fnum = w->labelfont();\n      // Resulting output might be e.g. \"Label's font is FL_HELVETICA (0)\"\n      printf(\"Label's font is %s (%d)\\n\", fl_fontnames[fnum], fnum);\n      // ..resulting output might be e.g. \"Label's font is FL_HELVETICA (0)\"..\n      [..]\n  }\n  \\endcode\n */\nconst char * const fl_fontnames[] =\n{\n  \"FL_HELVETICA\",\n  \"FL_HELVETICA_BOLD\",\n  \"FL_HELVETICA_ITALIC\",\n  \"FL_HELVETICA_BOLD_ITALIC\",\n  \"FL_COURIER\",\n  \"FL_COURIER_BOLD\",\n  \"FL_COURIER_ITALIC\",\n  \"FL_COURIER_BOLD_ITALIC\",\n  \"FL_TIMES\",\n  \"FL_TIMES_BOLD\",\n  \"FL_TIMES_ITALIC\",\n  \"FL_TIMES_BOLD_ITALIC\",\n  \"FL_SYMBOL\",\n  \"FL_SCREEN\",\n  \"FL_SCREEN_BOLD\",\n  \"FL_ZAPF_DINGBATS\",\n};\n\n/**\n This is an array of callback reason names you can use to convert callback reasons into names.\n\n The array gets defined inline wherever your '\\#include <FL/names.h>' appears.\n */\nconst char * const fl_callback_reason_names[] =\n{\n  \"FL_REASON_UNKNOWN\",\n  \"FL_REASON_SELECTED\",\n  \"FL_REASON_DESELECTED\",\n  \"FL_REASON_RESELECTED\",\n  \"FL_REASON_OPENED\",\n  \"FL_REASON_CLOSED\",\n  \"FL_REASON_DRAGGED\",\n  \"FL_REASON_CANCELLED\",\n  \"FL_REASON_CHANGED\",\n  \"FL_REASON_GOT_FOCUS\",\n  \"FL_REASON_LOST_FOCUS\",\n  \"FL_REASON_RELEASED\",\n  \"FL_REASON_ENTER_KEY\",\n  NULL, NULL, NULL,\n  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n  \"FL_REASON_USER\", \"FL_REASON_USER+1\", \"FL_REASON_USER+2\", \"FL_REASON_USER+3\",\n};\n\n/** @} */\n\n#endif /* FL_NAMES_H */\n"
  },
  {
    "path": "Game Trainers/common/include/FL/platform.H",
    "content": "//\n// Platform header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// These are FLTK symbols that are necessary or useful for calling\n// platform specific functions. This file #include's certain platform\n// specific system header files that are necessary to declare platform\n// specific FLTK functions, for instance \"Windows.h\" under Windows.\n\n// You should include this file if (and ONLY if) you need to call\n// platform specific functions directly.\n\n// See FLTK documentation: chapter \"Operating System Issues\" on when\n// you need to #include <FL/platform.H>\n\n#if !defined(FL_PLATFORM_H) && !defined(FL_DOXYGEN)\n#  define FL_PLATFORM_H\n\n#   include <FL/Fl_Export.H>\n#   include <FL/platform_types.h> // will bring in FL/fl_config.h\n#   include <FL/fl_types.h> // for uchar\nclass Fl_Window;\n\n#  ifdef _WIN32\n#    include \"win32.H\"\n#  elif defined(FLTK_USE_WAYLAND)\n#    include \"wayland.H\"\n#  elif defined(FLTK_USE_X11)\n#    include \"x11.H\"\n#  elif defined(__APPLE__)\n#    include \"mac.H\"\n#  endif // _WIN32\n\n//\n// cross-platform declarations\n//\n#if defined(FL_LIBRARY) || defined(FL_INTERNALS)\n#  include <FL/Fl_Window.H>\n\nclass FL_EXPORT Fl_X {\npublic:\n  fl_uintptr_t xid;\n  Fl_Window* w;\n  Fl_Region region;\n  Fl_X *next;\n  // static variables, static functions and member functions\n  static Fl_X* first;\n  static Fl_X* flx(const Fl_Window* w) {return w ? (Fl_X*)w->flx_ : 0;}\n#  if defined(FLTK_USE_X11) && FLTK_USE_X11 // for backward compatibility\n  static void make_xid(Fl_Window*, XVisualInfo* =fl_visual, Colormap=fl_colormap);\n  static Fl_X* set_xid(Fl_Window*, Window);\n  static inline Fl_X* i(const Fl_Window* w) {return flx(w);}\n#  endif\n};\n\ninline Window fl_xid(const Fl_Window* w) { Fl_X *xTemp = Fl_X::flx(w); return xTemp ? (Window)xTemp->xid : 0; }\n#else\nextern FL_EXPORT Window fl_xid_(const Fl_Window* w);\n#  define fl_xid(w) fl_xid_(w)\n#endif // FL_LIBRARY || FL_INTERNALS\n\nextern FL_EXPORT Fl_Window* fl_find(Window xid);\nextern FL_EXPORT void fl_open_display();\nextern FL_EXPORT void fl_close_display();\nextern FL_EXPORT Window fl_window;\nextern FL_EXPORT int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b);\nextern FL_EXPORT void fl_open_callback(void (*)(const char *));\n\n#endif // !FL_PLATFORM_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/platform_types.h",
    "content": "/*\n * Copyright 2016-2023 by Bill Spitzak and others.\n *\n * This library is free software. Distribution and use rights are outlined in\n * the file \"COPYING\" which should have been included with this file.  If this\n * file is missing or damaged, see the license at:\n *\n *     https://www.fltk.org/COPYING.php\n *\n * Please see the following page on how to report bugs and issues:\n *\n *     https://www.fltk.org/bugs.php\n */\n\n#ifndef Fl_Platform_Types_H\n#define Fl_Platform_Types_H\n\n/** \\file\n Definitions of platform-dependent types.\n The exact nature of these types varies with the platform.\n Therefore, portable FLTK applications should not assume these types\n have a specific size, or that they are pointers.\n */\n\n#ifdef FL_DOXYGEN\n\n/** An integral type large enough to store a pointer or a long value.\n A pointer value can be safely cast to fl_intptr_t, and later cast back\n to its initial pointer type without change to the pointer value.\n A variable of type fl_intptr_t can also store a long int value. */\ntypedef opaque fl_intptr_t;\n/** An unsigned integral type large enough to store a pointer or an unsigned long value.\n A pointer value can be safely cast to fl_uintptr_t, and later cast back\n to its initial pointer type without change to the pointer value.\n A variable of type fl_uintptr_t can also store an unsigned long int value. */\ntypedef opaque fl_uintptr_t;\n\n/**\n Platform-specific value representing an offscreen drawing buffer.\n  \\note This value can be safely cast to these types on each platform:\n  \\li X11: Pixmap\n  \\li Wayland: cairo_t *\n  \\li Windows: HBITMAP\n  \\li macOS:  CGContextRef\n */\ntypedef opaque Fl_Offscreen;\n\n/**\n Pointer to a platform-specific structure representing a collection of rectangles.\n  \\note This pointer can be safely cast to these types on each platform:\n  \\li X11: Region as defined by X11\n  \\li Wayland:  cairo_region_t *\n  \\li Windows: HRGN\n  \\li macOS:  struct flCocoaRegion *\n */\ntypedef struct opaque *Fl_Region;\ntypedef opaque FL_SOCKET; /**< socket or file descriptor */\n/**\n Pointer to a platform-specific structure representing the window's OpenGL rendering context.\n  \\note This pointer can be safely cast to these types on each platform:\n  \\li X11: GLXContext\n  \\li Wayland: EGLContext\n  \\li Windows: HGLRC\n  \\li macOS: NSOpenGLContext *\n */\ntypedef struct opaque *GLContext;\n\n/**\n Platform-specific point in time, used for delta time calculation.\n \\note This type may be a struct. sizeof(Fl_Timestamp) may be different on\n different platforms. Fl_Timestamp may change with future ABI changes.\n */\ntypedef opaque Fl_Timestamp;\n\n#  define FL_COMMAND  opaque   /**< An alias for FL_CTRL on Windows and X11, or FL_META on MacOS X */\n#  define FL_CONTROL  opaque   /**< An alias for FL_META on Windows and X11, or FL_CTRL on MacOS X */\n\n#else /* FL_DOXYGEN */\n\n#ifndef FL_PLATFORM_TYPES_H\n#define FL_PLATFORM_TYPES_H\n\n#include <FL/fl_config.h>\n#include <time.h> // for time_t\n\n/* Platform-dependent types are defined here.\n  These types must be defined by any platform:\n  FL_SOCKET, struct dirent, fl_intptr_t, fl_uintptr_t\n\n  NOTE: *FIXME* AlbrechtS 13 Apr 2016 (concerning FL_SOCKET)\n  ----------------------------------------------------------\n    The Fl::add_fd() API is partially inconsistent because some of the methods\n    explicitly use 'int', but the callback typedefs use FL_SOCKET. With the\n    definition of FL_SOCKET below we can have different data sizes and\n    different signedness of socket numbers on *some* platforms.\n */\n\n#ifdef _WIN64\n\n#if defined(_MSC_VER) && (_MSC_VER < 1600)\n# include <stddef.h>  /* stdint.h not available before VS 2010 (1600) */\n#else\n# include <stdint.h>\n#endif\n\ntypedef intptr_t fl_intptr_t;\ntypedef uintptr_t fl_uintptr_t;\n\n#else /* ! _WIN64 */\n\ntypedef long fl_intptr_t;\ntypedef unsigned long fl_uintptr_t;\n\n#endif /* _WIN64 */\n\ntypedef void *GLContext;\ntypedef void *Fl_Region;\ntypedef fl_uintptr_t  Fl_Offscreen;\n\n/* Allows all hybrid combinations except WIN32 + X11 with MSVC */\n#if defined(_WIN32) && !defined(__MINGW32__)\n  struct dirent {char d_name[1];};\n#else\n#  include <dirent.h>\n#endif\n\n# if defined(_WIN64) && defined(_MSC_VER)\ntypedef  unsigned __int64 FL_SOCKET;    /* *FIXME* - FL_SOCKET (see above) */\n# else\ntypedef  int FL_SOCKET;\n# endif\n\n#include <FL/Fl_Export.H>\nextern FL_EXPORT int fl_command_modifier();\nextern FL_EXPORT int fl_control_modifier();\n#  define FL_COMMAND    fl_command_modifier()\n#  define FL_CONTROL    fl_control_modifier()\n\n#endif /* FL_PLATFORM_TYPES_H */\n\n/* This is currently the same for all platforms but may change in the future */\nstruct Fl_Timestamp_t {\n  time_t sec;\n  int usec;\n};\n\ntypedef struct Fl_Timestamp_t Fl_Timestamp;\n\n#endif /* FL_DOXYGEN */\n\n#endif /* Fl_Platform_Types_H */\n\n"
  },
  {
    "path": "Game Trainers/common/include/FL/wayland.H",
    "content": "//\n// Wayland/X11 hybrid platform header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n#if !defined(FL_PLATFORM_H)\n#  error \"Never use <FL/wayland.H> directly; include <FL/platform.H> instead.\"\n#endif // !FL_PLATFORM_H\n\n/** \\file\n \\anchor wayland_H Definitions of functions specific to the Wayland platform.\n*/\n\n// ***********  for Wayland component ***********\n\ntypedef struct _cairo cairo_t;\n\n/** Returns the Wayland display in use */\nextern FL_EXPORT struct wl_display *fl_wl_display();\n/** Returns the wl_surface associated to a shown window */\nextern FL_EXPORT struct wl_surface *fl_wl_surface(struct wld_window *xid);\n/** Returns a platform-specific reference associated to a shown window */\nextern FL_EXPORT struct wld_window *fl_wl_xid(const Fl_Window *win);\n/** Returns the Fl_Window corresponding to a given the platform-specific window reference */\nextern FL_EXPORT Fl_Window *fl_wl_find(struct wld_window *);\n/** Returns the cairo context associated to the current window or Fl_Image_Surface */\nextern FL_EXPORT cairo_t *fl_wl_gc();\n/** Returns the wl_compositor of the current Wayland session.\n This allows, for example, to create a wl_surface with\n \\code\n struct wl_surface *my_wl_surface = wl_compositor_create_surface(fl_wl_compositor());\n \\endcode\n */\nextern FL_EXPORT struct wl_compositor *fl_wl_compositor();\n/** Returns the current buffer scaling factor for \\p window. */\nextern FL_EXPORT int fl_wl_buffer_scale(Fl_Window *window);\ntypedef void *EGLContext;\n/** Returns the EGLContext corresponding to the given GLContext */\nextern FL_EXPORT EGLContext fl_wl_glcontext(GLContext rc);\n\n#ifndef FL_DOXYGEN\n\n#  ifdef FLTK_USE_X11\n//  *********** for X11 component ***********\n#    include \"x11.H\"\n#  else\n      typedef struct wld_window *Window;\n#  endif\n\n#endif // FL_DOXYGEN\n"
  },
  {
    "path": "Game Trainers/common/include/FL/win32.H",
    "content": "//\n// Windows platform header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// Do not directly include this file, instead use <FL/platform.H>.  It will\n// include this file if _WIN32 is defined.  This is to encourage\n// portability of even the system-specific code...\n\n#ifdef FL_DOXYGEN\n\n/** \\file\n Definitions of functions specific to the Windows platform.\n*/\n\n/** Returns the Windows-specific window reference corresponding to the given Fl_Window object */\nextern HWND fl_win32_xid(const Fl_Window *win);\n/** Returns the Fl_Window corresponding to the given Windows-specific window reference */\nextern Fl_Window *fl_win32_find(HWND);\n/** Returns the Windows-specific GL rendering context corresponding to the given GLContext  */\nextern HGLRC fl_win32_glcontext(GLContext rc);\n/** Returns the Windows-specific graphics context for the current window  */\nextern HDC fl_win32_gc();\n/** Returns the Windows-specific display in use  */\nextern HINSTANCE fl_win32_display();\n\n#else\n\n#ifndef FL_PLATFORM_H\n#  error \"Never use <FL/win32.H> directly; include <FL/platform.H> instead.\"\n#endif // !FL_PLATFORM_H\n\n#include <windows.h>\ntypedef HWND Window;\n\ntypedef struct HGLRC__ *HGLRC;\nextern FL_EXPORT HGLRC fl_win32_glcontext(GLContext rc);\nextern FL_EXPORT HWND fl_win32_xid(const Fl_Window *win);\nextern FL_EXPORT Fl_Window *fl_win32_find(HWND);\n\n// this part is included only when compiling the FLTK library or if requested explicitly\n#if defined(FL_LIBRARY) || defined(FL_INTERNALS)\n\n// In some of the distributions, the gcc header files are missing some stuff:\n#ifndef LPMINMAXINFO\n#define LPMINMAXINFO MINMAXINFO*\n#endif\n#ifndef VK_LWIN\n#define VK_LWIN 0x5B\n#define VK_RWIN 0x5C\n#define VK_APPS 0x5D\n#endif\n\nextern FL_EXPORT UINT fl_wake_msg;\nextern FL_EXPORT char fl_override_redirect; // hack into Fl_Window::make_xid()\nextern FL_EXPORT HPALETTE fl_palette; // non-zero only on 8-bit displays!\nextern void fl_release_dc(HWND w, HDC dc);\nextern FL_EXPORT void fl_save_dc( HWND w, HDC dc);\n\n#endif // FL_LIBRARY || FL_INTERNALS\n\n// most recent fl_color() or fl_rgbcolor() points at one of these:\nextern FL_EXPORT struct Fl_XMap {\n  COLORREF rgb; // this should be the type the RGB() macro returns\n  HPEN pen;     // pen, 0 if none created yet\n  int brush;    // ref to solid brush, 0 if none created yet\n  int pwidth;   // the width of the pen, if present\n} *fl_current_xmap;\ninline COLORREF fl_RGB() {return fl_current_xmap->rgb;}\ninline HPEN fl_pen() {return fl_current_xmap->pen;}\nFL_EXPORT HBRUSH fl_brush(); // allocates a brush if necessary\nFL_EXPORT HBRUSH fl_brush_action(int); // now does the real work\n\nextern FL_EXPORT HINSTANCE fl_display;\nextern FL_EXPORT HINSTANCE fl_win32_display();\nextern FL_EXPORT HDC fl_gc;\nextern FL_EXPORT HDC fl_win32_gc();\nextern FL_EXPORT MSG fl_msg;\nextern FL_EXPORT HDC fl_GetDC(Window);\nextern FL_EXPORT HDC fl_makeDC(HBITMAP);\n\n#endif // FL_DOXYGEN\n"
  },
  {
    "path": "Game Trainers/common/include/FL/x.H",
    "content": "//\n// *Deprecated* platform header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2018 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// IMPORTANT: This file is deprecated since FLTK 1.4.0. DO NOT include it.\n// FL/x.H will be removed in a future FLTK release.\n\n// Please #include <FL/platform.H> instead if you really need it. See\n// documentation in FL/platform.H to decide whether you need that file.\n\n#if !defined(Fl_X_H) && !defined(FL_DOXYGEN)\n#  define Fl_X_H\n#  include <FL/platform.H>\n#endif // !Fl_X_H\n"
  },
  {
    "path": "Game Trainers/common/include/FL/x11.H",
    "content": "//\n// X11 platform header file for the Fast Light Tool Kit (FLTK).\n//\n// Copyright 1998-2022 by Bill Spitzak and others.\n//\n// This library is free software. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have been included with this file.  If this\n// file is missing or damaged, see the license at:\n//\n//     https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report bugs and issues:\n//\n//     https://www.fltk.org/bugs.php\n//\n\n// Do not directly include this file, instead use <FL/platform.H>.  It will\n// include this file if FLTK_USE_X11 is defined.  This is to encourage\n// portability of even the system-specific code...\n\n#ifdef FL_DOXYGEN\n\n/** \\file\n Definitions of functions specific to the X11 platform.\n*/\n\n/** Returns the X11 Display in use */\nextern Display *fl_x11_display();\n/** Have FLTK use a pre-established X11 connection.\n This function must be called before FLTK attempts to open its own X11 connection,\n that is, as long as fl_x11_display() returns NULL.\n \\param d the X11 Display* value representing a valid, pre-established X11 connection\n */\nextern void fl_x11_use_display(Display *d);\n/** Returns the Window reference for the given Fl_Window, or zero if not \\c shown().  */\nextern Window fl_x11_xid(const Fl_Window *win);\n/** Returns the Fl_Window corresponding to the given Window reference.  */\nextern Fl_Window *fl_x11_find(Window xid);\n/** Returns the X11-specific currently active graphics context.  */\nextern GC fl_x11_gc();\n/** Returns the Cairo-specific currently active graphics context (FLTK_GRAPHICS_CAIRO=On) */\nextern cairo_t* fl_cairo_gc();\n#else // ! FL_DOXYGEN\n\n#ifndef FL_PLATFORM_H\n#  error \"Never use <FL/x11.H> directly; include <FL/platform.H> instead.\"\n#endif // !FL_PLATFORM_H\n\n#include <FL/Enumerations.H>\n\n#if defined(_ABIN32) || defined(_ABI64) // fix for broken SGI Irix X .h files\n#  pragma set woff 3322\n#endif\n#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n#if defined(_ABIN32) || defined(_ABI64)\n#  pragma reset woff 3322\n#endif\n#include <X11/Xatom.h>\n\ntypedef struct __GLXcontextRec *GLXContext;\nextern GLXContext fl_x11_glcontext(GLContext rc);\n\n// constant info about the X server connection:\nextern FL_EXPORT Display *fl_display;\nextern FL_EXPORT Display *fl_x11_display();\nextern FL_EXPORT void fl_x11_use_display(Display *);\nextern FL_EXPORT Window fl_x11_xid(const Fl_Window *win);\nextern FL_EXPORT Fl_Window *fl_x11_find(Window);\nextern FL_EXPORT int fl_screen;\nextern FL_EXPORT XVisualInfo *fl_visual;\nextern FL_EXPORT Colormap fl_colormap;\n\n// drawing functions:\nextern FL_EXPORT GC fl_gc;\n#if FLTK_USE_CAIRO\n  typedef struct _cairo cairo_t;\n  extern FL_EXPORT cairo_t* fl_cairo_gc();\n#endif\nextern FL_EXPORT GC fl_x11_gc();\nFL_EXPORT ulong fl_xpixel(Fl_Color i);\nFL_EXPORT ulong fl_xpixel(uchar r, uchar g, uchar b);\n\n// feed events into fltk:\nFL_EXPORT int fl_handle(const XEvent&);\n\n// you can use these in Fl::add_handler() to look at events:\nextern FL_EXPORT const XEvent* fl_xevent;\nextern FL_EXPORT ulong fl_event_time;\n\n#if defined(FL_LIBRARY) || defined(FL_INTERNALS)\nextern FL_EXPORT Window fl_message_window;\nextern FL_EXPORT void *fl_xftfont;\n\n// access to core fonts:\n// This class provides a \"smart pointer\" that returns a pointer to an XFontStruct.\n// The global variable fl_xfont can be called wherever a bitmap \"core\" font is\n// needed, e.g. when rendering to a GL context under X11.\n// With Xlib / X11 fonts, fl_xfont will return the current selected font.\n// With XFT / X11 fonts, fl_xfont will attempt to return the bitmap \"core\" font most\n// similar to (usually the same as) the current XFT font.\nclass FL_EXPORT Fl_XFont_On_Demand\n{\npublic:\n  Fl_XFont_On_Demand(XFontStruct* p = NULL) : ptr(p) { }\n  Fl_XFont_On_Demand& operator=(const Fl_XFont_On_Demand& x)\n  { ptr = x.ptr;  return *this; }\n  Fl_XFont_On_Demand& operator=(XFontStruct* p)\n  { ptr = p;  return *this; }\n  XFontStruct* value();\n  operator XFontStruct*() { return value(); }\n  XFontStruct& operator*() { return *value(); }\n  XFontStruct* operator->() { return value(); }\n  bool operator==(const Fl_XFont_On_Demand& x) { return ptr == x.ptr; }\n  bool operator!=(const Fl_XFont_On_Demand& x) { return ptr != x.ptr; }\nprivate:\n  XFontStruct *ptr;\n};\nextern FL_EXPORT Fl_XFont_On_Demand fl_xfont;\n\nextern FL_EXPORT char fl_override_redirect; // hack into Fl_X::make_xid()\n\n#endif // FL_LIBRARY || FL_INTERNALS\n\n#endif // FL_DOXYGEN\n"
  },
  {
    "path": "Game Trainers/common/include/FLTKUtils.h",
    "content": "#include <nlohmann/json.hpp>\n#include <fstream>\n#include <shlobj.h>\n#include <FL/Fl_Table.H>\n\nusing json = nlohmann::json;\n\n// Globals\nconstexpr int font_size = 15;\nstatic HANDLE font_handle = nullptr;\nstd::unordered_map<std::string, std::unordered_map<std::string, std::string>> translations;\nstd::vector<std::pair<Fl_Widget *, std::string>> translatable_widgets;\nstd::string language = \"en_US\";\nstd::string settings_path = \"\";\n\n// UI Layout Constants\nconstexpr int UI_LEFT_MARGIN = 20;\nconstexpr int UI_BUTTON_WIDTH = 50;\nconstexpr int UI_TOGGLE_WIDTH = 16;\nconstexpr int UI_TOGGLE_SPACER_WIDTH = 24;\nconstexpr int UI_INPUT_WIDTH = 200;\nconstexpr int UI_OPTION_GAP = 10;\nconstexpr int UI_OPTION_HEIGHT = static_cast<int>(font_size * 1.5);\n\n// ===========================================================================\n// Data Structures\n// ===========================================================================\n\nstruct TimeoutData\n{\n    Trainer *trainer;\n    Fl_Box *process_exe;\n    Fl_Box *process_id;\n};\n\nstruct ChangeLanguageData\n{\n    std::string lang;\n    Fl_Group *group;\n};\n\n// Structure to hold callback data for Apply button\nstruct ApplyData\n{\n    Trainer *trainer;\n    std::string optionName;\n    Fl_Button *button;\n    Fl_Input *input;\n};\n\n// Structure to hold callback data for toggles\nstruct ToggleData\n{\n    Trainer *trainer;\n    std::string optionName;\n    Fl_Check_Button *button;\n    Fl_Input *input;\n};\n\n// Structure to hold a widget pair (button and input)\nstruct WidgetPair\n{\n    Fl_Widget *button; // Fl_Check_Button* or Fl_Button*\n    Fl_Input *input;   // nullptr if input not created\n};\n\n// Structure to hold callback data for info buttons\nstruct InfoCallbackData\n{\n    Trainer *trainer;\n    Fl_Input **input_ptr;\n    std::string windowTitleKey;\n    Fl_Window **windowInstance;\n    std::vector<std::string> columnTitles;\n    std::string (Trainer::*dataRetriever)();\n};\n\n// ===========================================================================\n// Resource Management Functions\n// ===========================================================================\n\nconst unsigned char *load_resource(const char *resource_name, DWORD &size)\n{\n    HRSRC hRes = FindResourceA(nullptr, resource_name, MAKEINTRESOURCEA(10));\n    if (!hRes)\n    {\n        size = 0;\n        return nullptr;\n    }\n    HGLOBAL hData = LoadResource(nullptr, hRes);\n    if (!hData)\n    {\n        size = 0;\n        return nullptr;\n    }\n    size = SizeofResource(nullptr, hRes);\n\n    if (size == 0)\n    {\n        std::cerr << \"Error: Failed to load resource: \" << resource_name << std::endl;\n        return nullptr;\n    }\n\n    return static_cast<const unsigned char *>(LockResource(hData));\n}\n\nvoid load_translations(const char *resource_name)\n{\n    DWORD size = 0;\n    const unsigned char *data = load_resource(resource_name, size);\n\n    json j = json::parse(std::string(reinterpret_cast<const char *>(data), size));\n    for (auto &lang : j.items())\n    {\n        std::string lang_code = lang.key();\n        for (auto &text : lang.value().items())\n        {\n            translations[lang_code][text.key()] = text.value();\n        }\n    }\n}\n\nvoid saveSettings()\n{\n    json settings;\n\n    if (std::filesystem::exists(settings_path))\n    {\n        std::ifstream file(settings_path);\n        file >> settings;\n        file.close();\n    }\n    else\n    {\n        std::filesystem::create_directories(std::filesystem::path(settings_path).parent_path());\n    }\n\n    settings[\"language\"] = language;\n\n    std::ofstream file(settings_path);\n    file << settings.dump(4);\n    file.close();\n}\n\nvoid getSettingsPath()\n{\n    PWSTR path = nullptr;\n    SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &path);\n    std::filesystem::path app_data_path(path);\n    std::filesystem::path full_path = app_data_path / \"GCM Settings\" / \"trainers.json\";\n    settings_path = full_path.string();\n    CoTaskMemFree(path);\n}\n\nvoid setupLanguage()\n{\n    getSettingsPath();\n\n    if (std::filesystem::exists(settings_path))\n    {\n        std::ifstream file(settings_path);\n        json settings;\n        file >> settings;\n        file.close();\n\n        if (settings.contains(\"language\"))\n        {\n            language = settings[\"language\"].get<std::string>();\n            return;\n        }\n    }\n\n    // If the file doesn't exist or \"language\" entry is missing, detect system locale\n    wchar_t locale_name[LOCALE_NAME_MAX_LENGTH];\n    if (GetUserDefaultLocaleName(locale_name, LOCALE_NAME_MAX_LENGTH) > 0)\n    {\n        int size_needed = WideCharToMultiByte(CP_UTF8, 0, locale_name, -1, nullptr, 0, nullptr, nullptr);\n        if (size_needed > 0)\n        {\n            std::string detected_locale(size_needed - 1, 0);\n            WideCharToMultiByte(CP_UTF8, 0, locale_name, -1, &detected_locale[0], size_needed, nullptr, nullptr);\n            std::cout << \"Detected locale: \" << detected_locale << std::endl;\n\n            if (detected_locale == \"zh-CN\" || detected_locale == \"zh-Hans-HK\" || detected_locale == \"zh-Hans-MO\" || detected_locale == \"zh-SG\")\n            {\n                language = \"zh_CN\";\n            }\n            else if (detected_locale == \"zh-HK\" || detected_locale == \"zh-MO\" || detected_locale == \"zh-TW\")\n            {\n                language = \"zh_CN\";\n            }\n            else if (detected_locale == \"en-US\")\n            {\n                language = \"en_US\";\n            }\n        }\n    }\n\n    saveSettings();\n}\n\nvoid change_language(const std::string &lang, Fl_Group *group)\n{\n    group->hide();\n\n    for (const auto &[child, key] : translatable_widgets)\n    {\n        auto lang_translations = translations.find(lang);\n        if (lang_translations != translations.end())\n        {\n            auto label_it = lang_translations->second.find(key);\n            if (label_it != lang_translations->second.end())\n            {\n                if (child->tooltip())\n                {\n                    child->tooltip(label_it->second.c_str());\n                    continue;\n                }\n\n                // Update the label with the translated text\n                child->copy_label(label_it->second.c_str());\n                child->labelsize(font_size);\n                child->labelfont(FL_FREE_FONT);\n                child->labelcolor(FL_WHITE);\n\n                Fl_Button *button = dynamic_cast<Fl_Button *>(child);\n                if (button)\n                {\n                    button->labelcolor(FL_BLACK);\n                    continue;\n                }\n\n                Fl_Flex *parent_flex = dynamic_cast<Fl_Flex *>(child->parent());\n                if (parent_flex)\n                {\n                    parent_flex->fixed(child, fl_width(child->label()));\n                }\n            }\n        }\n    }\n\n    group->redraw();\n    group->show();\n    language = lang;\n    saveSettings();\n}\n\nvoid change_language_callback(Fl_Widget *widget, void *data)\n{\n    ChangeLanguageData *changeLanguageData = static_cast<ChangeLanguageData *>(data);\n    std::string lang = changeLanguageData->lang;\n    Fl_Group *group = changeLanguageData->group;\n\n    change_language(lang, group);\n}\n\n// Assign translation key for translating widget's label\nvoid tr(Fl_Widget *widget, const std::string &key)\n{\n    translatable_widgets.emplace_back(widget, key);\n}\n\n// Directly translate a string using the current language\nconst char *t(const std::string &key)\n{\n    auto lang_it = translations.find(language);\n    if (lang_it != translations.end())\n    {\n        auto trans_it = lang_it->second.find(key);\n        if (trans_it != lang_it->second.end())\n        {\n            return trans_it->second.c_str();\n        }\n    }\n    return key.c_str();\n}\n\nvoid uncheck_all_checkbuttons(Fl_Group *group)\n{\n    if (!group)\n        return;\n\n    for (int i = 0; i < group->children(); ++i)\n    {\n        Fl_Widget *child = group->child(i);\n        if (!child)\n            continue;\n\n        Fl_Check_Button *check_btn = dynamic_cast<Fl_Check_Button *>(child);\n        Fl_Input *input = dynamic_cast<Fl_Input *>(child);\n        if (check_btn)\n        {\n            check_btn->value(0);\n        }\n        if (input)\n        {\n            input->readonly(0);\n        }\n\n        // If the child is a group, recurse into it\n        Fl_Group *subgroup = dynamic_cast<Fl_Group *>(child);\n        if (subgroup)\n        {\n            uncheck_all_checkbuttons(subgroup);\n        }\n    }\n}\n\nvoid clean_up(Fl_Window *window, Trainer *trainer)\n{\n    trainer->cleanUp();\n    uncheck_all_checkbuttons(window);\n}\n\nbool compareNumericStrings(const std::string &a, const std::string &b)\n{\n    // Handle negative numbers\n    if (a[0] == '-' && b[0] != '-')\n        return true; // Negative is less than positive\n    if (a[0] != '-' && b[0] == '-')\n        return false; // Positive is greater than negative\n    if (a[0] == '-' && b[0] == '-')\n        return compareNumericStrings(b.substr(1), a.substr(1)); // Reverse comparison for negatives\n\n    // Remove leading zeros\n    std::string a_trim = a;\n    std::string b_trim = b;\n    a_trim.erase(0, a_trim.find_first_not_of('0'));\n    b_trim.erase(0, b_trim.find_first_not_of('0'));\n\n    // Compare by length\n    if (a_trim.size() != b_trim.size())\n        return a_trim.size() < b_trim.size();\n\n    // Compare lexicographically if lengths are equal\n    return a_trim < b_trim;\n}\n\nvoid set_input_values(Fl_Input *input, std::string def, std::string min, std::string max)\n{\n    input->value(def.c_str());\n\n    // A callback function to handle input changes\n    auto input_callback = [](Fl_Widget *widget, void *data)\n    {\n        Fl_Input *input = dynamic_cast<Fl_Input *>(widget);\n        if (!input)\n            return;\n\n        std::string value = input->value();\n        auto constraints = static_cast<std::tuple<std::string, std::string, std::string> *>(data);\n        std::string def = std::get<0>(*constraints);\n        std::string min = std::get<1>(*constraints);\n        std::string max = std::get<2>(*constraints);\n\n        if (value.empty())\n        {\n            input->value(def.c_str());\n        }\n        else if (compareNumericStrings(value, min))\n        {\n            input->value(min.c_str());\n        }\n        else if (compareNumericStrings(max, value))\n        {\n            input->value(max.c_str());\n        }\n    };\n\n    // Associate the callback with the input field and pass the min/max data\n    auto *constraints = new std::tuple<std::string, std::string, std::string>(def, min, max);\n    input->callback(input_callback, (void *)constraints);\n}\n\n// Function to periodically check process status and update GUI\nvoid check_process_status(void *data)\n{\n    TimeoutData *timeoutData = static_cast<TimeoutData *>(data);\n    Trainer *trainer = timeoutData->trainer;\n    Fl_Box *process_exe = timeoutData->process_exe;\n    Fl_Box *process_id = timeoutData->process_id;\n\n    bool running = trainer->isProcessRunning();\n\n    // Retrieve process information\n    std::wstring processExeW = trainer->getProcessName();\n    std::string processExeStr;\n    if (!processExeW.empty())\n    {\n        int size_needed = WideCharToMultiByte(CP_UTF8, 0, processExeW.c_str(), -1, nullptr, 0, nullptr, nullptr);\n        if (size_needed > 0)\n        {\n            processExeStr.resize(size_needed - 1);\n            WideCharToMultiByte(CP_UTF8, 0, processExeW.c_str(), -1, &processExeStr[0], size_needed, nullptr, nullptr);\n        }\n    }\n    DWORD processId = trainer->getProcessId();\n    std::string processIdStr = processId ? std::to_string(processId) : \"N/A\";\n\n    // Set label color based on process status\n    process_exe->copy_label(processExeStr.c_str());\n    process_exe->labelcolor(running ? FL_DARK_GREEN : FL_RED);\n    process_exe->labelsize(font_size);\n\n    process_id->copy_label(processIdStr.c_str());\n    process_id->labelcolor(FL_WHITE);\n    process_id->labelsize(font_size);\n\n    if (!running)\n    {\n        clean_up(process_exe->window(), trainer);\n    }\n\n    Fl::repeat_timeout(1.0, check_process_status, data);\n}\n\n// ===========================================================================\n// Info Table and Callbacks\n// ===========================================================================\n\n// Displayed by pressing info button\nclass ItemTable : public Fl_Table\n{\nprivate:\n    std::vector<std::vector<std::string>> items;\n    int selected_row = -1;\n    Fl_Input *input;\n    std::vector<std::string> columnTitles;\n\nprotected:\n    void draw_cell(TableContext context, int row, int col, int x, int y, int w, int h) override\n    {\n        switch (context)\n        {\n        case CONTEXT_STARTPAGE:\n            fl_font(FL_FREE_FONT, font_size);\n            return;\n        case CONTEXT_COL_HEADER:\n            fl_push_clip(x, y, w, h);\n            fl_color(FL_FREE_COLOR);\n            fl_rectf(x, y, w, h);\n            fl_color(FL_WHITE);\n            if (col >= 0 && col < (int)columnTitles.size())\n            {\n                fl_draw(t(columnTitles[col]), x + 4, y, w, h, FL_ALIGN_LEFT);\n            }\n            fl_pop_clip();\n            return;\n        case CONTEXT_CELL:\n            fl_push_clip(x, y, w, h);\n            fl_color(row == selected_row ? fl_lighter(FL_FREE_COLOR) : FL_FREE_COLOR);\n            fl_rectf(x, y, w, h);\n            fl_color(FL_WHITE);\n            if (row < (int)items.size() && col < (int)items[row].size())\n            {\n                fl_draw(items[row][col].c_str(), x + 4, y, w, h, FL_ALIGN_LEFT);\n            }\n            fl_pop_clip();\n            return;\n        default:\n            return;\n        }\n    }\n\n    bool find_cell_at(int mouse_x, int mouse_y, int &row, int &col)\n    {\n        int table_x = x();\n        int table_y = y();\n        int table_w = w() - scrollbar_size();\n        int table_h = h() - scrollbar_size();\n\n        int mx = mouse_x - table_x;\n        int my = mouse_y - table_y;\n\n        int scroll_y = vscrollbar->value();\n        int adjusted_my = my + scroll_y;\n\n        if (mx < 0 || mx >= table_w)\n            return false;\n\n        int y_offset = col_header_height();\n        row = -1;\n        for (int r = 0; r < rows(); r++)\n        {\n            int rh = row_height(r);\n            if (adjusted_my >= y_offset && adjusted_my < y_offset + rh)\n            {\n                row = r;\n                break;\n            }\n            y_offset += rh;\n        }\n        if (row < 0 || row >= (int)items.size())\n            return false;\n\n        int x_offset = 0;\n        col = -1;\n        for (int c = 0; c < cols(); c++)\n        {\n            int cw = col_width(c);\n            if (mx >= x_offset && mx < x_offset + cw)\n            {\n                col = c;\n                break;\n            }\n            x_offset += cw;\n        }\n        if (col < 0 || col >= cols())\n            return false;\n\n        return true;\n    }\n\n    int handle(int event) override\n    {\n        int ret = Fl_Table::handle(event);\n        int row, col;\n\n        if (event == FL_PUSH && Fl::event_button() == FL_LEFT_MOUSE)\n        {\n            if (find_cell_at(Fl::event_x(), Fl::event_y(), row, col))\n            {\n                selected_row = row;\n                if (input && row < (int)items.size() && !items[row].empty())\n                {\n                    input->value(items[row][0].c_str());\n                }\n                redraw();\n                return 1;\n            }\n            else\n            {\n                selected_row = -1;\n                redraw();\n                return 1;\n            }\n        }\n        else if (event == FL_RELEASE && Fl::event_button() == FL_LEFT_MOUSE && Fl::event_clicks() > 0)\n        {\n            if (find_cell_at(Fl::event_x(), Fl::event_y(), row, col))\n            {\n                selected_row = row;\n                if (input && row < (int)items.size() && !items[row].empty())\n                {\n                    input->value(items[row][0].c_str());\n                }\n                Fl_Window *win = dynamic_cast<Fl_Window *>(parent()->top_window());\n                if (win)\n                {\n                    win->hide();\n                }\n                redraw();\n                return 1;\n            }\n        }\n        return ret;\n    }\n\npublic:\n    ItemTable(int x, int y, int w, int h, Fl_Input *inp, const std::vector<std::string> &titles, const char *l = 0) : Fl_Table(x, y, w, h, l), input(inp), columnTitles(titles)\n    {\n        int scrollbarSize = 16;\n        int numCols = titles.size();\n        cols(numCols);\n        col_header(1);\n\n        // Set column widths: first column (ID) is narrower, remaining columns share the rest\n        int availableWidth = w - scrollbarSize;\n        int idColWidth = 100;\n        int otherColsWidth = (availableWidth - idColWidth) / (numCols - 1);\n\n        col_width(0, idColWidth);\n        for (int i = 1; i < numCols; i++)\n        {\n            col_width(i, otherColsWidth);\n        }\n\n        row_header(0);\n        box(FL_NO_BOX);\n        scrollbar_size(scrollbarSize);\n        end();\n    }\n\n    void setItems(const std::vector<std::vector<std::string>> &item_list)\n    {\n        items = item_list;\n        rows(item_list.size());\n        selected_row = -1;\n        redraw();\n    }\n};\n\nvoid toggle_callback(Fl_Widget *widget, void *data);\nvoid apply_callback(Fl_Widget *widget, void *data);\nvoid info_callback(Fl_Widget *widget, void *data)\n{\n    InfoCallbackData *info_data = static_cast<InfoCallbackData *>(data);\n    if (!info_data || !info_data->trainer || info_data->columnTitles.empty() || !info_data->windowInstance)\n        return;\n\n    Trainer *trainer = info_data->trainer;\n    Fl_Input *input = info_data->input_ptr ? *info_data->input_ptr : nullptr;\n    const std::vector<std::string> &columnTitles = info_data->columnTitles;\n    const std::string &windowTitleKey = info_data->windowTitleKey;\n    Fl_Window *&list_window = *info_data->windowInstance;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Call the member function pointer to get the list data\n    std::string itemListData = (trainer->*info_data->dataRetriever)();\n\n    if (list_window && list_window->shown())\n    {\n        list_window->show();\n        return;\n    }\n\n    Fl_Window *trainer_window = widget->window();\n    int trainer_x = trainer_window->x();\n    int trainer_y = trainer_window->y();\n    int trainer_w = trainer_window->w();\n    int trainer_h = trainer_window->h();\n\n    int list_w = 350;\n    int list_h = 500;\n    int list_x = trainer_x + (trainer_w - list_w) / 2;\n    int list_y = trainer_y + (trainer_h - list_h) / 2;\n\n    list_window = new Fl_Window(list_x, list_y, list_w, list_h, t(windowTitleKey.c_str()));\n    list_window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n\n    std::vector<std::vector<std::string>> items;\n    int numCols = columnTitles.size();\n    std::istringstream iss(itemListData);\n    std::string line;\n\n    while (std::getline(iss, line))\n    {\n        line.erase(std::remove(line.begin(), line.end(), '\\r'), line.end());\n\n        // Parse columns separated by '>'\n        std::vector<std::string> rowData;\n        std::istringstream lineStream(line);\n        std::string column;\n\n        while (std::getline(lineStream, column, '>'))\n        {\n            const char *translatedText = t(column);\n            std::string displayText = (translatedText && *translatedText) ? std::string(translatedText) : column;\n            rowData.push_back(displayText);\n        }\n\n        if ((int)rowData.size() >= numCols)\n        {\n            rowData.resize(numCols);\n            items.push_back(rowData);\n        }\n    }\n\n    ItemTable *table = new ItemTable(0, 0, list_w, list_h, input, columnTitles);\n    table->setItems(items);\n    table->color(FL_FREE_COLOR);\n\n    list_window->end();\n    list_window->show();\n}\n\n// ===========================================================================\n// Widget Placement Helper Functions\n// ===========================================================================\n\nFl_Button *create_info_button(\n    Trainer *trainer,\n    Fl_Input **input_field_ptr,\n    const std::vector<std::string> &info_columns,\n    const std::string &info_window_key,\n    Fl_Window **info_window_instance,\n    std::string (Trainer::*info_data_retriever)(),\n    Fl_PNG_Image *info_img)\n{\n    Fl_Button *info_button = new Fl_Button(0, 0, 0, 0);\n    info_button->box(FL_NO_BOX);\n    info_button->image(info_img);\n\n    InfoCallbackData *info_data = new InfoCallbackData{trainer, input_field_ptr, info_window_key, info_window_instance, info_columns, info_data_retriever};\n    info_button->callback(info_callback, info_data);\n\n    return info_button;\n}\n\nFl_Box *create_info_hover(\n    std::string info_text,\n    Fl_PNG_Image *info_img)\n{\n    Fl_Box *info_hover = new Fl_Box(0, 0, 0, 0);\n    info_hover->box(FL_NO_BOX);\n    info_hover->image(info_img);\n    info_hover->tooltip(info_text.c_str());\n    tr(info_hover, info_text);\n\n    return info_hover;\n}\n\nFl_Check_Button *place_toggle_widget(\n    Fl_Flex *parent_flex,\n    Trainer *trainer,\n    const std::string &optionName,\n    const std::string &labelKey,\n    Fl_Input **out_input = nullptr,\n    const char *input_default = nullptr,\n    const char *input_min = nullptr,\n    const char *input_max = nullptr,\n    int input_type = FL_INT_INPUT,\n    Fl_Widget *info_button = nullptr)\n{\n    Fl_Flex *toggle_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    toggle_flex->gap(UI_OPTION_GAP);\n\n    Fl_Box *toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    toggle_flex->fixed(toggle_spacer, UI_TOGGLE_SPACER_WIDTH);\n\n    Fl_Check_Button *check_button = new Fl_Check_Button(0, 0, 0, 0);\n    toggle_flex->fixed(check_button, UI_TOGGLE_WIDTH);\n\n    Fl_Box *label = new Fl_Box(0, 0, 0, 0);\n    tr(label, labelKey);\n\n    Fl_Input *input = nullptr;\n    if (input_default && input_min && input_max)\n    {\n        input = new Fl_Input(0, 0, 0, 0);\n        toggle_flex->fixed(input, UI_INPUT_WIDTH);\n        input->type(input_type);\n        set_input_values(input, input_default, input_min, input_max);\n        if (out_input)\n            *out_input = input;\n    }\n\n    // Optional info button\n    if (info_button)\n    {\n        toggle_flex->fixed(info_button, 20);\n        toggle_flex->add(info_button);\n    }\n\n    ToggleData *toggle_data = new ToggleData{trainer, optionName, check_button, input};\n    check_button->callback(toggle_callback, toggle_data);\n\n    toggle_flex->end();\n    parent_flex->fixed(toggle_flex, UI_OPTION_HEIGHT);\n\n    return check_button;\n}\n\nFl_Button *place_apply_widget(\n    Fl_Flex *parent_flex,\n    Trainer *trainer,\n    const std::string &optionName,\n    const std::string &labelKey,\n    Fl_Input **out_input = nullptr,\n    const char *input_default = nullptr,\n    const char *input_min = nullptr,\n    const char *input_max = nullptr,\n    int input_type = FL_INT_INPUT,\n    Fl_Widget *info_button = nullptr)\n{\n    Fl_Flex *apply_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    apply_flex->gap(UI_OPTION_GAP);\n\n    Fl_Button *apply_button = new Fl_Button(0, 0, 0, 0);\n    apply_flex->fixed(apply_button, UI_BUTTON_WIDTH);\n    tr(apply_button, \"Apply\");\n\n    Fl_Box *label = new Fl_Box(0, 0, 0, 0);\n    tr(label, labelKey);\n\n    Fl_Input *input = nullptr;\n    if (input_default && input_min && input_max)\n    {\n        input = new Fl_Input(0, 0, 0, 0);\n        apply_flex->fixed(input, UI_INPUT_WIDTH);\n        input->type(input_type);\n        set_input_values(input, input_default, input_min, input_max);\n        if (out_input)\n            *out_input = input;\n    }\n\n    // Optional info button\n    if (info_button)\n    {\n        apply_flex->fixed(info_button, 20);\n        apply_flex->add(info_button);\n    }\n\n    ApplyData *apply_data = new ApplyData{trainer, optionName, apply_button, input};\n    apply_button->callback(apply_callback, apply_data);\n\n    apply_flex->end();\n    parent_flex->fixed(apply_flex, UI_OPTION_HEIGHT);\n\n    return apply_button;\n}\n\nWidgetPair place_indented_toggle_widget(\n    Fl_Flex *parent_flex,\n    const std::string &labelKey,\n    const char *input_default = nullptr,\n    const char *input_min = nullptr,\n    const char *input_max = nullptr,\n    int input_type = FL_INT_INPUT)\n{\n    Fl_Flex *toggle_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    toggle_flex->gap(UI_OPTION_GAP);\n\n    Fl_Box *indent_spacer = new Fl_Box(0, 0, 0, 0);\n    toggle_flex->fixed(indent_spacer, UI_BUTTON_WIDTH);\n\n    Fl_Box *toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    toggle_flex->fixed(toggle_spacer, UI_TOGGLE_SPACER_WIDTH);\n\n    Fl_Check_Button *check_button = new Fl_Check_Button(0, 0, 0, 0);\n    toggle_flex->fixed(check_button, UI_TOGGLE_WIDTH);\n\n    Fl_Box *label = new Fl_Box(0, 0, 0, 0);\n    tr(label, labelKey);\n\n    Fl_Input *input = nullptr;\n    if (input_default && input_min && input_max)\n    {\n        input = new Fl_Input(0, 0, 0, 0);\n        toggle_flex->fixed(input, UI_INPUT_WIDTH);\n        input->type(input_type);\n        set_input_values(input, input_default, input_min, input_max);\n    }\n\n    toggle_flex->end();\n    parent_flex->fixed(toggle_flex, UI_OPTION_HEIGHT);\n\n    return WidgetPair{check_button, input};\n}\n\nWidgetPair place_indented_apply_widget(\n    Fl_Flex *parent_flex,\n    const std::string &labelKey,\n    const char *input_default = nullptr,\n    const char *input_min = nullptr,\n    const char *input_max = nullptr,\n    int input_type = FL_INT_INPUT)\n{\n    Fl_Flex *apply_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    apply_flex->gap(UI_OPTION_GAP);\n\n    Fl_Box *indent_spacer = new Fl_Box(0, 0, 0, 0);\n    apply_flex->fixed(indent_spacer, UI_BUTTON_WIDTH);\n\n    Fl_Button *apply_button = new Fl_Button(0, 0, 0, 0);\n    apply_flex->fixed(apply_button, UI_BUTTON_WIDTH);\n    tr(apply_button, \"Apply\");\n\n    Fl_Box *label = new Fl_Box(0, 0, 0, 0);\n    tr(label, labelKey);\n\n    Fl_Input *input = nullptr;\n    if (input_default && input_min && input_max)\n    {\n        input = new Fl_Input(0, 0, 0, 0);\n        apply_flex->fixed(input, UI_INPUT_WIDTH);\n        input->type(input_type);\n        set_input_values(input, input_default, input_min, input_max);\n    }\n\n    apply_flex->end();\n    parent_flex->fixed(apply_flex, UI_OPTION_HEIGHT);\n\n    return WidgetPair{apply_button, input};\n}\n\nFl_Input *place_indented_input_widget(\n    Fl_Flex *parent_flex,\n    const std::string &labelKey,\n    const char *input_default,\n    const char *input_min,\n    const char *input_max,\n    int input_type = FL_INT_INPUT)\n{\n    Fl_Flex *input_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    input_flex->gap(UI_OPTION_GAP);\n\n    Fl_Box *indent_spacer = new Fl_Box(0, 0, 0, 0);\n    input_flex->fixed(indent_spacer, UI_BUTTON_WIDTH);\n\n    Fl_Input *input = new Fl_Input(0, 0, 0, 0);\n    input_flex->fixed(input, UI_BUTTON_WIDTH);\n    input->type(input_type);\n    set_input_values(input, input_default, input_min, input_max);\n\n    Fl_Box *label = new Fl_Box(0, 0, 0, 0);\n    tr(label, labelKey);\n\n    input_flex->end();\n    parent_flex->fixed(input_flex, UI_OPTION_HEIGHT);\n\n    return input;\n}"
  },
  {
    "path": "Game Trainers/common/include/Il2CppBase.h",
    "content": "#pragma once\n\n#include \"TrainerBase.h\"\n#include <psapi.h>\n\nclass Il2CppBase : public TrainerBase\n{\npublic:\n    HMODULE hInjectedDll = NULL;\n    void *remoteArgMemory = nullptr;\n    std::string injectedDllPath;\n    uintptr_t remoteModuleBase = 0;\n    uintptr_t localModuleBase = 0;\n\n    // Response communication with injected DLL\n    HANDLE hResponseMapFile = NULL;\n    LPVOID responseBuffer = nullptr;\n    HANDLE hResponseEvent = NULL;\n    const size_t responseBufferSize = 1024 * 1024;\n\n    const char *DLL_RESOURCE_NAME = \"IL2CPP_DLL\";\n\n    Il2CppBase(const std::wstring &processIdentifier, bool useWindowTitle = false)\n        : TrainerBase(processIdentifier, useWindowTitle)\n    {\n    }\n\n    virtual ~Il2CppBase()\n    {\n        unloadDll();\n    }\n\n    // Extract DLL from resources to a temp file with unique name per trainer\n    std::string extractDllFromResource()\n    {\n        HMODULE hModule = GetModuleHandle(nullptr);\n        HRSRC hResource = FindResourceA(hModule, DLL_RESOURCE_NAME, MAKEINTRESOURCEA(10));\n        if (!hResource)\n        {\n            std::cerr << \"[!] Failed to find resource: \" << DLL_RESOURCE_NAME << \"\\n\";\n            return \"\";\n        }\n\n        HGLOBAL hData = LoadResource(hModule, hResource);\n        if (!hData)\n        {\n            std::cerr << \"[!] Failed to load resource: \" << DLL_RESOURCE_NAME << \"\\n\";\n            return \"\";\n        }\n\n        LPVOID pData = LockResource(hData);\n        if (!pData)\n        {\n            std::cerr << \"[!] Failed to lock resource: \" << DLL_RESOURCE_NAME << \"\\n\";\n            return \"\";\n        }\n\n        DWORD dwSize = SizeofResource(hModule, hResource);\n        char tempPath[MAX_PATH];\n        GetTempPathA(MAX_PATH, tempPath);\n\n        char dllPath[MAX_PATH];\n        strcpy_s(dllPath, MAX_PATH, tempPath);\n        // Create unique filename with current process ID to avoid conflicts between trainer instances\n        char uniqueName[64];\n        snprintf(uniqueName, sizeof(uniqueName), \"IL2CPP_%lu.dll\", GetCurrentProcessId());\n        strcat_s(dllPath, MAX_PATH, uniqueName);\n\n        HANDLE hFile = CreateFileA(dllPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);\n        if (hFile == INVALID_HANDLE_VALUE)\n        {\n            std::cerr << \"[!] Failed to create DLL file: \" << dllPath << \"\\n\";\n            return \"\";\n        }\n\n        DWORD bytesWritten;\n        WriteFile(hFile, pData, dwSize, &bytesWritten, nullptr);\n        CloseHandle(hFile);\n\n        if (bytesWritten != dwSize)\n        {\n            std::cerr << \"[!] Failed to write DLL resource to file.\\n\";\n            DeleteFileA(dllPath);\n            return \"\";\n        }\n\n        std::cout << \"[+] DLL extracted to: \" << dllPath << std::endl;\n        return std::string(dllPath);\n    }\n\n    /** Injects the DLL into the target process and retrieves its base address */\n    bool initializeDllInjection()\n    {\n        if (hInjectedDll != NULL)\n            return true;\n\n        // 1. Extract DLL to temp location\n        if (injectedDllPath.empty())\n        {\n            injectedDllPath = extractDllFromResource();\n            if (injectedDllPath.empty())\n            {\n                std::cerr << \"[!] Failed to extract DLL from resources.\\n\";\n                return false;\n            }\n        }\n\n        // 2. Allocate memory in target process for DLL path\n        size_t pathLength = injectedDllPath.length() + 1;\n        LPVOID pRemotePath = VirtualAllocEx(hProcess, nullptr, pathLength, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!pRemotePath)\n        {\n            std::cerr << \"[!] Failed to allocate memory in target process.\\n\";\n            return false;\n        }\n\n        // 3. Write DLL path to remote memory\n        if (!WriteProcessMemory(hProcess, pRemotePath, injectedDllPath.c_str(), pathLength, nullptr))\n        {\n            std::cerr << \"[!] Failed to write DLL path to target process.\\n\";\n            VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // 4. Get LoadLibraryA address\n        HMODULE kernel32 = GetModuleHandleA(\"kernel32.dll\");\n        FARPROC loadLibraryA = GetProcAddress(kernel32, \"LoadLibraryA\");\n        if (!loadLibraryA)\n        {\n            std::cerr << \"[!] Failed to get LoadLibraryA address.\\n\";\n            VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // 5. Create remote thread to load DLL\n        HANDLE hRemoteThread = CreateRemoteThread(\n            hProcess,\n            nullptr,\n            0,\n            (LPTHREAD_START_ROUTINE)loadLibraryA,\n            pRemotePath,\n            0,\n            nullptr);\n\n        if (!hRemoteThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread.\\n\";\n            VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // 6. Wait for remote thread\n        DWORD waitResult = WaitForSingleObject(hRemoteThread, 5000);\n        if (waitResult == WAIT_TIMEOUT)\n        {\n            std::cerr << \"[!] Remote thread timed out.\\n\";\n            TerminateThread(hRemoteThread, 0);\n            CloseHandle(hRemoteThread);\n            VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // 7. Get module base from exit code\n        DWORD exitCode = 0;\n        GetExitCodeThread(hRemoteThread, &exitCode);\n        remoteModuleBase = static_cast<uintptr_t>(exitCode);\n\n        CloseHandle(hRemoteThread);\n        VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);\n\n        // For 64-bit processes, the exit code is truncated, so we need to find the actual module base\n        // Use EnumProcessModules with a short timeout to find the injected DLL\n        remoteModuleBase = 0;\n        std::string dllName = injectedDllPath.substr(injectedDllPath.find_last_of(\"\\\\/\") + 1);\n\n        // Poll for module with timeout\n        DWORD pollStart = GetTickCount();\n        const DWORD POLL_TIMEOUT = 2000; // 2 second timeout\n\n        while (!remoteModuleBase && (GetTickCount() - pollStart) < POLL_TIMEOUT)\n        {\n            HMODULE modules[1024];\n            DWORD needed = 0;\n            if (EnumProcessModules(hProcess, modules, sizeof(modules), &needed))\n            {\n                int numModules = needed / sizeof(HMODULE);\n                for (int i = 0; i < numModules; i++)\n                {\n                    char modulePath[MAX_PATH];\n                    if (GetModuleFileNameExA(hProcess, modules[i], modulePath, MAX_PATH))\n                    {\n                        std::string modPath(modulePath);\n                        std::string modName = modPath.substr(modPath.find_last_of(\"\\\\/\") + 1);\n                        if (modName == dllName)\n                        {\n                            remoteModuleBase = reinterpret_cast<uintptr_t>(modules[i]);\n                            break;\n                        }\n                    }\n                }\n            }\n\n            if (!remoteModuleBase)\n                Sleep(50); // Small delay before retry\n        }\n\n        if (!remoteModuleBase)\n        {\n            std::cerr << \"[!] Failed to find injected DLL in target process.\\n\";\n            return false;\n        }\n\n        // 8. Load DLL locally for offset calculations\n        HMODULE hLocalDll = LoadLibraryA(injectedDllPath.c_str());\n        if (!hLocalDll)\n        {\n            std::cerr << \"[!] Failed to load DLL locally.\\n\";\n            return false;\n        }\n\n        localModuleBase = reinterpret_cast<uintptr_t>(hLocalDll);\n        hInjectedDll = hLocalDll;\n\n        std::cout << \"[+] DLL injected successfully.\\n\";\n        std::cout << \"[+] Remote base: 0x\" << std::hex << remoteModuleBase << std::dec << \"\\n\";\n\n        // 9. Initialize response communication channel\n        if (!initializeResponseChannel())\n        {\n            std::cerr << \"[!] Failed to initialize response communication channel.\\n\";\n            return false;\n        }\n\n        return true;\n    }\n\n    /** Initialize shared memory and event for receiving responses from injected DLL */\n    bool initializeResponseChannel()\n    {\n        std::string responseSharedMemName = \"IL2CppResponseSharedMemory_\" + std::to_string(procId);\n        hResponseMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, responseBufferSize, responseSharedMemName.c_str());\n        if (hResponseMapFile == NULL)\n        {\n            std::cerr << \"[!] Failed to create response file mapping: \" << GetLastError() << \"\\n\";\n            return false;\n        }\n\n        responseBuffer = MapViewOfFile(hResponseMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);\n        if (responseBuffer == NULL)\n        {\n            std::cerr << \"[!] Failed to map response buffer: \" << GetLastError() << \"\\n\";\n            CloseHandle(hResponseMapFile);\n            hResponseMapFile = NULL;\n            return false;\n        }\n\n        std::string eventName = \"IL2CppResponseEvent_\" + std::to_string(procId);\n        hResponseEvent = CreateEventA(NULL, FALSE, FALSE, eventName.c_str());\n        if (hResponseEvent == NULL)\n        {\n            std::cerr << \"[!] Failed to create response event: \" << GetLastError() << \"\\n\";\n            UnmapViewOfFile(responseBuffer);\n            CloseHandle(hResponseMapFile);\n            hResponseMapFile = NULL;\n            responseBuffer = NULL;\n            return false;\n        }\n\n        std::cout << \"[+] Response communication channel initialized.\\n\";\n        return true;\n    }\n\n    void unloadDll()\n    {\n        if (hInjectedDll)\n        {\n            hInjectedDll = NULL;\n        }\n        if (remoteArgMemory)\n        {\n            VirtualFreeEx(hProcess, remoteArgMemory, 0, MEM_RELEASE);\n            remoteArgMemory = nullptr;\n        }\n        if (!injectedDllPath.empty())\n            DeleteFileA(injectedDllPath.c_str());\n    }\n\n    /** Calls an exported function in the injected DLL with no arguments */\n    bool invokeMethod(const char *functionName)\n    {\n        char dummy = 0;\n        return invokeMethod<char>(functionName, dummy);\n    }\n\n    /** Calls an exported function in the injected DLL with the given arguments */\n    template <typename T>\n    bool invokeMethod(const char *functionName, T args)\n    {\n        if (!hInjectedDll)\n        {\n            std::cerr << \"[!] DLL not injected.\\n\";\n            return false;\n        }\n\n        if (!localModuleBase)\n        {\n            std::cerr << \"[!] Local module base not set.\\n\";\n            return false;\n        }\n\n        // Get function address from locally loaded DLL\n        FARPROC localFunc = GetProcAddress(hInjectedDll, functionName);\n        if (!localFunc)\n        {\n            std::cerr << \"[!] Function '\" << functionName << \"' not found.\\n\";\n            return false;\n        }\n\n        // Calculate offset from local DLL base\n        uintptr_t offset = reinterpret_cast<uintptr_t>(localFunc) - localModuleBase;\n\n        // Calculate remote function address\n        uintptr_t remoteFuncAddr = remoteModuleBase + offset;\n\n        // Allocate memory in remote process for arguments\n        if (!remoteArgMemory)\n        {\n            size_t allocSize = sizeof(T) + 16;\n            remoteArgMemory = VirtualAllocEx(hProcess, nullptr, allocSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n            if (!remoteArgMemory)\n            {\n                std::cerr << \"[!] Failed to allocate memory in target process.\\n\";\n                return false;\n            }\n        }\n\n        // Write arguments to remote memory\n        if (!WriteProcessMemory(hProcess, remoteArgMemory, &args, sizeof(T), nullptr))\n        {\n            std::cerr << \"[!] Failed to write arguments to remote process.\\n\";\n            return false;\n        }\n\n        // Create remote thread to execute function\n        HANDLE hThread = CreateRemoteThread(\n            hProcess,\n            nullptr,\n            0,\n            (LPTHREAD_START_ROUTINE)remoteFuncAddr,\n            remoteArgMemory,\n            0,\n            nullptr);\n\n        if (!hThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread.\\n\";\n            return false;\n        }\n\n        // Wait for execution with timeout\n        DWORD waitResult = WaitForSingleObject(hThread, 5000);\n        if (waitResult == WAIT_TIMEOUT)\n        {\n            std::cerr << \"[!] Remote function timed out.\\n\";\n            TerminateThread(hThread, 0);\n            CloseHandle(hThread);\n            return false;\n        }\n        else if (waitResult != WAIT_OBJECT_0)\n        {\n            std::cerr << \"[!] WaitForSingleObject failed.\\n\";\n            CloseHandle(hThread);\n            return false;\n        }\n\n        DWORD exitCode = 0;\n        GetExitCodeThread(hThread, &exitCode);\n        CloseHandle(hThread);\n\n        std::cout << \"[+] Function invoked successfully.\\n\";\n        return exitCode == 1;\n    }\n\n    /** Invoke an exported function and wait for a string response from the DLL */\n    std::string invokeMethodReturn(const char *functionName)\n    {\n        if (!hInjectedDll)\n        {\n            std::cerr << \"[!] DLL not injected.\\n\";\n            return \"\";\n        }\n\n        if (!hResponseEvent)\n        {\n            std::cerr << \"[!] Response channel not initialized.\\n\";\n            return \"\";\n        }\n\n        // Get function address from locally loaded DLL\n        FARPROC localFunc = GetProcAddress(hInjectedDll, functionName);\n        if (!localFunc)\n        {\n            std::cerr << \"[!] Function '\" << functionName << \"' not found.\\n\";\n            return \"\";\n        }\n\n        // Calculate offset from local DLL base\n        uintptr_t offset = reinterpret_cast<uintptr_t>(localFunc) - localModuleBase;\n\n        // Calculate remote function address\n        uintptr_t remoteFuncAddr = remoteModuleBase + offset;\n\n        // Create remote thread to execute function (no arguments needed for response functions)\n        HANDLE hThread = CreateRemoteThread(\n            hProcess,\n            nullptr,\n            0,\n            (LPTHREAD_START_ROUTINE)remoteFuncAddr,\n            nullptr,\n            0,\n            nullptr);\n\n        if (!hThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread.\\n\";\n            return \"\";\n        }\n\n        // Wait for thread execution\n        WaitForSingleObject(hThread, INFINITE);\n        CloseHandle(hThread);\n\n        // Wait for the response event with a timeout\n        DWORD waitResult = WaitForSingleObject(hResponseEvent, 5000); // 5 seconds timeout\n        if (waitResult == WAIT_TIMEOUT)\n        {\n            std::cerr << \"[!] Response timeout after 5 seconds.\\n\";\n            return \"\";\n        }\n        else if (waitResult == WAIT_FAILED)\n        {\n            std::cerr << \"[!] WaitForSingleObject failed: \" << GetLastError() << \"\\n\";\n            return \"\";\n        }\n\n        // Read the response from shared memory\n        size_t length = *reinterpret_cast<size_t *>(responseBuffer);\n        if (length >= responseBufferSize - sizeof(size_t))\n        {\n            std::cerr << \"[!] Response length exceeds buffer size.\\n\";\n            return \"\";\n        }\n\n        char *msgPtr = static_cast<char *>(responseBuffer) + sizeof(size_t);\n        std::string response(msgPtr, length);\n        return response;\n    }\n};"
  },
  {
    "path": "Game Trainers/common/include/MinHook.h",
    "content": "/*\n *  MinHook - The Minimalistic API Hooking Library for x64/x86\n *  Copyright (C) 2009-2017 Tsuda Kageyu.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__)\n    #error MinHook supports only x86 and x64 systems.\n#endif\n\n#include <windows.h>\n\n// MinHook Error Codes.\ntypedef enum MH_STATUS\n{\n    // Unknown error. Should not be returned.\n    MH_UNKNOWN = -1,\n\n    // Successful.\n    MH_OK = 0,\n\n    // MinHook is already initialized.\n    MH_ERROR_ALREADY_INITIALIZED,\n\n    // MinHook is not initialized yet, or already uninitialized.\n    MH_ERROR_NOT_INITIALIZED,\n\n    // The hook for the specified target function is already created.\n    MH_ERROR_ALREADY_CREATED,\n\n    // The hook for the specified target function is not created yet.\n    MH_ERROR_NOT_CREATED,\n\n    // The hook for the specified target function is already enabled.\n    MH_ERROR_ENABLED,\n\n    // The hook for the specified target function is not enabled yet, or already\n    // disabled.\n    MH_ERROR_DISABLED,\n\n    // The specified pointer is invalid. It points the address of non-allocated\n    // and/or non-executable region.\n    MH_ERROR_NOT_EXECUTABLE,\n\n    // The specified target function cannot be hooked.\n    MH_ERROR_UNSUPPORTED_FUNCTION,\n\n    // Failed to allocate memory.\n    MH_ERROR_MEMORY_ALLOC,\n\n    // Failed to change the memory protection.\n    MH_ERROR_MEMORY_PROTECT,\n\n    // The specified module is not loaded.\n    MH_ERROR_MODULE_NOT_FOUND,\n\n    // The specified function is not found.\n    MH_ERROR_FUNCTION_NOT_FOUND\n}\nMH_STATUS;\n\n// Can be passed as a parameter to MH_EnableHook, MH_DisableHook,\n// MH_QueueEnableHook or MH_QueueDisableHook.\n#define MH_ALL_HOOKS NULL\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n    // Initialize the MinHook library. You must call this function EXACTLY ONCE\n    // at the beginning of your program.\n    MH_STATUS WINAPI MH_Initialize(VOID);\n\n    // Uninitialize the MinHook library. You must call this function EXACTLY\n    // ONCE at the end of your program.\n    MH_STATUS WINAPI MH_Uninitialize(VOID);\n\n    // Creates a hook for the specified target function, in disabled state.\n    // Parameters:\n    //   pTarget     [in]  A pointer to the target function, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);\n\n    // Creates a hook for the specified API function, in disabled state.\n    // Parameters:\n    //   pszModule   [in]  A pointer to the loaded module name which contains the\n    //                     target function.\n    //   pszProcName [in]  A pointer to the target function name, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHookApi(\n        LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);\n\n    // Creates a hook for the specified API function, in disabled state.\n    // Parameters:\n    //   pszModule   [in]  A pointer to the loaded module name which contains the\n    //                     target function.\n    //   pszProcName [in]  A pointer to the target function name, which will be\n    //                     overridden by the detour function.\n    //   pDetour     [in]  A pointer to the detour function, which will override\n    //                     the target function.\n    //   ppOriginal  [out] A pointer to the trampoline function, which will be\n    //                     used to call the original target function.\n    //                     This parameter can be NULL.\n    //   ppTarget    [out] A pointer to the target function, which will be used\n    //                     with other functions.\n    //                     This parameter can be NULL.\n    MH_STATUS WINAPI MH_CreateHookApiEx(\n        LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);\n\n    // Removes an already created hook.\n    // Parameters:\n    //   pTarget [in] A pointer to the target function.\n    MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget);\n\n    // Enables an already created hook.\n    // Parameters:\n    //   pTarget [in] A pointer to the target function.\n    //                If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                enabled in one go.\n    MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);\n\n    // Disables an already created hook.\n    // Parameters:\n    //   pTarget [in] A pointer to the target function.\n    //                If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                disabled in one go.\n    MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget);\n\n    // Queues to enable an already created hook.\n    // Parameters:\n    //   pTarget [in] A pointer to the target function.\n    //                If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                queued to be enabled.\n    MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);\n\n    // Queues to disable an already created hook.\n    // Parameters:\n    //   pTarget [in] A pointer to the target function.\n    //                If this parameter is MH_ALL_HOOKS, all created hooks are\n    //                queued to be disabled.\n    MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);\n\n    // Applies all queued changes in one go.\n    MH_STATUS WINAPI MH_ApplyQueued(VOID);\n\n    // Translates the MH_STATUS to its name as a string.\n    const char * WINAPI MH_StatusToString(MH_STATUS status);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/MonoBase.h",
    "content": "// MonoBase.h\n#pragma once\n\n#include <FL/Fl.H>\n#include \"TrainerBase.h\"\n#include <mutex>\n#include <shlwapi.h>\n#include <sstream>\n#include <variant>\n\nclass MonoBase : public TrainerBase\n{\npublic:\n    using Param = std::variant<int, float, std::string>;\n\n    MonoBase(const std::wstring &processIdentifier, bool useWindowTitle = false)\n        : TrainerBase(processIdentifier, useWindowTitle)\n    {\n    }\n\n    virtual ~MonoBase()\n    {\n        cleanUp();\n    }\n\n    void cleanUp() override\n    {\n        // Note: MonoBridge.dll and GCMInjection.dll are not freed\n        TrainerBase::cleanUp();\n\n        if (loggingBuffer)\n        {\n            UnmapViewOfFile(loggingBuffer);\n            loggingBuffer = NULL;\n        }\n        if (hLoggingMapFile)\n        {\n            CloseHandle(hLoggingMapFile);\n            hLoggingMapFile = NULL;\n        }\n        if (responseBuffer)\n        {\n            UnmapViewOfFile(responseBuffer);\n            responseBuffer = NULL;\n        }\n        if (hResponseMapFile)\n        {\n            CloseHandle(hResponseMapFile);\n            hResponseMapFile = NULL;\n        }\n        if (hResponseEvent)\n        {\n            CloseHandle(hResponseEvent);\n            hResponseEvent = NULL;\n        }\n\n        if (!bridgeDllPath.empty())\n        {\n            DeleteFileW(bridgeDllPath.c_str());\n            // Remove the subdirectory\n            WCHAR dirPath[MAX_PATH];\n            wcscpy_s(dirPath, MAX_PATH, bridgeDllPath.c_str());\n            PathRemoveFileSpecW(dirPath);\n            RemoveDirectoryW(dirPath);\n            bridgeDllPath.clear();\n        }\n\n        if (extractedFiles.size() > 0)\n        {\n            for (const auto &file : extractedFiles)\n            {\n                DeleteFileW(file.c_str());\n            }\n            extractedFiles.clear();\n        }\n\n        dllInjected = false;\n    }\n\n    bool initializeDllInjection()\n    {\n        if (!dllInjected)\n        {\n            if (!injectBridgeDLL())\n                return false;\n\n            if (!getFunctionPointers())\n                return false;\n\n            if (!loadAssembly(\"GCMINJECTION_DLL\"))\n                return false;\n\n            if (!invokeMethod(\"\", \"GCMInjection\", \"Initialize\", {}))\n            {\n                std::cerr << \"[!] Failed to initialize dispatcher.\\n\";\n                return false;\n            }\n\n            if (!initializeLoggingChannel())\n            {\n                std::cerr << \"[!] Failed to initialize data logging channel.\\n\";\n                return false;\n            }\n\n            if (!initializeRequestChannel())\n            {\n                std::cerr << \"[!] Failed to initialize data request channel.\\n\";\n                return false;\n            }\n\n            dllInjected = true;\n        }\n        return dllInjected;\n    }\n\n    bool initializeLoggingChannel()\n    {\n        std::string loggingSharedMemName = \"TrainerLoggingSharedMemory_\" + std::to_string(procId);\n        hLoggingMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, loggingBufferSize, loggingSharedMemName.c_str());\n        if (hLoggingMapFile == NULL)\n        {\n            std::cerr << \"[!] Could not create file mapping object: \" << GetLastError() << \"\\n\";\n            return false;\n        }\n\n        loggingBuffer = MapViewOfFile(hLoggingMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);\n        if (loggingBuffer == NULL)\n        {\n            std::cerr << \"[!] Could not map view of file: \" << GetLastError() << \"\\n\";\n            CloseHandle(hLoggingMapFile);\n            hLoggingMapFile = NULL;\n            return false;\n        }\n\n        return true;\n    }\n\n    static void check_logging_available(void *data)\n    {\n        MonoBase *self = static_cast<MonoBase *>(data);\n\n        if (self->loggingBuffer != nullptr)\n        {\n            SharedMemoryHeader *header = static_cast<SharedMemoryHeader *>(self->loggingBuffer);\n            char *bufferStart = static_cast<char *>(self->loggingBuffer) + sizeof(SharedMemoryHeader);\n\n            std::lock_guard<std::mutex> lock(header->mutex);\n\n            while (header->head != header->tail)\n            {\n                size_t length = *reinterpret_cast<size_t *>(bufferStart + header->tail);\n                char *msgPtr = bufferStart + header->tail + sizeof(size_t);\n                std::string message(msgPtr, length);\n                std::cout << message << \"\\n\";\n                header->tail = (header->tail + sizeof(size_t) + length) % (self->loggingBufferSize - sizeof(SharedMemoryHeader));\n            }\n        }\n\n        Fl::repeat_timeout(0.1, check_logging_available, data);\n    }\n\n    bool initializeRequestChannel()\n    {\n        std::string responseSharedMemName = \"TrainerResponseSharedMemory_\" + std::to_string(procId);\n        hResponseMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, responseBufferSize, responseSharedMemName.c_str());\n        if (hResponseMapFile == NULL)\n        {\n            std::cerr << \"[!] Could not create response file mapping object: \" << GetLastError() << \"\\n\";\n            return false;\n        }\n\n        responseBuffer = MapViewOfFile(hResponseMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);\n        if (responseBuffer == NULL)\n        {\n            std::cerr << \"[!] Could not map view of response file: \" << GetLastError() << \"\\n\";\n            CloseHandle(hResponseMapFile);\n            hResponseMapFile = NULL;\n            return false;\n        }\n\n        std::string eventName = \"TrainerResponseEvent_\" + std::to_string(procId);\n        hResponseEvent = CreateEventA(NULL, FALSE, FALSE, eventName.c_str());\n        if (hResponseEvent == NULL)\n        {\n            std::cerr << \"[!] Could not create response event: \" << GetLastError() << \"\\n\";\n            UnmapViewOfFile(responseBuffer);\n            CloseHandle(hResponseMapFile);\n            hResponseMapFile = NULL;\n            responseBuffer = NULL;\n            return false;\n        }\n\n        return true;\n    }\n\n    /** Injects the C++ bridge DLL into the target process from embedded resources\n     * @return True if injection succeeds, false otherwise\n     */\n    bool injectBridgeDLL()\n    {\n        // Extract the DLL from resources\n        bridgeDllPath = extractResourceToTempFile(\"MONOBRIDGE_DLL\");\n        if (bridgeDllPath.empty())\n        {\n            std::cerr << \"[!] Failed to extract MonoBridge.dll from resources.\\n\";\n            return false;\n        }\n\n        if (!hProcess || !isProcessRunning())\n        {\n            std::cerr << \"[!] Process not running or handle invalid.\\n\";\n            return false;\n        }\n\n        size_t pathSize = (bridgeDllPath.size() + 1) * sizeof(wchar_t);\n        LPVOID allocMem = VirtualAllocEx(hProcess, nullptr, pathSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!allocMem)\n        {\n            std::cerr << \"[!] Failed to allocate memory in target process.\\n\";\n            return false;\n        }\n\n        if (!WriteProcessMemory(hProcess, allocMem, bridgeDllPath.c_str(), pathSize, nullptr))\n        {\n            std::cerr << \"[!] Failed to write DLL path to target process.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // Combine kernel32 handle and LoadLibraryW address retrieval\n        HMODULE kernel32 = GetModuleHandleW(L\"kernel32.dll\");\n        LPVOID loadLibraryAddr = kernel32 ? reinterpret_cast<LPVOID>(GetProcAddress(kernel32, \"LoadLibraryW\")) : nullptr;\n        if (!loadLibraryAddr)\n        {\n            std::cerr << \"[!] Failed to get LoadLibraryW address.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        HANDLE hThread = CreateRemoteThread(hProcess, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(loadLibraryAddr), allocMem, 0, nullptr);\n        if (!hThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread for LoadLibraryW.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        WaitForSingleObject(hThread, INFINITE);\n        DWORD exitCode = 0;\n        GetExitCodeThread(hThread, &exitCode);\n        CloseHandle(hThread);\n\n        if (exitCode == 0)\n        {\n            std::cerr << \"[!] LoadLibraryW failed in target process.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        bridgeDllBase = static_cast<uintptr_t>(exitCode);\n        VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n        return true;\n    }\n\n    /** Retrieves function pointers from the injected bridge DLL\n     * @return True if pointers are retrieved, false otherwise\n     */\n    bool getFunctionPointers()\n    {\n        if (!hProcess || !bridgeDllBase)\n        {\n            std::cerr << \"[!] Process handle invalid or bridge DLL not injected.\\n\";\n            return false;\n        }\n\n        HMODULE hLocalDll = LoadLibraryW(bridgeDllPath.c_str());\n        if (!hLocalDll)\n        {\n            std::cerr << \"[!] Failed to load bridge DLL locally from \" << wstringToString(bridgeDllPath) << std::endl;\n            return false;\n        }\n\n        FARPROC localGetFuncPtrs = GetProcAddress(hLocalDll, \"GetFunctionPointersThread\");\n        if (!localGetFuncPtrs)\n        {\n            std::cerr << \"[!] Failed to get address of GetFunctionPointersThread.\\n\";\n            FreeLibrary(hLocalDll);\n            return false;\n        }\n\n        uintptr_t localBase = reinterpret_cast<uintptr_t>(hLocalDll);\n        uintptr_t localAddr = reinterpret_cast<uintptr_t>(localGetFuncPtrs);\n        uintptr_t rva = localAddr - localBase;\n        LPVOID remoteGetFuncPtrs = reinterpret_cast<LPVOID>(bridgeDllBase + rva);\n\n        LPVOID allocMem = VirtualAllocEx(hProcess, nullptr, sizeof(FunctionPointers), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!allocMem)\n        {\n            std::cerr << \"[!] Failed to allocate memory for function pointers.\\n\";\n            FreeLibrary(hLocalDll);\n            return false;\n        }\n\n        HANDLE hThread = CreateRemoteThread(hProcess, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(remoteGetFuncPtrs), allocMem, 0, nullptr);\n        if (!hThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread for function pointers.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            FreeLibrary(hLocalDll);\n            return false;\n        }\n\n        WaitForSingleObject(hThread, INFINITE);\n        CloseHandle(hThread);\n\n        if (!ReadProcessMemory(hProcess, allocMem, &funcPtrs, sizeof(FunctionPointers), nullptr))\n        {\n            std::cerr << \"[!] Failed to read function pointers from target process.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            FreeLibrary(hLocalDll);\n            return false;\n        }\n\n        VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n        FreeLibrary(hLocalDll);\n        return true;\n    }\n\n    /** Loads a C# assembly from an embedded resource into the Mono runtime\n     * @param resourceName Name of the resource (e.g., \"GCMINJECTION_DLL\")\n     * @return True if successful, false otherwise\n     */\n    bool loadAssembly(const std::string &resourceName)\n    {\n        if (!hProcess || !funcPtrs.LoadAssemblyThread)\n        {\n            std::cerr << \"[!] Process handle invalid or LoadAssemblyThread pointer missing.\\n\";\n            return false;\n        }\n\n        std::wstring assemblyPath = extractResourceToTempFile(resourceName);\n        if (assemblyPath.empty())\n        {\n            std::cerr << \"[!] Failed to extract assembly from resource: \" << resourceName << \"\\n\";\n            return false;\n        }\n        extractedFiles.push_back(assemblyPath);\n\n        std::string pathStr = wstringToString(assemblyPath);\n        size_t pathLen = pathStr.size() + 1;\n        size_t paramsSize = sizeof(LoadAssemblyParams) + pathLen;\n\n        LPVOID allocMem = VirtualAllocEx(hProcess, nullptr, paramsSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!allocMem)\n        {\n            std::cerr << \"[!] Failed to allocate memory for assembly path.\\n\";\n            return false;\n        }\n\n        LPVOID pathMem = reinterpret_cast<LPVOID>(reinterpret_cast<uintptr_t>(allocMem) + sizeof(LoadAssemblyParams));\n        if (!WriteProcessMemory(hProcess, pathMem, pathStr.c_str(), pathLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to write assembly path to target process.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        LoadAssemblyParams params{};\n        params.path = reinterpret_cast<const char *>(pathMem);\n        if (!WriteProcessMemory(hProcess, allocMem, &params, sizeof(LoadAssemblyParams), nullptr))\n        {\n            std::cerr << \"[!] Failed to write LoadAssemblyParams to target process.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        HANDLE hThread = CreateRemoteThread(hProcess, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(funcPtrs.LoadAssemblyThread), allocMem, 0, nullptr);\n        if (!hThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread to load assembly.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        WaitForSingleObject(hThread, INFINITE);\n        CloseHandle(hThread);\n        VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n        return true;\n    }\n\n    /** Invokes a static method in the loaded C# assembly\n     * @param namespaceName Namespace of the class (e.g., \"MyNamespace\")\n     * @param className Class name (e.g., \"MyClass\")\n     * @param methodName Method name (e.g., \"MyMethod\")\n     * @param params Vector of parameters\n     * @return True if successful, false otherwise\n     */\n    bool invokeMethod(const std::string &namespaceName, const std::string &className, const std::string &methodName, const std::vector<Param> &params)\n    {\n        if (!hProcess || !funcPtrs.InvokeMethodThread)\n        {\n            std::cerr << \"[!] Process handle invalid or InvokeMethodThread pointer missing.\\n\";\n            return false;\n        }\n\n        size_t namespaceLen = namespaceName.size() + 1;\n        size_t classLen = className.size() + 1;\n        size_t methodLen = methodName.size() + 1;\n        size_t paramValuesSize = sizeof(ParamValue) * params.size();\n        size_t totalStringSize = 0;\n        for (const auto &p : params)\n        {\n            if (std::holds_alternative<std::string>(p))\n                totalStringSize += std::get<std::string>(p).size() + 1;\n        }\n        size_t totalSize = sizeof(InvokeMethodParams) + namespaceLen + classLen + methodLen + paramValuesSize + totalStringSize;\n\n        LPVOID allocMem = VirtualAllocEx(hProcess, nullptr, totalSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n        if (!allocMem)\n        {\n            std::cerr << \"[!] Failed to allocate memory for method invocation.\\n\";\n            return false;\n        }\n\n        LPVOID currentMem = reinterpret_cast<LPVOID>(reinterpret_cast<uintptr_t>(allocMem) + sizeof(InvokeMethodParams));\n        InvokeMethodParams invokeParams{};\n\n        // Write namespace\n        invokeParams.namespaceName = reinterpret_cast<const char *>(currentMem);\n        if (!WriteProcessMemory(hProcess, currentMem, namespaceName.c_str(), namespaceLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to write namespace name.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n        currentMem = reinterpret_cast<LPVOID>(reinterpret_cast<uintptr_t>(currentMem) + namespaceLen);\n\n        // Write class name\n        invokeParams.className = reinterpret_cast<const char *>(currentMem);\n        if (!WriteProcessMemory(hProcess, currentMem, className.c_str(), classLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to write class name.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n        currentMem = reinterpret_cast<LPVOID>(reinterpret_cast<uintptr_t>(currentMem) + classLen);\n\n        // Write method name\n        invokeParams.methodName = reinterpret_cast<const char *>(currentMem);\n        if (!WriteProcessMemory(hProcess, currentMem, methodName.c_str(), methodLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to write method name.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n        currentMem = reinterpret_cast<LPVOID>(reinterpret_cast<uintptr_t>(currentMem) + methodLen);\n\n        // Write parameter values\n        LPVOID paramValuesMem = currentMem;\n        std::vector<ParamValue> paramValues(params.size());\n        for (size_t i = 0; i < params.size(); ++i)\n        {\n            if (std::holds_alternative<int>(params[i]))\n            {\n                paramValues[i].type = ParamValue::INT;\n                paramValues[i].i = std::get<int>(params[i]);\n            }\n            else if (std::holds_alternative<float>(params[i]))\n            {\n                paramValues[i].type = ParamValue::FLOAT;\n                paramValues[i].f = std::get<float>(params[i]);\n            }\n            else if (std::holds_alternative<std::string>(params[i]))\n            {\n                paramValues[i].type = ParamValue::STRING;\n                const std::string &str = std::get<std::string>(params[i]);\n                paramValues[i].s = reinterpret_cast<const char *>(currentMem);\n                if (!WriteProcessMemory(hProcess, currentMem, str.c_str(), str.size() + 1, nullptr))\n                {\n                    std::cerr << \"[!] Failed to write string parameter.\\n\";\n                    VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n                    return false;\n                }\n                currentMem = reinterpret_cast<LPVOID>(reinterpret_cast<uintptr_t>(currentMem) + str.size() + 1);\n            }\n        }\n        invokeParams.paramCount = static_cast<int>(params.size());\n        invokeParams.paramValues = reinterpret_cast<ParamValue *>(paramValuesMem);\n        if (!WriteProcessMemory(hProcess, paramValuesMem, paramValues.data(), paramValuesSize, nullptr))\n        {\n            std::cerr << \"[!] Failed to write parameter values.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // Write InvokeMethodParams\n        if (!WriteProcessMemory(hProcess, allocMem, &invokeParams, sizeof(InvokeMethodParams), nullptr))\n        {\n            std::cerr << \"[!] Failed to write InvokeMethodParams.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        HANDLE hThread = CreateRemoteThread(hProcess, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(funcPtrs.InvokeMethodThread), allocMem, 0, nullptr);\n        if (!hThread)\n        {\n            std::cerr << \"[!] Failed to create remote thread for method invocation.\\n\";\n            VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        std::stringstream ss;\n        ss << \"[+] Invoked method \" << (namespaceName.empty() ? \"\" : namespaceName + \".\") << className << \".\" << methodName << \"(\";\n        for (size_t i = 0; i < params.size(); ++i)\n        {\n            if (i > 0)\n                ss << \", \";\n            if (std::holds_alternative<int>(params[i]))\n                ss << std::get<int>(params[i]);\n            else if (std::holds_alternative<float>(params[i]))\n                ss << std::get<float>(params[i]);\n            else if (std::holds_alternative<std::string>(params[i]))\n                ss << \"\\\"\" << std::get<std::string>(params[i]) << \"\\\"\";\n        }\n        ss << \")\\n\";\n        std::cout << ss.str();\n\n        WaitForSingleObject(hThread, INFINITE);\n        CloseHandle(hThread);\n        VirtualFreeEx(hProcess, allocMem, 0, MEM_RELEASE);\n        return true;\n    }\n\n    std::string invokeMethodReturn(const std::string &namespaceName, const std::string &className, const std::string &methodName, const std::vector<Param> &params)\n    {\n        if (!invokeMethod(namespaceName, className, methodName, params))\n        {\n            return \"\";\n        }\n\n        // Wait for the response event with a timeout\n        DWORD waitResult = WaitForSingleObject(hResponseEvent, 5000); // 5 seconds timeout\n        if (waitResult == WAIT_TIMEOUT)\n        {\n            std::cerr << \"[!] WaitForSingleObject timed out after 5 seconds\\n\";\n            return \"\";\n        }\n        else if (waitResult == WAIT_FAILED)\n        {\n            std::cerr << \"[!] WaitForSingleObject failed: \" << GetLastError() << \"\\n\";\n            return \"\";\n        }\n\n        // Read the response\n        size_t length = *reinterpret_cast<size_t *>(responseBuffer);\n        if (length >= responseBufferSize - sizeof(size_t))\n        {\n            std::cerr << \"[!] Response length exceeds buffer size.\\n\";\n            return \"\";\n        }\n        char *msgPtr = static_cast<char *>(responseBuffer) + sizeof(size_t);\n        std::string response(msgPtr, length);\n        return response;\n    }\n\nprivate:\n    bool dllInjected = false;\n    std::vector<std::wstring> extractedFiles;\n    std::wstring bridgeDllPath;\n    uintptr_t bridgeDllBase = 0;\n\n    // For injected dll communication\n    HANDLE hLoggingMapFile = NULL;\n    LPVOID loggingBuffer = nullptr;\n    const size_t loggingBufferSize = 1024 * 1024;\n    HANDLE hResponseMapFile = NULL;\n    LPVOID responseBuffer = NULL;\n    HANDLE hResponseEvent = NULL;\n    const size_t responseBufferSize = 1024 * 1024;\n\n    struct FunctionPointers\n    {\n        LPVOID LoadAssemblyThread = nullptr;\n        LPVOID InvokeMethodThread = nullptr;\n    } funcPtrs;\n\n    struct LoadAssemblyParams\n    {\n        const char *path;\n    };\n\n    struct ParamValue\n    {\n        enum Type\n        {\n            INT,\n            FLOAT,\n            STRING\n        } type;\n        union\n        {\n            int i;\n            float f;\n            const char *s;\n        };\n    };\n\n    struct InvokeMethodParams\n    {\n        const char *namespaceName;\n        const char *className;\n        const char *methodName;\n        int paramCount;\n        ParamValue *paramValues;\n    };\n\n    struct SharedMemoryHeader\n    {\n        size_t head;\n        size_t tail;\n        std::mutex mutex;\n    };\n\n    /** Extracts a DLL from embedded resources to a temporary file\n     * @param resourceName The resource identifier (e.g., \"MONOBRIDGE_DLL\")\n     * @return Path to the temporary file, or empty string if extraction fails\n     */\n    std::wstring extractResourceToTempFile(const std::string &resourceName)\n    {\n        HMODULE hModule = GetModuleHandle(nullptr);\n        HRSRC hResource = FindResourceA(hModule, resourceName.c_str(), MAKEINTRESOURCEA(10));\n        if (!hResource)\n        {\n            std::cerr << \"[!] Failed to find resource: \" << resourceName << \"\\n\";\n            return L\"\";\n        }\n\n        HGLOBAL hData = LoadResource(hModule, hResource);\n        if (!hData)\n        {\n            std::cerr << \"[!] Failed to load resource: \" << resourceName << \"\\n\";\n            return L\"\";\n        }\n\n        LPVOID pData = LockResource(hData);\n        if (!pData)\n        {\n            std::cerr << \"[!] Failed to lock resource: \" << resourceName << \"\\n\";\n            return L\"\";\n        }\n\n        DWORD dwSize = SizeofResource(hModule, hResource);\n        WCHAR tempPath[MAX_PATH];\n\n        if (resourceName == \"MONOBRIDGE_DLL\")\n        {\n            // Create a unique subdirectory to avoid name collisions\n            GUID guid;\n            CoCreateGuid(&guid);\n            WCHAR subDir[MAX_PATH];\n            StringFromGUID2(guid, subDir, MAX_PATH); // Generates a unique string like \"{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\"\n            GetTempPathW(MAX_PATH, tempPath);\n            wcscat_s(tempPath, MAX_PATH, subDir);\n            CreateDirectoryW(tempPath, nullptr);\n\n            // Construct the full path with the desired name\n            WCHAR dllPath[MAX_PATH];\n            wcscpy_s(dllPath, MAX_PATH, tempPath);\n            wcscat_s(dllPath, MAX_PATH, L\"\\\\\");\n            wcscat_s(dllPath, MAX_PATH, L\"MonoBridge.dll\");\n\n            HANDLE hFile = CreateFileW(dllPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);\n            if (hFile == INVALID_HANDLE_VALUE)\n            {\n                std::cerr << \"[!] Failed to create MonoBridge file: \" << wstringToString(dllPath) << \"\\n\";\n                return L\"\";\n            }\n\n            DWORD bytesWritten;\n            WriteFile(hFile, pData, dwSize, &bytesWritten, nullptr);\n            CloseHandle(hFile);\n\n            if (bytesWritten != dwSize)\n            {\n                std::cerr << \"[!] Failed to write MonoBridge resource to file: \" << wstringToString(dllPath) << \"\\n\";\n                DeleteFileW(dllPath);\n                return L\"\";\n            }\n\n            return std::wstring(dllPath);\n        }\n        else\n        {\n            // Default behavior: use a temporary filename\n            WCHAR tempFileName[MAX_PATH];\n            GetTempPathW(MAX_PATH, tempPath);\n            GetTempFileNameW(tempPath, L\"RES\", 0, tempFileName);\n\n            HANDLE hFile = CreateFileW(tempFileName, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);\n            if (hFile == INVALID_HANDLE_VALUE)\n            {\n                std::cerr << \"[!] Failed to create temporary file for resource.\\n\";\n                return L\"\";\n            }\n\n            DWORD bytesWritten;\n            WriteFile(hFile, pData, dwSize, &bytesWritten, nullptr);\n            CloseHandle(hFile);\n\n            if (bytesWritten != dwSize)\n            {\n                std::cerr << \"[!] Failed to write resource to temporary file.\\n\";\n                DeleteFileW(tempFileName);\n                return L\"\";\n            }\n\n            return std::wstring(tempFileName);\n        }\n    }\n};"
  },
  {
    "path": "Game Trainers/common/include/MonoBridge.cpp",
    "content": "#include <Windows.h>\n#include <mutex>\n#include <string>\n#include <vector>\n\n#define MONO_API extern \"C\" __declspec(dllimport)\n\ntypedef void *MonoDomain;\ntypedef void *MonoAssembly;\ntypedef void *MonoImage;\ntypedef void *MonoClass;\ntypedef void *MonoMethod;\ntypedef void *MonoObject;\ntypedef void *MonoThread;\ntypedef void *MonoString;\n\nMONO_API MonoDomain *mono_get_root_domain();\nMONO_API MonoThread *mono_thread_attach(MonoDomain *domain);\nMONO_API MonoAssembly *mono_assembly_open(const char *filename, void *status);\nMONO_API MonoAssembly *mono_domain_assembly_open(MonoDomain *domain, const char *name);\nMONO_API MonoImage *mono_assembly_get_image(MonoAssembly *assembly);\nMONO_API MonoClass *mono_class_from_name(MonoImage *image, const char *name_space, const char *name);\nMONO_API MonoMethod *mono_class_get_method_from_name(MonoClass *klass, const char *name, int param_count);\nMONO_API MonoObject *mono_runtime_invoke(MonoMethod *method, void *obj, void **params, MonoObject **exc);\nMONO_API MonoString *mono_string_new(MonoDomain *domain, const char *str);\n\nstruct ParamValue\n{\n    enum Type\n    {\n        INT,\n        FLOAT,\n        STRING\n    } type;\n    union\n    {\n        int i;\n        float f;\n        const char *s;\n    };\n};\n\nstruct FunctionPointers\n{\n    LPVOID LoadAssemblyThread;\n    LPVOID InvokeMethodThread;\n};\n\nstruct LoadAssemblyParams\n{\n    const char *path;\n};\n\nstruct InvokeMethodParams\n{\n    const char *namespaceName;\n    const char *className;\n    const char *methodName;\n    int paramCount;\n    ParamValue *paramValues;\n};\n\nstruct SharedMemoryHeader\n{\n    size_t head;\n    size_t tail;\n    std::mutex mutex;\n};\n\nMonoDomain *domain = nullptr;\nMonoAssembly *loadedAssembly = nullptr;\n\nstatic HANDLE hLoggingMapFile = NULL;\nstatic LPVOID loggingBuffer = NULL;\nstatic const size_t loggingBufferSize = 1024 * 1024; // 1MB\nstatic HANDLE hResponseMapFile = NULL;\nstatic LPVOID responseBuffer = NULL;\nstatic const size_t responseBufferSize = 1024 * 1024;\n\nextern \"C\" __declspec(dllexport) void SendData(const char *message)\n{\n    if (loggingBuffer == NULL)\n    {\n        DWORD pid = GetCurrentProcessId();\n        std::string loggingSharedMemName = \"TrainerLoggingSharedMemory_\" + std::to_string(pid);\n        hLoggingMapFile = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, loggingSharedMemName.c_str());\n        if (hLoggingMapFile == NULL)\n        {\n            DWORD errorCode = GetLastError();\n            return;\n        }\n\n        loggingBuffer = MapViewOfFile(hLoggingMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);\n        if (loggingBuffer == NULL)\n        {\n            DWORD errorCode = GetLastError();\n            CloseHandle(hLoggingMapFile);\n            hLoggingMapFile = NULL;\n            return;\n        }\n    }\n\n    // Validate the message\n    if (message == NULL)\n    {\n        return;\n    }\n    size_t length = strlen(message);\n    if (length + sizeof(size_t) > loggingBufferSize)\n    {\n        return;\n    }\n\n    SharedMemoryHeader *header = static_cast<SharedMemoryHeader *>(loggingBuffer);\n    char *bufferStart = static_cast<char *>(loggingBuffer) + sizeof(SharedMemoryHeader);\n\n    std::lock_guard<std::mutex> lock(header->mutex);\n\n    size_t nextHead = (header->head + sizeof(size_t) + length) % (loggingBufferSize - sizeof(SharedMemoryHeader));\n    if ((header->head < header->tail && nextHead >= header->tail) ||\n        (header->head >= header->tail && nextHead < header->head && nextHead >= header->tail))\n    {\n        // Queue is full\n        return;\n    }\n\n    *reinterpret_cast<size_t *>(bufferStart + header->head) = length;\n    memcpy(bufferStart + header->head + sizeof(size_t), message, length);\n    header->head = nextHead;\n}\n\nvoid Log(const char *message)\n{\n    std::string formattedMessage = \"[MonoBridge] \" + std::string(message);\n    SendData(formattedMessage.c_str());\n}\n\nvoid LogToFile(const char *message)\n{\n    std::string formattedMessage = \"[MonoBridge] \" + std::string(message) + \"\\n\";\n    HANDLE hFile = CreateFileA(\"monobridge_log.txt\", FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile != INVALID_HANDLE_VALUE)\n    {\n        DWORD written;\n        WriteFile(hFile, formattedMessage.c_str(), static_cast<DWORD>(formattedMessage.size()), &written, NULL);\n        CloseHandle(hFile);\n    }\n}\n\nextern \"C\" __declspec(dllexport) void SendResponse(const char *message)\n{\n    if (responseBuffer == NULL)\n    {\n        DWORD pid = GetCurrentProcessId();\n        std::string responseSharedMemName = \"TrainerResponseSharedMemory_\" + std::to_string(pid);\n        hResponseMapFile = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, responseSharedMemName.c_str());\n        if (hResponseMapFile == NULL)\n        {\n            Log(\"[!] Could not open response file mapping object\");\n            return;\n        }\n        responseBuffer = MapViewOfFile(hResponseMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);\n        if (responseBuffer == NULL)\n        {\n            Log(\"[!] Could not map view of response file\");\n            CloseHandle(hResponseMapFile);\n            hResponseMapFile = NULL;\n            return;\n        }\n    }\n\n    if (message == NULL)\n    {\n        Log(\"[!] Null message in SendResponse\");\n        return;\n    }\n\n    size_t length = strlen(message);\n    if (length + sizeof(size_t) > responseBufferSize)\n    {\n        Log(\"[!] Response too large for buffer\");\n        return;\n    }\n\n    *reinterpret_cast<size_t *>(responseBuffer) = length;\n    memcpy(static_cast<char *>(responseBuffer) + sizeof(size_t), message, length);\n\n    DWORD pid = GetCurrentProcessId();\n    std::string eventName = \"TrainerResponseEvent_\" + std::to_string(pid);\n    HANDLE hEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, eventName.c_str());\n    if (hEvent != NULL)\n    {\n        SetEvent(hEvent);\n        CloseHandle(hEvent);\n    }\n    else\n    {\n        Log(\"[!] Could not open response event\");\n    }\n}\n\nvoid InitializeMono()\n{\n    if (domain)\n        return;\n    HMODULE monoModule = GetModuleHandleA(\"mono-2.0-bdwgc.dll\");\n    if (!monoModule)\n    {\n        Log(\"[!] Failed to find mono-2.0-bdwgc.dll\");\n        return;\n    }\n    auto getRootDomain = (MonoDomain * (*)()) GetProcAddress(monoModule, \"mono_get_root_domain\");\n    auto threadAttach = (MonoThread * (*)(MonoDomain *)) GetProcAddress(monoModule, \"mono_thread_attach\");\n    if (!getRootDomain || !threadAttach)\n    {\n        Log(\"[!] Failed to get Mono functions\");\n        return;\n    }\n    domain = getRootDomain();\n    if (!domain)\n    {\n        Log(\"[!] Failed to get root domain\");\n        return;\n    }\n    threadAttach(domain);\n}\n\nvoid LoadAssembly(const char *path)\n{\n    InitializeMono();\n    if (!domain)\n    {\n        Log(\"[!] Mono domain not initialized\");\n        return;\n    }\n    HMODULE monoModule = GetModuleHandleA(\"mono-2.0-bdwgc.dll\");\n    auto assemblyOpen = (MonoAssembly * (*)(const char *, void *)) GetProcAddress(monoModule, \"mono_assembly_open\");\n    if (!assemblyOpen)\n    {\n        Log(\"[!] Failed to get mono_assembly_open\");\n        return;\n    }\n    loadedAssembly = assemblyOpen(path, nullptr);\n    if (!loadedAssembly)\n    {\n        Log(\"[!] Failed to load assembly\");\n    }\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI LoadAssemblyThread(LPVOID lpParam)\n{\n    LoadAssemblyParams *params = static_cast<LoadAssemblyParams *>(lpParam);\n    LoadAssembly(params->path);\n    return 0;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI InvokeMethodThread(LPVOID lpParam)\n{\n    InvokeMethodParams *params = static_cast<InvokeMethodParams *>(lpParam);\n    InitializeMono();\n    if (!domain)\n    {\n        Log(\"[!] Mono domain not initialized\");\n        return 1;\n    }\n\n    HMODULE monoModule = GetModuleHandleA(\"mono-2.0-bdwgc.dll\");\n    if (monoModule)\n    {\n        // CRITICAL: Attach the thread to the Mono domain\n        auto threadAttach = (MonoThread * (*)(MonoDomain *)) GetProcAddress(monoModule, \"mono_thread_attach\");\n        if (threadAttach && domain)\n        {\n            threadAttach(domain);\n        }\n    }\n    else\n    {\n        Log(\"[!] Failed to get mono-2.0-bdwgc.dll handle\");\n        return 1;\n    }\n\n    auto getImage = (MonoImage * (*)(MonoAssembly *)) GetProcAddress(monoModule, \"mono_assembly_get_image\");\n    auto classFromName = (MonoClass * (*)(MonoImage *, const char *, const char *)) GetProcAddress(monoModule, \"mono_class_from_name\");\n    auto getMethod = (MonoMethod * (*)(MonoClass *, const char *, int)) GetProcAddress(monoModule, \"mono_class_get_method_from_name\");\n    auto runtimeInvoke = (MonoObject * (*)(MonoMethod *, void *, void **, MonoObject **)) GetProcAddress(monoModule, \"mono_runtime_invoke\");\n    auto stringNew = (MonoString * (*)(MonoDomain *, const char *)) GetProcAddress(monoModule, \"mono_string_new\");\n\n    if (!getImage || !classFromName || !getMethod || !runtimeInvoke || !stringNew)\n    {\n        Log(\"[!] Failed to get required Mono functions\");\n        return 1;\n    }\n\n    if (!loadedAssembly)\n    {\n        Log(\"[!] No assembly loaded\");\n        return 1;\n    }\n    MonoImage *image = getImage(loadedAssembly);\n    if (!image)\n    {\n        Log(\"[!] Failed to get image\");\n        return 1;\n    }\n\n    MonoClass *klass = classFromName(image, params->namespaceName, params->className);\n    if (!klass)\n    {\n        Log(\"[!] Failed to find class\");\n        return 1;\n    }\n\n    MonoMethod *method = getMethod(klass, params->methodName, params->paramCount);\n    if (!method)\n    {\n        Log(\"[!] Failed to find method\");\n        return 1;\n    }\n\n    std::vector<void *> args(params->paramCount);\n    std::vector<int> intParams;\n    std::vector<float> floatParams;\n    std::vector<MonoString *> stringParams;\n\n    for (int i = 0; i < params->paramCount; ++i)\n    {\n        ParamValue &pv = params->paramValues[i];\n        switch (pv.type)\n        {\n        case ParamValue::INT:\n            intParams.push_back(pv.i);\n            args[i] = &intParams.back();\n            break;\n        case ParamValue::FLOAT:\n            floatParams.push_back(pv.f);\n            args[i] = &floatParams.back();\n            break;\n        case ParamValue::STRING:\n        {\n            MonoString *monoStr = stringNew(domain, pv.s);\n            if (!monoStr)\n            {\n                Log(\"[!] Failed to create MonoString\");\n                return 1;\n            }\n            stringParams.push_back(monoStr);\n            args[i] = monoStr;\n            break;\n        }\n        default:\n            Log(\"[!] Unsupported parameter type\");\n            return 1;\n        }\n    }\n\n    MonoObject *exc = nullptr;\n    runtimeInvoke(method, nullptr, args.empty() ? nullptr : args.data(), &exc);\n    if (exc)\n    {\n        Log(\"[!] Exception during method invocation\");\n        return 1;\n    }\n\n    return 0;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI GetFunctionPointersThread(LPVOID lpParam)\n{\n    FunctionPointers *ptrs = static_cast<FunctionPointers *>(lpParam);\n    ptrs->LoadAssemblyThread = LoadAssemblyThread;\n    ptrs->InvokeMethodThread = InvokeMethodThread;\n    return 0;\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n    return TRUE;\n}"
  },
  {
    "path": "Game Trainers/common/include/MonoBridge.def",
    "content": "LIBRARY MonoBridge\nEXPORTS\n    GetFunctionPointersThread\n    LoadAssemblyThread\n    InvokeMethodThread\n    SendData"
  },
  {
    "path": "Game Trainers/common/include/TrainerBase.h",
    "content": "// TrainerBase.h\n#pragma once\n\n#include <Windows.h>\n#include <TlHelp32.h>\n#include <any>\n#include <functional>\n#include <iostream>\n#include <map>\n#include <regex>\n#include <thread>\n\n/***********************************************************************\n * HOOK_INFO: Track data about one named hook\n ***********************************************************************/\nstruct HookInfo\n{\n    std::string hookName;  // e.g., \"ArrowFrequency\"\n    uintptr_t hookAddress; // Where we overwrite bytes\n    size_t overwriteLen;   // Number of bytes overwritten\n    std::vector<BYTE> originalBytes;\n    bool active = false;\n\n    LPVOID allocatedMem = nullptr;\n    size_t allocSize = 0;\n};\n\n/***********************************************************************\n * WILDCARD PATTERN BYTE\n *  If text == \"??\" => wildcard\n *  Otherwise, parse hex\n ***********************************************************************/\nstruct PatternByte\n{\n    bool wildcard;\n    BYTE value;\n};\n\n/***********************************************************************\n * POINTER_TOGGLE_INFO: Track data about one pointer-based toggle\n ***********************************************************************/\nstruct PointerToggleInfo\n{\n    std::string toggleName;\n    std::vector<unsigned int> offsets;\n    std::any desiredValue;\n    size_t valueSize;\n    bool active = false;\n    std::thread toggleThread;\n\n    // Destructor to ensure the thread is joined\n    ~PointerToggleInfo()\n    {\n        active = false;\n        if (toggleThread.joinable())\n            toggleThread.join();\n    }\n};\n\nclass TrainerBase\n{\npublic:\n    TrainerBase(const std::wstring &processIdentifier, bool useWindowTitle = false)\n        : processName(processIdentifier), useWindowTitle(useWindowTitle)\n    {\n        SetConsoleOutputCP(CP_UTF8);\n    }\n\n    virtual ~TrainerBase()\n    {\n        cleanUp();\n    }\n\n    std::wstring getProcessName() const\n    {\n        return processName;\n    }\n\n    DWORD getProcessId() const\n    {\n        return procId;\n    }\n\n    virtual void cleanUp()\n    {\n        disableAllHooks();\n        disableAllPointerToggles();\n        if (hProcess)\n            CloseHandle(hProcess);\n        hProcess = nullptr;\n    }\n\n    // Check if the target process is running and open a handle\n    bool isProcessRunning()\n    {\n        if (useWindowTitle)\n        {\n            procId = getProcIdByWindowTitle(processName);\n        }\n        else\n        {\n            procId = getProcId(processName.c_str());\n        }\n\n        if (procId == 0)\n        {\n            std::wcerr << L\"[!] Could not find process: \" << processName << std::endl;\n            cleanUp();\n            return false;\n        }\n\n        if (!hProcess)\n        {\n            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId);\n            if (!hProcess)\n            {\n                std::cerr << \"[!] Failed to open process. Error: \" << GetLastError() << std::endl;\n                cleanUp();\n                return false;\n            }\n        }\n        return true;\n    }\n\n    // Disable a specific named hook\n    inline bool disableNamedHook(const std::string &name)\n    {\n        auto it = hooks.find(name);\n        if (it == hooks.end())\n            return false; // Not found\n\n        HookInfo &hi = it->second;\n        if (!hi.active)\n            return false;\n\n        // Restore original bytes\n        WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(hi.hookAddress), hi.originalBytes.data(), hi.overwriteLen, nullptr);\n        FlushInstructionCache(hProcess, reinterpret_cast<LPCVOID>(hi.hookAddress), hi.overwriteLen);\n\n        // Free allocated memory\n        if (hi.allocatedMem)\n        {\n            VirtualFreeEx(hProcess, hi.allocatedMem, 0, MEM_RELEASE);\n            hi.allocatedMem = nullptr;\n        }\n\n        hi.active = false;\n        std::cout << \"[-] Disabled hook '\" << name << \"'\\n\";\n        return true;\n    }\n\n    // Disable all active hooks\n    inline void disableAllHooks()\n    {\n        for (auto &kv : hooks)\n        {\n            HookInfo &hi = kv.second;\n            if (hi.active)\n            {\n                // Restore original bytes\n                WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(hi.hookAddress), hi.originalBytes.data(), hi.overwriteLen, nullptr);\n                FlushInstructionCache(hProcess, reinterpret_cast<LPCVOID>(hi.hookAddress), hi.overwriteLen);\n\n                // Free allocated memory\n                if (hi.allocatedMem)\n                {\n                    VirtualFreeEx(hProcess, hi.allocatedMem, 0, MEM_RELEASE);\n                    hi.allocatedMem = nullptr;\n                }\n                hi.active = false;\n                std::cout << \"[-] Disabled hook '\" << kv.first << \"'\\n\";\n            }\n        }\n        hooks.clear();\n    }\n\n    // Disable a specific pointer-based toggle\n    inline bool disableNamedPointerToggle(const std::string &name)\n    {\n        auto it = pointerToggles.find(name);\n        if (it == pointerToggles.end())\n            return false; // Not found\n\n        auto pti = it->second;\n        if (!pti->active)\n            return false;\n\n        pti->active = false; // Signal the thread to stop\n\n        if (pti->toggleThread.joinable())\n            pti->toggleThread.join();\n\n        std::cout << \"[-] Disabled pointer toggle '\" << name << \"'\\n\";\n        pointerToggles.erase(it);\n        return true;\n    }\n\n    // Disable all active pointer-based toggles\n    inline void disableAllPointerToggles()\n    {\n        for (auto &kv : pointerToggles)\n        {\n            auto pti = kv.second;\n            if (pti->active)\n            {\n                pti->active = false;\n                if (pti->toggleThread.joinable())\n                    pti->toggleThread.join();\n                std::cout << \"[-] Disabled pointer toggle '\" << kv.first << \"'\\n\";\n            }\n        }\n        pointerToggles.clear();\n    }\n\nprotected:\n    // Process and module information\n    const std::wstring processName; // This can be either an exe name or a window title\n    bool useWindowTitle = false;    // Set to true if processName is a window title\n    HANDLE hProcess = nullptr;\n    DWORD procId = 0;\n\n    // Maps to store hooks and pointer toggles by name\n    std::map<std::string, HookInfo> hooks;\n    std::map<std::string, std::shared_ptr<PointerToggleInfo>> pointerToggles;\n\n    /***********************************************************************\n     * Helper Functions\n     ***********************************************************************/\n\n    /** Converts std::wstring to std::string\n     * @param wstr The wide string to convert\n     * @return Converted narrow string\n     */\n    std::string wstringToString(const std::wstring &wstr)\n    {\n        if (wstr.empty())\n            return \"\";\n        int size = WideCharToMultiByte(CP_ACP, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);\n        std::string str(size, 0);\n        WideCharToMultiByte(CP_ACP, 0, &wstr[0], (int)wstr.size(), &str[0], size, NULL, NULL);\n        return str;\n    }\n\n    // Get Process ID by executable name\n    inline DWORD getProcId(const wchar_t *exeName)\n    {\n        DWORD pid = 0;\n        HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\n        if (snap == INVALID_HANDLE_VALUE)\n            return 0;\n\n        PROCESSENTRY32W pe;\n        pe.dwSize = sizeof(pe);\n        if (Process32FirstW(snap, &pe))\n        {\n            do\n            {\n                if (!_wcsicmp(pe.szExeFile, exeName))\n                {\n                    pid = pe.th32ProcessID;\n                    break;\n                }\n            } while (Process32NextW(snap, &pe));\n        }\n        CloseHandle(snap);\n        return pid;\n    }\n\n    struct EnumWindowsData\n    {\n        std::wstring targetTitle;\n        DWORD foundPID = 0;\n    };\n\n    static BOOL CALLBACK EnumWindowsProcCallback(HWND hwnd, LPARAM lParam)\n    {\n        EnumWindowsData *data = reinterpret_cast<EnumWindowsData *>(lParam);\n        if (!IsWindowVisible(hwnd))\n            return TRUE;\n\n        const int bufferSize = 256;\n        wchar_t windowTitle[bufferSize] = {0};\n        GetWindowTextW(hwnd, windowTitle, bufferSize);\n        if (data->targetTitle == windowTitle)\n        {\n            GetWindowThreadProcessId(hwnd, &(data->foundPID));\n            return FALSE;\n        }\n        return TRUE;\n    }\n\n    inline DWORD getProcIdByWindowTitle(const std::wstring &title)\n    {\n        EnumWindowsData data;\n        data.targetTitle = title;\n        EnumWindows(EnumWindowsProcCallback, reinterpret_cast<LPARAM>(&data));\n        return data.foundPID;\n    }\n\n    // Get Module Base Address and Size\n    inline bool getModuleInfo(const wchar_t *modName, uintptr_t &modBase, size_t &modSize)\n    {\n        HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);\n        if (snap == INVALID_HANDLE_VALUE)\n        {\n            std::cerr << \"[!] Failed to create module snapshot. Error: \" << GetLastError() << std::endl;\n            return false;\n        }\n\n        MODULEENTRY32W me;\n        me.dwSize = sizeof(me);\n        bool found = false;\n\n        // Check if the module name starts with \"$re$\" for regex matching\n        bool useRegex = false;\n        std::wstring patternStr;\n        const wchar_t *prefix = L\"$re$\";\n        size_t prefixLen = wcslen(prefix);\n        if (wcsncmp(modName, prefix, prefixLen) == 0)\n        {\n            useRegex = true;\n            patternStr = std::wstring(modName).substr(prefixLen);\n        }\n\n        if (Module32FirstW(snap, &me))\n        {\n            do\n            {\n                // std::wcout << L\"Module: \" << me.szModule << std::endl;\n                if ((!useRegex && _wcsicmp(me.szModule, modName) == 0) || (useRegex && std::regex_match(me.szModule, std::wregex(patternStr))))\n                {\n                    modBase = (uintptr_t)me.modBaseAddr;\n                    modSize = (size_t)me.modBaseSize;\n                    found = true;\n                    break;\n                }\n            } while (Module32NextW(snap, &me));\n        }\n        CloseHandle(snap);\n        return found;\n    }\n\n    // Resolve dynamic address via pointer chaining\n    inline uintptr_t resolveModuleDynamicAddress(const wchar_t *moduleName, const std::vector<unsigned int> &offsets)\n    {\n        uintptr_t modBase = 0;\n        size_t modSize = 0;\n        if (!getModuleInfo(moduleName, modBase, modSize))\n        {\n            std::wcerr << L\"[!] Could not find module: \" << moduleName << std::endl;\n            return 0;\n        }\n\n        // First offset is relative to moduleBase\n        uintptr_t currentAddr = modBase + offsets[0];\n\n        // Subsequent offsets are pointer dereferences\n        for (size_t i = 1; i < offsets.size(); i++)\n        {\n            if (!ReadProcessMemory(hProcess, (LPCVOID)currentAddr, &currentAddr, sizeof(currentAddr), nullptr))\n            {\n                std::cerr << \"[!] Failed dereference pointer at 0x\" << std::hex << currentAddr << std::dec << std::endl;\n                return 0;\n            }\n            currentAddr += offsets[i];\n        }\n\n        std::cout << \"[+] Pointer dereferenced to 0x\" << std::hex << currentAddr << std::dec << std::endl;\n        return currentAddr;\n    }\n\n    template <typename T>\n    bool WriteToDynamicAddress(const wchar_t *moduleName, const std::vector<unsigned int> &offsets, T value)\n    {\n        uintptr_t targetAddr = resolveModuleDynamicAddress(moduleName, offsets);\n        if (targetAddr == 0)\n        {\n            return false;\n        }\n\n        if (!WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(targetAddr), &value, sizeof(T), nullptr))\n        {\n            std::cerr << \"[!] WriteProcessMemory failed at address 0x\" << std::hex << targetAddr << std::dec << \". Error: \" << GetLastError() << std::endl;\n            return false;\n        }\n\n        return true;\n    }\n\n    template <typename T>\n    T ReadFromDynamicAddress(const wchar_t *moduleName, const std::vector<unsigned int> &offsets)\n    {\n        uintptr_t targetAddr = resolveModuleDynamicAddress(moduleName, offsets);\n        if (targetAddr == 0)\n        {\n            return T();\n        }\n\n        T value;\n        if (!ReadProcessMemory(hProcess, reinterpret_cast<LPCVOID>(targetAddr), &value, sizeof(T), nullptr))\n        {\n            std::cerr << \"[!] ReadProcessMemory failed at address 0x\" << std::hex << targetAddr << std::dec << \". Error: \" << GetLastError() << std::endl;\n            return T();\n        }\n\n        return value;\n    }\n\n    // Find pattern with wildcards\n    inline uintptr_t findPatternWild(const wchar_t *moduleName, const std::vector<std::string> &pattern)\n    {\n        // Parse pattern\n        std::vector<PatternByte> pat;\n        for (const auto &token : pattern)\n        {\n            pat.push_back((token == \"??\" || token == \"?\") ? PatternByte{true, 0} : PatternByte{false, (BYTE)std::stoul(token, nullptr, 16)});\n        }\n        size_t patSize = pat.size();\n\n        if (moduleName == nullptr || wcslen(moduleName) == 0)\n        {\n            uintptr_t currentAddress = 0;\n            MEMORY_BASIC_INFORMATION mbi;\n\n            // Loop through all memory pages in the process\n            while (VirtualQueryEx(hProcess, (LPCVOID)currentAddress, &mbi, sizeof(mbi)))\n            {\n                // We only care about memory that is committed and executable (where JIT code lives)\n                if (mbi.State == MEM_COMMIT && (mbi.Protect & PAGE_EXECUTE_READ || mbi.Protect & PAGE_EXECUTE_READWRITE))\n                {\n                    std::vector<BYTE> buffer(mbi.RegionSize);\n                    SIZE_T bytesRead;\n                    if (ReadProcessMemory(hProcess, mbi.BaseAddress, buffer.data(), mbi.RegionSize, &bytesRead))\n                    {\n                        for (size_t i = 0; i + patSize <= bytesRead; ++i)\n                        {\n                            bool found = true;\n                            for (size_t j = 0; j < patSize; ++j)\n                            {\n                                if (!pat[j].wildcard && pat[j].value != buffer[i + j])\n                                {\n                                    found = false;\n                                    break;\n                                }\n                            }\n                            if (found)\n                            {\n                                return (uintptr_t)mbi.BaseAddress + i;\n                            }\n                        }\n                    }\n                }\n                currentAddress = (uintptr_t)mbi.BaseAddress + mbi.RegionSize;\n            }\n        }\n        else\n        {\n            uintptr_t base = 0;\n            size_t modSize = 0;\n            if (!getModuleInfo(moduleName, base, modSize))\n                return 0;\n\n            // Read module bytes\n            std::vector<BYTE> buf(modSize);\n            SIZE_T bytesRead = 0;\n            if (!ReadProcessMemory(hProcess, (LPCVOID)base, buf.data(), modSize, &bytesRead))\n                return 0;\n\n            for (size_t i = 0; i + patSize <= bytesRead; i++)\n            {\n                bool matched = true;\n                for (size_t j = 0; j < patSize; j++)\n                {\n                    if (!pat[j].wildcard && pat[j].value != buf[i + j])\n                    {\n                        matched = false;\n                        break;\n                    }\n                }\n                if (matched)\n                {\n                    return base + i;\n                }\n            }\n        }\n\n        return 0;\n    }\n\n    // Allocate memory near a specific address (±2GB)\n    inline LPVOID allocNearAddress(uintptr_t addr, size_t sizeNeeded)\n    {\n        const size_t TWO_GB = (1ULL << 31);\n        const size_t step = 0x10000; // 64KB\n\n        uintptr_t start = (addr > TWO_GB) ? (addr - TWO_GB) : 0;\n        uintptr_t end = addr + TWO_GB;\n\n        auto alignDown = [&](uintptr_t x)\n        { return (x / step) * step; };\n        start = alignDown(start);\n        end = alignDown(end);\n\n        for (uintptr_t curr = start; curr + sizeNeeded < end; curr += step)\n        {\n            LPVOID p = VirtualAllocEx(\n                hProcess,\n                (LPVOID)curr,\n                sizeNeeded,\n                MEM_COMMIT | MEM_RESERVE,\n                PAGE_EXECUTE_READWRITE);\n            if (p)\n            {\n                uintptr_t diff = (curr > addr) ? (curr - addr) : (addr - curr);\n                if (diff <= TWO_GB)\n                    return p;\n\n                VirtualFreeEx(hProcess, p, 0, MEM_RELEASE);\n            }\n        }\n        return nullptr;\n    }\n\n    /***********************************************************************\n     * createBytePatch\n     * - name: Unique string name, e.g., \"NoCooldownPatch\"\n     * - pattern: AOB to search for\n     * - patchOffset: Offset from the start of the pattern to begin patching\n     * - newBytes: The vector of bytes to write\n     * This function is for simple, in-place memory patches (like JNE -> JE).\n     * It stores the original bytes and is automatically reversible\n     * by the existing 'disableNamedHook' function.\n     ***********************************************************************/\n    inline bool createBytePatch(\n        const wchar_t *moduleName,\n        const std::string &name,\n        const std::vector<std::string> &pattern,\n        size_t patchOffset,\n        const std::vector<BYTE> &newBytes)\n    {\n        // 1. Find pattern\n        uintptr_t matchAddr = findPatternWild(moduleName, pattern);\n        if (!matchAddr)\n        {\n            std::cerr << \"[!] Could not find pattern for byte patch '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        uintptr_t patchAddr = matchAddr + patchOffset;\n        size_t overwriteLen = newBytes.size();\n\n        // 2. Read original bytes\n        std::vector<BYTE> originalBytes(overwriteLen);\n        if (!ReadProcessMemory(hProcess, (LPCVOID)patchAddr, originalBytes.data(), overwriteLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to read original bytes for patch '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        // 3. Write new bytes\n        if (!WriteProcessMemory(hProcess, (LPVOID)patchAddr, newBytes.data(), overwriteLen, nullptr))\n        {\n            std::cerr << \"[!] WriteProcessMemory failed for patch '\" << name << \"'.\\n\";\n            return false;\n        }\n        FlushInstructionCache(hProcess, (LPCVOID)patchAddr, overwriteLen);\n\n        // 4. Store HookInfo\n        HookInfo hi;\n        hi.hookName = name;\n        hi.hookAddress = patchAddr;\n        hi.overwriteLen = overwriteLen;\n        hi.active = true;\n        hi.originalBytes = originalBytes;\n        hi.allocatedMem = nullptr;\n        hi.allocSize = 0;\n\n        hooks[name] = hi;\n\n        std::cout << \"[+] Byte patch '\" << name << \"' created at \" << std::hex << patchAddr << std::dec << std::endl;\n        return true;\n    }\n\n    /***********************************************************************\n     * createNamedHook\n     *    - name: Unique string name, e.g., \"ArrowFrequency\"\n     *    - pattern: e.g., {\"0F\", \"28\", \"CE\", \"F3\", \"0F\", \"11\", \"73\", \"4C\", ...}\n     *      with \"??\" for wildcards\n     *    - patternOffset: How far into that found pattern we actually place the hook\n     *      e.g., if the pattern is 12 bytes, but the instruction to hook starts at offset 3\n     *    - overwriteLen: How many bytes we overwrite\n     *    - codeSize: How many bytes to allocate for code cave\n     *    - buildFunc: A lambda that, given the base address of the allocated block,\n     *      and the hookAddr where the original instruction started,\n     *      returns the final code bytes (which can also embed data).\n     ***********************************************************************/\n    inline bool createNamedHook(\n        const wchar_t *moduleName,\n        const std::string &name,\n        const std::vector<std::string> &pattern,\n        size_t patternOffset,\n        size_t overwriteLen,\n        size_t codeSize,\n        std::function<std::vector<BYTE>(uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes)> buildFunc)\n    {\n        // A) Find pattern with wildcards\n        uintptr_t matchAddr = findPatternWild(moduleName, pattern);\n        if (!matchAddr)\n        {\n            std::cerr << \"[!] Could not find pattern for hook '\" << name << \"'.\\n\";\n            return false;\n        }\n        // The actual instruction address is matchAddr + patternOffset\n        uintptr_t hookAddr = matchAddr + patternOffset;\n\n        // B) Read original bytes\n        std::vector<BYTE> originalBytes(overwriteLen);\n        if (!ReadProcessMemory(hProcess, (LPCVOID)hookAddr, originalBytes.data(), overwriteLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to read original bytes for hook '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        // C) Allocate near memory\n        LPVOID nearMem = allocNearAddress(hookAddr, codeSize);\n        if (!nearMem)\n        {\n            std::cerr << \"[!] allocNearAddress failed for hook '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        // D) Build injection code\n        uintptr_t codeCaveAddr = reinterpret_cast<uintptr_t>(nearMem);\n        std::vector<BYTE> code = buildFunc(codeCaveAddr, hookAddr, originalBytes);\n        if (code.empty())\n        {\n            std::cerr << \"[!] buildFunc returned empty code for '\" << name << \"'.\\n\";\n            VirtualFreeEx(hProcess, nearMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // E) Write code to nearMem\n        SIZE_T written = 0;\n        if (!WriteProcessMemory(hProcess, nearMem, code.data(), code.size(), &written))\n        {\n            std::cerr << \"[!] WriteProcessMemory code failed for hook '\" << name << \"'.\\n\";\n            VirtualFreeEx(hProcess, nearMem, 0, MEM_RELEASE);\n            return false;\n        }\n        FlushInstructionCache(hProcess, nearMem, code.size());\n\n        // F) Overwrite the original instructions with a JMP\n        //    If overwriteLen > 5, fill the rest with NOP\n        std::vector<BYTE> patch(overwriteLen, 0x90); // Fill with NOP\n        patch[0] = 0xE9;                             // JMP opcode\n        int32_t rel = static_cast<int32_t>(reinterpret_cast<uintptr_t>(nearMem) - (hookAddr + 5));\n        std::memcpy(&patch[1], &rel, 4);\n\n        if (!WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(hookAddr), patch.data(), patch.size(), nullptr))\n        {\n            std::cerr << \"[!] Overwrite instruction failed for '\" << name << \"'.\\n\";\n            VirtualFreeEx(hProcess, nearMem, 0, MEM_RELEASE);\n            return false;\n        }\n        FlushInstructionCache(hProcess, reinterpret_cast<LPCVOID>(hookAddr), patch.size());\n\n        // G) Store HookInfo\n        HookInfo hi;\n        hi.hookName = name;\n        hi.hookAddress = hookAddr;\n        hi.overwriteLen = overwriteLen;\n        hi.active = true;\n        hi.originalBytes = originalBytes;\n        hi.allocatedMem = nearMem;\n        hi.allocSize = codeSize;\n\n        hooks[name] = hi; // Store in map by name\n\n        std::cout << \"[+] Hook '\" << name << \"' created at \" << std::hex << hookAddr << std::dec << std::endl;\n        return true;\n    }\n\n    inline bool createNamedHookByOffset(\n        const wchar_t *moduleName,\n        const std::string &name,\n        uintptr_t offset,\n        size_t overwriteLen,\n        size_t codeSize,\n        std::function<std::vector<BYTE>(uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes)> buildFunc)\n    {\n        uintptr_t modBase = 0;\n        size_t modSize = 0;\n        if (!getModuleInfo(moduleName, modBase, modSize))\n        {\n            std::cerr << \"[!] Could not find module for hook '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        uintptr_t hookAddr = modBase + offset;\n\n        // Read original bytes\n        std::vector<BYTE> originalBytes(overwriteLen);\n        if (!ReadProcessMemory(hProcess, (LPCVOID)hookAddr, originalBytes.data(), overwriteLen, nullptr))\n        {\n            std::cerr << \"[!] Failed to read original bytes for hook '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        // Allocate near memory\n        LPVOID nearMem = allocNearAddress(hookAddr, codeSize);\n        if (!nearMem) return false;\n\n        // Build injection code\n        uintptr_t codeCaveAddr = reinterpret_cast<uintptr_t>(nearMem);\n        std::vector<BYTE> code = buildFunc(codeCaveAddr, hookAddr, originalBytes);\n\n        if (code.empty()) {\n            VirtualFreeEx(hProcess, nearMem, 0, MEM_RELEASE);\n            return false;\n        }\n\n        // Write code to nearMem\n        SIZE_T written = 0;\n        WriteProcessMemory(hProcess, nearMem, code.data(), code.size(), &written);\n        FlushInstructionCache(hProcess, nearMem, code.size());\n\n        // Overwrite the original instructions with a JMP\n        std::vector<BYTE> patch(overwriteLen, 0x90);\n        patch[0] = 0xE9; \n        int32_t rel = static_cast<int32_t>(codeCaveAddr - (hookAddr + 5));\n        std::memcpy(&patch[1], &rel, 4);\n\n        WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(hookAddr), patch.data(), patch.size(), nullptr);\n        FlushInstructionCache(hProcess, reinterpret_cast<LPCVOID>(hookAddr), patch.size());\n\n        HookInfo hi;\n        hi.hookName = name;\n        hi.hookAddress = hookAddr;\n        hi.overwriteLen = overwriteLen;\n        hi.active = true;\n        hi.originalBytes = originalBytes;\n        hi.allocatedMem = nearMem;\n        hi.allocSize = codeSize;\n        hooks[name] = hi;\n\n        std::cout << \"[+] Hook '\" << name << \"' created at offset 0x\" << std::hex << offset << std::dec << std::endl;\n        return true;\n    }\n\n    /***********************************************************************\n     * createPointerToggle\n     *    - name: Unique string name, e.g., \"HealthToggle\"\n     *    - offsets: Pointer chain offsets to reach the target value\n     *    - desiredValue: The value to maintain at the target address\n     *    - valueType: (optional) Type hint for freezing current value\n     ***********************************************************************/\n    template <typename T, typename ValueType = T>\n    inline bool createPointerToggle(\n        const wchar_t *moduleName,\n        const std::string &name,\n        const std::vector<unsigned int> &offsets,\n        const T desiredValue,\n        const ValueType *typeHint = nullptr)\n    {\n        if (pointerToggles.find(name) != pointerToggles.end())\n        {\n            std::cerr << \"[!] Pointer toggle with name '\" << name << \"' already exists.\\n\";\n            return false;\n        }\n\n        // Resolve the address once\n        uintptr_t targetAddr = resolveModuleDynamicAddress(moduleName, offsets);\n        if (targetAddr == 0)\n        {\n            std::cerr << \"[!] Failed to resolve address for pointer toggle '\" << name << \"'.\\n\";\n            return false;\n        }\n\n        // Create a shared_ptr for PointerToggleInfo\n        auto pti = std::make_shared<PointerToggleInfo>();\n        pti->toggleName = name;\n        pti->offsets = offsets;\n        pti->active = true;\n\n        // Check if desiredValue is nullptr (freeze current value mode)\n        if constexpr (std::is_same_v<T, std::nullptr_t>)\n        {\n            // Read current value from memory using the type hint size\n            ValueType readValue{};\n            if (!ReadProcessMemory(hProcess, reinterpret_cast<LPVOID>(targetAddr), &readValue, sizeof(ValueType), nullptr))\n            {\n                std::cerr << \"[!] Failed to read initial value for pointer toggle '\" << name << \"'.\\n\";\n                return false;\n            }\n            pti->desiredValue = readValue;\n            pti->valueSize = sizeof(ValueType);\n        }\n        else\n        {\n            pti->desiredValue = desiredValue;\n            pti->valueSize = sizeof(T); // Store the size of the desired value\n        }\n\n        // Insert into the map before starting the thread to ensure the pti remains valid\n        pointerToggles[name] = pti;\n\n        // Create a weak_ptr to avoid circular references\n        std::weak_ptr<PointerToggleInfo> weak_pti = pti;\n\n        // Start a thread to continuously write the desired value\n        pti->toggleThread = std::thread([this, weak_pti, targetAddr]()\n                                        {\n        // Attempt to lock the weak_ptr\n        if (auto shared_pti = weak_pti.lock())\n        {\n            while (shared_pti->active)\n            {\n                if (shared_pti->desiredValue.type() == typeid(BYTE))\n                {\n                    BYTE value = std::any_cast<BYTE>(shared_pti->desiredValue);\n                    WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(targetAddr), &value, sizeof(BYTE), nullptr);\n                }\n                else if (shared_pti->desiredValue.type() == typeid(int))\n                {\n                    int value = std::any_cast<int>(shared_pti->desiredValue);\n                    WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(targetAddr), &value, sizeof(int), nullptr);\n                }\n                else if (shared_pti->desiredValue.type() == typeid(float))\n                {\n                    float value = std::any_cast<float>(shared_pti->desiredValue);\n                    WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(targetAddr), &value, sizeof(float), nullptr);\n                }\n                else if (shared_pti->desiredValue.type() == typeid(double))\n                {\n                    double value = std::any_cast<double>(shared_pti->desiredValue);\n                    WriteProcessMemory(hProcess, reinterpret_cast<LPVOID>(targetAddr), &value, sizeof(double), nullptr);\n                }\n                // Add more types as needed\n                else\n                {\n                    std::cerr << \"[!] Unsupported type for toggle '\" << shared_pti->toggleName << \"'.\\n\";\n                }\n\n                // Flush the instruction cache with the correct size\n                FlushInstructionCache(hProcess, reinterpret_cast<LPCVOID>(targetAddr), shared_pti->valueSize);\n\n                // Sleep for 10 milliseconds\n                std::this_thread::sleep_for(std::chrono::milliseconds(10));\n            }\n        }\n        else\n        {\n            std::cerr << \"[!] PointerToggleInfo for toggle has been destroyed.\\n\";\n        } });\n\n        std::cout << \"[+] Pointer toggle '\" << name << \"' activated.\\n\";\n        return true;\n    }\n};\n"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/hook.h",
    "content": "#pragma once\n#include <Windows.h>\n#include \"memory.h\"\n#include \"MinHook.h\"\n\nstruct HOOK {\n    void* target_func;\n    void* detour_func;\n    void* original_func;\n    bool active;\n\n    // Constructor matches usage in il2cpp.h\n    HOOK(MEMORY mem, void* target, void* detour) {\n        this->target_func = target;\n        this->detour_func = detour;\n        this->original_func = nullptr;\n        this->active = false;\n\n        // Ensure MinHook is initialized (safe to call multiple times)\n        static bool initialized = false;\n        if (!initialized) {\n            MH_Initialize();\n            initialized = true;\n        }\n    }\n\n    // Applies the hook\n    void load() {\n        if (MH_CreateHook(target_func, detour_func, &original_func) == MH_OK) {\n            if (MH_EnableHook(target_func) == MH_OK) {\n                active = true;\n            }\n        }\n    }\n\n    // Helper to get the original function pointer to call inside the hook\n    template <class T>\n    T get_original() {\n        return (T)original_func;\n    }\n\n    // Destructor to clean up\n    ~HOOK() {\n        if (active) {\n            MH_DisableHook(target_func);\n        }\n    }\n};"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/il2cpp.cpp",
    "content": "#include \"il2cpp.h\"\n\n\nnamespace IL2CPP {\n\n\tIl2CppDomain* domain;\n\n\tnamespace API {\n\t\t#define DO_API(r, n, p) IL2CPP_DECLARATION(n)\n\t\t#include IL2CPP_API_H\n\t\t#undef DO_API\n\t}\n\n\tbool Initialize(MEMORY memory)\n\t{\n\t\tvoid* game_assembly = memory.find_module(\"GameAssembly.dll\");\n\n\t\tif (!game_assembly) {\n\t\t\tprintf(\"[!] CRITICAL: Could not find GameAssembly.dll module!\\n\");\n\t\t\treturn false;\n\t\t}\n\n\t\t#define DO_API(r, n, p) IL2CPP_FIND_FUNCTION(n)\n\t\t#include IL2CPP_API_H\n\t\t#undef DO_API\n\n\t\tdomain = API::il2cpp_domain_get();\n\n\t\treturn true;\n\t}\n\n\tvoid Attach() {\n\t\tAPI::il2cpp_thread_attach(domain);\n\t}\n\t\n\t// ASSEMBLY\n\n\tIl2CppImage* ASSEMBLY::Image() {\n\t\treturn this->image;\n\t}\n\n\tNAMESPACE* ASSEMBLY::Namespace(const char* namespace_name) {\n\t\treturn new NAMESPACE(this, namespace_name);\n\t}\n\n\tASSEMBLY* ASSEMBLY::List(size_t* size) {\n\t\treturn (ASSEMBLY*)IL2CPP::API::il2cpp_domain_get_assemblies(domain, size);\n\t}\n\n\t// NAMESPACE\n\n\tNAMESPACE::NAMESPACE(ASSEMBLY* assembly_, const char* name_) {\n\t\tassembly = assembly_;\n\t\tname = name_;\n\t}\n\n\tCLASS* NAMESPACE::Class(const char* class_name) {\n\t\treturn (CLASS*)API::il2cpp_class_from_name(assembly->Image(), name, class_name);\n\t}\n\n\t// CLASS\n\n\tTYPE* CLASS::Type(const char* field_name) {\n\t\treturn Field(field_name)->Type();\n\t}\n\n\tMETHOD* CLASS::Method(const char* method_name, int args_count) {\n\t\treturn (METHOD*)API::il2cpp_class_get_method_from_name(klass, method_name, args_count);\n\t};\n\n\tFIELD* CLASS::Field(const char* field_name) {\n\t\treturn (FIELD*)API::il2cpp_class_get_field_from_name(klass, field_name);\n\t}\n\n\tconst char* CLASS::Name() {\n\t\treturn  IL2CPP::API::il2cpp_class_get_name(klass);\n\t}\n\n\tconst char* CLASS::Namespaze() {\n\t\treturn  IL2CPP::API::il2cpp_class_get_namespace(klass);\n\t}\n\n\tconst char* CLASS::AssemblyName() {\n\t\treturn  IL2CPP::API::il2cpp_class_get_assemblyname(klass);\n\t}\n\n\tconst Il2CppImage* CLASS::Image() {\n\t\treturn IL2CPP::API::il2cpp_class_get_image(klass);\n\t}\n\n\t// FIELD\n\n\tconst char* FIELD::Name() {\n\t\treturn IL2CPP::API::il2cpp_field_get_name(this);\n\t}\n\n\tTYPE* FIELD::Type() {\n\t\treturn (TYPE*)API::il2cpp_field_get_type(this);\n\t}\n\n\tsize_t FIELD::Offset() {\n\t\treturn API::il2cpp_field_get_offset(this);\n\t}\n\n\tvoid FIELD::SetValue(OBJECT* obj, void* value) {\n\t\tAPI::il2cpp_field_set_value(obj, this, value);\n\t}\n\n\tvoid FIELD::SetStaticValue(void* value) {\n\t\tAPI::il2cpp_field_static_set_value(this, value);\n\t}\n\n\tOBJECT* FIELD::GetObject(OBJECT* obj) {\n\t\treturn GetValue<OBJECT*>(obj);\n\t}\n\n\tARRAY* FIELD::GetArray(OBJECT* obj) {\n\t\treturn GetValue<ARRAY*>(obj);\n\t}\n\n\tSTRING* FIELD::GetString(OBJECT* obj) {\n\t\treturn GetValue<STRING*>(obj);\n\t}\n\n\tOBJECT* FIELD::GetStaticObject() {\n\t\treturn GetStaticValue<OBJECT*>();\n\t}\n\n\tARRAY* FIELD::GetStaticArray() {\n\t\treturn GetStaticValue<ARRAY*>();\n\t}\n\n\tSTRING* FIELD::GetStaticString() {\n\t\treturn GetStaticValue<STRING*>();\n\t}\n\n\t// Method\n\n\tconst char* METHOD::Name() {\n\t\treturn API::il2cpp_method_get_name(this);\n\t}\n\n\t// Type\n\n\tCLASS* TYPE::Class() {\n\t\treturn (CLASS*)API::il2cpp_type_get_class_or_element_class(this);\n\t}\n\n\tconst char* TYPE::Name() {\n\t\treturn API::il2cpp_type_get_name(this);\n\t}\n\n\t// IL2CPP_OBJECT\n\n\tFIELD* OBJECT::Field(const char* field_name) {\n\t\treturn Class()->Field(field_name);\n\t}\n\n\tOBJECT* OBJECT::GetObject(const char* field_name) {\n\t\treturn Field(field_name)->GetObject(this);\n\t}\n\n\tARRAY* OBJECT::GetArray(const char* field_name) {\n\t\treturn Field(field_name)->GetArray(this);\n\t}\n\n\tSTRING* OBJECT::GetString(const char* field_name) {\n\t\treturn Field(field_name)->GetString(this);\n\t}\n\n\tCLASS* OBJECT::Class() {\n\t\treturn (CLASS*)API::il2cpp_object_get_class(this);\n\t}\n\n\tTYPE* OBJECT::Type(const char* field_name) {\n\t\treturn Field(field_name)->Type();\n\t}\n\n\tvoid OBJECT::SetValue(const char* field_name, void* value) {\n\t\tField(field_name)->SetValue(this, value);\n\t}\n\n\t// IL2CPP_ARRAY\n\n\tsize_t ARRAY::MaxLength() {\n\t\treturn this->max_length;\n\t}\n\n\tOBJECT* ARRAY::GetObject(size_t id) {\n\t\treturn GetIndex<OBJECT*>(id);\n\t}\n\n\tSTRING* ARRAY::GetString(size_t id) {\n\t\treturn GetIndex<STRING*>(id);\n\t}\n\n\n\tconst size_t STRING::Length() {\n\t\treturn API::il2cpp_string_length(this);\n\t}\n\n\tconst wchar_t* STRING::WChars() {\n\t\treturn (wchar_t*)API::il2cpp_string_chars(this);\n\t}\n\n\tASSEMBLY* Assembly(const char* assembly_name) {\n\t\treturn (ASSEMBLY*)API::il2cpp_domain_assembly_open(domain, assembly_name);\n\t}\n\n\tSTRING* String(const char* str){\n\t\treturn (STRING*)API::il2cpp_string_new(str);\n\t}\n\n\tCLASS* Class(const char* assembly_name, const char* namespace_name, const char* class_name) {\n\t\treturn Assembly(assembly_name)->Namespace(namespace_name)->Class(class_name);\n\t}\n\n\tFIELD* Field(const char* assembly_name, const char* namespace_name, const char* class_name, const char* field_name) {\n\t\treturn Class(assembly_name, namespace_name, class_name)->Field(field_name);\n\t}\n\n\tMETHOD* Method(const char* assembly_name, const char* namespace_name, const char* class_name, const char* method_name, int param_count) {\n\t\treturn Class(assembly_name, namespace_name, class_name)->Method(method_name, param_count);\n\t}\n}\n"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/il2cpp.h",
    "content": "#pragma once\n\n#include \"il2cpp_types.h\"\n\n#define IL2CPP_API_H                \"il2cpp_api.h\"\n#define IL2CPP_TYPEDEF(r, n, p)      typedef r(__cdecl* n ## _t)p;\n#define IL2CPP_EXTERN_DECLARATION(n) extern n ## _t n;\n#define IL2CPP_DECLARATION(n)        n ## _t n;\n#define IL2CPP_FIND_FUNCTION(n)      API:: ## n = memory.find_function<n ## _t>(game_assembly, #n);\n\n#define DO_API(r, n, p) IL2CPP_TYPEDEF(r, n, p);\n#include IL2CPP_API_H\n#undef DO_API\n\n#include \"hook.h\"\n\n\nnamespace IL2CPP\n{\n\textern Il2CppDomain* domain;\n\n\tbool Initialize(MEMORY memory);\n\tvoid Attach();\n\n\tnamespace API {\n\t\t#define DO_API(r, n, p) IL2CPP_EXTERN_DECLARATION(n)\n\t\t#include IL2CPP_API_H\n\t\t#undef DO_API\n\t}\n\n\tstruct METHOD;\n\tstruct STRING;\n\tstruct ASSEMBLY;\n\tstruct CLASS;\n\tstruct FIELD;\n\tstruct NAMESPACE;\n\tstruct ARRAY;\n\tstruct STRING;\n\tstruct OBJECT;\n\tstruct TYPE;\n\n\tstruct METHOD : MethodInfo {\n\t\tconst char* Name();\n\n\t\t// Overload 1: Hook with original pointer return\n\t\ttemplate <class T>\n\t\tHOOK* Hook(MEMORY memory, void* new_method, T* original) {\n\t\t\tauto new_hook = Hook<T>(memory, new_method);\n\t\t\t*original = new_hook->get_original<T>();\n\n\t\t\treturn new_hook;\n\t\t}\n\n\t\t// Overload 2: Hook without original pointer return\n\t\ttemplate <class T>\n\t\tHOOK* Hook(MEMORY memory, void* new_method) {\n\t\t\tauto new_hook = new HOOK(memory, this->FindFunction<T>(), new_method);\n\n\t\t\tnew_hook->load();\n\n\t\t\treturn new_hook;\n\t\t}\n\n\t\ttemplate <class T>\n\t\tT FindFunction() {\n\t\t\treturn (T)this->methodPointer;\n\t\t}\n\t};\n\n\tstruct STRING : Il2CppString {\n\t\tconst size_t Length();\n\t\tconst wchar_t* WChars();\n\t};\n\n\tstruct ASSEMBLY : Il2CppAssembly {\n\t\tNAMESPACE* Namespace(const char* assembly_name);\n\n\t\tIl2CppImage* Image();\n\t\tASSEMBLY* List(size_t* size);\n\t};\n\n\tstruct NAMESPACE {\n\t\tNAMESPACE(ASSEMBLY* assembly_, const char* name_);\n\n\t\tCLASS* Class(const char* class_name);\n\n\t\tASSEMBLY* assembly;\n\t\tconst char* name;\n\t};\n\n\tstruct CLASS : Il2CppClass {\n\t\tTYPE* Type(const char* field_name);\n\n\t\tMETHOD* Method(const char* method_name, int args_count = 0);\n\t\t//const MethodInfo* methods(void** iter);\n\n\t\tFIELD* Field(const char* field_name);\n\t\t//FieldInfo* fields(void** iter);\n\n\t\tconst PropertyInfo* Property(const char* property_name);\n\t\t//const PropertyInfo* properties(void** iter);\n\n\t\tconst char* Name();\n\t\tconst char* Namespaze();\n\t\tconst char* AssemblyName();\n\t\tconst Il2CppImage* Image();\n\t};\n\n\tstruct FIELD : FieldInfo {\n\t\tconst char* Name();\n\t\tsize_t Offset();\n\t\tvoid SetValue(OBJECT* obj, void* value);\n\t\tvoid SetStaticValue(void* value);\n\n\t\tTYPE* Type();\n\n\t\ttemplate <class T>\n\t\tT GetValue(OBJECT* obj) {\n\n\t\t\tT ret;\n\n\t\t\tAPI::il2cpp_field_get_value(obj, this, &ret);\n\n\t\t\treturn ret;\n\t\t};\n\n\t\ttemplate <class T>\n\t\tT GetStaticValue() {\n\n\t\t\tT ret;\n\n\t\t\tAPI::il2cpp_field_static_get_value(this, &ret);\n\n\t\t\treturn ret;\n\t\t};\n\n\t\tOBJECT* GetObject(OBJECT* obj);\n\t\tARRAY*  GetArray(OBJECT* obj);\n\t\tSTRING* GetString(OBJECT* obj);\n\n\t\tOBJECT* GetStaticObject();\n\t\tARRAY*  GetStaticArray();\n\t\tSTRING* GetStaticString();\n\t};\n\n\tstruct TYPE : Il2CppType {\n\t\tCLASS* Class();\n\t\tconst char* Name();\n\t};\n\n\tstruct OBJECT : Il2CppObject {\n\t\tFIELD* Field(const char* field_name);\n\n\t\ttemplate <class T>\n\t\tT GetValue(const char* field_name) {\n\t\t\treturn Field(field_name)->GetValue<T>(this);\n\t\t};\n\n\t\tARRAY* GetArray(const char* field_name);\n\t\tSTRING* GetString(const char* field_name);\n\t\tOBJECT* GetObject(const char* field_name);\n\n\t\tvoid SetValue(const  char* field_name, void* value);\n\n\t\tCLASS* Class();\n\t\tTYPE* Type(const char* field_name);\n\t};\n\n\tstruct ARRAY : Il2CppArray {\n\t\tsize_t MaxLength();\n\n\t\ttemplate <class T>\n\t\tT* GetArray() {\n\t\t\treturn (T*)((uintptr_t)this + sizeof(Il2CppArray));\n\t\t}\n\n\t\ttemplate <class T>\n\t\tT GetIndex(size_t id) {\n\t\t\treturn GetArray<T>()[id];\n\t\t}\n\n\t\tOBJECT* GetObject(size_t id);\n\t\tSTRING* GetString(size_t id);\n\t};\n\n\tASSEMBLY* Assembly(const char* name);\n\tNAMESPACE* Namespace(ASSEMBLY* assembly, const char* name);\n\tSTRING* String(const char* str);\n\n\tCLASS*  Class(const char* assembly_name, const char* namespace_name, const char* class_name);\n\tFIELD*  Field(const char* assembly_name, const char* namespace_name, const char* class_name, const char* field_name);\n\tMETHOD* Method(const char* assembly_name, const char* namespace_name, const char* class_name, const char* method_name, int param_count);\n\n\ttemplate<class T>\n\tT Function(const char* assembly_name, const char* namespace_name, const char* klass_name, const char* method_name, int param_count) {\n\t\treturn Method(assembly_name, namespace_name, klass_name, method_name, param_count)->FindFunction<T>();\n\t}\n};"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/il2cpp_api.h",
    "content": "#ifndef DO_API_NO_RETURN\n#define DO_API_NO_RETURN(r, n, p) DO_API(r,n,p)\n#endif\n\n\nDO_API(void, il2cpp_init, (const char* domain_name));\nDO_API(void, il2cpp_init_utf16, (const Il2CppChar* domain_name));\nDO_API(void, il2cpp_shutdown, ());\nDO_API(void, il2cpp_dumping_memory, (bool val));\nDO_API(void, il2cpp_set_config_dir, (const char* config_path));\nDO_API(void, il2cpp_set_data_dir, (const char* data_path));\nDO_API(void, il2cpp_set_temp_dir, (const char* temp_path));\nDO_API(void, il2cpp_set_commandline_arguments, (int argc, const char* const argv[], const char* basedir));\nDO_API(void, il2cpp_set_commandline_arguments_utf16, (int argc, const Il2CppChar* const argv[], const char* basedir));\nDO_API(void, il2cpp_set_config_utf16, (const Il2CppChar* executablePath));\nDO_API(void, il2cpp_set_config, (const char* executablePath));\n\nDO_API(void, il2cpp_set_memory_callbacks, (Il2CppMemoryCallbacks* callbacks));\nDO_API(const Il2CppImage*, il2cpp_get_corlib, ());\nDO_API(void, il2cpp_add_internal_call, (const char* name, Il2CppMethodPointer method));\nDO_API(Il2CppMethodPointer, il2cpp_resolve_icall, (const char* name));\n\nDO_API(void*, il2cpp_alloc, (size_t size));\nDO_API(void, il2cpp_free, (void* ptr));\n\n// array\nDO_API(Il2CppClass*, il2cpp_array_class_get, (Il2CppClass* element_class, uint32_t rank));\nDO_API(uint32_t, il2cpp_array_length, (Il2CppArray* array));\nDO_API(uint32_t, il2cpp_array_get_byte_length, (Il2CppArray* array));\nDO_API(Il2CppArray*, il2cpp_array_new, (Il2CppClass* elementTypeInfo, il2cpp_array_size_t length));\nDO_API(Il2CppArray*, il2cpp_array_new_specific, (Il2CppClass* arrayTypeInfo, il2cpp_array_size_t length));\nDO_API(Il2CppArray*, il2cpp_array_new_full, (Il2CppClass* array_class, il2cpp_array_size_t* lengths, il2cpp_array_size_t* lower_bounds));\nDO_API(Il2CppClass*, il2cpp_bounded_array_class_get, (Il2CppClass* element_class, uint32_t rank, bool bounded));\nDO_API(int, il2cpp_array_element_size, (const Il2CppClass* array_class));\n\n// assembly\nDO_API(const Il2CppImage*, il2cpp_assembly_get_image, (const Il2CppAssembly* assembly));\n\n// class\nDO_API(const Il2CppType*, il2cpp_class_enum_basetype, (Il2CppClass* klass));\nDO_API(bool, il2cpp_class_is_generic, (const Il2CppClass* klass));\nDO_API(bool, il2cpp_class_is_inflated, (const Il2CppClass* klass));\nDO_API(bool, il2cpp_class_is_assignable_from, (Il2CppClass* klass, Il2CppClass* oklass));\nDO_API(bool, il2cpp_class_is_subclass_of, (Il2CppClass* klass, Il2CppClass* klassc, bool check_interfaces));\nDO_API(bool, il2cpp_class_has_parent, (Il2CppClass* klass, Il2CppClass* klassc));\nDO_API(Il2CppClass*, il2cpp_class_from_il2cpp_type, (const Il2CppType* type));\nDO_API(Il2CppClass*, il2cpp_class_from_name, (const Il2CppImage* image, const char* namespaze, const char* name));\nDO_API(Il2CppClass*, il2cpp_class_from_system_type, (Il2CppReflectionType* type));\nDO_API(Il2CppClass*, il2cpp_class_get_element_class, (Il2CppClass* klass));\nDO_API(const EventInfo*, il2cpp_class_get_events, (Il2CppClass* klass, void** iter));\nDO_API(FieldInfo*, il2cpp_class_get_fields, (Il2CppClass* klass, void** iter));\nDO_API(Il2CppClass*, il2cpp_class_get_nested_types, (Il2CppClass* klass, void** iter));\nDO_API(Il2CppClass*, il2cpp_class_get_interfaces, (Il2CppClass* klass, void** iter));\nDO_API(const PropertyInfo*, il2cpp_class_get_properties, (Il2CppClass* klass, void** iter));\nDO_API(const PropertyInfo*, il2cpp_class_get_property_from_name, (Il2CppClass* klass, const char* name));\nDO_API(FieldInfo*, il2cpp_class_get_field_from_name, (Il2CppClass* klass, const char* name));\nDO_API(const MethodInfo*, il2cpp_class_get_methods, (Il2CppClass* klass, void** iter));\nDO_API(const MethodInfo*, il2cpp_class_get_method_from_name, (Il2CppClass* klass, const char* name, int argsCount));\nDO_API(const char*, il2cpp_class_get_name, (Il2CppClass* klass));\nDO_API(const char*, il2cpp_class_get_namespace, (Il2CppClass* klass));\nDO_API(Il2CppClass*, il2cpp_class_get_parent, (Il2CppClass* klass));\nDO_API(Il2CppClass*, il2cpp_class_get_declaring_type, (Il2CppClass* klass));\nDO_API(int32_t, il2cpp_class_instance_size, (Il2CppClass* klass));\nDO_API(size_t, il2cpp_class_num_fields, (const Il2CppClass* enumKlass));\nDO_API(bool, il2cpp_class_is_valuetype, (const Il2CppClass* klass));\nDO_API(int32_t, il2cpp_class_value_size, (Il2CppClass* klass, uint32_t* align));\nDO_API(bool, il2cpp_class_is_blittable, (const Il2CppClass* klass));\nDO_API(int, il2cpp_class_get_flags, (const Il2CppClass* klass));\nDO_API(bool, il2cpp_class_is_abstract, (const Il2CppClass* klass));\nDO_API(bool, il2cpp_class_is_interface, (const Il2CppClass* klass));\nDO_API(int, il2cpp_class_array_element_size, (const Il2CppClass* klass));\nDO_API(Il2CppClass*, il2cpp_class_from_type, (const Il2CppType* type));\nDO_API(const Il2CppType*, il2cpp_class_get_type, (Il2CppClass* klass));\nDO_API(uint32_t, il2cpp_class_get_type_token, (Il2CppClass* klass));\nDO_API(bool, il2cpp_class_has_attribute, (Il2CppClass* klass, Il2CppClass* attr_class));\nDO_API(bool, il2cpp_class_has_references, (Il2CppClass* klass));\nDO_API(bool, il2cpp_class_is_enum, (const Il2CppClass* klass));\nDO_API(const Il2CppImage*, il2cpp_class_get_image, (Il2CppClass* klass));\nDO_API(const char*, il2cpp_class_get_assemblyname, (const Il2CppClass* klass));\nDO_API(int, il2cpp_class_get_rank, (const Il2CppClass* klass));\n\n// testing only\nDO_API(size_t, il2cpp_class_get_bitmap_size, (const Il2CppClass* klass));\nDO_API(void, il2cpp_class_get_bitmap, (Il2CppClass* klass, size_t* bitmap));\n\n// stats\nDO_API(bool, il2cpp_stats_dump_to_file, (const char* path));\nDO_API(uint64_t, il2cpp_stats_get_value, (Il2CppStat stat));\n\n// domain\nDO_API(Il2CppDomain*, il2cpp_domain_get, ());\nDO_API(const Il2CppAssembly*, il2cpp_domain_assembly_open, (Il2CppDomain* domain, const char* name));\nDO_API(const Il2CppAssembly**, il2cpp_domain_get_assemblies, (const Il2CppDomain* domain, size_t* size));\n\n// exception\nDO_API_NO_RETURN(void, il2cpp_raise_exception, (Il2CppException*));\nDO_API(Il2CppException*, il2cpp_exception_from_name_msg, (const Il2CppImage* image, const char* name_space, const char* name, const char* msg));\nDO_API(Il2CppException*, il2cpp_get_exception_argument_null, (const char* arg));\nDO_API(void, il2cpp_format_exception, (const Il2CppException* ex, char* message, int message_size));\nDO_API(void, il2cpp_format_stack_trace, (const Il2CppException* ex, char* output, int output_size));\nDO_API(void, il2cpp_unhandled_exception, (Il2CppException*));\n\n// field\nDO_API(int, il2cpp_field_get_flags, (FieldInfo* field));\nDO_API(const char*, il2cpp_field_get_name, (FieldInfo* field));\nDO_API(Il2CppClass*, il2cpp_field_get_parent, (FieldInfo* field));\nDO_API(size_t, il2cpp_field_get_offset, (FieldInfo* field));\nDO_API(const Il2CppType*, il2cpp_field_get_type, (FieldInfo* field));\nDO_API(void, il2cpp_field_get_value, (Il2CppObject* obj, FieldInfo* field, void* value));\nDO_API(Il2CppObject*, il2cpp_field_get_value_object, (FieldInfo* field, Il2CppObject* obj));\nDO_API(bool, il2cpp_field_has_attribute, (FieldInfo* field, Il2CppClass* attr_class));\nDO_API(void, il2cpp_field_set_value, (Il2CppObject* obj, FieldInfo* field, void* value));\nDO_API(void, il2cpp_field_static_get_value, (FieldInfo* field, void* value));\nDO_API(void, il2cpp_field_static_set_value, (FieldInfo* field, void* value));\nDO_API(void, il2cpp_field_set_value_object, (Il2CppObject* instance, FieldInfo* field, Il2CppObject* value));\n\n// gc\nDO_API(void, il2cpp_gc_collect, (int maxGenerations));\nDO_API(int32_t, il2cpp_gc_collect_a_little, ());\nDO_API(void, il2cpp_gc_disable, ());\nDO_API(void, il2cpp_gc_enable, ());\nDO_API(bool, il2cpp_gc_is_disabled, ());\nDO_API(int64_t, il2cpp_gc_get_used_size, ());\nDO_API(int64_t, il2cpp_gc_get_heap_size, ());\nDO_API(void, il2cpp_gc_wbarrier_set_field, (Il2CppObject* obj, void** targetAddress, void* object));\n\n// gchandle\nDO_API(uint32_t, il2cpp_gchandle_new, (Il2CppObject* obj, bool pinned));\nDO_API(uint32_t, il2cpp_gchandle_new_weakref, (Il2CppObject* obj, bool track_resurrection));\nDO_API(Il2CppObject*, il2cpp_gchandle_get_target, (uint32_t gchandle));\nDO_API(void, il2cpp_gchandle_free, (uint32_t gchandle));\n\n// liveness\nDO_API(void*, il2cpp_unity_liveness_calculation_begin, (Il2CppClass* filter, int max_object_count, il2cpp_register_object_callback callback, void* userdata, il2cpp_WorldChangedCallback onWorldStarted, il2cpp_WorldChangedCallback onWorldStopped));\nDO_API(void, il2cpp_unity_liveness_calculation_end, (void* state));\nDO_API(void, il2cpp_unity_liveness_calculation_from_root, (Il2CppObject* root, void* state));\nDO_API(void, il2cpp_unity_liveness_calculation_from_statics, (void* state));\n\n// method\nDO_API(const Il2CppType*, il2cpp_method_get_return_type, (const MethodInfo* method));\nDO_API(Il2CppClass*, il2cpp_method_get_declaring_type, (const MethodInfo* method));\nDO_API(const char*, il2cpp_method_get_name, (const MethodInfo* method));\nDO_API(const MethodInfo*, il2cpp_method_get_from_reflection, (const Il2CppReflectionMethod* method));\nDO_API(Il2CppReflectionMethod*, il2cpp_method_get_object, (const MethodInfo* method, Il2CppClass* refclass));\nDO_API(bool, il2cpp_method_is_generic, (const MethodInfo* method));\nDO_API(bool, il2cpp_method_is_inflated, (const MethodInfo* method));\nDO_API(bool, il2cpp_method_is_instance, (const MethodInfo* method));\nDO_API(uint32_t, il2cpp_method_get_param_count, (const MethodInfo* method));\nDO_API(const Il2CppType*, il2cpp_method_get_param, (const MethodInfo* method, uint32_t index));\nDO_API(Il2CppClass*, il2cpp_method_get_class, (const MethodInfo* method));\nDO_API(bool, il2cpp_method_has_attribute, (const MethodInfo* method, Il2CppClass* attr_class));\nDO_API(uint32_t, il2cpp_method_get_flags, (const MethodInfo* method, uint32_t* iflags));\nDO_API(uint32_t, il2cpp_method_get_token, (const MethodInfo* method));\nDO_API(const char*, il2cpp_method_get_param_name, (const MethodInfo* method, uint32_t index));\n\n// profiler\n#if IL2CPP_ENABLE_PROFILER\n\nDO_API(void, il2cpp_profiler_install, (Il2CppProfiler* prof, Il2CppProfileFunc shutdown_callback));\nDO_API(void, il2cpp_profiler_set_events, (Il2CppProfileFlags events));\nDO_API(void, il2cpp_profiler_install_enter_leave, (Il2CppProfileMethodFunc enter, Il2CppProfileMethodFunc fleave));\nDO_API(void, il2cpp_profiler_install_allocation, (Il2CppProfileAllocFunc callback));\nDO_API(void, il2cpp_profiler_install_gc, (Il2CppProfileGCFunc callback, Il2CppProfileGCResizeFunc heap_resize_callback));\nDO_API(void, il2cpp_profiler_install_fileio, (Il2CppProfileFileIOFunc callback));\nDO_API(void, il2cpp_profiler_install_thread, (Il2CppProfileThreadFunc start, Il2CppProfileThreadFunc end));\n\n#endif\n\n// property\nDO_API(uint32_t, il2cpp_property_get_flags, (PropertyInfo* prop));\nDO_API(const MethodInfo*, il2cpp_property_get_get_method, (PropertyInfo* prop));\nDO_API(const MethodInfo*, il2cpp_property_get_set_method, (PropertyInfo* prop));\nDO_API(const char*, il2cpp_property_get_name, (PropertyInfo* prop));\nDO_API(Il2CppClass*, il2cpp_property_get_parent, (PropertyInfo* prop));\n\n// object\nDO_API(Il2CppClass*, il2cpp_object_get_class, (Il2CppObject* obj));\nDO_API(uint32_t, il2cpp_object_get_size, (Il2CppObject* obj));\nDO_API(const MethodInfo*, il2cpp_object_get_virtual_method, (Il2CppObject* obj, const MethodInfo* method));\nDO_API(Il2CppObject*, il2cpp_object_new, (const Il2CppClass* klass));\nDO_API(void*, il2cpp_object_unbox, (Il2CppObject* obj));\n\nDO_API(Il2CppObject*, il2cpp_value_box, (Il2CppClass* klass, void* data));\n\n// monitor\nDO_API(void, il2cpp_monitor_enter, (Il2CppObject* obj));\nDO_API(bool, il2cpp_monitor_try_enter, (Il2CppObject* obj, uint32_t timeout));\nDO_API(void, il2cpp_monitor_exit, (Il2CppObject* obj));\nDO_API(void, il2cpp_monitor_pulse, (Il2CppObject* obj));\nDO_API(void, il2cpp_monitor_pulse_all, (Il2CppObject* obj));\nDO_API(void, il2cpp_monitor_wait, (Il2CppObject* obj));\nDO_API(bool, il2cpp_monitor_try_wait, (Il2CppObject* obj, uint32_t timeout));\n\n// runtime\nDO_API(Il2CppObject*, il2cpp_runtime_invoke, (const MethodInfo* method, void* obj, void** params, Il2CppException** exc));\nDO_API(Il2CppObject*, il2cpp_runtime_invoke_convert_args, (const MethodInfo* method, void* obj, Il2CppObject** params, int paramCount, Il2CppException** exc));\nDO_API(void, il2cpp_runtime_class_init, (Il2CppClass* klass));\nDO_API(void, il2cpp_runtime_object_init, (Il2CppObject* obj));\n\nDO_API(void, il2cpp_runtime_object_init_exception, (Il2CppObject* obj, Il2CppException** exc));\n\nDO_API(void, il2cpp_runtime_unhandled_exception_policy_set, (Il2CppRuntimeUnhandledExceptionPolicy value));\n\n// string\nDO_API(int32_t, il2cpp_string_length, (Il2CppString* str));\nDO_API(Il2CppChar*, il2cpp_string_chars, (Il2CppString* str));\nDO_API(Il2CppString*, il2cpp_string_new, (const char* str));\nDO_API(Il2CppString*, il2cpp_string_new_len, (const char* str, uint32_t length));\nDO_API(Il2CppString*, il2cpp_string_new_utf16, (const Il2CppChar* text, int32_t len));\nDO_API(Il2CppString*, il2cpp_string_new_wrapper, (const char* str));\nDO_API(Il2CppString*, il2cpp_string_intern, (Il2CppString* str));\nDO_API(Il2CppString*, il2cpp_string_is_interned, (Il2CppString* str));\n\n// thread\nDO_API(Il2CppThread*, il2cpp_thread_current, ());\nDO_API(Il2CppThread*, il2cpp_thread_attach, (Il2CppDomain* domain));\nDO_API(void, il2cpp_thread_detach, (Il2CppThread* thread));\n\nDO_API(Il2CppThread**, il2cpp_thread_get_all_attached_threads, (size_t* size));\nDO_API(bool, il2cpp_is_vm_thread, (Il2CppThread* thread));\n\n// stacktrace\nDO_API(void, il2cpp_current_thread_walk_frame_stack, (Il2CppFrameWalkFunc func, void* user_data));\nDO_API(void, il2cpp_thread_walk_frame_stack, (Il2CppThread* thread, Il2CppFrameWalkFunc func, void* user_data));\nDO_API(bool, il2cpp_current_thread_get_top_frame, (Il2CppStackFrameInfo* frame));\nDO_API(bool, il2cpp_thread_get_top_frame, (Il2CppThread* thread, Il2CppStackFrameInfo* frame));\nDO_API(bool, il2cpp_current_thread_get_frame_at, (int32_t offset, Il2CppStackFrameInfo* frame));\nDO_API(bool, il2cpp_thread_get_frame_at, (Il2CppThread* thread, int32_t offset, Il2CppStackFrameInfo* frame));\nDO_API(int32_t, il2cpp_current_thread_get_stack_depth, ());\nDO_API(int32_t, il2cpp_thread_get_stack_depth, (Il2CppThread* thread));\n\n// type\nDO_API(Il2CppObject*, il2cpp_type_get_object, (const Il2CppType* type));\nDO_API(int, il2cpp_type_get_type, (const Il2CppType* type));\nDO_API(Il2CppClass*, il2cpp_type_get_class_or_element_class, (const Il2CppType* type));\nDO_API(char*, il2cpp_type_get_name, (const Il2CppType* type));\nDO_API(bool, il2cpp_type_is_byref, (const Il2CppType* type));\nDO_API(uint32_t, il2cpp_type_get_attrs, (const Il2CppType* type));\nDO_API(bool, il2cpp_type_equals, (const Il2CppType* type, const Il2CppType* otherType));\nDO_API(char*, il2cpp_type_get_assembly_qualified_name, (const Il2CppType* type));\n\n// image\nDO_API(const Il2CppAssembly*, il2cpp_image_get_assembly, (const Il2CppImage* image));\nDO_API(const char*, il2cpp_image_get_name, (const Il2CppImage* image));\nDO_API(const char*, il2cpp_image_get_filename, (const Il2CppImage* image));\nDO_API(const MethodInfo*, il2cpp_image_get_entry_point, (const Il2CppImage* image));\n\nDO_API(size_t, il2cpp_image_get_class_count, (const Il2CppImage* image));\nDO_API(const Il2CppClass*, il2cpp_image_get_class, (const Il2CppImage* image, size_t index));\n\n// Memory information\nDO_API(Il2CppManagedMemorySnapshot*, il2cpp_capture_memory_snapshot, ());\nDO_API(void, il2cpp_free_captured_memory_snapshot, (Il2CppManagedMemorySnapshot* snapshot));\n\nDO_API(void, il2cpp_set_find_plugin_callback, (Il2CppSetFindPlugInCallback method));\n\n// Logging\nDO_API(void, il2cpp_register_log_callback, (Il2CppLogCallback method));\n\n// Debugger\nDO_API(void, il2cpp_debugger_set_agent_options, (const char* options));\nDO_API(bool, il2cpp_is_debugger_attached, ());\n\n// TLS module\nDO_API(void, il2cpp_unity_install_unitytls_interface, (const void* unitytlsInterfaceStruct));\n\n// custom attributes\nDO_API(Il2CppCustomAttrInfo*, il2cpp_custom_attrs_from_class, (Il2CppClass* klass));\nDO_API(Il2CppCustomAttrInfo*, il2cpp_custom_attrs_from_method, (const MethodInfo* method));\n\nDO_API(Il2CppObject*, il2cpp_custom_attrs_get_attr, (Il2CppCustomAttrInfo* ainfo, Il2CppClass* attr_klass));\nDO_API(bool, il2cpp_custom_attrs_has_attr, (Il2CppCustomAttrInfo* ainfo, Il2CppClass* attr_klass));\nDO_API(Il2CppArray*, il2cpp_custom_attrs_construct, (Il2CppCustomAttrInfo* cinfo));\n\nDO_API(void, il2cpp_custom_attrs_free, (Il2CppCustomAttrInfo* ainfo));"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/il2cpp_types.h",
    "content": "#include <stdint.h>\n\n#pragma once\n\n/*\n * Field Attributes (21.1.5).\n */\n\n#define FIELD_ATTRIBUTE_FIELD_ACCESS_MASK     0x0007\n#define FIELD_ATTRIBUTE_COMPILER_CONTROLLED   0x0000\n#define FIELD_ATTRIBUTE_PRIVATE               0x0001\n#define FIELD_ATTRIBUTE_FAM_AND_ASSEM         0x0002\n#define FIELD_ATTRIBUTE_ASSEMBLY              0x0003\n#define FIELD_ATTRIBUTE_FAMILY                0x0004\n#define FIELD_ATTRIBUTE_FAM_OR_ASSEM          0x0005\n#define FIELD_ATTRIBUTE_PUBLIC                0x0006\n\n#define FIELD_ATTRIBUTE_STATIC                0x0010\n#define FIELD_ATTRIBUTE_INIT_ONLY             0x0020\n#define FIELD_ATTRIBUTE_LITERAL               0x0040\n#define FIELD_ATTRIBUTE_NOT_SERIALIZED        0x0080\n#define FIELD_ATTRIBUTE_SPECIAL_NAME          0x0200\n#define FIELD_ATTRIBUTE_PINVOKE_IMPL          0x2000\n\n /* For runtime use only */\n#define FIELD_ATTRIBUTE_RESERVED_MASK         0x9500\n#define FIELD_ATTRIBUTE_RT_SPECIAL_NAME       0x0400\n#define FIELD_ATTRIBUTE_HAS_FIELD_MARSHAL     0x1000\n#define FIELD_ATTRIBUTE_HAS_DEFAULT           0x8000\n#define FIELD_ATTRIBUTE_HAS_FIELD_RVA         0x0100\n\n/*\n * Method Attributes (22.1.9)\n */\n\n#define METHOD_IMPL_ATTRIBUTE_CODE_TYPE_MASK       0x0003\n#define METHOD_IMPL_ATTRIBUTE_IL                   0x0000\n#define METHOD_IMPL_ATTRIBUTE_NATIVE               0x0001\n#define METHOD_IMPL_ATTRIBUTE_OPTIL                0x0002\n#define METHOD_IMPL_ATTRIBUTE_RUNTIME              0x0003\n\n#define METHOD_IMPL_ATTRIBUTE_MANAGED_MASK         0x0004\n#define METHOD_IMPL_ATTRIBUTE_UNMANAGED            0x0004\n#define METHOD_IMPL_ATTRIBUTE_MANAGED              0x0000\n\n#define METHOD_IMPL_ATTRIBUTE_FORWARD_REF          0x0010\n#define METHOD_IMPL_ATTRIBUTE_PRESERVE_SIG         0x0080\n#define METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL        0x1000\n#define METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED         0x0020\n#define METHOD_IMPL_ATTRIBUTE_NOINLINING           0x0008\n#define METHOD_IMPL_ATTRIBUTE_MAX_METHOD_IMPL_VAL  0xffff\n\n#define METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK        0x0007\n#define METHOD_ATTRIBUTE_COMPILER_CONTROLLED       0x0000\n#define METHOD_ATTRIBUTE_PRIVATE                   0x0001\n#define METHOD_ATTRIBUTE_FAM_AND_ASSEM             0x0002\n#define METHOD_ATTRIBUTE_ASSEM                     0x0003\n#define METHOD_ATTRIBUTE_FAMILY                    0x0004\n#define METHOD_ATTRIBUTE_FAM_OR_ASSEM              0x0005\n#define METHOD_ATTRIBUTE_PUBLIC                    0x0006\n\n#define METHOD_ATTRIBUTE_STATIC                    0x0010\n#define METHOD_ATTRIBUTE_FINAL                     0x0020\n#define METHOD_ATTRIBUTE_VIRTUAL                   0x0040\n#define METHOD_ATTRIBUTE_HIDE_BY_SIG               0x0080\n\n#define METHOD_ATTRIBUTE_VTABLE_LAYOUT_MASK        0x0100\n#define METHOD_ATTRIBUTE_REUSE_SLOT                0x0000\n#define METHOD_ATTRIBUTE_NEW_SLOT                  0x0100\n\n#define METHOD_ATTRIBUTE_STRICT                    0x0200\n#define METHOD_ATTRIBUTE_ABSTRACT                  0x0400\n#define METHOD_ATTRIBUTE_SPECIAL_NAME              0x0800\n\n#define METHOD_ATTRIBUTE_PINVOKE_IMPL              0x2000\n#define METHOD_ATTRIBUTE_UNMANAGED_EXPORT          0x0008\n\n /*\n  * For runtime use only\n  */\n#define METHOD_ATTRIBUTE_RESERVED_MASK             0xd000\n#define METHOD_ATTRIBUTE_RT_SPECIAL_NAME           0x1000\n#define METHOD_ATTRIBUTE_HAS_SECURITY              0x4000\n#define METHOD_ATTRIBUTE_REQUIRE_SEC_OBJECT        0x8000\n\n  /*\n  * Type Attributes (21.1.13).\n  */\n#define TYPE_ATTRIBUTE_VISIBILITY_MASK       0x00000007\n#define TYPE_ATTRIBUTE_NOT_PUBLIC            0x00000000\n#define TYPE_ATTRIBUTE_PUBLIC                0x00000001\n#define TYPE_ATTRIBUTE_NESTED_PUBLIC         0x00000002\n#define TYPE_ATTRIBUTE_NESTED_PRIVATE        0x00000003\n#define TYPE_ATTRIBUTE_NESTED_FAMILY         0x00000004\n#define TYPE_ATTRIBUTE_NESTED_ASSEMBLY       0x00000005\n#define TYPE_ATTRIBUTE_NESTED_FAM_AND_ASSEM  0x00000006\n#define TYPE_ATTRIBUTE_NESTED_FAM_OR_ASSEM   0x00000007\n\n#define TYPE_ATTRIBUTE_LAYOUT_MASK           0x00000018\n#define TYPE_ATTRIBUTE_AUTO_LAYOUT           0x00000000\n#define TYPE_ATTRIBUTE_SEQUENTIAL_LAYOUT     0x00000008\n#define TYPE_ATTRIBUTE_EXPLICIT_LAYOUT       0x00000010\n\n#define TYPE_ATTRIBUTE_CLASS_SEMANTIC_MASK   0x00000020\n#define TYPE_ATTRIBUTE_CLASS                 0x00000000\n#define TYPE_ATTRIBUTE_INTERFACE             0x00000020\n\n#define TYPE_ATTRIBUTE_ABSTRACT              0x00000080\n#define TYPE_ATTRIBUTE_SEALED                0x00000100\n#define TYPE_ATTRIBUTE_SPECIAL_NAME          0x00000400\n\n#define TYPE_ATTRIBUTE_IMPORT                0x00001000\n#define TYPE_ATTRIBUTE_SERIALIZABLE          0x00002000\n\n#define TYPE_ATTRIBUTE_STRING_FORMAT_MASK    0x00030000\n#define TYPE_ATTRIBUTE_ANSI_CLASS            0x00000000\n#define TYPE_ATTRIBUTE_UNICODE_CLASS         0x00010000\n#define TYPE_ATTRIBUTE_AUTO_CLASS            0x00020000\n\n#define TYPE_ATTRIBUTE_BEFORE_FIELD_INIT     0x00100000\n#define TYPE_ATTRIBUTE_FORWARDER             0x00200000\n\n#define TYPE_ATTRIBUTE_RESERVED_MASK         0x00040800\n#define TYPE_ATTRIBUTE_RT_SPECIAL_NAME       0x00000800\n#define TYPE_ATTRIBUTE_HAS_SECURITY          0x00040000\n\n  /*\n  * Flags for Params (22.1.12)\n  */\n#define PARAM_ATTRIBUTE_IN                 0x0001\n#define PARAM_ATTRIBUTE_OUT                0x0002\n#define PARAM_ATTRIBUTE_OPTIONAL           0x0010\n#define PARAM_ATTRIBUTE_RESERVED_MASK      0xf000\n#define PARAM_ATTRIBUTE_HAS_DEFAULT        0x1000\n#define PARAM_ATTRIBUTE_HAS_FIELD_MARSHAL  0x2000\n#define PARAM_ATTRIBUTE_UNUSED             0xcfe0\n\n  // Flags for Generic Parameters (II.23.1.7)\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT                           0x00\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_COVARIANT                             0x01\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_CONTRAVARIANT                         0x02\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_VARIANCE_MASK                         0x03\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT             0x04\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_NOT_NULLABLE_VALUE_TYPE_CONSTRAINT    0x08\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_DEFAULT_CONSTRUCTOR_CONSTRAINT        0x10\n#define IL2CPP_GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINT_MASK               0x1C\n\n/**\n * 21.5 AssemblyRefs\n */\n#define ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG      0x00000001\n#define ASSEMBLYREF_RETARGETABLE_FLAG         0x00000100\n#define ASSEMBLYREF_ENABLEJITCOMPILE_TRACKING_FLAG 0x00008000\n#define ASSEMBLYREF_DISABLEJITCOMPILE_OPTIMIZER_FLAG 0x00004000\n\n\ntypedef struct Il2CppClass Il2CppClass;\ntypedef struct Il2CppType Il2CppType;\ntypedef struct EventInfo EventInfo;\ntypedef struct MethodInfo MethodInfo;\ntypedef struct FieldInfo FieldInfo;\ntypedef struct PropertyInfo PropertyInfo;\ntypedef struct Il2CppAssembly Il2CppAssembly;\ntypedef struct Il2CppArray Il2CppArray;\ntypedef struct Il2CppDelegate Il2CppDelegate;\ntypedef struct Il2CppDomain Il2CppDomain;\ntypedef struct Il2CppImage Il2CppImage;\ntypedef struct Il2CppException Il2CppException;\ntypedef struct Il2CppProfiler Il2CppProfiler;\ntypedef struct Il2CppObject Il2CppObject;\ntypedef struct Il2CppReflectionMethod Il2CppReflectionMethod;\ntypedef struct Il2CppReflectionType Il2CppReflectionType;\ntypedef struct Il2CppString Il2CppString;\ntypedef struct Il2CppThread Il2CppThread;\ntypedef struct Il2CppAsyncResult Il2CppAsyncResult;\ntypedef struct Il2CppManagedMemorySnapshot Il2CppManagedMemorySnapshot;\ntypedef struct Il2CppCustomAttrInfo Il2CppCustomAttrInfo;\ntypedef enum\n{\n    IL2CPP_PROFILE_NONE = 0,\n    IL2CPP_PROFILE_APPDOMAIN_EVENTS = 1 << 0,\n    IL2CPP_PROFILE_ASSEMBLY_EVENTS = 1 << 1,\n    IL2CPP_PROFILE_MODULE_EVENTS = 1 << 2,\n    IL2CPP_PROFILE_CLASS_EVENTS = 1 << 3,\n    IL2CPP_PROFILE_JIT_COMPILATION = 1 << 4,\n    IL2CPP_PROFILE_INLINING = 1 << 5,\n    IL2CPP_PROFILE_EXCEPTIONS = 1 << 6,\n    IL2CPP_PROFILE_ALLOCATIONS = 1 << 7,\n    IL2CPP_PROFILE_GC = 1 << 8,\n    IL2CPP_PROFILE_THREADS = 1 << 9,\n    IL2CPP_PROFILE_REMOTING = 1 << 10,\n    IL2CPP_PROFILE_TRANSITIONS = 1 << 11,\n    IL2CPP_PROFILE_ENTER_LEAVE = 1 << 12,\n    IL2CPP_PROFILE_COVERAGE = 1 << 13,\n    IL2CPP_PROFILE_INS_COVERAGE = 1 << 14,\n    IL2CPP_PROFILE_STATISTICAL = 1 << 15,\n    IL2CPP_PROFILE_METHOD_EVENTS = 1 << 16,\n    IL2CPP_PROFILE_MONITOR_EVENTS = 1 << 17,\n    IL2CPP_PROFILE_IOMAP_EVENTS = 1 << 18,\n    IL2CPP_PROFILE_GC_MOVES = 1 << 19,\n    IL2CPP_PROFILE_FILEIO = 1 << 20\n} Il2CppProfileFlags;\ntypedef enum\n{\n    IL2CPP_PROFILE_FILEIO_WRITE = 0,\n    IL2CPP_PROFILE_FILEIO_READ\n} Il2CppProfileFileIOKind;\ntypedef enum\n{\n    IL2CPP_GC_EVENT_START,\n    IL2CPP_GC_EVENT_MARK_START,\n    IL2CPP_GC_EVENT_MARK_END,\n    IL2CPP_GC_EVENT_RECLAIM_START,\n    IL2CPP_GC_EVENT_RECLAIM_END,\n    IL2CPP_GC_EVENT_END,\n    IL2CPP_GC_EVENT_PRE_STOP_WORLD,\n    IL2CPP_GC_EVENT_POST_STOP_WORLD,\n    IL2CPP_GC_EVENT_PRE_START_WORLD,\n    IL2CPP_GC_EVENT_POST_START_WORLD\n} Il2CppGCEvent;\ntypedef enum\n{\n    IL2CPP_STAT_NEW_OBJECT_COUNT,\n    IL2CPP_STAT_INITIALIZED_CLASS_COUNT,\n    IL2CPP_STAT_METHOD_COUNT,\n    IL2CPP_STAT_CLASS_STATIC_DATA_SIZE,\n    IL2CPP_STAT_GENERIC_INSTANCE_COUNT,\n    IL2CPP_STAT_GENERIC_CLASS_COUNT,\n    IL2CPP_STAT_INFLATED_METHOD_COUNT,\n    IL2CPP_STAT_INFLATED_TYPE_COUNT,\n} Il2CppStat;\ntypedef enum\n{\n    IL2CPP_UNHANDLED_POLICY_LEGACY,\n    IL2CPP_UNHANDLED_POLICY_CURRENT\n} Il2CppRuntimeUnhandledExceptionPolicy;\ntypedef struct Il2CppStackFrameInfo\n{\n    const MethodInfo* method;\n} Il2CppStackFrameInfo;\ntypedef void(*Il2CppMethodPointer)();\ntypedef struct Il2CppMethodDebugInfo\n{\n    Il2CppMethodPointer methodPointer;\n    int32_t code_size;\n    const char* file;\n} Il2CppMethodDebugInfo;\ntypedef struct\n{\n    void* (*malloc_func)(size_t size);\n    void* (*aligned_malloc_func)(size_t size, size_t alignment);\n    void (*free_func)(void* ptr);\n    void (*aligned_free_func)(void* ptr);\n    void* (*calloc_func)(size_t nmemb, size_t size);\n    void* (*realloc_func)(void* ptr, size_t size);\n    void* (*aligned_realloc_func)(void* ptr, size_t size, size_t alignment);\n} Il2CppMemoryCallbacks;\ntypedef struct\n{\n    const char* name;\n    void(*connect)(const char* address);\n    int(*wait_for_attach)(void);\n    void(*close1)(void);\n    void(*close2)(void);\n    int(*send)(void* buf, int len);\n    int(*recv)(void* buf, int len);\n} Il2CppDebuggerTransport;\ntypedef uint16_t Il2CppChar;\ntypedef char Il2CppNativeChar;\ntypedef void (*il2cpp_register_object_callback)(Il2CppObject** arr, int size, void* userdata);\ntypedef void (*il2cpp_WorldChangedCallback)();\ntypedef void (*Il2CppFrameWalkFunc) (const Il2CppStackFrameInfo* info, void* user_data);\ntypedef void (*Il2CppProfileFunc) (Il2CppProfiler* prof);\ntypedef void (*Il2CppProfileMethodFunc) (Il2CppProfiler* prof, const MethodInfo* method);\ntypedef void (*Il2CppProfileAllocFunc) (Il2CppProfiler* prof, Il2CppObject* obj, Il2CppClass* klass);\ntypedef void (*Il2CppProfileGCFunc) (Il2CppProfiler* prof, Il2CppGCEvent event, int generation);\ntypedef void (*Il2CppProfileGCResizeFunc) (Il2CppProfiler* prof, int64_t new_size);\ntypedef void (*Il2CppProfileFileIOFunc) (Il2CppProfiler* prof, Il2CppProfileFileIOKind kind, int count);\ntypedef void (*Il2CppProfileThreadFunc) (Il2CppProfiler* prof, unsigned long tid);\ntypedef const Il2CppNativeChar* (*Il2CppSetFindPlugInCallback)(const Il2CppNativeChar*);\ntypedef void (*Il2CppLogCallback)(const char*);\ntypedef size_t(*Il2CppBacktraceFunc) (Il2CppMethodPointer* buffer, size_t maxSize);\ntypedef struct Il2CppManagedMemorySnapshot Il2CppManagedMemorySnapshot;\ntypedef uintptr_t il2cpp_array_size_t;\ntypedef void (*SynchronizationContextCallback)(intptr_t arg);\ntypedef uint32_t Il2CppMethodSlot;\nstatic const uint32_t kInvalidIl2CppMethodSlot = 65535;\nstatic const int ipv6AddressSize = 16;\ntypedef int32_t il2cpp_hresult_t;\ntypedef struct Il2CppMetadataField\n{\n    uint32_t offset;\n    uint32_t typeIndex;\n    const char* name;\n    uint8_t isStatic;\n} Il2CppMetadataField;\ntypedef enum Il2CppMetadataTypeFlags\n{\n    kNone = 0,\n    kValueType = 1 << 0,\n    kArray = 1 << 1,\n    kArrayRankMask = 0xFFFF0000\n} Il2CppMetadataTypeFlags;\ntypedef struct Il2CppMetadataType\n{\n    Il2CppMetadataTypeFlags flags;\n    Il2CppMetadataField* fields;\n    uint32_t fieldCount;\n    uint32_t staticsSize;\n    uint8_t* statics;\n    uint32_t baseOrElementTypeIndex;\n    char* name;\n    const char* assemblyName;\n    uint64_t typeInfoAddress;\n    uint32_t size;\n} Il2CppMetadataType;\ntypedef struct Il2CppMetadataSnapshot\n{\n    uint32_t typeCount;\n    Il2CppMetadataType* types;\n} Il2CppMetadataSnapshot;\ntypedef struct Il2CppManagedMemorySection\n{\n    uint64_t sectionStartAddress;\n    uint32_t sectionSize;\n    uint8_t* sectionBytes;\n} Il2CppManagedMemorySection;\ntypedef struct Il2CppManagedHeap\n{\n    uint32_t sectionCount;\n    Il2CppManagedMemorySection* sections;\n} Il2CppManagedHeap;\ntypedef struct Il2CppStacks\n{\n    uint32_t stackCount;\n    Il2CppManagedMemorySection* stacks;\n} Il2CppStacks;\ntypedef struct NativeObject\n{\n    uint32_t gcHandleIndex;\n    uint32_t size;\n    uint32_t instanceId;\n    uint32_t classId;\n    uint32_t referencedNativeObjectIndicesCount;\n    uint32_t* referencedNativeObjectIndices;\n} NativeObject;\ntypedef struct Il2CppGCHandles\n{\n    uint32_t trackedObjectCount;\n    uint64_t* pointersToObjects;\n} Il2CppGCHandles;\ntypedef struct Il2CppRuntimeInformation\n{\n    uint32_t pointerSize;\n    uint32_t objectHeaderSize;\n    uint32_t arrayHeaderSize;\n    uint32_t arrayBoundsOffsetInHeader;\n    uint32_t arraySizeOffsetInHeader;\n    uint32_t allocationGranularity;\n} Il2CppRuntimeInformation;\ntypedef struct Il2CppManagedMemorySnapshot\n{\n    Il2CppManagedHeap heap;\n    Il2CppStacks stacks;\n    Il2CppMetadataSnapshot metadata;\n    Il2CppGCHandles gcHandles;\n    Il2CppRuntimeInformation runtimeInformation;\n    void* additionalUserInformation;\n} Il2CppManagedMemorySnapshot;\ntypedef enum Il2CppTypeEnum\n{\n    IL2CPP_TYPE_END = 0x00,\n    IL2CPP_TYPE_VOID = 0x01,\n    IL2CPP_TYPE_BOOLEAN = 0x02,\n    IL2CPP_TYPE_CHAR = 0x03,\n    IL2CPP_TYPE_I1 = 0x04,\n    IL2CPP_TYPE_U1 = 0x05,\n    IL2CPP_TYPE_I2 = 0x06,\n    IL2CPP_TYPE_U2 = 0x07,\n    IL2CPP_TYPE_I4 = 0x08,\n    IL2CPP_TYPE_U4 = 0x09,\n    IL2CPP_TYPE_I8 = 0x0a,\n    IL2CPP_TYPE_U8 = 0x0b,\n    IL2CPP_TYPE_R4 = 0x0c,\n    IL2CPP_TYPE_R8 = 0x0d,\n    IL2CPP_TYPE_STRING = 0x0e,\n    IL2CPP_TYPE_PTR = 0x0f,\n    IL2CPP_TYPE_BYREF = 0x10,\n    IL2CPP_TYPE_VALUETYPE = 0x11,\n    IL2CPP_TYPE_CLASS = 0x12,\n    IL2CPP_TYPE_VAR = 0x13,\n    IL2CPP_TYPE_ARRAY = 0x14,\n    IL2CPP_TYPE_GENERICINST = 0x15,\n    IL2CPP_TYPE_TYPEDBYREF = 0x16,\n    IL2CPP_TYPE_I = 0x18,\n    IL2CPP_TYPE_U = 0x19,\n    IL2CPP_TYPE_FNPTR = 0x1b,\n    IL2CPP_TYPE_OBJECT = 0x1c,\n    IL2CPP_TYPE_SZARRAY = 0x1d,\n    IL2CPP_TYPE_MVAR = 0x1e,\n    IL2CPP_TYPE_CMOD_REQD = 0x1f,\n    IL2CPP_TYPE_CMOD_OPT = 0x20,\n    IL2CPP_TYPE_INTERNAL = 0x21,\n    IL2CPP_TYPE_MODIFIER = 0x40,\n    IL2CPP_TYPE_SENTINEL = 0x41,\n    IL2CPP_TYPE_PINNED = 0x45,\n    IL2CPP_TYPE_ENUM = 0x55\n} Il2CppTypeEnum;\ntypedef enum\n{\n    IL2CPP_TOKEN_MODULE = 0x00000000,\n    IL2CPP_TOKEN_TYPE_REF = 0x01000000,\n    IL2CPP_TOKEN_TYPE_DEF = 0x02000000,\n    IL2CPP_TOKEN_FIELD_DEF = 0x04000000,\n    IL2CPP_TOKEN_METHOD_DEF = 0x06000000,\n    IL2CPP_TOKEN_PARAM_DEF = 0x08000000,\n    IL2CPP_TOKEN_INTERFACE_IMPL = 0x09000000,\n    IL2CPP_TOKEN_MEMBER_REF = 0x0a000000,\n    IL2CPP_TOKEN_CUSTOM_ATTRIBUTE = 0x0c000000,\n    IL2CPP_TOKEN_PERMISSION = 0x0e000000,\n    IL2CPP_TOKEN_SIGNATURE = 0x11000000,\n    IL2CPP_TOKEN_EVENT = 0x14000000,\n    IL2CPP_TOKEN_PROPERTY = 0x17000000,\n    IL2CPP_TOKEN_MODULE_REF = 0x1a000000,\n    IL2CPP_TOKEN_TYPE_SPEC = 0x1b000000,\n    IL2CPP_TOKEN_ASSEMBLY = 0x20000000,\n    IL2CPP_TOKEN_ASSEMBLY_REF = 0x23000000,\n    IL2CPP_TOKEN_FILE = 0x26000000,\n    IL2CPP_TOKEN_EXPORTED_TYPE = 0x27000000,\n    IL2CPP_TOKEN_MANIFEST_RESOURCE = 0x28000000,\n    IL2CPP_TOKEN_GENERIC_PARAM = 0x2a000000,\n    IL2CPP_TOKEN_METHOD_SPEC = 0x2b000000,\n} Il2CppTokenType;\ntypedef int32_t TypeIndex;\ntypedef int32_t TypeDefinitionIndex;\ntypedef int32_t FieldIndex;\ntypedef int32_t DefaultValueIndex;\ntypedef int32_t DefaultValueDataIndex;\ntypedef int32_t CustomAttributeIndex;\ntypedef int32_t ParameterIndex;\ntypedef int32_t MethodIndex;\ntypedef int32_t GenericMethodIndex;\ntypedef int32_t PropertyIndex;\ntypedef int32_t EventIndex;\ntypedef int32_t GenericContainerIndex;\ntypedef int32_t GenericParameterIndex;\ntypedef int16_t GenericParameterConstraintIndex;\ntypedef int32_t NestedTypeIndex;\ntypedef int32_t InterfacesIndex;\ntypedef int32_t VTableIndex;\ntypedef int32_t InterfaceOffsetIndex;\ntypedef int32_t RGCTXIndex;\ntypedef int32_t StringIndex;\ntypedef int32_t StringLiteralIndex;\ntypedef int32_t GenericInstIndex;\ntypedef int32_t ImageIndex;\ntypedef int32_t AssemblyIndex;\ntypedef int32_t InteropDataIndex;\nstatic const TypeIndex kTypeIndexInvalid = -1;\nstatic const TypeDefinitionIndex kTypeDefinitionIndexInvalid = -1;\nstatic const DefaultValueDataIndex kDefaultValueIndexNull = -1;\nstatic const CustomAttributeIndex kCustomAttributeIndexInvalid = -1;\nstatic const EventIndex kEventIndexInvalid = -1;\nstatic const FieldIndex kFieldIndexInvalid = -1;\nstatic const MethodIndex kMethodIndexInvalid = -1;\nstatic const PropertyIndex kPropertyIndexInvalid = -1;\nstatic const GenericContainerIndex kGenericContainerIndexInvalid = -1;\nstatic const GenericParameterIndex kGenericParameterIndexInvalid = -1;\nstatic const RGCTXIndex kRGCTXIndexInvalid = -1;\nstatic const StringLiteralIndex kStringLiteralIndexInvalid = -1;\nstatic const InteropDataIndex kInteropDataIndexInvalid = -1;\ntypedef uint32_t EncodedMethodIndex;\ntypedef enum Il2CppMetadataUsage\n{\n    kIl2CppMetadataUsageInvalid,\n    kIl2CppMetadataUsageTypeInfo,\n    kIl2CppMetadataUsageIl2CppType,\n    kIl2CppMetadataUsageMethodDef,\n    kIl2CppMetadataUsageFieldInfo,\n    kIl2CppMetadataUsageStringLiteral,\n    kIl2CppMetadataUsageMethodRef,\n} Il2CppMetadataUsage;\ntypedef struct Il2CppImage Il2CppImage;\ntypedef struct Il2CppType Il2CppType;\ntypedef struct Il2CppTypeDefinitionMetadata Il2CppTypeDefinitionMetadata;\ntypedef union Il2CppRGCTXDefinitionData\n{\n    int32_t rgctxDataDummy;\n    MethodIndex methodIndex;\n    TypeIndex typeIndex;\n} Il2CppRGCTXDefinitionData;\ntypedef enum Il2CppRGCTXDataType\n{\n    IL2CPP_RGCTX_DATA_INVALID,\n    IL2CPP_RGCTX_DATA_TYPE,\n    IL2CPP_RGCTX_DATA_CLASS,\n    IL2CPP_RGCTX_DATA_METHOD,\n    IL2CPP_RGCTX_DATA_ARRAY,\n} Il2CppRGCTXDataType;\ntypedef struct Il2CppRGCTXDefinition\n{\n    Il2CppRGCTXDataType type;\n    Il2CppRGCTXDefinitionData data;\n} Il2CppRGCTXDefinition;\ntypedef struct Il2CppInterfaceOffsetPair\n{\n    TypeIndex interfaceTypeIndex;\n    int32_t offset;\n} Il2CppInterfaceOffsetPair;\ntypedef struct Il2CppTypeDefinition\n{\n    StringIndex nameIndex;\n    StringIndex namespaceIndex;\n    TypeIndex byvalTypeIndex;\n    TypeIndex byrefTypeIndex;\n    TypeIndex declaringTypeIndex;\n    TypeIndex parentIndex;\n    TypeIndex elementTypeIndex;\n    GenericContainerIndex genericContainerIndex;\n    uint32_t flags;\n    FieldIndex fieldStart;\n    MethodIndex methodStart;\n    EventIndex eventStart;\n    PropertyIndex propertyStart;\n    NestedTypeIndex nestedTypesStart;\n    InterfacesIndex interfacesStart;\n    VTableIndex vtableStart;\n    InterfacesIndex interfaceOffsetsStart;\n    uint16_t method_count;\n    uint16_t property_count;\n    uint16_t field_count;\n    uint16_t event_count;\n    uint16_t nested_type_count;\n    uint16_t vtable_count;\n    uint16_t interfaces_count;\n    uint16_t interface_offsets_count;\n    uint32_t bitfield;\n    uint32_t token;\n} Il2CppTypeDefinition;\ntypedef struct Il2CppFieldDefinition\n{\n    StringIndex nameIndex;\n    TypeIndex typeIndex;\n    uint32_t token;\n} Il2CppFieldDefinition;\ntypedef struct Il2CppFieldDefaultValue\n{\n    FieldIndex fieldIndex;\n    TypeIndex typeIndex;\n    DefaultValueDataIndex dataIndex;\n} Il2CppFieldDefaultValue;\ntypedef struct Il2CppFieldMarshaledSize\n{\n    FieldIndex fieldIndex;\n    TypeIndex typeIndex;\n    int32_t size;\n} Il2CppFieldMarshaledSize;\ntypedef struct Il2CppFieldRef\n{\n    TypeIndex typeIndex;\n    FieldIndex fieldIndex;\n} Il2CppFieldRef;\ntypedef struct Il2CppParameterDefinition\n{\n    StringIndex nameIndex;\n    uint32_t token;\n    TypeIndex typeIndex;\n} Il2CppParameterDefinition;\ntypedef struct Il2CppParameterDefaultValue\n{\n    ParameterIndex parameterIndex;\n    TypeIndex typeIndex;\n    DefaultValueDataIndex dataIndex;\n} Il2CppParameterDefaultValue;\ntypedef struct Il2CppMethodDefinition\n{\n    StringIndex nameIndex;\n    TypeDefinitionIndex declaringType;\n    TypeIndex returnType;\n    ParameterIndex parameterStart;\n    GenericContainerIndex genericContainerIndex;\n    uint32_t token;\n    uint16_t flags;\n    uint16_t iflags;\n    uint16_t slot;\n    uint16_t parameterCount;\n} Il2CppMethodDefinition;\ntypedef struct Il2CppEventDefinition\n{\n    StringIndex nameIndex;\n    TypeIndex typeIndex;\n    MethodIndex add;\n    MethodIndex remove;\n    MethodIndex raise;\n    uint32_t token;\n} Il2CppEventDefinition;\ntypedef struct Il2CppPropertyDefinition\n{\n    StringIndex nameIndex;\n    MethodIndex get;\n    MethodIndex set;\n    uint32_t attrs;\n    uint32_t token;\n} Il2CppPropertyDefinition;\ntypedef struct Il2CppMethodSpec\n{\n    MethodIndex methodDefinitionIndex;\n    GenericInstIndex classIndexIndex;\n    GenericInstIndex methodIndexIndex;\n} Il2CppMethodSpec;\ntypedef struct Il2CppStringLiteral\n{\n    uint32_t length;\n    StringLiteralIndex dataIndex;\n} Il2CppStringLiteral;\ntypedef struct\n{\n    MethodIndex methodIndex;\n    MethodIndex invokerIndex;\n    MethodIndex adjustorThunkIndex;\n} Il2CppGenericMethodIndices;\ntypedef struct Il2CppGenericMethodFunctionsDefinitions\n{\n    GenericMethodIndex genericMethodIndex;\n    Il2CppGenericMethodIndices indices;\n} Il2CppGenericMethodFunctionsDefinitions;\nstatic const int kPublicKeyByteLength = 8;\ntypedef struct Il2CppAssemblyNameDefinition\n{\n    StringIndex nameIndex;\n    StringIndex cultureIndex;\n    StringIndex publicKeyIndex;\n    uint32_t hash_alg;\n    int32_t hash_len;\n    uint32_t flags;\n    int32_t major;\n    int32_t minor;\n    int32_t build;\n    int32_t revision;\n    uint8_t public_key_token[8];\n} Il2CppAssemblyNameDefinition;\ntypedef struct Il2CppImageDefinition\n{\n    StringIndex nameIndex;\n    AssemblyIndex assemblyIndex;\n    TypeDefinitionIndex typeStart;\n    uint32_t typeCount;\n    TypeDefinitionIndex exportedTypeStart;\n    uint32_t exportedTypeCount;\n    MethodIndex entryPointIndex;\n    uint32_t token;\n    CustomAttributeIndex customAttributeStart;\n    uint32_t customAttributeCount;\n} Il2CppImageDefinition;\ntypedef struct Il2CppAssemblyDefinition\n{\n    ImageIndex imageIndex;\n    uint32_t token;\n    int32_t referencedAssemblyStart;\n    int32_t referencedAssemblyCount;\n    Il2CppAssemblyNameDefinition aname;\n} Il2CppAssemblyDefinition;\ntypedef struct Il2CppMetadataUsageList\n{\n    uint32_t start;\n    uint32_t count;\n} Il2CppMetadataUsageList;\ntypedef struct Il2CppMetadataUsagePair\n{\n    uint32_t destinationIndex;\n    uint32_t encodedSourceIndex;\n} Il2CppMetadataUsagePair;\ntypedef struct Il2CppCustomAttributeTypeRange\n{\n    uint32_t token;\n    int32_t start;\n    int32_t count;\n} Il2CppCustomAttributeTypeRange;\ntypedef struct Il2CppRange\n{\n    int32_t start;\n    int32_t length;\n} Il2CppRange;\ntypedef struct Il2CppWindowsRuntimeTypeNamePair\n{\n    StringIndex nameIndex;\n    TypeIndex typeIndex;\n} Il2CppWindowsRuntimeTypeNamePair;\n#pragma pack(push, p1,4)\ntypedef struct Il2CppGlobalMetadataHeader\n{\n    int32_t sanity;\n    int32_t version;\n    int32_t stringLiteralOffset;\n    int32_t stringLiteralCount;\n    int32_t stringLiteralDataOffset;\n    int32_t stringLiteralDataCount;\n    int32_t stringOffset;\n    int32_t stringCount;\n    int32_t eventsOffset;\n    int32_t eventsCount;\n    int32_t propertiesOffset;\n    int32_t propertiesCount;\n    int32_t methodsOffset;\n    int32_t methodsCount;\n    int32_t parameterDefaultValuesOffset;\n    int32_t parameterDefaultValuesCount;\n    int32_t fieldDefaultValuesOffset;\n    int32_t fieldDefaultValuesCount;\n    int32_t fieldAndParameterDefaultValueDataOffset;\n    int32_t fieldAndParameterDefaultValueDataCount;\n    int32_t fieldMarshaledSizesOffset;\n    int32_t fieldMarshaledSizesCount;\n    int32_t parametersOffset;\n    int32_t parametersCount;\n    int32_t fieldsOffset;\n    int32_t fieldsCount;\n    int32_t genericParametersOffset;\n    int32_t genericParametersCount;\n    int32_t genericParameterConstraintsOffset;\n    int32_t genericParameterConstraintsCount;\n    int32_t genericContainersOffset;\n    int32_t genericContainersCount;\n    int32_t nestedTypesOffset;\n    int32_t nestedTypesCount;\n    int32_t interfacesOffset;\n    int32_t interfacesCount;\n    int32_t vtableMethodsOffset;\n    int32_t vtableMethodsCount;\n    int32_t interfaceOffsetsOffset;\n    int32_t interfaceOffsetsCount;\n    int32_t typeDefinitionsOffset;\n    int32_t typeDefinitionsCount;\n    int32_t imagesOffset;\n    int32_t imagesCount;\n    int32_t assembliesOffset;\n    int32_t assembliesCount;\n    int32_t metadataUsageListsOffset;\n    int32_t metadataUsageListsCount;\n    int32_t metadataUsagePairsOffset;\n    int32_t metadataUsagePairsCount;\n    int32_t fieldRefsOffset;\n    int32_t fieldRefsCount;\n    int32_t referencedAssembliesOffset;\n    int32_t referencedAssembliesCount;\n    int32_t attributesInfoOffset;\n    int32_t attributesInfoCount;\n    int32_t attributeTypesOffset;\n    int32_t attributeTypesCount;\n    int32_t unresolvedVirtualCallParameterTypesOffset;\n    int32_t unresolvedVirtualCallParameterTypesCount;\n    int32_t unresolvedVirtualCallParameterRangesOffset;\n    int32_t unresolvedVirtualCallParameterRangesCount;\n    int32_t windowsRuntimeTypeNamesOffset;\n    int32_t windowsRuntimeTypeNamesSize;\n    int32_t exportedTypeDefinitionsOffset;\n    int32_t exportedTypeDefinitionsCount;\n} Il2CppGlobalMetadataHeader;\n#pragma pack(pop, p1)\ntypedef struct Il2CppClass Il2CppClass;\ntypedef struct MethodInfo MethodInfo;\ntypedef struct Il2CppType Il2CppType;\ntypedef struct Il2CppArrayType\n{\n    const Il2CppType* etype;\n    uint8_t rank;\n    uint8_t numsizes;\n    uint8_t numlobounds;\n    int* sizes;\n    int* lobounds;\n} Il2CppArrayType;\ntypedef struct Il2CppGenericInst\n{\n    uint32_t type_argc;\n    const Il2CppType** type_argv;\n} Il2CppGenericInst;\ntypedef struct Il2CppGenericContext\n{\n    const Il2CppGenericInst* class_inst;\n    const Il2CppGenericInst* method_inst;\n} Il2CppGenericContext;\ntypedef struct Il2CppGenericParameter\n{\n    GenericContainerIndex ownerIndex;\n    StringIndex nameIndex;\n    GenericParameterConstraintIndex constraintsStart;\n    int16_t constraintsCount;\n    uint16_t num;\n    uint16_t flags;\n} Il2CppGenericParameter;\ntypedef struct Il2CppGenericContainer\n{\n    int32_t ownerIndex;\n    int32_t type_argc;\n    int32_t is_method;\n    GenericParameterIndex genericParameterStart;\n} Il2CppGenericContainer;\ntypedef struct Il2CppGenericClass\n{\n    TypeDefinitionIndex typeDefinitionIndex;\n    Il2CppGenericContext context;\n    Il2CppClass* cached_class;\n} Il2CppGenericClass;\ntypedef struct Il2CppGenericMethod\n{\n    const MethodInfo* methodDefinition;\n    Il2CppGenericContext context;\n} Il2CppGenericMethod;\ntypedef struct Il2CppType\n{\n    union\n    {\n        void* dummy;\n        TypeDefinitionIndex klassIndex;\n        const Il2CppType* type;\n        Il2CppArrayType* array;\n        GenericParameterIndex genericParameterIndex;\n        Il2CppGenericClass* generic_class;\n    } data;\n    unsigned int attrs : 16;\n    Il2CppTypeEnum type : 8;\n    unsigned int num_mods : 6;\n    unsigned int byref : 1;\n    unsigned int pinned : 1;\n} Il2CppType;\ntypedef enum Il2CppCallConvention\n{\n    IL2CPP_CALL_DEFAULT,\n    IL2CPP_CALL_C,\n    IL2CPP_CALL_STDCALL,\n    IL2CPP_CALL_THISCALL,\n    IL2CPP_CALL_FASTCALL,\n    IL2CPP_CALL_VARARG\n} Il2CppCallConvention;\ntypedef enum Il2CppCharSet\n{\n    CHARSET_ANSI,\n    CHARSET_UNICODE,\n    CHARSET_NOT_SPECIFIED\n} Il2CppCharSet;\ntypedef struct Il2CppHString__\n{\n    int unused;\n} Il2CppHString__;\ntypedef Il2CppHString__* Il2CppHString;\ntypedef struct Il2CppHStringHeader\n{\n    union\n    {\n        void* Reserved1;\n        char Reserved2[24];\n    } Reserved;\n} Il2CppHStringHeader;\ntypedef struct Il2CppGuid\n{\n    uint32_t data1;\n    uint16_t data2;\n    uint16_t data3;\n    uint8_t data4[8];\n} Il2CppGuid;\ntypedef struct Il2CppSafeArrayBound\n{\n    uint32_t element_count;\n    int32_t lower_bound;\n} Il2CppSafeArrayBound;\ntypedef struct Il2CppSafeArray\n{\n    uint16_t dimension_count;\n    uint16_t features;\n    uint32_t element_size;\n    uint32_t lock_count;\n    void* data;\n    Il2CppSafeArrayBound bounds[1];\n} Il2CppSafeArray;\ntypedef struct Il2CppWin32Decimal\n{\n    uint16_t reserved;\n    union\n    {\n        struct\n        {\n            uint8_t scale;\n            uint8_t sign;\n        } s;\n        uint16_t signscale;\n    } u;\n    uint32_t hi32;\n    union\n    {\n        struct\n        {\n            uint32_t lo32;\n            uint32_t mid32;\n        } s2;\n        uint64_t lo64;\n    } u2;\n} Il2CppWin32Decimal;\ntypedef int16_t IL2CPP_VARIANT_BOOL;\ntypedef enum Il2CppVarType\n{\n    IL2CPP_VT_EMPTY = 0,\n    IL2CPP_VT_NULL = 1,\n    IL2CPP_VT_I2 = 2,\n    IL2CPP_VT_I4 = 3,\n    IL2CPP_VT_R4 = 4,\n    IL2CPP_VT_R8 = 5,\n    IL2CPP_VT_CY = 6,\n    IL2CPP_VT_DATE = 7,\n    IL2CPP_VT_BSTR = 8,\n    IL2CPP_VT_DISPATCH = 9,\n    IL2CPP_VT_ERROR = 10,\n    IL2CPP_VT_BOOL = 11,\n    IL2CPP_VT_VARIANT = 12,\n    IL2CPP_VT_UNKNOWN = 13,\n    IL2CPP_VT_DECIMAL = 14,\n    IL2CPP_VT_I1 = 16,\n    IL2CPP_VT_UI1 = 17,\n    IL2CPP_VT_UI2 = 18,\n    IL2CPP_VT_UI4 = 19,\n    IL2CPP_VT_I8 = 20,\n    IL2CPP_VT_UI8 = 21,\n    IL2CPP_VT_INT = 22,\n    IL2CPP_VT_UINT = 23,\n    IL2CPP_VT_VOID = 24,\n    IL2CPP_VT_HRESULT = 25,\n    IL2CPP_VT_PTR = 26,\n    IL2CPP_VT_SAFEARRAY = 27,\n    IL2CPP_VT_CARRAY = 28,\n    IL2CPP_VT_USERDEFINED = 29,\n    IL2CPP_VT_LPSTR = 30,\n    IL2CPP_VT_LPWSTR = 31,\n    IL2CPP_VT_RECORD = 36,\n    IL2CPP_VT_INT_PTR = 37,\n    IL2CPP_VT_UINT_PTR = 38,\n    IL2CPP_VT_FILETIME = 64,\n    IL2CPP_VT_BLOB = 65,\n    IL2CPP_VT_STREAM = 66,\n    IL2CPP_VT_STORAGE = 67,\n    IL2CPP_VT_STREAMED_OBJECT = 68,\n    IL2CPP_VT_STORED_OBJECT = 69,\n    IL2CPP_VT_BLOB_OBJECT = 70,\n    IL2CPP_VT_CF = 71,\n    IL2CPP_VT_CLSID = 72,\n    IL2CPP_VT_VERSIONED_STREAM = 73,\n    IL2CPP_VT_BSTR_BLOB = 0xfff,\n    IL2CPP_VT_VECTOR = 0x1000,\n    IL2CPP_VT_ARRAY = 0x2000,\n    IL2CPP_VT_BYREF = 0x4000,\n    IL2CPP_VT_RESERVED = 0x8000,\n    IL2CPP_VT_ILLEGAL = 0xffff,\n    IL2CPP_VT_ILLEGALMASKED = 0xfff,\n    IL2CPP_VT_TYPEMASK = 0xfff,\n} Il2CppVarType;\ntypedef struct Il2CppVariant Il2CppVariant;\ntypedef struct Il2CppIUnknown Il2CppIUnknown;\ntypedef struct Il2CppVariant\n{\n    union\n    {\n        struct __tagVARIANT\n        {\n            uint16_t type;\n            uint16_t reserved1;\n            uint16_t reserved2;\n            uint16_t reserved3;\n            union\n            {\n                int64_t llVal;\n                int32_t lVal;\n                uint8_t bVal;\n                int16_t iVal;\n                float fltVal;\n                double dblVal;\n                IL2CPP_VARIANT_BOOL boolVal;\n                int32_t scode;\n                int64_t cyVal;\n                double date;\n                Il2CppChar* bstrVal;\n                Il2CppIUnknown* punkVal;\n                void* pdispVal;\n                Il2CppSafeArray* parray;\n                uint8_t* pbVal;\n                int16_t* piVal;\n                int32_t* plVal;\n                int64_t* pllVal;\n                float* pfltVal;\n                double* pdblVal;\n                IL2CPP_VARIANT_BOOL* pboolVal;\n                int32_t* pscode;\n                int64_t* pcyVal;\n                double* pdate;\n                Il2CppChar* pbstrVal;\n                Il2CppIUnknown** ppunkVal;\n                void** ppdispVal;\n                Il2CppSafeArray** pparray;\n                struct Il2CppVariant* pvarVal;\n                void* byref;\n                char cVal;\n                uint16_t uiVal;\n                uint32_t ulVal;\n                uint64_t ullVal;\n                int intVal;\n                unsigned int uintVal;\n                Il2CppWin32Decimal* pdecVal;\n                char* pcVal;\n                uint16_t* puiVal;\n                uint32_t* pulVal;\n                uint64_t* pullVal;\n                int* pintVal;\n                unsigned int* puintVal;\n                struct __tagBRECORD\n                {\n                    void* pvRecord;\n                    void* pRecInfo;\n                } n4;\n            } n3;\n        } n2;\n        Il2CppWin32Decimal decVal;\n    } n1;\n} Il2CppVariant;\ntypedef struct Il2CppFileTime\n{\n    uint32_t low;\n    uint32_t high;\n} Il2CppFileTime;\ntypedef struct Il2CppStatStg\n{\n    Il2CppChar* name;\n    uint32_t type;\n    uint64_t size;\n    Il2CppFileTime mtime;\n    Il2CppFileTime ctime;\n    Il2CppFileTime atime;\n    uint32_t mode;\n    uint32_t locks;\n    Il2CppGuid clsid;\n    uint32_t state;\n    uint32_t reserved;\n} Il2CppStatStg;\ntypedef enum Il2CppWindowsRuntimeTypeKind\n{\n    kTypeKindPrimitive = 0,\n    kTypeKindMetadata,\n    kTypeKindCustom\n} Il2CppWindowsRuntimeTypeKind;\ntypedef struct Il2CppWindowsRuntimeTypeName\n{\n    Il2CppHString typeName;\n    enum Il2CppWindowsRuntimeTypeKind typeKind;\n} Il2CppWindowsRuntimeTypeName;\ntypedef void (*PInvokeMarshalToNativeFunc)(void* managedStructure, void* marshaledStructure);\ntypedef void (*PInvokeMarshalFromNativeFunc)(void* marshaledStructure, void* managedStructure);\ntypedef void (*PInvokeMarshalCleanupFunc)(void* marshaledStructure);\ntypedef struct Il2CppIUnknown* (*CreateCCWFunc)(Il2CppObject* obj);\ntypedef struct Il2CppInteropData\n{\n    Il2CppMethodPointer delegatePInvokeWrapperFunction;\n    PInvokeMarshalToNativeFunc pinvokeMarshalToNativeFunction;\n    PInvokeMarshalFromNativeFunc pinvokeMarshalFromNativeFunction;\n    PInvokeMarshalCleanupFunc pinvokeMarshalCleanupFunction;\n    CreateCCWFunc createCCWFunction;\n    const Il2CppGuid* guid;\n    const Il2CppType* type;\n} Il2CppInteropData;\ntypedef struct Il2CppClass Il2CppClass;\ntypedef struct Il2CppGuid Il2CppGuid;\ntypedef struct Il2CppImage Il2CppImage;\ntypedef struct Il2CppAppDomain Il2CppAppDomain;\ntypedef struct Il2CppAppDomainSetup Il2CppAppDomainSetup;\ntypedef struct Il2CppDelegate Il2CppDelegate;\ntypedef struct Il2CppAppContext Il2CppAppContext;\ntypedef struct Il2CppNameToTypeDefinitionIndexHashTable Il2CppNameToTypeDefinitionIndexHashTable;\ntypedef struct Il2CppCodeGenModule Il2CppCodeGenModule;\ntypedef struct VirtualInvokeData\n{\n    Il2CppMethodPointer methodPtr;\n    const MethodInfo* method;\n} VirtualInvokeData;\ntypedef enum Il2CppTypeNameFormat\n{\n    IL2CPP_TYPE_NAME_FORMAT_IL,\n    IL2CPP_TYPE_NAME_FORMAT_REFLECTION,\n    IL2CPP_TYPE_NAME_FORMAT_FULL_NAME,\n    IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED\n} Il2CppTypeNameFormat;\ntypedef struct Il2CppDefaults\n{\n    Il2CppImage* corlib;\n    Il2CppClass* object_class;\n    Il2CppClass* byte_class;\n    Il2CppClass* void_class;\n    Il2CppClass* boolean_class;\n    Il2CppClass* sbyte_class;\n    Il2CppClass* int16_class;\n    Il2CppClass* uint16_class;\n    Il2CppClass* int32_class;\n    Il2CppClass* uint32_class;\n    Il2CppClass* int_class;\n    Il2CppClass* uint_class;\n    Il2CppClass* int64_class;\n    Il2CppClass* uint64_class;\n    Il2CppClass* single_class;\n    Il2CppClass* double_class;\n    Il2CppClass* char_class;\n    Il2CppClass* string_class;\n    Il2CppClass* enum_class;\n    Il2CppClass* array_class;\n    Il2CppClass* delegate_class;\n    Il2CppClass* multicastdelegate_class;\n    Il2CppClass* asyncresult_class;\n    Il2CppClass* manualresetevent_class;\n    Il2CppClass* typehandle_class;\n    Il2CppClass* fieldhandle_class;\n    Il2CppClass* methodhandle_class;\n    Il2CppClass* systemtype_class;\n    Il2CppClass* monotype_class;\n    Il2CppClass* exception_class;\n    Il2CppClass* threadabortexception_class;\n    Il2CppClass* thread_class;\n    Il2CppClass* internal_thread_class;\n    Il2CppClass* appdomain_class;\n    Il2CppClass* appdomain_setup_class;\n    Il2CppClass* field_info_class;\n    Il2CppClass* method_info_class;\n    Il2CppClass* property_info_class;\n    Il2CppClass* event_info_class;\n    Il2CppClass* mono_event_info_class;\n    Il2CppClass* stringbuilder_class;\n    Il2CppClass* stack_frame_class;\n    Il2CppClass* stack_trace_class;\n    Il2CppClass* marshal_class;\n    Il2CppClass* typed_reference_class;\n    Il2CppClass* marshalbyrefobject_class;\n    Il2CppClass* generic_ilist_class;\n    Il2CppClass* generic_icollection_class;\n    Il2CppClass* generic_ienumerable_class;\n    Il2CppClass* generic_ireadonlylist_class;\n    Il2CppClass* generic_ireadonlycollection_class;\n    Il2CppClass* runtimetype_class;\n    Il2CppClass* generic_nullable_class;\n    Il2CppClass* il2cpp_com_object_class;\n    Il2CppClass* attribute_class;\n    Il2CppClass* customattribute_data_class;\n    Il2CppClass* version;\n    Il2CppClass* culture_info;\n    Il2CppClass* async_call_class;\n    Il2CppClass* assembly_class;\n    Il2CppClass* mono_assembly_class;\n    Il2CppClass* assembly_name_class;\n    Il2CppClass* mono_field_class;\n    Il2CppClass* mono_method_class;\n    Il2CppClass* mono_method_info_class;\n    Il2CppClass* mono_property_info_class;\n    Il2CppClass* parameter_info_class;\n    Il2CppClass* mono_parameter_info_class;\n    Il2CppClass* module_class;\n    Il2CppClass* pointer_class;\n    Il2CppClass* system_exception_class;\n    Il2CppClass* argument_exception_class;\n    Il2CppClass* wait_handle_class;\n    Il2CppClass* safe_handle_class;\n    Il2CppClass* sort_key_class;\n    Il2CppClass* dbnull_class;\n    Il2CppClass* error_wrapper_class;\n    Il2CppClass* missing_class;\n    Il2CppClass* value_type_class;\n    Il2CppClass* threadpool_wait_callback_class;\n    MethodInfo* threadpool_perform_wait_callback_method;\n    Il2CppClass* mono_method_message_class;\n    Il2CppClass* ireference_class;\n    Il2CppClass* ireferencearray_class;\n    Il2CppClass* ikey_value_pair_class;\n    Il2CppClass* key_value_pair_class;\n    Il2CppClass* windows_foundation_uri_class;\n    Il2CppClass* windows_foundation_iuri_runtime_class_class;\n    Il2CppClass* system_uri_class;\n    Il2CppClass* system_guid_class;\n    Il2CppClass* sbyte_shared_enum;\n    Il2CppClass* int16_shared_enum;\n    Il2CppClass* int32_shared_enum;\n    Il2CppClass* int64_shared_enum;\n    Il2CppClass* byte_shared_enum;\n    Il2CppClass* uint16_shared_enum;\n    Il2CppClass* uint32_shared_enum;\n    Il2CppClass* uint64_shared_enum;\n} Il2CppDefaults;\nextern Il2CppDefaults il2cpp_defaults;\ntypedef struct Il2CppClass Il2CppClass;\ntypedef struct MethodInfo MethodInfo;\ntypedef struct FieldInfo FieldInfo;\ntypedef struct Il2CppObject Il2CppObject;\ntypedef struct MemberInfo MemberInfo;\ntypedef struct CustomAttributesCache\n{\n    int count;\n    Il2CppObject** attributes;\n} CustomAttributesCache;\ntypedef void (*CustomAttributesCacheGenerator)(CustomAttributesCache*);\ntypedef struct FieldInfo\n{\n    const char* name;\n    const Il2CppType* type;\n    Il2CppClass* parent;\n    int32_t offset;\n    uint32_t token;\n} FieldInfo;\ntypedef struct PropertyInfo\n{\n    Il2CppClass* parent;\n    const char* name;\n    const MethodInfo* get;\n    const MethodInfo* set;\n    uint32_t attrs;\n    uint32_t token;\n} PropertyInfo;\ntypedef struct EventInfo\n{\n    const char* name;\n    const Il2CppType* eventType;\n    Il2CppClass* parent;\n    const MethodInfo* add;\n    const MethodInfo* remove;\n    const MethodInfo* raise;\n    uint32_t token;\n} EventInfo;\ntypedef struct ParameterInfo\n{\n    const char* name;\n    int32_t position;\n    uint32_t token;\n    const Il2CppType* parameter_type;\n} ParameterInfo;\ntypedef void* (*InvokerMethod)(Il2CppMethodPointer, const MethodInfo*, void*, void**);\ntypedef enum MethodVariableKind\n{\n    kMethodVariableKind_This,\n    kMethodVariableKind_Parameter,\n    kMethodVariableKind_LocalVariable\n} MethodVariableKind;\ntypedef enum SequencePointKind\n{\n    kSequencePointKind_Normal,\n    kSequencePointKind_StepOut\n} SequencePointKind;\ntypedef struct Il2CppMethodExecutionContextInfo\n{\n    TypeIndex typeIndex;\n    int32_t nameIndex;\n    int32_t scopeIndex;\n} Il2CppMethodExecutionContextInfo;\ntypedef struct Il2CppMethodExecutionContextInfoIndex\n{\n    int32_t startIndex;\n    int32_t count;\n} Il2CppMethodExecutionContextInfoIndex;\ntypedef struct Il2CppMethodScope\n{\n    int32_t startOffset;\n    int32_t endOffset;\n} Il2CppMethodScope;\ntypedef struct Il2CppMethodHeaderInfo\n{\n    int32_t code_size;\n    int32_t startScope;\n    int32_t numScopes;\n} Il2CppMethodHeaderInfo;\ntypedef struct Il2CppSequencePointSourceFile\n{\n    const char* file;\n    uint8_t hash[16];\n} Il2CppSequencePointSourceFile;\ntypedef struct Il2CppTypeSourceFilePair\n{\n    TypeDefinitionIndex klassIndex;\n    int32_t sourceFileIndex;\n} Il2CppTypeSourceFilePair;\ntypedef struct Il2CppSequencePoint\n{\n    MethodIndex methodDefinitionIndex;\n    int32_t sourceFileIndex;\n    int32_t lineStart, lineEnd;\n    int32_t columnStart, columnEnd;\n    int32_t ilOffset;\n    SequencePointKind kind;\n    int32_t isActive;\n    int32_t id;\n} Il2CppSequencePoint;\ntypedef struct Il2CppCatchPoint\n{\n    MethodIndex methodDefinitionIndex;\n    TypeIndex catchTypeIndex;\n    int32_t ilOffset;\n    int32_t tryId;\n    int32_t parentTryId;\n} Il2CppCatchPoint;\ntypedef struct Il2CppDebuggerMetadataRegistration\n{\n    Il2CppMethodExecutionContextInfo* methodExecutionContextInfos;\n    Il2CppMethodExecutionContextInfoIndex* methodExecutionContextInfoIndexes;\n    Il2CppMethodScope* methodScopes;\n    Il2CppMethodHeaderInfo* methodHeaderInfos;\n    Il2CppSequencePointSourceFile* sequencePointSourceFiles;\n    int32_t numSequencePoints;\n    Il2CppSequencePoint* sequencePoints;\n    int32_t numCatchPoints;\n    Il2CppCatchPoint* catchPoints;\n    int32_t numTypeSourceFileEntries;\n    Il2CppTypeSourceFilePair* typeSourceFiles;\n    const char** methodExecutionContextInfoStrings;\n} Il2CppDebuggerMetadataRegistration;\ntypedef union Il2CppRGCTXData\n{\n    void* rgctxDataDummy;\n    const MethodInfo* method;\n    const Il2CppType* type;\n    Il2CppClass* klass;\n} Il2CppRGCTXData;\ntypedef struct MethodInfo\n{\n    Il2CppMethodPointer methodPointer;\n    InvokerMethod invoker_method;\n    const char* name;\n    Il2CppClass* klass;\n    const Il2CppType* return_type;\n    const ParameterInfo* parameters;\n    union\n    {\n        const Il2CppRGCTXData* rgctx_data;\n        const Il2CppMethodDefinition* methodDefinition;\n    };\n    union\n    {\n        const Il2CppGenericMethod* genericMethod;\n        const Il2CppGenericContainer* genericContainer;\n    };\n    uint32_t token;\n    uint16_t flags;\n    uint16_t iflags;\n    uint16_t slot;\n    uint8_t parameters_count;\n    uint8_t is_generic : 1;\n    uint8_t is_inflated : 1;\n    uint8_t wrapper_type : 1;\n    uint8_t is_marshaled_from_native : 1;\n} MethodInfo;\ntypedef struct Il2CppRuntimeInterfaceOffsetPair\n{\n    Il2CppClass* interfaceType;\n    int32_t offset;\n} Il2CppRuntimeInterfaceOffsetPair;\ntypedef struct Il2CppClass\n{\n    const Il2CppImage* image;\n    void* gc_desc;\n    const char* name;\n    const char* namespaze;\n    Il2CppType byval_arg;\n    Il2CppType this_arg;\n    Il2CppClass* element_class;\n    Il2CppClass* castClass;\n    Il2CppClass* declaringType;\n    Il2CppClass* parent;\n    Il2CppGenericClass* generic_class;\n    const Il2CppTypeDefinition* typeDefinition;\n    const Il2CppInteropData* interopData;\n    Il2CppClass* klass;\n    FieldInfo* fields;\n    const EventInfo* events;\n    const PropertyInfo* properties;\n    const MethodInfo** methods;\n    Il2CppClass** nestedTypes;\n    Il2CppClass** implementedInterfaces;\n    Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets;\n    void* static_fields;\n    const Il2CppRGCTXData* rgctx_data;\n    struct Il2CppClass** typeHierarchy;\n    void* unity_user_data;\n    uint32_t initializationExceptionGCHandle;\n    uint32_t cctor_started;\n    uint32_t cctor_finished;\n\n    uint32_t cctor_thread__padding;\n    uint32_t cctor_thread;\n    uint32_t cctor_thread__hi;\n\n    GenericContainerIndex genericContainerIndex;\n    uint32_t instance_size;\n    uint32_t actualSize;\n    uint32_t element_size;\n    int32_t native_size;\n    uint32_t static_fields_size;\n    uint32_t thread_static_fields_size;\n    int32_t thread_static_fields_offset;\n    uint32_t flags;\n    uint32_t token;\n    uint16_t method_count;\n    uint16_t property_count;\n    uint16_t field_count;\n    uint16_t event_count;\n    uint16_t nested_type_count;\n    uint16_t vtable_count;\n    uint16_t interfaces_count;\n    uint16_t interface_offsets_count;\n    uint8_t typeHierarchyDepth;\n    uint8_t genericRecursionDepth;\n    uint8_t rank;\n    uint8_t minimumAlignment;\n    uint8_t naturalAligment;\n    uint8_t packingSize;\n    uint8_t initialized_and_no_error : 1;\n    uint8_t valuetype : 1;\n    uint8_t initialized : 1;\n    uint8_t enumtype : 1;\n    uint8_t is_generic : 1;\n    uint8_t has_references : 1;\n    uint8_t init_pending : 1;\n    uint8_t size_inited : 1;\n    uint8_t has_finalize : 1;\n    uint8_t has_cctor : 1;\n    uint8_t is_blittable : 1;\n    uint8_t is_import_or_windows_runtime : 1;\n    uint8_t is_vtable_initialized : 1;\n    uint8_t has_initialization_error : 1;\n    VirtualInvokeData vtable[32];\n} Il2CppClass;\n\ntypedef struct Il2CppTypeDefinitionSizes\n{\n    uint32_t instance_size;\n    int32_t native_size;\n    uint32_t static_fields_size;\n    uint32_t thread_static_fields_size;\n} Il2CppTypeDefinitionSizes;\ntypedef struct Il2CppDomain\n{\n    Il2CppAppDomain* domain;\n    Il2CppAppDomainSetup* setup;\n    Il2CppAppContext* default_context;\n    const char* friendly_name;\n    uint32_t domain_id;\n    volatile int threadpool_jobs;\n    void* agent_info;\n} Il2CppDomain;\ntypedef struct Il2CppAssemblyName\n{\n    const char* name;\n    const char* culture;\n    const uint8_t* public_key;\n    uint32_t hash_alg;\n    int32_t hash_len;\n    uint32_t flags;\n    int32_t major;\n    int32_t minor;\n    int32_t build;\n    int32_t revision;\n    uint8_t public_key_token[8];\n} Il2CppAssemblyName;\ntypedef struct Il2CppImage\n{\n    const char* name;\n    const char* nameNoExt;\n    Il2CppAssembly* assembly;\n    TypeDefinitionIndex typeStart;\n    uint32_t typeCount;\n    TypeDefinitionIndex exportedTypeStart;\n    uint32_t exportedTypeCount;\n    CustomAttributeIndex customAttributeStart;\n    uint32_t customAttributeCount;\n    MethodIndex entryPointIndex;\n    Il2CppNameToTypeDefinitionIndexHashTable* nameToClassHashTable;\n    const Il2CppCodeGenModule* codeGenModule;\n    uint32_t token;\n    uint8_t dynamic;\n} Il2CppImage;\ntypedef struct Il2CppAssembly\n{\n    Il2CppImage* image;\n    uint32_t token;\n    int32_t referencedAssemblyStart;\n    int32_t referencedAssemblyCount;\n    Il2CppAssemblyName aname;\n} Il2CppAssembly;\ntypedef struct Il2CppCodeGenOptions\n{\n    uint8_t enablePrimitiveValueTypeGenericSharing;\n    int maximumRuntimeGenericDepth;\n} Il2CppCodeGenOptions;\ntypedef struct Il2CppTokenIndexPair\n{\n    uint32_t token;\n    int32_t index;\n} Il2CppTokenIndexPair;\ntypedef struct Il2CppTokenRangePair\n{\n    uint32_t token;\n    Il2CppRange range;\n} Il2CppTokenRangePair;\ntypedef struct Il2CppTokenIndexMethodTuple\n{\n    uint32_t token;\n    int32_t index;\n    void** method;\n    uint32_t genericMethodIndex;\n} Il2CppTokenIndexMethodTuple;\ntypedef struct Il2CppTokenAdjustorThunkPair\n{\n    uint32_t token;\n    Il2CppMethodPointer adjustorThunk;\n} Il2CppTokenAdjustorThunkPair;\ntypedef struct Il2CppWindowsRuntimeFactoryTableEntry\n{\n    const Il2CppType* type;\n    Il2CppMethodPointer createFactoryFunction;\n} Il2CppWindowsRuntimeFactoryTableEntry;\ntypedef struct Il2CppCodeGenModule\n{\n    const char* moduleName;\n    const uint32_t methodPointerCount;\n    const Il2CppMethodPointer* methodPointers;\n    const uint32_t adjustorThunkCount;\n    const Il2CppTokenAdjustorThunkPair* adjustorThunks;\n    const int32_t* invokerIndices;\n    const uint32_t reversePInvokeWrapperCount;\n    const Il2CppTokenIndexMethodTuple* reversePInvokeWrapperIndices;\n    const uint32_t rgctxRangesCount;\n    const Il2CppTokenRangePair* rgctxRanges;\n    const uint32_t rgctxsCount;\n    const Il2CppRGCTXDefinition* rgctxs;\n    const Il2CppDebuggerMetadataRegistration* debuggerMetadata;\n} Il2CppCodeGenModule;\ntypedef struct Il2CppCodeRegistration\n{\n    uint32_t reversePInvokeWrapperCount;\n    const Il2CppMethodPointer* reversePInvokeWrappers;\n    uint32_t genericMethodPointersCount;\n    const Il2CppMethodPointer* genericMethodPointers;\n    const Il2CppMethodPointer* genericAdjustorThunks;\n    uint32_t invokerPointersCount;\n    const InvokerMethod* invokerPointers;\n    CustomAttributeIndex customAttributeCount;\n    const CustomAttributesCacheGenerator* customAttributeGenerators;\n    uint32_t unresolvedVirtualCallCount;\n    const Il2CppMethodPointer* unresolvedVirtualCallPointers;\n    uint32_t interopDataCount;\n    Il2CppInteropData* interopData;\n    uint32_t windowsRuntimeFactoryCount;\n    Il2CppWindowsRuntimeFactoryTableEntry* windowsRuntimeFactoryTable;\n    uint32_t codeGenModulesCount;\n    const Il2CppCodeGenModule** codeGenModules;\n} Il2CppCodeRegistration;\ntypedef struct Il2CppMetadataRegistration\n{\n    int32_t genericClassesCount;\n    Il2CppGenericClass* const* genericClasses;\n    int32_t genericInstsCount;\n    const Il2CppGenericInst* const* genericInsts;\n    int32_t genericMethodTableCount;\n    const Il2CppGenericMethodFunctionsDefinitions* genericMethodTable;\n    int32_t typesCount;\n    const Il2CppType* const* types;\n    int32_t methodSpecsCount;\n    const Il2CppMethodSpec* methodSpecs;\n    FieldIndex fieldOffsetsCount;\n    const int32_t** fieldOffsets;\n    TypeDefinitionIndex typeDefinitionsSizesCount;\n    const Il2CppTypeDefinitionSizes** typeDefinitionsSizes;\n    const size_t metadataUsagesCount;\n    void** const* metadataUsages;\n} Il2CppMetadataRegistration;\ntypedef struct Il2CppPerfCounters\n{\n    uint32_t jit_methods;\n    uint32_t jit_bytes;\n    uint32_t jit_time;\n    uint32_t jit_failures;\n    uint32_t exceptions_thrown;\n    uint32_t exceptions_filters;\n    uint32_t exceptions_finallys;\n    uint32_t exceptions_depth;\n    uint32_t aspnet_requests_queued;\n    uint32_t aspnet_requests;\n    uint32_t gc_collections0;\n    uint32_t gc_collections1;\n    uint32_t gc_collections2;\n    uint32_t gc_promotions0;\n    uint32_t gc_promotions1;\n    uint32_t gc_promotion_finalizers;\n    uint32_t gc_gen0size;\n    uint32_t gc_gen1size;\n    uint32_t gc_gen2size;\n    uint32_t gc_lossize;\n    uint32_t gc_fin_survivors;\n    uint32_t gc_num_handles;\n    uint32_t gc_allocated;\n    uint32_t gc_induced;\n    uint32_t gc_time;\n    uint32_t gc_total_bytes;\n    uint32_t gc_committed_bytes;\n    uint32_t gc_reserved_bytes;\n    uint32_t gc_num_pinned;\n    uint32_t gc_sync_blocks;\n    uint32_t remoting_calls;\n    uint32_t remoting_channels;\n    uint32_t remoting_proxies;\n    uint32_t remoting_classes;\n    uint32_t remoting_objects;\n    uint32_t remoting_contexts;\n    uint32_t loader_classes;\n    uint32_t loader_total_classes;\n    uint32_t loader_appdomains;\n    uint32_t loader_total_appdomains;\n    uint32_t loader_assemblies;\n    uint32_t loader_total_assemblies;\n    uint32_t loader_failures;\n    uint32_t loader_bytes;\n    uint32_t loader_appdomains_uloaded;\n    uint32_t thread_contentions;\n    uint32_t thread_queue_len;\n    uint32_t thread_queue_max;\n    uint32_t thread_num_logical;\n    uint32_t thread_num_physical;\n    uint32_t thread_cur_recognized;\n    uint32_t thread_num_recognized;\n    uint32_t interop_num_ccw;\n    uint32_t interop_num_stubs;\n    uint32_t interop_num_marshals;\n    uint32_t security_num_checks;\n    uint32_t security_num_link_checks;\n    uint32_t security_time;\n    uint32_t security_depth;\n    uint32_t unused;\n    uint64_t threadpool_workitems;\n    uint64_t threadpool_ioworkitems;\n    unsigned int threadpool_threads;\n    unsigned int threadpool_iothreads;\n} Il2CppPerfCounters;\ntypedef struct Il2CppClass Il2CppClass;\ntypedef struct MethodInfo MethodInfo;\ntypedef struct PropertyInfo PropertyInfo;\ntypedef struct FieldInfo FieldInfo;\ntypedef struct EventInfo EventInfo;\ntypedef struct Il2CppType Il2CppType;\ntypedef struct Il2CppAssembly Il2CppAssembly;\ntypedef struct Il2CppException Il2CppException;\ntypedef struct Il2CppImage Il2CppImage;\ntypedef struct Il2CppDomain Il2CppDomain;\ntypedef struct Il2CppString Il2CppString;\ntypedef struct Il2CppReflectionMethod Il2CppReflectionMethod;\ntypedef struct Il2CppAsyncCall Il2CppAsyncCall;\ntypedef struct Il2CppIUnknown Il2CppIUnknown;\ntypedef struct Il2CppWaitHandle Il2CppWaitHandle;\ntypedef struct MonitorData MonitorData;\ntypedef struct Il2CppReflectionAssembly Il2CppReflectionAssembly;\ntypedef Il2CppClass Il2CppVTable;\ntypedef struct Il2CppObject\n{\n    union\n    {\n        Il2CppClass* klass;\n        Il2CppVTable* vtable;\n    };\n    MonitorData* monitor;\n} Il2CppObject;\ntypedef int32_t il2cpp_array_lower_bound_t;\ntypedef struct Il2CppArrayBounds\n{\n    il2cpp_array_size_t length;\n    il2cpp_array_lower_bound_t lower_bound;\n} Il2CppArrayBounds;\ntypedef struct Il2CppArray\n{\n    Il2CppObject obj;\n    Il2CppArrayBounds* bounds;\n    il2cpp_array_size_t max_length;\n} Il2CppArray;\ntypedef struct Il2CppArraySize\n{\n    Il2CppObject obj;\n    Il2CppArrayBounds* bounds;\n    il2cpp_array_size_t max_length;\n    //__attribute__((aligned(8))) void* vector;\n} Il2CppArraySize;\ntypedef struct Il2CppString\n{\n    Il2CppObject object;\n    int32_t length;\n    Il2CppChar chars[32];\n} Il2CppString;\ntypedef struct Il2CppReflectionType\n{\n    Il2CppObject object;\n    const Il2CppType* type;\n} Il2CppReflectionType;\ntypedef struct Il2CppReflectionRuntimeType\n{\n    Il2CppReflectionType type;\n    Il2CppObject* type_info;\n    Il2CppObject* genericCache;\n    Il2CppObject* serializationCtor;\n} Il2CppReflectionRuntimeType;\ntypedef struct Il2CppReflectionMonoType\n{\n    Il2CppReflectionRuntimeType type;\n} Il2CppReflectionMonoType;\ntypedef struct Il2CppReflectionEvent\n{\n    Il2CppObject object;\n    Il2CppObject* cached_add_event;\n} Il2CppReflectionEvent;\ntypedef struct Il2CppReflectionMonoEvent\n{\n    Il2CppReflectionEvent event;\n    Il2CppReflectionType* reflectedType;\n    const EventInfo* eventInfo;\n} Il2CppReflectionMonoEvent;\ntypedef struct Il2CppReflectionMonoEventInfo\n{\n    Il2CppReflectionType* declaringType;\n    Il2CppReflectionType* reflectedType;\n    Il2CppString* name;\n    Il2CppReflectionMethod* addMethod;\n    Il2CppReflectionMethod* removeMethod;\n    Il2CppReflectionMethod* raiseMethod;\n    uint32_t eventAttributes;\n    Il2CppArray* otherMethods;\n} Il2CppReflectionMonoEventInfo;\ntypedef struct Il2CppReflectionField\n{\n    Il2CppObject object;\n    Il2CppClass* klass;\n    FieldInfo* field;\n    Il2CppString* name;\n    Il2CppReflectionType* type;\n    uint32_t attrs;\n} Il2CppReflectionField;\ntypedef struct Il2CppReflectionProperty\n{\n    Il2CppObject object;\n    Il2CppClass* klass;\n    const PropertyInfo* property;\n} Il2CppReflectionProperty;\ntypedef struct Il2CppReflectionMethod\n{\n    Il2CppObject object;\n    const MethodInfo* method;\n    Il2CppString* name;\n    Il2CppReflectionType* reftype;\n} Il2CppReflectionMethod;\ntypedef struct Il2CppReflectionGenericMethod\n{\n    Il2CppReflectionMethod base;\n} Il2CppReflectionGenericMethod;\ntypedef struct Il2CppMethodInfo\n{\n    Il2CppReflectionType* parent;\n    Il2CppReflectionType* ret;\n    uint32_t attrs;\n    uint32_t implattrs;\n    uint32_t callconv;\n} Il2CppMethodInfo;\ntypedef struct Il2CppPropertyInfo\n{\n    Il2CppReflectionType* parent;\n    Il2CppReflectionType* declaringType;\n    Il2CppString* name;\n    Il2CppReflectionMethod* get;\n    Il2CppReflectionMethod* set;\n    uint32_t attrs;\n} Il2CppPropertyInfo;\ntypedef struct Il2CppReflectionParameter\n{\n    Il2CppObject object;\n    Il2CppReflectionType* ClassImpl;\n    Il2CppObject* DefaultValueImpl;\n    Il2CppObject* MemberImpl;\n    Il2CppString* NameImpl;\n    int32_t PositionImpl;\n    uint32_t AttrsImpl;\n    Il2CppObject* MarshalAsImpl;\n} Il2CppReflectionParameter;\ntypedef struct Il2CppReflectionModule\n{\n    Il2CppObject obj;\n    const Il2CppImage* image;\n    Il2CppReflectionAssembly* assembly;\n    Il2CppString* fqname;\n    Il2CppString* name;\n    Il2CppString* scopename;\n    uint8_t is_resource;\n    uint32_t token;\n} Il2CppReflectionModule;\ntypedef struct Il2CppReflectionAssemblyName\n{\n    Il2CppObject obj;\n    Il2CppString* name;\n    Il2CppString* codebase;\n    int32_t major, minor, build, revision;\n    Il2CppObject* cultureInfo;\n    uint32_t flags;\n    uint32_t hashalg;\n    Il2CppObject* keypair;\n    Il2CppArray* publicKey;\n    Il2CppArray* keyToken;\n    uint32_t versioncompat;\n    Il2CppObject* version;\n    uint32_t processor_architecture;\n    uint32_t contentType;\n} Il2CppReflectionAssemblyName;\ntypedef struct Il2CppReflectionAssembly\n{\n    Il2CppObject object;\n    const Il2CppAssembly* assembly;\n    Il2CppObject* resolve_event_holder;\n    Il2CppObject* evidence;\n    Il2CppObject* minimum;\n    Il2CppObject* optional;\n    Il2CppObject* refuse;\n    Il2CppObject* granted;\n    Il2CppObject* denied;\n    uint8_t from_byte_array;\n    Il2CppString* name;\n} Il2CppReflectionAssembly;\ntypedef struct Il2CppReflectionMarshal\n{\n    Il2CppObject object;\n    int32_t count;\n    int32_t type;\n    int32_t eltype;\n    Il2CppString* guid;\n    Il2CppString* mcookie;\n    Il2CppString* marshaltype;\n    Il2CppObject* marshaltyperef;\n    int32_t param_num;\n    uint8_t has_size;\n} Il2CppReflectionMarshal;\ntypedef struct Il2CppReflectionPointer\n{\n    Il2CppObject object;\n    void* data;\n    Il2CppReflectionType* type;\n} Il2CppReflectionPointer;\ntypedef struct Il2CppInternalThread\n{\n    Il2CppObject obj;\n    int lock_thread_id;\n    void* handle;\n    void* native_handle;\n    Il2CppArray* cached_culture_info;\n    Il2CppChar* name;\n    int name_len;\n    uint32_t state;\n    Il2CppObject* abort_exc;\n    int abort_state_handle;\n    uint64_t tid;\n    intptr_t debugger_thread;\n    void** static_data;\n    void* runtime_thread_info;\n    Il2CppObject* current_appcontext;\n    Il2CppObject* root_domain_thread;\n    Il2CppArray* _serialized_principal;\n    int _serialized_principal_version;\n    void* appdomain_refs;\n    int32_t interruption_requested;\n    void* synch_cs;\n    uint8_t threadpool_thread;\n    uint8_t thread_interrupt_requested;\n    int stack_size;\n    uint8_t apartment_state;\n    int critical_region_level;\n    int managed_id;\n    uint32_t small_id;\n    void* manage_callback;\n    void* interrupt_on_stop;\n    intptr_t flags;\n    void* thread_pinning_ref;\n    void* abort_protected_block_count;\n    int32_t priority;\n    void* owned_mutexes;\n    void* suspended;\n    int32_t self_suspended;\n    size_t thread_state;\n    size_t unused2;\n    void* last;\n} Il2CppInternalThread;\ntypedef struct Il2CppIOSelectorJob\n{\n    Il2CppObject object;\n    int32_t operation;\n    Il2CppObject* callback;\n    Il2CppObject* state;\n} Il2CppIOSelectorJob;\ntypedef enum\n{\n    Il2Cpp_CallType_Sync = 0,\n    Il2Cpp_CallType_BeginInvoke = 1,\n    Il2Cpp_CallType_EndInvoke = 2,\n    Il2Cpp_CallType_OneWay = 3\n} Il2CppCallType;\ntypedef struct Il2CppMethodMessage\n{\n    Il2CppObject obj;\n    Il2CppReflectionMethod* method;\n    Il2CppArray* args;\n    Il2CppArray* names;\n    Il2CppArray* arg_types;\n    Il2CppObject* ctx;\n    Il2CppObject* rval;\n    Il2CppObject* exc;\n    Il2CppAsyncResult* async_result;\n    uint32_t call_type;\n} Il2CppMethodMessage;\ntypedef struct Il2CppAppDomainSetup\n{\n    Il2CppObject object;\n    Il2CppString* application_base;\n    Il2CppString* application_name;\n    Il2CppString* cache_path;\n    Il2CppString* configuration_file;\n    Il2CppString* dynamic_base;\n    Il2CppString* license_file;\n    Il2CppString* private_bin_path;\n    Il2CppString* private_bin_path_probe;\n    Il2CppString* shadow_copy_directories;\n    Il2CppString* shadow_copy_files;\n    uint8_t publisher_policy;\n    uint8_t path_changed;\n    int loader_optimization;\n    uint8_t disallow_binding_redirects;\n    uint8_t disallow_code_downloads;\n    Il2CppObject* activation_arguments;\n    Il2CppObject* domain_initializer;\n    Il2CppObject* application_trust;\n    Il2CppArray* domain_initializer_args;\n    uint8_t disallow_appbase_probe;\n    Il2CppArray* configuration_bytes;\n    Il2CppArray* serialized_non_primitives;\n} Il2CppAppDomainSetup;\ntypedef struct Il2CppThread\n{\n    Il2CppObject obj;\n    Il2CppInternalThread* internal_thread;\n    Il2CppObject* start_obj;\n    Il2CppException* pending_exception;\n    Il2CppObject* principal;\n    int32_t principal_version;\n    Il2CppDelegate* delegate;\n    Il2CppObject* executionContext;\n    uint8_t executionContextBelongsToOuterScope;\n} Il2CppThread;\ntypedef struct Il2CppException\n{\n    Il2CppObject object;\n    Il2CppString* className;\n    Il2CppString* message;\n    Il2CppObject* _data;\n    struct Il2CppException* inner_ex;\n    Il2CppString* _helpURL;\n    Il2CppArray* trace_ips;\n    Il2CppString* stack_trace;\n    Il2CppString* remote_stack_trace;\n    int remote_stack_index;\n    Il2CppObject* _dynamicMethods;\n    il2cpp_hresult_t hresult;\n    Il2CppString* source;\n    Il2CppObject* safeSerializationManager;\n    Il2CppArray* captured_traces;\n    Il2CppArray* native_trace_ips;\n} Il2CppException;\ntypedef struct Il2CppSystemException\n{\n    Il2CppException base;\n} Il2CppSystemException;\ntypedef struct Il2CppArgumentException\n{\n    Il2CppException base;\n    Il2CppString* argName;\n} Il2CppArgumentException;\ntypedef struct Il2CppTypedRef\n{\n    const Il2CppType* type;\n    void* value;\n    Il2CppClass* klass;\n} Il2CppTypedRef;\ntypedef struct Il2CppDelegate\n{\n    Il2CppObject object;\n    Il2CppMethodPointer method_ptr;\n    InvokerMethod invoke_impl;\n    Il2CppObject* target;\n    const MethodInfo* method;\n    void* delegate_trampoline;\n    intptr_t extraArg;\n    uint8_t** method_code;\n    Il2CppReflectionMethod* method_info;\n    Il2CppReflectionMethod* original_method_info;\n    Il2CppObject* data;\n    uint8_t method_is_virtual;\n} Il2CppDelegate;\ntypedef struct Il2CppMulticastDelegate\n{\n    Il2CppDelegate delegate;\n    Il2CppArray* delegates;\n} Il2CppMulticastDelegate;\ntypedef struct Il2CppMarshalByRefObject\n{\n    Il2CppObject obj;\n    Il2CppObject* identity;\n} Il2CppMarshalByRefObject;\ntypedef struct Il2CppAppDomain\n{\n    Il2CppMarshalByRefObject mbr;\n    Il2CppDomain* data;\n} Il2CppAppDomain;\ntypedef struct Il2CppStackFrame\n{\n    Il2CppObject obj;\n    int32_t il_offset;\n    int32_t native_offset;\n    uint64_t methodAddress;\n    uint32_t methodIndex;\n    Il2CppReflectionMethod* method;\n    Il2CppString* filename;\n    int32_t line;\n    int32_t column;\n    Il2CppString* internal_method_name;\n} Il2CppStackFrame;\ntypedef struct Il2CppDateTimeFormatInfo\n{\n    Il2CppObject obj;\n    Il2CppObject* CultureData;\n    Il2CppString* Name;\n    Il2CppString* LangName;\n    Il2CppObject* CompareInfo;\n    Il2CppObject* CultureInfo;\n    Il2CppString* AMDesignator;\n    Il2CppString* PMDesignator;\n    Il2CppString* DateSeparator;\n    Il2CppString* GeneralShortTimePattern;\n    Il2CppString* GeneralLongTimePattern;\n    Il2CppString* TimeSeparator;\n    Il2CppString* MonthDayPattern;\n    Il2CppString* DateTimeOffsetPattern;\n    Il2CppObject* Calendar;\n    uint32_t FirstDayOfWeek;\n    uint32_t CalendarWeekRule;\n    Il2CppString* FullDateTimePattern;\n    Il2CppArray* AbbreviatedDayNames;\n    Il2CppArray* ShortDayNames;\n    Il2CppArray* DayNames;\n    Il2CppArray* AbbreviatedMonthNames;\n    Il2CppArray* MonthNames;\n    Il2CppArray* GenitiveMonthNames;\n    Il2CppArray* GenitiveAbbreviatedMonthNames;\n    Il2CppArray* LeapYearMonthNames;\n    Il2CppString* LongDatePattern;\n    Il2CppString* ShortDatePattern;\n    Il2CppString* YearMonthPattern;\n    Il2CppString* LongTimePattern;\n    Il2CppString* ShortTimePattern;\n    Il2CppArray* YearMonthPatterns;\n    Il2CppArray* ShortDatePatterns;\n    Il2CppArray* LongDatePatterns;\n    Il2CppArray* ShortTimePatterns;\n    Il2CppArray* LongTimePatterns;\n    Il2CppArray* EraNames;\n    Il2CppArray* AbbrevEraNames;\n    Il2CppArray* AbbrevEnglishEraNames;\n    Il2CppArray* OptionalCalendars;\n    uint8_t readOnly;\n    int32_t FormatFlags;\n    int32_t CultureID;\n    uint8_t UseUserOverride;\n    uint8_t UseCalendarInfo;\n    int32_t DataItem;\n    uint8_t IsDefaultCalendar;\n    Il2CppArray* DateWords;\n    Il2CppString* FullTimeSpanPositivePattern;\n    Il2CppString* FullTimeSpanNegativePattern;\n    Il2CppArray* dtfiTokenHash;\n} Il2CppDateTimeFormatInfo;\ntypedef struct Il2CppNumberFormatInfo\n{\n    Il2CppObject obj;\n    Il2CppArray* numberGroupSizes;\n    Il2CppArray* currencyGroupSizes;\n    Il2CppArray* percentGroupSizes;\n    Il2CppString* positiveSign;\n    Il2CppString* negativeSign;\n    Il2CppString* numberDecimalSeparator;\n    Il2CppString* numberGroupSeparator;\n    Il2CppString* currencyGroupSeparator;\n    Il2CppString* currencyDecimalSeparator;\n    Il2CppString* currencySymbol;\n    Il2CppString* ansiCurrencySymbol;\n    Il2CppString* naNSymbol;\n    Il2CppString* positiveInfinitySymbol;\n    Il2CppString* negativeInfinitySymbol;\n    Il2CppString* percentDecimalSeparator;\n    Il2CppString* percentGroupSeparator;\n    Il2CppString* percentSymbol;\n    Il2CppString* perMilleSymbol;\n    Il2CppArray* nativeDigits;\n    int dataItem;\n    int numberDecimalDigits;\n    int currencyDecimalDigits;\n    int currencyPositivePattern;\n    int currencyNegativePattern;\n    int numberNegativePattern;\n    int percentPositivePattern;\n    int percentNegativePattern;\n    int percentDecimalDigits;\n    int digitSubstitution;\n    uint8_t readOnly;\n    uint8_t useUserOverride;\n    uint8_t isInvariant;\n    uint8_t validForParseAsNumber;\n    uint8_t validForParseAsCurrency;\n} Il2CppNumberFormatInfo;\ntypedef struct Il2CppCultureData\n{\n    Il2CppObject obj;\n    Il2CppString* AMDesignator;\n    Il2CppString* PMDesignator;\n    Il2CppString* TimeSeparator;\n    Il2CppArray* LongTimePatterns;\n    Il2CppArray* ShortTimePatterns;\n    uint32_t FirstDayOfWeek;\n    uint32_t CalendarWeekRule;\n} Il2CppCultureData;\ntypedef struct Il2CppCalendarData\n{\n    Il2CppObject obj;\n    Il2CppString* NativeName;\n    Il2CppArray* ShortDatePatterns;\n    Il2CppArray* YearMonthPatterns;\n    Il2CppArray* LongDatePatterns;\n    Il2CppString* MonthDayPattern;\n    Il2CppArray* EraNames;\n    Il2CppArray* AbbreviatedEraNames;\n    Il2CppArray* AbbreviatedEnglishEraNames;\n    Il2CppArray* DayNames;\n    Il2CppArray* AbbreviatedDayNames;\n    Il2CppArray* SuperShortDayNames;\n    Il2CppArray* MonthNames;\n    Il2CppArray* AbbreviatedMonthNames;\n    Il2CppArray* GenitiveMonthNames;\n    Il2CppArray* GenitiveAbbreviatedMonthNames;\n} Il2CppCalendarData;\ntypedef struct Il2CppCultureInfo\n{\n    Il2CppObject obj;\n    uint8_t is_read_only;\n    int32_t lcid;\n    int32_t parent_lcid;\n    int32_t datetime_index;\n    int32_t number_index;\n    int32_t default_calendar_type;\n    uint8_t use_user_override;\n    Il2CppNumberFormatInfo* number_format;\n    Il2CppDateTimeFormatInfo* datetime_format;\n    Il2CppObject* textinfo;\n    Il2CppString* name;\n    Il2CppString* englishname;\n    Il2CppString* nativename;\n    Il2CppString* iso3lang;\n    Il2CppString* iso2lang;\n    Il2CppString* win3lang;\n    Il2CppString* territory;\n    Il2CppArray* native_calendar_names;\n    Il2CppString* compareinfo;\n    const void* text_info_data;\n    int dataItem;\n    Il2CppObject* calendar;\n    Il2CppObject* parent_culture;\n    uint8_t constructed;\n    Il2CppArray* cached_serialized_form;\n    Il2CppObject* cultureData;\n    uint8_t isInherited;\n} Il2CppCultureInfo;\ntypedef struct Il2CppRegionInfo\n{\n    Il2CppObject obj;\n    int32_t geo_id;\n    Il2CppString* iso2name;\n    Il2CppString* iso3name;\n    Il2CppString* win3name;\n    Il2CppString* english_name;\n    Il2CppString* native_name;\n    Il2CppString* currency_symbol;\n    Il2CppString* iso_currency_symbol;\n    Il2CppString* currency_english_name;\n    Il2CppString* currency_native_name;\n} Il2CppRegionInfo;\ntypedef struct Il2CppSafeHandle\n{\n    Il2CppObject base;\n    void* handle;\n    int state;\n    uint8_t owns_handle;\n    uint8_t fullyInitialized;\n} Il2CppSafeHandle;\ntypedef struct Il2CppStringBuilder Il2CppStringBuilder;\ntypedef struct Il2CppStringBuilder\n{\n    Il2CppObject object;\n    Il2CppArray* chunkChars;\n    struct Il2CppStringBuilder* chunkPrevious;\n    int chunkLength;\n    int chunkOffset;\n    int maxCapacity;\n} Il2CppStringBuilder;\ntypedef struct Il2CppSocketAddress\n{\n    Il2CppObject base;\n    int m_Size;\n    Il2CppArray* data;\n    uint8_t m_changed;\n    int m_hash;\n} Il2CppSocketAddress;\ntypedef struct Il2CppSortKey\n{\n    Il2CppObject base;\n    Il2CppString* str;\n    Il2CppArray* key;\n    int32_t options;\n    int32_t lcid;\n} Il2CppSortKey;\ntypedef struct Il2CppErrorWrapper\n{\n    Il2CppObject base;\n    int32_t errorCode;\n} Il2CppErrorWrapper;\ntypedef struct Il2CppAsyncResult\n{\n    Il2CppObject base;\n    Il2CppObject* async_state;\n    Il2CppWaitHandle* handle;\n    Il2CppDelegate* async_delegate;\n    void* data;\n    Il2CppAsyncCall* object_data;\n    uint8_t sync_completed;\n    uint8_t completed;\n    uint8_t endinvoke_called;\n    Il2CppObject* async_callback;\n    Il2CppObject* execution_context;\n    Il2CppObject* original_context;\n} Il2CppAsyncResult;\ntypedef struct Il2CppAsyncCall\n{\n    Il2CppObject base;\n    Il2CppMethodMessage* msg;\n    MethodInfo* cb_method;\n    Il2CppDelegate* cb_target;\n    Il2CppObject* state;\n    Il2CppObject* res;\n    Il2CppArray* out_args;\n} Il2CppAsyncCall;\ntypedef struct Il2CppExceptionWrapper Il2CppExceptionWrapper;\ntypedef struct Il2CppExceptionWrapper\n{\n    Il2CppException* ex;\n} Il2CppExceptionWrapper;\ntypedef struct Il2CppIOAsyncResult\n{\n    Il2CppObject base;\n    Il2CppDelegate* callback;\n    Il2CppObject* state;\n    Il2CppWaitHandle* wait_handle;\n    uint8_t completed_synchronously;\n    uint8_t completed;\n} Il2CppIOAsyncResult;\ntypedef struct Il2CppSocketAsyncResult\n{\n    Il2CppIOAsyncResult base;\n    Il2CppObject* socket;\n    int32_t operation;\n    Il2CppException* delayedException;\n    Il2CppObject* endPoint;\n    Il2CppArray* buffer;\n    int32_t offset;\n    int32_t size;\n    int32_t socket_flags;\n    Il2CppObject* acceptSocket;\n    Il2CppArray* addresses;\n    int32_t port;\n    Il2CppObject* buffers;\n    uint8_t reuseSocket;\n    int32_t currentAddress;\n    Il2CppObject* acceptedSocket;\n    int32_t total;\n    int32_t error;\n    int32_t endCalled;\n} Il2CppSocketAsyncResult;\ntypedef enum Il2CppResourceLocation\n{\n    IL2CPP_RESOURCE_LOCATION_EMBEDDED = 1,\n    IL2CPP_RESOURCE_LOCATION_ANOTHER_ASSEMBLY = 2,\n    IL2CPP_RESOURCE_LOCATION_IN_MANIFEST = 4\n} Il2CppResourceLocation;\ntypedef struct Il2CppManifestResourceInfo\n{\n    Il2CppObject object;\n    Il2CppReflectionAssembly* assembly;\n    Il2CppString* filename;\n    uint32_t location;\n} Il2CppManifestResourceInfo;\ntypedef struct Il2CppAppContext\n{\n    Il2CppObject obj;\n    int32_t domain_id;\n    int32_t context_id;\n    void* static_data;\n} Il2CppAppContext;\ntypedef struct Il2CppDecimal\n{\n    uint16_t reserved;\n    union\n    {\n        struct\n        {\n            uint8_t scale;\n            uint8_t sign;\n        } u;\n        uint16_t signscale;\n    } u;\n    uint32_t Hi32;\n    union\n    {\n        struct\n        {\n            uint32_t Lo32;\n            uint32_t Mid32;\n        } v;\n        uint64_t Lo64;\n    } v;\n} Il2CppDecimal;\ntypedef struct Il2CppDouble\n{\n    uint32_t mantLo : 32;\n    uint32_t mantHi : 20;\n    uint32_t exp : 11;\n    uint32_t sign : 1;\n} Il2CppDouble;\ntypedef union Il2CppDouble_double\n{\n    Il2CppDouble s;\n    double d;\n} Il2CppDouble_double;\ntypedef enum Il2CppDecimalCompareResult\n{\n    IL2CPP_DECIMAL_CMP_LT = -1,\n    IL2CPP_DECIMAL_CMP_EQ,\n    IL2CPP_DECIMAL_CMP_GT\n} Il2CppDecimalCompareResult;\ntypedef struct Il2CppSingle\n{\n    uint32_t mant : 23;\n    uint32_t exp : 8;\n    uint32_t sign : 1;\n} Il2CppSingle;\ntypedef union Il2CppSingle_float\n{\n    Il2CppSingle s;\n    float f;\n} Il2CppSingle_float;"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/memory.h",
    "content": "#pragma once\n#include <Windows.h>\n#include <vector>\n\nclass MEMORY\n{\npublic:\n    // Find a DLL module base address\n    void *find_module(const char *name)\n    {\n        return (void *)GetModuleHandleA(name);\n    }\n\n    // Find a function address (exported or internal)\n    template <typename T>\n    T find_function(void *module, const char *name)\n    {\n        return (T)GetProcAddress((HMODULE)module, name);\n    }\n\n    // Simple pattern scan helper (Optional, but often used in these cheats)\n    uintptr_t find_pattern(const char *module_name, const char *pattern)\n    {\n        // Implementation omitted for brevity as your current code\n        // seems to rely on GetProcAddress/IL2CPP API mostly.\n        // If you need pattern scanning later, standard sigscan code goes here.\n        return 0;\n    }\n};"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/unity.cpp",
    "content": "#include \"unity.h\"\n\nnamespace Unity {\n\n\tunity_GameObject_FindGameObjectsWithTag_t GameObject_FindGameObjectsWithTag;\n\tunity_GameObject_GetTransform_t GameObject_GetTransform;\n\tunity_Transform_GetPositionInjected_t Transform_GetPositionInjected;\n\tunity_Gamera_GetMain_t Gamera_GetMain;\n\tunity_Component_GetGameObject_t Component_GetGameObject;\n\tunity_Screen_GetWidth_t Screen_GetWidth;\n\tunity_Screen_GetHeight_t Screen_GetHeight;\n\n\tbool Initialize(MEMORY memory) {\n\t\t\n\t\t//GameObject_FindGameObjectsWithTag = find_function<unity_GameObject_FindGameObjectsWithTag_t>(\"UnityEngine.GameObject::FindGameObjectsWithTag(System.String)\");\n\t\tGameObject_FindGameObjectsWithTag = find_function<unity_GameObject_FindGameObjectsWithTag_t>(\"UnityEngine.GameObject::Find(System.String)\");\n\t\tGameObject_GetTransform = find_function<unity_GameObject_GetTransform_t>(\"UnityEngine.GameObject::get_transform(System.IntPtr)\");\n\t\tTransform_GetPositionInjected = find_function<unity_Transform_GetPositionInjected_t>(\"UnityEngine.Transform::get_position_Injected(UnityEngine.Vector3&)\");\n\t\tGamera_GetMain = find_function<unity_Gamera_GetMain_t>(\"UnityEngine.Camera::get_main()\");\n\t\tComponent_GetGameObject = find_function<unity_Component_GetGameObject_t>(\"UnityEngine.Component::get_gameObject()\");\n\t\tScreen_GetWidth = find_function<unity_Screen_GetWidth_t>(\"UnityEngine.Screen::get_width()\");\n\t\tScreen_GetHeight = find_function<unity_Screen_GetHeight_t>(\"UnityEngine.Screen::get_height()\");\n\n\t\treturn true;\n\t}\n};"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/unity.h",
    "content": "#pragma once\n\n#include \"memory.h\"\n#include \"il2cpp.h\"\n\n\n// Unity Types\nstruct vec3;\nstruct Rect;\nstruct GUIContent;\nstruct GUIStyle;\n\n// Unity API\ntypedef void** (__cdecl* unity_GameObject_FindGameObjectsWithTag_t)(Il2CppString*);\ntypedef  void* (__cdecl* unity_GameObject_GetTransform_t)(void*);\ntypedef  void* (__cdecl* unity_Transform_GetPositionInjected_t)(vec3&);\ntypedef  void* (__cdecl* unity_Gamera_GetMain_t)();\ntypedef  void* (__cdecl* unity_Component_GetGameObject_t)(const char*);\ntypedef    int (__cdecl* unity_Screen_GetWidth_t)();\ntypedef    int (__cdecl* unity_Screen_GetHeight_t)();\n\nnamespace Unity\n{\n\ttemplate <class T>\n\tT find_function(const char* function_name) {\n\t\treturn (T)IL2CPP::API::il2cpp_resolve_icall(function_name);\n\t}\n\n\tbool Initialize(MEMORY memory);\n\n\textern unity_GameObject_FindGameObjectsWithTag_t GameObject_FindGameObjectsWithTag;\n\textern unity_GameObject_GetTransform_t GameObject_GetTransform;\n\textern unity_Transform_GetPositionInjected_t Transform_GetPositionInjected;\n\textern unity_Gamera_GetMain_t Gamera_GetMain;\n\textern unity_Component_GetGameObject_t Component_GetGameObject;\n\textern unity_Screen_GetWidth_t Screen_GetWidth;\n\textern unity_Screen_GetHeight_t Screen_GetHeight;\n};\n\n"
  },
  {
    "path": "Game Trainers/common/include/il2cpp/vec.h",
    "content": "#pragma once\n\n#define _USE_MATH_DEFINES\n#include <math.h>\n#include <iostream>\n\nstruct Vector2 {\n\tfloat x; float y;\n\n\tVector2(float x_, float y_) {\n\t\tx = x_;\n\t\ty = y_;\n\t}\n};\n\nstruct Vector3\n{\npublic:\n\tVector3() {};\n\tVector3(float _x, float _y, float _z) {\n\t\tx = _x;\n\t\ty = _y;\n\t\tz = _z;\n\t};\n\n\tfloat Length() {\n\t\treturn sqrt(x * x + y * y + z * z);\n\t}\n\n\tfloat Length2D() {\n\t\treturn sqrt(x * x + y * y);\n\t}\n\n\tVector2 DeltaAngle(Vector3 target) {\n\t\tfloat dx = target.x - x;\n\t\tfloat dy = target.z - z;\n\t\tfloat yaw = -atan2(dy, dx) * 180 / M_PI + 90;\n\n\t\tfloat distance = sqrt(dx * dx + dy * dy);\n\t\tfloat dz = target.y - y;\n\t\tfloat pitch = -atan2(dz, distance) * 180 / M_PI;\n\n\t\treturn Vector2(pitch, yaw);\n\t}\n\n\tVector3 operator+(Vector3 b) { return Vector3(x + b.x, y + b.y, z + b.z); }\n\tVector3 operator-(Vector3 b) { return Vector3(x - b.x, y - b.y, z - b.z); }\n\tVector3 operator-() { return Vector3(-x, -y, -z); }\n\tVector3 operator*(float d) { return Vector3(x * d, y * d, z * d); }\n\tVector3 operator/(float d) { return Vector3(x / d, y / d, z / d); }\n\n\tfriend std::ostream& operator<<(std::ostream& os, const Vector3& v) {\n\t\treturn os << \"Vector3(\" << v.x << \", \" << v.y << \", \" << v.z << \")\";\n\t}\n\n\tfloat x, y, z;\n};"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/adl_serializer.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <utility>\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/conversions/from_json.hpp>\n#include <nlohmann/detail/conversions/to_json.hpp>\n#include <nlohmann/detail/meta/identity_tag.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/// @sa https://json.nlohmann.me/api/adl_serializer/\ntemplate<typename ValueType, typename>\nstruct adl_serializer\n{\n    /// @brief convert a JSON value to any value type\n    /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/\n    template<typename BasicJsonType, typename TargetType = ValueType>\n    static auto from_json(BasicJsonType && j, TargetType& val) noexcept(\n        noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))\n    -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void())\n    {\n        ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);\n    }\n\n    /// @brief convert a JSON value to any value type\n    /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/\n    template<typename BasicJsonType, typename TargetType = ValueType>\n    static auto from_json(BasicJsonType && j) noexcept(\n    noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {})))\n    -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {}))\n    {\n        return ::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {});\n    }\n\n    /// @brief convert any value type to a JSON value\n    /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/\n    template<typename BasicJsonType, typename TargetType = ValueType>\n    static auto to_json(BasicJsonType& j, TargetType && val) noexcept(\n        noexcept(::nlohmann::to_json(j, std::forward<TargetType>(val))))\n    -> decltype(::nlohmann::to_json(j, std::forward<TargetType>(val)), void())\n    {\n        ::nlohmann::to_json(j, std::forward<TargetType>(val));\n    }\n};\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/byte_container_with_subtype.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstdint> // uint8_t, uint64_t\n#include <tuple> // tie\n#include <utility> // move\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/// @brief an internal type for a backed binary type\n/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/\ntemplate<typename BinaryType>\nclass byte_container_with_subtype : public BinaryType\n{\n  public:\n    using container_type = BinaryType;\n    using subtype_type = std::uint64_t;\n\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/\n    byte_container_with_subtype() noexcept(noexcept(container_type()))\n        : container_type()\n    {}\n\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/\n    byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))\n        : container_type(b)\n    {}\n\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/\n    byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))\n        : container_type(std::move(b))\n    {}\n\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/\n    byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b)))\n        : container_type(b)\n        , m_subtype(subtype_)\n        , m_has_subtype(true)\n    {}\n\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/\n    byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))\n        : container_type(std::move(b))\n        , m_subtype(subtype_)\n        , m_has_subtype(true)\n    {}\n\n    bool operator==(const byte_container_with_subtype& rhs) const\n    {\n        return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==\n               std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);\n    }\n\n    bool operator!=(const byte_container_with_subtype& rhs) const\n    {\n        return !(rhs == *this);\n    }\n\n    /// @brief sets the binary subtype\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/\n    void set_subtype(subtype_type subtype_) noexcept\n    {\n        m_subtype = subtype_;\n        m_has_subtype = true;\n    }\n\n    /// @brief return the binary subtype\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/\n    constexpr subtype_type subtype() const noexcept\n    {\n        return m_has_subtype ? m_subtype : static_cast<subtype_type>(-1);\n    }\n\n    /// @brief return whether the value has a subtype\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/\n    constexpr bool has_subtype() const noexcept\n    {\n        return m_has_subtype;\n    }\n\n    /// @brief clears the binary subtype\n    /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/\n    void clear_subtype() noexcept\n    {\n        m_subtype = 0;\n        m_has_subtype = false;\n    }\n\n  private:\n    subtype_type m_subtype = 0;\n    bool m_has_subtype = false;\n};\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/abi_macros.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n// This file contains all macro definitions affecting or depending on the ABI\n\n#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK\n    #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)\n        #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3\n            #warning \"Already included a different version of the library!\"\n        #endif\n    #endif\n#endif\n\n#define NLOHMANN_JSON_VERSION_MAJOR 3   // NOLINT(modernize-macro-to-enum)\n#define NLOHMANN_JSON_VERSION_MINOR 11  // NOLINT(modernize-macro-to-enum)\n#define NLOHMANN_JSON_VERSION_PATCH 3   // NOLINT(modernize-macro-to-enum)\n\n#ifndef JSON_DIAGNOSTICS\n    #define JSON_DIAGNOSTICS 0\n#endif\n\n#ifndef JSON_DIAGNOSTIC_POSITIONS\n    #define JSON_DIAGNOSTIC_POSITIONS 0\n#endif\n\n#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON\n    #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0\n#endif\n\n#if JSON_DIAGNOSTICS\n    #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag\n#else\n    #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS\n#endif\n\n#if JSON_DIAGNOSTIC_POSITIONS\n    #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp\n#else\n    #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS\n#endif\n\n#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON\n    #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp\n#else\n    #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON\n#endif\n\n#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION\n    #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0\n#endif\n\n// Construct the namespace ABI tags component\n#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c\n#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \\\n    NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c)\n\n#define NLOHMANN_JSON_ABI_TAGS                                       \\\n    NLOHMANN_JSON_ABI_TAGS_CONCAT(                                   \\\n            NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS,                       \\\n            NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \\\n            NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS)\n\n// Construct the namespace version component\n#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \\\n    _v ## major ## _ ## minor ## _ ## patch\n#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \\\n    NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch)\n\n#if NLOHMANN_JSON_NAMESPACE_NO_VERSION\n#define NLOHMANN_JSON_NAMESPACE_VERSION\n#else\n#define NLOHMANN_JSON_NAMESPACE_VERSION                                 \\\n    NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \\\n                                           NLOHMANN_JSON_VERSION_MINOR, \\\n                                           NLOHMANN_JSON_VERSION_PATCH)\n#endif\n\n// Combine namespace components\n#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b\n#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \\\n    NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b)\n\n#ifndef NLOHMANN_JSON_NAMESPACE\n#define NLOHMANN_JSON_NAMESPACE               \\\n    nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \\\n            NLOHMANN_JSON_ABI_TAGS,           \\\n            NLOHMANN_JSON_NAMESPACE_VERSION)\n#endif\n\n#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN\n#define NLOHMANN_JSON_NAMESPACE_BEGIN                \\\n    namespace nlohmann                               \\\n    {                                                \\\n    inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \\\n                NLOHMANN_JSON_ABI_TAGS,              \\\n                NLOHMANN_JSON_NAMESPACE_VERSION)     \\\n    {\n#endif\n\n#ifndef NLOHMANN_JSON_NAMESPACE_END\n#define NLOHMANN_JSON_NAMESPACE_END                                     \\\n    }  /* namespace (inline namespace) NOLINT(readability/namespace) */ \\\n    }  // namespace nlohmann\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/conversions/from_json.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <algorithm> // transform\n#include <array> // array\n#include <forward_list> // forward_list\n#include <iterator> // inserter, front_inserter, end\n#include <map> // map\n#ifdef JSON_HAS_CPP_17\n    #include <optional> // optional\n#endif\n#include <string> // string\n#include <tuple> // tuple, make_tuple\n#include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible\n#include <unordered_map> // unordered_map\n#include <utility> // pair, declval\n#include <valarray> // valarray\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/identity_tag.hpp>\n#include <nlohmann/detail/meta/std_fs.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename std::nullptr_t& n)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_null()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be null, but is \", j.type_name()), &j));\n    }\n    n = nullptr;\n}\n\n#ifdef JSON_HAS_CPP_17\n#ifndef JSON_USE_IMPLICIT_CONVERSIONS\ntemplate<typename BasicJsonType, typename T>\nvoid from_json(const BasicJsonType& j, std::optional<T>& opt)\n{\n    if (j.is_null())\n    {\n        opt = std::nullopt;\n    }\n    else\n    {\n        opt.emplace(j.template get<T>());\n    }\n}\n\n#endif // JSON_USE_IMPLICIT_CONVERSIONS\n#endif // JSON_HAS_CPP_17\n\n// overloads for basic_json template parameters\ntemplate < typename BasicJsonType, typename ArithmeticType,\n           enable_if_t < std::is_arithmetic<ArithmeticType>::value&&\n                         !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,\n                         int > = 0 >\nvoid get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)\n{\n    switch (static_cast<value_t>(j))\n    {\n        case value_t::number_unsigned:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());\n            break;\n        }\n        case value_t::number_integer:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());\n            break;\n        }\n        case value_t::number_float:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());\n            break;\n        }\n\n        case value_t::null:\n        case value_t::object:\n        case value_t::array:\n        case value_t::string:\n        case value_t::boolean:\n        case value_t::binary:\n        case value_t::discarded:\n        default:\n            JSON_THROW(type_error::create(302, concat(\"type must be number, but is \", j.type_name()), &j));\n    }\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_boolean()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be boolean, but is \", j.type_name()), &j));\n    }\n    b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be string, but is \", j.type_name()), &j));\n    }\n    s = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n\ntemplate <\n    typename BasicJsonType, typename StringType,\n    enable_if_t <\n        std::is_assignable<StringType&, const typename BasicJsonType::string_t>::value\n        && is_detected_exact<typename BasicJsonType::string_t::value_type, value_type_t, StringType>::value\n        && !std::is_same<typename BasicJsonType::string_t, StringType>::value\n        && !is_json_ref<StringType>::value, int > = 0 >\ninline void from_json(const BasicJsonType& j, StringType& s)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be string, but is \", j.type_name()), &j));\n    }\n\n    s = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val)\n{\n    get_arithmetic_value(j, val);\n}\n\n#if !JSON_DISABLE_ENUM_SERIALIZATION\ntemplate<typename BasicJsonType, typename EnumType,\n         enable_if_t<std::is_enum<EnumType>::value, int> = 0>\ninline void from_json(const BasicJsonType& j, EnumType& e)\n{\n    typename std::underlying_type<EnumType>::type val;\n    get_arithmetic_value(j, val);\n    e = static_cast<EnumType>(val);\n}\n#endif  // JSON_DISABLE_ENUM_SERIALIZATION\n\n// forward_list doesn't have an insert method\ntemplate<typename BasicJsonType, typename T, typename Allocator,\n         enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>\ninline void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n    l.clear();\n    std::transform(j.rbegin(), j.rend(),\n                   std::front_inserter(l), [](const BasicJsonType & i)\n    {\n        return i.template get<T>();\n    });\n}\n\n// valarray doesn't have an insert method\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>\ninline void from_json(const BasicJsonType& j, std::valarray<T>& l)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n    l.resize(j.size());\n    std::transform(j.begin(), j.end(), std::begin(l),\n                   [](const BasicJsonType & elem)\n    {\n        return elem.template get<T>();\n    });\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N>\nauto from_json(const BasicJsonType& j, T (&arr)[N])  // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i = 0; i < N; ++i)\n    {\n        arr[i] = j.at(i).template get<T>();\n    }\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2>\nauto from_json(const BasicJsonType& j, T (&arr)[N1][N2])  // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i1 = 0; i1 < N1; ++i1)\n    {\n        for (std::size_t i2 = 0; i2 < N2; ++i2)\n        {\n            arr[i1][i2] = j.at(i1).at(i2).template get<T>();\n        }\n    }\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3>\nauto from_json(const BasicJsonType& j, T (&arr)[N1][N2][N3])  // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i1 = 0; i1 < N1; ++i1)\n    {\n        for (std::size_t i2 = 0; i2 < N2; ++i2)\n        {\n            for (std::size_t i3 = 0; i3 < N3; ++i3)\n            {\n                arr[i1][i2][i3] = j.at(i1).at(i2).at(i3).template get<T>();\n            }\n        }\n    }\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3, std::size_t N4>\nauto from_json(const BasicJsonType& j, T (&arr)[N1][N2][N3][N4])  // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i1 = 0; i1 < N1; ++i1)\n    {\n        for (std::size_t i2 = 0; i2 < N2; ++i2)\n        {\n            for (std::size_t i3 = 0; i3 < N3; ++i3)\n            {\n                for (std::size_t i4 = 0; i4 < N4; ++i4)\n                {\n                    arr[i1][i2][i3][i4] = j.at(i1).at(i2).at(i3).at(i4).template get<T>();\n                }\n            }\n        }\n    }\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/)\n{\n    arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();\n}\n\ntemplate<typename BasicJsonType, typename T, std::size_t N>\nauto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr,\n                          priority_tag<2> /*unused*/)\n-> decltype(j.template get<T>(), void())\n{\n    for (std::size_t i = 0; i < N; ++i)\n    {\n        arr[i] = j.at(i).template get<T>();\n    }\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType,\n         enable_if_t<\n             std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,\n             int> = 0>\nauto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/)\n-> decltype(\n    arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),\n    j.template get<typename ConstructibleArrayType::value_type>(),\n    void())\n{\n    using std::end;\n\n    ConstructibleArrayType ret;\n    ret.reserve(j.size());\n    std::transform(j.begin(), j.end(),\n                   std::inserter(ret, end(ret)), [](const BasicJsonType & i)\n    {\n        // get<BasicJsonType>() returns *this, this won't call a from_json\n        // method when value_type is BasicJsonType\n        return i.template get<typename ConstructibleArrayType::value_type>();\n    });\n    arr = std::move(ret);\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType,\n         enable_if_t<\n             std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,\n             int> = 0>\ninline void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,\n                                 priority_tag<0> /*unused*/)\n{\n    using std::end;\n\n    ConstructibleArrayType ret;\n    std::transform(\n        j.begin(), j.end(), std::inserter(ret, end(ret)),\n        [](const BasicJsonType & i)\n    {\n        // get<BasicJsonType>() returns *this, this won't call a from_json\n        // method when value_type is BasicJsonType\n        return i.template get<typename ConstructibleArrayType::value_type>();\n    });\n    arr = std::move(ret);\n}\n\ntemplate < typename BasicJsonType, typename ConstructibleArrayType,\n           enable_if_t <\n               is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value&&\n               !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value&&\n               !is_basic_json<ConstructibleArrayType>::value,\n               int > = 0 >\nauto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)\n-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),\nj.template get<typename ConstructibleArrayType::value_type>(),\nvoid())\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n\n    from_json_array_impl(j, arr, priority_tag<3> {});\n}\n\ntemplate < typename BasicJsonType, typename T, std::size_t... Idx >\nstd::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJsonType&& j,\n                     identity_tag<std::array<T, sizeof...(Idx)>> /*unused*/, index_sequence<Idx...> /*unused*/)\n{\n    return { { std::forward<BasicJsonType>(j).at(Idx).template get<T>()... } };\n}\n\ntemplate < typename BasicJsonType, typename T, std::size_t N >\nauto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)\n-> decltype(from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {}))\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n\n    return from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {});\n}\n\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_binary()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be binary, but is \", j.type_name()), &j));\n    }\n\n    bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();\n}\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType,\n         enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>\ninline void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_object()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be object, but is \", j.type_name()), &j));\n    }\n\n    ConstructibleObjectType ret;\n    const auto* inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();\n    using value_type = typename ConstructibleObjectType::value_type;\n    std::transform(\n        inner_object->begin(), inner_object->end(),\n        std::inserter(ret, ret.begin()),\n        [](typename BasicJsonType::object_t::value_type const & p)\n    {\n        return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());\n    });\n    obj = std::move(ret);\n}\n\n// overload for arithmetic types, not chosen for basic_json template arguments\n// (BooleanType, etc..); note: Is it really necessary to provide explicit\n// overloads for boolean_t etc. in case of a custom BooleanType which is not\n// an arithmetic type?\ntemplate < typename BasicJsonType, typename ArithmeticType,\n           enable_if_t <\n               std::is_arithmetic<ArithmeticType>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value&&\n               !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,\n               int > = 0 >\ninline void from_json(const BasicJsonType& j, ArithmeticType& val)\n{\n    switch (static_cast<value_t>(j))\n    {\n        case value_t::number_unsigned:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());\n            break;\n        }\n        case value_t::number_integer:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());\n            break;\n        }\n        case value_t::number_float:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());\n            break;\n        }\n        case value_t::boolean:\n        {\n            val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());\n            break;\n        }\n\n        case value_t::null:\n        case value_t::object:\n        case value_t::array:\n        case value_t::string:\n        case value_t::binary:\n        case value_t::discarded:\n        default:\n            JSON_THROW(type_error::create(302, concat(\"type must be number, but is \", j.type_name()), &j));\n    }\n}\n\ntemplate<typename BasicJsonType, typename... Args, std::size_t... Idx>\nstd::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, index_sequence<Idx...> /*unused*/)\n{\n    return std::make_tuple(std::forward<BasicJsonType>(j).at(Idx).template get<Args>()...);\n}\n\ntemplate < typename BasicJsonType, class A1, class A2 >\nstd::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::pair<A1, A2>> /*unused*/, priority_tag<0> /*unused*/)\n{\n    return {std::forward<BasicJsonType>(j).at(0).template get<A1>(),\n            std::forward<BasicJsonType>(j).at(1).template get<A2>()};\n}\n\ntemplate<typename BasicJsonType, typename A1, typename A2>\ninline void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, priority_tag<1> /*unused*/)\n{\n    p = from_json_tuple_impl(std::forward<BasicJsonType>(j), identity_tag<std::pair<A1, A2>> {}, priority_tag<0> {});\n}\n\ntemplate<typename BasicJsonType, typename... Args>\nstd::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::tuple<Args...>> /*unused*/, priority_tag<2> /*unused*/)\n{\n    return from_json_tuple_impl_base<BasicJsonType, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {});\n}\n\ntemplate<typename BasicJsonType, typename... Args>\ninline void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t, priority_tag<3> /*unused*/)\n{\n    t = from_json_tuple_impl_base<BasicJsonType, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {});\n}\n\ntemplate<typename BasicJsonType, typename TupleRelated>\nauto from_json(BasicJsonType&& j, TupleRelated&& t)\n-> decltype(from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {}))\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n\n    return from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {});\n}\n\ntemplate < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator,\n           typename = enable_if_t < !std::is_constructible <\n                                        typename BasicJsonType::string_t, Key >::value >>\ninline void from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n    m.clear();\n    for (const auto& p : j)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!p.is_array()))\n        {\n            JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", p.type_name()), &j));\n        }\n        m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());\n    }\n}\n\ntemplate < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator,\n           typename = enable_if_t < !std::is_constructible <\n                                        typename BasicJsonType::string_t, Key >::value >>\ninline void from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_array()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", j.type_name()), &j));\n    }\n    m.clear();\n    for (const auto& p : j)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!p.is_array()))\n        {\n            JSON_THROW(type_error::create(302, concat(\"type must be array, but is \", p.type_name()), &j));\n        }\n        m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());\n    }\n}\n\n#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM\ntemplate<typename BasicJsonType>\ninline void from_json(const BasicJsonType& j, std_fs::path& p)\n{\n    if (JSON_HEDLEY_UNLIKELY(!j.is_string()))\n    {\n        JSON_THROW(type_error::create(302, concat(\"type must be string, but is \", j.type_name()), &j));\n    }\n    p = *j.template get_ptr<const typename BasicJsonType::string_t*>();\n}\n#endif\n\nstruct from_json_fn\n{\n    template<typename BasicJsonType, typename T>\n    auto operator()(const BasicJsonType& j, T&& val) const\n    noexcept(noexcept(from_json(j, std::forward<T>(val))))\n    -> decltype(from_json(j, std::forward<T>(val)))\n    {\n        return from_json(j, std::forward<T>(val));\n    }\n};\n\n}  // namespace detail\n\n#ifndef JSON_HAS_CPP_17\n/// namespace to hold default `from_json` function\n/// to see why this is required:\n/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html\nnamespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces)\n{\n#endif\nJSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definitions-in-headers)\n    detail::static_const<detail::from_json_fn>::value;\n#ifndef JSON_HAS_CPP_17\n}  // namespace\n#endif\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/conversions/to_chars.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2009 Florian Loitsch <https://florian.loitsch.com/>\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <array> // array\n#include <cmath>   // signbit, isfinite\n#include <cstdint> // intN_t, uintN_t\n#include <cstring> // memcpy, memmove\n#include <limits> // numeric_limits\n#include <type_traits> // conditional\n\n#include <nlohmann/detail/macro_scope.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/*!\n@brief implements the Grisu2 algorithm for binary to decimal floating-point\nconversion.\n\nThis implementation is a slightly modified version of the reference\nimplementation which may be obtained from\nhttp://florian.loitsch.com/publications (bench.tar.gz).\n\nThe code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch.\n\nFor a detailed description of the algorithm see:\n\n[1] Loitsch, \"Printing Floating-Point Numbers Quickly and Accurately with\n    Integers\", Proceedings of the ACM SIGPLAN 2010 Conference on Programming\n    Language Design and Implementation, PLDI 2010\n[2] Burger, Dybvig, \"Printing Floating-Point Numbers Quickly and Accurately\",\n    Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language\n    Design and Implementation, PLDI 1996\n*/\nnamespace dtoa_impl\n{\n\ntemplate<typename Target, typename Source>\nTarget reinterpret_bits(const Source source)\n{\n    static_assert(sizeof(Target) == sizeof(Source), \"size mismatch\");\n\n    Target target;\n    std::memcpy(&target, &source, sizeof(Source));\n    return target;\n}\n\nstruct diyfp // f * 2^e\n{\n    static constexpr int kPrecision = 64; // = q\n\n    std::uint64_t f = 0;\n    int e = 0;\n\n    constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}\n\n    /*!\n    @brief returns x - y\n    @pre x.e == y.e and x.f >= y.f\n    */\n    static diyfp sub(const diyfp& x, const diyfp& y) noexcept\n    {\n        JSON_ASSERT(x.e == y.e);\n        JSON_ASSERT(x.f >= y.f);\n\n        return {x.f - y.f, x.e};\n    }\n\n    /*!\n    @brief returns x * y\n    @note The result is rounded. (Only the upper q bits are returned.)\n    */\n    static diyfp mul(const diyfp& x, const diyfp& y) noexcept\n    {\n        static_assert(kPrecision == 64, \"internal error\");\n\n        // Computes:\n        //  f = round((x.f * y.f) / 2^q)\n        //  e = x.e + y.e + q\n\n        // Emulate the 64-bit * 64-bit multiplication:\n        //\n        // p = u * v\n        //   = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)\n        //   = (u_lo v_lo         ) + 2^32 ((u_lo v_hi         ) + (u_hi v_lo         )) + 2^64 (u_hi v_hi         )\n        //   = (p0                ) + 2^32 ((p1                ) + (p2                )) + 2^64 (p3                )\n        //   = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3                )\n        //   = (p0_lo             ) + 2^32 (p0_hi + p1_lo + p2_lo                      ) + 2^64 (p1_hi + p2_hi + p3)\n        //   = (p0_lo             ) + 2^32 (Q                                          ) + 2^64 (H                 )\n        //   = (p0_lo             ) + 2^32 (Q_lo + 2^32 Q_hi                           ) + 2^64 (H                 )\n        //\n        // (Since Q might be larger than 2^32 - 1)\n        //\n        //   = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)\n        //\n        // (Q_hi + H does not overflow a 64-bit int)\n        //\n        //   = p_lo + 2^64 p_hi\n\n        const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;\n        const std::uint64_t u_hi = x.f >> 32u;\n        const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;\n        const std::uint64_t v_hi = y.f >> 32u;\n\n        const std::uint64_t p0 = u_lo * v_lo;\n        const std::uint64_t p1 = u_lo * v_hi;\n        const std::uint64_t p2 = u_hi * v_lo;\n        const std::uint64_t p3 = u_hi * v_hi;\n\n        const std::uint64_t p0_hi = p0 >> 32u;\n        const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;\n        const std::uint64_t p1_hi = p1 >> 32u;\n        const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;\n        const std::uint64_t p2_hi = p2 >> 32u;\n\n        std::uint64_t Q = p0_hi + p1_lo + p2_lo;\n\n        // The full product might now be computed as\n        //\n        // p_hi = p3 + p2_hi + p1_hi + (Q >> 32)\n        // p_lo = p0_lo + (Q << 32)\n        //\n        // But in this particular case here, the full p_lo is not required.\n        // Effectively we only need to add the highest bit in p_lo to p_hi (and\n        // Q_hi + 1 does not overflow).\n\n        Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up\n\n        const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);\n\n        return {h, x.e + y.e + 64};\n    }\n\n    /*!\n    @brief normalize x such that the significand is >= 2^(q-1)\n    @pre x.f != 0\n    */\n    static diyfp normalize(diyfp x) noexcept\n    {\n        JSON_ASSERT(x.f != 0);\n\n        while ((x.f >> 63u) == 0)\n        {\n            x.f <<= 1u;\n            x.e--;\n        }\n\n        return x;\n    }\n\n    /*!\n    @brief normalize x such that the result has the exponent E\n    @pre e >= x.e and the upper e - x.e bits of x.f must be zero.\n    */\n    static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept\n    {\n        const int delta = x.e - target_exponent;\n\n        JSON_ASSERT(delta >= 0);\n        JSON_ASSERT(((x.f << delta) >> delta) == x.f);\n\n        return {x.f << delta, target_exponent};\n    }\n};\n\nstruct boundaries\n{\n    diyfp w;\n    diyfp minus;\n    diyfp plus;\n};\n\n/*!\nCompute the (normalized) diyfp representing the input number 'value' and its\nboundaries.\n\n@pre value must be finite and positive\n*/\ntemplate<typename FloatType>\nboundaries compute_boundaries(FloatType value)\n{\n    JSON_ASSERT(std::isfinite(value));\n    JSON_ASSERT(value > 0);\n\n    // Convert the IEEE representation into a diyfp.\n    //\n    // If v is denormal:\n    //      value = 0.F * 2^(1 - bias) = (          F) * 2^(1 - bias - (p-1))\n    // If v is normalized:\n    //      value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1))\n\n    static_assert(std::numeric_limits<FloatType>::is_iec559,\n                  \"internal error: dtoa_short requires an IEEE-754 floating-point implementation\");\n\n    constexpr int      kPrecision = std::numeric_limits<FloatType>::digits; // = p (includes the hidden bit)\n    constexpr int      kBias      = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);\n    constexpr int      kMinExp    = 1 - kBias;\n    constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1)\n\n    using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;\n\n    const auto bits = static_cast<std::uint64_t>(reinterpret_bits<bits_type>(value));\n    const std::uint64_t E = bits >> (kPrecision - 1);\n    const std::uint64_t F = bits & (kHiddenBit - 1);\n\n    const bool is_denormal = E == 0;\n    const diyfp v = is_denormal\n                    ? diyfp(F, kMinExp)\n                    : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);\n\n    // Compute the boundaries m- and m+ of the floating-point value\n    // v = f * 2^e.\n    //\n    // Determine v- and v+, the floating-point predecessor and successor if v,\n    // respectively.\n    //\n    //      v- = v - 2^e        if f != 2^(p-1) or e == e_min                (A)\n    //         = v - 2^(e-1)    if f == 2^(p-1) and e > e_min                (B)\n    //\n    //      v+ = v + 2^e\n    //\n    // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_\n    // between m- and m+ round to v, regardless of how the input rounding\n    // algorithm breaks ties.\n    //\n    //      ---+-------------+-------------+-------------+-------------+---  (A)\n    //         v-            m-            v             m+            v+\n    //\n    //      -----------------+------+------+-------------+-------------+---  (B)\n    //                       v-     m-     v             m+            v+\n\n    const bool lower_boundary_is_closer = F == 0 && E > 1;\n    const diyfp m_plus = diyfp((2 * v.f) + 1, v.e - 1);\n    const diyfp m_minus = lower_boundary_is_closer\n                          ? diyfp((4 * v.f) - 1, v.e - 2)  // (B)\n                          : diyfp((2 * v.f) - 1, v.e - 1); // (A)\n\n    // Determine the normalized w+ = m+.\n    const diyfp w_plus = diyfp::normalize(m_plus);\n\n    // Determine w- = m- such that e_(w-) = e_(w+).\n    const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);\n\n    return {diyfp::normalize(v), w_minus, w_plus};\n}\n\n// Given normalized diyfp w, Grisu needs to find a (normalized) cached\n// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies\n// within a certain range [alpha, gamma] (Definition 3.2 from [1])\n//\n//      alpha <= e = e_c + e_w + q <= gamma\n//\n// or\n//\n//      f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q\n//                          <= f_c * f_w * 2^gamma\n//\n// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies\n//\n//      2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma\n//\n// or\n//\n//      2^(q - 2 + alpha) <= c * w < 2^(q + gamma)\n//\n// The choice of (alpha,gamma) determines the size of the table and the form of\n// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well\n// in practice:\n//\n// The idea is to cut the number c * w = f * 2^e into two parts, which can be\n// processed independently: An integral part p1, and a fractional part p2:\n//\n//      f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e\n//              = (f div 2^-e) + (f mod 2^-e) * 2^e\n//              = p1 + p2 * 2^e\n//\n// The conversion of p1 into decimal form requires a series of divisions and\n// modulos by (a power of) 10. These operations are faster for 32-bit than for\n// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be\n// achieved by choosing\n//\n//      -e >= 32   or   e <= -32 := gamma\n//\n// In order to convert the fractional part\n//\n//      p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ...\n//\n// into decimal form, the fraction is repeatedly multiplied by 10 and the digits\n// d[-i] are extracted in order:\n//\n//      (10 * p2) div 2^-e = d[-1]\n//      (10 * p2) mod 2^-e = d[-2] / 10^1 + ...\n//\n// The multiplication by 10 must not overflow. It is sufficient to choose\n//\n//      10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64.\n//\n// Since p2 = f mod 2^-e < 2^-e,\n//\n//      -e <= 60   or   e >= -60 := alpha\n\nconstexpr int kAlpha = -60;\nconstexpr int kGamma = -32;\n\nstruct cached_power // c = f * 2^e ~= 10^k\n{\n    std::uint64_t f;\n    int e;\n    int k;\n};\n\n/*!\nFor a normalized diyfp w = f * 2^e, this function returns a (normalized) cached\npower-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c\nsatisfies (Definition 3.2 from [1])\n\n     alpha <= e_c + e + q <= gamma.\n*/\ninline cached_power get_cached_power_for_binary_exponent(int e)\n{\n    // Now\n    //\n    //      alpha <= e_c + e + q <= gamma                                    (1)\n    //      ==> f_c * 2^alpha <= c * 2^e * 2^q\n    //\n    // and since the c's are normalized, 2^(q-1) <= f_c,\n    //\n    //      ==> 2^(q - 1 + alpha) <= c * 2^(e + q)\n    //      ==> 2^(alpha - e - 1) <= c\n    //\n    // If c were an exact power of ten, i.e. c = 10^k, one may determine k as\n    //\n    //      k = ceil( log_10( 2^(alpha - e - 1) ) )\n    //        = ceil( (alpha - e - 1) * log_10(2) )\n    //\n    // From the paper:\n    // \"In theory the result of the procedure could be wrong since c is rounded,\n    //  and the computation itself is approximated [...]. In practice, however,\n    //  this simple function is sufficient.\"\n    //\n    // For IEEE double precision floating-point numbers converted into\n    // normalized diyfp's w = f * 2^e, with q = 64,\n    //\n    //      e >= -1022      (min IEEE exponent)\n    //           -52        (p - 1)\n    //           -52        (p - 1, possibly normalize denormal IEEE numbers)\n    //           -11        (normalize the diyfp)\n    //         = -1137\n    //\n    // and\n    //\n    //      e <= +1023      (max IEEE exponent)\n    //           -52        (p - 1)\n    //           -11        (normalize the diyfp)\n    //         = 960\n    //\n    // This binary exponent range [-1137,960] results in a decimal exponent\n    // range [-307,324]. One does not need to store a cached power for each\n    // k in this range. For each such k it suffices to find a cached power\n    // such that the exponent of the product lies in [alpha,gamma].\n    // This implies that the difference of the decimal exponents of adjacent\n    // table entries must be less than or equal to\n    //\n    //      floor( (gamma - alpha) * log_10(2) ) = 8.\n    //\n    // (A smaller distance gamma-alpha would require a larger table.)\n\n    // NB:\n    // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34.\n\n    constexpr int kCachedPowersMinDecExp = -300;\n    constexpr int kCachedPowersDecStep = 8;\n\n    static constexpr std::array<cached_power, 79> kCachedPowers =\n    {\n        {\n            { 0xAB70FE17C79AC6CA, -1060, -300 },\n            { 0xFF77B1FCBEBCDC4F, -1034, -292 },\n            { 0xBE5691EF416BD60C, -1007, -284 },\n            { 0x8DD01FAD907FFC3C,  -980, -276 },\n            { 0xD3515C2831559A83,  -954, -268 },\n            { 0x9D71AC8FADA6C9B5,  -927, -260 },\n            { 0xEA9C227723EE8BCB,  -901, -252 },\n            { 0xAECC49914078536D,  -874, -244 },\n            { 0x823C12795DB6CE57,  -847, -236 },\n            { 0xC21094364DFB5637,  -821, -228 },\n            { 0x9096EA6F3848984F,  -794, -220 },\n            { 0xD77485CB25823AC7,  -768, -212 },\n            { 0xA086CFCD97BF97F4,  -741, -204 },\n            { 0xEF340A98172AACE5,  -715, -196 },\n            { 0xB23867FB2A35B28E,  -688, -188 },\n            { 0x84C8D4DFD2C63F3B,  -661, -180 },\n            { 0xC5DD44271AD3CDBA,  -635, -172 },\n            { 0x936B9FCEBB25C996,  -608, -164 },\n            { 0xDBAC6C247D62A584,  -582, -156 },\n            { 0xA3AB66580D5FDAF6,  -555, -148 },\n            { 0xF3E2F893DEC3F126,  -529, -140 },\n            { 0xB5B5ADA8AAFF80B8,  -502, -132 },\n            { 0x87625F056C7C4A8B,  -475, -124 },\n            { 0xC9BCFF6034C13053,  -449, -116 },\n            { 0x964E858C91BA2655,  -422, -108 },\n            { 0xDFF9772470297EBD,  -396, -100 },\n            { 0xA6DFBD9FB8E5B88F,  -369,  -92 },\n            { 0xF8A95FCF88747D94,  -343,  -84 },\n            { 0xB94470938FA89BCF,  -316,  -76 },\n            { 0x8A08F0F8BF0F156B,  -289,  -68 },\n            { 0xCDB02555653131B6,  -263,  -60 },\n            { 0x993FE2C6D07B7FAC,  -236,  -52 },\n            { 0xE45C10C42A2B3B06,  -210,  -44 },\n            { 0xAA242499697392D3,  -183,  -36 },\n            { 0xFD87B5F28300CA0E,  -157,  -28 },\n            { 0xBCE5086492111AEB,  -130,  -20 },\n            { 0x8CBCCC096F5088CC,  -103,  -12 },\n            { 0xD1B71758E219652C,   -77,   -4 },\n            { 0x9C40000000000000,   -50,    4 },\n            { 0xE8D4A51000000000,   -24,   12 },\n            { 0xAD78EBC5AC620000,     3,   20 },\n            { 0x813F3978F8940984,    30,   28 },\n            { 0xC097CE7BC90715B3,    56,   36 },\n            { 0x8F7E32CE7BEA5C70,    83,   44 },\n            { 0xD5D238A4ABE98068,   109,   52 },\n            { 0x9F4F2726179A2245,   136,   60 },\n            { 0xED63A231D4C4FB27,   162,   68 },\n            { 0xB0DE65388CC8ADA8,   189,   76 },\n            { 0x83C7088E1AAB65DB,   216,   84 },\n            { 0xC45D1DF942711D9A,   242,   92 },\n            { 0x924D692CA61BE758,   269,  100 },\n            { 0xDA01EE641A708DEA,   295,  108 },\n            { 0xA26DA3999AEF774A,   322,  116 },\n            { 0xF209787BB47D6B85,   348,  124 },\n            { 0xB454E4A179DD1877,   375,  132 },\n            { 0x865B86925B9BC5C2,   402,  140 },\n            { 0xC83553C5C8965D3D,   428,  148 },\n            { 0x952AB45CFA97A0B3,   455,  156 },\n            { 0xDE469FBD99A05FE3,   481,  164 },\n            { 0xA59BC234DB398C25,   508,  172 },\n            { 0xF6C69A72A3989F5C,   534,  180 },\n            { 0xB7DCBF5354E9BECE,   561,  188 },\n            { 0x88FCF317F22241E2,   588,  196 },\n            { 0xCC20CE9BD35C78A5,   614,  204 },\n            { 0x98165AF37B2153DF,   641,  212 },\n            { 0xE2A0B5DC971F303A,   667,  220 },\n            { 0xA8D9D1535CE3B396,   694,  228 },\n            { 0xFB9B7CD9A4A7443C,   720,  236 },\n            { 0xBB764C4CA7A44410,   747,  244 },\n            { 0x8BAB8EEFB6409C1A,   774,  252 },\n            { 0xD01FEF10A657842C,   800,  260 },\n            { 0x9B10A4E5E9913129,   827,  268 },\n            { 0xE7109BFBA19C0C9D,   853,  276 },\n            { 0xAC2820D9623BF429,   880,  284 },\n            { 0x80444B5E7AA7CF85,   907,  292 },\n            { 0xBF21E44003ACDD2D,   933,  300 },\n            { 0x8E679C2F5E44FF8F,   960,  308 },\n            { 0xD433179D9C8CB841,   986,  316 },\n            { 0x9E19DB92B4E31BA9,  1013,  324 },\n        }\n    };\n\n    // This computation gives exactly the same results for k as\n    //      k = ceil((kAlpha - e - 1) * 0.30102999566398114)\n    // for |e| <= 1500, but doesn't require floating-point operations.\n    // NB: log_10(2) ~= 78913 / 2^18\n    JSON_ASSERT(e >= -1500);\n    JSON_ASSERT(e <=  1500);\n    const int f = kAlpha - e - 1;\n    const int k = ((f * 78913) / (1 << 18)) + static_cast<int>(f > 0);\n\n    const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;\n    JSON_ASSERT(index >= 0);\n    JSON_ASSERT(static_cast<std::size_t>(index) < kCachedPowers.size());\n\n    const cached_power cached = kCachedPowers[static_cast<std::size_t>(index)];\n    JSON_ASSERT(kAlpha <= cached.e + e + 64);\n    JSON_ASSERT(kGamma >= cached.e + e + 64);\n\n    return cached;\n}\n\n/*!\nFor n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k.\nFor n == 0, returns 1 and sets pow10 := 1.\n*/\ninline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10)\n{\n    // LCOV_EXCL_START\n    if (n >= 1000000000)\n    {\n        pow10 = 1000000000;\n        return 10;\n    }\n    // LCOV_EXCL_STOP\n    if (n >= 100000000)\n    {\n        pow10 = 100000000;\n        return  9;\n    }\n    if (n >= 10000000)\n    {\n        pow10 = 10000000;\n        return  8;\n    }\n    if (n >= 1000000)\n    {\n        pow10 = 1000000;\n        return  7;\n    }\n    if (n >= 100000)\n    {\n        pow10 = 100000;\n        return  6;\n    }\n    if (n >= 10000)\n    {\n        pow10 = 10000;\n        return  5;\n    }\n    if (n >= 1000)\n    {\n        pow10 = 1000;\n        return  4;\n    }\n    if (n >= 100)\n    {\n        pow10 = 100;\n        return  3;\n    }\n    if (n >= 10)\n    {\n        pow10 = 10;\n        return  2;\n    }\n\n    pow10 = 1;\n    return 1;\n}\n\ninline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta,\n                         std::uint64_t rest, std::uint64_t ten_k)\n{\n    JSON_ASSERT(len >= 1);\n    JSON_ASSERT(dist <= delta);\n    JSON_ASSERT(rest <= delta);\n    JSON_ASSERT(ten_k > 0);\n\n    //               <--------------------------- delta ---->\n    //                                  <---- dist --------->\n    // --------------[------------------+-------------------]--------------\n    //               M-                 w                   M+\n    //\n    //                                  ten_k\n    //                                <------>\n    //                                       <---- rest ---->\n    // --------------[------------------+----+--------------]--------------\n    //                                  w    V\n    //                                       = buf * 10^k\n    //\n    // ten_k represents a unit-in-the-last-place in the decimal representation\n    // stored in buf.\n    // Decrement buf by ten_k while this takes buf closer to w.\n\n    // The tests are written in this order to avoid overflow in unsigned\n    // integer arithmetic.\n\n    while (rest < dist\n            && delta - rest >= ten_k\n            && (rest + ten_k < dist || dist - rest > rest + ten_k - dist))\n    {\n        JSON_ASSERT(buf[len - 1] != '0');\n        buf[len - 1]--;\n        rest += ten_k;\n    }\n}\n\n/*!\nGenerates V = buffer * 10^decimal_exponent, such that M- <= V <= M+.\nM- and M+ must be normalized and share the same exponent -60 <= e <= -32.\n*/\ninline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent,\n                             diyfp M_minus, diyfp w, diyfp M_plus)\n{\n    static_assert(kAlpha >= -60, \"internal error\");\n    static_assert(kGamma <= -32, \"internal error\");\n\n    // Generates the digits (and the exponent) of a decimal floating-point\n    // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's\n    // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma.\n    //\n    //               <--------------------------- delta ---->\n    //                                  <---- dist --------->\n    // --------------[------------------+-------------------]--------------\n    //               M-                 w                   M+\n    //\n    // Grisu2 generates the digits of M+ from left to right and stops as soon as\n    // V is in [M-,M+].\n\n    JSON_ASSERT(M_plus.e >= kAlpha);\n    JSON_ASSERT(M_plus.e <= kGamma);\n\n    std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e)\n    std::uint64_t dist  = diyfp::sub(M_plus, w      ).f; // (significand of (M+ - w ), implicit exponent is e)\n\n    // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0):\n    //\n    //      M+ = f * 2^e\n    //         = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e\n    //         = ((p1        ) * 2^-e + (p2        )) * 2^e\n    //         = p1 + p2 * 2^e\n\n    const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e);\n\n    auto p1 = static_cast<std::uint32_t>(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.)\n    std::uint64_t p2 = M_plus.f & (one.f - 1);                    // p2 = f mod 2^-e\n\n    // 1)\n    //\n    // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0]\n\n    JSON_ASSERT(p1 > 0);\n\n    std::uint32_t pow10{};\n    const int k = find_largest_pow10(p1, pow10);\n\n    //      10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1)\n    //\n    //      p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1))\n    //         = (d[k-1]         ) * 10^(k-1) + (p1 mod 10^(k-1))\n    //\n    //      M+ = p1                                             + p2 * 2^e\n    //         = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1))          + p2 * 2^e\n    //         = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e\n    //         = d[k-1] * 10^(k-1) + (                         rest) * 2^e\n    //\n    // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0)\n    //\n    //      p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0]\n    //\n    // but stop as soon as\n    //\n    //      rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e\n\n    int n = k;\n    while (n > 0)\n    {\n        // Invariants:\n        //      M+ = buffer * 10^n + (p1 + p2 * 2^e)    (buffer = 0 for n = k)\n        //      pow10 = 10^(n-1) <= p1 < 10^n\n        //\n        const std::uint32_t d = p1 / pow10;  // d = p1 div 10^(n-1)\n        const std::uint32_t r = p1 % pow10;  // r = p1 mod 10^(n-1)\n        //\n        //      M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e\n        //         = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e)\n        //\n        JSON_ASSERT(d <= 9);\n        buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d\n        //\n        //      M+ = buffer * 10^(n-1) + (r + p2 * 2^e)\n        //\n        p1 = r;\n        n--;\n        //\n        //      M+ = buffer * 10^n + (p1 + p2 * 2^e)\n        //      pow10 = 10^n\n        //\n\n        // Now check if enough digits have been generated.\n        // Compute\n        //\n        //      p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e\n        //\n        // Note:\n        // Since rest and delta share the same exponent e, it suffices to\n        // compare the significands.\n        const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2;\n        if (rest <= delta)\n        {\n            // V = buffer * 10^n, with M- <= V <= M+.\n\n            decimal_exponent += n;\n\n            // We may now just stop. But instead look if the buffer could be\n            // decremented to bring V closer to w.\n            //\n            // pow10 = 10^n is now 1 ulp in the decimal representation V.\n            // The rounding procedure works with diyfp's with an implicit\n            // exponent of e.\n            //\n            //      10^n = (10^n * 2^-e) * 2^e = ulp * 2^e\n            //\n            const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e;\n            grisu2_round(buffer, length, dist, delta, rest, ten_n);\n\n            return;\n        }\n\n        pow10 /= 10;\n        //\n        //      pow10 = 10^(n-1) <= p1 < 10^n\n        // Invariants restored.\n    }\n\n    // 2)\n    //\n    // The digits of the integral part have been generated:\n    //\n    //      M+ = d[k-1]...d[1]d[0] + p2 * 2^e\n    //         = buffer            + p2 * 2^e\n    //\n    // Now generate the digits of the fractional part p2 * 2^e.\n    //\n    // Note:\n    // No decimal point is generated: the exponent is adjusted instead.\n    //\n    // p2 actually represents the fraction\n    //\n    //      p2 * 2^e\n    //          = p2 / 2^-e\n    //          = d[-1] / 10^1 + d[-2] / 10^2 + ...\n    //\n    // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...)\n    //\n    //      p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m\n    //                      + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...)\n    //\n    // using\n    //\n    //      10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e)\n    //                = (                   d) * 2^-e + (                   r)\n    //\n    // or\n    //      10^m * p2 * 2^e = d + r * 2^e\n    //\n    // i.e.\n    //\n    //      M+ = buffer + p2 * 2^e\n    //         = buffer + 10^-m * (d + r * 2^e)\n    //         = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e\n    //\n    // and stop as soon as 10^-m * r * 2^e <= delta * 2^e\n\n    JSON_ASSERT(p2 > delta);\n\n    int m = 0;\n    for (;;)\n    {\n        // Invariant:\n        //      M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e\n        //         = buffer * 10^-m + 10^-m * (p2                                 ) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * (10 * p2)                   ) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e\n        //\n        JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);\n        p2 *= 10;\n        const std::uint64_t d = p2 >> -one.e;     // d = (10 * p2) div 2^-e\n        const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e\n        //\n        //      M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e\n        //         = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e))\n        //         = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e\n        //\n        JSON_ASSERT(d <= 9);\n        buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d\n        //\n        //      M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e\n        //\n        p2 = r;\n        m++;\n        //\n        //      M+ = buffer * 10^-m + 10^-m * p2 * 2^e\n        // Invariant restored.\n\n        // Check if enough digits have been generated.\n        //\n        //      10^-m * p2 * 2^e <= delta * 2^e\n        //              p2 * 2^e <= 10^m * delta * 2^e\n        //                    p2 <= 10^m * delta\n        delta *= 10;\n        dist  *= 10;\n        if (p2 <= delta)\n        {\n            break;\n        }\n    }\n\n    // V = buffer * 10^-m, with M- <= V <= M+.\n\n    decimal_exponent -= m;\n\n    // 1 ulp in the decimal representation is now 10^-m.\n    // Since delta and dist are now scaled by 10^m, we need to do the\n    // same with ulp in order to keep the units in sync.\n    //\n    //      10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e\n    //\n    const std::uint64_t ten_m = one.f;\n    grisu2_round(buffer, length, dist, delta, p2, ten_m);\n\n    // By construction this algorithm generates the shortest possible decimal\n    // number (Loitsch, Theorem 6.2) which rounds back to w.\n    // For an input number of precision p, at least\n    //\n    //      N = 1 + ceil(p * log_10(2))\n    //\n    // decimal digits are sufficient to identify all binary floating-point\n    // numbers (Matula, \"In-and-Out conversions\").\n    // This implies that the algorithm does not produce more than N decimal\n    // digits.\n    //\n    //      N = 17 for p = 53 (IEEE double precision)\n    //      N = 9  for p = 24 (IEEE single precision)\n}\n\n/*!\nv = buf * 10^decimal_exponent\nlen is the length of the buffer (number of decimal digits)\nThe buffer must be large enough, i.e. >= max_digits10.\n*/\nJSON_HEDLEY_NON_NULL(1)\ninline void grisu2(char* buf, int& len, int& decimal_exponent,\n                   diyfp m_minus, diyfp v, diyfp m_plus)\n{\n    JSON_ASSERT(m_plus.e == m_minus.e);\n    JSON_ASSERT(m_plus.e == v.e);\n\n    //  --------(-----------------------+-----------------------)--------    (A)\n    //          m-                      v                       m+\n    //\n    //  --------------------(-----------+-----------------------)--------    (B)\n    //                      m-          v                       m+\n    //\n    // First scale v (and m- and m+) such that the exponent is in the range\n    // [alpha, gamma].\n\n    const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e);\n\n    const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k\n\n    // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma]\n    const diyfp w       = diyfp::mul(v,       c_minus_k);\n    const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);\n    const diyfp w_plus  = diyfp::mul(m_plus,  c_minus_k);\n\n    //  ----(---+---)---------------(---+---)---------------(---+---)----\n    //          w-                      w                       w+\n    //          = c*m-                  = c*v                   = c*m+\n    //\n    // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and\n    // w+ are now off by a small amount.\n    // In fact:\n    //\n    //      w - v * 10^k < 1 ulp\n    //\n    // To account for this inaccuracy, add resp. subtract 1 ulp.\n    //\n    //  --------+---[---------------(---+---)---------------]---+--------\n    //          w-  M-                  w                   M+  w+\n    //\n    // Now any number in [M-, M+] (bounds included) will round to w when input,\n    // regardless of how the input rounding algorithm breaks ties.\n    //\n    // And digit_gen generates the shortest possible such number in [M-, M+].\n    // Note that this does not mean that Grisu2 always generates the shortest\n    // possible number in the interval (m-, m+).\n    const diyfp M_minus(w_minus.f + 1, w_minus.e);\n    const diyfp M_plus (w_plus.f  - 1, w_plus.e );\n\n    decimal_exponent = -cached.k; // = -(-k) = k\n\n    grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus);\n}\n\n/*!\nv = buf * 10^decimal_exponent\nlen is the length of the buffer (number of decimal digits)\nThe buffer must be large enough, i.e. >= max_digits10.\n*/\ntemplate<typename FloatType>\nJSON_HEDLEY_NON_NULL(1)\nvoid grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)\n{\n    static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,\n                  \"internal error: not enough precision\");\n\n    JSON_ASSERT(std::isfinite(value));\n    JSON_ASSERT(value > 0);\n\n    // If the neighbors (and boundaries) of 'value' are always computed for double-precision\n    // numbers, all float's can be recovered using strtod (and strtof). However, the resulting\n    // decimal representations are not exactly \"short\".\n    //\n    // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars)\n    // says \"value is converted to a string as if by std::sprintf in the default (\"C\") locale\"\n    // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars'\n    // does.\n    // On the other hand, the documentation for 'std::to_chars' requires that \"parsing the\n    // representation using the corresponding std::from_chars function recovers value exactly\". That\n    // indicates that single precision floating-point numbers should be recovered using\n    // 'std::strtof'.\n    //\n    // NB: If the neighbors are computed for single-precision numbers, there is a single float\n    //     (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision\n    //     value is off by 1 ulp.\n#if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if)\n    const boundaries w = compute_boundaries(static_cast<double>(value));\n#else\n    const boundaries w = compute_boundaries(value);\n#endif\n\n    grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus);\n}\n\n/*!\n@brief appends a decimal representation of e to buf\n@return a pointer to the element following the exponent.\n@pre -1000 < e < 1000\n*/\nJSON_HEDLEY_NON_NULL(1)\nJSON_HEDLEY_RETURNS_NON_NULL\ninline char* append_exponent(char* buf, int e)\n{\n    JSON_ASSERT(e > -1000);\n    JSON_ASSERT(e <  1000);\n\n    if (e < 0)\n    {\n        e = -e;\n        *buf++ = '-';\n    }\n    else\n    {\n        *buf++ = '+';\n    }\n\n    auto k = static_cast<std::uint32_t>(e);\n    if (k < 10)\n    {\n        // Always print at least two digits in the exponent.\n        // This is for compatibility with printf(\"%g\").\n        *buf++ = '0';\n        *buf++ = static_cast<char>('0' + k);\n    }\n    else if (k < 100)\n    {\n        *buf++ = static_cast<char>('0' + (k / 10));\n        k %= 10;\n        *buf++ = static_cast<char>('0' + k);\n    }\n    else\n    {\n        *buf++ = static_cast<char>('0' + (k / 100));\n        k %= 100;\n        *buf++ = static_cast<char>('0' + (k / 10));\n        k %= 10;\n        *buf++ = static_cast<char>('0' + k);\n    }\n\n    return buf;\n}\n\n/*!\n@brief prettify v = buf * 10^decimal_exponent\n\nIf v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point\nnotation. Otherwise it will be printed in exponential notation.\n\n@pre min_exp < 0\n@pre max_exp > 0\n*/\nJSON_HEDLEY_NON_NULL(1)\nJSON_HEDLEY_RETURNS_NON_NULL\ninline char* format_buffer(char* buf, int len, int decimal_exponent,\n                           int min_exp, int max_exp)\n{\n    JSON_ASSERT(min_exp < 0);\n    JSON_ASSERT(max_exp > 0);\n\n    const int k = len;\n    const int n = len + decimal_exponent;\n\n    // v = buf * 10^(n-k)\n    // k is the length of the buffer (number of decimal digits)\n    // n is the position of the decimal point relative to the start of the buffer.\n\n    if (k <= n && n <= max_exp)\n    {\n        // digits[000]\n        // len <= max_exp + 2\n\n        std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k));\n        // Make it look like a floating-point number (#362, #378)\n        buf[n + 0] = '.';\n        buf[n + 1] = '0';\n        return buf + (static_cast<size_t>(n) + 2);\n    }\n\n    if (0 < n && n <= max_exp)\n    {\n        // dig.its\n        // len <= max_digits10 + 1\n\n        JSON_ASSERT(k > n);\n\n        std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n));\n        buf[n] = '.';\n        return buf + (static_cast<size_t>(k) + 1U);\n    }\n\n    if (min_exp < n && n <= 0)\n    {\n        // 0.[000]digits\n        // len <= 2 + (-min_exp - 1) + max_digits10\n\n        std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k));\n        buf[0] = '0';\n        buf[1] = '.';\n        std::memset(buf + 2, '0', static_cast<size_t>(-n));\n        return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k));\n    }\n\n    if (k == 1)\n    {\n        // dE+123\n        // len <= 1 + 5\n\n        buf += 1;\n    }\n    else\n    {\n        // d.igitsE+123\n        // len <= max_digits10 + 1 + 5\n\n        std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1);\n        buf[1] = '.';\n        buf += 1 + static_cast<size_t>(k);\n    }\n\n    *buf++ = 'e';\n    return append_exponent(buf, n - 1);\n}\n\n}  // namespace dtoa_impl\n\n/*!\n@brief generates a decimal representation of the floating-point number value in [first, last).\n\nThe format of the resulting decimal representation is similar to printf's %g\nformat. Returns an iterator pointing past-the-end of the decimal representation.\n\n@note The input number must be finite, i.e. NaN's and Inf's are not supported.\n@note The buffer must be large enough.\n@note The result is NOT null-terminated.\n*/\ntemplate<typename FloatType>\nJSON_HEDLEY_NON_NULL(1, 2)\nJSON_HEDLEY_RETURNS_NON_NULL\nchar* to_chars(char* first, const char* last, FloatType value)\n{\n    static_cast<void>(last); // maybe unused - fix warning\n    JSON_ASSERT(std::isfinite(value));\n\n    // Use signbit(value) instead of (value < 0) since signbit works for -0.\n    if (std::signbit(value))\n    {\n        value = -value;\n        *first++ = '-';\n    }\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n    if (value == 0) // +-0\n    {\n        *first++ = '0';\n        // Make it look like a floating-point number (#362, #378)\n        *first++ = '.';\n        *first++ = '0';\n        return first;\n    }\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n    JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);\n\n    // Compute v = buffer * 10^decimal_exponent.\n    // The decimal digits are stored in the buffer, which needs to be interpreted\n    // as an unsigned decimal integer.\n    // len is the length of the buffer, i.e. the number of decimal digits.\n    int len = 0;\n    int decimal_exponent = 0;\n    dtoa_impl::grisu2(first, len, decimal_exponent, value);\n\n    JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);\n\n    // Format the buffer like printf(\"%.*g\", prec, value)\n    constexpr int kMinExp = -4;\n    // Use digits10 here to increase compatibility with version 2.\n    constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10;\n\n    JSON_ASSERT(last - first >= kMaxExp + 2);\n    JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);\n    JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);\n\n    return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp);\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/conversions/to_json.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/macro_scope.hpp> // JSON_HAS_CPP_17\n#ifdef JSON_HAS_CPP_17\n    #include <optional> // optional\n#endif\n\n#include <algorithm> // copy\n#include <iterator> // begin, end\n#include <string> // string\n#include <tuple> // tuple, get\n#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type\n#include <utility> // move, forward, declval, pair\n#include <valarray> // valarray\n#include <vector> // vector\n\n#include <nlohmann/detail/iterators/iteration_proxy.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/std_fs.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n//////////////////\n// constructors //\n//////////////////\n\n/*\n * Note all external_constructor<>::construct functions need to call\n * j.m_data.m_value.destroy(j.m_data.m_type) to avoid a memory leak in case j contains an\n * allocated value (e.g., a string). See bug issue\n * https://github.com/nlohmann/json/issues/2865 for more information.\n */\n\ntemplate<value_t> struct external_constructor;\n\ntemplate<>\nstruct external_constructor<value_t::boolean>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::boolean;\n        j.m_data.m_value = b;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::string>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::string;\n        j.m_data.m_value = s;\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::string;\n        j.m_data.m_value = std::move(s);\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleStringType,\n               enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,\n                             int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleStringType& str)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::string;\n        j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str);\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::binary>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::binary;\n        j.m_data.m_value = typename BasicJsonType::binary_t(b);\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::binary;\n        j.m_data.m_value = typename BasicJsonType::binary_t(std::move(b));\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_float>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::number_float;\n        j.m_data.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_unsigned>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::number_unsigned;\n        j.m_data.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::number_integer>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::number_integer;\n        j.m_data.m_value = val;\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::array>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::array;\n        j.m_data.m_value = arr;\n        j.set_parents();\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::array;\n        j.m_data.m_value = std::move(arr);\n        j.set_parents();\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleArrayType,\n               enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,\n                             int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleArrayType& arr)\n    {\n        using std::begin;\n        using std::end;\n\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::array;\n        j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));\n        j.set_parents();\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const std::vector<bool>& arr)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::array;\n        j.m_data.m_value = value_t::array;\n        j.m_data.m_value.array->reserve(arr.size());\n        for (const bool x : arr)\n        {\n            j.m_data.m_value.array->push_back(x);\n            j.set_parent(j.m_data.m_value.array->back());\n        }\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType, typename T,\n             enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>\n    static void construct(BasicJsonType& j, const std::valarray<T>& arr)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::array;\n        j.m_data.m_value = value_t::array;\n        j.m_data.m_value.array->resize(arr.size());\n        if (arr.size() > 0)\n        {\n            std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin());\n        }\n        j.set_parents();\n        j.assert_invariant();\n    }\n};\n\ntemplate<>\nstruct external_constructor<value_t::object>\n{\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::object;\n        j.m_data.m_value = obj;\n        j.set_parents();\n        j.assert_invariant();\n    }\n\n    template<typename BasicJsonType>\n    static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj)\n    {\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::object;\n        j.m_data.m_value = std::move(obj);\n        j.set_parents();\n        j.assert_invariant();\n    }\n\n    template < typename BasicJsonType, typename CompatibleObjectType,\n               enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 >\n    static void construct(BasicJsonType& j, const CompatibleObjectType& obj)\n    {\n        using std::begin;\n        using std::end;\n\n        j.m_data.m_value.destroy(j.m_data.m_type);\n        j.m_data.m_type = value_t::object;\n        j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));\n        j.set_parents();\n        j.assert_invariant();\n    }\n};\n\n/////////////\n// to_json //\n/////////////\n\n#ifdef JSON_HAS_CPP_17\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_constructible<BasicJsonType, T>::value, int> = 0>\nvoid to_json(BasicJsonType& j, const std::optional<T>& opt)\n{\n    if (opt.has_value())\n    {\n        j = *opt;\n    }\n    else\n    {\n        j = nullptr;\n    }\n}\n#endif\n\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>\ninline void to_json(BasicJsonType& j, T b) noexcept\n{\n    external_constructor<value_t::boolean>::construct(j, b);\n}\n\ntemplate < typename BasicJsonType, typename BoolRef,\n           enable_if_t <\n               ((std::is_same<std::vector<bool>::reference, BoolRef>::value\n                 && !std::is_same <std::vector<bool>::reference, typename BasicJsonType::boolean_t&>::value)\n                || (std::is_same<std::vector<bool>::const_reference, BoolRef>::value\n                    && !std::is_same <detail::uncvref_t<std::vector<bool>::const_reference>,\n                                      typename BasicJsonType::boolean_t >::value))\n               && std::is_convertible<const BoolRef&, typename BasicJsonType::boolean_t>::value, int > = 0 >\ninline void to_json(BasicJsonType& j, const BoolRef& b) noexcept\n{\n    external_constructor<value_t::boolean>::construct(j, static_cast<typename BasicJsonType::boolean_t>(b));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleString,\n         enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0>\ninline void to_json(BasicJsonType& j, const CompatibleString& s)\n{\n    external_constructor<value_t::string>::construct(j, s);\n}\n\ntemplate<typename BasicJsonType>\ninline void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)\n{\n    external_constructor<value_t::string>::construct(j, std::move(s));\n}\n\ntemplate<typename BasicJsonType, typename FloatType,\n         enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>\ninline void to_json(BasicJsonType& j, FloatType val) noexcept\n{\n    external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleNumberUnsignedType,\n         enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0>\ninline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept\n{\n    external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));\n}\n\ntemplate<typename BasicJsonType, typename CompatibleNumberIntegerType,\n         enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0>\ninline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept\n{\n    external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));\n}\n\n#if !JSON_DISABLE_ENUM_SERIALIZATION\ntemplate<typename BasicJsonType, typename EnumType,\n         enable_if_t<std::is_enum<EnumType>::value, int> = 0>\ninline void to_json(BasicJsonType& j, EnumType e) noexcept\n{\n    using underlying_type = typename std::underlying_type<EnumType>::type;\n    static constexpr value_t integral_value_t = std::is_unsigned<underlying_type>::value ? value_t::number_unsigned : value_t::number_integer;\n    external_constructor<integral_value_t>::construct(j, static_cast<underlying_type>(e));\n}\n#endif  // JSON_DISABLE_ENUM_SERIALIZATION\n\ntemplate<typename BasicJsonType>\ninline void to_json(BasicJsonType& j, const std::vector<bool>& e)\n{\n    external_constructor<value_t::array>::construct(j, e);\n}\n\ntemplate < typename BasicJsonType, typename CompatibleArrayType,\n           enable_if_t < is_compatible_array_type<BasicJsonType,\n                         CompatibleArrayType>::value&&\n                         !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&&\n                         !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&\n                         !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&\n                         !is_basic_json<CompatibleArrayType>::value,\n                         int > = 0 >\ninline void to_json(BasicJsonType& j, const CompatibleArrayType& arr)\n{\n    external_constructor<value_t::array>::construct(j, arr);\n}\n\ntemplate<typename BasicJsonType>\ninline void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin)\n{\n    external_constructor<value_t::binary>::construct(j, bin);\n}\n\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>\ninline void to_json(BasicJsonType& j, const std::valarray<T>& arr)\n{\n    external_constructor<value_t::array>::construct(j, std::move(arr));\n}\n\ntemplate<typename BasicJsonType>\ninline void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)\n{\n    external_constructor<value_t::array>::construct(j, std::move(arr));\n}\n\ntemplate < typename BasicJsonType, typename CompatibleObjectType,\n           enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value, int > = 0 >\ninline void to_json(BasicJsonType& j, const CompatibleObjectType& obj)\n{\n    external_constructor<value_t::object>::construct(j, obj);\n}\n\ntemplate<typename BasicJsonType>\ninline void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)\n{\n    external_constructor<value_t::object>::construct(j, std::move(obj));\n}\n\ntemplate <\n    typename BasicJsonType, typename T, std::size_t N,\n    enable_if_t < !std::is_constructible<typename BasicJsonType::string_t,\n                  const T(&)[N]>::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n                  int > = 0 >\ninline void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n{\n    external_constructor<value_t::array>::construct(j, arr);\n}\n\ntemplate < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >\ninline void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)\n{\n    j = { p.first, p.second };\n}\n\n// for https://github.com/nlohmann/json/pull/1134\ntemplate<typename BasicJsonType, typename T,\n         enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0>\ninline void to_json(BasicJsonType& j, const T& b)\n{\n    j = { {b.key(), b.value()} };\n}\n\ntemplate<typename BasicJsonType, typename Tuple, std::size_t... Idx>\ninline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> /*unused*/)\n{\n    j = { std::get<Idx>(t)... };\n}\n\ntemplate<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>\ninline void to_json(BasicJsonType& j, const T& t)\n{\n    to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});\n}\n\n#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM\ntemplate<typename BasicJsonType>\ninline void to_json(BasicJsonType& j, const std_fs::path& p)\n{\n    j = p.string();\n}\n#endif\n\nstruct to_json_fn\n{\n    template<typename BasicJsonType, typename T>\n    auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val))))\n    -> decltype(to_json(j, std::forward<T>(val)), void())\n    {\n        return to_json(j, std::forward<T>(val));\n    }\n};\n}  // namespace detail\n\n#ifndef JSON_HAS_CPP_17\n/// namespace to hold default `to_json` function\n/// to see why this is required:\n/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html\nnamespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces)\n{\n#endif\nJSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-in-headers)\n    detail::static_const<detail::to_json_fn>::value;\n#ifndef JSON_HAS_CPP_17\n}  // namespace\n#endif\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/exceptions.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef> // nullptr_t\n#include <exception> // exception\n#if JSON_DIAGNOSTICS\n    #include <numeric> // accumulate\n#endif\n#include <stdexcept> // runtime_error\n#include <string> // to_string\n#include <vector> // vector\n\n#include <nlohmann/detail/value_t.hpp>\n#include <nlohmann/detail/string_escape.hpp>\n#include <nlohmann/detail/input/position_t.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n\n// With -Wweak-vtables, Clang will complain about the exception classes as they\n// have no out-of-line virtual method definitions and their vtable will be\n// emitted in every translation unit. This issue cannot be fixed with a\n// header-only library as there is no implementation file to move these\n// functions to. As a result, we suppress this warning here to avoid client\n// code to stumble over this. See https://github.com/nlohmann/json/issues/4087\n// for a discussion.\n#if defined(__clang__)\n    #pragma clang diagnostic push\n    #pragma clang diagnostic ignored \"-Wweak-vtables\"\n#endif\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n////////////////\n// exceptions //\n////////////////\n\n/// @brief general exception of the @ref basic_json class\n/// @sa https://json.nlohmann.me/api/basic_json/exception/\nclass exception : public std::exception\n{\n  public:\n    /// returns the explanatory string\n    const char* what() const noexcept override\n    {\n        return m.what();\n    }\n\n    /// the id of the exception\n    const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes)\n\n  protected:\n    JSON_HEDLEY_NON_NULL(3)\n    exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing)\n\n    static std::string name(const std::string& ename, int id_)\n    {\n        return concat(\"[json.exception.\", ename, '.', std::to_string(id_), \"] \");\n    }\n\n    static std::string diagnostics(std::nullptr_t /*leaf_element*/)\n    {\n        return \"\";\n    }\n\n    template<typename BasicJsonType>\n    static std::string diagnostics(const BasicJsonType* leaf_element)\n    {\n#if JSON_DIAGNOSTICS\n        std::vector<std::string> tokens;\n        for (const auto* current = leaf_element; current != nullptr && current->m_parent != nullptr; current = current->m_parent)\n        {\n            switch (current->m_parent->type())\n            {\n                case value_t::array:\n                {\n                    for (std::size_t i = 0; i < current->m_parent->m_data.m_value.array->size(); ++i)\n                    {\n                        if (&current->m_parent->m_data.m_value.array->operator[](i) == current)\n                        {\n                            tokens.emplace_back(std::to_string(i));\n                            break;\n                        }\n                    }\n                    break;\n                }\n\n                case value_t::object:\n                {\n                    for (const auto& element : *current->m_parent->m_data.m_value.object)\n                    {\n                        if (&element.second == current)\n                        {\n                            tokens.emplace_back(element.first.c_str());\n                            break;\n                        }\n                    }\n                    break;\n                }\n\n                case value_t::null: // LCOV_EXCL_LINE\n                case value_t::string: // LCOV_EXCL_LINE\n                case value_t::boolean: // LCOV_EXCL_LINE\n                case value_t::number_integer: // LCOV_EXCL_LINE\n                case value_t::number_unsigned: // LCOV_EXCL_LINE\n                case value_t::number_float: // LCOV_EXCL_LINE\n                case value_t::binary: // LCOV_EXCL_LINE\n                case value_t::discarded: // LCOV_EXCL_LINE\n                default:   // LCOV_EXCL_LINE\n                    break; // LCOV_EXCL_LINE\n            }\n        }\n\n        if (tokens.empty())\n        {\n            return \"\";\n        }\n\n        auto str = std::accumulate(tokens.rbegin(), tokens.rend(), std::string{},\n                                   [](const std::string & a, const std::string & b)\n        {\n            return concat(a, '/', detail::escape(b));\n        });\n        return concat('(', str, \") \");\n#else\n        static_cast<void>(leaf_element);\n        return \"\";\n#endif\n    }\n\n  private:\n    /// an exception object as storage for error messages\n    std::runtime_error m;\n};\n\n/// @brief exception indicating a parse error\n/// @sa https://json.nlohmann.me/api/basic_json/parse_error/\nclass parse_error : public exception\n{\n  public:\n    /*!\n    @brief create a parse error exception\n    @param[in] id_       the id of the exception\n    @param[in] pos       the position where the error occurred (or with\n                         chars_read_total=0 if the position cannot be\n                         determined)\n    @param[in] what_arg  the explanatory string\n    @return parse_error object\n    */\n    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>\n    static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context)\n    {\n        const std::string w = concat(exception::name(\"parse_error\", id_), \"parse error\",\n                                     position_string(pos), \": \", exception::diagnostics(context), what_arg);\n        return {id_, pos.chars_read_total, w.c_str()};\n    }\n\n    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>\n    static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context)\n    {\n        const std::string w = concat(exception::name(\"parse_error\", id_), \"parse error\",\n                                     (byte_ != 0 ? (concat(\" at byte \", std::to_string(byte_))) : \"\"),\n                                     \": \", exception::diagnostics(context), what_arg);\n        return {id_, byte_, w.c_str()};\n    }\n\n    /*!\n    @brief byte index of the parse error\n\n    The byte index of the last read character in the input file.\n\n    @note For an input with n bytes, 1 is the index of the first character and\n          n+1 is the index of the terminating null byte or the end of file.\n          This also holds true when reading a byte vector (CBOR or MessagePack).\n    */\n    const std::size_t byte;\n\n  private:\n    parse_error(int id_, std::size_t byte_, const char* what_arg)\n        : exception(id_, what_arg), byte(byte_) {}\n\n    static std::string position_string(const position_t& pos)\n    {\n        return concat(\" at line \", std::to_string(pos.lines_read + 1),\n                      \", column \", std::to_string(pos.chars_read_current_line));\n    }\n};\n\n/// @brief exception indicating errors with iterators\n/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/\nclass invalid_iterator : public exception\n{\n  public:\n    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>\n    static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context)\n    {\n        const std::string w = concat(exception::name(\"invalid_iterator\", id_), exception::diagnostics(context), what_arg);\n        return {id_, w.c_str()};\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    invalid_iterator(int id_, const char* what_arg)\n        : exception(id_, what_arg) {}\n};\n\n/// @brief exception indicating executing a member function with a wrong type\n/// @sa https://json.nlohmann.me/api/basic_json/type_error/\nclass type_error : public exception\n{\n  public:\n    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>\n    static type_error create(int id_, const std::string& what_arg, BasicJsonContext context)\n    {\n        const std::string w = concat(exception::name(\"type_error\", id_), exception::diagnostics(context), what_arg);\n        return {id_, w.c_str()};\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n/// @brief exception indicating access out of the defined range\n/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/\nclass out_of_range : public exception\n{\n  public:\n    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>\n    static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context)\n    {\n        const std::string w = concat(exception::name(\"out_of_range\", id_), exception::diagnostics(context), what_arg);\n        return {id_, w.c_str()};\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n/// @brief exception indicating other library errors\n/// @sa https://json.nlohmann.me/api/basic_json/other_error/\nclass other_error : public exception\n{\n  public:\n    template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>\n    static other_error create(int id_, const std::string& what_arg, BasicJsonContext context)\n    {\n        const std::string w = concat(exception::name(\"other_error\", id_), exception::diagnostics(context), what_arg);\n        return {id_, w.c_str()};\n    }\n\n  private:\n    JSON_HEDLEY_NON_NULL(3)\n    other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n\n#if defined(__clang__)\n    #pragma clang diagnostic pop\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/hash.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstdint> // uint8_t\n#include <cstddef> // size_t\n#include <functional> // hash\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n// boost::hash_combine\ninline std::size_t combine(std::size_t seed, std::size_t h) noexcept\n{\n    seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);\n    return seed;\n}\n\n/*!\n@brief hash a JSON value\n\nThe hash function tries to rely on std::hash where possible. Furthermore, the\ntype of the JSON value is taken into account to have different hash values for\nnull, 0, 0U, and false, etc.\n\n@tparam BasicJsonType basic_json specialization\n@param j JSON value to hash\n@return hash value of j\n*/\ntemplate<typename BasicJsonType>\nstd::size_t hash(const BasicJsonType& j)\n{\n    using string_t = typename BasicJsonType::string_t;\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n\n    const auto type = static_cast<std::size_t>(j.type());\n    switch (j.type())\n    {\n        case BasicJsonType::value_t::null:\n        case BasicJsonType::value_t::discarded:\n        {\n            return combine(type, 0);\n        }\n\n        case BasicJsonType::value_t::object:\n        {\n            auto seed = combine(type, j.size());\n            for (const auto& element : j.items())\n            {\n                const auto h = std::hash<string_t> {}(element.key());\n                seed = combine(seed, h);\n                seed = combine(seed, hash(element.value()));\n            }\n            return seed;\n        }\n\n        case BasicJsonType::value_t::array:\n        {\n            auto seed = combine(type, j.size());\n            for (const auto& element : j)\n            {\n                seed = combine(seed, hash(element));\n            }\n            return seed;\n        }\n\n        case BasicJsonType::value_t::string:\n        {\n            const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::boolean:\n        {\n            const auto h = std::hash<bool> {}(j.template get<bool>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::number_integer:\n        {\n            const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::number_unsigned:\n        {\n            const auto h = std::hash<number_unsigned_t> {}(j.template get<number_unsigned_t>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::number_float:\n        {\n            const auto h = std::hash<number_float_t> {}(j.template get<number_float_t>());\n            return combine(type, h);\n        }\n\n        case BasicJsonType::value_t::binary:\n        {\n            auto seed = combine(type, j.get_binary().size());\n            const auto h = std::hash<bool> {}(j.get_binary().has_subtype());\n            seed = combine(seed, h);\n            seed = combine(seed, static_cast<std::size_t>(j.get_binary().subtype()));\n            for (const auto byte : j.get_binary())\n            {\n                seed = combine(seed, std::hash<std::uint8_t> {}(byte));\n            }\n            return seed;\n        }\n\n        default:                   // LCOV_EXCL_LINE\n            JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n            return 0;              // LCOV_EXCL_LINE\n    }\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/input/binary_reader.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <algorithm> // generate_n\n#include <array> // array\n#include <cmath> // ldexp\n#include <cstddef> // size_t\n#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t\n#include <cstdio> // snprintf\n#include <cstring> // memcpy\n#include <iterator> // back_inserter\n#include <limits> // numeric_limits\n#include <string> // char_traits, string\n#include <utility> // make_pair, move\n#include <vector> // vector\n#ifdef __cpp_lib_byteswap\n    #include <bit>  //byteswap\n#endif\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/input/input_adapters.hpp>\n#include <nlohmann/detail/input/json_sax.hpp>\n#include <nlohmann/detail/input/lexer.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/is_sax.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/// how to treat CBOR tags\nenum class cbor_tag_handler_t\n{\n    error,   ///< throw a parse_error exception in case of a tag\n    ignore,  ///< ignore tags\n    store    ///< store tags as binary type\n};\n\n/*!\n@brief determine system byte order\n\n@return true if and only if system's byte order is little endian\n\n@note from https://stackoverflow.com/a/1001328/266378\n*/\nstatic inline bool little_endianness(int num = 1) noexcept\n{\n    return *reinterpret_cast<char*>(&num) == 1;\n}\n\n///////////////////\n// binary reader //\n///////////////////\n\n/*!\n@brief deserialization of CBOR, MessagePack, and UBJSON values\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType, InputAdapterType>>\nclass binary_reader\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using json_sax_t = SAX;\n    using char_type = typename InputAdapterType::char_type;\n    using char_int_type = typename char_traits<char_type>::int_type;\n\n  public:\n    /*!\n    @brief create a binary reader\n\n    @param[in] adapter  input adapter to read from\n    */\n    explicit binary_reader(InputAdapterType&& adapter, const input_format_t format = input_format_t::json) noexcept : ia(std::move(adapter)), input_format(format)\n    {\n        (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};\n    }\n\n    // make class move-only\n    binary_reader(const binary_reader&) = delete;\n    binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    binary_reader& operator=(const binary_reader&) = delete;\n    binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    ~binary_reader() = default;\n\n    /*!\n    @param[in] format  the binary format to parse\n    @param[in] sax_    a SAX event processor\n    @param[in] strict  whether to expect the input to be consumed completed\n    @param[in] tag_handler  how to treat CBOR tags\n\n    @return whether parsing was successful\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    bool sax_parse(const input_format_t format,\n                   json_sax_t* sax_,\n                   const bool strict = true,\n                   const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        sax = sax_;\n        bool result = false;\n\n        switch (format)\n        {\n            case input_format_t::bson:\n                result = parse_bson_internal();\n                break;\n\n            case input_format_t::cbor:\n                result = parse_cbor_internal(true, tag_handler);\n                break;\n\n            case input_format_t::msgpack:\n                result = parse_msgpack_internal();\n                break;\n\n            case input_format_t::ubjson:\n            case input_format_t::bjdata:\n                result = parse_ubjson_internal();\n                break;\n\n            case input_format_t::json: // LCOV_EXCL_LINE\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n        }\n\n        // strict mode: next byte must be EOF\n        if (result && strict)\n        {\n            if (input_format == input_format_t::ubjson || input_format == input_format_t::bjdata)\n            {\n                get_ignore_noop();\n            }\n            else\n            {\n                get();\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(current != char_traits<char_type>::eof()))\n            {\n                return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read,\n                                        exception_message(input_format, concat(\"expected end of input; last byte: 0x\", get_token_string()), \"value\"), nullptr));\n            }\n        }\n\n        return result;\n    }\n\n  private:\n    //////////\n    // BSON //\n    //////////\n\n    /*!\n    @brief Reads in a BSON-object and passes it to the SAX-parser.\n    @return whether a valid BSON-value was passed to the SAX parser\n    */\n    bool parse_bson_internal()\n    {\n        std::int32_t document_size{};\n        get_number<std::int32_t, true>(input_format_t::bson, document_size);\n\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(detail::unknown_size())))\n        {\n            return false;\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false)))\n        {\n            return false;\n        }\n\n        return sax->end_object();\n    }\n\n    /*!\n    @brief Parses a C-style string from the BSON input.\n    @param[in,out] result  A reference to the string variable where the read\n                            string is to be stored.\n    @return `true` if the \\x00-byte indicating the end of the string was\n             encountered before the EOF; false` indicates an unexpected EOF.\n    */\n    bool get_bson_cstr(string_t& result)\n    {\n        auto out = std::back_inserter(result);\n        while (true)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, \"cstring\")))\n            {\n                return false;\n            }\n            if (current == 0x00)\n            {\n                return true;\n            }\n            *out++ = static_cast<typename string_t::value_type>(current);\n        }\n    }\n\n    /*!\n    @brief Parses a zero-terminated string of length @a len from the BSON\n           input.\n    @param[in] len  The length (including the zero-byte at the end) of the\n                    string to be read.\n    @param[in,out] result  A reference to the string variable where the read\n                            string is to be stored.\n    @tparam NumberType The type of the length @a len\n    @pre len >= 1\n    @return `true` if the string was successfully parsed\n    */\n    template<typename NumberType>\n    bool get_bson_string(const NumberType len, string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(len < 1))\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                    exception_message(input_format_t::bson, concat(\"string length must be at least 1, is \", std::to_string(len)), \"string\"), nullptr));\n        }\n\n        return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != char_traits<char_type>::eof();\n    }\n\n    /*!\n    @brief Parses a byte array input of length @a len from the BSON input.\n    @param[in] len  The length of the byte array to be read.\n    @param[in,out] result  A reference to the binary variable where the read\n                            array is to be stored.\n    @tparam NumberType The type of the length @a len\n    @pre len >= 0\n    @return `true` if the byte array was successfully parsed\n    */\n    template<typename NumberType>\n    bool get_bson_binary(const NumberType len, binary_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(len < 0))\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                    exception_message(input_format_t::bson, concat(\"byte array length cannot be negative, is \", std::to_string(len)), \"binary\"), nullptr));\n        }\n\n        // All BSON binary values have a subtype\n        std::uint8_t subtype{};\n        get_number<std::uint8_t>(input_format_t::bson, subtype);\n        result.set_subtype(subtype);\n\n        return get_binary(input_format_t::bson, len, result);\n    }\n\n    /*!\n    @brief Read a BSON document element of the given @a element_type.\n    @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html\n    @param[in] element_type_parse_position The position in the input stream,\n               where the `element_type` was read.\n    @warning Not all BSON element types are supported yet. An unsupported\n             @a element_type will give rise to a parse_error.114:\n             Unsupported BSON record type 0x...\n    @return whether a valid BSON-object/array was passed to the SAX parser\n    */\n    bool parse_bson_element_internal(const char_int_type element_type,\n                                     const std::size_t element_type_parse_position)\n    {\n        switch (element_type)\n        {\n            case 0x01: // double\n            {\n                double number{};\n                return get_number<double, true>(input_format_t::bson, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0x02: // string\n            {\n                std::int32_t len{};\n                string_t value;\n                return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value);\n            }\n\n            case 0x03: // object\n            {\n                return parse_bson_internal();\n            }\n\n            case 0x04: // array\n            {\n                return parse_bson_array();\n            }\n\n            case 0x05: // binary\n            {\n                std::int32_t len{};\n                binary_t value;\n                return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value);\n            }\n\n            case 0x08: // boolean\n            {\n                return sax->boolean(get() != 0);\n            }\n\n            case 0x0A: // null\n            {\n                return sax->null();\n            }\n\n            case 0x10: // int32\n            {\n                std::int32_t value{};\n                return get_number<std::int32_t, true>(input_format_t::bson, value) && sax->number_integer(value);\n            }\n\n            case 0x12: // int64\n            {\n                std::int64_t value{};\n                return get_number<std::int64_t, true>(input_format_t::bson, value) && sax->number_integer(value);\n            }\n\n            default: // anything else not supported (yet)\n            {\n                std::array<char, 3> cr{{}};\n                static_cast<void>((std::snprintf)(cr.data(), cr.size(), \"%.2hhX\", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n                const std::string cr_str{cr.data()};\n                return sax->parse_error(element_type_parse_position, cr_str,\n                                        parse_error::create(114, element_type_parse_position, concat(\"Unsupported BSON record type 0x\", cr_str), nullptr));\n            }\n        }\n    }\n\n    /*!\n    @brief Read a BSON element list (as specified in the BSON-spec)\n\n    The same binary layout is used for objects and arrays, hence it must be\n    indicated with the argument @a is_array which one is expected\n    (true --> array, false --> object).\n\n    @param[in] is_array Determines if the element list being read is to be\n                        treated as an object (@a is_array == false), or as an\n                        array (@a is_array == true).\n    @return whether a valid BSON-object/array was passed to the SAX parser\n    */\n    bool parse_bson_element_list(const bool is_array)\n    {\n        string_t key;\n\n        while (auto element_type = get())\n        {\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, \"element list\")))\n            {\n                return false;\n            }\n\n            const std::size_t element_type_parse_position = chars_read;\n            if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key)))\n            {\n                return false;\n            }\n\n            if (!is_array && !sax->key(key))\n            {\n                return false;\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position)))\n            {\n                return false;\n            }\n\n            // get_bson_cstr only appends\n            key.clear();\n        }\n\n        return true;\n    }\n\n    /*!\n    @brief Reads an array from the BSON input and passes it to the SAX-parser.\n    @return whether a valid BSON-array was passed to the SAX parser\n    */\n    bool parse_bson_array()\n    {\n        std::int32_t document_size{};\n        get_number<std::int32_t, true>(input_format_t::bson, document_size);\n\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(detail::unknown_size())))\n        {\n            return false;\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true)))\n        {\n            return false;\n        }\n\n        return sax->end_array();\n    }\n\n    //////////\n    // CBOR //\n    //////////\n\n    /*!\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true) or whether the last read character should\n                         be considered instead (false)\n    @param[in] tag_handler how CBOR tags should be treated\n\n    @return whether a valid CBOR value was passed to the SAX parser\n    */\n    bool parse_cbor_internal(const bool get_char,\n                             const cbor_tag_handler_t tag_handler)\n    {\n        switch (get_char ? get() : current)\n        {\n            // EOF\n            case char_traits<char_type>::eof():\n                return unexpect_eof(input_format_t::cbor, \"value\");\n\n            // Integer 0x00..0x17 (0..23)\n            case 0x00:\n            case 0x01:\n            case 0x02:\n            case 0x03:\n            case 0x04:\n            case 0x05:\n            case 0x06:\n            case 0x07:\n            case 0x08:\n            case 0x09:\n            case 0x0A:\n            case 0x0B:\n            case 0x0C:\n            case 0x0D:\n            case 0x0E:\n            case 0x0F:\n            case 0x10:\n            case 0x11:\n            case 0x12:\n            case 0x13:\n            case 0x14:\n            case 0x15:\n            case 0x16:\n            case 0x17:\n                return sax->number_unsigned(static_cast<number_unsigned_t>(current));\n\n            case 0x18: // Unsigned integer (one-byte uint8_t follows)\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x19: // Unsigned integer (two-byte uint16_t follows)\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x1A: // Unsigned integer (four-byte uint32_t follows)\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            case 0x1B: // Unsigned integer (eight-byte uint64_t follows)\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);\n            }\n\n            // Negative integer -1-0x00..-1-0x17 (-1..-24)\n            case 0x20:\n            case 0x21:\n            case 0x22:\n            case 0x23:\n            case 0x24:\n            case 0x25:\n            case 0x26:\n            case 0x27:\n            case 0x28:\n            case 0x29:\n            case 0x2A:\n            case 0x2B:\n            case 0x2C:\n            case 0x2D:\n            case 0x2E:\n            case 0x2F:\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n                return sax->number_integer(static_cast<std::int8_t>(0x20 - 1 - current));\n\n            case 0x38: // Negative integer (one-byte uint8_t follows)\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x39: // Negative integer -1-n (two-byte uint16_t follows)\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x3A: // Negative integer -1-n (four-byte uint32_t follows)\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);\n            }\n\n            case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows)\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1)\n                        - static_cast<number_integer_t>(number));\n            }\n\n            // Binary data (0x00..0x17 bytes follow)\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            case 0x58: // Binary data (one-byte uint8_t for n follows)\n            case 0x59: // Binary data (two-byte uint16_t for n follow)\n            case 0x5A: // Binary data (four-byte uint32_t for n follow)\n            case 0x5B: // Binary data (eight-byte uint64_t for n follow)\n            case 0x5F: // Binary data (indefinite length)\n            {\n                binary_t b;\n                return get_cbor_binary(b) && sax->binary(b);\n            }\n\n            // UTF-8 string (0x00..0x17 bytes follow)\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            case 0x78: // UTF-8 string (one-byte uint8_t for n follows)\n            case 0x79: // UTF-8 string (two-byte uint16_t for n follow)\n            case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)\n            case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)\n            case 0x7F: // UTF-8 string (indefinite length)\n            {\n                string_t s;\n                return get_cbor_string(s) && sax->string(s);\n            }\n\n            // array (0x00..0x17 data items follow)\n            case 0x80:\n            case 0x81:\n            case 0x82:\n            case 0x83:\n            case 0x84:\n            case 0x85:\n            case 0x86:\n            case 0x87:\n            case 0x88:\n            case 0x89:\n            case 0x8A:\n            case 0x8B:\n            case 0x8C:\n            case 0x8D:\n            case 0x8E:\n            case 0x8F:\n            case 0x90:\n            case 0x91:\n            case 0x92:\n            case 0x93:\n            case 0x94:\n            case 0x95:\n            case 0x96:\n            case 0x97:\n                return get_cbor_array(\n                           conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);\n\n            case 0x98: // array (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x99: // array (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9A: // array (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9B: // array (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0x9F: // array (indefinite length)\n                return get_cbor_array(detail::unknown_size(), tag_handler);\n\n            // map (0x00..0x17 pairs of data items follow)\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\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                return get_cbor_object(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);\n\n            case 0xB8: // map (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xB9: // map (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBA: // map (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBB: // map (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler);\n            }\n\n            case 0xBF: // map (indefinite length)\n                return get_cbor_object(detail::unknown_size(), tag_handler);\n\n            case 0xC6: // tagged item\n            case 0xC7:\n            case 0xC8:\n            case 0xC9:\n            case 0xCA:\n            case 0xCB:\n            case 0xCC:\n            case 0xCD:\n            case 0xCE:\n            case 0xCF:\n            case 0xD0:\n            case 0xD1:\n            case 0xD2:\n            case 0xD3:\n            case 0xD4:\n            case 0xD8: // tagged item (1 bytes follow)\n            case 0xD9: // tagged item (2 bytes follow)\n            case 0xDA: // tagged item (4 bytes follow)\n            case 0xDB: // tagged item (8 bytes follow)\n            {\n                switch (tag_handler)\n                {\n                    case cbor_tag_handler_t::error:\n                    {\n                        auto last_token = get_token_string();\n                        return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                                exception_message(input_format_t::cbor, concat(\"invalid byte: 0x\", last_token), \"value\"), nullptr));\n                    }\n\n                    case cbor_tag_handler_t::ignore:\n                    {\n                        // ignore binary subtype\n                        switch (current)\n                        {\n                            case 0xD8:\n                            {\n                                std::uint8_t subtype_to_ignore{};\n                                get_number(input_format_t::cbor, subtype_to_ignore);\n                                break;\n                            }\n                            case 0xD9:\n                            {\n                                std::uint16_t subtype_to_ignore{};\n                                get_number(input_format_t::cbor, subtype_to_ignore);\n                                break;\n                            }\n                            case 0xDA:\n                            {\n                                std::uint32_t subtype_to_ignore{};\n                                get_number(input_format_t::cbor, subtype_to_ignore);\n                                break;\n                            }\n                            case 0xDB:\n                            {\n                                std::uint64_t subtype_to_ignore{};\n                                get_number(input_format_t::cbor, subtype_to_ignore);\n                                break;\n                            }\n                            default:\n                                break;\n                        }\n                        return parse_cbor_internal(true, tag_handler);\n                    }\n\n                    case cbor_tag_handler_t::store:\n                    {\n                        binary_t b;\n                        // use binary subtype and store in binary container\n                        switch (current)\n                        {\n                            case 0xD8:\n                            {\n                                std::uint8_t subtype{};\n                                get_number(input_format_t::cbor, subtype);\n                                b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));\n                                break;\n                            }\n                            case 0xD9:\n                            {\n                                std::uint16_t subtype{};\n                                get_number(input_format_t::cbor, subtype);\n                                b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));\n                                break;\n                            }\n                            case 0xDA:\n                            {\n                                std::uint32_t subtype{};\n                                get_number(input_format_t::cbor, subtype);\n                                b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));\n                                break;\n                            }\n                            case 0xDB:\n                            {\n                                std::uint64_t subtype{};\n                                get_number(input_format_t::cbor, subtype);\n                                b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));\n                                break;\n                            }\n                            default:\n                                return parse_cbor_internal(true, tag_handler);\n                        }\n                        get();\n                        return get_cbor_binary(b) && sax->binary(b);\n                    }\n\n                    default:                 // LCOV_EXCL_LINE\n                        JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n                        return false;        // LCOV_EXCL_LINE\n                }\n            }\n\n            case 0xF4: // false\n                return sax->boolean(false);\n\n            case 0xF5: // true\n                return sax->boolean(true);\n\n            case 0xF6: // null\n                return sax->null();\n\n            case 0xF9: // Half-Precision Float (two-byte IEEE 754)\n            {\n                const auto byte1_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"number\")))\n                {\n                    return false;\n                }\n                const auto byte2_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"number\")))\n                {\n                    return false;\n                }\n\n                const auto byte1 = static_cast<unsigned char>(byte1_raw);\n                const auto byte2 = static_cast<unsigned char>(byte2_raw);\n\n                // code from RFC 7049, Appendix D, Figure 3:\n                // As half-precision floating-point numbers were only added\n                // to IEEE 754 in 2008, today's programming platforms often\n                // still only have limited support for them. It is very\n                // easy to include at least decoding support for them even\n                // without such support. An example of a small decoder for\n                // half-precision floating-point numbers in the C language\n                // is shown in Fig. 3.\n                const auto half = static_cast<unsigned int>((byte1 << 8u) + byte2);\n                const double val = [&half]\n                {\n                    const int exp = (half >> 10u) & 0x1Fu;\n                    const unsigned int mant = half & 0x3FFu;\n                    JSON_ASSERT(0 <= exp&& exp <= 32);\n                    JSON_ASSERT(mant <= 1024);\n                    switch (exp)\n                    {\n                        case 0:\n                            return std::ldexp(mant, -24);\n                        case 31:\n                            return (mant == 0)\n                            ? std::numeric_limits<double>::infinity()\n                            : std::numeric_limits<double>::quiet_NaN();\n                        default:\n                            return std::ldexp(mant + 1024, exp - 25);\n                    }\n                }();\n                return sax->number_float((half & 0x8000u) != 0\n                                         ? static_cast<number_float_t>(-val)\n                                         : static_cast<number_float_t>(val), \"\");\n            }\n\n            case 0xFA: // Single-Precision Float (four-byte IEEE 754)\n            {\n                float number{};\n                return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xFB: // Double-Precision Float (eight-byte IEEE 754)\n            {\n                double number{};\n                return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            default: // anything else (0xFF is handled inside the other types)\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                        exception_message(input_format_t::cbor, concat(\"invalid byte: 0x\", last_token), \"value\"), nullptr));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a CBOR string\n\n    This function first reads starting bytes to determine the expected\n    string length and then copies this number of bytes into a string.\n    Additionally, CBOR's strings with indefinite lengths are supported.\n\n    @param[out] result  created string\n\n    @return whether string creation completed\n    */\n    bool get_cbor_string(string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"string\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // UTF-8 string (0x00..0x17 bytes follow)\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            {\n                return get_string(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0x78: // UTF-8 string (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x79: // UTF-8 string (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);\n            }\n\n            case 0x7F: // UTF-8 string (indefinite length)\n            {\n                while (get() != 0xFF)\n                {\n                    string_t chunk;\n                    if (!get_cbor_string(chunk))\n                    {\n                        return false;\n                    }\n                    result.append(chunk);\n                }\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,\n                                        exception_message(input_format_t::cbor, concat(\"expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x\", last_token), \"string\"), nullptr));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a CBOR byte array\n\n    This function first reads starting bytes to determine the expected\n    byte array length and then copies this number of bytes into the byte array.\n    Additionally, CBOR's byte arrays with indefinite lengths are supported.\n\n    @param[out] result  created byte array\n\n    @return whether byte array creation completed\n    */\n    bool get_cbor_binary(binary_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, \"binary\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // Binary data (0x00..0x17 bytes follow)\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            {\n                return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0x58: // Binary data (one-byte uint8_t for n follows)\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x59: // Binary data (two-byte uint16_t for n follow)\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5A: // Binary data (four-byte uint32_t for n follow)\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5B: // Binary data (eight-byte uint64_t for n follow)\n            {\n                std::uint64_t len{};\n                return get_number(input_format_t::cbor, len) &&\n                       get_binary(input_format_t::cbor, len, result);\n            }\n\n            case 0x5F: // Binary data (indefinite length)\n            {\n                while (get() != 0xFF)\n                {\n                    binary_t chunk;\n                    if (!get_cbor_binary(chunk))\n                    {\n                        return false;\n                    }\n                    result.insert(result.end(), chunk.begin(), chunk.end());\n                }\n                return true;\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,\n                                        exception_message(input_format_t::cbor, concat(\"expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x\", last_token), \"binary\"), nullptr));\n            }\n        }\n    }\n\n    /*!\n    @param[in] len  the length of the array or detail::unknown_size() for an\n                    array of indefinite size\n    @param[in] tag_handler how CBOR tags should be treated\n    @return whether array creation completed\n    */\n    bool get_cbor_array(const std::size_t len,\n                        const cbor_tag_handler_t tag_handler)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))\n        {\n            return false;\n        }\n\n        if (len != detail::unknown_size())\n        {\n            for (std::size_t i = 0; i < len; ++i)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                {\n                    return false;\n                }\n            }\n        }\n        else\n        {\n            while (get() != 0xFF)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler)))\n                {\n                    return false;\n                }\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @param[in] len  the length of the object or detail::unknown_size() for an\n                    object of indefinite size\n    @param[in] tag_handler how CBOR tags should be treated\n    @return whether object creation completed\n    */\n    bool get_cbor_object(const std::size_t len,\n                         const cbor_tag_handler_t tag_handler)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))\n        {\n            return false;\n        }\n\n        if (len != 0)\n        {\n            string_t key;\n            if (len != detail::unknown_size())\n            {\n                for (std::size_t i = 0; i < len; ++i)\n                {\n                    get();\n                    if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n\n                    if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n            else\n            {\n                while (get() != 0xFF)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n\n                    if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n        }\n\n        return sax->end_object();\n    }\n\n    /////////////\n    // MsgPack //\n    /////////////\n\n    /*!\n    @return whether a valid MessagePack value was passed to the SAX parser\n    */\n    bool parse_msgpack_internal()\n    {\n        switch (get())\n        {\n            // EOF\n            case char_traits<char_type>::eof():\n                return unexpect_eof(input_format_t::msgpack, \"value\");\n\n            // positive fixint\n            case 0x00:\n            case 0x01:\n            case 0x02:\n            case 0x03:\n            case 0x04:\n            case 0x05:\n            case 0x06:\n            case 0x07:\n            case 0x08:\n            case 0x09:\n            case 0x0A:\n            case 0x0B:\n            case 0x0C:\n            case 0x0D:\n            case 0x0E:\n            case 0x0F:\n            case 0x10:\n            case 0x11:\n            case 0x12:\n            case 0x13:\n            case 0x14:\n            case 0x15:\n            case 0x16:\n            case 0x17:\n            case 0x18:\n            case 0x19:\n            case 0x1A:\n            case 0x1B:\n            case 0x1C:\n            case 0x1D:\n            case 0x1E:\n            case 0x1F:\n            case 0x20:\n            case 0x21:\n            case 0x22:\n            case 0x23:\n            case 0x24:\n            case 0x25:\n            case 0x26:\n            case 0x27:\n            case 0x28:\n            case 0x29:\n            case 0x2A:\n            case 0x2B:\n            case 0x2C:\n            case 0x2D:\n            case 0x2E:\n            case 0x2F:\n            case 0x30:\n            case 0x31:\n            case 0x32:\n            case 0x33:\n            case 0x34:\n            case 0x35:\n            case 0x36:\n            case 0x37:\n            case 0x38:\n            case 0x39:\n            case 0x3A:\n            case 0x3B:\n            case 0x3C:\n            case 0x3D:\n            case 0x3E:\n            case 0x3F:\n            case 0x40:\n            case 0x41:\n            case 0x42:\n            case 0x43:\n            case 0x44:\n            case 0x45:\n            case 0x46:\n            case 0x47:\n            case 0x48:\n            case 0x49:\n            case 0x4A:\n            case 0x4B:\n            case 0x4C:\n            case 0x4D:\n            case 0x4E:\n            case 0x4F:\n            case 0x50:\n            case 0x51:\n            case 0x52:\n            case 0x53:\n            case 0x54:\n            case 0x55:\n            case 0x56:\n            case 0x57:\n            case 0x58:\n            case 0x59:\n            case 0x5A:\n            case 0x5B:\n            case 0x5C:\n            case 0x5D:\n            case 0x5E:\n            case 0x5F:\n            case 0x60:\n            case 0x61:\n            case 0x62:\n            case 0x63:\n            case 0x64:\n            case 0x65:\n            case 0x66:\n            case 0x67:\n            case 0x68:\n            case 0x69:\n            case 0x6A:\n            case 0x6B:\n            case 0x6C:\n            case 0x6D:\n            case 0x6E:\n            case 0x6F:\n            case 0x70:\n            case 0x71:\n            case 0x72:\n            case 0x73:\n            case 0x74:\n            case 0x75:\n            case 0x76:\n            case 0x77:\n            case 0x78:\n            case 0x79:\n            case 0x7A:\n            case 0x7B:\n            case 0x7C:\n            case 0x7D:\n            case 0x7E:\n            case 0x7F:\n                return sax->number_unsigned(static_cast<number_unsigned_t>(current));\n\n            // fixmap\n            case 0x80:\n            case 0x81:\n            case 0x82:\n            case 0x83:\n            case 0x84:\n            case 0x85:\n            case 0x86:\n            case 0x87:\n            case 0x88:\n            case 0x89:\n            case 0x8A:\n            case 0x8B:\n            case 0x8C:\n            case 0x8D:\n            case 0x8E:\n            case 0x8F:\n                return get_msgpack_object(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));\n\n            // fixarray\n            case 0x90:\n            case 0x91:\n            case 0x92:\n            case 0x93:\n            case 0x94:\n            case 0x95:\n            case 0x96:\n            case 0x97:\n            case 0x98:\n            case 0x99:\n            case 0x9A:\n            case 0x9B:\n            case 0x9C:\n            case 0x9D:\n            case 0x9E:\n            case 0x9F:\n                return get_msgpack_array(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));\n\n            // fixstr\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\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            case 0xB8:\n            case 0xB9:\n            case 0xBA:\n            case 0xBB:\n            case 0xBC:\n            case 0xBD:\n            case 0xBE:\n            case 0xBF:\n            case 0xD9: // str 8\n            case 0xDA: // str 16\n            case 0xDB: // str 32\n            {\n                string_t s;\n                return get_msgpack_string(s) && sax->string(s);\n            }\n\n            case 0xC0: // nil\n                return sax->null();\n\n            case 0xC2: // false\n                return sax->boolean(false);\n\n            case 0xC3: // true\n                return sax->boolean(true);\n\n            case 0xC4: // bin 8\n            case 0xC5: // bin 16\n            case 0xC6: // bin 32\n            case 0xC7: // ext 8\n            case 0xC8: // ext 16\n            case 0xC9: // ext 32\n            case 0xD4: // fixext 1\n            case 0xD5: // fixext 2\n            case 0xD6: // fixext 4\n            case 0xD7: // fixext 8\n            case 0xD8: // fixext 16\n            {\n                binary_t b;\n                return get_msgpack_binary(b) && sax->binary(b);\n            }\n\n            case 0xCA: // float 32\n            {\n                float number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xCB: // float 64\n            {\n                double number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 0xCC: // uint 8\n            {\n                std::uint8_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCD: // uint 16\n            {\n                std::uint16_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCE: // uint 32\n            {\n                std::uint32_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xCF: // uint 64\n            {\n                std::uint64_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);\n            }\n\n            case 0xD0: // int 8\n            {\n                std::int8_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD1: // int 16\n            {\n                std::int16_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD2: // int 32\n            {\n                std::int32_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xD3: // int 64\n            {\n                std::int64_t number{};\n                return get_number(input_format_t::msgpack, number) && sax->number_integer(number);\n            }\n\n            case 0xDC: // array 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));\n            }\n\n            case 0xDD: // array 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_array(conditional_static_cast<std::size_t>(len));\n            }\n\n            case 0xDE: // map 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));\n            }\n\n            case 0xDF: // map 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_msgpack_object(conditional_static_cast<std::size_t>(len));\n            }\n\n            // negative fixint\n            case 0xE0:\n            case 0xE1:\n            case 0xE2:\n            case 0xE3:\n            case 0xE4:\n            case 0xE5:\n            case 0xE6:\n            case 0xE7:\n            case 0xE8:\n            case 0xE9:\n            case 0xEA:\n            case 0xEB:\n            case 0xEC:\n            case 0xED:\n            case 0xEE:\n            case 0xEF:\n            case 0xF0:\n            case 0xF1:\n            case 0xF2:\n            case 0xF3:\n            case 0xF4:\n            case 0xF5:\n            case 0xF6:\n            case 0xF7:\n            case 0xF8:\n            case 0xF9:\n            case 0xFA:\n            case 0xFB:\n            case 0xFC:\n            case 0xFD:\n            case 0xFE:\n            case 0xFF:\n                return sax->number_integer(static_cast<std::int8_t>(current));\n\n            default: // anything else\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                        exception_message(input_format_t::msgpack, concat(\"invalid byte: 0x\", last_token), \"value\"), nullptr));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a MessagePack string\n\n    This function first reads starting bytes to determine the expected\n    string length and then copies this number of bytes into a string.\n\n    @param[out] result  created string\n\n    @return whether string creation completed\n    */\n    bool get_msgpack_string(string_t& result)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, \"string\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            // fixstr\n            case 0xA0:\n            case 0xA1:\n            case 0xA2:\n            case 0xA3:\n            case 0xA4:\n            case 0xA5:\n            case 0xA6:\n            case 0xA7:\n            case 0xA8:\n            case 0xA9:\n            case 0xAA:\n            case 0xAB:\n            case 0xAC:\n            case 0xAD:\n            case 0xAE:\n            case 0xAF:\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            case 0xB8:\n            case 0xB9:\n            case 0xBA:\n            case 0xBB:\n            case 0xBC:\n            case 0xBD:\n            case 0xBE:\n            case 0xBF:\n            {\n                return get_string(input_format_t::msgpack, static_cast<unsigned int>(current) & 0x1Fu, result);\n            }\n\n            case 0xD9: // str 8\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            case 0xDA: // str 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            case 0xDB: // str 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);\n            }\n\n            default:\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,\n                                        exception_message(input_format_t::msgpack, concat(\"expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x\", last_token), \"string\"), nullptr));\n            }\n        }\n    }\n\n    /*!\n    @brief reads a MessagePack byte array\n\n    This function first reads starting bytes to determine the expected\n    byte array length and then copies this number of bytes into a byte array.\n\n    @param[out] result  created byte array\n\n    @return whether byte array creation completed\n    */\n    bool get_msgpack_binary(binary_t& result)\n    {\n        // helper function to set the subtype\n        auto assign_and_return_true = [&result](std::int8_t subtype)\n        {\n            result.set_subtype(static_cast<std::uint8_t>(subtype));\n            return true;\n        };\n\n        switch (current)\n        {\n            case 0xC4: // bin 8\n            {\n                std::uint8_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC5: // bin 16\n            {\n                std::uint16_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC6: // bin 32\n            {\n                std::uint32_t len{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_binary(input_format_t::msgpack, len, result);\n            }\n\n            case 0xC7: // ext 8\n            {\n                std::uint8_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xC8: // ext 16\n            {\n                std::uint16_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xC9: // ext 32\n            {\n                std::uint32_t len{};\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, len) &&\n                       get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, len, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD4: // fixext 1\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 1, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD5: // fixext 2\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 2, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD6: // fixext 4\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 4, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD7: // fixext 8\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 8, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            case 0xD8: // fixext 16\n            {\n                std::int8_t subtype{};\n                return get_number(input_format_t::msgpack, subtype) &&\n                       get_binary(input_format_t::msgpack, 16, result) &&\n                       assign_and_return_true(subtype);\n            }\n\n            default:           // LCOV_EXCL_LINE\n                return false;  // LCOV_EXCL_LINE\n        }\n    }\n\n    /*!\n    @param[in] len  the length of the array\n    @return whether array creation completed\n    */\n    bool get_msgpack_array(const std::size_t len)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))\n        {\n            return false;\n        }\n\n        for (std::size_t i = 0; i < len; ++i)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))\n            {\n                return false;\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @param[in] len  the length of the object\n    @return whether object creation completed\n    */\n    bool get_msgpack_object(const std::size_t len)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))\n        {\n            return false;\n        }\n\n        string_t key;\n        for (std::size_t i = 0; i < len; ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key)))\n            {\n                return false;\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))\n            {\n                return false;\n            }\n            key.clear();\n        }\n\n        return sax->end_object();\n    }\n\n    ////////////\n    // UBJSON //\n    ////////////\n\n    /*!\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true, default) or whether the last read\n                         character should be considered instead\n\n    @return whether a valid UBJSON value was passed to the SAX parser\n    */\n    bool parse_ubjson_internal(const bool get_char = true)\n    {\n        return get_ubjson_value(get_char ? get_ignore_noop() : current);\n    }\n\n    /*!\n    @brief reads a UBJSON string\n\n    This function is either called after reading the 'S' byte explicitly\n    indicating a string, or in case of an object key where the 'S' byte can be\n    left out.\n\n    @param[out] result   created string\n    @param[in] get_char  whether a new character should be retrieved from the\n                         input (true, default) or whether the last read\n                         character should be considered instead\n\n    @return whether string creation completed\n    */\n    bool get_ubjson_string(string_t& result, const bool get_char = true)\n    {\n        if (get_char)\n        {\n            get();  // TODO(niels): may we ignore N here?\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"value\")))\n        {\n            return false;\n        }\n\n        switch (current)\n        {\n            case 'U':\n            {\n                std::uint8_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'i':\n            {\n                std::int8_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'I':\n            {\n                std::int16_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'l':\n            {\n                std::int32_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'L':\n            {\n                std::int64_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'u':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint16_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'm':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint32_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            case 'M':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint64_t len{};\n                return get_number(input_format, len) && get_string(input_format, len, result);\n            }\n\n            default:\n                break;\n        }\n        auto last_token = get_token_string();\n        std::string message;\n\n        if (input_format != input_format_t::bjdata)\n        {\n            message = \"expected length type specification (U, i, I, l, L); last byte: 0x\" + last_token;\n        }\n        else\n        {\n            message = \"expected length type specification (U, i, u, I, m, l, M, L); last byte: 0x\" + last_token;\n        }\n        return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, \"string\"), nullptr));\n    }\n\n    /*!\n    @param[out] dim  an integer vector storing the ND array dimensions\n    @return whether reading ND array size vector is successful\n    */\n    bool get_ubjson_ndarray_size(std::vector<size_t>& dim)\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        size_t dimlen = 0;\n        bool no_ndarray = true;\n\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type, no_ndarray)))\n        {\n            return false;\n        }\n\n        if (size_and_type.first != npos)\n        {\n            if (size_and_type.second != 0)\n            {\n                if (size_and_type.second != 'N')\n                {\n                    for (std::size_t i = 0; i < size_and_type.first; ++i)\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, size_and_type.second)))\n                        {\n                            return false;\n                        }\n                        dim.push_back(dimlen);\n                    }\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray)))\n                    {\n                        return false;\n                    }\n                    dim.push_back(dimlen);\n                }\n            }\n        }\n        else\n        {\n            while (current != ']')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, current)))\n                {\n                    return false;\n                }\n                dim.push_back(dimlen);\n                get_ignore_noop();\n            }\n        }\n        return true;\n    }\n\n    /*!\n    @param[out] result  determined size\n    @param[in,out] is_ndarray  for input, `true` means already inside an ndarray vector\n                               or ndarray dimension is not allowed; `false` means ndarray\n                               is allowed; for output, `true` means an ndarray is found;\n                               is_ndarray can only return `true` when its initial value\n                               is `false`\n    @param[in] prefix  type marker if already read, otherwise set to 0\n\n    @return whether size determination completed\n    */\n    bool get_ubjson_size_value(std::size_t& result, bool& is_ndarray, char_int_type prefix = 0)\n    {\n        if (prefix == 0)\n        {\n            prefix = get_ignore_noop();\n        }\n\n        switch (prefix)\n        {\n            case 'U':\n            {\n                std::uint8_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'i':\n            {\n                std::int8_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                if (number < 0)\n                {\n                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,\n                                            exception_message(input_format, \"count in an optimized container must be positive\", \"size\"), nullptr));\n                }\n                result = static_cast<std::size_t>(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char\n                return true;\n            }\n\n            case 'I':\n            {\n                std::int16_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                if (number < 0)\n                {\n                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,\n                                            exception_message(input_format, \"count in an optimized container must be positive\", \"size\"), nullptr));\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'l':\n            {\n                std::int32_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                if (number < 0)\n                {\n                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,\n                                            exception_message(input_format, \"count in an optimized container must be positive\", \"size\"), nullptr));\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'L':\n            {\n                std::int64_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                if (number < 0)\n                {\n                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,\n                                            exception_message(input_format, \"count in an optimized container must be positive\", \"size\"), nullptr));\n                }\n                if (!value_in_range_of<std::size_t>(number))\n                {\n                    return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408,\n                                            exception_message(input_format, \"integer value overflow\", \"size\"), nullptr));\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'u':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint16_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                result = static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'm':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint32_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                result = conditional_static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case 'M':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint64_t number{};\n                if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))\n                {\n                    return false;\n                }\n                if (!value_in_range_of<std::size_t>(number))\n                {\n                    return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408,\n                                            exception_message(input_format, \"integer value overflow\", \"size\"), nullptr));\n                }\n                result = detail::conditional_static_cast<std::size_t>(number);\n                return true;\n            }\n\n            case '[':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                if (is_ndarray) // ndarray dimensional vector can only contain integers, and can not embed another array\n                {\n                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, \"ndarray dimensional vector is not allowed\", \"size\"), nullptr));\n                }\n                std::vector<size_t> dim;\n                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_ndarray_size(dim)))\n                {\n                    return false;\n                }\n                if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1)) // return normal array size if 1D row vector\n                {\n                    result = dim.at(dim.size() - 1);\n                    return true;\n                }\n                if (!dim.empty())  // if ndarray, convert to an object in JData annotated array format\n                {\n                    for (auto i : dim) // test if any dimension in an ndarray is 0, if so, return a 1D empty container\n                    {\n                        if ( i == 0 )\n                        {\n                            result = 0;\n                            return true;\n                        }\n                    }\n\n                    string_t key = \"_ArraySize_\";\n                    if (JSON_HEDLEY_UNLIKELY(!sax->start_object(3) || !sax->key(key) || !sax->start_array(dim.size())))\n                    {\n                        return false;\n                    }\n                    result = 1;\n                    for (auto i : dim)\n                    {\n                        result *= i;\n                        if (result == 0 || result == npos) // because dim elements shall not have zeros, result = 0 means overflow happened; it also can't be npos as it is used to initialize size in get_ubjson_size_type()\n                        {\n                            return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, exception_message(input_format, \"excessive ndarray size caused overflow\", \"size\"), nullptr));\n                        }\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(static_cast<number_unsigned_t>(i))))\n                        {\n                            return false;\n                        }\n                    }\n                    is_ndarray = true;\n                    return sax->end_array();\n                }\n                result = 0;\n                return true;\n            }\n\n            default:\n                break;\n        }\n        auto last_token = get_token_string();\n        std::string message;\n\n        if (input_format != input_format_t::bjdata)\n        {\n            message = \"expected length type specification (U, i, I, l, L) after '#'; last byte: 0x\" + last_token;\n        }\n        else\n        {\n            message = \"expected length type specification (U, i, u, I, m, l, M, L) after '#'; last byte: 0x\" + last_token;\n        }\n        return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, \"size\"), nullptr));\n    }\n\n    /*!\n    @brief determine the type and size for a container\n\n    In the optimized UBJSON format, a type and a size can be provided to allow\n    for a more compact representation.\n\n    @param[out] result  pair of the size and the type\n    @param[in] inside_ndarray  whether the parser is parsing an ND array dimensional vector\n\n    @return whether pair creation completed\n    */\n    bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result, bool inside_ndarray = false)\n    {\n        result.first = npos; // size\n        result.second = 0; // type\n        bool is_ndarray = false;\n\n        get_ignore_noop();\n\n        if (current == '$')\n        {\n            result.second = get();  // must not ignore 'N', because 'N' maybe the type\n            if (input_format == input_format_t::bjdata\n                    && JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second)))\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                        exception_message(input_format, concat(\"marker 0x\", last_token, \" is not a permitted optimized array type\"), \"type\"), nullptr));\n            }\n\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"type\")))\n            {\n                return false;\n            }\n\n            get_ignore_noop();\n            if (JSON_HEDLEY_UNLIKELY(current != '#'))\n            {\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"value\")))\n                {\n                    return false;\n                }\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                        exception_message(input_format, concat(\"expected '#' after type information; last byte: 0x\", last_token), \"size\"), nullptr));\n            }\n\n            const bool is_error = get_ubjson_size_value(result.first, is_ndarray);\n            if (input_format == input_format_t::bjdata && is_ndarray)\n            {\n                if (inside_ndarray)\n                {\n                    return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,\n                                            exception_message(input_format, \"ndarray can not be recursive\", \"size\"), nullptr));\n                }\n                result.second |= (1 << 8); // use bit 8 to indicate ndarray, all UBJSON and BJData markers should be ASCII letters\n            }\n            return is_error;\n        }\n\n        if (current == '#')\n        {\n            const bool is_error = get_ubjson_size_value(result.first, is_ndarray);\n            if (input_format == input_format_t::bjdata && is_ndarray)\n            {\n                return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,\n                                        exception_message(input_format, \"ndarray requires both type and size\", \"size\"), nullptr));\n            }\n            return is_error;\n        }\n\n        return true;\n    }\n\n    /*!\n    @param prefix  the previously read or set type prefix\n    @return whether value creation completed\n    */\n    bool get_ubjson_value(const char_int_type prefix)\n    {\n        switch (prefix)\n        {\n            case char_traits<char_type>::eof():  // EOF\n                return unexpect_eof(input_format, \"value\");\n\n            case 'T':  // true\n                return sax->boolean(true);\n            case 'F':  // false\n                return sax->boolean(false);\n\n            case 'Z':  // null\n                return sax->null();\n\n            case 'B':  // byte\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint8_t number{};\n                return get_number(input_format, number) && sax->number_unsigned(number);\n            }\n\n            case 'U':\n            {\n                std::uint8_t number{};\n                return get_number(input_format, number) && sax->number_unsigned(number);\n            }\n\n            case 'i':\n            {\n                std::int8_t number{};\n                return get_number(input_format, number) && sax->number_integer(number);\n            }\n\n            case 'I':\n            {\n                std::int16_t number{};\n                return get_number(input_format, number) && sax->number_integer(number);\n            }\n\n            case 'l':\n            {\n                std::int32_t number{};\n                return get_number(input_format, number) && sax->number_integer(number);\n            }\n\n            case 'L':\n            {\n                std::int64_t number{};\n                return get_number(input_format, number) && sax->number_integer(number);\n            }\n\n            case 'u':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint16_t number{};\n                return get_number(input_format, number) && sax->number_unsigned(number);\n            }\n\n            case 'm':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint32_t number{};\n                return get_number(input_format, number) && sax->number_unsigned(number);\n            }\n\n            case 'M':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                std::uint64_t number{};\n                return get_number(input_format, number) && sax->number_unsigned(number);\n            }\n\n            case 'h':\n            {\n                if (input_format != input_format_t::bjdata)\n                {\n                    break;\n                }\n                const auto byte1_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"number\")))\n                {\n                    return false;\n                }\n                const auto byte2_raw = get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"number\")))\n                {\n                    return false;\n                }\n\n                const auto byte1 = static_cast<unsigned char>(byte1_raw);\n                const auto byte2 = static_cast<unsigned char>(byte2_raw);\n\n                // code from RFC 7049, Appendix D, Figure 3:\n                // As half-precision floating-point numbers were only added\n                // to IEEE 754 in 2008, today's programming platforms often\n                // still only have limited support for them. It is very\n                // easy to include at least decoding support for them even\n                // without such support. An example of a small decoder for\n                // half-precision floating-point numbers in the C language\n                // is shown in Fig. 3.\n                const auto half = static_cast<unsigned int>((byte2 << 8u) + byte1);\n                const double val = [&half]\n                {\n                    const int exp = (half >> 10u) & 0x1Fu;\n                    const unsigned int mant = half & 0x3FFu;\n                    JSON_ASSERT(0 <= exp&& exp <= 32);\n                    JSON_ASSERT(mant <= 1024);\n                    switch (exp)\n                    {\n                        case 0:\n                            return std::ldexp(mant, -24);\n                        case 31:\n                            return (mant == 0)\n                            ? std::numeric_limits<double>::infinity()\n                            : std::numeric_limits<double>::quiet_NaN();\n                        default:\n                            return std::ldexp(mant + 1024, exp - 25);\n                    }\n                }();\n                return sax->number_float((half & 0x8000u) != 0\n                                         ? static_cast<number_float_t>(-val)\n                                         : static_cast<number_float_t>(val), \"\");\n            }\n\n            case 'd':\n            {\n                float number{};\n                return get_number(input_format, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 'D':\n            {\n                double number{};\n                return get_number(input_format, number) && sax->number_float(static_cast<number_float_t>(number), \"\");\n            }\n\n            case 'H':\n            {\n                return get_ubjson_high_precision_number();\n            }\n\n            case 'C':  // char\n            {\n                get();\n                if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"char\")))\n                {\n                    return false;\n                }\n                if (JSON_HEDLEY_UNLIKELY(current > 127))\n                {\n                    auto last_token = get_token_string();\n                    return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,\n                                            exception_message(input_format, concat(\"byte after 'C' must be in range 0x00..0x7F; last byte: 0x\", last_token), \"char\"), nullptr));\n                }\n                string_t s(1, static_cast<typename string_t::value_type>(current));\n                return sax->string(s);\n            }\n\n            case 'S':  // string\n            {\n                string_t s;\n                return get_ubjson_string(s) && sax->string(s);\n            }\n\n            case '[':  // array\n                return get_ubjson_array();\n\n            case '{':  // object\n                return get_ubjson_object();\n\n            default: // anything else\n                break;\n        }\n        auto last_token = get_token_string();\n        return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format, \"invalid byte: 0x\" + last_token, \"value\"), nullptr));\n    }\n\n    /*!\n    @return whether array creation completed\n    */\n    bool get_ubjson_array()\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))\n        {\n            return false;\n        }\n\n        // if bit-8 of size_and_type.second is set to 1, encode bjdata ndarray as an object in JData annotated array format (https://github.com/NeuroJSON/jdata):\n        // {\"_ArrayType_\" : \"typeid\", \"_ArraySize_\" : [n1, n2, ...], \"_ArrayData_\" : [v1, v2, ...]}\n\n        if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0)\n        {\n            size_and_type.second &= ~(static_cast<char_int_type>(1) << 8);  // use bit 8 to indicate ndarray, here we remove the bit to restore the type marker\n            auto it = std::lower_bound(bjd_types_map.begin(), bjd_types_map.end(), size_and_type.second, [](const bjd_type & p, char_int_type t)\n            {\n                return p.first < t;\n            });\n            string_t key = \"_ArrayType_\";\n            if (JSON_HEDLEY_UNLIKELY(it == bjd_types_map.end() || it->first != size_and_type.second))\n            {\n                auto last_token = get_token_string();\n                return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                        exception_message(input_format, \"invalid byte: 0x\" + last_token, \"type\"), nullptr));\n            }\n\n            string_t type = it->second; // sax->string() takes a reference\n            if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->string(type)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second == 'C' || size_and_type.second == 'B')\n            {\n                size_and_type.second = 'U';\n            }\n\n            key = \"_ArrayData_\";\n            if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->start_array(size_and_type.first) ))\n            {\n                return false;\n            }\n\n            for (std::size_t i = 0; i < size_and_type.first; ++i)\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                {\n                    return false;\n                }\n            }\n\n            return (sax->end_array() && sax->end_object());\n        }\n\n        // If BJData type marker is 'B' decode as binary\n        if (input_format == input_format_t::bjdata && size_and_type.first != npos && size_and_type.second == 'B')\n        {\n            binary_t result;\n            return get_binary(input_format, size_and_type.first, result) && sax->binary(result);\n        }\n\n        if (size_and_type.first != npos)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second != 0)\n            {\n                if (size_and_type.second != 'N')\n                {\n                    for (std::size_t i = 0; i < size_and_type.first; ++i)\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                        {\n                            return false;\n                        }\n                    }\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                    {\n                        return false;\n                    }\n                }\n            }\n        }\n        else\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_array(detail::unknown_size())))\n            {\n                return false;\n            }\n\n            while (current != ']')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false)))\n                {\n                    return false;\n                }\n                get_ignore_noop();\n            }\n        }\n\n        return sax->end_array();\n    }\n\n    /*!\n    @return whether object creation completed\n    */\n    bool get_ubjson_object()\n    {\n        std::pair<std::size_t, char_int_type> size_and_type;\n        if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))\n        {\n            return false;\n        }\n\n        // do not accept ND-array size in objects in BJData\n        if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0)\n        {\n            auto last_token = get_token_string();\n            return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,\n                                    exception_message(input_format, \"BJData object does not support ND-array size in optimized format\", \"object\"), nullptr));\n        }\n\n        string_t key;\n        if (size_and_type.first != npos)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first)))\n            {\n                return false;\n            }\n\n            if (size_and_type.second != 0)\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n            else\n            {\n                for (std::size_t i = 0; i < size_and_type.first; ++i)\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))\n                    {\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                    {\n                        return false;\n                    }\n                    key.clear();\n                }\n            }\n        }\n        else\n        {\n            if (JSON_HEDLEY_UNLIKELY(!sax->start_object(detail::unknown_size())))\n            {\n                return false;\n            }\n\n            while (current != '}')\n            {\n                if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key)))\n                {\n                    return false;\n                }\n                if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))\n                {\n                    return false;\n                }\n                get_ignore_noop();\n                key.clear();\n            }\n        }\n\n        return sax->end_object();\n    }\n\n    // Note, no reader for UBJSON binary types is implemented because they do\n    // not exist\n\n    bool get_ubjson_high_precision_number()\n    {\n        // get size of following number string\n        std::size_t size{};\n        bool no_ndarray = true;\n        auto res = get_ubjson_size_value(size, no_ndarray);\n        if (JSON_HEDLEY_UNLIKELY(!res))\n        {\n            return res;\n        }\n\n        // get number string\n        std::vector<char> number_vector;\n        for (std::size_t i = 0; i < size; ++i)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, \"number\")))\n            {\n                return false;\n            }\n            number_vector.push_back(static_cast<char>(current));\n        }\n\n        // parse number string\n        using ia_type = decltype(detail::input_adapter(number_vector));\n        auto number_lexer = detail::lexer<BasicJsonType, ia_type>(detail::input_adapter(number_vector), false);\n        const auto result_number = number_lexer.scan();\n        const auto number_string = number_lexer.get_token_string();\n        const auto result_remainder = number_lexer.scan();\n\n        using token_type = typename detail::lexer_base<BasicJsonType>::token_type;\n\n        if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input))\n        {\n            return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read,\n                                    exception_message(input_format, concat(\"invalid number text: \", number_lexer.get_token_string()), \"high-precision number\"), nullptr));\n        }\n\n        switch (result_number)\n        {\n            case token_type::value_integer:\n                return sax->number_integer(number_lexer.get_number_integer());\n            case token_type::value_unsigned:\n                return sax->number_unsigned(number_lexer.get_number_unsigned());\n            case token_type::value_float:\n                return sax->number_float(number_lexer.get_number_float(), std::move(number_string));\n            case token_type::uninitialized:\n            case token_type::literal_true:\n            case token_type::literal_false:\n            case token_type::literal_null:\n            case token_type::value_string:\n            case token_type::begin_array:\n            case token_type::begin_object:\n            case token_type::end_array:\n            case token_type::end_object:\n            case token_type::name_separator:\n            case token_type::value_separator:\n            case token_type::parse_error:\n            case token_type::end_of_input:\n            case token_type::literal_or_value:\n            default:\n                return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read,\n                                        exception_message(input_format, concat(\"invalid number text: \", number_lexer.get_token_string()), \"high-precision number\"), nullptr));\n        }\n    }\n\n    ///////////////////////\n    // Utility functions //\n    ///////////////////////\n\n    /*!\n    @brief get next character from the input\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns a -'ve valued\n    `char_traits<char_type>::eof()` in that case.\n\n    @return character read from the input\n    */\n    char_int_type get()\n    {\n        ++chars_read;\n        return current = ia.get_character();\n    }\n\n    /*!\n    @brief get_to read into a primitive type\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns false instead\n\n    @return bool, whether the read was successful\n    */\n    template<class T>\n    bool get_to(T& dest, const input_format_t format, const char* context)\n    {\n        auto new_chars_read = ia.get_elements(&dest);\n        chars_read += new_chars_read;\n        if (JSON_HEDLEY_UNLIKELY(new_chars_read < sizeof(T)))\n        {\n            // in case of failure, advance position by 1 to report failing location\n            ++chars_read;\n            sax->parse_error(chars_read, \"<end of file>\", parse_error::create(110, chars_read, exception_message(format, \"unexpected end of input\", context), nullptr));\n            return false;\n        }\n        return true;\n    }\n\n    /*!\n    @return character read from the input after ignoring all 'N' entries\n    */\n    char_int_type get_ignore_noop()\n    {\n        do\n        {\n            get();\n        }\n        while (current == 'N');\n\n        return current;\n    }\n\n    template<class NumberType>\n    static void byte_swap(NumberType& number)\n    {\n        constexpr std::size_t sz = sizeof(number);\n#ifdef __cpp_lib_byteswap\n        if constexpr (sz == 1)\n        {\n            return;\n        }\n        if constexpr(std::is_integral_v<NumberType>)\n        {\n            number = std::byteswap(number);\n            return;\n        }\n#endif\n        auto* ptr = reinterpret_cast<std::uint8_t*>(&number);\n        for (std::size_t i = 0; i < sz / 2; ++i)\n        {\n            std::swap(ptr[i], ptr[sz - i - 1]);\n        }\n    }\n\n    /*\n    @brief read a number from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format   the current format (for diagnostics)\n    @param[out] result  number of type @a NumberType\n\n    @return whether conversion completed\n\n    @note This function needs to respect the system's endianness, because\n          bytes in CBOR, MessagePack, and UBJSON are stored in network order\n          (big endian) and therefore need reordering on little endian systems.\n          On the other hand, BSON and BJData use little endian and should reorder\n          on big endian systems.\n    */\n    template<typename NumberType, bool InputIsLittleEndian = false>\n    bool get_number(const input_format_t format, NumberType& result)\n    {\n        // read in the original format\n\n        if (JSON_HEDLEY_UNLIKELY(!get_to(result, format, \"number\")))\n        {\n            return false;\n        }\n        if (is_little_endian != (InputIsLittleEndian || format == input_format_t::bjdata))\n        {\n            byte_swap(result);\n        }\n        return true;\n    }\n\n    /*!\n    @brief create a string by reading characters from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format the current format (for diagnostics)\n    @param[in] len number of characters to read\n    @param[out] result string created by reading @a len bytes\n\n    @return whether string creation completed\n\n    @note We can not reserve @a len bytes for the result, because @a len\n          may be too large. Usually, @ref unexpect_eof() detects the end of\n          the input before we run out of string memory.\n    */\n    template<typename NumberType>\n    bool get_string(const input_format_t format,\n                    const NumberType len,\n                    string_t& result)\n    {\n        bool success = true;\n        for (NumberType i = 0; i < len; i++)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"string\")))\n            {\n                success = false;\n                break;\n            }\n            result.push_back(static_cast<typename string_t::value_type>(current));\n        }\n        return success;\n    }\n\n    /*!\n    @brief create a byte array by reading bytes from the input\n\n    @tparam NumberType the type of the number\n    @param[in] format the current format (for diagnostics)\n    @param[in] len number of bytes to read\n    @param[out] result byte array created by reading @a len bytes\n\n    @return whether byte array creation completed\n\n    @note We can not reserve @a len bytes for the result, because @a len\n          may be too large. Usually, @ref unexpect_eof() detects the end of\n          the input before we run out of memory.\n    */\n    template<typename NumberType>\n    bool get_binary(const input_format_t format,\n                    const NumberType len,\n                    binary_t& result)\n    {\n        bool success = true;\n        for (NumberType i = 0; i < len; i++)\n        {\n            get();\n            if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, \"binary\")))\n            {\n                success = false;\n                break;\n            }\n            result.push_back(static_cast<std::uint8_t>(current));\n        }\n        return success;\n    }\n\n    /*!\n    @param[in] format   the current format (for diagnostics)\n    @param[in] context  further context information (for diagnostics)\n    @return whether the last read character is not EOF\n    */\n    JSON_HEDLEY_NON_NULL(3)\n    bool unexpect_eof(const input_format_t format, const char* context) const\n    {\n        if (JSON_HEDLEY_UNLIKELY(current == char_traits<char_type>::eof()))\n        {\n            return sax->parse_error(chars_read, \"<end of file>\",\n                                    parse_error::create(110, chars_read, exception_message(format, \"unexpected end of input\", context), nullptr));\n        }\n        return true;\n    }\n\n    /*!\n    @return a string representation of the last read byte\n    */\n    std::string get_token_string() const\n    {\n        std::array<char, 3> cr{{}};\n        static_cast<void>((std::snprintf)(cr.data(), cr.size(), \"%.2hhX\", static_cast<unsigned char>(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n        return std::string{cr.data()};\n    }\n\n    /*!\n    @param[in] format   the current format\n    @param[in] detail   a detailed error message\n    @param[in] context  further context information\n    @return a message string to use in the parse_error exceptions\n    */\n    std::string exception_message(const input_format_t format,\n                                  const std::string& detail,\n                                  const std::string& context) const\n    {\n        std::string error_msg = \"syntax error while parsing \";\n\n        switch (format)\n        {\n            case input_format_t::cbor:\n                error_msg += \"CBOR\";\n                break;\n\n            case input_format_t::msgpack:\n                error_msg += \"MessagePack\";\n                break;\n\n            case input_format_t::ubjson:\n                error_msg += \"UBJSON\";\n                break;\n\n            case input_format_t::bson:\n                error_msg += \"BSON\";\n                break;\n\n            case input_format_t::bjdata:\n                error_msg += \"BJData\";\n                break;\n\n            case input_format_t::json: // LCOV_EXCL_LINE\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n        }\n\n        return concat(error_msg, ' ', context, \": \", detail);\n    }\n\n  private:\n    static JSON_INLINE_VARIABLE constexpr std::size_t npos = detail::unknown_size();\n\n    /// input adapter\n    InputAdapterType ia;\n\n    /// the current character\n    char_int_type current = char_traits<char_type>::eof();\n\n    /// the number of characters read\n    std::size_t chars_read = 0;\n\n    /// whether we can assume little endianness\n    const bool is_little_endian = little_endianness();\n\n    /// input format\n    const input_format_t input_format = input_format_t::json;\n\n    /// the SAX parser\n    json_sax_t* sax = nullptr;\n\n    // excluded markers in bjdata optimized type\n#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \\\n    make_array<char_int_type>('F', 'H', 'N', 'S', 'T', 'Z', '[', '{')\n\n#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \\\n    make_array<bjd_type>(                      \\\n    bjd_type{'B', \"byte\"},                     \\\n    bjd_type{'C', \"char\"},                     \\\n    bjd_type{'D', \"double\"},                   \\\n    bjd_type{'I', \"int16\"},                    \\\n    bjd_type{'L', \"int64\"},                    \\\n    bjd_type{'M', \"uint64\"},                   \\\n    bjd_type{'U', \"uint8\"},                    \\\n    bjd_type{'d', \"single\"},                   \\\n    bjd_type{'i', \"int8\"},                     \\\n    bjd_type{'l', \"int32\"},                    \\\n    bjd_type{'m', \"uint32\"},                   \\\n    bjd_type{'u', \"uint16\"})\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    // lookup tables\n    // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes)\n    const decltype(JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_) bjd_optimized_type_markers =\n        JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_;\n\n    using bjd_type = std::pair<char_int_type, string_t>;\n    // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes)\n    const decltype(JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_) bjd_types_map =\n        JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_;\n\n#undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_\n#undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_\n};\n\n#ifndef JSON_HAS_CPP_17\n    template<typename BasicJsonType, typename InputAdapterType, typename SAX>\n    constexpr std::size_t binary_reader<BasicJsonType, InputAdapterType, SAX>::npos;\n#endif\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/input/input_adapters.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <cstring> // strlen\n#include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next\n#include <memory> // shared_ptr, make_shared, addressof\n#include <numeric> // accumulate\n#include <string> // string, char_traits\n#include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer\n#include <utility> // pair, declval\n\n#ifndef JSON_NO_IO\n    #include <cstdio>   // FILE *\n    #include <istream>  // istream\n#endif                  // JSON_NO_IO\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/iterators/iterator_traits.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/// the supported input formats\nenum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata };\n\n////////////////////\n// input adapters //\n////////////////////\n\n#ifndef JSON_NO_IO\n/*!\nInput adapter for stdio file access. This adapter read only 1 byte and do not use any\n buffer. This adapter is a very low level adapter.\n*/\nclass file_input_adapter\n{\n  public:\n    using char_type = char;\n\n    JSON_HEDLEY_NON_NULL(2)\n    explicit file_input_adapter(std::FILE* f) noexcept\n        : m_file(f)\n    {\n        JSON_ASSERT(m_file != nullptr);\n    }\n\n    // make class move-only\n    file_input_adapter(const file_input_adapter&) = delete;\n    file_input_adapter(file_input_adapter&&) noexcept = default;\n    file_input_adapter& operator=(const file_input_adapter&) = delete;\n    file_input_adapter& operator=(file_input_adapter&&) = delete;\n    ~file_input_adapter() = default;\n\n    std::char_traits<char>::int_type get_character() noexcept\n    {\n        return std::fgetc(m_file);\n    }\n\n    // returns the number of characters successfully read\n    template<class T>\n    std::size_t get_elements(T* dest, std::size_t count = 1)\n    {\n        return fread(dest, 1, sizeof(T) * count, m_file);\n    }\n\n  private:\n    /// the file pointer to read from\n    std::FILE* m_file;\n};\n\n/*!\nInput adapter for a (caching) istream. Ignores a UFT Byte Order Mark at\nbeginning of input. Does not support changing the underlying std::streambuf\nin mid-input. Maintains underlying std::istream and std::streambuf to support\nsubsequent use of standard std::istream operations to process any input\ncharacters following those used in parsing the JSON input.  Clears the\nstd::istream flags; any input errors (e.g., EOF) will be detected by the first\nsubsequent call for input from the std::istream.\n*/\nclass input_stream_adapter\n{\n  public:\n    using char_type = char;\n\n    ~input_stream_adapter()\n    {\n        // clear stream flags; we use underlying streambuf I/O, do not\n        // maintain ifstream flags, except eof\n        if (is != nullptr)\n        {\n            is->clear(is->rdstate() & std::ios::eofbit);\n        }\n    }\n\n    explicit input_stream_adapter(std::istream& i)\n        : is(&i), sb(i.rdbuf())\n    {}\n\n    // delete because of pointer members\n    input_stream_adapter(const input_stream_adapter&) = delete;\n    input_stream_adapter& operator=(input_stream_adapter&) = delete;\n    input_stream_adapter& operator=(input_stream_adapter&&) = delete;\n\n    input_stream_adapter(input_stream_adapter&& rhs) noexcept\n        : is(rhs.is), sb(rhs.sb)\n    {\n        rhs.is = nullptr;\n        rhs.sb = nullptr;\n    }\n\n    // std::istream/std::streambuf use std::char_traits<char>::to_int_type, to\n    // ensure that std::char_traits<char>::eof() and the character 0xFF do not\n    // end up as the same value, e.g. 0xFFFFFFFF.\n    std::char_traits<char>::int_type get_character()\n    {\n        auto res = sb->sbumpc();\n        // set eof manually, as we don't use the istream interface.\n        if (JSON_HEDLEY_UNLIKELY(res == std::char_traits<char>::eof()))\n        {\n            is->clear(is->rdstate() | std::ios::eofbit);\n        }\n        return res;\n    }\n\n    template<class T>\n    std::size_t get_elements(T* dest, std::size_t count = 1)\n    {\n        auto res = static_cast<std::size_t>(sb->sgetn(reinterpret_cast<char*>(dest), static_cast<std::streamsize>(count * sizeof(T))));\n        if (JSON_HEDLEY_UNLIKELY(res < count * sizeof(T)))\n        {\n            is->clear(is->rdstate() | std::ios::eofbit);\n        }\n        return res;\n    }\n\n  private:\n    /// the associated input stream\n    std::istream* is = nullptr;\n    std::streambuf* sb = nullptr;\n};\n#endif  // JSON_NO_IO\n\n// General-purpose iterator-based adapter. It might not be as fast as\n// theoretically possible for some containers, but it is extremely versatile.\ntemplate<typename IteratorType>\nclass iterator_input_adapter\n{\n  public:\n    using char_type = typename std::iterator_traits<IteratorType>::value_type;\n\n    iterator_input_adapter(IteratorType first, IteratorType last)\n        : current(std::move(first)), end(std::move(last))\n    {}\n\n    typename char_traits<char_type>::int_type get_character()\n    {\n        if (JSON_HEDLEY_LIKELY(current != end))\n        {\n            auto result = char_traits<char_type>::to_int_type(*current);\n            std::advance(current, 1);\n            return result;\n        }\n\n        return char_traits<char_type>::eof();\n    }\n\n    // for general iterators, we cannot really do something better than falling back to processing the range one-by-one\n    template<class T>\n    std::size_t get_elements(T* dest, std::size_t count = 1)\n    {\n        auto* ptr = reinterpret_cast<char*>(dest);\n        for (std::size_t read_index = 0; read_index < count * sizeof(T); ++read_index)\n        {\n            if (JSON_HEDLEY_LIKELY(current != end))\n            {\n                ptr[read_index] = static_cast<char>(*current);\n                std::advance(current, 1);\n            }\n            else\n            {\n                return read_index;\n            }\n        }\n        return count * sizeof(T);\n    }\n\n  private:\n    IteratorType current;\n    IteratorType end;\n\n    template<typename BaseInputAdapter, size_t T>\n    friend struct wide_string_input_helper;\n\n    bool empty() const\n    {\n        return current == end;\n    }\n};\n\ntemplate<typename BaseInputAdapter, size_t T>\nstruct wide_string_input_helper;\n\ntemplate<typename BaseInputAdapter>\nstruct wide_string_input_helper<BaseInputAdapter, 4>\n{\n    // UTF-32\n    static void fill_buffer(BaseInputAdapter& input,\n                            std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,\n                            size_t& utf8_bytes_index,\n                            size_t& utf8_bytes_filled)\n    {\n        utf8_bytes_index = 0;\n\n        if (JSON_HEDLEY_UNLIKELY(input.empty()))\n        {\n            utf8_bytes[0] = std::char_traits<char>::eof();\n            utf8_bytes_filled = 1;\n        }\n        else\n        {\n            // get the current character\n            const auto wc = input.get_character();\n\n            // UTF-32 to UTF-8 encoding\n            if (wc < 0x80)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n            else if (wc <= 0x7FF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 2;\n            }\n            else if (wc <= 0xFFFF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 3;\n            }\n            else if (wc <= 0x10FFFF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 4;\n            }\n            else\n            {\n                // unknown character\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n        }\n    }\n};\n\ntemplate<typename BaseInputAdapter>\nstruct wide_string_input_helper<BaseInputAdapter, 2>\n{\n    // UTF-16\n    static void fill_buffer(BaseInputAdapter& input,\n                            std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,\n                            size_t& utf8_bytes_index,\n                            size_t& utf8_bytes_filled)\n    {\n        utf8_bytes_index = 0;\n\n        if (JSON_HEDLEY_UNLIKELY(input.empty()))\n        {\n            utf8_bytes[0] = std::char_traits<char>::eof();\n            utf8_bytes_filled = 1;\n        }\n        else\n        {\n            // get the current character\n            const auto wc = input.get_character();\n\n            // UTF-16 to UTF-8 encoding\n            if (wc < 0x80)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                utf8_bytes_filled = 1;\n            }\n            else if (wc <= 0x7FF)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 2;\n            }\n            else if (0xD800 > wc || wc >= 0xE000)\n            {\n                utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));\n                utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));\n                utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));\n                utf8_bytes_filled = 3;\n            }\n            else\n            {\n                if (JSON_HEDLEY_UNLIKELY(!input.empty()))\n                {\n                    const auto wc2 = static_cast<unsigned int>(input.get_character());\n                    const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));\n                    utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));\n                    utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));\n                    utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));\n                    utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu));\n                    utf8_bytes_filled = 4;\n                }\n                else\n                {\n                    utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);\n                    utf8_bytes_filled = 1;\n                }\n            }\n        }\n    }\n};\n\n// Wraps another input adapter to convert wide character types into individual bytes.\ntemplate<typename BaseInputAdapter, typename WideCharType>\nclass wide_string_input_adapter\n{\n  public:\n    using char_type = char;\n\n    wide_string_input_adapter(BaseInputAdapter base)\n        : base_adapter(base) {}\n\n    typename std::char_traits<char>::int_type get_character() noexcept\n    {\n        // check if buffer needs to be filled\n        if (utf8_bytes_index == utf8_bytes_filled)\n        {\n            fill_buffer<sizeof(WideCharType)>();\n\n            JSON_ASSERT(utf8_bytes_filled > 0);\n            JSON_ASSERT(utf8_bytes_index == 0);\n        }\n\n        // use buffer\n        JSON_ASSERT(utf8_bytes_filled > 0);\n        JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);\n        return utf8_bytes[utf8_bytes_index++];\n    }\n\n    // parsing binary with wchar doesn't make sense, but since the parsing mode can be runtime, we need something here\n    template<class T>\n    std::size_t get_elements(T* /*dest*/, std::size_t /*count*/ = 1)\n    {\n        JSON_THROW(parse_error::create(112, 1, \"wide string type cannot be interpreted as binary data\", nullptr));\n    }\n\n  private:\n    BaseInputAdapter base_adapter;\n\n    template<size_t T>\n    void fill_buffer()\n    {\n        wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);\n    }\n\n    /// a buffer for UTF-8 bytes\n    std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};\n\n    /// index to the utf8_codes array for the next valid byte\n    std::size_t utf8_bytes_index = 0;\n    /// number of valid bytes in the utf8_codes array\n    std::size_t utf8_bytes_filled = 0;\n};\n\ntemplate<typename IteratorType, typename Enable = void>\nstruct iterator_input_adapter_factory\n{\n    using iterator_type = IteratorType;\n    using char_type = typename std::iterator_traits<iterator_type>::value_type;\n    using adapter_type = iterator_input_adapter<iterator_type>;\n\n    static adapter_type create(IteratorType first, IteratorType last)\n    {\n        return adapter_type(std::move(first), std::move(last));\n    }\n};\n\ntemplate<typename T>\nstruct is_iterator_of_multibyte\n{\n    using value_type = typename std::iterator_traits<T>::value_type;\n    enum\n    {\n        value = sizeof(value_type) > 1\n    };\n};\n\ntemplate<typename IteratorType>\nstruct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>>\n{\n    using iterator_type = IteratorType;\n    using char_type = typename std::iterator_traits<iterator_type>::value_type;\n    using base_adapter_type = iterator_input_adapter<iterator_type>;\n    using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>;\n\n    static adapter_type create(IteratorType first, IteratorType last)\n    {\n        return adapter_type(base_adapter_type(std::move(first), std::move(last)));\n    }\n};\n\n// General purpose iterator-based input\ntemplate<typename IteratorType>\ntypename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last)\n{\n    using factory_type = iterator_input_adapter_factory<IteratorType>;\n    return factory_type::create(first, last);\n}\n\n// Convenience shorthand from container to iterator\n// Enables ADL on begin(container) and end(container)\n// Encloses the using declarations in namespace for not to leak them to outside scope\n\nnamespace container_input_adapter_factory_impl\n{\n\nusing std::begin;\nusing std::end;\n\ntemplate<typename ContainerType, typename Enable = void>\nstruct container_input_adapter_factory {};\n\ntemplate<typename ContainerType>\nstruct container_input_adapter_factory< ContainerType,\n       void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>\n       {\n           using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>())));\n\n           static adapter_type create(const ContainerType& container)\n{\n    return input_adapter(begin(container), end(container));\n}\n       };\n\n}  // namespace container_input_adapter_factory_impl\n\ntemplate<typename ContainerType>\ntypename container_input_adapter_factory_impl::container_input_adapter_factory<ContainerType>::adapter_type input_adapter(const ContainerType& container)\n{\n    return container_input_adapter_factory_impl::container_input_adapter_factory<ContainerType>::create(container);\n}\n\n// specialization for std::string\nusing string_input_adapter_type = decltype(input_adapter(std::declval<std::string>()));\n\n#ifndef JSON_NO_IO\n// Special cases with fast paths\ninline file_input_adapter input_adapter(std::FILE* file)\n{\n    if (file == nullptr)\n    {\n        JSON_THROW(parse_error::create(101, 0, \"attempting to parse an empty input; check that your input string or stream contains the expected JSON\", nullptr));\n    }\n    return file_input_adapter(file);\n}\n\ninline input_stream_adapter input_adapter(std::istream& stream)\n{\n    return input_stream_adapter(stream);\n}\n\ninline input_stream_adapter input_adapter(std::istream&& stream)\n{\n    return input_stream_adapter(stream);\n}\n#endif  // JSON_NO_IO\n\nusing contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));\n\n// Null-delimited strings, and the like.\ntemplate < typename CharT,\n           typename std::enable_if <\n               std::is_pointer<CharT>::value&&\n               !std::is_array<CharT>::value&&\n               std::is_integral<typename std::remove_pointer<CharT>::type>::value&&\n               sizeof(typename std::remove_pointer<CharT>::type) == 1,\n               int >::type = 0 >\ncontiguous_bytes_input_adapter input_adapter(CharT b)\n{\n    if (b == nullptr)\n    {\n        JSON_THROW(parse_error::create(101, 0, \"attempting to parse an empty input; check that your input string or stream contains the expected JSON\", nullptr));\n    }\n    auto length = std::strlen(reinterpret_cast<const char*>(b));\n    const auto* ptr = reinterpret_cast<const char*>(b);\n    return input_adapter(ptr, ptr + length); // cppcheck-suppress[nullPointerArithmeticRedundantCheck]\n}\n\ntemplate<typename T, std::size_t N>\nauto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n{\n    return input_adapter(array, array + N);\n}\n\n// This class only handles inputs of input_buffer_adapter type.\n// It's required so that expressions like {ptr, len} can be implicitly cast\n// to the correct adapter.\nclass span_input_adapter\n{\n  public:\n    template < typename CharT,\n               typename std::enable_if <\n                   std::is_pointer<CharT>::value&&\n                   std::is_integral<typename std::remove_pointer<CharT>::type>::value&&\n                   sizeof(typename std::remove_pointer<CharT>::type) == 1,\n                   int >::type = 0 >\n    span_input_adapter(CharT b, std::size_t l)\n        : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}\n\n    template<class IteratorType,\n             typename std::enable_if<\n                 std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,\n                 int>::type = 0>\n    span_input_adapter(IteratorType first, IteratorType last)\n        : ia(input_adapter(first, last)) {}\n\n    contiguous_bytes_input_adapter&& get()\n    {\n        return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg)\n    }\n\n  private:\n    contiguous_bytes_input_adapter ia;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/input/json_sax.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef>\n#include <string> // string\n#include <type_traits> // enable_if_t\n#include <utility> // move\n#include <vector> // vector\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/input/lexer.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/string_concat.hpp>\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/*!\n@brief SAX interface\n\nThis class describes the SAX interface used by @ref nlohmann::json::sax_parse.\nEach function is called in different situations while the input is parsed. The\nboolean return value informs the parser whether to continue processing the\ninput.\n*/\ntemplate<typename BasicJsonType>\nstruct json_sax\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    /*!\n    @brief a null value was read\n    @return whether parsing should proceed\n    */\n    virtual bool null() = 0;\n\n    /*!\n    @brief a boolean value was read\n    @param[in] val  boolean value\n    @return whether parsing should proceed\n    */\n    virtual bool boolean(bool val) = 0;\n\n    /*!\n    @brief an integer number was read\n    @param[in] val  integer value\n    @return whether parsing should proceed\n    */\n    virtual bool number_integer(number_integer_t val) = 0;\n\n    /*!\n    @brief an unsigned integer number was read\n    @param[in] val  unsigned integer value\n    @return whether parsing should proceed\n    */\n    virtual bool number_unsigned(number_unsigned_t val) = 0;\n\n    /*!\n    @brief a floating-point number was read\n    @param[in] val  floating-point value\n    @param[in] s    raw token value\n    @return whether parsing should proceed\n    */\n    virtual bool number_float(number_float_t val, const string_t& s) = 0;\n\n    /*!\n    @brief a string value was read\n    @param[in] val  string value\n    @return whether parsing should proceed\n    @note It is safe to move the passed string value.\n    */\n    virtual bool string(string_t& val) = 0;\n\n    /*!\n    @brief a binary value was read\n    @param[in] val  binary value\n    @return whether parsing should proceed\n    @note It is safe to move the passed binary value.\n    */\n    virtual bool binary(binary_t& val) = 0;\n\n    /*!\n    @brief the beginning of an object was read\n    @param[in] elements  number of object elements or -1 if unknown\n    @return whether parsing should proceed\n    @note binary formats may report the number of elements\n    */\n    virtual bool start_object(std::size_t elements) = 0;\n\n    /*!\n    @brief an object key was read\n    @param[in] val  object key\n    @return whether parsing should proceed\n    @note It is safe to move the passed string.\n    */\n    virtual bool key(string_t& val) = 0;\n\n    /*!\n    @brief the end of an object was read\n    @return whether parsing should proceed\n    */\n    virtual bool end_object() = 0;\n\n    /*!\n    @brief the beginning of an array was read\n    @param[in] elements  number of array elements or -1 if unknown\n    @return whether parsing should proceed\n    @note binary formats may report the number of elements\n    */\n    virtual bool start_array(std::size_t elements) = 0;\n\n    /*!\n    @brief the end of an array was read\n    @return whether parsing should proceed\n    */\n    virtual bool end_array() = 0;\n\n    /*!\n    @brief a parse error occurred\n    @param[in] position    the position in the input where the error occurs\n    @param[in] last_token  the last read token\n    @param[in] ex          an exception object describing the error\n    @return whether parsing should proceed (must return false)\n    */\n    virtual bool parse_error(std::size_t position,\n                             const std::string& last_token,\n                             const detail::exception& ex) = 0;\n\n    json_sax() = default;\n    json_sax(const json_sax&) = default;\n    json_sax(json_sax&&) noexcept = default;\n    json_sax& operator=(const json_sax&) = default;\n    json_sax& operator=(json_sax&&) noexcept = default;\n    virtual ~json_sax() = default;\n};\n\nnamespace detail\n{\nconstexpr std::size_t unknown_size()\n{\n    return (std::numeric_limits<std::size_t>::max)();\n}\n\n/*!\n@brief SAX implementation to create a JSON value from SAX events\n\nThis class implements the @ref json_sax interface and processes the SAX events\nto create a JSON value which makes it basically a DOM parser. The structure or\nhierarchy of the JSON value is managed by the stack `ref_stack` which contains\na pointer to the respective array or object for each recursion depth.\n\nAfter successful parsing, the value that is passed by reference to the\nconstructor contains the parsed value.\n\n@tparam BasicJsonType  the JSON type\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass json_sax_dom_parser\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using lexer_t = lexer<BasicJsonType, InputAdapterType>;\n\n    /*!\n    @param[in,out] r  reference to a JSON value that is manipulated while\n                       parsing\n    @param[in] allow_exceptions_  whether parse errors yield exceptions\n    */\n    explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true, lexer_t* lexer_ = nullptr)\n        : root(r), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_)\n    {}\n\n    // make class move-only\n    json_sax_dom_parser(const json_sax_dom_parser&) = delete;\n    json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;\n    json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    ~json_sax_dom_parser() = default;\n\n    bool null()\n    {\n        handle_value(nullptr);\n        return true;\n    }\n\n    bool boolean(bool val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_integer(number_integer_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_float(number_float_t val, const string_t& /*unused*/)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool string(string_t& val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool binary(binary_t& val)\n    {\n        handle_value(std::move(val));\n        return true;\n    }\n\n    bool start_object(std::size_t len)\n    {\n        ref_stack.push_back(handle_value(BasicJsonType::value_t::object));\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        // Manually set the start position of the object here.\n        // Ensure this is after the call to handle_value to ensure correct start position.\n        if (m_lexer_ref)\n        {\n            // Lexer has read the first character of the object, so\n            // subtract 1 from the position to get the correct start position.\n            ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;\n        }\n#endif\n\n        if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408, concat(\"excessive object size: \", std::to_string(len)), ref_stack.back()));\n        }\n\n        return true;\n    }\n\n    bool key(string_t& val)\n    {\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(ref_stack.back()->is_object());\n\n        // add null at given key and store the reference for later\n        object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));\n        return true;\n    }\n\n    bool end_object()\n    {\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(ref_stack.back()->is_object());\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        if (m_lexer_ref)\n        {\n            // Lexer's position is past the closing brace, so set that as the end position.\n            ref_stack.back()->end_position = m_lexer_ref->get_position();\n        }\n#endif\n\n        ref_stack.back()->set_parents();\n        ref_stack.pop_back();\n        return true;\n    }\n\n    bool start_array(std::size_t len)\n    {\n        ref_stack.push_back(handle_value(BasicJsonType::value_t::array));\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        // Manually set the start position of the array here.\n        // Ensure this is after the call to handle_value to ensure correct start position.\n        if (m_lexer_ref)\n        {\n            ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;\n        }\n#endif\n\n        if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))\n        {\n            JSON_THROW(out_of_range::create(408, concat(\"excessive array size: \", std::to_string(len)), ref_stack.back()));\n        }\n\n        return true;\n    }\n\n    bool end_array()\n    {\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(ref_stack.back()->is_array());\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        if (m_lexer_ref)\n        {\n            // Lexer's position is past the closing bracket, so set that as the end position.\n            ref_stack.back()->end_position = m_lexer_ref->get_position();\n        }\n#endif\n\n        ref_stack.back()->set_parents();\n        ref_stack.pop_back();\n        return true;\n    }\n\n    template<class Exception>\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,\n                     const Exception& ex)\n    {\n        errored = true;\n        static_cast<void>(ex);\n        if (allow_exceptions)\n        {\n            JSON_THROW(ex);\n        }\n        return false;\n    }\n\n    constexpr bool is_errored() const\n    {\n        return errored;\n    }\n\n  private:\n\n#if JSON_DIAGNOSTIC_POSITIONS\n    void handle_diagnostic_positions_for_json_value(BasicJsonType& v)\n    {\n        if (m_lexer_ref)\n        {\n            // Lexer has read past the current field value, so set the end position to the current position.\n            // The start position will be set below based on the length of the string representation\n            // of the value.\n            v.end_position = m_lexer_ref->get_position();\n\n            switch (v.type())\n            {\n                case value_t::boolean:\n                {\n                    // 4 and 5 are the string length of \"true\" and \"false\"\n                    v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);\n                    break;\n                }\n\n                case value_t::null:\n                {\n                    // 4 is the string length of \"null\"\n                    v.start_position = v.end_position - 4;\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    // include the length of the quotes, which is 2\n                    v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;\n                    break;\n                }\n\n                // As we handle the start and end positions for values created during parsing,\n                // we do not expect the following value type to be called. Regardless, set the positions\n                // in case this is created manually or through a different constructor. Exclude from lcov\n                // since the exact condition of this switch is esoteric.\n                // LCOV_EXCL_START\n                case value_t::discarded:\n                {\n                    v.end_position = std::string::npos;\n                    v.start_position = v.end_position;\n                    break;\n                }\n                // LCOV_EXCL_STOP\n                case value_t::binary:\n                case value_t::number_integer:\n                case value_t::number_unsigned:\n                case value_t::number_float:\n                {\n                    v.start_position = v.end_position - m_lexer_ref->get_string().size();\n                    break;\n                }\n                case value_t::object:\n                case value_t::array:\n                {\n                    // object and array are handled in start_object() and start_array() handlers\n                    // skip setting the values here.\n                    break;\n                }\n                default: // LCOV_EXCL_LINE\n                    // Handle all possible types discretely, default handler should never be reached.\n                    JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert,-warnings-as-errors) LCOV_EXCL_LINE\n            }\n        }\n    }\n#endif\n\n    /*!\n    @invariant If the ref stack is empty, then the passed value will be the new\n               root.\n    @invariant If the ref stack contains a value, then it is an array or an\n               object to which we can add elements\n    */\n    template<typename Value>\n    JSON_HEDLEY_RETURNS_NON_NULL\n    BasicJsonType* handle_value(Value&& v)\n    {\n        if (ref_stack.empty())\n        {\n            root = BasicJsonType(std::forward<Value>(v));\n\n#if JSON_DIAGNOSTIC_POSITIONS\n            handle_diagnostic_positions_for_json_value(root);\n#endif\n\n            return &root;\n        }\n\n        JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());\n\n        if (ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));\n\n#if JSON_DIAGNOSTIC_POSITIONS\n            handle_diagnostic_positions_for_json_value(ref_stack.back()->m_data.m_value.array->back());\n#endif\n\n            return &(ref_stack.back()->m_data.m_value.array->back());\n        }\n\n        JSON_ASSERT(ref_stack.back()->is_object());\n        JSON_ASSERT(object_element);\n        *object_element = BasicJsonType(std::forward<Value>(v));\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        handle_diagnostic_positions_for_json_value(*object_element);\n#endif\n\n        return object_element;\n    }\n\n    /// the parsed JSON value\n    BasicJsonType& root;\n    /// stack to model hierarchy of values\n    std::vector<BasicJsonType*> ref_stack {};\n    /// helper to hold the reference for the next object element\n    BasicJsonType* object_element = nullptr;\n    /// whether a syntax error occurred\n    bool errored = false;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n    /// the lexer reference to obtain the current position\n    lexer_t* m_lexer_ref = nullptr;\n};\n\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass json_sax_dom_callback_parser\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using parser_callback_t = typename BasicJsonType::parser_callback_t;\n    using parse_event_t = typename BasicJsonType::parse_event_t;\n    using lexer_t = lexer<BasicJsonType, InputAdapterType>;\n\n    json_sax_dom_callback_parser(BasicJsonType& r,\n                                 parser_callback_t cb,\n                                 const bool allow_exceptions_ = true,\n                                 lexer_t* lexer_ = nullptr)\n        : root(r), callback(std::move(cb)), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_)\n    {\n        keep_stack.push_back(true);\n    }\n\n    // make class move-only\n    json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;\n    json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;\n    json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    ~json_sax_dom_callback_parser() = default;\n\n    bool null()\n    {\n        handle_value(nullptr);\n        return true;\n    }\n\n    bool boolean(bool val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_integer(number_integer_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool number_float(number_float_t val, const string_t& /*unused*/)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool string(string_t& val)\n    {\n        handle_value(val);\n        return true;\n    }\n\n    bool binary(binary_t& val)\n    {\n        handle_value(std::move(val));\n        return true;\n    }\n\n    bool start_object(std::size_t len)\n    {\n        // check callback for object start\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);\n        keep_stack.push_back(keep);\n\n        auto val = handle_value(BasicJsonType::value_t::object, true);\n        ref_stack.push_back(val.second);\n\n        if (ref_stack.back())\n        {\n\n#if JSON_DIAGNOSTIC_POSITIONS\n            // Manually set the start position of the object here.\n            // Ensure this is after the call to handle_value to ensure correct start position.\n            if (m_lexer_ref)\n            {\n                // Lexer has read the first character of the object, so\n                // subtract 1 from the position to get the correct start position.\n                ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;\n            }\n#endif\n\n            // check object limit\n            if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))\n            {\n                JSON_THROW(out_of_range::create(408, concat(\"excessive object size: \", std::to_string(len)), ref_stack.back()));\n            }\n        }\n        return true;\n    }\n\n    bool key(string_t& val)\n    {\n        BasicJsonType k = BasicJsonType(val);\n\n        // check callback for key\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);\n        key_keep_stack.push_back(keep);\n\n        // add discarded value at given key and store the reference for later\n        if (keep && ref_stack.back())\n        {\n            object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);\n        }\n\n        return true;\n    }\n\n    bool end_object()\n    {\n        if (ref_stack.back())\n        {\n            if (!callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))\n            {\n                // discard object\n                *ref_stack.back() = discarded;\n\n#if JSON_DIAGNOSTIC_POSITIONS\n                // Set start/end positions for discarded object.\n                handle_diagnostic_positions_for_json_value(*ref_stack.back());\n#endif\n            }\n            else\n            {\n\n#if JSON_DIAGNOSTIC_POSITIONS\n                if (m_lexer_ref)\n                {\n                    // Lexer's position is past the closing brace, so set that as the end position.\n                    ref_stack.back()->end_position = m_lexer_ref->get_position();\n                }\n#endif\n\n                ref_stack.back()->set_parents();\n            }\n        }\n\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(!keep_stack.empty());\n        ref_stack.pop_back();\n        keep_stack.pop_back();\n\n        if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())\n        {\n            // remove discarded value\n            for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)\n            {\n                if (it->is_discarded())\n                {\n                    ref_stack.back()->erase(it);\n                    break;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    bool start_array(std::size_t len)\n    {\n        const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);\n        keep_stack.push_back(keep);\n\n        auto val = handle_value(BasicJsonType::value_t::array, true);\n        ref_stack.push_back(val.second);\n\n        if (ref_stack.back())\n        {\n\n#if JSON_DIAGNOSTIC_POSITIONS\n            // Manually set the start position of the array here.\n            // Ensure this is after the call to handle_value to ensure correct start position.\n            if (m_lexer_ref)\n            {\n                // Lexer has read the first character of the array, so\n                // subtract 1 from the position to get the correct start position.\n                ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;\n            }\n#endif\n\n            // check array limit\n            if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))\n            {\n                JSON_THROW(out_of_range::create(408, concat(\"excessive array size: \", std::to_string(len)), ref_stack.back()));\n            }\n        }\n\n        return true;\n    }\n\n    bool end_array()\n    {\n        bool keep = true;\n\n        if (ref_stack.back())\n        {\n            keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());\n            if (keep)\n            {\n\n#if JSON_DIAGNOSTIC_POSITIONS\n                if (m_lexer_ref)\n                {\n                    // Lexer's position is past the closing bracket, so set that as the end position.\n                    ref_stack.back()->end_position = m_lexer_ref->get_position();\n                }\n#endif\n\n                ref_stack.back()->set_parents();\n            }\n            else\n            {\n                // discard array\n                *ref_stack.back() = discarded;\n\n#if JSON_DIAGNOSTIC_POSITIONS\n                // Set start/end positions for discarded array.\n                handle_diagnostic_positions_for_json_value(*ref_stack.back());\n#endif\n            }\n        }\n\n        JSON_ASSERT(!ref_stack.empty());\n        JSON_ASSERT(!keep_stack.empty());\n        ref_stack.pop_back();\n        keep_stack.pop_back();\n\n        // remove discarded value\n        if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_data.m_value.array->pop_back();\n        }\n\n        return true;\n    }\n\n    template<class Exception>\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,\n                     const Exception& ex)\n    {\n        errored = true;\n        static_cast<void>(ex);\n        if (allow_exceptions)\n        {\n            JSON_THROW(ex);\n        }\n        return false;\n    }\n\n    constexpr bool is_errored() const\n    {\n        return errored;\n    }\n\n  private:\n\n#if JSON_DIAGNOSTIC_POSITIONS\n    void handle_diagnostic_positions_for_json_value(BasicJsonType& v)\n    {\n        if (m_lexer_ref)\n        {\n            // Lexer has read past the current field value, so set the end position to the current position.\n            // The start position will be set below based on the length of the string representation\n            // of the value.\n            v.end_position = m_lexer_ref->get_position();\n\n            switch (v.type())\n            {\n                case value_t::boolean:\n                {\n                    // 4 and 5 are the string length of \"true\" and \"false\"\n                    v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);\n                    break;\n                }\n\n                case value_t::null:\n                {\n                    // 4 is the string length of \"null\"\n                    v.start_position = v.end_position - 4;\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    // include the length of the quotes, which is 2\n                    v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;\n                    break;\n                }\n\n                case value_t::discarded:\n                {\n                    v.end_position = std::string::npos;\n                    v.start_position = v.end_position;\n                    break;\n                }\n\n                case value_t::binary:\n                case value_t::number_integer:\n                case value_t::number_unsigned:\n                case value_t::number_float:\n                {\n                    v.start_position = v.end_position - m_lexer_ref->get_string().size();\n                    break;\n                }\n\n                case value_t::object:\n                case value_t::array:\n                {\n                    // object and array are handled in start_object() and start_array() handlers\n                    // skip setting the values here.\n                    break;\n                }\n                default: // LCOV_EXCL_LINE\n                    // Handle all possible types discretely, default handler should never be reached.\n                    JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert,-warnings-as-errors) LCOV_EXCL_LINE\n            }\n        }\n    }\n#endif\n\n    /*!\n    @param[in] v  value to add to the JSON value we build during parsing\n    @param[in] skip_callback  whether we should skip calling the callback\n               function; this is required after start_array() and\n               start_object() SAX events, because otherwise we would call the\n               callback function with an empty array or object, respectively.\n\n    @invariant If the ref stack is empty, then the passed value will be the new\n               root.\n    @invariant If the ref stack contains a value, then it is an array or an\n               object to which we can add elements\n\n    @return pair of boolean (whether value should be kept) and pointer (to the\n            passed value in the ref_stack hierarchy; nullptr if not kept)\n    */\n    template<typename Value>\n    std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)\n    {\n        JSON_ASSERT(!keep_stack.empty());\n\n        // do not handle this value if we know it would be added to a discarded\n        // container\n        if (!keep_stack.back())\n        {\n            return {false, nullptr};\n        }\n\n        // create value\n        auto value = BasicJsonType(std::forward<Value>(v));\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        handle_diagnostic_positions_for_json_value(value);\n#endif\n\n        // check callback\n        const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);\n\n        // do not handle this value if we just learnt it shall be discarded\n        if (!keep)\n        {\n            return {false, nullptr};\n        }\n\n        if (ref_stack.empty())\n        {\n            root = std::move(value);\n            return {true, & root};\n        }\n\n        // skip this value if we already decided to skip the parent\n        // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360)\n        if (!ref_stack.back())\n        {\n            return {false, nullptr};\n        }\n\n        // we now only expect arrays and objects\n        JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());\n\n        // array\n        if (ref_stack.back()->is_array())\n        {\n            ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));\n            return {true, & (ref_stack.back()->m_data.m_value.array->back())};\n        }\n\n        // object\n        JSON_ASSERT(ref_stack.back()->is_object());\n        // check if we should store an element for the current key\n        JSON_ASSERT(!key_keep_stack.empty());\n        const bool store_element = key_keep_stack.back();\n        key_keep_stack.pop_back();\n\n        if (!store_element)\n        {\n            return {false, nullptr};\n        }\n\n        JSON_ASSERT(object_element);\n        *object_element = std::move(value);\n        return {true, object_element};\n    }\n\n    /// the parsed JSON value\n    BasicJsonType& root;\n    /// stack to model hierarchy of values\n    std::vector<BasicJsonType*> ref_stack {};\n    /// stack to manage which values to keep\n    std::vector<bool> keep_stack {}; // NOLINT(readability-redundant-member-init)\n    /// stack to manage which object keys to keep\n    std::vector<bool> key_keep_stack {}; // NOLINT(readability-redundant-member-init)\n    /// helper to hold the reference for the next object element\n    BasicJsonType* object_element = nullptr;\n    /// whether a syntax error occurred\n    bool errored = false;\n    /// callback function\n    const parser_callback_t callback = nullptr;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n    /// a discarded value for the callback\n    BasicJsonType discarded = BasicJsonType::value_t::discarded;\n    /// the lexer reference to obtain the current position\n    lexer_t* m_lexer_ref = nullptr;\n};\n\ntemplate<typename BasicJsonType>\nclass json_sax_acceptor\n{\n  public:\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n\n    bool null()\n    {\n        return true;\n    }\n\n    bool boolean(bool /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_integer(number_integer_t /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_unsigned(number_unsigned_t /*unused*/)\n    {\n        return true;\n    }\n\n    bool number_float(number_float_t /*unused*/, const string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool string(string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool binary(binary_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool start_object(std::size_t /*unused*/ = detail::unknown_size())\n    {\n        return true;\n    }\n\n    bool key(string_t& /*unused*/)\n    {\n        return true;\n    }\n\n    bool end_object()\n    {\n        return true;\n    }\n\n    bool start_array(std::size_t /*unused*/ = detail::unknown_size())\n    {\n        return true;\n    }\n\n    bool end_array()\n    {\n        return true;\n    }\n\n    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/)\n    {\n        return false;\n    }\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/input/lexer.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <array> // array\n#include <clocale> // localeconv\n#include <cstddef> // size_t\n#include <cstdio> // snprintf\n#include <cstdlib> // strtof, strtod, strtold, strtoll, strtoull\n#include <initializer_list> // initializer_list\n#include <string> // char_traits, string\n#include <utility> // move\n#include <vector> // vector\n\n#include <nlohmann/detail/input/input_adapters.hpp>\n#include <nlohmann/detail/input/position_t.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n///////////\n// lexer //\n///////////\n\ntemplate<typename BasicJsonType>\nclass lexer_base\n{\n  public:\n    /// token types for the parser\n    enum class token_type\n    {\n        uninitialized,    ///< indicating the scanner is uninitialized\n        literal_true,     ///< the `true` literal\n        literal_false,    ///< the `false` literal\n        literal_null,     ///< the `null` literal\n        value_string,     ///< a string -- use get_string() for actual value\n        value_unsigned,   ///< an unsigned integer -- use get_number_unsigned() for actual value\n        value_integer,    ///< a signed integer -- use get_number_integer() for actual value\n        value_float,      ///< an floating point number -- use get_number_float() for actual value\n        begin_array,      ///< the character for array begin `[`\n        begin_object,     ///< the character for object begin `{`\n        end_array,        ///< the character for array end `]`\n        end_object,       ///< the character for object end `}`\n        name_separator,   ///< the name separator `:`\n        value_separator,  ///< the value separator `,`\n        parse_error,      ///< indicating a parse error\n        end_of_input,     ///< indicating the end of the input buffer\n        literal_or_value  ///< a literal or the begin of a value (only for diagnostics)\n    };\n\n    /// return name of values of type token_type (only used for errors)\n    JSON_HEDLEY_RETURNS_NON_NULL\n    JSON_HEDLEY_CONST\n    static const char* token_type_name(const token_type t) noexcept\n    {\n        switch (t)\n        {\n            case token_type::uninitialized:\n                return \"<uninitialized>\";\n            case token_type::literal_true:\n                return \"true literal\";\n            case token_type::literal_false:\n                return \"false literal\";\n            case token_type::literal_null:\n                return \"null literal\";\n            case token_type::value_string:\n                return \"string literal\";\n            case token_type::value_unsigned:\n            case token_type::value_integer:\n            case token_type::value_float:\n                return \"number literal\";\n            case token_type::begin_array:\n                return \"'['\";\n            case token_type::begin_object:\n                return \"'{'\";\n            case token_type::end_array:\n                return \"']'\";\n            case token_type::end_object:\n                return \"'}'\";\n            case token_type::name_separator:\n                return \"':'\";\n            case token_type::value_separator:\n                return \"','\";\n            case token_type::parse_error:\n                return \"<parse error>\";\n            case token_type::end_of_input:\n                return \"end of input\";\n            case token_type::literal_or_value:\n                return \"'[', '{', or a literal\";\n            // LCOV_EXCL_START\n            default: // catch non-enum values\n                return \"unknown token\";\n                // LCOV_EXCL_STOP\n        }\n    }\n};\n/*!\n@brief lexical analysis\n\nThis class organizes the lexical analysis during JSON deserialization.\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass lexer : public lexer_base<BasicJsonType>\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using char_type = typename InputAdapterType::char_type;\n    using char_int_type = typename char_traits<char_type>::int_type;\n\n  public:\n    using token_type = typename lexer_base<BasicJsonType>::token_type;\n\n    explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept\n        : ia(std::move(adapter))\n        , ignore_comments(ignore_comments_)\n        , decimal_point_char(static_cast<char_int_type>(get_decimal_point()))\n    {}\n\n    // delete because of pointer members\n    lexer(const lexer&) = delete;\n    lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    lexer& operator=(lexer&) = delete;\n    lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)\n    ~lexer() = default;\n\n  private:\n    /////////////////////\n    // locales\n    /////////////////////\n\n    /// return the locale-dependent decimal point\n    JSON_HEDLEY_PURE\n    static char get_decimal_point() noexcept\n    {\n        const auto* loc = localeconv();\n        JSON_ASSERT(loc != nullptr);\n        return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point);\n    }\n\n    /////////////////////\n    // scan functions\n    /////////////////////\n\n    /*!\n    @brief get codepoint from 4 hex characters following `\\u`\n\n    For input \"\\u c1 c2 c3 c4\" the codepoint is:\n      (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4\n    = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0)\n\n    Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f'\n    must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The\n    conversion is done by subtracting the offset (0x30, 0x37, and 0x57)\n    between the ASCII value of the character and the desired integer value.\n\n    @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or\n            non-hex character)\n    */\n    int get_codepoint()\n    {\n        // this function only makes sense after reading `\\u`\n        JSON_ASSERT(current == 'u');\n        int codepoint = 0;\n\n        const auto factors = { 12u, 8u, 4u, 0u };\n        for (const auto factor : factors)\n        {\n            get();\n\n            if (current >= '0' && current <= '9')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x30u) << factor);\n            }\n            else if (current >= 'A' && current <= 'F')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x37u) << factor);\n            }\n            else if (current >= 'a' && current <= 'f')\n            {\n                codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x57u) << factor);\n            }\n            else\n            {\n                return -1;\n            }\n        }\n\n        JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);\n        return codepoint;\n    }\n\n    /*!\n    @brief check if the next byte(s) are inside a given range\n\n    Adds the current byte and, for each passed range, reads a new byte and\n    checks if it is inside the range. If a violation was detected, set up an\n    error message and return false. Otherwise, return true.\n\n    @param[in] ranges  list of integers; interpreted as list of pairs of\n                       inclusive lower and upper bound, respectively\n\n    @pre The passed list @a ranges must have 2, 4, or 6 elements; that is,\n         1, 2, or 3 pairs. This precondition is enforced by an assertion.\n\n    @return true if and only if no range violation was detected\n    */\n    bool next_byte_in_range(std::initializer_list<char_int_type> ranges)\n    {\n        JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);\n        add(current);\n\n        for (auto range = ranges.begin(); range != ranges.end(); ++range)\n        {\n            get();\n            if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) // NOLINT(bugprone-inc-dec-in-conditions)\n            {\n                add(current);\n            }\n            else\n            {\n                error_message = \"invalid string: ill-formed UTF-8 byte\";\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /*!\n    @brief scan a string literal\n\n    This function scans a string according to Sect. 7 of RFC 8259. While\n    scanning, bytes are escaped and copied into buffer token_buffer. Then the\n    function returns successfully, token_buffer is *not* null-terminated (as it\n    may contain \\0 bytes), and token_buffer.size() is the number of bytes in the\n    string.\n\n    @return token_type::value_string if string could be successfully scanned,\n            token_type::parse_error otherwise\n\n    @note In case of errors, variable error_message contains a textual\n          description.\n    */\n    token_type scan_string()\n    {\n        // reset token_buffer (ignore opening quote)\n        reset();\n\n        // we entered the function by reading an open quote\n        JSON_ASSERT(current == '\\\"');\n\n        while (true)\n        {\n            // get next character\n            switch (get())\n            {\n                // end of file while parsing string\n                case char_traits<char_type>::eof():\n                {\n                    error_message = \"invalid string: missing closing quote\";\n                    return token_type::parse_error;\n                }\n\n                // closing quote\n                case '\\\"':\n                {\n                    return token_type::value_string;\n                }\n\n                // escapes\n                case '\\\\':\n                {\n                    switch (get())\n                    {\n                        // quotation mark\n                        case '\\\"':\n                            add('\\\"');\n                            break;\n                        // reverse solidus\n                        case '\\\\':\n                            add('\\\\');\n                            break;\n                        // solidus\n                        case '/':\n                            add('/');\n                            break;\n                        // backspace\n                        case 'b':\n                            add('\\b');\n                            break;\n                        // form feed\n                        case 'f':\n                            add('\\f');\n                            break;\n                        // line feed\n                        case 'n':\n                            add('\\n');\n                            break;\n                        // carriage return\n                        case 'r':\n                            add('\\r');\n                            break;\n                        // tab\n                        case 't':\n                            add('\\t');\n                            break;\n\n                        // unicode escapes\n                        case 'u':\n                        {\n                            const int codepoint1 = get_codepoint();\n                            int codepoint = codepoint1; // start with codepoint1\n\n                            if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1))\n                            {\n                                error_message = \"invalid string: '\\\\u' must be followed by 4 hex digits\";\n                                return token_type::parse_error;\n                            }\n\n                            // check if code point is a high surrogate\n                            if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF)\n                            {\n                                // expect next \\uxxxx entry\n                                if (JSON_HEDLEY_LIKELY(get() == '\\\\' && get() == 'u'))\n                                {\n                                    const int codepoint2 = get_codepoint();\n\n                                    if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1))\n                                    {\n                                        error_message = \"invalid string: '\\\\u' must be followed by 4 hex digits\";\n                                        return token_type::parse_error;\n                                    }\n\n                                    // check if codepoint2 is a low surrogate\n                                    if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF))\n                                    {\n                                        // overwrite codepoint\n                                        codepoint = static_cast<int>(\n                                                        // high surrogate occupies the most significant 22 bits\n                                                        (static_cast<unsigned int>(codepoint1) << 10u)\n                                                        // low surrogate occupies the least significant 15 bits\n                                                        + static_cast<unsigned int>(codepoint2)\n                                                        // there is still the 0xD800, 0xDC00 and 0x10000 noise\n                                                        // in the result, so we have to subtract with:\n                                                        // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00\n                                                        - 0x35FDC00u);\n                                    }\n                                    else\n                                    {\n                                        error_message = \"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF\";\n                                        return token_type::parse_error;\n                                    }\n                                }\n                                else\n                                {\n                                    error_message = \"invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF\";\n                                    return token_type::parse_error;\n                                }\n                            }\n                            else\n                            {\n                                if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF))\n                                {\n                                    error_message = \"invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF\";\n                                    return token_type::parse_error;\n                                }\n                            }\n\n                            // result of the above calculation yields a proper codepoint\n                            JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);\n\n                            // translate codepoint into bytes\n                            if (codepoint < 0x80)\n                            {\n                                // 1-byte characters: 0xxxxxxx (ASCII)\n                                add(static_cast<char_int_type>(codepoint));\n                            }\n                            else if (codepoint <= 0x7FF)\n                            {\n                                // 2-byte characters: 110xxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n                            else if (codepoint <= 0xFFFF)\n                            {\n                                // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n                            else\n                            {\n                                // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n                                add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));\n                                add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));\n                            }\n\n                            break;\n                        }\n\n                        // other characters after escape\n                        default:\n                            error_message = \"invalid string: forbidden character after backslash\";\n                            return token_type::parse_error;\n                    }\n\n                    break;\n                }\n\n                // invalid control characters\n                case 0x00:\n                {\n                    error_message = \"invalid string: control character U+0000 (NUL) must be escaped to \\\\u0000\";\n                    return token_type::parse_error;\n                }\n\n                case 0x01:\n                {\n                    error_message = \"invalid string: control character U+0001 (SOH) must be escaped to \\\\u0001\";\n                    return token_type::parse_error;\n                }\n\n                case 0x02:\n                {\n                    error_message = \"invalid string: control character U+0002 (STX) must be escaped to \\\\u0002\";\n                    return token_type::parse_error;\n                }\n\n                case 0x03:\n                {\n                    error_message = \"invalid string: control character U+0003 (ETX) must be escaped to \\\\u0003\";\n                    return token_type::parse_error;\n                }\n\n                case 0x04:\n                {\n                    error_message = \"invalid string: control character U+0004 (EOT) must be escaped to \\\\u0004\";\n                    return token_type::parse_error;\n                }\n\n                case 0x05:\n                {\n                    error_message = \"invalid string: control character U+0005 (ENQ) must be escaped to \\\\u0005\";\n                    return token_type::parse_error;\n                }\n\n                case 0x06:\n                {\n                    error_message = \"invalid string: control character U+0006 (ACK) must be escaped to \\\\u0006\";\n                    return token_type::parse_error;\n                }\n\n                case 0x07:\n                {\n                    error_message = \"invalid string: control character U+0007 (BEL) must be escaped to \\\\u0007\";\n                    return token_type::parse_error;\n                }\n\n                case 0x08:\n                {\n                    error_message = \"invalid string: control character U+0008 (BS) must be escaped to \\\\u0008 or \\\\b\";\n                    return token_type::parse_error;\n                }\n\n                case 0x09:\n                {\n                    error_message = \"invalid string: control character U+0009 (HT) must be escaped to \\\\u0009 or \\\\t\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0A:\n                {\n                    error_message = \"invalid string: control character U+000A (LF) must be escaped to \\\\u000A or \\\\n\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0B:\n                {\n                    error_message = \"invalid string: control character U+000B (VT) must be escaped to \\\\u000B\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0C:\n                {\n                    error_message = \"invalid string: control character U+000C (FF) must be escaped to \\\\u000C or \\\\f\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0D:\n                {\n                    error_message = \"invalid string: control character U+000D (CR) must be escaped to \\\\u000D or \\\\r\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0E:\n                {\n                    error_message = \"invalid string: control character U+000E (SO) must be escaped to \\\\u000E\";\n                    return token_type::parse_error;\n                }\n\n                case 0x0F:\n                {\n                    error_message = \"invalid string: control character U+000F (SI) must be escaped to \\\\u000F\";\n                    return token_type::parse_error;\n                }\n\n                case 0x10:\n                {\n                    error_message = \"invalid string: control character U+0010 (DLE) must be escaped to \\\\u0010\";\n                    return token_type::parse_error;\n                }\n\n                case 0x11:\n                {\n                    error_message = \"invalid string: control character U+0011 (DC1) must be escaped to \\\\u0011\";\n                    return token_type::parse_error;\n                }\n\n                case 0x12:\n                {\n                    error_message = \"invalid string: control character U+0012 (DC2) must be escaped to \\\\u0012\";\n                    return token_type::parse_error;\n                }\n\n                case 0x13:\n                {\n                    error_message = \"invalid string: control character U+0013 (DC3) must be escaped to \\\\u0013\";\n                    return token_type::parse_error;\n                }\n\n                case 0x14:\n                {\n                    error_message = \"invalid string: control character U+0014 (DC4) must be escaped to \\\\u0014\";\n                    return token_type::parse_error;\n                }\n\n                case 0x15:\n                {\n                    error_message = \"invalid string: control character U+0015 (NAK) must be escaped to \\\\u0015\";\n                    return token_type::parse_error;\n                }\n\n                case 0x16:\n                {\n                    error_message = \"invalid string: control character U+0016 (SYN) must be escaped to \\\\u0016\";\n                    return token_type::parse_error;\n                }\n\n                case 0x17:\n                {\n                    error_message = \"invalid string: control character U+0017 (ETB) must be escaped to \\\\u0017\";\n                    return token_type::parse_error;\n                }\n\n                case 0x18:\n                {\n                    error_message = \"invalid string: control character U+0018 (CAN) must be escaped to \\\\u0018\";\n                    return token_type::parse_error;\n                }\n\n                case 0x19:\n                {\n                    error_message = \"invalid string: control character U+0019 (EM) must be escaped to \\\\u0019\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1A:\n                {\n                    error_message = \"invalid string: control character U+001A (SUB) must be escaped to \\\\u001A\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1B:\n                {\n                    error_message = \"invalid string: control character U+001B (ESC) must be escaped to \\\\u001B\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1C:\n                {\n                    error_message = \"invalid string: control character U+001C (FS) must be escaped to \\\\u001C\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1D:\n                {\n                    error_message = \"invalid string: control character U+001D (GS) must be escaped to \\\\u001D\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1E:\n                {\n                    error_message = \"invalid string: control character U+001E (RS) must be escaped to \\\\u001E\";\n                    return token_type::parse_error;\n                }\n\n                case 0x1F:\n                {\n                    error_message = \"invalid string: control character U+001F (US) must be escaped to \\\\u001F\";\n                    return token_type::parse_error;\n                }\n\n                // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace))\n                case 0x20:\n                case 0x21:\n                case 0x23:\n                case 0x24:\n                case 0x25:\n                case 0x26:\n                case 0x27:\n                case 0x28:\n                case 0x29:\n                case 0x2A:\n                case 0x2B:\n                case 0x2C:\n                case 0x2D:\n                case 0x2E:\n                case 0x2F:\n                case 0x30:\n                case 0x31:\n                case 0x32:\n                case 0x33:\n                case 0x34:\n                case 0x35:\n                case 0x36:\n                case 0x37:\n                case 0x38:\n                case 0x39:\n                case 0x3A:\n                case 0x3B:\n                case 0x3C:\n                case 0x3D:\n                case 0x3E:\n                case 0x3F:\n                case 0x40:\n                case 0x41:\n                case 0x42:\n                case 0x43:\n                case 0x44:\n                case 0x45:\n                case 0x46:\n                case 0x47:\n                case 0x48:\n                case 0x49:\n                case 0x4A:\n                case 0x4B:\n                case 0x4C:\n                case 0x4D:\n                case 0x4E:\n                case 0x4F:\n                case 0x50:\n                case 0x51:\n                case 0x52:\n                case 0x53:\n                case 0x54:\n                case 0x55:\n                case 0x56:\n                case 0x57:\n                case 0x58:\n                case 0x59:\n                case 0x5A:\n                case 0x5B:\n                case 0x5D:\n                case 0x5E:\n                case 0x5F:\n                case 0x60:\n                case 0x61:\n                case 0x62:\n                case 0x63:\n                case 0x64:\n                case 0x65:\n                case 0x66:\n                case 0x67:\n                case 0x68:\n                case 0x69:\n                case 0x6A:\n                case 0x6B:\n                case 0x6C:\n                case 0x6D:\n                case 0x6E:\n                case 0x6F:\n                case 0x70:\n                case 0x71:\n                case 0x72:\n                case 0x73:\n                case 0x74:\n                case 0x75:\n                case 0x76:\n                case 0x77:\n                case 0x78:\n                case 0x79:\n                case 0x7A:\n                case 0x7B:\n                case 0x7C:\n                case 0x7D:\n                case 0x7E:\n                case 0x7F:\n                {\n                    add(current);\n                    break;\n                }\n\n                // U+0080..U+07FF: bytes C2..DF 80..BF\n                case 0xC2:\n                case 0xC3:\n                case 0xC4:\n                case 0xC5:\n                case 0xC6:\n                case 0xC7:\n                case 0xC8:\n                case 0xC9:\n                case 0xCA:\n                case 0xCB:\n                case 0xCC:\n                case 0xCD:\n                case 0xCE:\n                case 0xCF:\n                case 0xD0:\n                case 0xD1:\n                case 0xD2:\n                case 0xD3:\n                case 0xD4:\n                case 0xD5:\n                case 0xD6:\n                case 0xD7:\n                case 0xD8:\n                case 0xD9:\n                case 0xDA:\n                case 0xDB:\n                case 0xDC:\n                case 0xDD:\n                case 0xDE:\n                case 0xDF:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF})))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+0800..U+0FFF: bytes E0 A0..BF 80..BF\n                case 0xE0:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF\n                // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF\n                case 0xE1:\n                case 0xE2:\n                case 0xE3:\n                case 0xE4:\n                case 0xE5:\n                case 0xE6:\n                case 0xE7:\n                case 0xE8:\n                case 0xE9:\n                case 0xEA:\n                case 0xEB:\n                case 0xEC:\n                case 0xEE:\n                case 0xEF:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+D000..U+D7FF: bytes ED 80..9F 80..BF\n                case 0xED:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF\n                case 0xF0:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF\n                case 0xF1:\n                case 0xF2:\n                case 0xF3:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF\n                case 0xF4:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF}))))\n                    {\n                        return token_type::parse_error;\n                    }\n                    break;\n                }\n\n                // remaining bytes (80..C1 and F5..FF) are ill-formed\n                default:\n                {\n                    error_message = \"invalid string: ill-formed UTF-8 byte\";\n                    return token_type::parse_error;\n                }\n            }\n        }\n    }\n\n    /*!\n     * @brief scan a comment\n     * @return whether comment could be scanned successfully\n     */\n    bool scan_comment()\n    {\n        switch (get())\n        {\n            // single-line comments skip input until a newline or EOF is read\n            case '/':\n            {\n                while (true)\n                {\n                    switch (get())\n                    {\n                        case '\\n':\n                        case '\\r':\n                        case char_traits<char_type>::eof():\n                        case '\\0':\n                            return true;\n\n                        default:\n                            break;\n                    }\n                }\n            }\n\n            // multi-line comments skip input until */ is read\n            case '*':\n            {\n                while (true)\n                {\n                    switch (get())\n                    {\n                        case char_traits<char_type>::eof():\n                        case '\\0':\n                        {\n                            error_message = \"invalid comment; missing closing '*/'\";\n                            return false;\n                        }\n\n                        case '*':\n                        {\n                            switch (get())\n                            {\n                                case '/':\n                                    return true;\n\n                                default:\n                                {\n                                    unget();\n                                    continue;\n                                }\n                            }\n                        }\n\n                        default:\n                            continue;\n                    }\n                }\n            }\n\n            // unexpected character after reading '/'\n            default:\n            {\n                error_message = \"invalid comment; expecting '/' or '*' after '/'\";\n                return false;\n            }\n        }\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(float& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtof(str, endptr);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(double& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtod(str, endptr);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    static void strtof(long double& f, const char* str, char** endptr) noexcept\n    {\n        f = std::strtold(str, endptr);\n    }\n\n    /*!\n    @brief scan a number literal\n\n    This function scans a string according to Sect. 6 of RFC 8259.\n\n    The function is realized with a deterministic finite state machine derived\n    from the grammar described in RFC 8259. Starting in state \"init\", the\n    input is read and used to determined the next state. Only state \"done\"\n    accepts the number. State \"error\" is a trap state to model errors. In the\n    table below, \"anything\" means any character but the ones listed before.\n\n    state    | 0        | 1-9      | e E      | +       | -       | .        | anything\n    ---------|----------|----------|----------|---------|---------|----------|-----------\n    init     | zero     | any1     | [error]  | [error] | minus   | [error]  | [error]\n    minus    | zero     | any1     | [error]  | [error] | [error] | [error]  | [error]\n    zero     | done     | done     | exponent | done    | done    | decimal1 | done\n    any1     | any1     | any1     | exponent | done    | done    | decimal1 | done\n    decimal1 | decimal2 | decimal2 | [error]  | [error] | [error] | [error]  | [error]\n    decimal2 | decimal2 | decimal2 | exponent | done    | done    | done     | done\n    exponent | any2     | any2     | [error]  | sign    | sign    | [error]  | [error]\n    sign     | any2     | any2     | [error]  | [error] | [error] | [error]  | [error]\n    any2     | any2     | any2     | done     | done    | done    | done     | done\n\n    The state machine is realized with one label per state (prefixed with\n    \"scan_number_\") and `goto` statements between them. The state machine\n    contains cycles, but any cycle can be left when EOF is read. Therefore,\n    the function is guaranteed to terminate.\n\n    During scanning, the read bytes are stored in token_buffer. This string is\n    then converted to a signed integer, an unsigned integer, or a\n    floating-point number.\n\n    @return token_type::value_unsigned, token_type::value_integer, or\n            token_type::value_float if number could be successfully scanned,\n            token_type::parse_error otherwise\n\n    @note The scanner is independent of the current locale. Internally, the\n          locale's decimal point is used instead of `.` to work with the\n          locale-dependent converters.\n    */\n    token_type scan_number()  // lgtm [cpp/use-of-goto] `goto` is used in this function to implement the number-parsing state machine described above. By design, any finite input will eventually reach the \"done\" state or return token_type::parse_error. In each intermediate state, 1 byte of the input is appended to the token_buffer vector, and only the already initialized variables token_buffer, number_type, and error_message are manipulated.\n    {\n        // reset token_buffer to store the number's bytes\n        reset();\n\n        // the type of the parsed number; initially set to unsigned; will be\n        // changed if minus sign, decimal point or exponent is read\n        token_type number_type = token_type::value_unsigned;\n\n        // state (init): we just found out we need to scan a number\n        switch (current)\n        {\n            case '-':\n            {\n                add(current);\n                goto scan_number_minus;\n            }\n\n            case '0':\n            {\n                add(current);\n                goto scan_number_zero;\n            }\n\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            // all other characters are rejected outside scan_number()\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n        }\n\nscan_number_minus:\n        // state: we just parsed a leading minus sign\n        number_type = token_type::value_integer;\n        switch (get())\n        {\n            case '0':\n            {\n                add(current);\n                goto scan_number_zero;\n            }\n\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after '-'\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_zero:\n        // state: we just parse a zero (maybe with a leading minus sign)\n        switch (get())\n        {\n            case '.':\n            {\n                add(decimal_point_char);\n                decimal_point_position = token_buffer.size() - 1;\n                goto scan_number_decimal1;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_any1:\n        // state: we just parsed a number 0-9 (maybe with a leading minus sign)\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any1;\n            }\n\n            case '.':\n            {\n                add(decimal_point_char);\n                decimal_point_position = token_buffer.size() - 1;\n                goto scan_number_decimal1;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_decimal1:\n        // state: we just parsed a decimal point\n        number_type = token_type::value_float;\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_decimal2;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after '.'\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_decimal2:\n        // we just parsed at least one number after a decimal point\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_decimal2;\n            }\n\n            case 'e':\n            case 'E':\n            {\n                add(current);\n                goto scan_number_exponent;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_exponent:\n        // we just parsed an exponent\n        number_type = token_type::value_float;\n        switch (get())\n        {\n            case '+':\n            case '-':\n            {\n                add(current);\n                goto scan_number_sign;\n            }\n\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n            {\n                error_message =\n                    \"invalid number; expected '+', '-', or digit after exponent\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_sign:\n        // we just parsed an exponent sign\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n            {\n                error_message = \"invalid number; expected digit after exponent sign\";\n                return token_type::parse_error;\n            }\n        }\n\nscan_number_any2:\n        // we just parsed a number after the exponent or exponent sign\n        switch (get())\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            {\n                add(current);\n                goto scan_number_any2;\n            }\n\n            default:\n                goto scan_number_done;\n        }\n\nscan_number_done:\n        // unget the character after the number (we only read it to know that\n        // we are done scanning a number)\n        unget();\n\n        char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n        errno = 0;\n\n        // try to parse integers first and fall back to floats\n        if (number_type == token_type::value_unsigned)\n        {\n            const auto x = std::strtoull(token_buffer.data(), &endptr, 10);\n\n            // we checked the number format before\n            JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n            if (errno != ERANGE)\n            {\n                value_unsigned = static_cast<number_unsigned_t>(x);\n                if (value_unsigned == x)\n                {\n                    return token_type::value_unsigned;\n                }\n            }\n        }\n        else if (number_type == token_type::value_integer)\n        {\n            const auto x = std::strtoll(token_buffer.data(), &endptr, 10);\n\n            // we checked the number format before\n            JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n            if (errno != ERANGE)\n            {\n                value_integer = static_cast<number_integer_t>(x);\n                if (value_integer == x)\n                {\n                    return token_type::value_integer;\n                }\n            }\n        }\n\n        // this code is reached if we parse a floating-point number or if an\n        // integer conversion above failed\n        strtof(value_float, token_buffer.data(), &endptr);\n\n        // we checked the number format before\n        JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());\n\n        return token_type::value_float;\n    }\n\n    /*!\n    @param[in] literal_text  the literal text to expect\n    @param[in] length        the length of the passed literal text\n    @param[in] return_type   the token type to return on success\n    */\n    JSON_HEDLEY_NON_NULL(2)\n    token_type scan_literal(const char_type* literal_text, const std::size_t length,\n                            token_type return_type)\n    {\n        JSON_ASSERT(char_traits<char_type>::to_char_type(current) == literal_text[0]);\n        for (std::size_t i = 1; i < length; ++i)\n        {\n            if (JSON_HEDLEY_UNLIKELY(char_traits<char_type>::to_char_type(get()) != literal_text[i]))\n            {\n                error_message = \"invalid literal\";\n                return token_type::parse_error;\n            }\n        }\n        return return_type;\n    }\n\n    /////////////////////\n    // input management\n    /////////////////////\n\n    /// reset token_buffer; current character is beginning of token\n    void reset() noexcept\n    {\n        token_buffer.clear();\n        token_string.clear();\n        decimal_point_position = std::string::npos;\n        token_string.push_back(char_traits<char_type>::to_char_type(current));\n    }\n\n    /*\n    @brief get next character from the input\n\n    This function provides the interface to the used input adapter. It does\n    not throw in case the input reached EOF, but returns a\n    `char_traits<char>::eof()` in that case.  Stores the scanned characters\n    for use in error messages.\n\n    @return character read from the input\n    */\n    char_int_type get()\n    {\n        ++position.chars_read_total;\n        ++position.chars_read_current_line;\n\n        if (next_unget)\n        {\n            // just reset the next_unget variable and work with current\n            next_unget = false;\n        }\n        else\n        {\n            current = ia.get_character();\n        }\n\n        if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof()))\n        {\n            token_string.push_back(char_traits<char_type>::to_char_type(current));\n        }\n\n        if (current == '\\n')\n        {\n            ++position.lines_read;\n            position.chars_read_current_line = 0;\n        }\n\n        return current;\n    }\n\n    /*!\n    @brief unget current character (read it again on next get)\n\n    We implement unget by setting variable next_unget to true. The input is not\n    changed - we just simulate ungetting by modifying chars_read_total,\n    chars_read_current_line, and token_string. The next call to get() will\n    behave as if the unget character is read again.\n    */\n    void unget()\n    {\n        next_unget = true;\n\n        --position.chars_read_total;\n\n        // in case we \"unget\" a newline, we have to also decrement the lines_read\n        if (position.chars_read_current_line == 0)\n        {\n            if (position.lines_read > 0)\n            {\n                --position.lines_read;\n            }\n        }\n        else\n        {\n            --position.chars_read_current_line;\n        }\n\n        if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof()))\n        {\n            JSON_ASSERT(!token_string.empty());\n            token_string.pop_back();\n        }\n    }\n\n    /// add a character to token_buffer\n    void add(char_int_type c)\n    {\n        token_buffer.push_back(static_cast<typename string_t::value_type>(c));\n    }\n\n  public:\n    /////////////////////\n    // value getters\n    /////////////////////\n\n    /// return integer value\n    constexpr number_integer_t get_number_integer() const noexcept\n    {\n        return value_integer;\n    }\n\n    /// return unsigned integer value\n    constexpr number_unsigned_t get_number_unsigned() const noexcept\n    {\n        return value_unsigned;\n    }\n\n    /// return floating-point value\n    constexpr number_float_t get_number_float() const noexcept\n    {\n        return value_float;\n    }\n\n    /// return current string value (implicitly resets the token; useful only once)\n    string_t& get_string()\n    {\n        // translate decimal points from locale back to '.' (#4084)\n        if (decimal_point_char != '.' && decimal_point_position != std::string::npos)\n        {\n            token_buffer[decimal_point_position] = '.';\n        }\n        return token_buffer;\n    }\n\n    /////////////////////\n    // diagnostics\n    /////////////////////\n\n    /// return position of last read token\n    constexpr position_t get_position() const noexcept\n    {\n        return position;\n    }\n\n    /// return the last read token (for errors only).  Will never contain EOF\n    /// (an arbitrary value that is not a valid char value, often -1), because\n    /// 255 may legitimately occur.  May contain NUL, which should be escaped.\n    std::string get_token_string() const\n    {\n        // escape control characters\n        std::string result;\n        for (const auto c : token_string)\n        {\n            if (static_cast<unsigned char>(c) <= '\\x1F')\n            {\n                // escape control characters\n                std::array<char, 9> cs{{}};\n                static_cast<void>((std::snprintf)(cs.data(), cs.size(), \"<U+%.4X>\", static_cast<unsigned char>(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n                result += cs.data();\n            }\n            else\n            {\n                // add character as is\n                result.push_back(static_cast<std::string::value_type>(c));\n            }\n        }\n\n        return result;\n    }\n\n    /// return syntax error message\n    JSON_HEDLEY_RETURNS_NON_NULL\n    constexpr const char* get_error_message() const noexcept\n    {\n        return error_message;\n    }\n\n    /////////////////////\n    // actual scanner\n    /////////////////////\n\n    /*!\n    @brief skip the UTF-8 byte order mark\n    @return true iff there is no BOM or the correct BOM has been skipped\n    */\n    bool skip_bom()\n    {\n        if (get() == 0xEF)\n        {\n            // check if we completely parse the BOM\n            return get() == 0xBB && get() == 0xBF;\n        }\n\n        // the first character is not the beginning of the BOM; unget it to\n        // process is later\n        unget();\n        return true;\n    }\n\n    void skip_whitespace()\n    {\n        do\n        {\n            get();\n        }\n        while (current == ' ' || current == '\\t' || current == '\\n' || current == '\\r');\n    }\n\n    token_type scan()\n    {\n        // initially, skip the BOM\n        if (position.chars_read_total == 0 && !skip_bom())\n        {\n            error_message = \"invalid BOM; must be 0xEF 0xBB 0xBF if given\";\n            return token_type::parse_error;\n        }\n\n        // read next character and ignore whitespace\n        skip_whitespace();\n\n        // ignore comments\n        while (ignore_comments && current == '/')\n        {\n            if (!scan_comment())\n            {\n                return token_type::parse_error;\n            }\n\n            // skip following whitespace\n            skip_whitespace();\n        }\n\n        switch (current)\n        {\n            // structural characters\n            case '[':\n                return token_type::begin_array;\n            case ']':\n                return token_type::end_array;\n            case '{':\n                return token_type::begin_object;\n            case '}':\n                return token_type::end_object;\n            case ':':\n                return token_type::name_separator;\n            case ',':\n                return token_type::value_separator;\n\n            // literals\n            case 't':\n            {\n                std::array<char_type, 4> true_literal = {{static_cast<char_type>('t'), static_cast<char_type>('r'), static_cast<char_type>('u'), static_cast<char_type>('e')}};\n                return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);\n            }\n            case 'f':\n            {\n                std::array<char_type, 5> false_literal = {{static_cast<char_type>('f'), static_cast<char_type>('a'), static_cast<char_type>('l'), static_cast<char_type>('s'), static_cast<char_type>('e')}};\n                return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);\n            }\n            case 'n':\n            {\n                std::array<char_type, 4> null_literal = {{static_cast<char_type>('n'), static_cast<char_type>('u'), static_cast<char_type>('l'), static_cast<char_type>('l')}};\n                return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);\n            }\n\n            // string\n            case '\\\"':\n                return scan_string();\n\n            // number\n            case '-':\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n                return scan_number();\n\n            // end of input (the null byte is needed when parsing from\n            // string literals)\n            case '\\0':\n            case char_traits<char_type>::eof():\n                return token_type::end_of_input;\n\n            // error\n            default:\n                error_message = \"invalid literal\";\n                return token_type::parse_error;\n        }\n    }\n\n  private:\n    /// input adapter\n    InputAdapterType ia;\n\n    /// whether comments should be ignored (true) or signaled as errors (false)\n    const bool ignore_comments = false;\n\n    /// the current character\n    char_int_type current = char_traits<char_type>::eof();\n\n    /// whether the next get() call should just return current\n    bool next_unget = false;\n\n    /// the start position of the current token\n    position_t position {};\n\n    /// raw input token string (for error messages)\n    std::vector<char_type> token_string {};\n\n    /// buffer for variable-length tokens (numbers, strings)\n    string_t token_buffer {};\n\n    /// a description of occurred lexer errors\n    const char* error_message = \"\";\n\n    // number values\n    number_integer_t value_integer = 0;\n    number_unsigned_t value_unsigned = 0;\n    number_float_t value_float = 0;\n\n    /// the decimal point\n    const char_int_type decimal_point_char = '.';\n    /// the position of the decimal point in the input\n    std::size_t decimal_point_position = std::string::npos;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/input/parser.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cmath> // isfinite\n#include <cstdint> // uint8_t\n#include <functional> // function\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/input/input_adapters.hpp>\n#include <nlohmann/detail/input/json_sax.hpp>\n#include <nlohmann/detail/input/lexer.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/is_sax.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n////////////\n// parser //\n////////////\n\nenum class parse_event_t : std::uint8_t\n{\n    /// the parser read `{` and started to process a JSON object\n    object_start,\n    /// the parser read `}` and finished processing a JSON object\n    object_end,\n    /// the parser read `[` and started to process a JSON array\n    array_start,\n    /// the parser read `]` and finished processing a JSON array\n    array_end,\n    /// the parser read a key of a value in an object\n    key,\n    /// the parser finished reading a JSON value\n    value\n};\n\ntemplate<typename BasicJsonType>\nusing parser_callback_t =\n    std::function<bool(int /*depth*/, parse_event_t /*event*/, BasicJsonType& /*parsed*/)>;\n\n/*!\n@brief syntax analysis\n\nThis class implements a recursive descent parser.\n*/\ntemplate<typename BasicJsonType, typename InputAdapterType>\nclass parser\n{\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using lexer_t = lexer<BasicJsonType, InputAdapterType>;\n    using token_type = typename lexer_t::token_type;\n\n  public:\n    /// a parser reading from an input adapter\n    explicit parser(InputAdapterType&& adapter,\n                    parser_callback_t<BasicJsonType> cb = nullptr,\n                    const bool allow_exceptions_ = true,\n                    const bool skip_comments = false)\n        : callback(std::move(cb))\n        , m_lexer(std::move(adapter), skip_comments)\n        , allow_exceptions(allow_exceptions_)\n    {\n        // read first token\n        get_token();\n    }\n\n    /*!\n    @brief public parser interface\n\n    @param[in] strict      whether to expect the last token to be EOF\n    @param[in,out] result  parsed JSON value\n\n    @throw parse_error.101 in case of an unexpected token\n    @throw parse_error.102 if to_unicode fails or surrogate error\n    @throw parse_error.103 if to_unicode fails\n    */\n    void parse(const bool strict, BasicJsonType& result)\n    {\n        if (callback)\n        {\n            json_sax_dom_callback_parser<BasicJsonType, InputAdapterType> sdp(result, callback, allow_exceptions, &m_lexer);\n            sax_parse_internal(&sdp);\n\n            // in strict mode, input must be completely read\n            if (strict && (get_token() != token_type::end_of_input))\n            {\n                sdp.parse_error(m_lexer.get_position(),\n                                m_lexer.get_token_string(),\n                                parse_error::create(101, m_lexer.get_position(),\n                                                    exception_message(token_type::end_of_input, \"value\"), nullptr));\n            }\n\n            // in case of an error, return discarded value\n            if (sdp.is_errored())\n            {\n                result = value_t::discarded;\n                return;\n            }\n\n            // set top-level value to null if it was discarded by the callback\n            // function\n            if (result.is_discarded())\n            {\n                result = nullptr;\n            }\n        }\n        else\n        {\n            json_sax_dom_parser<BasicJsonType, InputAdapterType> sdp(result, allow_exceptions, &m_lexer);\n            sax_parse_internal(&sdp);\n\n            // in strict mode, input must be completely read\n            if (strict && (get_token() != token_type::end_of_input))\n            {\n                sdp.parse_error(m_lexer.get_position(),\n                                m_lexer.get_token_string(),\n                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, \"value\"), nullptr));\n            }\n\n            // in case of an error, return discarded value\n            if (sdp.is_errored())\n            {\n                result = value_t::discarded;\n                return;\n            }\n        }\n\n        result.assert_invariant();\n    }\n\n    /*!\n    @brief public accept interface\n\n    @param[in] strict  whether to expect the last token to be EOF\n    @return whether the input is a proper JSON text\n    */\n    bool accept(const bool strict = true)\n    {\n        json_sax_acceptor<BasicJsonType> sax_acceptor;\n        return sax_parse(&sax_acceptor, strict);\n    }\n\n    template<typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    bool sax_parse(SAX* sax, const bool strict = true)\n    {\n        (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};\n        const bool result = sax_parse_internal(sax);\n\n        // strict mode: next byte must be EOF\n        if (result && strict && (get_token() != token_type::end_of_input))\n        {\n            return sax->parse_error(m_lexer.get_position(),\n                                    m_lexer.get_token_string(),\n                                    parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, \"value\"), nullptr));\n        }\n\n        return result;\n    }\n\n  private:\n    template<typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    bool sax_parse_internal(SAX* sax)\n    {\n        // stack to remember the hierarchy of structured values we are parsing\n        // true = array; false = object\n        std::vector<bool> states;\n        // value to avoid a goto (see comment where set to true)\n        bool skip_to_state_evaluation = false;\n\n        while (true)\n        {\n            if (!skip_to_state_evaluation)\n            {\n                // invariant: get_token() was called before each iteration\n                switch (last_token)\n                {\n                    case token_type::begin_object:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->start_object(detail::unknown_size())))\n                        {\n                            return false;\n                        }\n\n                        // closing } -> we are done\n                        if (get_token() == token_type::end_object)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))\n                            {\n                                return false;\n                            }\n                            break;\n                        }\n\n                        // parse key\n                        if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, \"object key\"), nullptr));\n                        }\n                        if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n\n                        // parse separator (:)\n                        if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, \"object separator\"), nullptr));\n                        }\n\n                        // remember we are now inside an object\n                        states.push_back(false);\n\n                        // parse values\n                        get_token();\n                        continue;\n                    }\n\n                    case token_type::begin_array:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->start_array(detail::unknown_size())))\n                        {\n                            return false;\n                        }\n\n                        // closing ] -> we are done\n                        if (get_token() == token_type::end_array)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))\n                            {\n                                return false;\n                            }\n                            break;\n                        }\n\n                        // remember we are now inside an array\n                        states.push_back(true);\n\n                        // parse values (no need to call get_token)\n                        continue;\n                    }\n\n                    case token_type::value_float:\n                    {\n                        const auto res = m_lexer.get_number_float();\n\n                        if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res)))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    out_of_range::create(406, concat(\"number overflow parsing '\", m_lexer.get_token_string(), '\\''), nullptr));\n                        }\n\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n\n                        break;\n                    }\n\n                    case token_type::literal_false:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false)))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::literal_null:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->null()))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::literal_true:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true)))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_integer:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_string:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::value_unsigned:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned())))\n                        {\n                            return false;\n                        }\n                        break;\n                    }\n\n                    case token_type::parse_error:\n                    {\n                        // using \"uninitialized\" to avoid \"expected\" message\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, \"value\"), nullptr));\n                    }\n                    case token_type::end_of_input:\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(m_lexer.get_position().chars_read_total == 1))\n                        {\n                            return sax->parse_error(m_lexer.get_position(),\n                                                    m_lexer.get_token_string(),\n                                                    parse_error::create(101, m_lexer.get_position(),\n                                                            \"attempting to parse an empty input; check that your input string or stream contains the expected JSON\", nullptr));\n                        }\n\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, \"value\"), nullptr));\n                    }\n                    case token_type::uninitialized:\n                    case token_type::end_array:\n                    case token_type::end_object:\n                    case token_type::name_separator:\n                    case token_type::value_separator:\n                    case token_type::literal_or_value:\n                    default: // the last token was unexpected\n                    {\n                        return sax->parse_error(m_lexer.get_position(),\n                                                m_lexer.get_token_string(),\n                                                parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, \"value\"), nullptr));\n                    }\n                }\n            }\n            else\n            {\n                skip_to_state_evaluation = false;\n            }\n\n            // we reached this line after we successfully parsed a value\n            if (states.empty())\n            {\n                // empty stack: we reached the end of the hierarchy: done\n                return true;\n            }\n\n            if (states.back())  // array\n            {\n                // comma -> next value\n                if (get_token() == token_type::value_separator)\n                {\n                    // parse a new value\n                    get_token();\n                    continue;\n                }\n\n                // closing ]\n                if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array))\n                {\n                    if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))\n                    {\n                        return false;\n                    }\n\n                    // We are done with this array. Before we can parse a\n                    // new value, we need to evaluate the new state first.\n                    // By setting skip_to_state_evaluation to false, we\n                    // are effectively jumping to the beginning of this if.\n                    JSON_ASSERT(!states.empty());\n                    states.pop_back();\n                    skip_to_state_evaluation = true;\n                    continue;\n                }\n\n                return sax->parse_error(m_lexer.get_position(),\n                                        m_lexer.get_token_string(),\n                                        parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, \"array\"), nullptr));\n            }\n\n            // states.back() is false -> object\n\n            // comma -> next value\n            if (get_token() == token_type::value_separator)\n            {\n                // parse key\n                if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string))\n                {\n                    return sax->parse_error(m_lexer.get_position(),\n                                            m_lexer.get_token_string(),\n                                            parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, \"object key\"), nullptr));\n                }\n\n                if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))\n                {\n                    return false;\n                }\n\n                // parse separator (:)\n                if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))\n                {\n                    return sax->parse_error(m_lexer.get_position(),\n                                            m_lexer.get_token_string(),\n                                            parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, \"object separator\"), nullptr));\n                }\n\n                // parse values\n                get_token();\n                continue;\n            }\n\n            // closing }\n            if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object))\n            {\n                if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))\n                {\n                    return false;\n                }\n\n                // We are done with this object. Before we can parse a\n                // new value, we need to evaluate the new state first.\n                // By setting skip_to_state_evaluation to false, we\n                // are effectively jumping to the beginning of this if.\n                JSON_ASSERT(!states.empty());\n                states.pop_back();\n                skip_to_state_evaluation = true;\n                continue;\n            }\n\n            return sax->parse_error(m_lexer.get_position(),\n                                    m_lexer.get_token_string(),\n                                    parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, \"object\"), nullptr));\n        }\n    }\n\n    /// get next token from lexer\n    token_type get_token()\n    {\n        return last_token = m_lexer.scan();\n    }\n\n    std::string exception_message(const token_type expected, const std::string& context)\n    {\n        std::string error_msg = \"syntax error \";\n\n        if (!context.empty())\n        {\n            error_msg += concat(\"while parsing \", context, ' ');\n        }\n\n        error_msg += \"- \";\n\n        if (last_token == token_type::parse_error)\n        {\n            error_msg += concat(m_lexer.get_error_message(), \"; last read: '\",\n                                m_lexer.get_token_string(), '\\'');\n        }\n        else\n        {\n            error_msg += concat(\"unexpected \", lexer_t::token_type_name(last_token));\n        }\n\n        if (expected != token_type::uninitialized)\n        {\n            error_msg += concat(\"; expected \", lexer_t::token_type_name(expected));\n        }\n\n        return error_msg;\n    }\n\n  private:\n    /// callback function\n    const parser_callback_t<BasicJsonType> callback = nullptr;\n    /// the type of the last read token\n    token_type last_token = token_type::uninitialized;\n    /// the lexer\n    lexer_t m_lexer;\n    /// whether to throw exceptions in case of errors\n    const bool allow_exceptions = true;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/input/position_t.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef> // size_t\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/// struct to capture the start position of the current token\nstruct position_t\n{\n    /// the total number of characters read\n    std::size_t chars_read_total = 0;\n    /// the number of characters read in the current line\n    std::size_t chars_read_current_line = 0;\n    /// the number of lines read\n    std::size_t lines_read = 0;\n\n    /// conversion to size_t to preserve SAX interface\n    constexpr operator size_t() const\n    {\n        return chars_read_total;\n    }\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/iterators/internal_iterator.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/iterators/primitive_iterator.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/*!\n@brief an iterator value\n\n@note This structure could easily be a union, but MSVC currently does not allow\nunions members with complex constructors, see https://github.com/nlohmann/json/pull/105.\n*/\ntemplate<typename BasicJsonType> struct internal_iterator\n{\n    /// iterator for JSON objects\n    typename BasicJsonType::object_t::iterator object_iterator {};\n    /// iterator for JSON arrays\n    typename BasicJsonType::array_t::iterator array_iterator {};\n    /// generic iterator for all other types\n    primitive_iterator_t primitive_iterator {};\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/iterators/iter_impl.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next\n#include <type_traits> // conditional, is_const, remove_const\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/iterators/internal_iterator.hpp>\n#include <nlohmann/detail/iterators/primitive_iterator.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n// forward declare, to be able to friend it later on\ntemplate<typename IteratorType> class iteration_proxy;\ntemplate<typename IteratorType> class iteration_proxy_value;\n\n/*!\n@brief a template for a bidirectional iterator for the @ref basic_json class\nThis class implements a both iterators (iterator and const_iterator) for the\n@ref basic_json class.\n@note An iterator is called *initialized* when a pointer to a JSON value has\n      been set (e.g., by a constructor or a copy assignment). If the iterator is\n      default-constructed, it is *uninitialized* and most methods are undefined.\n      **The library uses assertions to detect calls on uninitialized iterators.**\n@requirement The class satisfies the following concept requirements:\n-\n[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):\n  The iterator that can be moved can be moved in both directions (i.e.\n  incremented and decremented).\n@since version 1.0.0, simplified in version 2.0.9, change to bidirectional\n       iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593)\n*/\ntemplate<typename BasicJsonType>\nclass iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)\n{\n    /// the iterator with BasicJsonType of different const-ness\n    using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;\n    /// allow basic_json to access private members\n    friend other_iter_impl;\n    friend BasicJsonType;\n    friend iteration_proxy<iter_impl>;\n    friend iteration_proxy_value<iter_impl>;\n\n    using object_t = typename BasicJsonType::object_t;\n    using array_t = typename BasicJsonType::array_t;\n    // make sure BasicJsonType is basic_json or const basic_json\n    static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value,\n                  \"iter_impl only accepts (const) basic_json\");\n    // superficial check for the LegacyBidirectionalIterator named requirement\n    static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value\n                  &&  std::is_base_of<std::bidirectional_iterator_tag, typename std::iterator_traits<typename array_t::iterator>::iterator_category>::value,\n                  \"basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement.\");\n\n  public:\n    /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17.\n    /// The C++ Standard has never required user-defined iterators to derive from std::iterator.\n    /// A user-defined iterator should provide publicly accessible typedefs named\n    /// iterator_category, value_type, difference_type, pointer, and reference.\n    /// Note that value_type is required to be non-const, even for constant iterators.\n    using iterator_category = std::bidirectional_iterator_tag;\n\n    /// the type of the values when the iterator is dereferenced\n    using value_type = typename BasicJsonType::value_type;\n    /// a type to represent differences between iterators\n    using difference_type = typename BasicJsonType::difference_type;\n    /// defines a pointer to the type iterated over (value_type)\n    using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,\n          typename BasicJsonType::const_pointer,\n          typename BasicJsonType::pointer>::type;\n    /// defines a reference to the type iterated over (value_type)\n    using reference =\n        typename std::conditional<std::is_const<BasicJsonType>::value,\n        typename BasicJsonType::const_reference,\n        typename BasicJsonType::reference>::type;\n\n    iter_impl() = default;\n    ~iter_impl() = default;\n    iter_impl(iter_impl&&) noexcept = default;\n    iter_impl& operator=(iter_impl&&) noexcept = default;\n\n    /*!\n    @brief constructor for a given JSON instance\n    @param[in] object  pointer to a JSON object for this iterator\n    @pre object != nullptr\n    @post The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    explicit iter_impl(pointer object) noexcept : m_object(object)\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = typename object_t::iterator();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = typename array_t::iterator();\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                m_it.primitive_iterator = primitive_iterator_t();\n                break;\n            }\n        }\n    }\n\n    /*!\n    @note The conventional copy constructor and copy assignment are implicitly\n          defined. Combined with the following converting constructor and\n          assignment, they support: (1) copy from iterator to iterator, (2)\n          copy from const iterator to const iterator, and (3) conversion from\n          iterator to const iterator. However conversion from const iterator\n          to iterator is not defined.\n    */\n\n    /*!\n    @brief const copy constructor\n    @param[in] other const iterator to copy from\n    @note This copy constructor had to be defined explicitly to circumvent a bug\n          occurring on msvc v19.0 compiler (VS 2015) debug build. For more\n          information refer to: https://github.com/nlohmann/json/issues/1608\n    */\n    iter_impl(const iter_impl<const BasicJsonType>& other) noexcept\n        : m_object(other.m_object), m_it(other.m_it)\n    {}\n\n    /*!\n    @brief converting assignment\n    @param[in] other const iterator to copy from\n    @return const/non-const iterator\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept\n    {\n        if (&other != this)\n        {\n            m_object = other.m_object;\n            m_it = other.m_it;\n        }\n        return *this;\n    }\n\n    /*!\n    @brief converting constructor\n    @param[in] other  non-const iterator to copy from\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept\n        : m_object(other.m_object), m_it(other.m_it)\n    {}\n\n    /*!\n    @brief converting assignment\n    @param[in] other  non-const iterator to copy from\n    @return const/non-const iterator\n    @note It is not checked whether @a other is initialized.\n    */\n    iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept // NOLINT(cert-oop54-cpp)\n    {\n        m_object = other.m_object;\n        m_it = other.m_it;\n        return *this;\n    }\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    /*!\n    @brief set the iterator to the first value\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    void set_begin() noexcept\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = m_object->m_data.m_value.object->begin();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = m_object->m_data.m_value.array->begin();\n                break;\n            }\n\n            case value_t::null:\n            {\n                // set to end so begin()==end() is true: null is empty\n                m_it.primitive_iterator.set_end();\n                break;\n            }\n\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                m_it.primitive_iterator.set_begin();\n                break;\n            }\n        }\n    }\n\n    /*!\n    @brief set the iterator past the last value\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    void set_end() noexcept\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                m_it.object_iterator = m_object->m_data.m_value.object->end();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_it.array_iterator = m_object->m_data.m_value.array->end();\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                m_it.primitive_iterator.set_end();\n                break;\n            }\n        }\n    }\n\n  public:\n    /*!\n    @brief return a reference to the value pointed to by the iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference operator*() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());\n                return m_it.object_iterator->second;\n            }\n\n            case value_t::array:\n            {\n                JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());\n                return *m_it.array_iterator;\n            }\n\n            case value_t::null:\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\", m_object));\n\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))\n                {\n                    return *m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\", m_object));\n            }\n        }\n    }\n\n    /*!\n    @brief dereference the iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    pointer operator->() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());\n                return &(m_it.object_iterator->second);\n            }\n\n            case value_t::array:\n            {\n                JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());\n                return &*m_it.array_iterator;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))\n                {\n                    return m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\", m_object));\n            }\n        }\n    }\n\n    /*!\n    @brief post-increment (it++)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator++(int)& // NOLINT(cert-dcl21-cpp)\n    {\n        auto result = *this;\n        ++(*this);\n        return result;\n    }\n\n    /*!\n    @brief pre-increment (++it)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator++()\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                std::advance(m_it.object_iterator, 1);\n                break;\n            }\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, 1);\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                ++m_it.primitive_iterator;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief post-decrement (it--)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator--(int)& // NOLINT(cert-dcl21-cpp)\n    {\n        auto result = *this;\n        --(*this);\n        return result;\n    }\n\n    /*!\n    @brief pre-decrement (--it)\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator--()\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n            {\n                std::advance(m_it.object_iterator, -1);\n                break;\n            }\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, -1);\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                --m_it.primitive_iterator;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief comparison: equal\n    @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.\n    */\n    template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >\n    bool operator==(const IterImpl& other) const\n    {\n        // if objects are not the same, the comparison is undefined\n        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(212, \"cannot compare iterators of different containers\", m_object));\n        }\n\n        // value-initialized forward iterators can be compared, and must compare equal to other value-initialized iterators of the same type #4493\n        if (m_object == nullptr)\n        {\n            return true;\n        }\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n                return (m_it.object_iterator == other.m_it.object_iterator);\n\n            case value_t::array:\n                return (m_it.array_iterator == other.m_it.array_iterator);\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n                return (m_it.primitive_iterator == other.m_it.primitive_iterator);\n        }\n    }\n\n    /*!\n    @brief comparison: not equal\n    @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.\n    */\n    template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >\n    bool operator!=(const IterImpl& other) const\n    {\n        return !operator==(other);\n    }\n\n    /*!\n    @brief comparison: smaller\n    @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.\n    */\n    bool operator<(const iter_impl& other) const\n    {\n        // if objects are not the same, the comparison is undefined\n        if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(212, \"cannot compare iterators of different containers\", m_object));\n        }\n\n        // value-initialized forward iterators can be compared, and must compare equal to other value-initialized iterators of the same type #4493\n        if (m_object == nullptr)\n        {\n            // the iterators are both value-initialized and are to be considered equal, but this function checks for smaller, so we return false\n            return false;\n        }\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(213, \"cannot compare order of object iterators\", m_object));\n\n            case value_t::array:\n                return (m_it.array_iterator < other.m_it.array_iterator);\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n                return (m_it.primitive_iterator < other.m_it.primitive_iterator);\n        }\n    }\n\n    /*!\n    @brief comparison: less than or equal\n    @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.\n    */\n    bool operator<=(const iter_impl& other) const\n    {\n        return !other.operator < (*this);\n    }\n\n    /*!\n    @brief comparison: greater than\n    @pre (1) Both iterators are initialized to point to the same object, or (2) both iterators are value-initialized.\n    */\n    bool operator>(const iter_impl& other) const\n    {\n        return !operator<=(other);\n    }\n\n    /*!\n    @brief comparison: greater than or equal\n    @pre (1) The iterator is initialized; i.e. `m_object != nullptr`, or (2) both iterators are value-initialized.\n    */\n    bool operator>=(const iter_impl& other) const\n    {\n        return !operator<(other);\n    }\n\n    /*!\n    @brief add to iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator+=(difference_type i)\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(209, \"cannot use offsets with object iterators\", m_object));\n\n            case value_t::array:\n            {\n                std::advance(m_it.array_iterator, i);\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                m_it.primitive_iterator += i;\n                break;\n            }\n        }\n\n        return *this;\n    }\n\n    /*!\n    @brief subtract from iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl& operator-=(difference_type i)\n    {\n        return operator+=(-i);\n    }\n\n    /*!\n    @brief add to iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator+(difference_type i) const\n    {\n        auto result = *this;\n        result += i;\n        return result;\n    }\n\n    /*!\n    @brief addition of distance and iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    friend iter_impl operator+(difference_type i, const iter_impl& it)\n    {\n        auto result = it;\n        result += i;\n        return result;\n    }\n\n    /*!\n    @brief subtract from iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    iter_impl operator-(difference_type i) const\n    {\n        auto result = *this;\n        result -= i;\n        return result;\n    }\n\n    /*!\n    @brief return difference\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    difference_type operator-(const iter_impl& other) const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(209, \"cannot use offsets with object iterators\", m_object));\n\n            case value_t::array:\n                return m_it.array_iterator - other.m_it.array_iterator;\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n                return m_it.primitive_iterator - other.m_it.primitive_iterator;\n        }\n    }\n\n    /*!\n    @brief access to successor\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference operator[](difference_type n) const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        switch (m_object->m_data.m_type)\n        {\n            case value_t::object:\n                JSON_THROW(invalid_iterator::create(208, \"cannot use operator[] for object iterators\", m_object));\n\n            case value_t::array:\n                return *std::next(m_it.array_iterator, n);\n\n            case value_t::null:\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\", m_object));\n\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))\n                {\n                    return *m_object;\n                }\n\n                JSON_THROW(invalid_iterator::create(214, \"cannot get value\", m_object));\n            }\n        }\n    }\n\n    /*!\n    @brief return the key of an object iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    const typename object_t::key_type& key() const\n    {\n        JSON_ASSERT(m_object != nullptr);\n\n        if (JSON_HEDLEY_LIKELY(m_object->is_object()))\n        {\n            return m_it.object_iterator->first;\n        }\n\n        JSON_THROW(invalid_iterator::create(207, \"cannot use key() for non-object iterators\", m_object));\n    }\n\n    /*!\n    @brief return the value of an iterator\n    @pre The iterator is initialized; i.e. `m_object != nullptr`.\n    */\n    reference value() const\n    {\n        return operator*();\n    }\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    /// associated JSON instance\n    pointer m_object = nullptr;\n    /// the actual iterator of the associated instance\n    internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/iterators/iteration_proxy.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef> // size_t\n#include <iterator> // forward_iterator_tag\n#include <tuple> // tuple_size, get, tuple_element\n#include <utility> // move\n\n#if JSON_HAS_RANGES\n    #include <ranges> // enable_borrowed_range\n#endif\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/string_utils.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename IteratorType> class iteration_proxy_value\n{\n  public:\n    using difference_type = std::ptrdiff_t;\n    using value_type = iteration_proxy_value;\n    using pointer = value_type *;\n    using reference = value_type &;\n    using iterator_category = std::forward_iterator_tag;\n    using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type;\n\n  private:\n    /// the iterator\n    IteratorType anchor{};\n    /// an index for arrays (used to create key names)\n    std::size_t array_index = 0;\n    /// last stringified array index\n    mutable std::size_t array_index_last = 0;\n    /// a string representation of the array index\n    mutable string_type array_index_str = \"0\";\n    /// an empty string (to return a reference for primitive values)\n    string_type empty_str{};\n\n  public:\n    explicit iteration_proxy_value() = default;\n    explicit iteration_proxy_value(IteratorType it, std::size_t array_index_ = 0)\n    noexcept(std::is_nothrow_move_constructible<IteratorType>::value\n             && std::is_nothrow_default_constructible<string_type>::value)\n        : anchor(std::move(it))\n        , array_index(array_index_)\n    {}\n\n    iteration_proxy_value(iteration_proxy_value const&) = default;\n    iteration_proxy_value& operator=(iteration_proxy_value const&) = default;\n    // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions\n    iteration_proxy_value(iteration_proxy_value&&)\n    noexcept(std::is_nothrow_move_constructible<IteratorType>::value\n             && std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)\n    iteration_proxy_value& operator=(iteration_proxy_value&&)\n    noexcept(std::is_nothrow_move_assignable<IteratorType>::value\n             && std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)\n    ~iteration_proxy_value() = default;\n\n    /// dereference operator (needed for range-based for)\n    const iteration_proxy_value& operator*() const\n    {\n        return *this;\n    }\n\n    /// increment operator (needed for range-based for)\n    iteration_proxy_value& operator++()\n    {\n        ++anchor;\n        ++array_index;\n\n        return *this;\n    }\n\n    iteration_proxy_value operator++(int)& // NOLINT(cert-dcl21-cpp)\n    {\n        auto tmp = iteration_proxy_value(anchor, array_index);\n        ++anchor;\n        ++array_index;\n        return tmp;\n    }\n\n    /// equality operator (needed for InputIterator)\n    bool operator==(const iteration_proxy_value& o) const\n    {\n        return anchor == o.anchor;\n    }\n\n    /// inequality operator (needed for range-based for)\n    bool operator!=(const iteration_proxy_value& o) const\n    {\n        return anchor != o.anchor;\n    }\n\n    /// return key of the iterator\n    const string_type& key() const\n    {\n        JSON_ASSERT(anchor.m_object != nullptr);\n\n        switch (anchor.m_object->type())\n        {\n            // use integer array index as key\n            case value_t::array:\n            {\n                if (array_index != array_index_last)\n                {\n                    int_to_string( array_index_str, array_index );\n                    array_index_last = array_index;\n                }\n                return array_index_str;\n            }\n\n            // use key from the object\n            case value_t::object:\n                return anchor.key();\n\n            // use an empty key for all primitive types\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n                return empty_str;\n        }\n    }\n\n    /// return value of the iterator\n    typename IteratorType::reference value() const\n    {\n        return anchor.value();\n    }\n};\n\n/// proxy class for the items() function\ntemplate<typename IteratorType> class iteration_proxy\n{\n  private:\n    /// the container to iterate\n    typename IteratorType::pointer container = nullptr;\n\n  public:\n    explicit iteration_proxy() = default;\n\n    /// construct iteration proxy from a container\n    explicit iteration_proxy(typename IteratorType::reference cont) noexcept\n        : container(&cont) {}\n\n    iteration_proxy(iteration_proxy const&) = default;\n    iteration_proxy& operator=(iteration_proxy const&) = default;\n    iteration_proxy(iteration_proxy&&) noexcept = default;\n    iteration_proxy& operator=(iteration_proxy&&) noexcept = default;\n    ~iteration_proxy() = default;\n\n    /// return iterator begin (needed for range-based for)\n    iteration_proxy_value<IteratorType> begin() const noexcept\n    {\n        return iteration_proxy_value<IteratorType>(container->begin());\n    }\n\n    /// return iterator end (needed for range-based for)\n    iteration_proxy_value<IteratorType> end() const noexcept\n    {\n        return iteration_proxy_value<IteratorType>(container->end());\n    }\n};\n\n// Structured Bindings Support\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\ntemplate<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0>\nauto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key())\n{\n    return i.key();\n}\n// Structured Bindings Support\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\ntemplate<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0>\nauto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value())\n{\n    return i.value();\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n\n// The Addition to the STD Namespace is required to add\n// Structured Bindings Support to the iteration_proxy_value class\n// For further reference see https://blog.tartanllama.xyz/structured-bindings/\n// And see https://github.com/nlohmann/json/pull/1391\nnamespace std\n{\n\n#if defined(__clang__)\n    // Fix: https://github.com/nlohmann/json/issues/1401\n    #pragma clang diagnostic push\n    #pragma clang diagnostic ignored \"-Wmismatched-tags\"\n#endif\ntemplate<typename IteratorType>\nclass tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>> // NOLINT(cert-dcl58-cpp)\n    : public std::integral_constant<std::size_t, 2> {};\n\ntemplate<std::size_t N, typename IteratorType>\nclass tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >> // NOLINT(cert-dcl58-cpp)\n{\n  public:\n    using type = decltype(\n                     get<N>(std::declval <\n                            ::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));\n};\n#if defined(__clang__)\n    #pragma clang diagnostic pop\n#endif\n\n}  // namespace std\n\n#if JSON_HAS_RANGES\n    template <typename IteratorType>\n    inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy<IteratorType>> = true;\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/iterators/iterator_traits.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <iterator> // random_access_iterator_tag\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/meta/void_t.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename It, typename = void>\nstruct iterator_types {};\n\ntemplate<typename It>\nstruct iterator_types <\n    It,\n    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,\n    typename It::reference, typename It::iterator_category >>\n{\n    using difference_type = typename It::difference_type;\n    using value_type = typename It::value_type;\n    using pointer = typename It::pointer;\n    using reference = typename It::reference;\n    using iterator_category = typename It::iterator_category;\n};\n\n// This is required as some compilers implement std::iterator_traits in a way that\n// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.\ntemplate<typename T, typename = void>\nstruct iterator_traits\n{\n};\n\ntemplate<typename T>\nstruct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>\n    : iterator_types<T>\n{\n};\n\ntemplate<typename T>\nstruct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>\n{\n    using iterator_category = std::random_access_iterator_tag;\n    using value_type = T;\n    using difference_type = ptrdiff_t;\n    using pointer = T*;\n    using reference = T&;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/iterators/json_reverse_iterator.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef> // ptrdiff_t\n#include <iterator> // reverse_iterator\n#include <utility> // declval\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n//////////////////////\n// reverse_iterator //\n//////////////////////\n\n/*!\n@brief a template for a reverse iterator class\n\n@tparam Base the base iterator type to reverse. Valid types are @ref\niterator (to create @ref reverse_iterator) and @ref const_iterator (to\ncreate @ref const_reverse_iterator).\n\n@requirement The class satisfies the following concept requirements:\n-\n[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):\n  The iterator that can be moved can be moved in both directions (i.e.\n  incremented and decremented).\n- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator):\n  It is possible to write to the pointed-to element (only if @a Base is\n  @ref iterator).\n\n@since version 1.0.0\n*/\ntemplate<typename Base>\nclass json_reverse_iterator : public std::reverse_iterator<Base>\n{\n  public:\n    using difference_type = std::ptrdiff_t;\n    /// shortcut to the reverse iterator adapter\n    using base_iterator = std::reverse_iterator<Base>;\n    /// the reference type for the pointed-to element\n    using reference = typename Base::reference;\n\n    /// create reverse iterator from iterator\n    explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept\n        : base_iterator(it) {}\n\n    /// create reverse iterator from base class\n    explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}\n\n    /// post-increment (it++)\n    json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp)\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator++(1));\n    }\n\n    /// pre-increment (++it)\n    json_reverse_iterator& operator++()\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator++());\n    }\n\n    /// post-decrement (it--)\n    json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp)\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator--(1));\n    }\n\n    /// pre-decrement (--it)\n    json_reverse_iterator& operator--()\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator--());\n    }\n\n    /// add to iterator\n    json_reverse_iterator& operator+=(difference_type i)\n    {\n        return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));\n    }\n\n    /// add to iterator\n    json_reverse_iterator operator+(difference_type i) const\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator+(i));\n    }\n\n    /// subtract from iterator\n    json_reverse_iterator operator-(difference_type i) const\n    {\n        return static_cast<json_reverse_iterator>(base_iterator::operator-(i));\n    }\n\n    /// return difference\n    difference_type operator-(const json_reverse_iterator& other) const\n    {\n        return base_iterator(*this) - base_iterator(other);\n    }\n\n    /// access to successor\n    reference operator[](difference_type n) const\n    {\n        return *(this->operator+(n));\n    }\n\n    /// return the key of an object iterator\n    auto key() const -> decltype(std::declval<Base>().key())\n    {\n        auto it = --this->base();\n        return it.key();\n    }\n\n    /// return the value of an iterator\n    reference value() const\n    {\n        auto it = --this->base();\n        return it.operator * ();\n    }\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/iterators/primitive_iterator.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef> // ptrdiff_t\n#include <limits>  // numeric_limits\n\n#include <nlohmann/detail/macro_scope.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/*\n@brief an iterator for primitive JSON types\n\nThis class models an iterator for primitive JSON types (boolean, number,\nstring). It's only purpose is to allow the iterator/const_iterator classes\nto \"iterate\" over primitive values. Internally, the iterator is modeled by\na `difference_type` variable. Value begin_value (`0`) models the begin,\nend_value (`1`) models past the end.\n*/\nclass primitive_iterator_t\n{\n  private:\n    using difference_type = std::ptrdiff_t;\n    static constexpr difference_type begin_value = 0;\n    static constexpr difference_type end_value = begin_value + 1;\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    /// iterator as signed integer type\n    difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();\n\n  public:\n    constexpr difference_type get_value() const noexcept\n    {\n        return m_it;\n    }\n\n    /// set iterator to a defined beginning\n    void set_begin() noexcept\n    {\n        m_it = begin_value;\n    }\n\n    /// set iterator to a defined past the end\n    void set_end() noexcept\n    {\n        m_it = end_value;\n    }\n\n    /// return whether the iterator can be dereferenced\n    constexpr bool is_begin() const noexcept\n    {\n        return m_it == begin_value;\n    }\n\n    /// return whether the iterator is at end\n    constexpr bool is_end() const noexcept\n    {\n        return m_it == end_value;\n    }\n\n    friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it == rhs.m_it;\n    }\n\n    friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it < rhs.m_it;\n    }\n\n    primitive_iterator_t operator+(difference_type n) noexcept\n    {\n        auto result = *this;\n        result += n;\n        return result;\n    }\n\n    friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept\n    {\n        return lhs.m_it - rhs.m_it;\n    }\n\n    primitive_iterator_t& operator++() noexcept\n    {\n        ++m_it;\n        return *this;\n    }\n\n    primitive_iterator_t operator++(int)& noexcept // NOLINT(cert-dcl21-cpp)\n    {\n        auto result = *this;\n        ++m_it;\n        return result;\n    }\n\n    primitive_iterator_t& operator--() noexcept\n    {\n        --m_it;\n        return *this;\n    }\n\n    primitive_iterator_t operator--(int)& noexcept // NOLINT(cert-dcl21-cpp)\n    {\n        auto result = *this;\n        --m_it;\n        return result;\n    }\n\n    primitive_iterator_t& operator+=(difference_type n) noexcept\n    {\n        m_it += n;\n        return *this;\n    }\n\n    primitive_iterator_t& operator-=(difference_type n) noexcept\n    {\n        m_it -= n;\n        return *this;\n    }\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/json_custom_base_class.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <type_traits> // conditional, is_same\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/*!\n@brief Default base class of the @ref basic_json class.\n\nSo that the correct implementations of the copy / move ctors / assign operators\nof @ref basic_json do not require complex case distinctions\n(no base class / custom base class used as customization point),\n@ref basic_json always has a base class.\nBy default, this class is used because it is empty and thus has no effect\non the behavior of @ref basic_json.\n*/\nstruct json_default_base {};\n\ntemplate<class T>\nusing json_base_class = typename std::conditional <\n                        std::is_same<T, void>::value,\n                        json_default_base,\n                        T\n                        >::type;\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/json_pointer.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <algorithm> // all_of\n#include <cctype> // isdigit\n#include <cerrno> // errno, ERANGE\n#include <cstdlib> // strtoull\n#ifndef JSON_NO_IO\n    #include <iosfwd> // ostream\n#endif  // JSON_NO_IO\n#include <limits> // max\n#include <numeric> // accumulate\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n#include <nlohmann/detail/string_escape.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document\n/// @sa https://json.nlohmann.me/api/json_pointer/\ntemplate<typename RefStringType>\nclass json_pointer\n{\n    // allow basic_json to access private members\n    NLOHMANN_BASIC_JSON_TPL_DECLARATION\n    friend class basic_json;\n\n    template<typename>\n    friend class json_pointer;\n\n    template<typename T>\n    struct string_t_helper\n    {\n        using type = T;\n    };\n\n    NLOHMANN_BASIC_JSON_TPL_DECLARATION\n    struct string_t_helper<NLOHMANN_BASIC_JSON_TPL>\n    {\n        using type = StringType;\n    };\n\n  public:\n    // for backwards compatibility accept BasicJsonType\n    using string_t = typename string_t_helper<RefStringType>::type;\n\n    /// @brief create JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/\n    explicit json_pointer(const string_t& s = \"\")\n        : reference_tokens(split(s))\n    {}\n\n    /// @brief return a string representation of the JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/to_string/\n    string_t to_string() const\n    {\n        return std::accumulate(reference_tokens.begin(), reference_tokens.end(),\n                               string_t{},\n                               [](const string_t& a, const string_t& b)\n        {\n            return detail::concat(a, '/', detail::escape(b));\n        });\n    }\n\n    /// @brief return a string representation of the JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string())\n    operator string_t() const\n    {\n        return to_string();\n    }\n\n#ifndef JSON_NO_IO\n    /// @brief write string representation of the JSON pointer to stream\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/\n    friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr)\n    {\n        o << ptr.to_string();\n        return o;\n    }\n#endif\n\n    /// @brief append another JSON pointer at the end of this JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/\n    json_pointer& operator/=(const json_pointer& ptr)\n    {\n        reference_tokens.insert(reference_tokens.end(),\n                                ptr.reference_tokens.begin(),\n                                ptr.reference_tokens.end());\n        return *this;\n    }\n\n    /// @brief append an unescaped reference token at the end of this JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/\n    json_pointer& operator/=(string_t token)\n    {\n        push_back(std::move(token));\n        return *this;\n    }\n\n    /// @brief append an array index at the end of this JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/\n    json_pointer& operator/=(std::size_t array_idx)\n    {\n        return *this /= std::to_string(array_idx);\n    }\n\n    /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/\n    friend json_pointer operator/(const json_pointer& lhs,\n                                  const json_pointer& rhs)\n    {\n        return json_pointer(lhs) /= rhs;\n    }\n\n    /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/\n    friend json_pointer operator/(const json_pointer& lhs, string_t token) // NOLINT(performance-unnecessary-value-param)\n    {\n        return json_pointer(lhs) /= std::move(token);\n    }\n\n    /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/\n    friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx)\n    {\n        return json_pointer(lhs) /= array_idx;\n    }\n\n    /// @brief returns the parent of this JSON pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/\n    json_pointer parent_pointer() const\n    {\n        if (empty())\n        {\n            return *this;\n        }\n\n        json_pointer res = *this;\n        res.pop_back();\n        return res;\n    }\n\n    /// @brief remove last reference token\n    /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/\n    void pop_back()\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\", nullptr));\n        }\n\n        reference_tokens.pop_back();\n    }\n\n    /// @brief return last reference token\n    /// @sa https://json.nlohmann.me/api/json_pointer/back/\n    const string_t& back() const\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\", nullptr));\n        }\n\n        return reference_tokens.back();\n    }\n\n    /// @brief append an unescaped token at the end of the reference pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/push_back/\n    void push_back(const string_t& token)\n    {\n        reference_tokens.push_back(token);\n    }\n\n    /// @brief append an unescaped token at the end of the reference pointer\n    /// @sa https://json.nlohmann.me/api/json_pointer/push_back/\n    void push_back(string_t&& token)\n    {\n        reference_tokens.push_back(std::move(token));\n    }\n\n    /// @brief return whether pointer points to the root document\n    /// @sa https://json.nlohmann.me/api/json_pointer/empty/\n    bool empty() const noexcept\n    {\n        return reference_tokens.empty();\n    }\n\n  private:\n    /*!\n    @param[in] s  reference token to be converted into an array index\n\n    @return integer representation of @a s\n\n    @throw parse_error.106  if an array index begins with '0'\n    @throw parse_error.109  if an array index begins not with a digit\n    @throw out_of_range.404 if string @a s could not be converted to an integer\n    @throw out_of_range.410 if an array index exceeds size_type\n    */\n    template<typename BasicJsonType>\n    static typename BasicJsonType::size_type array_index(const string_t& s)\n    {\n        using size_type = typename BasicJsonType::size_type;\n\n        // error condition (cf. RFC 6901, Sect. 4)\n        if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0'))\n        {\n            JSON_THROW(detail::parse_error::create(106, 0, detail::concat(\"array index '\", s, \"' must not begin with '0'\"), nullptr));\n        }\n\n        // error condition (cf. RFC 6901, Sect. 4)\n        if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9')))\n        {\n            JSON_THROW(detail::parse_error::create(109, 0, detail::concat(\"array index '\", s, \"' is not a number\"), nullptr));\n        }\n\n        const char* p = s.c_str();\n        char* p_end = nullptr;\n        errno = 0; // strtoull doesn't reset errno\n        const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)\n        if (p == p_end // invalid input or empty string\n                || errno == ERANGE // out of range\n                || JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read\n        {\n            JSON_THROW(detail::out_of_range::create(404, detail::concat(\"unresolved reference token '\", s, \"'\"), nullptr));\n        }\n\n        // only triggered on special platforms (like 32bit), see also\n        // https://github.com/nlohmann/json/pull/2203\n        if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)()))  // NOLINT(runtime/int)\n        {\n            JSON_THROW(detail::out_of_range::create(410, detail::concat(\"array index \", s, \" exceeds size_type\"), nullptr));   // LCOV_EXCL_LINE\n        }\n\n        return static_cast<size_type>(res);\n    }\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    json_pointer top() const\n    {\n        if (JSON_HEDLEY_UNLIKELY(empty()))\n        {\n            JSON_THROW(detail::out_of_range::create(405, \"JSON pointer has no parent\", nullptr));\n        }\n\n        json_pointer result = *this;\n        result.reference_tokens = {reference_tokens[0]};\n        return result;\n    }\n\n  private:\n    /*!\n    @brief create and return a reference to the pointed to value\n\n    @complexity Linear in the number of reference tokens.\n\n    @throw parse_error.109 if array index is not a number\n    @throw type_error.313 if value cannot be unflattened\n    */\n    template<typename BasicJsonType>\n    BasicJsonType& get_and_create(BasicJsonType& j) const\n    {\n        auto* result = &j;\n\n        // in case no reference tokens exist, return a reference to the JSON value\n        // j which will be overwritten by a primitive value\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (result->type())\n            {\n                case detail::value_t::null:\n                {\n                    if (reference_token == \"0\")\n                    {\n                        // start a new array if reference token is 0\n                        result = &result->operator[](0);\n                    }\n                    else\n                    {\n                        // start a new object otherwise\n                        result = &result->operator[](reference_token);\n                    }\n                    break;\n                }\n\n                case detail::value_t::object:\n                {\n                    // create an entry in the object\n                    result = &result->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    // create an entry in the array\n                    result = &result->operator[](array_index<BasicJsonType>(reference_token));\n                    break;\n                }\n\n                /*\n                The following code is only reached if there exists a reference\n                token _and_ the current value is primitive. In this case, we have\n                an error situation, because primitive values may only occur as\n                single value; that is, with an empty list of reference tokens.\n                */\n                case detail::value_t::string:\n                case detail::value_t::boolean:\n                case detail::value_t::number_integer:\n                case detail::value_t::number_unsigned:\n                case detail::value_t::number_float:\n                case detail::value_t::binary:\n                case detail::value_t::discarded:\n                default:\n                    JSON_THROW(detail::type_error::create(313, \"invalid value to unflatten\", &j));\n            }\n        }\n\n        return *result;\n    }\n\n    /*!\n    @brief return a reference to the pointed to value\n\n    @note This version does not throw if a value is not present, but tries to\n          create nested values instead. For instance, calling this function\n          with pointer `\"/this/that\"` on a null value is equivalent to calling\n          `operator[](\"this\").operator[](\"that\")` on that value, effectively\n          changing the null value to an object.\n\n    @param[in] ptr  a JSON value\n\n    @return reference to the JSON value pointed to by the JSON pointer\n\n    @complexity Linear in the length of the JSON pointer.\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    template<typename BasicJsonType>\n    BasicJsonType& get_unchecked(BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            // convert null values to arrays or objects before continuing\n            if (ptr->is_null())\n            {\n                // check if reference token is a number\n                const bool nums =\n                    std::all_of(reference_token.begin(), reference_token.end(),\n                                [](const unsigned char x)\n                {\n                    return std::isdigit(x);\n                });\n\n                // change value to array for numbers or \"-\" or to object otherwise\n                *ptr = (nums || reference_token == \"-\")\n                       ? detail::value_t::array\n                       : detail::value_t::object;\n            }\n\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // use unchecked object access\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (reference_token == \"-\")\n                    {\n                        // explicitly treat \"-\" as index beyond the end\n                        ptr = &ptr->operator[](ptr->m_data.m_value.array->size());\n                    }\n                    else\n                    {\n                        // convert array index to number; unchecked access\n                        ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));\n                    }\n                    break;\n                }\n\n                case detail::value_t::null:\n                case detail::value_t::string:\n                case detail::value_t::boolean:\n                case detail::value_t::number_integer:\n                case detail::value_t::number_unsigned:\n                case detail::value_t::number_float:\n                case detail::value_t::binary:\n                case detail::value_t::discarded:\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, detail::concat(\"unresolved reference token '\", reference_token, \"'\"), ptr));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    template<typename BasicJsonType>\n    BasicJsonType& get_checked(BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // note: at performs range check\n                    ptr = &ptr->at(reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        JSON_THROW(detail::out_of_range::create(402, detail::concat(\n                                \"array index '-' (\", std::to_string(ptr->m_data.m_value.array->size()),\n                                \") is out of range\"), ptr));\n                    }\n\n                    // note: at performs range check\n                    ptr = &ptr->at(array_index<BasicJsonType>(reference_token));\n                    break;\n                }\n\n                case detail::value_t::null:\n                case detail::value_t::string:\n                case detail::value_t::boolean:\n                case detail::value_t::number_integer:\n                case detail::value_t::number_unsigned:\n                case detail::value_t::number_float:\n                case detail::value_t::binary:\n                case detail::value_t::discarded:\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, detail::concat(\"unresolved reference token '\", reference_token, \"'\"), ptr));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @brief return a const reference to the pointed to value\n\n    @param[in] ptr  a JSON value\n\n    @return const reference to the JSON value pointed to by the JSON\n    pointer\n\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    template<typename BasicJsonType>\n    const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // use unchecked object access\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" cannot be used for const access\n                        JSON_THROW(detail::out_of_range::create(402, detail::concat(\"array index '-' (\", std::to_string(ptr->m_data.m_value.array->size()), \") is out of range\"), ptr));\n                    }\n\n                    // use unchecked array access\n                    ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));\n                    break;\n                }\n\n                case detail::value_t::null:\n                case detail::value_t::string:\n                case detail::value_t::boolean:\n                case detail::value_t::number_integer:\n                case detail::value_t::number_unsigned:\n                case detail::value_t::number_float:\n                case detail::value_t::binary:\n                case detail::value_t::discarded:\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, detail::concat(\"unresolved reference token '\", reference_token, \"'\"), ptr));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    @throw out_of_range.402  if the array index '-' is used\n    @throw out_of_range.404  if the JSON pointer can not be resolved\n    */\n    template<typename BasicJsonType>\n    const BasicJsonType& get_checked(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    // note: at performs range check\n                    ptr = &ptr->at(reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        JSON_THROW(detail::out_of_range::create(402, detail::concat(\n                                \"array index '-' (\", std::to_string(ptr->m_data.m_value.array->size()),\n                                \") is out of range\"), ptr));\n                    }\n\n                    // note: at performs range check\n                    ptr = &ptr->at(array_index<BasicJsonType>(reference_token));\n                    break;\n                }\n\n                case detail::value_t::null:\n                case detail::value_t::string:\n                case detail::value_t::boolean:\n                case detail::value_t::number_integer:\n                case detail::value_t::number_unsigned:\n                case detail::value_t::number_float:\n                case detail::value_t::binary:\n                case detail::value_t::discarded:\n                default:\n                    JSON_THROW(detail::out_of_range::create(404, detail::concat(\"unresolved reference token '\", reference_token, \"'\"), ptr));\n            }\n        }\n\n        return *ptr;\n    }\n\n    /*!\n    @throw parse_error.106   if an array index begins with '0'\n    @throw parse_error.109   if an array index was not a number\n    */\n    template<typename BasicJsonType>\n    bool contains(const BasicJsonType* ptr) const\n    {\n        for (const auto& reference_token : reference_tokens)\n        {\n            switch (ptr->type())\n            {\n                case detail::value_t::object:\n                {\n                    if (!ptr->contains(reference_token))\n                    {\n                        // we did not find the key in the object\n                        return false;\n                    }\n\n                    ptr = &ptr->operator[](reference_token);\n                    break;\n                }\n\n                case detail::value_t::array:\n                {\n                    if (JSON_HEDLEY_UNLIKELY(reference_token == \"-\"))\n                    {\n                        // \"-\" always fails the range check\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !(\"0\" <= reference_token && reference_token <= \"9\")))\n                    {\n                        // invalid char\n                        return false;\n                    }\n                    if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))\n                    {\n                        if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9')))\n                        {\n                            // first char should be between '1' and '9'\n                            return false;\n                        }\n                        for (std::size_t i = 1; i < reference_token.size(); i++)\n                        {\n                            if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9')))\n                            {\n                                // other char should be between '0' and '9'\n                                return false;\n                            }\n                        }\n                    }\n\n                    const auto idx = array_index<BasicJsonType>(reference_token);\n                    if (idx >= ptr->size())\n                    {\n                        // index out of range\n                        return false;\n                    }\n\n                    ptr = &ptr->operator[](idx);\n                    break;\n                }\n\n                case detail::value_t::null:\n                case detail::value_t::string:\n                case detail::value_t::boolean:\n                case detail::value_t::number_integer:\n                case detail::value_t::number_unsigned:\n                case detail::value_t::number_float:\n                case detail::value_t::binary:\n                case detail::value_t::discarded:\n                default:\n                {\n                    // we do not expect primitive values if there is still a\n                    // reference token to process\n                    return false;\n                }\n            }\n        }\n\n        // no reference token left means we found a primitive value\n        return true;\n    }\n\n    /*!\n    @brief split the string input to reference tokens\n\n    @note This function is only called by the json_pointer constructor.\n          All exceptions below are documented there.\n\n    @throw parse_error.107  if the pointer is not empty or begins with '/'\n    @throw parse_error.108  if character '~' is not followed by '0' or '1'\n    */\n    static std::vector<string_t> split(const string_t& reference_string)\n    {\n        std::vector<string_t> result;\n\n        // special case: empty reference string -> no reference tokens\n        if (reference_string.empty())\n        {\n            return result;\n        }\n\n        // check if nonempty reference string begins with slash\n        if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))\n        {\n            JSON_THROW(detail::parse_error::create(107, 1, detail::concat(\"JSON pointer must be empty or begin with '/' - was: '\", reference_string, \"'\"), nullptr));\n        }\n\n        // extract the reference tokens:\n        // - slash: position of the last read slash (or end of string)\n        // - start: position after the previous slash\n        for (\n            // search for the first slash after the first character\n            std::size_t slash = reference_string.find_first_of('/', 1),\n            // set the beginning of the first reference token\n            start = 1;\n            // we can stop if start == 0 (if slash == string_t::npos)\n            start != 0;\n            // set the beginning of the next reference token\n            // (will eventually be 0 if slash == string_t::npos)\n            start = (slash == string_t::npos) ? 0 : slash + 1,\n            // find next slash\n            slash = reference_string.find_first_of('/', start))\n        {\n            // use the text between the beginning of the reference token\n            // (start) and the last slash (slash).\n            auto reference_token = reference_string.substr(start, slash - start);\n\n            // check reference tokens are properly escaped\n            for (std::size_t pos = reference_token.find_first_of('~');\n                    pos != string_t::npos;\n                    pos = reference_token.find_first_of('~', pos + 1))\n            {\n                JSON_ASSERT(reference_token[pos] == '~');\n\n                // ~ must be followed by 0 or 1\n                if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||\n                                         (reference_token[pos + 1] != '0' &&\n                                          reference_token[pos + 1] != '1')))\n                {\n                    JSON_THROW(detail::parse_error::create(108, 0, \"escape character '~' must be followed with '0' or '1'\", nullptr));\n                }\n            }\n\n            // finally, store the reference token\n            detail::unescape(reference_token);\n            result.push_back(reference_token);\n        }\n\n        return result;\n    }\n\n  private:\n    /*!\n    @param[in] reference_string  the reference string to the current value\n    @param[in] value             the value to consider\n    @param[in,out] result        the result object to insert values to\n\n    @note Empty objects or arrays are flattened to `null`.\n    */\n    template<typename BasicJsonType>\n    static void flatten(const string_t& reference_string,\n                        const BasicJsonType& value,\n                        BasicJsonType& result)\n    {\n        switch (value.type())\n        {\n            case detail::value_t::array:\n            {\n                if (value.m_data.m_value.array->empty())\n                {\n                    // flatten empty array as null\n                    result[reference_string] = nullptr;\n                }\n                else\n                {\n                    // iterate array and use index as reference string\n                    for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i)\n                    {\n                        flatten(detail::concat(reference_string, '/', std::to_string(i)),\n                                value.m_data.m_value.array->operator[](i), result);\n                    }\n                }\n                break;\n            }\n\n            case detail::value_t::object:\n            {\n                if (value.m_data.m_value.object->empty())\n                {\n                    // flatten empty object as null\n                    result[reference_string] = nullptr;\n                }\n                else\n                {\n                    // iterate object and use keys as reference string\n                    for (const auto& element : *value.m_data.m_value.object)\n                    {\n                        flatten(detail::concat(reference_string, '/', detail::escape(element.first)), element.second, result);\n                    }\n                }\n                break;\n            }\n\n            case detail::value_t::null:\n            case detail::value_t::string:\n            case detail::value_t::boolean:\n            case detail::value_t::number_integer:\n            case detail::value_t::number_unsigned:\n            case detail::value_t::number_float:\n            case detail::value_t::binary:\n            case detail::value_t::discarded:\n            default:\n            {\n                // add primitive value with its reference string\n                result[reference_string] = value;\n                break;\n            }\n        }\n    }\n\n    /*!\n    @param[in] value  flattened JSON\n\n    @return unflattened JSON\n\n    @throw parse_error.109 if array index is not a number\n    @throw type_error.314  if value is not an object\n    @throw type_error.315  if object values are not primitive\n    @throw type_error.313  if value cannot be unflattened\n    */\n    template<typename BasicJsonType>\n    static BasicJsonType\n    unflatten(const BasicJsonType& value)\n    {\n        if (JSON_HEDLEY_UNLIKELY(!value.is_object()))\n        {\n            JSON_THROW(detail::type_error::create(314, \"only objects can be unflattened\", &value));\n        }\n\n        BasicJsonType result;\n\n        // iterate the JSON object values\n        for (const auto& element : *value.m_data.m_value.object)\n        {\n            if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))\n            {\n                JSON_THROW(detail::type_error::create(315, \"values in object must be primitive\", &element.second));\n            }\n\n            // assign value to reference pointed to by JSON pointer; Note that if\n            // the JSON pointer is \"\" (i.e., points to the whole value), function\n            // get_and_create returns a reference to result itself. An assignment\n            // will then create a primitive value.\n            json_pointer(element.first).get_and_create(result) = element.second;\n        }\n\n        return result;\n    }\n\n    // can't use conversion operator because of ambiguity\n    json_pointer<string_t> convert() const&\n    {\n        json_pointer<string_t> result;\n        result.reference_tokens = reference_tokens;\n        return result;\n    }\n\n    json_pointer<string_t> convert()&&\n    {\n        json_pointer<string_t> result;\n        result.reference_tokens = std::move(reference_tokens);\n        return result;\n    }\n\n  public:\n#if JSON_HAS_THREE_WAY_COMPARISON\n    /// @brief compares two JSON pointers for equality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/\n    template<typename RefStringTypeRhs>\n    bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept\n    {\n        return reference_tokens == rhs.reference_tokens;\n    }\n\n    /// @brief compares JSON pointer and string for equality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer))\n    bool operator==(const string_t& rhs) const\n    {\n        return *this == json_pointer(rhs);\n    }\n\n    /// @brief 3-way compares two JSON pointers\n    template<typename RefStringTypeRhs>\n    std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD*\n    {\n        return  reference_tokens <=> rhs.reference_tokens; // *NOPAD*\n    }\n#else\n    /// @brief compares two JSON pointers for equality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/\n    template<typename RefStringTypeLhs, typename RefStringTypeRhs>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,\n                           const json_pointer<RefStringTypeRhs>& rhs) noexcept;\n\n    /// @brief compares JSON pointer and string for equality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/\n    template<typename RefStringTypeLhs, typename StringType>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,\n                           const StringType& rhs);\n\n    /// @brief compares string and JSON pointer for equality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/\n    template<typename RefStringTypeRhs, typename StringType>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator==(const StringType& lhs,\n                           const json_pointer<RefStringTypeRhs>& rhs);\n\n    /// @brief compares two JSON pointers for inequality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/\n    template<typename RefStringTypeLhs, typename RefStringTypeRhs>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,\n                           const json_pointer<RefStringTypeRhs>& rhs) noexcept;\n\n    /// @brief compares JSON pointer and string for inequality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/\n    template<typename RefStringTypeLhs, typename StringType>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,\n                           const StringType& rhs);\n\n    /// @brief compares string and JSON pointer for inequality\n    /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/\n    template<typename RefStringTypeRhs, typename StringType>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator!=(const StringType& lhs,\n                           const json_pointer<RefStringTypeRhs>& rhs);\n\n    /// @brief compares two JSON pointer for less-than\n    template<typename RefStringTypeLhs, typename RefStringTypeRhs>\n    // NOLINTNEXTLINE(readability-redundant-declaration)\n    friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs,\n                          const json_pointer<RefStringTypeRhs>& rhs) noexcept;\n#endif\n\n  private:\n    /// the reference tokens\n    std::vector<string_t> reference_tokens;\n};\n\n#if !JSON_HAS_THREE_WAY_COMPARISON\n// functions cannot be defined inside class due to ODR violations\ntemplate<typename RefStringTypeLhs, typename RefStringTypeRhs>\ninline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,\n                       const json_pointer<RefStringTypeRhs>& rhs) noexcept\n{\n    return lhs.reference_tokens == rhs.reference_tokens;\n}\n\ntemplate<typename RefStringTypeLhs,\n         typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>\nJSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))\ninline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,\n                       const StringType& rhs)\n{\n    return lhs == json_pointer<RefStringTypeLhs>(rhs);\n}\n\ntemplate<typename RefStringTypeRhs,\n         typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>\nJSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))\ninline bool operator==(const StringType& lhs,\n                       const json_pointer<RefStringTypeRhs>& rhs)\n{\n    return json_pointer<RefStringTypeRhs>(lhs) == rhs;\n}\n\ntemplate<typename RefStringTypeLhs, typename RefStringTypeRhs>\ninline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,\n                       const json_pointer<RefStringTypeRhs>& rhs) noexcept\n{\n    return !(lhs == rhs);\n}\n\ntemplate<typename RefStringTypeLhs,\n         typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>\nJSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))\ninline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,\n                       const StringType& rhs)\n{\n    return !(lhs == rhs);\n}\n\ntemplate<typename RefStringTypeRhs,\n         typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>\nJSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))\ninline bool operator!=(const StringType& lhs,\n                       const json_pointer<RefStringTypeRhs>& rhs)\n{\n    return !(lhs == rhs);\n}\n\ntemplate<typename RefStringTypeLhs, typename RefStringTypeRhs>\ninline bool operator<(const json_pointer<RefStringTypeLhs>& lhs,\n                      const json_pointer<RefStringTypeRhs>& rhs) noexcept\n{\n    return lhs.reference_tokens < rhs.reference_tokens;\n}\n#endif\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/json_ref.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <initializer_list>\n#include <utility>\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename BasicJsonType>\nclass json_ref\n{\n  public:\n    using value_type = BasicJsonType;\n\n    json_ref(value_type&& value)\n        : owned_value(std::move(value))\n    {}\n\n    json_ref(const value_type& value)\n        : value_ref(&value)\n    {}\n\n    json_ref(std::initializer_list<json_ref> init)\n        : owned_value(init)\n    {}\n\n    template <\n        class... Args,\n        enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >\n    json_ref(Args && ... args)\n        : owned_value(std::forward<Args>(args)...)\n    {}\n\n    // class should be movable only\n    json_ref(json_ref&&) noexcept = default;\n    json_ref(const json_ref&) = delete;\n    json_ref& operator=(const json_ref&) = delete;\n    json_ref& operator=(json_ref&&) = delete;\n    ~json_ref() = default;\n\n    value_type moved_or_copied() const\n    {\n        if (value_ref == nullptr)\n        {\n            return std::move(owned_value);\n        }\n        return *value_ref;\n    }\n\n    value_type const& operator*() const\n    {\n        return value_ref ? *value_ref : owned_value;\n    }\n\n    value_type const* operator->() const\n    {\n        return &** this;\n    }\n\n  private:\n    mutable value_type owned_value = nullptr;\n    value_type const* value_ref = nullptr;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/macro_scope.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <utility> // declval, pair\n#include <nlohmann/detail/meta/detected.hpp>\n#include <nlohmann/thirdparty/hedley/hedley.hpp>\n\n// This file contains all internal macro definitions (except those affecting ABI)\n// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them\n\n#include <nlohmann/detail/abi_macros.hpp>\n\n// exclude unsupported compilers\n#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)\n    #if defined(__clang__)\n        #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400\n            #error \"unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers\"\n        #endif\n    #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))\n        #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800\n            #error \"unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers\"\n        #endif\n    #endif\n#endif\n\n// C++ language standard detection\n// if the user manually specified the used c++ version this is skipped\n#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11)\n    #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)\n        #define JSON_HAS_CPP_20\n        #define JSON_HAS_CPP_17\n        #define JSON_HAS_CPP_14\n    #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464\n        #define JSON_HAS_CPP_17\n        #define JSON_HAS_CPP_14\n    #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)\n        #define JSON_HAS_CPP_14\n    #endif\n    // the cpp 11 flag is always specified because it is the minimal required version\n    #define JSON_HAS_CPP_11\n#endif\n\n#ifdef __has_include\n    #if __has_include(<version>)\n        #include <version>\n    #endif\n#endif\n\n#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM)\n    #ifdef JSON_HAS_CPP_17\n        #if defined(__cpp_lib_filesystem)\n            #define JSON_HAS_FILESYSTEM 1\n        #elif defined(__cpp_lib_experimental_filesystem)\n            #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1\n        #elif !defined(__has_include)\n            #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1\n        #elif __has_include(<filesystem>)\n            #define JSON_HAS_FILESYSTEM 1\n        #elif __has_include(<experimental/filesystem>)\n            #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1\n        #endif\n\n        // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/\n        #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8\n            #undef JSON_HAS_FILESYSTEM\n            #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n        #endif\n\n        // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support\n        #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8\n            #undef JSON_HAS_FILESYSTEM\n            #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n        #endif\n\n        // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support\n        #if defined(__clang_major__) && __clang_major__ < 7\n            #undef JSON_HAS_FILESYSTEM\n            #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n        #endif\n\n        // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support\n        #if defined(_MSC_VER) && _MSC_VER < 1914\n            #undef JSON_HAS_FILESYSTEM\n            #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n        #endif\n\n        // no filesystem support before iOS 13\n        #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000\n            #undef JSON_HAS_FILESYSTEM\n            #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n        #endif\n\n        // no filesystem support before macOS Catalina\n        #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500\n            #undef JSON_HAS_FILESYSTEM\n            #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n        #endif\n    #endif\n#endif\n\n#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n    #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0\n#endif\n\n#ifndef JSON_HAS_FILESYSTEM\n    #define JSON_HAS_FILESYSTEM 0\n#endif\n\n#ifndef JSON_HAS_THREE_WAY_COMPARISON\n    #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \\\n        && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L\n        #define JSON_HAS_THREE_WAY_COMPARISON 1\n    #else\n        #define JSON_HAS_THREE_WAY_COMPARISON 0\n    #endif\n#endif\n\n#ifndef JSON_HAS_RANGES\n    // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error\n    #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427\n        #define JSON_HAS_RANGES 0\n    #elif defined(__cpp_lib_ranges)\n        #define JSON_HAS_RANGES 1\n    #else\n        #define JSON_HAS_RANGES 0\n    #endif\n#endif\n\n#ifndef JSON_HAS_STATIC_RTTI\n    #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0\n        #define JSON_HAS_STATIC_RTTI 1\n    #else\n        #define JSON_HAS_STATIC_RTTI 0\n    #endif\n#endif\n\n#ifdef JSON_HAS_CPP_17\n    #define JSON_INLINE_VARIABLE inline\n#else\n    #define JSON_INLINE_VARIABLE\n#endif\n\n#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address)\n    #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]]\n#else\n    #define JSON_NO_UNIQUE_ADDRESS\n#endif\n\n// disable documentation warnings on clang\n#if defined(__clang__)\n    #pragma clang diagnostic push\n    #pragma clang diagnostic ignored \"-Wdocumentation\"\n    #pragma clang diagnostic ignored \"-Wdocumentation-unknown-command\"\n#endif\n\n// allow disabling exceptions\n#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)\n    #define JSON_THROW(exception) throw exception\n    #define JSON_TRY try\n    #define JSON_CATCH(exception) catch(exception)\n    #define JSON_INTERNAL_CATCH(exception) catch(exception)\n#else\n    #include <cstdlib>\n    #define JSON_THROW(exception) std::abort()\n    #define JSON_TRY if(true)\n    #define JSON_CATCH(exception) if(false)\n    #define JSON_INTERNAL_CATCH(exception) if(false)\n#endif\n\n// override exception macros\n#if defined(JSON_THROW_USER)\n    #undef JSON_THROW\n    #define JSON_THROW JSON_THROW_USER\n#endif\n#if defined(JSON_TRY_USER)\n    #undef JSON_TRY\n    #define JSON_TRY JSON_TRY_USER\n#endif\n#if defined(JSON_CATCH_USER)\n    #undef JSON_CATCH\n    #define JSON_CATCH JSON_CATCH_USER\n    #undef JSON_INTERNAL_CATCH\n    #define JSON_INTERNAL_CATCH JSON_CATCH_USER\n#endif\n#if defined(JSON_INTERNAL_CATCH_USER)\n    #undef JSON_INTERNAL_CATCH\n    #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER\n#endif\n\n// allow overriding assert\n#if !defined(JSON_ASSERT)\n    #include <cassert> // assert\n    #define JSON_ASSERT(x) assert(x)\n#endif\n\n// allow to access some private functions (needed by the test suite)\n#if defined(JSON_TESTS_PRIVATE)\n    #define JSON_PRIVATE_UNLESS_TESTED public\n#else\n    #define JSON_PRIVATE_UNLESS_TESTED private\n#endif\n\n/*!\n@brief macro to briefly define a mapping between an enum and JSON\n@def NLOHMANN_JSON_SERIALIZE_ENUM\n@since version 3.4.0\n*/\n#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                            \\\n    template<typename BasicJsonType>                                                            \\\n    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                   \\\n    {                                                                                           \\\n        /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */                                \\\n        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE \" must be an enum!\");          \\\n        /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on <array> */       \\\n        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \\\n        auto it = std::find_if(std::begin(m), std::end(m),                                      \\\n                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool  \\\n        {                                                                                       \\\n            return ej_pair.first == e;                                                          \\\n        });                                                                                     \\\n        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                 \\\n    }                                                                                           \\\n    template<typename BasicJsonType>                                                            \\\n    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                 \\\n    {                                                                                           \\\n        /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */                                \\\n        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE \" must be an enum!\");          \\\n        /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on <array> */       \\\n        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \\\n        auto it = std::find_if(std::begin(m), std::end(m),                                      \\\n                               [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \\\n        {                                                                                       \\\n            return ej_pair.second == j;                                                         \\\n        });                                                                                     \\\n        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                  \\\n    }\n\n// Ugly macros to avoid uglier copy-paste when specializing basic_json. They\n// may be removed in the future once the class is split.\n\n#define NLOHMANN_BASIC_JSON_TPL_DECLARATION                                \\\n    template<template<typename, typename, typename...> class ObjectType,   \\\n             template<typename, typename...> class ArrayType,              \\\n             class StringType, class BooleanType, class NumberIntegerType, \\\n             class NumberUnsignedType, class NumberFloatType,              \\\n             template<typename> class AllocatorType,                       \\\n             template<typename, typename = void> class JSONSerializer,     \\\n             class BinaryType,                                             \\\n             class CustomBaseClass>\n\n#define NLOHMANN_BASIC_JSON_TPL                                            \\\n    basic_json<ObjectType, ArrayType, StringType, BooleanType,             \\\n    NumberIntegerType, NumberUnsignedType, NumberFloatType,                \\\n    AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>\n\n// Macros to simplify conversion from/to types\n\n#define NLOHMANN_JSON_EXPAND( x ) x\n#define NLOHMANN_JSON_GET_MACRO(_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, NAME,...) NAME\n#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \\\n        NLOHMANN_JSON_PASTE64, \\\n        NLOHMANN_JSON_PASTE63, \\\n        NLOHMANN_JSON_PASTE62, \\\n        NLOHMANN_JSON_PASTE61, \\\n        NLOHMANN_JSON_PASTE60, \\\n        NLOHMANN_JSON_PASTE59, \\\n        NLOHMANN_JSON_PASTE58, \\\n        NLOHMANN_JSON_PASTE57, \\\n        NLOHMANN_JSON_PASTE56, \\\n        NLOHMANN_JSON_PASTE55, \\\n        NLOHMANN_JSON_PASTE54, \\\n        NLOHMANN_JSON_PASTE53, \\\n        NLOHMANN_JSON_PASTE52, \\\n        NLOHMANN_JSON_PASTE51, \\\n        NLOHMANN_JSON_PASTE50, \\\n        NLOHMANN_JSON_PASTE49, \\\n        NLOHMANN_JSON_PASTE48, \\\n        NLOHMANN_JSON_PASTE47, \\\n        NLOHMANN_JSON_PASTE46, \\\n        NLOHMANN_JSON_PASTE45, \\\n        NLOHMANN_JSON_PASTE44, \\\n        NLOHMANN_JSON_PASTE43, \\\n        NLOHMANN_JSON_PASTE42, \\\n        NLOHMANN_JSON_PASTE41, \\\n        NLOHMANN_JSON_PASTE40, \\\n        NLOHMANN_JSON_PASTE39, \\\n        NLOHMANN_JSON_PASTE38, \\\n        NLOHMANN_JSON_PASTE37, \\\n        NLOHMANN_JSON_PASTE36, \\\n        NLOHMANN_JSON_PASTE35, \\\n        NLOHMANN_JSON_PASTE34, \\\n        NLOHMANN_JSON_PASTE33, \\\n        NLOHMANN_JSON_PASTE32, \\\n        NLOHMANN_JSON_PASTE31, \\\n        NLOHMANN_JSON_PASTE30, \\\n        NLOHMANN_JSON_PASTE29, \\\n        NLOHMANN_JSON_PASTE28, \\\n        NLOHMANN_JSON_PASTE27, \\\n        NLOHMANN_JSON_PASTE26, \\\n        NLOHMANN_JSON_PASTE25, \\\n        NLOHMANN_JSON_PASTE24, \\\n        NLOHMANN_JSON_PASTE23, \\\n        NLOHMANN_JSON_PASTE22, \\\n        NLOHMANN_JSON_PASTE21, \\\n        NLOHMANN_JSON_PASTE20, \\\n        NLOHMANN_JSON_PASTE19, \\\n        NLOHMANN_JSON_PASTE18, \\\n        NLOHMANN_JSON_PASTE17, \\\n        NLOHMANN_JSON_PASTE16, \\\n        NLOHMANN_JSON_PASTE15, \\\n        NLOHMANN_JSON_PASTE14, \\\n        NLOHMANN_JSON_PASTE13, \\\n        NLOHMANN_JSON_PASTE12, \\\n        NLOHMANN_JSON_PASTE11, \\\n        NLOHMANN_JSON_PASTE10, \\\n        NLOHMANN_JSON_PASTE9, \\\n        NLOHMANN_JSON_PASTE8, \\\n        NLOHMANN_JSON_PASTE7, \\\n        NLOHMANN_JSON_PASTE6, \\\n        NLOHMANN_JSON_PASTE5, \\\n        NLOHMANN_JSON_PASTE4, \\\n        NLOHMANN_JSON_PASTE3, \\\n        NLOHMANN_JSON_PASTE2, \\\n        NLOHMANN_JSON_PASTE1)(__VA_ARGS__))\n#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)\n#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)\n#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)\n#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)\n#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)\n#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)\n#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)\n#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)\n#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)\n#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)\n#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)\n#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)\n#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)\n#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)\n#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)\n#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)\n#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)\n#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)\n#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)\n#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)\n#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)\n#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)\n#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)\n#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)\n#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)\n#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)\n#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)\n#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)\n#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)\n#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)\n#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)\n#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)\n#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)\n#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)\n#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)\n#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)\n#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)\n#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)\n#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)\n#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)\n#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)\n#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)\n#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)\n#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)\n#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)\n#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)\n#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)\n#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)\n#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)\n#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)\n#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)\n#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)\n#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)\n#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)\n#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)\n#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)\n#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)\n#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)\n#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)\n#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)\n#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)\n#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)\n#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)\n\n#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;\n#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);\n#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = !nlohmann_json_j.is_null() ? nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1) : nlohmann_json_default_obj.v1;\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_INTRUSIVE\n@since version 3.9.0\n*/\n#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT\n@since version 3.11.0\n*/\n#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE\n@since version 3.11.x\n*/\n#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE\n@since version 3.9.0\n*/\n#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT\n@since version 3.11.0\n*/\n#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE\n@since version 3.11.x\n*/\n#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE\n@since version 3.11.x\n*/\n#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(Type, BaseType, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType&>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }\n\n#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...)  \\\n    friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n\n/*!\n@brief macro\n@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE\n@since version 3.11.x\n*/\n#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(Type, BaseType, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }\n\n#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n    inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }\n\n#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...)  \\\n    inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \\\n\n// inspired from https://stackoverflow.com/a/26745591\n// allows to call any std function as if (e.g. with begin):\n// using std::begin; begin(x);\n//\n// it allows using the detected idiom to retrieve the return type\n// of such an expression\n#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name)                                 \\\n    namespace detail {                                                            \\\n    using std::std_name;                                                          \\\n    \\\n    template<typename... T>                                                       \\\n    using result_of_##std_name = decltype(std_name(std::declval<T>()...));        \\\n    }                                                                             \\\n    \\\n    namespace detail2 {                                                           \\\n    struct std_name##_tag                                                         \\\n    {                                                                             \\\n    };                                                                            \\\n    \\\n    template<typename... T>                                                       \\\n    std_name##_tag std_name(T&&...);                                              \\\n    \\\n    template<typename... T>                                                       \\\n    using result_of_##std_name = decltype(std_name(std::declval<T>()...));        \\\n    \\\n    template<typename... T>                                                       \\\n    struct would_call_std_##std_name                                              \\\n    {                                                                             \\\n        static constexpr auto const value = ::nlohmann::detail::                  \\\n                                            is_detected_exact<std_name##_tag, result_of_##std_name, T...>::value; \\\n    };                                                                            \\\n    } /* namespace detail2 */ \\\n    \\\n    template<typename... T>                                                       \\\n    struct would_call_std_##std_name : detail2::would_call_std_##std_name<T...>   \\\n    {                                                                             \\\n    }\n\n#ifndef JSON_USE_IMPLICIT_CONVERSIONS\n    #define JSON_USE_IMPLICIT_CONVERSIONS 1\n#endif\n\n#if JSON_USE_IMPLICIT_CONVERSIONS\n    #define JSON_EXPLICIT\n#else\n    #define JSON_EXPLICIT explicit\n#endif\n\n#ifndef JSON_DISABLE_ENUM_SERIALIZATION\n    #define JSON_DISABLE_ENUM_SERIALIZATION 0\n#endif\n\n#ifndef JSON_USE_GLOBAL_UDLS\n    #define JSON_USE_GLOBAL_UDLS 1\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/macro_unscope.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n// restore clang diagnostic settings\n#if defined(__clang__)\n    #pragma clang diagnostic pop\n#endif\n\n// clean up\n#undef JSON_ASSERT\n#undef JSON_INTERNAL_CATCH\n#undef JSON_THROW\n#undef JSON_PRIVATE_UNLESS_TESTED\n#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION\n#undef NLOHMANN_BASIC_JSON_TPL\n#undef JSON_EXPLICIT\n#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL\n#undef JSON_INLINE_VARIABLE\n#undef JSON_NO_UNIQUE_ADDRESS\n#undef JSON_DISABLE_ENUM_SERIALIZATION\n#undef JSON_USE_GLOBAL_UDLS\n\n#ifndef JSON_TEST_KEEP_MACROS\n    #undef JSON_CATCH\n    #undef JSON_TRY\n    #undef JSON_HAS_CPP_11\n    #undef JSON_HAS_CPP_14\n    #undef JSON_HAS_CPP_17\n    #undef JSON_HAS_CPP_20\n    #undef JSON_HAS_FILESYSTEM\n    #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM\n    #undef JSON_HAS_THREE_WAY_COMPARISON\n    #undef JSON_HAS_RANGES\n    #undef JSON_HAS_STATIC_RTTI\n    #undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON\n#endif\n\n#include <nlohmann/thirdparty/hedley/hedley_undef.hpp>\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/call_std/begin.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/macro_scope.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\nNLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin);\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/call_std/end.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/macro_scope.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\nNLOHMANN_CAN_CALL_STD_FUNC_IMPL(end);\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/cpp_future.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-FileCopyrightText: 2018 The Abseil Authors\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type\n#include <utility> // index_sequence, make_index_sequence, index_sequence_for\n\n#include <nlohmann/detail/macro_scope.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename T>\nusing uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;\n\n#ifdef JSON_HAS_CPP_14\n\n// the following utilities are natively available in C++14\nusing std::enable_if_t;\nusing std::index_sequence;\nusing std::make_index_sequence;\nusing std::index_sequence_for;\n\n#else\n\n// alias templates to reduce boilerplate\ntemplate<bool B, typename T = void>\nusing enable_if_t = typename std::enable_if<B, T>::type;\n\n// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h\n// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0.\n\n//// START OF CODE FROM GOOGLE ABSEIL\n\n// integer_sequence\n//\n// Class template representing a compile-time integer sequence. An instantiation\n// of `integer_sequence<T, Ints...>` has a sequence of integers encoded in its\n// type through its template arguments (which is a common need when\n// working with C++11 variadic templates). `absl::integer_sequence` is designed\n// to be a drop-in replacement for C++14's `std::integer_sequence`.\n//\n// Example:\n//\n//   template< class T, T... Ints >\n//   void user_function(integer_sequence<T, Ints...>);\n//\n//   int main()\n//   {\n//     // user_function's `T` will be deduced to `int` and `Ints...`\n//     // will be deduced to `0, 1, 2, 3, 4`.\n//     user_function(make_integer_sequence<int, 5>());\n//   }\ntemplate <typename T, T... Ints>\nstruct integer_sequence\n{\n    using value_type = T;\n    static constexpr std::size_t size() noexcept\n    {\n        return sizeof...(Ints);\n    }\n};\n\n// index_sequence\n//\n// A helper template for an `integer_sequence` of `size_t`,\n// `absl::index_sequence` is designed to be a drop-in replacement for C++14's\n// `std::index_sequence`.\ntemplate <size_t... Ints>\nusing index_sequence = integer_sequence<size_t, Ints...>;\n\nnamespace utility_internal\n{\n\ntemplate <typename Seq, size_t SeqSize, size_t Rem>\nstruct Extend;\n\n// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency.\ntemplate <typename T, T... Ints, size_t SeqSize>\nstruct Extend<integer_sequence<T, Ints...>, SeqSize, 0>\n{\n    using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >;\n};\n\ntemplate <typename T, T... Ints, size_t SeqSize>\nstruct Extend<integer_sequence<T, Ints...>, SeqSize, 1>\n{\n    using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >;\n};\n\n// Recursion helper for 'make_integer_sequence<T, N>'.\n// 'Gen<T, N>::type' is an alias for 'integer_sequence<T, 0, 1, ... N-1>'.\ntemplate <typename T, size_t N>\nstruct Gen\n{\n    using type =\n        typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type;\n};\n\ntemplate <typename T>\nstruct Gen<T, 0>\n{\n    using type = integer_sequence<T>;\n};\n\n}  // namespace utility_internal\n\n// Compile-time sequences of integers\n\n// make_integer_sequence\n//\n// This template alias is equivalent to\n// `integer_sequence<int, 0, 1, ..., N-1>`, and is designed to be a drop-in\n// replacement for C++14's `std::make_integer_sequence`.\ntemplate <typename T, T N>\nusing make_integer_sequence = typename utility_internal::Gen<T, N>::type;\n\n// make_index_sequence\n//\n// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`,\n// and is designed to be a drop-in replacement for C++14's\n// `std::make_index_sequence`.\ntemplate <size_t N>\nusing make_index_sequence = make_integer_sequence<size_t, N>;\n\n// index_sequence_for\n//\n// Converts a typename pack into an index sequence of the same length, and\n// is designed to be a drop-in replacement for C++14's\n// `std::index_sequence_for()`\ntemplate <typename... Ts>\nusing index_sequence_for = make_index_sequence<sizeof...(Ts)>;\n\n//// END OF CODE FROM GOOGLE ABSEIL\n\n#endif\n\n// dispatch utility (taken from ranges-v3)\ntemplate<unsigned N> struct priority_tag : priority_tag < N - 1 > {};\ntemplate<> struct priority_tag<0> {};\n\n// taken from ranges-v3\ntemplate<typename T>\nstruct static_const\n{\n    static JSON_INLINE_VARIABLE constexpr T value{};\n};\n\n#ifndef JSON_HAS_CPP_17\n    template<typename T>\n    constexpr T static_const<T>::value;\n#endif\n\ntemplate<typename T, typename... Args>\nconstexpr std::array<T, sizeof...(Args)> make_array(Args&& ... args)\n{\n    return std::array<T, sizeof...(Args)> {{static_cast<T>(std::forward<Args>(args))...}};\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/detected.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <type_traits>\n\n#include <nlohmann/detail/meta/void_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n// https://en.cppreference.com/w/cpp/experimental/is_detected\nstruct nonesuch\n{\n    nonesuch() = delete;\n    ~nonesuch() = delete;\n    nonesuch(nonesuch const&) = delete;\n    nonesuch(nonesuch const&&) = delete;\n    void operator=(nonesuch const&) = delete;\n    void operator=(nonesuch&&) = delete;\n};\n\ntemplate<class Default,\n         class AlwaysVoid,\n         template<class...> class Op,\n         class... Args>\nstruct detector\n{\n    using value_t = std::false_type;\n    using type = Default;\n};\n\ntemplate<class Default, template<class...> class Op, class... Args>\nstruct detector<Default, void_t<Op<Args...>>, Op, Args...>\n{\n    using value_t = std::true_type;\n    using type = Op<Args...>;\n};\n\ntemplate<template<class...> class Op, class... Args>\nusing is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;\n\ntemplate<template<class...> class Op, class... Args>\nstruct is_detected_lazy : is_detected<Op, Args...> { };\n\ntemplate<template<class...> class Op, class... Args>\nusing detected_t = typename detector<nonesuch, void, Op, Args...>::type;\n\ntemplate<class Default, template<class...> class Op, class... Args>\nusing detected_or = detector<Default, void, Op, Args...>;\n\ntemplate<class Default, template<class...> class Op, class... Args>\nusing detected_or_t = typename detected_or<Default, Op, Args...>::type;\n\ntemplate<class Expected, template<class...> class Op, class... Args>\nusing is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;\n\ntemplate<class To, template<class...> class Op, class... Args>\nusing is_detected_convertible =\n    std::is_convertible<detected_t<Op, Args...>, To>;\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/identity_tag.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n// dispatching helper struct\ntemplate <class T> struct identity_tag {};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/is_sax.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstdint> // size_t\n#include <utility> // declval\n#include <string> // string\n\n#include <nlohmann/detail/abi_macros.hpp>\n#include <nlohmann/detail/meta/detected.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename T>\nusing null_function_t = decltype(std::declval<T&>().null());\n\ntemplate<typename T>\nusing boolean_function_t =\n    decltype(std::declval<T&>().boolean(std::declval<bool>()));\n\ntemplate<typename T, typename Integer>\nusing number_integer_function_t =\n    decltype(std::declval<T&>().number_integer(std::declval<Integer>()));\n\ntemplate<typename T, typename Unsigned>\nusing number_unsigned_function_t =\n    decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()));\n\ntemplate<typename T, typename Float, typename String>\nusing number_float_function_t = decltype(std::declval<T&>().number_float(\n                                    std::declval<Float>(), std::declval<const String&>()));\n\ntemplate<typename T, typename String>\nusing string_function_t =\n    decltype(std::declval<T&>().string(std::declval<String&>()));\n\ntemplate<typename T, typename Binary>\nusing binary_function_t =\n    decltype(std::declval<T&>().binary(std::declval<Binary&>()));\n\ntemplate<typename T>\nusing start_object_function_t =\n    decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));\n\ntemplate<typename T, typename String>\nusing key_function_t =\n    decltype(std::declval<T&>().key(std::declval<String&>()));\n\ntemplate<typename T>\nusing end_object_function_t = decltype(std::declval<T&>().end_object());\n\ntemplate<typename T>\nusing start_array_function_t =\n    decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));\n\ntemplate<typename T>\nusing end_array_function_t = decltype(std::declval<T&>().end_array());\n\ntemplate<typename T, typename Exception>\nusing parse_error_function_t = decltype(std::declval<T&>().parse_error(\n        std::declval<std::size_t>(), std::declval<const std::string&>(),\n        std::declval<const Exception&>()));\n\ntemplate<typename SAX, typename BasicJsonType>\nstruct is_sax\n{\n  private:\n    static_assert(is_basic_json<BasicJsonType>::value,\n                  \"BasicJsonType must be of type basic_json<...>\");\n\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using exception_t = typename BasicJsonType::exception;\n\n  public:\n    static constexpr bool value =\n        is_detected_exact<bool, null_function_t, SAX>::value &&\n        is_detected_exact<bool, boolean_function_t, SAX>::value &&\n        is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value &&\n        is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value &&\n        is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value &&\n        is_detected_exact<bool, string_function_t, SAX, string_t>::value &&\n        is_detected_exact<bool, binary_function_t, SAX, binary_t>::value &&\n        is_detected_exact<bool, start_object_function_t, SAX>::value &&\n        is_detected_exact<bool, key_function_t, SAX, string_t>::value &&\n        is_detected_exact<bool, end_object_function_t, SAX>::value &&\n        is_detected_exact<bool, start_array_function_t, SAX>::value &&\n        is_detected_exact<bool, end_array_function_t, SAX>::value &&\n        is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value;\n};\n\ntemplate<typename SAX, typename BasicJsonType>\nstruct is_sax_static_asserts\n{\n  private:\n    static_assert(is_basic_json<BasicJsonType>::value,\n                  \"BasicJsonType must be of type basic_json<...>\");\n\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using exception_t = typename BasicJsonType::exception;\n\n  public:\n    static_assert(is_detected_exact<bool, null_function_t, SAX>::value,\n                  \"Missing/invalid function: bool null()\");\n    static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,\n                  \"Missing/invalid function: bool boolean(bool)\");\n    static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,\n                  \"Missing/invalid function: bool boolean(bool)\");\n    static_assert(\n        is_detected_exact<bool, number_integer_function_t, SAX,\n        number_integer_t>::value,\n        \"Missing/invalid function: bool number_integer(number_integer_t)\");\n    static_assert(\n        is_detected_exact<bool, number_unsigned_function_t, SAX,\n        number_unsigned_t>::value,\n        \"Missing/invalid function: bool number_unsigned(number_unsigned_t)\");\n    static_assert(is_detected_exact<bool, number_float_function_t, SAX,\n                  number_float_t, string_t>::value,\n                  \"Missing/invalid function: bool number_float(number_float_t, const string_t&)\");\n    static_assert(\n        is_detected_exact<bool, string_function_t, SAX, string_t>::value,\n        \"Missing/invalid function: bool string(string_t&)\");\n    static_assert(\n        is_detected_exact<bool, binary_function_t, SAX, binary_t>::value,\n        \"Missing/invalid function: bool binary(binary_t&)\");\n    static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value,\n                  \"Missing/invalid function: bool start_object(std::size_t)\");\n    static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value,\n                  \"Missing/invalid function: bool key(string_t&)\");\n    static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value,\n                  \"Missing/invalid function: bool end_object()\");\n    static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value,\n                  \"Missing/invalid function: bool start_array(std::size_t)\");\n    static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value,\n                  \"Missing/invalid function: bool end_array()\");\n    static_assert(\n        is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value,\n        \"Missing/invalid function: bool parse_error(std::size_t, const \"\n        \"std::string&, const exception&)\");\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/std_fs.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/macro_scope.hpp>\n\n#if JSON_HAS_EXPERIMENTAL_FILESYSTEM\n#include <experimental/filesystem>\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\nnamespace std_fs = std::experimental::filesystem;\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n#elif JSON_HAS_FILESYSTEM\n#include <filesystem> // NOLINT(build/c++17)\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\nnamespace std_fs = std::filesystem;\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n#endif\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/type_traits.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <limits> // numeric_limits\n#include <string> // char_traits\n#include <tuple> // tuple\n#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type\n#include <utility> // declval\n\n#include <nlohmann/detail/iterators/iterator_traits.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/call_std/begin.hpp>\n#include <nlohmann/detail/meta/call_std/end.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/detected.hpp>\n#include <nlohmann/json_fwd.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n/*!\n@brief detail namespace with internal helper functions\n\nThis namespace collects functions that should not be exposed,\nimplementations of some @ref basic_json methods, and meta-programming helpers.\n\n@since version 2.1.0\n*/\nnamespace detail\n{\n\n/////////////\n// helpers //\n/////////////\n\n// Note to maintainers:\n//\n// Every trait in this file expects a non CV-qualified type.\n// The only exceptions are in the 'aliases for detected' section\n// (i.e. those of the form: decltype(T::member_function(std::declval<T>())))\n//\n// In this case, T has to be properly CV-qualified to constraint the function arguments\n// (e.g. to_json(BasicJsonType&, const T&))\n\ntemplate<typename> struct is_basic_json : std::false_type {};\n\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstruct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};\n\n// used by exceptions create() member functions\n// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t\n// false_type otherwise\ntemplate<typename BasicJsonContext>\nstruct is_basic_json_context :\n    std::integral_constant < bool,\n    is_basic_json<typename std::remove_cv<typename std::remove_pointer<BasicJsonContext>::type>::type>::value\n    || std::is_same<BasicJsonContext, std::nullptr_t>::value >\n{};\n\n//////////////////////\n// json_ref helpers //\n//////////////////////\n\ntemplate<typename>\nclass json_ref;\n\ntemplate<typename>\nstruct is_json_ref : std::false_type {};\n\ntemplate<typename T>\nstruct is_json_ref<json_ref<T>> : std::true_type {};\n\n//////////////////////////\n// aliases for detected //\n//////////////////////////\n\ntemplate<typename T>\nusing mapped_type_t = typename T::mapped_type;\n\ntemplate<typename T>\nusing key_type_t = typename T::key_type;\n\ntemplate<typename T>\nusing value_type_t = typename T::value_type;\n\ntemplate<typename T>\nusing difference_type_t = typename T::difference_type;\n\ntemplate<typename T>\nusing pointer_t = typename T::pointer;\n\ntemplate<typename T>\nusing reference_t = typename T::reference;\n\ntemplate<typename T>\nusing iterator_category_t = typename T::iterator_category;\n\ntemplate<typename T, typename... Args>\nusing to_json_function = decltype(T::to_json(std::declval<Args>()...));\n\ntemplate<typename T, typename... Args>\nusing from_json_function = decltype(T::from_json(std::declval<Args>()...));\n\ntemplate<typename T, typename U>\nusing get_template_function = decltype(std::declval<T>().template get<U>());\n\n// trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_from_json : std::false_type {};\n\n// trait checking if j.get<T> is valid\n// use this trait instead of std::is_constructible or std::is_convertible,\n// both rely on, or make use of implicit conversions, and thus fail when T\n// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)\ntemplate <typename BasicJsonType, typename T>\nstruct is_getable\n{\n    static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;\n};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<void, from_json_function, serializer,\n        const BasicJsonType&, T&>::value;\n};\n\n// This trait checks if JSONSerializer<T>::from_json(json const&) exists\n// this overload is used for non-default-constructible user-defined-types\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_non_default_from_json : std::false_type {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<T, from_json_function, serializer,\n        const BasicJsonType&>::value;\n};\n\n// This trait checks if BasicJsonType::json_serializer<T>::to_json exists\n// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion.\ntemplate<typename BasicJsonType, typename T, typename = void>\nstruct has_to_json : std::false_type {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>\n{\n    using serializer = typename BasicJsonType::template json_serializer<T, void>;\n\n    static constexpr bool value =\n        is_detected_exact<void, to_json_function, serializer, BasicJsonType&,\n        T>::value;\n};\n\ntemplate<typename T>\nusing detect_key_compare = typename T::key_compare;\n\ntemplate<typename T>\nstruct has_key_compare : std::integral_constant<bool, is_detected<detect_key_compare, T>::value> {};\n\n// obtains the actual object key comparator\ntemplate<typename BasicJsonType>\nstruct actual_object_comparator\n{\n    using object_t = typename BasicJsonType::object_t;\n    using object_comparator_t = typename BasicJsonType::default_object_comparator_t;\n    using type = typename std::conditional < has_key_compare<object_t>::value,\n          typename object_t::key_compare, object_comparator_t>::type;\n};\n\ntemplate<typename BasicJsonType>\nusing actual_object_comparator_t = typename actual_object_comparator<BasicJsonType>::type;\n\n/////////////////\n// char_traits //\n/////////////////\n\n// Primary template of char_traits calls std char_traits\ntemplate<typename T>\nstruct char_traits : std::char_traits<T>\n{};\n\n// Explicitly define char traits for unsigned char since it is not standard\ntemplate<>\nstruct char_traits<unsigned char> : std::char_traits<char>\n{\n    using char_type = unsigned char;\n    using int_type = uint64_t;\n\n    // Redefine to_int_type function\n    static int_type to_int_type(char_type c) noexcept\n    {\n        return static_cast<int_type>(c);\n    }\n\n    static char_type to_char_type(int_type i) noexcept\n    {\n        return static_cast<char_type>(i);\n    }\n\n    static constexpr int_type eof() noexcept\n    {\n        return static_cast<int_type>(std::char_traits<char>::eof());\n    }\n};\n\n// Explicitly define char traits for signed char since it is not standard\ntemplate<>\nstruct char_traits<signed char> : std::char_traits<char>\n{\n    using char_type = signed char;\n    using int_type = uint64_t;\n\n    // Redefine to_int_type function\n    static int_type to_int_type(char_type c) noexcept\n    {\n        return static_cast<int_type>(c);\n    }\n\n    static char_type to_char_type(int_type i) noexcept\n    {\n        return static_cast<char_type>(i);\n    }\n\n    static constexpr int_type eof() noexcept\n    {\n        return static_cast<int_type>(std::char_traits<char>::eof());\n    }\n};\n\n///////////////////\n// is_ functions //\n///////////////////\n\n// https://en.cppreference.com/w/cpp/types/conjunction\ntemplate<class...> struct conjunction : std::true_type { };\ntemplate<class B> struct conjunction<B> : B { };\ntemplate<class B, class... Bn>\nstruct conjunction<B, Bn...>\n: std::conditional<static_cast<bool>(B::value), conjunction<Bn...>, B>::type {};\n\n// https://en.cppreference.com/w/cpp/types/negation\ntemplate<class B> struct negation : std::integral_constant < bool, !B::value > { };\n\n// Reimplementation of is_constructible and is_default_constructible, due to them being broken for\n// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367).\n// This causes compile errors in e.g. clang 3.5 or gcc 4.9.\ntemplate <typename T>\nstruct is_default_constructible : std::is_default_constructible<T> {};\n\ntemplate <typename T1, typename T2>\nstruct is_default_constructible<std::pair<T1, T2>>\n    : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};\n\ntemplate <typename T1, typename T2>\nstruct is_default_constructible<const std::pair<T1, T2>>\n    : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};\n\ntemplate <typename... Ts>\nstruct is_default_constructible<std::tuple<Ts...>>\n    : conjunction<is_default_constructible<Ts>...> {};\n\ntemplate <typename... Ts>\nstruct is_default_constructible<const std::tuple<Ts...>>\n    : conjunction<is_default_constructible<Ts>...> {};\n\ntemplate <typename T, typename... Args>\nstruct is_constructible : std::is_constructible<T, Args...> {};\n\ntemplate <typename T1, typename T2>\nstruct is_constructible<std::pair<T1, T2>> : is_default_constructible<std::pair<T1, T2>> {};\n\ntemplate <typename T1, typename T2>\nstruct is_constructible<const std::pair<T1, T2>> : is_default_constructible<const std::pair<T1, T2>> {};\n\ntemplate <typename... Ts>\nstruct is_constructible<std::tuple<Ts...>> : is_default_constructible<std::tuple<Ts...>> {};\n\ntemplate <typename... Ts>\nstruct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {};\n\ntemplate<typename T, typename = void>\nstruct is_iterator_traits : std::false_type {};\n\ntemplate<typename T>\nstruct is_iterator_traits<iterator_traits<T>>\n{\n  private:\n    using traits = iterator_traits<T>;\n\n  public:\n    static constexpr auto value =\n        is_detected<value_type_t, traits>::value &&\n        is_detected<difference_type_t, traits>::value &&\n        is_detected<pointer_t, traits>::value &&\n        is_detected<iterator_category_t, traits>::value &&\n        is_detected<reference_t, traits>::value;\n};\n\ntemplate<typename T>\nstruct is_range\n{\n  private:\n    using t_ref = typename std::add_lvalue_reference<T>::type;\n\n    using iterator = detected_t<result_of_begin, t_ref>;\n    using sentinel = detected_t<result_of_end, t_ref>;\n\n    // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator\n    // and https://en.cppreference.com/w/cpp/iterator/sentinel_for\n    // but reimplementing these would be too much work, as a lot of other concepts are used underneath\n    static constexpr auto is_iterator_begin =\n        is_iterator_traits<iterator_traits<iterator>>::value;\n\n  public:\n    static constexpr bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value && is_iterator_begin;\n};\n\ntemplate<typename R>\nusing iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>;\n\ntemplate<typename T>\nusing range_value_t = value_type_t<iterator_traits<iterator_t<T>>>;\n\n// The following implementation of is_complete_type is taken from\n// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/\n// and is written by Xiang Fan who agreed to using it in this library.\n\ntemplate<typename T, typename = void>\nstruct is_complete_type : std::false_type {};\n\ntemplate<typename T>\nstruct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType,\n         typename = void>\nstruct is_compatible_object_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType>\nstruct is_compatible_object_type_impl <\n    BasicJsonType, CompatibleObjectType,\n    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&\n    is_detected<key_type_t, CompatibleObjectType>::value >>\n{\n    using object_t = typename BasicJsonType::object_t;\n\n    // macOS's is_constructible does not play well with nonesuch...\n    static constexpr bool value =\n        is_constructible<typename object_t::key_type,\n        typename CompatibleObjectType::key_type>::value &&\n        is_constructible<typename object_t::mapped_type,\n        typename CompatibleObjectType::mapped_type>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleObjectType>\nstruct is_compatible_object_type\n    : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType,\n         typename = void>\nstruct is_constructible_object_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType>\nstruct is_constructible_object_type_impl <\n    BasicJsonType, ConstructibleObjectType,\n    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&\n    is_detected<key_type_t, ConstructibleObjectType>::value >>\n{\n    using object_t = typename BasicJsonType::object_t;\n\n    static constexpr bool value =\n        (is_default_constructible<ConstructibleObjectType>::value &&\n         (std::is_move_assignable<ConstructibleObjectType>::value ||\n          std::is_copy_assignable<ConstructibleObjectType>::value) &&\n         (is_constructible<typename ConstructibleObjectType::key_type,\n          typename object_t::key_type>::value &&\n          std::is_same <\n          typename object_t::mapped_type,\n          typename ConstructibleObjectType::mapped_type >::value)) ||\n        (has_from_json<BasicJsonType,\n         typename ConstructibleObjectType::mapped_type>::value ||\n         has_non_default_from_json <\n         BasicJsonType,\n         typename ConstructibleObjectType::mapped_type >::value);\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleObjectType>\nstruct is_constructible_object_type\n    : is_constructible_object_type_impl<BasicJsonType,\n      ConstructibleObjectType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleStringType>\nstruct is_compatible_string_type\n{\n    static constexpr auto value =\n        is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value;\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleStringType>\nstruct is_constructible_string_type\n{\n    // launder type through decltype() to fix compilation failure on ICPC\n#ifdef __INTEL_COMPILER\n    using laundered_type = decltype(std::declval<ConstructibleStringType>());\n#else\n    using laundered_type = ConstructibleStringType;\n#endif\n\n    static constexpr auto value =\n        conjunction <\n        is_constructible<laundered_type, typename BasicJsonType::string_t>,\n        is_detected_exact<typename BasicJsonType::string_t::value_type,\n        value_type_t, laundered_type >>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType, typename = void>\nstruct is_compatible_array_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType>\nstruct is_compatible_array_type_impl <\n    BasicJsonType, CompatibleArrayType,\n    enable_if_t <\n    is_detected<iterator_t, CompatibleArrayType>::value&&\n    is_iterator_traits<iterator_traits<detected_t<iterator_t, CompatibleArrayType>>>::value&&\n// special case for types like std::filesystem::path whose iterator's value_type are themselves\n// c.f. https://github.com/nlohmann/json/pull/3073\n    !std::is_same<CompatibleArrayType, detected_t<range_value_t, CompatibleArrayType>>::value >>\n{\n    static constexpr bool value =\n        is_constructible<BasicJsonType,\n        range_value_t<CompatibleArrayType>>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleArrayType>\nstruct is_compatible_array_type\n    : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType, typename = void>\nstruct is_constructible_array_type_impl : std::false_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type_impl <\n    BasicJsonType, ConstructibleArrayType,\n    enable_if_t<std::is_same<ConstructibleArrayType,\n    typename BasicJsonType::value_type>::value >>\n            : std::true_type {};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type_impl <\n    BasicJsonType, ConstructibleArrayType,\n    enable_if_t < !std::is_same<ConstructibleArrayType,\n    typename BasicJsonType::value_type>::value&&\n    !is_compatible_string_type<BasicJsonType, ConstructibleArrayType>::value&&\n    is_default_constructible<ConstructibleArrayType>::value&&\n(std::is_move_assignable<ConstructibleArrayType>::value ||\n std::is_copy_assignable<ConstructibleArrayType>::value)&&\nis_detected<iterator_t, ConstructibleArrayType>::value&&\nis_iterator_traits<iterator_traits<detected_t<iterator_t, ConstructibleArrayType>>>::value&&\nis_detected<range_value_t, ConstructibleArrayType>::value&&\n// special case for types like std::filesystem::path whose iterator's value_type are themselves\n// c.f. https://github.com/nlohmann/json/pull/3073\n!std::is_same<ConstructibleArrayType, detected_t<range_value_t, ConstructibleArrayType>>::value&&\nis_complete_type <\ndetected_t<range_value_t, ConstructibleArrayType >>::value >>\n{\n    using value_type = range_value_t<ConstructibleArrayType>;\n\n    static constexpr bool value =\n        std::is_same<value_type,\n        typename BasicJsonType::array_t::value_type>::value ||\n        has_from_json<BasicJsonType,\n        value_type>::value ||\n        has_non_default_from_json <\n        BasicJsonType,\n        value_type >::value;\n};\n\ntemplate<typename BasicJsonType, typename ConstructibleArrayType>\nstruct is_constructible_array_type\n    : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType,\n         typename = void>\nstruct is_compatible_integer_type_impl : std::false_type {};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType>\nstruct is_compatible_integer_type_impl <\n    RealIntegerType, CompatibleNumberIntegerType,\n    enable_if_t < std::is_integral<RealIntegerType>::value&&\n    std::is_integral<CompatibleNumberIntegerType>::value&&\n    !std::is_same<bool, CompatibleNumberIntegerType>::value >>\n{\n    // is there an assert somewhere on overflows?\n    using RealLimits = std::numeric_limits<RealIntegerType>;\n    using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;\n\n    static constexpr auto value =\n        is_constructible<RealIntegerType,\n        CompatibleNumberIntegerType>::value &&\n        CompatibleLimits::is_integer &&\n        RealLimits::is_signed == CompatibleLimits::is_signed;\n};\n\ntemplate<typename RealIntegerType, typename CompatibleNumberIntegerType>\nstruct is_compatible_integer_type\n    : is_compatible_integer_type_impl<RealIntegerType,\n      CompatibleNumberIntegerType> {};\n\ntemplate<typename BasicJsonType, typename CompatibleType, typename = void>\nstruct is_compatible_type_impl: std::false_type {};\n\ntemplate<typename BasicJsonType, typename CompatibleType>\nstruct is_compatible_type_impl <\n    BasicJsonType, CompatibleType,\n    enable_if_t<is_complete_type<CompatibleType>::value >>\n{\n    static constexpr bool value =\n        has_to_json<BasicJsonType, CompatibleType>::value;\n};\n\ntemplate<typename BasicJsonType, typename CompatibleType>\nstruct is_compatible_type\n    : is_compatible_type_impl<BasicJsonType, CompatibleType> {};\n\ntemplate<typename T1, typename T2>\nstruct is_constructible_tuple : std::false_type {};\n\ntemplate<typename T1, typename... Args>\nstruct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {};\n\ntemplate<typename BasicJsonType, typename T>\nstruct is_json_iterator_of : std::false_type {};\n\ntemplate<typename BasicJsonType>\nstruct is_json_iterator_of<BasicJsonType, typename BasicJsonType::iterator> : std::true_type {};\n\ntemplate<typename BasicJsonType>\nstruct is_json_iterator_of<BasicJsonType, typename BasicJsonType::const_iterator> : std::true_type\n{};\n\n// checks if a given type T is a template specialization of Primary\ntemplate<template <typename...> class Primary, typename T>\nstruct is_specialization_of : std::false_type {};\n\ntemplate<template <typename...> class Primary, typename... Args>\nstruct is_specialization_of<Primary, Primary<Args...>> : std::true_type {};\n\ntemplate<typename T>\nusing is_json_pointer = is_specialization_of<::nlohmann::json_pointer, uncvref_t<T>>;\n\n// checks if A and B are comparable using Compare functor\ntemplate<typename Compare, typename A, typename B, typename = void>\nstruct is_comparable : std::false_type {};\n\ntemplate<typename Compare, typename A, typename B>\nstruct is_comparable<Compare, A, B, void_t<\ndecltype(std::declval<Compare>()(std::declval<A>(), std::declval<B>())),\ndecltype(std::declval<Compare>()(std::declval<B>(), std::declval<A>()))\n>> : std::true_type {};\n\ntemplate<typename T>\nusing detect_is_transparent = typename T::is_transparent;\n\n// type trait to check if KeyType can be used as object key (without a BasicJsonType)\n// see is_usable_as_basic_json_key_type below\ntemplate<typename Comparator, typename ObjectKeyType, typename KeyTypeCVRef, bool RequireTransparentComparator = true,\n         bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>\nusing is_usable_as_key_type = typename std::conditional <\n                              is_comparable<Comparator, ObjectKeyType, KeyTypeCVRef>::value\n                              && !(ExcludeObjectKeyType && std::is_same<KeyType,\n                                   ObjectKeyType>::value)\n                              && (!RequireTransparentComparator\n                                  || is_detected <detect_is_transparent, Comparator>::value)\n                              && !is_json_pointer<KeyType>::value,\n                              std::true_type,\n                              std::false_type >::type;\n\n// type trait to check if KeyType can be used as object key\n// true if:\n//   - KeyType is comparable with BasicJsonType::object_t::key_type\n//   - if ExcludeObjectKeyType is true, KeyType is not BasicJsonType::object_t::key_type\n//   - the comparator is transparent or RequireTransparentComparator is false\n//   - KeyType is not a JSON iterator or json_pointer\ntemplate<typename BasicJsonType, typename KeyTypeCVRef, bool RequireTransparentComparator = true,\n         bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>\nusing is_usable_as_basic_json_key_type = typename std::conditional <\n    is_usable_as_key_type<typename BasicJsonType::object_comparator_t,\n    typename BasicJsonType::object_t::key_type, KeyTypeCVRef,\n    RequireTransparentComparator, ExcludeObjectKeyType>::value\n    && !is_json_iterator_of<BasicJsonType, KeyType>::value,\n    std::true_type,\n    std::false_type >::type;\n\ntemplate<typename ObjectType, typename KeyType>\nusing detect_erase_with_key_type = decltype(std::declval<ObjectType&>().erase(std::declval<KeyType>()));\n\n// type trait to check if object_t has an erase() member functions accepting KeyType\ntemplate<typename BasicJsonType, typename KeyType>\nusing has_erase_with_key_type = typename std::conditional <\n                                is_detected <\n                                detect_erase_with_key_type,\n                                typename BasicJsonType::object_t, KeyType >::value,\n                                std::true_type,\n                                std::false_type >::type;\n\n// a naive helper to check if a type is an ordered_map (exploits the fact that\n// ordered_map inherits capacity() from std::vector)\ntemplate <typename T>\nstruct is_ordered_map\n{\n    using one = char;\n\n    struct two\n    {\n        char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n    };\n\n    template <typename C> static one test( decltype(&C::capacity) ) ;\n    template <typename C> static two test(...);\n\n    enum { value = sizeof(test<T>(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n};\n\n// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324)\ntemplate < typename T, typename U, enable_if_t < !std::is_same<T, U>::value, int > = 0 >\nT conditional_static_cast(U value)\n{\n    return static_cast<T>(value);\n}\n\ntemplate<typename T, typename U, enable_if_t<std::is_same<T, U>::value, int> = 0>\nT conditional_static_cast(U value)\n{\n    return value;\n}\n\ntemplate<typename... Types>\nusing all_integral = conjunction<std::is_integral<Types>...>;\n\ntemplate<typename... Types>\nusing all_signed = conjunction<std::is_signed<Types>...>;\n\ntemplate<typename... Types>\nusing all_unsigned = conjunction<std::is_unsigned<Types>...>;\n\n// there's a disjunction trait in another PR; replace when merged\ntemplate<typename... Types>\nusing same_sign = std::integral_constant < bool,\n      all_signed<Types...>::value || all_unsigned<Types...>::value >;\n\ntemplate<typename OfType, typename T>\nusing never_out_of_range = std::integral_constant < bool,\n      (std::is_signed<OfType>::value && (sizeof(T) < sizeof(OfType)))\n      || (same_sign<OfType, T>::value && sizeof(OfType) == sizeof(T)) >;\n\ntemplate<typename OfType, typename T,\n         bool OfTypeSigned = std::is_signed<OfType>::value,\n         bool TSigned = std::is_signed<T>::value>\nstruct value_in_range_of_impl2;\n\ntemplate<typename OfType, typename T>\nstruct value_in_range_of_impl2<OfType, T, false, false>\n{\n    static constexpr bool test(T val)\n    {\n        using CommonType = typename std::common_type<OfType, T>::type;\n        return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());\n    }\n};\n\ntemplate<typename OfType, typename T>\nstruct value_in_range_of_impl2<OfType, T, true, false>\n{\n    static constexpr bool test(T val)\n    {\n        using CommonType = typename std::common_type<OfType, T>::type;\n        return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());\n    }\n};\n\ntemplate<typename OfType, typename T>\nstruct value_in_range_of_impl2<OfType, T, false, true>\n{\n    static constexpr bool test(T val)\n    {\n        using CommonType = typename std::common_type<OfType, T>::type;\n        return val >= 0 && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());\n    }\n};\n\ntemplate<typename OfType, typename T>\nstruct value_in_range_of_impl2<OfType, T, true, true>\n{\n    static constexpr bool test(T val)\n    {\n        using CommonType = typename std::common_type<OfType, T>::type;\n        return static_cast<CommonType>(val) >= static_cast<CommonType>((std::numeric_limits<OfType>::min)())\n               && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());\n    }\n};\n\ntemplate<typename OfType, typename T,\n         bool NeverOutOfRange = never_out_of_range<OfType, T>::value,\n         typename = detail::enable_if_t<all_integral<OfType, T>::value>>\nstruct value_in_range_of_impl1;\n\ntemplate<typename OfType, typename T>\nstruct value_in_range_of_impl1<OfType, T, false>\n{\n    static constexpr bool test(T val)\n    {\n        return value_in_range_of_impl2<OfType, T>::test(val);\n    }\n};\n\ntemplate<typename OfType, typename T>\nstruct value_in_range_of_impl1<OfType, T, true>\n{\n    static constexpr bool test(T /*val*/)\n    {\n        return true;\n    }\n};\n\ntemplate<typename OfType, typename T>\nconstexpr bool value_in_range_of(T val)\n{\n    return value_in_range_of_impl1<OfType, T>::test(val);\n}\n\ntemplate<bool Value>\nusing bool_constant = std::integral_constant<bool, Value>;\n\n///////////////////////////////////////////////////////////////////////////////\n// is_c_string\n///////////////////////////////////////////////////////////////////////////////\n\nnamespace impl\n{\n\ntemplate<typename T>\nconstexpr bool is_c_string()\n{\n    using TUnExt = typename std::remove_extent<T>::type;\n    using TUnCVExt = typename std::remove_cv<TUnExt>::type;\n    using TUnPtr = typename std::remove_pointer<T>::type;\n    using TUnCVPtr = typename std::remove_cv<TUnPtr>::type;\n    return\n        (std::is_array<T>::value && std::is_same<TUnCVExt, char>::value)\n        || (std::is_pointer<T>::value && std::is_same<TUnCVPtr, char>::value);\n}\n\n}  // namespace impl\n\n// checks whether T is a [cv] char */[cv] char[] C string\ntemplate<typename T>\nstruct is_c_string : bool_constant<impl::is_c_string<T>()> {};\n\ntemplate<typename T>\nusing is_c_string_uncvref = is_c_string<uncvref_t<T>>;\n\n///////////////////////////////////////////////////////////////////////////////\n// is_transparent\n///////////////////////////////////////////////////////////////////////////////\n\nnamespace impl\n{\n\ntemplate<typename T>\nconstexpr bool is_transparent()\n{\n    return is_detected<detect_is_transparent, T>::value;\n}\n\n}  // namespace impl\n\n// checks whether T has a member named is_transparent\ntemplate<typename T>\nstruct is_transparent : bool_constant<impl::is_transparent<T>()> {};\n\n///////////////////////////////////////////////////////////////////////////////\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/meta/void_t.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename ...Ts> struct make_void\n{\n    using type = void;\n};\ntemplate<typename ...Ts> using void_t = typename make_void<Ts...>::type;\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/output/binary_writer.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <algorithm> // reverse\n#include <array> // array\n#include <map> // map\n#include <cmath> // isnan, isinf\n#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t\n#include <cstring> // memcpy\n#include <limits> // numeric_limits\n#include <string> // string\n#include <utility> // move\n#include <vector> // vector\n\n#include <nlohmann/detail/input/binary_reader.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/output/output_adapters.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/// how to encode BJData\nenum class bjdata_version_t\n{\n    draft2,\n    draft3,\n};\n\n///////////////////\n// binary writer //\n///////////////////\n\n/*!\n@brief serialization to CBOR and MessagePack values\n*/\ntemplate<typename BasicJsonType, typename CharType>\nclass binary_writer\n{\n    using string_t = typename BasicJsonType::string_t;\n    using binary_t = typename BasicJsonType::binary_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n\n  public:\n    /*!\n    @brief create a binary writer\n\n    @param[in] adapter  output adapter to write to\n    */\n    explicit binary_writer(output_adapter_t<CharType> adapter) : oa(std::move(adapter))\n    {\n        JSON_ASSERT(oa);\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @pre       j.type() == value_t::object\n    */\n    void write_bson(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::object:\n            {\n                write_bson_object(*j.m_data.m_value.object);\n                break;\n            }\n\n            case value_t::null:\n            case value_t::array:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                JSON_THROW(type_error::create(317, concat(\"to serialize to BSON, top-level type must be object, but is \", j.type_name()), &j));\n            }\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    */\n    void write_cbor(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n            {\n                oa->write_character(to_char_type(0xF6));\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                oa->write_character(j.m_data.m_value.boolean\n                                    ? to_char_type(0xF5)\n                                    : to_char_type(0xF4));\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                if (j.m_data.m_value.number_integer >= 0)\n                {\n                    // CBOR does not differentiate between positive signed\n                    // integers and unsigned integers. Therefore, we used the\n                    // code from the value_t::number_unsigned case here.\n                    if (j.m_data.m_value.number_integer <= 0x17)\n                    {\n                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x18));\n                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x19));\n                        write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x1A));\n                        write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));\n                    }\n                    else\n                    {\n                        oa->write_character(to_char_type(0x1B));\n                        write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));\n                    }\n                }\n                else\n                {\n                    // The conversions below encode the sign in the first\n                    // byte, and the value is converted to a positive number.\n                    const auto positive_number = -1 - j.m_data.m_value.number_integer;\n                    if (j.m_data.m_value.number_integer >= -24)\n                    {\n                        write_number(static_cast<std::uint8_t>(0x20 + positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x38));\n                        write_number(static_cast<std::uint8_t>(positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x39));\n                        write_number(static_cast<std::uint16_t>(positive_number));\n                    }\n                    else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        oa->write_character(to_char_type(0x3A));\n                        write_number(static_cast<std::uint32_t>(positive_number));\n                    }\n                    else\n                    {\n                        oa->write_character(to_char_type(0x3B));\n                        write_number(static_cast<std::uint64_t>(positive_number));\n                    }\n                }\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_data.m_value.number_unsigned <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x18));\n                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x19));\n                    write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_unsigned));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x1A));\n                    write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_unsigned));\n                }\n                else\n                {\n                    oa->write_character(to_char_type(0x1B));\n                    write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_unsigned));\n                }\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                if (std::isnan(j.m_data.m_value.number_float))\n                {\n                    // NaN is 0xf97e00 in CBOR\n                    oa->write_character(to_char_type(0xF9));\n                    oa->write_character(to_char_type(0x7E));\n                    oa->write_character(to_char_type(0x00));\n                }\n                else if (std::isinf(j.m_data.m_value.number_float))\n                {\n                    // Infinity is 0xf97c00, -Infinity is 0xf9fc00\n                    oa->write_character(to_char_type(0xf9));\n                    oa->write_character(j.m_data.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));\n                    oa->write_character(to_char_type(0x00));\n                }\n                else\n                {\n                    write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::cbor);\n                }\n                break;\n            }\n\n            case value_t::string:\n            {\n                // step 1: write control byte and the string length\n                const auto N = j.m_data.m_value.string->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x60 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x78));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x79));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x7A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x7B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write the string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),\n                    j.m_data.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                // step 1: write control byte and the array size\n                const auto N = j.m_data.m_value.array->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x80 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x98));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x99));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x9A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x9B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                for (const auto& el : *j.m_data.m_value.array)\n                {\n                    write_cbor(el);\n                }\n                break;\n            }\n\n            case value_t::binary:\n            {\n                if (j.m_data.m_value.binary->has_subtype())\n                {\n                    if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        write_number(static_cast<std::uint8_t>(0xd8));\n                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.binary->subtype()));\n                    }\n                    else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        write_number(static_cast<std::uint8_t>(0xd9));\n                        write_number(static_cast<std::uint16_t>(j.m_data.m_value.binary->subtype()));\n                    }\n                    else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        write_number(static_cast<std::uint8_t>(0xda));\n                        write_number(static_cast<std::uint32_t>(j.m_data.m_value.binary->subtype()));\n                    }\n                    else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)())\n                    {\n                        write_number(static_cast<std::uint8_t>(0xdb));\n                        write_number(static_cast<std::uint64_t>(j.m_data.m_value.binary->subtype()));\n                    }\n                }\n\n                // step 1: write control byte and the binary array size\n                const auto N = j.m_data.m_value.binary->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0x40 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x58));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x59));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x5A));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0x5B));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),\n                    N);\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // step 1: write control byte and the object size\n                const auto N = j.m_data.m_value.object->size();\n                if (N <= 0x17)\n                {\n                    write_number(static_cast<std::uint8_t>(0xA0 + N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xB8));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xB9));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xBA));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n                // LCOV_EXCL_START\n                else if (N <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    oa->write_character(to_char_type(0xBB));\n                    write_number(static_cast<std::uint64_t>(N));\n                }\n                // LCOV_EXCL_STOP\n\n                // step 2: write each element\n                for (const auto& el : *j.m_data.m_value.object)\n                {\n                    write_cbor(el.first);\n                    write_cbor(el.second);\n                }\n                break;\n            }\n\n            case value_t::discarded:\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    */\n    void write_msgpack(const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::null: // nil\n            {\n                oa->write_character(to_char_type(0xC0));\n                break;\n            }\n\n            case value_t::boolean: // true and false\n            {\n                oa->write_character(j.m_data.m_value.boolean\n                                    ? to_char_type(0xC3)\n                                    : to_char_type(0xC2));\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                if (j.m_data.m_value.number_integer >= 0)\n                {\n                    // MessagePack does not differentiate between positive\n                    // signed integers and unsigned integers. Therefore, we used\n                    // the code from the value_t::number_unsigned case here.\n                    if (j.m_data.m_value.number_unsigned < 128)\n                    {\n                        // positive fixnum\n                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                    {\n                        // uint 8\n                        oa->write_character(to_char_type(0xCC));\n                        write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                    {\n                        // uint 16\n                        oa->write_character(to_char_type(0xCD));\n                        write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                    {\n                        // uint 32\n                        oa->write_character(to_char_type(0xCE));\n                        write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                    {\n                        // uint 64\n                        oa->write_character(to_char_type(0xCF));\n                        write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));\n                    }\n                }\n                else\n                {\n                    if (j.m_data.m_value.number_integer >= -32)\n                    {\n                        // negative fixnum\n                        write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&\n                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())\n                    {\n                        // int 8\n                        oa->write_character(to_char_type(0xD0));\n                        write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&\n                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())\n                    {\n                        // int 16\n                        oa->write_character(to_char_type(0xD1));\n                        write_number(static_cast<std::int16_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&\n                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())\n                    {\n                        // int 32\n                        oa->write_character(to_char_type(0xD2));\n                        write_number(static_cast<std::int32_t>(j.m_data.m_value.number_integer));\n                    }\n                    else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&\n                             j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())\n                    {\n                        // int 64\n                        oa->write_character(to_char_type(0xD3));\n                        write_number(static_cast<std::int64_t>(j.m_data.m_value.number_integer));\n                    }\n                }\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_data.m_value.number_unsigned < 128)\n                {\n                    // positive fixnum\n                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    // uint 8\n                    oa->write_character(to_char_type(0xCC));\n                    write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // uint 16\n                    oa->write_character(to_char_type(0xCD));\n                    write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // uint 32\n                    oa->write_character(to_char_type(0xCE));\n                    write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));\n                }\n                else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    // uint 64\n                    oa->write_character(to_char_type(0xCF));\n                    write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));\n                }\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::msgpack);\n                break;\n            }\n\n            case value_t::string:\n            {\n                // step 1: write control byte and the string length\n                const auto N = j.m_data.m_value.string->size();\n                if (N <= 31)\n                {\n                    // fixstr\n                    write_number(static_cast<std::uint8_t>(0xA0 | N));\n                }\n                else if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    // str 8\n                    oa->write_character(to_char_type(0xD9));\n                    write_number(static_cast<std::uint8_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // str 16\n                    oa->write_character(to_char_type(0xDA));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // str 32\n                    oa->write_character(to_char_type(0xDB));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write the string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),\n                    j.m_data.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                // step 1: write control byte and the array size\n                const auto N = j.m_data.m_value.array->size();\n                if (N <= 15)\n                {\n                    // fixarray\n                    write_number(static_cast<std::uint8_t>(0x90 | N));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // array 16\n                    oa->write_character(to_char_type(0xDC));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // array 32\n                    oa->write_character(to_char_type(0xDD));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write each element\n                for (const auto& el : *j.m_data.m_value.array)\n                {\n                    write_msgpack(el);\n                }\n                break;\n            }\n\n            case value_t::binary:\n            {\n                // step 0: determine if the binary type has a set subtype to\n                // determine whether to use the ext or fixext types\n                const bool use_ext = j.m_data.m_value.binary->has_subtype();\n\n                // step 1: write control byte and the byte string length\n                const auto N = j.m_data.m_value.binary->size();\n                if (N <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    std::uint8_t output_type{};\n                    bool fixed = true;\n                    if (use_ext)\n                    {\n                        switch (N)\n                        {\n                            case 1:\n                                output_type = 0xD4; // fixext 1\n                                break;\n                            case 2:\n                                output_type = 0xD5; // fixext 2\n                                break;\n                            case 4:\n                                output_type = 0xD6; // fixext 4\n                                break;\n                            case 8:\n                                output_type = 0xD7; // fixext 8\n                                break;\n                            case 16:\n                                output_type = 0xD8; // fixext 16\n                                break;\n                            default:\n                                output_type = 0xC7; // ext 8\n                                fixed = false;\n                                break;\n                        }\n\n                    }\n                    else\n                    {\n                        output_type = 0xC4; // bin 8\n                        fixed = false;\n                    }\n\n                    oa->write_character(to_char_type(output_type));\n                    if (!fixed)\n                    {\n                        write_number(static_cast<std::uint8_t>(N));\n                    }\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    const std::uint8_t output_type = use_ext\n                                                     ? 0xC8 // ext 16\n                                                     : 0xC5; // bin 16\n\n                    oa->write_character(to_char_type(output_type));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    const std::uint8_t output_type = use_ext\n                                                     ? 0xC9 // ext 32\n                                                     : 0xC6; // bin 32\n\n                    oa->write_character(to_char_type(output_type));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 1.5: if this is an ext type, write the subtype\n                if (use_ext)\n                {\n                    write_number(static_cast<std::int8_t>(j.m_data.m_value.binary->subtype()));\n                }\n\n                // step 2: write the byte string\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),\n                    N);\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // step 1: write control byte and the object size\n                const auto N = j.m_data.m_value.object->size();\n                if (N <= 15)\n                {\n                    // fixmap\n                    write_number(static_cast<std::uint8_t>(0x80 | (N & 0xF)));\n                }\n                else if (N <= (std::numeric_limits<std::uint16_t>::max)())\n                {\n                    // map 16\n                    oa->write_character(to_char_type(0xDE));\n                    write_number(static_cast<std::uint16_t>(N));\n                }\n                else if (N <= (std::numeric_limits<std::uint32_t>::max)())\n                {\n                    // map 32\n                    oa->write_character(to_char_type(0xDF));\n                    write_number(static_cast<std::uint32_t>(N));\n                }\n\n                // step 2: write each element\n                for (const auto& el : *j.m_data.m_value.object)\n                {\n                    write_msgpack(el.first);\n                    write_msgpack(el.second);\n                }\n                break;\n            }\n\n            case value_t::discarded:\n            default:\n                break;\n        }\n    }\n\n    /*!\n    @param[in] j  JSON value to serialize\n    @param[in] use_count   whether to use '#' prefixes (optimized format)\n    @param[in] use_type    whether to use '$' prefixes (optimized format)\n    @param[in] add_prefix  whether prefixes need to be used for this value\n    @param[in] use_bjdata  whether write in BJData format, default is false\n    @param[in] bjdata_version  which BJData version to use, default is draft2\n    */\n    void write_ubjson(const BasicJsonType& j, const bool use_count,\n                      const bool use_type, const bool add_prefix = true,\n                      const bool use_bjdata = false, const bjdata_version_t bjdata_version = bjdata_version_t::draft2)\n    {\n        const bool bjdata_draft3 = use_bjdata && bjdata_version == bjdata_version_t::draft3;\n\n        switch (j.type())\n        {\n            case value_t::null:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('Z'));\n                }\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(j.m_data.m_value.boolean\n                                        ? to_char_type('T')\n                                        : to_char_type('F'));\n                }\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                write_number_with_ubjson_prefix(j.m_data.m_value.number_integer, add_prefix, use_bjdata);\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                write_number_with_ubjson_prefix(j.m_data.m_value.number_unsigned, add_prefix, use_bjdata);\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                write_number_with_ubjson_prefix(j.m_data.m_value.number_float, add_prefix, use_bjdata);\n                break;\n            }\n\n            case value_t::string:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('S'));\n                }\n                write_number_with_ubjson_prefix(j.m_data.m_value.string->size(), true, use_bjdata);\n                oa->write_characters(\n                    reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),\n                    j.m_data.m_value.string->size());\n                break;\n            }\n\n            case value_t::array:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('['));\n                }\n\n                bool prefix_required = true;\n                if (use_type && !j.m_data.m_value.array->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);\n                    const bool same_prefix = std::all_of(j.begin() + 1, j.end(),\n                                                         [this, first_prefix, use_bjdata](const BasicJsonType & v)\n                    {\n                        return ubjson_prefix(v, use_bjdata) == first_prefix;\n                    });\n\n                    std::vector<CharType> bjdx = {'[', '{', 'S', 'H', 'T', 'F', 'N', 'Z'}; // excluded markers in bjdata optimized type\n\n                    if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end()))\n                    {\n                        prefix_required = false;\n                        oa->write_character(to_char_type('$'));\n                        oa->write_character(first_prefix);\n                    }\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_data.m_value.array->size(), true, use_bjdata);\n                }\n\n                for (const auto& el : *j.m_data.m_value.array)\n                {\n                    write_ubjson(el, use_count, use_type, prefix_required, use_bjdata, bjdata_version);\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type(']'));\n                }\n\n                break;\n            }\n\n            case value_t::binary:\n            {\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('['));\n                }\n\n                if (use_type && (bjdata_draft3 || !j.m_data.m_value.binary->empty()))\n                {\n                    JSON_ASSERT(use_count);\n                    oa->write_character(to_char_type('$'));\n                    oa->write_character(bjdata_draft3 ? 'B' : 'U');\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_data.m_value.binary->size(), true, use_bjdata);\n                }\n\n                if (use_type)\n                {\n                    oa->write_characters(\n                        reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),\n                        j.m_data.m_value.binary->size());\n                }\n                else\n                {\n                    for (size_t i = 0; i < j.m_data.m_value.binary->size(); ++i)\n                    {\n                        oa->write_character(to_char_type(bjdata_draft3 ? 'B' : 'U'));\n                        oa->write_character(j.m_data.m_value.binary->data()[i]);\n                    }\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type(']'));\n                }\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                if (use_bjdata && j.m_data.m_value.object->size() == 3 && j.m_data.m_value.object->find(\"_ArrayType_\") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find(\"_ArraySize_\") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find(\"_ArrayData_\") != j.m_data.m_value.object->end())\n                {\n                    if (!write_bjdata_ndarray(*j.m_data.m_value.object, use_count, use_type, bjdata_version))  // decode bjdata ndarray in the JData format (https://github.com/NeuroJSON/jdata)\n                    {\n                        break;\n                    }\n                }\n\n                if (add_prefix)\n                {\n                    oa->write_character(to_char_type('{'));\n                }\n\n                bool prefix_required = true;\n                if (use_type && !j.m_data.m_value.object->empty())\n                {\n                    JSON_ASSERT(use_count);\n                    const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);\n                    const bool same_prefix = std::all_of(j.begin(), j.end(),\n                                                         [this, first_prefix, use_bjdata](const BasicJsonType & v)\n                    {\n                        return ubjson_prefix(v, use_bjdata) == first_prefix;\n                    });\n\n                    std::vector<CharType> bjdx = {'[', '{', 'S', 'H', 'T', 'F', 'N', 'Z'}; // excluded markers in bjdata optimized type\n\n                    if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end()))\n                    {\n                        prefix_required = false;\n                        oa->write_character(to_char_type('$'));\n                        oa->write_character(first_prefix);\n                    }\n                }\n\n                if (use_count)\n                {\n                    oa->write_character(to_char_type('#'));\n                    write_number_with_ubjson_prefix(j.m_data.m_value.object->size(), true, use_bjdata);\n                }\n\n                for (const auto& el : *j.m_data.m_value.object)\n                {\n                    write_number_with_ubjson_prefix(el.first.size(), true, use_bjdata);\n                    oa->write_characters(\n                        reinterpret_cast<const CharType*>(el.first.c_str()),\n                        el.first.size());\n                    write_ubjson(el.second, use_count, use_type, prefix_required, use_bjdata, bjdata_version);\n                }\n\n                if (!use_count)\n                {\n                    oa->write_character(to_char_type('}'));\n                }\n\n                break;\n            }\n\n            case value_t::discarded:\n            default:\n                break;\n        }\n    }\n\n  private:\n    //////////\n    // BSON //\n    //////////\n\n    /*!\n    @return The size of a BSON document entry header, including the id marker\n            and the entry name size (and its null-terminator).\n    */\n    static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j)\n    {\n        const auto it = name.find(static_cast<typename string_t::value_type>(0));\n        if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos))\n        {\n            JSON_THROW(out_of_range::create(409, concat(\"BSON key cannot contain code point U+0000 (at byte \", std::to_string(it), \")\"), &j));\n            static_cast<void>(j);\n        }\n\n        return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;\n    }\n\n    /*!\n    @brief Writes the given @a element_type and @a name to the output adapter\n    */\n    void write_bson_entry_header(const string_t& name,\n                                 const std::uint8_t element_type)\n    {\n        oa->write_character(to_char_type(element_type)); // boolean\n        oa->write_characters(\n            reinterpret_cast<const CharType*>(name.c_str()),\n            name.size() + 1u);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and boolean value @a value\n    */\n    void write_bson_boolean(const string_t& name,\n                            const bool value)\n    {\n        write_bson_entry_header(name, 0x08);\n        oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00));\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and double value @a value\n    */\n    void write_bson_double(const string_t& name,\n                           const double value)\n    {\n        write_bson_entry_header(name, 0x01);\n        write_number<double>(value, true);\n    }\n\n    /*!\n    @return The size of the BSON-encoded string in @a value\n    */\n    static std::size_t calc_bson_string_size(const string_t& value)\n    {\n        return sizeof(std::int32_t) + value.size() + 1ul;\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and string value @a value\n    */\n    void write_bson_string(const string_t& name,\n                           const string_t& value)\n    {\n        write_bson_entry_header(name, 0x02);\n\n        write_number<std::int32_t>(static_cast<std::int32_t>(value.size() + 1ul), true);\n        oa->write_characters(\n            reinterpret_cast<const CharType*>(value.c_str()),\n            value.size() + 1);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and null value\n    */\n    void write_bson_null(const string_t& name)\n    {\n        write_bson_entry_header(name, 0x0A);\n    }\n\n    /*!\n    @return The size of the BSON-encoded integer @a value\n    */\n    static std::size_t calc_bson_integer_size(const std::int64_t value)\n    {\n        return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()\n               ? sizeof(std::int32_t)\n               : sizeof(std::int64_t);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and integer @a value\n    */\n    void write_bson_integer(const string_t& name,\n                            const std::int64_t value)\n    {\n        if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)())\n        {\n            write_bson_entry_header(name, 0x10); // int32\n            write_number<std::int32_t>(static_cast<std::int32_t>(value), true);\n        }\n        else\n        {\n            write_bson_entry_header(name, 0x12); // int64\n            write_number<std::int64_t>(static_cast<std::int64_t>(value), true);\n        }\n    }\n\n    /*!\n    @return The size of the BSON-encoded unsigned integer in @a j\n    */\n    static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept\n    {\n        return (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n               ? sizeof(std::int32_t)\n               : sizeof(std::int64_t);\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and unsigned @a value\n    */\n    void write_bson_unsigned(const string_t& name,\n                             const BasicJsonType& j)\n    {\n        if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n        {\n            write_bson_entry_header(name, 0x10 /* int32 */);\n            write_number<std::int32_t>(static_cast<std::int32_t>(j.m_data.m_value.number_unsigned), true);\n        }\n        else if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n        {\n            write_bson_entry_header(name, 0x12 /* int64 */);\n            write_number<std::int64_t>(static_cast<std::int64_t>(j.m_data.m_value.number_unsigned), true);\n        }\n        else\n        {\n            JSON_THROW(out_of_range::create(407, concat(\"integer number \", std::to_string(j.m_data.m_value.number_unsigned), \" cannot be represented by BSON as it does not fit int64\"), &j));\n        }\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and object @a value\n    */\n    void write_bson_object_entry(const string_t& name,\n                                 const typename BasicJsonType::object_t& value)\n    {\n        write_bson_entry_header(name, 0x03); // object\n        write_bson_object(value);\n    }\n\n    /*!\n    @return The size of the BSON-encoded array @a value\n    */\n    static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value)\n    {\n        std::size_t array_index = 0ul;\n\n        const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast<std::size_t>(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el)\n        {\n            return result + calc_bson_element_size(std::to_string(array_index++), el);\n        });\n\n        return sizeof(std::int32_t) + embedded_document_size + 1ul;\n    }\n\n    /*!\n    @return The size of the BSON-encoded binary array @a value\n    */\n    static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value)\n    {\n        return sizeof(std::int32_t) + value.size() + 1ul;\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and array @a value\n    */\n    void write_bson_array(const string_t& name,\n                          const typename BasicJsonType::array_t& value)\n    {\n        write_bson_entry_header(name, 0x04); // array\n        write_number<std::int32_t>(static_cast<std::int32_t>(calc_bson_array_size(value)), true);\n\n        std::size_t array_index = 0ul;\n\n        for (const auto& el : value)\n        {\n            write_bson_element(std::to_string(array_index++), el);\n        }\n\n        oa->write_character(to_char_type(0x00));\n    }\n\n    /*!\n    @brief Writes a BSON element with key @a name and binary value @a value\n    */\n    void write_bson_binary(const string_t& name,\n                           const binary_t& value)\n    {\n        write_bson_entry_header(name, 0x05);\n\n        write_number<std::int32_t>(static_cast<std::int32_t>(value.size()), true);\n        write_number(value.has_subtype() ? static_cast<std::uint8_t>(value.subtype()) : static_cast<std::uint8_t>(0x00));\n\n        oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size());\n    }\n\n    /*!\n    @brief Calculates the size necessary to serialize the JSON value @a j with its @a name\n    @return The calculated size for the BSON document entry for @a j with the given @a name.\n    */\n    static std::size_t calc_bson_element_size(const string_t& name,\n            const BasicJsonType& j)\n    {\n        const auto header_size = calc_bson_entry_header_size(name, j);\n        switch (j.type())\n        {\n            case value_t::object:\n                return header_size + calc_bson_object_size(*j.m_data.m_value.object);\n\n            case value_t::array:\n                return header_size + calc_bson_array_size(*j.m_data.m_value.array);\n\n            case value_t::binary:\n                return header_size + calc_bson_binary_size(*j.m_data.m_value.binary);\n\n            case value_t::boolean:\n                return header_size + 1ul;\n\n            case value_t::number_float:\n                return header_size + 8ul;\n\n            case value_t::number_integer:\n                return header_size + calc_bson_integer_size(j.m_data.m_value.number_integer);\n\n            case value_t::number_unsigned:\n                return header_size + calc_bson_unsigned_size(j.m_data.m_value.number_unsigned);\n\n            case value_t::string:\n                return header_size + calc_bson_string_size(*j.m_data.m_value.string);\n\n            case value_t::null:\n                return header_size + 0ul;\n\n            // LCOV_EXCL_START\n            case value_t::discarded:\n            default:\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)\n                return 0ul;\n                // LCOV_EXCL_STOP\n        }\n    }\n\n    /*!\n    @brief Serializes the JSON value @a j to BSON and associates it with the\n           key @a name.\n    @param name The name to associate with the JSON entity @a j within the\n                current BSON document\n    */\n    void write_bson_element(const string_t& name,\n                            const BasicJsonType& j)\n    {\n        switch (j.type())\n        {\n            case value_t::object:\n                return write_bson_object_entry(name, *j.m_data.m_value.object);\n\n            case value_t::array:\n                return write_bson_array(name, *j.m_data.m_value.array);\n\n            case value_t::binary:\n                return write_bson_binary(name, *j.m_data.m_value.binary);\n\n            case value_t::boolean:\n                return write_bson_boolean(name, j.m_data.m_value.boolean);\n\n            case value_t::number_float:\n                return write_bson_double(name, j.m_data.m_value.number_float);\n\n            case value_t::number_integer:\n                return write_bson_integer(name, j.m_data.m_value.number_integer);\n\n            case value_t::number_unsigned:\n                return write_bson_unsigned(name, j);\n\n            case value_t::string:\n                return write_bson_string(name, *j.m_data.m_value.string);\n\n            case value_t::null:\n                return write_bson_null(name);\n\n            // LCOV_EXCL_START\n            case value_t::discarded:\n            default:\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)\n                return;\n                // LCOV_EXCL_STOP\n        }\n    }\n\n    /*!\n    @brief Calculates the size of the BSON serialization of the given\n           JSON-object @a j.\n    @param[in] value  JSON value to serialize\n    @pre       value.type() == value_t::object\n    */\n    static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)\n    {\n        const std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),\n                                          [](size_t result, const typename BasicJsonType::object_t::value_type & el)\n        {\n            return result += calc_bson_element_size(el.first, el.second);\n        });\n\n        return sizeof(std::int32_t) + document_size + 1ul;\n    }\n\n    /*!\n    @param[in] value  JSON value to serialize\n    @pre       value.type() == value_t::object\n    */\n    void write_bson_object(const typename BasicJsonType::object_t& value)\n    {\n        write_number<std::int32_t>(static_cast<std::int32_t>(calc_bson_object_size(value)), true);\n\n        for (const auto& el : value)\n        {\n            write_bson_element(el.first, el.second);\n        }\n\n        oa->write_character(to_char_type(0x00));\n    }\n\n    //////////\n    // CBOR //\n    //////////\n\n    static constexpr CharType get_cbor_float_prefix(float /*unused*/)\n    {\n        return to_char_type(0xFA);  // Single-Precision Float\n    }\n\n    static constexpr CharType get_cbor_float_prefix(double /*unused*/)\n    {\n        return to_char_type(0xFB);  // Double-Precision Float\n    }\n\n    /////////////\n    // MsgPack //\n    /////////////\n\n    static constexpr CharType get_msgpack_float_prefix(float /*unused*/)\n    {\n        return to_char_type(0xCA);  // float 32\n    }\n\n    static constexpr CharType get_msgpack_float_prefix(double /*unused*/)\n    {\n        return to_char_type(0xCB);  // float 64\n    }\n\n    ////////////\n    // UBJSON //\n    ////////////\n\n    // UBJSON: write number (floating point)\n    template<typename NumberType, typename std::enable_if<\n                 std::is_floating_point<NumberType>::value, int>::type = 0>\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix,\n                                         const bool use_bjdata)\n    {\n        if (add_prefix)\n        {\n            oa->write_character(get_ubjson_float_prefix(n));\n        }\n        write_number(n, use_bjdata);\n    }\n\n    // UBJSON: write number (unsigned integer)\n    template<typename NumberType, typename std::enable_if<\n                 std::is_unsigned<NumberType>::value, int>::type = 0>\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix,\n                                         const bool use_bjdata)\n    {\n        if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('i'));  // int8\n            }\n            write_number(static_cast<std::uint8_t>(n), use_bjdata);\n        }\n        else if (n <= (std::numeric_limits<std::uint8_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('U'));  // uint8\n            }\n            write_number(static_cast<std::uint8_t>(n), use_bjdata);\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('I'));  // int16\n            }\n            write_number(static_cast<std::int16_t>(n), use_bjdata);\n        }\n        else if (use_bjdata && n <= static_cast<uint64_t>((std::numeric_limits<uint16_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('u'));  // uint16 - bjdata only\n            }\n            write_number(static_cast<std::uint16_t>(n), use_bjdata);\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('l'));  // int32\n            }\n            write_number(static_cast<std::int32_t>(n), use_bjdata);\n        }\n        else if (use_bjdata && n <= static_cast<uint64_t>((std::numeric_limits<uint32_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('m'));  // uint32 - bjdata only\n            }\n            write_number(static_cast<std::uint32_t>(n), use_bjdata);\n        }\n        else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('L'));  // int64\n            }\n            write_number(static_cast<std::int64_t>(n), use_bjdata);\n        }\n        else if (use_bjdata && n <= (std::numeric_limits<uint64_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('M'));  // uint64 - bjdata only\n            }\n            write_number(static_cast<std::uint64_t>(n), use_bjdata);\n        }\n        else\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('H'));  // high-precision number\n            }\n\n            const auto number = BasicJsonType(n).dump();\n            write_number_with_ubjson_prefix(number.size(), true, use_bjdata);\n            for (std::size_t i = 0; i < number.size(); ++i)\n            {\n                oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));\n            }\n        }\n    }\n\n    // UBJSON: write number (signed integer)\n    template < typename NumberType, typename std::enable_if <\n                   std::is_signed<NumberType>::value&&\n                   !std::is_floating_point<NumberType>::value, int >::type = 0 >\n    void write_number_with_ubjson_prefix(const NumberType n,\n                                         const bool add_prefix,\n                                         const bool use_bjdata)\n    {\n        if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('i'));  // int8\n            }\n            write_number(static_cast<std::int8_t>(n), use_bjdata);\n        }\n        else if (static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::max)()))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('U'));  // uint8\n            }\n            write_number(static_cast<std::uint8_t>(n), use_bjdata);\n        }\n        else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('I'));  // int16\n            }\n            write_number(static_cast<std::int16_t>(n), use_bjdata);\n        }\n        else if (use_bjdata && (static_cast<std::int64_t>((std::numeric_limits<std::uint16_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint16_t>::max)())))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('u'));  // uint16 - bjdata only\n            }\n            write_number(static_cast<uint16_t>(n), use_bjdata);\n        }\n        else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('l'));  // int32\n            }\n            write_number(static_cast<std::int32_t>(n), use_bjdata);\n        }\n        else if (use_bjdata && (static_cast<std::int64_t>((std::numeric_limits<std::uint32_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint32_t>::max)())))\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('m'));  // uint32 - bjdata only\n            }\n            write_number(static_cast<uint32_t>(n), use_bjdata);\n        }\n        else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)())\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('L'));  // int64\n            }\n            write_number(static_cast<std::int64_t>(n), use_bjdata);\n        }\n        // LCOV_EXCL_START\n        else\n        {\n            if (add_prefix)\n            {\n                oa->write_character(to_char_type('H'));  // high-precision number\n            }\n\n            const auto number = BasicJsonType(n).dump();\n            write_number_with_ubjson_prefix(number.size(), true, use_bjdata);\n            for (std::size_t i = 0; i < number.size(); ++i)\n            {\n                oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));\n            }\n        }\n        // LCOV_EXCL_STOP\n    }\n\n    /*!\n    @brief determine the type prefix of container values\n    */\n    CharType ubjson_prefix(const BasicJsonType& j, const bool use_bjdata) const noexcept\n    {\n        switch (j.type())\n        {\n            case value_t::null:\n                return 'Z';\n\n            case value_t::boolean:\n                return j.m_data.m_value.boolean ? 'T' : 'F';\n\n            case value_t::number_integer:\n            {\n                if ((std::numeric_limits<std::int8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())\n                {\n                    return 'i';\n                }\n                if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())\n                {\n                    return 'U';\n                }\n                if ((std::numeric_limits<std::int16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())\n                {\n                    return 'I';\n                }\n                if (use_bjdata && ((std::numeric_limits<std::uint16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()))\n                {\n                    return 'u';\n                }\n                if ((std::numeric_limits<std::int32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())\n                {\n                    return 'l';\n                }\n                if (use_bjdata && ((std::numeric_limits<std::uint32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()))\n                {\n                    return 'm';\n                }\n                if ((std::numeric_limits<std::int64_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())\n                {\n                    return 'L';\n                }\n                // anything else is treated as high-precision number\n                return 'H'; // LCOV_EXCL_LINE\n            }\n\n            case value_t::number_unsigned:\n            {\n                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))\n                {\n                    return 'i';\n                }\n                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))\n                {\n                    return 'U';\n                }\n                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))\n                {\n                    return 'I';\n                }\n                if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint16_t>::max)()))\n                {\n                    return 'u';\n                }\n                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))\n                {\n                    return 'l';\n                }\n                if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint32_t>::max)()))\n                {\n                    return 'm';\n                }\n                if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))\n                {\n                    return 'L';\n                }\n                if (use_bjdata && j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())\n                {\n                    return 'M';\n                }\n                // anything else is treated as high-precision number\n                return 'H'; // LCOV_EXCL_LINE\n            }\n\n            case value_t::number_float:\n                return get_ubjson_float_prefix(j.m_data.m_value.number_float);\n\n            case value_t::string:\n                return 'S';\n\n            case value_t::array: // fallthrough\n            case value_t::binary:\n                return '[';\n\n            case value_t::object:\n                return '{';\n\n            case value_t::discarded:\n            default:  // discarded values\n                return 'N';\n        }\n    }\n\n    static constexpr CharType get_ubjson_float_prefix(float /*unused*/)\n    {\n        return 'd';  // float 32\n    }\n\n    static constexpr CharType get_ubjson_float_prefix(double /*unused*/)\n    {\n        return 'D';  // float 64\n    }\n\n    /*!\n    @return false if the object is successfully converted to a bjdata ndarray, true if the type or size is invalid\n    */\n    bool write_bjdata_ndarray(const typename BasicJsonType::object_t& value, const bool use_count, const bool use_type, const bjdata_version_t bjdata_version)\n    {\n        std::map<string_t, CharType> bjdtype = {{\"uint8\", 'U'},  {\"int8\", 'i'},  {\"uint16\", 'u'}, {\"int16\", 'I'},\n            {\"uint32\", 'm'}, {\"int32\", 'l'}, {\"uint64\", 'M'}, {\"int64\", 'L'}, {\"single\", 'd'}, {\"double\", 'D'},\n            {\"char\", 'C'}, {\"byte\", 'B'}\n        };\n\n        string_t key = \"_ArrayType_\";\n        auto it = bjdtype.find(static_cast<string_t>(value.at(key)));\n        if (it == bjdtype.end())\n        {\n            return true;\n        }\n        CharType dtype = it->second;\n\n        key = \"_ArraySize_\";\n        std::size_t len = (value.at(key).empty() ? 0 : 1);\n        for (const auto& el : value.at(key))\n        {\n            len *= static_cast<std::size_t>(el.m_data.m_value.number_unsigned);\n        }\n\n        key = \"_ArrayData_\";\n        if (value.at(key).size() != len)\n        {\n            return true;\n        }\n\n        oa->write_character('[');\n        oa->write_character('$');\n        oa->write_character(dtype);\n        oa->write_character('#');\n\n        key = \"_ArraySize_\";\n        write_ubjson(value.at(key), use_count, use_type, true,  true, bjdata_version);\n\n        key = \"_ArrayData_\";\n        if (dtype == 'U' || dtype == 'C' || dtype == 'B')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::uint8_t>(el.m_data.m_value.number_unsigned), true);\n            }\n        }\n        else if (dtype == 'i')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::int8_t>(el.m_data.m_value.number_integer), true);\n            }\n        }\n        else if (dtype == 'u')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::uint16_t>(el.m_data.m_value.number_unsigned), true);\n            }\n        }\n        else if (dtype == 'I')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::int16_t>(el.m_data.m_value.number_integer), true);\n            }\n        }\n        else if (dtype == 'm')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::uint32_t>(el.m_data.m_value.number_unsigned), true);\n            }\n        }\n        else if (dtype == 'l')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::int32_t>(el.m_data.m_value.number_integer), true);\n            }\n        }\n        else if (dtype == 'M')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::uint64_t>(el.m_data.m_value.number_unsigned), true);\n            }\n        }\n        else if (dtype == 'L')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<std::int64_t>(el.m_data.m_value.number_integer), true);\n            }\n        }\n        else if (dtype == 'd')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<float>(el.m_data.m_value.number_float), true);\n            }\n        }\n        else if (dtype == 'D')\n        {\n            for (const auto& el : value.at(key))\n            {\n                write_number(static_cast<double>(el.m_data.m_value.number_float), true);\n            }\n        }\n        return false;\n    }\n\n    ///////////////////////\n    // Utility functions //\n    ///////////////////////\n\n    /*\n    @brief write a number to output input\n    @param[in] n number of type @a NumberType\n    @param[in] OutputIsLittleEndian Set to true if output data is\n                                 required to be little endian\n    @tparam NumberType the type of the number\n\n    @note This function needs to respect the system's endianness, because bytes\n          in CBOR, MessagePack, and UBJSON are stored in network order (big\n          endian) and therefore need reordering on little endian systems.\n          On the other hand, BSON and BJData use little endian and should reorder\n          on big endian systems.\n    */\n    template<typename NumberType>\n    void write_number(const NumberType n, const bool OutputIsLittleEndian = false)\n    {\n        // step 1: write number to array of length NumberType\n        std::array<CharType, sizeof(NumberType)> vec{};\n        std::memcpy(vec.data(), &n, sizeof(NumberType));\n\n        // step 2: write array to output (with possible reordering)\n        if (is_little_endian != OutputIsLittleEndian)\n        {\n            // reverse byte order prior to conversion if necessary\n            std::reverse(vec.begin(), vec.end());\n        }\n\n        oa->write_characters(vec.data(), sizeof(NumberType));\n    }\n\n    void write_compact_float(const number_float_t n, detail::input_format_t format)\n    {\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n        if (static_cast<double>(n) >= static_cast<double>(std::numeric_limits<float>::lowest()) &&\n                static_cast<double>(n) <= static_cast<double>((std::numeric_limits<float>::max)()) &&\n                static_cast<double>(static_cast<float>(n)) == static_cast<double>(n))\n        {\n            oa->write_character(format == detail::input_format_t::cbor\n                                ? get_cbor_float_prefix(static_cast<float>(n))\n                                : get_msgpack_float_prefix(static_cast<float>(n)));\n            write_number(static_cast<float>(n));\n        }\n        else\n        {\n            oa->write_character(format == detail::input_format_t::cbor\n                                ? get_cbor_float_prefix(n)\n                                : get_msgpack_float_prefix(n));\n            write_number(n);\n        }\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n    }\n\n  public:\n    // The following to_char_type functions are implement the conversion\n    // between uint8_t and CharType. In case CharType is not unsigned,\n    // such a conversion is required to allow values greater than 128.\n    // See <https://github.com/nlohmann/json/issues/1286> for a discussion.\n    template < typename C = CharType,\n               enable_if_t < std::is_signed<C>::value && std::is_signed<char>::value > * = nullptr >\n    static constexpr CharType to_char_type(std::uint8_t x) noexcept\n    {\n        return *reinterpret_cast<char*>(&x);\n    }\n\n    template < typename C = CharType,\n               enable_if_t < std::is_signed<C>::value && std::is_unsigned<char>::value > * = nullptr >\n    static CharType to_char_type(std::uint8_t x) noexcept\n    {\n        static_assert(sizeof(std::uint8_t) == sizeof(CharType), \"size of CharType must be equal to std::uint8_t\");\n        static_assert(std::is_trivial<CharType>::value, \"CharType must be trivial\");\n        CharType result;\n        std::memcpy(&result, &x, sizeof(x));\n        return result;\n    }\n\n    template<typename C = CharType,\n             enable_if_t<std::is_unsigned<C>::value>* = nullptr>\n    static constexpr CharType to_char_type(std::uint8_t x) noexcept\n    {\n        return x;\n    }\n\n    template < typename InputCharType, typename C = CharType,\n               enable_if_t <\n                   std::is_signed<C>::value &&\n                   std::is_signed<char>::value &&\n                   std::is_same<char, typename std::remove_cv<InputCharType>::type>::value\n                   > * = nullptr >\n    static constexpr CharType to_char_type(InputCharType x) noexcept\n    {\n        return x;\n    }\n\n  private:\n    /// whether we can assume little endianness\n    const bool is_little_endian = little_endianness();\n\n    /// the output\n    output_adapter_t<CharType> oa = nullptr;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/output/output_adapters.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <algorithm> // copy\n#include <cstddef> // size_t\n#include <iterator> // back_inserter\n#include <memory> // shared_ptr, make_shared\n#include <string> // basic_string\n#include <vector> // vector\n\n#ifndef JSON_NO_IO\n    #include <ios>      // streamsize\n    #include <ostream>  // basic_ostream\n#endif  // JSON_NO_IO\n\n#include <nlohmann/detail/macro_scope.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/// abstract output adapter interface\ntemplate<typename CharType> struct output_adapter_protocol\n{\n    virtual void write_character(CharType c) = 0;\n    virtual void write_characters(const CharType* s, std::size_t length) = 0;\n    virtual ~output_adapter_protocol() = default;\n\n    output_adapter_protocol() = default;\n    output_adapter_protocol(const output_adapter_protocol&) = default;\n    output_adapter_protocol(output_adapter_protocol&&) noexcept = default;\n    output_adapter_protocol& operator=(const output_adapter_protocol&) = default;\n    output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default;\n};\n\n/// a type to simplify interfaces\ntemplate<typename CharType>\nusing output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;\n\n/// output adapter for byte vectors\ntemplate<typename CharType, typename AllocatorType = std::allocator<CharType>>\nclass output_vector_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_vector_adapter(std::vector<CharType, AllocatorType>& vec) noexcept\n        : v(vec)\n    {}\n\n    void write_character(CharType c) override\n    {\n        v.push_back(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        v.insert(v.end(), s, s + length);\n    }\n\n  private:\n    std::vector<CharType, AllocatorType>& v;\n};\n\n#ifndef JSON_NO_IO\n/// output adapter for output streams\ntemplate<typename CharType>\nclass output_stream_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept\n        : stream(s)\n    {}\n\n    void write_character(CharType c) override\n    {\n        stream.put(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        stream.write(s, static_cast<std::streamsize>(length));\n    }\n\n  private:\n    std::basic_ostream<CharType>& stream;\n};\n#endif  // JSON_NO_IO\n\n/// output adapter for basic_string\ntemplate<typename CharType, typename StringType = std::basic_string<CharType>>\nclass output_string_adapter : public output_adapter_protocol<CharType>\n{\n  public:\n    explicit output_string_adapter(StringType& s) noexcept\n        : str(s)\n    {}\n\n    void write_character(CharType c) override\n    {\n        str.push_back(c);\n    }\n\n    JSON_HEDLEY_NON_NULL(2)\n    void write_characters(const CharType* s, std::size_t length) override\n    {\n        str.append(s, length);\n    }\n\n  private:\n    StringType& str;\n};\n\ntemplate<typename CharType, typename StringType = std::basic_string<CharType>>\nclass output_adapter\n{\n  public:\n    template<typename AllocatorType = std::allocator<CharType>>\n    output_adapter(std::vector<CharType, AllocatorType>& vec)\n        : oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {}\n\n#ifndef JSON_NO_IO\n    output_adapter(std::basic_ostream<CharType>& s)\n        : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}\n#endif  // JSON_NO_IO\n\n    output_adapter(StringType& s)\n        : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {}\n\n    operator output_adapter_t<CharType>()\n    {\n        return oa;\n    }\n\n  private:\n    output_adapter_t<CharType> oa = nullptr;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/output/serializer.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2008 - 2009 Björn Hoehrmann <bjoern@hoehrmann.de>\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <algorithm> // reverse, remove, fill, find, none_of\n#include <array> // array\n#include <clocale> // localeconv, lconv\n#include <cmath> // labs, isfinite, isnan, signbit\n#include <cstddef> // size_t, ptrdiff_t\n#include <cstdint> // uint8_t\n#include <cstdio> // snprintf\n#include <limits> // numeric_limits\n#include <string> // string, char_traits\n#include <iomanip> // setfill, setw\n#include <type_traits> // is_same\n#include <utility> // move\n\n#include <nlohmann/detail/conversions/to_chars.hpp>\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/output/binary_writer.hpp>\n#include <nlohmann/detail/output/output_adapters.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n#include <nlohmann/detail/value_t.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n///////////////////\n// serialization //\n///////////////////\n\n/// how to treat decoding errors\nenum class error_handler_t\n{\n    strict,  ///< throw a type_error exception in case of invalid UTF-8\n    replace, ///< replace invalid UTF-8 sequences with U+FFFD\n    ignore   ///< ignore invalid UTF-8 sequences\n};\n\ntemplate<typename BasicJsonType>\nclass serializer\n{\n    using string_t = typename BasicJsonType::string_t;\n    using number_float_t = typename BasicJsonType::number_float_t;\n    using number_integer_t = typename BasicJsonType::number_integer_t;\n    using number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n    using binary_char_t = typename BasicJsonType::binary_t::value_type;\n    static constexpr std::uint8_t UTF8_ACCEPT = 0;\n    static constexpr std::uint8_t UTF8_REJECT = 1;\n\n  public:\n    /*!\n    @param[in] s  output stream to serialize to\n    @param[in] ichar  indentation character to use\n    @param[in] error_handler_  how to react on decoding errors\n    */\n    serializer(output_adapter_t<char> s, const char ichar,\n               error_handler_t error_handler_ = error_handler_t::strict)\n        : o(std::move(s))\n        , loc(std::localeconv())\n        , thousands_sep(loc->thousands_sep == nullptr ? '\\0' : std::char_traits<char>::to_char_type(* (loc->thousands_sep)))\n        , decimal_point(loc->decimal_point == nullptr ? '\\0' : std::char_traits<char>::to_char_type(* (loc->decimal_point)))\n        , indent_char(ichar)\n        , indent_string(512, indent_char)\n        , error_handler(error_handler_)\n    {}\n\n    // delete because of pointer members\n    serializer(const serializer&) = delete;\n    serializer& operator=(const serializer&) = delete;\n    serializer(serializer&&) = delete;\n    serializer& operator=(serializer&&) = delete;\n    ~serializer() = default;\n\n    /*!\n    @brief internal implementation of the serialization function\n\n    This function is called by the public member function dump and organizes\n    the serialization internally. The indentation level is propagated as\n    additional parameter. In case of arrays and objects, the function is\n    called recursively.\n\n    - strings and object keys are escaped using `escape_string()`\n    - integer numbers are converted implicitly via `operator<<`\n    - floating-point numbers are converted to a string using `\"%g\"` format\n    - binary values are serialized as objects containing the subtype and the\n      byte array\n\n    @param[in] val               value to serialize\n    @param[in] pretty_print      whether the output shall be pretty-printed\n    @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters\n    in the output are escaped with `\\uXXXX` sequences, and the result consists\n    of ASCII characters only.\n    @param[in] indent_step       the indent level\n    @param[in] current_indent    the current indent level (only used internally)\n    */\n    void dump(const BasicJsonType& val,\n              const bool pretty_print,\n              const bool ensure_ascii,\n              const unsigned int indent_step,\n              const unsigned int current_indent = 0)\n    {\n        switch (val.m_data.m_type)\n        {\n            case value_t::object:\n            {\n                if (val.m_data.m_value.object->empty())\n                {\n                    o->write_characters(\"{}\", 2);\n                    return;\n                }\n\n                if (pretty_print)\n                {\n                    o->write_characters(\"{\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    // first n-1 elements\n                    auto i = val.m_data.m_value.object->cbegin();\n                    for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)\n                    {\n                        o->write_characters(indent_string.c_str(), new_indent);\n                        o->write_character('\\\"');\n                        dump_escaped(i->first, ensure_ascii);\n                        o->write_characters(\"\\\": \", 3);\n                        dump(i->second, true, ensure_ascii, indent_step, new_indent);\n                        o->write_characters(\",\\n\", 2);\n                    }\n\n                    // last element\n                    JSON_ASSERT(i != val.m_data.m_value.object->cend());\n                    JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());\n                    o->write_characters(indent_string.c_str(), new_indent);\n                    o->write_character('\\\"');\n                    dump_escaped(i->first, ensure_ascii);\n                    o->write_characters(\"\\\": \", 3);\n                    dump(i->second, true, ensure_ascii, indent_step, new_indent);\n\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character('}');\n                }\n                else\n                {\n                    o->write_character('{');\n\n                    // first n-1 elements\n                    auto i = val.m_data.m_value.object->cbegin();\n                    for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i)\n                    {\n                        o->write_character('\\\"');\n                        dump_escaped(i->first, ensure_ascii);\n                        o->write_characters(\"\\\":\", 2);\n                        dump(i->second, false, ensure_ascii, indent_step, current_indent);\n                        o->write_character(',');\n                    }\n\n                    // last element\n                    JSON_ASSERT(i != val.m_data.m_value.object->cend());\n                    JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());\n                    o->write_character('\\\"');\n                    dump_escaped(i->first, ensure_ascii);\n                    o->write_characters(\"\\\":\", 2);\n                    dump(i->second, false, ensure_ascii, indent_step, current_indent);\n\n                    o->write_character('}');\n                }\n\n                return;\n            }\n\n            case value_t::array:\n            {\n                if (val.m_data.m_value.array->empty())\n                {\n                    o->write_characters(\"[]\", 2);\n                    return;\n                }\n\n                if (pretty_print)\n                {\n                    o->write_characters(\"[\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    // first n-1 elements\n                    for (auto i = val.m_data.m_value.array->cbegin();\n                            i != val.m_data.m_value.array->cend() - 1; ++i)\n                    {\n                        o->write_characters(indent_string.c_str(), new_indent);\n                        dump(*i, true, ensure_ascii, indent_step, new_indent);\n                        o->write_characters(\",\\n\", 2);\n                    }\n\n                    // last element\n                    JSON_ASSERT(!val.m_data.m_value.array->empty());\n                    o->write_characters(indent_string.c_str(), new_indent);\n                    dump(val.m_data.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);\n\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character(']');\n                }\n                else\n                {\n                    o->write_character('[');\n\n                    // first n-1 elements\n                    for (auto i = val.m_data.m_value.array->cbegin();\n                            i != val.m_data.m_value.array->cend() - 1; ++i)\n                    {\n                        dump(*i, false, ensure_ascii, indent_step, current_indent);\n                        o->write_character(',');\n                    }\n\n                    // last element\n                    JSON_ASSERT(!val.m_data.m_value.array->empty());\n                    dump(val.m_data.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);\n\n                    o->write_character(']');\n                }\n\n                return;\n            }\n\n            case value_t::string:\n            {\n                o->write_character('\\\"');\n                dump_escaped(*val.m_data.m_value.string, ensure_ascii);\n                o->write_character('\\\"');\n                return;\n            }\n\n            case value_t::binary:\n            {\n                if (pretty_print)\n                {\n                    o->write_characters(\"{\\n\", 2);\n\n                    // variable to hold indentation for recursive calls\n                    const auto new_indent = current_indent + indent_step;\n                    if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))\n                    {\n                        indent_string.resize(indent_string.size() * 2, ' ');\n                    }\n\n                    o->write_characters(indent_string.c_str(), new_indent);\n\n                    o->write_characters(\"\\\"bytes\\\": [\", 10);\n\n                    if (!val.m_data.m_value.binary->empty())\n                    {\n                        for (auto i = val.m_data.m_value.binary->cbegin();\n                                i != val.m_data.m_value.binary->cend() - 1; ++i)\n                        {\n                            dump_integer(*i);\n                            o->write_characters(\", \", 2);\n                        }\n                        dump_integer(val.m_data.m_value.binary->back());\n                    }\n\n                    o->write_characters(\"],\\n\", 3);\n                    o->write_characters(indent_string.c_str(), new_indent);\n\n                    o->write_characters(\"\\\"subtype\\\": \", 11);\n                    if (val.m_data.m_value.binary->has_subtype())\n                    {\n                        dump_integer(val.m_data.m_value.binary->subtype());\n                    }\n                    else\n                    {\n                        o->write_characters(\"null\", 4);\n                    }\n                    o->write_character('\\n');\n                    o->write_characters(indent_string.c_str(), current_indent);\n                    o->write_character('}');\n                }\n                else\n                {\n                    o->write_characters(\"{\\\"bytes\\\":[\", 10);\n\n                    if (!val.m_data.m_value.binary->empty())\n                    {\n                        for (auto i = val.m_data.m_value.binary->cbegin();\n                                i != val.m_data.m_value.binary->cend() - 1; ++i)\n                        {\n                            dump_integer(*i);\n                            o->write_character(',');\n                        }\n                        dump_integer(val.m_data.m_value.binary->back());\n                    }\n\n                    o->write_characters(\"],\\\"subtype\\\":\", 12);\n                    if (val.m_data.m_value.binary->has_subtype())\n                    {\n                        dump_integer(val.m_data.m_value.binary->subtype());\n                        o->write_character('}');\n                    }\n                    else\n                    {\n                        o->write_characters(\"null}\", 5);\n                    }\n                }\n                return;\n            }\n\n            case value_t::boolean:\n            {\n                if (val.m_data.m_value.boolean)\n                {\n                    o->write_characters(\"true\", 4);\n                }\n                else\n                {\n                    o->write_characters(\"false\", 5);\n                }\n                return;\n            }\n\n            case value_t::number_integer:\n            {\n                dump_integer(val.m_data.m_value.number_integer);\n                return;\n            }\n\n            case value_t::number_unsigned:\n            {\n                dump_integer(val.m_data.m_value.number_unsigned);\n                return;\n            }\n\n            case value_t::number_float:\n            {\n                dump_float(val.m_data.m_value.number_float);\n                return;\n            }\n\n            case value_t::discarded:\n            {\n                o->write_characters(\"<discarded>\", 11);\n                return;\n            }\n\n            case value_t::null:\n            {\n                o->write_characters(\"null\", 4);\n                return;\n            }\n\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n        }\n    }\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    /*!\n    @brief dump escaped string\n\n    Escape a string by replacing certain special characters by a sequence of an\n    escape character (backslash) and another character and other control\n    characters by a sequence of \"\\u\" followed by a four-digit hex\n    representation. The escaped string is written to output stream @a o.\n\n    @param[in] s  the string to escape\n    @param[in] ensure_ascii  whether to escape non-ASCII characters with\n                             \\uXXXX sequences\n\n    @complexity Linear in the length of string @a s.\n    */\n    void dump_escaped(const string_t& s, const bool ensure_ascii)\n    {\n        std::uint32_t codepoint{};\n        std::uint8_t state = UTF8_ACCEPT;\n        std::size_t bytes = 0;  // number of bytes written to string_buffer\n\n        // number of bytes written at the point of the last valid byte\n        std::size_t bytes_after_last_accept = 0;\n        std::size_t undumped_chars = 0;\n\n        for (std::size_t i = 0; i < s.size(); ++i)\n        {\n            const auto byte = static_cast<std::uint8_t>(s[i]);\n\n            switch (decode(state, codepoint, byte))\n            {\n                case UTF8_ACCEPT:  // decode found a new code point\n                {\n                    switch (codepoint)\n                    {\n                        case 0x08: // backspace\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'b';\n                            break;\n                        }\n\n                        case 0x09: // horizontal tab\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 't';\n                            break;\n                        }\n\n                        case 0x0A: // newline\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'n';\n                            break;\n                        }\n\n                        case 0x0C: // formfeed\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'f';\n                            break;\n                        }\n\n                        case 0x0D: // carriage return\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = 'r';\n                            break;\n                        }\n\n                        case 0x22: // quotation mark\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = '\\\"';\n                            break;\n                        }\n\n                        case 0x5C: // reverse solidus\n                        {\n                            string_buffer[bytes++] = '\\\\';\n                            string_buffer[bytes++] = '\\\\';\n                            break;\n                        }\n\n                        default:\n                        {\n                            // escape control characters (0x00..0x1F) or, if\n                            // ensure_ascii parameter is used, non-ASCII characters\n                            if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F)))\n                            {\n                                if (codepoint <= 0xFFFF)\n                                {\n                                    // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n                                    static_cast<void>((std::snprintf)(string_buffer.data() + bytes, 7, \"\\\\u%04x\",\n                                                                      static_cast<std::uint16_t>(codepoint)));\n                                    bytes += 6;\n                                }\n                                else\n                                {\n                                    // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n                                    static_cast<void>((std::snprintf)(string_buffer.data() + bytes, 13, \"\\\\u%04x\\\\u%04x\",\n                                                                      static_cast<std::uint16_t>(0xD7C0u + (codepoint >> 10u)),\n                                                                      static_cast<std::uint16_t>(0xDC00u + (codepoint & 0x3FFu))));\n                                    bytes += 12;\n                                }\n                            }\n                            else\n                            {\n                                // copy byte to buffer (all previous bytes\n                                // been copied have in default case above)\n                                string_buffer[bytes++] = s[i];\n                            }\n                            break;\n                        }\n                    }\n\n                    // write buffer and reset index; there must be 13 bytes\n                    // left, as this is the maximal number of bytes to be\n                    // written (\"\\uxxxx\\uxxxx\\0\") for one code point\n                    if (string_buffer.size() - bytes < 13)\n                    {\n                        o->write_characters(string_buffer.data(), bytes);\n                        bytes = 0;\n                    }\n\n                    // remember the byte position of this accept\n                    bytes_after_last_accept = bytes;\n                    undumped_chars = 0;\n                    break;\n                }\n\n                case UTF8_REJECT:  // decode found invalid UTF-8 byte\n                {\n                    switch (error_handler)\n                    {\n                        case error_handler_t::strict:\n                        {\n                            JSON_THROW(type_error::create(316, concat(\"invalid UTF-8 byte at index \", std::to_string(i), \": 0x\", hex_bytes(byte | 0)), nullptr));\n                        }\n\n                        case error_handler_t::ignore:\n                        case error_handler_t::replace:\n                        {\n                            // in case we saw this character the first time, we\n                            // would like to read it again, because the byte\n                            // may be OK for itself, but just not OK for the\n                            // previous sequence\n                            if (undumped_chars > 0)\n                            {\n                                --i;\n                            }\n\n                            // reset length buffer to the last accepted index;\n                            // thus removing/ignoring the invalid characters\n                            bytes = bytes_after_last_accept;\n\n                            if (error_handler == error_handler_t::replace)\n                            {\n                                // add a replacement character\n                                if (ensure_ascii)\n                                {\n                                    string_buffer[bytes++] = '\\\\';\n                                    string_buffer[bytes++] = 'u';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'f';\n                                    string_buffer[bytes++] = 'd';\n                                }\n                                else\n                                {\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xEF');\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xBF');\n                                    string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\\xBD');\n                                }\n\n                                // write buffer and reset index; there must be 13 bytes\n                                // left, as this is the maximal number of bytes to be\n                                // written (\"\\uxxxx\\uxxxx\\0\") for one code point\n                                if (string_buffer.size() - bytes < 13)\n                                {\n                                    o->write_characters(string_buffer.data(), bytes);\n                                    bytes = 0;\n                                }\n\n                                bytes_after_last_accept = bytes;\n                            }\n\n                            undumped_chars = 0;\n\n                            // continue processing the string\n                            state = UTF8_ACCEPT;\n                            break;\n                        }\n\n                        default:            // LCOV_EXCL_LINE\n                            JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n                    }\n                    break;\n                }\n\n                default:  // decode found yet incomplete multi-byte code point\n                {\n                    if (!ensure_ascii)\n                    {\n                        // code point will not be escaped - copy byte to buffer\n                        string_buffer[bytes++] = s[i];\n                    }\n                    ++undumped_chars;\n                    break;\n                }\n            }\n        }\n\n        // we finished processing the string\n        if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT))\n        {\n            // write buffer\n            if (bytes > 0)\n            {\n                o->write_characters(string_buffer.data(), bytes);\n            }\n        }\n        else\n        {\n            // we finish reading, but do not accept: string was incomplete\n            switch (error_handler)\n            {\n                case error_handler_t::strict:\n                {\n                    JSON_THROW(type_error::create(316, concat(\"incomplete UTF-8 string; last byte: 0x\", hex_bytes(static_cast<std::uint8_t>(s.back() | 0))), nullptr));\n                }\n\n                case error_handler_t::ignore:\n                {\n                    // write all accepted bytes\n                    o->write_characters(string_buffer.data(), bytes_after_last_accept);\n                    break;\n                }\n\n                case error_handler_t::replace:\n                {\n                    // write all accepted bytes\n                    o->write_characters(string_buffer.data(), bytes_after_last_accept);\n                    // add a replacement character\n                    if (ensure_ascii)\n                    {\n                        o->write_characters(\"\\\\ufffd\", 6);\n                    }\n                    else\n                    {\n                        o->write_characters(\"\\xEF\\xBF\\xBD\", 3);\n                    }\n                    break;\n                }\n\n                default:            // LCOV_EXCL_LINE\n                    JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n            }\n        }\n    }\n\n  private:\n    /*!\n    @brief count digits\n\n    Count the number of decimal (base 10) digits for an input unsigned integer.\n\n    @param[in] x  unsigned integer number to count its digits\n    @return    number of decimal digits\n    */\n    unsigned int count_digits(number_unsigned_t x) noexcept\n    {\n        unsigned int n_digits = 1;\n        for (;;)\n        {\n            if (x < 10)\n            {\n                return n_digits;\n            }\n            if (x < 100)\n            {\n                return n_digits + 1;\n            }\n            if (x < 1000)\n            {\n                return n_digits + 2;\n            }\n            if (x < 10000)\n            {\n                return n_digits + 3;\n            }\n            x = x / 10000u;\n            n_digits += 4;\n        }\n    }\n\n    /*!\n     * @brief convert a byte to a uppercase hex representation\n     * @param[in] byte byte to represent\n     * @return representation (\"00\"..\"FF\")\n     */\n    static std::string hex_bytes(std::uint8_t byte)\n    {\n        std::string result = \"FF\";\n        constexpr const char* nibble_to_hex = \"0123456789ABCDEF\";\n        result[0] = nibble_to_hex[byte / 16];\n        result[1] = nibble_to_hex[byte % 16];\n        return result;\n    }\n\n    // templates to avoid warnings about useless casts\n    template <typename NumberType, enable_if_t<std::is_signed<NumberType>::value, int> = 0>\n    bool is_negative_number(NumberType x)\n    {\n        return x < 0;\n    }\n\n    template < typename NumberType, enable_if_t <std::is_unsigned<NumberType>::value, int > = 0 >\n    bool is_negative_number(NumberType /*unused*/)\n    {\n        return false;\n    }\n\n    /*!\n    @brief dump an integer\n\n    Dump a given integer to output stream @a o. Works internally with\n    @a number_buffer.\n\n    @param[in] x  integer number (signed or unsigned) to dump\n    @tparam NumberType either @a number_integer_t or @a number_unsigned_t\n    */\n    template < typename NumberType, detail::enable_if_t <\n                   std::is_integral<NumberType>::value ||\n                   std::is_same<NumberType, number_unsigned_t>::value ||\n                   std::is_same<NumberType, number_integer_t>::value ||\n                   std::is_same<NumberType, binary_char_t>::value,\n                   int > = 0 >\n    void dump_integer(NumberType x)\n    {\n        static constexpr std::array<std::array<char, 2>, 100> digits_to_99\n        {\n            {\n                {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}},\n                {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}},\n                {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}},\n                {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}},\n                {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}},\n                {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}},\n                {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}},\n                {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}},\n                {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}},\n                {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}},\n            }\n        };\n\n        // special case for \"0\"\n        if (x == 0)\n        {\n            o->write_character('0');\n            return;\n        }\n\n        // use a pointer to fill the buffer\n        auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n\n        number_unsigned_t abs_value;\n\n        unsigned int n_chars{};\n\n        if (is_negative_number(x))\n        {\n            *buffer_ptr = '-';\n            abs_value = remove_sign(static_cast<number_integer_t>(x));\n\n            // account one more byte for the minus sign\n            n_chars = 1 + count_digits(abs_value);\n        }\n        else\n        {\n            abs_value = static_cast<number_unsigned_t>(x);\n            n_chars = count_digits(abs_value);\n        }\n\n        // spare 1 byte for '\\0'\n        JSON_ASSERT(n_chars < number_buffer.size() - 1);\n\n        // jump to the end to generate the string from backward,\n        // so we later avoid reversing the result\n        buffer_ptr += n_chars;\n\n        // Fast int2ascii implementation inspired by \"Fastware\" talk by Andrei Alexandrescu\n        // See: https://www.youtube.com/watch?v=o4-CwDo2zpg\n        while (abs_value >= 100)\n        {\n            const auto digits_index = static_cast<unsigned>((abs_value % 100));\n            abs_value /= 100;\n            *(--buffer_ptr) = digits_to_99[digits_index][1];\n            *(--buffer_ptr) = digits_to_99[digits_index][0];\n        }\n\n        if (abs_value >= 10)\n        {\n            const auto digits_index = static_cast<unsigned>(abs_value);\n            *(--buffer_ptr) = digits_to_99[digits_index][1];\n            *(--buffer_ptr) = digits_to_99[digits_index][0];\n        }\n        else\n        {\n            *(--buffer_ptr) = static_cast<char>('0' + abs_value);\n        }\n\n        o->write_characters(number_buffer.data(), n_chars);\n    }\n\n    /*!\n    @brief dump a floating-point number\n\n    Dump a given floating-point number to output stream @a o. Works internally\n    with @a number_buffer.\n\n    @param[in] x  floating-point number to dump\n    */\n    void dump_float(number_float_t x)\n    {\n        // NaN / inf\n        if (!std::isfinite(x))\n        {\n            o->write_characters(\"null\", 4);\n            return;\n        }\n\n        // If number_float_t is an IEEE-754 single or double precision number,\n        // use the Grisu2 algorithm to produce short numbers which are\n        // guaranteed to round-trip, using strtof and strtod, resp.\n        //\n        // NB: The test below works if <long double> == <double>.\n        static constexpr bool is_ieee_single_or_double\n            = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) ||\n              (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024);\n\n        dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());\n    }\n\n    void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/)\n    {\n        auto* begin = number_buffer.data();\n        auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x);\n\n        o->write_characters(begin, static_cast<size_t>(end - begin));\n    }\n\n    void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/)\n    {\n        // get number of digits for a float -> text -> float round-trip\n        static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10;\n\n        // the actual conversion\n        // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg)\n        std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), \"%.*g\", d, x);\n\n        // negative value indicates an error\n        JSON_ASSERT(len > 0);\n        // check if buffer was large enough\n        JSON_ASSERT(static_cast<std::size_t>(len) < number_buffer.size());\n\n        // erase thousands separator\n        if (thousands_sep != '\\0')\n        {\n            // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081\n            const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep);\n            std::fill(end, number_buffer.end(), '\\0');\n            JSON_ASSERT((end - number_buffer.begin()) <= len);\n            len = (end - number_buffer.begin());\n        }\n\n        // convert decimal point to '.'\n        if (decimal_point != '\\0' && decimal_point != '.')\n        {\n            // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081\n            const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point);\n            if (dec_pos != number_buffer.end())\n            {\n                *dec_pos = '.';\n            }\n        }\n\n        o->write_characters(number_buffer.data(), static_cast<std::size_t>(len));\n\n        // determine if we need to append \".0\"\n        const bool value_is_int_like =\n            std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1,\n                         [](char c)\n        {\n            return c == '.' || c == 'e';\n        });\n\n        if (value_is_int_like)\n        {\n            o->write_characters(\".0\", 2);\n        }\n    }\n\n    /*!\n    @brief check whether a string is UTF-8 encoded\n\n    The function checks each byte of a string whether it is UTF-8 encoded. The\n    result of the check is stored in the @a state parameter. The function must\n    be called initially with state 0 (accept). State 1 means the string must\n    be rejected, because the current byte is not allowed. If the string is\n    completely processed, but the state is non-zero, the string ended\n    prematurely; that is, the last byte indicated more bytes should have\n    followed.\n\n    @param[in,out] state  the state of the decoding\n    @param[in,out] codep  codepoint (valid only if resulting state is UTF8_ACCEPT)\n    @param[in] byte       next byte to decode\n    @return               new state\n\n    @note The function has been edited: a std::array is used.\n\n    @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>\n    @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/\n    */\n    static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept\n    {\n        static const std::array<std::uint8_t, 400> utf8d =\n        {\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, // 00..1F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F\n                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F\n                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F\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, // A0..BF\n                8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF\n                0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF\n                0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF\n                0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0\n                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2\n                1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4\n                1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6\n                1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8\n            }\n        };\n\n        JSON_ASSERT(byte < utf8d.size());\n        const std::uint8_t type = utf8d[byte];\n\n        codep = (state != UTF8_ACCEPT)\n                ? (byte & 0x3fu) | (codep << 6u)\n                : (0xFFu >> type) & (byte);\n\n        const std::size_t index = 256u + (static_cast<size_t>(state) * 16u) + static_cast<size_t>(type);\n        JSON_ASSERT(index < utf8d.size());\n        state = utf8d[index];\n        return state;\n    }\n\n    /*\n     * Overload to make the compiler happy while it is instantiating\n     * dump_integer for number_unsigned_t.\n     * Must never be called.\n     */\n    number_unsigned_t remove_sign(number_unsigned_t x)\n    {\n        JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n        return x; // LCOV_EXCL_LINE\n    }\n\n    /*\n     * Helper function for dump_integer\n     *\n     * This function takes a negative signed integer and returns its absolute\n     * value as unsigned integer. The plus/minus shuffling is necessary as we can\n     * not directly remove the sign of an arbitrary signed integer as the\n     * absolute values of INT_MIN and INT_MAX are usually not the same. See\n     * #1708 for details.\n     */\n    number_unsigned_t remove_sign(number_integer_t x) noexcept\n    {\n        JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)()); // NOLINT(misc-redundant-expression)\n        return static_cast<number_unsigned_t>(-(x + 1)) + 1;\n    }\n\n  private:\n    /// the output of the serializer\n    output_adapter_t<char> o = nullptr;\n\n    /// a (hopefully) large enough character buffer\n    std::array<char, 64> number_buffer{{}};\n\n    /// the locale\n    const std::lconv* loc = nullptr;\n    /// the locale's thousand separator character\n    const char thousands_sep = '\\0';\n    /// the locale's decimal point character\n    const char decimal_point = '\\0';\n\n    /// string buffer\n    std::array<char, 512> string_buffer{{}};\n\n    /// the indentation character\n    const char indent_char;\n    /// the indentation string\n    string_t indent_string;\n\n    /// error_handler how to react on decoding errors\n    const error_handler_t error_handler;\n};\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/string_concat.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstring> // strlen\n#include <string> // string\n#include <utility> // forward\n\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/detected.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ninline std::size_t concat_length()\n{\n    return 0;\n}\n\ntemplate<typename... Args>\ninline std::size_t concat_length(const char* cstr, const Args& ... rest);\n\ntemplate<typename StringType, typename... Args>\ninline std::size_t concat_length(const StringType& str, const Args& ... rest);\n\ntemplate<typename... Args>\ninline std::size_t concat_length(const char /*c*/, const Args& ... rest)\n{\n    return 1 + concat_length(rest...);\n}\n\ntemplate<typename... Args>\ninline std::size_t concat_length(const char* cstr, const Args& ... rest)\n{\n    // cppcheck-suppress ignoredReturnValue\n    return ::strlen(cstr) + concat_length(rest...);\n}\n\ntemplate<typename StringType, typename... Args>\ninline std::size_t concat_length(const StringType& str, const Args& ... rest)\n{\n    return str.size() + concat_length(rest...);\n}\n\ntemplate<typename OutStringType>\ninline void concat_into(OutStringType& /*out*/)\n{}\n\ntemplate<typename StringType, typename Arg>\nusing string_can_append = decltype(std::declval<StringType&>().append(std::declval < Arg && > ()));\n\ntemplate<typename StringType, typename Arg>\nusing detect_string_can_append = is_detected<string_can_append, StringType, Arg>;\n\ntemplate<typename StringType, typename Arg>\nusing string_can_append_op = decltype(std::declval<StringType&>() += std::declval < Arg && > ());\n\ntemplate<typename StringType, typename Arg>\nusing detect_string_can_append_op = is_detected<string_can_append_op, StringType, Arg>;\n\ntemplate<typename StringType, typename Arg>\nusing string_can_append_iter = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().begin(), std::declval<const Arg&>().end()));\n\ntemplate<typename StringType, typename Arg>\nusing detect_string_can_append_iter = is_detected<string_can_append_iter, StringType, Arg>;\n\ntemplate<typename StringType, typename Arg>\nusing string_can_append_data = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().data(), std::declval<const Arg&>().size()));\n\ntemplate<typename StringType, typename Arg>\nusing detect_string_can_append_data = is_detected<string_can_append_data, StringType, Arg>;\n\ntemplate < typename OutStringType, typename Arg, typename... Args,\n           enable_if_t < !detect_string_can_append<OutStringType, Arg>::value\n                         && detect_string_can_append_op<OutStringType, Arg>::value, int > = 0 >\ninline void concat_into(OutStringType& out, Arg && arg, Args && ... rest);\n\ntemplate < typename OutStringType, typename Arg, typename... Args,\n           enable_if_t < !detect_string_can_append<OutStringType, Arg>::value\n                         && !detect_string_can_append_op<OutStringType, Arg>::value\n                         && detect_string_can_append_iter<OutStringType, Arg>::value, int > = 0 >\ninline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest);\n\ntemplate < typename OutStringType, typename Arg, typename... Args,\n           enable_if_t < !detect_string_can_append<OutStringType, Arg>::value\n                         && !detect_string_can_append_op<OutStringType, Arg>::value\n                         && !detect_string_can_append_iter<OutStringType, Arg>::value\n                         && detect_string_can_append_data<OutStringType, Arg>::value, int > = 0 >\ninline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest);\n\ntemplate<typename OutStringType, typename Arg, typename... Args,\n         enable_if_t<detect_string_can_append<OutStringType, Arg>::value, int> = 0>\ninline void concat_into(OutStringType& out, Arg && arg, Args && ... rest)\n{\n    out.append(std::forward<Arg>(arg));\n    concat_into(out, std::forward<Args>(rest)...);\n}\n\ntemplate < typename OutStringType, typename Arg, typename... Args,\n           enable_if_t < !detect_string_can_append<OutStringType, Arg>::value\n                         && detect_string_can_append_op<OutStringType, Arg>::value, int > >\ninline void concat_into(OutStringType& out, Arg&& arg, Args&& ... rest)\n{\n    out += std::forward<Arg>(arg);\n    concat_into(out, std::forward<Args>(rest)...);\n}\n\ntemplate < typename OutStringType, typename Arg, typename... Args,\n           enable_if_t < !detect_string_can_append<OutStringType, Arg>::value\n                         && !detect_string_can_append_op<OutStringType, Arg>::value\n                         && detect_string_can_append_iter<OutStringType, Arg>::value, int > >\ninline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest)\n{\n    out.append(arg.begin(), arg.end());\n    concat_into(out, std::forward<Args>(rest)...);\n}\n\ntemplate < typename OutStringType, typename Arg, typename... Args,\n           enable_if_t < !detect_string_can_append<OutStringType, Arg>::value\n                         && !detect_string_can_append_op<OutStringType, Arg>::value\n                         && !detect_string_can_append_iter<OutStringType, Arg>::value\n                         && detect_string_can_append_data<OutStringType, Arg>::value, int > >\ninline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest)\n{\n    out.append(arg.data(), arg.size());\n    concat_into(out, std::forward<Args>(rest)...);\n}\n\ntemplate<typename OutStringType = std::string, typename... Args>\ninline OutStringType concat(Args && ... args)\n{\n    OutStringType str;\n    str.reserve(concat_length(args...));\n    concat_into(str, std::forward<Args>(args)...);\n    return str;\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/string_escape.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n/*!\n@brief replace all occurrences of a substring by another string\n\n@param[in,out] s  the string to manipulate; changed so that all\n               occurrences of @a f are replaced with @a t\n@param[in]     f  the substring to replace with @a t\n@param[in]     t  the string to replace @a f\n\n@pre The search string @a f must not be empty. **This precondition is\nenforced with an assertion.**\n\n@since version 2.0.0\n*/\ntemplate<typename StringType>\ninline void replace_substring(StringType& s, const StringType& f,\n                              const StringType& t)\n{\n    JSON_ASSERT(!f.empty());\n    for (auto pos = s.find(f);                // find first occurrence of f\n            pos != StringType::npos;          // make sure f was found\n            s.replace(pos, f.size(), t),      // replace with t, and\n            pos = s.find(f, pos + t.size()))  // find next occurrence of f\n    {}\n}\n\n/*!\n * @brief string escaping as described in RFC 6901 (Sect. 4)\n * @param[in] s string to escape\n * @return    escaped string\n *\n * Note the order of escaping \"~\" to \"~0\" and \"/\" to \"~1\" is important.\n */\ntemplate<typename StringType>\ninline StringType escape(StringType s)\n{\n    replace_substring(s, StringType{\"~\"}, StringType{\"~0\"});\n    replace_substring(s, StringType{\"/\"}, StringType{\"~1\"});\n    return s;\n}\n\n/*!\n * @brief string unescaping as described in RFC 6901 (Sect. 4)\n * @param[in] s string to unescape\n * @return    unescaped string\n *\n * Note the order of escaping \"~1\" to \"/\" and \"~0\" to \"~\" is important.\n */\ntemplate<typename StringType>\nstatic void unescape(StringType& s)\n{\n    replace_substring(s, StringType{\"~1\"}, StringType{\"/\"});\n    replace_substring(s, StringType{\"~0\"}, StringType{\"~\"});\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/string_utils.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <cstddef> // size_t\n#include <string> // string, to_string\n\n#include <nlohmann/detail/abi_macros.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\ntemplate<typename StringType>\nvoid int_to_string(StringType& target, std::size_t value)\n{\n    // For ADL\n    using std::to_string;\n    target = to_string(value);\n}\n\ntemplate<typename StringType>\nStringType to_string(std::size_t value)\n{\n    StringType result;\n    int_to_string(result, value);\n    return result;\n}\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/detail/value_t.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <array> // array\n#include <cstddef> // size_t\n#include <cstdint> // uint8_t\n#include <string> // string\n\n#include <nlohmann/detail/macro_scope.hpp>\n#if JSON_HAS_THREE_WAY_COMPARISON\n    #include <compare> // partial_ordering\n#endif\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\nnamespace detail\n{\n\n///////////////////////////\n// JSON type enumeration //\n///////////////////////////\n\n/*!\n@brief the JSON type enumeration\n\nThis enumeration collects the different JSON types. It is internally used to\ndistinguish the stored values, and the functions @ref basic_json::is_null(),\n@ref basic_json::is_object(), @ref basic_json::is_array(),\n@ref basic_json::is_string(), @ref basic_json::is_boolean(),\n@ref basic_json::is_number() (with @ref basic_json::is_number_integer(),\n@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()),\n@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and\n@ref basic_json::is_structured() rely on it.\n\n@note There are three enumeration entries (number_integer, number_unsigned, and\nnumber_float), because the library distinguishes these three types for numbers:\n@ref basic_json::number_unsigned_t is used for unsigned integers,\n@ref basic_json::number_integer_t is used for signed integers, and\n@ref basic_json::number_float_t is used for floating-point numbers or to\napproximate integers which do not fit in the limits of their respective type.\n\n@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON\nvalue with the default value for a given type\n\n@since version 1.0.0\n*/\nenum class value_t : std::uint8_t\n{\n    null,             ///< null value\n    object,           ///< object (unordered set of name/value pairs)\n    array,            ///< array (ordered collection of values)\n    string,           ///< string value\n    boolean,          ///< boolean value\n    number_integer,   ///< number value (signed integer)\n    number_unsigned,  ///< number value (unsigned integer)\n    number_float,     ///< number value (floating-point)\n    binary,           ///< binary array (ordered collection of bytes)\n    discarded         ///< discarded by the parser callback function\n};\n\n/*!\n@brief comparison operator for JSON types\n\nReturns an ordering that is similar to Python:\n- order: null < boolean < number < object < array < string < binary\n- furthermore, each type is not smaller than itself\n- discarded values are not comparable\n- binary is represented as a b\"\" string in python and directly comparable to a\n  string; however, making a binary array directly comparable with a string would\n  be surprising behavior in a JSON file.\n\n@since version 1.0.0\n*/\n#if JSON_HAS_THREE_WAY_COMPARISON\n    inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD*\n#else\n    inline bool operator<(const value_t lhs, const value_t rhs) noexcept\n#endif\n{\n    static constexpr std::array<std::uint8_t, 9> order = {{\n            0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */,\n            1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */,\n            6 /* binary */\n        }\n    };\n\n    const auto l_index = static_cast<std::size_t>(lhs);\n    const auto r_index = static_cast<std::size_t>(rhs);\n#if JSON_HAS_THREE_WAY_COMPARISON\n    if (l_index < order.size() && r_index < order.size())\n    {\n        return order[l_index] <=> order[r_index]; // *NOPAD*\n    }\n    return std::partial_ordering::unordered;\n#else\n    return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index];\n#endif\n}\n\n// GCC selects the built-in operator< over an operator rewritten from\n// a user-defined spaceship operator\n// Clang, MSVC, and ICC select the rewritten candidate\n// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200)\n#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__)\ninline bool operator<(const value_t lhs, const value_t rhs) noexcept\n{\n    return std::is_lt(lhs <=> rhs); // *NOPAD*\n}\n#endif\n\n}  // namespace detail\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/json.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n/****************************************************************************\\\n * Note on documentation: The source files contain links to the online      *\n * documentation of the public API at https://json.nlohmann.me. This URL    *\n * contains the most recent documentation and should also be applicable to  *\n * previous versions; documentation for deprecated functions is not         *\n * removed, but marked deprecated. See \"Generate documentation\" section in  *\n * file docs/README.md.                                                     *\n\\****************************************************************************/\n\n#ifndef INCLUDE_NLOHMANN_JSON_HPP_\n#define INCLUDE_NLOHMANN_JSON_HPP_\n\n#include <algorithm> // all_of, find, for_each\n#include <cstddef> // nullptr_t, ptrdiff_t, size_t\n#include <functional> // hash, less\n#include <initializer_list> // initializer_list\n#ifndef JSON_NO_IO\n    #include <iosfwd> // istream, ostream\n#endif  // JSON_NO_IO\n#include <iterator> // random_access_iterator_tag\n#include <memory> // unique_ptr\n#include <string> // string, stoi, to_string\n#include <utility> // declval, forward, move, pair, swap\n#include <vector> // vector\n\n#include <nlohmann/adl_serializer.hpp>\n#include <nlohmann/byte_container_with_subtype.hpp>\n#include <nlohmann/detail/conversions/from_json.hpp>\n#include <nlohmann/detail/conversions/to_json.hpp>\n#include <nlohmann/detail/exceptions.hpp>\n#include <nlohmann/detail/hash.hpp>\n#include <nlohmann/detail/input/binary_reader.hpp>\n#include <nlohmann/detail/input/input_adapters.hpp>\n#include <nlohmann/detail/input/lexer.hpp>\n#include <nlohmann/detail/input/parser.hpp>\n#include <nlohmann/detail/iterators/internal_iterator.hpp>\n#include <nlohmann/detail/iterators/iter_impl.hpp>\n#include <nlohmann/detail/iterators/iteration_proxy.hpp>\n#include <nlohmann/detail/iterators/json_reverse_iterator.hpp>\n#include <nlohmann/detail/iterators/primitive_iterator.hpp>\n#include <nlohmann/detail/json_custom_base_class.hpp>\n#include <nlohmann/detail/json_pointer.hpp>\n#include <nlohmann/detail/json_ref.hpp>\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/string_concat.hpp>\n#include <nlohmann/detail/string_escape.hpp>\n#include <nlohmann/detail/string_utils.hpp>\n#include <nlohmann/detail/meta/cpp_future.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n#include <nlohmann/detail/output/binary_writer.hpp>\n#include <nlohmann/detail/output/output_adapters.hpp>\n#include <nlohmann/detail/output/serializer.hpp>\n#include <nlohmann/detail/value_t.hpp>\n#include <nlohmann/json_fwd.hpp>\n#include <nlohmann/ordered_map.hpp>\n\n#if defined(JSON_HAS_CPP_17)\n    #if JSON_HAS_STATIC_RTTI\n        #include <any>\n    #endif\n    #include <string_view>\n#endif\n\n/*!\n@brief namespace for Niels Lohmann\n@see https://github.com/nlohmann\n@since version 1.0.0\n*/\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/*!\n@brief a class to store JSON values\n\n@internal\n@invariant The member variables @a m_value and @a m_type have the following\nrelationship:\n- If `m_type == value_t::object`, then `m_value.object != nullptr`.\n- If `m_type == value_t::array`, then `m_value.array != nullptr`.\n- If `m_type == value_t::string`, then `m_value.string != nullptr`.\nThe invariants are checked by member function assert_invariant().\n\n@note ObjectType trick from https://stackoverflow.com/a/9860911\n@endinternal\n\n@since version 1.0.0\n\n@nosubgrouping\n*/\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nclass basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)\n    : public ::nlohmann::detail::json_base_class<CustomBaseClass>\n{\n  private:\n    template<detail::value_t> friend struct detail::external_constructor;\n\n    template<typename>\n    friend class ::nlohmann::json_pointer;\n    // can be restored when json_pointer backwards compatibility is removed\n    // friend ::nlohmann::json_pointer<StringType>;\n\n    template<typename BasicJsonType, typename InputType>\n    friend class ::nlohmann::detail::parser;\n    friend ::nlohmann::detail::serializer<basic_json>;\n    template<typename BasicJsonType>\n    friend class ::nlohmann::detail::iter_impl;\n    template<typename BasicJsonType, typename CharType>\n    friend class ::nlohmann::detail::binary_writer;\n    template<typename BasicJsonType, typename InputType, typename SAX>\n    friend class ::nlohmann::detail::binary_reader;\n    template<typename BasicJsonType, typename InputAdapterType>\n    friend class ::nlohmann::detail::json_sax_dom_parser;\n    template<typename BasicJsonType, typename InputAdapterType>\n    friend class ::nlohmann::detail::json_sax_dom_callback_parser;\n    friend class ::nlohmann::detail::exception;\n\n    /// workaround type for MSVC\n    using basic_json_t = NLOHMANN_BASIC_JSON_TPL;\n    using json_base_class_t = ::nlohmann::detail::json_base_class<CustomBaseClass>;\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    // convenience aliases for types residing in namespace detail;\n    using lexer = ::nlohmann::detail::lexer_base<basic_json>;\n\n    template<typename InputAdapterType>\n    static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(\n        InputAdapterType adapter,\n        detail::parser_callback_t<basic_json>cb = nullptr,\n        const bool allow_exceptions = true,\n        const bool ignore_comments = false\n    )\n    {\n        return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),\n               std::move(cb), allow_exceptions, ignore_comments);\n    }\n\n  private:\n    using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;\n    template<typename BasicJsonType>\n    using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>;\n    template<typename BasicJsonType>\n    using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>;\n    template<typename Iterator>\n    using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>;\n    template<typename Base> using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>;\n\n    template<typename CharType>\n    using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>;\n\n    template<typename InputType>\n    using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;\n    template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    using serializer = ::nlohmann::detail::serializer<basic_json>;\n\n  public:\n    using value_t = detail::value_t;\n    /// JSON Pointer, see @ref nlohmann::json_pointer\n    using json_pointer = ::nlohmann::json_pointer<StringType>;\n    template<typename T, typename SFINAE>\n    using json_serializer = JSONSerializer<T, SFINAE>;\n    /// how to treat decoding errors\n    using error_handler_t = detail::error_handler_t;\n    /// how to treat CBOR tags\n    using cbor_tag_handler_t = detail::cbor_tag_handler_t;\n    /// how to encode BJData\n    using bjdata_version_t = detail::bjdata_version_t;\n    /// helper type for initializer lists of basic_json values\n    using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>;\n\n    using input_format_t = detail::input_format_t;\n    /// SAX interface type, see @ref nlohmann::json_sax\n    using json_sax_t = json_sax<basic_json>;\n\n    ////////////////\n    // exceptions //\n    ////////////////\n\n    /// @name exceptions\n    /// Classes to implement user-defined exceptions.\n    /// @{\n\n    using exception = detail::exception;\n    using parse_error = detail::parse_error;\n    using invalid_iterator = detail::invalid_iterator;\n    using type_error = detail::type_error;\n    using out_of_range = detail::out_of_range;\n    using other_error = detail::other_error;\n\n    /// @}\n\n    /////////////////////\n    // container types //\n    /////////////////////\n\n    /// @name container types\n    /// The canonic container types to use @ref basic_json like any other STL\n    /// container.\n    /// @{\n\n    /// the type of elements in a basic_json container\n    using value_type = basic_json;\n\n    /// the type of an element reference\n    using reference = value_type&;\n    /// the type of an element const reference\n    using const_reference = const value_type&;\n\n    /// a type to represent differences between iterators\n    using difference_type = std::ptrdiff_t;\n    /// a type to represent container sizes\n    using size_type = std::size_t;\n\n    /// the allocator type\n    using allocator_type = AllocatorType<basic_json>;\n\n    /// the type of an element pointer\n    using pointer = typename std::allocator_traits<allocator_type>::pointer;\n    /// the type of an element const pointer\n    using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;\n\n    /// an iterator for a basic_json container\n    using iterator = iter_impl<basic_json>;\n    /// a const iterator for a basic_json container\n    using const_iterator = iter_impl<const basic_json>;\n    /// a reverse iterator for a basic_json container\n    using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;\n    /// a const reverse iterator for a basic_json container\n    using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>;\n\n    /// @}\n\n    /// @brief returns the allocator associated with the container\n    /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/\n    static allocator_type get_allocator()\n    {\n        return allocator_type();\n    }\n\n    /// @brief returns version information on the library\n    /// @sa https://json.nlohmann.me/api/basic_json/meta/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json meta()\n    {\n        basic_json result;\n\n        result[\"copyright\"] = \"(C) 2013-2023 Niels Lohmann\";\n        result[\"name\"] = \"JSON for Modern C++\";\n        result[\"url\"] = \"https://github.com/nlohmann/json\";\n        result[\"version\"][\"string\"] =\n            detail::concat(std::to_string(NLOHMANN_JSON_VERSION_MAJOR), '.',\n                           std::to_string(NLOHMANN_JSON_VERSION_MINOR), '.',\n                           std::to_string(NLOHMANN_JSON_VERSION_PATCH));\n        result[\"version\"][\"major\"] = NLOHMANN_JSON_VERSION_MAJOR;\n        result[\"version\"][\"minor\"] = NLOHMANN_JSON_VERSION_MINOR;\n        result[\"version\"][\"patch\"] = NLOHMANN_JSON_VERSION_PATCH;\n\n#ifdef _WIN32\n        result[\"platform\"] = \"win32\";\n#elif defined __linux__\n        result[\"platform\"] = \"linux\";\n#elif defined __APPLE__\n        result[\"platform\"] = \"apple\";\n#elif defined __unix__\n        result[\"platform\"] = \"unix\";\n#else\n        result[\"platform\"] = \"unknown\";\n#endif\n\n#if defined(__ICC) || defined(__INTEL_COMPILER)\n        result[\"compiler\"] = {{\"family\", \"icc\"}, {\"version\", __INTEL_COMPILER}};\n#elif defined(__clang__)\n        result[\"compiler\"] = {{\"family\", \"clang\"}, {\"version\", __clang_version__}};\n#elif defined(__GNUC__) || defined(__GNUG__)\n        result[\"compiler\"] = {{\"family\", \"gcc\"}, {\"version\", detail::concat(\n                    std::to_string(__GNUC__), '.',\n                    std::to_string(__GNUC_MINOR__), '.',\n                    std::to_string(__GNUC_PATCHLEVEL__))\n            }\n        };\n#elif defined(__HP_cc) || defined(__HP_aCC)\n        result[\"compiler\"] = \"hp\"\n#elif defined(__IBMCPP__)\n        result[\"compiler\"] = {{\"family\", \"ilecpp\"}, {\"version\", __IBMCPP__}};\n#elif defined(_MSC_VER)\n        result[\"compiler\"] = {{\"family\", \"msvc\"}, {\"version\", _MSC_VER}};\n#elif defined(__PGI)\n        result[\"compiler\"] = {{\"family\", \"pgcpp\"}, {\"version\", __PGI}};\n#elif defined(__SUNPRO_CC)\n        result[\"compiler\"] = {{\"family\", \"sunpro\"}, {\"version\", __SUNPRO_CC}};\n#else\n        result[\"compiler\"] = {{\"family\", \"unknown\"}, {\"version\", \"unknown\"}};\n#endif\n\n#if defined(_MSVC_LANG)\n        result[\"compiler\"][\"c++\"] = std::to_string(_MSVC_LANG);\n#elif defined(__cplusplus)\n        result[\"compiler\"][\"c++\"] = std::to_string(__cplusplus);\n#else\n        result[\"compiler\"][\"c++\"] = \"unknown\";\n#endif\n        return result;\n    }\n\n    ///////////////////////////\n    // JSON value data types //\n    ///////////////////////////\n\n    /// @name JSON value data types\n    /// The data types to store a JSON value. These types are derived from\n    /// the template arguments passed to class @ref basic_json.\n    /// @{\n\n    /// @brief default object key comparator type\n    /// The actual object key comparator type (@ref object_comparator_t) may be\n    /// different.\n    /// @sa https://json.nlohmann.me/api/basic_json/default_object_comparator_t/\n#if defined(JSON_HAS_CPP_14)\n    // use of transparent comparator avoids unnecessary repeated construction of temporaries\n    // in functions involving lookup by key with types other than object_t::key_type (aka. StringType)\n    using default_object_comparator_t = std::less<>;\n#else\n    using default_object_comparator_t = std::less<StringType>;\n#endif\n\n    /// @brief a type for an object\n    /// @sa https://json.nlohmann.me/api/basic_json/object_t/\n    using object_t = ObjectType<StringType,\n          basic_json,\n          default_object_comparator_t,\n          AllocatorType<std::pair<const StringType,\n          basic_json>>>;\n\n    /// @brief a type for an array\n    /// @sa https://json.nlohmann.me/api/basic_json/array_t/\n    using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;\n\n    /// @brief a type for a string\n    /// @sa https://json.nlohmann.me/api/basic_json/string_t/\n    using string_t = StringType;\n\n    /// @brief a type for a boolean\n    /// @sa https://json.nlohmann.me/api/basic_json/boolean_t/\n    using boolean_t = BooleanType;\n\n    /// @brief a type for a number (integer)\n    /// @sa https://json.nlohmann.me/api/basic_json/number_integer_t/\n    using number_integer_t = NumberIntegerType;\n\n    /// @brief a type for a number (unsigned)\n    /// @sa https://json.nlohmann.me/api/basic_json/number_unsigned_t/\n    using number_unsigned_t = NumberUnsignedType;\n\n    /// @brief a type for a number (floating-point)\n    /// @sa https://json.nlohmann.me/api/basic_json/number_float_t/\n    using number_float_t = NumberFloatType;\n\n    /// @brief a type for a packed binary type\n    /// @sa https://json.nlohmann.me/api/basic_json/binary_t/\n    using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;\n\n    /// @brief object key comparator type\n    /// @sa https://json.nlohmann.me/api/basic_json/object_comparator_t/\n    using object_comparator_t = detail::actual_object_comparator_t<basic_json>;\n\n    /// @}\n\n  private:\n\n    /// helper for exception-safe object creation\n    template<typename T, typename... Args>\n    JSON_HEDLEY_RETURNS_NON_NULL\n    static T* create(Args&& ... args)\n    {\n        AllocatorType<T> alloc;\n        using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;\n\n        auto deleter = [&](T * obj)\n        {\n            AllocatorTraits::deallocate(alloc, obj, 1);\n        };\n        std::unique_ptr<T, decltype(deleter)> obj(AllocatorTraits::allocate(alloc, 1), deleter);\n        AllocatorTraits::construct(alloc, obj.get(), std::forward<Args>(args)...);\n        JSON_ASSERT(obj != nullptr);\n        return obj.release();\n    }\n\n    ////////////////////////\n    // JSON value storage //\n    ////////////////////////\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    /*!\n    @brief a JSON value\n\n    The actual storage for a JSON value of the @ref basic_json class. This\n    union combines the different storage types for the JSON value types\n    defined in @ref value_t.\n\n    JSON type | value_t type    | used type\n    --------- | --------------- | ------------------------\n    object    | object          | pointer to @ref object_t\n    array     | array           | pointer to @ref array_t\n    string    | string          | pointer to @ref string_t\n    boolean   | boolean         | @ref boolean_t\n    number    | number_integer  | @ref number_integer_t\n    number    | number_unsigned | @ref number_unsigned_t\n    number    | number_float    | @ref number_float_t\n    binary    | binary          | pointer to @ref binary_t\n    null      | null            | *no value is stored*\n\n    @note Variable-length types (objects, arrays, and strings) are stored as\n    pointers. The size of the union should not exceed 64 bits if the default\n    value types are used.\n\n    @since version 1.0.0\n    */\n    union json_value\n    {\n        /// object (stored with pointer to save storage)\n        object_t* object;\n        /// array (stored with pointer to save storage)\n        array_t* array;\n        /// string (stored with pointer to save storage)\n        string_t* string;\n        /// binary (stored with pointer to save storage)\n        binary_t* binary;\n        /// boolean\n        boolean_t boolean;\n        /// number (integer)\n        number_integer_t number_integer;\n        /// number (unsigned integer)\n        number_unsigned_t number_unsigned;\n        /// number (floating-point)\n        number_float_t number_float;\n\n        /// default constructor (for null values)\n        json_value() = default;\n        /// constructor for booleans\n        json_value(boolean_t v) noexcept : boolean(v) {}\n        /// constructor for numbers (integer)\n        json_value(number_integer_t v) noexcept : number_integer(v) {}\n        /// constructor for numbers (unsigned)\n        json_value(number_unsigned_t v) noexcept : number_unsigned(v) {}\n        /// constructor for numbers (floating-point)\n        json_value(number_float_t v) noexcept : number_float(v) {}\n        /// constructor for empty values of a given type\n        json_value(value_t t)\n        {\n            switch (t)\n            {\n                case value_t::object:\n                {\n                    object = create<object_t>();\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    array = create<array_t>();\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    string = create<string_t>(\"\");\n                    break;\n                }\n\n                case value_t::binary:\n                {\n                    binary = create<binary_t>();\n                    break;\n                }\n\n                case value_t::boolean:\n                {\n                    boolean = static_cast<boolean_t>(false);\n                    break;\n                }\n\n                case value_t::number_integer:\n                {\n                    number_integer = static_cast<number_integer_t>(0);\n                    break;\n                }\n\n                case value_t::number_unsigned:\n                {\n                    number_unsigned = static_cast<number_unsigned_t>(0);\n                    break;\n                }\n\n                case value_t::number_float:\n                {\n                    number_float = static_cast<number_float_t>(0.0);\n                    break;\n                }\n\n                case value_t::null:\n                {\n                    object = nullptr;  // silence warning, see #821\n                    break;\n                }\n\n                case value_t::discarded:\n                default:\n                {\n                    object = nullptr;  // silence warning, see #821\n                    if (JSON_HEDLEY_UNLIKELY(t == value_t::null))\n                    {\n                        JSON_THROW(other_error::create(500, \"961c151d2e87f2686a955a9be24d316f1362bf21 3.11.3\", nullptr)); // LCOV_EXCL_LINE\n                    }\n                    break;\n                }\n            }\n        }\n\n        /// constructor for strings\n        json_value(const string_t& value) : string(create<string_t>(value)) {}\n\n        /// constructor for rvalue strings\n        json_value(string_t&& value) : string(create<string_t>(std::move(value))) {}\n\n        /// constructor for objects\n        json_value(const object_t& value) : object(create<object_t>(value)) {}\n\n        /// constructor for rvalue objects\n        json_value(object_t&& value) : object(create<object_t>(std::move(value))) {}\n\n        /// constructor for arrays\n        json_value(const array_t& value) : array(create<array_t>(value)) {}\n\n        /// constructor for rvalue arrays\n        json_value(array_t&& value) : array(create<array_t>(std::move(value))) {}\n\n        /// constructor for binary arrays\n        json_value(const typename binary_t::container_type& value) : binary(create<binary_t>(value)) {}\n\n        /// constructor for rvalue binary arrays\n        json_value(typename binary_t::container_type&& value) : binary(create<binary_t>(std::move(value))) {}\n\n        /// constructor for binary arrays (internal type)\n        json_value(const binary_t& value) : binary(create<binary_t>(value)) {}\n\n        /// constructor for rvalue binary arrays (internal type)\n        json_value(binary_t&& value) : binary(create<binary_t>(std::move(value))) {}\n\n        void destroy(value_t t)\n        {\n            if (\n                (t == value_t::object && object == nullptr) ||\n                (t == value_t::array && array == nullptr) ||\n                (t == value_t::string && string == nullptr) ||\n                (t == value_t::binary && binary == nullptr)\n            )\n            {\n                //not initialized (e.g. due to exception in the ctor)\n                return;\n            }\n            if (t == value_t::array || t == value_t::object)\n            {\n                // flatten the current json_value to a heap-allocated stack\n                std::vector<basic_json> stack;\n\n                // move the top-level items to stack\n                if (t == value_t::array)\n                {\n                    stack.reserve(array->size());\n                    std::move(array->begin(), array->end(), std::back_inserter(stack));\n                }\n                else\n                {\n                    stack.reserve(object->size());\n                    for (auto&& it : *object)\n                    {\n                        stack.push_back(std::move(it.second));\n                    }\n                }\n\n                while (!stack.empty())\n                {\n                    // move the last item to local variable to be processed\n                    basic_json current_item(std::move(stack.back()));\n                    stack.pop_back();\n\n                    // if current_item is array/object, move\n                    // its children to the stack to be processed later\n                    if (current_item.is_array())\n                    {\n                        std::move(current_item.m_data.m_value.array->begin(), current_item.m_data.m_value.array->end(), std::back_inserter(stack));\n\n                        current_item.m_data.m_value.array->clear();\n                    }\n                    else if (current_item.is_object())\n                    {\n                        for (auto&& it : *current_item.m_data.m_value.object)\n                        {\n                            stack.push_back(std::move(it.second));\n                        }\n\n                        current_item.m_data.m_value.object->clear();\n                    }\n\n                    // it's now safe that current_item get destructed\n                    // since it doesn't have any children\n                }\n            }\n\n            switch (t)\n            {\n                case value_t::object:\n                {\n                    AllocatorType<object_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, object);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1);\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    AllocatorType<array_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, array);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);\n                    break;\n                }\n\n                case value_t::string:\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1);\n                    break;\n                }\n\n                case value_t::binary:\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);\n                    break;\n                }\n\n                case value_t::null:\n                case value_t::boolean:\n                case value_t::number_integer:\n                case value_t::number_unsigned:\n                case value_t::number_float:\n                case value_t::discarded:\n                default:\n                {\n                    break;\n                }\n            }\n        }\n    };\n\n  private:\n    /*!\n    @brief checks the class invariants\n\n    This function asserts the class invariants. It needs to be called at the\n    end of every constructor to make sure that created objects respect the\n    invariant. Furthermore, it has to be called each time the type of a JSON\n    value is changed, because the invariant expresses a relationship between\n    @a m_type and @a m_value.\n\n    Furthermore, the parent relation is checked for arrays and objects: If\n    @a check_parents true and the value is an array or object, then the\n    container's elements must have the current value as parent.\n\n    @param[in] check_parents  whether the parent relation should be checked.\n               The value is true by default and should only be set to false\n               during destruction of objects when the invariant does not\n               need to hold.\n    */\n    void assert_invariant(bool check_parents = true) const noexcept\n    {\n        JSON_ASSERT(m_data.m_type != value_t::object || m_data.m_value.object != nullptr);\n        JSON_ASSERT(m_data.m_type != value_t::array || m_data.m_value.array != nullptr);\n        JSON_ASSERT(m_data.m_type != value_t::string || m_data.m_value.string != nullptr);\n        JSON_ASSERT(m_data.m_type != value_t::binary || m_data.m_value.binary != nullptr);\n\n#if JSON_DIAGNOSTICS\n        JSON_TRY\n        {\n            // cppcheck-suppress assertWithSideEffect\n            JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json & j)\n            {\n                return j.m_parent == this;\n            }));\n        }\n        JSON_CATCH(...) {} // LCOV_EXCL_LINE\n#endif\n        static_cast<void>(check_parents);\n    }\n\n    void set_parents()\n    {\n#if JSON_DIAGNOSTICS\n        switch (m_data.m_type)\n        {\n            case value_t::array:\n            {\n                for (auto& element : *m_data.m_value.array)\n                {\n                    element.m_parent = this;\n                }\n                break;\n            }\n\n            case value_t::object:\n            {\n                for (auto& element : *m_data.m_value.object)\n                {\n                    element.second.m_parent = this;\n                }\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n                break;\n        }\n#endif\n    }\n\n    iterator set_parents(iterator it, typename iterator::difference_type count_set_parents)\n    {\n#if JSON_DIAGNOSTICS\n        for (typename iterator::difference_type i = 0; i < count_set_parents; ++i)\n        {\n            (it + i)->m_parent = this;\n        }\n#else\n        static_cast<void>(count_set_parents);\n#endif\n        return it;\n    }\n\n    reference set_parent(reference j, std::size_t old_capacity = detail::unknown_size())\n    {\n#if JSON_DIAGNOSTICS\n        if (old_capacity != detail::unknown_size())\n        {\n            // see https://github.com/nlohmann/json/issues/2838\n            JSON_ASSERT(type() == value_t::array);\n            if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity))\n            {\n                // capacity has changed: update all parents\n                set_parents();\n                return j;\n            }\n        }\n\n        // ordered_json uses a vector internally, so pointers could have\n        // been invalidated; see https://github.com/nlohmann/json/issues/2962\n#ifdef JSON_HEDLEY_MSVC_VERSION\n#pragma warning(push )\n#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr\n#endif\n        if (detail::is_ordered_map<object_t>::value)\n        {\n            set_parents();\n            return j;\n        }\n#ifdef JSON_HEDLEY_MSVC_VERSION\n#pragma warning( pop )\n#endif\n\n        j.m_parent = this;\n#else\n        static_cast<void>(j);\n        static_cast<void>(old_capacity);\n#endif\n        return j;\n    }\n\n  public:\n    //////////////////////////\n    // JSON parser callback //\n    //////////////////////////\n\n    /// @brief parser event types\n    /// @sa https://json.nlohmann.me/api/basic_json/parse_event_t/\n    using parse_event_t = detail::parse_event_t;\n\n    /// @brief per-element parser callback type\n    /// @sa https://json.nlohmann.me/api/basic_json/parser_callback_t/\n    using parser_callback_t = detail::parser_callback_t<basic_json>;\n\n    //////////////////\n    // constructors //\n    //////////////////\n\n    /// @name constructors and destructors\n    /// Constructors of class @ref basic_json, copy/move constructor, copy\n    /// assignment, static functions creating objects, and the destructor.\n    /// @{\n\n    /// @brief create an empty value with a given type\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    basic_json(const value_t v)\n        : m_data(v)\n    {\n        assert_invariant();\n    }\n\n    /// @brief create a null object\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    basic_json(std::nullptr_t = nullptr) noexcept // NOLINT(bugprone-exception-escape)\n        : basic_json(value_t::null)\n    {\n        assert_invariant();\n    }\n\n    /// @brief create a JSON value from compatible types\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    template < typename CompatibleType,\n               typename U = detail::uncvref_t<CompatibleType>,\n               detail::enable_if_t <\n                   !detail::is_basic_json<U>::value && detail::is_compatible_type<basic_json_t, U>::value, int > = 0 >\n    basic_json(CompatibleType && val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape)\n                JSONSerializer<U>::to_json(std::declval<basic_json_t&>(),\n                                           std::forward<CompatibleType>(val))))\n    {\n        JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val));\n        set_parents();\n        assert_invariant();\n    }\n\n    /// @brief create a JSON value from an existing one\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    template < typename BasicJsonType,\n               detail::enable_if_t <\n                   detail::is_basic_json<BasicJsonType>::value&& !std::is_same<basic_json, BasicJsonType>::value, int > = 0 >\n    basic_json(const BasicJsonType& val)\n#if JSON_DIAGNOSTIC_POSITIONS\n        : start_position(val.start_pos()),\n          end_position(val.end_pos())\n#endif\n    {\n        using other_boolean_t = typename BasicJsonType::boolean_t;\n        using other_number_float_t = typename BasicJsonType::number_float_t;\n        using other_number_integer_t = typename BasicJsonType::number_integer_t;\n        using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t;\n        using other_string_t = typename BasicJsonType::string_t;\n        using other_object_t = typename BasicJsonType::object_t;\n        using other_array_t = typename BasicJsonType::array_t;\n        using other_binary_t = typename BasicJsonType::binary_t;\n\n        switch (val.type())\n        {\n            case value_t::boolean:\n                JSONSerializer<other_boolean_t>::to_json(*this, val.template get<other_boolean_t>());\n                break;\n            case value_t::number_float:\n                JSONSerializer<other_number_float_t>::to_json(*this, val.template get<other_number_float_t>());\n                break;\n            case value_t::number_integer:\n                JSONSerializer<other_number_integer_t>::to_json(*this, val.template get<other_number_integer_t>());\n                break;\n            case value_t::number_unsigned:\n                JSONSerializer<other_number_unsigned_t>::to_json(*this, val.template get<other_number_unsigned_t>());\n                break;\n            case value_t::string:\n                JSONSerializer<other_string_t>::to_json(*this, val.template get_ref<const other_string_t&>());\n                break;\n            case value_t::object:\n                JSONSerializer<other_object_t>::to_json(*this, val.template get_ref<const other_object_t&>());\n                break;\n            case value_t::array:\n                JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>());\n                break;\n            case value_t::binary:\n                JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>());\n                break;\n            case value_t::null:\n                *this = nullptr;\n                break;\n            case value_t::discarded:\n                m_data.m_type = value_t::discarded;\n                break;\n            default:            // LCOV_EXCL_LINE\n                JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n        }\n        JSON_ASSERT(m_data.m_type == val.type());\n\n        set_parents();\n        assert_invariant();\n    }\n\n    /// @brief create a container (array or object) from an initializer list\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    basic_json(initializer_list_t init,\n               bool type_deduction = true,\n               value_t manual_type = value_t::array)\n    {\n        // check if each element is an array with two elements whose first\n        // element is a string\n        bool is_an_object = std::all_of(init.begin(), init.end(),\n                                        [](const detail::json_ref<basic_json>& element_ref)\n        {\n            // The cast is to ensure op[size_type] is called, bearing in mind size_type may not be int;\n            // (many string types can be constructed from 0 via its null-pointer guise, so we get a\n            // broken call to op[key_type], the wrong semantics and a 4804 warning on Windows)\n            return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[static_cast<size_type>(0)].is_string();\n        });\n\n        // adjust type if type deduction is not wanted\n        if (!type_deduction)\n        {\n            // if array is wanted, do not create an object though possible\n            if (manual_type == value_t::array)\n            {\n                is_an_object = false;\n            }\n\n            // if object is wanted but impossible, throw an exception\n            if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object))\n            {\n                JSON_THROW(type_error::create(301, \"cannot create object from initializer list\", nullptr));\n            }\n        }\n\n        if (is_an_object)\n        {\n            // the initializer list is a list of pairs -> create object\n            m_data.m_type = value_t::object;\n            m_data.m_value = value_t::object;\n\n            for (auto& element_ref : init)\n            {\n                auto element = element_ref.moved_or_copied();\n                m_data.m_value.object->emplace(\n                    std::move(*((*element.m_data.m_value.array)[0].m_data.m_value.string)),\n                    std::move((*element.m_data.m_value.array)[1]));\n            }\n        }\n        else\n        {\n            // the initializer list describes an array -> create array\n            m_data.m_type = value_t::array;\n            m_data.m_value.array = create<array_t>(init.begin(), init.end());\n        }\n\n        set_parents();\n        assert_invariant();\n    }\n\n    /// @brief explicitly create a binary array (without subtype)\n    /// @sa https://json.nlohmann.me/api/basic_json/binary/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(const typename binary_t::container_type& init)\n    {\n        auto res = basic_json();\n        res.m_data.m_type = value_t::binary;\n        res.m_data.m_value = init;\n        return res;\n    }\n\n    /// @brief explicitly create a binary array (with subtype)\n    /// @sa https://json.nlohmann.me/api/basic_json/binary/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype)\n    {\n        auto res = basic_json();\n        res.m_data.m_type = value_t::binary;\n        res.m_data.m_value = binary_t(init, subtype);\n        return res;\n    }\n\n    /// @brief explicitly create a binary array\n    /// @sa https://json.nlohmann.me/api/basic_json/binary/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(typename binary_t::container_type&& init)\n    {\n        auto res = basic_json();\n        res.m_data.m_type = value_t::binary;\n        res.m_data.m_value = std::move(init);\n        return res;\n    }\n\n    /// @brief explicitly create a binary array (with subtype)\n    /// @sa https://json.nlohmann.me/api/basic_json/binary/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype)\n    {\n        auto res = basic_json();\n        res.m_data.m_type = value_t::binary;\n        res.m_data.m_value = binary_t(std::move(init), subtype);\n        return res;\n    }\n\n    /// @brief explicitly create an array from an initializer list\n    /// @sa https://json.nlohmann.me/api/basic_json/array/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json array(initializer_list_t init = {})\n    {\n        return basic_json(init, false, value_t::array);\n    }\n\n    /// @brief explicitly create an object from an initializer list\n    /// @sa https://json.nlohmann.me/api/basic_json/object/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json object(initializer_list_t init = {})\n    {\n        return basic_json(init, false, value_t::object);\n    }\n\n    /// @brief construct an array with count copies of given value\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    basic_json(size_type cnt, const basic_json& val):\n        m_data{cnt, val}\n    {\n        set_parents();\n        assert_invariant();\n    }\n\n    /// @brief construct a JSON container given an iterator range\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    template < class InputIT, typename std::enable_if <\n                   std::is_same<InputIT, typename basic_json_t::iterator>::value ||\n                   std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 >\n    basic_json(InputIT first, InputIT last) // NOLINT(performance-unnecessary-value-param)\n    {\n        JSON_ASSERT(first.m_object != nullptr);\n        JSON_ASSERT(last.m_object != nullptr);\n\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(201, \"iterators are not compatible\", nullptr));\n        }\n\n        // copy type from first iterator\n        m_data.m_type = first.m_object->m_data.m_type;\n\n        // check if iterator range is complete for primitive values\n        switch (m_data.m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            {\n                if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin()\n                                         || !last.m_it.primitive_iterator.is_end()))\n                {\n                    JSON_THROW(invalid_iterator::create(204, \"iterators out of range\", first.m_object));\n                }\n                break;\n            }\n\n            case value_t::null:\n            case value_t::object:\n            case value_t::array:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n                break;\n        }\n\n        switch (m_data.m_type)\n        {\n            case value_t::number_integer:\n            {\n                m_data.m_value.number_integer = first.m_object->m_data.m_value.number_integer;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_data.m_value.number_unsigned = first.m_object->m_data.m_value.number_unsigned;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_data.m_value.number_float = first.m_object->m_data.m_value.number_float;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_data.m_value.boolean = first.m_object->m_data.m_value.boolean;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_data.m_value = *first.m_object->m_data.m_value.string;\n                break;\n            }\n\n            case value_t::object:\n            {\n                m_data.m_value.object = create<object_t>(first.m_it.object_iterator,\n                                        last.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_data.m_value.array = create<array_t>(first.m_it.array_iterator,\n                                                       last.m_it.array_iterator);\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_data.m_value = *first.m_object->m_data.m_value.binary;\n                break;\n            }\n\n            case value_t::null:\n            case value_t::discarded:\n            default:\n                JSON_THROW(invalid_iterator::create(206, detail::concat(\"cannot construct with iterators from \", first.m_object->type_name()), first.m_object));\n        }\n\n        set_parents();\n        assert_invariant();\n    }\n\n    ///////////////////////////////////////\n    // other constructors and destructor //\n    ///////////////////////////////////////\n\n    template<typename JsonRef,\n             detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>,\n                                 std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 >\n    basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {}\n\n    /// @brief copy constructor\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    basic_json(const basic_json& other)\n        : json_base_class_t(other)\n#if JSON_DIAGNOSTIC_POSITIONS\n        , start_position(other.start_position)\n        , end_position(other.end_position)\n#endif\n    {\n        m_data.m_type = other.m_data.m_type;\n        // check of passed value is valid\n        other.assert_invariant();\n\n        switch (m_data.m_type)\n        {\n            case value_t::object:\n            {\n                m_data.m_value = *other.m_data.m_value.object;\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_data.m_value = *other.m_data.m_value.array;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_data.m_value = *other.m_data.m_value.string;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_data.m_value = other.m_data.m_value.boolean;\n                break;\n            }\n\n            case value_t::number_integer:\n            {\n                m_data.m_value = other.m_data.m_value.number_integer;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_data.m_value = other.m_data.m_value.number_unsigned;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_data.m_value = other.m_data.m_value.number_float;\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_data.m_value = *other.m_data.m_value.binary;\n                break;\n            }\n\n            case value_t::null:\n            case value_t::discarded:\n            default:\n                break;\n        }\n\n        set_parents();\n        assert_invariant();\n    }\n\n    /// @brief move constructor\n    /// @sa https://json.nlohmann.me/api/basic_json/basic_json/\n    basic_json(basic_json&& other) noexcept\n        : json_base_class_t(std::forward<json_base_class_t>(other)),\n          m_data(std::move(other.m_data)) // cppcheck-suppress[accessForwarded] TODO check\n#if JSON_DIAGNOSTIC_POSITIONS\n        , start_position(other.start_position) // cppcheck-suppress[accessForwarded] TODO check\n        , end_position(other.end_position) // cppcheck-suppress[accessForwarded] TODO check\n#endif\n    {\n        // check that passed value is valid\n        other.assert_invariant(false); // cppcheck-suppress[accessForwarded]\n\n        // invalidate payload\n        other.m_data.m_type = value_t::null;\n        other.m_data.m_value = {};\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        other.start_position = std::string::npos;\n        other.end_position = std::string::npos;\n#endif\n\n        set_parents();\n        assert_invariant();\n    }\n\n    /// @brief copy assignment\n    /// @sa https://json.nlohmann.me/api/basic_json/operator=/\n    basic_json& operator=(basic_json other) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&&\n        std::is_nothrow_move_assignable<json_value>::value&&\n        std::is_nothrow_move_assignable<json_base_class_t>::value\n    )\n    {\n        // check that passed value is valid\n        other.assert_invariant();\n\n        using std::swap;\n        swap(m_data.m_type, other.m_data.m_type);\n        swap(m_data.m_value, other.m_data.m_value);\n\n#if JSON_DIAGNOSTIC_POSITIONS\n        swap(start_position, other.start_position);\n        swap(end_position, other.end_position);\n#endif\n\n        json_base_class_t::operator=(std::move(other));\n\n        set_parents();\n        assert_invariant();\n        return *this;\n    }\n\n    /// @brief destructor\n    /// @sa https://json.nlohmann.me/api/basic_json/~basic_json/\n    ~basic_json() noexcept\n    {\n        assert_invariant(false);\n    }\n\n    /// @}\n\n  public:\n    ///////////////////////\n    // object inspection //\n    ///////////////////////\n\n    /// @name object inspection\n    /// Functions to inspect the type of a JSON value.\n    /// @{\n\n    /// @brief serialization\n    /// @sa https://json.nlohmann.me/api/basic_json/dump/\n    string_t dump(const int indent = -1,\n                  const char indent_char = ' ',\n                  const bool ensure_ascii = false,\n                  const error_handler_t error_handler = error_handler_t::strict) const\n    {\n        string_t result;\n        serializer s(detail::output_adapter<char, string_t>(result), indent_char, error_handler);\n\n        if (indent >= 0)\n        {\n            s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent));\n        }\n        else\n        {\n            s.dump(*this, false, ensure_ascii, 0);\n        }\n\n        return result;\n    }\n\n    /// @brief return the type of the JSON value (explicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/type/\n    constexpr value_t type() const noexcept\n    {\n        return m_data.m_type;\n    }\n\n    /// @brief return whether type is primitive\n    /// @sa https://json.nlohmann.me/api/basic_json/is_primitive/\n    constexpr bool is_primitive() const noexcept\n    {\n        return is_null() || is_string() || is_boolean() || is_number() || is_binary();\n    }\n\n    /// @brief return whether type is structured\n    /// @sa https://json.nlohmann.me/api/basic_json/is_structured/\n    constexpr bool is_structured() const noexcept\n    {\n        return is_array() || is_object();\n    }\n\n    /// @brief return whether value is null\n    /// @sa https://json.nlohmann.me/api/basic_json/is_null/\n    constexpr bool is_null() const noexcept\n    {\n        return m_data.m_type == value_t::null;\n    }\n\n    /// @brief return whether value is a boolean\n    /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/\n    constexpr bool is_boolean() const noexcept\n    {\n        return m_data.m_type == value_t::boolean;\n    }\n\n    /// @brief return whether value is a number\n    /// @sa https://json.nlohmann.me/api/basic_json/is_number/\n    constexpr bool is_number() const noexcept\n    {\n        return is_number_integer() || is_number_float();\n    }\n\n    /// @brief return whether value is an integer number\n    /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/\n    constexpr bool is_number_integer() const noexcept\n    {\n        return m_data.m_type == value_t::number_integer || m_data.m_type == value_t::number_unsigned;\n    }\n\n    /// @brief return whether value is an unsigned integer number\n    /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/\n    constexpr bool is_number_unsigned() const noexcept\n    {\n        return m_data.m_type == value_t::number_unsigned;\n    }\n\n    /// @brief return whether value is a floating-point number\n    /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/\n    constexpr bool is_number_float() const noexcept\n    {\n        return m_data.m_type == value_t::number_float;\n    }\n\n    /// @brief return whether value is an object\n    /// @sa https://json.nlohmann.me/api/basic_json/is_object/\n    constexpr bool is_object() const noexcept\n    {\n        return m_data.m_type == value_t::object;\n    }\n\n    /// @brief return whether value is an array\n    /// @sa https://json.nlohmann.me/api/basic_json/is_array/\n    constexpr bool is_array() const noexcept\n    {\n        return m_data.m_type == value_t::array;\n    }\n\n    /// @brief return whether value is a string\n    /// @sa https://json.nlohmann.me/api/basic_json/is_string/\n    constexpr bool is_string() const noexcept\n    {\n        return m_data.m_type == value_t::string;\n    }\n\n    /// @brief return whether value is a binary array\n    /// @sa https://json.nlohmann.me/api/basic_json/is_binary/\n    constexpr bool is_binary() const noexcept\n    {\n        return m_data.m_type == value_t::binary;\n    }\n\n    /// @brief return whether value is discarded\n    /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/\n    constexpr bool is_discarded() const noexcept\n    {\n        return m_data.m_type == value_t::discarded;\n    }\n\n    /// @brief return the type of the JSON value (implicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/\n    constexpr operator value_t() const noexcept\n    {\n        return m_data.m_type;\n    }\n\n    /// @}\n\n  private:\n    //////////////////\n    // value access //\n    //////////////////\n\n    /// get a boolean (explicit)\n    boolean_t get_impl(boolean_t* /*unused*/) const\n    {\n        if (JSON_HEDLEY_LIKELY(is_boolean()))\n        {\n            return m_data.m_value.boolean;\n        }\n\n        JSON_THROW(type_error::create(302, detail::concat(\"type must be boolean, but is \", type_name()), this));\n    }\n\n    /// get a pointer to the value (object)\n    object_t* get_impl_ptr(object_t* /*unused*/) noexcept\n    {\n        return is_object() ? m_data.m_value.object : nullptr;\n    }\n\n    /// get a pointer to the value (object)\n    constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept\n    {\n        return is_object() ? m_data.m_value.object : nullptr;\n    }\n\n    /// get a pointer to the value (array)\n    array_t* get_impl_ptr(array_t* /*unused*/) noexcept\n    {\n        return is_array() ? m_data.m_value.array : nullptr;\n    }\n\n    /// get a pointer to the value (array)\n    constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept\n    {\n        return is_array() ? m_data.m_value.array : nullptr;\n    }\n\n    /// get a pointer to the value (string)\n    string_t* get_impl_ptr(string_t* /*unused*/) noexcept\n    {\n        return is_string() ? m_data.m_value.string : nullptr;\n    }\n\n    /// get a pointer to the value (string)\n    constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept\n    {\n        return is_string() ? m_data.m_value.string : nullptr;\n    }\n\n    /// get a pointer to the value (boolean)\n    boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept\n    {\n        return is_boolean() ? &m_data.m_value.boolean : nullptr;\n    }\n\n    /// get a pointer to the value (boolean)\n    constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept\n    {\n        return is_boolean() ? &m_data.m_value.boolean : nullptr;\n    }\n\n    /// get a pointer to the value (integer number)\n    number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept\n    {\n        return m_data.m_type == value_t::number_integer ? &m_data.m_value.number_integer : nullptr;\n    }\n\n    /// get a pointer to the value (integer number)\n    constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept\n    {\n        return m_data.m_type == value_t::number_integer ? &m_data.m_value.number_integer : nullptr;\n    }\n\n    /// get a pointer to the value (unsigned number)\n    number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept\n    {\n        return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr;\n    }\n\n    /// get a pointer to the value (unsigned number)\n    constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept\n    {\n        return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr;\n    }\n\n    /// get a pointer to the value (floating-point number)\n    number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept\n    {\n        return is_number_float() ? &m_data.m_value.number_float : nullptr;\n    }\n\n    /// get a pointer to the value (floating-point number)\n    constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept\n    {\n        return is_number_float() ? &m_data.m_value.number_float : nullptr;\n    }\n\n    /// get a pointer to the value (binary)\n    binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept\n    {\n        return is_binary() ? m_data.m_value.binary : nullptr;\n    }\n\n    /// get a pointer to the value (binary)\n    constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept\n    {\n        return is_binary() ? m_data.m_value.binary : nullptr;\n    }\n\n    /*!\n    @brief helper function to implement get_ref()\n\n    This function helps to implement get_ref() without code duplication for\n    const and non-const overloads\n\n    @tparam ThisType will be deduced as `basic_json` or `const basic_json`\n\n    @throw type_error.303 if ReferenceType does not match underlying value\n    type of the current JSON\n    */\n    template<typename ReferenceType, typename ThisType>\n    static ReferenceType get_ref_impl(ThisType& obj)\n    {\n        // delegate the call to get_ptr<>()\n        auto* ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();\n\n        if (JSON_HEDLEY_LIKELY(ptr != nullptr))\n        {\n            return *ptr;\n        }\n\n        JSON_THROW(type_error::create(303, detail::concat(\"incompatible ReferenceType for get_ref, actual type is \", obj.type_name()), &obj));\n    }\n\n  public:\n    /// @name value access\n    /// Direct access to the stored value of a JSON value.\n    /// @{\n\n    /// @brief get a pointer value (implicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    auto get_ptr() noexcept -> decltype(std::declval<basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))\n    {\n        // delegate the call to get_impl_ptr<>()\n        return get_impl_ptr(static_cast<PointerType>(nullptr));\n    }\n\n    /// @brief get a pointer value (implicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/\n    template < typename PointerType, typename std::enable_if <\n                   std::is_pointer<PointerType>::value&&\n                   std::is_const<typename std::remove_pointer<PointerType>::type>::value, int >::type = 0 >\n    constexpr auto get_ptr() const noexcept -> decltype(std::declval<const basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))\n    {\n        // delegate the call to get_impl_ptr<>() const\n        return get_impl_ptr(static_cast<PointerType>(nullptr));\n    }\n\n  private:\n    /*!\n    @brief get a value (explicit)\n\n    Explicit type conversion between the JSON value and a compatible value\n    which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible)\n    and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible).\n    The value is converted by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    ValueType ret;\n    JSONSerializer<ValueType>::from_json(*this, ret);\n    return ret;\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json,\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `void from_json(const basic_json&, ValueType&)`, and\n    - @ref json_serializer<ValueType> does not have a `from_json()` method of\n      the form `ValueType from_json(const basic_json&)`\n\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @a ValueType\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,get__ValueType_const}\n\n    @since version 2.1.0\n    */\n    template < typename ValueType,\n               detail::enable_if_t <\n                   detail::is_default_constructible<ValueType>::value&&\n                   detail::has_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept(\n                JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>())))\n    {\n        auto ret = ValueType();\n        JSONSerializer<ValueType>::from_json(*this, ret);\n        return ret;\n    }\n\n    /*!\n    @brief get a value (explicit); special case\n\n    Explicit type conversion between the JSON value and a compatible value\n    which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible)\n    and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible).\n    The value is converted by calling the @ref json_serializer<ValueType>\n    `from_json()` method.\n\n    The function is equivalent to executing\n    @code {.cpp}\n    return JSONSerializer<ValueType>::from_json(*this);\n    @endcode\n\n    This overloads is chosen if:\n    - @a ValueType is not @ref basic_json and\n    - @ref json_serializer<ValueType> has a `from_json()` method of the form\n      `ValueType from_json(const basic_json&)`\n\n    @note If @ref json_serializer<ValueType> has both overloads of\n    `from_json()`, this one is chosen.\n\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @a ValueType\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws\n\n    @since version 2.1.0\n    */\n    template < typename ValueType,\n               detail::enable_if_t <\n                   detail::has_non_default_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept(\n                JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>())))\n    {\n        return JSONSerializer<ValueType>::from_json(*this);\n    }\n\n    /*!\n    @brief get special-case overload\n\n    This overloads converts the current @ref basic_json in a different\n    @ref basic_json type\n\n    @tparam BasicJsonType == @ref basic_json\n\n    @return a copy of *this, converted into @a BasicJsonType\n\n    @complexity Depending on the implementation of the called `from_json()`\n                method.\n\n    @since version 3.2.0\n    */\n    template < typename BasicJsonType,\n               detail::enable_if_t <\n                   detail::is_basic_json<BasicJsonType>::value,\n                   int > = 0 >\n    BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const\n    {\n        return *this;\n    }\n\n    /*!\n    @brief get special-case overload\n\n    This overloads avoids a lot of template boilerplate, it can be seen as the\n    identity method\n\n    @tparam BasicJsonType == @ref basic_json\n\n    @return a copy of *this\n\n    @complexity Constant.\n\n    @since version 2.1.0\n    */\n    template<typename BasicJsonType,\n             detail::enable_if_t<\n                 std::is_same<BasicJsonType, basic_json_t>::value,\n                 int> = 0>\n    basic_json get_impl(detail::priority_tag<3> /*unused*/) const\n    {\n        return *this;\n    }\n\n    /*!\n    @brief get a pointer value (explicit)\n    @copydoc get()\n    */\n    template<typename PointerType,\n             detail::enable_if_t<\n                 std::is_pointer<PointerType>::value,\n                 int> = 0>\n    constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept\n    -> decltype(std::declval<const basic_json_t&>().template get_ptr<PointerType>())\n    {\n        // delegate the call to get_ptr\n        return get_ptr<PointerType>();\n    }\n\n  public:\n    /*!\n    @brief get a (pointer) value (explicit)\n\n    Performs explicit type conversion between the JSON value and a compatible value if required.\n\n    - If the requested type is a pointer to the internally stored JSON value that pointer is returned.\n    No copies are made.\n\n    - If the requested type is the current @ref basic_json, or a different @ref basic_json convertible\n    from the current @ref basic_json.\n\n    - Otherwise the value is converted by calling the @ref json_serializer<ValueType> `from_json()`\n    method.\n\n    @tparam ValueTypeCV the provided value type\n    @tparam ValueType the returned value type\n\n    @return copy of the JSON value, converted to @tparam ValueType if necessary\n\n    @throw what @ref json_serializer<ValueType> `from_json()` method throws if conversion is required\n\n    @since version 2.1.0\n    */\n    template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>>\n#if defined(JSON_HAS_CPP_14)\n    constexpr\n#endif\n    auto get() const noexcept(\n    noexcept(std::declval<const basic_json_t&>().template get_impl<ValueType>(detail::priority_tag<4> {})))\n    -> decltype(std::declval<const basic_json_t&>().template get_impl<ValueType>(detail::priority_tag<4> {}))\n    {\n        // we cannot static_assert on ValueTypeCV being non-const, because\n        // there is support for get<const basic_json_t>(), which is why we\n        // still need the uncvref\n        static_assert(!std::is_reference<ValueTypeCV>::value,\n                      \"get() cannot be used with reference types, you might want to use get_ref()\");\n        return get_impl<ValueType>(detail::priority_tag<4> {});\n    }\n\n    /*!\n    @brief get a pointer value (explicit)\n\n    Explicit pointer access to the internally stored JSON value. No copies are\n    made.\n\n    @warning The pointer becomes invalid if the underlying JSON object\n    changes.\n\n    @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref\n    object_t, @ref string_t, @ref boolean_t, @ref number_integer_t,\n    @ref number_unsigned_t, or @ref number_float_t.\n\n    @return pointer to the internally stored JSON value if the requested\n    pointer type @a PointerType fits to the JSON value; `nullptr` otherwise\n\n    @complexity Constant.\n\n    @liveexample{The example below shows how pointers to internal values of a\n    JSON value can be requested. Note that no type conversions are made and a\n    `nullptr` is returned if the value and the requested pointer type does not\n    match.,get__PointerType}\n\n    @sa see @ref get_ptr() for explicit pointer-member access\n\n    @since version 1.0.0\n    */\n    template<typename PointerType, typename std::enable_if<\n                 std::is_pointer<PointerType>::value, int>::type = 0>\n    auto get() noexcept -> decltype(std::declval<basic_json_t&>().template get_ptr<PointerType>())\n    {\n        // delegate the call to get_ptr\n        return get_ptr<PointerType>();\n    }\n\n    /// @brief get a value (explicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/get_to/\n    template < typename ValueType,\n               detail::enable_if_t <\n                   !detail::is_basic_json<ValueType>::value&&\n                   detail::has_from_json<basic_json_t, ValueType>::value,\n                   int > = 0 >\n    ValueType & get_to(ValueType& v) const noexcept(noexcept(\n                JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))\n    {\n        JSONSerializer<ValueType>::from_json(*this, v);\n        return v;\n    }\n\n    // specialization to allow calling get_to with a basic_json value\n    // see https://github.com/nlohmann/json/issues/2175\n    template<typename ValueType,\n             detail::enable_if_t <\n                 detail::is_basic_json<ValueType>::value,\n                 int> = 0>\n    ValueType & get_to(ValueType& v) const\n    {\n        v = *this;\n        return v;\n    }\n\n    template <\n        typename T, std::size_t N,\n        typename Array = T (&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n        detail::enable_if_t <\n            detail::has_from_json<basic_json_t, Array>::value, int > = 0 >\n    Array get_to(T (&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)\n    noexcept(noexcept(JSONSerializer<Array>::from_json(\n                          std::declval<const basic_json_t&>(), v)))\n    {\n        JSONSerializer<Array>::from_json(*this, v);\n        return v;\n    }\n\n    /// @brief get a reference value (implicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/get_ref/\n    template<typename ReferenceType, typename std::enable_if<\n                 std::is_reference<ReferenceType>::value, int>::type = 0>\n    ReferenceType get_ref()\n    {\n        // delegate call to get_ref_impl\n        return get_ref_impl<ReferenceType>(*this);\n    }\n\n    /// @brief get a reference value (implicit)\n    /// @sa https://json.nlohmann.me/api/basic_json/get_ref/\n    template < typename ReferenceType, typename std::enable_if <\n                   std::is_reference<ReferenceType>::value&&\n                   std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int >::type = 0 >\n    ReferenceType get_ref() const\n    {\n        // delegate call to get_ref_impl\n        return get_ref_impl<ReferenceType>(*this);\n    }\n\n    /*!\n    @brief get a value (implicit)\n\n    Implicit type conversion between the JSON value and a compatible value.\n    The call is realized by calling @ref get() const.\n\n    @tparam ValueType non-pointer type compatible to the JSON value, for\n    instance `int` for JSON integer numbers, `bool` for JSON booleans, or\n    `std::vector` types for JSON arrays. The character type of @ref string_t\n    as well as an initializer list of this type is excluded to avoid\n    ambiguities as these types implicitly convert to `std::string`.\n\n    @return copy of the JSON value, converted to type @a ValueType\n\n    @throw type_error.302 in case passed type @a ValueType is incompatible\n    to the JSON value type (e.g., the JSON value is of type boolean, but a\n    string is requested); see example below\n\n    @complexity Linear in the size of the JSON value.\n\n    @liveexample{The example below shows several conversions from JSON values\n    to other types. There a few things to note: (1) Floating-point numbers can\n    be converted to integers\\, (2) A JSON array can be converted to a standard\n    `std::vector<short>`\\, (3) A JSON object can be converted to C++\n    associative containers such as `std::unordered_map<std::string\\,\n    json>`.,operator__ValueType}\n\n    @since version 1.0.0\n    */\n    template < typename ValueType, typename std::enable_if <\n                   detail::conjunction <\n                       detail::negation<std::is_pointer<ValueType>>,\n                       detail::negation<std::is_same<ValueType, std::nullptr_t>>,\n                       detail::negation<std::is_same<ValueType, detail::json_ref<basic_json>>>,\n                                        detail::negation<std::is_same<ValueType, typename string_t::value_type>>,\n                                        detail::negation<detail::is_basic_json<ValueType>>,\n                                        detail::negation<std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>>,\n#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))\n                                                detail::negation<std::is_same<ValueType, std::string_view>>,\n#endif\n#if defined(JSON_HAS_CPP_17) && JSON_HAS_STATIC_RTTI\n                                                detail::negation<std::is_same<ValueType, std::any>>,\n#endif\n                                                detail::is_detected_lazy<detail::get_template_function, const basic_json_t&, ValueType>\n                                                >::value, int >::type = 0 >\n                                        JSON_EXPLICIT operator ValueType() const\n    {\n        // delegate the call to get<>() const\n        return get<ValueType>();\n    }\n\n    /// @brief get a binary value\n    /// @sa https://json.nlohmann.me/api/basic_json/get_binary/\n    binary_t& get_binary()\n    {\n        if (!is_binary())\n        {\n            JSON_THROW(type_error::create(302, detail::concat(\"type must be binary, but is \", type_name()), this));\n        }\n\n        return *get_ptr<binary_t*>();\n    }\n\n    /// @brief get a binary value\n    /// @sa https://json.nlohmann.me/api/basic_json/get_binary/\n    const binary_t& get_binary() const\n    {\n        if (!is_binary())\n        {\n            JSON_THROW(type_error::create(302, detail::concat(\"type must be binary, but is \", type_name()), this));\n        }\n\n        return *get_ptr<const binary_t*>();\n    }\n\n    /// @}\n\n    ////////////////////\n    // element access //\n    ////////////////////\n\n    /// @name element access\n    /// Access to the JSON value.\n    /// @{\n\n    /// @brief access specified array element with bounds checking\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    reference at(size_type idx)\n    {\n        // at only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            JSON_TRY\n            {\n                return set_parent(m_data.m_value.array->at(idx));\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(401, detail::concat(\"array index \", std::to_string(idx), \" is out of range\"), this));\n            } // cppcheck-suppress[missingReturn]\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, detail::concat(\"cannot use at() with \", type_name()), this));\n        }\n    }\n\n    /// @brief access specified array element with bounds checking\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    const_reference at(size_type idx) const\n    {\n        // at only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            JSON_TRY\n            {\n                return m_data.m_value.array->at(idx);\n            }\n            JSON_CATCH (std::out_of_range&)\n            {\n                // create better exception explanation\n                JSON_THROW(out_of_range::create(401, detail::concat(\"array index \", std::to_string(idx), \" is out of range\"), this));\n            } // cppcheck-suppress[missingReturn]\n        }\n        else\n        {\n            JSON_THROW(type_error::create(304, detail::concat(\"cannot use at() with \", type_name()), this));\n        }\n    }\n\n    /// @brief access specified object element with bounds checking\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    reference at(const typename object_t::key_type& key)\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(304, detail::concat(\"cannot use at() with \", type_name()), this));\n        }\n\n        auto it = m_data.m_value.object->find(key);\n        if (it == m_data.m_value.object->end())\n        {\n            JSON_THROW(out_of_range::create(403, detail::concat(\"key '\", key, \"' not found\"), this));\n        }\n        return set_parent(it->second);\n    }\n\n    /// @brief access specified object element with bounds checking\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    reference at(KeyType && key)\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(304, detail::concat(\"cannot use at() with \", type_name()), this));\n        }\n\n        auto it = m_data.m_value.object->find(std::forward<KeyType>(key));\n        if (it == m_data.m_value.object->end())\n        {\n            JSON_THROW(out_of_range::create(403, detail::concat(\"key '\", string_t(std::forward<KeyType>(key)), \"' not found\"), this));\n        }\n        return set_parent(it->second);\n    }\n\n    /// @brief access specified object element with bounds checking\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    const_reference at(const typename object_t::key_type& key) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(304, detail::concat(\"cannot use at() with \", type_name()), this));\n        }\n\n        auto it = m_data.m_value.object->find(key);\n        if (it == m_data.m_value.object->end())\n        {\n            JSON_THROW(out_of_range::create(403, detail::concat(\"key '\", key, \"' not found\"), this));\n        }\n        return it->second;\n    }\n\n    /// @brief access specified object element with bounds checking\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    const_reference at(KeyType && key) const\n    {\n        // at only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(304, detail::concat(\"cannot use at() with \", type_name()), this));\n        }\n\n        auto it = m_data.m_value.object->find(std::forward<KeyType>(key));\n        if (it == m_data.m_value.object->end())\n        {\n            JSON_THROW(out_of_range::create(403, detail::concat(\"key '\", string_t(std::forward<KeyType>(key)), \"' not found\"), this));\n        }\n        return it->second;\n    }\n\n    /// @brief access specified array element\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    reference operator[](size_type idx)\n    {\n        // implicitly convert null value to an empty array\n        if (is_null())\n        {\n            m_data.m_type = value_t::array;\n            m_data.m_value.array = create<array_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // fill up array with null values if given idx is outside range\n            if (idx >= m_data.m_value.array->size())\n            {\n#if JSON_DIAGNOSTICS\n                // remember array size & capacity before resizing\n                const auto old_size = m_data.m_value.array->size();\n                const auto old_capacity = m_data.m_value.array->capacity();\n#endif\n                m_data.m_value.array->resize(idx + 1);\n\n#if JSON_DIAGNOSTICS\n                if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity))\n                {\n                    // capacity has changed: update all parents\n                    set_parents();\n                }\n                else\n                {\n                    // set parent for values added above\n                    set_parents(begin() + static_cast<typename iterator::difference_type>(old_size), static_cast<typename iterator::difference_type>(idx + 1 - old_size));\n                }\n#endif\n                assert_invariant();\n            }\n\n            return m_data.m_value.array->operator[](idx);\n        }\n\n        JSON_THROW(type_error::create(305, detail::concat(\"cannot use operator[] with a numeric argument with \", type_name()), this));\n    }\n\n    /// @brief access specified array element\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    const_reference operator[](size_type idx) const\n    {\n        // const operator[] only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            return m_data.m_value.array->operator[](idx);\n        }\n\n        JSON_THROW(type_error::create(305, detail::concat(\"cannot use operator[] with a numeric argument with \", type_name()), this));\n    }\n\n    /// @brief access specified object element\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    reference operator[](typename object_t::key_type key) // NOLINT(performance-unnecessary-value-param)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_data.m_type = value_t::object;\n            m_data.m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            auto result = m_data.m_value.object->emplace(std::move(key), nullptr);\n            return set_parent(result.first->second);\n        }\n\n        JSON_THROW(type_error::create(305, detail::concat(\"cannot use operator[] with a string argument with \", type_name()), this));\n    }\n\n    /// @brief access specified object element\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    const_reference operator[](const typename object_t::key_type& key) const\n    {\n        // const operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            auto it = m_data.m_value.object->find(key);\n            JSON_ASSERT(it != m_data.m_value.object->end());\n            return it->second;\n        }\n\n        JSON_THROW(type_error::create(305, detail::concat(\"cannot use operator[] with a string argument with \", type_name()), this));\n    }\n\n    // these two functions resolve a (const) char * ambiguity affecting Clang and MSVC\n    // (they seemingly cannot be constrained to resolve the ambiguity)\n    template<typename T>\n    reference operator[](T* key)\n    {\n        return operator[](typename object_t::key_type(key));\n    }\n\n    template<typename T>\n    const_reference operator[](T* key) const\n    {\n        return operator[](typename object_t::key_type(key));\n    }\n\n    /// @brief access specified object element\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int > = 0 >\n    reference operator[](KeyType && key)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_data.m_type = value_t::object;\n            m_data.m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        // operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            auto result = m_data.m_value.object->emplace(std::forward<KeyType>(key), nullptr);\n            return set_parent(result.first->second);\n        }\n\n        JSON_THROW(type_error::create(305, detail::concat(\"cannot use operator[] with a string argument with \", type_name()), this));\n    }\n\n    /// @brief access specified object element\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int > = 0 >\n    const_reference operator[](KeyType && key) const\n    {\n        // const operator[] only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            auto it = m_data.m_value.object->find(std::forward<KeyType>(key));\n            JSON_ASSERT(it != m_data.m_value.object->end());\n            return it->second;\n        }\n\n        JSON_THROW(type_error::create(305, detail::concat(\"cannot use operator[] with a string argument with \", type_name()), this));\n    }\n\n  private:\n    template<typename KeyType>\n    using is_comparable_with_object_key = detail::is_comparable <\n        object_comparator_t, const typename object_t::key_type&, KeyType >;\n\n    template<typename ValueType>\n    using value_return_type = std::conditional <\n        detail::is_c_string_uncvref<ValueType>::value,\n        string_t, typename std::decay<ValueType>::type >;\n\n  public:\n    /// @brief access specified object element with default value\n    /// @sa https://json.nlohmann.me/api/basic_json/value/\n    template < class ValueType, detail::enable_if_t <\n                   !detail::is_transparent<object_comparator_t>::value\n                   && detail::is_getable<basic_json_t, ValueType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const\n    {\n        // value only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if key is found, return value and given default value otherwise\n            const auto it = find(key);\n            if (it != end())\n            {\n                return it->template get<ValueType>();\n            }\n\n            return default_value;\n        }\n\n        JSON_THROW(type_error::create(306, detail::concat(\"cannot use value() with \", type_name()), this));\n    }\n\n    /// @brief access specified object element with default value\n    /// @sa https://json.nlohmann.me/api/basic_json/value/\n    template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,\n               detail::enable_if_t <\n                   !detail::is_transparent<object_comparator_t>::value\n                   && detail::is_getable<basic_json_t, ReturnType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    ReturnType value(const typename object_t::key_type& key, ValueType && default_value) const\n    {\n        // value only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if key is found, return value and given default value otherwise\n            const auto it = find(key);\n            if (it != end())\n            {\n                return it->template get<ReturnType>();\n            }\n\n            return std::forward<ValueType>(default_value);\n        }\n\n        JSON_THROW(type_error::create(306, detail::concat(\"cannot use value() with \", type_name()), this));\n    }\n\n    /// @brief access specified object element with default value\n    /// @sa https://json.nlohmann.me/api/basic_json/value/\n    template < class ValueType, class KeyType, detail::enable_if_t <\n                   detail::is_transparent<object_comparator_t>::value\n                   && !detail::is_json_pointer<KeyType>::value\n                   && is_comparable_with_object_key<KeyType>::value\n                   && detail::is_getable<basic_json_t, ValueType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    ValueType value(KeyType && key, const ValueType& default_value) const\n    {\n        // value only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if key is found, return value and given default value otherwise\n            const auto it = find(std::forward<KeyType>(key));\n            if (it != end())\n            {\n                return it->template get<ValueType>();\n            }\n\n            return default_value;\n        }\n\n        JSON_THROW(type_error::create(306, detail::concat(\"cannot use value() with \", type_name()), this));\n    }\n\n    /// @brief access specified object element via JSON Pointer with default value\n    /// @sa https://json.nlohmann.me/api/basic_json/value/\n    template < class ValueType, class KeyType, class ReturnType = typename value_return_type<ValueType>::type,\n               detail::enable_if_t <\n                   detail::is_transparent<object_comparator_t>::value\n                   && !detail::is_json_pointer<KeyType>::value\n                   && is_comparable_with_object_key<KeyType>::value\n                   && detail::is_getable<basic_json_t, ReturnType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    ReturnType value(KeyType && key, ValueType && default_value) const\n    {\n        // value only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if key is found, return value and given default value otherwise\n            const auto it = find(std::forward<KeyType>(key));\n            if (it != end())\n            {\n                return it->template get<ReturnType>();\n            }\n\n            return std::forward<ValueType>(default_value);\n        }\n\n        JSON_THROW(type_error::create(306, detail::concat(\"cannot use value() with \", type_name()), this));\n    }\n\n    /// @brief access specified object element via JSON Pointer with default value\n    /// @sa https://json.nlohmann.me/api/basic_json/value/\n    template < class ValueType, detail::enable_if_t <\n                   detail::is_getable<basic_json_t, ValueType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    ValueType value(const json_pointer& ptr, const ValueType& default_value) const\n    {\n        // value only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if pointer resolves a value, return it or use default value\n            JSON_TRY\n            {\n                return ptr.get_checked(this).template get<ValueType>();\n            }\n            JSON_INTERNAL_CATCH (out_of_range&)\n            {\n                return default_value;\n            }\n        }\n\n        JSON_THROW(type_error::create(306, detail::concat(\"cannot use value() with \", type_name()), this));\n    }\n\n    /// @brief access specified object element via JSON Pointer with default value\n    /// @sa https://json.nlohmann.me/api/basic_json/value/\n    template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,\n               detail::enable_if_t <\n                   detail::is_getable<basic_json_t, ReturnType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    ReturnType value(const json_pointer& ptr, ValueType && default_value) const\n    {\n        // value only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            // if pointer resolves a value, return it or use default value\n            JSON_TRY\n            {\n                return ptr.get_checked(this).template get<ReturnType>();\n            }\n            JSON_INTERNAL_CATCH (out_of_range&)\n            {\n                return std::forward<ValueType>(default_value);\n            }\n        }\n\n        JSON_THROW(type_error::create(306, detail::concat(\"cannot use value() with \", type_name()), this));\n    }\n\n    template < class ValueType, class BasicJsonType, detail::enable_if_t <\n                   detail::is_basic_json<BasicJsonType>::value\n                   && detail::is_getable<basic_json_t, ValueType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    ValueType value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, const ValueType& default_value) const\n    {\n        return value(ptr.convert(), default_value);\n    }\n\n    template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type<ValueType>::type,\n               detail::enable_if_t <\n                   detail::is_basic_json<BasicJsonType>::value\n                   && detail::is_getable<basic_json_t, ReturnType>::value\n                   && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    ReturnType value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, ValueType && default_value) const\n    {\n        return value(ptr.convert(), std::forward<ValueType>(default_value));\n    }\n\n    /// @brief access the first element\n    /// @sa https://json.nlohmann.me/api/basic_json/front/\n    reference front()\n    {\n        return *begin();\n    }\n\n    /// @brief access the first element\n    /// @sa https://json.nlohmann.me/api/basic_json/front/\n    const_reference front() const\n    {\n        return *cbegin();\n    }\n\n    /// @brief access the last element\n    /// @sa https://json.nlohmann.me/api/basic_json/back/\n    reference back()\n    {\n        auto tmp = end();\n        --tmp;\n        return *tmp;\n    }\n\n    /// @brief access the last element\n    /// @sa https://json.nlohmann.me/api/basic_json/back/\n    const_reference back() const\n    {\n        auto tmp = cend();\n        --tmp;\n        return *tmp;\n    }\n\n    /// @brief remove element given an iterator\n    /// @sa https://json.nlohmann.me/api/basic_json/erase/\n    template < class IteratorType, detail::enable_if_t <\n                   std::is_same<IteratorType, typename basic_json_t::iterator>::value ||\n                   std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 >\n    IteratorType erase(IteratorType pos) // NOLINT(performance-unnecessary-value-param)\n    {\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(this != pos.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\", this));\n        }\n\n        IteratorType result = end();\n\n        switch (m_data.m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            case value_t::binary:\n            {\n                if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin()))\n                {\n                    JSON_THROW(invalid_iterator::create(205, \"iterator out of range\", this));\n                }\n\n                if (is_string())\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1);\n                    m_data.m_value.string = nullptr;\n                }\n                else if (is_binary())\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1);\n                    m_data.m_value.binary = nullptr;\n                }\n\n                m_data.m_type = value_t::null;\n                assert_invariant();\n                break;\n            }\n\n            case value_t::object:\n            {\n                result.m_it.object_iterator = m_data.m_value.object->erase(pos.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                result.m_it.array_iterator = m_data.m_value.array->erase(pos.m_it.array_iterator);\n                break;\n            }\n\n            case value_t::null:\n            case value_t::discarded:\n            default:\n                JSON_THROW(type_error::create(307, detail::concat(\"cannot use erase() with \", type_name()), this));\n        }\n\n        return result;\n    }\n\n    /// @brief remove elements given an iterator range\n    /// @sa https://json.nlohmann.me/api/basic_json/erase/\n    template < class IteratorType, detail::enable_if_t <\n                   std::is_same<IteratorType, typename basic_json_t::iterator>::value ||\n                   std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 >\n    IteratorType erase(IteratorType first, IteratorType last) // NOLINT(performance-unnecessary-value-param)\n    {\n        // make sure iterator fits the current value\n        if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(203, \"iterators do not fit current value\", this));\n        }\n\n        IteratorType result = end();\n\n        switch (m_data.m_type)\n        {\n            case value_t::boolean:\n            case value_t::number_float:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::string:\n            case value_t::binary:\n            {\n                if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin()\n                                       || !last.m_it.primitive_iterator.is_end()))\n                {\n                    JSON_THROW(invalid_iterator::create(204, \"iterators out of range\", this));\n                }\n\n                if (is_string())\n                {\n                    AllocatorType<string_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1);\n                    m_data.m_value.string = nullptr;\n                }\n                else if (is_binary())\n                {\n                    AllocatorType<binary_t> alloc;\n                    std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary);\n                    std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1);\n                    m_data.m_value.binary = nullptr;\n                }\n\n                m_data.m_type = value_t::null;\n                assert_invariant();\n                break;\n            }\n\n            case value_t::object:\n            {\n                result.m_it.object_iterator = m_data.m_value.object->erase(first.m_it.object_iterator,\n                                              last.m_it.object_iterator);\n                break;\n            }\n\n            case value_t::array:\n            {\n                result.m_it.array_iterator = m_data.m_value.array->erase(first.m_it.array_iterator,\n                                             last.m_it.array_iterator);\n                break;\n            }\n\n            case value_t::null:\n            case value_t::discarded:\n            default:\n                JSON_THROW(type_error::create(307, detail::concat(\"cannot use erase() with \", type_name()), this));\n        }\n\n        return result;\n    }\n\n  private:\n    template < typename KeyType, detail::enable_if_t <\n                   detail::has_erase_with_key_type<basic_json_t, KeyType>::value, int > = 0 >\n    size_type erase_internal(KeyType && key)\n    {\n        // this erase only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(307, detail::concat(\"cannot use erase() with \", type_name()), this));\n        }\n\n        return m_data.m_value.object->erase(std::forward<KeyType>(key));\n    }\n\n    template < typename KeyType, detail::enable_if_t <\n                   !detail::has_erase_with_key_type<basic_json_t, KeyType>::value, int > = 0 >\n    size_type erase_internal(KeyType && key)\n    {\n        // this erase only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(307, detail::concat(\"cannot use erase() with \", type_name()), this));\n        }\n\n        const auto it = m_data.m_value.object->find(std::forward<KeyType>(key));\n        if (it != m_data.m_value.object->end())\n        {\n            m_data.m_value.object->erase(it);\n            return 1;\n        }\n        return 0;\n    }\n\n  public:\n\n    /// @brief remove element from a JSON object given a key\n    /// @sa https://json.nlohmann.me/api/basic_json/erase/\n    size_type erase(const typename object_t::key_type& key)\n    {\n        // the indirection via erase_internal() is added to avoid making this\n        // function a template and thus de-rank it during overload resolution\n        return erase_internal(key);\n    }\n\n    /// @brief remove element from a JSON object given a key\n    /// @sa https://json.nlohmann.me/api/basic_json/erase/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    size_type erase(KeyType && key)\n    {\n        return erase_internal(std::forward<KeyType>(key));\n    }\n\n    /// @brief remove element from a JSON array given an index\n    /// @sa https://json.nlohmann.me/api/basic_json/erase/\n    void erase(const size_type idx)\n    {\n        // this erase only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            if (JSON_HEDLEY_UNLIKELY(idx >= size()))\n            {\n                JSON_THROW(out_of_range::create(401, detail::concat(\"array index \", std::to_string(idx), \" is out of range\"), this));\n            }\n\n            m_data.m_value.array->erase(m_data.m_value.array->begin() + static_cast<difference_type>(idx));\n        }\n        else\n        {\n            JSON_THROW(type_error::create(307, detail::concat(\"cannot use erase() with \", type_name()), this));\n        }\n    }\n\n    /// @}\n\n    ////////////\n    // lookup //\n    ////////////\n\n    /// @name lookup\n    /// @{\n\n    /// @brief find an element in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/find/\n    iterator find(const typename object_t::key_type& key)\n    {\n        auto result = end();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_data.m_value.object->find(key);\n        }\n\n        return result;\n    }\n\n    /// @brief find an element in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/find/\n    const_iterator find(const typename object_t::key_type& key) const\n    {\n        auto result = cend();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_data.m_value.object->find(key);\n        }\n\n        return result;\n    }\n\n    /// @brief find an element in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/find/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    iterator find(KeyType && key)\n    {\n        auto result = end();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key));\n        }\n\n        return result;\n    }\n\n    /// @brief find an element in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/find/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    const_iterator find(KeyType && key) const\n    {\n        auto result = cend();\n\n        if (is_object())\n        {\n            result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key));\n        }\n\n        return result;\n    }\n\n    /// @brief returns the number of occurrences of a key in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/count/\n    size_type count(const typename object_t::key_type& key) const\n    {\n        // return 0 for all nonobject types\n        return is_object() ? m_data.m_value.object->count(key) : 0;\n    }\n\n    /// @brief returns the number of occurrences of a key in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/count/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    size_type count(KeyType && key) const\n    {\n        // return 0 for all nonobject types\n        return is_object() ? m_data.m_value.object->count(std::forward<KeyType>(key)) : 0;\n    }\n\n    /// @brief check the existence of an element in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/contains/\n    bool contains(const typename object_t::key_type& key) const\n    {\n        return is_object() && m_data.m_value.object->find(key) != m_data.m_value.object->end();\n    }\n\n    /// @brief check the existence of an element in a JSON object\n    /// @sa https://json.nlohmann.me/api/basic_json/contains/\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>\n    bool contains(KeyType && key) const\n    {\n        return is_object() && m_data.m_value.object->find(std::forward<KeyType>(key)) != m_data.m_value.object->end();\n    }\n\n    /// @brief check the existence of an element in a JSON object given a JSON pointer\n    /// @sa https://json.nlohmann.me/api/basic_json/contains/\n    bool contains(const json_pointer& ptr) const\n    {\n        return ptr.contains(this);\n    }\n\n    template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    bool contains(const typename ::nlohmann::json_pointer<BasicJsonType>& ptr) const\n    {\n        return ptr.contains(this);\n    }\n\n    /// @}\n\n    ///////////////\n    // iterators //\n    ///////////////\n\n    /// @name iterators\n    /// @{\n\n    /// @brief returns an iterator to the first element\n    /// @sa https://json.nlohmann.me/api/basic_json/begin/\n    iterator begin() noexcept\n    {\n        iterator result(this);\n        result.set_begin();\n        return result;\n    }\n\n    /// @brief returns an iterator to the first element\n    /// @sa https://json.nlohmann.me/api/basic_json/begin/\n    const_iterator begin() const noexcept\n    {\n        return cbegin();\n    }\n\n    /// @brief returns a const iterator to the first element\n    /// @sa https://json.nlohmann.me/api/basic_json/cbegin/\n    const_iterator cbegin() const noexcept\n    {\n        const_iterator result(this);\n        result.set_begin();\n        return result;\n    }\n\n    /// @brief returns an iterator to one past the last element\n    /// @sa https://json.nlohmann.me/api/basic_json/end/\n    iterator end() noexcept\n    {\n        iterator result(this);\n        result.set_end();\n        return result;\n    }\n\n    /// @brief returns an iterator to one past the last element\n    /// @sa https://json.nlohmann.me/api/basic_json/end/\n    const_iterator end() const noexcept\n    {\n        return cend();\n    }\n\n    /// @brief returns an iterator to one past the last element\n    /// @sa https://json.nlohmann.me/api/basic_json/cend/\n    const_iterator cend() const noexcept\n    {\n        const_iterator result(this);\n        result.set_end();\n        return result;\n    }\n\n    /// @brief returns an iterator to the reverse-beginning\n    /// @sa https://json.nlohmann.me/api/basic_json/rbegin/\n    reverse_iterator rbegin() noexcept\n    {\n        return reverse_iterator(end());\n    }\n\n    /// @brief returns an iterator to the reverse-beginning\n    /// @sa https://json.nlohmann.me/api/basic_json/rbegin/\n    const_reverse_iterator rbegin() const noexcept\n    {\n        return crbegin();\n    }\n\n    /// @brief returns an iterator to the reverse-end\n    /// @sa https://json.nlohmann.me/api/basic_json/rend/\n    reverse_iterator rend() noexcept\n    {\n        return reverse_iterator(begin());\n    }\n\n    /// @brief returns an iterator to the reverse-end\n    /// @sa https://json.nlohmann.me/api/basic_json/rend/\n    const_reverse_iterator rend() const noexcept\n    {\n        return crend();\n    }\n\n    /// @brief returns a const reverse iterator to the last element\n    /// @sa https://json.nlohmann.me/api/basic_json/crbegin/\n    const_reverse_iterator crbegin() const noexcept\n    {\n        return const_reverse_iterator(cend());\n    }\n\n    /// @brief returns a const reverse iterator to one before the first\n    /// @sa https://json.nlohmann.me/api/basic_json/crend/\n    const_reverse_iterator crend() const noexcept\n    {\n        return const_reverse_iterator(cbegin());\n    }\n\n  public:\n    /// @brief wrapper to access iterator member functions in range-based for\n    /// @sa https://json.nlohmann.me/api/basic_json/items/\n    /// @deprecated This function is deprecated since 3.1.0 and will be removed in\n    ///             version 4.0.0 of the library. Please use @ref items() instead;\n    ///             that is, replace `json::iterator_wrapper(j)` with `j.items()`.\n    JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())\n    static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept\n    {\n        return ref.items();\n    }\n\n    /// @brief wrapper to access iterator member functions in range-based for\n    /// @sa https://json.nlohmann.me/api/basic_json/items/\n    /// @deprecated This function is deprecated since 3.1.0 and will be removed in\n    ///         version 4.0.0 of the library. Please use @ref items() instead;\n    ///         that is, replace `json::iterator_wrapper(j)` with `j.items()`.\n    JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())\n    static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept\n    {\n        return ref.items();\n    }\n\n    /// @brief helper to access iterator member functions in range-based for\n    /// @sa https://json.nlohmann.me/api/basic_json/items/\n    iteration_proxy<iterator> items() noexcept\n    {\n        return iteration_proxy<iterator>(*this);\n    }\n\n    /// @brief helper to access iterator member functions in range-based for\n    /// @sa https://json.nlohmann.me/api/basic_json/items/\n    iteration_proxy<const_iterator> items() const noexcept\n    {\n        return iteration_proxy<const_iterator>(*this);\n    }\n\n    /// @}\n\n    //////////////\n    // capacity //\n    //////////////\n\n    /// @name capacity\n    /// @{\n\n    /// @brief checks whether the container is empty.\n    /// @sa https://json.nlohmann.me/api/basic_json/empty/\n    bool empty() const noexcept\n    {\n        switch (m_data.m_type)\n        {\n            case value_t::null:\n            {\n                // null values are empty\n                return true;\n            }\n\n            case value_t::array:\n            {\n                // delegate call to array_t::empty()\n                return m_data.m_value.array->empty();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::empty()\n                return m_data.m_value.object->empty();\n            }\n\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                // all other types are nonempty\n                return false;\n            }\n        }\n    }\n\n    /// @brief returns the number of elements\n    /// @sa https://json.nlohmann.me/api/basic_json/size/\n    size_type size() const noexcept\n    {\n        switch (m_data.m_type)\n        {\n            case value_t::null:\n            {\n                // null values are empty\n                return 0;\n            }\n\n            case value_t::array:\n            {\n                // delegate call to array_t::size()\n                return m_data.m_value.array->size();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::size()\n                return m_data.m_value.object->size();\n            }\n\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                // all other types have size 1\n                return 1;\n            }\n        }\n    }\n\n    /// @brief returns the maximum possible number of elements\n    /// @sa https://json.nlohmann.me/api/basic_json/max_size/\n    size_type max_size() const noexcept\n    {\n        switch (m_data.m_type)\n        {\n            case value_t::array:\n            {\n                // delegate call to array_t::max_size()\n                return m_data.m_value.array->max_size();\n            }\n\n            case value_t::object:\n            {\n                // delegate call to object_t::max_size()\n                return m_data.m_value.object->max_size();\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                // all other types have max_size() == size()\n                return size();\n            }\n        }\n    }\n\n    /// @}\n\n    ///////////////\n    // modifiers //\n    ///////////////\n\n    /// @name modifiers\n    /// @{\n\n    /// @brief clears the contents\n    /// @sa https://json.nlohmann.me/api/basic_json/clear/\n    void clear() noexcept\n    {\n        switch (m_data.m_type)\n        {\n            case value_t::number_integer:\n            {\n                m_data.m_value.number_integer = 0;\n                break;\n            }\n\n            case value_t::number_unsigned:\n            {\n                m_data.m_value.number_unsigned = 0;\n                break;\n            }\n\n            case value_t::number_float:\n            {\n                m_data.m_value.number_float = 0.0;\n                break;\n            }\n\n            case value_t::boolean:\n            {\n                m_data.m_value.boolean = false;\n                break;\n            }\n\n            case value_t::string:\n            {\n                m_data.m_value.string->clear();\n                break;\n            }\n\n            case value_t::binary:\n            {\n                m_data.m_value.binary->clear();\n                break;\n            }\n\n            case value_t::array:\n            {\n                m_data.m_value.array->clear();\n                break;\n            }\n\n            case value_t::object:\n            {\n                m_data.m_value.object->clear();\n                break;\n            }\n\n            case value_t::null:\n            case value_t::discarded:\n            default:\n                break;\n        }\n    }\n\n    /// @brief add an object to an array\n    /// @sa https://json.nlohmann.me/api/basic_json/push_back/\n    void push_back(basic_json&& val)\n    {\n        // push_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(308, detail::concat(\"cannot use push_back() with \", type_name()), this));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_data.m_type = value_t::array;\n            m_data.m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array (move semantics)\n        const auto old_capacity = m_data.m_value.array->capacity();\n        m_data.m_value.array->push_back(std::move(val));\n        set_parent(m_data.m_value.array->back(), old_capacity);\n        // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor\n    }\n\n    /// @brief add an object to an array\n    /// @sa https://json.nlohmann.me/api/basic_json/operator+=/\n    reference operator+=(basic_json&& val)\n    {\n        push_back(std::move(val));\n        return *this;\n    }\n\n    /// @brief add an object to an array\n    /// @sa https://json.nlohmann.me/api/basic_json/push_back/\n    void push_back(const basic_json& val)\n    {\n        // push_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(308, detail::concat(\"cannot use push_back() with \", type_name()), this));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_data.m_type = value_t::array;\n            m_data.m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array\n        const auto old_capacity = m_data.m_value.array->capacity();\n        m_data.m_value.array->push_back(val);\n        set_parent(m_data.m_value.array->back(), old_capacity);\n    }\n\n    /// @brief add an object to an array\n    /// @sa https://json.nlohmann.me/api/basic_json/operator+=/\n    reference operator+=(const basic_json& val)\n    {\n        push_back(val);\n        return *this;\n    }\n\n    /// @brief add an object to an object\n    /// @sa https://json.nlohmann.me/api/basic_json/push_back/\n    void push_back(const typename object_t::value_type& val)\n    {\n        // push_back only works for null objects or objects\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))\n        {\n            JSON_THROW(type_error::create(308, detail::concat(\"cannot use push_back() with \", type_name()), this));\n        }\n\n        // transform null object into an object\n        if (is_null())\n        {\n            m_data.m_type = value_t::object;\n            m_data.m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // add element to object\n        auto res = m_data.m_value.object->insert(val);\n        set_parent(res.first->second);\n    }\n\n    /// @brief add an object to an object\n    /// @sa https://json.nlohmann.me/api/basic_json/operator+=/\n    reference operator+=(const typename object_t::value_type& val)\n    {\n        push_back(val);\n        return *this;\n    }\n\n    /// @brief add an object to an object\n    /// @sa https://json.nlohmann.me/api/basic_json/push_back/\n    void push_back(initializer_list_t init)\n    {\n        if (is_object() && init.size() == 2 && (*init.begin())->is_string())\n        {\n            basic_json&& key = init.begin()->moved_or_copied();\n            push_back(typename object_t::value_type(\n                          std::move(key.get_ref<string_t&>()), (init.begin() + 1)->moved_or_copied()));\n        }\n        else\n        {\n            push_back(basic_json(init));\n        }\n    }\n\n    /// @brief add an object to an object\n    /// @sa https://json.nlohmann.me/api/basic_json/operator+=/\n    reference operator+=(initializer_list_t init)\n    {\n        push_back(init);\n        return *this;\n    }\n\n    /// @brief add an object to an array\n    /// @sa https://json.nlohmann.me/api/basic_json/emplace_back/\n    template<class... Args>\n    reference emplace_back(Args&& ... args)\n    {\n        // emplace_back only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))\n        {\n            JSON_THROW(type_error::create(311, detail::concat(\"cannot use emplace_back() with \", type_name()), this));\n        }\n\n        // transform null object into an array\n        if (is_null())\n        {\n            m_data.m_type = value_t::array;\n            m_data.m_value = value_t::array;\n            assert_invariant();\n        }\n\n        // add element to array (perfect forwarding)\n        const auto old_capacity = m_data.m_value.array->capacity();\n        m_data.m_value.array->emplace_back(std::forward<Args>(args)...);\n        return set_parent(m_data.m_value.array->back(), old_capacity);\n    }\n\n    /// @brief add an object to an object if key does not exist\n    /// @sa https://json.nlohmann.me/api/basic_json/emplace/\n    template<class... Args>\n    std::pair<iterator, bool> emplace(Args&& ... args)\n    {\n        // emplace only works for null objects or arrays\n        if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))\n        {\n            JSON_THROW(type_error::create(311, detail::concat(\"cannot use emplace() with \", type_name()), this));\n        }\n\n        // transform null object into an object\n        if (is_null())\n        {\n            m_data.m_type = value_t::object;\n            m_data.m_value = value_t::object;\n            assert_invariant();\n        }\n\n        // add element to array (perfect forwarding)\n        auto res = m_data.m_value.object->emplace(std::forward<Args>(args)...);\n        set_parent(res.first->second);\n\n        // create result iterator and set iterator to the result of emplace\n        auto it = begin();\n        it.m_it.object_iterator = res.first;\n\n        // return pair of iterator and boolean\n        return {it, res.second};\n    }\n\n    /// Helper for insertion of an iterator\n    /// @note: This uses std::distance to support GCC 4.8,\n    ///        see https://github.com/nlohmann/json/pull/1257\n    template<typename... Args>\n    iterator insert_iterator(const_iterator pos, Args&& ... args) // NOLINT(performance-unnecessary-value-param)\n    {\n        iterator result(this);\n        JSON_ASSERT(m_data.m_value.array != nullptr);\n\n        auto insert_pos = std::distance(m_data.m_value.array->begin(), pos.m_it.array_iterator);\n        m_data.m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);\n        result.m_it.array_iterator = m_data.m_value.array->begin() + insert_pos;\n\n        // This could have been written as:\n        // result.m_it.array_iterator = m_data.m_value.array->insert(pos.m_it.array_iterator, cnt, val);\n        // but the return value of insert is missing in GCC 4.8, so it is written this way instead.\n\n        set_parents();\n        return result;\n    }\n\n    /// @brief inserts element into array\n    /// @sa https://json.nlohmann.me/api/basic_json/insert/\n    iterator insert(const_iterator pos, const basic_json& val) // NOLINT(performance-unnecessary-value-param)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // check if iterator pos fits to this JSON value\n            if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n            {\n                JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\", this));\n            }\n\n            // insert to array and return iterator\n            return insert_iterator(pos, val);\n        }\n\n        JSON_THROW(type_error::create(309, detail::concat(\"cannot use insert() with \", type_name()), this));\n    }\n\n    /// @brief inserts element into array\n    /// @sa https://json.nlohmann.me/api/basic_json/insert/\n    iterator insert(const_iterator pos, basic_json&& val) // NOLINT(performance-unnecessary-value-param)\n    {\n        return insert(pos, val);\n    }\n\n    /// @brief inserts copies of element into array\n    /// @sa https://json.nlohmann.me/api/basic_json/insert/\n    iterator insert(const_iterator pos, size_type cnt, const basic_json& val) // NOLINT(performance-unnecessary-value-param)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            // check if iterator pos fits to this JSON value\n            if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n            {\n                JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\", this));\n            }\n\n            // insert to array and return iterator\n            return insert_iterator(pos, cnt, val);\n        }\n\n        JSON_THROW(type_error::create(309, detail::concat(\"cannot use insert() with \", type_name()), this));\n    }\n\n    /// @brief inserts range of elements into array\n    /// @sa https://json.nlohmann.me/api/basic_json/insert/\n    iterator insert(const_iterator pos, const_iterator first, const_iterator last) // NOLINT(performance-unnecessary-value-param)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_UNLIKELY(!is_array()))\n        {\n            JSON_THROW(type_error::create(309, detail::concat(\"cannot use insert() with \", type_name()), this));\n        }\n\n        // check if iterator pos fits to this JSON value\n        if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\", this));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\", this));\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(first.m_object == this))\n        {\n            JSON_THROW(invalid_iterator::create(211, \"passed iterators may not belong to container\", this));\n        }\n\n        // insert to array and return iterator\n        return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);\n    }\n\n    /// @brief inserts elements from initializer list into array\n    /// @sa https://json.nlohmann.me/api/basic_json/insert/\n    iterator insert(const_iterator pos, initializer_list_t ilist) // NOLINT(performance-unnecessary-value-param)\n    {\n        // insert only works for arrays\n        if (JSON_HEDLEY_UNLIKELY(!is_array()))\n        {\n            JSON_THROW(type_error::create(309, detail::concat(\"cannot use insert() with \", type_name()), this));\n        }\n\n        // check if iterator pos fits to this JSON value\n        if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterator does not fit current value\", this));\n        }\n\n        // insert to array and return iterator\n        return insert_iterator(pos, ilist.begin(), ilist.end());\n    }\n\n    /// @brief inserts range of elements into object\n    /// @sa https://json.nlohmann.me/api/basic_json/insert/\n    void insert(const_iterator first, const_iterator last) // NOLINT(performance-unnecessary-value-param)\n    {\n        // insert only works for objects\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(309, detail::concat(\"cannot use insert() with \", type_name()), this));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\", this));\n        }\n\n        // passed iterators must belong to objects\n        if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()))\n        {\n            JSON_THROW(invalid_iterator::create(202, \"iterators first and last must point to objects\", this));\n        }\n\n        m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);\n        set_parents();\n    }\n\n    /// @brief updates a JSON object from another object, overwriting existing keys\n    /// @sa https://json.nlohmann.me/api/basic_json/update/\n    void update(const_reference j, bool merge_objects = false)\n    {\n        update(j.begin(), j.end(), merge_objects);\n    }\n\n    /// @brief updates a JSON object from another object, overwriting existing keys\n    /// @sa https://json.nlohmann.me/api/basic_json/update/\n    void update(const_iterator first, const_iterator last, bool merge_objects = false) // NOLINT(performance-unnecessary-value-param)\n    {\n        // implicitly convert null value to an empty object\n        if (is_null())\n        {\n            m_data.m_type = value_t::object;\n            m_data.m_value.object = create<object_t>();\n            assert_invariant();\n        }\n\n        if (JSON_HEDLEY_UNLIKELY(!is_object()))\n        {\n            JSON_THROW(type_error::create(312, detail::concat(\"cannot use update() with \", type_name()), this));\n        }\n\n        // check if range iterators belong to the same JSON object\n        if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))\n        {\n            JSON_THROW(invalid_iterator::create(210, \"iterators do not fit\", this));\n        }\n\n        // passed iterators must belong to objects\n        if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()))\n        {\n            JSON_THROW(type_error::create(312, detail::concat(\"cannot use update() with \", first.m_object->type_name()), first.m_object));\n        }\n\n        for (auto it = first; it != last; ++it)\n        {\n            if (merge_objects && it.value().is_object())\n            {\n                auto it2 = m_data.m_value.object->find(it.key());\n                if (it2 != m_data.m_value.object->end())\n                {\n                    it2->second.update(it.value(), true);\n                    continue;\n                }\n            }\n            m_data.m_value.object->operator[](it.key()) = it.value();\n#if JSON_DIAGNOSTICS\n            m_data.m_value.object->operator[](it.key()).m_parent = this;\n#endif\n        }\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    void swap(reference other) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        std::swap(m_data.m_type, other.m_data.m_type);\n        std::swap(m_data.m_value, other.m_data.m_value);\n\n        set_parents();\n        other.set_parents();\n        assert_invariant();\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    friend void swap(reference left, reference right) noexcept (\n        std::is_nothrow_move_constructible<value_t>::value&&\n        std::is_nothrow_move_assignable<value_t>::value&&\n        std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n        std::is_nothrow_move_assignable<json_value>::value\n    )\n    {\n        left.swap(right);\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    void swap(array_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n    {\n        // swap only works for arrays\n        if (JSON_HEDLEY_LIKELY(is_array()))\n        {\n            using std::swap;\n            swap(*(m_data.m_value.array), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, detail::concat(\"cannot use swap(array_t&) with \", type_name()), this));\n        }\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    void swap(object_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n    {\n        // swap only works for objects\n        if (JSON_HEDLEY_LIKELY(is_object()))\n        {\n            using std::swap;\n            swap(*(m_data.m_value.object), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, detail::concat(\"cannot use swap(object_t&) with \", type_name()), this));\n        }\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    void swap(string_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_string()))\n        {\n            using std::swap;\n            swap(*(m_data.m_value.string), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, detail::concat(\"cannot use swap(string_t&) with \", type_name()), this));\n        }\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    void swap(binary_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_binary()))\n        {\n            using std::swap;\n            swap(*(m_data.m_value.binary), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, detail::concat(\"cannot use swap(binary_t&) with \", type_name()), this));\n        }\n    }\n\n    /// @brief exchanges the values\n    /// @sa https://json.nlohmann.me/api/basic_json/swap/\n    void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape)\n    {\n        // swap only works for strings\n        if (JSON_HEDLEY_LIKELY(is_binary()))\n        {\n            using std::swap;\n            swap(*(m_data.m_value.binary), other);\n        }\n        else\n        {\n            JSON_THROW(type_error::create(310, detail::concat(\"cannot use swap(binary_t::container_type&) with \", type_name()), this));\n        }\n    }\n\n    /// @}\n\n    //////////////////////////////////////////\n    // lexicographical comparison operators //\n    //////////////////////////////////////////\n\n    /// @name lexicographical comparison operators\n    /// @{\n\n    // note parentheses around operands are necessary; see\n    // https://github.com/nlohmann/json/issues/1530\n#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result)                       \\\n    const auto lhs_type = lhs.type();                                                                    \\\n    const auto rhs_type = rhs.type();                                                                    \\\n    \\\n    if (lhs_type == rhs_type) /* NOLINT(readability/braces) */                                           \\\n    {                                                                                                    \\\n        switch (lhs_type)                                                                                \\\n        {                                                                                                \\\n            case value_t::array:                                                                         \\\n                return (*lhs.m_data.m_value.array) op (*rhs.m_data.m_value.array);                                     \\\n                \\\n            case value_t::object:                                                                        \\\n                return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object);                                   \\\n                \\\n            case value_t::null:                                                                          \\\n                return (null_result);                                                                    \\\n                \\\n            case value_t::string:                                                                        \\\n                return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string);                                   \\\n                \\\n            case value_t::boolean:                                                                       \\\n                return (lhs.m_data.m_value.boolean) op (rhs.m_data.m_value.boolean);                                   \\\n                \\\n            case value_t::number_integer:                                                                \\\n                return (lhs.m_data.m_value.number_integer) op (rhs.m_data.m_value.number_integer);                     \\\n                \\\n            case value_t::number_unsigned:                                                               \\\n                return (lhs.m_data.m_value.number_unsigned) op (rhs.m_data.m_value.number_unsigned);                   \\\n                \\\n            case value_t::number_float:                                                                  \\\n                return (lhs.m_data.m_value.number_float) op (rhs.m_data.m_value.number_float);                         \\\n                \\\n            case value_t::binary:                                                                        \\\n                return (*lhs.m_data.m_value.binary) op (*rhs.m_data.m_value.binary);                                   \\\n                \\\n            case value_t::discarded:                                                                     \\\n            default:                                                                                     \\\n                return (unordered_result);                                                               \\\n        }                                                                                                \\\n    }                                                                                                    \\\n    else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)                   \\\n    {                                                                                                    \\\n        return static_cast<number_float_t>(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_float;      \\\n    }                                                                                                    \\\n    else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)                   \\\n    {                                                                                                    \\\n        return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_integer);      \\\n    }                                                                                                    \\\n    else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)                  \\\n    {                                                                                                    \\\n        return static_cast<number_float_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_float;     \\\n    }                                                                                                    \\\n    else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)                  \\\n    {                                                                                                    \\\n        return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_unsigned);     \\\n    }                                                                                                    \\\n    else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)                \\\n    {                                                                                                    \\\n        return static_cast<number_integer_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_integer; \\\n    }                                                                                                    \\\n    else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)                \\\n    {                                                                                                    \\\n        return lhs.m_data.m_value.number_integer op static_cast<number_integer_t>(rhs.m_data.m_value.number_unsigned); \\\n    }                                                                                                    \\\n    else if(compares_unordered(lhs, rhs))\\\n    {\\\n        return (unordered_result);\\\n    }\\\n    \\\n    return (default_result);\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    // returns true if:\n    // - any operand is NaN and the other operand is of number type\n    // - any operand is discarded\n    // in legacy mode, discarded values are considered ordered if\n    // an operation is computed as an odd number of inverses of others\n    static bool compares_unordered(const_reference lhs, const_reference rhs, bool inverse = false) noexcept\n    {\n        if ((lhs.is_number_float() && std::isnan(lhs.m_data.m_value.number_float) && rhs.is_number())\n                || (rhs.is_number_float() && std::isnan(rhs.m_data.m_value.number_float) && lhs.is_number()))\n        {\n            return true;\n        }\n#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON\n        return (lhs.is_discarded() || rhs.is_discarded()) && !inverse;\n#else\n        static_cast<void>(inverse);\n        return lhs.is_discarded() || rhs.is_discarded();\n#endif\n    }\n\n  private:\n    bool compares_unordered(const_reference rhs, bool inverse = false) const noexcept\n    {\n        return compares_unordered(*this, rhs, inverse);\n    }\n\n  public:\n#if JSON_HAS_THREE_WAY_COMPARISON\n    /// @brief comparison: equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/\n    bool operator==(const_reference rhs) const noexcept\n    {\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n        const_reference lhs = *this;\n        JSON_IMPLEMENT_OPERATOR( ==, true, false, false)\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n    }\n\n    /// @brief comparison: equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/\n    template<typename ScalarType>\n    requires std::is_scalar_v<ScalarType>\n    bool operator==(ScalarType rhs) const noexcept\n    {\n        return *this == basic_json(rhs);\n    }\n\n    /// @brief comparison: not equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/\n    bool operator!=(const_reference rhs) const noexcept\n    {\n        if (compares_unordered(rhs, true))\n        {\n            return false;\n        }\n        return !operator==(rhs);\n    }\n\n    /// @brief comparison: 3-way\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_spaceship/\n    std::partial_ordering operator<=>(const_reference rhs) const noexcept // *NOPAD*\n    {\n        const_reference lhs = *this;\n        // default_result is used if we cannot compare values. In that case,\n        // we compare types.\n        JSON_IMPLEMENT_OPERATOR(<=>, // *NOPAD*\n                                std::partial_ordering::equivalent,\n                                std::partial_ordering::unordered,\n                                lhs_type <=> rhs_type) // *NOPAD*\n    }\n\n    /// @brief comparison: 3-way\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_spaceship/\n    template<typename ScalarType>\n    requires std::is_scalar_v<ScalarType>\n    std::partial_ordering operator<=>(ScalarType rhs) const noexcept // *NOPAD*\n    {\n        return *this <=> basic_json(rhs); // *NOPAD*\n    }\n\n#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON\n    // all operators that are computed as an odd number of inverses of others\n    // need to be overloaded to emulate the legacy comparison behavior\n\n    /// @brief comparison: less than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_le/\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON)\n    bool operator<=(const_reference rhs) const noexcept\n    {\n        if (compares_unordered(rhs, true))\n        {\n            return false;\n        }\n        return !(rhs < *this);\n    }\n\n    /// @brief comparison: less than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_le/\n    template<typename ScalarType>\n    requires std::is_scalar_v<ScalarType>\n    bool operator<=(ScalarType rhs) const noexcept\n    {\n        return *this <= basic_json(rhs);\n    }\n\n    /// @brief comparison: greater than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON)\n    bool operator>=(const_reference rhs) const noexcept\n    {\n        if (compares_unordered(rhs, true))\n        {\n            return false;\n        }\n        return !(*this < rhs);\n    }\n\n    /// @brief comparison: greater than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/\n    template<typename ScalarType>\n    requires std::is_scalar_v<ScalarType>\n    bool operator>=(ScalarType rhs) const noexcept\n    {\n        return *this >= basic_json(rhs);\n    }\n#endif\n#else\n    /// @brief comparison: equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/\n    friend bool operator==(const_reference lhs, const_reference rhs) noexcept\n    {\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wfloat-equal\"\n#endif\n        JSON_IMPLEMENT_OPERATOR( ==, true, false, false)\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n    }\n\n    /// @brief comparison: equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator==(const_reference lhs, ScalarType rhs) noexcept\n    {\n        return lhs == basic_json(rhs);\n    }\n\n    /// @brief comparison: equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator==(ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) == rhs;\n    }\n\n    /// @brief comparison: not equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/\n    friend bool operator!=(const_reference lhs, const_reference rhs) noexcept\n    {\n        if (compares_unordered(lhs, rhs, true))\n        {\n            return false;\n        }\n        return !(lhs == rhs);\n    }\n\n    /// @brief comparison: not equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept\n    {\n        return lhs != basic_json(rhs);\n    }\n\n    /// @brief comparison: not equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) != rhs;\n    }\n\n    /// @brief comparison: less than\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/\n    friend bool operator<(const_reference lhs, const_reference rhs) noexcept\n    {\n        // default_result is used if we cannot compare values. In that case,\n        // we compare types. Note we have to call the operator explicitly,\n        // because MSVC has problems otherwise.\n        JSON_IMPLEMENT_OPERATOR( <, false, false, operator<(lhs_type, rhs_type))\n    }\n\n    /// @brief comparison: less than\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<(const_reference lhs, ScalarType rhs) noexcept\n    {\n        return lhs < basic_json(rhs);\n    }\n\n    /// @brief comparison: less than\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<(ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) < rhs;\n    }\n\n    /// @brief comparison: less than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_le/\n    friend bool operator<=(const_reference lhs, const_reference rhs) noexcept\n    {\n        if (compares_unordered(lhs, rhs, true))\n        {\n            return false;\n        }\n        return !(rhs < lhs);\n    }\n\n    /// @brief comparison: less than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_le/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept\n    {\n        return lhs <= basic_json(rhs);\n    }\n\n    /// @brief comparison: less than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_le/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) <= rhs;\n    }\n\n    /// @brief comparison: greater than\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/\n    friend bool operator>(const_reference lhs, const_reference rhs) noexcept\n    {\n        // double inverse\n        if (compares_unordered(lhs, rhs))\n        {\n            return false;\n        }\n        return !(lhs <= rhs);\n    }\n\n    /// @brief comparison: greater than\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>(const_reference lhs, ScalarType rhs) noexcept\n    {\n        return lhs > basic_json(rhs);\n    }\n\n    /// @brief comparison: greater than\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>(ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) > rhs;\n    }\n\n    /// @brief comparison: greater than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/\n    friend bool operator>=(const_reference lhs, const_reference rhs) noexcept\n    {\n        if (compares_unordered(lhs, rhs, true))\n        {\n            return false;\n        }\n        return !(lhs < rhs);\n    }\n\n    /// @brief comparison: greater than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept\n    {\n        return lhs >= basic_json(rhs);\n    }\n\n    /// @brief comparison: greater than or equal\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/\n    template<typename ScalarType, typename std::enable_if<\n                 std::is_scalar<ScalarType>::value, int>::type = 0>\n    friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept\n    {\n        return basic_json(lhs) >= rhs;\n    }\n#endif\n\n#undef JSON_IMPLEMENT_OPERATOR\n\n    /// @}\n\n    ///////////////////\n    // serialization //\n    ///////////////////\n\n    /// @name serialization\n    /// @{\n#ifndef JSON_NO_IO\n    /// @brief serialize to stream\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/\n    friend std::ostream& operator<<(std::ostream& o, const basic_json& j)\n    {\n        // read width member and use it as indentation parameter if nonzero\n        const bool pretty_print = o.width() > 0;\n        const auto indentation = pretty_print ? o.width() : 0;\n\n        // reset width to 0 for subsequent calls to this stream\n        o.width(0);\n\n        // do the actual serialization\n        serializer s(detail::output_adapter<char>(o), o.fill());\n        s.dump(j, pretty_print, false, static_cast<unsigned int>(indentation));\n        return o;\n    }\n\n    /// @brief serialize to stream\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/\n    /// @deprecated This function is deprecated since 3.0.0 and will be removed in\n    ///             version 4.0.0 of the library. Please use\n    ///             operator<<(std::ostream&, const basic_json&) instead; that is,\n    ///             replace calls like `j >> o;` with `o << j;`.\n    JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))\n    friend std::ostream& operator>>(const basic_json& j, std::ostream& o)\n    {\n        return o << j;\n    }\n#endif  // JSON_NO_IO\n    /// @}\n\n    /////////////////////\n    // deserialization //\n    /////////////////////\n\n    /// @name deserialization\n    /// @{\n\n    /// @brief deserialize from a compatible input\n    /// @sa https://json.nlohmann.me/api/basic_json/parse/\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json parse(InputType&& i,\n                            parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(detail::input_adapter(std::forward<InputType>(i)), std::move(cb), allow_exceptions, ignore_comments).parse(true, result); // cppcheck-suppress[accessMoved,accessForwarded]\n        return result;\n    }\n\n    /// @brief deserialize from a pair of character iterators\n    /// @sa https://json.nlohmann.me/api/basic_json/parse/\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json parse(IteratorType first,\n                            IteratorType last,\n                            parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(detail::input_adapter(std::move(first), std::move(last)), std::move(cb), allow_exceptions, ignore_comments).parse(true, result); // cppcheck-suppress[accessMoved]\n        return result;\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))\n    static basic_json parse(detail::span_input_adapter&& i,\n                            parser_callback_t cb = nullptr,\n                            const bool allow_exceptions = true,\n                            const bool ignore_comments = false)\n    {\n        basic_json result;\n        parser(i.get(), std::move(cb), allow_exceptions, ignore_comments).parse(true, result); // cppcheck-suppress[accessMoved]\n        return result;\n    }\n\n    /// @brief check if the input is valid JSON\n    /// @sa https://json.nlohmann.me/api/basic_json/accept/\n    template<typename InputType>\n    static bool accept(InputType&& i,\n                       const bool ignore_comments = false)\n    {\n        return parser(detail::input_adapter(std::forward<InputType>(i)), nullptr, false, ignore_comments).accept(true);\n    }\n\n    /// @brief check if the input is valid JSON\n    /// @sa https://json.nlohmann.me/api/basic_json/accept/\n    template<typename IteratorType>\n    static bool accept(IteratorType first, IteratorType last,\n                       const bool ignore_comments = false)\n    {\n        return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len))\n    static bool accept(detail::span_input_adapter&& i,\n                       const bool ignore_comments = false)\n    {\n        return parser(i.get(), nullptr, false, ignore_comments).accept(true);\n    }\n\n    /// @brief generate SAX events\n    /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/\n    template <typename InputType, typename SAX>\n    JSON_HEDLEY_NON_NULL(2)\n    static bool sax_parse(InputType&& i, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict);\n    }\n\n    /// @brief generate SAX events\n    /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/\n    template<class IteratorType, class SAX>\n    JSON_HEDLEY_NON_NULL(3)\n    static bool sax_parse(IteratorType first, IteratorType last, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        return format == input_format_t::json\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict);\n    }\n\n    /// @brief generate SAX events\n    /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/\n    /// @deprecated This function is deprecated since 3.8.0 and will be removed in\n    ///             version 4.0.0 of the library. Please use\n    ///             sax_parse(ptr, ptr + len) instead.\n    template <typename SAX>\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...))\n    JSON_HEDLEY_NON_NULL(2)\n    static bool sax_parse(detail::span_input_adapter&& i, SAX* sax,\n                          input_format_t format = input_format_t::json,\n                          const bool strict = true,\n                          const bool ignore_comments = false)\n    {\n        auto ia = i.get();\n        return format == input_format_t::json\n               // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)\n               ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)\n               // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)\n               : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict);\n    }\n#ifndef JSON_NO_IO\n    /// @brief deserialize from stream\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/\n    /// @deprecated This stream operator is deprecated since 3.0.0 and will be removed in\n    ///             version 4.0.0 of the library. Please use\n    ///             operator>>(std::istream&, basic_json&) instead; that is,\n    ///             replace calls like `j << i;` with `i >> j;`.\n    JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))\n    friend std::istream& operator<<(basic_json& j, std::istream& i)\n    {\n        return operator>>(i, j);\n    }\n\n    /// @brief deserialize from stream\n    /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/\n    friend std::istream& operator>>(std::istream& i, basic_json& j)\n    {\n        parser(detail::input_adapter(i)).parse(false, j);\n        return i;\n    }\n#endif  // JSON_NO_IO\n    /// @}\n\n    ///////////////////////////\n    // convenience functions //\n    ///////////////////////////\n\n    /// @brief return the type as string\n    /// @sa https://json.nlohmann.me/api/basic_json/type_name/\n    JSON_HEDLEY_RETURNS_NON_NULL\n    const char* type_name() const noexcept\n    {\n        switch (m_data.m_type)\n        {\n            case value_t::null:\n                return \"null\";\n            case value_t::object:\n                return \"object\";\n            case value_t::array:\n                return \"array\";\n            case value_t::string:\n                return \"string\";\n            case value_t::boolean:\n                return \"boolean\";\n            case value_t::binary:\n                return \"binary\";\n            case value_t::discarded:\n                return \"discarded\";\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            default:\n                return \"number\";\n        }\n    }\n\n  JSON_PRIVATE_UNLESS_TESTED:\n    //////////////////////\n    // member variables //\n    //////////////////////\n\n    struct data\n    {\n        /// the type of the current element\n        value_t m_type = value_t::null;\n\n        /// the value of the current element\n        json_value m_value = {};\n\n        data(const value_t v)\n            : m_type(v), m_value(v)\n        {\n        }\n\n        data(size_type cnt, const basic_json& val)\n            : m_type(value_t::array)\n        {\n            m_value.array = create<array_t>(cnt, val);\n        }\n\n        data() noexcept = default;\n        data(data&&) noexcept = default;\n        data(const data&) noexcept = delete;\n        data& operator=(data&&) noexcept = delete;\n        data& operator=(const data&) noexcept = delete;\n\n        ~data() noexcept\n        {\n            m_value.destroy(m_type);\n        }\n    };\n\n    data m_data = {};\n\n#if JSON_DIAGNOSTICS\n    /// a pointer to a parent value (for debugging purposes)\n    basic_json* m_parent = nullptr;\n#endif\n\n#if JSON_DIAGNOSTIC_POSITIONS\n    /// the start position of the value\n    std::size_t start_position = std::string::npos;\n    /// the end position of the value\n    std::size_t end_position = std::string::npos;\n  public:\n    constexpr std::size_t start_pos() const noexcept\n    {\n        return start_position;\n    }\n\n    constexpr std::size_t end_pos() const noexcept\n    {\n        return end_position;\n    }\n#endif\n\n    //////////////////////////////////////////\n    // binary serialization/deserialization //\n    //////////////////////////////////////////\n\n    /// @name binary serialization/deserialization support\n    /// @{\n\n  public:\n    /// @brief create a CBOR serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/\n    static std::vector<std::uint8_t> to_cbor(const basic_json& j)\n    {\n        std::vector<std::uint8_t> result;\n        to_cbor(j, result);\n        return result;\n    }\n\n    /// @brief create a CBOR serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/\n    static void to_cbor(const basic_json& j, detail::output_adapter<std::uint8_t> o)\n    {\n        binary_writer<std::uint8_t>(o).write_cbor(j);\n    }\n\n    /// @brief create a CBOR serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/\n    static void to_cbor(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_cbor(j);\n    }\n\n    /// @brief create a MessagePack serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/\n    static std::vector<std::uint8_t> to_msgpack(const basic_json& j)\n    {\n        std::vector<std::uint8_t> result;\n        to_msgpack(j, result);\n        return result;\n    }\n\n    /// @brief create a MessagePack serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/\n    static void to_msgpack(const basic_json& j, detail::output_adapter<std::uint8_t> o)\n    {\n        binary_writer<std::uint8_t>(o).write_msgpack(j);\n    }\n\n    /// @brief create a MessagePack serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/\n    static void to_msgpack(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_msgpack(j);\n    }\n\n    /// @brief create a UBJSON serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/\n    static std::vector<std::uint8_t> to_ubjson(const basic_json& j,\n            const bool use_size = false,\n            const bool use_type = false)\n    {\n        std::vector<std::uint8_t> result;\n        to_ubjson(j, result, use_size, use_type);\n        return result;\n    }\n\n    /// @brief create a UBJSON serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/\n    static void to_ubjson(const basic_json& j, detail::output_adapter<std::uint8_t> o,\n                          const bool use_size = false, const bool use_type = false)\n    {\n        binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type);\n    }\n\n    /// @brief create a UBJSON serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/\n    static void to_ubjson(const basic_json& j, detail::output_adapter<char> o,\n                          const bool use_size = false, const bool use_type = false)\n    {\n        binary_writer<char>(o).write_ubjson(j, use_size, use_type);\n    }\n\n    /// @brief create a BJData serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/\n    static std::vector<std::uint8_t> to_bjdata(const basic_json& j,\n            const bool use_size = false,\n            const bool use_type = false,\n            const bjdata_version_t version = bjdata_version_t::draft2)\n    {\n        std::vector<std::uint8_t> result;\n        to_bjdata(j, result, use_size, use_type, version);\n        return result;\n    }\n\n    /// @brief create a BJData serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/\n    static void to_bjdata(const basic_json& j, detail::output_adapter<std::uint8_t> o,\n                          const bool use_size = false, const bool use_type = false,\n                          const bjdata_version_t version = bjdata_version_t::draft2)\n    {\n        binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type, true, true, version);\n    }\n\n    /// @brief create a BJData serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/\n    static void to_bjdata(const basic_json& j, detail::output_adapter<char> o,\n                          const bool use_size = false, const bool use_type = false,\n                          const bjdata_version_t version = bjdata_version_t::draft2)\n    {\n        binary_writer<char>(o).write_ubjson(j, use_size, use_type, true, true, version);\n    }\n\n    /// @brief create a BSON serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_bson/\n    static std::vector<std::uint8_t> to_bson(const basic_json& j)\n    {\n        std::vector<std::uint8_t> result;\n        to_bson(j, result);\n        return result;\n    }\n\n    /// @brief create a BSON serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_bson/\n    static void to_bson(const basic_json& j, detail::output_adapter<std::uint8_t> o)\n    {\n        binary_writer<std::uint8_t>(o).write_bson(j);\n    }\n\n    /// @brief create a BSON serialization of a given JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/to_bson/\n    static void to_bson(const basic_json& j, detail::output_adapter<char> o)\n    {\n        binary_writer<char>(o).write_bson(j);\n    }\n\n    /// @brief create a JSON value from an input in CBOR format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_cbor(InputType&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in CBOR format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_cbor(IteratorType first, IteratorType last,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))\n    static basic_json from_cbor(const T* ptr, std::size_t len,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))\n    static basic_json from_cbor(detail::span_input_adapter&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true,\n                                const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)\n    {\n        basic_json result;\n        auto ia = i.get();\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in MessagePack format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_msgpack(InputType&& i,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in MessagePack format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_msgpack(IteratorType first, IteratorType last,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))\n    static basic_json from_msgpack(const T* ptr, std::size_t len,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        return from_msgpack(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))\n    static basic_json from_msgpack(detail::span_input_adapter&& i,\n                                   const bool strict = true,\n                                   const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = i.get();\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in UBJSON format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_ubjson(InputType&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in UBJSON format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_ubjson(IteratorType first, IteratorType last,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))\n    static basic_json from_ubjson(const T* ptr, std::size_t len,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        return from_ubjson(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))\n    static basic_json from_ubjson(detail::span_input_adapter&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = i.get();\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in BJData format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bjdata(InputType&& i,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in BJData format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bjdata(IteratorType first, IteratorType last,\n                                  const bool strict = true,\n                                  const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in BSON format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_bson/\n    template<typename InputType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bson(InputType&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::forward<InputType>(i));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    /// @brief create a JSON value from an input in BSON format\n    /// @sa https://json.nlohmann.me/api/basic_json/from_bson/\n    template<typename IteratorType>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json from_bson(IteratorType first, IteratorType last,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = detail::input_adapter(std::move(first), std::move(last));\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n\n    template<typename T>\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))\n    static basic_json from_bson(const T* ptr, std::size_t len,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        return from_bson(ptr, ptr + len, strict, allow_exceptions);\n    }\n\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))\n    static basic_json from_bson(detail::span_input_adapter&& i,\n                                const bool strict = true,\n                                const bool allow_exceptions = true)\n    {\n        basic_json result;\n        auto ia = i.get();\n        detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);\n        // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)\n        const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]\n        return res ? result : basic_json(value_t::discarded);\n    }\n    /// @}\n\n    //////////////////////////\n    // JSON Pointer support //\n    //////////////////////////\n\n    /// @name JSON Pointer functions\n    /// @{\n\n    /// @brief access specified element via JSON Pointer\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    reference operator[](const json_pointer& ptr)\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    reference operator[](const ::nlohmann::json_pointer<BasicJsonType>& ptr)\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    /// @brief access specified element via JSON Pointer\n    /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/\n    const_reference operator[](const json_pointer& ptr) const\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    const_reference operator[](const ::nlohmann::json_pointer<BasicJsonType>& ptr) const\n    {\n        return ptr.get_unchecked(this);\n    }\n\n    /// @brief access specified element via JSON Pointer\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    reference at(const json_pointer& ptr)\n    {\n        return ptr.get_checked(this);\n    }\n\n    template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr)\n    {\n        return ptr.get_checked(this);\n    }\n\n    /// @brief access specified element via JSON Pointer\n    /// @sa https://json.nlohmann.me/api/basic_json/at/\n    const_reference at(const json_pointer& ptr) const\n    {\n        return ptr.get_checked(this);\n    }\n\n    template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>\n    JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)\n    const_reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr) const\n    {\n        return ptr.get_checked(this);\n    }\n\n    /// @brief return flattened JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/flatten/\n    basic_json flatten() const\n    {\n        basic_json result(value_t::object);\n        json_pointer::flatten(\"\", *this, result);\n        return result;\n    }\n\n    /// @brief unflatten a previously flattened JSON value\n    /// @sa https://json.nlohmann.me/api/basic_json/unflatten/\n    basic_json unflatten() const\n    {\n        return json_pointer::unflatten(*this);\n    }\n\n    /// @}\n\n    //////////////////////////\n    // JSON Patch functions //\n    //////////////////////////\n\n    /// @name JSON Patch functions\n    /// @{\n\n    /// @brief applies a JSON patch in-place without copying the object\n    /// @sa https://json.nlohmann.me/api/basic_json/patch/\n    void patch_inplace(const basic_json& json_patch)\n    {\n        basic_json& result = *this;\n        // the valid JSON Patch operations\n        enum class patch_operations {add, remove, replace, move, copy, test, invalid};\n\n        const auto get_op = [](const string_t& op)\n        {\n            if (op == \"add\")\n            {\n                return patch_operations::add;\n            }\n            if (op == \"remove\")\n            {\n                return patch_operations::remove;\n            }\n            if (op == \"replace\")\n            {\n                return patch_operations::replace;\n            }\n            if (op == \"move\")\n            {\n                return patch_operations::move;\n            }\n            if (op == \"copy\")\n            {\n                return patch_operations::copy;\n            }\n            if (op == \"test\")\n            {\n                return patch_operations::test;\n            }\n\n            return patch_operations::invalid;\n        };\n\n        // wrapper for \"add\" operation; add value at ptr\n        const auto operation_add = [&result](json_pointer & ptr, const basic_json & val)\n        {\n            // adding to the root of the target document means replacing it\n            if (ptr.empty())\n            {\n                result = val;\n                return;\n            }\n\n            // make sure the top element of the pointer exists\n            json_pointer const top_pointer = ptr.top();\n            if (top_pointer != ptr)\n            {\n                result.at(top_pointer);\n            }\n\n            // get reference to parent of JSON pointer ptr\n            const auto last_path = ptr.back();\n            ptr.pop_back();\n            // parent must exist when performing patch add per RFC6902 specs\n            basic_json& parent = result.at(ptr);\n\n            switch (parent.m_data.m_type)\n            {\n                case value_t::null:\n                case value_t::object:\n                {\n                    // use operator[] to add value\n                    parent[last_path] = val;\n                    break;\n                }\n\n                case value_t::array:\n                {\n                    if (last_path == \"-\")\n                    {\n                        // special case: append to back\n                        parent.push_back(val);\n                    }\n                    else\n                    {\n                        const auto idx = json_pointer::template array_index<basic_json_t>(last_path);\n                        if (JSON_HEDLEY_UNLIKELY(idx > parent.size()))\n                        {\n                            // avoid undefined behavior\n                            JSON_THROW(out_of_range::create(401, detail::concat(\"array index \", std::to_string(idx), \" is out of range\"), &parent));\n                        }\n\n                        // default case: insert add offset\n                        parent.insert(parent.begin() + static_cast<difference_type>(idx), val);\n                    }\n                    break;\n                }\n\n                // if there exists a parent it cannot be primitive\n                case value_t::string: // LCOV_EXCL_LINE\n                case value_t::boolean: // LCOV_EXCL_LINE\n                case value_t::number_integer: // LCOV_EXCL_LINE\n                case value_t::number_unsigned: // LCOV_EXCL_LINE\n                case value_t::number_float: // LCOV_EXCL_LINE\n                case value_t::binary: // LCOV_EXCL_LINE\n                case value_t::discarded: // LCOV_EXCL_LINE\n                default:            // LCOV_EXCL_LINE\n                    JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE\n            }\n        };\n\n        // wrapper for \"remove\" operation; remove value at ptr\n        const auto operation_remove = [this, & result](json_pointer & ptr)\n        {\n            // get reference to parent of JSON pointer ptr\n            const auto last_path = ptr.back();\n            ptr.pop_back();\n            basic_json& parent = result.at(ptr);\n\n            // remove child\n            if (parent.is_object())\n            {\n                // perform range check\n                auto it = parent.find(last_path);\n                if (JSON_HEDLEY_LIKELY(it != parent.end()))\n                {\n                    parent.erase(it);\n                }\n                else\n                {\n                    JSON_THROW(out_of_range::create(403, detail::concat(\"key '\", last_path, \"' not found\"), this));\n                }\n            }\n            else if (parent.is_array())\n            {\n                // note erase performs range check\n                parent.erase(json_pointer::template array_index<basic_json_t>(last_path));\n            }\n        };\n\n        // type check: top level value must be an array\n        if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array()))\n        {\n            JSON_THROW(parse_error::create(104, 0, \"JSON patch must be an array of objects\", &json_patch));\n        }\n\n        // iterate and apply the operations\n        for (const auto& val : json_patch)\n        {\n            // wrapper to get a value for an operation\n            const auto get_value = [&val](const string_t& op,\n                                          const string_t& member,\n                                          bool string_type) -> basic_json &\n            {\n                // find value\n                auto it = val.m_data.m_value.object->find(member);\n\n                // context-sensitive error message\n                const auto error_msg = (op == \"op\") ? \"operation\" : detail::concat(\"operation '\", op, '\\''); // NOLINT(bugprone-unused-local-non-trivial-variable)\n\n                // check if desired value is present\n                if (JSON_HEDLEY_UNLIKELY(it == val.m_data.m_value.object->end()))\n                {\n                    // NOLINTNEXTLINE(performance-inefficient-string-concatenation)\n                    JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, \" must have member '\", member, \"'\"), &val));\n                }\n\n                // check if result is of type string\n                if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string()))\n                {\n                    // NOLINTNEXTLINE(performance-inefficient-string-concatenation)\n                    JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, \" must have string member '\", member, \"'\"), &val));\n                }\n\n                // no error: return value\n                return it->second;\n            };\n\n            // type check: every element of the array must be an object\n            if (JSON_HEDLEY_UNLIKELY(!val.is_object()))\n            {\n                JSON_THROW(parse_error::create(104, 0, \"JSON patch must be an array of objects\", &val));\n            }\n\n            // collect mandatory members\n            const auto op = get_value(\"op\", \"op\", true).template get<string_t>();\n            const auto path = get_value(op, \"path\", true).template get<string_t>();\n            json_pointer ptr(path);\n\n            switch (get_op(op))\n            {\n                case patch_operations::add:\n                {\n                    operation_add(ptr, get_value(\"add\", \"value\", false));\n                    break;\n                }\n\n                case patch_operations::remove:\n                {\n                    operation_remove(ptr);\n                    break;\n                }\n\n                case patch_operations::replace:\n                {\n                    // the \"path\" location must exist - use at()\n                    result.at(ptr) = get_value(\"replace\", \"value\", false);\n                    break;\n                }\n\n                case patch_operations::move:\n                {\n                    const auto from_path = get_value(\"move\", \"from\", true).template get<string_t>();\n                    json_pointer from_ptr(from_path);\n\n                    // the \"from\" location must exist - use at()\n                    basic_json const v = result.at(from_ptr);\n\n                    // The move operation is functionally identical to a\n                    // \"remove\" operation on the \"from\" location, followed\n                    // immediately by an \"add\" operation at the target\n                    // location with the value that was just removed.\n                    operation_remove(from_ptr);\n                    operation_add(ptr, v);\n                    break;\n                }\n\n                case patch_operations::copy:\n                {\n                    const auto from_path = get_value(\"copy\", \"from\", true).template get<string_t>();\n                    const json_pointer from_ptr(from_path);\n\n                    // the \"from\" location must exist - use at()\n                    basic_json const v = result.at(from_ptr);\n\n                    // The copy is functionally identical to an \"add\"\n                    // operation at the target location using the value\n                    // specified in the \"from\" member.\n                    operation_add(ptr, v);\n                    break;\n                }\n\n                case patch_operations::test:\n                {\n                    bool success = false;\n                    JSON_TRY\n                    {\n                        // check if \"value\" matches the one at \"path\"\n                        // the \"path\" location must exist - use at()\n                        success = (result.at(ptr) == get_value(\"test\", \"value\", false));\n                    }\n                    JSON_INTERNAL_CATCH (out_of_range&)\n                    {\n                        // ignore out of range errors: success remains false\n                    }\n\n                    // throw an exception if test fails\n                    if (JSON_HEDLEY_UNLIKELY(!success))\n                    {\n                        JSON_THROW(other_error::create(501, detail::concat(\"unsuccessful: \", val.dump()), &val));\n                    }\n\n                    break;\n                }\n\n                case patch_operations::invalid:\n                default:\n                {\n                    // op must be \"add\", \"remove\", \"replace\", \"move\", \"copy\", or\n                    // \"test\"\n                    JSON_THROW(parse_error::create(105, 0, detail::concat(\"operation value '\", op, \"' is invalid\"), &val));\n                }\n            }\n        }\n    }\n\n    /// @brief applies a JSON patch to a copy of the current object\n    /// @sa https://json.nlohmann.me/api/basic_json/patch/\n    basic_json patch(const basic_json& json_patch) const\n    {\n        basic_json result = *this;\n        result.patch_inplace(json_patch);\n        return result;\n    }\n\n    /// @brief creates a diff as a JSON patch\n    /// @sa https://json.nlohmann.me/api/basic_json/diff/\n    JSON_HEDLEY_WARN_UNUSED_RESULT\n    static basic_json diff(const basic_json& source, const basic_json& target,\n                           const string_t& path = \"\")\n    {\n        // the patch\n        basic_json result(value_t::array);\n\n        // if the values are the same, return empty patch\n        if (source == target)\n        {\n            return result;\n        }\n\n        if (source.type() != target.type())\n        {\n            // different types: replace value\n            result.push_back(\n            {\n                {\"op\", \"replace\"}, {\"path\", path}, {\"value\", target}\n            });\n            return result;\n        }\n\n        switch (source.type())\n        {\n            case value_t::array:\n            {\n                // first pass: traverse common elements\n                std::size_t i = 0;\n                while (i < source.size() && i < target.size())\n                {\n                    // recursive call to compare array values at index i\n                    auto temp_diff = diff(source[i], target[i], detail::concat<string_t>(path, '/', detail::to_string<string_t>(i)));\n                    result.insert(result.end(), temp_diff.begin(), temp_diff.end());\n                    ++i;\n                }\n\n                // We now reached the end of at least one array\n                // in a second pass, traverse the remaining elements\n\n                // remove my remaining elements\n                const auto end_index = static_cast<difference_type>(result.size());\n                while (i < source.size())\n                {\n                    // add operations in reverse order to avoid invalid\n                    // indices\n                    result.insert(result.begin() + end_index, object(\n                    {\n                        {\"op\", \"remove\"},\n                        {\"path\", detail::concat<string_t>(path, '/', detail::to_string<string_t>(i))}\n                    }));\n                    ++i;\n                }\n\n                // add other remaining elements\n                while (i < target.size())\n                {\n                    result.push_back(\n                    {\n                        {\"op\", \"add\"},\n                        {\"path\", detail::concat<string_t>(path, \"/-\")},\n                        {\"value\", target[i]}\n                    });\n                    ++i;\n                }\n\n                break;\n            }\n\n            case value_t::object:\n            {\n                // first pass: traverse this object's elements\n                for (auto it = source.cbegin(); it != source.cend(); ++it)\n                {\n                    // escape the key name to be used in a JSON patch\n                    const auto path_key = detail::concat<string_t>(path, '/', detail::escape(it.key()));\n\n                    if (target.find(it.key()) != target.end())\n                    {\n                        // recursive call to compare object values at key it\n                        auto temp_diff = diff(it.value(), target[it.key()], path_key);\n                        result.insert(result.end(), temp_diff.begin(), temp_diff.end());\n                    }\n                    else\n                    {\n                        // found a key that is not in o -> remove it\n                        result.push_back(object(\n                        {\n                            {\"op\", \"remove\"}, {\"path\", path_key}\n                        }));\n                    }\n                }\n\n                // second pass: traverse other object's elements\n                for (auto it = target.cbegin(); it != target.cend(); ++it)\n                {\n                    if (source.find(it.key()) == source.end())\n                    {\n                        // found a key that is not in this -> add it\n                        const auto path_key = detail::concat<string_t>(path, '/', detail::escape(it.key()));\n                        result.push_back(\n                        {\n                            {\"op\", \"add\"}, {\"path\", path_key},\n                            {\"value\", it.value()}\n                        });\n                    }\n                }\n\n                break;\n            }\n\n            case value_t::null:\n            case value_t::string:\n            case value_t::boolean:\n            case value_t::number_integer:\n            case value_t::number_unsigned:\n            case value_t::number_float:\n            case value_t::binary:\n            case value_t::discarded:\n            default:\n            {\n                // both primitive type: replace value\n                result.push_back(\n                {\n                    {\"op\", \"replace\"}, {\"path\", path}, {\"value\", target}\n                });\n                break;\n            }\n        }\n\n        return result;\n    }\n    /// @}\n\n    ////////////////////////////////\n    // JSON Merge Patch functions //\n    ////////////////////////////////\n\n    /// @name JSON Merge Patch functions\n    /// @{\n\n    /// @brief applies a JSON Merge Patch\n    /// @sa https://json.nlohmann.me/api/basic_json/merge_patch/\n    void merge_patch(const basic_json& apply_patch)\n    {\n        if (apply_patch.is_object())\n        {\n            if (!is_object())\n            {\n                *this = object();\n            }\n            for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it)\n            {\n                if (it.value().is_null())\n                {\n                    erase(it.key());\n                }\n                else\n                {\n                    operator[](it.key()).merge_patch(it.value());\n                }\n            }\n        }\n        else\n        {\n            *this = apply_patch;\n        }\n    }\n\n    /// @}\n};\n\n/// @brief user-defined to_string function for JSON values\n/// @sa https://json.nlohmann.me/api/basic_json/to_string/\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstd::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)\n{\n    return j.dump();\n}\n\ninline namespace literals\n{\ninline namespace json_literals\n{\n\n/// @brief user-defined string literal for JSON values\n/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/\nJSON_HEDLEY_NON_NULL(1)\n#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)\n    inline nlohmann::json operator \"\"_json(const char* s, std::size_t n)\n#else\n    inline nlohmann::json operator \"\" _json(const char* s, std::size_t n)\n#endif\n{\n    return nlohmann::json::parse(s, s + n);\n}\n\n/// @brief user-defined string literal for JSON pointer\n/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/\nJSON_HEDLEY_NON_NULL(1)\n#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)\n    inline nlohmann::json::json_pointer operator \"\"_json_pointer(const char* s, std::size_t n)\n#else\n    inline nlohmann::json::json_pointer operator \"\" _json_pointer(const char* s, std::size_t n)\n#endif\n{\n    return nlohmann::json::json_pointer(std::string(s, n));\n}\n\n}  // namespace json_literals\n}  // namespace literals\nNLOHMANN_JSON_NAMESPACE_END\n\n///////////////////////\n// nonmember support //\n///////////////////////\n\nnamespace std // NOLINT(cert-dcl58-cpp)\n{\n\n/// @brief hash value for JSON objects\n/// @sa https://json.nlohmann.me/api/basic_json/std_hash/\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\nstruct hash<nlohmann::NLOHMANN_BASIC_JSON_TPL> // NOLINT(cert-dcl58-cpp)\n{\n    std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const\n    {\n        return nlohmann::detail::hash(j);\n    }\n};\n\n// specialization for std::less<value_t>\ntemplate<>\nstruct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679\n{\n    /*!\n    @brief compare two value_t enum values\n    @since version 3.0.0\n    */\n    bool operator()(::nlohmann::detail::value_t lhs,\n                    ::nlohmann::detail::value_t rhs) const noexcept\n    {\n#if JSON_HAS_THREE_WAY_COMPARISON\n        return std::is_lt(lhs <=> rhs); // *NOPAD*\n#else\n        return ::nlohmann::detail::operator<(lhs, rhs);\n#endif\n    }\n};\n\n// C++20 prohibit function specialization in the std namespace.\n#ifndef JSON_HAS_CPP_20\n\n/// @brief exchanges the values of two JSON objects\n/// @sa https://json.nlohmann.me/api/basic_json/std_swap/\nNLOHMANN_BASIC_JSON_TPL_DECLARATION\ninline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept(  // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp)\n    is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&&                          // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)\n    is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value)\n{\n    j1.swap(j2);\n}\n\n#endif\n\n}  // namespace std\n\n#if JSON_USE_GLOBAL_UDLS\n    #if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)\n        using nlohmann::literals::json_literals::operator \"\"_json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)\n        using nlohmann::literals::json_literals::operator \"\"_json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)\n    #else\n        using nlohmann::literals::json_literals::operator \"\" _json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)\n        using nlohmann::literals::json_literals::operator \"\" _json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)\n    #endif\n#endif\n\n#include <nlohmann/detail/macro_unscope.hpp>\n\n#endif  // INCLUDE_NLOHMANN_JSON_HPP_\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/json_fwd.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_\n#define INCLUDE_NLOHMANN_JSON_FWD_HPP_\n\n#include <cstdint> // int64_t, uint64_t\n#include <map> // map\n#include <memory> // allocator\n#include <string> // string\n#include <vector> // vector\n\n#include <nlohmann/detail/abi_macros.hpp>\n\n/*!\n@brief namespace for Niels Lohmann\n@see https://github.com/nlohmann\n@since version 1.0.0\n*/\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/*!\n@brief default JSONSerializer template argument\n\nThis serializer ignores the template arguments and uses ADL\n([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl))\nfor serialization.\n*/\ntemplate<typename T = void, typename SFINAE = void>\nstruct adl_serializer;\n\n/// a class to store JSON values\n/// @sa https://json.nlohmann.me/api/basic_json/\ntemplate<template<typename U, typename V, typename... Args> class ObjectType =\n         std::map,\n         template<typename U, typename... Args> class ArrayType = std::vector,\n         class StringType = std::string, class BooleanType = bool,\n         class NumberIntegerType = std::int64_t,\n         class NumberUnsignedType = std::uint64_t,\n         class NumberFloatType = double,\n         template<typename U> class AllocatorType = std::allocator,\n         template<typename T, typename SFINAE = void> class JSONSerializer =\n         adl_serializer,\n         class BinaryType = std::vector<std::uint8_t>, // cppcheck-suppress syntaxError\n         class CustomBaseClass = void>\nclass basic_json;\n\n/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document\n/// @sa https://json.nlohmann.me/api/json_pointer/\ntemplate<typename RefStringType>\nclass json_pointer;\n\n/*!\n@brief default specialization\n@sa https://json.nlohmann.me/api/json/\n*/\nusing json = basic_json<>;\n\n/// @brief a minimal map-like container that preserves insertion order\n/// @sa https://json.nlohmann.me/api/ordered_map/\ntemplate<class Key, class T, class IgnoredLess, class Allocator>\nstruct ordered_map;\n\n/// @brief specialization that maintains the insertion order of object keys\n/// @sa https://json.nlohmann.me/api/ordered_json/\nusing ordered_json = basic_json<nlohmann::ordered_map>;\n\nNLOHMANN_JSON_NAMESPACE_END\n\n#endif  // INCLUDE_NLOHMANN_JSON_FWD_HPP_\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/ordered_map.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#include <functional> // equal_to, less\n#include <initializer_list> // initializer_list\n#include <iterator> // input_iterator_tag, iterator_traits\n#include <memory> // allocator\n#include <stdexcept> // for out_of_range\n#include <type_traits> // enable_if, is_convertible\n#include <utility> // pair\n#include <vector> // vector\n\n#include <nlohmann/detail/macro_scope.hpp>\n#include <nlohmann/detail/meta/type_traits.hpp>\n\nNLOHMANN_JSON_NAMESPACE_BEGIN\n\n/// ordered_map: a minimal map-like container that preserves insertion order\n/// for use within nlohmann::basic_json<ordered_map>\ntemplate <class Key, class T, class IgnoredLess = std::less<Key>,\n          class Allocator = std::allocator<std::pair<const Key, T>>>\n              struct ordered_map : std::vector<std::pair<const Key, T>, Allocator>\n{\n    using key_type = Key;\n    using mapped_type = T;\n    using Container = std::vector<std::pair<const Key, T>, Allocator>;\n    using iterator = typename Container::iterator;\n    using const_iterator = typename Container::const_iterator;\n    using size_type = typename Container::size_type;\n    using value_type = typename Container::value_type;\n#ifdef JSON_HAS_CPP_14\n    using key_compare = std::equal_to<>;\n#else\n    using key_compare = std::equal_to<Key>;\n#endif\n\n    // Explicit constructors instead of `using Container::Container`\n    // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4)\n    ordered_map() noexcept(noexcept(Container())) : Container{} {}\n    explicit ordered_map(const Allocator& alloc) noexcept(noexcept(Container(alloc))) : Container{alloc} {}\n    template <class It>\n    ordered_map(It first, It last, const Allocator& alloc = Allocator())\n        : Container{first, last, alloc} {}\n    ordered_map(std::initializer_list<value_type> init, const Allocator& alloc = Allocator() )\n        : Container{init, alloc} {}\n\n    std::pair<iterator, bool> emplace(const key_type& key, T&& t)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return {it, false};\n            }\n        }\n        Container::emplace_back(key, std::forward<T>(t));\n        return {std::prev(this->end()), true};\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    std::pair<iterator, bool> emplace(KeyType && key, T && t)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return {it, false};\n            }\n        }\n        Container::emplace_back(std::forward<KeyType>(key), std::forward<T>(t));\n        return {std::prev(this->end()), true};\n    }\n\n    T& operator[](const key_type& key)\n    {\n        return emplace(key, T{}).first->second;\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    T & operator[](KeyType && key)\n    {\n        return emplace(std::forward<KeyType>(key), T{}).first->second;\n    }\n\n    const T& operator[](const key_type& key) const\n    {\n        return at(key);\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    const T & operator[](KeyType && key) const\n    {\n        return at(std::forward<KeyType>(key));\n    }\n\n    T& at(const key_type& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it->second;\n            }\n        }\n\n        JSON_THROW(std::out_of_range(\"key not found\"));\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    T & at(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it->second;\n            }\n        }\n\n        JSON_THROW(std::out_of_range(\"key not found\"));\n    }\n\n    const T& at(const key_type& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it->second;\n            }\n        }\n\n        JSON_THROW(std::out_of_range(\"key not found\"));\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    const T & at(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it->second;\n            }\n        }\n\n        JSON_THROW(std::out_of_range(\"key not found\"));\n    }\n\n    size_type erase(const key_type& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                // Since we cannot move const Keys, re-construct them in place\n                for (auto next = it; ++next != this->end(); ++it)\n                {\n                    it->~value_type(); // Destroy but keep allocation\n                    new (&*it) value_type{std::move(*next)};\n                }\n                Container::pop_back();\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    size_type erase(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                // Since we cannot move const Keys, re-construct them in place\n                for (auto next = it; ++next != this->end(); ++it)\n                {\n                    it->~value_type(); // Destroy but keep allocation\n                    new (&*it) value_type{std::move(*next)};\n                }\n                Container::pop_back();\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    iterator erase(iterator pos)\n    {\n        return erase(pos, std::next(pos));\n    }\n\n    iterator erase(iterator first, iterator last)\n    {\n        if (first == last)\n        {\n            return first;\n        }\n\n        const auto elements_affected = std::distance(first, last);\n        const auto offset = std::distance(Container::begin(), first);\n\n        // This is the start situation. We need to delete elements_affected\n        // elements (3 in this example: e, f, g), and need to return an\n        // iterator past the last deleted element (h in this example).\n        // Note that offset is the distance from the start of the vector\n        // to first. We will need this later.\n\n        // [ a, b, c, d, e, f, g, h, i, j ]\n        //               ^        ^\n        //             first    last\n\n        // Since we cannot move const Keys, we re-construct them in place.\n        // We start at first and re-construct (viz. copy) the elements from\n        // the back of the vector. Example for first iteration:\n\n        //               ,--------.\n        //               v        |   destroy e and re-construct with h\n        // [ a, b, c, d, e, f, g, h, i, j ]\n        //               ^        ^\n        //               it       it + elements_affected\n\n        for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it)\n        {\n            it->~value_type(); // destroy but keep allocation\n            new (&*it) value_type{std::move(*std::next(it, elements_affected))}; // \"move\" next element to it\n        }\n\n        // [ a, b, c, d, h, i, j, h, i, j ]\n        //               ^        ^\n        //             first    last\n\n        // remove the unneeded elements at the end of the vector\n        Container::resize(this->size() - static_cast<size_type>(elements_affected));\n\n        // [ a, b, c, d, h, i, j ]\n        //               ^        ^\n        //             first    last\n\n        // first is now pointing past the last deleted element, but we cannot\n        // use this iterator, because it may have been invalidated by the\n        // resize call. Instead, we can return begin() + offset.\n        return Container::begin() + offset;\n    }\n\n    size_type count(const key_type& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    size_type count(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return 1;\n            }\n        }\n        return 0;\n    }\n\n    iterator find(const key_type& key)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    template<class KeyType, detail::enable_if_t<\n                 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>\n    iterator find(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward)\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    const_iterator find(const key_type& key) const\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, key))\n            {\n                return it;\n            }\n        }\n        return Container::end();\n    }\n\n    std::pair<iterator, bool> insert( value_type&& value )\n    {\n        return emplace(value.first, std::move(value.second));\n    }\n\n    std::pair<iterator, bool> insert( const value_type& value )\n    {\n        for (auto it = this->begin(); it != this->end(); ++it)\n        {\n            if (m_compare(it->first, value.first))\n            {\n                return {it, false};\n            }\n        }\n        Container::push_back(value);\n        return {--this->end(), true};\n    }\n\n    template<typename InputIt>\n    using require_input_iter = typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIt>::iterator_category,\n        std::input_iterator_tag>::value>::type;\n\n    template<typename InputIt, typename = require_input_iter<InputIt>>\n    void insert(InputIt first, InputIt last)\n    {\n        for (auto it = first; it != last; ++it)\n        {\n            insert(*it);\n        }\n    }\n\nprivate:\n    JSON_NO_UNIQUE_ADDRESS key_compare m_compare = key_compare();\n};\n\nNLOHMANN_JSON_NAMESPACE_END\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/thirdparty/hedley/hedley.hpp",
    "content": "#pragma once\n\n//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-FileCopyrightText: 2016 - 2021 Evan Nemerson <evan@nemerson.com>\n// SPDX-License-Identifier: MIT\n\n/* Hedley - https://nemequ.github.io/hedley\n * Created by Evan Nemerson <evan@nemerson.com>\n */\n\n#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15)\n#if defined(JSON_HEDLEY_VERSION)\n    #undef JSON_HEDLEY_VERSION\n#endif\n#define JSON_HEDLEY_VERSION 15\n\n#if defined(JSON_HEDLEY_STRINGIFY_EX)\n    #undef JSON_HEDLEY_STRINGIFY_EX\n#endif\n#define JSON_HEDLEY_STRINGIFY_EX(x) #x\n\n#if defined(JSON_HEDLEY_STRINGIFY)\n    #undef JSON_HEDLEY_STRINGIFY\n#endif\n#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)\n\n#if defined(JSON_HEDLEY_CONCAT_EX)\n    #undef JSON_HEDLEY_CONCAT_EX\n#endif\n#define JSON_HEDLEY_CONCAT_EX(a,b) a##b\n\n#if defined(JSON_HEDLEY_CONCAT)\n    #undef JSON_HEDLEY_CONCAT\n#endif\n#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)\n\n#if defined(JSON_HEDLEY_CONCAT3_EX)\n    #undef JSON_HEDLEY_CONCAT3_EX\n#endif\n#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c\n\n#if defined(JSON_HEDLEY_CONCAT3)\n    #undef JSON_HEDLEY_CONCAT3\n#endif\n#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)\n\n#if defined(JSON_HEDLEY_VERSION_ENCODE)\n    #undef JSON_HEDLEY_VERSION_ENCODE\n#endif\n#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)\n    #undef JSON_HEDLEY_VERSION_DECODE_MAJOR\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)\n    #undef JSON_HEDLEY_VERSION_DECODE_MINOR\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)\n\n#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)\n    #undef JSON_HEDLEY_VERSION_DECODE_REVISION\n#endif\n#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)\n\n#if defined(JSON_HEDLEY_GNUC_VERSION)\n    #undef JSON_HEDLEY_GNUC_VERSION\n#endif\n#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)\n    #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)\n#elif defined(__GNUC__)\n    #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)\n    #undef JSON_HEDLEY_GNUC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_GNUC_VERSION)\n    #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_MSVC_VERSION)\n    #undef JSON_HEDLEY_MSVC_VERSION\n#endif\n#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)\n#elif defined(_MSC_FULL_VER) && !defined(__ICL)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)\n#elif defined(_MSC_VER) && !defined(__ICL)\n    #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)\n    #undef JSON_HEDLEY_MSVC_VERSION_CHECK\n#endif\n#if !defined(JSON_HEDLEY_MSVC_VERSION)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)\n#elif defined(_MSC_VER) && (_MSC_VER >= 1400)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))\n#elif defined(_MSC_VER) && (_MSC_VER >= 1200)\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))\n#else\n    #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_VERSION)\n    #undef JSON_HEDLEY_INTEL_VERSION\n#endif\n#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL)\n    #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)\n#elif defined(__INTEL_COMPILER) && !defined(__ICL)\n    #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)\n    #undef JSON_HEDLEY_INTEL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_INTEL_VERSION)\n    #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_CL_VERSION)\n    #undef JSON_HEDLEY_INTEL_CL_VERSION\n#endif\n#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL)\n    #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0)\n#endif\n\n#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK)\n    #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_INTEL_CL_VERSION)\n    #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_PGI_VERSION)\n    #undef JSON_HEDLEY_PGI_VERSION\n#endif\n#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)\n    #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)\n#endif\n\n#if defined(JSON_HEDLEY_PGI_VERSION_CHECK)\n    #undef JSON_HEDLEY_PGI_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_PGI_VERSION)\n    #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_SUNPRO_VERSION)\n    #undef JSON_HEDLEY_SUNPRO_VERSION\n#endif\n#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)\n#elif defined(__SUNPRO_C)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)\n#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)\n#elif defined(__SUNPRO_CC)\n    #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)\n#endif\n\n#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)\n    #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_SUNPRO_VERSION)\n    #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)\n    #undef JSON_HEDLEY_EMSCRIPTEN_VERSION\n#endif\n#if defined(__EMSCRIPTEN__)\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)\n#endif\n\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)\n    #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_ARM_VERSION)\n    #undef JSON_HEDLEY_ARM_VERSION\n#endif\n#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)\n#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)\n#endif\n\n#if defined(JSON_HEDLEY_ARM_VERSION_CHECK)\n    #undef JSON_HEDLEY_ARM_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_ARM_VERSION)\n    #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_IBM_VERSION)\n    #undef JSON_HEDLEY_IBM_VERSION\n#endif\n#if defined(__ibmxl__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)\n#elif defined(__xlC__) && defined(__xlC_ver__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)\n#elif defined(__xlC__)\n    #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)\n#endif\n\n#if defined(JSON_HEDLEY_IBM_VERSION_CHECK)\n    #undef JSON_HEDLEY_IBM_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_IBM_VERSION)\n    #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_VERSION)\n    #undef JSON_HEDLEY_TI_VERSION\n#endif\n#if \\\n    defined(__TI_COMPILER_VERSION__) && \\\n    ( \\\n      defined(__TMS470__) || defined(__TI_ARM__) || \\\n      defined(__MSP430__) || \\\n      defined(__TMS320C2000__) \\\n    )\n#if (__TI_COMPILER_VERSION__ >= 16000000)\n    #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n#endif\n\n#if defined(JSON_HEDLEY_TI_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_VERSION)\n    #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION)\n    #undef JSON_HEDLEY_TI_CL2000_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)\n    #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL2000_VERSION)\n    #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL430_VERSION)\n    #undef JSON_HEDLEY_TI_CL430_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)\n    #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL430_VERSION)\n    #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)\n    #undef JSON_HEDLEY_TI_ARMCL_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))\n    #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)\n    #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION)\n    #undef JSON_HEDLEY_TI_CL6X_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)\n    #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL6X_VERSION)\n    #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION)\n    #undef JSON_HEDLEY_TI_CL7X_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)\n    #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CL7X_VERSION)\n    #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)\n    #undef JSON_HEDLEY_TI_CLPRU_VERSION\n#endif\n#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)\n    #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))\n#endif\n\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)\n    #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)\n    #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_CRAY_VERSION)\n    #undef JSON_HEDLEY_CRAY_VERSION\n#endif\n#if defined(_CRAYC)\n    #if defined(_RELEASE_PATCHLEVEL)\n        #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)\n    #else\n        #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)\n    #endif\n#endif\n\n#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)\n    #undef JSON_HEDLEY_CRAY_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_CRAY_VERSION)\n    #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_IAR_VERSION)\n    #undef JSON_HEDLEY_IAR_VERSION\n#endif\n#if defined(__IAR_SYSTEMS_ICC__)\n    #if __VER__ > 1000\n        #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))\n    #else\n        #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0)\n    #endif\n#endif\n\n#if defined(JSON_HEDLEY_IAR_VERSION_CHECK)\n    #undef JSON_HEDLEY_IAR_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_IAR_VERSION)\n    #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_TINYC_VERSION)\n    #undef JSON_HEDLEY_TINYC_VERSION\n#endif\n#if defined(__TINYC__)\n    #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)\n#endif\n\n#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)\n    #undef JSON_HEDLEY_TINYC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_TINYC_VERSION)\n    #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_DMC_VERSION)\n    #undef JSON_HEDLEY_DMC_VERSION\n#endif\n#if defined(__DMC__)\n    #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)\n#endif\n\n#if defined(JSON_HEDLEY_DMC_VERSION_CHECK)\n    #undef JSON_HEDLEY_DMC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_DMC_VERSION)\n    #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_COMPCERT_VERSION)\n    #undef JSON_HEDLEY_COMPCERT_VERSION\n#endif\n#if defined(__COMPCERT_VERSION__)\n    #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)\n#endif\n\n#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)\n    #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_COMPCERT_VERSION)\n    #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_PELLES_VERSION)\n    #undef JSON_HEDLEY_PELLES_VERSION\n#endif\n#if defined(__POCC__)\n    #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)\n#endif\n\n#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)\n    #undef JSON_HEDLEY_PELLES_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_PELLES_VERSION)\n    #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_MCST_LCC_VERSION)\n    #undef JSON_HEDLEY_MCST_LCC_VERSION\n#endif\n#if defined(__LCC__) && defined(__LCC_MINOR__)\n    #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__)\n#endif\n\n#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK)\n    #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_MCST_LCC_VERSION)\n    #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_VERSION)\n    #undef JSON_HEDLEY_GCC_VERSION\n#endif\n#if \\\n    defined(JSON_HEDLEY_GNUC_VERSION) && \\\n    !defined(__clang__) && \\\n    !defined(JSON_HEDLEY_INTEL_VERSION) && \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_ARM_VERSION) && \\\n    !defined(JSON_HEDLEY_CRAY_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL430_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \\\n    !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \\\n    !defined(__COMPCERT__) && \\\n    !defined(JSON_HEDLEY_MCST_LCC_VERSION)\n    #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION\n#endif\n\n#if defined(JSON_HEDLEY_GCC_VERSION_CHECK)\n    #undef JSON_HEDLEY_GCC_VERSION_CHECK\n#endif\n#if defined(JSON_HEDLEY_GCC_VERSION)\n    #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))\n#else\n    #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_ATTRIBUTE\n#endif\n#if \\\n  defined(__has_attribute) && \\\n  ( \\\n    (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \\\n  )\n#  define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)\n#else\n#  define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE\n#endif\n#if defined(__has_attribute)\n    #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE\n#endif\n#if \\\n    defined(__has_cpp_attribute) && \\\n    defined(__cplusplus) && \\\n    (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)\n    #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS\n#endif\n#if !defined(__cplusplus) || !defined(__has_cpp_attribute)\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)\n#elif \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_IAR_VERSION) && \\\n    (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \\\n    (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)\n#else\n    #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE\n#endif\n#if defined(__has_cpp_attribute) && defined(__cplusplus)\n    #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE\n#endif\n#if defined(__has_cpp_attribute) && defined(__cplusplus)\n    #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_BUILTIN)\n    #undef JSON_HEDLEY_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)\n    #undef JSON_HEDLEY_GNUC_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)\n    #undef JSON_HEDLEY_GCC_HAS_BUILTIN\n#endif\n#if defined(__has_builtin)\n    #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)\n#else\n    #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_FEATURE)\n    #undef JSON_HEDLEY_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_HAS_FEATURE(feature) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)\n    #undef JSON_HEDLEY_GNUC_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_FEATURE)\n    #undef JSON_HEDLEY_GCC_HAS_FEATURE\n#endif\n#if defined(__has_feature)\n    #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)\n#else\n    #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_EXTENSION)\n    #undef JSON_HEDLEY_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_HAS_EXTENSION(extension) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)\n    #undef JSON_HEDLEY_GNUC_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)\n    #undef JSON_HEDLEY_GCC_HAS_EXTENSION\n#endif\n#if defined(__has_extension)\n    #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)\n#else\n    #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE\n#endif\n#if defined(__has_declspec_attribute)\n    #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)\n#else\n    #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_HAS_WARNING)\n    #undef JSON_HEDLEY_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_HAS_WARNING(warning) (0)\n#endif\n\n#if defined(JSON_HEDLEY_GNUC_HAS_WARNING)\n    #undef JSON_HEDLEY_GNUC_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_GCC_HAS_WARNING)\n    #undef JSON_HEDLEY_GCC_HAS_WARNING\n#endif\n#if defined(__has_warning)\n    #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)\n#else\n    #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if \\\n    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \\\n    defined(__clang__) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \\\n    JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \\\n    (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))\n    #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_PRAGMA(value) __pragma(value)\n#else\n    #define JSON_HEDLEY_PRAGMA(value)\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)\n    #undef JSON_HEDLEY_DIAGNOSTIC_PUSH\n#endif\n#if defined(JSON_HEDLEY_DIAGNOSTIC_POP)\n    #undef JSON_HEDLEY_DIAGNOSTIC_POP\n#endif\n#if defined(__clang__)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"clang diagnostic push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"clang diagnostic pop\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"warning(push)\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"warning(pop)\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"GCC diagnostic push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"GCC diagnostic pop\")\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))\n    #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))\n#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"pop\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"diag_push\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"diag_pop\")\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma(\"warning(push)\")\n    #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma(\"warning(pop)\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_PUSH\n    #define JSON_HEDLEY_DIAGNOSTIC_POP\n#endif\n\n/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for\n   HEDLEY INTERNAL USE ONLY.  API subject to change without notice. */\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_\n#endif\n#if defined(__cplusplus)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wc++98-compat\")\n#    if JSON_HEDLEY_HAS_WARNING(\"-Wc++17-extensions\")\n#      if JSON_HEDLEY_HAS_WARNING(\"-Wc++1z-extensions\")\n#        define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++17-extensions\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++1z-extensions\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#      else\n#        define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++17-extensions\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#      endif\n#    else\n#      define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wc++98-compat\\\"\") \\\n    xpr \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    endif\n#  endif\n#endif\n#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x\n#endif\n\n#if defined(JSON_HEDLEY_CONST_CAST)\n    #undef JSON_HEDLEY_CONST_CAST\n#endif\n#if defined(__cplusplus)\n#  define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))\n#elif \\\n  JSON_HEDLEY_HAS_WARNING(\"-Wcast-qual\") || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \\\n        JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n        JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \\\n        ((T) (expr)); \\\n        JSON_HEDLEY_DIAGNOSTIC_POP \\\n    }))\n#else\n#  define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_REINTERPRET_CAST)\n    #undef JSON_HEDLEY_REINTERPRET_CAST\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))\n#else\n    #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_STATIC_CAST)\n    #undef JSON_HEDLEY_STATIC_CAST\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))\n#else\n    #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))\n#endif\n\n#if defined(JSON_HEDLEY_CPP_CAST)\n    #undef JSON_HEDLEY_CPP_CAST\n#endif\n#if defined(__cplusplus)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wold-style-cast\")\n#    define JSON_HEDLEY_CPP_CAST(T, expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wold-style-cast\\\"\") \\\n    ((T) (expr)) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)\n#    define JSON_HEDLEY_CPP_CAST(T, expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"diag_suppress=Pe137\") \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  else\n#    define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))\n#  endif\n#else\n#  define JSON_HEDLEY_CPP_CAST(T, expr) (expr)\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wdeprecated-declarations\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"warning(disable:1478 1786)\")\n#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786))\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1215,1216,1444,1445\")\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1215,1444\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))\n#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1215,1444\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress 1291,1718\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"error_messages(off,symdeprecated,symdeprecated2)\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"diag_suppress=Pe1444,Pe1215\")\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma(\"warn(disable:2241)\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"clang diagnostic ignored \\\"-Wunknown-pragmas\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"warning(disable:161)\")\n#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161))\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 1675\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"GCC diagnostic ignored \\\"-Wunknown-pragmas\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 163\")\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 163\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress=Pe161\")\n#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma(\"diag_suppress 161\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-attributes\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"clang diagnostic ignored \\\"-Wunknown-attributes\\\"\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"warning(disable:1292)\")\n#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292))\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1097,1098\")\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1097\")\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"error_messages(off,attrskipunsup)\")\n#elif \\\n    JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1173\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress=Pe1097\")\n#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma(\"diag_suppress 1097\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wcast-qual\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"clang diagnostic ignored \\\"-Wcast-qual\\\"\")\n#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"warning(disable:2203 2331)\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma(\"GCC diagnostic ignored \\\"-Wcast-qual\\\"\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#endif\n\n#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION)\n    #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunused-function\")\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma(\"clang diagnostic ignored \\\"-Wunused-function\\\"\")\n#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma(\"GCC diagnostic ignored \\\"-Wunused-function\\\"\")\n#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505))\n#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma(\"diag_suppress 3142\")\n#else\n    #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION\n#endif\n\n#if defined(JSON_HEDLEY_DEPRECATED)\n    #undef JSON_HEDLEY_DEPRECATED\n#endif\n#if defined(JSON_HEDLEY_DEPRECATED_FOR)\n    #undef JSON_HEDLEY_DEPRECATED_FOR\n#endif\n#if \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated(\"Since \" # since))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated(\"Since \" #since \"; use \" #replacement))\n#elif \\\n    (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__(\"Since \" #since)))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__(\"Since \" #since \"; use \" #replacement)))\n#elif defined(__cplusplus) && (__cplusplus >= 201402L)\n    #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(\"Since \" #since)]])\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated(\"Since \" #since \"; use \" #replacement)]])\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_DEPRECATED(since) _Pragma(\"deprecated\")\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma(\"deprecated\")\n#else\n    #define JSON_HEDLEY_DEPRECATED(since)\n    #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)\n#endif\n\n#if defined(JSON_HEDLEY_UNAVAILABLE)\n    #undef JSON_HEDLEY_UNAVAILABLE\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__(\"Not available until \" #available_since)))\n#else\n    #define JSON_HEDLEY_UNAVAILABLE(available_since)\n#endif\n\n#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)\n    #undef JSON_HEDLEY_WARN_UNUSED_RESULT\n#endif\n#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)\n    #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))\n#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])\n#elif defined(_Check_return_) /* SAL */\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_\n#else\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT\n    #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)\n#endif\n\n#if defined(JSON_HEDLEY_SENTINEL)\n    #undef JSON_HEDLEY_SENTINEL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))\n#else\n    #define JSON_HEDLEY_SENTINEL(position)\n#endif\n\n#if defined(JSON_HEDLEY_NO_RETURN)\n    #undef JSON_HEDLEY_NO_RETURN\n#endif\n#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_NO_RETURN __noreturn\n#elif \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))\n#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L\n    #define JSON_HEDLEY_NO_RETURN _Noreturn\n#elif defined(__cplusplus) && (__cplusplus >= 201103L)\n    #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_NO_RETURN _Pragma(\"does_not_return\")\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_NO_RETURN _Pragma(\"FUNC_NEVER_RETURNS;\")\n#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)\n    #define JSON_HEDLEY_NO_RETURN __attribute((noreturn))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)\n    #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)\n#else\n    #define JSON_HEDLEY_NO_RETURN\n#endif\n\n#if defined(JSON_HEDLEY_NO_ESCAPE)\n    #undef JSON_HEDLEY_NO_ESCAPE\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)\n    #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))\n#else\n    #define JSON_HEDLEY_NO_ESCAPE\n#endif\n\n#if defined(JSON_HEDLEY_UNREACHABLE)\n    #undef JSON_HEDLEY_UNREACHABLE\n#endif\n#if defined(JSON_HEDLEY_UNREACHABLE_RETURN)\n    #undef JSON_HEDLEY_UNREACHABLE_RETURN\n#endif\n#if defined(JSON_HEDLEY_ASSUME)\n    #undef JSON_HEDLEY_ASSUME\n#endif\n#if \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_ASSUME(expr) __assume(expr)\n#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)\n    #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)\n#elif \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)\n    #if defined(__cplusplus)\n        #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)\n    #else\n        #define JSON_HEDLEY_ASSUME(expr) _nassert(expr)\n    #endif\n#endif\n#if \\\n    (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()\n#elif defined(JSON_HEDLEY_ASSUME)\n    #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)\n#endif\n#if !defined(JSON_HEDLEY_ASSUME)\n    #if defined(JSON_HEDLEY_UNREACHABLE)\n        #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))\n    #else\n        #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)\n    #endif\n#endif\n#if defined(JSON_HEDLEY_UNREACHABLE)\n    #if  \\\n        JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n        JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)\n        #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))\n    #else\n        #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()\n    #endif\n#else\n    #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)\n#endif\n#if !defined(JSON_HEDLEY_UNREACHABLE)\n    #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)\n#endif\n\nJSON_HEDLEY_DIAGNOSTIC_PUSH\n#if JSON_HEDLEY_HAS_WARNING(\"-Wpedantic\")\n    #pragma clang diagnostic ignored \"-Wpedantic\"\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wc++98-compat-pedantic\") && defined(__cplusplus)\n    #pragma clang diagnostic ignored \"-Wc++98-compat-pedantic\"\n#endif\n#if JSON_HEDLEY_GCC_HAS_WARNING(\"-Wvariadic-macros\",4,0,0)\n    #if defined(__clang__)\n        #pragma clang diagnostic ignored \"-Wvariadic-macros\"\n    #elif defined(JSON_HEDLEY_GCC_VERSION)\n        #pragma GCC diagnostic ignored \"-Wvariadic-macros\"\n    #endif\n#endif\n#if defined(JSON_HEDLEY_NON_NULL)\n    #undef JSON_HEDLEY_NON_NULL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)\n    #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))\n#else\n    #define JSON_HEDLEY_NON_NULL(...)\n#endif\nJSON_HEDLEY_DIAGNOSTIC_POP\n\n#if defined(JSON_HEDLEY_PRINTF_FORMAT)\n    #undef JSON_HEDLEY_PRINTF_FORMAT\n#endif\n#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))\n#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))\n#elif \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(format) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))\n#else\n    #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)\n#endif\n\n#if defined(JSON_HEDLEY_CONSTEXPR)\n    #undef JSON_HEDLEY_CONSTEXPR\n#endif\n#if defined(__cplusplus)\n    #if __cplusplus >= 201103L\n        #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)\n    #endif\n#endif\n#if !defined(JSON_HEDLEY_CONSTEXPR)\n    #define JSON_HEDLEY_CONSTEXPR\n#endif\n\n#if defined(JSON_HEDLEY_PREDICT)\n    #undef JSON_HEDLEY_PREDICT\n#endif\n#if defined(JSON_HEDLEY_LIKELY)\n    #undef JSON_HEDLEY_LIKELY\n#endif\n#if defined(JSON_HEDLEY_UNLIKELY)\n    #undef JSON_HEDLEY_UNLIKELY\n#endif\n#if defined(JSON_HEDLEY_UNPREDICTABLE)\n    #undef JSON_HEDLEY_UNPREDICTABLE\n#endif\n#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)\n    #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))\n#endif\n#if \\\n  (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \\\n  JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n#  define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability(  (expr), (value), (probability))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability)   __builtin_expect_with_probability(!!(expr),    1   , (probability))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability)  __builtin_expect_with_probability(!!(expr),    0   , (probability))\n#  define JSON_HEDLEY_LIKELY(expr)                      __builtin_expect                 (!!(expr),    1                  )\n#  define JSON_HEDLEY_UNLIKELY(expr)                    __builtin_expect                 (!!(expr),    0                  )\n#elif \\\n  (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \\\n  JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \\\n  JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n#  define JSON_HEDLEY_PREDICT(expr, expected, probability) \\\n    (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \\\n    (__extension__ ({ \\\n        double hedley_probability_ = (probability); \\\n        ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \\\n    }))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \\\n    (__extension__ ({ \\\n        double hedley_probability_ = (probability); \\\n        ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \\\n    }))\n#  define JSON_HEDLEY_LIKELY(expr)   __builtin_expect(!!(expr), 1)\n#  define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)\n#else\n#  define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))\n#  define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))\n#  define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))\n#  define JSON_HEDLEY_LIKELY(expr) (!!(expr))\n#  define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))\n#endif\n#if !defined(JSON_HEDLEY_UNPREDICTABLE)\n    #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)\n#endif\n\n#if defined(JSON_HEDLEY_MALLOC)\n    #undef JSON_HEDLEY_MALLOC\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_MALLOC __attribute__((__malloc__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_MALLOC _Pragma(\"returns_new_memory\")\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_MALLOC __declspec(restrict)\n#else\n    #define JSON_HEDLEY_MALLOC\n#endif\n\n#if defined(JSON_HEDLEY_PURE)\n    #undef JSON_HEDLEY_PURE\n#endif\n#if \\\n  JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n  (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n  (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n  (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n  JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n#  define JSON_HEDLEY_PURE __attribute__((__pure__))\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n#  define JSON_HEDLEY_PURE _Pragma(\"does_not_write_global_data\")\n#elif defined(__cplusplus) && \\\n    ( \\\n      JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \\\n      JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \\\n      JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \\\n    )\n#  define JSON_HEDLEY_PURE _Pragma(\"FUNC_IS_PURE;\")\n#else\n#  define JSON_HEDLEY_PURE\n#endif\n\n#if defined(JSON_HEDLEY_CONST)\n    #undef JSON_HEDLEY_CONST\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(const) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_CONST __attribute__((__const__))\n#elif \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)\n    #define JSON_HEDLEY_CONST _Pragma(\"no_side_effect\")\n#else\n    #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE\n#endif\n\n#if defined(JSON_HEDLEY_RESTRICT)\n    #undef JSON_HEDLEY_RESTRICT\n#endif\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)\n    #define JSON_HEDLEY_RESTRICT restrict\n#elif \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \\\n    defined(__clang__) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_RESTRICT __restrict\n#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)\n    #define JSON_HEDLEY_RESTRICT _Restrict\n#else\n    #define JSON_HEDLEY_RESTRICT\n#endif\n\n#if defined(JSON_HEDLEY_INLINE)\n    #undef JSON_HEDLEY_INLINE\n#endif\n#if \\\n    (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \\\n    (defined(__cplusplus) && (__cplusplus >= 199711L))\n    #define JSON_HEDLEY_INLINE inline\n#elif \\\n    defined(JSON_HEDLEY_GCC_VERSION) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)\n    #define JSON_HEDLEY_INLINE __inline__\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_INLINE __inline\n#else\n    #define JSON_HEDLEY_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_ALWAYS_INLINE)\n    #undef JSON_HEDLEY_ALWAYS_INLINE\n#endif\n#if \\\n  JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n  JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n  JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n  JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n  JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n  (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n  (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n  (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n  (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n  JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n  JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n  JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n  JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \\\n  JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE\n#elif \\\n  JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \\\n  JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE __forceinline\n#elif defined(__cplusplus) && \\\n    ( \\\n      JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n      JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n      JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n      JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n      JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n      JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \\\n    )\n#  define JSON_HEDLEY_ALWAYS_INLINE _Pragma(\"FUNC_ALWAYS_INLINE;\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n#  define JSON_HEDLEY_ALWAYS_INLINE _Pragma(\"inline=forced\")\n#else\n#  define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_NEVER_INLINE)\n    #undef JSON_HEDLEY_NEVER_INLINE\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \\\n    JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \\\n    (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \\\n    (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \\\n    (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \\\n    (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \\\n    JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \\\n    JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \\\n    JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)\n    #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)\n#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"noinline\")\n#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"FUNC_CANNOT_INLINE;\")\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n    #define JSON_HEDLEY_NEVER_INLINE _Pragma(\"inline=never\")\n#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)\n    #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)\n    #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)\n#else\n    #define JSON_HEDLEY_NEVER_INLINE\n#endif\n\n#if defined(JSON_HEDLEY_PRIVATE)\n    #undef JSON_HEDLEY_PRIVATE\n#endif\n#if defined(JSON_HEDLEY_PUBLIC)\n    #undef JSON_HEDLEY_PUBLIC\n#endif\n#if defined(JSON_HEDLEY_IMPORT)\n    #undef JSON_HEDLEY_IMPORT\n#endif\n#if defined(_WIN32) || defined(__CYGWIN__)\n#  define JSON_HEDLEY_PRIVATE\n#  define JSON_HEDLEY_PUBLIC   __declspec(dllexport)\n#  define JSON_HEDLEY_IMPORT   __declspec(dllimport)\n#else\n#  if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n    ( \\\n      defined(__TI_EABI__) && \\\n      ( \\\n        (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \\\n        JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \\\n      ) \\\n    ) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n#    define JSON_HEDLEY_PRIVATE __attribute__((__visibility__(\"hidden\")))\n#    define JSON_HEDLEY_PUBLIC  __attribute__((__visibility__(\"default\")))\n#  else\n#    define JSON_HEDLEY_PRIVATE\n#    define JSON_HEDLEY_PUBLIC\n#  endif\n#  define JSON_HEDLEY_IMPORT    extern\n#endif\n\n#if defined(JSON_HEDLEY_NO_THROW)\n    #undef JSON_HEDLEY_NO_THROW\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))\n#elif \\\n    JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)\n    #define JSON_HEDLEY_NO_THROW __declspec(nothrow)\n#else\n    #define JSON_HEDLEY_NO_THROW\n#endif\n\n#if defined(JSON_HEDLEY_FALL_THROUGH)\n    #undef JSON_HEDLEY_FALL_THROUGH\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)\n    #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])\n#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)\n    #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])\n#elif defined(__fallthrough) /* SAL */\n    #define JSON_HEDLEY_FALL_THROUGH __fallthrough\n#else\n    #define JSON_HEDLEY_FALL_THROUGH\n#endif\n\n#if defined(JSON_HEDLEY_RETURNS_NON_NULL)\n    #undef JSON_HEDLEY_RETURNS_NON_NULL\n#endif\n#if \\\n    JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))\n#elif defined(_Ret_notnull_) /* SAL */\n    #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_\n#else\n    #define JSON_HEDLEY_RETURNS_NON_NULL\n#endif\n\n#if defined(JSON_HEDLEY_ARRAY_PARAM)\n    #undef JSON_HEDLEY_ARRAY_PARAM\n#endif\n#if \\\n    defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \\\n    !defined(__STDC_NO_VLA__) && \\\n    !defined(__cplusplus) && \\\n    !defined(JSON_HEDLEY_PGI_VERSION) && \\\n    !defined(JSON_HEDLEY_TINYC_VERSION)\n    #define JSON_HEDLEY_ARRAY_PARAM(name) (name)\n#else\n    #define JSON_HEDLEY_ARRAY_PARAM(name)\n#endif\n\n#if defined(JSON_HEDLEY_IS_CONSTANT)\n    #undef JSON_HEDLEY_IS_CONSTANT\n#endif\n#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)\n    #undef JSON_HEDLEY_REQUIRE_CONSTEXPR\n#endif\n/* JSON_HEDLEY_IS_CONSTEXPR_ is for\n   HEDLEY INTERNAL USE ONLY.  API subject to change without notice. */\n#if defined(JSON_HEDLEY_IS_CONSTEXPR_)\n    #undef JSON_HEDLEY_IS_CONSTEXPR_\n#endif\n#if \\\n    JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \\\n    JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n    JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n    JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \\\n    JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \\\n    JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n    JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \\\n    (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \\\n    JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \\\n    JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)\n    #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)\n#endif\n#if !defined(__cplusplus)\n#  if \\\n       JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \\\n       JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \\\n       JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n       JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \\\n       JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \\\n       JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \\\n       JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)\n#if defined(__INTPTR_TYPE__)\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)\n#else\n    #include <stdint.h>\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)\n#endif\n#  elif \\\n       ( \\\n          defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \\\n          !defined(JSON_HEDLEY_SUNPRO_VERSION) && \\\n          !defined(JSON_HEDLEY_PGI_VERSION) && \\\n          !defined(JSON_HEDLEY_IAR_VERSION)) || \\\n       (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \\\n       JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \\\n       JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \\\n       JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \\\n       JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)\n#if defined(__INTPTR_TYPE__)\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)\n#else\n    #include <stdint.h>\n    #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)\n#endif\n#  elif \\\n       defined(JSON_HEDLEY_GCC_VERSION) || \\\n       defined(JSON_HEDLEY_INTEL_VERSION) || \\\n       defined(JSON_HEDLEY_TINYC_VERSION) || \\\n       defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \\\n       JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \\\n       defined(JSON_HEDLEY_TI_CL2000_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CL6X_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CL7X_VERSION) || \\\n       defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \\\n       defined(__clang__)\n#    define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \\\n        sizeof(void) != \\\n        sizeof(*( \\\n                  1 ? \\\n                  ((void*) ((expr) * 0L) ) : \\\n((struct { char v[sizeof(void) * 2]; } *) 1) \\\n                ) \\\n              ) \\\n                                            )\n#  endif\n#endif\n#if defined(JSON_HEDLEY_IS_CONSTEXPR_)\n    #if !defined(JSON_HEDLEY_IS_CONSTANT)\n        #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)\n    #endif\n    #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))\n#else\n    #if !defined(JSON_HEDLEY_IS_CONSTANT)\n        #define JSON_HEDLEY_IS_CONSTANT(expr) (0)\n    #endif\n    #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)\n#endif\n\n#if defined(JSON_HEDLEY_BEGIN_C_DECLS)\n    #undef JSON_HEDLEY_BEGIN_C_DECLS\n#endif\n#if defined(JSON_HEDLEY_END_C_DECLS)\n    #undef JSON_HEDLEY_END_C_DECLS\n#endif\n#if defined(JSON_HEDLEY_C_DECL)\n    #undef JSON_HEDLEY_C_DECL\n#endif\n#if defined(__cplusplus)\n    #define JSON_HEDLEY_BEGIN_C_DECLS extern \"C\" {\n    #define JSON_HEDLEY_END_C_DECLS }\n    #define JSON_HEDLEY_C_DECL extern \"C\"\n#else\n    #define JSON_HEDLEY_BEGIN_C_DECLS\n    #define JSON_HEDLEY_END_C_DECLS\n    #define JSON_HEDLEY_C_DECL\n#endif\n\n#if defined(JSON_HEDLEY_STATIC_ASSERT)\n    #undef JSON_HEDLEY_STATIC_ASSERT\n#endif\n#if \\\n  !defined(__cplusplus) && ( \\\n      (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \\\n      (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \\\n      JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \\\n      JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \\\n      defined(_Static_assert) \\\n    )\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)\n#elif \\\n  (defined(__cplusplus) && (__cplusplus >= 201103L)) || \\\n  JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \\\n  JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))\n#else\n#  define JSON_HEDLEY_STATIC_ASSERT(expr, message)\n#endif\n\n#if defined(JSON_HEDLEY_NULL)\n    #undef JSON_HEDLEY_NULL\n#endif\n#if defined(__cplusplus)\n    #if __cplusplus >= 201103L\n        #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)\n    #elif defined(NULL)\n        #define JSON_HEDLEY_NULL NULL\n    #else\n        #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)\n    #endif\n#elif defined(NULL)\n    #define JSON_HEDLEY_NULL NULL\n#else\n    #define JSON_HEDLEY_NULL ((void*) 0)\n#endif\n\n#if defined(JSON_HEDLEY_MESSAGE)\n    #undef JSON_HEDLEY_MESSAGE\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n#  define JSON_HEDLEY_MESSAGE(msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \\\n    JSON_HEDLEY_PRAGMA(message msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#elif \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)\n#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)\n#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)\n#  define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#else\n#  define JSON_HEDLEY_MESSAGE(msg)\n#endif\n\n#if defined(JSON_HEDLEY_WARNING)\n    #undef JSON_HEDLEY_WARNING\n#endif\n#if JSON_HEDLEY_HAS_WARNING(\"-Wunknown-pragmas\")\n#  define JSON_HEDLEY_WARNING(msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \\\n    JSON_HEDLEY_PRAGMA(clang warning msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#elif \\\n  JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \\\n  JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \\\n  JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)\n#elif \\\n  JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \\\n  JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))\n#else\n#  define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)\n#endif\n\n#if defined(JSON_HEDLEY_REQUIRE)\n    #undef JSON_HEDLEY_REQUIRE\n#endif\n#if defined(JSON_HEDLEY_REQUIRE_MSG)\n    #undef JSON_HEDLEY_REQUIRE_MSG\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)\n#  if JSON_HEDLEY_HAS_WARNING(\"-Wgcc-compat\")\n#    define JSON_HEDLEY_REQUIRE(expr) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wgcc-compat\\\"\") \\\n    __attribute__((diagnose_if(!(expr), #expr, \"error\"))) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#    define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \\\n    JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n    _Pragma(\"clang diagnostic ignored \\\"-Wgcc-compat\\\"\") \\\n    __attribute__((diagnose_if(!(expr), msg, \"error\"))) \\\n    JSON_HEDLEY_DIAGNOSTIC_POP\n#  else\n#    define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, \"error\")))\n#    define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, \"error\")))\n#  endif\n#else\n#  define JSON_HEDLEY_REQUIRE(expr)\n#  define JSON_HEDLEY_REQUIRE_MSG(expr,msg)\n#endif\n\n#if defined(JSON_HEDLEY_FLAGS)\n    #undef JSON_HEDLEY_FLAGS\n#endif\n#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING(\"-Wbitfield-enum-conversion\"))\n    #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))\n#else\n    #define JSON_HEDLEY_FLAGS\n#endif\n\n#if defined(JSON_HEDLEY_FLAGS_CAST)\n    #undef JSON_HEDLEY_FLAGS_CAST\n#endif\n#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)\n#  define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \\\n        JSON_HEDLEY_DIAGNOSTIC_PUSH \\\n        _Pragma(\"warning(disable:188)\") \\\n        ((T) (expr)); \\\n        JSON_HEDLEY_DIAGNOSTIC_POP \\\n    }))\n#else\n#  define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)\n#endif\n\n#if defined(JSON_HEDLEY_EMPTY_BASES)\n    #undef JSON_HEDLEY_EMPTY_BASES\n#endif\n#if \\\n    (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \\\n    JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)\n    #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)\n#else\n    #define JSON_HEDLEY_EMPTY_BASES\n#endif\n\n/* Remaining macros are deprecated. */\n\n#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)\n    #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK\n#endif\n#if defined(__clang__)\n    #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)\n#else\n    #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)\n#endif\n\n#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)\n    #undef JSON_HEDLEY_CLANG_HAS_BUILTIN\n#endif\n#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)\n    #undef JSON_HEDLEY_CLANG_HAS_FEATURE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)\n    #undef JSON_HEDLEY_CLANG_HAS_EXTENSION\n#endif\n#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)\n    #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE\n#endif\n#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)\n\n#if defined(JSON_HEDLEY_CLANG_HAS_WARNING)\n    #undef JSON_HEDLEY_CLANG_HAS_WARNING\n#endif\n#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)\n\n#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */\n"
  },
  {
    "path": "Game Trainers/common/include/nlohmann/thirdparty/hedley/hedley_undef.hpp",
    "content": "//     __ _____ _____ _____\n//  __|  |   __|     |   | |  JSON for Modern C++\n// |  |  |__   |  |  | | | |  version 3.11.3\n// |_____|_____|_____|_|___|  https://github.com/nlohmann/json\n//\n// SPDX-FileCopyrightText: 2013 - 2024 Niels Lohmann <https://nlohmann.me>\n// SPDX-License-Identifier: MIT\n\n#pragma once\n\n#undef JSON_HEDLEY_ALWAYS_INLINE\n#undef JSON_HEDLEY_ARM_VERSION\n#undef JSON_HEDLEY_ARM_VERSION_CHECK\n#undef JSON_HEDLEY_ARRAY_PARAM\n#undef JSON_HEDLEY_ASSUME\n#undef JSON_HEDLEY_BEGIN_C_DECLS\n#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_BUILTIN\n#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_CLANG_HAS_EXTENSION\n#undef JSON_HEDLEY_CLANG_HAS_FEATURE\n#undef JSON_HEDLEY_CLANG_HAS_WARNING\n#undef JSON_HEDLEY_COMPCERT_VERSION\n#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK\n#undef JSON_HEDLEY_CONCAT\n#undef JSON_HEDLEY_CONCAT3\n#undef JSON_HEDLEY_CONCAT3_EX\n#undef JSON_HEDLEY_CONCAT_EX\n#undef JSON_HEDLEY_CONST\n#undef JSON_HEDLEY_CONSTEXPR\n#undef JSON_HEDLEY_CONST_CAST\n#undef JSON_HEDLEY_CPP_CAST\n#undef JSON_HEDLEY_CRAY_VERSION\n#undef JSON_HEDLEY_CRAY_VERSION_CHECK\n#undef JSON_HEDLEY_C_DECL\n#undef JSON_HEDLEY_DEPRECATED\n#undef JSON_HEDLEY_DEPRECATED_FOR\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS\n#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION\n#undef JSON_HEDLEY_DIAGNOSTIC_POP\n#undef JSON_HEDLEY_DIAGNOSTIC_PUSH\n#undef JSON_HEDLEY_DMC_VERSION\n#undef JSON_HEDLEY_DMC_VERSION_CHECK\n#undef JSON_HEDLEY_EMPTY_BASES\n#undef JSON_HEDLEY_EMSCRIPTEN_VERSION\n#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK\n#undef JSON_HEDLEY_END_C_DECLS\n#undef JSON_HEDLEY_FLAGS\n#undef JSON_HEDLEY_FLAGS_CAST\n#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_BUILTIN\n#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_GCC_HAS_EXTENSION\n#undef JSON_HEDLEY_GCC_HAS_FEATURE\n#undef JSON_HEDLEY_GCC_HAS_WARNING\n#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK\n#undef JSON_HEDLEY_GCC_VERSION\n#undef JSON_HEDLEY_GCC_VERSION_CHECK\n#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_BUILTIN\n#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_GNUC_HAS_EXTENSION\n#undef JSON_HEDLEY_GNUC_HAS_FEATURE\n#undef JSON_HEDLEY_GNUC_HAS_WARNING\n#undef JSON_HEDLEY_GNUC_VERSION\n#undef JSON_HEDLEY_GNUC_VERSION_CHECK\n#undef JSON_HEDLEY_HAS_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_BUILTIN\n#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS\n#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE\n#undef JSON_HEDLEY_HAS_EXTENSION\n#undef JSON_HEDLEY_HAS_FEATURE\n#undef JSON_HEDLEY_HAS_WARNING\n#undef JSON_HEDLEY_IAR_VERSION\n#undef JSON_HEDLEY_IAR_VERSION_CHECK\n#undef JSON_HEDLEY_IBM_VERSION\n#undef JSON_HEDLEY_IBM_VERSION_CHECK\n#undef JSON_HEDLEY_IMPORT\n#undef JSON_HEDLEY_INLINE\n#undef JSON_HEDLEY_INTEL_CL_VERSION\n#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK\n#undef JSON_HEDLEY_INTEL_VERSION\n#undef JSON_HEDLEY_INTEL_VERSION_CHECK\n#undef JSON_HEDLEY_IS_CONSTANT\n#undef JSON_HEDLEY_IS_CONSTEXPR_\n#undef JSON_HEDLEY_LIKELY\n#undef JSON_HEDLEY_MALLOC\n#undef JSON_HEDLEY_MCST_LCC_VERSION\n#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK\n#undef JSON_HEDLEY_MESSAGE\n#undef JSON_HEDLEY_MSVC_VERSION\n#undef JSON_HEDLEY_MSVC_VERSION_CHECK\n#undef JSON_HEDLEY_NEVER_INLINE\n#undef JSON_HEDLEY_NON_NULL\n#undef JSON_HEDLEY_NO_ESCAPE\n#undef JSON_HEDLEY_NO_RETURN\n#undef JSON_HEDLEY_NO_THROW\n#undef JSON_HEDLEY_NULL\n#undef JSON_HEDLEY_PELLES_VERSION\n#undef JSON_HEDLEY_PELLES_VERSION_CHECK\n#undef JSON_HEDLEY_PGI_VERSION\n#undef JSON_HEDLEY_PGI_VERSION_CHECK\n#undef JSON_HEDLEY_PREDICT\n#undef JSON_HEDLEY_PRINTF_FORMAT\n#undef JSON_HEDLEY_PRIVATE\n#undef JSON_HEDLEY_PUBLIC\n#undef JSON_HEDLEY_PURE\n#undef JSON_HEDLEY_REINTERPRET_CAST\n#undef JSON_HEDLEY_REQUIRE\n#undef JSON_HEDLEY_REQUIRE_CONSTEXPR\n#undef JSON_HEDLEY_REQUIRE_MSG\n#undef JSON_HEDLEY_RESTRICT\n#undef JSON_HEDLEY_RETURNS_NON_NULL\n#undef JSON_HEDLEY_SENTINEL\n#undef JSON_HEDLEY_STATIC_ASSERT\n#undef JSON_HEDLEY_STATIC_CAST\n#undef JSON_HEDLEY_STRINGIFY\n#undef JSON_HEDLEY_STRINGIFY_EX\n#undef JSON_HEDLEY_SUNPRO_VERSION\n#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK\n#undef JSON_HEDLEY_TINYC_VERSION\n#undef JSON_HEDLEY_TINYC_VERSION_CHECK\n#undef JSON_HEDLEY_TI_ARMCL_VERSION\n#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL2000_VERSION\n#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL430_VERSION\n#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL6X_VERSION\n#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CL7X_VERSION\n#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK\n#undef JSON_HEDLEY_TI_CLPRU_VERSION\n#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK\n#undef JSON_HEDLEY_TI_VERSION\n#undef JSON_HEDLEY_TI_VERSION_CHECK\n#undef JSON_HEDLEY_UNAVAILABLE\n#undef JSON_HEDLEY_UNLIKELY\n#undef JSON_HEDLEY_UNPREDICTABLE\n#undef JSON_HEDLEY_UNREACHABLE\n#undef JSON_HEDLEY_UNREACHABLE_RETURN\n#undef JSON_HEDLEY_VERSION\n#undef JSON_HEDLEY_VERSION_DECODE_MAJOR\n#undef JSON_HEDLEY_VERSION_DECODE_MINOR\n#undef JSON_HEDLEY_VERSION_DECODE_REVISION\n#undef JSON_HEDLEY_VERSION_ENCODE\n#undef JSON_HEDLEY_WARNING\n#undef JSON_HEDLEY_WARN_UNUSED_RESULT\n#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG\n#undef JSON_HEDLEY_FALL_THROUGH\n"
  },
  {
    "path": "Game Trainers/documents/trainer_template.h",
    "content": "#pragma once\n\n#include \"TrainerBase.h\" // Your base class providing the helper functions\n#include \"MonoBase.h\"    // For Unity games (if needed)\n\n/**\n * @file trainer_template.h\n * @brief A template for creating a new game-specific trainer.\n *\n * This file serves as a guide, showing examples of different types of\n * trainer functions (cheats) you can implement using the TrainerBase.\n *\n * --- How to use this template ---\n * 1. Copy this file and rename it (e.g., \"MyGameTrainer.h\").\n * 2. Change the game's executable name in the constructor (e.g., \"WOL2-Win64-Shipping.exe\").\n * 3. Change the 'moduleName' constant to match the .exe or a .dll (e.g., \"GameAssembly.dll\").\n * 4. Find your offsets/AOBs/methods and fill in the function you need.\n */\nclass Trainer : public TrainerBase // Or MonoBase if it's a Unity game\n{\npublic:\n    /**\n     * @brief Constructor.\n     * @param gameProcessName The executable name of the game (e.g., \"MyGame-Win64-Shipping.exe\").\n     */\n    Trainer() : TrainerBase(L\"MyGame-Win64-Shipping.exe\") // <-- TODO: Change this\n    {\n    }\n\n    ~Trainer() override = default;\n\n    // --- Constants ---\n    // TODO: Change this to your game's module to be used (can be .exe or a .dll like GameAssembly.dll)\n    static inline const wchar_t *moduleName = L\"MyGame-Win64-Shipping.exe\";\n\n    //=====================================================================\n    // SECTION 1: POINTER TOGGLES (Freezing Values)\n    //=====================================================================\n    //\n    // Use this type for cheats that need to \"freeze\" a value, like\n    // \"God Mode\" (infinite health) or \"Infinite Ammo.\"\n    // This works by repeatedly writing 'newVal' to the address found\n    // by resolving the pointer chain.\n    //\n    // Base Function: createPointerToggle(moduleName, \"CheatName\", offsets, newVal)\n    //\n\n    /**\n     * @brief Sets and freezes the player's health.\n     * @param newVal The value to freeze health at (e.g., 100.0f).\n     */\n    inline bool setInfiniteHealth(float newVal)\n    {\n        // Base address is from 'moduleName'\n        std::vector<unsigned int> offsets = {0x01ABCDEF, 0x10, 0x20, 0x30}; // <-- TODO: Find your offsets\n        return createPointerToggle(moduleName, \"SetHealth\", offsets, newVal);\n    }\n\n    //=====================================================================\n    // SECTION 2: POINTER WRITES (One-Time Set)\n    //=====================================================================\n    //\n    // Use this type for cheats that set a value *once*, like\n    // \"Give 9999 Coins\" or \"Set Level.\"\n    // This resolves the pointer chain and writes the value just one time.\n    //\n    // Base Function: WriteToDynamicAddress(moduleName, offsets, newVal)\n    //\n\n    /**\n     * @brief Sets the player's coins to a specific amount.\n     * @param amount The amount to set (e.g., 9999).\n     */\n    inline bool setCoins(int amount)\n    {\n        // Base address is from 'moduleName'\n        std::vector<unsigned int> offsets = {0x03DEF456, 0x18, 0x28, 0x38}; // <-- TODO: Find your offsets\n        return WriteToDynamicAddress(moduleName, offsets, amount);\n    }\n\n    //=====================================================================\n    // SECTION 3: AOB SCAN & INJECTION (Code Cave Hooking)\n    //=====================================================================\n    //\n    // Use this type for complex cheats that modify game logic, such as\n    // \"Multiply Coin Gain,\" or for replacing instructions with\n    // more complex logic (e.g., replacing 'inc' with a 'mov').\n    // This finds a unique array of bytes (AOB) and \"hooks\" it to\n    // run your custom assembly code in an allocated \"code cave\".\n    //\n    // Base Function: createNamedHook(moduleName, \"HookName\", pat, offset, len, size, buildFunc)\n    //\n\n    /**\n     * @brief Modifies coin gain (e.g., multiplies it) by patching game code.\n     * @param multiplier The value to use (e.g., 10).\n     */\n    inline bool patchCoinGain(int multiplier)\n    {\n        // Example: Patches code that looks like \"add [rax+50], ebx\"\n        const std::vector<std::string> pat = {\"01\", \"58\", \"50\", \"48\", \"83\", \"C4\", \"20\"}; // <-- TODO: Find AOB\n        size_t patternOffset = 0;   // 0 = hook at the start of the pattern\n        size_t overwriteLen = 7;    // 7 = length of the bytes in 'pat'\n        size_t codeSize = 0x100;    // 256 bytes for our code cave\n\n        // The buildFunc writes the custom assembly\n        auto buildFunc = [multiplier, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            const size_t dataOffset = 0x80;\n            std::vector<BYTE> code(codeSize, 0x90);\n\n            // --- DATA SECTION ---\n            std::memcpy(&code[dataOffset], &multiplier, sizeof(int));\n            uintptr_t dataAbsoluteAddr = codeCaveAddr + dataOffset;\n\n            // --- CODE SECTION ---\n            size_t wPos = 0;\n\n            // --- Custom Assembly (32/64-bit safe) ---\n            // TODO: Customize this section. This example loads value into 'ebx'.\n            // Note that x64 can't mov absolute addresses into registers directly,\n            // so we use RIP-relative addressing there.\n\n            if (sizeof(uintptr_t) == 8)\n            {\n                // --- 64-BIT (x64) PATH ---\n                // We MUST use RIP-relative addressing.\n                // mov ebx, [rip + rel32] => 8B 1D <rel32>\n                code[wPos++] = 0x8B;\n                code[wPos++] = 0x1D; // 0x1D=ebx, 0x05=eax, 0x0D=ecx, 0x15=edx\n\n                // Calculate the relative offset from the *next* instruction\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t rel32 = static_cast<int32_t>(dataAbsoluteAddr - nextInstrAddr);\n\n                std::memcpy(&code[wPos], &rel32, 4);\n                wPos += 4;\n            }\n            else if (sizeof(uintptr_t) == 4)\n            {\n                // --- 32-BIT (x86) PATH ---\n                // We can use an absolute 32-bit address.\n                // mov ebx, [absolute_addr32] => 8B 1D <addr32>\n                code[wPos++] = 0x8B;\n                code[wPos++] = 0x1D; // 0x1D=ebx, 0x05=eax, 0x0D=ecx, 0x15=edx\n\n                // Cast the address to 32-bit (which is safe in 32-bit mode)\n                uint32_t absAddr32 = static_cast<uint32_t>(dataAbsoluteAddr);\n\n                std::memcpy(&code[wPos], &absAddr32, 4);\n                wPos += 4;\n            }\n            // --- End Custom Assembly ---\n\n            // Copy original instructions (the ones we overwrote)\n            std::memcpy(&code[wPos], originalBytes.data(), originalBytes.size());\n            wPos += originalBytes.size();\n\n            // jmp back to the original code\n            code[wPos++] = 0xE9;\n            uintptr_t returnAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n            int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n            std::memcpy(&code[wPos], &relativeJump, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(moduleName, \"PatchCoinGain\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    //=====================================================================\n    // SECTION 4: MONO DLL INJECTION (Unity Games)\n    //=====================================================================\n    //\n    // Use this type for Unity games to call C# methods directly.\n    // This requires a separate C# DLL (e.g., \"GCMInjection.dll\")\n    // to be injected into the game's Mono runtime.\n    //\n    // Base Functions:\n    // initializeDllInjection() - Call this once.\n    // invokeMethod(namespace, \"ClassName\", \"MethodName\", {args})\n    // invokeMethodReturn(namespace, \"ClassName\", \"MethodName\", {args})\n    //\n\n    /**\n     * @brief Spawns an item using a C# method from your injected DLL.\n     * @param itemIndex The ID of the item to spawn.\n     */\n    inline bool spawnItem(int itemIndex)\n    {\n        if (initializeDllInjection())\n        {\n            // Calls: GCMInjection.SpawnItem(itemIndex)\n            return invokeMethod(\n                \"\",                 // C# namespace (empty for global)\n                \"GCMInjection\", // <-- TODO: Your C# class name\n                \"SpawnItem\",    // <-- TODO: Your C# method name\n                {itemIndex}         // Arguments\n            );\n        }\n        return false;\n    }\n\n    //=====================================================================\n    // SECTION 5: BYTE PATCHING (Simple In-Place Writes)\n    //=====================================================================\n    //\n    // Use this type for simple, direct memory patches where you are not\n    // injecting a code cave. This is perfect for changing one instruction\n    // into another (e.g., JNE -> JE) or NOP-ing out an instruction.\n    //\n    // (This requires the 'createBytePatch' function in your TrainerBase.h)\n    //\n    // Base Function: createBytePatch(moduleName, \"CheatName\", pat, patchOffset, newBytes)\n    //\n\n    /**\n     * @brief Disables plant cooldown by patching a JNE instruction to a JE.\n     */\n    inline bool setNoPlantCooldown()\n    {\n        // AOB to find the unique instruction\n        const std::vector<std::string> pat = {\"0F\", \"85\", \"25\", \"04\", \"00\", \"00\", \"48\", \"8B\", \"43\"}; // <-- TODO: Find your AOB\n        \n        // Patch at an offset of 1 byte from the start of the pattern.\n        size_t patchOffset = 1;\n\n        // The new byte(s) to write. We are changing 0F 85 (JNE) to 0F 84 (JE).\n        // Since the 0F is at offset 0, we only need to write the 84 at offset 1.\n        const std::vector<BYTE> newBytes = { 0x84 }; // 0x84 = JE\n\n        // Call the byte patch function\n        return createBytePatch(\n            moduleName,\n            \"NoPlantCooldown\",  // Hook name\n            pat,                // AOB pattern\n            patchOffset,        // Offset from pattern start\n            newBytes            // Bytes to write\n        );\n    }\n};"
  },
  {
    "path": "Game Trainers/scripts/font_processor.py",
    "content": "import json\nimport argparse\nimport os\nimport re\nimport tokenize\nfrom fontTools.ttLib import TTFont\nfrom fontTools.subset import Subsetter, Options\n\n\ndef extract_text_from_file(file_path):\n    \"\"\"Extract text from a file based on its extension.\"\"\"\n    ext = os.path.splitext(file_path)[1].lower()\n    if ext == '.txt':\n        with open(file_path, 'r', encoding='utf-8') as f:\n            return f.read()\n    elif ext == '.json':\n        with open(file_path, 'r', encoding='utf-8') as f:\n            data = json.load(f)\n            return extract_text_from_json(data)\n    elif ext == '.py':\n        return extract_strings_from_py(file_path)\n    elif ext == '.rs':\n        return extract_strings_from_rs(file_path)\n    else:\n        raise ValueError(f\"Unsupported file type: {ext}\")\n\n\ndef extract_text_from_json(data):\n    \"\"\"Recursively extract all string values from a JSON object.\"\"\"\n    if isinstance(data, dict):\n        return ''.join(extract_text_from_json(v) for v in data.values())\n    elif isinstance(data, list):\n        return ''.join(extract_text_from_json(item) for item in data)\n    elif isinstance(data, str):\n        return data\n    else:\n        return ''\n\n\ndef extract_strings_from_py(file_path):\n    \"\"\"Extract string literals from a Python file using tokenize.\"\"\"\n    with open(file_path, 'rb') as f:\n        tokens = tokenize.tokenize(f.readline)\n        strings = [\n            token.string for token in tokens if token.type == tokenize.STRING]\n    return ''.join(strings)\n\n\ndef extract_strings_from_rs(file_path):\n    \"\"\"Extract string and char literals from a Rust file using regex.\"\"\"\n    with open(file_path, 'r', encoding='utf-8') as f:\n        content = f.read()\n    string_pattern = r'\"((?:[^\"\\\\]|\\\\.)*)\"'\n    char_pattern = r\"'([^'\\\\]|\\\\.)'\"\n    strings = re.findall(string_pattern, content)\n    chars = re.findall(char_pattern, content)\n    all_text = ''.join(strings) + ''.join(chars)\n    return all_text\n\n\ndef get_unique_characters(files):\n    \"\"\"Get a set of unique characters from a list of files.\"\"\"\n    unique_chars = set()\n    for file in files:\n        text = extract_text_from_file(file)\n        unique_chars.update(text)\n    return unique_chars\n\n\ndef subset_font(font_path, characters, output_path):\n    \"\"\"Subset the font to include only the specified characters, optimized for size.\"\"\"\n    options = Options()\n    options.no_hinting = True  # Remove hinting to reduce size\n    options.no_layout_closure = True  # Avoid including related glyphs\n    options.prune_unicode_ranges = True  # Remove unused Unicode ranges\n    subsetter = Subsetter(options)\n    font = TTFont(font_path)\n    subsetter.populate(text=''.join(characters))\n    subsetter.subset(font)\n    font.save(output_path)\n\n\ndef main():\n    parser = argparse.ArgumentParser(\n        description=\"Subset NotoSansSC-Regular.ttf to a minimal TTF file.\")\n    parser.add_argument('files', nargs='+',\n                        help=\"List of .txt, .json, .py, or .rs files containing text.\")\n    parser.add_argument(\n        '--font', default='NotoSansSC-Regular.ttf', help=\"Path to the font file.\")\n    parser.add_argument('--output', default='NotoSansSC-Subset.ttf',\n                        help=\"Output path for the subsetted font.\")\n    args = parser.parse_args()\n\n    # Validate input files\n    for file in args.files:\n        if not os.path.exists(file):\n            raise FileNotFoundError(f\"Input file not found: {file}\")\n\n    # Validate font file\n    if not os.path.exists(args.font):\n        raise FileNotFoundError(f\"Font file not found: {args.font}\")\n\n    # Extract unique characters\n    unique_chars = get_unique_characters(args.files)\n    print(f\"Found {len(unique_chars)} unique characters for subsetting.\")\n\n    # Subset the font\n    subset_font(args.font, unique_chars, args.output)\n    print(f\"Optimized subsetted font saved to {args.output}\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "Game Trainers/scripts/gcm_trainers.json",
    "content": "[\n    {\n        \"game_name\": \"Arrow A Row\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Arrow A Row Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"DREDGE\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/DREDGE Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"Feeding Frenzy 2: Shipwreck Showdown\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Feeding Frenzy 2_Shipwreck Showdown Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"Headbangers: Rhythm Royale\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Headbangers_Rhythm Royale Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"Heavy Weapon\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Heavy Weapon Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"Inotia 4\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Inotia 4 Trainer.exe\",\n        \"version\": \"2026.2.8\"\n    },\n    {\n        \"game_name\": \"Just Shapes & Beats\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Just Shapes & Beats Trainer.exe\",\n        \"version\": \"2026.2.8\"\n    },\n    {\n        \"game_name\": \"Oil Rush\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Oil Rush Trainer.exe\",\n        \"version\": \"2026.2.21\"\n    },\n    {\n        \"game_name\": \"Outland\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Outland Trainer.exe\",\n        \"version\": \"2026.2.8\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies: GOTY Edition\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies_GOTY Edition Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies: Replanted\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies_Replanted Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"PvZ2 Gardendless\",\n        \"origin\": \"gcm\",\n        \"official_url\": \"https://pvzge.com/\",\n        \"gcm_url\": \"GCM/GCM Trainers/PvZ2 Gardendless Trainer.exe\",\n        \"version\": \"2026.3.3\"\n    },\n    {\n        \"game_name\": \"Wizard of Legend 2\",\n        \"origin\": \"gcm\",\n        \"gcm_url\": \"GCM/GCM Trainers/Wizard of Legend 2 Trainer.exe\",\n        \"version\": \"2025.11.27\"\n    },\n    {\n        \"game_name\": \"Core Keeper\",\n        \"origin\": \"other\",\n        \"author\": \"RussDev7\",\n        \"custom_name\": \"Workshop\",\n        \"official_url\": \"https://github.com/RussDev7/CoreKeepersWorkshop\",\n        \"gcm_url\": \"GCM/GCM Trainers/Core Keeper Workshop [RussDev7].zip\",\n        \"version\": \"2025.8.3\"\n    },\n    {\n        \"game_name\": \"Unrailed 2: Back on Track\",\n        \"origin\": \"ct_other\",\n        \"author\": \"一起抢工作Singaplus\",\n        \"official_url\": \"https://ocnokiy7h00u.feishu.cn/wiki/TFj9wUigPiJCUPkkhKMclo5xnoc\",\n        \"gcm_url\": \"GCM/GCM Trainers/Unrailed 2_Back on Track Trainer [Singaplus].ct\",\n        \"version\": \"2026.2.17\"\n    },\n    {\n        \"game_name\": \"Elden Ring Nightreign\",\n        \"origin\": \"other\",\n        \"author\": \"GBrain\",\n        \"custom_name\": \"遗物修改助手\",\n        \"official_url\": \"https://space.bilibili.com/58332755\",\n        \"gcm_url\": \"GCM/GCM Trainers/Elden Ring Nightreign YiWuXiuGaiZhuShou [GBrain].exe\",\n        \"version\": \"2026.2.2\"\n    },\n    {\n        \"game_name\": \"Diablo II: Resurrected\",\n        \"origin\": \"other\",\n        \"author\": \"DoZerg\",\n        \"custom_name_en\": \"Character Editor\",\n        \"custom_name_zh\": \"角色编辑器\",\n        \"official_url\": \"https://github.com/daidodo/diablo_edit\",\n        \"gcm_url\": \"GCM/GCM Trainers/Diablo II_Resurrected Character Editor [DoZerg].exe\",\n        \"version\": \"2024.9.23\"\n    },\n    {\n        \"game_name\": \"Forza Horizon 5\",\n        \"origin\": \"other\",\n        \"author\": \"Merika\",\n        \"official_url\": \"https://www.merika.dev/trainers/fh5\",\n        \"gcm_url\": \"GCM/GCM Trainers/Forza Horizon 5 Trainer [Merika].exe\",\n        \"version\": \"2025.7.21\"\n    },\n    {\n        \"game_name\": \"Spore\",\n        \"origin\": \"other\",\n        \"author\": \"KelSat\",\n        \"gcm_url\": \"GCM/GCM Trainers/Spore Trainer [KelSat].exe\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"Watch Dogs\",\n        \"origin\": \"other\",\n        \"author\": \"笑淫淫\",\n        \"official_url\": \"https://dl.3dmgame.com/patch/47695.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Watch Dogs Trainer [XiaoYinYin].zip\",\n        \"version\": \"2014.6.22\"\n    },\n    {\n        \"game_name\": \"XCOM: Enemy Within\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/xcom-enemy-unknown-trainer.22039/\",\n        \"gcm_url\": \"GCM/GCM Trainers/XCOM_Enemy Within Trainer [MrAntiFun].exe\",\n        \"version\": \"2021.3.27\"\n    },\n    {\n        \"game_name\": \"Need for Speed: Hot Pursuit\",\n        \"origin\": \"other\",\n        \"author\": \"Geri\",\n        \"official_url\": \"http://www.szemelyesintegracio.hu/cheats/38-pc-game-cheats\",\n        \"gcm_url\": \"GCM/GCM Trainers/Need for Speed_Hot Pursuit Trainer [Geri].exe\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"theHunter: Call of the Wild\",\n        \"origin\": \"other\",\n        \"author\": \"Marco Stel\",\n        \"gcm_url\": \"GCM/GCM Trainers/theHunter_Call of the Wild Trainer [Marco Stel].exe\",\n        \"version\": \"2024.12.6\"\n    },\n    {\n        \"game_name\": \"Little Nightmares II\",\n        \"origin\": \"other\",\n        \"author\": \"游音寂影\",\n        \"official_url\": \"http://bilibeili.ysepan.com/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Little Nightmares II Trainer [YouYinJiYing].exe\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"Dungeon of the Endless\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/dungeon-of-the-endless-trainer.6108/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dungeon of the Endless Trainer [MrAntiFun].exe\",\n        \"version\": \"2015.11.21\"\n    },\n    {\n        \"game_name\": \"Three Kingdom: The Journey\",\n        \"origin\": \"other\",\n        \"author\": \"ギナ\",\n        \"official_url\": \"https://space.bilibili.com/31947\",\n        \"gcm_url\": \"GCM/GCM Trainers/Three Kingdom_The Journey Trainer [Gina].zip\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"Nioh 2\",\n        \"origin\": \"other\",\n        \"author\": \"KoKo君\",\n        \"gcm_url\": \"GCM/GCM Trainers/Nioh 2 Trainer [KoKoJun].exe\",\n        \"version\": \"2022.2.20\"\n    },\n    {\n        \"game_name\": \"Absolum\",\n        \"origin\": \"other\",\n        \"author\": \"badenj\",\n        \"official_url\": \"https://pd.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=2irWICeLFPY&businessType=9\",\n        \"gcm_url\": \"GCM/GCM Trainers/Absolum Trainer [badenj].zip\",\n        \"version\": \"2025.10.13\"\n    },\n    {\n        \"game_name\": \"Blue Alert\",\n        \"origin\": \"other\",\n        \"author\": \"蓝警网\",\n        \"official_url\": \"https://www.stateofwar.cn/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Blue Alert Trainer [LanJingWang].zip\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"Craft The World\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/craft-the-world-trainer.108/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Craft The World Trainer [MrAntiFun].exe\",\n        \"version\": \"2014.4.21\"\n    },\n    {\n        \"game_name\": \"Tails of Iron\",\n        \"origin\": \"other\",\n        \"author\": \"王小滔\",\n        \"official_url\": \"https://game.ok5168.com/index/KingModifier/121.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Tails of Iron Trainer [WangXiaoTao].exe\",\n        \"version\": \"2024.10.11\"\n    },\n    {\n        \"game_name\": \"Need for Speed Unbound\",\n        \"origin\": \"other\",\n        \"author\": \"Merika\",\n        \"official_url\": \"https://github.com/szaaamerik/NFS-Unbound-Trainer\",\n        \"gcm_url\": \"GCM/GCM Trainers/Need for Speed Unbound Trainer [Merika].exe\",\n        \"version\": \"2024.2.9\"\n    },\n    {\n        \"game_name\": \"Nioh 3\",\n        \"origin\": \"other\",\n        \"author\": \"flarejune\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1pv6BB5End/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Nioh 3 Trainer [flarejune].exe\",\n        \"version\": \"2026.3.2\"\n    },\n    {\n        \"game_name\": \"Nioh 3\",\n        \"origin\": \"other\",\n        \"author\": \"大母鹅\",\n        \"official_url\": \"https://www.loxin.top/archives/1017\",\n        \"gcm_url\": \"GCM/GCM Trainers/Nioh 3 Trainer [DaMuE].exe\",\n        \"version\": \"2026.3.12\"\n    },\n    {\n        \"game_name\": \"Portal Knights\",\n        \"origin\": \"other\",\n        \"author\": \"FutureX\",\n        \"gcm_url\": \"GCM/GCM Trainers/Portal Knights Trainer [FutureX].exe\",\n        \"version\": \"2026.2.25\"\n    },\n    {\n        \"game_name\": \"Prototype\",\n        \"origin\": \"other\",\n        \"author\": \"Cheat Happens\",\n        \"gcm_url\": \"GCM/GCM Trainers/Prototype Trainer [Cheat Happens].exe\",\n        \"version\": \"2026.2.25\"\n    },\n    {\n        \"game_name\": \"Sultan's Game\",\n        \"origin\": \"other\",\n        \"author\": \"Hlathguth\",\n        \"official_url\": \"https://steamcommunity.com/sharedfiles/filedetails/?id=3493820327\",\n        \"gcm_url\": \"GCM/GCM Trainers/Sultan's Game Trainer [Hlathguth].zip\",\n        \"version\": \"2025.11.21\"\n    },\n    {\n        \"game_name\": \"Prototype\",\n        \"origin\": \"other\",\n        \"author\": \"LinGon\",\n        \"official_url\": \"https://www.crsky.com/soft/459459.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Prototype Trainer [LinGon].zip\",\n        \"version\": \"2026.2.25\"\n    },\n    {\n        \"game_name\": \"Warcraft III: Reign of Chaos\",\n        \"origin\": \"other\",\n        \"author\": \"大象\",\n        \"official_url\": \"https://www.ra216.com/html/msgjbd/20256/77583.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Warcraft III_Reign of Chaos Trainer [DaXiang].exe\",\n        \"version\": \"2025.6.10\"\n    },\n    {\n        \"game_name\": \"Dynasty Warriors 6\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dynasty Warriors 6 Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"A Plague Tale: Requiem\",\n        \"origin\": \"other\",\n        \"author\": \"Fullcodes\",\n        \"official_url\": \"https://down.gamersky.com/pc/202210/1528257.shtml\",\n        \"gcm_url\": \"GCM/GCM Trainers/A Plague Tale_Requiem Trainer [Fullcodes].exe\",\n        \"version\": \"2022.10.19\"\n    },\n    {\n        \"game_name\": \"Assassin's Creed Valhalla\",\n        \"origin\": \"ct_other\",\n        \"custom_name_en\": \"Inventory Editor\",\n        \"custom_name_zh\": \"物品编辑器\",\n        \"gcm_url\": \"GCM/GCM Trainers/Assassin's Creed Valhalla Inventory Editor.zip\",\n        \"version\": \"2023.3.30\"\n    },\n    {\n        \"game_name\": \"Assassin's Creed Origins\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Cielos\",\n        \"custom_name_en\": \"Inventory Editor\",\n        \"custom_name_zh\": \"物品编辑器\",\n        \"official_url\": \"cs.rin.ru/Forum/Main\",\n        \"gcm_url\": \"GCM/GCM Trainers/Assassin's Creed Origins Inventory Editor [Cielos].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Alice In Cradle\",\n        \"origin\": \"ct_other\",\n        \"author\": \"桂Cinnamon\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1mtcszPE48/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Alice In Cradle Trainer [GuiCinnamon].ct\",\n        \"version\": \"2026.2.11\"\n    },\n    {\n        \"game_name\": \"Assassin's Creed Brotherhood\",\n        \"origin\": \"other\",\n        \"author\": \"MarkG\",\n        \"official_url\": \"https://www.homeofgamehacking.de\",\n        \"gcm_url\": \"GCM/GCM Trainers/Assassin's Creed Brotherhood Trainer [MarkG].exe\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Minecraft: China Edition\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Q1n9Ju\",\n        \"custom_name_en\": \"4399 Edition Trainer\",\n        \"custom_name_zh\": \"4399版修改器\",\n        \"gcm_url\": \"GCM/GCM Trainers/Minecraft_China Edition Trainer [Q1n9Ju].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"CYAN BRAIN\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/CYAN BRAIN Trainer [jx666].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Call of Cthulhu\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/call-of-cthulhu-trainer.17900/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Call of Cthulhu Trainer [MrAntiFun].exe\",\n        \"version\": \"2018.11.2\"\n    },\n    {\n        \"game_name\": \"Castlevania Dominus Collection\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Castlevania Dominus Collection Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Dark Souls III\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dark Souls III Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Dispatch\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Send\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dispatch Trainer [Send].ct\",\n        \"version\": \"2025.1.17\"\n    },\n    {\n        \"game_name\": \"Drova - Forsaken Kin\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Dickincorp\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=32278, https://bbs.3dmgame.com/thread-6636457-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Drova - Forsaken Kin Trainer [Dickincorp].zip\",\n        \"version\": \"2025.1.2\"\n    },\n    {\n        \"game_name\": \"EARTH DEFENSE FORCE: IRON RAIN\",\n        \"origin\": \"ct_other\",\n        \"author\": \"ModEngine\",\n        \"gcm_url\": \"GCM/GCM Trainers/EARTH DEFENSE FORCE_IRON RAIN Trainer [ModEngine].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Eternal Destiny\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Shinkansen\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=6406\",\n        \"gcm_url\": \"GCM/GCM Trainers/Eternal Destiny Trainer [Shinkansen].ct\",\n        \"version\": \"2019.12.17\"\n    },\n    {\n        \"game_name\": \"Frontier Hunter: Erza's Wheel of Fortune\",\n        \"origin\": \"ct_other\",\n        \"author\": \"プラフタ人形\",\n        \"official_url\": \"https://space.bilibili.com/93866567\",\n        \"gcm_url\": \"GCM/GCM Trainers/Frontier Hunter_Erza's Wheel of Fortune Trainer [PuRaFuTaNinGyo].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Love n Life: Happy Student\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/Love n Life_Happy Student Trainer [jx666].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Journey\",\n        \"author\": \"l.l.ll.lll\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Journey Trainer [l.l.ll.lll].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Monster Hunter Stories 3: Twisted Reflection\",\n        \"origin\": \"ct_other\",\n        \"author\": \"ModEngine\",\n        \"gcm_url\": \"GCM/GCM Trainers/Monster Hunter Stories 3_Twisted Reflection Trainer [ModEngine].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Matchmaking Inc.\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Qiuzy\",\n        \"official_url\": \"https://steamcommunity.com/sharedfiles/filedetails/?id=3414461328\",\n        \"gcm_url\": \"GCM/GCM Trainers/Matchmaking Inc. Trainer [Qiuzy].ct\",\n        \"version\": \"2025.6.29\"\n    },\n    {\n        \"game_name\": \"Mewgenics\",\n        \"origin\": \"ct_other\",\n        \"author\": \"小宋涛\",\n        \"gcm_url\": \"GCM/GCM Trainers/Mewgenics Trainer [XiaoSongTao].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Monster Hunter Wilds\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Monster Hunter Wilds Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Persona 5 Royal\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Persona 5 Royal Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"R.I.P. - Reincarnation Insurance Program\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Patka\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?f=4&t=38072\",\n        \"gcm_url\": \"GCM/GCM Trainers/R.I.P. - Reincarnation Insurance Program Trainer [Patka].ct\",\n        \"version\": \"2026.2.25\"\n    },\n    {\n        \"game_name\": \"Risou no Hikikomori Seikatsu: Oyako no Shinmitsu Doukyo\",\n        \"origin\": \"ct_other\",\n        \"author\": \"l.l.ll.lll\",\n        \"gcm_url\": \"GCM/GCM Trainers/Risou no Hikikomori Seikatsu_Oyako no Shinmitsu Doukyo Trainer [l.l.ll.lll].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Rune Factory 3 Special\",\n        \"origin\": \"ct_other\",\n        \"author\": \"minhnhatx\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=25714\",\n        \"gcm_url\": \"GCM/GCM Trainers/Rune Factory 3 Special Trainer [minhnhatx].ct\",\n        \"version\": \"2024.10.26\"\n    },\n    {\n        \"game_name\": \"Tormented Souls 2\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Tormented Souls 2 Trainer.ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Weapon Shop Fantasy\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Weapon Shop Fantasy Trainer.ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Yakuza Kiwami 2\",\n        \"origin\": \"ct_other\",\n        \"author\": \"3DM\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6645788-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Yakuza Kiwami 2 Trainer [3DM].zip\",\n        \"version\": \"2026.2.9\"\n    },\n    {\n        \"game_name\": \"Yakuza Kiwami\",\n        \"origin\": \"ct_other\",\n        \"author\": \"3DM\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6647186-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Yakuza Kiwami Trainer [3DM].zip\",\n        \"version\": \"2026.2.9\"\n    },\n    {\n        \"game_name\": \"Ys I & II Chronicles\",\n        \"origin\": \"ct_other\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?p=202571#p202571, https://tieba.baidu.com/p/9486277413\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ys I & II Chronicles Trainer.zip\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Minecraft: China Edition\",\n        \"origin\": \"ct_other\",\n        \"custom_name_en\": \"发烧游戏版 Trainer\",\n        \"custom_name_zh\": \"发烧游戏版修改器\",\n        \"gcm_url\": \"GCM/GCM Trainers/Minecraft_China Edition Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Castle Crashers\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Zihark\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=36019\",\n        \"gcm_url\": \"GCM/GCM Trainers/Castle Crashers Trainer [Zihark].ct\",\n        \"version\": \"2025.8.26\"\n    },\n    {\n        \"game_name\": \"Dark Souls II\",\n        \"origin\": \"ct_other\",\n        \"author\": \"3DM\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dark Souls II Trainer [3DM].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Football Manager 2024\",\n        \"origin\": \"ct_other\",\n        \"author\": \"fm-san爱好研究小组\",\n        \"gcm_url\": \"GCM/GCM Trainers/Football Manager 2024 Trainer [fm-san].cetrainer\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Backmir\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Backmir Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Command & Conquer: Red Alert 3\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Sunny Cloud\",\n        \"gcm_url\": \"GCM/GCM Trainers/Command & Conquer_Red Alert 3 Trainer [Sunny Cloud].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Ys: The Oath in Felghana\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ys_The Oath in Felghana Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Granblue Fantasy: Relink\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Granblue Fantasy_Relink Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Matchmaking Inc.\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Matchmaking Inc. Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Ys Origin\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ys Origin Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Xiu Xian Shi Cao Shou Ce\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Xiu Xian Shi Cao Shou Ce Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Stellar Blade\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Cielos\",\n        \"gcm_url\": \"GCM/GCM Trainers/Stellar Blade Trainer [Cielos].ct\",\n        \"version\": \"2025.6.19\"\n    },\n    {\n        \"game_name\": \"Dying Light: The Beast\",\n        \"origin\": \"ct_other\",\n        \"author\": \"--南海-\",\n        \"custom_name_en\": \"Inventory Editor\",\n        \"custom_name_zh\": \"物品编辑器\",\n        \"official_url\": \"https://www.bilibili.com/video/BV136f1BfEAF/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dying Light_The Beast Trainer [NanHai].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Tales of Graces f Remastered\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Tales of Graces f Remastered Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Assassin's Creed Odyssey\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Assassin's Creed Odyssey Trainer.ct\",\n        \"version\": \"2020.5.10\"\n    },\n    {\n        \"game_name\": \"Living With Sister: Monochrome Fantasy\",\n        \"origin\": \"ct_other\",\n        \"author\": \"NekoCat\",\n        \"official_url\": \"https://afdian.com/p/3bb69608ed1e11ee80dc52540025c377\",\n        \"gcm_url\": \"GCM/GCM Trainers/Living With Sister_Monochrome Fantasy Trainer [NekoCat].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"College Diaries\",\n        \"origin\": \"ct_other\",\n        \"author\": \"3DM\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6652390-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/College Diaries Trainer [3DM].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Monster Hunter Rise\",\n        \"origin\": \"ct_other\",\n        \"author\": \"千魂\",\n        \"gcm_url\": \"GCM/GCM Trainers/Monster Hunter Rise Trainer [QianHun].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Last Epoch\",\n        \"origin\": \"ct_other\",\n        \"author\": \"NidasBot\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?f=4&t=34670&sid=988c769c3a57edd5adf0ce218d9bf342\",\n        \"gcm_url\": \"GCM/GCM Trainers/Last Epoch Trainer [NidasBot].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Dynasty Warriors\",\n        \"origin\": \"ct_other\",\n        \"author\": \"雨夜de肖邦\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dynasty Warriors Trainer [YuYeDeXiaoBang].ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"God Forsaken\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Patka\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?f=4&t=37862, https://bbs.3dmgame.com/forum.php?mod=viewthread&tid=6646526\",\n        \"gcm_url\": \"GCM/GCM Trainers/God Forsaken Trainer [Patka].ct\",\n        \"version\": \"2026.1.6\"\n    },\n    {\n        \"game_name\": \"Assassin's Creed\",\n        \"origin\": \"ct_other\",\n        \"custom_name_en\": \"Inventory Editor\",\n        \"custom_name_zh\": \"物品编辑器\",\n        \"gcm_url\": \"GCM/GCM Trainers/Assassin's Creed Inventory Editor.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Legend of Heroes: Three Kingdoms\",\n        \"origin\": \"ct_other\",\n        \"author\": \"杨子孝\",\n        \"official_url\": \"https://space.bilibili.com/22236409\",\n        \"gcm_url\": \"GCM/GCM Trainers/Legend of Heroes_Three Kingdoms Trainer [YangZiXiao].ct\",\n        \"version\": \"2026.2.16\"\n    },\n    {\n        \"game_name\": \"Wandering Sword\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Wandering Sword Trainer.ct\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"The Legend of Nayuta: Boundless Trails\",\n        \"origin\": \"ct_other\",\n        \"author\": \"bbfox\",\n        \"official_url\": \"https://opencheattables.com/viewtopic.php?t=11\",\n        \"gcm_url\": \"GCM/GCM Trainers/The Legend of Nayuta_Boundless Trails Trainer [bbfox].ct\",\n        \"version\": \"2022.7.24\"\n    },\n    {\n        \"game_name\": \"Warcraft III: The Frozen Throne\",\n        \"origin\": \"other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Warcraft III_The Frozen Throne Trainer.exe\",\n        \"version\": \"2026.2.27\"\n    },\n    {\n        \"game_name\": \"Final Fantasy XV\",\n        \"origin\": \"other\",\n        \"author\": \"flarejune\",\n        \"gcm_url\": \"GCM/GCM Trainers/Final Fantasy XV Trainer [flarejune].exe\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"ASTLIBRA Revision\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/ASTLIBRA Revision Trainer.ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Call to Arms - Gates of Hell: Ostfront\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Kilnham\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=34980\",\n        \"gcm_url\": \"GCM/GCM Trainers/Call to Arms - Gates of Hell_Ostfront Trainer [Kilnham].ct\",\n        \"version\": \"2026.2.17\"\n    },\n    {\n        \"game_name\": \"Ebenezer and the Invisible World\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ebenezer and the Invisible World Trainer.ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"FTL: Faster Than Light\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/ftl-faster-than-light-trainer.228/\",\n        \"gcm_url\": \"GCM/GCM Trainers/FTL_Faster Than Light Trainer [MrAntiFun].exe\",\n        \"version\": \"2014.4.22\"\n    },\n    {\n        \"game_name\": \"Football Manager 2024\",\n        \"origin\": \"ct_other\",\n        \"author\": \"tdg6661\",\n        \"gcm_url\": \"GCM/GCM Trainers/Football Manager 2024 Trainer [tdg6661].zip\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Four Nights at the Burger Shop\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/Four Nights at the Burger Shop Trainer [jx666].ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Guns of Fury\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Guns of Fury Trainer.ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Long Yin Li Zhi Zhuan\",\n        \"origin\": \"ct_other\",\n        \"author\": \"简简单单2022\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6653672-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Long Yin Li Zhi Zhuan Trainer [JianJianDanDan2022].ct\",\n        \"version\": \"2026.3.16\"\n    },\n    {\n        \"game_name\": \"Loot of Baal\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Loot of Baal Trainer.ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Wakayama's NTR Classroom\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/Wakayama's NTR Classroom Trainer [jx666].ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Songs of Silence\",\n        \"origin\": \"ct_other\",\n        \"author\": \"wzslrb\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6597471-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Songs of Silence Trainer [wzslrb].ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Swag and Sorcery\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Swag and Sorcery Trainer.ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Dead Cells\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dead Cells Trainer.ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Momodora: Moonlit Farewell\",\n        \"origin\": \"other\",\n        \"author\": \"好吃的香草雪球\",\n        \"custom_name_en\": \"Complete Collection Map\",\n        \"custom_name_zh\": \"全收集地图\",\n        \"official_url\": \"https://xueqiumaps.cn/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Momodora_Moonlit Farewell Map [XueQiu].png\",\n        \"extension\": \"png\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Call of Duty: Modern Warfare 3\",\n        \"origin\": \"other\",\n        \"author\": \"Burmass\",\n        \"official_url\": \"https://patch.ali213.net/showpatch/12264.html#001\",\n        \"gcm_url\": \"GCM/GCM Trainers/Call of Duty_Modern Warfare 3 Trainer [Burmass].exe\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Back to the Dawn\",\n        \"origin\": \"ct_other\",\n        \"author\": \"ppapodir\",\n        \"gcm_url\": \"GCM/GCM Trainers/Back to the Dawn Trainer [ppapodir].ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"A Simple Life with My Unobtrusive Sister\",\n        \"origin\": \"other\",\n        \"author\": \"jx666\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1aaPhziEEp\",\n        \"gcm_url\": \"GCM/GCM Trainers/A Simple Life with My Unobtrusive Sister Trainer [jx666].exe\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Alice Escaped!\",\n        \"origin\": \"other\",\n        \"author\": \"ギナ\",\n        \"official_url\": \"https://space.bilibili.com/31947\",\n        \"gcm_url\": \"GCM/GCM Trainers/Alice Escaped! Trainer [Gina].zip\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies\",\n        \"origin\": \"other\",\n        \"author\": \"DevilHand\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies Trainer [DevilHand].exe\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies\",\n        \"origin\": \"other\",\n        \"author\": \"seven-eleven\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies Trainer [seven-eleven].exe\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Sand Land\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Cielos\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=35922\",\n        \"gcm_url\": \"GCM/GCM Trainers/Sand Land Trainer [Cielos].ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Ling Xu\",\n        \"origin\": \"ct_other\",\n        \"author\": \"缤纷颜色\",\n        \"official_url\": \"https://space.bilibili.com/365816484\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ling Xu Trainer [BinFenYanSe].ct\",\n        \"version\": \"2026.3.4\"\n    },\n    {\n        \"game_name\": \"Atelier Ryza: Ever Darkness & the Secret Hideout DX\",\n        \"origin\": \"ct_other\",\n        \"author\": \"bbfox\",\n        \"official_url\": \"https://opencheattables.com/viewtopic.php?t=1676, https://bbs.3dmgame.com/thread-6648737-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Atelier Ryza_Ever Darkness & the Secret Hideout DX Trainer [bbfox].ct\",\n        \"version\": \"2025.12.22\"\n    },\n    {\n        \"game_name\": \"Living With Sister: Monochrome Fantasy\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Living With Sister_Monochrome Fantasy Trainer.ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Hyakusen no Jo ni Kawatareshi Toki\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Hyakusen no Jo ni Kawatareshi Toki Trainer.ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Kenshi\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Kenshi Trainer.ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Lifeguard Holic\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/Lifeguard Holic Trainer [jx666].ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies: GOTY Edition\",\n        \"origin\": \"ct_other\",\n        \"author\": \"加热时光\",\n        \"official_url\": \"https://mod.3dmgame.com/mod/197657\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies_GOTY Edition Trainer [JiaReShiGuang].ct\",\n        \"version\": \"2023.5.16\"\n    },\n    {\n        \"game_name\": \"Rise of the Ronin\",\n        \"origin\": \"other\",\n        \"author\": \"flarejune\",\n        \"gcm_url\": \"GCM/GCM Trainers/Rise of the Ronin Trainer [flarejune].exe\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Song's Fantasy\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Season168168\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6656100-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Song's Fantasy Trainer [Season168168].ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Dragonkin: The Banished\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Send\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dragonkin_The Banished Trainer [Send].ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"PEAK\",\n        \"origin\": \"other\",\n        \"gcm_url\": \"GCM/GCM Trainers/PEAK Trainer.zip\",\n        \"extension\": \"none\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"No Man's Sky\",\n        \"origin\": \"other\",\n        \"author\": \"GoatFungus\",\n        \"custom_name_en\": \"Save Editor\",\n        \"custom_name_zh\": \"存档编辑器\",\n        \"official_url\": \"https://github.com/goatfungus/NMSSaveEditor\",\n        \"gcm_url\": \"GCM/GCM Trainers/No Man's Sky Save Editor [GoatFungus].zip\",\n        \"version\": \"2025.8.30\"\n    },\n    {\n        \"game_name\": \"Ling Xu\",\n        \"origin\": \"ct_other\",\n        \"author\": \"梦幻的天空\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ling Xu Trainer [MengHuanDeTianKong].ct\",\n        \"version\": \"2026.3.7\"\n    },\n    {\n        \"game_name\": \"Multiverse Loot Hunter\",\n        \"origin\": \"ct_other\",\n        \"author\": \"缤纷颜色\",\n        \"official_url\": \"https://space.bilibili.com/365816484\",\n        \"gcm_url\": \"GCM/GCM Trainers/Multiverse Loot Hunter Trainer [BinFenYanSe].ct\",\n        \"version\": \"2025.12.27\"\n    },\n    {\n        \"game_name\": \"Ready or Not\",\n        \"origin\": \"other\",\n        \"author\": \"Async\",\n        \"official_url\": \"https://www.nexusmods.com/readyornot/mods/6413\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ready or Not Trainer [Async].exe\",\n        \"version\": \"2025.10.5\"\n    },\n    {\n        \"game_name\": \"Ready or Not\",\n        \"origin\": \"other\",\n        \"author\": \"LHY1339\",\n        \"official_url\": \"https://github.com/LHY1339/cheat_ready_or_not\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ready or Not Trainer [LHY1339].zip\",\n        \"version\": \"2025.12.19\"\n    },\n    {\n        \"game_name\": \"Backrooms: Extractions\",\n        \"origin\": \"other\",\n        \"author\": \"LHY1339\",\n        \"official_url\": \"https://github.com/LHY1339/cheat_backrooms_extractions\",\n        \"gcm_url\": \"GCM/GCM Trainers/Backrooms_Extractions Trainer [LHY1339].exe\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"Escape the Backrooms\",\n        \"origin\": \"other\",\n        \"author\": \"LHY1339\",\n        \"official_url\": \"https://github.com/LHY1339/cheat_escape_the_backrooms\",\n        \"gcm_url\": \"GCM/GCM Trainers/Escape the Backrooms Trainer [LHY1339].exe\",\n        \"version\": \"2026.2.28\"\n    },\n    {\n        \"game_name\": \"Castlevania Advance Collection\",\n        \"origin\": \"ct_other\",\n        \"author\": \"MBRKiNG\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=17550\",\n        \"gcm_url\": \"GCM/GCM Trainers/Castlevania Advance Collection Trainer [MBRKiNG].ct\",\n        \"version\": \"2021.9.28\"\n    },\n    {\n        \"game_name\": \"Command & Conquer 3: Kane's Wrath\",\n        \"origin\": \"other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Command & Conquer 3_Kane's Wrath Trainer.exe\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Carnal Instinct\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jk\",\n        \"official_url\": \"https://f95zone.to/members/mswasticsc.382845/#about\",\n        \"gcm_url\": \"GCM/GCM Trainers/Carnal Instinct Trainer [jk].ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Cities: Skylines\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/cities-skylines-trainer.3650/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Cities_Skylines Trainer [MrAntiFun].exe\",\n        \"version\": \"2015.5.10\"\n    },\n    {\n        \"game_name\": \"Hitman: Absolution\",\n        \"origin\": \"other\",\n        \"author\": \"Abolfazl.k\",\n        \"official_url\": \"http://abolfazl-k.ir/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Hitman_Absolution Trainer [Abolfazl.k].exe\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Resident Evil 4: Ultimate HD Edition\",\n        \"origin\": \"other\",\n        \"author\": \"盖世班主\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6051077-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Resident Evil 4_Ultimate HD Edition Trainer [GaiShiBanZhu].exe\",\n        \"version\": \"2023.1.1\"\n    },\n    {\n        \"game_name\": \"RoadCraft\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/RoadCraft Trainer.ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Stoneshard\",\n        \"origin\": \"other\",\n        \"author\": \"Pixel32E\",\n        \"custom_name_en\": \"Toolbox\",\n        \"custom_name_zh\": \"工具箱\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1SUfBBgEti/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Stoneshard Toolbox [Pixel32E].exe\",\n        \"version\": \"2026.2.23\"\n    },\n    {\n        \"game_name\": \"Dynasty Warriors 4\",\n        \"origin\": \"other\",\n        \"author\": \"allEnL\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dynasty Warriors 4 Trainer [allEnL].exe\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Warcraft III: The Frozen Throne\",\n        \"origin\": \"other\",\n        \"author\": \"tctianchi\",\n        \"official_url\": \"https://github.com/Still4/War3Trainer\",\n        \"gcm_url\": \"GCM/GCM Trainers/Warcraft III_The Frozen Throne Trainer [tctianchi].exe\",\n        \"version\": \"2017.8.27\"\n    },\n    {\n        \"game_name\": \"Yet Another Zombie Survivors\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Patka\",\n        \"gcm_url\": \"GCM/GCM Trainers/Yet Another Zombie Survivors Trainer [Patka].ct\",\n        \"version\": \"2025.12.12\"\n    },\n    {\n        \"game_name\": \"Subnautica\",\n        \"origin\": \"ct_other\",\n        \"author\": \"墨星\",\n        \"gcm_url\": \"GCM/GCM Trainers/Subnautica Trainer [MoXing].ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Castlevania Anniversary Collection\",\n        \"origin\": \"ct_other\",\n        \"author\": \"bbfox\",\n        \"official_url\": \"https://opencheattables.com/viewtopic.php?p=1287\",\n        \"gcm_url\": \"GCM/GCM Trainers/Castlevania Anniversary Collection Trainer [bbfox].ct\",\n        \"version\": \"2023.6.4\"\n    },\n    {\n        \"game_name\": \"Castlevania Anniversary Collection\",\n        \"origin\": \"ct_other\",\n        \"author\": \"VampTY\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=9452\",\n        \"gcm_url\": \"GCM/GCM Trainers/Castlevania Anniversary Collection Trainer [VampTY].ct\",\n        \"version\": \"2020.2.1\"\n    },\n    {\n        \"game_name\": \"ReCore: Definitive Edition\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/ReCore_Definitive Edition Trainer.ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Ghostrunner\",\n        \"origin\": \"ct_other\",\n        \"author\": \"天乐1337\",\n        \"official_url\": \"https://www.bilibili.com/list/472721080\",\n        \"gcm_url\": \"GCM/GCM Trainers/Ghostrunner Trainer [TianLe1337].ct\",\n        \"version\": \"2025.12.25\"\n    },\n    {\n        \"game_name\": \"Metro: Last Light Redux\",\n        \"origin\": \"other\",\n        \"author\": \"Baracuda\",\n        \"official_url\": \"https://www.youtube.com/channel/UChHiOryGzGswzC-gzbSJNJQ\",\n        \"gcm_url\": \"GCM/GCM Trainers/Metro_Last Light Redux Trainer [Baracuda].exe\",\n        \"version\": \"2018.3.14\"\n    },\n    {\n        \"game_name\": \"Uncharted Waters IV HD Version\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Uncharted Waters IV HD Version Trainer.ct\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"NINJA GAIDEN: Master Collection\",\n        \"origin\": \"ct_other\",\n        \"author\": \"yamaha288\",\n        \"official_url\": \"https://bbs.3dmgame.com/forum.php?mod=viewthread&tid=6192035\",\n        \"gcm_url\": \"GCM/GCM Trainers/NINJA GAIDEN_Master Collection Trainer [yamaha288].ct\",\n        \"version\": \"2021.7.21\"\n    },\n    {\n        \"game_name\": \"Guns, Gore and Cannoli 2\",\n        \"origin\": \"other\",\n        \"author\": \"游侠网\",\n        \"official_url\": \"https://www.ali213.net/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Guns, Gore and Cannoli 2 Trainer [YouXiaWang].exe\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Guns, Gore and Cannoli\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/guns-gore-and-cannoli-trainer.4326/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Guns, Gore and Cannoli Trainer [MrAntiFun].exe\",\n        \"version\": \"2018.8.15\"\n    },\n    {\n        \"game_name\": \"Guns, Gore and Cannoli 2\",\n        \"origin\": \"other\",\n        \"author\": \"MrAntiFun\",\n        \"official_url\": \"https://mrantifun.net/threads/guns-gore-and-cannoli-2-trainer.16674/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Guns, Gore and Cannoli 2 Trainer [MrAntiFun].exe\",\n        \"version\": \"2018.8.2\"\n    },\n    {\n        \"game_name\": \"Forestia ~Farm Life in the Country~\",\n        \"origin\": \"other\",\n        \"author\": \"jx666\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1FvNPzCELP\",\n        \"gcm_url\": \"GCM/GCM Trainers/Forestia ~Farm Life in the Country~ Trainer [jx666].exe\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Sudden Strike 4\",\n        \"origin\": \"ct_other\",\n        \"author\": \"Recifense\",\n        \"gcm_url\": \"GCM/GCM Trainers/Sudden Strike 4 Trainer [Recifense].ct\",\n        \"version\": \"2017.8.15\"\n    },\n    {\n        \"game_name\": \"Devil May Cry 4: Special Edition\",\n        \"origin\": \"other\",\n        \"author\": \"微风吹散的羽翼\",\n        \"official_url\": \"https://www.bilibili.com/opus/243069022670988982\",\n        \"gcm_url\": \"GCM/GCM Trainers/Devil May Cry 4_Special Edition Trainer [WeiFengChuiSanDeYuYi].exe\",\n        \"version\": \"2019.6.6\"\n    },\n    {\n        \"game_name\": \"Warcraft III: Reign of Chaos\",\n        \"origin\": \"other\",\n        \"author\": \"离不开电脑\",\n        \"official_url\": \"http://56q.5d6d.com/\",\n        \"gcm_url\": \"GCM/GCM Trainers/Warcraft III_Reign of Chaos Trainer [LiBuKaiDianNao].exe\",\n        \"version\": \"2026.3.10\"\n    },\n    {\n        \"game_name\": \"Card Cultivation\",\n        \"origin\": \"ct_other\",\n        \"author\": \"3DM\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6657707-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Card Cultivation Trainer [3DM].ct\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies: Fusion\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies_Fusion Trainer.ct\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Revolution Idle\",\n        \"origin\": \"ct_other\",\n        \"author\": \"AkibaCat\",\n        \"gcm_url\": \"GCM/GCM Trainers/Revolution Idle Trainer [AkibaCat].ct\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Shadow Warrior 2\",\n        \"origin\": \"other\",\n        \"author\": \"FutureX\",\n        \"gcm_url\": \"GCM/GCM Trainers/Shadow Warrior 2 Trainer [FutureX].exe\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Swarm Bunker: Lust Defense\",\n        \"origin\": \"ct_other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/Swarm Bunker_Lust Defense Trainer [jx666].ct\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Euro Truck Simulator 2\",\n        \"origin\": \"other\",\n        \"author\": \"SiberianCoffe\",\n        \"custom_name_en\": \"Save Editor\",\n        \"custom_name_zh\": \"存档编辑器\",\n        \"official_url\": \"https://github.com/CoffeSiberian/truck-tools\",\n        \"gcm_url\": \"GCM/GCM Trainers/Euro Truck Simulator 2 Save Editor [SiberianCoffe].zip\",\n        \"version\": \"2026.1.15\"\n    },\n    {\n        \"game_name\": \"Atelier Ryza 2: Lost Legends & the Secret Fairy DX\",\n        \"origin\": \"ct_other\",\n        \"author\": \"bbfox\",\n        \"official_url\": \"https://opencheattables.com/viewtopic.php?t=1712, https://bbs.3dmgame.com/thread-6656802-1-1.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Atelier Ryza 2_Lost Legends & the Secret Fairy DX Trainer [bbfox].ct\",\n        \"version\": \"2026.1.6\"\n    },\n    {\n        \"game_name\": \"Dragon Cliff\",\n        \"origin\": \"ct_other\",\n        \"author\": \"SeiKur0\",\n        \"official_url\": \"https://fearlessrevolution.com/viewtopic.php?t=6776\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dragon Cliff Trainer [SeiKur0].ct\",\n        \"version\": \"2018.5.21\"\n    },\n    {\n        \"game_name\": \"Next Jianghu II\",\n        \"origin\": \"ct_other\",\n        \"gcm_url\": \"GCM/GCM Trainers/Next Jianghu II Trainer.ct\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Phasmophobia\",\n        \"origin\": \"other\",\n        \"author\": \"蚊子炸虾\",\n        \"custom_name_en\": \"Save Editor\",\n        \"custom_name_zh\": \"存档编辑器\",\n        \"gcm_url\": \"GCM/GCM Trainers/Phasmophobia Save Editor [WenZiZhaXia].exe\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Plants vs. Zombies: Hybrid\",\n        \"origin\": \"other\",\n        \"author\": \"PVZ屑UP\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1JW421R7V2\",\n        \"gcm_url\": \"GCM/GCM Trainers/Plants vs. Zombies_Hybrid Trainer [PVZXieUP].exe\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Dishonored 2\",\n        \"origin\": \"other\",\n        \"author\": \"XLinmaster\",\n        \"official_url\": \"https://www.bilibili.com/video/BV1Rp9CYsEJd\",\n        \"gcm_url\": \"GCM/GCM Trainers/Dishonored 2 Trainer [XLinmaster].exe\",\n        \"version\": \"2026.3.16\"\n    },\n    {\n        \"game_name\": \"Elden Ring\",\n        \"origin\": \"other\",\n        \"author\": \"ClayAmore\",\n        \"custom_name_en\": \"Save Editor\",\n        \"custom_name_zh\": \"存档编辑器\",\n        \"official_url\": \"https://github.com/ClayAmore/ER-Save-Editor\",\n        \"gcm_url\": \"GCM/GCM Trainers/Elden Ring Save Editor [ClayAmore].exe\",\n        \"version\": \"2024.3.25\"\n    },\n    {\n        \"game_name\": \"Minecraft Dungeons\",\n        \"origin\": \"other\",\n        \"author\": \"CutFlame\",\n        \"custom_name_en\": \"Save Editor\",\n        \"custom_name_zh\": \"存档编辑器\",\n        \"official_url\": \"https://github.com/CutFlame/MCDSaveEdit\",\n        \"gcm_url\": \"GCM/GCM Trainers/Minecraft Dungeons Save Editor [CutFlame].exe\",\n        \"version\": \"2022.12.9\"\n    },\n    {\n        \"game_name\": \"Resist the succubus-The end of the female Knight\",\n        \"origin\": \"other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/Resist the succubus-The end of the female Knight Trainer [jx666].zip\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"ORGY DICE\",\n        \"origin\": \"other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/ORGY DICE Trainer [jx666].zip\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"ThornSin\",\n        \"origin\": \"other\",\n        \"author\": \"jx666\",\n        \"gcm_url\": \"GCM/GCM Trainers/ThornSin Trainer [jx666].zip\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Long Yin Li Zhi Zhuan\",\n        \"origin\": \"other\",\n        \"author\": \"Mizuof\",\n        \"custom_name_en\": \"Save Editor\",\n        \"custom_name_zh\": \"存档编辑器\",\n        \"official_url\": \"https://bbs.3dmgame.com/thread-6658860-1-1.html, https://www.bilibili.com/video/BV1mTPvzuEx1\",\n        \"gcm_url\": \"GCM/GCM Trainers/Long Yin Li Zhi Zhuan Save Editor [Mizuof].zip\",\n        \"extension\": \"html\",\n        \"version\": \"2026.3.15\"\n    },\n    {\n        \"game_name\": \"Forza Horizon 4\",\n        \"origin\": \"other\",\n        \"author\": \"tkwlee\",\n        \"official_url\": \"https://dl.3dmgame.com/patch/357760.html\",\n        \"gcm_url\": \"GCM/GCM Trainers/Forza Horizon 4 Trainer [tkwlee].exe\",\n        \"version\": \"2025.10.8\"\n    },\n    {\n        \"game_name\": \"Spirit Realm\",\n        \"origin\": \"other\",\n        \"author\": \"菠萝蜜\",\n        \"gcm_url\": \"GCM/GCM Trainers/Spirit Realm Trainer [BoLuoMi].exe\",\n        \"version\": \"2026.3.16\"\n    }\n]"
  },
  {
    "path": "Game Trainers/scripts/requirements.txt",
    "content": "fonttools\nboto3\nopenpyxl"
  },
  {
    "path": "Game Trainers/trainers/Arrow a Row Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Arrow_A_Row\")\nset(TRAINER_NAME \"Arrow A Row Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Arrow a Row Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"Coin\")\n    {\n        if (button->value())\n        {\n            status = trainer->setCoin(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"Health\")\n    {\n        if (button->value())\n        {\n            status = trainer->setHealth(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"HorizontalSpeed\")\n    {\n        if (button->value())\n        {\n            status = trainer->setHorizontalSpeed(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"ArrowDamage\")\n    {\n        if (button->value())\n        {\n            status = trainer->setArrowDamage(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"ArrowFrequency\")\n    {\n        if (button->value())\n        {\n            status = trainer->setArrowFrequency(std::stof(inputValue) / 10.0);\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"ArrowSpeed\")\n    {\n        if (button->value())\n        {\n            status = trainer->setArrowSpeed(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"ArrowDistance\")\n    {\n        if (button->value())\n        {\n            status = trainer->setArrowDistance(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"ArrowCount\")\n    {\n        if (button->value())\n        {\n            status = trainer->setArrowCount(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"SwordDamage\")\n    {\n        if (button->value())\n        {\n            status = trainer->setSwordDamage(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"SwordCoolDown\")\n    {\n        if (button->value())\n        {\n            status = trainer->setSwordCoolDown(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"SwordSpeed\")\n    {\n        if (button->value())\n        {\n            status = trainer->setSwordSpeed(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"SwordDistance\")\n    {\n        if (button->value())\n        {\n            status = trainer->setSwordDistance(std::stof(inputValue) * 0.7000122 - 0.0000085);\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Arrow a Row Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // Option 1: Set coin (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *coin_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    coin_flex->gap(option_gap);\n\n    Fl_Box *coin_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    coin_flex->fixed(coin_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *coin_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    coin_flex->fixed(coin_check_button, toggle_w);\n\n    Fl_Box *coin_label = new Fl_Box(0, 0, 0, 0);\n    tr(coin_label, \"Set Coins\");\n\n    Fl_Input *coin_input = new Fl_Input(0, 0, 0, 0);\n    coin_flex->fixed(coin_input, input_w);\n    coin_input->type(FL_INT_INPUT);\n    set_input_values(coin_input, \"9999\", \"0\", \"99999999\");\n\n    ToggleData *td_coin = new ToggleData{&trainer, \"Coin\", coin_check_button, coin_input};\n    coin_check_button->callback(toggle_callback, td_coin);\n\n    coin_flex->end();\n    options1_flex->fixed(coin_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 2: Set health (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *health_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    health_flex->gap(option_gap);\n\n    Fl_Box *health_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    health_flex->fixed(health_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *health_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    health_flex->fixed(health_check_button, toggle_w);\n\n    Fl_Box *health_label = new Fl_Box(0, 0, 0, 0);\n    tr(health_label, \"Set Health\");\n\n    Fl_Input *health_input = new Fl_Input(0, 0, 0, 0);\n    health_flex->fixed(health_input, input_w);\n    health_input->type(FL_INT_INPUT);\n    set_input_values(health_input, \"9999999999\", \"0\", \"99999999999999999999999999999999999999\");\n\n    ToggleData *td_health = new ToggleData{&trainer, \"Health\", health_check_button, health_input};\n    health_check_button->callback(toggle_callback, td_health);\n\n    health_flex->end();\n    options1_flex->fixed(health_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 3: Set horizontal_speed (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *horizontal_speed_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    horizontal_speed_flex->gap(option_gap);\n\n    Fl_Box *horizontal_speed_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    horizontal_speed_flex->fixed(horizontal_speed_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *horizontal_speed_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    horizontal_speed_flex->fixed(horizontal_speed_check_button, toggle_w);\n\n    Fl_Box *horizontal_speed_label = new Fl_Box(0, 0, 0, 0);\n    tr(horizontal_speed_label, \"Set Horizontal Speed\");\n\n    Fl_Input *horizontal_speed_input = new Fl_Input(0, 0, 0, 0);\n    horizontal_speed_flex->fixed(horizontal_speed_input, input_w);\n    horizontal_speed_input->type(FL_INT_INPUT);\n    set_input_values(horizontal_speed_input, \"30\", \"0\", \"99\");\n\n    ToggleData *td_horizontal_speed = new ToggleData{&trainer, \"HorizontalSpeed\", horizontal_speed_check_button, horizontal_speed_input};\n    horizontal_speed_check_button->callback(toggle_callback, td_horizontal_speed);\n\n    horizontal_speed_flex->end();\n    options1_flex->fixed(horizontal_speed_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 4: Set arrow_damage (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *arrow_damage_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    arrow_damage_flex->gap(option_gap);\n\n    Fl_Box *arrow_damage_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    arrow_damage_flex->fixed(arrow_damage_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *arrow_damage_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    arrow_damage_flex->fixed(arrow_damage_check_button, toggle_w);\n\n    Fl_Box *arrow_damage_label = new Fl_Box(0, 0, 0, 0);\n    tr(arrow_damage_label, \"Set Arrow Damage\");\n\n    Fl_Input *arrow_damage_input = new Fl_Input(0, 0, 0, 0);\n    arrow_damage_flex->fixed(arrow_damage_input, input_w);\n    arrow_damage_input->type(FL_INT_INPUT);\n    set_input_values(arrow_damage_input, \"99\", \"1\", \"9999\");\n\n    ToggleData *td_arrow_damage = new ToggleData{&trainer, \"ArrowDamage\", arrow_damage_check_button, arrow_damage_input};\n    arrow_damage_check_button->callback(toggle_callback, td_arrow_damage);\n\n    arrow_damage_flex->end();\n    options1_flex->fixed(arrow_damage_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 5: Set arrow_frequency (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *arrow_frequency_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    arrow_frequency_flex->gap(option_gap);\n\n    Fl_Box *arrow_frequency_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    arrow_frequency_flex->fixed(arrow_frequency_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *arrow_frequency_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    arrow_frequency_flex->fixed(arrow_frequency_check_button, toggle_w);\n\n    Fl_Box *arrow_frequency_label = new Fl_Box(0, 0, 0, 0);\n    tr(arrow_frequency_label, \"Set Arrow Frequency\");\n\n    Fl_Input *arrow_frequency_input = new Fl_Input(0, 0, 0, 0);\n    arrow_frequency_flex->fixed(arrow_frequency_input, input_w);\n    arrow_frequency_input->type(FL_INT_INPUT);\n    set_input_values(arrow_frequency_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_arrow_frequency = new ToggleData{&trainer, \"ArrowFrequency\", arrow_frequency_check_button, arrow_frequency_input};\n    arrow_frequency_check_button->callback(toggle_callback, td_arrow_frequency);\n\n    arrow_frequency_flex->end();\n    options1_flex->fixed(arrow_frequency_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 6: Set arrow_speed (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *arrow_speed_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    arrow_speed_flex->gap(option_gap);\n\n    Fl_Box *arrow_speed_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    arrow_speed_flex->fixed(arrow_speed_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *arrow_speed_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    arrow_speed_flex->fixed(arrow_speed_check_button, toggle_w);\n\n    Fl_Box *arrow_speed_label = new Fl_Box(0, 0, 0, 0);\n    tr(arrow_speed_label, \"Set Arrow Speed\");\n\n    Fl_Input *arrow_speed_input = new Fl_Input(0, 0, 0, 0);\n    arrow_speed_flex->fixed(arrow_speed_input, input_w);\n    arrow_speed_input->type(FL_INT_INPUT);\n    set_input_values(arrow_speed_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_arrow_speed = new ToggleData{&trainer, \"ArrowSpeed\", arrow_speed_check_button, arrow_speed_input};\n    arrow_speed_check_button->callback(toggle_callback, td_arrow_speed);\n\n    arrow_speed_flex->end();\n    options1_flex->fixed(arrow_speed_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 7: Set arrow_distance (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *arrow_distance_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    arrow_distance_flex->gap(option_gap);\n\n    Fl_Box *arrow_distance_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    arrow_distance_flex->fixed(arrow_distance_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *arrow_distance_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    arrow_distance_flex->fixed(arrow_distance_check_button, toggle_w);\n\n    Fl_Box *arrow_distance_label = new Fl_Box(0, 0, 0, 0);\n    tr(arrow_distance_label, \"Set Arrow Distance\");\n\n    Fl_Input *arrow_distance_input = new Fl_Input(0, 0, 0, 0);\n    arrow_distance_flex->fixed(arrow_distance_input, input_w);\n    arrow_distance_input->type(FL_INT_INPUT);\n    set_input_values(arrow_distance_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_arrow_distance = new ToggleData{&trainer, \"ArrowDistance\", arrow_distance_check_button, arrow_distance_input};\n    arrow_distance_check_button->callback(toggle_callback, td_arrow_distance);\n\n    arrow_distance_flex->end();\n    options1_flex->fixed(arrow_distance_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 8: Set arrow_count (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *arrow_count_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    arrow_count_flex->gap(option_gap);\n\n    Fl_Box *arrow_count_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    arrow_count_flex->fixed(arrow_count_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *arrow_count_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    arrow_count_flex->fixed(arrow_count_check_button, toggle_w);\n\n    Fl_Box *arrow_count_label = new Fl_Box(0, 0, 0, 0);\n    tr(arrow_count_label, \"Set Arrow Count\");\n\n    Fl_Input *arrow_count_input = new Fl_Input(0, 0, 0, 0);\n    arrow_count_flex->fixed(arrow_count_input, input_w);\n    arrow_count_input->type(FL_INT_INPUT);\n    set_input_values(arrow_count_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_arrow_count = new ToggleData{&trainer, \"ArrowCount\", arrow_count_check_button, arrow_count_input};\n    arrow_count_check_button->callback(toggle_callback, td_arrow_count);\n\n    arrow_count_flex->end();\n    options1_flex->fixed(arrow_count_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 9: Set sword_damage (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *sword_damage_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    sword_damage_flex->gap(option_gap);\n\n    Fl_Box *sword_damage_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    sword_damage_flex->fixed(sword_damage_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *sword_damage_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    sword_damage_flex->fixed(sword_damage_check_button, toggle_w);\n\n    Fl_Box *sword_damage_label = new Fl_Box(0, 0, 0, 0);\n    tr(sword_damage_label, \"Set Sword Damage\");\n\n    Fl_Input *sword_damage_input = new Fl_Input(0, 0, 0, 0);\n    sword_damage_flex->fixed(sword_damage_input, input_w);\n    sword_damage_input->type(FL_INT_INPUT);\n    set_input_values(sword_damage_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_sword_damage = new ToggleData{&trainer, \"SwordDamage\", sword_damage_check_button, sword_damage_input};\n    sword_damage_check_button->callback(toggle_callback, td_sword_damage);\n\n    sword_damage_flex->end();\n    options1_flex->fixed(sword_damage_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 10: Set sword_cool_down (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *sword_cool_down_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    sword_cool_down_flex->gap(option_gap);\n\n    Fl_Box *sword_cool_down_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    sword_cool_down_flex->fixed(sword_cool_down_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *sword_cool_down_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    sword_cool_down_flex->fixed(sword_cool_down_check_button, toggle_w);\n\n    Fl_Box *sword_cool_down_label = new Fl_Box(0, 0, 0, 0);\n    tr(sword_cool_down_label, \"Set Sword Cooldown\");\n\n    Fl_Input *sword_cool_down_input = new Fl_Input(0, 0, 0, 0);\n    sword_cool_down_flex->fixed(sword_cool_down_input, input_w);\n    sword_cool_down_input->type(FL_INT_INPUT);\n    set_input_values(sword_cool_down_input, \"0\", \"0\", \"999\");\n\n    ToggleData *td_sword_cool_down = new ToggleData{&trainer, \"SwordCoolDown\", sword_cool_down_check_button, sword_cool_down_input};\n    sword_cool_down_check_button->callback(toggle_callback, td_sword_cool_down);\n\n    sword_cool_down_flex->end();\n    options1_flex->fixed(sword_cool_down_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 11: Set sword_speed (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *sword_speed_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    sword_speed_flex->gap(option_gap);\n\n    Fl_Box *sword_speed_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    sword_speed_flex->fixed(sword_speed_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *sword_speed_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    sword_speed_flex->fixed(sword_speed_check_button, toggle_w);\n\n    Fl_Box *sword_speed_label = new Fl_Box(0, 0, 0, 0);\n    tr(sword_speed_label, \"Set Sword Speed\");\n\n    Fl_Input *sword_speed_input = new Fl_Input(0, 0, 0, 0);\n    sword_speed_flex->fixed(sword_speed_input, input_w);\n    sword_speed_input->type(FL_INT_INPUT);\n    set_input_values(sword_speed_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_sword_speed = new ToggleData{&trainer, \"SwordSpeed\", sword_speed_check_button, sword_speed_input};\n    sword_speed_check_button->callback(toggle_callback, td_sword_speed);\n\n    sword_speed_flex->end();\n    options1_flex->fixed(sword_speed_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 12: Set sword_distance (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *sword_distance_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    sword_distance_flex->gap(option_gap);\n\n    Fl_Box *sword_distance_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    sword_distance_flex->fixed(sword_distance_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *sword_distance_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    sword_distance_flex->fixed(sword_distance_check_button, toggle_w);\n\n    Fl_Box *sword_distance_label = new Fl_Box(0, 0, 0, 0);\n    tr(sword_distance_label, \"Set Sword Distance\");\n\n    Fl_Input *sword_distance_input = new Fl_Input(0, 0, 0, 0);\n    sword_distance_flex->fixed(sword_distance_input, input_w);\n    sword_distance_input->type(FL_INT_INPUT);\n    set_input_values(sword_distance_input, \"99\", \"1\", \"999\");\n\n    ToggleData *td_sword_distance = new ToggleData{&trainer, \"SwordDistance\", sword_distance_check_button, sword_distance_input};\n    sword_distance_check_button->callback(toggle_callback, td_sword_distance);\n\n    sword_distance_flex->end();\n    options1_flex->fixed(sword_distance_flex, option_h);\n\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Arrow a Row Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Arrow a Row Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"Arrow a Row.exe\") {} // x64\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"GameAssembly.dll\";\n\n    // Pointer-toggle approach\n    inline bool setCoin(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x018E43C8, 0x440, 0x230, 0x230, 0x268, 0xEB8, 0x70, 0xE38};\n        return createPointerToggle(moduleName, \"Coin\", offsets, newVal);\n    }\n\n    inline bool setHealth(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x01918328, 0xC0, 0x90, 0x40, 0xB8, 0x20, 0x18, 0x28};\n        return createPointerToggle(moduleName, \"Health\", offsets, newVal);\n    }\n\n    // AOB-toggle approach\n    inline bool setHorizontalSpeed(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 40 20\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"40\", \"20\", \"E9\", \"DA\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n            // movss xmm0,[RIP+disp32] => F3 0F 10 05 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x05;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rax+20],xmm0 => F3 0F 11 40 20\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x40;\n            code[wPos++] = 0x20;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"HorizontalSpeed\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setArrowDamage(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 43 44\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"43\", \"44\", \"0F\"};\n\n        size_t patternOffset = 0; // start position of target instruction\n        size_t overwriteLen = 5;  // length of target instruction to overwrite\n        size_t codeSize = 0x600;  // Allocate sufficient space\n\n        // Build the hook\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90); // NOP padding\n\n            // Embed the new float value at a known offset (e.g., 0x400)\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // movss xmm0, [RIP+disp32] => F3 0F 10 05 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x05;\n            {\n                uintptr_t floatAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(floatAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rbx+44], xmm0 => F3 0F 11 43 44\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x43;\n            code[wPos++] = 0x44;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        // Create the hook\n        return createNamedHook(\n            moduleName,\n            \"ArrowDamage\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setArrowFrequency(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 73 4C\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"73\", \"4C\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // sub rsp,0x10 => 48 83 EC 10\n            code[wPos++] = 0x48;\n            code[wPos++] = 0x83;\n            code[wPos++] = 0xEC;\n            code[wPos++] = 0x10;\n\n            // movss xmm6, [RIP+disp32] => F3 0F 10 35 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x35;\n            {\n                uintptr_t floatAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(floatAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rbx+4C], xmm6 => F3 0F 11 73 4C\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x73;\n            code[wPos++] = 0x4C;\n\n            // add rsp,0x10 => 48 83 C4 10\n            code[wPos++] = 0x48;\n            code[wPos++] = 0x83;\n            code[wPos++] = 0xC4;\n            code[wPos++] = 0x10;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"ArrowFrequency\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setArrowSpeed(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 7B 38\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"7B\", \"38\", \"83\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // movss xmm7, [RIP+disp32] => F3 0F 10 3D <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x3D;\n            {\n                uintptr_t floatAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(floatAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rbx+38], xmm7 => F3 0F 11 7B 38\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x7B;\n            code[wPos++] = 0x38;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"ArrowSpeed\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setArrowDistance(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 73 40\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"73\", \"40\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // movss xmm6, [RIP+disp32] => F3 0F 10 35 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x35;\n            {\n                uintptr_t floatAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(floatAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rbx+40], xmm6 => F3 0F 11 73 40\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x73;\n            code[wPos++] = 0x40;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"ArrowDistance\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setArrowCount(int newVal)\n    {\n        // Target instruction bytes: 8B 43 48 83 F8 0F\n        std::vector<std::string> bigPat = {\"8B\", \"43\", \"48\", \"83\", \"F8\", \"0F\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 6;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            int *pInt = reinterpret_cast<int *>(&code[0x400]);\n            *pInt = newVal;\n\n            size_t wPos = 0;\n\n            // mov eax,[RIP+disp32] => 8B 05 <disp32>\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x05;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // mov [rbx+48], eax => 89 43 48\n            code[wPos++] = 0x89;\n            code[wPos++] = 0x43;\n            code[wPos++] = 0x48;\n\n            // cmp eax,0F => 83 F8 0F\n            code[wPos++] = 0x83;\n            code[wPos++] = 0xF8;\n            code[wPos++] = 0x0F;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"ArrowCount\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setSwordDamage(float newVal)\n    {\n        // Target instruction bytes: F3 44 0F 11 00\n        std::vector<std::string> bigPat = {\"F3\", \"44\", \"0F\", \"11\", \"00\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // movss xmm8,[RIP+disp32] => F3 44 0F 10 05 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x44;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x05;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rax],xmm8 => F3 44 0F 11 00\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x44;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x00;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"SwordDamage\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setSwordCoolDown(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 79 04\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"79\", \"04\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // movss xmm7,[RIP+disp32] => F3 0F 10 3D <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x3D;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rcx+04],xmm7 => F3 0F 11 79 04\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x79;\n            code[wPos++] = 0x04;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"SwordCoolDown\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setSwordSpeed(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 41 14\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"41\", \"14\", \"48\", \"8B\", \"05\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n            // movss xmm0,[RIP+disp32] => F3 0F 10 05 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x05;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rcx+14],xmm0 => F3 0F 11 41 14\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x41;\n            code[wPos++] = 0x14;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"SwordSpeed\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n\n    inline bool setSwordDistance(float newVal)\n    {\n        // Target instruction bytes: F3 0F 11 71 08\n        std::vector<std::string> bigPat = {\"F3\", \"0F\", \"11\", \"71\", \"08\"};\n\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            float *pFloat = reinterpret_cast<float *>(&code[0x400]);\n            *pFloat = newVal;\n\n            size_t wPos = 0;\n\n            // movss xmm6,[RIP+disp32] => F3 0F 10 35 <disp32>\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x10;\n            code[wPos++] = 0x35;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // movss [rcx+08],xmm6 => F3 0F 11 71 08\n            code[wPos++] = 0xF3;\n            code[wPos++] = 0x0F;\n            code[wPos++] = 0x11;\n            code[wPos++] = 0x71;\n            code[wPos++] = 0x08;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"SwordDistance\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Arrow a Row Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Arrow a Row Trainer\": \"Arrow a Row Trainer\",\n        \"Set Coins\": \"Set Coins\",\n        \"Set Health\": \"Set Health\",\n        \"Set Horizontal Speed\": \"Set Horizontal Speed\",\n        \"Set Arrow Damage\": \"Set Arrow Damage\",\n        \"Set Arrow Frequency\": \"Set Arrow Frequency\",\n        \"Set Arrow Speed\": \"Set Arrow Speed\",\n        \"Set Arrow Distance\": \"Set Arrow Distance\",\n        \"Set Arrow Count\": \"Set Arrow Count\",\n        \"Set Sword Damage\": \"Set Sword Damage\",\n        \"Set Sword Cooldown\": \"Set Sword Cooldown\",\n        \"Set Sword Speed\": \"Set Sword Speed\",\n        \"Set Sword Distance\": \"Set Sword Distance\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Arrow a Row Trainer\": \"箭箭剑修改器\",\n        \"Set Coins\": \"设置金币\",\n        \"Set Health\": \"设置生命值\",\n        \"Set Horizontal Speed\": \"设置横移速度\",\n        \"Set Arrow Damage\": \"设置弓箭伤害\",\n        \"Set Arrow Frequency\": \"设置射击频率\",\n        \"Set Arrow Speed\": \"设置弓箭速度\",\n        \"Set Arrow Distance\": \"设置弓箭距离\",\n        \"Set Arrow Count\": \"设置弓箭数量\",\n        \"Set Sword Damage\": \"设置御剑伤害\",\n        \"Set Sword Cooldown\": \"设置御剑 CD\",\n        \"Set Sword Speed\": \"设置御剑速度\",\n        \"Set Sword Distance\": \"设置御剑距离\"\n    }\n}\n"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"DREDGE\")\nset(TRAINER_NAME \"DREDGE Trainer\")\n\nset(CSHARP_TARGET \"${GAME_NAME}_GCMInjection\")\nset(CSHARP_SOURCE \"${CMAKE_CURRENT_SOURCE_DIR}/GCMInjection.cs\")\nset(CSHARP_DLL \"${CMAKE_CURRENT_SOURCE_DIR}/GCMInjection.dll\")\nset(CSHARP_TEMP_DIR \"${CMAKE_BINARY_DIR}/trainers/${TRAINER_NAME}/GCMInjection\")\nset(CSHARP_TEMP_OUTPUT \"${CSHARP_TEMP_DIR}/GCMInjection.dll\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \n    \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/translation_extra.txt\"\n)\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\n# Compile GCMInjection.cs to the build directory\nadd_custom_command(\n    OUTPUT ${CSHARP_TEMP_OUTPUT}\n    COMMAND \"dotnet\" build \"${CMAKE_CURRENT_SOURCE_DIR}/GCMInjection.csproj\" -c Release -o \"${CSHARP_TEMP_DIR}\"\n    DEPENDS ${CSHARP_SOURCE} \"${CMAKE_CURRENT_SOURCE_DIR}/GCMInjection.csproj\"\n    COMMENT \"Compiling GCMInjection.cs to temporary output in ${CSHARP_TEMP_DIR}\"\n    VERBATIM\n)\n\n# Move GCMInjection.dll to the trainer folder\nadd_custom_command(\n    OUTPUT ${CSHARP_DLL}\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different\n        ${CSHARP_TEMP_OUTPUT}\n        ${CSHARP_DLL}\n    DEPENDS ${CSHARP_TEMP_OUTPUT}\n    COMMENT \"Moving GCMInjection.dll to ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${CSHARP_TARGET} ALL\n    DEPENDS ${CSHARP_DLL}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET} ${CSHARP_TARGET} MonoBridge)\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\n# Handle Windows-specific resources file\nif(WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/ and embed manifest\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMAND \"mt.exe\" -manifest \"${CMAKE_SOURCE_DIR}/common/assets/elevate.xml\" \"-outputresource:${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe;1\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME} and embedding manifest\"\n)"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/GCMInjection.cs",
    "content": "﻿using UnityEngine;\nusing System.IO;\nusing UnityEngine.Localization.Settings;\nusing UnityEngine.Localization;\nusing System;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Collections.Generic;\nusing System.Text;\n\npublic class MainThreadDispatcher : MonoBehaviour\n{\n    private static MainThreadDispatcher instance;\n    private Queue<Action> actionQueue = new Queue<Action>();\n\n    private void Awake()\n    {\n        if (instance != null)\n        {\n            Destroy(this);\n            return;\n        }\n        instance = this;\n        DontDestroyOnLoad(gameObject);\n    }\n\n    private void Update()\n    {\n        lock (actionQueue)\n        {\n            while (actionQueue.Count > 0)\n            {\n                actionQueue.Dequeue().Invoke();\n            }\n        }\n    }\n\n    public static void Enqueue(Action action)\n    {\n        if (instance != null)\n        {\n            lock (instance.actionQueue)\n            {\n                instance.actionQueue.Enqueue(action);\n            }\n        }\n    }\n}\n\npublic static class GCMInjection\n{\n    [DllImport(\"MonoBridge.dll\")]\n    private static extern void SendData(string message);\n\n    [DllImport(\"MonoBridge.dll\")]\n    private static extern void SendResponse(string message);\n\n    private static void Log(string message)\n    {\n        string formattedMessage = \"[GCMInjection] \" + message;\n        SendData(formattedMessage);\n    }\n\n    public static void Initialize()\n    {\n        GameObject go = new GameObject(\"MainThreadDispatcher\");\n        go.AddComponent<MainThreadDispatcher>();\n    }\n\n    public static void SpawnItem(int index)\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            int i = 0;\n            foreach (ItemData itemData in GameManager.Instance.ItemManager.allItems)\n            {\n                if (i == index)\n                {\n                    SpatialItemInstance spatialItemInstance = GameManager.Instance.ItemManager.CreateItem<SpatialItemInstance>(itemData);\n                    Vector3Int position;\n                    if (GameManager.Instance.SaveData.Inventory.FindPositionForObject(spatialItemInstance.GetItemData<SpatialItemData>(), out position, 0, false))\n                    {\n                        GameManager.Instance.ItemManager.AddObjectToInventory(spatialItemInstance, position, true);\n                    }\n                }\n                i++;\n            }\n        });\n    }\n\n    public static void AddFunds(float amount)\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            decimal decimalAmount = new decimal(amount);\n            GameManager.Instance.AddFunds(decimalAmount);\n        });\n    }\n\n    public static void RepairAll()\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            GameManager.Instance.ItemManager.RepairAllItemDurability();\n            GameManager.Instance.ItemManager.RepairHullDamage(true);\n        });\n    }\n\n    public static void RestockAll()\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            HarvestPOI[] POIs = UnityEngine.Object.FindObjectsOfType<HarvestPOI>();\n            foreach (HarvestPOI harvest in POIs)\n            {\n                harvest.AddStock(harvest.MaxStock, true);\n            }\n        });\n    }\n\n    public static void ClearWeather()\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            WeatherController weather = GameManager.Instance.WeatherController;\n            weather.ChangeWeather(\"clear\");\n        });\n    }\n\n    public static void FreezeTime(bool freeze)\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            GameManager.Instance.Time.ToggleFreezeTime(freeze);\n        });\n    }\n\n    public static void GetItemList()\n    {\n        MainThreadDispatcher.Enqueue(() =>\n        {\n            StringBuilder sb = new StringBuilder();\n            int i = 0;\n            foreach (ItemData itemData in GameManager.Instance.ItemManager.allItems)\n            {\n                string localizedString = LocalizationSettings.StringDatabase.GetLocalizedString(itemData.itemNameKey.TableReference, itemData.itemNameKey.TableEntryReference, null, FallbackBehavior.UseProjectSettings, Array.Empty<object>());\n                sb.AppendLine(i.ToString() + \">\" + localizedString);\n                i++;\n            }\n            SendResponse(sb.ToString());\n        });\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/GCMInjection.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <OutputType>Library</OutputType>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"UnityEngine\">\n      <HintPath>F:/SteamLibrary/steamapps/common/DREDGE/DREDGE_Data/Managed/UnityEngine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"UnityEngine.CoreModule\">\n      <HintPath>F:/SteamLibrary/steamapps/common/DREDGE/DREDGE_Data/Managed/UnityEngine.CoreModule.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Unity.Localization\">\n      <HintPath>F:/SteamLibrary/steamapps/common/DREDGE/DREDGE_Data/Managed/Unity.Localization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Assembly-CSharp\">\n      <HintPath>F:/SteamLibrary/steamapps/common/DREDGE/DREDGE_Data/Managed/Assembly-CSharp.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Sirenix.Serialization\">\n      <HintPath>F:/SteamLibrary/steamapps/common/DREDGE/DREDGE_Data/Managed/Sirenix.Serialization.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"MonoBase.h\"\n#include \"FLTKUtils.h\"\n\nstatic Fl_Window *info_window = nullptr;\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"SpawnItem\")\n    {\n        status = trainer->spawnItem(std::stoi(inputValue));\n    }\n    else if (optionName == \"AddFunds\")\n    {\n        status = trainer->addFunds(std::stof(inputValue));\n    }\n    else if (optionName == \"RepairAll\")\n    {\n        status = trainer->repairAll();\n    }\n    else if (optionName == \"RestockAll\")\n    {\n        status = trainer->restockAll();\n    }\n    else if (optionName == \"ClearWeather\")\n    {\n        status = trainer->clearWeather();\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"FreezeTime\")\n    {\n        if (button->value())\n        {\n            status = trainer->freezeTime(true);\n        }\n        else\n        {\n            status = trainer->freezeTime(false);\n        }\n    }\n    else if (optionName == \"GodMode\")\n    {\n        if (button->value())\n        {\n            status = trainer->godMode(1);\n        }\n        else\n        {\n            status = trainer->godMode(0);\n        }\n    }\n    else if (optionName == \"SetSanity\")\n    {\n        if (button->value())\n        {\n            status = trainer->setSanity(std::stof(inputValue) / 10.0f);\n        }\n        else\n        {\n            status = trainer->disableNamedHook(\"SetSanity_1\") && trainer->disableNamedHook(\"SetSanity_2\");\n        }\n    }\n    else if (optionName == \"SetMovementSpeed\")\n    {\n        if (button->value())\n        {\n            status = trainer->setMovementSpeed(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstruct InfoCallbackDataOld\n{\n    Trainer *trainer;\n    Fl_Input *input;\n};\n\nclass ItemTableOld : public Fl_Table\n{\nprivate:\n    std::vector<std::pair<int, std::string>> items;\n    int selected_row = -1;\n    Fl_Input *input;\n\nprotected:\n    void draw_cell(TableContext context, int row, int col, int x, int y, int w, int h) override\n    {\n        switch (context)\n        {\n        case CONTEXT_STARTPAGE:\n            fl_font(FL_FREE_FONT, font_size);\n            return;\n        case CONTEXT_COL_HEADER:\n            fl_push_clip(x, y, w, h);\n            fl_color(FL_FREE_COLOR);\n            fl_rectf(x, y, w, h);\n            fl_color(FL_WHITE);\n            if (col == 0)\n                fl_draw(t(\"Item ID\"), x + 4, y, w, h, FL_ALIGN_LEFT);\n            else\n                fl_draw(t(\"Item Name\"), x + 4, y, w, h, FL_ALIGN_LEFT);\n            fl_pop_clip();\n            return;\n        case CONTEXT_CELL:\n            fl_push_clip(x, y, w, h);\n            fl_color(row == selected_row ? fl_lighter(FL_FREE_COLOR) : FL_FREE_COLOR);\n            fl_rectf(x, y, w, h);\n            fl_color(FL_WHITE);\n            if (row < (int)items.size())\n            {\n                if (col == 0)\n                {\n                    fl_draw(std::to_string(items[row].first).c_str(), x + 4, y, w, h, FL_ALIGN_LEFT);\n                }\n                else\n                {\n                    fl_draw(items[row].second.c_str(), x + 4, y, w, h, FL_ALIGN_LEFT);\n                }\n            }\n            fl_pop_clip();\n            return;\n        default:\n            return;\n        }\n    }\n\n    bool find_cell_at(int mouse_x, int mouse_y, int &row, int &col)\n    {\n        int table_x = x();\n        int table_y = y();\n        int table_w = w() - scrollbar_size();\n        int table_h = h() - scrollbar_size();\n\n        // Convert mouse coordinates to table-relative\n        int mx = mouse_x - table_x;\n        int my = mouse_y - table_y;\n\n        int scroll_y = vscrollbar->value();\n        int adjusted_my = my + scroll_y;\n\n        // Check if mouse is within table bounds\n        if (mx < 0 || mx >= table_w)\n        {\n            return false;\n        }\n\n        // Calculate row\n        int y_offset = col_header_height();\n        row = -1;\n        for (int r = 0; r < rows(); r++)\n        {\n            int rh = row_height(r);\n            if (adjusted_my >= y_offset && adjusted_my < y_offset + rh)\n            {\n                row = r;\n                break;\n            }\n            y_offset += rh;\n        }\n        if (row < 0 || row >= (int)items.size())\n        {\n            return false;\n        }\n\n        // Calculate column\n        int x_offset = 0;\n        col = -1;\n        for (int c = 0; c < cols(); c++)\n        {\n            int cw = col_width(c);\n            if (mx >= x_offset && mx < x_offset + cw)\n            {\n                col = c;\n                break;\n            }\n            x_offset += cw;\n        }\n        if (col < 0 || col >= cols())\n        {\n            return false;\n        }\n\n        return true;\n    }\n\n    int handle(int event) override\n    {\n        int ret = Fl_Table::handle(event);\n        int row, col;\n\n        if (event == FL_PUSH && Fl::event_button() == FL_LEFT_MOUSE)\n        {\n            if (find_cell_at(Fl::event_x(), Fl::event_y(), row, col))\n            {\n                selected_row = row;\n                if (input)\n                {\n                    input->value(std::to_string(items[row].first).c_str());\n                }\n                redraw();\n                return 1;\n            }\n            else\n            {\n                selected_row = -1; // Deselect if click outside valid cell\n                redraw();\n                return 1;\n            }\n        }\n        else if (event == FL_RELEASE && Fl::event_button() == FL_LEFT_MOUSE && Fl::event_clicks() > 0)\n        {\n            if (find_cell_at(Fl::event_x(), Fl::event_y(), row, col))\n            {\n                selected_row = row;\n                if (input)\n                {\n                    input->value(std::to_string(items[row].first).c_str());\n                }\n                Fl_Window *win = dynamic_cast<Fl_Window *>(parent()->top_window());\n                if (win)\n                {\n                    win->hide();\n                }\n                redraw();\n                return 1;\n            }\n        }\n        return ret;\n    }\n\npublic:\n    ItemTableOld(int x, int y, int w, int h, Fl_Input *inp, const char *l = 0) : Fl_Table(x, y, w, h, l), input(inp)\n    {\n        int scrollbarSize = 16;\n        cols(2);\n        col_header(1);\n        col_width(0, 60);\n        col_width(1, w - 60 - scrollbarSize);\n        row_header(0);\n        box(FL_NO_BOX);\n        scrollbar_size(scrollbarSize);\n        end();\n    }\n\n    void setItems(const std::vector<std::pair<int, std::string>> &item_list)\n    {\n        items = item_list;\n        rows(item_list.size());\n        selected_row = -1;\n        redraw();\n    }\n};\n\nvoid info_callback_old(Fl_Widget *widget, void *data)\n{\n    InfoCallbackDataOld *info_data = static_cast<InfoCallbackDataOld *>(data);\n    Trainer *trainer = info_data->trainer;\n    Fl_Input *input = info_data->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    if (info_window && info_window->shown())\n    {\n        info_window->show();\n        return;\n    }\n\n    Fl_Window *trainer_window = widget->window();\n    int trainer_x = trainer_window->x();\n    int trainer_y = trainer_window->y();\n    int trainer_w = trainer_window->w();\n    int trainer_h = trainer_window->h();\n\n    int info_w = 350;\n    int info_h = 500;\n    int info_x = trainer_x + (trainer_w - info_w) / 2;\n    int info_y = trainer_y + (trainer_h - info_h) / 2;\n\n    info_window = new Fl_Window(info_x, info_y, info_w, info_h, t(\"Item List\"));\n    info_window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n\n    std::string itemList = trainer->getItemList();\n    std::vector<std::pair<int, std::string>> items;\n    std::istringstream iss(itemList);\n    std::string line;\n    while (std::getline(iss, line))\n    {\n        line.erase(std::remove(line.begin(), line.end(), '\\r'), line.end());\n        size_t pos = line.find('>');\n        if (pos != std::string::npos)\n        {\n            try\n            {\n                int id = std::stoi(line.substr(0, pos));\n                std::string name = line.substr(pos + 1);\n                items.emplace_back(id, name);\n            }\n            catch (...)\n            {\n                // Skip malformed lines\n            }\n        }\n    }\n\n    ItemTableOld *table = new ItemTableOld(0, 0, info_w, info_h, input);\n    table->setItems(items);\n    table->color(FL_FREE_COLOR);\n\n    info_window->end();\n    info_window->show();\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    if (info_window)\n    {\n        Fl::delete_widget(info_window);\n        info_window = nullptr;\n    }\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"DREDGE Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    Fl::add_timeout(0, MonoBase::check_logging_available, &trainer);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // god_mode (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *god_mode_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    god_mode_flex->gap(option_gap);\n\n    Fl_Box *god_mode_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    god_mode_flex->fixed(god_mode_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *god_mode_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    god_mode_flex->fixed(god_mode_check_button, toggle_w);\n\n    Fl_Box *god_mode_label = new Fl_Box(0, 0, 0, 0);\n    tr(god_mode_label, \"God Mode\");\n\n    ToggleData *data_god_mode = new ToggleData{&trainer, \"GodMode\", god_mode_check_button, nullptr};\n    god_mode_check_button->callback(toggle_callback, data_god_mode);\n\n    god_mode_flex->end();\n    options1_flex->fixed(god_mode_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // set sanity (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *set_sanity_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    set_sanity_flex->gap(option_gap);\n\n    Fl_Box *set_sanity_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    set_sanity_flex->fixed(set_sanity_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *set_sanity_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    set_sanity_flex->fixed(set_sanity_check_button, toggle_w);\n\n    Fl_Box *set_sanity_label = new Fl_Box(0, 0, 0, 0);\n    tr(set_sanity_label, \"Set Sanity\");\n\n    Fl_Input *set_sanity_input = new Fl_Input(0, 0, 0, 0);\n    set_sanity_flex->fixed(set_sanity_input, input_w);\n    set_sanity_input->type(FL_INT_INPUT);\n    set_input_values(set_sanity_input, \"10\", \"0\", \"10\");\n\n    ToggleData *data_set_sanity = new ToggleData{&trainer, \"SetSanity\", set_sanity_check_button, set_sanity_input};\n    set_sanity_check_button->callback(toggle_callback, data_set_sanity);\n\n    set_sanity_flex->end();\n    options1_flex->fixed(set_sanity_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // set movement speed (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *set_movement_speed_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    set_movement_speed_flex->gap(option_gap);\n\n    Fl_Box *set_movement_speed_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    set_movement_speed_flex->fixed(set_movement_speed_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *set_movement_speed_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    set_movement_speed_flex->fixed(set_movement_speed_check_button, toggle_w);\n\n    Fl_Box *set_movement_speed_label = new Fl_Box(0, 0, 0, 0);\n    tr(set_movement_speed_label, \"Set Movement Speed\");\n\n    Fl_Input *set_movement_speed_input = new Fl_Input(0, 0, 0, 0);\n    set_movement_speed_flex->fixed(set_movement_speed_input, input_w);\n    set_movement_speed_input->type(FL_INT_INPUT);\n    set_input_values(set_movement_speed_input, \"50\", \"0\", \"999\");\n\n    ToggleData *data_set_movement_speed = new ToggleData{&trainer, \"SetMovementSpeed\", set_movement_speed_check_button, set_movement_speed_input};\n    set_movement_speed_check_button->callback(toggle_callback, data_set_movement_speed);\n\n    set_movement_speed_flex->end();\n    options1_flex->fixed(set_movement_speed_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Spawn item (Apply)\n    // ------------------------------------------------------------------\n    Fl_Flex *spawn_item_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    spawn_item_flex->gap(option_gap);\n\n    Fl_Button *spawn_item_apply_button = new Fl_Button(0, 0, 0, 0);\n    spawn_item_flex->fixed(spawn_item_apply_button, button_w);\n    tr(spawn_item_apply_button, \"Apply\");\n\n    Fl_Box *spawn_item_label = new Fl_Box(0, 0, 0, 0);\n    tr(spawn_item_label, \"Spawn Item\");\n\n    Fl_Input *spawn_item_input = new Fl_Input(0, 0, 0, 0);\n    spawn_item_flex->fixed(spawn_item_input, input_w);\n    spawn_item_input->type(FL_INT_INPUT);\n    set_input_values(spawn_item_input, \"0\", \"0\", \"419\");\n\n    DWORD info_img_size = 0;\n    const unsigned char *info_img_data = load_resource(\"INFO_IMG\", info_img_size);\n    Fl_PNG_Image *info_img = new Fl_PNG_Image(nullptr, info_img_data, (int)info_img_size);\n    info_img->scale(20, 20, 1, 0);\n\n    Fl_Button *info_icon = new Fl_Button(0, 0, 0, 0);\n    spawn_item_flex->fixed(info_icon, 20);\n    spawn_item_flex->add(info_icon);\n    info_icon->box(FL_NO_BOX);\n    info_icon->image(info_img);\n    InfoCallbackDataOld *info_data = new InfoCallbackDataOld{&trainer, spawn_item_input};\n    info_icon->callback(info_callback_old, info_data);\n\n    ApplyData *ad_spawn_item = new ApplyData{&trainer, \"SpawnItem\", spawn_item_apply_button, spawn_item_input};\n    spawn_item_apply_button->callback(apply_callback, ad_spawn_item);\n\n    spawn_item_flex->end();\n    options1_flex->fixed(spawn_item_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Add funds (Apply)\n    // ------------------------------------------------------------------\n    Fl_Flex *funds_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    funds_flex->gap(option_gap);\n\n    Fl_Button *funds_apply_button = new Fl_Button(0, 0, 0, 0);\n    funds_flex->fixed(funds_apply_button, button_w);\n    tr(funds_apply_button, \"Apply\");\n\n    Fl_Box *funds_label = new Fl_Box(0, 0, 0, 0);\n    tr(funds_label, \"Add Funds\");\n\n    Fl_Input *funds_input = new Fl_Input(0, 0, 0, 0);\n    funds_flex->fixed(funds_input, input_w);\n    funds_input->type(FL_INT_INPUT);\n    set_input_values(funds_input, \"999999\", \"-999999999\", \"999999999\");\n\n    ApplyData *data_funds = new ApplyData{&trainer, \"AddFunds\", funds_apply_button, funds_input};\n    funds_apply_button->callback(apply_callback, data_funds);\n\n    funds_flex->end();\n    options1_flex->fixed(funds_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // repair_all (Apply)\n    // ------------------------------------------------------------------\n    Fl_Flex *repair_all_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    repair_all_flex->gap(option_gap);\n\n    Fl_Button *repair_all_apply_button = new Fl_Button(0, 0, 0, 0);\n    repair_all_flex->fixed(repair_all_apply_button, button_w);\n    tr(repair_all_apply_button, \"Apply\");\n\n    Fl_Box *repair_all_label = new Fl_Box(0, 0, 0, 0);\n    tr(repair_all_label, \"Repair All\");\n\n    ApplyData *data_repair_all = new ApplyData{&trainer, \"RepairAll\", repair_all_apply_button, nullptr};\n    repair_all_apply_button->callback(apply_callback, data_repair_all);\n\n    repair_all_flex->end();\n    options1_flex->fixed(repair_all_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // restock_all (Apply)\n    // ------------------------------------------------------------------\n    Fl_Flex *restock_all_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    restock_all_flex->gap(option_gap);\n\n    Fl_Button *restock_all_apply_button = new Fl_Button(0, 0, 0, 0);\n    restock_all_flex->fixed(restock_all_apply_button, button_w);\n    tr(restock_all_apply_button, \"Apply\");\n\n    Fl_Box *restock_all_label = new Fl_Box(0, 0, 0, 0);\n    tr(restock_all_label, \"Restock All\");\n\n    ApplyData *data_restock_all = new ApplyData{&trainer, \"RestockAll\", restock_all_apply_button, nullptr};\n    restock_all_apply_button->callback(apply_callback, data_restock_all);\n\n    restock_all_flex->end();\n    options1_flex->fixed(restock_all_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // clear_weather (Apply)\n    // ------------------------------------------------------------------\n    Fl_Flex *clear_weather_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    clear_weather_flex->gap(option_gap);\n\n    Fl_Button *clear_weather_apply_button = new Fl_Button(0, 0, 0, 0);\n    clear_weather_flex->fixed(clear_weather_apply_button, button_w);\n    tr(clear_weather_apply_button, \"Apply\");\n\n    Fl_Box *clear_weather_label = new Fl_Box(0, 0, 0, 0);\n    tr(clear_weather_label, \"Clear Weather\");\n\n    ApplyData *data_clear_weather = new ApplyData{&trainer, \"ClearWeather\", clear_weather_apply_button, nullptr};\n    clear_weather_apply_button->callback(apply_callback, data_clear_weather);\n\n    clear_weather_flex->end();\n    options1_flex->fixed(clear_weather_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // freeze_time (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *freeze_time_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    freeze_time_flex->gap(option_gap);\n\n    Fl_Box *freeze_time_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    freeze_time_flex->fixed(freeze_time_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *freeze_time_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    freeze_time_flex->fixed(freeze_time_check_button, toggle_w);\n\n    Fl_Box *freeze_time_label = new Fl_Box(0, 0, 0, 0);\n    tr(freeze_time_label, \"Freeze Time\");\n\n    ToggleData *data_freeze_time = new ToggleData{&trainer, \"FreezeTime\", freeze_time_check_button, nullptr};\n    freeze_time_check_button->callback(toggle_callback, data_freeze_time);\n\n    freeze_time_flex->end();\n    options1_flex->fixed(freeze_time_flex, option_h);\n\n    // ------------------------------------------------------------------\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nINFO_IMG RCDATA \"../../common/assets/info.png\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\"\nMONOBRIDGE_DLL RCDATA \"../../common/libs/x86/MonoBridge.dll\"\nGCMINJECTION_DLL RCDATA \"GCMInjection.dll\""
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/trainer.h",
    "content": "// Trainer.h\n#pragma once\n\n#include \"MonoBase.h\"\n\nclass Trainer : public MonoBase\n{\npublic:\n    Trainer() : MonoBase(L\"DREDGE.exe\") {} // x86\n    virtual ~Trainer() {}\n\n    static inline const wchar_t *moduleName = L\"mono-2.0-bdwgc.dll\";\n\n    bool godMode(BYTE enable)\n    {\n        std::vector<unsigned int> offsets1 = {0x00561CCC, 0xC, 0x4, 0x6C, 0x18, 0x0, 0xAC, 0x94}; // No death\n        std::vector<unsigned int> offsets2 = {0x00561CCC, 0xC, 0x4, 0x6C, 0x18, 0x0, 0xAC, 0x95}; // No damage\n        bool result1 = WriteToDynamicAddress(moduleName, offsets1, enable);\n        bool result2 = WriteToDynamicAddress(moduleName, offsets2, enable);\n        return result1 && result2;\n    }\n\n    inline bool setSanity(float newVal)\n    {\n        // Allocate shared memory for float value\n        if (m_pSharedSanity == 0)\n        {\n            m_pSharedSanity = reinterpret_cast<uintptr_t>(VirtualAllocEx(hProcess, nullptr, sizeof(float), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\n            if (!m_pSharedSanity)\n            {\n                std::cerr << \"[!] Failed to allocate shared memory for sanity value.\" << std::endl;\n                return false;\n            }\n        }\n        WriteProcessMemory(hProcess, (LPVOID)m_pSharedSanity, &newVal, sizeof(float), nullptr);\n\n        // First hook\n        bool hook1_success = false;\n        {\n            const std::vector<std::string> pat1 = {\"D9\", \"5F\", \"18\", \"D9\", \"47\", \"18\", \"D9\", \"1C\", \"24\", \"8D\"};\n            auto buildFunc1 = [this](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                std::vector<BYTE> code;\n\n                // fstp st(0)\n                code.insert(code.end(), {0xDD, 0xD8});\n\n                // fld dword ptr [codeCaveAddr]\n                uint32_t addr32 = static_cast<uint32_t>(this->m_pSharedSanity);\n                code.insert(code.end(), {0xD9, 0x05});\n                code.insert(code.end(), (BYTE *)&addr32, (BYTE *)&addr32 + 4);\n\n                // fstp dword ptr [edi+18]\n                code.insert(code.end(), {0xD9, 0x5F, 0x18});\n\n                // fld dword ptr [edi+18]\n                code.insert(code.end(), {0xD9, 0x47, 0x18});\n\n                // jmp [rel_addr]\n                uintptr_t retAddr = hookAddr + originalBytes.size();     // address to jump back to\n                uintptr_t nextInstr = codeCaveAddr + code.size() + 5;    // next instruction address after jmp in code cave\n                int32_t rel = static_cast<int32_t>(retAddr - nextInstr); // address that jmp uses\n                code.push_back(0xE9);\n                code.insert(code.end(), (BYTE *)&rel, (BYTE *)&rel + 4);\n\n                return code;\n            };\n            hook1_success = createNamedHook(nullptr, \"SetSanity_1\", pat1, 0, 6, 0x100, buildFunc1);\n        }\n\n        // Second hook\n        bool hook2_success = false;\n        {\n            // This is a case to replace dynamic instruction bytes\n            const std::vector<std::string> pat2 = {\"E8\", \"??\", \"??\", \"??\", \"??\", \"D9\", \"5F\", \"18\", \"8B\", \"05\"};\n            auto buildFunc2 = [this](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                std::vector<BYTE> code;\n\n                // call [rel_addr]\n                int32_t original_relative_offset;\n                std::memcpy(&original_relative_offset, &originalBytes[1], 4);\n                uintptr_t absolute_target_address = hookAddr + 5 + original_relative_offset;\n                uintptr_t next_instr_in_cave = codeCaveAddr + code.size() + 5;\n                int32_t new_relative_offset = static_cast<int32_t>(absolute_target_address - next_instr_in_cave);\n                code.push_back(0xE8);\n                code.insert(code.end(), (BYTE *)&new_relative_offset, (BYTE *)&new_relative_offset + 4);\n\n                // fstp st(0)\n                code.insert(code.end(), {0xDD, 0xD8});\n\n                // fld dword ptr [codeCaveAddr]\n                uint32_t addr32 = static_cast<uint32_t>(this->m_pSharedSanity);\n                code.insert(code.end(), {0xD9, 0x05});\n                code.insert(code.end(), (BYTE *)&addr32, (BYTE *)&addr32 + 4);\n\n                // jmp [rel_addr]\n                uintptr_t retAddr = hookAddr + originalBytes.size();\n                uintptr_t nextInstr = codeCaveAddr + code.size() + 5;\n                int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n                code.push_back(0xE9);\n                code.insert(code.end(), (BYTE *)&rel, (BYTE *)&rel + 4);\n\n                return code;\n            };\n            hook2_success = createNamedHook(nullptr, \"SetSanity_2\", pat2, 0, 5, 0x100, buildFunc2);\n        }\n\n        return hook1_success && hook2_success;\n    }\n\n    inline bool setMovementSpeed(float newVal)\n    {\n        const std::vector<std::string> pat = {\"D9\", \"47\", \"48\", \"DE\", \"C9\", \"D9\", \"9D\"};\n        size_t patternOffset = 0;\n        size_t overwriteLen = 5;\n        size_t codeSize = 0x100;\n\n        auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            const size_t dataOffset = 0x80;\n            std::vector<BYTE> code(codeSize, 0x90);\n\n            // --- DATA SECTION ---\n            std::memcpy(&code[dataOffset], &newVal, sizeof(float));\n            uint32_t dataAddr = static_cast<uint32_t>(codeCaveAddr + dataOffset);\n\n            // --- CODE SECTION ---\n            size_t wPos = 0;\n\n            // push eax\n            code[wPos++] = 0x50;\n\n            // mov eax, [codeCaveAddr]\n            code[wPos++] = 0xA1;\n            std::memcpy(&code[wPos], &dataAddr, 4);\n            wPos += 4;\n\n            // mov [edi+48], eax\n            code[wPos++] = 0x89;\n            code[wPos++] = 0x47;\n            code[wPos++] = 0x48;\n\n            // pop eax\n            code[wPos++] = 0x58;\n\n            // fld dword ptr [edi+48] and fmulp st(1),st(0)\n            std::memcpy(&code[wPos], originalBytes.data(), originalBytes.size());\n            wPos += originalBytes.size();\n\n            // jmp <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t returnAddress = hookAddr + overwriteLen;\n            uintptr_t nextInstruction = codeCaveAddr + wPos + 4;\n            int32_t relativeJump = static_cast<int32_t>(returnAddress - nextInstruction);\n            std::memcpy(&code[wPos], &relativeJump, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(nullptr, \"SetMovementSpeed\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    // DLL injection methods\n    std::string getItemList()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethodReturn(\"\", \"GCMInjection\", \"GetItemList\", {});\n        }\n        return \"\";\n    }\n\n    bool spawnItem(int itemIndex)\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"\", \"GCMInjection\", \"SpawnItem\", {itemIndex});\n        }\n        return false;\n    }\n\n    bool addFunds(float amount)\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"\", \"GCMInjection\", \"AddFunds\", {amount});\n        }\n        return false;\n    }\n\n    bool repairAll()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"\", \"GCMInjection\", \"RepairAll\", {});\n        }\n        return false;\n    }\n\n    bool restockAll()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"\", \"GCMInjection\", \"RestockAll\", {});\n        }\n        return false;\n    }\n\n    bool clearWeather()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"\", \"GCMInjection\", \"ClearWeather\", {});\n        }\n        return false;\n    }\n\n    bool freezeTime(bool freeze)\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"\", \"GCMInjection\", \"FreezeTime\", {freeze});\n        }\n        return false;\n    }\n\nprivate:\n    uintptr_t m_pSharedSanity = 0;\n};"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/translation_extra.txt",
    "content": "0>Fisherman's Note\n1>6th, 7th March 1927\n2>Tattered Receipt\n3>1st June 1927\n4>20th August 1927\n5>21st August 1927\n6>9th September 1927\n7>14th September 1927\n8>???\n9>???\n10>Artifact Manifest\n11>Captain's Log - 30th May, 1847\n12>Captain's Log - 1st June, 1847\n13>Captain's Log - 5th June, 1847\n14>Tattered Diary - 2nd June, 1847\n15>Tattered Diary - 4th June, 1847\n16>Tattered Diary - 5th June, 1847\n17>Leather Journal - 4th June, 1847\n18>Leather Journal - 7th June, 1847\n19>Leather Journal - 8th June, 1847\n20>Ragged Note\n21>Book of Astral Symbols\n22>Haggling and Bartering: A Guide\n23>Art of the Silver Tongue\n24>Sustainable Fishing\n25>A Plan For The Future\n26>The Engineer's Companion\n27>Nautical Engineering\n28>Rods, Reels and Rigs\n29>Advanced Fishing\n30>Correct Engine Operation\n31>Pushing The Limit: Engines\n32>The Relaxed Mind\n33>Getting Over It With Mind and Body\n34>Mixed Bait\n35>Aberrated Bait\n36>Insta-Crab Bait\n37>Exotic Bait\n38>Dark Canister\n39>Damage\n40>Dark Splash\n41>Dredge Crane\n42>Peculiar Engine\n43>Arterial Engine\n44>Rusty Outboard Engine\n45>Improved Outboard Engine\n46>Refined Outboard Engine\n47>Twin Prop Engine\n48>Jet Drive Engine\n49>Twin Jet Drive Engine\n50>Engine Stack\n51>Weak Valve Engine\n52>Cracked Bulb\n53>Cloudy Lens\n54>Halogen Spotlight\n55>Tungsten Floodlight\n56>Incandescent Array\n57>Flame of the Sky\n58>Basic Trawl Net\n59>Improved Trawl Net\n60>Silt Filtering Trawl Net\n61>Tempered Mesh Net\n62>Large Trawl Net\n63>Heavy-Duty Trawl Net\n64>Radiant Trawl Net\n65>Brittle Trawl Net\n66>Siphon Trawler\n67>Material Harvester\n68>Basic Crab Pot\n69>Efficient Crab Pot\n70>Hardy Crab Pot\n71>Large Crab Pot\n72>Complex Crab Pot\n73>Massive Crab Pot\n74>Reinforced Crab Pot\n75>Mouth of the Deep\n76>Flotsam Trap\n77>Basic Fishing Pole\n78>Fathomless Winch\n79>Heat-Resistant Line\n80>Anti-Tangle Line\n81>Versatile Rod\n82>Harvesting Platform\n83>Tendon Rod\n84>Encrusted Talisman\n85>Simple Skimmer\n86>Sinew Spindle\n87>Weighted Line\n88>Sign of Ruin\n89>Custom Rod\n90>Barbed Ice Rod\n91>Glacial Lance\n92>Hydraulic Rod\n93>Flexible Fishing Pole\n94>Sampling Device\n95>Bottomless Lines\n96>Viscera Crane\n97>Infused Winch\n98>Infused Rod\n99>Infused Hoist\n100>Infused Fireproof Rod\n101>Infused Coiling Rod\n102>Packed Explosives\n103>Anchovy King\n104>Anchovy\n105>Bursting Anglerfish\n106>Anglerfish\n107>Brood Squid\n108>Snag Squid\n109>Arrow Squid\n110>Parhelion Jellyfish\n111>Aurora Jellyfish\n112>Savage Barracuda\n113>Concertina Barracuda\n114>Barracuda\n115>Voideye\n116>Barreleye\n117>Tusked Grouper\n118>Voltaic Grouper\n119>Black Grouper\n120>Scouring Bass\n121>Black Sea Bass\n122>Razormouth Tuna\n123>Blackfin Tuna\n124>Decaying Blackmouth\n125>Blackmouth Salmon\n126>Cleft-mouth Shark\n127>Blacktip Reef Shark\n128>Blue Mackerel\n129>Bloodskin Shark\n130>Bronze Whaler\n131>Nightwing Catfish\n132>Catfish\n133>All-Seeing Cod\n134>Fanged Cod\n135>Three-Headed Cod\n136>Cod\n137>Coelacanth\n138>Sprouting Eel\n139>Conger Eel\n140>Consumed Grouper\n141>Coral Grouper\n142>Entangled Crab\n143>Blue Crab\n144>Cerebral Crab\n145>Common Crab\n146>Crown of Nadir\n147>Crown of Thorns\n148>Cortex Decorator\n149>Decorator Crab\n150>Malignant Pincer\n151>Fiddler Crab\n152>Mire Screecher\n153>Giant Mud Crab\n154>Effigy Crab\n155>Horseshoe Crab\n156>Splintered Crab\n157>Rock Crab\n158>Umbral Puppet\n159>Spider Crab\n160>Imperious Lobster\n161>Spiny Lobster\n162>Sable Reacher\n163>Squat Lobster\n164>Grasping Snail\n165>Volcano Snail\n166>Infernal Eel\n167>Cusk Eel\n168>Withered Ray\n169>Devil Ray\n170>Bubbling Char\n171>Char\n172>Pale Grasper\n173>Colossal Squid\n174>Grisly Shark\n175>Goblin Shark\n176>Fractalline Icefish\n177>Thawed Icefish\n178>Astral Icefish\n179>Icefish\n180>King's Wreath\n181>King Crab\n182>Feral Lizardfish\n183>Lizardfish\n184>Fallen Stars\n185>Sea Stars\n186>Sleeper Shark\n187>Craterous Seer\n188>Stargazer\n189>Bulbous Toothfish\n190>Toothfish\n191>Hinged Wolffish\n192>Wolffish\n193>Bifurcated Gar\n194>Abyssal Gar\n195>Broken Arapaima\n196>Arapaima\n197>Boreal Shell\n198>Boreaspis\n199>Shaper's Prime\n200>???\n201>Excoriated Fiend\n202>Dunkleosteus\n203>Sanguine Shark\n204>Eagle Shark\n205>Untouchable Wyrmfish\n206>Giant Dragonfish\n207>Brute's Crux\n208>Famine's End\n209>Drifting Chrysalis\n210>Kerygmachela\n211>Silvering Lancetfish\n212>Lancetfish\n213>Xeno Xeno\n214>Mahi Mahi\n215>Clutching Nautilus\n216>Nautilus\n217>Wretched Nipper\n218>Nipponites\n219>Archon's Burden\n220>Crawling Instar\n221>Opabinia\n222>Plated Osteostracan\n223>Osteostracan\n224>Anvilfish\n225>Paddlefish\n226>Plated Barbjaw\n227>Sawfish\n228>Inverted Husk\n229>Sea Cucumber\n230>Erupting Scorpion\n231>Sea Scorpion\n232>Mimic Slug\n233>Sea Slug\n234>Sleeper's Torment\n235>Vagrant Sollasina\n236>Sollasina\n237>Ivory Impaler\n238>Swordfish\n239>Cystic Trilobite\n240>Trilobite\n241>Stalking Spiderfish\n242>Tripod Spiderfish\n243>Axial Matron\n244>Tullimonstrum\n245>Unveiled Vetulicolia\n246>Vetulicolia\n247>Primordial Shadow\n248>Xiphactinus\n249>Cursed Fangtooth\n250>Fangtooth\n251>Radiant Squid\n252>Firefly Squid\n253>Twisted Shark\n254>Frilled Shark\n255>Clawfin Gar\n256>Grinning Gar\n257>Gar\n258>Rapt Shark\n259>Ghost Shark\n260>Ruptured Vessel\n261>Giant Amphipod\n262>Medusa Octopus\n263>Glowing Octopus\n264>Goliath Tigerfish\n265>Barbed Eel\n266>Host Eel\n267>Grey Eel\n268>Entwined Mullet\n269>Gleaming Mullet\n270>Grey Mullet\n271>Cyclopean Flounder\n272>Riddled Flounder\n273>Gulf Flounder\n274>Gulper Eel\n275>Gazing Shark\n276>Hammerhead Shark\n277>Twinned Eels\n278>Longfin Eel\n279>Perished Loosejaw\n280>Loosejaw\n281>Grotesque Mackerel\n282>Lumpy Mackerel\n283>Many-Eyed Mackerel\n284>Skeletal Moonfish\n285>Beaked Moonfish\n286>Moonfish\n287>Oarfish\n288>Gnashing Perch\n289>Oceanic Perch\n290>Defaced Skate\n291>Pale Skate\n292>Congealed Rattail\n293>Rattail\n294>Blood Snapper\n295>Latching Snapper\n296>Red Snapper\n297>Sallow Sailfish\n298>Hooked Sailfish\n299>Sailfish\n300>Leeching Prawn\n301>Scarlet Prawn\n302>Ossified Searobin\n303>Armored Searobin\n304>Vortex Interloper\n305>Sergeant Fish\n306>Calcified Snailfish\n307>Seizing Snailfish\n308>Snailfish\n309>Serpentine Mackerel\n310>Tattered Mackerel\n311>Snake Mackerel\n312>Shard Ray\n313>Stingray\n314>Gelatinous Stonefish\n315>Enthralled Stonefish\n316>Stonefish\n317>Translucent Sturgeon\n318>Sturgeon\n319>Charred Sunfish\n320>Glaring Sunfish\n321>Ocean Sunfish\n322>Blistered Tarpon\n323>Tarpon\n324>Flayed Mackerel\n325>Bearded Mackerel\n326>Tiger Mackerel\n327>Decrepit Viperfish\n328>Collapsed Viperfish\n329>Viperfish\n330>Shattered Wreckfish\n331>Bony Wreckfish\n332>Wreckfish\n333>Hook Flag\n334>Anchor Flag\n335>Fish Flag\n336>Pirate Flag\n337>Eyes Flag\n338>Serpent Flag\n339>Ouroboros Flag\n340>Rotor Reprogrammer\n341>Reverse Gear Router\n342>Chain Optimizer\n343>Reel Accelerator\n344>Heat Sink\n345>Trawl Guidance Chip\n346>Small Ice Block\n347>Large Ice Block\n348>Bolt of Cloth\n349>Ironhaven Crate\n350>Lumber\n351>Refined Metal\n352>Research Part\n353>Metal Scraps\n354>Bronze Belt Buckle\n355>Builder\n356>Photography Equipment\n357>Castaway\n358>Prototype Parts\n359>Chunk of Flesh\n360>Dog Tags\n361>Dog\n362>Family Crest\n363>Fathomless Flame\n364>Hermit\n365>Ice Axe\n366>Icebreaker Plow Half\n367>Icebreaker Bracing\n368>Icebreaker Plow Half\n369>Ice Shaper\n370>Frozen Heart\n371>Repulsion Machine\n372>Scrap of Paper\n373>Small Scrap of Paper\n374>Large Scrap of Paper\n375>Mortar Frame\n376>Mortar Barrel\n377>Small Package\n378>Large Package\n379>Pungent Bait\n380>Fetid Bait\n381>Reeking Bait\n382>Stone Tablet\n383>Stone Tablet\n384>Stone Tablet\n385>Fused Tablet\n386>Handkerchief\n387>Ornate Key\n388>Rusted Music Box\n389>Jewel Encrusted Band\n390>Shimmering Necklace\n391>Antique Pocket Watch\n392>Hull Repair Kit\n393>Soothing Tea\n394>Harvester's Repair Pack\n395>Rot\n396>Aurous Anchor\n397>Bag of Doubloons\n398>Big Bag of Doubloons\n399>Broken Monocle\n400>Broken Spectacles\n401>Doubloon\n402>Pearl Earrings\n403>Opal Earrings\n404>Sapphire Earrings\n405>Emerald Earrings\n406>Ruby Earrings\n407>Fancy Boot\n408>Goblet\n409>Old Iron Chain\n410>Worn Gold Ring\n411>Citrine Ring\n412>Opal Ring\n413>Sapphire Ring\n414>Emerald Ring\n415>Ruby Ring\n416>Signet Ring\n417>Sextant\n418>Silver Plate\n419>Silver Trinket\n0>渔夫的笔记\n1>1927 年 3 月 6 日，7 日\n2>破烂的收据\n3>1927 年 6 月 1 日\n4>1927 年 8 月 20 日\n5>1927 年 8 月 21 日\n6>1927 年 9 月 9 日\n7>1927 年 9 月 14 日\n8>？？？\n9>？？？\n10>文物清单\n11>船长的航海日志 - 1847 年 5 月 30 日\n12>船长的航海日志 - 1847 年 6 月 1 日\n13>船长的航海日志 - 1847 年 6 月 5 日\n14>破烂的日记 - 1847 年 6 月 2 日\n15>破烂的日记 - 1847 年 6 月 4 日\n16>破烂的日记 - 1847 年 6 月 5 日\n17>皮面日志 - 1847 年 6 月 4 日\n18>皮面日志 - 1847 年 6 月 7 日\n19>皮面日志 - 1847 年 6 月 8 日\n20>破旧的笔记\n21>星界符号之书\n22>讨价还价与实物交易指南\n23>口才的艺术\n24>可持续捕捞\n25>未来计划\n26>工程师之友\n27>航海工程\n28>鱼竿、卷线轮和钓鱼台\n29>高级捕捞\n30>引擎正确操作\n31>突破极限：引擎\n32>放松的心情\n33>从身心上克服它\n34>混合鱼饵\n35>畸变鱼饵\n36>速效蟹饵\n37>奇珍鱼饵\n38>漆黑罐子\n39>受损\n40>黑暗水花\n41>淤泥起重机\n42>特殊引擎\n43>动脉引擎\n44>生锈的舷外引擎\n45>改进的舷外引擎\n46>精制的舷外引擎\n47>双螺旋桨引擎\n48>喷气驱动引擎\n49>双喷气驱动引擎\n50>引擎堆栈\n51>弱阀引擎\n52>有裂痕的灯泡\n53>浑浊的透镜灯\n54>卤素聚光灯\n55>钨丝泛光灯\n56>白炽阵列灯\n57>天炎\n58>基础拖网\n59>升级拖网\n60>滤沙拖网\n61>恒温网\n62>大号拖网\n63>耐重拖网\n64>镭射拖网\n65>脆弱拖网\n66>虹吸过滤器\n67>材料捕网\n68>基础蟹笼\n69>高效蟹笼\n70>牢固蟹笼\n71>大蟹笼\n72>复杂蟹笼\n73>结实蟹笼\n74>加固蟹笼\n75>深渊巨口\n76>漂流物陷阱\n77>基础鱼竿\n78>深不可测的螺旋轮\n79>耐热线\n80>防绕线\n81>多功能鱼竿\n82>捕猎平台\n83>钢腱鱼竿\n84>裹壳护符\n85>简易蜻蜓\n86>筋线轴\n87>加重线\n88>废墟的印记\n89>定制鱼竿\n90>钩刺冰鱼竿\n91>冰川长矛\n92>液压鱼竿\n93>灵活的鱼竿\n94>取样装置\n95>无底鱼线\n96>肉色起重机\n97>注能绞盘\n98>注能鱼竿\n99>注能起重机\n100>注能防火竿\n101>注能线圈竿\n102>包好的炸药\n103>鳀鱼王\n104>鳀鱼\n105>残暴鮟鱇鱼\n106>鮟鱇鱼\n107>抱卵鱿\n108>恶霸乌贼\n109>箭鱿\n110>幻日水母\n111>海月水母\n112>野蛮梭子鱼\n113>六角梭子鱼\n114>梭子鱼\n115>虚空眼鱼\n116>管眼鱼\n117>长牙石斑鱼\n118>电流石斑鱼\n119>黑鲉\n120>搜查鲈鱼\n121>条纹锯鮨\n122>钢齿金枪鱼\n123>黑鳍金枪鱼\n124>腐烂的黑嘴\n125>黑嘴三文鱼\n126>裂嘴鲨\n127>黑鳍礁鲨\n128>蓝鲭\n129>血肤鲨\n130>短尾真鲨\n131>夜翼鲶鱼\n132>鲶鱼\n133>全视鳕鱼\n134>尖牙鳕鱼\n135>三头鳕鱼\n136>鳕鱼\n137>腔棘鱼\n138>发芽鳗\n139>康吉鳗\n140>绝望石斑鱼\n141>珊瑚石斑鱼\n142>触手缠缚蟹\n143>蓝蟹\n144>裸脑蟹\n145>普通螃蟹\n146>渊底之冠\n147>棘冠海星\n148>皮质修饰蟹\n149>装饰蟹\n150>恶毒巨螯蟹\n151>招潮蟹\n152>泥沼尖啸蟹\n153>巨泥蟹\n154>冥灯鲎\n155>马蹄蟹\n156>碎壳蟹\n157>石蟹\n158>幽影傀儡\n159>蜘蛛蟹\n160>蛮横龙虾\n161>大螯虾\n162>长臂黒虾\n163>东方扁虾\n164>攫握海螺\n165>火山蜗牛\n166>地狱鳗\n167>鼬鱼\n168>萎缩蝠鲼\n169>魔鬼鱼\n170>鼓泡鲑鱼\n171>鲑鱼\n172>冰霜触手怪\n173>大王鱿\n174>裂齿鲨\n175>哥布林鲨\n176>碎鳞冰鱼\n177>解冻的冰鱼\n178>星界冰鱼\n179>冰鱼\n180>帝王之冠\n181>帝王蟹\n182>蛮暴蜥蜴鱼\n183>蜥蜴鱼\n184>堕落之星\n185>海星\n186>睡鲨\n187>火口先知\n188>瞻星鱼\n189>球形犬牙鱼\n190>犬牙鱼\n191>铰链狼鱼\n192>狼鱼\n193>分叉雀鳝\n194>深渊雀鳝\n195>裂骨舌鱼\n196>巨骨舌鱼\n197>冰风骨鱼\n198>北甲鱼\n199>塑形者之巅\n200>？？？\n201>剥皮恶魔\n202>邓氏鱼\n203>猩红鹰鲨\n204>鹰鲨\n205>缥缈蛟鱼\n206>巨型龙鱼\n207>蛮勇之綮\n208>饥馑之末\n209>漂游虫蛹\n210>宣扬爪虫\n211>银辉帆蜥鱼\n212>帆蜥鱼\n213>异种鲯鳅鱼\n214>鲯鳅鱼\n215>断手鹦鹉螺\n216>鹦鹉螺\n217>卑啮菊石\n218>日本菊石\n219>承冠之重\n220>爬行龄虫\n221>欧巴宾海蝎\n222>重装骨甲鱼\n223>骨甲鱼\n224>砧头鲟\n225>匙吻鲟\n226>棘颚甲鳐\n227>锯鳐\n228>翻转空壳\n229>海参\n230>涌毒海蝎\n231>海蝎\n232>拟态蛞蝓\n233>海蛞蝓\n234>眠者之厄\n235>游荡海触角\n236>海触角\n237>长牙穿刺者\n238>剑鱼\n239>囊肿三叶虫\n240>三叶虫\n241>潜猎狗母鱼\n242>短头深海狗母鱼\n243>轴向主母鱼\n244>塔利怪物\n245>显真古虫\n246>古虫\n247>原始暗影\n248>剑射鱼\n249>被诅咒的尖牙鱼\n250>尖牙鱼\n251>发光鱿\n252>萤火鱿\n253>扭动鲨\n254>皱鳃鲨\n255>爪鳍雀鳝\n256>狞笑雀鳝\n257>雀鳝\n258>狂喜鲨\n259>魔鬼鲨\n260>断裂的宿主\n261>巨型端足目\n262>美杜莎章鱼\n263>发光章鱼\n264>巨型水虎鱼\n265>刺鳗\n266>宿主鳗\n267>灰海鳗\n268>缠绕乌鱼\n269>金光乌鱼\n270>乌鱼\n271>巨眼偏口鱼\n272>千疮百孔的偏口鱼\n273>白点牙鲆\n274>宽咽鱼\n275>凝视鲨\n276>锤头鲨\n277>双生鳗\n278>长鳍鳗\n279>濒亡柔骨鱼\n280>柔骨鱼\n281>怪诞鲭鱼\n282>肿块鲭鱼\n283>多眼鲭鱼\n284>骷髅月亮鱼\n285>尖喙月亮鱼\n286>月亮鱼\n287>桨鱼\n288>巨齿鲈鱼\n289>大洋鲈\n290>崩坏鳐鱼\n291>白鳐\n292>凝胶鼠尾鳕\n293>鼠尾鳕\n294>血红绸鱼\n295>紧锁鲷鱼\n296>红绸鱼\n297>土色旗鱼\n298>钩嘴旗鱼\n299>旗鱼\n300>寄生虾\n301>红魔虾\n302>骨化红娘鱼\n303>装甲红娘鱼\n304>旋涡的不速之客\n305>锯盖鱼\n306>石化狮子鱼\n307>撕咬狮子鱼\n308>狮子鱼\n309>阴险蛇鲭\n310>褴褛鲭鱼\n311>蛇鲭\n312>石鳐\n313>刺鳐\n314>胶状小口鮋\n315>寄居小口鲉\n316>小口鮋\n317>透明鲟鱼\n318>鲟鱼\n319>焦黑太阳鱼\n320>多眼太阳鱼\n321>翻车鲀\n322>起泡大海鲢\n323>大海鲢\n324>剥皮鲭\n325>长须鲭\n326>虎鲭\n327>老头毒蛇鱼\n328>崩坏毒蛇鱼\n329>毒蛇鱼\n330>破碎多锯鲷\n331>骨质多锯鲷\n332>多锯鲷\n333>铁钩旗帜\n334>船锚旗帜\n335>鱼儿旗帜\n336>海盗旗帜\n337>眼睛旗帜\n338>海蛇旗帜\n339>衔尾蛇旗帜\n340>转子再编码器\n341>倒挡增效器\n342>链条优化器\n343>快速拉线器\n344>散热器\n345>拖网导引芯片\n346>小冰块\n347>大冰块\n348>一卷布\n349>艾伦海文货箱\n350>木材\n351>精致的金属\n352>研究部件\n353>废旧金属\n354>铜色皮带扣\n355>建筑工人\n356>摄影设备\n357>遇难者\n358>原型零件\n359>大块肉\n360>身份识别牌\n361>狗\n362>家族徽章\n363>深渊烈焰\n364>隐居者\n365>冰斧\n366>破冰犁的半面犁刀\n367>破冰犁的支架\n368>破冰犁的半面犁刀\n369>锯冰机\n370>寒冰晶魄\n371>驱逐器\n372>一片纸\n373>小片纸\n374>大片纸\n375>迫击炮框架\n376>迫击炮炮管\n377>小包裹\n378>大包裹\n379>刺鼻的鱼饵\n380>腐臭的鱼饵\n381>臭气熏天的鱼饵\n382>石碑\n383>石碑\n384>石碑\n385>融合的石碑\n386>手帕\n387>华丽的钥匙\n388>生锈的音乐盒\n389>镶有宝石的戒指\n390>闪耀的项链\n391>古董怀表\n392>船体修补包\n393>安神茶\n394>捕获者的修补包\n395>腐烂物\n396>金锚\n397>一袋达布隆金币\n398>一大袋达布隆金币\n399>破损的单片眼镜\n400>破损的眼镜\n401>达布隆金币\n402>珍珠耳环\n403>猫眼石耳环\n404>蓝宝石耳环\n405>绿宝石耳环\n406>红宝石耳环\n407>华丽的靴子\n408>高脚杯\n409>旧铁链\n410>磨损的金戒指\n411>黄水晶戒指\n412>猫眼石戒指\n413>蓝宝石戒指\n414>绿宝石戒指\n415>红宝石戒指\n416>印章戒指\n417>六分仪\n418>银盘\n419>银饰"
  },
  {
    "path": "Game Trainers/trainers/DREDGE Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"DREDGE Trainer\": \"DREDGE Trainer\",\n        \"God Mode\": \"God Mode\",\n        \"Set Sanity\": \"Set Sanity\",\n        \"Set Movement Speed\": \"Set Movement Speed\",\n        \"Spawn Item\": \"Spawn Item\",\n        \"Add Funds\": \"Add Funds\",\n        \"Repair All\": \"Repair All\",\n        \"Restock All\": \"Restock All Fishing Spots\",\n        \"Clear Weather\": \"Clear Weather\",\n        \"Freeze Time\": \"Freeze Time\",\n        \"Item List\": \"Item List\",\n        \"Item ID\": \"Item ID\",\n        \"Item Name\": \"Item Name\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"DREDGE Trainer\": \"渔帆暗涌修改器\",\n        \"God Mode\": \"无敌模式\",\n        \"Set Sanity\": \"设置理智值\",\n        \"Set Movement Speed\": \"设置移动速度\",\n        \"Spawn Item\": \"生成物品\",\n        \"Add Funds\": \"增加资金\",\n        \"Repair All\": \"全部修复\",\n        \"Restock All\": \"补充所有钓鱼点\",\n        \"Clear Weather\": \"晴朗天气\",\n        \"Freeze Time\": \"锁定时间\",\n        \"Item List\": \"物品列表\",\n        \"Item ID\": \"物品 ID\",\n        \"Item Name\": \"物品名称\"\n    }\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Feeding Frenzy 2_Shipwreck Showdown Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Feeding_Frenzy_2_Shipwreck_Showdown\")\nset(TRAINER_NAME \"Feeding Frenzy 2_Shipwreck Showdown Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Feeding Frenzy 2_Shipwreck Showdown Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"SetGrowth\")\n    {\n        status = trainer->setGrowth(std::stoi(inputValue));\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"SetLives\")\n    {\n        if (button->value())\n        {\n            status = trainer->setLives(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Feeding Frenzy 2: Shipwreck Showdown Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // Set Lives (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *lives_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    lives_flex->gap(option_gap);\n\n    Fl_Box *lives_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    lives_flex->fixed(lives_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *lives_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    lives_flex->fixed(lives_check_button, toggle_w);\n\n    Fl_Box *lives_label = new Fl_Box(0, 0, 0, 0);\n    tr(lives_label, \"Set Lives\");\n\n    Fl_Input *lives_input = new Fl_Input(0, 0, 0, 0);\n    lives_flex->fixed(lives_input, input_w);\n    lives_input->type(FL_INT_INPUT);\n    set_input_values(lives_input, \"99\", \"0\", \"999999999\");\n\n    ToggleData *data_lives = new ToggleData{&trainer, \"SetLives\", lives_check_button, lives_input};\n    lives_check_button->callback(toggle_callback, data_lives);\n\n    lives_flex->end();\n    options1_flex->fixed(lives_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // set_growth (Apply)\n    // ------------------------------------------------------------------\n    Fl_Flex *set_growth_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    set_growth_flex->gap(option_gap);\n\n    Fl_Button *set_growth_apply_button = new Fl_Button(0, 0, 0, 0);\n    set_growth_flex->fixed(set_growth_apply_button, button_w);\n    tr(set_growth_apply_button, \"Apply\");\n\n    Fl_Box *set_growth_label = new Fl_Box(0, 0, 0, 0);\n    tr(set_growth_label, \"Set Growth\");\n\n    Fl_Input *set_growth_input = new Fl_Input(0, 0, 0, 0);\n    set_growth_flex->fixed(set_growth_input, input_w);\n    set_growth_input->type(FL_INT_INPUT);\n    set_input_values(set_growth_input, \"600\", \"0\", \"9999\");\n\n    ApplyData *data_set_growth = new ApplyData{&trainer, \"SetGrowth\", set_growth_apply_button, set_growth_input};\n    set_growth_apply_button->callback(apply_callback, data_set_growth);\n\n    set_growth_flex->end();\n    options1_flex->fixed(set_growth_flex, option_h);\n\n    // ------------------------------------------------------------------\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Feeding Frenzy 2_Shipwreck Showdown Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Feeding Frenzy 2_Shipwreck Showdown Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"popcapgame1.exe\") {} // x86\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"popcapgame1.exe\";\n\n    inline bool setLives(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x001AC624, 0x3C, 0x10};\n        return createPointerToggle(moduleName, \"SetLives\", offsets, newVal);\n    }\n\n    inline bool setGrowth(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x001AC624, 0x3C, 0x40};\n        return WriteToDynamicAddress(moduleName, offsets, newVal);\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Feeding Frenzy 2_Shipwreck Showdown Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Feeding Frenzy 2: Shipwreck Showdown Trainer\": \"Feeding Frenzy 2: Shipwreck Showdown Trainer\",\n        \"Set Lives\": \"Set Lives\",\n        \"Set Growth\": \"Set Growth\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Feeding Frenzy 2: Shipwreck Showdown Trainer\": \"吞食鱼2：海滩危机修改器\",\n        \"Set Lives\": \"设置生命值\",\n        \"Set Growth\": \"设置成长值\"\n    }\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Headbangers_Rhythm Royale Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Headbangers_Rhythm_Royale\")\nset(TRAINER_NAME \"Headbangers_Rhythm Royale Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Headbangers_Rhythm Royale Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"SetBread\")\n    {\n        if (button->value())\n        {\n            status = trainer->setBread(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetXP\")\n    {\n        if (button->value())\n        {\n            status = trainer->setXP(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"SetWins\")\n    {\n        if (button->value())\n        {\n            status = trainer->setWins(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Headbangers: Rhythm Royale Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // Option 1: Set bread (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *bread_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    bread_flex->gap(option_gap);\n\n    Fl_Box *bread_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    bread_flex->fixed(bread_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *bread_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    bread_flex->fixed(bread_check_button, toggle_w);\n\n    Fl_Box *bread_label = new Fl_Box(0, 0, 0, 0);\n    tr(bread_label, \"Set Bread\");\n\n    Fl_Input *bread_input = new Fl_Input(0, 0, 0, 0);\n    bread_flex->fixed(bread_input, input_w);\n    bread_input->type(FL_INT_INPUT);\n    set_input_values(bread_input, \"999999\", \"0\", \"999999999\");\n\n    ToggleData *td_bread = new ToggleData{&trainer, \"SetBread\", bread_check_button, bread_input};\n    bread_check_button->callback(toggle_callback, td_bread);\n\n    bread_flex->end();\n    options1_flex->fixed(bread_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 2: Set exp (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *exp_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    exp_flex->gap(option_gap);\n\n    Fl_Box *exp_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    exp_flex->fixed(exp_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *exp_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    exp_flex->fixed(exp_check_button, toggle_w);\n\n    Fl_Box *exp_label = new Fl_Box(0, 0, 0, 0);\n    tr(exp_label, \"Set Season Pass XP\");\n\n    Fl_Input *exp_input = new Fl_Input(0, 0, 0, 0);\n    exp_flex->fixed(exp_input, input_w);\n    exp_input->type(FL_INT_INPUT);\n    set_input_values(exp_input, \"26000\", \"0\", \"26000\");\n\n    ToggleData *td_exp = new ToggleData{&trainer, \"SetXP\", exp_check_button, exp_input};\n    exp_check_button->callback(toggle_callback, td_exp);\n\n    exp_flex->end();\n    options1_flex->fixed(exp_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 3: Set wins (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *wins_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    wins_flex->gap(option_gap);\n\n    Fl_Box *wins_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    wins_flex->fixed(wins_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *wins_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    wins_flex->fixed(wins_check_button, toggle_w);\n\n    Fl_Box *wins_label = new Fl_Box(0, 0, 0, 0);\n    tr(wins_label, \"Set Number of Wins\");\n\n    Fl_Input *wins_input = new Fl_Input(0, 0, 0, 0);\n    wins_flex->fixed(wins_input, input_w);\n    wins_input->type(FL_INT_INPUT);\n    set_input_values(wins_input, \"100\", \"0\", \"999999999\");\n\n    ToggleData *td_wins = new ToggleData{&trainer, \"SetWins\", wins_check_button, wins_input};\n    wins_check_button->callback(toggle_callback, td_wins);\n\n    wins_flex->end();\n    options1_flex->fixed(wins_flex, option_h);\n\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Headbangers_Rhythm Royale Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Headbangers_Rhythm Royale Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"Headbangers.exe\") {} // x64\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"GameAssembly.dll\";\n\n    inline bool setBread(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x036E2A88, 0xA0, 0xE60, 0x48, 0x18, 0x10, 0x30, 0x20};\n        return createPointerToggle(moduleName, \"SetBread\", offsets, newVal);\n    }\n\n    inline bool setWins(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x036E2A88, 0xA0, 0xE18, 0x188, 0x48, 0xD8, 0x678, 0x78};\n        return createPointerToggle(moduleName, \"SetWins\", offsets, newVal);\n    }\n\n    inline bool setXP(int newVal)\n    {\n        // Target instruction bytes: 89 5E 20 48 8B 47 20\n        std::vector<std::string> bigPat = {\"7A\", \"00\", \"84\", \"C0\", \"75\", \"69\", \"89\", \"5E\", \"20\", \"48\", \"8B\", \"47\", \"20\"};\n\n        size_t patternOffset = 6;\n        size_t overwriteLen = 7;\n        size_t codeSize = 0x600;\n\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90);\n\n            int *pInt = reinterpret_cast<int *>(&code[0x400]);\n            *pInt = newVal;\n\n            size_t wPos = 0;\n            // mov ebx,[RIP+disp32] => 8B 1D <disp32>\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x1D;\n            {\n                uintptr_t intAddr = codeCaveAddr + 0x400;\n                uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n                int64_t diff = static_cast<int64_t>(intAddr) - static_cast<int64_t>(nextInstr);\n                int32_t disp32 = static_cast<int32_t>(diff);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // mov [rsi+20],ebx => 89 5E 20\n            code[wPos++] = 0x89;\n            code[wPos++] = 0x5E;\n            code[wPos++] = 0x20;\n\n            // mov rax,[rdi+20] => 48 8B 47 20\n            code[wPos++] = 0x48;\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x47;\n            code[wPos++] = 0x20;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(\n            moduleName,\n            \"SetXP\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc\n        );\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Headbangers_Rhythm Royale Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Headbangers: Rhythm Royale Trainer\": \"Headbangers: Rhythm Royale Trainer\",\n        \"Set Bread\": \"Set Bread\",\n        \"Set Season Pass XP\": \"Set Season Pass XP\",\n        \"Set Number of Wins\": \"Set Number of Wins\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Headbangers: Rhythm Royale Trainer\": \"节奏天鸽修改器\",\n        \"Set Bread\": \"设置面包\",\n        \"Set Season Pass XP\": \"设置赛季通行证经验\",\n        \"Set Number of Wins\": \"设置胜场数\"\n    }\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Heavy Weapon Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Heavy_Weapon\")\nset(TRAINER_NAME \"Heavy Weapon Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Heavy Weapon Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    if (input)\n    {\n        button->value() ? input->readonly(1) : input->readonly(0);\n    }\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"Life\")\n    {\n        if (button->value())\n        {\n            status = trainer->setLife(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"Shield\")\n    {\n        if (button->value())\n        {\n            status = trainer->setShield(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"Nuke\")\n    {\n        if (button->value())\n        {\n            status = trainer->setNuke(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"DefenseOrbs\")\n    {\n        if (button->value())\n        {\n            status = trainer->setDefenseOrbs(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"HomingMissile\")\n    {\n        if (button->value())\n        {\n            status = trainer->setHomingMissile(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"Laser\")\n    {\n        if (button->value())\n        {\n            status = trainer->setLaser(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"Rockets\")\n    {\n        if (button->value())\n        {\n            status = trainer->setRockets(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"FlakCannon\")\n    {\n        if (button->value())\n        {\n            status = trainer->setFlakCannon(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"ThunderStrike\")\n    {\n        if (button->value())\n        {\n            status = trainer->setThunderStrike(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Heavy Weapon Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // Option 1: Set life (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *life_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    life_flex->gap(option_gap);\n\n    Fl_Box *life_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    life_flex->fixed(life_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *life_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    life_flex->fixed(life_check_button, toggle_w);\n\n    Fl_Box *life_label = new Fl_Box(0, 0, 0, 0);\n    tr(life_label, \"Set Life Count\");\n\n    Fl_Input *life_input = new Fl_Input(0, 0, 0, 0);\n    life_flex->fixed(life_input, input_w);\n    life_input->type(FL_INT_INPUT);\n    set_input_values(life_input, \"2\", \"0\", \"2\");\n\n    ToggleData *td_life = new ToggleData{&trainer, \"Life\", life_check_button, life_input};\n    life_check_button->callback(toggle_callback, td_life);\n\n    life_flex->end();\n    options1_flex->fixed(life_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 2: Set shield (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *shield_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    shield_flex->gap(option_gap);\n\n    Fl_Box *shield_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    shield_flex->fixed(shield_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *shield_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    shield_flex->fixed(shield_check_button, toggle_w);\n\n    Fl_Box *shield_label = new Fl_Box(0, 0, 0, 0);\n    tr(shield_label, \"Set Shield Level\");\n\n    Fl_Input *shield_input = new Fl_Input(0, 0, 0, 0);\n    shield_flex->fixed(shield_input, input_w);\n    shield_input->type(FL_INT_INPUT);\n    set_input_values(shield_input, \"4\", \"0\", \"4\");\n\n    ToggleData *td_shield = new ToggleData{&trainer, \"Shield\", shield_check_button, shield_input};\n    shield_check_button->callback(toggle_callback, td_shield);\n\n    shield_flex->end();\n    options1_flex->fixed(shield_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 3: Set nuke (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *nuke_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    nuke_flex->gap(option_gap);\n\n    Fl_Box *nuke_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    nuke_flex->fixed(nuke_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *nuke_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    nuke_flex->fixed(nuke_check_button, toggle_w);\n\n    Fl_Box *nuke_label = new Fl_Box(0, 0, 0, 0);\n    tr(nuke_label, \"Set Nuke Amount\");\n\n    Fl_Input *nuke_input = new Fl_Input(0, 0, 0, 0);\n    nuke_flex->fixed(nuke_input, input_w);\n    nuke_input->type(FL_INT_INPUT);\n    set_input_values(nuke_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_nuke = new ToggleData{&trainer, \"Nuke\", nuke_check_button, nuke_input};\n    nuke_check_button->callback(toggle_callback, td_nuke);\n\n    nuke_flex->end();\n    options1_flex->fixed(nuke_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 4: Set defense_orbs (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *defense_orbs_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    defense_orbs_flex->gap(option_gap);\n\n    Fl_Box *defense_orbs_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    defense_orbs_flex->fixed(defense_orbs_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *defense_orbs_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    defense_orbs_flex->fixed(defense_orbs_check_button, toggle_w);\n\n    Fl_Box *defense_orbs_label = new Fl_Box(0, 0, 0, 0);\n    tr(defense_orbs_label, \"Set Defense Orbs Level\");\n\n    Fl_Input *defense_orbs_input = new Fl_Input(0, 0, 0, 0);\n    defense_orbs_flex->fixed(defense_orbs_input, input_w);\n    defense_orbs_input->type(FL_INT_INPUT);\n    set_input_values(defense_orbs_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_defense_orbs = new ToggleData{&trainer, \"DefenseOrbs\", defense_orbs_check_button, defense_orbs_input};\n    defense_orbs_check_button->callback(toggle_callback, td_defense_orbs);\n\n    defense_orbs_flex->end();\n    options1_flex->fixed(defense_orbs_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 5: Set homing_missile (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *homing_missile_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    homing_missile_flex->gap(option_gap);\n\n    Fl_Box *homing_missile_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    homing_missile_flex->fixed(homing_missile_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *homing_missile_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    homing_missile_flex->fixed(homing_missile_check_button, toggle_w);\n\n    Fl_Box *homing_missile_label = new Fl_Box(0, 0, 0, 0);\n    tr(homing_missile_label, \"Set Homing Missile Level\");\n\n    Fl_Input *homing_missile_input = new Fl_Input(0, 0, 0, 0);\n    homing_missile_flex->fixed(homing_missile_input, input_w);\n    homing_missile_input->type(FL_INT_INPUT);\n    set_input_values(homing_missile_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_homing_missile = new ToggleData{&trainer, \"HomingMissile\", homing_missile_check_button, homing_missile_input};\n    homing_missile_check_button->callback(toggle_callback, td_homing_missile);\n\n    homing_missile_flex->end();\n    options1_flex->fixed(homing_missile_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 6: Set laser (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *laser_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    laser_flex->gap(option_gap);\n\n    Fl_Box *laser_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    laser_flex->fixed(laser_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *laser_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    laser_flex->fixed(laser_check_button, toggle_w);\n\n    Fl_Box *laser_label = new Fl_Box(0, 0, 0, 0);\n    tr(laser_label, \"Set Laser Level\");\n\n    Fl_Input *laser_input = new Fl_Input(0, 0, 0, 0);\n    laser_flex->fixed(laser_input, input_w);\n    laser_input->type(FL_INT_INPUT);\n    set_input_values(laser_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_laser = new ToggleData{&trainer, \"Laser\", laser_check_button, laser_input};\n    laser_check_button->callback(toggle_callback, td_laser);\n\n    laser_flex->end();\n    options1_flex->fixed(laser_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 7: Set rockets (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *rockets_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    rockets_flex->gap(option_gap);\n\n    Fl_Box *rockets_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    rockets_flex->fixed(rockets_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *rockets_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    rockets_flex->fixed(rockets_check_button, toggle_w);\n\n    Fl_Box *rockets_label = new Fl_Box(0, 0, 0, 0);\n    tr(rockets_label, \"Set Rockets Level\");\n\n    Fl_Input *rockets_input = new Fl_Input(0, 0, 0, 0);\n    rockets_flex->fixed(rockets_input, input_w);\n    rockets_input->type(FL_INT_INPUT);\n    set_input_values(rockets_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_rockets = new ToggleData{&trainer, \"Rockets\", rockets_check_button, rockets_input};\n    rockets_check_button->callback(toggle_callback, td_rockets);\n\n    rockets_flex->end();\n    options1_flex->fixed(rockets_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 8: Set flak_cannon (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *flak_cannon_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    flak_cannon_flex->gap(option_gap);\n\n    Fl_Box *flak_cannon_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    flak_cannon_flex->fixed(flak_cannon_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *flak_cannon_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    flak_cannon_flex->fixed(flak_cannon_check_button, toggle_w);\n\n    Fl_Box *flak_cannon_label = new Fl_Box(0, 0, 0, 0);\n    tr(flak_cannon_label, \"Set Flak Cannon Level\");\n\n    Fl_Input *flak_cannon_input = new Fl_Input(0, 0, 0, 0);\n    flak_cannon_flex->fixed(flak_cannon_input, input_w);\n    flak_cannon_input->type(FL_INT_INPUT);\n    set_input_values(flak_cannon_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_flak_cannon = new ToggleData{&trainer, \"FlakCannon\", flak_cannon_check_button, flak_cannon_input};\n    flak_cannon_check_button->callback(toggle_callback, td_flak_cannon);\n\n    flak_cannon_flex->end();\n    options1_flex->fixed(flak_cannon_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 9: Set thunder_strike (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *thunder_strike_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    thunder_strike_flex->gap(option_gap);\n\n    Fl_Box *thunder_strike_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    thunder_strike_flex->fixed(thunder_strike_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *thunder_strike_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    thunder_strike_flex->fixed(thunder_strike_check_button, toggle_w);\n\n    Fl_Box *thunder_strike_label = new Fl_Box(0, 0, 0, 0);\n    tr(thunder_strike_label, \"Set Thunder Strike Level\");\n\n    Fl_Input *thunder_strike_input = new Fl_Input(0, 0, 0, 0);\n    thunder_strike_flex->fixed(thunder_strike_input, input_w);\n    thunder_strike_input->type(FL_INT_INPUT);\n    set_input_values(thunder_strike_input, \"3\", \"0\", \"3\");\n\n    ToggleData *td_thunder_strike = new ToggleData{&trainer, \"ThunderStrike\", thunder_strike_check_button, thunder_strike_input};\n    thunder_strike_check_button->callback(toggle_callback, td_thunder_strike);\n\n    thunder_strike_flex->end();\n    options1_flex->fixed(thunder_strike_flex, option_h);\n\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Heavy Weapon Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Heavy Weapon Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"Heavy Weapon Deluxe 1.0\", true) {} // x86\n    ~Trainer() override = default;\n\n    static inline const wchar_t *moduleName = L\"$re$^pop[A-Za-z0-9]+\\\\.tmp$\";\n\n    inline bool setLife(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB04};\n        return createPointerToggle(moduleName, \"Life\", offsets, newVal);\n    }\n\n    inline bool setShield(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB0C};\n        return createPointerToggle(moduleName, \"Shield\", offsets, newVal);\n    }\n\n    inline bool setNuke(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB08};\n        return createPointerToggle(moduleName, \"Nuke\", offsets, newVal);\n    }\n\n    inline bool setDefenseOrbs(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB20};\n        return createPointerToggle(moduleName, \"DefenseOrbs\", offsets, newVal);\n    }\n\n    inline bool setHomingMissile(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB24};\n        return createPointerToggle(moduleName, \"HomingMissile\", offsets, newVal);\n    }\n\n    inline bool setLaser(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB28};\n        return createPointerToggle(moduleName, \"Laser\", offsets, newVal);\n    }\n\n    inline bool setRockets(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB2C};\n        return createPointerToggle(moduleName, \"Rockets\", offsets, newVal);\n    }\n\n    inline bool setFlakCannon(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB30};\n        return createPointerToggle(moduleName, \"FlakCannon\", offsets, newVal);\n    }\n\n    inline bool setThunderStrike(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x16BB34};\n        return createPointerToggle(moduleName, \"ThunderStrike\", offsets, newVal);\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Heavy Weapon Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Trainer Name\": \"Heavy Weapon Trainer\",\n        \"Set Life Count\": \"Set Life Count\",\n        \"Set Shield Level\": \"Set Shield Level\",\n        \"Set Nuke Amount\": \"Set Nuke Amount\",\n        \"Set Defense Orbs Level\": \"Set Defense Orbs Level\",\n        \"Set Homing Missile Level\": \"Set Homing Missile Level\",\n        \"Set Laser Level\": \"Set Laser Level\",\n        \"Set Rockets Level\": \"Set Rockets Level\",\n        \"Set Flak Cannon Level\": \"Set Flak Cannon Level\",\n        \"Set Thunder Strike Level\": \"Set Thunder Strike Level\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Trainer Name\": \"重装兵器修改器\",\n        \"Set Life Count\": \"设置生命数量\",\n        \"Set Shield Level\": \"设置护盾等级\",\n        \"Set Nuke Amount\": \"设置核弹数量\",\n        \"Set Defense Orbs Level\": \"设置防御球等级\",\n        \"Set Homing Missile Level\": \"设置追踪导弹等级\",\n        \"Set Laser Level\": \"设置激光等级\",\n        \"Set Rockets Level\": \"设置火箭等级\",\n        \"Set Flak Cannon Level\": \"设置高射炮等级\",\n        \"Set Thunder Strike Level\": \"设置雷霆打击等级\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/Inotia 4 Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Inotia_4\")\nset(TRAINER_NAME \"Inotia 4 Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Inotia 4 Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// --- MUTUAL EXCLUSION CONFIGURATION ---\nconst std::vector<std::string> g_exclusiveOptions = {\n    \"SetExp\",\n    \"SetStatPoints\",\n    \"SetSkillPoints\"};\n// Global Registry: OptionName -> ToggleData*\nstd::map<std::string, ToggleData *> g_toggleRegistry;\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    if (optionName == \"SetCoins\")\n    {\n        status = trainer->setCoins(std::stoi(inputValue));\n    }\n    else if (optionName == \"SetSlot1Item\")\n    {\n        if (trainer->getSlot1Item() != 0)\n        {\n            unsigned int itemAddr = trainer->getCurMouseItem();\n            if (itemAddr != 0)\n                status = trainer->setSlot1Item(itemAddr);\n        }\n        else\n            fl_alert(t(\"Must have slot 1 item\"));\n    }\n    else if (optionName == \"UnlockMercenary\")\n    {\n        status = trainer->unlockAllMercenarySlots();\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // --- MUTUAL EXCLUSION CHECK ---\n    // If turning ON, disable conflicting options\n    if (button->value())\n    {\n        auto it = std::find(g_exclusiveOptions.begin(), g_exclusiveOptions.end(), optionName);\n        if (it != g_exclusiveOptions.end())\n        {\n            for (const std::string &otherName : g_exclusiveOptions)\n            {\n                if (otherName == optionName)\n                    continue; // Skip self\n                if (g_toggleRegistry.find(otherName) != g_toggleRegistry.end())\n                {\n                    ToggleData *otherData = g_toggleRegistry[otherName];\n                    if (otherData->button->value())\n                    {\n                        otherData->button->value(0);          // Visual OFF\n                        trainer->disableNamedHook(otherName); // Logical OFF\n                        if (otherData->input)\n                            otherData->input->readonly(0);\n                    }\n                }\n            }\n        }\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    if (optionName == \"FreezeHealth\")\n    {\n        if (button->value())\n            status = trainer->freezeHealth();\n        else\n            status = trainer->disableNamedPointerToggle(optionName);\n    }\n    else if (optionName == \"FreezeMana\")\n    {\n        if (button->value())\n            status = trainer->freezeMana();\n        else\n            status = trainer->disableNamedPointerToggle(optionName);\n    }\n    else if (optionName == \"SetExp\")\n    {\n        if (button->value())\n            // real value encrypted with \"inputValue ^ 0xa7b3c9d5\"\n            status = trainer->setExp(std::stoi(inputValue));\n        else\n            status = trainer->disableNamedHook(optionName);\n    }\n    else if (optionName == \"SetStatPoints\")\n    {\n        if (button->value())\n            status = trainer->setStatPoints(std::stoi(inputValue));\n        else\n            status = trainer->disableNamedHook(optionName);\n    }\n    else if (optionName == \"SetSkillPoints\")\n    {\n        if (button->value())\n            status = trainer->setSkillPoints(std::stoi(inputValue));\n        else\n            status = trainer->disableNamedHook(optionName);\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Inotia 4 Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    DWORD info_img_size = 0;\n    const unsigned char *info_img_data = load_resource(\"INFO_IMG\", info_img_size);\n    Fl_PNG_Image *info_img = new Fl_PNG_Image(nullptr, info_img_data, (int)info_img_size);\n    info_img->scale(20, 20, 1, 0);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + UI_LEFT_MARGIN;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + UI_LEFT_MARGIN);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // Widget Placements\n    place_toggle_widget(options1_flex, &trainer, \"FreezeHealth\", \"Freeze Health\");\n\n    place_toggle_widget(options1_flex, &trainer, \"FreezeMana\", \"Freeze Mana\");\n\n    place_apply_widget(options1_flex, &trainer, \"SetCoins\", \"Set Coins\", nullptr, \"9999999\", \"1\", \"999999999\");\n\n    Fl_Check_Button *btnExp = place_toggle_widget(options1_flex, &trainer, \"SetExp\", \"Set Exp\", nullptr, \"500000\", \"1\", \"999999999\");\n    g_toggleRegistry[\"SetExp\"] = static_cast<ToggleData *>(btnExp->user_data());\n\n    Fl_Check_Button *btnStat = place_toggle_widget(options1_flex, &trainer, \"SetStatPoints\", \"Set Stat Points\", nullptr, \"99\", \"0\", \"999999999\");\n    g_toggleRegistry[\"SetStatPoints\"] = static_cast<ToggleData *>(btnStat->user_data());\n\n    Fl_Check_Button *btnSkill = place_toggle_widget(options1_flex, &trainer, \"SetSkillPoints\", \"Set Skill Points\", nullptr, \"99\", \"0\", \"999999999\");\n    g_toggleRegistry[\"SetSkillPoints\"] = static_cast<ToggleData *>(btnSkill->user_data());\n\n    Fl_Box *info_hover = create_info_hover(\"Save and Reload\", info_img);\n    place_apply_widget(options1_flex, &trainer, \"SetSlot1Item\", \"Set Backpack Slot 1\", nullptr, nullptr, nullptr, nullptr, NULL, info_hover);\n\n    place_apply_widget(options1_flex, &trainer, \"UnlockMercenary\", \"Unlock All Mercenary Slots\");\n\n    // End of Option Column 1\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Inotia 4 Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nINFO_IMG RCDATA \"../../common/assets/info.png\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Inotia 4 Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"Inotia4.exe\") {} // x64\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"Inotia4_port-Native.dll\";\n\n    inline bool freezeHealth()\n    {\n        std::vector<unsigned int> offsets = {0x003E4D38, 0x1F0};\n        return createPointerToggle(moduleName, \"FreezeHealth\", offsets, nullptr, (int *)nullptr);\n    }\n\n    inline bool freezeMana()\n    {\n        std::vector<unsigned int> offsets = {0x003E4D38, 0x1F4};\n        return createPointerToggle(moduleName, \"FreezeMana\", offsets, nullptr, (int *)nullptr);\n    }\n\n    inline bool setExp(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x003E4D38, 0x318};\n        uintptr_t targetAddress = resolveModuleDynamicAddress(moduleName, offsets);\n\n        // The pattern for: imul eax,edx,9E3779B9\n        const std::vector<std::string> pat = {\"69\", \"C2\", \"B9\", \"79\", \"37\", \"9E\"};\n        size_t patternOffset = 0;\n        size_t overwriteLen = 6;\n        size_t codeSize = 0x100;\n\n        auto buildFunc = [targetAddress, newVal](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code;\n            code.reserve(0x100);\n\n            // --- HACK LOGIC ---\n\n            // 1. Load the Target Address into RAX (using 64-bit immediate move)\n            //    Opcode: 48 B8 + 8 bytes of address\n            code.push_back(0x48);\n            code.push_back(0xB8);\n            const BYTE *pAddr = reinterpret_cast<const BYTE *>(&targetAddress);\n            code.insert(code.end(), pAddr, pAddr + 8);\n\n            // 2. Compare RCX (Current Address) with RAX (Target Address)\n            //    Opcode: 48 39 C1 (CMP RCX, RAX)\n            code.push_back(0x48);\n            code.push_back(0x39);\n            code.push_back(0xC1);\n\n            // 3. JNE (Jump if Not Equal) to Original Code\n            //    Opcode: 75 <offset>\n            //    We skip the next instruction (MOV EDX, hackValue).\n            //    MOV EDX, imm32 is 5 bytes (B8 + 4 bytes).\n            code.push_back(0x75);\n            code.push_back(0x05); // Jump 5 bytes forward\n\n            // 4. Move Hack Value into EDX\n            //    Opcode: BA + 4 bytes of value (MOV EDX, imm32)\n            code.push_back(0xBA); // 0xBA is MOV EDX, imm32\n            const BYTE *pVal = reinterpret_cast<const BYTE *>(&newVal);\n            code.insert(code.end(), pVal, pVal + 4);\n\n            // --- ORIGINAL CODE RESTORATION ---\n\n            // 5. Execute the overwritten original instruction\n            //    imul eax,edx,9E3779B9\n            code.insert(code.end(), originalBytes.begin(), originalBytes.end());\n\n            // 6. Jump back to the game (JMP rel32)\n            code.push_back(0xE9);\n            uintptr_t returnAddr = hookAddr + 6;                   // overwriteLen\n            uintptr_t currentPos = codeCaveAddr + code.size() + 4; // +4 for the displacement bytes\n            int32_t relJump = static_cast<int32_t>(returnAddr - currentPos);\n            const BYTE *pJump = reinterpret_cast<const BYTE *>(&relJump);\n            code.insert(code.end(), pJump, pJump + 4);\n\n            return code;\n        };\n\n        return createNamedHook(moduleName, \"SetExp\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    inline bool setCoins(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x411618};\n        return WriteToDynamicAddress(moduleName, offsets, newVal);\n    }\n\n    inline bool setStatPoints(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x003E4D38, 0x340};\n        uintptr_t targetAddress = resolveModuleDynamicAddress(moduleName, offsets);\n\n        // The pattern for: imul eax,edx,9E3779B9\n        const std::vector<std::string> pat = {\"69\", \"C2\", \"B9\", \"79\", \"37\", \"9E\"};\n        size_t patternOffset = 0;\n        size_t overwriteLen = 6;\n        size_t codeSize = 0x100;\n\n        auto buildFunc = [targetAddress, newVal](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code;\n            code.reserve(0x100);\n\n            code.push_back(0x48);\n            code.push_back(0xB8);\n            const BYTE *pAddr = reinterpret_cast<const BYTE *>(&targetAddress);\n            code.insert(code.end(), pAddr, pAddr + 8);\n\n            code.push_back(0x48);\n            code.push_back(0x39);\n            code.push_back(0xC1);\n\n            code.push_back(0x75);\n            code.push_back(0x05);\n\n            code.push_back(0xBA);\n            const BYTE *pVal = reinterpret_cast<const BYTE *>(&newVal);\n            code.insert(code.end(), pVal, pVal + 4);\n\n            code.insert(code.end(), originalBytes.begin(), originalBytes.end());\n\n            code.push_back(0xE9);\n            uintptr_t returnAddr = hookAddr + 6;\n            uintptr_t currentPos = codeCaveAddr + code.size() + 4;\n            int32_t relJump = static_cast<int32_t>(returnAddr - currentPos);\n            const BYTE *pJump = reinterpret_cast<const BYTE *>(&relJump);\n            code.insert(code.end(), pJump, pJump + 4);\n\n            return code;\n        };\n\n        return createNamedHook(moduleName, \"SetStatPoints\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    inline bool setSkillPoints(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x003E4D38, 0x330};\n        uintptr_t targetAddress = resolveModuleDynamicAddress(moduleName, offsets);\n\n        // The pattern for: imul eax,edx,9E3779B9\n        const std::vector<std::string> pat = {\"69\", \"C2\", \"B9\", \"79\", \"37\", \"9E\"};\n        size_t patternOffset = 0;\n        size_t overwriteLen = 6;\n        size_t codeSize = 0x100;\n\n        auto buildFunc = [targetAddress, newVal](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code;\n            code.reserve(0x100);\n\n            code.push_back(0x48);\n            code.push_back(0xB8);\n            const BYTE *pAddr = reinterpret_cast<const BYTE *>(&targetAddress);\n            code.insert(code.end(), pAddr, pAddr + 8);\n\n            code.push_back(0x48);\n            code.push_back(0x39);\n            code.push_back(0xC1);\n\n            code.push_back(0x75);\n            code.push_back(0x05);\n\n            code.push_back(0xBA);\n            const BYTE *pVal = reinterpret_cast<const BYTE *>(&newVal);\n            code.insert(code.end(), pVal, pVal + 4);\n\n            code.insert(code.end(), originalBytes.begin(), originalBytes.end());\n\n            code.push_back(0xE9);\n            uintptr_t returnAddr = hookAddr + 6;\n            uintptr_t currentPos = codeCaveAddr + code.size() + 4;\n            int32_t relJump = static_cast<int32_t>(returnAddr - currentPos);\n            const BYTE *pJump = reinterpret_cast<const BYTE *>(&relJump);\n            code.insert(code.end(), pJump, pJump + 4);\n\n            return code;\n        };\n\n        return createNamedHook(moduleName, \"SetSkillPoints\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    inline unsigned int getCurMouseItem()\n    {\n        std::vector<unsigned int> offsets = {0x38A470};\n        return ReadFromDynamicAddress<unsigned int>(moduleName, offsets);\n    }\n\n    inline unsigned int getSlot1Item()\n    {\n        std::vector<unsigned int> offsets = {0x411620};\n        return ReadFromDynamicAddress<unsigned int>(moduleName, offsets);\n    }\n\n    inline bool setSlot1Item(int itemAddress)\n    {\n        std::vector<unsigned int> offsets = {0x411620};\n        return WriteToDynamicAddress(moduleName, offsets, itemAddress);\n    }\n\n    inline bool unlockAllMercenarySlots()\n    {\n        std::vector<unsigned int> offsets = {0x003E4F40, 0x8};\n        uintptr_t startAddr = resolveModuleDynamicAddress(moduleName, offsets);\n\n        if (startAddr == 0)\n        {\n            std::cerr << \"[!] Could not resolve start address.\" << std::endl;\n            return false;\n        }\n\n        // Each unlocked slot has pattern \"92 255 255 255 255\"\n        BYTE pattern[] = {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00};\n        size_t patternLen = sizeof(pattern);\n        std::vector<BYTE> buffer(4096);\n        SIZE_T bytesRead;\n\n        bool allPatched = true;\n\n        if (ReadProcessMemory(hProcess, (LPCVOID)startAddr, buffer.data(), buffer.size(), &bytesRead))\n        {\n            for (size_t i = 1; i <= bytesRead - patternLen; i++)\n            {\n                if (memcmp(&buffer[i], pattern, patternLen) == 0)\n                {\n                    uintptr_t targetAddr = startAddr + i - 1;\n                    BYTE val = 92;\n\n                    if (!WriteProcessMemory(hProcess, (LPVOID)targetAddr, &val, sizeof(BYTE), nullptr))\n                    {\n                        allPatched = false;\n                    }\n                }\n            }\n        }\n        else\n        {\n            std::cerr << \"[!] RPM failed. Error: \" << GetLastError() << std::endl;\n            return false;\n        }\n\n        return allPatched;\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Inotia 4 Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Inotia 4 Trainer\": \"Inotia 4 Trainer\",\n        \"Freeze Health\": \"Freeze Health\",\n        \"Freeze Mana\": \"Freeze Mana\",\n        \"Set Coins\": \"Set Coins\",\n        \"Set Exp\": \"Set Exp\",\n        \"Set Stat Points\": \"Set Stat Points\",\n        \"Set Skill Points\": \"Set Skill Points\",\n        \"Set Backpack Slot 1\": \"Get Current Mouse Selected Item to Backpack Slot 1\",\n        \"Must have slot 1 item\": \"Please make sure to have something in backpack slot 1 first to overwrite\",\n        \"Unlock All Mercenary Slots\": \"Unlock All Mercenary Slots\",\n        \"Save and Reload\": \"Please save and reload your game after using this option\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Inotia 4 Trainer\": \"艾诺迪亚4修改器\",\n        \"Freeze Health\": \"冻结血量\",\n        \"Freeze Mana\": \"冻结魔法值\",\n        \"Set Coins\": \"设置金币\",\n        \"Set Exp\": \"设置经验值\",\n        \"Set Stat Points\": \"设置能力点\",\n        \"Set Skill Points\": \"设置技能点\",\n        \"Set Backpack Slot 1\": \"获取鼠标选中的物品到背包槽位1\",\n        \"Must have slot 1 item\": \"请先确保背包槽位1有物品以进行覆盖\",\n        \"Unlock All Mercenary Slots\": \"解锁所有佣兵槽位\",\n        \"Save and Reload\": \"请在使用此选项后保存并重新加载游戏\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/Just Shapes & Beats Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Just_Shapes_and_Beats\")\nset(TRAINER_NAME \"Just Shapes & Beats Trainer\")\n\nset(IL2CPP_TARGET \"${GAME_NAME}_IL2CPP\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nif(CMAKE_SIZEOF_VOID_P EQUAL 8)\n    # 64-bit architecture\n    set(MINHOOK_LIB \"${CMAKE_SOURCE_DIR}/common/libs/x64/libMinHook.x64.lib\")\nelse()\n    # 32-bit architecture\n    set(MINHOOK_LIB \"${CMAKE_SOURCE_DIR}/common/libs/x86/libMinHook.x86.lib\")\nendif()\n\n# Compile IL2CPP.cpp to the build directory\nadd_library(${IL2CPP_TARGET} SHARED\n    \"${CMAKE_CURRENT_SOURCE_DIR}/IL2CPP.cpp\"\n    \"${CMAKE_SOURCE_DIR}/common/include/il2cpp/il2cpp.cpp\"\n)\ntarget_link_libraries(${IL2CPP_TARGET} PRIVATE Common ${MINHOOK_LIB})\n\n# Move IL2CPP.dll to the trainer folder\nadd_custom_command(TARGET ${IL2CPP_TARGET} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different\n        \"$<TARGET_FILE:${IL2CPP_TARGET}>\"\n        \"${CMAKE_CURRENT_SOURCE_DIR}/IL2CPP.dll\"\n    COMMENT \"Moving IL2CPP.dll to ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET} ${IL2CPP_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Just Shapes & Beats Trainer/IL2CPP.cpp",
    "content": "#include <iostream>\n#include \"il2cpp/il2cpp.h\"\n\nusing namespace IL2CPP;\n\n// =============================================================\n// Constants & Config\n// =============================================================\n\nconst char *ASSEMBLY_GAME = \"Assembly-CSharp\";\nconst char *NAMESPACE_GLOBAL = \"\";\n\n// Class Names\nconst char *CLASS_METAGAME = \"MetaGameProgress\";\nconst char *CLASS_SAVE_MANAGER = \"SaveGameManager\";\nconst char *CLASS_SCENE_MANAGER = \"GameSceneManager\";\nconst char *CLASS_LIFECOMPONENT = \"LifeComponent\";\nconst char *CLASS_HERO_COLLISION = \"HeroCollisionWithEnemy\";\nconst char *CLASS_LOGIC_CHECKPOINT = \"LogicCheckPointCheck\";\n\n// Method Names\nconst char *METHOD_ADD_BP_AND_BANK = \"addBPToPlayerAndBank\";\nconst char *METHOD_SAVE = \"Save\";\nconst char *METHOD_UPDATE = \"update\";\nconst char *METHOD_DAMAGE = \"damage\";\nconst char *METHOD_ON_COLLISION = \"onCollision\";\nconst char *METHOD_ON_COMPLETE_LAST_CP = \"onCompleteLastCheckpoint\";\n\n// Field Names\nconst char *FIELD_INSTANCE = \"instance\";\n\n// Offsets\nconst uintptr_t OFFSET_ACTOR_COMPONENT_TO_ACTOR = 0x10;  // ActorComponent -> Actor\nconst uintptr_t OFFSET_MANAGER_TO_SCENE = 0x10;          // GameSceneManager -> GameScene\nconst uintptr_t OFFSET_SCENE_TO_LEVEL_LOGIC = 0x60;      // NormalLevelScene -> ActorNormalLevelLogic\nconst uintptr_t OFFSET_LEVEL_LOGIC_TO_CHECKPOINT = 0x78; // ActorNormalLevelLogic -> LogicCheckPointCheck\n\n// Typedefs\ntypedef void (*UpdateGame_t)(void *instance);\ntypedef void (*AddBpAndBank_t)(void *instance, uint32_t amount);\ntypedef void (*SaveGame_t)(void *instance);\ntypedef void (*LifeComponent_damage_t)(void *instance, float amount);\ntypedef void (*HeroCollision_t)(void *instance);\ntypedef void (*OnCompleteLastCheckpoint_t)(void *instance);\n\n// Global State\nstruct BeatPointsCommand\n{\n    bool active = false;\n    uint32_t amount = 0;\n};\n\nBeatPointsCommand g_BeatPointsCommand;\nbool g_GodModeEnabled = false;\nbool g_FinishLevelRequested = false;\nbool g_IsInitialized = false;\nvoid *g_GameSceneManager = nullptr;\n\n// Hooks\nHOOK *update_hook = nullptr;\nHOOK *damage_hook = nullptr;\nHOOK *collision_hook = nullptr;\n\n// =============================================================\nvoid HandleAddBeatPoints()\n{\n    auto assembly = IL2CPP::Assembly(ASSEMBLY_GAME);\n    if (!assembly)\n        return;\n    auto ns = assembly->Namespace(NAMESPACE_GLOBAL);\n\n    // 1. Add Points\n    auto metaGameClass = ns->Class(CLASS_METAGAME);\n    if (!metaGameClass)\n        return;\n\n    auto metaInstanceField = metaGameClass->Field(FIELD_INSTANCE);\n    if (!metaInstanceField)\n        return;\n\n    OBJECT *metaGameInstance = metaInstanceField->GetStaticObject();\n    if (!metaGameInstance)\n        return;\n\n    auto addMethod = metaGameClass->Method(METHOD_ADD_BP_AND_BANK, 1);\n    if (!addMethod)\n        return;\n\n    AddBpAndBank_t AddBpFunc = addMethod->FindFunction<AddBpAndBank_t>();\n    if (AddBpFunc)\n    {\n        AddBpFunc(metaGameInstance, g_BeatPointsCommand.amount);\n        std::cout << \"[+] Added \" << g_BeatPointsCommand.amount << \" BP.\\n\";\n    }\n\n    // 2. Force Save\n    auto saveClass = ns->Class(CLASS_SAVE_MANAGER);\n    if (saveClass)\n    {\n        auto saveInstanceField = saveClass->Field(FIELD_INSTANCE);\n        if (saveInstanceField)\n        {\n            OBJECT *saveManagerInstance = saveInstanceField->GetStaticObject();\n            if (saveManagerInstance)\n            {\n                auto saveMethod = saveClass->Method(METHOD_SAVE, 0);\n                if (saveMethod)\n                {\n                    saveMethod->FindFunction<SaveGame_t>()(saveManagerInstance);\n                    std::cout << \"[+] Game Saved.\\n\";\n                }\n            }\n        }\n    }\n}\n\n// =============================================================\nvoid HandleFinishLevel()\n{\n    if (!g_GameSceneManager)\n        return;\n    auto assembly = IL2CPP::Assembly(ASSEMBLY_GAME);\n    if (!assembly)\n        return;\n    auto ns = assembly->Namespace(NAMESPACE_GLOBAL);\n\n    void *gameScenePtr = *(void **)((uintptr_t)g_GameSceneManager + OFFSET_MANAGER_TO_SCENE);\n    if (!gameScenePtr)\n        return;\n\n    void *levelLogicPtr = *(void **)((uintptr_t)gameScenePtr + OFFSET_SCENE_TO_LEVEL_LOGIC);\n    if (!levelLogicPtr)\n        return;\n\n    void *checkpointLogicPtr = *(void **)((uintptr_t)levelLogicPtr + OFFSET_LEVEL_LOGIC_TO_CHECKPOINT);\n    if (checkpointLogicPtr)\n    {\n        auto cpClass = ns->Class(CLASS_LOGIC_CHECKPOINT);\n        auto cpMethod = cpClass->Method(METHOD_ON_COMPLETE_LAST_CP, 0);\n        if (cpMethod)\n        {\n            auto CPFunc = cpMethod->FindFunction<OnCompleteLastCheckpoint_t>();\n            if (CPFunc)\n            {\n                CPFunc(checkpointLogicPtr);\n                std::cout << \"[+] Triggered Last Checkpoint Event.\\n\";\n            }\n        }\n    }\n}\n\n// =============================================================\nbool IsPlayerActor(void *actorPtr)\n{\n    if (!actorPtr)\n        return false;\n\n    OBJECT *actorObj = (OBJECT *)actorPtr;\n\n    if (!actorObj)\n        return false;\n\n    CLASS *klass = actorObj->Class();\n    if (!klass)\n        return false;\n\n    const char *className = klass->Name();\n    if (!className)\n        return false;\n\n    return (strcmp(className, \"Hero\") == 0);\n}\n\nvoid Detour_LifeComponent_Damage(void *instance, float amount)\n{\n    if (g_GodModeEnabled && instance != nullptr)\n    {\n        void *actorPtr = *(void **)((uintptr_t)instance + OFFSET_ACTOR_COMPONENT_TO_ACTOR);\n\n        if (IsPlayerActor(actorPtr))\n        {\n            // Prevent damage to player\n            return;\n        }\n    }\n\n    if (damage_hook && damage_hook->get_original<LifeComponent_damage_t>())\n    {\n        damage_hook->get_original<LifeComponent_damage_t>()(instance, amount);\n    }\n}\n\nvoid Detour_HeroCollision_OnCollision(void *instance)\n{\n    if (g_GodModeEnabled)\n    {\n        // Prevent knockback/hit animation\n        return;\n    }\n\n    if (collision_hook && collision_hook->get_original<HeroCollision_t>())\n    {\n        collision_hook->get_original<HeroCollision_t>()(instance);\n    }\n}\n\nbool HookGodMode(NAMESPACE *ns, MEMORY &memory)\n{\n    if (!damage_hook)\n    {\n        auto lifeClass = ns->Class(CLASS_LIFECOMPONENT);\n        if (lifeClass)\n        {\n            auto dmgMethod = lifeClass->Method(METHOD_DAMAGE, 1);\n            if (dmgMethod)\n            {\n                damage_hook = dmgMethod->Hook<LifeComponent_damage_t>(memory, Detour_LifeComponent_Damage);\n            }\n        }\n    }\n\n    if (!collision_hook)\n    {\n        auto collisionClass = ns->Class(CLASS_HERO_COLLISION);\n        if (collisionClass)\n        {\n            auto colMethod = collisionClass->Method(METHOD_ON_COLLISION, 0);\n            if (colMethod)\n            {\n                collision_hook = colMethod->Hook<HeroCollision_t>(memory, Detour_HeroCollision_OnCollision);\n            }\n        }\n    }\n\n    return true;\n}\n\n// =============================================================\n// Initialization\n// =============================================================\n\nvoid Detour_Update(void *instance)\n{\n    if (instance != nullptr)\n    {\n        g_GameSceneManager = instance;\n    }\n\n    if (update_hook && update_hook->get_original<UpdateGame_t>())\n    {\n        update_hook->get_original<UpdateGame_t>()(instance);\n    }\n\n    if (g_BeatPointsCommand.active)\n    {\n        g_BeatPointsCommand.active = false;\n        HandleAddBeatPoints();\n    }\n\n    if (g_FinishLevelRequested)\n    {\n        g_FinishLevelRequested = false;\n        HandleFinishLevel();\n    }\n}\n\nbool InitializeIL2CPP()\n{\n    if (g_IsInitialized)\n        return true;\n\n    MEMORY memory;\n    if (!IL2CPP::Initialize(memory))\n    {\n        std::cout << \"[!] Failed to initialize IL2CPP.\\n\";\n        return false;\n    }\n\n    IL2CPP::Attach();\n\n    auto assembly = IL2CPP::Assembly(ASSEMBLY_GAME);\n    if (!assembly)\n    {\n        std::cout << \"[!] Failed to find assembly: \" << ASSEMBLY_GAME << \"\\n\";\n        return false;\n    }\n\n    auto ns = assembly->Namespace(NAMESPACE_GLOBAL);\n    if (!ns)\n    {\n        std::cout << \"[!] Failed to find namespace: \" << NAMESPACE_GLOBAL << \"\\n\";\n        return false;\n    }\n\n    // Update hook\n    auto updateClass = ns->Class(CLASS_SCENE_MANAGER);\n    if (updateClass)\n    {\n        auto updateMethod = updateClass->Method(METHOD_UPDATE, 0);\n        if (updateMethod)\n        {\n            update_hook = updateMethod->Hook<UpdateGame_t>(memory, Detour_Update);\n        }\n        else\n        {\n            std::cout << \"[!] Failed to find method for update hook: \" << METHOD_UPDATE << \"\\n\";\n            return false;\n        }\n    }\n    else\n    {\n        std::cout << \"[!] Failed to find class for update hook: \" << CLASS_SCENE_MANAGER << \"\\n\";\n        return false;\n    }\n\n    // Other hooks\n    if (!HookGodMode(ns, memory))\n    {\n        std::cout << \"[!] Failed to install God Mode hooks.\\n\";\n        return false;\n    }\n\n    g_IsInitialized = true;\n    std::cout << \"[+] IL2CPP initialization complete!\\n\";\n    return true;\n}\n\n// =============================================================\n// Exported Functions\n// =============================================================\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI GodMode(LPVOID lpParam)\n{\n    bool enabled = *(bool *)lpParam;\n    if (!InitializeIL2CPP())\n        return 0;\n\n    g_GodModeEnabled = enabled;\n    std::cout << \"[+] God Mode set to: \" << (enabled ? \"ON\" : \"OFF\") << \"\\n\";\n    return 1;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI AddBeatPoints(LPVOID lpParam)\n{\n    int amount = *(int *)lpParam;\n    if (!amount || !InitializeIL2CPP())\n        return 0;\n\n    g_BeatPointsCommand.amount = (uint32_t)amount;\n    g_BeatPointsCommand.active = true;\n    std::cout << \"[+] Queueing BP Add: \" << amount << \"\\n\";\n    return 1;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI FinishLevel(LPVOID lpParam)\n{\n    if (!InitializeIL2CPP())\n        return 0;\n\n    g_FinishLevelRequested = true;\n    std::cout << \"[+] Queueing Instant Finish...\\n\";\n    return 1;\n}\n\n// =============================================================\n// DLL Main\n// =============================================================\n\nDWORD WINAPI MainThread(HMODULE hModule)\n{\n#ifdef _DEBUG\n    AllocConsole();\n    freopen_s((FILE **)(stdout), \"CONOUT$\", \"w\", stdout);\n#endif\n    return 0;\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n    switch (ul_reason_for_call)\n    {\n    case DLL_PROCESS_ATTACH:\n        DisableThreadLibraryCalls(hModule);\n        CreateThread(nullptr, NULL, (LPTHREAD_START_ROUTINE)MainThread, hModule, NULL, nullptr);\n        break;\n    }\n    return TRUE;\n}"
  },
  {
    "path": "Game Trainers/trainers/Just Shapes & Beats Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    if (optionName == \"AddBeatPoints\")\n    {\n        status = trainer->addBeatPoints(std::stoi(inputValue));\n    }\n    else if (optionName == \"FinishLevel\")\n    {\n        status = trainer->finishLevel();\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    if (optionName == \"GodMode\")\n    {\n        if (button->value())\n            status = trainer->godMode(true);\n        else\n            status = trainer->godMode(false);\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Just Shapes & Beats Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    DWORD info_img_size = 0;\n    const unsigned char *info_img_data = load_resource(\"INFO_IMG\", info_img_size);\n    Fl_PNG_Image *info_img = new Fl_PNG_Image(nullptr, info_img_data, (int)info_img_size);\n    info_img->scale(20, 20, 1, 0);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + UI_LEFT_MARGIN;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + UI_LEFT_MARGIN);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // Widget Placements\n    place_toggle_widget(options1_flex, &trainer, \"GodMode\", \"God Mode\");\n\n    place_apply_widget(options1_flex, &trainer, \"AddBeatPoints\", \"Add Beat Points\", nullptr, \"5000\", \"1\", \"999999999\");\n\n    place_apply_widget(options1_flex, &trainer, \"FinishLevel\", \"Finish Level\");\n\n    // End of Option Column 1\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Just Shapes & Beats Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nINFO_IMG RCDATA \"../../common/assets/info.png\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\"\nIL2CPP_DLL RCDATA \"IL2CPP.dll\""
  },
  {
    "path": "Game Trainers/trainers/Just Shapes & Beats Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"Il2CppBase.h\"\n\nclass Trainer : public Il2CppBase\n{\npublic:\n    Trainer() : Il2CppBase(L\"JSB.exe\") {} // x64\n    ~Trainer() override = default;\n\n    // Constants\n    // static inline const wchar_t *moduleName = L\"GameAssembly.dll\";\n\n    bool godMode(bool enable)\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod<bool>(\"GodMode\", enable);\n        }\n        return false;\n    }\n\n    bool addBeatPoints(int beatPoints)\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod<int>(\"AddBeatPoints\", beatPoints);\n        }\n        return false;\n    }\n\n    bool finishLevel()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"FinishLevel\");\n        }\n        return false;\n    }\n};"
  },
  {
    "path": "Game Trainers/trainers/Just Shapes & Beats Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Just Shapes & Beats Trainer\": \"Just Shapes & Beats Trainer\",\n        \"God Mode\": \"God Mode\",\n        \"Add Beat Points\": \"Add Beat Points\",\n        \"Finish Level\": \"Finish Level\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Just Shapes & Beats Trainer\": \"摇就完事了修改器\",\n        \"God Mode\": \"无敌模式\",\n        \"Add Beat Points\": \"添加 Beat Points\",\n        \"Finish Level\": \"完成关卡\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/Oil Rush Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Oil_Rush\")\nset(TRAINER_NAME \"Oil Rush Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Oil Rush Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n    bool isActive = button->value() != 0;\n\n    if (optionName == \"SetOil\") {\n        status = trainer->toggleOil(isActive, std::stoi(inputValue));\n    }\n    else if (optionName == \"SetAbility\") {\n        status = trainer->toggleAbility(isActive, std::stoi(inputValue));\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Oil Rush Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + UI_LEFT_MARGIN;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + UI_LEFT_MARGIN);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // Widget Placements\n    place_toggle_widget(options1_flex, &trainer, \"SetOil\", \"Set Oil\", nullptr, \"500\", \"0\", \"999999999\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetAbility\", \"Set Ability Points\", nullptr, \"99\", \"0\", \"999999999\");\n\n    // End of Option Column 1\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Oil Rush Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Oil Rush Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"OilRush.exe\") {} // x86\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"Unigine_x86.dll\";\n\n    uintptr_t internal_OilFreeze_Address = 0;\n    uintptr_t internal_UpgradeFreeze_Address = 0;\n\n    // Internal state trackers\n    int currentOilTarget = -1;\n    int currentAbilityTarget = -1;\n\n    // --- CLEAN UI WRAPPERS ---\n    inline bool toggleOil(bool active, int value)\n    {\n        currentOilTarget = active ? value : -1;\n        return setMasterResources(currentOilTarget, currentAbilityTarget);\n    }\n\n    inline bool toggleAbility(bool active, int value)\n    {\n        currentAbilityTarget = active ? value : -1;\n        return setMasterResources(currentOilTarget, currentAbilityTarget);\n    }\n\nprivate:\n    // Hook Overview: Hijacks the engine's globally shared Sync_Component_Value read instruction (Unigine_x86.dll+90336) to intercept all resource updates.\n    // Pointer Traversal: Dynamically traverses static pointer chains inside the code cave (7 levels for Oil, 3 for Upgrades) to find the player's exact HUD values.\n    // Filtering: Identifies player resources by matching the current object's value against the HUD value and verifying the Team ID is 0.\n    // State Management (-1 Safeguard): Compares the user's target cheat value to -1; if it matches, it safely skips execution to preserve original memory and prevent register corruption.\n    // Memory Hijack: Forcefully overwrites the entity's real resource base with the custom target value and updates eax to instantly sync the visual UI mirror.\n    inline bool setMasterResources(int targetOil, int targetAbilityPoints)\n    {\n        // 1. If both are -1, safely kill the hook and exit.\n        if (targetOil == -1 && targetAbilityPoints == -1)\n        {\n            disableNamedHook(\"MasterResourceHook\");\n            internal_OilFreeze_Address = 0;\n            internal_UpgradeFreeze_Address = 0;\n            return true;\n        }\n\n        // 2. If the hook is active, just update the live memory targets!\n        auto it = hooks.find(\"MasterResourceHook\");\n        if (it != hooks.end() && it->second.active)\n        {\n            if (internal_OilFreeze_Address != 0)\n                WriteProcessMemory(hProcess, (LPVOID)internal_OilFreeze_Address, &targetOil, sizeof(int), nullptr);\n\n            if (internal_UpgradeFreeze_Address != 0)\n                WriteProcessMemory(hProcess, (LPVOID)internal_UpgradeFreeze_Address, &targetAbilityPoints, sizeof(int), nullptr);\n\n            return true;\n        }\n\n        // 3. Create the Master Hook.\n        uintptr_t modBase = 0;\n        size_t modSize = 0;\n        if (!getModuleInfo(moduleName, modBase, modSize))\n            return false;\n\n        uintptr_t staticPtrBase = modBase + 0x00671B28;\n        size_t overwriteLen = 6;\n        size_t codeSize = 0x300;\n\n        auto buildFunc = [this, staticPtrBase, targetOil, targetAbilityPoints](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code;\n            code.reserve(0x300);\n\n            std::vector<size_t> oil_jump_offsets;\n            std::vector<size_t> cleanup_jump_offsets;\n\n            auto emit_je = [&](std::vector<size_t> &jump_list)\n            {\n                code.push_back(0x0F);\n                code.push_back(0x84);\n                jump_list.push_back(code.size());\n                code.insert(code.end(), 4, 0x00);\n            };\n            auto emit_jne = [&](std::vector<size_t> &jump_list)\n            {\n                code.push_back(0x0F);\n                code.push_back(0x85);\n                jump_list.push_back(code.size());\n                code.insert(code.end(), 4, 0x00);\n            };\n\n            // Read Master Value (EAX) & Save ebx\n            code.push_back(0x8B);\n            code.push_back(0x46);\n            code.push_back(0x10);\n            code.push_back(0x53);\n\n            // ==========================================\n            // BLOCK 1: OIL CHECK\n            // ==========================================\n            code.push_back(0x8B);\n            code.push_back(0x1D);\n            const BYTE *pStatic = reinterpret_cast<const BYTE *>(&staticPtrBase);\n            code.insert(code.end(), pStatic, pStatic + 4);\n            code.push_back(0x85);\n            code.push_back(0xDB);\n            emit_je(oil_jump_offsets);\n\n            std::vector<uint32_t> oil_offsets = {0x0D8, 0x00C, 0x120, 0x77C, 0x6A0, 0x064};\n            for (uint32_t off : oil_offsets)\n            {\n                if (off < 0x80)\n                {\n                    code.push_back(0x8B);\n                    code.push_back(0x5B);\n                    code.push_back(static_cast<BYTE>(off));\n                }\n                else\n                {\n                    code.push_back(0x8B);\n                    code.push_back(0x9B);\n                    code.insert(code.end(), reinterpret_cast<BYTE *>(&off), reinterpret_cast<BYTE *>(&off) + 4);\n                }\n                code.push_back(0x85);\n                code.push_back(0xDB);\n                emit_je(oil_jump_offsets);\n            }\n            uint32_t oilFinalOff = 0xCCC;\n            code.push_back(0x8B);\n            code.push_back(0x9B);\n            code.insert(code.end(), reinterpret_cast<BYTE *>(&oilFinalOff), reinterpret_cast<BYTE *>(&oilFinalOff) + 4);\n\n            code.push_back(0x39);\n            code.push_back(0xD8);\n            emit_jne(oil_jump_offsets);\n            code.push_back(0x83);\n            code.push_back(0x7E);\n            code.push_back(0xE0);\n            code.push_back(0x00);\n            emit_jne(oil_jump_offsets);\n\n            // --- FIXED HACK OIL ---\n            // mov ebx, ds:[OilTarget]\n            code.push_back(0x8B);\n            code.push_back(0x1D);\n            size_t oil_var_inst_offset = code.size();\n            code.insert(code.end(), 4, 0x00);\n\n            // cmp ebx, -1 (Safeguard: If -1, jump to Upgrade Check, leaving EAX perfectly intact!)\n            code.push_back(0x83);\n            code.push_back(0xFB);\n            code.push_back(0xFF);\n            emit_je(oil_jump_offsets);\n\n            // mov [esi+10], ebx (Force Hack)\n            code.push_back(0x89);\n            code.push_back(0x5E);\n            code.push_back(0x10);\n            // mov eax, ebx (Update EAX so the UI mirrors the hack)\n            code.push_back(0x8B);\n            code.push_back(0xC3);\n\n            code.push_back(0xE9);\n            cleanup_jump_offsets.push_back(code.size());\n            code.insert(code.end(), 4, 0x00);\n\n            // ==========================================\n            // BLOCK 2: UPGRADE POINTS CHECK\n            // ==========================================\n            size_t check_upgrades_pos = code.size();\n\n            code.push_back(0x8B);\n            code.push_back(0x1D);\n            code.insert(code.end(), pStatic, pStatic + 4);\n            code.push_back(0x85);\n            code.push_back(0xDB);\n            emit_je(cleanup_jump_offsets);\n\n            std::vector<uint32_t> up_offsets = {0x844, 0x0A4};\n            for (uint32_t off : up_offsets)\n            {\n                code.push_back(0x8B);\n                code.push_back(0x9B);\n                code.insert(code.end(), reinterpret_cast<BYTE *>(&off), reinterpret_cast<BYTE *>(&off) + 4);\n                code.push_back(0x85);\n                code.push_back(0xDB);\n                emit_je(cleanup_jump_offsets);\n            }\n            uint32_t upFinalOff = 0x620;\n            code.push_back(0x8B);\n            code.push_back(0x9B);\n            code.insert(code.end(), reinterpret_cast<BYTE *>(&upFinalOff), reinterpret_cast<BYTE *>(&upFinalOff) + 4);\n\n            code.push_back(0x39);\n            code.push_back(0xD8);\n            emit_jne(cleanup_jump_offsets);\n            code.push_back(0x83);\n            code.push_back(0x7E);\n            code.push_back(0xE0);\n            code.push_back(0x00);\n            emit_jne(cleanup_jump_offsets);\n\n            // --- FIXED HACK UPGRADE ---\n            // mov ebx, ds:[UpTarget]\n            code.push_back(0x8B);\n            code.push_back(0x1D);\n            size_t up_var_inst_offset = code.size();\n            code.insert(code.end(), 4, 0x00);\n\n            // cmp ebx, -1 (Safeguard)\n            code.push_back(0x83);\n            code.push_back(0xFB);\n            code.push_back(0xFF);\n            emit_je(cleanup_jump_offsets);\n\n            // mov [esi+10], ebx\n            code.push_back(0x89);\n            code.push_back(0x5E);\n            code.push_back(0x10);\n            // mov eax, ebx\n            code.push_back(0x8B);\n            code.push_back(0xC3);\n\n            // ==========================================\n            // CLEANUP & DATA SECTION\n            // ==========================================\n            size_t cleanup_pos = code.size();\n            code.push_back(0x5B); // pop ebx\n            code.push_back(0x89);\n            code.push_back(0x47);\n            code.push_back(0x10);\n\n            code.push_back(0xE9);\n            size_t jmp_offset = code.size();\n            code.insert(code.end(), 4, 0x00);\n\n            size_t oil_data_pos = code.size();\n            const BYTE *pOilVal = reinterpret_cast<const BYTE *>(&targetOil);\n            code.insert(code.end(), pOilVal, pOilVal + 4);\n\n            size_t up_data_pos = code.size();\n            const BYTE *pUpVal = reinterpret_cast<const BYTE *>(&targetAbilityPoints);\n            code.insert(code.end(), pUpVal, pUpVal + 4);\n\n            this->internal_OilFreeze_Address = static_cast<uint32_t>(codeCaveAddr + oil_data_pos);\n            this->internal_UpgradeFreeze_Address = static_cast<uint32_t>(codeCaveAddr + up_data_pos);\n\n            std::memcpy(&code[oil_var_inst_offset], &this->internal_OilFreeze_Address, 4);\n            std::memcpy(&code[up_var_inst_offset], &this->internal_UpgradeFreeze_Address, 4);\n\n            uintptr_t currentPos = codeCaveAddr + jmp_offset + 4;\n            int32_t relJump = static_cast<int32_t>((hookAddr + 6) - currentPos);\n            std::memcpy(&code[jmp_offset], &relJump, 4);\n\n            for (size_t off : oil_jump_offsets)\n            {\n                int32_t rel = static_cast<int32_t>(check_upgrades_pos - (off + 4));\n                std::memcpy(&code[off], &rel, 4);\n            }\n\n            for (size_t off : cleanup_jump_offsets)\n            {\n                int32_t rel = static_cast<int32_t>(cleanup_pos - (off + 4));\n                std::memcpy(&code[off], &rel, 4);\n            }\n\n            return code;\n        };\n\n        return createNamedHookByOffset(moduleName, \"MasterResourceHook\", 0x90336, overwriteLen, codeSize, buildFunc);\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Oil Rush Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Oil Rush Trainer\": \"Oil Rush Trainer\",\n        \"Set Oil\": \"Set Oil\",\n        \"Set Ability Points\": \"Set Ability Points\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Oil Rush Trainer\": \"突袭油田修改器\",\n        \"Set Oil\": \"设置石油\",\n        \"Set Ability Points\": \"设置能力点\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/Outland Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Outland\")\nset(TRAINER_NAME \"Outland Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Outland Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    if (optionName == \"SetHealth\")\n    {\n        if (button->value())\n            status = trainer->setHealth(std::stof(inputValue));\n        else\n            status = trainer->disableNamedPointerToggle(optionName);\n    }\n    else if (optionName == \"SetMaxHealth\")\n    {\n        if (button->value())\n            status = trainer->setMaxHealth(std::stof(inputValue));\n        else\n            status = trainer->disableNamedPointerToggle(optionName);\n    }\n    else if (optionName == \"SetCoins\")\n    {\n        if (button->value())\n            status = trainer->setCoins(std::stoi(inputValue));\n        else\n            status = trainer->disableNamedPointerToggle(optionName);\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Outland Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + UI_LEFT_MARGIN;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + UI_LEFT_MARGIN);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // Widget Placements\n    place_toggle_widget(options1_flex, &trainer, \"SetHealth\", \"Set Health\", nullptr, \"5\", \"1\", \"12\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetMaxHealth\", \"Set Maximum Health\", nullptr, \"5\", \"1\", \"12\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetCoins\", \"Set Coins\", nullptr, \"999999\", \"0\", \"999999999\");\n\n    // End of Option Column 1\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Outland Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Outland Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"Outland.exe\") {} // x86\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"Outland.exe\";\n\n    inline bool setHealth(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x005024F0, 0x5C, 0x14, 0x0, 0x14, 0x18, 0x3C};\n        return createPointerToggle(moduleName, \"SetHealth\", offsets, newVal);\n    }\n\n    inline bool setMaxHealth(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x005024F0, 0x5C, 0x14, 0x0, 0x14, 0x18, 0x40};\n        return createPointerToggle(moduleName, \"SetMaxHealth\", offsets, newVal);\n    }\n\n    inline bool setCoins(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x004C72A0, 0x4C, 0x44, 0x0, 0x4, 0x14, 0x0, 0xF8};\n        return createPointerToggle(moduleName, \"SetCoins\", offsets, newVal);\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Outland Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Outland Trainer\": \"Outland Trainer\",\n        \"Set Health\": \"Set Health\",\n        \"Set Maximum Health\": \"Set Maximum Health\",\n        \"Set Coins\": \"Set Coins\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Outland Trainer\": \"奇异领域修改器\",\n        \"Set Health\": \"设置生命值\",\n        \"Set Maximum Health\": \"设置最大生命值\",\n        \"Set Coins\": \"设置金币\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_GOTY Edition Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Plants_vs._Zombies_GOTY_Edition\")\nset(TRAINER_NAME \"Plants vs. Zombies_GOTY Edition Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_GOTY Edition Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"AddCoin\")\n    {\n        if (button->value())\n        {\n            status = trainer->addCoin(std::stoi(inputValue) / 10);\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"AddSun\")\n    {\n        if (button->value())\n        {\n            status = trainer->addSun(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedHook(optionName);\n        }\n    }\n    else if (optionName == \"SetFertilizer\")\n    {\n        if (button->value())\n        {\n            status = trainer->setFertilizer(std::stoi(inputValue) + 1000);\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetBugSpray\")\n    {\n        if (button->value())\n        {\n            status = trainer->setBugSpray(std::stoi(inputValue) + 1000);\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetChocolate\")\n    {\n        if (button->value())\n        {\n            status = trainer->setChocolate(std::stoi(inputValue) + 1000);\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetTreeFood\")\n    {\n        if (button->value())\n        {\n            status = trainer->addTreeFood(std::stoi(inputValue) + 1000);\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Plants vs. Zombies: GOTY Edition Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // Option 1: Add coin (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *coin_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    coin_flex->gap(option_gap);\n\n    Fl_Box *coin_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    coin_flex->fixed(coin_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *coin_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    coin_flex->fixed(coin_check_button, toggle_w);\n\n    Fl_Box *coin_label = new Fl_Box(0, 0, 0, 0);\n    tr(coin_label, \"Add Coins\");\n\n    Fl_Input *coin_input = new Fl_Input(0, 0, 0, 0);\n    coin_flex->fixed(coin_input, input_w);\n    coin_input->type(FL_INT_INPUT);\n    set_input_values(coin_input, \"9999\", \"-999999\", \"999999\");\n\n    ToggleData *td_coin = new ToggleData{&trainer, \"AddCoin\", coin_check_button, coin_input};\n    coin_check_button->callback(toggle_callback, td_coin);\n\n    coin_flex->end();\n    options1_flex->fixed(coin_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 2: Add sun (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *sun_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    sun_flex->gap(option_gap);\n\n    Fl_Box *sun_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    sun_flex->fixed(sun_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *sun_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    sun_flex->fixed(sun_check_button, toggle_w);\n\n    Fl_Box *sun_label = new Fl_Box(0, 0, 0, 0);\n    tr(sun_label, \"Add Sun\");\n\n    Fl_Input *sun_input = new Fl_Input(0, 0, 0, 0);\n    sun_flex->fixed(sun_input, input_w);\n    sun_input->type(FL_INT_INPUT);\n    set_input_values(sun_input, \"999\", \"-9990\", \"9990\");\n\n    ToggleData *td_sun = new ToggleData{&trainer, \"AddSun\", sun_check_button, sun_input};\n    sun_check_button->callback(toggle_callback, td_sun);\n\n    sun_flex->end();\n    options1_flex->fixed(sun_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 3: Set fertilizer (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *fertilizer_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    fertilizer_flex->gap(option_gap);\n\n    Fl_Box *fertilizer_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    fertilizer_flex->fixed(fertilizer_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *fertilizer_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    fertilizer_flex->fixed(fertilizer_check_button, toggle_w);\n\n    Fl_Box *fertilizer_label = new Fl_Box(0, 0, 0, 0);\n    tr(fertilizer_label, \"Set Fertilizer\");\n\n    Fl_Input *fertilizer_input = new Fl_Input(0, 0, 0, 0);\n    fertilizer_flex->fixed(fertilizer_input, input_w);\n    fertilizer_input->type(FL_INT_INPUT);\n    set_input_values(fertilizer_input, \"99\", \"0\", \"999999999\");\n\n    ToggleData *td_fertilizer = new ToggleData{&trainer, \"SetFertilizer\", fertilizer_check_button, fertilizer_input};\n    fertilizer_check_button->callback(toggle_callback, td_fertilizer);\n\n    fertilizer_flex->end();\n    options1_flex->fixed(fertilizer_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 4: Set bug_spray (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *bug_spray_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    bug_spray_flex->gap(option_gap);\n\n    Fl_Box *bug_spray_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    bug_spray_flex->fixed(bug_spray_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *bug_spray_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    bug_spray_flex->fixed(bug_spray_check_button, toggle_w);\n\n    Fl_Box *bug_spray_label = new Fl_Box(0, 0, 0, 0);\n    tr(bug_spray_label, \"Set Bug Spray\");\n\n    Fl_Input *bug_spray_input = new Fl_Input(0, 0, 0, 0);\n    bug_spray_flex->fixed(bug_spray_input, input_w);\n    bug_spray_input->type(FL_INT_INPUT);\n    set_input_values(bug_spray_input, \"99\", \"0\", \"999999999\");\n\n    ToggleData *td_bug_spray = new ToggleData{&trainer, \"SetBugSpray\", bug_spray_check_button, bug_spray_input};\n    bug_spray_check_button->callback(toggle_callback, td_bug_spray);\n\n    bug_spray_flex->end();\n    options1_flex->fixed(bug_spray_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 5: Set chocolate (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *chocolate_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    chocolate_flex->gap(option_gap);\n\n    Fl_Box *chocolate_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    chocolate_flex->fixed(chocolate_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *chocolate_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    chocolate_flex->fixed(chocolate_check_button, toggle_w);\n\n    Fl_Box *chocolate_label = new Fl_Box(0, 0, 0, 0);\n    tr(chocolate_label, \"Set Chocolate\");\n\n    Fl_Input *chocolate_input = new Fl_Input(0, 0, 0, 0);\n    chocolate_flex->fixed(chocolate_input, input_w);\n    chocolate_input->type(FL_INT_INPUT);\n    set_input_values(chocolate_input, \"99\", \"0\", \"999999999\");\n\n    ToggleData *td_chocolate = new ToggleData{&trainer, \"SetChocolate\", chocolate_check_button, chocolate_input};\n    chocolate_check_button->callback(toggle_callback, td_chocolate);\n\n    chocolate_flex->end();\n    options1_flex->fixed(chocolate_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Option 6: Set tree_food (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *tree_food_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    tree_food_flex->gap(option_gap);\n\n    Fl_Box *tree_food_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    tree_food_flex->fixed(tree_food_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *tree_food_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    tree_food_flex->fixed(tree_food_check_button, toggle_w);\n\n    Fl_Box *tree_food_label = new Fl_Box(0, 0, 0, 0);\n    tr(tree_food_label, \"Set Tree Food\");\n\n    Fl_Input *tree_food_input = new Fl_Input(0, 0, 0, 0);\n    tree_food_flex->fixed(tree_food_input, input_w);\n    tree_food_input->type(FL_INT_INPUT);\n    set_input_values(tree_food_input, \"99\", \"0\", \"999999999\");\n\n    ToggleData *td_tree_food = new ToggleData{&trainer, \"SetTreeFood\", tree_food_check_button, tree_food_input};\n    tree_food_check_button->callback(toggle_callback, td_tree_food);\n\n    tree_food_flex->end();\n    options1_flex->fixed(tree_food_flex, option_h);\n\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_GOTY Edition Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_GOTY Edition Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"popcapgame1.exe\") {} // x86\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"popcapgame1.exe\";\n\n    inline bool setFertilizer(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x00073A64, 0x44, 0x0, 0x10, 0x2C, 0x4, 0x18, 0x254};\n        return createPointerToggle(moduleName, \"SetFertilizer\", offsets, newVal);\n    }\n\n    inline bool setBugSpray(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x00073A64, 0x44, 0x0, 0x10, 0x28, 0x4, 0x18, 0x258};\n        return createPointerToggle(moduleName, \"SetBugSpray\", offsets, newVal);\n    }\n\n    inline bool setChocolate(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x00073A64, 0x44, 0x0, 0x10, 0x28, 0x0, 0x14, 0x284};\n        return createPointerToggle(moduleName, \"SetChocolate\", offsets, newVal);\n    }\n\n    inline bool addTreeFood(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x0032E77C, 0x10, 0x28, 0x0, 0x4, 0x4, 0x18, 0x28C};\n        return createPointerToggle(moduleName, \"SetTreeFood\", offsets, newVal);\n    }\n\n    inline bool addCoin(int newVal)\n    {\n        // Target instruction bytes: 09 00 00 01 50 54 8B 48 54 81\n        std::vector<std::string> bigPat = {\"09\", \"00\", \"00\", \"01\", \"50\", \"54\", \"8B\", \"48\", \"54\", \"81\"};\n\n        size_t patternOffset = 3; // start position of target instruction\n        size_t overwriteLen = 6;  // length of target instruction to overwrite\n        size_t codeSize = 0x600;  // Allocate sufficient space\n\n        // Build the hook\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90); // NOP padding\n\n            int *pInt = reinterpret_cast<int *>(&code[0x400]);\n            *pInt = newVal;\n\n            size_t wPos = 0;\n\n            // 2) mov edx, [absolute 32-bit address] => 8B 15 <disp32>\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x15;\n            {\n                uintptr_t absoluteAddr = codeCaveAddr + 0x400;\n                int32_t disp32 = static_cast<int32_t>(absoluteAddr);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // add [eax+54],edx => 01 50 54\n            code[wPos++] = 0x01;\n            code[wPos++] = 0x50;\n            code[wPos++] = 0x54;\n\n            // mov ecx,[eax+54] => 8B 48 54\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x48;\n            code[wPos++] = 0x54;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        // Create the hook\n        return createNamedHook(\n            moduleName,\n            \"AddCoin\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc);\n    }\n\n    inline bool addSun(int newVal)\n    {\n        // Target instruction bytes: 01 88 78 55 00 00\n        std::vector<std::string> bigPat = {\"01\", \"88\", \"78\", \"55\", \"00\", \"00\"};\n\n        size_t patternOffset = 0; // start position of target instruction\n        size_t overwriteLen = 6;  // length of target instruction to overwrite\n        size_t codeSize = 0x600;  // Allocate sufficient space\n\n        // Build the hook\n        auto buildFunc = [newVal, overwriteLen](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            std::vector<BYTE> code(0x600, 0x90); // NOP padding\n\n            int *pInt = reinterpret_cast<int *>(&code[0x400]);\n            *pInt = newVal;\n\n            size_t wPos = 0;\n\n            // 2) mov ecx, [absolute 32-bit address] => 8B 0D <disp32>\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x0D;\n            {\n                uintptr_t absoluteAddr = codeCaveAddr + 0x400;\n                int32_t disp32 = static_cast<int32_t>(absoluteAddr);\n                std::memcpy(&code[wPos], &disp32, 4);\n                wPos += 4;\n            }\n\n            // add [eax+00005578], ecx => 01 88 78 55 00 00\n            code[wPos++] = 0x01;\n            code[wPos++] = 0x88;\n            code[wPos++] = 0x78;\n            code[wPos++] = 0x55;\n            code[wPos++] = 0x00;\n            code[wPos++] = 0x00;\n\n            // jmp hookAddr + overwriteLen => E9 <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t retAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstr = codeCaveAddr + wPos + 4;\n            int32_t rel = static_cast<int32_t>(retAddr - nextInstr);\n            std::memcpy(&code[wPos], &rel, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        // Create the hook\n        return createNamedHook(\n            moduleName,\n            \"AddSun\",\n            bigPat,\n            patternOffset,\n            overwriteLen,\n            codeSize,\n            buildFunc);\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_GOTY Edition Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Plants vs. Zombies: GOTY Edition Trainer\": \"Plants vs. Zombies: GOTY Edition Trainer\",\n        \"Add Coins\": \"Add Coins\",\n        \"Add Sun\": \"Add Sun\",\n        \"Set Fertilizer\": \"Set Fertilizer\",\n        \"Set Bug Spray\": \"Set Bug Spray\",\n        \"Set Chocolate\": \"Set Chocolate\",\n        \"Set Tree Food\": \"Set Tree Food\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Plants vs. Zombies: GOTY Edition Trainer\": \"植物大战僵尸：年度版修改器\",\n        \"Add Coins\": \"添加金币\",\n        \"Add Sun\": \"添加阳光\",\n        \"Set Fertilizer\": \"设置肥料\",\n        \"Set Bug Spray\": \"设置杀虫剂\",\n        \"Set Chocolate\": \"设置巧克力\",\n        \"Set Tree Food\": \"设置树肥\"\n    }\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Plants_vs._Zombies_Replanted\")\nset(TRAINER_NAME \"Plants vs. Zombies_Replanted Trainer\")\n\nset(IL2CPP_TARGET \"${GAME_NAME}_IL2CPP\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \n    \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}/translation_extra.txt\"\n)\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nif(CMAKE_SIZEOF_VOID_P EQUAL 8)\n    # 64-bit architecture\n    set(MINHOOK_LIB \"${CMAKE_SOURCE_DIR}/common/libs/x64/libMinHook.x64.lib\")\nelse()\n    # 32-bit architecture\n    set(MINHOOK_LIB \"${CMAKE_SOURCE_DIR}/common/libs/x86/libMinHook.x86.lib\")\nendif()\n\n# Compile IL2CPP.cpp to the build directory\nadd_library(${IL2CPP_TARGET} SHARED\n    \"${CMAKE_CURRENT_SOURCE_DIR}/IL2CPP.cpp\"\n    \"${CMAKE_SOURCE_DIR}/common/include/il2cpp/il2cpp.cpp\"\n)\ntarget_link_libraries(${IL2CPP_TARGET} PRIVATE Common ${MINHOOK_LIB})\n\n# Move IL2CPP.dll to the trainer folder\nadd_custom_command(TARGET ${IL2CPP_TARGET} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different\n        \"$<TARGET_FILE:${IL2CPP_TARGET}>\"\n        \"${CMAKE_CURRENT_SOURCE_DIR}/IL2CPP.dll\"\n    COMMENT \"Moving IL2CPP.dll to ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET} ${IL2CPP_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/IL2CPP.cpp",
    "content": "#pragma warning(disable : 4703)\n#pragma warning(disable : 4996)\n\n#include <iostream>\n#include <sstream>\n#include \"il2cpp/il2cpp.h\"\n\nusing namespace IL2CPP;\n\nconst char *GAME_ASSEMBLY = \"Assembly-CSharp\";\nconst char *GAME_NAMESPACE = \"Reloaded.Gameplay\";\n\n// Classes\nconst char *BOARD_CLASS = \"Board\";\nconst char *ZENGARDEN_CLASS = \"ZenGarden\";\nconst char *USERPROFILE_CLASS = \"UserProfile\";\nconst char *SEEDTYPE_ENUM = \"SeedType\";\nconst char *ZOMBIETYPE_ENUM = \"ZombieType\";\n\n// Methods\nconst char *UPDATE_METHOD = \"UpdateGame\";\nconst char *GIVE_PLANT_METHOD = \"AttemptNewPlantUserdata\";\nconst char *PLACE_PLANT_METHOD = \"PlacePottedPlant\";\nconst char *SET_PLANT_AGE_METHOD = \"set_PlantAge\";\nconst char *GET_ACTIVE_PROFILE_METHOD = \"get_ActiveUserProfile\";\nconst char *NEW_PLANT_METHOD = \"NewPlant\";\nconst char *ADD_ZOMBIE_ROW_METHOD = \"AddZombieInRow\";\nconst char *GET_NUM_ROWS_METHOD = \"GetNumRows\";\n\n// Fields\nconst char *FACING_FIELD = \"mFacing\";\nconst char *LEVEL_COMPLETE_FIELD = \"mLevelComplete\";\n\n// Typedefs\ntypedef bool (*AttemptNewPlantUserdata_t)(int plantId);\ntypedef void (*UpdateGame_t)(void *instance);\ntypedef void *(*GetActiveUserProfile_t)(void *userService);\ntypedef void (*SetPlantAge_t)(void *pottedPlant, int age);\ntypedef void *(*PlacePottedPlant_t)(void *zenGardenInstance, int pottedPlantIndex);\ntypedef void *(*NewPlant_t)(void *instance, int x, int y, int seedType, int imitaterType);\ntypedef void *(*AddZombieInRow_t)(void *instance, int zombieType, int row, int fromWave, bool shakeBrush);\ntypedef int (*GetNumRows_t)(void *instance);\n\n// Command Structures\nstruct ZenGardenPlantCommand\n{\n    bool active = false;\n    int plantID = 0;\n    int direction = 0;\n};\n\nstruct PlantArgs\n{\n    int plantID;\n    int direction;\n};\n\nstruct SpawnZombieArgs\n{\n    int type;\n    int row;\n    bool isEveryRow;\n};\n\nstruct ZombieCommand\n{\n    bool active = false;\n    int type = 0;\n    int row = 0;\n    bool isEveryRow = false;\n};\n\nZenGardenPlantCommand g_PlantCommand;\nZombieCommand g_ZombieCommand;\nbool g_InstantWinCommand = false;\nbool g_JalapenoCommand = false;\n\nHOOK *update_hook = nullptr;\nbool g_IsInitialized = false;\n\nvoid HandlePlantSpawn(void *boardInstance)\n{\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n\n    auto zenClass = ns->Class(ZENGARDEN_CLASS);\n    if (!zenClass)\n        return;\n    auto method = zenClass->Method(GIVE_PLANT_METHOD, 1);\n    if (!method)\n        return;\n    AttemptNewPlantUserdata_t AttemptNewPlantUserdata = method->FindFunction<AttemptNewPlantUserdata_t>();\n    if (!AttemptNewPlantUserdata)\n        return;\n    auto placeMethod = zenClass->Method(PLACE_PLANT_METHOD, 1);\n    if (!placeMethod)\n        return;\n    PlacePottedPlant_t PlacePottedPlant = placeMethod->FindFunction<PlacePottedPlant_t>();\n    if (!PlacePottedPlant)\n        return;\n\n    if (!AttemptNewPlantUserdata(g_PlantCommand.plantID))\n        return;\n\n    OBJECT *board = (OBJECT *)boardInstance;\n    OBJECT *app = board->GetValue<OBJECT *>(\"mApp\");\n    if (!app)\n        return;\n\n    OBJECT *userService = app->GetValue<OBJECT *>(\"m_userService\");\n    OBJECT *zenGarden = app->GetValue<OBJECT *>(\"m_zenGarden\");\n\n    if (userService && zenGarden)\n    {\n        auto getProfileMethod = userService->Class()->Method(GET_ACTIVE_PROFILE_METHOD, 0);\n        if (getProfileMethod)\n        {\n            auto GetActiveUserProfile = getProfileMethod->FindFunction<GetActiveUserProfile_t>();\n            OBJECT *userProfile = (OBJECT *)GetActiveUserProfile(userService);\n\n            if (userProfile)\n            {\n                int count = userProfile->GetValue<int>(\"mNumPottedPlants\");\n                ARRAY *plantsArray = userProfile->GetArray(\"mPottedPlant\");\n\n                if (plantsArray && count > 0)\n                {\n                    int newPlantIndex = count - 1;\n                    OBJECT *newPlantData = plantsArray->GetObject(newPlantIndex);\n\n                    if (newPlantData)\n                    {\n                        auto setAgeMethod = newPlantData->Class()->Method(SET_PLANT_AGE_METHOD, 1);\n                        if (setAgeMethod)\n                        {\n                            auto SetPlantAge = setAgeMethod->FindFunction<SetPlantAge_t>();\n                            SetPlantAge(newPlantData, 3);\n                        }\n                        newPlantData->SetValue(FACING_FIELD, &g_PlantCommand.direction);\n                        PlacePottedPlant(zenGarden, newPlantIndex);\n                        std::cout << \"[+] Plant added to Zen Garden: ID=\" << g_PlantCommand.plantID << \" Direction=\" << g_PlantCommand.direction << \"\\n\";\n                    }\n                }\n            }\n        }\n    }\n}\n\nvoid HandleInstantWin(void *boardInstance)\n{\n    OBJECT *board = (OBJECT *)boardInstance;\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n    auto boardClass = ns->Class(BOARD_CLASS);\n\n    auto completeField = boardClass->Field(LEVEL_COMPLETE_FIELD);\n    if (!completeField)\n        return;\n\n    bool won = true;\n    completeField->SetValue(board, &won);\n    std::cout << \"[+] Level Complete set to TRUE\\n\";\n}\n\nvoid HandleZombieSpawn(void *boardInstance)\n{\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n    auto boardClass = ns->Class(BOARD_CLASS);\n\n    auto addZombieMethod = boardClass->Method(ADD_ZOMBIE_ROW_METHOD, 4);\n    if (!addZombieMethod)\n        return;\n    auto AddZombieInRow = addZombieMethod->FindFunction<AddZombieInRow_t>();\n    if (!AddZombieInRow)\n        return;\n\n    int zombieType = g_ZombieCommand.type;\n    int row = g_ZombieCommand.row;\n    bool isEveryRow = g_ZombieCommand.isEveryRow;\n    int fromWave = 0;\n    bool shakeBrush = true;\n\n    if (isEveryRow)\n    {\n        auto getRowsMethod = boardClass->Method(GET_NUM_ROWS_METHOD, 0);\n        if (!getRowsMethod)\n            return;\n        auto GetNumRows = getRowsMethod->FindFunction<GetNumRows_t>();\n        if (!GetNumRows)\n            return;\n        for (int r = 0; r < GetNumRows(boardInstance); r++)\n        {\n            AddZombieInRow(boardInstance, zombieType, r, fromWave, shakeBrush);\n            std::cout << \"[+] Zombie Spawned: ID=\" << zombieType << \" Row=\" << r << \"\\n\";\n        }\n    }\n    else\n    {\n        AddZombieInRow(boardInstance, zombieType, row, fromWave, shakeBrush);\n        std::cout << \"[+] Zombie Spawned: ID=\" << zombieType << \" Row=\" << row << \"\\n\";\n    }\n}\n\nvoid HandleFullScreenJalapeno(void *boardInstance)\n{\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n    auto boardClass = ns->Class(BOARD_CLASS);\n\n    auto newPlantMethod = boardClass->Method(NEW_PLANT_METHOD, 4);\n    if (!newPlantMethod)\n        return;\n    auto NewPlant = newPlantMethod->FindFunction<NewPlant_t>();\n    if (!NewPlant)\n        return;\n\n    int jalapenoType = 20;\n    int imitaterType = -1;\n\n    for (int x = 0; x < 9; x++)\n    {\n        for (int y = 0; y < 6; y++)\n        {\n            NewPlant(boardInstance, x, y, jalapenoType, imitaterType);\n        }\n    }\n    std::cout << \"[+] Full screen Jalapeno triggered.\\n\";\n}\n\n/** Main game thread hook - processes command queue */\nvoid Detour_UpdateGame(void *instance)\n{\n    if (update_hook && update_hook->get_original<UpdateGame_t>())\n    {\n        update_hook->get_original<UpdateGame_t>()(instance);\n    }\n\n    if (g_PlantCommand.active)\n    {\n        g_PlantCommand.active = false;\n        HandlePlantSpawn(instance);\n    }\n\n    if (g_InstantWinCommand)\n    {\n        g_InstantWinCommand = false;\n        HandleInstantWin(instance);\n    }\n\n    if (g_ZombieCommand.active)\n    {\n        g_ZombieCommand.active = false;\n        HandleZombieSpawn(instance);\n    }\n\n    if (g_JalapenoCommand)\n    {\n        g_JalapenoCommand = false;\n        HandleFullScreenJalapeno(instance);\n    }\n}\n\n/** Initialize IL2CPP hooks and methods */\nbool InitializeIL2CPP()\n{\n    if (g_IsInitialized)\n        return true;\n\n    MEMORY memory;\n    if (!IL2CPP::Initialize(memory))\n    {\n        std::cout << \"[!] Failed to initialize IL2CPP.\\n\";\n        return false;\n    }\n\n    IL2CPP::Attach();\n\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    if (!assembly)\n    {\n        std::cout << \"[!] Failed to find assembly: \" << GAME_ASSEMBLY << \"\\n\";\n        return false;\n    }\n\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n    if (!ns)\n    {\n        std::cout << \"[!] Failed to find namespace: \" << GAME_NAMESPACE << \"\\n\";\n        return false;\n    }\n\n    auto updateClass = ns->Class(BOARD_CLASS);\n    if (updateClass)\n    {\n        auto updateMethod = updateClass->Method(UPDATE_METHOD, 0);\n        if (updateMethod)\n        {\n            update_hook = updateMethod->Hook<UpdateGame_t>(memory, Detour_UpdateGame);\n        }\n        else\n        {\n            std::cout << \"[!] Failed to find method for update hook: \" << UPDATE_METHOD << \"\\n\";\n            return false;\n        }\n    }\n    else\n    {\n        std::cout << \"[!] Failed to find class for update hook: \" << BOARD_CLASS << \"\\n\";\n        return false;\n    }\n\n    g_IsInitialized = true;\n    std::cout << \"[+] IL2CPP initialization complete!\\n\";\n    return true;\n}\n\n/** Send a string response back to the trainer through shared memory */\nextern \"C\" __declspec(dllexport) void SendResponse(const char *message)\n{\n    if (!message)\n        return;\n\n    DWORD procId = GetCurrentProcessId();\n    char mappingName[256];\n    char eventName[256];\n\n    snprintf(mappingName, sizeof(mappingName), \"IL2CppResponseSharedMemory_%lu\", procId);\n    snprintf(eventName, sizeof(eventName), \"IL2CppResponseEvent_%lu\", procId);\n\n    // Open the shared memory file mapping created by trainer\n    HANDLE hMapFile = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, mappingName);\n    if (!hMapFile)\n    {\n        std::cerr << \"[!] Failed to open shared memory: \" << mappingName << \"\\n\";\n        return;\n    }\n\n    // Map the file view\n    LPVOID pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024 * 1024);\n    if (!pBuf)\n    {\n        std::cerr << \"[!] Failed to map view of file.\\n\";\n        CloseHandle(hMapFile);\n        return;\n    }\n\n    // Write the response: [length][data...]\n    size_t msgLen = strlen(message);\n    if (msgLen > 1024 * 1024 - sizeof(size_t))\n    {\n        std::cerr << \"[!] Message too large for response buffer.\\n\";\n        UnmapViewOfFile(pBuf);\n        CloseHandle(hMapFile);\n        return;\n    }\n\n    memcpy(pBuf, &msgLen, sizeof(size_t));\n    memcpy(static_cast<char *>(pBuf) + sizeof(size_t), message, msgLen);\n\n    // Open the event and signal it\n    HANDLE hEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, eventName);\n    if (hEvent)\n    {\n        SetEvent(hEvent);\n        CloseHandle(hEvent);\n        std::cout << \"[+] Response sent: \" << message << \"\\n\";\n    }\n    else\n    {\n        std::cerr << \"[!] Failed to open response event: \" << eventName << \"\\n\";\n    }\n\n    // Cleanup\n    UnmapViewOfFile(pBuf);\n    CloseHandle(hMapFile);\n}\n\nextern \"C\" __declspec(dllexport) void GetPlantList()\n{\n    if (!InitializeIL2CPP())\n        return;\n\n    std::stringstream ss;\n\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n    auto enumClass = ns->Class(SEEDTYPE_ENUM);\n\n    if (enumClass)\n    {\n        void *iter = nullptr;\n        FieldInfo *field = nullptr;\n\n        while ((field = IL2CPP::API::il2cpp_class_get_fields(enumClass, &iter)))\n        {\n            const char *fieldName = IL2CPP::API::il2cpp_field_get_name(field);\n\n            // Skip internal value field\n            if (strcmp(fieldName, \"value__\") == 0)\n                continue;\n\n            int32_t value = 0;\n            IL2CPP::API::il2cpp_field_static_get_value(field, &value);\n\n            // Plants are 0-52 (40+ are not plantable)\n            if (value >= 0 && value <= 39)\n            {\n                ss << value << \">\" << fieldName << \"\\n\";\n            }\n        }\n    }\n    else\n    {\n        ss << \"\";\n    }\n\n    SendResponse(ss.str().c_str());\n}\n\nextern \"C\" __declspec(dllexport) void GetZombieList()\n{\n    if (!InitializeIL2CPP())\n        return;\n\n    std::stringstream ss;\n\n    auto assembly = IL2CPP::Assembly(GAME_ASSEMBLY);\n    auto ns = assembly->Namespace(GAME_NAMESPACE);\n    auto enumClass = ns->Class(ZOMBIETYPE_ENUM);\n\n    if (enumClass)\n    {\n        void *iter = nullptr;\n        FieldInfo *field = nullptr;\n\n        while ((field = IL2CPP::API::il2cpp_class_get_fields(enumClass, &iter)))\n        {\n            const char *fieldName = IL2CPP::API::il2cpp_field_get_name(field);\n\n            // Skip the internal value field generated by IL2CPP\n            if (strcmp(fieldName, \"value__\") == 0)\n                continue;\n\n            int32_t value = 0;\n            IL2CPP::API::il2cpp_field_static_get_value(field, &value);\n\n            // Zombies are 0-35\n            if (value >= 0 && value <= 35)\n            {\n                ss << value << \">\" << fieldName << \"\\n\";\n            }\n        }\n    }\n    else\n    {\n        ss << \"\";\n    }\n\n    SendResponse(ss.str().c_str());\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI InstantCompleteLevel(LPVOID lpParam)\n{\n    if (!InitializeIL2CPP())\n        return 0;\n\n    g_InstantWinCommand = true;\n    std::cout << \"[+] Command queued: Instant Win\\n\";\n    return 1;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI SpawnZombie(LPVOID lpParam)\n{\n    SpawnZombieArgs *args = (SpawnZombieArgs *)lpParam;\n    if (!args || !InitializeIL2CPP())\n        return 0;\n\n    g_ZombieCommand.type = args->type;\n    g_ZombieCommand.row = args->row;\n    g_ZombieCommand.isEveryRow = args->isEveryRow;\n    g_ZombieCommand.active = true;\n\n    std::cout << \"[+] Command queued: Spawn Zombie ID=\" << args->type << \" Row=\" << args->row << \"\\n\";\n    return 1;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI FullScreenJalapeno(LPVOID lpParam)\n{\n    if (!InitializeIL2CPP())\n        return 0;\n\n    g_JalapenoCommand = true;\n    std::cout << \"[+] Command queued: Full Screen Jalapeno\\n\";\n    return 1;\n}\n\nextern \"C\" __declspec(dllexport) DWORD WINAPI AddPlantToGarden(LPVOID lpParam)\n{\n    PlantArgs *args = (PlantArgs *)lpParam;\n    if (!args || !InitializeIL2CPP())\n        return 0;\n\n    g_PlantCommand.plantID = args->plantID;\n    g_PlantCommand.direction = args->direction;\n    g_PlantCommand.active = true;\n\n    std::cout << \"[+] Plant command queued: ID=\" << args->plantID << \" Direction=\" << args->direction << \"\\n\";\n    return 1;\n}\n\nDWORD WINAPI MainThread(HMODULE hModule)\n{\n#ifdef _DEBUG\n    AllocConsole();\n    freopen_s((FILE **)(stdout), \"CONOUT$\", \"w\", stdout);\n#endif\n    return 0;\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n    switch (ul_reason_for_call)\n    {\n    case DLL_PROCESS_ATTACH:\n        DisableThreadLibraryCalls(hModule);\n        CreateThread(nullptr, NULL, (LPTHREAD_START_ROUTINE)MainThread, hModule, NULL, nullptr);\n        break;\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\nstatic Fl_Window *plant_list_window = nullptr;\nstatic Fl_Window *zombie_list_window = nullptr;\nstatic Fl_Check_Button *g_direction_check_button = nullptr;\nstatic Fl_Input *g_spawn_row_input = nullptr;\nstatic Fl_Check_Button *g_spawn_every_row_check_button = nullptr;\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    bool status = true;\n\n    if (optionName == \"AddPlantToGarden\")\n    {\n        int plantID = 0;\n        int direction = 0;\n\n        if (input && input->value())\n            plantID = std::stoi(input->value());\n\n        if (g_direction_check_button)\n            direction = g_direction_check_button->value() ? 1 : 0;\n\n        status = trainer->addPlantToGarden(plantID, direction);\n    }\n    else if (optionName == \"InstantCompleteLevel\")\n    {\n        status = trainer->instantCompleteLevel();\n    }\n    else if (optionName == \"SpawnZombie\")\n    {\n        int zombieType = 0;\n        int row = 0;\n        bool isEveryRow = false;\n\n        if (input && input->value())\n            zombieType = std::stoi(input->value());\n\n        if (g_spawn_row_input && g_spawn_row_input->value())\n            row = std::stoi(g_spawn_row_input->value()) - 1;\n\n        if (g_spawn_every_row_check_button)\n            isEveryRow = g_spawn_every_row_check_button->value() != 0;\n\n        status = trainer->spawnZombie(zombieType, row, isEveryRow);\n    }\n    else if (optionName == \"FullScreenJalapeno\")\n    {\n        status = trainer->fullScreenJalapeno();\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n        inputValue = input->value();\n\n    if (optionName == \"NoPlantCooldown\")\n    {\n        if (button->value())\n            status = trainer->noPlantCooldown();\n        else\n            status = trainer->disableNamedHook(optionName);\n    }\n    else if (optionName == \"NoPlantCost\")\n    {\n        if (button->value())\n            status = trainer->noPlantCost();\n        else\n            status = trainer->disableNamedHook(\"NoPlantCost1\") && trainer->disableNamedHook(\"NoPlantCost2\") && trainer->disableNamedHook(\"NoPlantCost3\");\n    }\n    else if (optionName == \"AddSun\")\n    {\n        if (button->value())\n            status = trainer->addSun(std::stoi(inputValue));\n        else\n            status = trainer->disableNamedHook(optionName);\n    }\n    else if (optionName == \"SetCoin\")\n    {\n        if (button->value())\n            status = trainer->setCoin(std::stoi(inputValue) / 10);\n        else\n            status = trainer->disableNamedHook(optionName);\n    }\n    else if (optionName == \"SetFertilizerAndBugSpray\")\n    {\n        if (button->value())\n            status = trainer->setFertilizerAndBugSpray(std::stoi(inputValue) + 1000);\n        else\n            status = trainer->disableNamedHook(\"SetFertilizerAndBugSprayInc\") && trainer->disableNamedHook(\"SetFertilizerDec\") && trainer->disableNamedHook(\"SetBugSprayDec\");\n    }\n    else if (optionName == \"SetChocolate\")\n    {\n        if (button->value())\n            status = trainer->setChocolate(std::stoi(inputValue) + 1000);\n        else\n            status = trainer->disableNamedHook(\"SetChocolateInc\") && trainer->disableNamedHook(\"SetChocolateDec\");\n    }\n    else if (optionName == \"SetTreeFood\")\n    {\n        if (button->value())\n            status = trainer->setTreeFood(std::stoi(inputValue) + 1000);\n        else\n            status = trainer->disableNamedHook(\"TreeFoodInc\") && trainer->disableNamedHook(\"TreeFoodDec\");\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    if (plant_list_window)\n    {\n        Fl::delete_widget(plant_list_window);\n        plant_list_window = nullptr;\n    }\n    if (zombie_list_window)\n    {\n        Fl::delete_widget(zombie_list_window);\n        zombie_list_window = nullptr;\n    }\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Plants vs. Zombies: Replanted Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    DWORD info_img_size = 0;\n    const unsigned char *info_img_data = load_resource(\"INFO_IMG\", info_img_size);\n    Fl_PNG_Image *info_img = new Fl_PNG_Image(nullptr, info_img_data, (int)info_img_size);\n    info_img->scale(20, 20, 1, 0);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + UI_LEFT_MARGIN;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + UI_LEFT_MARGIN);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // Widget Placements\n    place_toggle_widget(options1_flex, &trainer, \"NoPlantCooldown\", \"No Plant Cooldown\");\n\n    place_toggle_widget(options1_flex, &trainer, \"NoPlantCost\", \"No Plant Cost\");\n\n    place_toggle_widget(options1_flex, &trainer, \"AddSun\", \"Add Sun\", nullptr, \"999\", \"0\", \"9990\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetCoin\", \"Set Coins\", nullptr, \"9999999\", \"0\", \"999999990\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetFertilizerAndBugSpray\", \"Set Fertilizer and Bug Spray\", nullptr, \"99\", \"0\", \"999999999\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetChocolate\", \"Set Chocolate\", nullptr, \"99\", \"0\", \"999999999\");\n\n    place_toggle_widget(options1_flex, &trainer, \"SetTreeFood\", \"Set Tree Food\", nullptr, \"99\", \"0\", \"999999999\");\n\n    Fl_Input *add_plant_input = nullptr;\n    std::vector<std::string> plant_columns = {\"Plant ID\", \"Plant Name\"};\n    Fl_Button *plant_info = create_info_button(&trainer, &add_plant_input, plant_columns, \"Plant List\", &plant_list_window, &Trainer::getPlantList, info_img);\n    place_apply_widget(options1_flex, &trainer, \"AddPlantToGarden\", \"Add Plant to Garden\", &add_plant_input, \"0\", \"0\", \"39\", FL_INT_INPUT, plant_info);\n    g_direction_check_button = dynamic_cast<Fl_Check_Button *>(place_indented_toggle_widget(options1_flex, \"Facing Left\").button);\n\n    Fl_Input *spawn_zombie_input = nullptr;\n    std::vector<std::string> zombie_columns = {\"Zombie ID\", \"Zombie Name\"};\n    Fl_Button *zombie_info = create_info_button(&trainer, &spawn_zombie_input, zombie_columns, \"Zombie List\", &zombie_list_window, &Trainer::getZombieList, info_img);\n    place_apply_widget(options1_flex, &trainer, \"SpawnZombie\", \"Spawn Zombie\", &spawn_zombie_input, \"0\", \"0\", \"99\", FL_INT_INPUT, zombie_info);\n    g_spawn_row_input = place_indented_input_widget(options1_flex, \"Which Row\", \"1\", \"1\", \"6\");\n    g_spawn_every_row_check_button = dynamic_cast<Fl_Check_Button *>(place_indented_toggle_widget(options1_flex, \"Spawn in Every Row\").button);\n\n    place_apply_widget(options1_flex, &trainer, \"FullScreenJalapeno\", \"Full Screen Jalapeno\");\n\n    place_apply_widget(options1_flex, &trainer, \"InstantCompleteLevel\", \"Instant Complete Level\");\n\n    // End of Option Column 1\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nINFO_IMG RCDATA \"../../common/assets/info.png\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\"\nIL2CPP_DLL RCDATA \"IL2CPP.dll\""
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"Il2CppBase.h\"\n\nclass Trainer : public Il2CppBase\n{\npublic:\n    Trainer() : Il2CppBase(L\"Replanted.exe\") {} // x64\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"GameAssembly.dll\";\n\n    inline bool noPlantCooldown()\n    {\n        const std::vector<std::string> pat = {\"0F\", \"85\", \"25\", \"04\", \"00\", \"00\", \"48\", \"8B\", \"43\"};\n        size_t patchOffset = 1;\n\n        // JNE -> JE\n        const std::vector<BYTE> newBytes = {0x84};\n\n        return createBytePatch(moduleName, \"NoPlantCooldown\", pat, patchOffset, newBytes);\n    }\n\n    inline bool noPlantCost()\n    {\n        bool hook1_success = false;\n        {\n            // Changes 'jle' (7E) to 'jmp' (EB) to make the cost check always pass.\n            const std::vector<std::string> pat = {\"7E\", \"??\", \"48\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"48\", \"??\", \"??\", \"0F\", \"??\", \"??\", \"??\", \"??\", \"??\", \"4C\", \"??\", \"??\", \"??\", \"4D\", \"??\", \"??\", \"0F\", \"??\", \"??\", \"??\", \"??\", \"??\", \"48\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"B9\", \"??\", \"??\", \"??\", \"??\", \"41\", \"??\", \"??\", \"??\", \"??\", \"??\"};\n            size_t patchOffset = 0;\n            const std::vector<BYTE> newBytes = {0xEB}; // EB = jmp\n\n            hook1_success = createBytePatch(moduleName, \"NoPlantCost1\", pat, patchOffset, newBytes);\n        }\n\n        bool hook2_success = false;\n        {\n            // Changes 'setle al' (0F 9E C0) to 'mov al, 1; nop' (B0 01 90).\n            const std::vector<std::string> pat = {\"0F\", \"??\", \"??\", \"48\", \"??\", \"??\", \"??\", \"5F\", \"C3\", \"E8\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"48\", \"??\", \"??\", \"??\", \"??\", \"57\", \"48\", \"??\", \"??\", \"??\", \"80\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"8B\", \"??\"};\n            size_t patchOffset = 0;\n            const std::vector<BYTE> newBytes = {0xB0, 0x01, 0x90}; // mov al, 1; nop\n\n            hook2_success = createBytePatch(moduleName, \"NoPlantCost2\", pat, patchOffset, newBytes);\n        }\n\n        bool hook3_success = false;\n        {\n            // Changes 'sub [rax+10],r13d' (44 29 68 10) to 'nop's.\n            // This prevents the sun cost from being subtracted from your total.\n            const std::vector<std::string> pat = {\"44\", \"??\", \"??\", \"??\", \"44\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"??\", \"41\", \"??\", \"??\", \"??\", \"??\", \"??\", \"41\", \"??\", \"??\", \"48\", \"??\", \"??\", \"??\", \"??\"};\n            size_t patchOffset = 0;\n            const std::vector<BYTE> newBytes = {0x90, 0x90, 0x90, 0x90}; // 4 NOPs\n\n            hook3_success = createBytePatch(moduleName, \"NoPlantCost3\", pat, patchOffset, newBytes);\n        }\n\n        return hook1_success && hook2_success && hook3_success;\n    }\n\n    inline bool addSun(int newVal)\n    {\n        // Target instruction bytes: 01 70 10 48 8B 8B E0 01 00 00\n        const std::vector<std::string> pat = {\"01\", \"70\", \"10\", \"48\", \"8B\", \"8B\", \"E0\", \"01\", \"00\", \"00\"};\n        size_t patternOffset = 0;\n        size_t overwriteLen = 10; // 3 bytes (add) + 7 bytes (mov)\n        size_t codeSize = 0x100;\n\n        auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            const size_t dataOffset = 0x80;\n            std::vector<BYTE> code(codeSize, 0x90);\n\n            // --- DATA SECTION ---\n            // We need to store our newVal in the data section to be loaded\n            std::memcpy(&code[dataOffset], &newVal, sizeof(int));\n            uintptr_t dataAbsoluteAddr = codeCaveAddr + dataOffset;\n\n            // --- CODE SECTION ---\n            size_t wPos = 0;\n\n            // 1. mov esi, [rip + rel32] => 8B 35 <rel32>\n            code[wPos++] = 0x8B;\n            code[wPos++] = 0x35;\n            int32_t rel32 = static_cast<int32_t>(dataAbsoluteAddr - (codeCaveAddr + wPos + 4));\n            std::memcpy(&code[wPos], &rel32, 4);\n            wPos += 4;\n\n            // 2. Copy all original instructions\n            std::memcpy(&code[wPos], originalBytes.data(), originalBytes.size());\n            wPos += originalBytes.size();\n\n            // 3. jmp <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t returnAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n            int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n            std::memcpy(&code[wPos], &relativeJump, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(nullptr, \"AddSun\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    inline bool setFertilizerAndBugSpray(int newVal)\n    {\n        bool hook1_success = false;\n        {\n            // Hook 1: Replaces 'add dword ptr [rcx+rdi*4+20],05'\n            const std::vector<std::string> pat = {\"83\", \"44\", \"B9\", \"20\", \"05\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 5;\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // 1. mov dword ptr [rcx+rdi*4+20], newVal => C7 44 B9 20 <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x44;\n                code[wPos++] = 0xB9;\n                code[wPos++] = 0x20;\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 2. jmp <rel32>\n                code[wPos++] = 0xE9;\n                uintptr_t returnAddr = hookAddr + overwriteLen;\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n                std::memcpy(&code[wPos], &relativeJump, 4);\n                wPos += 4;\n                return code;\n            };\n            // Use one, shared hook name for the 'increase' function\n            hook1_success = createNamedHook(nullptr, \"SetFertilizerAndBugSprayInc\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        bool hook2_success = false;\n        {\n            // Hook 2: Replaces 'dec [rax+58]' and 'xor edx,edx' (Fertilizer Decrease)\n            const std::vector<std::string> pat = {\"FF\", \"48\", \"58\", \"33\", \"D2\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 5;\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // 1. mov dword ptr [rax+58], newVal => C7 40 58 <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x40;\n                code[wPos++] = 0x58;\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 2. Add back the 'xor edx,edx' (33 D2) we overwrote\n                code[wPos++] = 0x33;\n                code[wPos++] = 0xD2;\n\n                // 3. jmp <rel32> back to the *next* instruction after the xor\n                code[wPos++] = 0xE9;\n                uintptr_t returnAddr = hookAddr + overwriteLen; // Jumps to ...6F36AF\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n                std::memcpy(&code[wPos], &relativeJump, 4);\n                wPos += 4;\n                return code;\n            };\n            hook2_success = createNamedHook(nullptr, \"SetFertilizerDec\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        bool hook3_success = false;\n        {\n            // Hook 3: Replaces 'dec [rax+5C]' and 'jmp ...' (BugSpray Decrease)\n            const std::vector<std::string> pat = {\"FF\", \"48\", \"5C\", \"E9\", \"06\", \"01\", \"00\", \"00\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 8;\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // 1. mov dword ptr [rax+5C], newVal => C7 40 5C <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x40;\n                code[wPos++] = 0x5C;\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 2. The original jmp went to 'xor edx,edx'. We add that back.\n                code[wPos++] = 0x33;\n                code[wPos++] = 0xD2;\n\n                // 3. We now need to find where the 'xor' would have continued to.\n                //    The 'xor' was at ...6F36AD. The instruction after it is at ...6F36AF.\n                //    We must jump to ...6F36AF.\n\n                // 4. Get the original jmp's target (...6F36AD)\n                int32_t original_rel32;\n                std::memcpy(&original_rel32, &originalBytes[4], 4);\n                uintptr_t originalJmpNextInstr = hookAddr + overwriteLen;\n                uintptr_t jmpTargetAddr = originalJmpNextInstr + original_rel32; // ...6F36AD\n\n                // 5. Calculate the *real* target, which is 2 bytes after the jmp's target\n                uintptr_t absoluteTargetAddr = jmpTargetAddr + 2; // ...6F36AF\n\n                // 6. jmp <new_rel32>\n                code[wPos++] = 0xE9;\n                uintptr_t newJmpNextInstr = codeCaveAddr + wPos + 4;\n                int32_t new_rel32 = static_cast<int32_t>(absoluteTargetAddr - newJmpNextInstr);\n                std::memcpy(&code[wPos], &new_rel32, 4);\n                wPos += 4;\n                return code;\n            };\n            hook3_success = createNamedHook(nullptr, \"SetBugSprayDec\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        return hook1_success && hook2_success && hook3_success;\n    }\n\n    inline bool setChocolate(int newVal)\n    {\n        bool hook1_success = false;\n        {\n            // Hook 1: Replaces 'inc [rax+00000088]'\n            const std::vector<std::string> pat = {\"FF\", \"80\", \"88\", \"00\", \"00\", \"00\", \"C7\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 6; // Length of the 'inc' instruction\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                // No data section needed\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // --- CODE SECTION ---\n                // 1. mov dword ptr [rax+00000088], newVal => C7 80 88 00 00 00 <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x80; // ModR/M for [rax + disp32]\n                code[wPos++] = 0x88; // The offset +88\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n\n                // 2. Copy newVal (our 4-byte immediate value)\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 3. jmp <rel32>\n                code[wPos++] = 0xE9;\n                uintptr_t returnAddr = hookAddr + overwriteLen;\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n                std::memcpy(&code[wPos], &relativeJump, 4);\n                wPos += 4;\n\n                return code;\n            };\n            hook1_success = createNamedHook(nullptr, \"SetChocolateInc\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        bool hook2_success = false;\n        {\n            // Hook 2: Replaces 'dec [rax+00000088]'\n            const std::vector<std::string> pat = {\"FF\", \"88\", \"88\", \"00\", \"00\", \"00\", \"33\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 6; // Length of the 'dec' instruction\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                // No data section needed\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // --- CODE SECTION ---\n                // 1. mov dword ptr [rax+00000088], newVal => C7 80 88 00 00 00 <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x80; // ModR/M for [rax + disp32]\n                code[wPos++] = 0x88; // The offset +88\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n\n                // 2. Copy newVal (our 4-byte immediate value)\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 3. jmp <rel32>\n                code[wPos++] = 0xE9;\n                uintptr_t returnAddr = hookAddr + overwriteLen;\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n                std::memcpy(&code[wPos], &relativeJump, 4);\n                wPos += 4;\n\n                return code;\n            };\n            hook2_success = createNamedHook(nullptr, \"SetChocolateDec\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        return hook1_success && hook2_success;\n    }\n\n    inline bool setTreeFood(int newVal)\n    {\n        bool hook1_success = false;\n        {\n            const std::vector<std::string> pat = {\"FF\", \"80\", \"90\", \"00\", \"00\", \"00\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 6;\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                // No data section needed\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // --- CODE SECTION ---\n                // 1. mov dword ptr [rax+00000090], newVal => C7 80 90 00 00 00 <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x80;\n                code[wPos++] = 0x90;\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n\n                // 2. Copy newVal (our 4-byte immediate value)\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 3. jmp <rel32>\n                code[wPos++] = 0xE9;\n                uintptr_t returnAddr = hookAddr + overwriteLen;\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n                std::memcpy(&code[wPos], &relativeJump, 4);\n                wPos += 4;\n\n                return code;\n            };\n            hook1_success = createNamedHook(nullptr, \"TreeFoodInc\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        bool hook2_success = false;\n        {\n            const std::vector<std::string> pat = {\"FF\", \"88\", \"90\", \"00\", \"00\", \"00\", \"48\", \"8B\", \"4B\"};\n            size_t patternOffset = 0;\n            size_t overwriteLen = 6;\n            size_t codeSize = 0x100;\n\n            auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n            {\n                // No data section needed\n                std::vector<BYTE> code(codeSize, 0x90);\n                size_t wPos = 0;\n\n                // --- CODE SECTION ---\n                // 1. mov dword ptr [rax+00000090], newVal => C7 80 90 00 00 00 <imm32>\n                code[wPos++] = 0xC7;\n                code[wPos++] = 0x80;\n                code[wPos++] = 0x90;\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n                code[wPos++] = 0x00;\n\n                // 2. Copy newVal (our 4-byte immediate value)\n                std::memcpy(&code[wPos], &newVal, 4);\n                wPos += 4;\n\n                // 3. jmp <rel32>\n                code[wPos++] = 0xE9;\n                uintptr_t returnAddr = hookAddr + overwriteLen;\n                uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n                int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n                std::memcpy(&code[wPos], &relativeJump, 4);\n                wPos += 4;\n\n                return code;\n            };\n\n            hook2_success = createNamedHook(nullptr, \"TreeFoodDec\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n        }\n\n        return hook1_success && hook2_success;\n    }\n\n    inline bool setCoin(int newVal)\n    {\n        // Target instruction bytes: 01 58 50 48 83 C4 20\n        const std::vector<std::string> pat = {\"01\", \"58\", \"50\", \"48\", \"83\", \"C4\", \"20\"};\n        size_t patternOffset = 0;\n        size_t overwriteLen = 7;\n        size_t codeSize = 0x100;\n\n        auto buildFunc = [newVal, overwriteLen, codeSize](uintptr_t codeCaveAddr, uintptr_t hookAddr, const std::vector<BYTE> &originalBytes) -> std::vector<BYTE>\n        {\n            // No data section needed\n            std::vector<BYTE> code(codeSize, 0x90);\n            size_t wPos = 0;\n\n            // --- CODE SECTION ---\n            // 1. mov dword ptr [rax+50], newVal => C7 40 50 <imm32>\n            code[wPos++] = 0xC7;\n            code[wPos++] = 0x40;\n            code[wPos++] = 0x50;\n\n            // 2. Copy newVal\n            std::memcpy(&code[wPos], &newVal, 4);\n            wPos += 4;\n\n            // 3. Copy the second original instruction (add rsp,20)\n            std::memcpy(&code[wPos], &originalBytes[3], 4);\n            wPos += 4;\n\n            // 4. jmp <rel32>\n            code[wPos++] = 0xE9;\n            uintptr_t returnAddr = hookAddr + overwriteLen;\n            uintptr_t nextInstrAddr = codeCaveAddr + wPos + 4;\n            int32_t relativeJump = static_cast<int32_t>(returnAddr - nextInstrAddr);\n            std::memcpy(&code[wPos], &relativeJump, 4);\n            wPos += 4;\n\n            return code;\n        };\n\n        return createNamedHook(nullptr, \"SetCoin\", pat, patternOffset, overwriteLen, codeSize, buildFunc);\n    }\n\n    std::string getPlantList()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethodReturn(\"GetPlantList\");\n        }\n        return \"\";\n    }\n\n    bool addPlantToGarden(int plantID, int direction = 0)\n    {\n        if (initializeDllInjection())\n        {\n            struct PlantArgs\n            {\n                int plantID;\n                int direction; // 0 = Right, 1 = Left\n            };\n            PlantArgs args = {plantID, direction};\n            return invokeMethod<PlantArgs>(\"AddPlantToGarden\", args);\n        }\n        return false;\n    }\n\n    bool instantCompleteLevel()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"InstantCompleteLevel\");\n        }\n        return false;\n    }\n\n    std::string getZombieList()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethodReturn(\"GetZombieList\");\n        }\n        return \"\";\n    }\n\n    bool spawnZombie(int zombieType, int row, bool isEveryRow = false)\n    {\n        if (initializeDllInjection())\n        {\n            struct ZombieArgs\n            {\n                int type;\n                int row;\n                bool isEveryRow;\n            };\n            ZombieArgs args = {zombieType, row, isEveryRow};\n            return invokeMethod<ZombieArgs>(\"SpawnZombie\", args);\n        }\n        return false;\n    }\n\n    bool fullScreenJalapeno()\n    {\n        if (initializeDllInjection())\n        {\n            return invokeMethod(\"FullScreenJalapeno\");\n        }\n        return false;\n    }\n};"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/translation_extra.txt",
    "content": "0>Peashooter\n1>Sunflower\n2>Cherrybomb\n3>Wallnut\n4>Potatomine\n5>Snowpea\n6>Chomper\n7>Repeater\n8>Puffshroom\n9>Sunshroom\n10>Fumeshroom\n11>Gravebuster\n12>Hypnoshroom\n13>Scaredyshroom\n14>Iceshroom\n15>Doomshroom\n16>Lilypad\n17>Squash\n18>Threepeater\n19>Tanglekelp\n20>Jalapeno\n21>Spikeweed\n22>Torchwood\n23>Tallnut\n24>Seashroom\n25>Plantern\n26>Cactus\n27>Blover\n28>Splitpea\n29>Starfruit\n30>Pumpkinshell\n31>Magnetshroom\n32>Cabbagepult\n33>Flowerpot\n34>Kernelpult\n35>InstantCoffee\n36>Garlic\n37>Umbrella\n38>Marigold\n39>Melonpult\n\n0>Normal\n1>Flag\n2>TrafficCone\n3>Polevaulter\n4>Pail\n5>Newspaper\n6>Door\n7>Football\n8>Dancer\n9>BackupDancer\n10>DuckyTube\n11>Snorkel\n12>Zamboni\n13>Bobsled\n14>DolphinRider\n15>JackInTheBox\n16>Balloon\n17>Digger\n18>Pogo\n19>Yeti\n20>Bungee\n21>Ladder\n22>Catapult\n23>Gargantuar\n24>Imp\n25>Boss\n26>PeaHead\n27>WallnutHead\n28>JalapenoHead\n29>GatlingHead\n30>SquashHead\n31>TallnutHead\n32>RedeyeGargantuar\n33>Zombatar\n34>Target\n35>TrashCan"
  },
  {
    "path": "Game Trainers/trainers/Plants vs. Zombies_Replanted Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Plants vs. Zombies: Replanted Trainer\": \"Plants vs. Zombies: Replanted Trainer\",\n        \"No Plant Cooldown\": \"No Plant Cooldown\",\n        \"No Plant Cost\": \"No Plant Cost\",\n        \"Set Coins\": \"Set Coins\",\n        \"Add Sun\": \"Add Sun\",\n        \"Set Fertilizer and Bug Spray\": \"Set Fertilizer and Bug Spray\",\n        \"Set Chocolate\": \"Set Chocolate\",\n        \"Set Tree Food\": \"Set Tree Food\",\n        \"Add Plant to Garden\": \"Add Plant to Garden\",\n        \"Facing Left\": \"Facing Left\",\n        \"Plant List\": \"Plant List\",\n        \"Plant ID\": \"Plant ID\",\n        \"Plant Name\": \"Plant Name\",\n        \"Instant Complete Level\": \"Instant Complete Level\",\n        \"Zombie List\": \"Zombie List\",\n        \"Zombie ID\": \"Zombie ID\",\n        \"Zombie Name\": \"Zombie Name\",\n        \"Spawn Zombie\": \"Spawn Zombie\",\n        \"Which Row\": \"Which Row\",\n        \"Spawn in Every Row\": \"Spawn in Every Row\",\n        \"Full Screen Jalapeno\": \"Full Screen Jalapeno\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Plants vs. Zombies: Replanted Trainer\": \"植物大战僵尸：重植版修改器\",\n        \"No Plant Cooldown\": \"植物无冷却\",\n        \"No Plant Cost\": \"植物 0 阳光\",\n        \"Set Coins\": \"设置金币\",\n        \"Add Sun\": \"添加阳光\",\n        \"Set Fertilizer and Bug Spray\": \"设置肥料和杀虫剂\",\n        \"Set Chocolate\": \"设置巧克力\",\n        \"Set Tree Food\": \"设置树肥\",\n        \"Add Plant to Garden\": \"向花园添加植物\",\n        \"Facing Left\": \"向左朝向\",\n        \"Plant List\": \"植物列表\",\n        \"Plant ID\": \"植物 ID\",\n        \"Plant Name\": \"植物名称\",\n        \"Instant Complete Level\": \"立即完成关卡\",\n        \"Zombie List\": \"僵尸列表\",\n        \"Zombie ID\": \"僵尸 ID\",\n        \"Zombie Name\": \"僵尸名称\",\n        \"Spawn Zombie\": \"生成僵尸\",\n        \"Which Row\": \"第几行\",\n        \"Spawn in Every Row\": \"在每一行生成\",\n        \"Full Screen Jalapeno\": \"全屏火爆辣椒\",\n        \"Peashooter\": \"豌豆射手\",\n        \"Sunflower\": \"向日葵\",\n        \"Cherrybomb\": \"樱桃炸弹\",\n        \"Wallnut\": \"坚果墙\",\n        \"Potatomine\": \"土豆地雷\",\n        \"Snowpea\": \"寒冰射手\",\n        \"Chomper\": \"大嘴花\",\n        \"Repeater\": \"双重射手\",\n        \"Puffshroom\": \"小喷菇\",\n        \"Sunshroom\": \"阳光菇\",\n        \"Fumeshroom\": \"毒泡蘑菇\",\n        \"Gravebuster\": \"咬咬碑\",\n        \"Hypnoshroom\": \"催眠蘑菇\",\n        \"Scaredyshroom\": \"胆小蘑菇\",\n        \"Iceshroom\": \"冰川菇\",\n        \"Doomshroom\": \"末日蘑菇\",\n        \"Lilypad\": \"莲叶\",\n        \"Squash\": \"倭瓜\",\n        \"Threepeater\": \"三重射手\",\n        \"Tanglekelp\": \"缠绕水草\",\n        \"Jalapeno\": \"火爆辣椒\",\n        \"Spikeweed\": \"荆棘草\",\n        \"Torchwood\": \"火炬木\",\n        \"Tallnut\": \"高坚果\",\n        \"Seashroom\": \"水兵菇\",\n        \"Plantern\": \"路灯花\",\n        \"Cactus\": \"仙人掌\",\n        \"Blover\": \"扇叶草\",\n        \"Splitpea\": \"分裂射手\",\n        \"Starfruit\": \"流星果\",\n        \"Pumpkinshell\": \"南瓜\",\n        \"Magnetshroom\": \"磁力菇\",\n        \"Cabbagepult\": \"卷心菜投手\",\n        \"Flowerpot\": \"花盆\",\n        \"Kernelpult\": \"玉米投手\",\n        \"InstantCoffee\": \"咖啡豆\",\n        \"Garlic\": \"大蒜\",\n        \"Umbrella\": \"萝卜伞\",\n        \"Marigold\": \"金盏花\",\n        \"Melonpult\": \"西瓜投手\",\n        \"Normal\": \"僵尸\",\n        \"Flag\": \"旗手僵尸\",\n        \"TrafficCone\": \"交通锥僵尸\",\n        \"Polevaulter\": \"撑杆僵尸\",\n        \"Pail\": \"铁桶僵尸\",\n        \"Newspaper\": \"读报僵尸\",\n        \"Door\": \"纱门僵尸\",\n        \"Football\": \"橄榄球僵尸\",\n        \"Dancer\": \"舞者僵尸\",\n        \"BackupDancer\": \"伴舞僵尸\",\n        \"DuckyTube\": \"鸭子救生圈僵尸\",\n        \"Snorkel\": \"潜水僵尸\",\n        \"Zamboni\": \"雪橇车僵尸\",\n        \"Bobsled\": \"雪橇车僵尸小队\",\n        \"DolphinRider\": \"海豚骑手僵尸\",\n        \"JackInTheBox\": \"玩偶匣僵尸\",\n        \"Balloon\": \"气球僵尸\",\n        \"Digger\": \"矿工僵尸\",\n        \"Pogo\": \"蹦蹦僵尸\",\n        \"Yeti\": \"雪怪僵尸\",\n        \"Bungee\": \"蹦极僵尸\",\n        \"Ladder\": \"梯子僵尸\",\n        \"Catapult\": \"投石车僵尸\",\n        \"Gargantuar\": \"巨人僵尸\",\n        \"Imp\": \"小鬼僵尸\",\n        \"Boss\": \"僵王博士\",\n        \"PeaHead\": \"豌豆射手僵尸\",\n        \"WallnutHead\": \"坚果墙僵尸\",\n        \"JalapenoHead\": \"火爆辣椒僵尸\",\n        \"GatlingHead\": \"机枪豌豆僵尸\",\n        \"SquashHead\": \"倭瓜僵尸\",\n        \"TallnutHead\": \"高坚果僵尸\",\n        \"RedeyeGargantuar\": \"红眼巨人僵尸\",\n        \"Zombatar\": \"僵尸大头贴\",\n        \"Target\": \"靶子僵尸\",\n        \"TrashCan\": \"垃圾桶僵尸\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/PvZ2 Gardendless Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"PvZ2_Gardendless\")\nset(TRAINER_NAME \"PvZ2 Gardendless Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\nadd_custom_target(${SUBSET_FONT_TARGET} ALL DEPENDS ${FONT_SUBSET_OUTPUT})\n\n# Main executable\nadd_executable(${GAME_NAME} main.cpp)\n\n# Link Common (FLTK + Windows libs) plus winhttp for CDP WebSocket\ntarget_link_libraries(${GAME_NAME} PRIVATE Common winhttp ole32 comdlg32 ws2_32)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\n\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME \"${TRAINER_NAME}\"\n)\n\n# Embed Windows resources (icon, logo, translations, font)\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Copy to bin/ output directory\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different\n        \"$<TARGET_FILE:${GAME_NAME}>\"\n        \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)\n"
  },
  {
    "path": "Game Trainers/trainers/PvZ2 Gardendless Trainer/main.cpp",
    "content": "// Uses CDP (Chrome DevTools Protocol) to inject JavaScript into the game's WebView2.\n// The game must be launched through the trainer so the remote debugging port is enabled.\n\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/Fl_Table.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Forward declarations for custom widgets\nstatic Fl_Input *g_game_path_input = nullptr;\n\n// Struct for launch callback data\nstruct LaunchData\n{\n    Trainer *trainer;\n    Fl_Input *pathInput;\n};\n\n// ============================================================\n// Callbacks\n// ============================================================\n\n/// Apply callback — called by all \"Apply\" buttons via FLTKUtils.h\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Input *input = applyData->input;\n\n    if (!trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    bool status = true;\n    std::string val = (input && input->value()[0]) ? input->value() : \"0\";\n\n    if (optionName == \"InstantWin\")\n        status = trainer->instantWin();\n    else if (optionName == \"SetSun\")\n        status = trainer->setSun(val);\n    else if (optionName == \"SetPlantFood\")\n        status = trainer->setPlantFood(val);\n    else if (optionName == \"KillAllZombies\")\n        status = trainer->killAllZombies();\n    else if (optionName == \"UnlockAllPlants\")\n        status = trainer->unlockAllPlants();\n    else if (optionName == \"AddCoins\")\n        status = trainer->addCoins(val);\n    else if (optionName == \"AddGems\")\n        status = trainer->addGems(val);\n    else if (optionName == \"AddWorldKeys\")\n        status = trainer->addWorldKeys(val);\n\n    if (!status)\n        fl_alert(t(\"Failed to activate.\"));\n}\n\n/// Toggle callback — required by FLTKUtils.h forward declaration but unused\nvoid toggle_callback(Fl_Widget *widget, void *data) {}\n\n/// Browse for game executable\nstatic bool browseDialogOpen = false;\n\nstatic void browse_callback(Fl_Widget *widget, void *data)\n{\n    if (browseDialogOpen)\n        return;\n    browseDialogOpen = true;\n\n    LaunchData *launchData = static_cast<LaunchData *>(data);\n\n    wchar_t wpath[MAX_PATH] = {};\n    const char *current = launchData->pathInput->value();\n    if (current && current[0])\n        MultiByteToWideChar(CP_UTF8, 0, current, -1, wpath, MAX_PATH);\n\n    OPENFILENAMEW ofn = {};\n    ofn.lStructSize = sizeof(ofn);\n    ofn.hwndOwner = nullptr;\n    ofn.lpstrFilter = L\"Executables (*.exe)\\0*.exe\\0All Files\\0*.*\\0\";\n    ofn.lpstrFile = wpath;\n    ofn.nMaxFile = MAX_PATH;\n    wchar_t wtitle[256] = {};\n    MultiByteToWideChar(CP_UTF8, 0, t(\"Select Game Executable\"), -1, wtitle, 256);\n    ofn.lpstrTitle = wtitle;\n    ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;\n\n    if (GetOpenFileNameW(&ofn))\n    {\n        char utf8[MAX_PATH * 3] = {};\n        WideCharToMultiByte(CP_UTF8, 0, wpath, -1, utf8, sizeof(utf8), nullptr, nullptr);\n        launchData->pathInput->value(utf8);\n        launchData->trainer->gamePath = utf8;\n        launchData->trainer->saveSettings();\n    }\n\n    browseDialogOpen = false;\n}\n\n/// Launch game with CDP enabled\nstatic void launch_callback(Fl_Widget *widget, void *data)\n{\n    LaunchData *launchData = static_cast<LaunchData *>(data);\n    Trainer *trainer = launchData->trainer;\n\n    // Update game path from input field\n    if (launchData->pathInput && launchData->pathInput->value())\n        trainer->gamePath = launchData->pathInput->value();\n\n    if (trainer->gamePath.empty())\n    {\n        fl_alert(t(\"Please set the game path first.\"));\n        return;\n    }\n\n    if (!trainer->launchGame())\n        fl_alert(t(\"Failed to launch game.\"));\n}\n\n/// Wraps check_process_status to re-assert game path readonly after clean_up.\n/// Also re-registers itself since check_process_status uses repeat_timeout internally.\nstatic void check_process_status_wrapper(void *data)\n{\n    // Remove the repeat that check_process_status will schedule\n    check_process_status(data);\n    Fl::remove_timeout(check_process_status, data);\n\n    if (g_game_path_input)\n        g_game_path_input->readonly(1);\n\n    Fl::repeat_timeout(1.0, check_process_status_wrapper, data);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    if (font_handle)\n        RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ============================================================\n// Main\n// ============================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 650;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"PvZ2 Gardendless Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and CDP Status\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *img_data = load_resource(\"LOGO_IMG\", img_size);\n    if (img_data && img_size > 0)\n    {\n        Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, img_data, (int)img_size);\n        game_img->scale(imageSize.first, imageSize.second, 1, 0);\n        Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n        img_box->image(game_img);\n    }\n\n    // CDP Status (reuses \"Process Name\" / \"Process ID\" labels from FLTKUtils)\n    Fl_Box *process_name = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(UI_LEFT_MARGIN, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status_wrapper, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Right Column: Options\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + UI_LEFT_MARGIN;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + UI_LEFT_MARGIN);\n    int col1_h = window->h() - lang_flex_height;\n    Fl_Flex *options_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options_flex->margin(30, 20, 20, 20);\n    options_flex->gap(8);\n\n    // --- Game Path + Launch (stays at top) ---\n    {\n        Fl_Flex *path_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n        path_flex->gap(5);\n\n        Fl_Box *path_label = new Fl_Box(0, 0, 0, 0);\n        path_flex->fixed(path_label, 80);\n        tr(path_label, \"Game Path:\");\n\n        g_game_path_input = new Fl_Input(0, 0, 0, 0);\n        g_game_path_input->value(trainer.gamePath.c_str());\n        g_game_path_input->labelfont(FL_FREE_FONT);\n        g_game_path_input->labelsize(font_size);\n        g_game_path_input->textfont(FL_FREE_FONT);\n        g_game_path_input->textsize(font_size);\n        g_game_path_input->readonly(1);\n\n        LaunchData *launchData = new LaunchData{&trainer, g_game_path_input};\n\n        Fl_Button *browse_btn = new Fl_Button(0, 0, 0, 0);\n        path_flex->fixed(browse_btn, 30);\n        browse_btn->label(\"...\");\n        browse_btn->labelfont(FL_FREE_FONT);\n        browse_btn->labelsize(font_size);\n        browse_btn->callback(browse_callback, launchData);\n\n        Fl_Button *launch_btn = new Fl_Button(0, 0, 0, 0);\n        path_flex->fixed(launch_btn, 100);\n        tr(launch_btn, \"Launch Game\");\n        launch_btn->callback(launch_callback, launchData);\n\n        path_flex->end();\n        options_flex->fixed(path_flex, UI_OPTION_HEIGHT);\n    }\n\n    // --- Separator ---\n    {\n        Fl_Box *sep = new Fl_Box(0, 0, 0, 0);\n        options_flex->fixed(sep, 5);\n    }\n\n    // --- Top spacer (pushes cheats to vertical center) ---\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // --- In-Level Cheats ---\n    place_apply_widget(options_flex, &trainer, \"InstantWin\", \"Instant Win\");\n\n    place_apply_widget(options_flex, &trainer, \"SetSun\", \"Set Sun\", nullptr, \"9900\", \"0\", \"99999\");\n\n    place_apply_widget(options_flex, &trainer, \"SetPlantFood\", \"Set Plant Food\", nullptr, \"10\", \"0\", \"999\");\n\n    place_apply_widget(options_flex, &trainer, \"KillAllZombies\", \"Kill All Zombies\");\n\n    place_apply_widget(options_flex, &trainer, \"UnlockAllPlants\", \"Unlock All Plants\");\n\n    // --- Separator ---\n    {\n        Fl_Box *sep = new Fl_Box(0, 0, 0, 0);\n        options_flex->fixed(sep, 5);\n    }\n\n    // --- Currency Cheats ---\n    place_apply_widget(options_flex, &trainer, \"AddCoins\", \"Add Coins\", nullptr, \"99999\", \"-999999999\", \"999999999\");\n\n    place_apply_widget(options_flex, &trainer, \"AddGems\", \"Add Gems\", nullptr, \"999\", \"-999999999\", \"999999999\");\n\n    place_apply_widget(options_flex, &trainer, \"AddWorldKeys\", \"Add World Keys\", nullptr, \"10\", \"-999999999\", \"999999999\");\n\n    // --- Bottom spacer ---\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options_flex->end();\n\n    // Apply translations\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    return Fl::run();\n}\n"
  },
  {
    "path": "Game Trainers/trainers/PvZ2 Gardendless Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\"\n"
  },
  {
    "path": "Game Trainers/trainers/PvZ2 Gardendless Trainer/trainer.h",
    "content": "// trainer.h\n// PvZ2 Gardendless Trainer — Game-specific cheat functions.\n// Uses CDPBase for CDP communication with the Tauri/WebView2 game.\n#pragma once\n\n#include \"CDPBase.h\"\n\nclass Trainer : public CDPBase\n{\npublic:\n    Trainer() : CDPBase(\"pvz2_gardenless_trainer\", CDPLaunchMethod::WebView2EnvVar) {}\n    virtual ~Trainer() {}\n\n    // ============================================================\n    // Cheat Functions — In-Level\n    // ============================================================\n\n    bool instantWin()\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const fc = (n) => cc.director.getScene().getComponentInChildren(cls(n));\"\n            \"  const lp = fc('levelController');\"\n            \"  if (!lp) return 'fail: not in level';\"\n            \"  lp.levelVictoryCountDown = 0;\"\n            \"  lp.victory();\"\n            \"  return 'ok';\"\n            \"})()\");\n    }\n\n    bool setSun(const std::string &amount)\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const c = cls('SunCount').component;\"\n            \"  if (!c) return 'fail: not in level';\"\n            \"  c.setSunCount(\" +\n            amount +\n            \");\"\n            \"  return 'ok';\"\n            \"})()\");\n    }\n\n    bool setPlantFood(const std::string &count)\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const pf = cls('PlantFoodCount').component;\"\n            \"  if (!pf) return 'fail: not in level';\"\n            \"  pf.setPlantFoodNum(\" +\n            count +\n            \");\"\n            \"  return 'ok';\"\n            \"})()\");\n    }\n\n    bool killAllZombies()\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const cm = cc.find('CharacterManager');\"\n            \"  if (!cm) return 'fail: not in level';\"\n            \"  const comp = cm.getComponent(cls('CharacterManager'));\"\n            \"  if (!comp || !comp.zombiePool) return 'fail: no pool';\"\n            \"  let c = 0;\"\n            \"  comp.zombiePool.concat().forEach(z => {\"\n            \"    if (z.isAlive && z.isAlive()) { z.playDie(); c++; }\"\n            \"  });\"\n            \"  return 'killed ' + c;\"\n            \"})()\");\n    }\n\n    bool unlockAllPlants()\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const fc = (n) => cc.director.getScene().getComponentInChildren(cls(n));\"\n            \"  const lc = fc('levelController');\"\n            \"  if (!lc) return 'fail: not in level';\"\n            \"  if (lc.UnlockAll) return 'ok: already unlocked';\"\n            \"  lc.UnlockAll = true;\"\n            \"  const cards = cls('Cards').component;\"\n            \"  if (!cards || !cards.seedChooser) return 'fail: no seed chooser';\"\n            \"  const sc = cards.seedChooser;\"\n            \"  cards.spliceAllCards();\"\n            \"  cards.fromCards.length = 0;\"\n            \"  const parent = sc.ca0.node.parent;\"\n            \"  const toRemove = parent.children.filter(c => c !== sc.ca0.node);\"\n            \"  toRemove.forEach(c => c.destroy());\"\n            \"  sc.ca0.node.off('touch-end');\"\n            \"  sc.CFs.length = 0;\"\n            \"  cards.plantsCanBeChosen = null;\"\n            \"  sc.currentPlantTypes = null;\"\n            \"  sc.layCards();\"\n            \"  sc.CFs.forEach(cf => {\"\n            \"    cf.node.on('touch-end', () => {\"\n            \"      if (cards.shown) cards.addCard(cf, false);\"\n            \"    });\"\n            \"  });\"\n            \"  return 'ok: ' + sc.CFs.length + ' plants';\"\n            \"})()\");\n    }\n\n    // ============================================================\n    // Cheat Functions — Currency (work from any screen)\n    // ============================================================\n\n    bool addCoins(const std::string &amount)\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const c = cls('CoinCount');\"\n            \"  if (!c || !c.component) return 'fail';\"\n            \"  c.component.addCoinCount(\" +\n            amount +\n            \");\"\n            \"  return 'ok';\"\n            \"})()\");\n    }\n\n    bool addGems(const std::string &amount)\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const c = cls('GemCount');\"\n            \"  if (!c || !c.component) return 'fail';\"\n            \"  c.component.addGemCount(\" +\n            amount +\n            \");\"\n            \"  return 'ok';\"\n            \"})()\");\n    }\n\n    bool addWorldKeys(const std::string &amount)\n    {\n        return executeJS(\n            \"(() => {\"\n            \"  const cls = (n) => cc.js.getClassByName(n);\"\n            \"  const c = cls('WorldKeyCount');\"\n            \"  if (!c || !c.component) return 'fail';\"\n            \"  c.component.addKeyCount(\" +\n            amount +\n            \");\"\n            \"  return 'ok';\"\n            \"})()\");\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/PvZ2 Gardendless Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"PvZ2 Gardendless Trainer\": \"PvZ2 Gardendless Trainer\",\n        \"Process Name:\": \"CDP Status:\",\n        \"Process ID:\": \"Port:\",\n        \"Game Path:\": \"Game Path:\",\n        \"Launch Game\": \"Launch Game\",\n        \"Select Game Executable\": \"Select Game Executable\",\n        \"Please set the game path first.\": \"Please set the game path first.\",\n        \"Failed to launch game.\": \"Failed to launch the game. Check the exe path.\",\n        \"Instant Win\": \"Instant Win\",\n        \"Set Sun\": \"Set Sun\",\n        \"Set Plant Food\": \"Set Plant Food\",\n        \"Kill All Zombies\": \"Kill All Zombies\",\n        \"Unlock All Plants\": \"Unlock All Plants (Selection)\",\n        \"Add Coins\": \"Add Coins\",\n        \"Add Gems\": \"Add Gems\",\n        \"Add World Keys\": \"Add World Keys\",\n        \"Please run the game first.\": \"Game not connected via CDP. Launch the game using the trainer.\",\n        \"Failed to activate.\": \"Failed. Make sure you are in a level for in-level cheats.\",\n        \"Apply\": \"Apply\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"PvZ2 Gardendless Trainer\": \"PvZ2 Gardendless 修改器\",\n        \"Process Name:\": \"CDP 状态:\",\n        \"Process ID:\": \"端口:\",\n        \"Game Path:\": \"游戏路径:\",\n        \"Launch Game\": \"启动游戏\",\n        \"Select Game Executable\": \"选择游戏可执行文件\",\n        \"Please set the game path first.\": \"请先设置游戏路径。\",\n        \"Failed to launch game.\": \"启动游戏失败，请检查路径。\",\n        \"Instant Win\": \"立即通关\",\n        \"Set Sun\": \"设置阳光\",\n        \"Set Plant Food\": \"设置能量豆\",\n        \"Kill All Zombies\": \"消灭所有僵尸\",\n        \"Unlock All Plants\": \"解锁全部植物 (选卡界面)\",\n        \"Add Coins\": \"添加金币\",\n        \"Add Gems\": \"添加钻石\",\n        \"Add World Keys\": \"添加世界钥匙\",\n        \"Please run the game first.\": \"游戏未通过CDP连接。请使用修改器启动游戏。\",\n        \"Failed to activate.\": \"操作失败。关卡内功能需在关卡中使用。\",\n        \"Apply\": \"应用\"\n    }\n}"
  },
  {
    "path": "Game Trainers/trainers/Wizard of Legend 2 Trainer/CMakeLists.txt",
    "content": "set(GAME_NAME \"Wizard_of_Legend_2\")\nset(TRAINER_NAME \"Wizard of Legend 2 Trainer\")\n\nset(VENV_PYTHON \"${CMAKE_SOURCE_DIR}/.venv/Scripts/python.exe\")\nset(SUBSET_FONT_TARGET \"${GAME_NAME}_SubsetFont\")\nset(FONT_SUBSET_OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/NotoSansSC-Subset.ttf\")\nset(FONT_SUBSET_SCRIPT \"${CMAKE_SOURCE_DIR}/scripts/font_processor.py\")\nset(FONT_FILE \"${CMAKE_SOURCE_DIR}/scripts/NotoSansSC-Regular.ttf\")\nset(TRANSLATION_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/translations.json\")\n\n# Run python script to generate the subsetted font\nadd_custom_command(\n    OUTPUT ${FONT_SUBSET_OUTPUT}\n    COMMAND ${VENV_PYTHON} ${FONT_SUBSET_SCRIPT} ${TRANSLATION_FILES}\n            --font ${FONT_FILE} --output ${FONT_SUBSET_OUTPUT}\n    DEPENDS ${FONT_SUBSET_SCRIPT} ${FONT_FILE} ${TRANSLATION_FILES}\n    COMMENT \"Subsetting NotoSansSC-Regular.ttf in ${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nadd_custom_target(${SUBSET_FONT_TARGET} ALL\n    DEPENDS ${FONT_SUBSET_OUTPUT}\n)\n\nadd_executable(${GAME_NAME} main.cpp)\ntarget_link_libraries(${GAME_NAME} PRIVATE Common)\nadd_dependencies(${GAME_NAME} ${SUBSET_FONT_TARGET})\nset_target_properties(${GAME_NAME} PROPERTIES\n    WIN32_EXECUTABLE $<$<NOT:$<CONFIG:Debug>>:ON>\n    OUTPUT_NAME ${TRAINER_NAME}\n)\n\nif (WIN32)\n    set(RESOURCE_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/resources.rc\")\n    target_sources(${GAME_NAME} PRIVATE ${RESOURCE_FILE})\n    set_source_files_properties(${RESOURCE_FILE} PROPERTIES LANGUAGE RC)\nendif()\n\n# Move trainer executable to build/bin/\nadd_custom_command(TARGET ${GAME_NAME} POST_BUILD\n    COMMAND ${CMAKE_COMMAND} -E copy_if_different \"$<TARGET_FILE:${GAME_NAME}>\" \"${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}/${TRAINER_NAME}.exe\"\n    COMMENT \"Moving ${TRAINER_NAME}.exe to ${CMAKE_BINARY_DIR}/bin/${TRAINER_NAME}\"\n)"
  },
  {
    "path": "Game Trainers/trainers/Wizard of Legend 2 Trainer/main.cpp",
    "content": "// main.cpp\n#include <FL/Fl.H>\n#include <FL/Fl_Radio_Round_Button.H>\n#include <FL/Fl_PNG_Image.H>\n#include <FL/Fl_Flex.H>\n#include <FL/forms.H>\n#include \"trainer.h\"\n#include \"FLTKUtils.h\"\n\n// Callback function for apply button\nvoid apply_callback(Fl_Widget *widget, void *data)\n{\n    ApplyData *applyData = static_cast<ApplyData *>(data);\n    Trainer *trainer = applyData->trainer;\n    std::string optionName = applyData->optionName;\n    Fl_Button *button = applyData->button;\n    Fl_Input *input = applyData->input;\n\n    // Check if the game process is running\n    if (!applyData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate.\"));\n    }\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\n// Callback function for toggles\nvoid toggle_callback(Fl_Widget *widget, void *data)\n{\n    ToggleData *toggleData = static_cast<ToggleData *>(data);\n    Trainer *trainer = toggleData->trainer;\n    std::string optionName = toggleData->optionName;\n    Fl_Check_Button *button = toggleData->button;\n    Fl_Input *input = toggleData->input;\n\n    if (!toggleData->trainer->isProcessRunning())\n    {\n        fl_alert(t(\"Please run the game first.\"));\n        button->value(0);\n        return;\n    }\n\n    // Retrieve and validate the input value\n    std::string inputValue = \"0\";\n    bool status = true;\n    if (input && input->value())\n    {\n        inputValue = input->value();\n    }\n\n    // Apply the value using the Trainer class\n    if (optionName == \"SetHealth\")\n    {\n        if (button->value())\n        {\n            status = trainer->setHealth(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetMaxHealth\")\n    {\n        if (button->value())\n        {\n            status = trainer->setMaxHealth(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetMovementSpeed\")\n    {\n        if (button->value())\n        {\n            status = trainer->setSpeed(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetCoins\")\n    {\n        if (button->value())\n        {\n            status = trainer->setCoins(std::stof(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetGems\")\n    {\n        if (button->value())\n        {\n            status = trainer->setGems(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n    else if (optionName == \"SetArcaneChromo\")\n    {\n        if (button->value())\n        {\n            status = trainer->setArcaneChromo(std::stoi(inputValue));\n        }\n        else\n        {\n            status = trainer->disableNamedPointerToggle(optionName);\n        }\n    }\n\n    // Finalize\n    if (!status)\n    {\n        fl_alert(t(\"Failed to activate/deactivate.\"));\n        button->value(0);\n    }\n    if (input)\n        button->value() ? input->readonly(1) : input->readonly(0);\n}\n\nstatic void main_window_close_callback(Fl_Widget *w, void *)\n{\n    RemoveFontMemResourceEx(font_handle);\n    Fl::delete_widget(w);\n}\n\n// ===========================================================================\n// Main Function\n// ===========================================================================\nint main(int argc, char **argv)\n{\n    Trainer trainer;\n    setupLanguage();\n    load_translations(\"TRANSLATION_JSON\");\n\n    // Create the main window\n    int win_w = 800;\n    int win_h = 600;\n    int screen_w = Fl::w();\n    int screen_h = Fl::h();\n    int win_x = (screen_w - win_w) / 2;\n    int win_y = (screen_h - win_h) / 2;\n\n    Fl_Window *window = new Fl_Window(win_x, win_y, win_w, win_h);\n    Fl::scheme(\"gtk+\");\n    Fl::set_color(FL_FREE_COLOR, 0x1c1c1c00);\n    window->color(FL_FREE_COLOR);\n    window->icon((char *)LoadIconA(GetModuleHandle(NULL), \"APP_ICON\"));\n    window->callback(main_window_close_callback);\n    tr(window, \"Wizard of Legend 2 Trainer\");\n\n    // Setup fonts\n    DWORD font_mem_size = 0;\n    DWORD num_fonts = 0;\n    const unsigned char *font_data = load_resource(\"FONT_TTF\", font_mem_size);\n    font_handle = AddFontMemResourceEx((void *)font_data, font_mem_size, nullptr, &num_fonts);\n    Fl::set_font(FL_FREE_FONT, \"Noto Sans SC\");\n    fl_font(FL_FREE_FONT, font_size);\n\n    int left_margin = 20;\n    int button_w = 50;\n    int toggle_w = 16;\n    int toggle_spacer_w = 24;\n    int input_w = 200;\n    int option_gap = 10;\n    int option_h = static_cast<int>(font_size * 1.5);\n\n    // ------------------------------------------------------------------\n    // Top Row: Language Selection\n    // ------------------------------------------------------------------\n    int lang_flex_height = 30;\n    int lang_flex_width = 200;\n\n    Fl_Flex lang_flex(window->w() - lang_flex_width, 0, lang_flex_width, lang_flex_height, Fl_Flex::HORIZONTAL);\n    lang_flex.color(FL_BLACK);\n    Fl_Radio_Round_Button *lang_en = new Fl_Radio_Round_Button(0, 0, 0, 0, \"English\");\n    if (language == \"en_US\")\n        lang_en->set();\n    lang_en->labelfont(FL_FREE_FONT);\n    lang_en->labelsize(font_size);\n    lang_en->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataEN = new ChangeLanguageData{\"en_US\", window};\n    lang_en->callback(change_language_callback, changeLanguageDataEN);\n\n    Fl_Radio_Round_Button *lang_zh = new Fl_Radio_Round_Button(0, 0, 0, 0, \"简体中文\");\n    if (language == \"zh_CN\")\n        lang_zh->set();\n    lang_zh->labelfont(FL_FREE_FONT);\n    lang_zh->labelsize(font_size);\n    lang_zh->labelcolor(FL_WHITE);\n    ChangeLanguageData *changeLanguageDataSC = new ChangeLanguageData{\"zh_CN\", window};\n    lang_zh->callback(change_language_callback, changeLanguageDataSC);\n\n    lang_flex.end();\n\n    // ------------------------------------------------------------------\n    // Left Column: Image and Process Info\n    // ------------------------------------------------------------------\n    std::pair<int, int> imageSize = std::make_pair(200, 300);\n\n    DWORD img_size = 0;\n    const unsigned char *data = load_resource(\"LOGO_IMG\", img_size);\n    Fl_PNG_Image *game_img = new Fl_PNG_Image(nullptr, data, (int)img_size);\n    game_img->scale(imageSize.first, imageSize.second, 1, 0);\n    Fl_Box *img_box = new Fl_Box(20, lang_flex_height, imageSize.first, imageSize.second);\n    img_box->image(game_img);\n\n    // Process Information\n    Fl_Box *process_name = new Fl_Box(left_margin, lang_flex_height + imageSize.second + 10, imageSize.first, font_size);\n    process_name->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n    tr(process_name, \"Process Name:\");\n\n    Fl_Box *process_exe = new Fl_Box(left_margin, lang_flex_height + imageSize.second + font_size + 20, imageSize.first, font_size);\n    process_exe->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    Fl_Flex *process_id_flex = new Fl_Flex(left_margin, lang_flex_height + imageSize.second + font_size + 55, imageSize.first, font_size, Fl_Flex::HORIZONTAL);\n    process_id_flex->gap(5);\n\n    Fl_Box *process_id_label = new Fl_Box(0, 0, 0, 0);\n    process_id_label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);\n    tr(process_id_label, \"Process ID:\");\n\n    Fl_Box *process_id = new Fl_Box(0, 0, 0, 0);\n    process_id->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE);\n\n    process_id_flex->end();\n\n    TimeoutData *timeoutData = new TimeoutData{&trainer, process_exe, process_id};\n    Fl::add_timeout(0, check_process_status, timeoutData);\n\n    // ------------------------------------------------------------------\n    // Option column 1\n    // ------------------------------------------------------------------\n    int col1_x = imageSize.first + left_margin;\n    int col1_y = lang_flex_height;\n    int col1_w = window->w() - (imageSize.first + left_margin);\n    int col1_h = window->h() - 30;\n    Fl_Flex *options1_flex = new Fl_Flex(col1_x, col1_y, col1_w, col1_h, Fl_Flex::VERTICAL);\n    options1_flex->margin(50, 20, 20, 20);\n    options1_flex->gap(10);\n    Fl_Box *spacerTop = new Fl_Box(0, 0, 0, 0);\n\n    // ------------------------------------------------------------------\n    // Set Health (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *health_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    health_flex->gap(option_gap);\n\n    Fl_Box *health_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    health_flex->fixed(health_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *health_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    health_flex->fixed(health_check_button, toggle_w);\n\n    Fl_Box *health_label = new Fl_Box(0, 0, 0, 0);\n    tr(health_label, \"Set Health\");\n\n    Fl_Input *health_input = new Fl_Input(0, 0, 0, 0);\n    health_flex->fixed(health_input, input_w);\n    health_input->type(FL_INT_INPUT);\n    set_input_values(health_input, \"9999\", \"0\", \"999999999\");\n\n    ToggleData *data_health = new ToggleData{&trainer, \"SetHealth\", health_check_button, health_input};\n    health_check_button->callback(toggle_callback, data_health);\n\n    health_flex->end();\n    options1_flex->fixed(health_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Set Max Health (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *max_health_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    max_health_flex->gap(option_gap);\n\n    Fl_Box *max_health_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    max_health_flex->fixed(max_health_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *max_health_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    max_health_flex->fixed(max_health_check_button, toggle_w);\n\n    Fl_Box *max_health_label = new Fl_Box(0, 0, 0, 0);\n    tr(max_health_label, \"Set Max Health\");\n\n    Fl_Input *max_health_input = new Fl_Input(0, 0, 0, 0);\n    max_health_flex->fixed(max_health_input, input_w);\n    max_health_input->type(FL_INT_INPUT);\n    set_input_values(max_health_input, \"9999\", \"0\", \"999999999\");\n\n    ToggleData *data_max_health = new ToggleData{&trainer, \"SetMaxHealth\", max_health_check_button, max_health_input};\n    max_health_check_button->callback(toggle_callback, data_max_health);\n\n    max_health_flex->end();\n    options1_flex->fixed(max_health_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Set Movement Speed (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *speed_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    speed_flex->gap(option_gap);\n\n    Fl_Box *speed_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    speed_flex->fixed(speed_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *speed_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    speed_flex->fixed(speed_check_button, toggle_w);\n\n    Fl_Box *speed_label = new Fl_Box(0, 0, 0, 0);\n    tr(speed_label, \"Set Movement Speed\");\n\n    Fl_Input *speed_input = new Fl_Input(0, 0, 0, 0);\n    speed_flex->fixed(speed_input, input_w);\n    speed_input->type(FL_INT_INPUT);\n    set_input_values(speed_input, \"5000\", \"1100\", \"999999999\");\n\n    ToggleData *data_speed = new ToggleData{&trainer, \"SetMovementSpeed\", speed_check_button, speed_input};\n    speed_check_button->callback(toggle_callback, data_speed);\n\n    speed_flex->end();\n    options1_flex->fixed(speed_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Set Coins (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *coins_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    coins_flex->gap(option_gap);\n\n    Fl_Box *coins_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    coins_flex->fixed(coins_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *coins_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    coins_flex->fixed(coins_check_button, toggle_w);\n\n    Fl_Box *coins_label = new Fl_Box(0, 0, 0, 0);\n    tr(coins_label, \"Set Coins\");\n\n    Fl_Input *coins_input = new Fl_Input(0, 0, 0, 0);\n    coins_flex->fixed(coins_input, input_w);\n    coins_input->type(FL_INT_INPUT);\n    set_input_values(coins_input, \"9999\", \"0\", \"999999999\");\n\n    ToggleData *data_coins = new ToggleData{&trainer, \"SetCoins\", coins_check_button, coins_input};\n    coins_check_button->callback(toggle_callback, data_coins);\n\n    coins_flex->end();\n    options1_flex->fixed(coins_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Set Gems (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *gems_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    gems_flex->gap(option_gap);\n\n    Fl_Box *gems_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    gems_flex->fixed(gems_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *gems_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    gems_flex->fixed(gems_check_button, toggle_w);\n\n    Fl_Box *gems_label = new Fl_Box(0, 0, 0, 0);\n    tr(gems_label, \"Set Gems\");\n\n    Fl_Input *gems_input = new Fl_Input(0, 0, 0, 0);\n    gems_flex->fixed(gems_input, input_w);\n    gems_input->type(FL_INT_INPUT);\n    set_input_values(gems_input, \"999999\", \"0\", \"999999999\");\n\n    ToggleData *data_gems = new ToggleData{&trainer, \"SetGems\", gems_check_button, gems_input};\n    gems_check_button->callback(toggle_callback, data_gems);\n\n    gems_flex->end();\n    options1_flex->fixed(gems_flex, option_h);\n\n    // ------------------------------------------------------------------\n    // Set Arcane Chromo (Toggle)\n    // ------------------------------------------------------------------\n    Fl_Flex *arcane_chromo_flex = new Fl_Flex(0, 0, 0, 0, Fl_Flex::HORIZONTAL);\n    arcane_chromo_flex->gap(option_gap);\n\n    Fl_Box *arcane_chromo_toggle_spacer = new Fl_Box(0, 0, 0, 0);\n    arcane_chromo_flex->fixed(arcane_chromo_toggle_spacer, toggle_spacer_w);\n\n    Fl_Check_Button *arcane_chromo_check_button = new Fl_Check_Button(0, 0, 0, 0);\n    arcane_chromo_flex->fixed(arcane_chromo_check_button, toggle_w);\n\n    Fl_Box *arcane_chromo_label = new Fl_Box(0, 0, 0, 0);\n    tr(arcane_chromo_label, \"Set Arcane Chromo\");\n\n    Fl_Input *arcane_chromo_input = new Fl_Input(0, 0, 0, 0);\n    arcane_chromo_flex->fixed(arcane_chromo_input, input_w);\n    arcane_chromo_input->type(FL_INT_INPUT);\n    set_input_values(arcane_chromo_input, \"999\", \"0\", \"999999999\");\n\n    ToggleData *data_arcane_chromo = new ToggleData{&trainer, \"SetArcaneChromo\", arcane_chromo_check_button, arcane_chromo_input};\n    arcane_chromo_check_button->callback(toggle_callback, data_arcane_chromo);\n\n    arcane_chromo_flex->end();\n    options1_flex->fixed(arcane_chromo_flex, option_h);\n\n    // ------------------------------------------------------------------\n    Fl_Box *spacerBottom = new Fl_Box(0, 0, 0, 0);\n    options1_flex->end();\n    change_language(language, window);\n\n    // =========================\n    // Finalize and Show Window\n    // =========================\n    window->end();\n    window->show(argc, argv);\n    int ret = Fl::run();\n\n    return ret;\n}\n"
  },
  {
    "path": "Game Trainers/trainers/Wizard of Legend 2 Trainer/resources.rc",
    "content": "APP_ICON ICON \"../../common/assets/logo.ico\"\nLOGO_IMG RCDATA \"logo.png\"\nTRANSLATION_JSON RCDATA \"translations.json\"\nFONT_TTF RCDATA \"NotoSansSC-Subset.ttf\""
  },
  {
    "path": "Game Trainers/trainers/Wizard of Legend 2 Trainer/trainer.h",
    "content": "// trainer.h\n#pragma once\n\n#include \"TrainerBase.h\"\n\nclass Trainer : public TrainerBase\n{\npublic:\n    Trainer() : TrainerBase(L\"WOL2-Win64-Shipping.exe\") {} // x64\n    ~Trainer() override = default;\n\n    // Constants\n    static inline const wchar_t *moduleName = L\"WOL2-Win64-Shipping.exe\";\n\n    inline bool setHealth(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x085B21D0, 0x0, 0xBB0, 0x58, 0x310, 0x538, 0x48};\n        return createPointerToggle(moduleName, \"SetHealth\", offsets, newVal);\n    }\n\n    inline bool setMaxHealth(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x08542310, 0xC0, 0x218, 0x130, 0x310, 0x538, 0x5C};\n        return createPointerToggle(moduleName, \"SetMaxHealth\", offsets, newVal);\n    }\n\n    inline bool setSpeed(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x08542310, 0x60, 0x310, 0x130, 0x3C0, 0xEC};\n        return createPointerToggle(moduleName, \"SetSpeed\", offsets, newVal);\n    }\n\n    inline bool setCoins(float newVal)\n    {\n        std::vector<unsigned int> offsets = {0x085424B0, 0x10, 0x560, 0x18, 0x20, 0x3C0, 0x258};\n        return createPointerToggle(moduleName, \"SetCoins\", offsets, newVal);\n    }\n\n    inline bool setGems(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x08542310, 0x180, 0x380, 0x40, 0x70};\n        return createPointerToggle(moduleName, \"SetGems\", offsets, newVal);\n    }\n\n    inline bool setArcaneChromo(int newVal)\n    {\n        std::vector<unsigned int> offsets = {0x08542310, 0x180, 0x380, 0x40, 0x40};\n        return createPointerToggle(moduleName, \"SetArcaneChromo\", offsets, newVal);\n    }\n};\n"
  },
  {
    "path": "Game Trainers/trainers/Wizard of Legend 2 Trainer/translations.json",
    "content": "{\n    \"en_US\": {\n        \"English\": \"English\",\n        \"Please run the game first.\": \"Please run the game first.\",\n        \"Failed to activate.\": \"Failed to activate.\",\n        \"Failed to activate/deactivate.\": \"Failed to activate/deactivate.\",\n        \"Process Name:\": \"Process Name:\",\n        \"Process ID:\": \"Process ID:\",\n        \"Apply\": \"Apply\",\n        \"Wizard of Legend 2 Trainer\": \"Wizard of Legend 2 Trainer\",\n        \"Set Health\": \"Set Health\",\n        \"Set Max Health\": \"Set Max Health\",\n        \"Set Movement Speed\": \"Set Movement Speed\",\n        \"Set Coins\": \"Set Coins\",\n        \"Set Gems\": \"Set Gems\",\n        \"Set Arcane Chromo\": \"Set Arcane Chromo\"\n    },\n    \"zh_CN\": {\n        \"简体中文\": \"简体中文\",\n        \"Please run the game first.\": \"请先运行游戏。\",\n        \"Failed to activate.\": \"激活失败。\",\n        \"Failed to activate/deactivate.\": \"激活/停用失败。\",\n        \"Process Name:\": \"进程名称：\",\n        \"Process ID:\": \"进程 ID:\",\n        \"Apply\": \"应用\",\n        \"Wizard of Legend 2 Trainer\": \"传说法师2修改器\",\n        \"Set Health\": \"设置生命值\",\n        \"Set Max Health\": \"设置最大生命值\",\n        \"Set Movement Speed\": \"设置移动速度\",\n        \"Set Coins\": \"设置金币\",\n        \"Set Gems\": \"设置宝石\",\n        \"Set Arcane Chromo\": \"设置奥术色素\"\n    }\n}\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program 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\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# Game Cheats Manager\n\nEnglish | [简体中文](./README_CN.md) | [繁體中文](./README_TW.md)\n\n![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/dyang886/Game-Cheats-Manager/total) ![GitHub Repo stars](https://img.shields.io/github/stars/dyang886/Game-Cheats-Manager?style=flat&color=ffc000) ![GitHub Release](https://img.shields.io/github/v/release/dyang886/Game-Cheats-Manager?link=https%3A%2F%2Fgithub.com%2Fdyang886%2FGame-Cheats-Manager%2Freleases%2Flatest) ![GitHub License](https://img.shields.io/github/license/dyang886/Game-Cheats-Manager) <a href=\"https://hellogithub.com/repository/3ca6e8e23401477282ba72d2d8932311\" target=\"_blank\"><img src=\"https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=3ca6e8e23401477282ba72d2d8932311&claim_uid=UrZOap0AkvuRw7D&theme=small\" alt=\"Featured｜HelloGitHub\" /></a> <a href=\"https://discord.gg/d627qVyHEF\" target=\"_blank\"><img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Join_Discord-f0f0f0?logo=discord\"></a> <a href=\"https://pd.qq.com/s/h06qbdey6\" target=\"_blank\"><img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Join_QQ-f0f0f0?logo=qq\"></a>\n\n<div align=\"center\">\n    <img src=\"src/assets/logo.png\" alt=\"Game Cheats Manager logo\" width=\"250\" />\n</div>\n\n**Please visit our official website [https://gamezonelabs.com](https://gamezonelabs.com) for more info.**\n\nStop hunting through sketchy websites and managing endless browser tabs. **Game Cheats Manager (GCM)** brings single-player game trainers from multiple sources into one clean, open-source dashboard. Search in English or Chinese, download with one click, and let the app handle the rest.\n\n---\n\n## Core Features\n\n### Multiple Sources, One App\nGet access to the most trusted trainers in the community without dealing with dead links:\n* **Fling Trainers:** The industry standard.\n* **XiaoXing Trainers:** Specialized in Asia-focused titles with advanced features.\n* **Cheat Tables:** A vast repository of community-created tables for Cheat Engine.\n* **GCM Trainers:** Personally curated, open-source trainers for niche titles.\n* **Community Uploaded Trainers:** Trainers submitted directly by our users. Whether you've created your own or found one missing from our main sources, these are manually reviewed for safety before becoming available to everyone.\n\n### Instant Bilingual Search\nType a game name in English or Chinese to see instant results. Data syncs locally across all sources so you can filter by source or game without lag.\n\n### Double-Click to Download\nFound your trainer? Double-click it. GCM handles the download, unzips the files, tags the version, and organizes it into a named folder—all while protecting against duplicates.\n\n### Auto-Update on Every Launch\nGame updates break trainers fast. GCM checks for updates silently in the background every time you launch the app, ensuring your library is always current.\n\n### Windows Defender Integration\nBecause trainers modify game memory, they often trigger false-positive antivirus alerts. GCM includes a one-click whitelist helper to safely add your trainer folders to Windows Defender exclusions.\n\n### Anti-Cheat Smart Alerts\nFor single-player games that still utilize anti-cheat, GCM provides step-by-step bypass instructions immediately after your download finishes.\n\n### Community Powered\nCreated your own trainer or found one we missed? Upload it directly through the app. After a manual safety review, your contribution goes live to the entire community.\n\n---\n\n## Installation\n\n1. Navigate to our [Latest Release](https://github.com/dyang886/Game-Cheats-Manager/releases) page.\n2. Download the latest Windows (64-bit) installer.\n3. Run the installer and follow the on-screen instructions.\n4. Launch GCM and start gaming!\n\n---\n\n## Advanced Usage & Options\n\nWhile GCM is designed to be plug-and-play, you have full control over your experience via the in-app menus:\n\n* **Trainer Management:** Enable/Disable each source, configure trainer and data file auto-updates, or switch download servers.\n* **Local Imports:** Already have a folder full of trainers? Import them directly into GCM *(Note: auto-update is not supported for manual imports)*.\n* **Custom Paths:** Change where your trainers are saved and easily open your download directory from the app.\n* **Customization:** Adjust app themes, languages, and view your project-related links.\n\n---\n\n## Support\n\nFor issues, feature requests, or contributions, please visit the [Issues](https://github.com/dyang886/Game-Cheats-Manager/issues) page or join our community via Discord/QQ (links at the top of the page). \n\n*Note: All trainers are intended strictly for single-player use.*"
  },
  {
    "path": "README_CN.md",
    "content": "# Game Cheats Manager\n\n[English](./README.md) | 简体中文 | [繁體中文](./README_TW.md)\n\n![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/dyang886/Game-Cheats-Manager/total) ![GitHub Repo stars](https://img.shields.io/github/stars/dyang886/Game-Cheats-Manager?style=flat&color=ffc000) ![GitHub Release](https://img.shields.io/github/v/release/dyang886/Game-Cheats-Manager?link=https%3A%2F%2Fgithub.com%2Fdyang886%2FGame-Cheats-Manager%2Freleases%2Flatest) ![GitHub License](https://img.shields.io/github/license/dyang886/Game-Cheats-Manager) <a href=\"https://hellogithub.com/repository/3ca6e8e23401477282ba72d2d8932311\" target=\"_blank\"><img src=\"https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=3ca6e8e23401477282ba72d2d8932311&claim_uid=UrZOap0AkvuRw7D&theme=small\" alt=\"Featured｜HelloGitHub\" /></a> <a href=\"https://discord.gg/d627qVyHEF\" target=\"_blank\"><img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Join_Discord-f0f0f0?logo=discord\"></a> <a href=\"https://pd.qq.com/s/h06qbdey6\" target=\"_blank\"><img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Join_QQ-f0f0f0?logo=qq\"></a>\n\n<div align=\"center\">\n    <img src=\"src/assets/logo.png\" alt=\"Game Cheats Manager logo\" width=\"250\" />\n</div>\n\n**获取更多信息，请访问我们的官方网站 [https://gamezonelabs.com](https://gamezonelabs.com)。**\n\n告别在各类可疑网站中苦苦寻觅，也无需再管理无数的浏览器标签页。**Game Cheats Manager (GCM)** 将来自多个平台的单机游戏修改器汇集到一个干净整洁且开源的面板中。支持中英文双语搜索，一键下载，剩下的全部交给应用自动处理。\n\n---\n\n## 核心功能\n\n### 多源合一，尽在一个应用\n获取社区中最值得信赖的修改器，告别死链失效的烦恼：\n* **风灵月影:** 行业标杆，修改器界最广为人知的来源。\n* **小幸姐:** 专注于国产/亚洲游戏，通常提供更为高级的功能。\n* **CE 脚本 (CT 表):** 庞大的 Cheat Engine 脚本社区资源库，涵盖海量游戏。\n* **GCM 专属:** 我们亲自制作和整理的开源修改器，专为一些相对小众的游戏提供。\n* **社区上传:** 由我们的用户直接提交的修改器。无论你是自己制作的还是发现了我们未收录的资源，经过人工安全审核后，所有人都能立即使用。\n\n### 双语即时搜索\n输入中英文游戏名称即可立即查看结果。数据在本地跨所有来源同步，无延迟按来源或游戏进行筛选。\n\n### 双击即可下载\n找到心仪的修改器了？双击即可。GCM 将处理一切后续工作：下载文件、解压、标记版本，并将其整理归档到独立命名的文件夹中——同时还能智能防止重复下载。\n\n### 每次启动自动更新\n游戏一更新，修改器就失效？GCM 会在每次启动应用时于后台静默检查更新，确保你的修改器库始终保持最新状态。\n\n### Windows Defender 智能白名单\n由于修改器会修改游戏内存，经常会触发杀毒软件的误报。GCM 内置了一键白名单助手，安全地将你的修改器文件夹添加到 Windows Defender 的排除项中，防止文件被误删。\n\n### 反作弊智能提示\n对于部分包含反作弊机制的单机游戏，GCM 能够自动识别，并在下载完成后立即为你提供详细的绕过步骤说明。\n\n### 社区驱动\n制作了自己的修改器？或者发现了我们遗漏的宝藏？直接通过应用一键上传。经过安全审核后，你的贡献将面向整个社区发布。\n\n---\n\n## 安装指南\n\n1. 前往我们的 [最新发布 (Latest Release)](https://github.com/dyang886/Game-Cheats-Manager/releases) 页面。\n2. 下载最新的 Windows (64位) 安装包。\n3. 运行安装程序并按照屏幕上的指示进行操作。\n4. 启动 GCM，开始你的游戏之旅！\n\n---\n\n## 进阶使用与选项\n\n虽然 GCM 的设计理念是开箱即用，但你完全可以通过应用内菜单掌控你的体验：\n\n* **修改器管理:** 启用/禁用各个来源，配置修改器和数据文件的自动更新，或切换下载服务器。\n* **本地导入:** 电脑里已经存了一大堆修改器？直接将它们导入 GCM *(注：手动导入的修改器不支持自动更新)*。\n* **自定义路径:** 更改修改器的保存位置，并在应用内一键打开下载目录。\n* **个性化设置:** 调整应用主题、语言，并查看与项目相关的链接。\n\n---\n\n## 支持与反馈\n\n如遇问题、有新功能建议或希望参与贡献，请访问 [Issues](https://github.com/dyang886/Game-Cheats-Manager/issues) 页面，或通过 Discord/QQ（链接见页面顶部）加入我们的社区。\n\n*注：所有修改器严格且仅限用于单机游戏模式。*"
  },
  {
    "path": "README_TW.md",
    "content": "# Game Cheats Manager\n\n[English](./README.md) | [简体中文](./README_CN.md) | 繁體中文\n\n![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/dyang886/Game-Cheats-Manager/total) ![GitHub Repo stars](https://img.shields.io/github/stars/dyang886/Game-Cheats-Manager?style=flat&color=ffc000) ![GitHub Release](https://img.shields.io/github/v/release/dyang886/Game-Cheats-Manager?link=https%3A%2F%2Fgithub.com%2Fdyang886%2FGame-Cheats-Manager%2Freleases%2Flatest) ![GitHub License](https://img.shields.io/github/license/dyang886/Game-Cheats-Manager) <a href=\"https://hellogithub.com/repository/3ca6e8e23401477282ba72d2d8932311\" target=\"_blank\"><img src=\"https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=3ca6e8e23401477282ba72d2d8932311&claim_uid=UrZOap0AkvuRw7D&theme=small\" alt=\"Featured｜HelloGitHub\" /></a> <a href=\"https://discord.gg/d627qVyHEF\" target=\"_blank\"><img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Join_Discord-f0f0f0?logo=discord\"></a> <a href=\"https://pd.qq.com/s/h06qbdey6\" target=\"_blank\"><img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Join_QQ-f0f0f0?logo=qq\"></a>\n\n<div align=\"center\">\n    <img src=\"src/assets/logo.png\" alt=\"Game Cheats Manager logo\" width=\"250\" />\n</div>\n\n**獲取更多資訊，請造訪我們的官方網站 [https://gamezonelabs.com](https://gamezonelabs.com)。**\n\n告別在各類可疑網站中苦苦尋覓，也無需再管理無數的瀏覽器分頁。**Game Cheats Manager (GCM)** 將來自多個平台的單機遊戲修改器彙集到一個乾淨整潔且開源的介面中。支援中英雙語搜尋，一鍵下載，剩下的全部交給應用程式自動處理。\n\n---\n\n## 核心功能\n\n### 多源合一，盡在一個應用\n獲取社群中最值得信賴的修改器，告別死鏈失效的煩惱：\n* **風靈月影:** 業界標竿，修改器界最廣為人知的來源。\n* **小幸姐:** 專注於亞洲/國產遊戲，通常提供更為進階的功能。\n* **CE 腳本 (CT 表):** 龐大的 Cheat Engine 腳本社群資源庫，涵蓋海量遊戲。\n* **GCM 專屬:** 我們親自製作和整理的開源修改器，專為一些相對小眾的遊戲提供。\n* **社群上傳:** 由我們的用戶直接提交的修改器。無論你是自己製作的還是發現了我們未收錄的資源，經過人工安全審核後，所有人都能立即使用。\n\n### 雙語即時搜尋\n輸入中英文遊戲名稱即可立即查看結果。資料在本地跨所有來源同步，無延遲按來源或遊戲進行篩選。\n\n### 雙擊即可下載\n找到心儀的修改器了？雙擊即可。GCM 將處理一切後續工作：下載檔案、解壓縮、標記版本，並將其整理歸檔到獨立命名的資料夾中——同時還能智能防止重複下載。\n\n### 每次啟動自動更新\n遊戲一更新，修改器就失效？GCM 會在每次啟動應用程式時於背景靜默檢查更新，確保你的修改器庫始終保持最新狀態。\n\n### Windows Defender 智能白名單\n由於修改器會修改遊戲記憶體，經常會觸發防毒軟體的誤報。GCM 內建了一鍵白名單助手，安全地將你的修改器資料夾新增到 Windows Defender 的排除項中，防止檔案被誤刪。\n\n### 反作弊智能提示\n對於部分包含反作弊機制的單機遊戲，GCM 能夠自動識別，並在下載完成後立即為你提供詳細的繞過步驟說明。\n\n### 社群驅動\n製作了自己的修改器？或者發現了我們遺漏的寶藏？直接透過應用程式一鍵上傳。經過安全審核後，你的貢獻將面向整個社群發布。\n\n---\n\n## 安裝指南\n\n1. 前往我們的 [最新發布 (Latest Release)](https://github.com/dyang886/Game-Cheats-Manager/releases) 頁面。\n2. 下載最新的 Windows (64位元) 安裝檔。\n3. 執行安裝程式並按照螢幕上的指示進行操作。\n4. 啟動 GCM，開始你的遊戲之旅！\n\n---\n\n## 進階使用與選項\n\n雖然 GCM 的設計理念是開箱即用，但你完全可以透過應用內選單掌控你的體驗：\n\n* **修改器管理:** 啟用/停用各個來源，配置修改器和資料檔的自動更新，或切換下載伺服器。\n* **本地匯入:** 電腦裡已經存了一大堆修改器？直接將它們匯入 GCM *(註：手動匯入的修改器不支援自動更新)*。\n* **自訂路徑:** 更改修改器的儲存位置，並在應用內一鍵打開下載目錄。\n* **個性化設定:** 調整應用程式主題、語言，並查看與專案相關的連結。\n\n---\n\n## 支援與反饋\n\n如遇問題、有新功能建議或希望參與貢獻，請造訪 [Issues](https://github.com/dyang886/Game-Cheats-Manager/issues) 頁面，或透過 Discord/QQ（連結見頁面頂部）加入我們的社群。\n\n*註：所有修改器嚴格且僅限用於單機遊戲模式。*"
  },
  {
    "path": "requirements.txt",
    "content": "beautifulsoup4\ncloudscraper\nfuzzywuzzy\npackaging\npinyin\npolib\npsutil\nPyQt6==6.9.1\npython-dotenv\npython-Levenshtein\nrequests\ntendo\nzhon\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/Java.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: java-AAF\nmsgid \"Auto assembler failed:\"\nmsgstr \"自动汇编失败：\"\n\n#: java-JEST\nmsgid \"Java:eventserver terminated\"\nmsgstr \"Java：事件服务器已终止\"\n\n#: java-JD\nmsgid \"Java:Disconnected\"\nmsgstr \"Java：已断开连接\"\n\n#: java-JUER\nmsgid \"Java:Unexpected event received\"\nmsgstr \"Java：接收到意外事件\"\n\n#: java-JEHT\nmsgid \"Java:Event handler terminating\"\nmsgstr \"Java：事件处理程序正在终止\"\n\n#: java-IJS\nmsgid \"Invalid java signature\"\nmsgstr \"无效的 java 签名\"\n\n#: java-ARTANS\nmsgid \"Array return types are not supported\"\nmsgstr \"不支持数组返回类型\"\n\n#: java-PCDNM\nmsgid \"Parameter count does not match\"\nmsgstr \"参数数量不匹配\"\n\n#: java-SWNS\nmsgid \"Scantype was not set\"\nmsgstr \"未设置扫描类型\"\n\n#: java-Class\nmsgid \"Class\"\nmsgstr \"类\"\n\n#: java-Method\nmsgid \"Method\"\nmsgstr \"方法\"\n\n#: java-Position\nmsgid \"Position\"\nmsgstr \"位置\"\n\n#: java-MI\nmsgid \"More info %s.%s(%d)\"\nmsgstr \"更多信息 %s.%s(%d)\"\n\n#: java-TDMATGV\nmsgid \"The following methods accessed the given variable\"\nmsgstr \"以下方法访问了给定变量\"\n\n#: java-results\nmsgid \"results\"\nmsgstr \"结果\"\n\n#: java-OWWTJAILAS\nmsgid \"java_find_what_writes only works when the jvmti agent is launched at start\"\nmsgstr \"java_find_what_writes 仅在 jvmti 代理在启动时启动时有效\"\n\n#: java-Generic\nmsgid \"  Generic=\"\nmsgstr \"  泛型=\"\n\n#: java-SC\nmsgid \"superclass=\"\nmsgstr \"超类=\"\n\n#: java-II\nmsgid \"---Implemented interfaces---\"\nmsgstr \"---实现的接口---\"\n\n#: java-Fields\nmsgid \"---Fields---\"\nmsgstr \"---字段---\"\n\n#: java-Methods\nmsgid \"---Methods---\"\nmsgstr \"---方法---\"\n\n#: java-SFC\nmsgid \"Search for class...\"\nmsgstr \"搜索类...\"\n\n#: java-SF\nmsgid \"Search for...\"\nmsgstr \"搜索...\"\n\n#: java-NewS\nmsgid \"New Scan\"\nmsgstr \"新扫描\"\n\n#: java-FS\nmsgid \"First Scan\"\nmsgstr \"第一次扫描\"\n\n#: java-JVScanner\nmsgid \"Java Variable Scanner\"\nmsgstr \"Java 变量扫描器\"\n\n#: java-Value\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: java-NextS\nmsgid \"Next Scan\"\nmsgstr \"下次扫描\"\n\n#: java-Found\nmsgid \"Found:\"\nmsgstr \"找到：\"\n\n#: java-FWATV\nmsgid \"Find what accesses this value\"\nmsgstr \"查找访问此值的内容\"\n\n#: java-Search\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: java-FC\nmsgid \"Find Class\"\nmsgstr \"查找类\"\n\n#: java-Finddotdotdot\nmsgid \"Find...\"\nmsgstr \"查找...\"\n\n#: java-EM\nmsgid \"Edit method\"\nmsgstr \"编辑方法\"\n\n#: java-AJF\nmsgid \"Activate java features\"\nmsgstr \"激活 java 功能\"\n\n#: java-DJC\nmsgid \"Dissect java classes\"\nmsgstr \"剖析 java 类\"\n\n#: java-JVScan\nmsgid \"Java variable scan\"\nmsgstr \"Java 变量扫描\"\n\n#: java-DCP\nmsgid \"Debug child processes\"\nmsgstr \"调试子进程\"\n\n#: java-JHDTI\nmsgid \"The java handler failed to initialize\"\nmsgstr \"Java 处理程序初始化失败\"\n\n#: java-SJMIEITTP\nmsgid \"Show java menu item even if the target process hasn't loaded jvm.dll (Used for the local setEnvironment option)\"\nmsgstr \"即使目标进程尚未加载 jvm.dll，也显示 java 菜单项（用于本地 setEnvironment 选项）\"\n\n#: javaclass-ICPTE\nmsgid \"Invalid constant pool tag encountered: \"\nmsgstr \"遇到无效的常量池标签：\"\n\n#: javaclass-Tag\nmsgid \" (tag=\"\nmsgstr \" （标签=\"\n\n#: javaclass-NAVC\nmsgid \"Not a valid classfile\"\nmsgstr \"不是有效的 classfile\"\n\n#: javaclasseditor-ICNI\nmsgid \" is currently not implemented\"\nmsgstr \" 目前尚未实现\"\n\n#: javaclasseditor-WCNBUW\nmsgid \"wide can not be used with \"\nmsgstr \"wide 不能与 \"\n\n#: javaclasseditor-IAOPPF\nmsgid \"Invalid amount of parameters provided for \"\nmsgstr \"提供的参数数量无效 \"\n\n#: javaclasseditor-TL\nmsgid \"The label \"\nmsgstr \"标签 \"\n\n#: javaclasseditor-INYD\nmsgid \"is not yet defined\"\nmsgstr \"尚未定义\"\n\n#: javaclasseditor-TIICNI\nmsgid \"This instruction is currently not implemented\"\nmsgstr \"此指令目前尚未实现\"\n\n#: javaclasseditor-UI\nmsgid \"unknown instruction:\"\nmsgstr \"未知指令：\"\n\n#: javaclasseditor-YCORI\nmsgid \"You can only replace instructions on an instruction boundary\"\nmsgstr \"只能在指令边界替换指令\"\n\n#: javaclasseditor-StartIndex\nmsgid \"si=\"\nmsgstr \"si=\"\n\n#: javaclasseditor-Offset\nmsgid \" offset=\"\nmsgstr \" 偏移量=\"\n\n#: javaclasseditor-IL\nmsgid \"Insert line\"\nmsgstr \"插入行\"\n\n#: javaclasseditor-ITJAC\nmsgid \"Input the java assembly code you wish to insert at line \"\nmsgstr \"输入要插入的 java 汇编代码，行号为 \"\n\n#: javaclasseditor-EL\nmsgid \"Edit line\"\nmsgstr \"编辑行\"\n\n#: javaclasseditor-DNL\nmsgid \"Define new label\"\nmsgstr \"定义新标签\"\n\n#: javaclasseditor-GALFL\nmsgid \"Give a labelname for line \"\nmsgstr \"为行提供标签名称 \"\n\n#: javaclasseditor-TIAALWTN\nmsgid \"There is already a label with this name\"\nmsgstr \"已经存在一个具有此名称的标签\"\n\n#: javaclasseditor-OBSNBS\nmsgid \"old bsize=%d new bsize=%d\"\nmsgstr \"旧 bsize=%d 新 bsize=%d\"\n\n#: javaclasseditor-OSNS\nmsgid \"old size=%d new size=%d\"\nmsgstr \"旧大小=%d 新大小=%d\"\n\n#: javaclasseditor-Method\nmsgid \"Method: \"\nmsgstr \"方法：\"\n\n#: javaclasseditor-MS\nmsgid \"Max Stack\"\nmsgstr \"最大堆栈\"\n\n#: javaclasseditor-ML\nmsgid \"Max Locals\"\nmsgstr \"最大局部变量\"\n\n#: javaclasseditor-SC\nmsgid \"Save changes\"\nmsgstr \"保存更改\"\n\n#: javaclasseditor-Index\nmsgid \"Index\"\nmsgstr \"索引\"\n\n#: javaclasseditor-BI\nmsgid \"ByteIndex\"\nmsgstr \"字节索引\"\n\n#: javaclasseditor-Label\nmsgid \"Label\"\nmsgstr \"标签\"\n\n#: javaclasseditor-Exception\nmsgid \"Exception\"\nmsgstr \"异常\"\n\n#: javaclasseditor-Instruction\nmsgid \"Instruction\"\nmsgstr \"指令\"\n\n#: javaclasseditor-DL\nmsgid \"Define label\"\nmsgstr \"定义标签\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/SaveSessions.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: SS-OaPF\nmsgid \"Open a process first\"\nmsgstr \"首先打开一个进程\"\n\n#: SS-CESF\nmsgid \"Cheat Engine Scan files\"\nmsgstr \"Cheat Engine 扫描文件\"\n\n#: SS-OaPFDaS\nmsgid \"Open a process first and do a scan\"\nmsgstr \"首先打开一个进程并进行扫描\"\n\n#: SS-SSS\nmsgid \"Save scan session\"\nmsgstr \"保存扫描会话\"\n\n#: SS-LSS\nmsgid \"Load scan session\"\nmsgstr \"加载扫描会话\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/Tutorial-x86_64.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: tform1.button1.hint\nmsgid \"Click this to continue!!!\"\nmsgstr \"点击此处继续！！！\"\n\n#: tform1.caption\nmsgid \"Cheat Engine Tutorial v3.4\"\nmsgstr \"Cheat Engine 教程 v3.4\"\n\n#: tform1.edtpassword.hint\nmsgid \"Use this to go imeadiatly to the step you want to try\"\nmsgstr \"使用此项立即跳转到你想尝试的步骤\"\n\n#: tform1.edtpassword.text\nmsgid \"090453\"\nmsgstr \"090453\"\n\n#: tform1.label1.caption\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: tform10.button3.caption\nmsgid \"Restart game\"\nmsgstr \"重启游戏\"\n\n#: tform10.caption\nmsgid \"Step 9\"\nmsgstr \"第 9 步\"\n\n#: tform10.label3.caption\nmsgid \"Player 1: Dave\"\nmsgstr \"玩家 1：Dave\"\n\n#: tform10.label5.caption\nmsgid \"Player 2: Eric\"\nmsgstr \"玩家 2：Eric\"\n\n#: tform10.label7.caption\nmsgid \"C. Player 3: HAL\"\nmsgstr \"C. 玩家 3：HAL\"\n\n#: tform10.label9.caption\nmsgid \"C. Player 4: KITT\"\nmsgstr \"C. 玩家 4：KITT\"\n\n#: tform2.caption\nmsgid \"Step 2\"\nmsgstr \"第 2 步\"\n\n#: tform3.caption\nmsgid \"Step 3\"\nmsgstr \"第 3 步\"\n\n#: tform3.label1.caption\nmsgid \" \"\nmsgstr \" \"\n\n#: tform4.caption\nmsgid \"Tutorial End\"\nmsgstr \"教程结束\"\n\n#: tform4.label1.caption\nmsgid \"Well done, you've completed the tutorial of Cheat Engine.\"\nmsgstr \"干得好，你已完成 Cheat Engine 的教程。\"\n\n#: tform4.label2.caption\nmsgid \"Just play around with the tutorial and learn how the other scanmethods work.\"\nmsgstr \"尽情玩弄教程，学习其他扫描方法的工作原理。\"\n\n#: tform4.label3.caption\nmsgid \"And you can always check out the Cheat Engine Forum for useful information and ask for help\"\nmsgstr \"你也可以随时查看 Cheat Engine 论坛以获取有用的信息并寻求帮助\"\n\n#: tform4.label4.caption\nmsgid \"Cheat Engine Forum\"\nmsgstr \"Cheat Engine 论坛\"\n\n#: tform5.button1.caption\nmsgid \"Fire\"\nmsgstr \"开火\"\n\n#: tform5.caption\nmsgid \"Step 4\"\nmsgstr \"第 4 步\"\n\n#: tform5.label2.caption\nmsgid \"Ammo\"\nmsgstr \"弹药\"\n\n#: tform5.label5.caption\nmsgid \"(float)\"\nmsgstr \"(浮点数)\"\n\n#: tform5.label6.caption\nmsgid \"(double)\"\nmsgstr \"(双精度)\"\n\n#: tform6.caption\nmsgid \"Step 5\"\nmsgstr \"第 5 步\"\n\n#: tform7.caption\nmsgid \"Step 6\"\nmsgstr \"第 6 步\"\n\n#: tform8.caption\nmsgid \"Step 7\"\nmsgstr \"第 7 步\"\n\n#: tform9.caption\nmsgid \"Step 8\"\nmsgstr \"第 8 步\"\n\n#: tfrmhelp.caption\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#: tfrmhelp.image1.hint\nmsgid \"More information like videos for this step and written tutorials\"\nmsgstr \"更多信息，如此步骤的视频和书面教程\"\n\n#: unit1.rsfirststeptoohardbettergiveupnow\nmsgid \"First step too hard? Go to forum.cheatengine.org, then click on \\\"Tutorials\\\" for helpful guides!\"\nmsgstr \"第一步太难了？请访问 forum.cheatengine.org，然后点击“教程”以获取有用的指南！\"\n\n#: unit1.rstutorial1\nmsgid \"\"\n\"Welcome to the Cheat Engine Tutorial (v3.6)\\n\"\n\"\\n\"\n\"This tutorial will teach you the basics of cheating in video games. It will also show you foundational aspects of using \"\n\"Cheat Engine (or CE for short). Follow the steps below to get started.\\n\"\n\"\\n\"\n\"1: Open Cheat Engine if it currently isn't running.\\n\"\n\"2: Click on the \\\"Open Process\\\" icon (it's the top-left icon with the computer on it, below \\\"File\\\".).\\n\"\n\"3: With the Process List window now open, look for this tutorial's process in the list. It will look something like \"\n\"\\\"00001F98-Tutorial-x86_64.exe\\\" or \\\"0000047C-Tutorial-i386.exe\\\". (The first 8 numbers/letters will probably be \"\n\"different.)\\n\"\n\"4: Once you've found the process, click on it to select it, then click the \\\"Open\\\" button. (Don't worry about all the \"\n\"other buttons right now. You can learn about them later if you're interested.)\\n\"\n\"\\n\"\n\"Congratulations! If you did everything correctly, the process window should be gone with Cheat Engine now attached to \"\n\"the tutorial (you will see the process name towards the top-center of CE).\\n\"\n\"\\n\"\n\"Click the \\\"Next\\\" button below to continue, or fill in the password and click the \\\"OK\\\" button to proceed to that \"\n\"step.)\\n\"\n\"\\n\"\n\"If you're having problems, simply head over to forum.cheatengine.org, then click on \\\"Tutorials\\\" to view \"\n\"beginner-friendly guides!\"\nmsgstr \"\"\n\"欢迎来到 Cheat Engine 教程（v3.6）\\n\"\n\"\\n\"\n\"本教程将教你在视频游戏中作弊的基础知识。它还将向你展示使用 Cheat Engine（简称 CE）的基础方面。请按照以下步骤开始。\\n\"\n\"\\n\"\n\"1：如果 Cheat Engine 当前未运行，请打开它。\\n\"\n\"2：点击“打开进程”图标（它是左上角的图标，下面是“文件”。）。\\n\"\n\"3：在进程列表窗口打开后，在列表中查找本教程的进程。它看起来像“00001F98-Tutorial-x86_64.exe”或“0000047C-Tutorial-i386.exe”。（前 8 个数字/字母可能会不同。）\\n\"\n\"4：找到进程后，点击它以选择，然后点击“打开”按钮。（现在不用担心其他按钮。如果你感兴趣，可以稍后了解它们。）\\n\"\n\"\\n\"\n\"恭喜！如果你一切正确，进程窗口应该消失，Cheat Engine 现在已附加到教程上（你会在 CE 的顶部中心看到进程名称）。\\n\"\n\"\\n\"\n\"点击下面的“下一步”按钮继续，或填写密码并点击“确定”按钮以继续到该步骤。）\\n\"\n\"\\n\"\n\"如果你遇到问题，只需访问 forum.cheatengine.org，然后点击“教程”以查看适合初学者的指南！\"\n\n#: unit10.rsdead\nmsgid \"DEAD\"\nmsgstr \"死亡\"\n\n#: unit10.rsfailureyourteamdied\nmsgid \"Failure. Your team died\"\nmsgstr \"失败。你的队伍已经死亡\"\n\n#: unit10.rshealth\n#, object-pascal-format\nmsgid \"Health: %s\"\nmsgstr \"生命值：%s\"\n\n#: unit10.rsstep9sharedcodepw\n#, object-pascal-format\nmsgid \"Step 9: Shared code: (PW=%s)\"\nmsgstr \"步骤 9：共享代码：（PW=%s）\"\n\n#: unit10.rsstop\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: unit10.rsthisplayerisalreadydeadrestartthegame\nmsgid \"This player is already dead. Restart the game\"\nmsgstr \"这个玩家已经死了。重新启动游戏\"\n\n#: unit10.rstryagain10\nmsgid \"\"\n\"Can't figure out how to do this? Don't worry. Try asking in the forum at cheatengine.org or perhaps someone already \"\n\"explained it better there. Are you sure you want to quit?\"\nmsgstr \"不知道怎么做？别担心。试着在 cheatengine.org 的论坛上询问，或者也许那里有人已经更好地解释过了。你确定要退出吗？\"\n\n#: unit10.rstutorialstep9\nmsgid \"\"\n\"This step will explain how to deal with code that is used for other object of the same type\\n\"\n\"\\n\"\n\"Often when you've found health of a unit or your own player, you will find that if you remove the code, it affects \"\n\"enemies as well.\\n\"\n\"In these cases you must find out how to distinguish between your and the enemies objects.\\n\"\n\"Sometimes this is as easy as checking the first 4 bytes (Function pointer table) which often point to a unique location \"\n\"for the player, and sometimes it's a team number, or a pointer to a pointer to a pointer to a pointer to a pointer to a \"\n\"playername. It all depends on the complexity of the game, and your luck\\n\"\n\"\\n\"\n\"The easiest method is finding what addresses the code you found writes to and then use the dissect data feature to \"\n\"compare against two structures. (Your unit(s)/player and the enemies) And then see if you can find out a way to \"\n\"distinguish between them.\\n\"\n\"When you have found out how to distinguish between you and the computer you can inject an assembler script that checks \"\n\"for the condition and then either do not execute the code or do something else. (One hit kills for example)\\n\"\n\"Alternatively, you can also use this to build a so called \\\"Array of byte\\\" string which you can use to search which \"\n\"will result in a list of all your or the enemies players\\n\"\n\"In this tutorial I have implemented the most amazing game you will ever play.\\n\"\n\"It has 4 players. 2 Players belong to your team, and 2 Players belong to the computer. \\n\"\n\"Your task is to find the code that writes the health and make it so you win the game WITHOUT freezing your health\\n\"\n\"To continue, press \\\"Restart game and autoplay\\\" to test that your code is correct\\n\"\n\"\\n\"\n\"\\n\"\n\"Tip: Health is a float\\n\"\n\"Tip2: There are multiple solutions\"\nmsgstr \"\"\n\"这一步将解释如何处理用于其他相同类型对象的代码\\n\"\n\"\\n\"\n\"通常，当你找到一个单位或你自己的玩家的生命值时，你会发现如果你移除代码，它也会影响敌人。\\n\"\n\"在这些情况下，你必须找出如何区分你和敌人的对象。\\n\"\n\"有时这就像检查前 4 个字节（函数指针表）一样简单，这通常指向玩家的唯一位置，有时是一个队伍编号，或者是一个指向指针的指针的指针的指针的指针，指向一个玩家名称。这一切都取决于游戏的复杂性和你的运气。\\n\"\n\"\\n\"\n\"最简单的方法是找到你发现的代码写入的地址，然后使用解剖数据功能进行两个结构的比较。（你的单位/玩家和敌人）然后看看你是否能找到区分它们的方法。\\n\"\n\"当你找出如何区分你和计算机时，你可以注入一个汇编脚本，检查条件，然后要么不执行代码，要么做其他事情。（例如一击必杀）\\n\"\n\"另外，你也可以用这个来构建一个所谓的“字节数组”字符串，你可以用它来搜索，这将导致你所有或敌人玩家的列表。\\n\"\n\"在本教程中，我实现了你将玩过的最惊人的游戏。\\n\"\n\"它有 4 个玩家。2 个玩家属于你的队伍，2 个玩家属于计算机。\\n\"\n\"你的任务是找到写入生命值的代码，并使你赢得游戏，而不冻结你的生命值。\\n\"\n\"要继续，请按“重新启动游戏并自动播放”以测试你的代码是否正确。\\n\"\n\"\\n\"\n\"提示：生命值是一个浮点数\\n\"\n\"提示2：有多种解决方案\"\n\n#: unit10.rsu10thiswasthelasttutorial\nmsgid \"This was the last tutorial and you skipped it. You lose\"\nmsgstr \"这是最后一个教程，你跳过了它。你输了\"\n\n#: unit2.rsquittingonstep2thisistheeasieststepthereisfindheal\nmsgid \"Quitting on step2? This is the easiest step there is. Find health, change health, done.... Sure you want to quit?\"\nmsgstr \"在第 2 步退出？这是最简单的一步。找到生命值，改变生命值，完成……你确定要退出吗？\"\n\n#: unit2.rsstep2exactvaluescanningpw\nmsgid \"Step 2: Exact Value scanning (PW=\"\nmsgstr \"第 2 步：精确值扫描（PW=\"\n\n#: unit2.rstutorialstep2\nmsgid \"\"\n\"Now that you have opened the tutorial with Cheat Engine let's get on with the next step.\\n\"\n\"\\n\"\n\"You can see at the bottom of this window is the text Health: xxx\\n\"\n\"Each time you click 'Hit me'  your health gets decreased.\\n\"\n\"\\n\"\n\"To get to the next step you have to find this value and change it to 1000\\n\"\n\"\\n\"\n\"To find the value there are different ways, but I'll tell you about the easiest, 'Exact Value':\\n\"\n\"First make sure value type is set to at least 2-bytes or 4-bytes. 1-byte will also work, but you'll run into an easy to \"\n\"fix problem when you've found the address and want to change it. The 8-byte may perhaps works if the bytes after the \"\n\"address are 0, but I wouldn't take the bet.\\n\"\n\"Single, double, and the other scans just don't work, because they store the value in a different way.\\n\"\n\"\\n\"\n\"When the value type is set correctly, make sure the scantype is set to 'Exact Value'\\n\"\n\"Then fill in the number your health is in the value box. And click 'First Scan'\\n\"\n\"After a while (if you have an extremely slow pc) the scan is done and the results are shown in the list on the left.\\n\"\n\"\\n\"\n\"If you find more than 1 address and you don't know for sure which address it is, click 'Hit me', fill in the new health \"\n\"value into the value box, and click 'Next Scan'\\n\"\n\"repeat this until you're sure you've found it. (that includes that there's only 1 address in the list.....)\\n\"\n\"\\n\"\n\"Now double click the address in the list on the left. This makes the address pop-up in the list at the bottom, showing \"\n\"you the current value.\\n\"\n\"Double click the value, (or select it and press enter), and change the value to 1000.\\n\"\n\"\\n\"\n\"If everything went ok the Next button should become enabled, and you're ready for the next step.\\n\"\n\"\\n\"\n\"\\n\"\n\"Note:\\n\"\n\"If you did anything wrong while scanning, click \\\"New Scan\\\" and repeat the scanning again.\\n\"\n\"Also, try playing around with the value and click 'Hit me'.\"\nmsgstr \"\"\n\"现在你已经用 Cheat Engine 打开了教程，让我们继续下一步。\\n\"\n\"\\n\"\n\"你可以在这个窗口的底部看到文本 生命值：xxx\\n\"\n\"每次你点击“打我”，你的生命值就会减少。\\n\"\n\"\\n\"\n\"要进入下一步，你必须找到这个值并将其更改为 1000。\\n\"\n\"\\n\"\n\"找到这个值有不同的方法，但我会告诉你最简单的方法，“精确值”：\\n\"\n\"首先确保值类型设置为至少 2 字节或 4 字节。1 字节也可以，但当你找到地址并想要更改它时，会遇到一个容易解决的问题。8 字节可能有效，如果地址后的字节为 0，但我不敢打赌。\\n\"\n\"单一、双重和其他扫描都不起作用，因为它们以不同的方式存储值。\\n\"\n\"\\n\"\n\"当值类型设置正确时，确保扫描类型设置为“精确值”。\\n\"\n\"然后在值框中填入你的生命值。然后点击“第一次扫描”。\\n\"\n\"过一会儿（如果你的电脑极其慢），扫描完成，结果会显示在左侧的列表中。\\n\"\n\"\\n\"\n\"如果你找到多个地址而不确定哪个地址是正确的，点击“打我”，在值框中填入新的生命值，然后点击“下一次扫描”。\\n\"\n\"重复这个过程，直到你确定找到了它。（这包括列表中只有一个地址……）\\n\"\n\"\\n\"\n\"现在双击左侧列表中的地址。这会使地址在底部的列表中弹出，显示当前值。\\n\"\n\"双击该值（或选择它并按回车），将值更改为 1000。\\n\"\n\"\\n\"\n\"如果一切顺利，下一步按钮应该变为可用状态，你准备好进行下一步。\\n\"\n\"\\n\"\n\"注意：\\n\"\n\"如果你在扫描时做错了什么，请点击“新扫描”，并重新进行扫描。\\n\"\n\"另外，尝试玩弄这个值并点击“打我”。\"\n\n#: unit3.rsdead\nmsgid \"Seems you've done it again! Let me get a replacement! (And restart your scan!)\"\nmsgstr \"看来你又做到了！让我给你换一个！(并重新开始你的扫描！)\"\n\n#: unit3.rsstep3unknowninitialvaluepw\nmsgid \"Step 3: Unknown initial value (PW=\"\nmsgstr \"步骤 3：未知初始值 (PW=\"\n\n#: unit3.rstryagain3\nmsgid \"\"\n\"Step 3 isn't really that hard. Just do a new scan, unkown initial value and then decreased value till you find it. \"\n\"Almost everyone gets past this one. Sure you want to quit?\"\nmsgstr \"步骤 3 其实并不难。只需进行新的扫描，未知初始值，然后减少值直到找到它。几乎每个人都能过这一关。你确定要退出吗？\"\n\n#: unit3.rstutorialstep3\nmsgid \"\"\n\"Ok, seeing that you've figured out how to find a value using exact value let's move on to the next step.\\n\"\n\"\\n\"\n\"First things first though. Since you are doing a new scan, you have to click on New Scan first, to start a new scan. \"\n\"(You may think this is straighforward, but you'd be surprised how many people get stuck on that step) I won't be \"\n\"explaining this step again, so keep this in mind.\\n\"\n\"Now that you've started a new scan, let's continue.\\n\"\n\"\\n\"\n\"In the previous test we knew the initial value so we could do an exact value search, but now we have a status bar where \"\n\"we don't know the starting value.\\n\"\n\"We only know that the value is between 0 and 500. And each time you click 'Hit me' you lose some health. The amount you \"\n\"lose each time is shown above the status bar.\\n\"\n\"\\n\"\n\"Again there are several different ways to find the value. (like doing a decreased value by... scan), but I'll only \"\n\"explain the easiest. \\\"Unknown initial value\\\", and decreased value.\\n\"\n\"Because you don't know the value it is right now, exact value wont do any good, so choose as scantype 'Unknown initial \"\n\"value', again, the value type is 4-bytes. (Most windows apps use 4-bytes.) Click First scan and wait till it's done.\\n\"\n\"\\n\"\n\"When it is done click 'Hit me'. You'll lose some of your health. (the amount you lost shows for a few seconds and then \"\n\"disappears, but you don't need that)\\n\"\n\"Now go to Cheat Engine, and choose 'Decreased Value' and click 'Next Scan'\\n\"\n\"When that scan is done, click 'Hit me' again, and repeat the above till you only find a few. \\n\"\n\"\\n\"\n\"We know the value is between 0 and 500, so pick the one that is most likely the address we need, and add it to the \"\n\"list.\\n\"\n\"Now change the health to 5000, to proceed to the next step.\"\nmsgstr \"\"\n\"好的，既然你已经弄明白了如何使用精确值找到一个值，我们就继续下一步。\\n\"\n\"\\n\"\n\"不过首先要说的是。由于你正在进行新的扫描，你必须先点击“新扫描”来开始新的扫描。（你可能认为这很简单，但你会惊讶于有多少人卡在这一步）我不会再解释这一步，所以请记住这一点。\\n\"\n\"现在你已经开始了新的扫描，我们继续。\\n\"\n\"\\n\"\n\"在之前的测试中，我们知道初始值，所以可以进行精确值搜索，但现在我们有一个状态栏，我们不知道起始值。\\n\"\n\"我们只知道这个值在 0 和 500 之间。每次你点击“打我”，你会失去一些生命值。每次你失去的量会在状态栏上方显示。\\n\"\n\"\\n\"\n\"再次强调，有几种不同的方法可以找到这个值。（比如进行减少值扫描），但我只会解释最简单的方法。“未知初始值”和减少值。\\n\"\n\"因为你现在不知道这个值，所以精确值没有任何用处，所以选择扫描类型为“未知初始值”，再次强调，值类型是 4 字节。（大多数 Windows 应用程序使用 4 字节。）点击“第一次扫描”，并等待完成。\\n\"\n\"\\n\"\n\"完成后点击“打我”。你会失去一些生命值。（你失去的量会显示几秒钟然后消失，但你不需要那个）\\n\"\n\"现在去 Cheat Engine，选择“减少值”，然后点击“下一次扫描”\\n\"\n\"当那次扫描完成后，再次点击“打我”，并重复上述步骤，直到你只找到几个。\\n\"\n\"\\n\"\n\"我们知道这个值在 0 和 500 之间，所以选择最有可能是我们需要的地址，并将其添加到列表中。\\n\"\n\"现在将生命值改为 5000，以继续下一步。\"\n\n#: unit5.rsconfirmclose5\nmsgid \"\"\n\"Come on. This step is simple. For health do a float scan, and for ammo a double type. (don't forget to disable fastscan \"\n\"for double in this case) Just ignore the fact that it looks different because it has a \\\".\\\" in the value. You sure you \"\n\"want to quit?\"\nmsgstr \"来吧。这一步很简单。对于生命值做一个浮点扫描，对于弹药做一个双精度类型的扫描。（在这种情况下，不要忘记禁用双精度的快速扫描）只需忽略它看起来不同的事实，因为它的值中有一个“.”。你确定要退出吗？\"\n\n#: unit5.rsdead\n#, object-pascal-format\nmsgid \"I think you're dead!%sPress ok to become a brain eating zombie\"\nmsgstr \"我想你死了！%s点击确定变成一个吃脑的僵尸\"\n\n#: unit5.rsoutofammo\n#, object-pascal-format\nmsgid \"Out of ammo!%sPress ok to stock up on some ammo\"\nmsgstr \"弹药用完了！%s点击确定补充一些弹药\"\n\n#: unit5.rsstep4floatingpointspw\nmsgid \"Step 4: Floating points (PW=\"\nmsgstr \"步骤 4：浮点数（PW=\"\n\n#: unit5.rstutorialstep4\nmsgid \"\"\n\"In the previous tutorial we used bytes to scan, but some games store information in so called 'floating point' \"\n\"notations. \\n\"\n\"(probably to prevent simple memory scanners from finding it the easy way)\\n\"\n\"a floating point is a value with some digits behind the point. (like 5.12 or 11321.1)\\n\"\n\"\\n\"\n\"Below you see your health and ammo. Both are stored as Floating point notations, but health is stored as a float and \"\n\"ammo is stored as a double.\\n\"\n\"Click on hit me to lose some health, and on shoot to decrease your ammo with 0.5\\n\"\n\" \\n\"\n\"You have to set BOTH values to 5000 or higher to proceed.\\n\"\n\"\\n\"\n\"Exact value scan will work fine here, but you may want to experiment with other types too.\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"Hint: It is recommended to disable \\\"Fast Scan\\\" for type double\"\nmsgstr \"\"\n\"在之前的教程中，我们使用字节进行扫描，但有些游戏将信息存储在所谓的“浮点”表示法中。 \\n\"\n\"（可能是为了防止简单的内存扫描器轻易找到它）\\n\"\n\"浮点数是一个在小数点后有一些数字的值。（像 5.12 或 11321.1）\\n\"\n\"\\n\"\n\"下面你可以看到你的生命值和弹药。两者都以浮点表示法存储，但生命值存储为浮点数，弹药存储为双精度数。\\n\"\n\"点击“打我”以失去一些生命值，点击“射击”以减少 0.5 的弹药\\n\"\n\" \\n\"\n\"你必须将两个值都设置为 5000 或更高才能继续。\\n\"\n\"\\n\"\n\"精确值扫描在这里效果很好，但你可能也想尝试其他类型。\\n\"\n\"\\n\"\n\"提示：建议为双精度类型禁用“快速扫描”\"\n\n#: unit6.rsstep5codefinderpw\n#, object-pascal-format\nmsgid \"Step 5: Code finder (PW=%s)\"\nmsgstr \"步骤 5：代码查找器（PW=%s）\"\n\n#: unit6.rstryagain6\nmsgid \"\"\n\"This may look difficult, but it shouldn't be. Basically find health, right click health, find what overwrites it, \"\n\"change health, click replace, change health, done.  But don't feel down if you don't get it. At least you know the \"\n\"basics of memory scanning...  Are you sure you want to quit?\"\nmsgstr \"这看起来可能很困难，但其实并不是。基本上找到生命值，右键点击生命值，查找覆盖它的内容，改变生命值，点击替换，改变生命值，完成。但如果你没有成功，也不要沮丧。至少你知道内存扫描的基础知识……你确定要退出吗？\"\n\n#: unit6.rstutorialstep5\nmsgid \"\"\n\"Sometimes the location of a value is stored at changes, when you restart the game, or even while you're playing. In \"\n\"that case you can use 2 things to still make a table that works.\\n\"\n\"In this step I'll try to describe how to use the Code Finder function.\\n\"\n\"\\n\"\n\"The value down here will be at a different location each time you start the tutorial, so a normal entry in the address \"\n\"list wouldn't work.\\n\"\n\"First try to find the address. (You've got to this point so I assume you know how to do that.)\\n\"\n\"When you've found the address, right-click the address in Cheat Engine and choose \\\"Find out what writes to this \"\n\"address\\\". A window will pop up with an empty list.\\n\"\n\"Then click on the Change value button in this tutorial, and go back to Cheat Engine. If everything went right, there \"\n\"should be an address with assembler code there now.\\n\"\n\"Click it and choose the Replace option to replace it with code that does nothing. That will also add the code address \"\n\"to the code list in the Advanced Options window. (Which gets saved if you save your table.)\\n\"\n\"\\n\"\n\"Click on Stop, so the game will start running normal again, and click on Close to close the window.\\n\"\n\"Now, click on Change value, and if everything went right the Next button should become enabled.\\n\"\n\"\\n\"\n\"Note: When you're freezing the address with a high enough speed it may happen that Next becomes visible anyhow.\"\nmsgstr \"\"\n\"有时候，值的位置会在你重启游戏时或甚至在你玩的时候发生变化。在这种情况下，你可以使用两种方法来制作一个有效的表格。在这一步，我将尝试描述如何使用代码查找器功能。\\n\"\n\"\\n\"\n\"这里的值在每次开始教程时都会位于不同的位置，因此地址列表中的普通条目将无法使用。首先尝试找到地址。（你已经到达这一点，所以我假设你知道怎么做。）当你找到地址后，在 Cheat Engine \"\n\"中右键点击该地址，选择“查找写入此地址的内容”。会弹出一个窗口，里面有一个空列表。然后点击本教程中的更改值按钮，返回 Cheat \"\n\"Engine。如果一切顺利，现在应该会有一个带有汇编代码的地址。点击它并选择替换选项，将其替换为不执行任何操作的代码。这也会将代码地址添加到高级选项窗口中的代码列表中。（如果你保存你的表格，这个列表会被保存。）\\n\"\n\"\\n\"\n\"点击停止，这样游戏将恢复正常运行，然后点击关闭以关闭窗口。现在，点击更改值，如果一切顺利，下一步按钮应该会变为可用。\\n\"\n\"\\n\"\n\"注意：当你以足够快的速度冻结地址时，下一步按钮可能会以某种方式变得可见。\"\n\n#: unit7.rsdontfuckingfreezethepointer\nmsgid \"I'm sorry, but freezing the pointer is not really a functional solution\"\nmsgstr \"抱歉，但冻结指针并不是一个真正有效的解决方案\"\n\n#: unit7.rsstep6pointerspw\n#, object-pascal-format\nmsgid \"Step 6: Pointers: (PW=%s)\"\nmsgstr \"步骤 6：指针：（PW=%s）\"\n\n#: unit7.rstryagain7\nmsgid \"\"\n\"So, pointers are too difficult eh? Don't worry, try again later. For most beginners this is difficult to grasp. But I \"\n\"have to tell you it's a powerful feature if you learn to use it. Are you sure you want to quit?\"\nmsgstr \"所以，指针太难了，是吗？别担心，稍后再试。对于大多数初学者来说，这很难理解。但我必须告诉你，如果你学会使用它，这是一个强大的功能。你确定要退出吗？\"\n\n#: unit7.rstutorialstep6\nmsgid \"\"\n\"In the previous step I explained how to use the Code finder to handle changing locations. But that method alone makes \"\n\"it difficult to find the address to set the values you want.\\n\"\n\"That's why there are pointers:\\n\"\n\"\\n\"\n\"At the bottom you'll find 2 buttons. One will change the value, and the other changes the value AND the location of the \"\n\"value.\\n\"\n\"For this step you don't really need to know assembler, but it helps a lot if you do.\\n\"\n\"\\n\"\n\"First find the address of the value. When you've found it use the function to find out what accesses this address.\\n\"\n\"Change the value again, and an item will show up in the list. Double click that item. (or select and click on more \"\n\"info) and a new window will open with detailed information on what happened when the instruction ran.\\n\"\n\"If the assembler instruction doesn't have anything between a '[' and ']' then use another item in the list.\\n\"\n\"If it does it will say what it think will be the value of the pointer you need.\\n\"\n\"Go back to the main cheat engine window (you can keep this extra info window open if you want, but if you close it, \"\n\"remember what is between the '[' and ']' ) and do a 4 byte scan in hexadecimal for the value the extra info told you.\\n\"\n\"When done scanning it may return 1 or a few hundred addresses. Most of the time the address you need will be the \"\n\"smallest one. Now click on the \\\"Add Address Manually\\\" button and select the pointer checkbox.\\n\"\n\"\\n\"\n\"The window will change and allow you to type in the address of a pointer and an offset.\\n\"\n\"Fill in the address you just found. It can be in the form: \\\"Tutorial-i386.exe\\\"+xxxxxx (relative to the process), \\n\"\n\"or you can double click the address to add it to the address list and use the absolute address which appears there.\\n\"\n\"If the assembler instruction has a calculation (e.g: [esi+12]) at the end then type the value in that's at the end \"\n\"above the address field. This is the offset. Otherwise leave it 0. If it was a more complicated instruction look at the \"\n\"following calculation.\\n\"\n\"\\n\"\n\"Example of a more complicated instruction:\\n\"\n\"[EAX*2+EDX+00000310] eax=4C and edx=00801234.\\n\"\n\"In this case EDX would be the value the pointer has, and EAX*2+00000310 the offset, so the offset you'd fill in would \"\n\"be 2*4C+00000310=3A8. (This is all in hex, use calc.exe from Windows in Programmer mode to calculate hex values.)\\n\"\n\"\\n\"\n\"Back to the tutorial, click OK and the address will be added. If all went right the address will show P->xxxxxxx, with \"\n\"xxxxxxx being the address of the value you found. If that's not right, you've done something wrong.\\n\"\n\"Now, change the value using the pointer you added in to 5000 and click in the 'Active' coloumn to freeze it. Then click \"\n\"Change pointer, and if all went right the Next button will become visible.\\n\"\n\"\\n\"\n\"\\n\"\n\"extra:\\n\"\n\"You could also use the pointer scanner to find the pointer to this address. \"\n\"https://cheatengine.org/help/pointer-scan.htm\"\nmsgstr \"\"\n\"在前一步中，我解释了如何使用代码查找器来处理变化的位置。但仅靠这种方法很难找到设置你想要的值的地址。这就是为什么有指针的原因：\\n\"\n\"\\n\"\n\"在底部你会找到两个按钮。一个将更改值，另一个将更改值和位置。对于这一步，你并不需要真正了解汇编语言，但如果你了解的话会有很大帮助。\\n\"\n\"\\n\"\n\"首先找到值的地址。当你找到它时，使用该功能找出是什么访问了这个地址。再次更改值，列表中将出现一个项目。双击该项目。（或选择并点击更多信息）将打开一个新窗口，详细信息将显示指令运行时发生了什么。如果汇编指令在 '[' 和 ']' \"\n\"之间没有任何内容，则使用列表中的另一个项目。如果有，它将说明你需要的指针的值是什么。返回到主作弊引擎窗口（如果你想，可以保持这个额外信息窗口打开，但如果你关闭它，请记住 '[' 和 ']' 之间的内容），并对额外信息告诉你的值进行 4 \"\n\"字节的十六进制扫描。当扫描完成时，它可能会返回 1 或几百个地址。大多数情况下，你需要的地址将是最小的。现在点击“手动添加地址”按钮并选择指针复选框。\\n\"\n\"\\n\"\n\"窗口将更改并允许你输入指针的地址和偏移量。填写你刚找到的地址。它可以是以下形式：“Tutorial-i386.exe”+\"\n\"xxxxxx（相对于进程），或者你可以双击地址将其添加到地址列表中，并使用那里出现的绝对地址。如果汇编指令在末尾有计算（例如：[esi+12]），则在地址字段上方输入末尾的值。这是偏移量。否则，保持为 \"\n\"0。如果这是一个更复杂的指令，请查看以下计算。\\n\"\n\"\\n\"\n\"更复杂指令的示例：\\n\"\n\"[EAX*2+EDX+00000310] eax=4C 和 edx=00801234。在这种情况下，EDX 将是指针的值，而 EAX*2+00000310 是偏移量，因此你填写的偏移量将是 \"\n\"2*4C+00000310=3A8。（这一切都是十六进制的，使用 Windows 的计算器程序员模式来计算十六进制值。）\\n\"\n\"\\n\"\n\"回到教程，点击确定，地址将被添加。如果一切顺利，地址将显示为 P->xxxxxxx，xxxxxxx 是你找到的值的地址。如果不对，你做错了什么。现在，使用你添加的指针将值更改为 \"\n\"5000，并点击“活动”列以冻结它。然后点击更改指针，如果一切顺利，下一步按钮将变得可见。\\n\"\n\"\\n\"\n\"额外：\\n\"\n\"你也可以使用指针扫描器找到指向此地址的指针。https://cheatengine.org/help/pointer-scan.htm\"\n\n#: unit7.rsyouvegotsecondslefttochangethevalueto5000\n#, object-pascal-format\nmsgid \"You have %s second%s left to change the value to 5000\"\nmsgstr \"你还有 %s 秒%s 来将值更改为 5000\"\n\n#: unit8.rshealth\nmsgid \"Health\"\nmsgstr \"健康\"\n\n#: unit8.rsstep7codeinjectionpw\n#, object-pascal-format\nmsgid \"Step 7: Code Injection: (PW=%s)\"\nmsgstr \"步骤 7：代码注入：（PW=%s）\"\n\n#: unit8.rstryagain8\nmsgid \"\"\n\"Code injections too tough? No problem, memory scanning and basic pointers should be enough to get you experienced \"\n\"enough and you can always try the tutorial later. Are you sure you want to quit?\"\nmsgstr \"代码注入太难了吗？没问题，内存扫描和基本指针应该足够让你积累经验，你总是可以稍后尝试教程。你确定要退出吗？\"\n\n#: unit8.rstutorialstep7\nmsgid \"\"\n\"Code injection is a technique where you inject a piece of code into the target process, and then reroute the execution \"\n\"of code to go through your own written code.\\n\"\n\"\\n\"\n\"In this tutorial you'll have a health value and a button that will decrease your health by 1 each time you click it.\\n\"\n\"Your task is to use code injection to make the button increase your health by 2 each time it is clicked.\\n\"\n\"\\n\"\n\"Start with finding the address and then find what writes to it.\\n\"\n\"Then when you've found the code that decreases it browse to that address in the disassembler, and open the auto \"\n\"assembler window (Ctrl+A).\\n\"\n\"There click on template and then code injection, and give it the address that decreases health (if it isn't already \"\n\"filled in correctly).\\n\"\n\"That will generate a basic auto assembler injection framework you can use for your code.\\n\"\n\"\\n\"\n\"Notice the alloc, that will allocate a block of memory for your code cave, in the past, in the pre windows 2000 \"\n\"systems, people had to find code caves in the memory (regions of memory unused by the game), but that's luckily a thing \"\n\"of the past since windows 2000, and will these days cause errors when trying to be used, due to SP2 of XP and the NX \"\n\"bit of new CPUs.\\n\"\n\"\\n\"\n\"Also notice the line newmem: and originalcode: and the text \\\"Place your code here\\\".\\n\"\n\"As you guessed it, write your code here that will increase the health with 2.\\n\"\n\"A useful assembler instruction in this case is the \\\"ADD instruction\\\".\\n\"\n\"\\n\"\n\"Here are a few examples:\\n\"\n\"\\\"ADD [00901234],9\\\" to increase the address at 00901234 with 9\\n\"\n\"\\\"ADD [ESP+4],9\\\" to increase the address pointed to by ESP+4 with 9\\n\"\n\"In this case, you'll have to use the same thing between the brackets as the original code has that decreases your \"\n\"health.\\n\"\n\"\\n\"\n\"Notice:\\n\"\n\"It is recommended to delete the line that decreases your health from the original code section, else you'll have to \"\n\"increase your health with 3 (you increase with 3, the original code decreases with 1, so the end result is increase \"\n\"with 2), which might become confusing. But it's all up to you and your programming.\\n\"\n\"\\n\"\n\"Notice 2:\\n\"\n\"In some games the original code can exist out of multiple instructions, and sometimes, not always, it might happen that \"\n\"a code at another place jumps into your jump instruction end will then cause unknown behavior. If that happens, you \"\n\"should usually look near that instruction and see the jumps and fix it, or perhaps even choose to use a different \"\n\"address to do the code injection from. As long as you're able to figure out the address to change from inside your \"\n\"injected code.\"\nmsgstr \"\"\n\"代码注入是一种将一段代码注入目标进程的技术，然后重新路由代码的执行，使其通过你自己编写的代码。\\n\"\n\"\\n\"\n\"在本教程中，你将拥有一个健康值和一个按钮，每次点击它都会减少你的健康值 1。\\n\"\n\"你的任务是使用代码注入使按钮每次点击时增加你的健康值 2。\\n\"\n\"\\n\"\n\"首先找到地址，然后找出写入该地址的代码。\\n\"\n\"然后，当你找到减少健康值的代码时，在反汇编器中浏览到该地址，并打开自动汇编窗口（Ctrl+A）。\\n\"\n\"在这里点击模板，然后选择代码注入，并给它填入减少健康值的地址（如果尚未正确填入）。\\n\"\n\"这将生成一个基本的自动汇编注入框架，你可以用来编写你的代码。\\n\"\n\"\\n\"\n\"注意 alloc，它将为你的代码洞分配一块内存。在过去，在 Windows 2000 之前的系统中，人们必须在内存中找到代码洞（游戏未使用的内存区域），但幸运的是，自 Windows 2000 \"\n\"以来，这已成为过去的事情，并且在尝试使用时会导致错误，因为 XP 的 SP2 和新 CPU 的 NX 位。\\n\"\n\"\\n\"\n\"还要注意 newmem: 和 originalcode: 以及文本“在这里放置你的代码”。\\n\"\n\"如你所猜测的，在这里编写你的代码，使健康值增加 2。\\n\"\n\"在这种情况下，一个有用的汇编指令是“ADD 指令”。\\n\"\n\"\\n\"\n\"以下是一些示例：\\n\"\n\"“ADD [00901234],9” 将地址 00901234 增加 9\\n\"\n\"“ADD [ESP+4],9” 将 ESP+4 指向的地址增加 9\\n\"\n\"在这种情况下，你必须在括号中使用与减少健康值的原始代码相同的内容。\\n\"\n\"\\n\"\n\"注意：\\n\"\n\"建议从原始代码部分删除减少健康值的行，否则你将不得不将健康值增加 3（你增加 3，原始代码减少 1，因此最终结果是增加 2），这可能会变得令人困惑。但这完全取决于你和你的编程。\\n\"\n\"\\n\"\n\"注意 2：\\n\"\n\"在某些游戏中，原始代码可能由多个指令组成，有时（并不总是）可能会发生其他地方的代码跳转到你的跳转指令末尾，从而导致未知行为。如果发生这种情况，通常应该查看该指令附近的跳转并修复它，或者甚至选择使用不同的地址进行代码注入。只要你能够找出从注入\"\n\"代码内部更改的地址即可。\"\n\n#: unit9.rsstep8multilevelpointerspw\n#, object-pascal-format\nmsgid \"Step 8: Multilevel pointers: (PW=%s)\"\nmsgstr \"步骤 8：多级指针：（PW=%s）\"\n\n#: unit9.rstryagain9\nmsgid \"\"\n\"Aw, you've almost reached the end. But don't worry, multilevel pointers can be a real pain when dealing with. If you \"\n\"get more experienced someday you can try it again. Are you sure you want to quit?\"\nmsgstr \"哦，你几乎到达了终点。但别担心，多级指针在处理时可能会非常麻烦。如果你有一天变得更有经验，可以再试一次。你确定要退出吗？\"\n\n#: unit9.rstutorialstep8\nmsgid \"\"\n\"This step will explain how to use multi-level pointers.\\n\"\n\"In step 6 you had a simple level-1 pointer, with the first address found already being the real base address.\\n\"\n\"This step however is a level-4 pointer. It has a pointer to a pointer to a pointer to a pointer to a pointer to the \"\n\"health.\\n\"\n\"\\n\"\n\"You basicly do the same as in step 6. Find out what accesses the value, look at the instruction and what probably is \"\n\"the base pointer value, and what is the offset, and already fill that in or write it down. But in this case the address \"\n\"you'll find will also be a pointer. You just have to find out the pointer to that pointer exactly the same way as you \"\n\"did with the value. Find out what accesses that address you found, look at the assembler instruction, note the probable \"\n\"instruction and offset, and use that.\\n\"\n\"And continue till you can't get any further (usually when the base address is a static address, shown up as green.)\\n\"\n\"\\n\"\n\"Click Change Value to let the tutorial access the health.\\n\"\n\"If you think you've found the pointer path click Change Register. The pointers and value will then change and you'll \"\n\"have 3 seconds to freeze the address to 5000.\\n\"\n\"\\n\"\n\"Extra: This problem can also be solved using an auto assembler script, or using the pointer scanner.\\n\"\n\"Extra2: In some situations it is recommended to change CE's Codefinder settings to Access violations when \\n\"\n\"encountering instructions like mov eax,[eax] since debug registers show it AFTER it was changed, making it hard to find \"\n\"out the value of the pointer.\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"Extra3: If you're still reading. You might notice that when looking at the assembler instructions that the pointer is \"\n\"being read and filled out in the same codeblock (same routine, if you know assembler, look up till the start of the \"\n\"routine). This doesn't always happen, but can be really useful in finding a pointer when debugging is troublesome.\"\nmsgstr \"\"\n\"本步骤将解释如何使用多级指针。\\n\"\n\"在第 6 步中，你有一个简单的一级指针，找到的第一个地址已经是实际的基地址。\\n\"\n\"然而，本步骤是一个四级指针。它有一个指向指针的指针，指向指针的指针，指向指针的指针，指向健康值。\\n\"\n\"\\n\"\n\"你基本上和第 6 \"\n\"步做的一样。找出是什么访问了该值，查看指令以及可能的基指针值，以及偏移量，并填写或记下它。但在这种情况下，你找到的地址也将是一个指针。你只需以与处理值时完全相同的方式找出该指针。找出是什么访问了你找到的地址，查看汇编指令，记录可能的指令和偏\"\n\"移量，并使用它。\\n\"\n\"继续进行，直到无法再继续（通常当基地址是静态地址时，会显示为绿色）。\\n\"\n\"\\n\"\n\"点击更改值以让教程访问健康值。\\n\"\n\"如果你认为你找到了指针路径，请点击更改寄存器。指针和值将会改变，你将有 3 秒钟的时间将地址冻结为 5000。\\n\"\n\"\\n\"\n\"额外：这个问题也可以通过使用自动汇编脚本或指针扫描器来解决。\\n\"\n\"额外 2：在某些情况下，建议在遇到像 mov eax,[eax] 这样的指令时，将 CE 的代码查找设置更改为访问冲突，因为调试寄存器在更改后显示，使得很难找出指针的值。\\n\"\n\"\\n\"\n\"额外 3：如果你还在阅读。你可能会注意到，在查看汇编指令时，指针在同一代码块中被读取和填充（同一例程，如果你知道汇编，请查找例程的开始）。这并不总是发生，但在调试困难时找到指针时可能非常有用。\"\n\n#: unit9.rsunrandomizerdetected\nmsgid \"Unrandomizer detected\"\nmsgstr \"检测到 Unrandomizer\"\n\n#: unit9.rsyouvegotsecondslefttochangethevalueto5000\n#, object-pascal-format\nmsgid \"You've got %s seconds left to change the value to 5000\"\nmsgstr \"你还有 %s 秒的时间将值更改为 5000\"\n\n#: tform1.btnok.caption\nmsgctxt \"tform1.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tform1.button1.caption\nmsgctxt \"tform1.button1.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform10.button4.caption\nmsgctxt \"tform10.button4.caption\"\nmsgid \"Attack\"\nmsgstr \"攻击\"\n\n#: tform10.button5.caption\nmsgctxt \"tform10.button5.caption\"\nmsgid \"Attack\"\nmsgstr \"攻击\"\n\n#: tform10.button6.caption\nmsgctxt \"tform10.button6.caption\"\nmsgid \"Restart game and autoplay\"\nmsgstr \"重新启动游戏并自动播放\"\n\n#: tform10.button7.caption\nmsgctxt \"tform10.button7.caption\"\nmsgid \"Attack\"\nmsgstr \"攻击\"\n\n#: tform10.button8.caption\nmsgctxt \"tform10.button8.caption\"\nmsgid \"Attack\"\nmsgstr \"攻击\"\n\n#: tform10.label1.caption\nmsgctxt \"tform10.label1.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform10.label10.caption\nmsgctxt \"tform10.label10.caption\"\nmsgid \"Health: 500\"\nmsgstr \"生命值：500\"\n\n#: tform10.label2.caption\nmsgctxt \"tform10.label2.caption\"\nmsgid \"Health:\"\nmsgstr \"生命值：\"\n\n#: tform10.label4.caption\nmsgctxt \"tform10.label4.caption\"\nmsgid \"Health: 100\"\nmsgstr \"生命值：100\"\n\n#: tform10.label6.caption\nmsgctxt \"tform10.label6.caption\"\nmsgid \"Health: 100\"\nmsgstr \"生命值：100\"\n\n#: tform10.label8.caption\nmsgctxt \"tform10.label8.caption\"\nmsgid \"Health: 500\"\nmsgstr \"生命值：500\"\n\n#: tform2.button1.caption\nmsgctxt \"tform2.button1.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform2.button2.caption\nmsgctxt \"tform2.button2.caption\"\nmsgid \"Hit me\"\nmsgstr \"打我\"\n\n#: tform2.label1.caption\nmsgctxt \"tform2.label1.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform2.label2.caption\nmsgctxt \"tform2.label2.caption\"\nmsgid \"Health:\"\nmsgstr \"生命值：\"\n\n#: tform2.speedbutton1.caption\nmsgctxt \"tform2.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: tform3.button1.caption\nmsgctxt \"tform3.button1.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform3.button2.caption\nmsgctxt \"tform3.button2.caption\"\nmsgid \"Hit me\"\nmsgstr \"打我\"\n\n#: tform3.speedbutton1.caption\nmsgctxt \"tform3.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: tform4.button1.caption\nmsgctxt \"tform4.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tform5.button2.caption\nmsgctxt \"tform5.button2.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform5.button3.caption\nmsgctxt \"tform5.button3.caption\"\nmsgid \"Hit me\"\nmsgstr \"打我\"\n\n#: tform5.label1.caption\nmsgctxt \"tform5.label1.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform5.label3.caption\nmsgctxt \"tform5.label3.caption\"\nmsgid \"Health:\"\nmsgstr \"生命值：\"\n\n#: tform5.label4.caption\nmsgctxt \"tform5.label4.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform5.speedbutton1.caption\nmsgctxt \"tform5.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: tform6.button1.caption\nmsgctxt \"tform6.button1.caption\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: tform6.button2.caption\nmsgctxt \"tform6.button2.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform6.label1.caption\nmsgctxt \"tform6.label1.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform6.speedbutton1.caption\nmsgctxt \"tform6.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: tform7.button1.caption\nmsgctxt \"tform7.button1.caption\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: tform7.button2.caption\nmsgctxt \"tform7.button2.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform7.button3.caption\nmsgctxt \"tform7.button3.caption\"\nmsgid \"Change pointer\"\nmsgstr \"更改指针\"\n\n#: tform7.label1.caption\nmsgctxt \"tform7.label1.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform7.label2.caption\nmsgctxt \"tform7.label2.caption\"\nmsgid \"3\"\nmsgstr \"3\"\n\n#: tform7.speedbutton1.caption\nmsgctxt \"tform7.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: tform8.button1.caption\nmsgctxt \"tform8.button1.caption\"\nmsgid \"Hit me\"\nmsgstr \"打我\"\n\n#: tform8.button2.caption\nmsgctxt \"tform8.button2.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform8.label1.caption\nmsgctxt \"tform8.label1.caption\"\nmsgid \"Health: 100\"\nmsgstr \"生命值：100\"\n\n#: tform8.speedbutton1.caption\nmsgctxt \"tform8.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: tform9.button1.caption\nmsgctxt \"tform9.button1.caption\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: tform9.button2.caption\nmsgctxt \"tform9.button2.caption\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: tform9.button3.caption\nmsgctxt \"tform9.button3.caption\"\nmsgid \"Change pointer\"\nmsgstr \"更改指针\"\n\n#: tform9.label1.caption\nmsgctxt \"tform9.label1.caption\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tform9.label2.caption\nmsgctxt \"tform9.label2.caption\"\nmsgid \"3\"\nmsgstr \"3\"\n\n#: tform9.speedbutton1.caption\nmsgctxt \"tform9.speedbutton1.caption\"\nmsgid \"Skip\"\nmsgstr \"跳过\"\n\n#: unit10.rsrestartgameandautoplay\nmsgctxt \"unit10.rsrestartgameandautoplay\"\nmsgid \"Restart game and autoplay\"\nmsgstr \"重新启动游戏并自动播放\"\n\n#: unit2.rsawyouredeathletmereviveyou\nmsgctxt \"unit2.rsawyouredeathletmereviveyou\"\nmsgid \"Aw, you're dead! Let me revive you\"\nmsgstr \"哎，你死了！让我复活你\"\n\n#: unit2.rsloser\nmsgctxt \"unit2.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n\n#: unit3.rsloser\nmsgctxt \"unit3.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n\n#: unit5.rsloser\nmsgctxt \"unit5.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n\n#: unit6.rsloser\nmsgctxt \"unit6.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n\n#: unit6.rswelldoneyouscrewedupthetutorial\nmsgctxt \"unit6.rswelldoneyouscrewedupthetutorial\"\nmsgid \"Well done, you screwed up the tutorial!!!!\"\nmsgstr \"做得好，你搞砸了教程！！！！\"\n\n#: unit7.rsloser\nmsgctxt \"unit7.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n\n#: unit7.rswelldoneyouscrewedupthetutorial\nmsgctxt \"unit7.rswelldoneyouscrewedupthetutorial\"\nmsgid \"Well done, you screwed up the tutorial!!!!\"\nmsgstr \"做得好，你搞砸了教程！！！！\"\n\n#: unit8.rsawyouredeathletmereviveyou\nmsgctxt \"unit8.rsawyouredeathletmereviveyou\"\nmsgid \"Aw, you're dead! Let me revive you\"\nmsgstr \"哎，你死了！让我复活你\"\n\n#: unit8.rsloser\nmsgctxt \"unit8.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n\n#: unit9.rsloser\nmsgctxt \"unit9.rsloser\"\nmsgid \"BOO\"\nmsgstr \"哇\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/VersionCheck.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: VC-U2CVICNEL\nmsgid \"Unable to check version (Invalid content, not enough lines)\"\nmsgstr \"无法检查版本（内容无效，行数不足）\"\n\n#: VC-U2CVIC\nmsgid \"Unable to check version (Invalid content)\"\nmsgstr \"无法检查版本（内容无效）\"\n\n#: VC-CFNV\nmsgid \"Check for new version\"\nmsgstr \"检查新版本\"\n\n#: VC-NCA\nmsgid \"Cheat Engine %s is available at www.cheatengine.org. Go there now?\"\nmsgstr \"Cheat Engine %s 可在 www.cheatengine.org 获取。现在去那里吗？\"\n\n#: VC-UP2D\nmsgid \"You are up to date. The latest version is %s\"\nmsgstr \"你已是最新版本。最新版本是 %s\"\n\n#: VC-WTF\nmsgid \"Unable to check version (Can't connect)\"\nmsgstr \"无法检查版本（无法连接）\"\n\n#: VC-UPDATETO\nmsgid \"Update to %s\"\nmsgstr \"更新到 %s\"\n\n#: VC-UPDATETO\nmsgid \"In how many days should I notify you again?\"\nmsgstr \"我应该在多少天后再次通知你？\"\n\n#: VC-SETTINGS-TEXT\nmsgid \"Check for updates when Cheat Engine starts\"\nmsgstr \"启动 Cheat Engine 时检查更新\"\n\n#: VC-INTERVAL\nmsgid \"Interval(days):\"\nmsgstr \"间隔（天）：\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/cheatengine-x86_64.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: tfrmcodecavescanner.editsize.text\nmsgid \"12\"\nmsgstr \"12\"\n\n#: tfrmmicrotransactions.label2.caption\nmsgid \"15\"\nmsgstr \"15\"\n\n#: tfrmdbvmwatchconfig.edtmaxentries.text\nmsgid \"32\"\nmsgstr \"32\"\n\n#: tformsettings.edtluacollecttimer.text\nmsgid \"60\"\nmsgstr \"60\"\n\n#: tformsettings.edtluamincollectsize.text\nmsgid \"200\"\nmsgstr \"200\"\n\n#: tformsettings.framehotkeyconfig.panel5.edthotkeydelay.text\nmsgid \"350\"\nmsgstr \"350\"\n\n#: tformsettings.editbufsize.text\nmsgid \"1024\"\nmsgstr \"1024\"\n\n#: tfrmultimap2.edtmaxfilesize.text\nmsgid \"2048\"\nmsgstr \"2048\"\n\n#: tfrmpointerscannersettings.editstructsize.text\nmsgid \"4095\"\nmsgstr \"4095\"\n\n#: tfrmultimap2.edtbufsize.text\nmsgid \"16384\"\nmsgstr \"16384\"\n\n#: tfrmnetworkconfig.edtport.text\nmsgid \"52736\"\nmsgstr \"52736\"\n\n#: tfrmultimap.edtbufsize.text\nmsgid \"4194304\"\nmsgstr \"4194304\"\n\n#: tfrmrescanpointer.edtnewbase.text\nmsgid \"12345678\"\nmsgstr \"12345678\"\n\n#: aboutunit.rsareyousureyouwanttolaunchdbvm\nmsgid \"\"\n\"Are you sure you want to launch DBVM? You seem to be running in 32-bit, so don't really need it that badly (Except for \"\n\"ultimap and cloaked operations)\"\nmsgstr \"你确定要启动 DBVM？你似乎在 32 位系统中运行，所以并不是那么需要它（除了 ultimap 和 cloaked 操作）\"\n\n#: aboutunit.rsdidyoureallythinkyoudfindaneastereggbydoingthiswel\nmsgid \"Did you really think you'd find an easter egg by doing this? Well, you know what? You where right!\"\nmsgstr \"你真的以为这样做就能找到复活节彩蛋吗？但你知道吗？你做到了！\"\n\n#: aboutunit.rslaunchdbvmwasnotassigned\nmsgid \"launchdbvm was not assigned\"\nmsgstr \"未分配 launchdbvm\"\n\n#: aboutunit.rsthismeansthatyourecurrentlynotrunningdbvm\nmsgid \"This means that you're currently not running dbvm, but that your system is capable of running it\"\nmsgstr \"这表示你没有运行 DBVM，但你的系统能够运行它\"\n\n#: aboutunit.rsthismeansthatyoursystemisrunningdbvm\nmsgid \"\"\n\"This means that your system is running dbvm. This means ce will make use of some advanced tools that are otherwise \"\n\"unavailable\"\nmsgstr \"这表示你的系统正在运行 DBVM。这意味着 CE 将使用一些以前无法使用的先进工具\"\n\n#: aboutunit.rsthismeansthatyouwillneedanewcpuinteltobeabletouset\nmsgid \"This means that you will need a new cpu (intel) to be able to use the advanced dbvm options\"\nmsgstr \"这表示你需要一块最新的 CPU（Intel）才能使用 DBVM 高级选项\"\n\n#: aboutunit.rsyoursystemdoesnotsupportdbvm\nmsgid \"Your system does not support DBVM. Perhaps it is already inside a VM\"\nmsgstr \"你的系统不支持 DBVM。也许它已经在虚拟机中了\"\n\n#: aboutunit.rsyoursystemisrunningdbvmversion\n#, object-pascal-format\nmsgid \"Your system is running DBVM version %s (%.0n bytes free (%d pages))\"\nmsgstr \"您的系统正在运行 DBVM 版本 %s（%.0n 可用字节（%d 页）\"\n\n#: aboutunit.rsyoursystemsupportsdbvm\nmsgid \"Your system supports DBVM\"\nmsgstr \"你的系统支持 DBVM\"\n\n#: accesscheck.rsbutyoudohavemodifyrights\nmsgid \"But you do have modify rights\"\nmsgstr \"但你有修改权限\"\n\n#: accesscheck.rsnodeleterights\nmsgid \"No delete rights\"\nmsgstr \"无删除权限\"\n\n#: accesscheck.rsnofilecreationrightsornofileoverwriterights\nmsgid \"No file creation rights or no file overwrite rights\"\nmsgstr \"无创建文件或覆盖文件的限\"\n\n#: accesscheck.rsnofiledeletionrights\nmsgid \"No file deletion rights\"\nmsgstr \"无删除文件权限\"\n\n#: accesscheck.rsnofilemodificationrights\nmsgid \"No file modification rights\"\nmsgstr \"无修改文件权限\"\n\n#: accessedmemory.rsamerror\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: accessedmemory.rsamyoucantsaveanemptylist\nmsgid \"You can't save an empty list\"\nmsgstr \"你无法保存一个空列表\"\n\n#: addresslist.rsactive\nmsgid \"Active\"\nmsgstr \"激活\"\n\n#: addresslist.rsaddress\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: addresslist.rsaladdaddress\nmsgid \"Add address\"\nmsgstr \"添加地址\"\n\n#: addresslist.rsalautoassemblescritp\nmsgid \"Auto Assemble script\"\nmsgstr \"自动汇编脚本\"\n\n#: addresslist.rsalnodescription\nmsgid \"No description\"\nmsgstr \"无描述\"\n\n#: addresslist.rschangedescription\nmsgid \"Change Description\"\nmsgstr \"更改描述\"\n\n#: addresslist.rschangevalue\nmsgid \"Change Value\"\nmsgstr \"更改数值\"\n\n#: addresslist.rsdescription\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: addresslist.rsdoyouwanttodeletetheselectedaddress\nmsgid \"Do you want to delete the selected address?\"\nmsgstr \"你想要删除选中的地址吗？\"\n\n#: addresslist.rsdoyouwanttodeletetheselectedaddresses\nmsgid \"Do you want to delete the selected addresses?\"\nmsgstr \"你想要删除选中的地址吗？\"\n\n#: addresslist.rsnotallvaluetypescouldhandlethevalue\n#, object-pascal-format\nmsgid \"Not all value types could handle the value %s\"\nmsgstr \"并不是所有的数值类型都能够处理 %s 这种数值\"\n\n#: addresslist.rsscript\nmsgid \"<script>\"\nmsgstr \"<脚本>\"\n\n#: addresslist.rssortonclick\nmsgid \"Sort on click\"\nmsgstr \"点击排序\"\n\n#: addresslist.rsthevaluecouldnotbeparsed\n#, object-pascal-format\nmsgid \"The value %s could not be parsed\"\nmsgstr \"无法解析数值 %s\"\n\n#: addresslist.rstype\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: addresslist.rsvalue\nmsgid \"Value\"\nmsgstr \"数值\"\n\n#: addresslist.rswhatvaluetochangethisto\nmsgid \"what value to change this to?\"\nmsgstr \"要把它改成什么数值呢？\"\n\n#: addresslist.rswhatwillbethenewdescription\nmsgid \"What will be the new description?\"\nmsgstr \"新的描述将是什么？\"\n\n#: addressparser.rsapthisisnotavalidaddress\nmsgid \"This is not a valid address\"\nmsgstr \"这不是一个有效的地址\"\n\n#: advancedoptionsunit.rsaocheatenginefailedtogetintotheconfigofselectedprogram\nmsgid \"Cheat Engine failed to get into the config of the selected program.\"\nmsgstr \"Cheat Engine 无法获取所选程序的配置。\"\n\n#: advancedoptionsunit.rsaoerrorwhiletryingtocreatethesharedkeystructureetc\nmsgid \"Error while trying to create the shared key structure! (Which efficiently renders this whole feature useless)\"\nmsgstr \"尝试创建共享密匙结构时失败！（这实际上导致整个功能失效）\"\n\n#: advancedoptionsunit.rsaoyoucanonlyloadexefiles\nmsgid \"You can only load EXE files\"\nmsgstr \"你只能加载 EXE 文件\"\n\n#: advancedoptionsunit.rsareyousureyouwishtodeletetheseentries\nmsgid \"Are you sure you wish to delete these entries?\"\nmsgstr \"你确定要删除这些条目吗？\"\n\n#: advancedoptionsunit.rsdelete\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: advancedoptionsunit.rsgivethenewnameofthisentry\nmsgid \"Give the new name of this entry\"\nmsgstr \"为该条目赋予新名称\"\n\n#: advancedoptionsunit.rsnewname\nmsgid \"New name\"\nmsgstr \"新名称\"\n\n#: advancedoptionsunit.rspaused\nmsgid \"paused\"\nmsgstr \"已暂停\"\n\n#: advancedoptionsunit.rspausethegame\nmsgid \"Pause the game\"\nmsgstr \"暂停游戏\"\n\n#: advancedoptionsunit.rsresumethegame\nmsgid \"Resume the game\"\nmsgstr \"继续游戏\"\n\n#: advancedoptionsunit.strcouldntwrite\nmsgid \"The memory at this address couldn't be written\"\nmsgstr \"无法写入此内存地址\"\n\n#: advancedoptionsunit.straddanyhow\nmsgid \"Add anyhow? (It will break restore and undo if overlapping entries get modified)\"\nmsgstr \"无论如何都要添加？（如果修改了重叠的条目，则会破坏还原和撤消）\"\n\n#: advancedoptionsunit.straddressalreadyinthelist\nmsgid \"This address is already in the list\"\nmsgstr \"此地址已在列表中\"\n\n#: advancedoptionsunit.stralreadyinthelist\nmsgid \"This byte is already part of another opcode already present in the list\"\nmsgstr \"该字节已经是列表中已存在的另一个操作码的一部分了\"\n\n#: advancedoptionsunit.strcecode\nmsgid \"Code:\"\nmsgstr \"代码：\"\n\n#: advancedoptionsunit.strchangeof\nmsgid \"Change of \"\nmsgstr \"替换了\"\n\n#: advancedoptionsunit.strcode\nmsgid \"Code :\"\nmsgstr \"代码：\"\n\n#: advancedoptionsunit.strcouldntrestorecode\nmsgid \"Error when trying to restore this code!\"\nmsgstr \"还原此代码时出错！\"\n\n#: advancedoptionsunit.strfindwhatcodeaccesses\nmsgid \"Find out what addresses this code accesses\"\nmsgstr \"找出此代码访问的地址\"\n\n#: advancedoptionsunit.strfindwhatcodereads\nmsgid \"Find out what addresses this code reads from\"\nmsgstr \"找出此代码读取的地址\"\n\n#: advancedoptionsunit.strfindwhatcodewrites\nmsgid \"Find out what addresses this code writes to\"\nmsgstr \"找出此代码写入的地址\"\n\n#: advancedoptionsunit.strnamececode\nmsgid \"What name do you want to give this code?\"\nmsgstr \"你想给这个代码起什么名字？\"\n\n#: advancedoptionsunit.strnotreadable\nmsgid \"This address is not readable\"\nmsgstr \"该地址不可读\"\n\n#: advancedoptionsunit.strnotthesame\nmsgid \"The memory at this address isn't what it should be! Continue?\"\nmsgstr \"该地址处的内存并不是它应有的值！要继续吗？\"\n\n#: advancedoptionsunit.strnotwhatitshouldbe\nmsgid \"The memory at this address is'nt what it should be! Continue?\"\nmsgstr \"该地址处的内存并不是它应有的值！要继续吗？\"\n\n#: advancedoptionsunit.strpartofopcodeinthelist\nmsgid \"At least one of these bytes is already in the list\"\nmsgstr \"至少有一个字节已经在列表里了\"\n\n#: advancedoptionsunit.strselectexefor3d\nmsgid \"Select the executable of the Direct-3D game\"\nmsgstr \"选择 Direct-3D 游戏的可执行文件\"\n\n#: assemblerarm.rscannotbeencoded\nmsgid \" can not be encoded using 8 bits and double rotate\"\nmsgstr \"无法使用 8 位和双旋转进行编码\"\n\n#: assemblerarm.rsdistanceistoobig\nmsgid \"Distance is too big\"\nmsgstr \"距离太大\"\n\n#: assemblerarm.rsinvaliddestinationregister\nmsgid \"Invalid destination register\"\nmsgstr \"无效的目标寄存器\"\n\n#: assemblerarm.rsinvalidfirstoperandregister\nmsgid \"Invalid first operand register\"\nmsgstr \"无效的第一个操作数寄存器\"\n\n#: assemblerarm.rsinvalidopcode\nmsgid \"Invalid opcode\"\nmsgstr \"无效的操作码\"\n\n#: assemblerarm.rsinvalidparameter1\nmsgid \"Invalid parameter 1\"\nmsgstr \"无效的参数 1\"\n\n#: assemblerarm.rsinvalidparameter2\nmsgid \"Invalid parameter 2\"\nmsgstr \"无效的参数 2\"\n\n#: assemblerarm.rsinvalidparameter3\nmsgid \"Invalid parameter 3\"\nmsgstr \"无效的参数 3\"\n\n#: assemblerarm.rsinvalidparameter4\nmsgid \"Invalid parameter 4\"\nmsgstr \"无效的参数 4\"\n\n#: assemblerarm.rsinvalidparameters\nmsgid \"invalid parameters\"\nmsgstr \"无效的参数\"\n\n#: assemblerarm.rsinvalidregisterinregisterlist\nmsgid \"Invalid register in register list:\"\nmsgstr \"寄存器列表中的无效寄存器：\"\n\n#: assemblerarm.rsinvalidregisterlist\nmsgid \"Invalid register list\"\nmsgstr \"无效的寄存器列表\"\n\n#: assemblerarm.rsinvalidshift\nmsgid \"Invalid shift\"\nmsgstr \"无效的移位\"\n\n#: assemblerarm.rsinvalidshiftparameters\nmsgid \"invalid shift parameters\"\nmsgstr \"无效的移位参数\"\n\n#: assemblerarm.rsinvalidshiftregister\nmsgid \"Invalid shift register\"\nmsgstr \"无效的移位寄存器\"\n\n#: assemblerarm.rsthedestinationaddressmustbedividableby4\nmsgid \"The destination address must be dividable by 4\"\nmsgstr \"目标地址必须能被 4 整除\"\n\n#: assemblerarm.rsthedistanceistoobig\nmsgid \"The distance is too big\"\nmsgstr \"距离太大\"\n\n#: assemblerarm.rsthevalue\nmsgid \"The value \"\nmsgstr \"值 \"\n\n#: assemblerarm.rsthisinstructionclassdoesnotallow\nmsgid \"This instruction class does not allow a register based shift\"\nmsgstr \"此指令类别不允许基于寄存器的移位\"\n\n#: assemblerarm.rstodochangethistoa12byteinstruction\nmsgid \"Todo: Change this to a 12 byte instruction: LDR/STR [PC,#16] - B PC - DD offset\"\nmsgstr \"待办事项：将其更改为 12 字节指令：LDR/STR [PC,#16] - B PC - DD 偏移量\"\n\n#: assemblerunit.rsassemblererror\nmsgid \"Assembler error\"\nmsgstr \"汇编错误\"\n\n#: assemblerunit.rsidontunderstandwhatyoumeanwith\nmsgid \"I don't understand what you mean with \"\nmsgstr \"我不明白你所说的 \"\n\n#: assemblerunit.rsinvalid\nmsgid \"Invalid\"\nmsgstr \"无效\"\n\n#: assemblerunit.rsinvalid64bitvaluefor32bitfield\n#, object-pascal-format\nmsgid \"\"\n\"The value %.16x can not be encoded using a 32-bit signed value. But if you meant %.16x then that's ok and you should \"\n\"have provided it like that in the first place.  Is it ok to change it to this?\\n\"\n\"(This is the only time asked and will be remembered until you restart CE)\"\nmsgstr \"值 %.16x 无法使用 32 位有符号值进行编码。但如果你是指 %.16x，那没问题，你应该一开始就这样提供。可以更改为这个吗？（这是唯一一次询问，并将在你重启 CE 之前记住）\"\n\n#: assemblerunit.rsinvalidmultiplier\nmsgid \"Invalid multiplier\"\nmsgstr \"无效的乘数\"\n\n#: assemblerunit.rsinvalidvaluefor32bit\nmsgid \"The value provided can not be encoded in a 32-bit field\"\nmsgstr \"提供的值无法编码到 32 位字段中\"\n\n#: assemblerunit.rsnegativeregisterscannotbeencoded\nmsgid \"Negative registers can not be encoded\"\nmsgstr \"负寄存器无法编码\"\n\n#: assemblerunit.rsoffsettoobig\nmsgid \"\"\n\"This instruction can not be assembled because the distance between the current address and addressed address is too \"\n\"big. Try placing the address in a register first and use that\"\nmsgstr \"此指令无法组装，因为当前地址与目标地址之间的距离太大。请先将地址放入寄存器中，然后使用该寄存器\"\n\n#: assemblerunit.rstheassemblertriedtosetaregistevaluethatistoohigh\nmsgid \"The assembler tried to set a register value that is too high\"\nmsgstr \"汇编器尝试设置的寄存器值过高\"\n\n#: assemblerunit.rswtfisa\nmsgid \"WTF is a \"\nmsgstr \"WTF 是一个 \"\n\n#: autoassembler.rsaaerror\nmsgid \"Error: \"\nmsgstr \"错误：\"\n\n#: autoassembler.rsaaerrorinthestructuredefinitionof\n#, object-pascal-format\nmsgid \"Error in the structure definition of %s at line %d\"\nmsgstr \"在第 %d 行的 %s 结构定义中出错\"\n\n#: autoassembler.rsaaerrorwhilesacnningforaobs\nmsgid \"Error while scanning for AOB's : \"\nmsgstr \"扫描 AOB 时出错：\"\n\n#: autoassembler.rsaaisareservedword\n#, object-pascal-format\nmsgid \"%s is a reserved word\"\nmsgstr \"%s 是一个保留字\"\n\n#: autoassembler.rsaaluaerrorinthescriptatline\nmsgid \"Lua error in the script at line \"\nmsgstr \"脚本在第行的 Lua 错误\"\n\n#: autoassembler.rsaamodulenotfound\nmsgid \"module not found:\"\nmsgstr \"未找到模块：\"\n\n#: autoassembler.rsaanoendfound\nmsgid \"No end found\"\nmsgstr \"未找到结束\"\n\n#: autoassembler.rsaanoideawhatxis\n#, object-pascal-format\nmsgid \"No idea what %s is\"\nmsgstr \"不知道 %s 是什么\"\n\n#: autoassembler.rsaathearrayofbytenamed\n#, object-pascal-format\nmsgid \"The array of byte named %s could not be found\"\nmsgstr \"名为 %s 的字节数组未找到\"\n\n#: autoassembler.rscouldnotbeinjected\n#, object-pascal-format\nmsgid \"%s could not be injected\"\nmsgstr \"%s 无法注入\"\n\n#: autoassembler.rsdefinealreadydefined\n#, object-pascal-format\nmsgid \"Define %s already defined\"\nmsgstr \"定义 %s 已经定义\"\n\n#: autoassembler.rserrorinline\n#, object-pascal-format\nmsgid \"Error in line %s (%s) :%s\"\nmsgstr \"第 %s 行 (%s) 出错：%s\"\n\n#: autoassembler.rsfailurealloc\n#, object-pascal-format\nmsgid \"Failure allocating memory near %.8x for variable named %s\"\nmsgstr \"在 %.8x 附近分配名为 %s 的变量内存失败\"\n\n#: autoassembler.rsfailureassembling\n#, object-pascal-format\nmsgid \"Failure assembling %s at %.8x\"\nmsgstr \"在 %.8x 处组装 %s 失败\"\n\n#: autoassembler.rsfailuregettingoriginalinstruction\n#, object-pascal-format\nmsgid \"Failure getting the instruction at %x\"\nmsgstr \"获取 %x 处的指令失败\"\n\n#: autoassembler.rsfailuretoallocatememory\nmsgid \"Failure to allocate memory\"\nmsgstr \"内存分配失败\"\n\n#: autoassembler.rsforwardjumpwithnolabeldefined\nmsgid \"Forward jump with no label defined\"\nmsgstr \"没有定义标签的前向跳转\"\n\n#: autoassembler.rsgoto\nmsgid \"Go to \"\nmsgstr \"转到 \"\n\n#: autoassembler.rsinvalidaddressforreadmem\nmsgid \"Invalid address for ReadMem\"\nmsgstr \"ReadMem 的地址无效\"\n\n#: autoassembler.rsinvalidsizeforreadmem\nmsgid \"Invalid size for ReadMem\"\nmsgstr \"ReadMem 的大小无效\"\n\n#: autoassembler.rsisbeingredeclared\n#, object-pascal-format\nmsgid \"%s is being redeclared\"\nmsgstr \"%s 正在被重新声明\"\n\n#: autoassembler.rsisnotavalidbytestring\n#, object-pascal-format\nmsgid \"%s is not a valid bytestring\"\nmsgstr \"%s 不是有效的字节字符串\"\n\n#: autoassembler.rsisnotavalididentifier\n#, object-pascal-format\nmsgid \"%s is not a valid identifier\"\nmsgstr \"%s 不是有效的标识符\"\n\n#: autoassembler.rsisnotavalidsize\n#, object-pascal-format\nmsgid \"%s is not a valid size\"\nmsgstr \"%s 不是有效的大小\"\n\n#: autoassembler.rslabelisbeingdefinedmorethanonce\n#, object-pascal-format\nmsgid \"label %s is being defined more than once\"\nmsgstr \"标签 %s 被定义了多次\"\n\n#: autoassembler.rslabelisnotdefinedinthescript\n#, object-pascal-format\nmsgid \"label %s is not defined in the script\"\nmsgstr \"标签 %s 在脚本中未定义\"\n\n#: autoassembler.rsmissingexcept\n#, object-pascal-format\nmsgid \"The {$TRY} at line %d has no matching {$EXCEPT}\"\nmsgstr \"第 %d 行的 {$TRY} 没有匹配的 {$EXCEPT}\"\n\n#: autoassembler.rsnearbyallocationerror\nmsgid \"Nearby allocation error\"\nmsgstr \"附近分配错误\"\n\n#: autoassembler.rsnearbyallocationerrormessagequestion\n#, object-pascal-format\nmsgid \"\"\n\"This script uses nearby allocation but it is impossible to allocate nearby %x. Please rewrite the script to function \"\n\"without nearby allocation.  Try executing the script anyhow and allocate on a region outside reach of 2GB? (The target \"\n\"will crash if the script was not designed with this failure in mind)\"\nmsgstr \"此脚本使用附近分配，但无法分配附近 %x。请重写脚本以在不使用附近分配的情况下运行。尝试无论如何执行脚本并在 2GB 范围外分配？（如果脚本未考虑到此失败，目标将崩溃）\"\n\n#: autoassembler.rsneedtousekernelmodereadwriteprocessmemory\nmsgid \"You need to use kernelmode read/writeprocessmemory if you want to use KALLOC\"\nmsgstr \"如果你想使用 KALLOC，则需要使用内核模式读/写进程内存\"\n\n#: autoassembler.rsnopreferedrangeallocwarning\nmsgid \"\"\n\"None of the ALLOC statements specify a prefered address.  Did you take into account that the JMP instruction is going \"\n\"to be 14 bytes long?\"\nmsgstr \"没有任何 ALLOC 语句指定首选地址。你是否考虑到 JMP 指令将长达 14 字节？\"\n\n#: autoassembler.rsnotallinstructionscouldbeinjected\nmsgid \"Not all instructions could be injected\"\nmsgstr \"并非所有指令都可以注入\"\n\n#: autoassembler.rssorrybutwithoutthedriverkallocwillnotfunction\nmsgid \"Sorry, but without the driver KALLOC will not function\"\nmsgstr \"抱歉，但没有驱动程序 KALLOC 将无法工作\"\n\n#: autoassembler.rssyntaxerror\nmsgid \"Syntax error\"\nmsgstr \"语法错误\"\n\n#: autoassembler.rssyntaxerrorfullaccessaddresssize\nmsgid \"Syntax error. FullAccess(address,size)\"\nmsgstr \"语法错误。FullAccess(address,size)\"\n\n#: autoassembler.rstheaddressincreatethreadandwaitisnotvalid\n#, object-pascal-format\nmsgid \"The address in createthreadandwait(%s) is not valid\"\nmsgstr \"createthreadandwait(%s) 中的地址无效\"\n\n#: autoassembler.rstheaddressincreatethreadisnotvalid\n#, object-pascal-format\nmsgid \"The address in createthread(%s) is not valid\"\nmsgstr \"createthread(%s) 中的地址无效\"\n\n#: autoassembler.rstheaddressinloadbinaryisnotvalid\n#, object-pascal-format\nmsgid \"The address in loadbinary(%s,%s) is not valid\"\nmsgstr \"loadbinary(%s,%s) 中的地址无效\"\n\n#: autoassembler.rsthearrayofbytecouldnotbefound\n#, object-pascal-format\nmsgid \"The array of byte '%s' could not be found\"\nmsgstr \"字节数组 '%s' 找不到\"\n\n#: autoassembler.rsthebytesatarenotwhatwasexpected\n#, object-pascal-format\nmsgid \"The bytes at %s are not what was expected\"\nmsgstr \"在 %s 处的字节不是预期的\"\n\n#: autoassembler.rsthecodeinjectionwassuccessfull\nmsgid \"The code injection was successfull\"\nmsgstr \"代码注入成功\"\n\n#: autoassembler.rsthefiledoesnotexist\n#, object-pascal-format\nmsgid \"The file %s does not exist\"\nmsgstr \"文件 %s 不存在\"\n\n#: autoassembler.rsthefollowingkerneladdresseswhereallocated\nmsgid \"The following kernel addresses where allocated\"\nmsgstr \"以下内核地址已被分配\"\n\n#: autoassembler.rstheidentifierhasalreadybeendeclared\n#, object-pascal-format\nmsgid \"The identifier %s has already been declared\"\nmsgstr \"标识符 %s 已经被声明\"\n\n#: autoassembler.rsthememoryatcannotberead\n#, object-pascal-format\nmsgid \"The memory at +%s can not be read\"\nmsgstr \"内存 +%s 无法读取\"\n\n#: autoassembler.rsthememoryatcouldnotbefullyread\n#, object-pascal-format\nmsgid \"The memory at %s could not be fully read\"\nmsgstr \"内存 %s 无法完全读取\"\n\n#: autoassembler.rsthereiscodedefinedwithoutspecifyingtheaddressitbel\nmsgid \"There is code defined without specifying the address it belongs to\"\nmsgstr \"有代码定义但未指定其所属地址\"\n\n#: autoassembler.rsthisaddressspecifierisnotvalid\nmsgid \"This address specifier is not valid\"\nmsgstr \"此地址说明符无效\"\n\n#: autoassembler.rsthiscodecanbeinjectedareyousure\nmsgid \"This code can be injected. Are you sure?\"\nmsgstr \"此代码可以被注入。你确定吗？\"\n\n#: autoassembler.rsthisinstructioncantbecompiled\nmsgid \"This instruction can't be compiled\"\nmsgstr \"此指令无法编译\"\n\n#: autoassembler.rswassupposedtobeaddedtothesymbollistbutitisntdeclar\n#, object-pascal-format\nmsgid \"%s was supposed to be added to the symbollist, but it isn't declared\"\nmsgstr \"%s 应该被添加到符号列表中，但它未被声明\"\n\n#: autoassembler.rswrongsyntaxallocidentifiersizeinbytes\nmsgid \"Wrong syntax. ALLOC(identifier,sizeinbytes)\"\nmsgstr \"语法错误。ALLOC(identifier,sizeinbytes)\"\n\n#: autoassembler.rswrongsyntaxaobscanmodulename11223355\nmsgid \"Wrong syntax. AOBSCANMODULE(name, module, 11 22 33 ** 55)\"\nmsgstr \"语法错误。AOBSCANMODULE(name, module, 11 22 33 ** 55)\"\n\n#: autoassembler.rswrongsyntaxaobscanname11223355\nmsgid \"Wrong syntax. AOBSCAN(name,11 22 33 ** 55)\"\nmsgstr \"语法错误。AOBSCAN(name,11 22 33 ** 55)\"\n\n#: autoassembler.rswrongsyntaxaobscanregion\nmsgid \"Wrong syntax. AOBSCANREGION(name, startaddress, stopaddress, 11 22 33 ** 55)\"\nmsgstr \"语法错误。AOBSCANREGION(name, startaddress, stopaddress, 11 22 33 ** 55)\"\n\n#: autoassembler.rswrongsyntaxassertaddress1122335566\nmsgid \"Wrong syntax. ASSERT(address,11 22 33 ** 55 66)\"\nmsgstr \"语法错误。ASSERT(address,11 22 33 ** 55 66)\"\n\n#: autoassembler.rswrongsyntaxcreatethreadaddress\nmsgid \"Wrong syntax. CreateThread(address)\"\nmsgstr \"语法错误。CreateThread(address)\"\n\n#: autoassembler.rswrongsyntaxdefinenamewhatever\nmsgid \"Wrong syntax. DEFINE(name,whatever)\"\nmsgstr \"语法错误。DEFINE(name,whatever)\"\n\n#: autoassembler.rswrongsyntaxglobalallocnamesize\nmsgid \"Wrong syntax. GLOBALALLOC(name,size)\"\nmsgstr \"语法错误。GLOBALALLOC(name,size)\"\n\n#: autoassembler.rswrongsyntaxincludefilenamecea\nmsgid \"Wrong syntax. Include(filename.cea)\"\nmsgstr \"语法错误。Include(filename.cea)\"\n\n#: autoassembler.rswrongsyntaxkallocidentifiersizeinbytes\nmsgid \"Wrong syntax. kalloc(identifier,sizeinbytes)\"\nmsgstr \"语法错误。kalloc(identifier,sizeinbytes)\"\n\n#: autoassembler.rswrongsyntaxloadbinaryaddressfilename\nmsgid \"Wrong syntax. LoadBinary(address,filename)\"\nmsgstr \"语法错误。LoadBinary(address,filename)\"\n\n#: autoassembler.rswrongsyntaxloadlibraryfilename\nmsgid \"Wrong syntax. LoadLibrary(filename)\"\nmsgstr \"语法错误。LoadLibrary(filename)\"\n\n#: autoassembler.rswrongsyntaxluacall\nmsgid \"Wrong Syntax. LuaCall(luacommand)\"\nmsgstr \"语法错误。LuaCall(luacommand)\"\n\n#: autoassembler.rswrongsyntaxreadmemaddresssize\nmsgid \"Wrong syntax. ReadMem(address,size)\"\nmsgstr \"语法错误。ReadMem(address,size)\"\n\n#: autoassembler.rswrongsyntaxreassemble\nmsgid \"Wrong syntax. Reassemble(address)\"\nmsgstr \"语法错误。Reassemble(address)\"\n\n#: autoassembler.rswrongsyntaxsharedallocnamesize\nmsgid \"Wrong syntax. SHAREDALLOC(name,size)\"\nmsgstr \"语法错误。SHAREDALLOC(name,size)\"\n\n#: autoassembler.rsyoucanonlyhaveonedisablesection\nmsgid \"You can only have one disable section\"\nmsgstr \"你只能有一个禁用部分\"\n\n#: autoassembler.rsyoucanonlyhaveoneenablesection\nmsgid \"You can only have one enable section\"\nmsgstr \"你只能有一个启用部分\"\n\n#: autoassembler.rsyouhavntspecifiedadisablesection\nmsgid \"You havn't specified a disable section\"\nmsgstr \"你没有指定禁用部分\"\n\n#: autoassembler.rsyouhavntspecifiedaenablesection\nmsgid \"You havn't specified a enable section\"\nmsgstr \"你没有指定启用部分\"\n\n#: bigmemallochandler.rsallocerror\n#, object-pascal-format\nmsgid \"\"\n\"VirtualAlloc failed to allocate %d bytes. You probably don't have enough system memory free. Either install more RAM, \"\n\"or increase the maximum allowed paging size\"\nmsgstr \"VirtualAlloc 分配 %d 字节失败。你可能没有足够的系统内存可用。要么安装更多的 RAM，要么增加允许的最大分页大小\"\n\n#: bigmemallochandler.rsbmavirtualallocfailedyouprobablydonthaveenoughtvirtualmemoryfreeetc\nmsgid \"VirtualAlloc failed. You probably don't have enough virtual memory free. Use the 64-bit version instead\"\nmsgstr \"VirtualAlloc 失败。你可能没有足够的虚拟内存可用。请使用 64 位版本\"\n\n#: bigmemallochandler.rscepointerscanmemorymanager\nmsgid \"CE Pointerscan memory manager\"\nmsgstr \"CE 指针扫描内存管理器\"\n\n#: byteinterpreter.rsbibyte\nmsgid \"(byte)\"\nmsgstr \"(字节)\"\n\n#: byteinterpreter.rsbidouble\nmsgid \"(double)\"\nmsgstr \"(双精度)\"\n\n#: byteinterpreter.rsbidword\nmsgid \"(dword)\"\nmsgstr \"(双字)\"\n\n#: byteinterpreter.rsbifloat\nmsgid \"(float)\"\nmsgstr \"(浮点)\"\n\n#: byteinterpreter.rsbiqword\nmsgid \"(qword)\"\nmsgstr \"(四字)\"\n\n#: byteinterpreter.rsbiword\nmsgid \"(word)\"\nmsgstr \"(字)\"\n\n#: cedebugger.rscontinue\nmsgid \"Continue?\"\nmsgstr \"继续吗？\"\n\n#: cedebugger.rsdebugerror\nmsgid \"\"\n\"Failure to attach the debugger to this process! You could try to open the process using the processpicker and try that! \"\n\"If that also doesn't work check if you have debugging rights.\"\nmsgstr \"无法将调试器附加到此进程！你可以尝试使用进程选择器打开该进程并尝试一下！如果那也不行，请检查你是否具有调试权限。\"\n\n#: cedebugger.rsdonotclosece\nmsgid \"If you close Cheat Engine while the game is running, the game will close too. Are you sure you want to do this?\"\nmsgstr \"如果你在游戏运行时关闭 Cheat Engine，游戏也会关闭。你确定要这样做吗？\"\n\n#: cedebugger.rspleasetargetanotherprocess\nmsgid \"Please target another process\"\nmsgstr \"请选择另一个进程\"\n\n#: cedebugger.rsthiswillattachthedebuggerofcheatenginetothecurrent\nmsgid \"This will attach the debugger of Cheat Engine to the current process.\"\nmsgstr \"这将把 Cheat Engine 的调试器附加到当前进程。\"\n\n#: cedebugger.rsyoumustfirstopenaprocess\nmsgid \"You must first open a process\"\nmsgstr \"你必须先打开一个进程\"\n\n#: cefuncproc.rsasktorestartforadmin\n#, object-pascal-format\nmsgid \"%s requires administrator rights. Relaunch CE using admin rights?\"\nmsgstr \"%s 需要管理员权限。是否以管理员权限重新启动 CE？\"\n\n#: cefuncproc.rscefpdllinjectionfailedsymbollookuperror\nmsgid \"Dll injection failed: symbol lookup error\"\nmsgstr \"DLL 注入失败：符号查找错误\"\n\n#: cefuncproc.rsdeletekey\nmsgid \"Delete \"\nmsgstr \"删除\"\n\n#: cefuncproc.rsfailedexecutingthefunctionofthedll\nmsgid \"Failed executing the function of the dll\"\nmsgstr \"执行 DLL 函数失败\"\n\n#: cefuncproc.rsfailedinjectingthedll\nmsgid \"Failed injecting the DLL\"\nmsgstr \"注入 DLL 失败\"\n\n#: cefuncproc.rsfailedtoallocatememory\nmsgid \"Failed to allocate memory\"\nmsgstr \"内存分配失败\"\n\n#: cefuncproc.rsfailedtoexecutethedllloader\nmsgid \"Failed to execute the dll loader\"\nmsgstr \"执行 DLL 加载器失败\"\n\n#: cefuncproc.rsfailedtoinjectthedllloader\nmsgid \"Failed to inject the dll loader\"\nmsgstr \"注入 DLL 加载器失败\"\n\n#: cefuncproc.rsgetprocaddressnotfound\nmsgid \"GetProcAddress not found\"\nmsgstr \"未找到 GetProcAddress\"\n\n#: cefuncproc.rsleftmb\nmsgid \"Left MB\"\nmsgstr \"剩余 MB\"\n\n#: cefuncproc.rsloadlibraryanotfound\nmsgid \"LoadLibraryA not found\"\nmsgstr \"未找到 LoadLibraryA\"\n\n#: cefuncproc.rsmiddlemb\nmsgid \"Middle MB\"\nmsgstr \"中间 MB\"\n\n#: cefuncproc.rsnokernel32dllloaded\nmsgid \"No kernel32.dll loaded\"\nmsgstr \"未加载 kernel32.dll\"\n\n#: cefuncproc.rsnotconvertable\nmsgid \"Not convertable\"\nmsgstr \"不可转换\"\n\n#: cefuncproc.rsnotsupportedinthisversion\nmsgid \"not supported in this version\"\nmsgstr \"此版本不支持\"\n\n#: cefuncproc.rsposition\nmsgid \" Position\"\nmsgstr \"位置\"\n\n#: cefuncproc.rsrightmb\nmsgid \"Right MB\"\nmsgstr \"右键 MB\"\n\n#: cefuncproc.rstheinjectionthreadtooklongerthan10secondstoexecute\nmsgid \"The injection thread took longer than 10 seconds to execute. Injection routine not freed\"\nmsgstr \"注入线程执行超过 10 秒。注入例程未释放\"\n\n#: cefuncproc.rsthiscantakesometime\nmsgid \"This can take some time if you are missing the PDB's and CE will look frozen. Are you sure?\"\nmsgstr \"如果缺少 PDB，可能需要一些时间，CE 可能看起来被冻结。你确定吗？\"\n\n#: cefuncproc.rsunknownerrorduringinjection\nmsgid \"Unknown error during injection\"\nmsgstr \"注入过程中发生未知错误\"\n\n#: ceguicomponents.rsinvalidformdata\nmsgid \"Invalid formdata\"\nmsgstr \"无效的表单数据\"\n\n#: celazysocket.rsdisconnectedwhilereceivingdata\nmsgid \"Disconnected while receiving data\"\nmsgstr \"接收数据时断开连接\"\n\n#: celazysocket.rsdisconnectedwhilesendingdata\nmsgid \"Disconnected while sending data\"\nmsgstr \"发送数据时断开连接\"\n\n#: celazysocket.rserrorwhilereceivingdata\nmsgid \"Error while receiving data: \"\nmsgstr \"接收数据时出错：\"\n\n#: celazysocket.rserrorwhilesendingdata\nmsgid \"Error while sending data: \"\nmsgstr \"发送数据时出错：\"\n\n#: celazysocket.rstimeoutwhilereceivingdata\nmsgid \"Timeout while receiving data\"\nmsgstr \"接收数据超时\"\n\n#: celazysocket.rstimeoutwhilesendingdata\nmsgid \"Timeout while sending data\"\nmsgstr \"发送数据超时\"\n\n#: celazysocket.rswhoopdeedoo\nmsgid \"Whoopdeedoo\"\nmsgstr \"哇哦\"\n\n#: customtypehandler.rsacustomfunctiontypewithnamealreadyexists\n#, object-pascal-format\nmsgid \"A custom function type with name %s already exists\"\nmsgstr \"名称为 %s 的自定义函数类型已存在\"\n\n#: customtypehandler.rsacustomtypewithnamealreadyexists\n#, object-pascal-format\nmsgid \"A custom type with name %s already exists\"\nmsgstr \"名称为 %s 的自定义类型已存在\"\n\n#: customtypehandler.rsbytesizeis0\nmsgid \"bytesize is 0\"\nmsgstr \"字节大小为 0\"\n\n#: customtypehandler.rscthinvalidnumberofparameters\nmsgid \"Invalid number of parameters\"\nmsgstr \"参数数量无效\"\n\n#: customtypehandler.rscthparameter3isnotavalidfunction\nmsgid \"Parameter 3 is not a valid function\"\nmsgstr \"参数 3 不是有效的函数\"\n\n#: customtypehandler.rscthparameter4isnotavalidfunction\nmsgid \"Parameter 4 is not a valid function\"\nmsgstr \"参数 4 不是有效的函数\"\n\n#: customtypehandler.rsfailurecreatingluaobject\nmsgid \"Failure creating lua object\"\nmsgstr \"创建 Lua 对象失败\"\n\n#: customtypehandler.rsinvalidfunctiontypename\nmsgid \"invalid functiontypename\"\nmsgstr \"无效的函数类型名称\"\n\n#: customtypehandler.rsinvalidtypename\nmsgid \"invalid typename\"\nmsgstr \"无效的类型名称\"\n\n#: customtypehandler.rsonlyreturntypenamebytecountandfunctiontypename\nmsgid \"Only return typename, bytecount and functiontypename\"\nmsgstr \"仅返回类型名称、字节数和函数类型名称\"\n\n#: d3dhookunit.rsd3dhookfailuretomapthesharedmemoryobject\nmsgid \"D3DHook: Failure to map the shared memory object\"\nmsgstr \"D3DHook：映射共享内存对象失败\"\n\n#: d3dhookunit.rsd3dhookfailuretoopenthesharedmemoryobject\nmsgid \"D3DHook: Failure to open the shared memory object\"\nmsgstr \"D3DHook：打开共享内存对象失败\"\n\n#: d3dhookunit.rsthed3dhookobjecthasnotbeencreatedyet\nmsgid \"The d3dhook object has not been created yet\"\nmsgstr \"d3dhook 对象尚未创建\"\n\n#: dbk32functions.rsapcrules\nmsgid \"APC rules\"\nmsgstr \"APC 规则\"\n\n#: dbk32functions.rscouldnotlaunchdbvm\nmsgid \"Could not launch DBVM: The Intel-VT feature has been disabled in your BIOS\"\nmsgstr \"无法启动 DBVM：Intel-VT 功能在你的 BIOS 中已被禁用\"\n\n#: dbk32functions.rsdbk32error\nmsgid \"DBK32 error\"\nmsgstr \"DBK32 错误\"\n\n#: dbk32functions.rsdbkblockedduetovulnerabledriverblocklist\nmsgid \"\"\n\"Failure starting dbk because the vulnerable driver blocklist is enabled and dbk has been added to it. Want to know how \"\n\"to disable this?\"\nmsgstr \"启动 dbk 失败，因为启用了易受攻击的驱动程序阻止列表，并且 dbk 已被添加到其中。想知道如何禁用此功能吗？\"\n\n#: dbk32functions.rsdbkerror\nmsgid \"DBK Error\"\nmsgstr \"DBK 错误\"\n\n#: dbk32functions.rsdrivererror\nmsgid \"Driver error\"\nmsgstr \"驱动程序错误\"\n\n#: dbk32functions.rsfailuretoconfigurethedriver\nmsgid \"Failure to configure the driver\"\nmsgstr \"配置驱动程序失败\"\n\n#: dbk32functions.rsfailuretoconfiguretheultimapdriver\nmsgid \"Failure to configure the ultimap driver\"\nmsgstr \"配置 ultimap 驱动程序失败\"\n\n#: dbk32functions.rsinvalidmsraddress\nmsgid \"Invalid MSR address:\"\nmsgstr \"无效的 MSR 地址：\"\n\n#: dbk32functions.rsmsrsareunavailable\nmsgid \"msrs are unavailable\"\nmsgstr \"msrs 不可用\"\n\n#: dbk32functions.rspleaserebootandpressf8duringboot\nmsgid \"\"\n\"The driver failed to load due to signing issues. If you have secure boot enabled in your BIOS, set it to \\\"Other OS\\\" \"\n\"or disable it. Alternatively, boot with driver signing policy disabled, or sign the driver yourself\"\nmsgstr \"由于签名问题，驱动程序加载失败。如果你的 BIOS 中启用了安全启动，请将其设置为“其他操作系统”或禁用它。或者，禁用驱动程序签名策略启动，或自行签署驱动程序\"\n\n#: dbk32functions.rspleaserunthe64bitversionofce\nmsgid \"Please run the 64-bit version of Cheat Engine\"\nmsgstr \"请运行 64 位版本的 Cheat Engine\"\n\n#: dbk32functions.rsthedrivercouldntbeopened\nmsgid \"\"\n\"The driver couldn't be opened! It's not loaded or not responding. Luckely you are running dbvm so it's not a total \"\n\"waste. Do you wish to force load the driver?\"\nmsgstr \"驱动程序无法打开！它未加载或未响应。幸运的是，你正在运行 dbvm，所以这不是完全的浪费。你想强制加载驱动程序吗？\"\n\n#: dbk32functions.rsthedrivercouldntbeopenedtryagain\nmsgid \"The driver couldn't be opened! It's not loaded or not responding. I recommend to reboot your system and try again\"\nmsgstr \"驱动程序无法打开！它未加载或未响应。我建议重新启动系统并重试\"\n\n#: dbk32functions.rsthedriverfailedtosuccessfullyinitialize\nmsgid \"The driver failed to successfully initialize. Some functions may not completely work\"\nmsgstr \"驱动程序初始化失败。某些功能可能无法完全正常工作\"\n\n#: dbk32functions.rsthedriverthatiscurrentlyloaded\nmsgid \"The driver that is currently loaded belongs to a different version of Cheat Engine. Please unload this driver or reboot.\"\nmsgstr \"当前加载的驱动程序属于不同版本的 Cheat Engine。请卸载此驱动程序或重启。\"\n\n#: dbk32functions.rstheservicecouldntgetopened\nmsgid \"\"\n\"The service couldn't get opened and also couldn't get created. Check if you have the needed rights to create a service, \"\n\"or call your system admin (Who'll probably beat you up for even trying this). Until this is fixed you won't be able to \"\n\"make use of the enhancements the driver gives you\"\nmsgstr \"服务无法打开，也无法创建。检查你是否拥有创建服务所需的权限，或联系你的系统管理员（他可能会因为你尝试这个而打你）。在解决此问题之前，你将无法使用驱动程序提供的增强功能\"\n\n#: dbk32functions.rstheservicecouldntgetopenedultimap\nmsgid \"The ultimap service couldn't get opened and also couldn't get created.  (No admin rights?)\"\nmsgstr \"ultimap 服务无法打开，也无法创建。（没有管理员权限？）\"\n\n#: dbk32functions.rsyouaremissingthedriver\nmsgid \"You are missing the driver. Try reinstalling Cheat Engine, and try to disable your anti-virus before doing so.\"\nmsgstr \"你缺少驱动程序。尝试重新安装 Cheat Engine，并在此之前尝试禁用你的防病毒软件。\"\n\n#: dbk64secondaryloader.rserrorwhiletryingtoloadthedriveratpart\nmsgid \"Error while trying to load the driver at part \"\nmsgstr \"尝试在部分加载驱动程序时出错\"\n\n#: dbk64secondaryloader.rsmoduleloaderdailedtomdbk64systomemoryap\nmsgid \"ModuleLoader failed to map dbk64.sys to memory\"\nmsgstr \"ModuleLoader 无法将 dbk64.sys 映射到内存\"\n\n#: dbk64secondaryloader.rsseemslikedbvmisntloadedafterall\nmsgid \"seems like dbvm isn't loaded after all\"\nmsgstr \"看起来 dbvm 还是没有加载\"\n\n#: dbk64secondaryloader.rssuccessthedriverhasbeenloaded\nmsgid \"Success. The driver has been loaded thanks to dbvm\"\nmsgstr \"成功。驱动程序已通过 dbvm 加载\"\n\n#: dbk64secondaryloader.rsthedriverfailedtoinitialize\nmsgid \"The driver failed to initialize\"\nmsgstr \"驱动程序初始化失败\"\n\n#: dbvmdebuggerinterface.rsdbvmfunctionneedsdbvm\nmsgid \"Sorry, but you need DBVM for DBVM level debugging\"\nmsgstr \"抱歉，但你需要 DBVM 才能进行 DBVM 级调试\"\n\n#: dbvmdebuggerinterface.rsdbvmlevelnotfor32bit\nmsgid \"DBVM level debug does not work on the 32-bit CE\"\nmsgstr \"DBVM 级调试在 32 位 CE 上无法工作\"\n\n#: dbvmloadmanual.rschecking\nmsgid \"<Checking>\"\nmsgstr \"<Checking>\"\n\n#: dbvmloadmanual.rscpu\nmsgid \"CPU \"\nmsgstr \"CPU\"\n\n#: dbvmloadmanual.rscpualreadyrunningdbvm\nmsgid \"This cpu is already running DBVM\"\nmsgstr \"此 CPU 已经在运行 DBVM\"\n\n#: dbvmloadmanual.rsloaded\nmsgid \"Loaded:\"\nmsgstr \"已加载：\"\n\n#: dbvmloadmanual.rsnotloaded\nmsgid \"Not loaded\"\nmsgstr \"未加载\"\n\n#: debugeventhandler.rsdebughandleaccessviolationdebugeventnow\nmsgid \"Debug HandleAccessViolationDebugEvent now\"\nmsgstr \"现在调试 HandleAccessViolationDebugEvent\"\n\n#: debugeventhandler.rsspecialcase\nmsgid \"Special case\"\nmsgstr \"特殊情况\"\n\n#: debuggertypedefinitions.rschangereg\nmsgid \"Change reg\"\nmsgstr \"更改寄存器\"\n\n#: debuggertypedefinitions.rsdbvmnativebreakpoint\nmsgid \"DBVM-Level Breakpoint\"\nmsgstr \"DBVM 级别断点\"\n\n#: debuggertypedefinitions.rsfindcode\nmsgid \"Find code\"\nmsgstr \"查找代码\"\n\n#: debuggertypedefinitions.rsfindcodeaccess\nmsgid \"Find code access\"\nmsgstr \"查找代码访问\"\n\n#: debuggertypedefinitions.rsonexecute\nmsgid \"On Execute\"\nmsgstr \"执行时\"\n\n#: debuggertypedefinitions.rsonreadwrite\nmsgid \"On Read/Write\"\nmsgstr \"读取/写入时\"\n\n#: debuggertypedefinitions.rsonwrite\nmsgid \"On Write\"\nmsgstr \"写入时\"\n\n#: debughelper.rsaddbreakpointaninvaliddebugregisterisused\nmsgid \"AddBreakpoint: An invalid debug register is used\"\nmsgstr \"AddBreakpoint：使用了无效的调试寄存器\"\n\n#: debughelper.rsall4debugregistersarecurrentlyusedupfreeoneandtrya\nmsgid \"All debug registers are currently used up. Free one and try again\"\nmsgstr \"所有调试寄存器当前已用完。释放一个并重试\"\n\n#: debughelper.rsalldebugregistersareusedup\nmsgid \"All debug registers are used up\"\nmsgstr \"所有调试寄存器已用完\"\n\n#: debughelper.rsalldebugregistersareusedupdoyouwanttouseasoftwarebp\nmsgid \"All debug registers are used up. Do you want to use a software breakpoint?\"\nmsgstr \"所有调试寄存器已用完。你想使用软件断点吗？\"\n\n#: debughelper.rsasktoenablenx\nmsgid \"\"\n\"For execute page exceptions the target process must support No-Execute page support. Currently this process doesn't \"\n\"have this enabled, but if you think the process itself does support it you can enable it.\\n\"\n\"Do you wish to enable No-Execute support for this process?\"\nmsgstr \"对于执行页面异常，目标进程必须支持无执行页面支持。目前此进程未启用此功能，但如果你认为该进程本身支持，你可以启用它。你希望为此进程启用无执行支持吗？\"\n\n#: debughelper.rsbreakpointerror\nmsgid \"Breakpoint error:\"\nmsgstr \"断点错误：\"\n\n#: debughelper.rscalledfromanunexpectedthread\nmsgid \"Called from an unexpected thread\"\nmsgstr \"从意外线程调用\"\n\n#: debughelper.rscalledfromdebuggerthread\nmsgid \"Called from debugger thread\"\nmsgstr \"从调试器线程调用\"\n\n#: debughelper.rscalledfrommainthread\nmsgid \"Called from main thread\"\nmsgstr \"从主线程调用\"\n\n#: debughelper.rscantenabledep\nmsgid \"Data execution prevention is not enabled in this process and can not be enabled\"\nmsgstr \"此进程未启用数据执行保护，无法启用\"\n\n#: debughelper.rscreateprocessfailed\n#, object-pascal-format\nmsgid \"CreateProcess failed:%s\"\nmsgstr \"创建进程失败：%s\"\n\n#: debughelper.rsdebuggerattachaborted\nmsgid \"Debugger attach aborted\"\nmsgstr \"调试器附加中止\"\n\n#: debughelper.rsdebuggercrash\nmsgid \"Debugger Crash\"\nmsgstr \"调试器崩溃\"\n\n#: debughelper.rsdebuggerfailedtoattach\nmsgid \"Debugger failed to attach\"\nmsgstr \"调试器未能附加\"\n\n#: debughelper.rsdebuggerinterfacedoesnotsupportdbvmbreakpoints\n#, object-pascal-format\nmsgid \"Debugger interface %s does not support DBVM breakpoints\"\nmsgstr \"调试器接口 %s 不支持 DBVM 断点\"\n\n#: debughelper.rsdebuggerinterfacedoesnotsupportsoftwarebreakpoints\n#, object-pascal-format\nmsgid \"Debugger interface %s does not support software breakpoints\"\nmsgstr \"调试器接口 %s 不支持软件断点\"\n\n#: debughelper.rsdebuggerthreadisatpoint\nmsgid \"debuggerthread is at point \"\nmsgstr \"调试线程处于点\"\n\n#: debughelper.rsdepsettingtimeout\nmsgid \"Timeout while trying to set DEP policy. Continue with the breakpoint?\"\nmsgstr \"设置 DEP 策略时超时。是否继续使用断点？\"\n\n#: debughelper.rsfaileddep\nmsgid \"Failed enabling No Execute\"\nmsgstr \"启用 No Execute 失败\"\n\n#: debughelper.rsfaileddeppermanently\nmsgid \"Failed enabling No Execute AND blocked it from every changing. Fuck\"\nmsgstr \"启用 No Execute 失败，并阻止其任何更改。真糟糕\"\n\n#: debughelper.rsfailuregettingdepinformation\nmsgid \"Failure getting DEP information for this process. No Execute Breakpoint support\"\nmsgstr \"获取此进程的 DEP 信息失败。No Execute 断点不支持\"\n\n#: debughelper.rslastlocation\nmsgid \" (Last location:\"\nmsgstr \" （最后位置：\"\n\n#: debughelper.rsnoexecutepageexceptionsforyou\nmsgid \"Execute page exception breakpoints are not possible on your system\"\nmsgstr \"在你的系统上不可能执行页面异常断点\"\n\n#: debughelper.rsnoform\nmsgid \"No form\"\nmsgstr \"没有表单\"\n\n#: debughelper.rsonlythedebuggerthreadisallowedtosetthecurrentthread\nmsgid \"Only the debugger thread is allowed to set the current thread\"\nmsgstr \"只有调试线程被允许设置当前线程\"\n\n#: debughelper.rsoutofhwbreakpoints\nmsgid \"\"\n\"All debug registers are used up and this debugger interface does not support software Breakpoints. Remove some and try \"\n\"again\"\nmsgstr \"所有调试寄存器已用尽，并且此调试接口不支持软件断点。移除一些并重试\"\n\n#: debughelper.rsprocesssucksnodepsupport\nmsgid \"Ooops, looks like the process does not support No Execute\"\nmsgstr \"哎呀，看起来该进程不支持 No Execute\"\n\n#: debughelper.rsthedebuggerattachhastimedout\nmsgid \"\"\n\"The debugger attach is taking a while. This is normal when there are many symbols or the system is slow so please be \"\n\"patient. But if you don't have the time to wait or the program has crashes to desktop, then you can cancel this wait. \"\n\"Beware though that you may have to restart the target process if you do wish to debug anyhow.\\n\"\n\"Do you wish to wait longer?\"\nmsgstr \"调试器附加需要一些时间。当有很多符号或系统较慢时，这是正常的，所以请耐心等待。但如果你没有时间等待或程序崩溃到桌面，那么你可以取消这个等待。不过请注意，如果你确实希望调试，可能需要重新启动目标进程。你想再等一会儿吗？\"\n\n#: debughelper.rsthefollowingaddressesexecute\n#, object-pascal-format\nmsgid \"The following codes execute %s\"\nmsgstr \"以下代码执行 %s\"\n\n#: debughelper.rsthefollowingopcodesaccessed\n#, object-pascal-format\nmsgid \"The following opcodes accessed %s\"\nmsgstr \"以下操作码访问了 %s\"\n\n#: debughelper.rsthefollowingopcodeswriteto\n#, object-pascal-format\nmsgid \"The following opcodes write to %s\"\nmsgstr \"以下操作码写入 %s\"\n\n#: debughelper.rsthisdebuggerinterfacedoesntsupportbreakonentryyet\n#, object-pascal-format\nmsgid \"This debugger interface :'%s' doesn't support Break On Entry yet\"\nmsgstr \"此调试器接口：'%s' 还不支持在入口处中断\"\n\n#: debughelper.rsunreadableaddress\nmsgid \"Unreadable address\"\nmsgstr \"无法读取的地址\"\n\n#: debughelper.rsunreadablememoryunabletosetsoftwarebreakpoint\nmsgid \"Unreadable memory. Unable to set software breakpoint\"\nmsgstr \"无法读取的内存。无法设置软件断点\"\n\n#: debughelper.rsvmwareisrunningiptbad\nmsgid \"\"\n\"VMWare seems to be running. It's known that some versions of vmware will cause a BSOD in combination with intel IPT. Do \"\n\"you still want to use intel IPT?\"\nmsgstr \"VMWare 似乎正在运行。已知某些版本的 VMWare 会与 Intel IPT 结合导致蓝屏死机。你仍然想使用 Intel IPT 吗？\"\n\n#: disassemblerviewlinesunit.rscall\nmsgid \"(Call)\"\nmsgstr \"(调用)\"\n\n#: disassemblerviewlinesunit.rscon\nmsgid \"(Conditional)\"\nmsgstr \"(条件)\"\n\n#: disassemblerviewlinesunit.rsinvaliddisassembly\nmsgid \"Invalid disassembly\"\nmsgstr \"无效的反汇编\"\n\n#: disassemblerviewlinesunit.rsmemory\nmsgid \"(Code/Data)\"\nmsgstr \"(代码/数据)\"\n\n#: disassemblerviewlinesunit.rsun\nmsgid \"(Unconditional)\"\nmsgstr \"(无条件)\"\n\n#: disassemblerviewunit.rsdebugsymbolsarebeingloaded\n#, object-pascal-format\nmsgid \"Debug symbols are being loaded (%d %% (%s))\"\nmsgstr \"调试符号正在加载 (%d %% (%s))\"\n\n#: disassemblerviewunit.rsextendeddebuginfoisloaded\n#, object-pascal-format\nmsgid \"Extended debug info is being loaded (%d %%)\"\nmsgstr \"扩展调试信息正在加载 (%d %%)\"\n\n#: disassemblerviewunit.rsopcode\nmsgid \"Opcode\"\nmsgstr \"操作码\"\n\n#: disassemblerviewunit.rspleaseopenaprocessfirst\nmsgid \"Please open a process first\"\nmsgstr \"请先打开一个进程\"\n\n#: disassemblerviewunit.rsstructuresarebeingparsed\nmsgid \"Structures are being parsed\"\nmsgstr \"结构正在解析\"\n\n#: disassemblerviewunit.rssymbolsarebeingloaded\n#, object-pascal-format\nmsgid \"Symbols are being loaded (%d %%)\"\nmsgstr \"符号正在加载 (%d %%)\"\n\n#: dissectcodethread.rsinvaliddissectcodefile\nmsgid \"Invalid dissect code file\"\nmsgstr \"无效的解剖代码文件\"\n\n#: dissectcodethread.rstdissectcodethreadgetcalllistcalledwithanonemptylist\nmsgid \"TDissectCodeThread.getCallList called with a non empty list\"\nmsgstr \"TDissectCodeThread.getCallList 被调用时列表不为空\"\n\n#: dissectcodeunit.rsdissectdataloaded\nmsgid \"Dissect data loaded\"\nmsgstr \"解剖数据已加载\"\n\n#: dissectcodeunit.rspleaseselectsomethingtoscan\nmsgid \"Please select something to scan or enter a custom range\"\nmsgstr \"请先选择要扫描的内容或输入自定义范围\"\n\n#: dotnettypes.rsdnt2bytesigned\nmsgid \"2 Byte (Signed)\"\nmsgstr \"2 字节（有符号）\"\n\n#: dotnettypes.rsdnt4bytesigned\nmsgid \"4 Byte (Signed)\"\nmsgstr \"4 字节（有符号）\"\n\n#: dotnettypes.rsdnt8bytesigned\nmsgid \"8 Byte (Signed)\"\nmsgstr \"8 字节（有符号）\"\n\n#: dotnettypes.rsdntarray\nmsgid \"Array\"\nmsgstr \"数组\"\n\n#: dotnettypes.rsdntbool\nmsgid \"bool\"\nmsgstr \"布尔值\"\n\n#: dotnettypes.rsdntbytesigned\nmsgid \"Byte (Signed)\"\nmsgstr \"字节（有符号）\"\n\n#: dotnettypes.rsdntchar\nmsgid \"char\"\nmsgstr \"字符\"\n\n#: dotnettypes.rsdntclass\nmsgid \"Class\"\nmsgstr \"类\"\n\n#: dotnettypes.rsdntcmod_opt\nmsgid \"CMOD_OPT\"\nmsgstr \"CMOD_OPT\"\n\n#: dotnettypes.rsdntcmod_reqd\nmsgid \"CMOD_REQD\"\nmsgstr \"CMOD_REQD\"\n\n#: dotnettypes.rsdntend\nmsgid \"END\"\nmsgstr \"结束\"\n\n#: dotnettypes.rsdntfunctionpointer\nmsgid \"Function Pointer\"\nmsgstr \"函数指针\"\n\n#: dotnettypes.rsdntgenericinst\nmsgid \"GenericInst\"\nmsgstr \"通用实例\"\n\n#: dotnettypes.rsdntinternal\nmsgid \"Internal\"\nmsgstr \"内部\"\n\n#: dotnettypes.rsdntmax\nmsgid \"MAX\"\nmsgstr \"最大值\"\n\n#: dotnettypes.rsdntmodifier\nmsgid \"Modifier\"\nmsgstr \"修饰符\"\n\n#: dotnettypes.rsdntmvar\nmsgid \"MVar\"\nmsgstr \"MVar\"\n\n#: dotnettypes.rsdntobject\nmsgid \"Object\"\nmsgstr \"对象\"\n\n#: dotnettypes.rsdntpinned\nmsgid \"Pinned\"\nmsgstr \"固定\"\n\n#: dotnettypes.rsdntreference\nmsgid \"Reference\"\nmsgstr \"引用\"\n\n#: dotnettypes.rsdntsentinel\nmsgid \"Sentinel\"\nmsgstr \"哨兵\"\n\n#: dotnettypes.rsdntszarray\nmsgid \"SZ Array\"\nmsgstr \"SZ 数组\"\n\n#: dotnettypes.rsdnttypedbyref\nmsgid \"Typed By Ref\"\nmsgstr \"按引用类型\"\n\n#: dotnettypes.rsdntunsigned\nmsgid \"Unsigned\"\nmsgstr \"无符号\"\n\n#: dotnettypes.rsdntvaluetype\nmsgid \"ValueType\"\nmsgstr \"值类型\"\n\n#: dotnettypes.rsdntvar\nmsgid \"Var\"\nmsgstr \"变量\"\n\n#: dotnettypes.rsdntvoid\nmsgid \"void\"\nmsgstr \"无\"\n\n#: extratrainercomponents.rsundefineddescription\nmsgid \"undefined description\"\nmsgstr \"未定义的描述\"\n\n#: extratrainercomponents.rsundefinedhotkey\nmsgid \"undefined hotkey\"\nmsgstr \"未定义的热键\"\n\n#: feces.rsbcryptcouldnotbeused\nmsgid \"bcrypt could not be used\"\nmsgstr \"无法使用 bcrypt\"\n\n#: feces.rscheatenginesignaturefiles\nmsgid \"Cheat Engine signature files\"\nmsgstr \"Cheat Engine 签名文件\"\n\n#: feces.rscouldnotopenthealgorithmprovider\nmsgid \"Could not open the algorithm provider.  Load the table as if it's signature is valid?\"\nmsgstr \"无法打开算法提供程序。是否以其签名有效的方式加载表？\"\n\n#: feces.rsfailedcreatinghash\nmsgid \"Failed creating hash\"\nmsgstr \"创建哈希失败\"\n\n#: feces.rsfailedcreatinghash2\nmsgid \"Failed creating hash 2\"\nmsgstr \"创建哈希 2 失败\"\n\n#: feces.rsfailedgettingtheobjectlength\nmsgid \"Failed getting the object length\"\nmsgstr \"获取对象长度失败\"\n\n#: feces.rsfailedhashingtable\nmsgid \"Failed hashing table\"\nmsgstr \"哈希表失败\"\n\n#: feces.rsfailedhashingtable2\nmsgid \"Failed hashing table 2\"\nmsgstr \"哈希表 2 失败\"\n\n#: feces.rsfailedtofinishthehash\nmsgid \"Failed to finish the hash\"\nmsgstr \"完成哈希失败\"\n\n#: feces.rsfailedtofinishthehash2\nmsgid \"Failed to finish the hash 2\"\nmsgstr \"完成哈希 2 失败\"\n\n#: feces.rsfailedtogethashlength\nmsgid \"Failed to get hashlength\"\nmsgstr \"获取哈希长度失败\"\n\n#: feces.rsfailedtogethashlength2\nmsgid \"Failed to get hashlength 2\"\nmsgstr \"获取哈希长度 2 失败\"\n\n#: feces.rsfailedtogetsignaturesize\nmsgid \"Failed to get the signature size\"\nmsgstr \"获取签名大小失败\"\n\n#: feces.rsfailedtoloadcheatenginepublickey\nmsgid \"Failed to load Cheat Engine public key\"\nmsgstr \"加载 Cheat Engine 公钥失败\"\n\n#: feces.rsfailedtoloadprivatekey\nmsgid \"Failed to load private key\"\nmsgstr \"加载私钥失败\"\n\n#: feces.rsfailedtoloadthetablepublickey\nmsgid \"Failed to load the table public key\"\nmsgstr \"加载表的公钥失败\"\n\n#: feces.rsinvalidpublickey\nmsgid \"The provided public key is invalid(Not signed by the Cheat Engine guy). Remove the signature section to load this table\"\nmsgstr \"提供的公钥无效（未由 Cheat Engine 人员签名）。请移除签名部分以加载此表\"\n\n#: feces.rsispasswordcorrect\nmsgid \"Is the password correct?\"\nmsgstr \"密码正确吗？\"\n\n#: feces.rsnopublickey\nmsgid \"This table's signature does not contain a PublicKey element\"\nmsgstr \"此表的签名不包含 PublicKey 元素\"\n\n#: feces.rsnosignedhash\nmsgid \"This table's signature does not contain a SignedHash element\"\nmsgstr \"此表的签名不包含 SignedHash 元素\"\n\n#: feces.rsselectyourcheatenginesignaturefile\nmsgid \"Select your Cheat Engine signature file\"\nmsgstr \"选择你的 Cheat Engine 签名文件\"\n\n#: feces.rsthistablehasbeenmodified\nmsgid \"\"\n\"This table has been modified. To load this table, remove the signature part with an editor (And check the file for \"\n\"suspicious things while you're at it)\"\nmsgstr \"此表已被修改。要加载此表，请使用编辑器移除签名部分（并在此过程中检查文件是否有可疑内容）\"\n\n#: fileaccess.rsnogetnamedsecurityinfo\nmsgid \"no GetNamedSecurityInfo\"\nmsgstr \"没有 GetNamedSecurityInfo\"\n\n#: fileaccess.rsnogetsecurityinfo\nmsgid \"no GetSecurityInfo\"\nmsgstr \"没有 GetSecurityInfo\"\n\n#: fileaccess.rsnosetentriesinacl\nmsgid \"no SetEntriesInAcl\"\nmsgstr \"没有 SetEntriesInAcl\"\n\n#: fileaccess.rsnosetnamedsecurityinfo\nmsgid \"no SetNamedSecurityInfo\"\nmsgstr \"没有 SetNamedSecurityInfo\"\n\n#: filemapping.rsdoesnotexist\n#, object-pascal-format\nmsgid \"%s does not exist\"\nmsgstr \"%s 不存在\"\n\n#: filemapping.rsfailedcreatingaproperview\nmsgid \"Failed creating a proper view\"\nmsgstr \"创建正确视图失败\"\n\n#: filemapping.rsmappingfailed\nmsgid \"Mapping failed\"\nmsgstr \"映射失败\"\n\n#: findwindowunit.rsnothingfound\nmsgid \"Nothing found\"\nmsgstr \"未找到任何内容\"\n\n#: findwindowunit.rsthespecifiedrangeisinvalid\nmsgid \"The specified range is invalid\"\nmsgstr \"指定的范围无效\"\n\n#: formaddresschangeunit.rsacaddoffset\nmsgid \"Add Offset\"\nmsgstr \"添加偏移量\"\n\n#: formaddresschangeunit.rsacaddoffsethint\nmsgid \"Click: Add New Offset. Ctrl+Click: Add New Offset to the opposite location\"\nmsgstr \"点击：添加新偏移量。Ctrl+点击：将新偏移量添加到相反位置\"\n\n#: formaddresschangeunit.rsacremoveoffsethint\nmsgid \"Click: Remove Offset. Ctrl+Click: Remove Offset from the opposite location\"\nmsgstr \"点击：移除偏移量。Ctrl+点击：从相反位置移除偏移量\"\n\n#: formaddresschangeunit.rsaddressofpointer\nmsgid \"Address of pointer\"\nmsgstr \"指针的地址\"\n\n#: formaddresschangeunit.rsfillinthenrofbytesafterthelocationthepointerpoints\nmsgid \"Fill in the nr. of bytes after the location the pointer points to\"\nmsgstr \"在指针指向的位置后填写字节数\"\n\n#: formaddresschangeunit.rsisnotavalidoffset\n#, object-pascal-format\nmsgid \"%s is not a valid offset\"\nmsgstr \"%s 不是有效的偏移量\"\n\n#: formaddresschangeunit.rsnotalloffsetshavebeenfilledin\nmsgid \"Not all offsets have been filled in\"\nmsgstr \"并非所有偏移量都已填写\"\n\n#: formaddresschangeunit.rsoffsethex\nmsgid \"Offset (Hex)\"\nmsgstr \"偏移量（十六进制）\"\n\n#: formaddresschangeunit.rsresultofnextpointer\nmsgid \"Result of next pointer\"\nmsgstr \"下一个指针的结果\"\n\n#: formaddresschangeunit.rstheoffsetyouchosebringsitto\nmsgid \"The offset you chose brings it to\"\nmsgstr \"你选择的偏移量将其带到\"\n\n#: formaddresschangeunit.rsthispointerpointstoaddress\nmsgid \"This pointer points to address\"\nmsgstr \"该指针指向地址\"\n\n#: formaddtocodelist.rsregion\nmsgid \"Region\"\nmsgstr \"区域\"\n\n#: formchangedaddresses.rsareyouwishtodelete\nmsgid \"Are you sure you wish to delete these entries(s)?\"\nmsgstr \"你确定要删除这些条目吗？\"\n\n#: formchangedaddresses.rschangedaddressesby\n#, object-pascal-format\nmsgid \"Accessed addresses by %x\"\nmsgstr \"通过 %x 访问的地址\"\n\n#: formchangedaddresses.rscodeaccessesaddresses\n#, object-pascal-format\nmsgid \"The following %d addresses have been accessed by the code you selected\"\nmsgstr \"以下 %d 个地址已被你选择的代码访问\"\n\n#: formchangedaddresses.rscodeaccessessingleaddress\nmsgid \"This address has been accessed by the code you selected\"\nmsgstr \"该地址已被你选择的代码访问\"\n\n#: formchangedaddresses.rsdeleteaddresses\nmsgid \"Delete addresses\"\nmsgstr \"删除地址\"\n\n#: formchangedaddresses.rsdesignatesomeaddresses\nmsgid \"Please designate a group to at least some addresses\"\nmsgstr \"请为至少一些地址指定一个组\"\n\n#: formchangedaddresses.rsdisassemblethisaddress\nmsgid \"Disassemble this address\"\nmsgstr \"反汇编该地址\"\n\n#: formchangedaddresses.rsenterluaformula\nmsgid \"Enter a Lua formula to use to filter. E.g RCX==0x2301adc0.  Empty for no filter\"\nmsgstr \"输入一个 Lua 公式以进行过滤。例如 RCX==0x2301adc0。为空则不进行过滤\"\n\n#: formchangedaddresses.rsgivethenewvalue\nmsgid \"Give the new value\"\nmsgstr \"给出新值\"\n\n#: formchangedaddresses.rsinvalidgroups\nmsgid \"Invalid groups\"\nmsgstr \"无效的组\"\n\n#: formchangedaddresses.rsnoaddressesleftforgroup\n#, object-pascal-format\nmsgid \"There are no addresses left for group %d\"\nmsgstr \"组 %d 没有剩余地址\"\n\n#: formchangedaddresses.rsvaluechange\nmsgid \"Value Change\"\nmsgstr \"值更改\"\n\n#: formdesignerunit.rsformfilesfrmfrm\nmsgid \"Form files(*.frm)|*.FRM\"\nmsgstr \"表单文件(*.frm)|*.FRM\"\n\n#: formdesignerunit.rsformfileslfmlfm\nmsgid \"Form files(*.lfm)|*.LFM\"\nmsgstr \"表单文件(*.lfm)|*.LFM\"\n\n#: formdesignerunit.rsinvalidobject\nmsgid \"{Invalid object}\"\nmsgstr \"{无效对象}\"\n\n#: formdesignerunit.rsshowcheckboxesforboolean\nmsgid \"Show checkboxes for boolean\"\nmsgstr \"显示布尔值的复选框\"\n\n#: formdifferentbitsizeunit.rsthelasttimeyouscannedthenumberofbitswasandnowitisp\n#, object-pascal-format\nmsgid \"\"\n\"The last time you scanned the number of bits was %s and now it is %s. Please tell me how and how much i must change the \"\n\"bit offset to scan successfully. (Left+right arrow keys move the bits)\"\nmsgstr \"上次你扫描的位数是 %s，现在是 %s。请告诉我我必须如何以及多少改变位偏移才能成功扫描。（左+右箭头键移动位数）\"\n\n#: formdifferentbitsizeunit.rswelldoneyoufoundaeasteregg\nmsgid \"Well done, you found a easter egg!\"\nmsgstr \"干得好，你发现了一个复活节彩蛋！\"\n\n#: formfoundcodelistextraunit.rsprobablebasepointer\n#, object-pascal-format\nmsgid \"Probable base pointer =%s\"\nmsgstr \"可能的基指针 = %s\"\n\n#: formfoundcodelistextraunit.rsthevalueofthepointerneededtofindthisaddressisproba\n#, object-pascal-format\nmsgid \"The value of the pointer needed to find this address is probably %s\"\nmsgstr \"找到此地址所需的指针值可能是 %s\"\n\n#: formmemoryregionsunit.rscommit\nmsgid \"Commit\"\nmsgstr \"提交\"\n\n#: formmemoryregionsunit.rsdoyouwanttousethecopyonwritebit\nmsgid \"Do you want to use the COPY-ON-WRITE bit?\"\nmsgstr \"你想使用 COPY-ON-WRITE 位吗？\"\n\n#: formmemoryregionsunit.rsexecuteread\nmsgid \"Execute+Read\"\nmsgstr \"执行+读取\"\n\n#: formmemoryregionsunit.rsexecutereadwrite\nmsgid \"Execute+Read+Write\"\nmsgstr \"执行+读取+写入\"\n\n#: formmemoryregionsunit.rsexecutewritecopy\nmsgid \"Execute+Write Copy\"\nmsgstr \"执行+写入复制\"\n\n#: formmemoryregionsunit.rsfailedtodelete\n#, object-pascal-format\nmsgid \"Failed to delete %s\"\nmsgstr \"删除 %s 失败\"\n\n#: formmemoryregionsunit.rsfree\nmsgid \"Free\"\nmsgstr \"释放\"\n\n#: formmemoryregionsunit.rsguard\nmsgid \"Guard\"\nmsgstr \"保护\"\n\n#: formmemoryregionsunit.rsmapped\nmsgid \"Mapped\"\nmsgstr \"已映射\"\n\n#: formmemoryregionsunit.rsmemoryregionssaving\n#, object-pascal-format\nmsgid \"Memory regions - Saving(%s/%s)\"\nmsgstr \"内存区域 - 保存中 (%s/%s)\"\n\n#: formmemoryregionsunit.rsnocache\nmsgid \"No Cache\"\nmsgstr \"无缓存\"\n\n#: formmemoryregionsunit.rsprivate\nmsgid \"Private\"\nmsgstr \"私有\"\n\n#: formmemoryregionsunit.rsreadwrite\nmsgid \"Read+Write\"\nmsgstr \"读取+写入\"\n\n#: formmemoryregionsunit.rsreserve\nmsgid \"Reserve\"\nmsgstr \"保留\"\n\n#: formmemoryregionsunit.rstherearealreadymemoryfileswiththisnamedoyouwanttod\nmsgid \"\"\n\"There are already memoryfiles with this name. Do you want to delete them? (choosing no will add the file(s) to empty \"\n\"slots)\"\nmsgstr \"已经有同名的内存文件。你想删除它们吗？（选择否将把文件添加到空槽）\"\n\n#: formmemoryregionsunit.rsthereisnofreeslot\nmsgid \"There is no free slot\"\nmsgstr \"没有空槽\"\n\n#: formsettingsunit.rsattachtoforegroundprocess\nmsgid \"Attach to current foreground process\"\nmsgstr \"附加到当前前台进程\"\n\n#: formsettingsunit.rscancelthecurrentscan\nmsgid \"Cancel the current scan\"\nmsgstr \"取消当前扫描\"\n\n#: formsettingsunit.rschangedvalue\nmsgid \"Changed Value\"\nmsgstr \"已更改的值\"\n\n#: formsettingsunit.rschangetypeto\nmsgid \"Change type to\"\nmsgstr \"更改类型为\"\n\n#: formsettingsunit.rsdebugrun\nmsgid \"Debug->Run\"\nmsgstr \"调试->运行\"\n\n#: formsettingsunit.rsdecreasedvalue\nmsgid \"Decreased Value\"\nmsgstr \"减少的值\"\n\n#: formsettingsunit.rsfailmmregistry\nmsgid \"Failure getting the Memory Management registry key\"\nmsgstr \"获取内存管理注册表项失败\"\n\n#: formsettingsunit.rsfailuretoopenregistry\nmsgid \"Failure to open the registry entry\"\nmsgstr \"打开注册表项失败\"\n\n#: formsettingsunit.rsincreasedvalue\nmsgid \"Increased Value\"\nmsgstr \"增加的值\"\n\n#: formsettingsunit.rsinvalidsymbolsynctimer\nmsgid \"The provided value for the symbol sync timer is invalid\"\nmsgstr \"提供的符号同步计时器值无效\"\n\n#: formsettingsunit.rsisnotavalidinterval\n#, object-pascal-format\nmsgid \"%s is not a valid interval\"\nmsgstr \"%s 不是有效的间隔\"\n\n#: formsettingsunit.rsnewlanguageset\nmsgid \"New language set\"\nmsgstr \"新语言设置\"\n\n#: formsettingsunit.rsnoname\nmsgid \"No Name\"\nmsgstr \"无名称\"\n\n#: formsettingsunit.rspausetheselectedprocess\nmsgid \"Pause the selected process\"\nmsgstr \"暂停选定的进程\"\n\n#: formsettingsunit.rspleasebootwithunsigneddriversallowedf8duringbootor\nmsgid \"Please boot with unsigned drivers allowed(F8 during boot), or sign the driver yourself\"\nmsgstr \"请启动时允许未签名驱动程序（启动时按 F8），或自行签署驱动程序\"\n\n#: formsettingsunit.rspopuphidecheatengine\nmsgid \"Popup/Hide Cheat Engine\"\nmsgstr \"弹出/隐藏 Cheat Engine\"\n\n#: formsettingsunit.rsrequiresdbvm\nmsgid \"(Requires DBVM)\"\nmsgstr \"(需要 DBVM)\"\n\n#: formsettingsunit.rsrestartce\nmsgid \"It is recommended to restart Cheat Engine for this change to take effect\"\nmsgstr \"建议重新启动 Cheat Engine 以使此更改生效\"\n\n#: formsettingsunit.rssigning\nmsgid \"Signing\"\nmsgstr \"签名\"\n\n#: formsettingsunit.rsspectreregistrychanged\nmsgid \"The registry keys has been changed accordingly.  Reboot your system to make it take effect\"\nmsgstr \"注册表项已相应更改。重启系统以使其生效\"\n\n#: formsettingsunit.rsspectrerestore\nmsgid \"Your protection has been restored. Please restart your system to make it take effect\"\nmsgstr \"你的保护已恢复。请重启系统以使其生效\"\n\n#: formsettingsunit.rsspectrewarning\nmsgid \"\"\n\"WARNING! Making kernelmode possible will slightly increase the speed of your system, BUT it will make you vulnerable to \"\n\"Spectre attacks\\n\"\n\"Are you ok with this? (You can later re-enable this protection)\"\nmsgstr \"警告！启用内核模式可能会稍微提高系统速度，但会使你容易受到 Spectre 攻击。你对此是否可以接受？（你可以稍后重新启用此保护）\"\n\n#: formsettingsunit.rsspeedhackspeed\nmsgid \"Speedhack speed\"\nmsgstr \"速度黑客速度\"\n\n#: formsettingsunit.rsthescanbuffersizehastobegreaterthan0\nmsgid \"The scanbuffer size has to be greater than 0\"\nmsgstr \"扫描缓冲区大小必须大于 0\"\n\n#: formsettingsunit.rsthevalueforthekeypollintervalisinvalid\n#, object-pascal-format\nmsgid \"the value for the keypoll interval (%s is invalid\"\nmsgstr \"键轮询间隔的值（%s 无效）\"\n\n#: formsettingsunit.rsthevalueforthewaitbetweenhotkeypressesisinvalid\n#, object-pascal-format\nmsgid \"the value for the wait between hotkey presses (%s is invalid\"\nmsgstr \"热键按下之间的等待时间的值（%s 无效）\"\n\n#: formsettingsunit.rsthispluginisalreadyloaded\nmsgid \"This plugin is already loaded\"\nmsgstr \"此插件已加载\"\n\n#: formsettingsunit.rstogglebetweenfirstlastscancompare\nmsgid \"Toggle between first/last scan compare\"\nmsgstr \"在第一次/最后一次扫描比较之间切换\"\n\n#: formsettingsunit.rstogglethespeedhack\nmsgid \"Toggle the speedhack\"\nmsgstr \"切换速度黑客\"\n\n#: formsettingsunit.rsunchangedvalue\nmsgid \"Unchanged Value\"\nmsgstr \"未更改的值\"\n\n#: formsettingsunit.rsundolastscan\nmsgid \"Undo last scan\"\nmsgstr \"撤销上一次扫描\"\n\n#: formsettingsunit.rsunknowninitialvalue\nmsgid \"Unknown Initial Value\"\nmsgstr \"未知初始值\"\n\n#: formsettingsunit.rsyouhaventselectedanymemorytypethiswillresultinchea\nmsgid \"You haven't selected any memory type. This will result in Cheat Engine finding NO memory! Are you stupid?\"\nmsgstr \"你没有选择任何内存类型。这将导致 Cheat Engine 找不到任何内存！你是傻吗？\"\n\n#: formsettingsunit.strprocesswatcherwillpreventunloader\nmsgid \"Enabling the process watcher will prevent the unloader from working\"\nmsgstr \"启用进程监视器将阻止卸载程序工作\"\n\n#: foundcodeunit.rsfctheswillsetasiftwarebreakpointint3oneverysingleopcodeetc\nmsgid \"This will set a Software Breakpoint (int3) on every single opcode that will be reported here. Are you sure ?\"\nmsgstr \"这将在每个单独的操作码上设置软件断点（int3），并将在此处报告。你确定吗？\"\n\n#: frmadconfigunit.rspercentageshown\nmsgid \"Percentage shown\"\nmsgstr \"显示百分比\"\n\n#: frmautoinjectunit.rsaaaobtemplate_author\nmsgid \"Author\"\nmsgstr \"作者\"\n\n#: frmautoinjectunit.rsaaaobtemplate_blabla\nmsgid \"This script does blah blah blah\"\nmsgstr \"此脚本执行 blah blah blah\"\n\n#: frmautoinjectunit.rsaaaobtemplate_date\nmsgid \"Date\"\nmsgstr \"日期\"\n\n#: frmautoinjectunit.rsaaaobtemplate_game\nmsgid \"Game\"\nmsgstr \"游戏\"\n\n#: frmautoinjectunit.rsaaaobtemplate_version\nmsgid \"Version\"\nmsgstr \"版本\"\n\n#: frmautoinjectunit.rsaadescribeallocatedmemory\nmsgid \"this is allocated memory, you have read,write,execute access\"\nmsgstr \"这是分配的内存，你具有读、写、执行权限\"\n\n#: frmautoinjectunit.rsareyousureyouwanttoclose\n#, object-pascal-format\nmsgid \"Are you sure you want to close %s ?\"\nmsgstr \"你确定要关闭 %s 吗？\"\n\n#: frmautoinjectunit.rsautoassembler\nmsgid \"Auto assembler\"\nmsgstr \"自动汇编器\"\n\n#: frmautoinjectunit.rsceafilter\nmsgid \"Cheat Engine Assembly (*.CEA)|*.CEA|All Files ( *.* )|*.*\"\nmsgstr \"Cheat Engine 汇编 (*.CEA)|*.CEA|所有文件 ( *.* )|*.*\"\n\n#: frmautoinjectunit.rscegafilter\nmsgid \"Cheat Engine GNU Assembly (*.CEGA)|*.CEGA|All Files ( *.* )|*.*\"\nmsgstr \"Cheat Engine GNU 汇编 (*.CEGA)|*.CEGA|所有文件 ( *.* )|*.*\"\n\n#: frmautoinjectunit.rscodeinjecttemplate\nmsgid \"Code inject template\"\nmsgstr \"代码注入模板\"\n\n#: frmautoinjectunit.rscodeneedsenableanddisable\nmsgid \"The code needs an [ENABLE] and a [DISABLE] section if you want to use this script as a table entry\"\nmsgstr \"如果你想将此脚本用作表项，代码需要包含 [ENABLE] 和 [DISABLE] 部分\"\n\n#: frmautoinjectunit.rscoderelocationtemplate\nmsgid \"Code relocation template\"\nmsgstr \"代码重定位模板\"\n\n#: frmautoinjectunit.rsdescribethatthiscodewilldisablethescript\nmsgid \"code from here till the end of the code will be used to disable the cheat\"\nmsgstr \"从这里到代码末尾的代码将用于禁用作弊\"\n\n#: frmautoinjectunit.rsdescribethatthiscodewillenablethescript\nmsgid \"code from here to '[DISABLE]' will be used to enable the cheat\"\nmsgstr \"从这里到 '[DISABLE]' 的代码将用于启用作弊\"\n\n#: frmautoinjectunit.rsendaddresslastbytesareincludedifnecesary\nmsgid \"End address (last bytes are included if necessary)\"\nmsgstr \"结束地址（必要时包括最后的字节）\"\n\n#: frmautoinjectunit.rserrorcouldnotfinduniqueaobtriedcode\nmsgid \"ERROR: Could not find unique AOB, tried code \\\"\"\nmsgstr \"错误：找不到唯一的 AOB，尝试的代码 \\\"\"\n\n#: frmautoinjectunit.rserrorinscript\n#, object-pascal-format\nmsgid \"Error in script %s : %s\"\nmsgstr \"脚本 %s 中的错误：%s\"\n\n#: frmautoinjectunit.rserrorinscriptnotab\n#, object-pascal-format\nmsgid \"Error in script : %s\"\nmsgstr \"脚本中的错误：%s\"\n\n#: frmautoinjectunit.rseverythingok\nmsgid \"Everything ok\"\nmsgstr \"一切正常\"\n\n#: frmautoinjectunit.rsexecutescript\nmsgid \"Execute script\"\nmsgstr \"执行脚本\"\n\n#: frmautoinjectunit.rsfailedallocatingmemoryforthescript\nmsgid \"Failed allocating memory for the script\"\nmsgstr \"为脚本分配内存失败\"\n\n#: frmautoinjectunit.rsfailedcreatingcallingstubforscriptlocatedataddress\nmsgid \"Failed creating calling stub for script located at address \"\nmsgstr \"创建位于地址的脚本调用存根失败\"\n\n#: frmautoinjectunit.rsfailedtoaddtotablenotallcodeisinjectable\nmsgid \"Failed to add to table. Not all code is injectable\"\nmsgstr \"添加到表中失败。并非所有代码都是可注入的\"\n\n#: frmautoinjectunit.rsfailedwritingthescripttotheprocess\nmsgid \"failed writing the script to the process\"\nmsgstr \"写入脚本到进程失败\"\n\n#: frmautoinjectunit.rsfailureloadingundercdll\nmsgid \"Failure loading undercdll\"\nmsgstr \"加载 undercdll 失败\"\n\n#: frmautoinjectunit.rsgnuascript\nmsgid \"GNU Assembler Script\"\nmsgstr \"GNU 汇编脚本\"\n\n#: frmautoinjectunit.rslessthan2gbdistance\nmsgid \"<2GB Distance\"\nmsgstr \"小于 2GB 距离\"\n\n#: frmautoinjectunit.rsluafilter\nmsgid \"LUA Script (*.LUA)|*.LUA|All Files ( *.* )|*.*\"\nmsgstr \"LUA 脚本 (*.LUA)|*.LUA|所有文件 ( *.* )|*.*\"\n\n#: frmautoinjectunit.rsluascript\nmsgid \"LUA Script\"\nmsgstr \"LUA 脚本\"\n\n#: frmautoinjectunit.rsmorethan2gbdistance\nmsgid \">2GB Distance\"\nmsgstr \">2GB 距离\"\n\n#: frmautoinjectunit.rsnewnamequestion\nmsgid \"What should the new name be?\"\nmsgstr \"新名称应该是什么？\"\n\n#: frmautoinjectunit.rsnotallcodeisinjectable\n#, object-pascal-format\nmsgid \"\"\n\"Not all code is injectable.\\n\"\n\"%s\\n\"\n\"Are you sure you want to edit it to this?\"\nmsgstr \"并非所有代码都是可注入的。%s 你确定要将其编辑为这个吗？\"\n\n#: frmautoinjectunit.rsonwhataddressdoyouwantthejump\nmsgid \"On what address do you want the jump?\"\nmsgstr \"你想在哪个地址进行跳转？\"\n\n#: frmautoinjectunit.rsoriginalcode\nmsgid \"Original code\"\nmsgstr \"原始代码\"\n\n#: frmautoinjectunit.rsplaceyourcodehere\nmsgid \"place your code here\"\nmsgstr \"在这里放置你的代码\"\n\n#: frmautoinjectunit.rsrenametab\nmsgid \"Rename tab\"\nmsgstr \"重命名标签\"\n\n#: frmautoinjectunit.rsscript\nmsgid \"Script \"\nmsgstr \"脚本 \"\n\n#: frmautoinjectunit.rsscript1\nmsgid \"Script 1\"\nmsgstr \"脚本 1\"\n\n#: frmautoinjectunit.rsstartaddress\nmsgid \"Start address\"\nmsgstr \"起始地址\"\n\n#: frmautoinjectunit.rsthumbinstructionsarenotyetimplemented\nmsgid \"Thumb instructions are not yet implemented\"\nmsgstr \"Thumb 指令尚未实现\"\n\n#: frmautoinjectunit.rswhatidentifierdoyouwanttouse\nmsgid \"What do you want to name the symbol for the injection point?\"\nmsgstr \"你想为注入点命名什么符号？\"\n\n#: frmautoinjectunit.rswritecode\nmsgid \"Write code\"\nmsgstr \"编写代码\"\n\n#: frmbranchmapperunit.rsfoundnr\n#, object-pascal-format\nmsgid \"Found %d\"\nmsgstr \"找到 %d\"\n\n#: frmbranchmapperunit.rsstartmapping\nmsgid \"Start Mapping\"\nmsgstr \"开始映射\"\n\n#: frmbreakpointlistunit.rsbpareyousureyouwishtochangethistoapegewidebp\nmsgid \"Are you sure you wish to change this to a pagewide breakpoint?\"\nmsgstr \"你确定要将其更改为全页断点吗？\"\n\n#: frmchangedaddressescommonalityscannerunit.rsdblclicklaunchcomp\nmsgid \"Doubleclick to launch structure compare\"\nmsgstr \"双击以启动结构比较\"\n\n#: frmchangedaddressescommonalityscannerunit.rsshowresults\nmsgid \"Doubleclick to show scanner/results\"\nmsgstr \"双击以显示扫描器/结果\"\n\n#: frmcodecavescannerunit.rsclosingthiswindowwillalsostopthescannerareyousure\nmsgid \"Closing this window will also stop the scanner. Are you sure?\"\nmsgstr \"关闭此窗口也将停止扫描器。你确定吗？\"\n\n#: frmcodecavescannerunit.rspleaseprovideavalidsizeforthewantedcodecave\nmsgid \"Please provide a valid size for the wanted code cave\"\nmsgstr \"请提供所需代码洞的有效大小\"\n\n#: frmcodecavescannerunit.rspleaseprovideavalidstartaddress\nmsgid \"Please provide a valid start address\"\nmsgstr \"请提供有效的起始地址\"\n\n#: frmcodecavescannerunit.rspleaseprovideavalidstopaddress\nmsgid \"Please provide a valid stop address\"\nmsgstr \"请提供有效的停止地址\"\n\n#: frmcodecavescannerunit.rspleasetellmeyoudontneedacodecavethissmall\nmsgid \"Please tell me you don't need a code cave this small!!!\"\nmsgstr \"请告诉我你不需要这么小的代码洞！！！\"\n\n#: frmcodefilterunit.rsaddresslist\n#, object-pascal-format\nmsgid \"Address List (%d)\"\nmsgstr \"地址列表 (%d)\"\n\n#: frmcodefilterunit.rsassemblyscanpleasewait\nmsgid \"Assembly Scan. Please wait\"\nmsgstr \"汇编扫描。请稍候\"\n\n#: frmcodefilterunit.rscancel\nmsgid \"Cancel List Refresh\"\nmsgstr \"取消列表刷新\"\n\n#: frmcodefilterunit.rsfilteringaddresses\nmsgid \"Filtering addresses\"\nmsgstr \"过滤地址\"\n\n#: frmcodefilterunit.rsopenanaddressfile\nmsgid \"Open an address file\"\nmsgstr \"打开地址文件\"\n\n#: frmcodefilterunit.rssaveanaddressfile\nmsgid \"Save an address file\"\nmsgstr \"保存地址文件\"\n\n#: frmcodefilterunit.rssettingbreakpoints\nmsgid \"Setting breakpoints\"\nmsgstr \"设置断点\"\n\n#: frmcodefilterunit.rsxisaninvalidrange\n#, object-pascal-format\nmsgid \"%s is an invalid range (xxxx-xxxx)\"\nmsgstr \"%s 是无效范围（xxxx-xxxx）\"\n\n#: frmcr3switcherunit.rsdbvmcr3log\nmsgid \"DBVM CR3 Log\"\nmsgstr \"DBVM CR3 日志\"\n\n#: frmcr3switcherunit.rsdescribedbvmroutine\nmsgid \"DBVM will record all CR3 values it encounters up to 512 unique ones). How long should it wait? (In seconds)\"\nmsgstr \"DBVM 将记录它遇到的所有 CR3 值（最多 512 个唯一值）。它应该等待多长时间？（以秒为单位）\"\n\n#: frmcr3switcherunit.rslongwaitwarning\n#, object-pascal-format\nmsgid \"Are you sure you wish to wait %d seconds?\"\nmsgstr \"你确定要等待 %d 秒吗？\"\n\n#: frmdebugsymbolstructurelistunit.rstherearestructuresinthislist\n#, object-pascal-format\nmsgid \"There are %d structures in this list\"\nmsgstr \"此列表中有 %d 个结构\"\n\n#: frmdisassemblyscanunit.rsdsscanerror\nmsgid \"scan error\"\nmsgstr \"扫描错误\"\n\n#: frmdissectwindowunit.rsgivethenewtextforthiswindow\nmsgid \"Give the new text for this window\"\nmsgstr \"为此窗口提供新文本\"\n\n#: frmdissectwindowunit.rsinvis\nmsgid \"Invis\"\nmsgstr \"隐形\"\n\n#: frmdissectwindowunit.rsremoved\nmsgid \"Removed\"\nmsgstr \"已移除\"\n\n#: frmexceptionregionlistunit.rsconfirmdeleteregion\n#, object-pascal-format\nmsgid \"Are you sure you wish to remove the range %s?\"\nmsgstr \"你确定要移除范围 %s 吗？\"\n\n#: frmexceptionregionlistunit.rseraselistquestion\nmsgid \"Are you sure the erase the list?\"\nmsgstr \"你确定要清空列表吗？\"\n\n#: frmexetrainergeneratorunit.rsarchive\nmsgid \" ARCHIVE:\"\nmsgstr \"档案：\"\n\n#: frmexetrainergeneratorunit.rscetrainermaker\nmsgid \"CE trainer maker\"\nmsgstr \"CE 训练器制作器\"\n\n#: frmexetrainergeneratorunit.rsdecompressor\nmsgid \" DECOMPRESSOR:\"\nmsgstr \"解压缩器：\"\n\n#: frmexetrainergeneratorunit.rsfailureonwriting\nmsgid \"failure on writing\"\nmsgstr \"写入失败\"\n\n#: frmexetrainergeneratorunit.rsfailureopeningthetrainerforresourceupdates\nmsgid \"Failure opening the trainer for resource updates. Make sure you do not watch the creation\"\nmsgstr \"打开训练器以进行资源更新失败。确保你没有监视创建过程\"\n\n#: frmexetrainergeneratorunit.rsfastest\nmsgid \"Fastest\"\nmsgstr \"最快\"\n\n#: frmexetrainergeneratorunit.rsiconupdateerror\nmsgid \"icon update error\"\nmsgstr \"图标更新错误\"\n\n#: frmexetrainergeneratorunit.rsinvalidicon\nmsgid \"(Invalid icon)\"\nmsgstr \"(无效图标)\"\n\n#: frmexetrainergeneratorunit.rsinvalidicontype\nmsgid \"(Invalid icon type)\"\nmsgstr \"(无效图标类型)\"\n\n#: frmexetrainergeneratorunit.rsnewfoldername\nmsgid \"New foldername\"\nmsgstr \"新文件夹名称\"\n\n#: frmexetrainergeneratorunit.rsthetrainerhasbeensuccessfullygenerated\nmsgid \"The trainer has been successfully generated\"\nmsgstr \"训练器已成功生成\"\n\n#: frmexetrainergeneratorunit.rstrainerfilemissing\n#, object-pascal-format\nmsgid \"Copying %s.dat to %s failed. Please make sure the file still exists\"\nmsgstr \"复制 %s.dat 到 %s 失败。请确保文件仍然存在\"\n\n#: frmexetrainergeneratorunit.rsupdatefailed\n#, object-pascal-format\nmsgid \"Failure updating the trainer resource information: %d\"\nmsgstr \"更新训练器资源信息失败：%d\"\n\n#: frmfilepatcherunit.rsfilepatcher\nmsgid \"File Patcher: \"\nmsgstr \"文件补丁程序：\"\n\n#: frmfillmemoryunit.rsfmregiontoolarge\nmsgid \"Region too large\"\nmsgstr \"区域过大\"\n\n#: frmfillmemoryunit.rspleasefillinavalidfillvalue\nmsgid \"Please fill in a valid 'Fill' value\"\nmsgstr \"请填写有效的“填充”值\"\n\n#: frmfindstaticsunit.rsfsstructorarray\nmsgid \"struct or array\"\nmsgstr \"结构或数组\"\n\n#: frmfindstaticsunit.rsfsunreadablepointer\nmsgid \"Unreadable pointer\"\nmsgstr \"不可读指针\"\n\n#: frmfloatingpointpanelunit.rsfppextended\nmsgid \"Extended (default)\"\nmsgstr \"扩展（默认）\"\n\n#: frmgdtunit.rsgdtaccessed\nmsgid \"Accessed=\"\nmsgstr \"已访问=\"\n\n#: frmgdtunit.rsgdtavl\nmsgid \"AVL=\"\nmsgstr \"AVL=\"\n\n#: frmgdtunit.rsgdtcodesegment\nmsgid \"Code Segment\"\nmsgstr \"代码段\"\n\n#: frmgdtunit.rsgdtconforming\nmsgid \"Conforming=\"\nmsgstr \"符合=\"\n\n#: frmgdtunit.rsgdtdatasegment\nmsgid \"Data Segment\"\nmsgstr \"数据段\"\n\n#: frmgdtunit.rsgdtdpl\nmsgid \"DPL=\"\nmsgstr \"DPL=\"\n\n#: frmgdtunit.rsgdtexpansiondirection\nmsgid \"Expansion direction=\"\nmsgstr \"扩展方向=\"\n\n#: frmgdtunit.rsgdtnotpresent\nmsgid \"Not present\"\nmsgstr \"不存在\"\n\n#: frmgdtunit.rsgdtreadable\nmsgid \"Readable=\"\nmsgstr \"可读=\"\n\n#: frmgdtunit.rsgdtreaderror\nmsgid \"Read error\"\nmsgstr \"读取错误\"\n\n#: frmgdtunit.rsgdtsystemsegment\nmsgid \"System Segment\"\nmsgstr \"系统段\"\n\n#: frmgdtunit.rsgdtwritable\nmsgid \"Writable=\"\nmsgstr \"可写=\"\n\n#: frmgroupscanalgoritmgeneratorunit.rsgsgblocksizemustbeprovided\nmsgid \"blocksize must be provided\"\nmsgstr \"必须提供块大小\"\n\n#: frmgroupscanalgoritmgeneratorunit.rsgsgshouldbeatleast\n#, object-pascal-format\nmsgid \"Should be at least %d\"\nmsgstr \"应至少为 %d\"\n\n#: frmgroupscanalgoritmgeneratorunit.rspickedhint\nmsgid \"\"\n\"When checked this element will get added to the addresslist. Note: If all checkboxes are disabled, ALL elements will be \"\n\"added\"\nmsgstr \"选中时，此元素将被添加到地址列表。注意：如果所有复选框都被禁用，将添加所有元素\"\n\n#: frmgroupscanalgoritmgeneratorunit.rsrange\nmsgid \"Range\"\nmsgstr \"范围\"\n\n#: frmgroupscanalgoritmgeneratorunit.rssstaticddynamiceexecutable\nmsgid \"S=Static D=Dynamic E=Executable\"\nmsgstr \"S=静态 D=动态 E=可执行\"\n\n#: frmgroupscanalgoritmgeneratorunit.rswildcard\nmsgid \"Skip nr of bytes:\"\nmsgstr \"跳过字节数：\"\n\n#: frmidtunit.rsidt16bitinterruptgate\nmsgid \"16-bit interrupt gate\"\nmsgstr \"16 位中断门\"\n\n#: frmidtunit.rsidt16biytrapgate\nmsgid \"16-bit trap gate\"\nmsgstr \"16 位陷阱门\"\n\n#: frmidtunit.rsidt32bitinterruptgate\nmsgid \"32-bit interrupt gate\"\nmsgstr \"32 位中断门\"\n\n#: frmidtunit.rsidt32biytrapgate\nmsgid \"32-bit trap gate\"\nmsgstr \"32 位陷阱门\"\n\n#: frmidtunit.rsidtdpl\nmsgid \" DPL=\"\nmsgstr \" DPL=\"\n\n#: frmidtunit.rsidtnotpresent\nmsgid \"not present\"\nmsgstr \"不存在\"\n\n#: frmidtunit.rsidttaskgate\nmsgid \"task gate\"\nmsgstr \"任务门\"\n\n#: frmidtunit.rsidtunkownidt\nmsgid \"unknown IDT\"\nmsgstr \"未知 IDT\"\n\n#: frmloadmemoryunit.rsloadintomemory\n#, object-pascal-format\nmsgid \"Load %s into memory\"\nmsgstr \"将 %s 加载到内存中\"\n\n#: frmloadmemoryunit.rsnotallthememorycanbewritteninthecurrentmemoryregion\nmsgid \"\"\n\"Not all the memory can be written in the current memory region. Do you want to force as much as possible into the given \"\n\"region and just discard what can not be written? (Really bad idea)\"\nmsgstr \"当前内存区域无法写入所有内存。你想强制尽可能多地写入给定区域，并丢弃无法写入的部分吗？（真的很糟糕的主意）\"\n\n#: frmloadmemoryunit.rswrotebytesoutof\n#, object-pascal-format\nmsgid \"Wrote %d bytes out of %d\"\nmsgstr \"已写入 %d 字节，共 %d 字节\"\n\n#: frmloadmemoryunit.strinvalidfile\nmsgid \"This is a invalid memory region file. I'll assume this file has no header data\"\nmsgstr \"这是一个无效的内存区域文件。我将假设该文件没有头数据\"\n\n#: frmluaengineunit.rserror\nmsgid \"Script Error\"\nmsgstr \"脚本错误\"\n\n#: frmluaengineunit.rsleerrorinline\nmsgid \"Error in line \"\nmsgstr \"第行错误 \"\n\n#: frmluaengineunit.rsleonlyonescriptcanbedebuggedatatimeetc\nmsgid \"Only one script can be debugged at a time. Continue executing this script without the debugger?\"\nmsgstr \"一次只能调试一个脚本。继续执行此脚本而不使用调试器吗？\"\n\n#: frmluaengineunit.rsleuserclickedstop\nmsgid \"User clicked stop\"\nmsgstr \"用户点击停止\"\n\n#: frmmemoryallochandlerunit.rsevent1failure\nmsgid \"Event1 failure:\"\nmsgstr \"事件1失败：\"\n\n#: frmmemoryallochandlerunit.rsevent2failure\nmsgid \"Event2 failure:\"\nmsgstr \"事件2失败：\"\n\n#: frmmemoryallochandlerunit.rsevent3failure\nmsgid \"Event3 failure:\"\nmsgstr \"事件3失败：\"\n\n#: frmmemoryallochandlerunit.rsfailuretohook\nmsgid \"Failure to hook\"\nmsgstr \"钩子失败\"\n\n#: frmmemoryallochandlerunit.rsfailuretoinitialize\nmsgid \"Failure to initialize\"\nmsgstr \"初始化失败\"\n\n#: frmmemoryallochandlerunit.rsheapcount\n#, object-pascal-format\nmsgid \"Heapcount=%s\"\nmsgstr \"堆计数=%s\"\n\n#: frmmemoryallochandlerunit.rsqueuedmemoryeventswaiting\n#, object-pascal-format\nmsgid \"Queued memory events waiting: %s\"\nmsgstr \"排队的内存事件等待：%s\"\n\n#: frmmemoryrecorddropdownsettingsunit.rsdddropdownotionsfor\nmsgid \"Dropdown options for \"\nmsgstr \"下拉选项 \"\n\n#: frmmemviewpreferencesunit.rsdchighlightedbreakpoint\nmsgid \"Highlighted breakpoint\"\nmsgstr \"高亮断点\"\n\n#: frmmemviewpreferencesunit.rsdchighlightedbreakpointsecondary\nmsgid \"Highlighted breakpoint secondary\"\nmsgstr \"高亮断点（次要）\"\n\n#: frmmemviewpreferencesunit.rsdchighlightedsecondary\nmsgid \"Highlighted secondary\"\nmsgstr \"高亮次要\"\n\n#: frmmemviewpreferencesunit.rsdchighlightedultimap2\nmsgid \"Highlighted Ultimap2\"\nmsgstr \"高亮 Ultimap2\"\n\n#: frmmemviewpreferencesunit.rsdchighlightedultimap2secondary\nmsgid \"Highlighted Ultimap2 secondary\"\nmsgstr \"高亮 Ultimap2（次要）\"\n\n#: frmmemviewpreferencesunit.rsdcultimap2\nmsgid \"Ultimap2\"\nmsgstr \"Ultimap2\"\n\n#: frmmemviewpreferencesunit.rshexedit\nmsgid \"Hexedit\"\nmsgstr \"十六进制编辑\"\n\n#: frmmemviewpreferencesunit.rsnormalcolor\nmsgid \"Normal color\"\nmsgstr \"正常颜色\"\n\n#: frmmergepointerscanresultsettingsunit.rscopiesthesourceptrfilestotheworkingfolder\nmsgid \"Copies the source .ptr.# files to the working folder of the main PTR\"\nmsgstr \"将源 .ptr.# 文件复制到主 PTR 的工作文件夹\"\n\n#: frmmergepointerscanresultsettingsunit.rslinksdirectlytothepathsofthesourceptrfiles\nmsgid \"\"\n\"Links directly to the paths of the source .ptr.# files.\\n\"\n\"Note: The result will be unusable by other systems that do not have the same path layout, until you generate new results\"\nmsgstr \"\"\n\"直接链接到源 .ptr.# 文件的路径。\\n\"\n\"注意：结果在生成新结果之前将无法被其他没有相同路径布局的系统使用\"\n\n#: frmmergepointerscanresultsettingsunit.rsmovesthesourceptrfilestotheworkingfolder\nmsgid \"\"\n\"Moves the source .ptr.# files to the working folder of the main PTR\\n\"\n\"Note: This destroys the source\"\nmsgstr \"将源 .ptr.# 文件移动到主 PTR 的工作文件夹中。注意：这会销毁源文件\"\n\n#: frmmodifyregistersunit.rsfailuresettingdbvmchangeregonbp\nmsgid \"Failure setting a DBVM ChangeRegOnBP breakpoint\"\nmsgstr \"设置 DBVM ChangeRegOnBP 断点失败\"\n\n#: frmmodifyregistersunit.rsmodifyregisterssat\n#, object-pascal-format\nmsgid \"Modify registers(s) at %s\"\nmsgstr \"在 %s 修改寄存器\"\n\n#: frmmodifyregistersunit.rspleasefillinavalidvaluefor\nmsgid \"Please fill in a valid value for\"\nmsgstr \"请填写有效的值\"\n\n#: frmpagingunit.rsfailurereadingphysicalmemory\nmsgid \"failure reading physical memory\"\nmsgstr \"读取物理内存失败\"\n\n#: frmpagingunit.rsnotfound\nmsgid \"Not found\"\nmsgstr \"未找到\"\n\n#: frmpointerscanconnectdialogunit.rshostcouldnotberesolved\n#, object-pascal-format\nmsgid \"host: %s could not be resolved\"\nmsgstr \"主机：%s 无法解析\"\n\n#: frmpointerscanconnectdialogunit.rsuseloadedpointermap\nmsgid \"Use loaded pointermap:\"\nmsgstr \"使用加载的指针图：\"\n\n#: frmprocesswatcherunit.rsconventionalids\nmsgid \"----Conventional ID's----\"\nmsgstr \"----常规 ID ----\"\n\n#: frmprocesswatcherunit.rsfailedstartingtheprocesswatcher\nmsgid \"Failed starting the process watcher\"\nmsgstr \"启动进程监视器失败\"\n\n#: frmprocesswatcherunit.rspeprocess\nmsgid \"PEPROCESS=\"\nmsgstr \"PEPROCESS=\"\n\n#: frmprocesswatcherunit.rsprocessid\nmsgid \"ProcessID=\"\nmsgstr \"ProcessID=\"\n\n#: frmprocesswatcherunit.rsprocesswatcherthreaderror\n#, object-pascal-format\nmsgid \"processwatcher: thread error:%s\"\nmsgstr \"进程监视器：线程错误：%s\"\n\n#: frmprocesswatcherunit.rsthreadid\nmsgid \"ThreadID:\"\nmsgstr \"线程 ID：\"\n\n#: frmregistersunit.rslabelregisterhint\nmsgid \"\"\n\"DoubleClick: Browse this memory region.\\n\"\n\"Right Mouse Click: Register Value will be copied to Clipboard and Context Menu will open.\"\nmsgstr \"双击：浏览此内存区域。右键单击：注册值将被复制到剪贴板，并打开上下文菜单。\"\n\n#: frmrescanpointerunit.rsnotalltheendoffsetshavebeenfilledin\nmsgid \"Not all the end offsets have been filled in\"\nmsgstr \"并非所有结束偏移量都已填写\"\n\n#: frmrescanpointerunit.rsnotallthestartoffsetshavebeenfilledin\nmsgid \"Not all the start offsets have been filled in\"\nmsgstr \"并非所有开始偏移量都已填写\"\n\n#: frmrescanpointerunit.rsrpfirstoffset\nmsgid \"First offset\"\nmsgstr \"第一个偏移量\"\n\n#: frmrescanpointerunit.rsrpthefunction\n#, object-pascal-format\nmsgid \"The function %s(base, offsets, target) has not yet been defined. Please define it first\"\nmsgstr \"函数 %s(base, offsets, target) 尚未定义。请先定义它\"\n\n#: frmrescanpointerunit.rsrpusesavedpointermap\nmsgid \"Use saved pointermap: \"\nmsgstr \"使用保存的指针图：\"\n\n#: frmresumepointerscanunit.rsentertheaddressthisscanshouldlookfor\nmsgid \"Enter the address this scan should look for\"\nmsgstr \"输入此扫描应查找的地址\"\n\n#: frmresumepointerscanunit.rsnewpointermap\nmsgid \"New pointermap\"\nmsgstr \"新的指针图\"\n\n#: frmresumepointerscanunit.rsrpswasnotfound\nmsgid \" was not found\"\nmsgstr \"未找到\"\n\n#: frmsavememoryregionunit.rsnostartaddress\nmsgid \"\"\n\"If you don't include the header data you'll have to specify the startaddress yourself when loading the file(That means \"\n\"Cheat Engine won't fill in the startaddress text field when loaded for you)\"\nmsgstr \"如果不包含头数据，加载文件时必须自己指定起始地址（这意味着 Cheat Engine 加载时不会为你填写起始地址文本字段）\"\n\n#: frmsavememoryregionunit.rsnotallthememorywasreadablein\nmsgid \"Not all the memory was readable in\"\nmsgstr \"并非所有内存在中都是可读的\"\n\n#: frmsavememoryregionunit.rspleaseaddatleastoneaddressregiontothelist\nmsgid \"Please add at least one address region to the list\"\nmsgstr \"请至少向列表中添加一个地址区域\"\n\n#: frmsavesnapshotsunit.rsssareyousureyouwishtothrowawaythesesnapshots\nmsgid \"Are you sure you wish to throw away these snapshots?\"\nmsgstr \"你确定要丢弃这些快照吗？\"\n\n#: frmsnapshothandlerunit.rsshdissectandcomparememoryofselectedsnapshots\nmsgid \"Dissect and compare memory of selected snapshots\"\nmsgstr \"解剖并比较选定快照的内存\"\n\n#: frmsnapshothandlerunit.rsshdissectmemoryofselectedsnapshot\nmsgid \"Dissect memory of selected snapshot\"\nmsgstr \"解剖选定快照的内存\"\n\n#: frmsnapshothandlerunit.rsshfunctions\nmsgid \" Function(s): \"\nmsgstr \"函数：\"\n\n#: frmsortpointerlistunit.rstimeleft\nmsgid \"Estimated time left\"\nmsgstr \"预计剩余时间\"\n\n#: frmstackviewunit.rssvthisstackviewwindowhasallocatedstacksnapshotsetc\nmsgid \"This stackview window has allocated stack snapshots in the target process. Do you wish to free them?\"\nmsgstr \"此堆栈视图窗口在目标进程中分配了堆栈快照。你想要释放它们吗？\"\n\n#: frmstringmapunit.rsbtnshowlist\nmsgid \"<<Show list\"\nmsgstr \"<<显示列表\"\n\n#: frmstringmapunit.rserror\nmsgid \"Error=\"\nmsgstr \"错误=\"\n\n#: frmstringmapunit.rsgenerateregexprenginefailed\nmsgid \"GenerateRegExprEngine failed\"\nmsgstr \"生成 RegExpr 引擎失败\"\n\n#: frmstringmapunit.rsgeneratestringmap\nmsgid \"Generate string map\"\nmsgstr \"生成字符串映射\"\n\n#: frmstringmapunit.rsstringcount\n#, object-pascal-format\nmsgid \"Stringcount: %s\"\nmsgstr \"字符串计数：%s\"\n\n#: frmstringmapunit.rsunhandledtstringscancrash\nmsgid \"Unhandled TStringScan crash\"\nmsgstr \"未处理的 TStringScan 崩溃\"\n\n#: frmstructurecompareunit.rsinvalidgroup\n#, object-pascal-format\nmsgid \"Group %d address %s (%s) is not valid\"\nmsgstr \"组 %d 地址 %s (%s) 无效\"\n\n#: frmstructurecompareunit.rsmaxaddressesshown\nmsgid \"Max addresses shown :\"\nmsgstr \"显示的最大地址：\"\n\n#: frmstructurecompareunit.rsmaxreached\nmsgid \"...<max reached>...\"\nmsgstr \"...<达到最大值>...\"\n\n#: frmstructurecompareunit.rssameaddress\n#, object-pascal-format\nmsgid \"This will result in 0 results as address %s appears multiple times\"\nmsgstr \"这将导致 0 个结果，因为地址 %s 出现多次\"\n\n#: frmstructurecompareunit.rsspsinvalidstruct\nmsgid \"Invalid structure pointerfile\"\nmsgstr \"无效的结构指针文件\"\n\n#: frmstructurecompareunit.rsspsneednewce\nmsgid \"You'll need a newer CE version to open this file\"\nmsgstr \"你需要一个更新的 CE 版本来打开此文件\"\n\n#: frmstructurecompareunit.rsspsnoerror\nmsgid \"No error\"\nmsgstr \"没有错误\"\n\n#: frmstructurecompareunit.rsspsunlock\n#, object-pascal-format\nmsgid \"Unlock (%.8x-%.8x)\"\nmsgstr \"解锁 (%.8x-%.8x)\"\n\n#: frmstructurecompareunit.rstoosmallalign\nmsgid \"Alignsize must be greater than 0\"\nmsgstr \"对齐大小必须大于 0\"\n\n#: frmstructures2elementinfounit.rsmustselectstructure\nmsgid \"For a nested structure you must select a predefined structure\"\nmsgstr \"对于嵌套结构，你必须选择一个预定义结构\"\n\n#: frmstructures2elementinfounit.rss2eiifyoucontinuetheoldlocallydefinedtype\n#, object-pascal-format\nmsgid \"\"\n\"If you continue the old locally defined type %s will be deleted. Continue? (Tip: You can make this type into a global \"\n\"type so it can be re-used over again)\"\nmsgstr \"如果继续，旧的本地定义类型 %s 将被删除。继续吗？（提示：你可以将此类型变为全局类型，以便可以重复使用）\"\n\n#: frmstructures2elementinfounit.rss2eilocalstruct\nmsgid \"Local struct:\"\nmsgstr \"本地结构：\"\n\n#: frmstructuresnewstructureunit.rsguessfieldtypes\nmsgid \"Guess Field Types\"\nmsgstr \"猜测字段类型\"\n\n#: frmstructuresnewstructureunit.rsstructurename\nmsgid \"Structure Name:\"\nmsgstr \"结构名称：\"\n\n#: frmstructuresnewstructureunit.rsuseautotypesifavailable\nmsgid \"Use Auto Types If Available\"\nmsgstr \"如果可用，请使用自动类型\"\n\n#: frmstructuresnewstructureunit.rswindowtitle\nmsgid \"New Structure\"\nmsgstr \"新结构\"\n\n#: frmthreadlistunit.rscouldntobtaincontext\nmsgid \"Couldn't obtain context\"\nmsgstr \"无法获取上下文\"\n\n#: frmthreadlistunit.rscouldntopenhandle\nmsgid \"Couldn't open handle\"\nmsgstr \"无法打开句柄\"\n\n#: frmthreadlistunit.rscurrent\nmsgid \"Current\"\nmsgstr \"当前\"\n\n#: frmthreadlistunit.rsentrypoint\nmsgid \"Entry Point\"\nmsgstr \"入口点\"\n\n#: frmthreadlistunit.rspleasefirstattachthedebuggertothisprocess\nmsgid \"Please first attach the debugger to this process\"\nmsgstr \"请先将调试器附加到此进程\"\n\n#: frmthreadlistunit.rstl1bytes\nmsgid \"1 byte\"\nmsgstr \"1 字节\"\n\n#: frmthreadlistunit.rstl2bytes\nmsgid \"2 bytes\"\nmsgstr \"2 字节\"\n\n#: frmthreadlistunit.rstl4bytes\nmsgid \"4 bytes\"\nmsgstr \"4 字节\"\n\n#: frmthreadlistunit.rstl8bytes\nmsgid \"8 bytes\"\nmsgstr \"8 字节\"\n\n#: frmthreadlistunit.rstlaccess\nmsgid \"Access\"\nmsgstr \"访问\"\n\n#: frmthreadlistunit.rstlfailederrorcode\nmsgid \"failed. Errorcode=\"\nmsgstr \"失败。错误代码=\"\n\n#: frmthreadlistunit.rstlio\nmsgid \"I/O\"\nmsgstr \"I/O\"\n\n#: frmthreadlistunit.rstlwhatshouldthenewvalueofthisregisterbe\nmsgid \"What should the new value of this register be?\"\nmsgstr \"这个寄存器的新值应该是什么？\"\n\n#: frmthreadlistunit.rstlwrite\nmsgid \"Write\"\nmsgstr \"写入\"\n\n#: frmtracerunit.rsdbvmbreakandtraceneedsdbvm\nmsgid \"DBVM Break and Trace needs DBVM. Loading DBVM can potentially cause a system freeze. Are you sure?\"\nmsgstr \"DBVM Break and Trace 需要 DBVM。加载 DBVM 可能会导致系统冻结。你确定吗？\"\n\n#: frmtracerunit.rstypetheluaconditionyouwanttosearchforexampleeax0x1\nmsgid \"\"\n\"Type the (LUA) condition you want to search for (Example: EAX==0x1234)    \\n\"\n\"Also available: referencedAddress (integer), referencedBytes (bytetable), instruction (string)\"\nmsgstr \"\"\n\"输入你想要搜索的 (LUA) 条件（示例：EAX==0x1234）    \\n\"\n\"还可用：referencedAddress（整数），referencedBytes（字节表），instruction（字符串）\"\n\n#: frmtracerunit.rswaitingfortracetostart\nmsgid \"Waiting for trace to start\"\nmsgstr \"等待跟踪开始\"\n\n#: frmultimap2unit.rscantbeparsed\nmsgid \"\\\" can't be parsed\"\nmsgstr \"“无法解析\"\n\n#: frmultimap2unit.rsclosingwillfreeallcollecteddata\nmsgid \"Closing will free all collected data. Continue? (Tip: You can minimize this window instead)\"\nmsgstr \"关闭将释放所有收集的数据。继续吗？（提示：你可以最小化这个窗口）\"\n\n#: frmultimap2unit.rscpu\nmsgid \"CPU\"\nmsgstr \"CPU\"\n\n#: frmultimap2unit.rsdasherror\nmsgid \" -error\"\nmsgstr \" -错误\"\n\n#: frmultimap2unit.rsdoesntexistandcantbecreated\nmsgid \" does not exist and can not be created\"\nmsgstr \"不存在且无法创建\"\n\n#: frmultimap2unit.rsfailureloadinglibipt\nmsgid \"Failure loading libipt\"\nmsgstr \"加载 libipt 失败\"\n\n#: frmultimap2unit.rsfirstopenaprocess\nmsgid \"First open a process\"\nmsgstr \"首先打开一个进程\"\n\n#: frmultimap2unit.rsforsomeweirdreason\nmsgid \"For some weird reason \\\"\"\nmsgstr \"出于某种奇怪的原因“\"\n\n#: frmultimap2unit.rsisaninvalidrange\nmsgid \" is an invalid range\"\nmsgstr \"是一个无效范围\"\n\n#: frmultimap2unit.rsmaxamountofrangesreachedforyourcpu\nmsgid \"Max amount of ranges reached for your CPU. Clear one first\"\nmsgstr \"已达到你 CPU 的最大范围数量。请先清除一个\"\n\n#: frmultimap2unit.rsmodulelist\nmsgid \"Module list\"\nmsgstr \"模块列表\"\n\n#: frmultimap2unit.rsonlyforintelcpus\nmsgid \"Sorry, but Ultimap2 only works on Intel CPU's\"\nmsgstr \"抱歉，但 Ultimap2 仅适用于 Intel CPU\"\n\n#: frmultimap2unit.rsprocessingdata\nmsgid \"\"\n\"Processing\\n\"\n\"Data\"\nmsgstr \"\"\n\"处理  \\n\"\n\"数据\"\n\n#: frmultimap2unit.rsputbetweentomarsasanautostoprange\nmsgid \"(Put between *'s to mark as an auto stop range)\"\nmsgstr \"（在 * 之间放置以标记为自动停止范围）\"\n\n#: frmultimap2unit.rsrangesemptyforallmax\n#, object-pascal-format\nmsgid \"Ranges: (Empty for all) (Max %d)\"\nmsgstr \"范围：（为空表示所有）（最大 %d）\"\n\n#: frmultimap2unit.rsrangesneeddbvminwindows10\nmsgid \"\"\n\"To use ranges with Ultimap2 in windows 10, you must hide the fact that you use ranges from it. To be able to do that \"\n\"DBVM needs to be running. There is a chance running DBVM can crash your system and make you lose your data(So don't \"\n\"forget to save first). Do you want to run DBVM?\"\nmsgstr \"要在 Windows 10 中使用 Ultimap2 的范围，你必须隐藏你使用范围的事实。要做到这一点，DBVM 需要运行。运行 DBVM 可能会崩溃你的系统并导致数据丢失（所以不要忘记先保存）。你想运行 DBVM 吗？\"\n\n#: frmultimap2unit.rsrecording2\nmsgid \"Recording\"\nmsgstr \"录制\"\n\n#: frmultimap2unit.rsselectamoduleorgiveyourownrange\nmsgid \"Select a module or give your own range\"\nmsgstr \"选择一个模块或给定你自己的范围\"\n\n#: frmultimap2unit.rssorrybutyourcpudoesntseemtobeabletosetatargetprocess\nmsgid \"Sorry, but your CPU doesn't seem to be able to set a target PROCESS\"\nmsgstr \"抱歉，但你的 CPU 似乎无法设置目标进程\"\n\n#: frmultimap2unit.rssorrybutyourcpuseemstobeleackingiptfeature\nmsgid \"Sorry, but your CPU seems to be lacking the Intel Processor Trace feature which Ultimap2 makes use of\"\nmsgstr \"抱歉，但你的 CPU 似乎缺少 Ultimap2 使用的 Intel 处理器跟踪功能\"\n\n#: frmultimap2unit.rssorrybutyourcpusimplementationoftheiptfeatureistooold\nmsgid \"Sorry, but your CPU's implementation of the Intel Processor Trace feature is too old. Ultimap uses multiple ToPA entries\"\nmsgstr \"抱歉，但你的 CPU 对 Intel 处理器跟踪功能的实现太旧了。Ultimap 使用多个 ToPA 条目\"\n\n#: frmultimap2unit.rstargetadifferentprocess\nmsgid \"\"\n\"Target a different process. Ultimap2 will suspend the target when the buffer is full, and suspending the thing that \"\n\"empties the buffer is not a good idea\"\nmsgstr \"目标不同的进程。Ultimap2 会在缓冲区满时暂停目标，而暂停清空缓冲区的东西并不是一个好主意\"\n\n#: frmultimap2unit.rstherangeyouhaveprovidedisanexitrangebeaware\nmsgid \"\"\n\"The range you have provided is an 'Exit' range. Be aware that this doesn't mean it will always stop at that range, or \"\n\"that the result is what you expect. A context switch to another thread between the start and stop can add a lot of \"\n\"other data\"\nmsgstr \"你提供的范围是一个“退出”范围。请注意，这并不意味着它总是会在该范围内停止，或者结果是你所期望的。在开始和停止之间的上下文切换到另一个线程可能会添加很多其他数据\"\n\n#: frmultimap2unit.rsthesizehastobe12kborhigher\nmsgid \"The size has to be 12KB or higher\"\nmsgstr \"大小必须为 12KB 或更高\"\n\n#: frmultimap2unit.rsyoumustselectabuffersize\nmsgid \"You must select a buffersize\"\nmsgstr \"你必须选择一个缓冲区大小\"\n\n#: frmultimapunit.rsremovehotkey\n#, object-pascal-format\nmsgid \"Remove hotkey (%s)\"\nmsgstr \"移除热键 (%s)\"\n\n#: frmultimapunit.rsuuerrorduringmap\nmsgid \"Error during map\"\nmsgstr \"映射期间出错\"\n\n#: frmultimapunit.rsuulastfilterresults\n#, object-pascal-format\nmsgid \"Last filter results: filtered out %d left: %d\"\nmsgstr \"最后的过滤结果：过滤掉 %d 剩余：%d\"\n\n#: frmultimapunit.rsuunew\nmsgid \" new=\"\nmsgstr \" 新=\"\n\n#: frmultimapunit.rsuuold\nmsgid \"old=\"\nmsgstr \"旧=\"\n\n#: frmultimapunit.rsuupleaserunthe64bitversionofcheatenginetomakeuseofthisfeature\nmsgid \"Please run the 64-bit version of Cheat Engine to make use of this feature\"\nmsgstr \"请运行 64 位版本的 Cheat Engine 以使用此功能\"\n\n#: frmultimapunit.rsuuresume\nmsgid \"Resume\"\nmsgstr \"恢复\"\n\n#: frmultimapunit.rsuusorrybutthisfeatureisonlyavailableonintelcpus\nmsgid \"Sorry, but this feature is only available on intel cpu's\"\nmsgstr \"抱歉，但此功能仅在 Intel CPU 上可用\"\n\n#: frmultimapunit.rsuuthemaximumnumberofworkersis64\nmsgid \"The maximum number of workers is 64\"\nmsgstr \"最大工作线程数为 64\"\n\n#: frmultimapunit.rsuuthisfunctionneedsatleast200bytesfortheheaderofthebuffer\nmsgid \"This function needs at least 200 bytes for the header of the buffer\"\nmsgstr \"此功能需要至少 200 字节作为缓冲区的头部\"\n\n#: frmultimapunit.rsuuthiswillbringbackallfoundinstructions\nmsgid \"This will bring back all found instructions. Continue?\"\nmsgstr \"这将返回所有找到的指令。继续吗？\"\n\n#: frmultimapunit.rsuuthiswillresetthecallcountoffunctionbackto0\nmsgid \"This will reset the callcount of functions back to 0. This can not be undone. Continue?\"\nmsgstr \"这将把函数的调用计数重置为 0。此操作无法撤销。继续吗？\"\n\n#: frmwatchlistunit.rsunparsable\nmsgid \"<Unparsable>\"\nmsgstr \"<Unparsable>\"\n\n#: frmwatchlistunit.rsunreadable\nmsgid \"<Unreadable>\"\nmsgstr \"<Unreadable>\"\n\n#: gnuassembler.rsbyteswhile\nmsgid \" bytes while \"\nmsgstr \" 字节，而 \"\n\n#: gnuassembler.rsconfigureavalidbinutilssetupfirst\nmsgid \"Configure a valid binutils setup first\"\nmsgstr \"请先配置有效的 binutils 设置\"\n\n#: gnuassembler.rsdoesntseemtobeavalidelffile\nmsgid \" doesn't seem to be a valid ELF file\"\nmsgstr \" 似乎不是有效的 ELF 文件\"\n\n#: gnuassembler.rsgnuassemblererror\nmsgid \"GNU Assembler error\"\nmsgstr \"GNU 汇编器错误\"\n\n#: gnuassembler.rsinvalidelffile\nmsgid \"Invalid ELF file\"\nmsgstr \"无效的 ELF 文件\"\n\n#: gnuassembler.rsnobinutilsinstalled\nmsgid \"No binutils installed\"\nmsgstr \"未安装 binutils\"\n\n#: gnuassembler.rstheaobfor\nmsgid \"The AOB for \"\nmsgstr \"AOB 为 \"\n\n#: gnuassembler.rstheproperformatofasectionis\nmsgid \"The proper format of .asection is : .asection <name> <preferedaddress>\"\nmsgstr \".asection 的正确格式为： .asection <name> <preferedaddress>\"\n\n#: gnuassembler.rstheproperformatofmsectionis\nmsgid \"The proper format of .msection is : .msection <name> <address> <optional expected size>\"\nmsgstr \".msection 的正确格式为： .msection <name> <address> <optional expected size>\"\n\n#: gnuassembler.rstook\nmsgid \" took \"\nmsgstr \" 花费了 \"\n\n#: gnuassembler.rswhereexpected\nmsgid \" where expected\"\nmsgstr \" 在预期的位置\"\n\n#: groupscancommandparser.rsaobdoesnotsupportrange\nmsgid \"AOB does not support range\"\nmsgstr \"AOB 不支持范围\"\n\n#: groupscancommandparser.rsarangecantbeawildcard\nmsgid \"A range can't be a wildcard\"\nmsgstr \"范围不能是通配符\"\n\n#: groupscancommandparser.rsarangetypeneedsarangeforvalue\nmsgid \"A range type needs a range for value\"\nmsgstr \"范围类型需要一个值范围\"\n\n#: groupscancommandparser.rsgscpcustomtypenotrecognized\nmsgid \"Custom type not recognized: \"\nmsgstr \"自定义类型未被识别： \"\n\n#: groupscancommandparser.rsgscpinvalidgroupscancommand\nmsgid \"Invalid groupscan command\"\nmsgstr \"无效的 groupscan 命令\"\n\n#: groupscancommandparser.rsgscpwildcardsemptyarenotallowedforoutoforderscans\nmsgid \"Wildcards/Empty are not allowed for Out of Order scans\"\nmsgstr \"不允许在无序扫描中使用通配符/空值\"\n\n#: guisafecriticalsection.rscriticalsectionleavewithoutenter\nmsgid \"Criticalsection leave without enter\"\nmsgstr \"临界区离开时未进入\"\n\n#: hexviewunit.rsbase\nmsgid \"Base\"\nmsgstr \"基址\"\n\n#: hexviewunit.rsbigfuckingerror\nmsgid \"Big fucking error\"\nmsgstr \"严重错误\"\n\n#: hexviewunit.rsexecutereadonly\nmsgid \"Execute/Read only\"\nmsgstr \"仅执行/读取\"\n\n#: hexviewunit.rsexecutereadwrite\nmsgid \"Execute/Read/Write\"\nmsgstr \"执行/读取/写入\"\n\n#: hexviewunit.rsexecutewritecopy\nmsgid \"Execute/Write Copy\"\nmsgstr \"执行/写入复制\"\n\n#: hexviewunit.rsguarded\nmsgid \"Guarded\"\nmsgstr \"受保护\"\n\n#: hexviewunit.rsinvalidbytesperseperatorvalue\n#, object-pascal-format\nmsgid \"Invalid BytesPerSeperator value:%s\"\nmsgstr \"无效的 BytesPerSeperator 值：%s\"\n\n#: hexviewunit.rsmodule\nmsgid \"Module\"\nmsgstr \"模块\"\n\n#: hexviewunit.rsnotcached\nmsgid \"Not Cached\"\nmsgstr \"未缓存\"\n\n#: hexviewunit.rsreadonly\nmsgid \"Read Only\"\nmsgstr \"只读\"\n\n#: hexviewunit.rsreadwrite\nmsgid \"Read/Write\"\nmsgstr \"读/写\"\n\n#: hexviewunit.rsthislookslikeanarrayofbytedoyouwanttoinputitasahex\nmsgid \"This looks like an array of byte. Do you want to input it as a hexadecimal string?\"\nmsgstr \"这看起来像是一个字节数组。你想将其作为十六进制字符串输入吗？\"\n\n#: hexviewunit.rsthislookslikeanormalstringdoyouwanttoinputitasastr\nmsgid \"This looks like a normal string. Do you want to input it as a string ?\"\nmsgstr \"这看起来像一个普通字符串。你想将其作为字符串输入吗？\"\n\n#: hotkeys.rsdeactivateonrelease\nmsgid \"Deactivate on release\"\nmsgstr \"在释放时停用\"\n\n#: hotkeys.rsdecreasevaluewith\nmsgid \"Decrease value with:\"\nmsgstr \"减少值：\"\n\n#: hotkeys.rsdefaultactivated\n#, object-pascal-format\nmsgid \"%s Activated\"\nmsgstr \"%s 已激活\"\n\n#: hotkeys.rsdefaultdeactivated\n#, object-pascal-format\nmsgid \"%s Deactivated\"\nmsgstr \"%s 已停用\"\n\n#: hotkeys.rsdisablescript\nmsgid \"Disable script\"\nmsgstr \"禁用脚本\"\n\n#: hotkeys.rsenablescript\nmsgid \"Enable script\"\nmsgstr \"启用脚本\"\n\n#: hotkeys.rsfreeze\nmsgid \"Freeze\"\nmsgstr \"冻结\"\n\n#: hotkeys.rshotkeyid\n#, object-pascal-format\nmsgid \"Hotkey ID=%s\"\nmsgstr \"热键 ID=%s\"\n\n#: hotkeys.rsincreasevaluewith\nmsgid \"Increase value with:\"\nmsgstr \"增加值：\"\n\n#: hotkeys.rsrestoretooriginalonrelease\nmsgid \"Restore to original on release\"\nmsgstr \"在释放时恢复到原始值\"\n\n#: hotkeys.rssetvalueto\nmsgid \"Set value to:\"\nmsgstr \"设置值为：\"\n\n#: hotkeys.rsspeaktext\nmsgid \"Speak Text\"\nmsgstr \"说出文本\"\n\n#: hotkeys.rstexttospeechhint\nmsgid \"\"\n\"The text to speak\\n\"\n\"{Description} = The description of the hotkey\\n\"\n\"{MRDescription} = The description field of the memory record\\n\"\n\"{MRValue} = The value of the memory record\"\nmsgstr \"\"\n\"要说的文本\\n\"\n\"{Description} = 热键的描述\\n\"\n\"{MRDescription} = 内存记录的描述字段\\n\"\n\"{MRValue} = 内存记录的值\"\n\n#: hotkeys.rstogglefreezeandallowdecrease\nmsgid \"Toggle freeze and allow decrease\"\nmsgstr \"切换冻结并允许减少\"\n\n#: hotkeys.rstogglefreezeandallowincrease\nmsgid \"Toggle freeze and allow increase\"\nmsgstr \"切换冻结并允许增加\"\n\n#: hotkeys.rstogglescript\nmsgid \"Toggle script\"\nmsgstr \"切换脚本\"\n\n#: hotkeys.rsunfreeze\nmsgid \"Unfreeze\"\nmsgstr \"解除冻结\"\n\n#: iconstuff.rsfailureopen\nmsgid \"Failure opening \"\nmsgstr \"打开失败\"\n\n#: iconstuff.rsiconpicker\nmsgid \"Icon picker\"\nmsgstr \"图标选择器\"\n\n#: iconstuff.rsnoiconfound\nmsgid \"No icon found in this file\"\nmsgstr \"在此文件中未找到图标\"\n\n#: iconstuff.rsunhandledext\nmsgid \"Unhandled file extension\"\nmsgstr \"未处理的文件扩展名\"\n\n#: kerneldebuggerinterface.rsdbkdebug_startdebuggingfailed\nmsgid \"DBKDebug_StartDebugging failed\"\nmsgstr \"DBKDebug_StartDebugging 失败\"\n\n#: kerneldebuggerinterface.rskernelmodeneedsdbvm\nmsgid \"You can't use kerneldebug in 64-bit without DBVM\"\nmsgstr \"在没有 DBVM 的情况下，无法在 64 位中使用 kerneldebug\"\n\n#: libcepack.askpermission\n#, object-pascal-format\nmsgid \"Extract %s to %s?\"\nmsgstr \"将 %s 提取到 %s？\"\n\n#: luacaller.rsautoassemblercallbackluafunctionerror\nmsgid \"AutoAssemblerCallback: Lua Function error(\"\nmsgstr \"AutoAssemblerCallback：Lua 函数错误（\"\n\n#: luacaller.rsstructuredissecteventluafunctionerror\nmsgid \"StructureDissectEvent: Lua Function error(\"\nmsgstr \"StructureDissectEvent：Lua 函数错误（\"\n\n#: luaclass.rsinvalidclassobject\nmsgid \"Invalid class object\"\nmsgstr \"无效的类对象\"\n\n#: luadissectcode.rsinvalidparametersfordissect\nmsgid \"Invalid parameters for dissect\"\nmsgstr \"解剖的参数无效\"\n\n#: luadissectcode.rsthemodulenamed\nmsgid \"The module named \"\nmsgstr \"名为的模块\"\n\n#: luaform.rsthegivenformisnotcompatible\nmsgid \"The given form is not compatible. Formclass=\"\nmsgstr \"给定的表单不兼容。表单类=\"\n\n#: luafoundlist.rscreatefoundlistneedsamemscanobjectasparameter\nmsgid \"createfoundlist needs a memscan object as parameter\"\nmsgstr \"createfoundlist 需要一个 memscan 对象作为参数\"\n\n#: luahandler.rscheatengineisbeingafag\nmsgid \"Cheatengine is being a fag\"\nmsgstr \"Cheat Engine 正在出问题\"\n\n#: luahandler.rsconditionalbreakpointerror\nmsgid \"Conditional breakpoint error\"\nmsgstr \"条件断点错误\"\n\n#: luahandler.rscreatememscanneedsaprogressbarornil\nmsgid \"createMemScan needs a progressbar or nil. \"\nmsgstr \"createMemScan 需要一个进度条或 nil。\"\n\n#: luahandler.rsdeallocatesharedmemoryisnotimplemented\nmsgid \"deallocateSharedMemory is not implemented (It's not even in the list of available functions)\"\nmsgstr \"deallocateSharedMemory 尚未实现（它甚至不在可用函数列表中）\"\n\n#: luahandler.rsdebugsetbreakpointneedsatleastanaddress\nmsgid \"debug_setBreakpoint needs at least an address\"\nmsgstr \"debug_setBreakpoint 至少需要一个地址\"\n\n#: luahandler.rserror\nmsgid \"Error:\"\nmsgstr \"错误：\"\n\n#: luahandler.rserror2\nmsgid \" error:\"\nmsgstr \" 错误：\"\n\n#: luahandler.rserror3\nmsgid \" error\"\nmsgstr \" 错误\"\n\n#: luahandler.rsgetprocesslisttheprovidedlistobjectisnotvalid\nmsgid \"getProcessList: the provided List object is not valid\"\nmsgstr \"getProcessList：提供的 List 对象无效\"\n\n#: luahandler.rsgetthreadlisttheprovidedlistobjectisnotvalid\nmsgid \"getThreadlist: the provided List object is not valid\"\nmsgstr \"getThreadlist：提供的 List 对象无效\"\n\n#: luahandler.rsincorrectnumberofparameters\nmsgid \"Incorrect number of parameters\"\nmsgstr \"参数数量不正确\"\n\n#: luahandler.rsinvalidfloat\n#, object-pascal-format\nmsgid \"Invalid floating point string:%s\"\nmsgstr \"无效的浮点字符串：%s\"\n\n#: luahandler.rsinvalidint\n#, object-pascal-format\nmsgid \"Invalid integer:%s\"\nmsgstr \"无效的整数：%s\"\n\n#: luahandler.rsisnotaprogressbar\nmsgid \" is not a progressbar\"\nmsgstr \" 不是进度条\"\n\n#: luahandler.rsluapanic\nmsgid \"LUA panic!\"\nmsgstr \"LUA 恐慌！\"\n\n#: luahandler.rslua_doscriptwasnotcalledromthemainthread\nmsgid \"LUA_DoScript was not called from the main thread\"\nmsgstr \"LUA_DoScript 不是从主线程调用的\"\n\n#: luahandler.rsmainluaerror\nmsgid \"main.lua error:\"\nmsgstr \"main.lua 错误：\"\n\n#: luahandler.rsmainluaerror2\nmsgid \"main.lua error\"\nmsgstr \"main.lua 错误\"\n\n#: luahandler.rsnonmainthreadluaerror\nmsgid \"Lua error in a secondary thread\"\nmsgstr \"在辅助线程中的 Lua 错误\"\n\n#: luahandler.rsnumberrequired\nmsgid \"Number required\"\nmsgstr \"需要数字\"\n\n#: luahandler.rsplaysoundtheparametermustbeatablefileoramemorystream\nmsgid \"playSound: The parameter must be a table file or a memory stream. Nothing else\"\nmsgstr \"playSound：参数必须是表文件或内存流。不能是其他类型\"\n\n#: luahandler.rsscriptcorruptedvar\n#, object-pascal-format\nmsgid \"%s has corrupted the global %s variable. Many scripts will fail to load now\"\nmsgstr \"%s 已损坏全局 %s 变量。许多脚本现在将无法加载\"\n\n#: luahandler.rsthistypeisnotsupportedhere\nmsgid \"This type is not supported here\"\nmsgstr \"此类型在此不受支持\"\n\n#: luahandler.rsundefinedluaerror\nmsgid \"Undefined lua error\"\nmsgstr \"未定义的 lua 错误\"\n\n#: luamemscan.rsnotallparametershavebeenprovided\nmsgid \"Not all parameters have been provided\"\nmsgstr \"并非所有参数都已提供\"\n\n#: luaobject.rsthisisaninvalidclassormethodproperty\nmsgid \"This is an invalid class or method property\"\nmsgstr \"这是一个无效的类或方法属性\"\n\n#: luastructure.rsinvalidindex\nmsgid \"Invalid index\"\nmsgstr \"无效的索引\"\n\n#: luastructurefrm.rsgroupd\n#, object-pascal-format\nmsgid \"Group %d\"\nmsgstr \"组 %d\"\n\n#: luasyntax.syns_attrluamstring\nmsgid \"Multiline String\"\nmsgstr \"多行字符串\"\n\n#: luasyntax.syns_attrnumber\nmsgid \"Numbers\"\nmsgstr \"数字\"\n\n#: luasyntax.syns_attrreservedword2\nmsgid \"Reserved word 2\"\nmsgstr \"保留字 2\"\n\n#: luasyntax.syns_attrreservedword3\nmsgid \"Reserved word 3\"\nmsgstr \"保留字 3\"\n\n#: luasyntax.syns_attrreservedword4\nmsgid \"Reserved word 4\"\nmsgstr \"保留字 4\"\n\n#: luasyntax.syns_filterlua\nmsgid \"Lua Files (*.lua, *.lpr)|*.lua;*.lpr\"\nmsgstr \"Lua 文件 (*.lua, *.lpr)|*.lua;*.lpr\"\n\n#: luatablefile.rscreatetablefilerequiresatleastoneparameter\nmsgid \"createTableFile requires at least one parameter\"\nmsgstr \"createTableFile 至少需要一个参数\"\n\n#: luatablefile.rserrorraisedwithmessage\nmsgid \" error raised with message: \"\nmsgstr \" 抛出错误，消息为：\"\n\n#: luatablefile.rstabledileentryalreadyexistsforfilename\nmsgid \"Table file entry already exists for filename: \"\nmsgstr \"文件名的表文件条目已存在：\"\n\n#: luathread.rserrorinnativethreadcalled\nmsgid \"Error in thread called \"\nmsgstr \"线程中出现错误\"\n\n#: luathread.rsinnativecode\nmsgid \" in native code:\"\nmsgstr \" 在本地代码中：\"\n\n#: luathread.rsinvalidfirstparameterforcreatenativethread\nmsgid \"Invalid first parameter for createNativeThread\"\nmsgstr \"创建本地线程的第一个参数无效\"\n\n#: lua_server.rsalreadyexists\nmsgid \" already exists\"\nmsgstr \" 已经存在\"\n\n#: lua_server.rsaluaserverwiththename\nmsgid \"A luaserver with the name \"\nmsgstr \"名称为 \"\n\n#: mainunit.rsareyousureyouwanttodeletethisform\nmsgid \"Are you sure you want to delete this form?\"\nmsgstr \"你确定要删除此表单吗？\"\n\n#: mainunit.rsareyousureyouwanttoerasethedatainthecurrenttable\nmsgid \"Are you sure you want to erase the data in the current table?\"\nmsgstr \"你确定要清除当前表中的数据吗？\"\n\n#: mainunit.rsatleastxx\nmsgid \"at least xx%\"\nmsgstr \"至少 xx%\"\n\n#: mainunit.rsautoassembleedit\n#, object-pascal-format\nmsgid \"Auto Assemble edit: %s\"\nmsgstr \"自动汇编编辑：%s\"\n\n#: mainunit.rsbetween\nmsgid \"between %\"\nmsgstr \"在 % 之间\"\n\n#: mainunit.rsbringscheatenginetofront\nmsgid \"brings Cheat Engine to front\"\nmsgstr \"将 Cheat Engine 置于前面\"\n\n#: mainunit.rsbusy\nmsgid \"<busy>\"\nmsgstr \"<busy>\"\n\n#: mainunit.rsceerror\nmsgid \"CE Error:\"\nmsgstr \"CE 错误：\"\n\n#: mainunit.rschooselanguage\nmsgid \"Which language do you wish to use?\"\nmsgstr \"你希望使用哪种语言？\"\n\n#: mainunit.rsclearingmeansslowness\nmsgid \"\"\n\"Clearing the assigned memory for this process will cause it to obtain all the memory it needs again which can cause a \"\n\"temporary slowdown in the target. Make sure the value you're interested in gets accessed once before you scan. Continue?\"\nmsgstr \"清除此进程分配的内存将导致它重新获取所需的所有内存，这可能会导致目标暂时变慢。确保你感兴趣的值在扫描之前被访问过。继续吗？\"\n\n#: mainunit.rsclearrecentfiles\nmsgid \"Empty Recent Files List\"\nmsgstr \"清空最近文件列表\"\n\n#: mainunit.rscomparingto\n#, object-pascal-format\nmsgid \"Comparing to %s\"\nmsgstr \"与 %s 比较\"\n\n#: mainunit.rscurrentprocess\nmsgid \"Current process\"\nmsgstr \"当前进程\"\n\n#: mainunit.rscustomluatype\nmsgid \"Custom LUA type\"\nmsgstr \"自定义 LUA 类型\"\n\n#: mainunit.rscustomtypename\nmsgid \"Custom Type Name\"\nmsgstr \"自定义类型名称\"\n\n#: mainunit.rsdbvmwatchfailed\nmsgid \"dbvm_watch failed\"\nmsgstr \"dbvm_watch 失败\"\n\n#: mainunit.rsdoyouwantthegroupwithaddress\nmsgid \"Do you want a header with address support ?\"\nmsgstr \"你想要一个带地址支持的头部吗？\"\n\n#: mainunit.rsdoyouwanttogotothecheatenginewebsite\nmsgid \"Do you want to go to the Cheat Engine website?\"\nmsgstr \"你想去 Cheat Engine 网站吗？\"\n\n#: mainunit.rsdoyouwanttoprotectthistrainerfilefromediting\nmsgid \"Do you want to protect this trainer file from editing?\"\nmsgstr \"你想保护这个训练器文件不被编辑吗？\"\n\n#: mainunit.rsdoyouwishtomergethecurrenttablewiththistable\nmsgid \"Do you wish to merge the current table with this table?\"\nmsgstr \"你希望将当前表与此表合并吗？\"\n\n#: mainunit.rseditaddresses\nmsgid \"Edit addresses\"\nmsgstr \"编辑地址\"\n\n#: mainunit.rsexpired\nmsgid \"EXPIRED\"\nmsgstr \"已过期\"\n\n#: mainunit.rsfailedtoload\nmsgid \"failed to load\"\nmsgstr \"加载失败\"\n\n#: mainunit.rsfailuresettingthecreateglobalprivilege\nmsgid \"Failure setting the CreateGlobal privilege.\"\nmsgstr \"设置 CreateGlobal 特权失败。\"\n\n#: mainunit.rsfailuresettingthedebugprivilege\nmsgid \"Failure setting the debug privilege. Debugging may be limited.\"\nmsgstr \"设置调试特权失败。调试可能会受到限制。\"\n\n#: mainunit.rsfailuresettingtheloaddriverprivilege\nmsgid \"Failure setting the load driver privilege. Debugging may be limited.\"\nmsgstr \"设置加载驱动程序权限失败。调试可能会受到限制。\"\n\n#: mainunit.rsfailuresettingthesetcbprivilegeprivilege\nmsgid \"Failure setting the SeTcbPrivilege privilege. Debugging may be limited.\"\nmsgstr \"设置 SeTcbPrivilege 权限失败。调试可能会受到限制。\"\n\n#: mainunit.rsfileinuse\nmsgid \"<File in use>\"\nmsgstr \"<File in use>\"\n\n#: mainunit.rsfilewillbegone\nmsgid \"All contents of the target file be gone and unrecoverable. Are you sure?\"\nmsgstr \"目标文件的所有内容将消失且无法恢复。你确定吗？\"\n\n#: mainunit.rsfindoutwhataccessesthispointer\nmsgid \"Find out what accesses this pointer\"\nmsgstr \"找出哪些访问了这个指针\"\n\n#: mainunit.rsfindoutwhatwritesthispointer\nmsgid \"Find out what writes this pointer\"\nmsgstr \"找出哪些写入了这个指针\"\n\n#: mainunit.rsfindwhataccessestheaddresspointedatbythispointer\nmsgid \"Find what accesses the address pointed at by this pointer\"\nmsgstr \"找出哪些访问了这个指针指向的地址\"\n\n#: mainunit.rsfindwhatwritestheaddresspointedatbythispointer\nmsgid \"Find what writes the address pointed at by this pointer\"\nmsgstr \"找出哪些写入了这个指针指向的地址\"\n\n#: mainunit.rsfirst\nmsgid \"First\"\nmsgstr \"第一次\"\n\n#: mainunit.rsforcetermination\nmsgid \"Force termination\"\nmsgstr \"强制终止\"\n\n#: mainunit.rsgivethenewfilename\nmsgid \"Give the new filename\"\nmsgstr \"输入新文件名\"\n\n#: mainunit.rsgivethenewvaluefortheselectedaddresses\nmsgid \"Give the new value for the selected address(es)\"\nmsgstr \"输入所选地址的新值\"\n\n#: mainunit.rsgroup\n#, object-pascal-format\nmsgid \"Group %s\"\nmsgstr \"组 %s\"\n\n#: mainunit.rsgroups\nmsgid \"Groups\"\nmsgstr \"组\"\n\n#: mainunit.rsgroupscandatainvalid\nmsgid \"groupscan data invalid\"\nmsgstr \"groupscan 数据无效\"\n\n#: mainunit.rsgroupscanresultwithnogroupscanparser\nmsgid \"Groupscan result with no groupscanparser\"\nmsgstr \"Groupscan 结果没有 groupscanparser\"\n\n#: mainunit.rsheight\nmsgid \" , height=\"\nmsgstr \" , 高度=\"\n\n#: mainunit.rsinvalidscanfolder\n#, object-pascal-format\nmsgid \"%s is not accessible like it should.  Please configure a proper location in the settings\"\nmsgstr \"%s 无法像预期那样访问。请在设置中配置正确的位置\"\n\n#: mainunit.rsinvalidstartaddress\n#, object-pascal-format\nmsgid \"Invalid start address: %s\"\nmsgstr \"无效的起始地址：%s\"\n\n#: mainunit.rsinvalidstopaddress\n#, object-pascal-format\nmsgid \"Invalid stop address: %s\"\nmsgstr \"无效的停止地址：%s\"\n\n#: mainunit.rsisnotavalidspeed\n#, object-pascal-format\nmsgid \"%s is not a valid speed\"\nmsgstr \"%s 不是有效的速度\"\n\n#: mainunit.rsisnotavalidx\n#, object-pascal-format\nmsgid \"%s is not a valid xml name\"\nmsgstr \"%s 不是有效的 xml 名称\"\n\n#: mainunit.rslanguage\nmsgid \"Language\"\nmsgstr \"语言\"\n\n#: mainunit.rsloadtheassociatedtable\n#, object-pascal-format\nmsgid \"Load the associated table? (%s)\"\nmsgstr \"加载相关表吗？ (%s)\"\n\n#: mainunit.rsluascriptcheattable\nmsgid \"Lua script: Cheat Table\"\nmsgstr \"Lua 脚本：作弊表\"\n\n#: mainunit.rsmodified\nmsgid \"Modified\"\nmsgstr \"已修改\"\n\n#: mainunit.rsnetworkoption\nmsgid \"Network option :\"\nmsgstr \"网络选项：\"\n\n#: mainunit.rsnewvalueuponactivatingaddress\nmsgid \"New value upon activating address\"\nmsgstr \"激活地址时的新值\"\n\n#: mainunit.rsnewvalueupondeactivatingaddress\nmsgid \"New value upon deactivating address\"\nmsgstr \"停用地址时的新值\"\n\n#: mainunit.rsoverlay\nmsgid \"overlay \"\nmsgstr \"覆盖 \"\n\n#: mainunit.rspart\nmsgid \" part \"\nmsgstr \" 部分 \"\n\n#: mainunit.rspreviousvaluelist\nmsgid \"Previous value list\"\nmsgstr \"先前值列表\"\n\n#: mainunit.rsremoveselectedaddress\nmsgid \"Remove selected address\"\nmsgstr \"移除选定地址\"\n\n#: mainunit.rsrenamefile\nmsgid \"Rename file\"\nmsgstr \"重命名文件\"\n\n#: mainunit.rsrequiresdbvmcapablecpu\nmsgid \"\"\n\"This function requires an CPU with virtualization support. If your system has that then make sure that you're currently \"\n\"not running inside a virtual machine. (Windows has some security features that can run programs inside a VM)\"\nmsgstr \"此功能需要支持虚拟化的 CPU。如果你的系统具备此功能，请确保你当前没有在虚拟机中运行。（Windows 有一些安全功能可以在虚拟机中运行程序）\"\n\n#: mainunit.rsrequiresdbvmept\nmsgid \"DBVM find routines needs DBVM for EPT/NP page hooking. Loading DBVM can potentially cause a system freeze. Are you sure?\"\nmsgstr \"DBVM 查找例程需要 DBVM 进行 EPT/NP 页面钩取。加载 DBVM 可能会导致系统冻结。你确定吗？\"\n\n#: mainunit.rsrequiresept\nmsgid \"\"\n\"This function requires that your CPU supports 'Intel Extended Page Table (EPT) or AMD Nested Paging' which your CPU \"\n\"lacks\"\nmsgstr \"此功能要求你的 CPU 支持“英特尔扩展页表（EPT）或 AMD 嵌套分页”，而你的 CPU 不支持\"\n\n#: mainunit.rsrestoreandshow\nmsgid \"Restore and show\"\nmsgstr \"恢复并显示\"\n\n#: mainunit.rssaved\nmsgid \"Saved\"\nmsgstr \"已保存\"\n\n#: mainunit.rssavedscanresults\nmsgid \"Saved scan results\"\nmsgstr \"已保存的扫描结果\"\n\n#: mainunit.rssavescanresults\nmsgid \"Save scan results\"\nmsgstr \"保存扫描结果\"\n\n#: mainunit.rssavetodisk\nmsgid \"Save to disk\"\nmsgstr \"保存到磁盘\"\n\n#: mainunit.rsscanerror\n#, object-pascal-format\nmsgid \"Scan error:%s\"\nmsgstr \"扫描错误：%s\"\n\n#: mainunit.rsscanresult\nmsgid \"Scanresult\"\nmsgstr \"扫描结果\"\n\n#: mainunit.rsselectthesavedresult\nmsgid \"Select the saved results you wish to use\"\nmsgstr \"选择你希望使用的已保存结果\"\n\n#: mainunit.rsselectthesavedscanresultfromthelistbelow\nmsgid \"Select the saved scan result from the list below\"\nmsgstr \"从下面的列表中选择已保存的扫描结果\"\n\n#: mainunit.rsselectthesavedscanresulttodeletefromthelistbelow\nmsgid \"Select the saved scan result to delete from the list below\"\nmsgstr \"从下面的列表中选择要删除的已保存扫描结果\"\n\n#: mainunit.rssetchangehotkeys\nmsgid \"Set/Change hotkeys\"\nmsgstr \"设置/更改热键\"\n\n#: mainunit.rsshowasdecimal\nmsgid \"Show as decimal\"\nmsgstr \"以十进制显示\"\n\n#: mainunit.rsshown\nmsgid \"shown\"\nmsgstr \"已显示\"\n\n#: mainunit.rsterminatingscan\nmsgid \"Terminating scan...\"\nmsgstr \"正在终止扫描...\"\n\n#: mainunit.rstheprocessisntfullyopenedindicatingainvalidprocess\nmsgid \"\"\n\"The process isn't fully opened. Indicating a invalid ProcessID. You still want to find out the EPROCESS? (BSOD is \"\n\"possible)\"\nmsgstr \"该进程尚未完全打开。指示无效的 ProcessID。你仍然想找出 EPROCESS 吗？（可能会出现 BSOD）\"\n\n#: mainunit.rsthereareoneormoreautoassemblerentriesorcodechanges\nmsgid \"\"\n\"There are one or more auto assembler entries or code changes enabled in this table. Do you want them disabled? (without \"\n\"executing the disable part)\"\nmsgstr \"此表中启用了一个或多个自动汇编条目或代码更改。你想禁用它们吗？（不执行禁用部分）\"\n\n#: mainunit.rstherecordwithdescriptionhasasinterpretableaddresst\n#, object-pascal-format\nmsgid \"\"\n\"The record with description '%s' has as interpretable address '%s'. The recalculation will change it to %s. Do you want \"\n\"to edit it to the new address?\"\nmsgstr \"描述为 '%s' 的记录具有可解释地址 '%s'。重新计算将其更改为 %s。你想将其编辑为新地址吗？\"\n\n#: mainunit.rsthisbuttonwillforcecancelascanexpectmemoryleaks\nmsgid \"This button will force cancel a scan. Expect memory leaks\"\nmsgstr \"此按钮将强制取消扫描。请注意内存泄漏\"\n\n#: mainunit.rsthisbuttonwilltrytocancelthecurrentscanclicktwicet\nmsgid \"This button will try to cancel the current scan. Click twice to force an exit\"\nmsgstr \"此按钮将尝试取消当前扫描。双击以强制退出\"\n\n#: mainunit.rsthislistishuge\nmsgid \"\"\n\"This list is huge and deleting multiple items will require CE to traverse the whole list and can take a while. Are you \"\n\"sure?\"\nmsgstr \"此列表很大，删除多个项目将需要 CE 遍历整个列表，可能需要一些时间。你确定吗？\"\n\n#: mainunit.rstrytutorial\nmsgid \"Do you want to try out the tutorial?\"\nmsgstr \"你想尝试一下教程吗？\"\n\n#: mainunit.rsunabletoscanfixyourscansettings\nmsgid \"Unable to scan. Fix your scan settings and restart Cheat Engine\"\nmsgstr \"无法扫描。请修复你的扫描设置并重启 Cheat Engine\"\n\n#: mainunit.rsunrandomizerinfo\nmsgid \"\"\n\"This will scan for and change some routines that are commonly used to generate a random value so they always return the \"\n\"same. Please be aware that there is a chance it overwrites the wrong routines causing the program to crash, or that the \"\n\"program uses an unknown random generator. Continue?\"\nmsgstr \"这将扫描并更改一些常用来生成随机值的例程，以便它们始终返回相同的值。请注意，有可能会覆盖错误的例程，导致程序崩溃，或者程序使用了未知的随机生成器。继续吗？\"\n\n#: mainunit.rsunspecifiederror\nmsgid \"Unspecified error\"\nmsgstr \"未指定的错误\"\n\n#: mainunit.rsvalue\nmsgid \"Value %\"\nmsgstr \"值 %\"\n\n#: mainunit.rswasclickedatpositon\nmsgid \" was clicked at positon \"\nmsgstr \" 在位置 \"\n\n#: mainunit.rswhatdoyouwantthegroupnametobe\nmsgid \"What do you want the groupname to be?\"\nmsgstr \"你希望组名是什么？\"\n\n#: mainunit.rswhatnamedoyouwanttogivetothesescanresults\nmsgid \"What name do you want to give to these scanresults?\"\nmsgstr \"你想给这些扫描结果起什么名字？\"\n\n#: mainunit.rswhatwillbethenewnameforthistab\nmsgid \"What will be the new name for this tab?\"\nmsgstr \"这个标签的新名称将是什么？\"\n\n#: mainunit.rswidth\nmsgid \"   -   width=\"\nmsgstr \"   -   宽度=\"\n\n#: mainunit.rsyouarelowondiskspaceonthefolderwherethescanresults\nmsgid \"\"\n\"You are low on diskspace on the folder where the scanresults are stored. Scanning might fail. Are you sure you want to \"\n\"continue?\"\nmsgstr \"你在存储扫描结果的文件夹中磁盘空间不足。扫描可能会失败。你确定要继续吗？\"\n\n#: mainunit.straccessed\nmsgid \"The following opcodes accessed the selected address\"\nmsgstr \"以下操作码访问了所选地址\"\n\n#: mainunit.stradd0\nmsgid \"Do you want to add a '0'-terminator at the end?\"\nmsgstr \"你想在末尾添加一个 '0' 终止符吗？\"\n\n#: mainunit.stralreadyinlistmultiple\nmsgid \"One or more addresses where already in the list\"\nmsgstr \"一个或多个地址已经在列表中\"\n\n#: mainunit.strasktosave\nmsgid \"You haven't saved your last changes yet. Save Now?\"\nmsgstr \"你还没有保存最后的更改。现在保存吗？\"\n\n#: mainunit.strchange1value\nmsgid \"Change this value to:\"\nmsgstr \"将此值更改为：\"\n\n#: mainunit.strchangedescription2\nmsgid \"Change the description to:\"\nmsgstr \"将描述更改为：\"\n\n#: mainunit.strchangemorevalues\nmsgid \"Change these values to:\"\nmsgstr \"将这些值更改为：\"\n\n#: mainunit.strclicktogohome\nmsgid \"Click here to go to the Cheat Engine homepage\"\nmsgstr \"点击这里访问 Cheat Engine 主页\"\n\n#: mainunit.strconfirmprocesstermination\nmsgid \"This will close the current process. Are you sure you want to do this?\"\nmsgstr \"这将关闭当前进程。你确定要这样做吗？\"\n\n#: mainunit.strconfirmundo\nmsgid \"Do you really want to go back to the results of the previous scan?\"\nmsgstr \"你真的想返回上一次扫描的结果吗？\"\n\n#: mainunit.strdeleteaddress\nmsgid \"Delete this address\"\nmsgstr \"删除此地址\"\n\n#: mainunit.strdeleteall\nmsgid \"Are you sure you want to delete all addresses?\"\nmsgstr \"你确定要删除所有地址吗？\"\n\n#: mainunit.strdeletetheseaddresses\nmsgid \"Delete these addresses\"\nmsgstr \"删除这些地址\"\n\n#: mainunit.strdisablecheat\nmsgid \"Disable Cheat\"\nmsgstr \"禁用作弊\"\n\n#: mainunit.strdontbother\nmsgid \"\"\n\"Don't even bother. Cheat Engine uses the main thread to receive messages when the scan is done, freeze it and CE will \"\n\"crash!\"\nmsgstr \"别费心了。Cheat Engine 使用主线程接收扫描完成时的消息，冻结它，CE 将崩溃！\"\n\n#: mainunit.strenablecheat\nmsgid \"Enable Cheat\"\nmsgstr \"启用作弊\"\n\n#: mainunit.strerrorwhileopeningprocess\nmsgid \"Error while opening this process\"\nmsgstr \"打开此进程时出错\"\n\n#: mainunit.strerrorwhileopeningprocessmac\nmsgid \". Have you disabled 'System Integrity Protection'(SIP) yet?\"\nmsgstr \"。你已经禁用“系统完整性保护”（SIP）了吗？\"\n\n#: mainunit.strfreezeaddressinlist\nmsgid \"Freeze the address in this list\"\nmsgstr \"冻结此列表中的地址\"\n\n#: mainunit.strfreezealladdresses\nmsgid \"Freeze all addresses in this list\"\nmsgstr \"冻结此列表中的所有地址\"\n\n#: mainunit.strfuture\nmsgid \"Wow,I never imagined people would use Cheat Engine up to today\"\nmsgstr \"哇，我从没想过人们会一直使用 Cheat Engine 到今天\"\n\n#: mainunit.strhappybirthday\nmsgid \"Let's sing Happy Birthday for Dark Byte today!\"\nmsgstr \"今天让我们为 Dark Byte 唱生日快乐歌吧！\"\n\n#: mainunit.strhideall\nmsgid \"will hide all windows\"\nmsgstr \"将隐藏所有窗口\"\n\n#: mainunit.strhideforeground\nmsgid \"will hide the foreground window\"\nmsgstr \"将隐藏前景窗口\"\n\n#: mainunit.strinfoabouttable\nmsgid \"Info about this table:\"\nmsgstr \"关于此表的信息：\"\n\n#: mainunit.strkeeplist\nmsgid \"Keep the current address list/code list?\"\nmsgstr \"保留当前地址列表/代码列表吗？\"\n\n#: mainunit.strmorepointers\nmsgid \"There are more pointers selected. Do you want to change them as well?\"\nmsgstr \"选择了更多指针。你想同时更改它们吗？\"\n\n#: mainunit.strmorepointers2\nmsgid \"You have selected one or more pointers. Do you want to change them as well?\"\nmsgstr \"你选择了一个或多个指针。你想要更改它们吗？\"\n\n#: mainunit.strnewyear\nmsgid \"And what are your good intentions for this year? ;-)\"\nmsgstr \"那么你今年的良好意图是什么呢？ ;-)\"\n\n#: mainunit.strnotavalidbinarynotation\nmsgid \" is not a valid binary notation!\"\nmsgstr \" 不是有效的二进制表示法！\"\n\n#: mainunit.strnotavalidnotation\nmsgid \"This is not a valid notation\"\nmsgstr \"这不是有效的表示法\"\n\n#: mainunit.strnotsameammountofbytes\nmsgid \"The number of bytes you typed is not the same as the previous ammount. Continue?\"\nmsgstr \"你输入的字节数与之前的数量不同。继续吗？\"\n\n#: mainunit.strnotthesamesize1\nmsgid \"The text you entered isn't the same size as the original. Continue?\"\nmsgstr \"你输入的文本大小与原始文本不同。继续吗？\"\n\n#: mainunit.strnotthesamesize2\nmsgid \"Not the same size!\"\nmsgstr \"大小不同！\"\n\n#: mainunit.stropcoderead\nmsgid \"The following opcodes read from the selected address\"\nmsgstr \"以下操作码从选定地址读取\"\n\n#: mainunit.strrecalculatealladdresses\nmsgid \"Recalculate all addresses\"\nmsgstr \"重新计算所有地址\"\n\n#: mainunit.strrecalculateselectedaddresses\nmsgid \"Recalculate selected addresses\"\nmsgstr \"重新计算选定地址\"\n\n#: mainunit.strremovefromgroup\nmsgid \"Remove from group \"\nmsgstr \"从组中移除 \"\n\n#: mainunit.strsaferphysicalmemory\nmsgid \"Safer memory access\"\nmsgstr \"更安全的内存访问\"\n\n#: mainunit.strscantextcaptiontotext\nmsgid \"Text:\"\nmsgstr \"文本：\"\n\n#: mainunit.strscantextcaptiontovalue\nmsgid \"Value:\"\nmsgstr \"值：\"\n\n#: mainunit.strsearchforarray\nmsgid \"Search for this array\"\nmsgstr \"搜索此数组\"\n\n#: mainunit.strsearchfortext\nmsgid \"Search for text\"\nmsgstr \"搜索文本\"\n\n#: mainunit.strselectedaddressisapointer\nmsgid \"The selected address is a pointer. Are you sure? (the base pointer will get the address)\"\nmsgstr \"选定的地址是一个指针。你确定吗？（基指针将获取该地址）\"\n\n#: mainunit.strsethotkey\nmsgid \"Set a hotkey\"\nmsgstr \"设置热键\"\n\n#: mainunit.strshowasdecimal\nmsgid \"Show as decimal value\"\nmsgstr \"显示为十进制值\"\n\n#: mainunit.strshowashex\nmsgid \"Show as hexadecimal value\"\nmsgstr \"显示为十六进制值\"\n\n#: mainunit.strunfreezeaddressinlist\nmsgid \"Unfreeze the address in this list\"\nmsgstr \"解除此列表中地址的冻结\"\n\n#: mainunit.strunfreezealladdresses\nmsgid \"Unfreeze all addresses in this list\"\nmsgstr \"解除此列表中所有地址的冻结\"\n\n#: mainunit.strunhideall\nmsgid \"will bring all windows back\"\nmsgstr \"将恢复所有窗口\"\n\n#: mainunit.strunhideforeground\nmsgid \"will bring the foreground window back\"\nmsgstr \"将恢复前景窗口\"\n\n#: mainunit.strwindowfailedtohide\nmsgid \"A window failed to hide\"\nmsgstr \"一个窗口隐藏失败\"\n\n#: mainunit.strxmess\nmsgid \"Merry christmas and happy new year\"\nmsgstr \"圣诞快乐，新年快乐\"\n\n#: mainunit2.cenamewithversion\nmsgid \"Cheat Engine 7.6\"\nmsgstr \"Cheat Engine 7.6\"\n\n#: mainunit2.rsdbvmmissedentries\n#, object-pascal-format\nmsgid \"Missed %d entries due to a too small buffer or slow copy operation\"\nmsgstr \"由于缓冲区过小或复制操作缓慢，错过了 %d 条条目\"\n\n#: mainunit2.rsenabledisablespeedhack\nmsgid \"Enable/Disable speedhack.\"\nmsgstr \"启用/禁用速度黑客。\"\n\n#: mainunit2.rsm2nohotkey\nmsgid \" (No hotkey)\"\nmsgstr \" （无热键）\"\n\n#: mainunit2.rsnohotkey\nmsgid \"No hotkey\"\nmsgstr \"无热键\"\n\n#: mainunit2.rspleasewait\nmsgid \"Please Wait!\"\nmsgstr \"请稍等！\"\n\n#: mainunit2.rsselectanitemfromthelistforasmalldescription\nmsgid \"Select an item from the list for a small description\"\nmsgstr \"从列表中选择一个项目以获取简短描述\"\n\n#: mainunit2.rsusethegameapplicationforawhile\nmsgid \"\"\n\"Use the game/application for a while and make the address you're watching change. The list will be filled with \"\n\"addresses that contain code that change the watched address.\"\nmsgstr \"使用游戏/应用程序一段时间，并使你正在观察的地址发生变化。列表将填充包含更改观察地址的代码的地址。\"\n\n#: mainunit2.rswonthaveanyeffectuntilyouopenanewprocess\nmsgid \"(Won't have any effect until you (re)open a process)\"\nmsgstr \"(在你（重新）打开进程之前不会有任何效果)\"\n\n#: mainunit2.straddresshastobereadable\nmsgid \"The address has to be readable if you want to use this function\"\nmsgstr \"如果你想使用此功能，地址必须是可读的\"\n\n#: mainunit2.strautoassemble\nmsgid \"Assembler\"\nmsgstr \"汇编器\"\n\n#: mainunit2.strbiggerthan\nmsgid \"Bigger than...\"\nmsgstr \"大于...\"\n\n#: mainunit2.strbug\nmsgid \"BUG!\"\nmsgstr \"错误！\"\n\n#: mainunit2.strcomparetofirstscan\nmsgid \"Compare to first scan\"\nmsgstr \"与第一次扫描比较\"\n\n#: mainunit2.strcomparetolastscan\nmsgid \"Compare to last scan\"\nmsgstr \"与最后一次扫描比较\"\n\n#: mainunit2.strcomparetosavedscan\nmsgid \"Compare to saved scan\"\nmsgstr \"与保存的扫描比较\"\n\n#: mainunit2.strdecreasedvalue\nmsgid \"Decreased value\"\nmsgstr \"值减少\"\n\n#: mainunit2.strdecreasedvalueby\nmsgid \"Decreased value by ...\"\nmsgstr \"值减少了 ...\"\n\n#: mainunit2.strexact\nmsgid \"Exact\"\nmsgstr \"精确\"\n\n#: mainunit2.strexactvalue\nmsgid \"Exact Value\"\nmsgstr \"精确值\"\n\n#: mainunit2.strfailedtoinitialize\nmsgid \"Failed to initialize the debugger\"\nmsgstr \"初始化调试器失败\"\n\n#: mainunit2.strignorevalue\nmsgid \"Ignore value\"\nmsgstr \"忽略值\"\n\n#: mainunit2.strincreasedvalue\nmsgid \"Increased value\"\nmsgstr \"值增加\"\n\n#: mainunit2.strincreasedvalueby\nmsgid \"Increased value by ...\"\nmsgstr \"值增加了 ...\"\n\n#: mainunit2.strneednewerwindowsversion\nmsgid \"This function only works in Windows 2000+ (perhaps also NT but not tested)\"\nmsgstr \"此功能仅在 Windows 2000+ 中有效（也许 NT 也可以，但未经过测试）\"\n\n#: mainunit2.strsmallerthan\nmsgid \"Smaller than...\"\nmsgstr \"小于...\"\n\n#: mainunit2.strtoolong\nmsgid \"Too long\"\nmsgstr \"太长了\"\n\n#: mainunit2.strunchangedvalue\nmsgid \"Unchanged value\"\nmsgstr \"值未改变\"\n\n#: mainunit2.strunknowninitialvalue\nmsgid \"Unknown initial value\"\nmsgstr \"未知初始值\"\n\n#: mainunit2.strvaluebetween\nmsgid \"Value between...\"\nmsgstr \"值在...\"\n\n#: manualmoduleloader.rsmmlallocationerror\nmsgid \"Allocation error\"\nmsgstr \"分配错误\"\n\n#: manualmoduleloader.rsmmlfailedfindingaddressof\nmsgid \"failed finding address of \"\nmsgstr \"查找地址失败 \"\n\n#: manualmoduleloader.rsmmlnotavalidfile\nmsgid \"not a dll\"\nmsgstr \"不是 dll\"\n\n#: manualmoduleloader.rsmmlnotavalidheader\nmsgid \"Not a valid header\"\nmsgstr \"无效的头部\"\n\n#: manualmoduleloader.rsmmltriedloadinga64bitmoduleona32bitsystem\nmsgid \"Tried loading a 64-bit module on a 32-bit system\"\nmsgstr \"尝试在 32 位系统上加载 64 位模块\"\n\n#: memdisplay.rsfailurecreatingopenglwindow\nmsgid \"failure creating opengl window\"\nmsgstr \"创建 opengl 窗口失败\"\n\n#: memdisplay.rsondatareturnedatoosmallmemoryregion\nmsgid \"OnData returned a too small memory region. It should have returned false instead\"\nmsgstr \"OnData 返回的内存区域太小。它应该返回 false 而不是\"\n\n#: memorybrowserformunit.rs0or1\nmsgid \"(0 or 1)\"\nmsgstr \"(0 或 1)\"\n\n#: memorybrowserformunit.rsallocatememory\nmsgid \"Allocate memory\"\nmsgstr \"分配内存\"\n\n#: memorybrowserformunit.rsatleastbyteshavebeenallocatedatdoyouwanttogotheren\n#, object-pascal-format\nmsgid \"At least %s bytes have been allocated at %s%sDo you want to go there now?\"\nmsgstr \"至少在 %s%s 处分配了 %s 字节。你想现在去那里吗？\"\n\n#: memorybrowserformunit.rsatleastbyteshavebeenallocatedatgotherenow\n#, object-pascal-format\nmsgid \"At least %s bytes have been allocated at %s. Go there now?\"\nmsgstr \"至少 %s 字节已在 %s 处分配。现在去那里吗？\"\n\n#: memorybrowserformunit.rsbecauseofunhandledexeption\n#, object-pascal-format\nmsgid \"Because of unhandled exception %s\"\nmsgstr \"由于未处理的异常 %s\"\n\n#: memorybrowserformunit.rsbetween\n#, object-pascal-format\nmsgid \"Between %s\"\nmsgstr \"在 %s 之间\"\n\n#: memorybrowserformunit.rschangedisplayfader\nmsgid \"Change display fader\"\nmsgstr \"更改显示渐变\"\n\n#: memorybrowserformunit.rschangeregister\nmsgid \"Change register\"\nmsgstr \"更改寄存器\"\n\n#: memorybrowserformunit.rscheatenginesinglelingeassembler\nmsgid \"Single-line assembler\"\nmsgstr \"单行汇编器\"\n\n#: memorybrowserformunit.rscommentfor\n#, object-pascal-format\nmsgid \"Comment for %s\"\nmsgstr \"关于 %s 的注释\"\n\n#: memorybrowserformunit.rscreateremotethread\nmsgid \"Create remote thread\"\nmsgstr \"创建远程线程\"\n\n#: memorybrowserformunit.rsdllinjected\nmsgid \"DLL Injected\"\nmsgstr \"DLL 已注入\"\n\n#: memorybrowserformunit.rsdoyouwanttoexecuteafunctionofthedll\nmsgid \"Do you want to execute a function of the dll?\"\nmsgstr \"你想执行 DLL 的一个函数吗？\"\n\n#: memorybrowserformunit.rserrorallocatingmemory\nmsgid \"Error allocating memory!\"\nmsgstr \"内存分配错误！\"\n\n#: memorybrowserformunit.rsfillintheaddressyouwanttogoto\nmsgid \"Fill in the address you want to go to\"\nmsgstr \"填写你想要去的地址\"\n\n#: memorybrowserformunit.rsgetkerneladdress\nmsgid \"Get kernel address\"\nmsgstr \"获取内核地址\"\n\n#: memorybrowserformunit.rsgivethenameofthefunctionyouwanttofindcasesensitive\nmsgid \"Give the name of the function you want to find (Case sensitive,certain words can cause blue screens)\"\nmsgstr \"给出你想要查找的函数名称（区分大小写，某些词可能导致蓝屏）\"\n\n#: memorybrowserformunit.rsgotoaddress\nmsgid \"Goto Address\"\nmsgstr \"转到地址\"\n\n#: memorybrowserformunit.rsheaderfor\n#, object-pascal-format\nmsgid \"Header for %s\"\nmsgstr \"关于 %s 的头部\"\n\n#: memorybrowserformunit.rshowlongshouldachangebeshown\nmsgid \"How long should a change be shown?\"\nmsgstr \"更改应显示多长时间？\"\n\n#: memorybrowserformunit.rshowmuchis\n#, object-pascal-format\nmsgid \"How much is %s?\"\nmsgstr \"%s 多少钱？\"\n\n#: memorybrowserformunit.rshowmuchmemorydoyouwanttoaddtothisprocess\nmsgid \"How much memory do you want to add to this process?\"\nmsgstr \"你想为这个进程添加多少内存？\"\n\n#: memorybrowserformunit.rshowmuchmemorydoyouwishtoallocate\nmsgid \"How much memory do you wish to allocate?\"\nmsgstr \"你希望分配多少内存？\"\n\n#: memorybrowserformunit.rsidontunderstandwhatyoumeanwith\n#, object-pascal-format\nmsgid \"I don't understand what you mean with %s\"\nmsgstr \"我不明白你所说的 %s 是什么意思\"\n\n#: memorybrowserformunit.rsinjectdll\nmsgid \"Inject dll\"\nmsgstr \"注入 DLL\"\n\n#: memorybrowserformunit.rsinjectdylib\nmsgid \"Inject DYLIB\"\nmsgstr \"注入 DYLIB\"\n\n#: memorybrowserformunit.rsmaxstacktracesize\nmsgid \"Max stacktrace size\"\nmsgstr \"最大堆栈跟踪大小\"\n\n#: memorybrowserformunit.rsmbbookmark\n#, object-pascal-format\nmsgid \"Bookmark %d\"\nmsgstr \"书签 %d\"\n\n#: memorybrowserformunit.rsmbbookmark2\n#, object-pascal-format\nmsgid \"Bookmark %d: %s\"\nmsgstr \"书签 %d：%s\"\n\n#: memorybrowserformunit.rsmbcreationoftheremotethreadfailed\nmsgid \"Creation of the remote thread failed\"\nmsgstr \"远程线程创建失败\"\n\n#: memorybrowserformunit.rsmbthreadcreated\nmsgid \"Thread Created\"\nmsgstr \"线程已创建\"\n\n#: memorybrowserformunit.rsmemorybrowser\nmsgid \"MemoryBrowser\"\nmsgstr \"内存浏览器\"\n\n#: memorybrowserformunit.rsmemoryviewercurrentlydebuggingthread\n#, object-pascal-format\nmsgid \"Memory Viewer - Currently debugging thread %s\"\nmsgstr \"内存查看器 - 当前调试线程 %s\"\n\n#: memorybrowserformunit.rsmemoryviewerrunning\nmsgid \"Memory Viewer - Running\"\nmsgstr \"内存查看器 - 正在运行\"\n\n#: memorybrowserformunit.rsneedtorundissectcode\nmsgid \"You will need to run the dissect code routine first before this window is usable. Run it now?\"\nmsgstr \"你需要先运行解剖代码例程，然后这个窗口才能使用。现在运行吗？\"\n\n#: memorybrowserformunit.rsnewsize\nmsgid \"New size\"\nmsgstr \"新大小\"\n\n#: memorybrowserformunit.rspleaseenteravalidhexadecimaladdres\nmsgid \"Please enter a valid hexadecimal addres\"\nmsgstr \"请输入有效的十六进制地址\"\n\n#: memorybrowserformunit.rspleaseenteravalidhexadecimalvalue\nmsgid \"Please enter a valid hexadecimal value\"\nmsgstr \"请输入有效的十六进制值\"\n\n#: memorybrowserformunit.rspleasespecifythenewsymbolsearchpathseperatespaths\nmsgid \"Please specify the new symbol searchpath (; separates paths)\"\nmsgstr \"请指定新的符号搜索路径（; 用于分隔路径）\"\n\n#: memorybrowserformunit.rspleasetargetanotherprocess\nmsgid \"Start another version of Cheat Engine and attach to that instead\"\nmsgstr \"启动另一个版本的 Cheat Engine 并附加到该版本\"\n\n#: memorybrowserformunit.rspleasetargetaprocessfirst\nmsgid \"Please target a process first\"\nmsgstr \"请先选择一个进程\"\n\n#: memorybrowserformunit.rsremovebreakpoint\nmsgid \"Remove breakpoint\"\nmsgstr \"移除断点\"\n\n#: memorybrowserformunit.rsreturnaddress\nmsgid \"Return Address\"\nmsgstr \"返回地址\"\n\n#: memorybrowserformunit.rsselectthefunctionyouwanttoexecute\nmsgid \"Select the function you want to execute\"\nmsgstr \"选择你想要执行的函数\"\n\n#: memorybrowserformunit.rssomethinghappened\nmsgid \"something happened\"\nmsgstr \"发生了一些事情\"\n\n#: memorybrowserformunit.rssshowstheautoguessvalue\n#, object-pascal-format\nmsgid \"(%s shows the autoguess value)\"\nmsgstr \"（%s 显示自动猜测值）\"\n\n#: memorybrowserformunit.rsstopshowingthedifference\nmsgid \"Stop showing the difference\"\nmsgstr \"停止显示差异\"\n\n#: memorybrowserformunit.rssymbolhandler\nmsgid \"Symbol handler\"\nmsgstr \"符号处理程序\"\n\n#: memorybrowserformunit.rsthegeneratedcodeisbyteslongbuttheselectedopcodeisb\n#, object-pascal-format\nmsgid \"\"\n\"The generated code is %s byte(s) long, but the selected opcode is %s byte(s) long! Do you want to replace the \"\n\"incomplete opcode(s) with NOP's?\"\nmsgstr \"生成的代码长度为 %s 字节，但选定的操作码长度为 %s 字节！你想用 NOP 替换不完整的操作码吗？\"\n\n#: memorybrowserformunit.rstypeyourassemblercodehereaddress\n#, object-pascal-format\nmsgid \"Type your assembler code here: (address=%s)\"\nmsgstr \"在此输入你的汇编代码：（地址=%s）\"\n\n#: memorybrowserformunit.rsunlinkfromotherhexview\nmsgid \"Unlink from other hexview\"\nmsgstr \"与其他十六进制视图解除链接\"\n\n#: memorybrowserformunit.rswhatisthenewvalueof\n#, object-pascal-format\nmsgid \"What is the new value of %s?\"\nmsgstr \"%s 的新值是什么？\"\n\n#: memorybrowserformunit.rswhatwillbethestartaddressofthisthread\nmsgid \"What will be the startaddress of this thread?\"\nmsgstr \"这个线程的起始地址将是什么？\"\n\n#: memorybrowserformunit.rsyouwanttogiveanadditional32bitparameterwillshowupi\nmsgid \"You want to give an additional 32-bit parameter? (Will show up in (R)/(E)BX)\"\nmsgstr \"你想要提供一个额外的 32 位参数吗？（将在 (R)/(E)BX 中显示）\"\n\n#: memoryrecordunit.rsadjustmrwithrelativeaddress\nmsgid \"Do you wish to adjust memory records with relative addresses as well?\"\nmsgstr \"你希望调整带有相对地址的内存记录吗？\"\n\n#: memoryrecordunit.rsdecreasevalue\nmsgid \"Decrease Value\"\nmsgstr \"减少值\"\n\n#: memoryrecordunit.rsincreasevalue\nmsgid \"Increase Value\"\nmsgstr \"增加值\"\n\n#: memoryrecordunit.rsmrnibblesupportisonlyforhexadecimaldisplay\nmsgid \"Nibble support is only for hexadecimal display\"\nmsgstr \"Nibble 支持仅适用于十六进制显示\"\n\n#: memoryrecordunit.rspqqqqqqqq\nmsgid \"P->????????\"\nmsgstr \"P->????????\"\n\n#: memoryrecordunit.rstoggleactivation\nmsgid \"Toggle Activation\"\nmsgstr \"切换激活\"\n\n#: memoryrecordunit.rstoggleactivationallowdecrease\nmsgid \"Toggle Activation Allow Decrease\"\nmsgstr \"切换激活允许减少\"\n\n#: memoryrecordunit.rstoggleactivationallowincrease\nmsgid \"Toggle Activation Allow Increase\"\nmsgstr \"切换激活允许增加\"\n\n#: memscan.rsaresultsetwiththisnamealreadyexists\n#, object-pascal-format\nmsgid \"A result set with this name(%s) already exists\"\nmsgstr \"已存在名为 (%s) 的结果集\"\n\n#: memscan.rsdiskwriteerror\n#, object-pascal-format\nmsgid \"Disk write error:%s\"\nmsgstr \"磁盘写入错误：%s\"\n\n#: memscan.rsdiskwriteerror2\n#, object-pascal-format\nmsgid \"Disk Write Error:%s\"\nmsgstr \"磁盘写入错误：%s\"\n\n#: memscan.rserrorallocatingbytesfortheoldresults\n#, object-pascal-format\nmsgid \"Error allocating %s bytes for the old results. buffersize=%s variablesize=%s\"\nmsgstr \"为旧结果分配 %s 字节时出错。缓冲区大小=%s 变量大小=%s\"\n\n#: memscan.rserrorwhenwhileloadingresult\nmsgid \"Error while loading result\"\nmsgstr \"加载结果时出错\"\n\n#: memscan.rsfailedspawningthesavefirstscanthread\nmsgid \"Failed spawning the Save First Scan thread\"\nmsgstr \"创建保存第一次扫描线程失败\"\n\n#: memscan.rsfailureallocatingmemoryforcopytriedallocatingkb\n#, object-pascal-format\nmsgid \"Failure allocating memory for copy. Tried allocating %s KB\"\nmsgstr \"分配内存以进行复制失败。尝试分配 %s KB\"\n\n#: memscan.rsfailurecreatingthescandirectory\nmsgid \"Failure creating the scan directory\"\nmsgstr \"创建扫描目录失败\"\n\n#: memscan.rsforsomereasonthescancontrollerdoesnotexist\nmsgid \"For some reason the scanController does not exist\"\nmsgstr \"由于某种原因，scanController 不存在\"\n\n#: memscan.rsinvalidbinarynotation\nmsgid \"Invalid binary notation\"\nmsgstr \"无效的二进制表示法\"\n\n#: memscan.rsisaninvalidvalue\n#, object-pascal-format\nmsgid \"%s is an invalid value\"\nmsgstr \"%s 是一个无效的值\"\n\n#: memscan.rsisnotavalidcharacterinsideabinarystring\n#, object-pascal-format\nmsgid \"%s is not a valid character inside a binary string\"\nmsgstr \"%s 不是二进制字符串中的有效字符\"\n\n#: memscan.rsisnotavalidnotation\n#, object-pascal-format\nmsgid \"%s is an invalid notation\"\nmsgstr \"%s 是无效的表示法\"\n\n#: memscan.rsmscustomtypeisnil\nmsgid \"Custom type is nil\"\nmsgstr \"自定义类型为 nil\"\n\n#: memscan.rsmsnothingtoscanfor\nmsgid \"Nothing to scan for\"\nmsgstr \"没有要扫描的内容\"\n\n#: memscan.rsmspointertypenotrecognised\nmsgid \"Pointer type not recognised: \"\nmsgstr \"未识别的指针类型：\"\n\n#: memscan.rsmsthescanwasforcedtoterminatesubsequentscansmaynotfunctionproperlyetc\nmsgid \"The scan was forced to terminate. Subsequent scans may not function properly. It's recommended to restart Cheat Engine\"\nmsgstr \"扫描被强制终止。后续扫描可能无法正常工作。建议重新启动 Cheat Engine\"\n\n#: memscan.rsmstupidalignsize\nmsgid \"Stupid alignsize\"\nmsgstr \"愚蠢的对齐大小\"\n\n#: memscan.rsnotenoughdiskspacefortheaddressfile\nmsgid \"Not enough diskspace for the address file\"\nmsgstr \"地址文件没有足够的磁盘空间\"\n\n#: memscan.rsnotenoughdiskspaceforthememoryfile\nmsgid \"Not enough diskspace for the memory file\"\nmsgstr \"内存文件没有足够的磁盘空间\"\n\n#: memscan.rspleasefillsomethingin\nmsgid \"Please fill something in\"\nmsgstr \"请填写一些内容\"\n\n#: memscan.rsthetemporaryscandirectorydoesnotexistcheckyourscan\n#, object-pascal-format\nmsgid \"The temporary scan directory %s does not exist. Check your scan settings\"\nmsgstr \"临时扫描目录 %s 不存在。检查你的扫描设置\"\n\n#: memscan.rsthread\nmsgid \"thread \"\nmsgstr \"线程 \"\n\n#: memscan.rsthreadsynchronizer\nmsgid \"Thread synchronizer\"\nmsgstr \"线程同步器\"\n\n#: memscan.rstmpandundoarenamesthatmaynotbeusedtryanothername\nmsgid \"TMP and UNDO are names that may not be used. Try another name\"\nmsgstr \"TMP 和 UNDO 是不允许使用的名称。尝试另一个名称\"\n\n#: mikmod.rsfailuretoinitializemikmod\nmsgid \"Failure to initialize MikMod\"\nmsgstr \"初始化 MikMod 失败\"\n\n#: networkconfig.rsfailedconnectingtotheserver\nmsgid \"Failed connecting to the server\"\nmsgstr \"连接服务器失败\"\n\n#: networkinterfaceapi.rsinvalidceserverversion\n#, object-pascal-format\nmsgid \"Invalid ceserver version. ( %s )\"\nmsgstr \"无效的 ceserver 版本。（ %s ）\"\n\n#: networkinterfaceapi.rsnoconnection\nmsgid \"No connection\"\nmsgstr \"没有连接\"\n\n#: newkernelhandler.rscouldntbeopened\n#, object-pascal-format\nmsgid \"%s couldn't be opened\"\nmsgstr \"%s 无法打开\"\n\n#: newkernelhandler.rsdbvmisnotloadedthisfeatureisnotusable\nmsgid \"DBVM is not loaded. This feature is not usable\"\nmsgstr \"DBVM 未加载。此功能不可用\"\n\n#: newkernelhandler.rsdidnotloaddbvm\nmsgid \"I don't know what you did, you didn't crash, but you also didn't load DBVM\"\nmsgstr \"我不知道你做了什么，你没有崩溃，但你也没有加载 DBVM\"\n\n#: newkernelhandler.rsfucked\nmsgid \"Something is really messed up on your computer! You don't seem to have a kernel!!!!\"\nmsgstr \"你的计算机上真的出现了问题！你似乎没有内核！！！！\"\n\n#: newkernelhandler.rspleaserebootandpressf8beforewindowsboots\nmsgid \"\"\n\"Please reboot and press f8 before windows boots. Then enable unsigned drivers. Alternatively, you could buy yourself a \"\n\"business class certificate and sign the driver yourself (or try debug signing)\"\nmsgstr \"请重启并在 Windows 启动之前按 F8。然后启用未签名的驱动程序。或者，你可以购买一个商业级证书并自己签署驱动程序（或尝试调试签名）\"\n\n#: newkernelhandler.rsthedriverneedstobeloadedtobeabletousethisfunction\nmsgid \"The driver needs to be loaded to be able to use this function.\"\nmsgstr \"需要加载驱动程序才能使用此功能。\"\n\n#: newkernelhandler.rstousethisfunctionyouwillneedtorundbvm\nmsgid \"\"\n\"To use this function you will need to run DBVM. There is a high chance running DBVM can crash your system and make you \"\n\"lose your data(So don't forget to save first). Do you want to run DBVM?\"\nmsgstr \"要使用此功能，你需要运行 DBVM。运行 DBVM 很可能会导致系统崩溃并使你丢失数据（所以不要忘记先保存）。你想运行 DBVM 吗？\"\n\n#: newkernelhandler.rsyourcpumustbeabletorundbvmtousethisfunction\nmsgid \"Your cpu must be able to run dbvm to use this function\"\nmsgstr \"你的 CPU 必须能够运行 DBVM 才能使用此功能\"\n\n#: opensave.rsaskifstupid\nmsgid \"\"\n\"Generating a trainer with the current state of the cheat table will likely result in a completely useless trainer that \"\n\"does nothing. Are you sure?\"\nmsgstr \"使用当前状态的作弊表生成训练器可能会导致生成一个完全无用的训练器，什么都不做。你确定吗？\"\n\n#: opensave.rsdoesntcontainneededinformationwheretoplacethememor\n#, object-pascal-format\nmsgid \"%s doesn't contain needed information where to place the memory\"\nmsgstr \"%s 不包含放置内存所需的信息\"\n\n#: opensave.rserrorexecutingthistablesluascript\n#, object-pascal-format\nmsgid \"Error executing this table's lua script: %s\"\nmsgstr \"执行此表的 lua 脚本时出错：%s\"\n\n#: opensave.rserrorexecutingthistablesluascriptentry\n#, object-pascal-format\nmsgid \"Error executing this table's lua script named %s: %s\"\nmsgstr \"执行名为 %s 的此表的 lua 脚本时出错：%s\"\n\n#: opensave.rserrorsaving\nmsgid \"Error saving...\"\nmsgstr \"保存中出错...\"\n\n#: opensave.rsinvalidluafortrainer\nmsgid \"The lua script in this trainer has some issues and will therefore not load\"\nmsgstr \"此训练器中的 lua 脚本存在一些问题，因此无法加载\"\n\n#: opensave.rsosthereisanewerversionifcheatengineoutetc\nmsgid \"There is a newer version of Cheat Engine out. It's recommended to use that version instead\"\nmsgstr \"有一个更新版本的 Cheat Engine 可用。建议使用该版本\"\n\n#: opensave.rsosthischeattableiscorrupt\nmsgid \"This cheat table is corrupt\"\nmsgstr \"此作弊表已损坏\"\n\n#: opensave.rstheregionatwaspartiallyorcompletlyunreadable\n#, object-pascal-format\nmsgid \"The region at %s was partially or completely unreadable\"\nmsgstr \"位于 %s 的区域部分或完全无法读取\"\n\n#: opensave.rstheversionofisincompatiblewiththisceversion\n#, object-pascal-format\nmsgid \"The version of %s is incompatible with this Cheat Engine version\"\nmsgstr \"%s 的版本与此 Cheat Engine 版本不兼容\"\n\n#: opensave.rsthisisnotavalidcheattable\nmsgid \"This is not a valid cheat table\"\nmsgstr \"这不是有效的作弊表\"\n\n#: opensave.rsthisisnotavalidxmlfile\nmsgid \"This is not a valid xml file\"\nmsgstr \"这不是有效的 xml 文件\"\n\n#: opensave.rsthistablecontainsaluascriptdoyouwanttorunit\nmsgid \"This table contains a lua script. Do you want to run it?\"\nmsgstr \"此表包含 lua 脚本。你想运行它吗？\"\n\n#: opensave.rsyoucanonlyprotectafileifithasancetrainerextension\nmsgid \"You can only protect a file if it has an .CETRAINER extension\"\nmsgstr \"只有当文件具有 .CETRAINER 扩展名时，才能保护该文件\"\n\n#: opensave.rsyoureabouttoloadanunsignedobfuscatedtableareyousure\nmsgid \"You're about to load an unsigned obfuscated table while running with admin privileges. Are you sure?\"\nmsgstr \"你即将加载一个未签名的混淆表，同时以管理员权限运行。你确定吗？\"\n\n#: opensave.strcantloadfilepatcher\nmsgid \"The file patcher can't be loaded by Cheat Engine!\"\nmsgstr \"文件补丁程序无法被 Cheat Engine 加载！\"\n\n#: opensave.strcantloadprotectedfile\nmsgid \"This Trainer is protected from being opened by Cheat Engine. Now go away!!!\"\nmsgstr \"此 Trainer 被保护，无法通过 Cheat Engine 打开。现在请离开！！！\"\n\n#: opensave.strcorrupticon\nmsgid \"The icon has been corrupted\"\nmsgstr \"图标已损坏\"\n\n#: opensave.strnotacetrainer\nmsgid \"This is not a Trainer made by Cheat Engine (If it is a Trainer at all!)\"\nmsgstr \"这不是由 Cheat Engine 制作的 Trainer（如果它真的是 Trainer 的话！）\"\n\n#: opensave.strunknowncomponent\nmsgid \"There is a unknown component in the trainer! compnr=\"\nmsgstr \"Trainer 中有一个未知组件！ compnr=\"\n\n#: opensave.strunknowntrainerversion\nmsgid \"This version of Cheat Engine doesn't know how to read this Trainer! Trainerversion=\"\nmsgstr \"此版本的 Cheat Engine 不知道如何读取此 Trainer！ Trainerversion=\"\n\n#: parsers.rsinvalidinteger\nmsgid \"Invalid integer\"\nmsgstr \"无效的整数\"\n\n#: peinfofunctions.rspeifnoexports\nmsgid \"No exports\"\nmsgstr \"没有导出\"\n\n#: peinfofunctions.strinvalidfile\nmsgid \"Invalid file\"\nmsgstr \"无效的文件\"\n\n#: peinfounit.rspe32bit\nmsgid \"32-bit, \"\nmsgstr \"32 位，\"\n\n#: peinfounit.rspeaddressoffunctions\n#, object-pascal-format\nmsgid \"AddressOfFunctions = %x\"\nmsgstr \"AddressOfFunctions = %x\"\n\n#: peinfounit.rspeaddressofnameordinals\n#, object-pascal-format\nmsgid \"AddressOfNameOrdinals = %x\"\nmsgstr \"AddressOfNameOrdinals = %x\"\n\n#: peinfounit.rspeaddressofnames\n#, object-pascal-format\nmsgid \"AddressOfNames = %x\"\nmsgstr \"AddressOfNames = %x\"\n\n#: peinfounit.rspeaddressofrawdata\n#, object-pascal-format\nmsgid \"Address of raw data = %x\"\nmsgstr \"原始数据地址 = %x\"\n\n#: peinfounit.rspeagressivetrim\nmsgid \"Agressive trim, \"\nmsgstr \"激进修剪，\"\n\n#: peinfounit.rspearchitecturespecifictable\nmsgid \"Architecture-Specific table\"\nmsgstr \"特定于架构的表\"\n\n#: peinfounit.rspebase\n#, object-pascal-format\nmsgid \"Base = %x\"\nmsgstr \"基址 = %x\"\n\n#: peinfounit.rspebaseofcode\n#, object-pascal-format\nmsgid \"Base of code = %.8x \"\nmsgstr \"代码基址 = %.8x \"\n\n#: peinfounit.rspebaseofdata\n#, object-pascal-format\nmsgid \"Base of data = %.8x \"\nmsgstr \"数据基址 = %.8x \"\n\n#: peinfounit.rspebaserelocationtable\nmsgid \"Base-Relocation table\"\nmsgstr \"基址重定位表\"\n\n#: peinfounit.rspeboundimporttable\nmsgid \"Bound import table\"\nmsgstr \"绑定导入表\"\n\n#: peinfounit.rspecertificatetabel\nmsgid \"Certificate table\"\nmsgstr \"证书表\"\n\n#: peinfounit.rspecharacterisitics\n#, object-pascal-format\nmsgid \"characterisitics=%x (%s)\"\nmsgstr \"特征=%x (%s)\"\n\n#: peinfounit.rspecharacteristics\n#, object-pascal-format\nmsgid \"Characteristics = %x (%s)\"\nmsgstr \"特征 = %x (%s)\"\n\n#: peinfounit.rspecharacteristics2\n#, object-pascal-format\nmsgid \"Characteristics=%x (should be 0)\"\nmsgstr \"特征=%x (应为 0)\"\n\n#: peinfounit.rspecharacteristicsoriginalfirstthunk\n#, object-pascal-format\nmsgid \"Characteristics/OriginalFirstThunk=%x\"\nmsgstr \"特征/原始第一个 thunk=%x\"\n\n#: peinfounit.rspechecksum\n#, object-pascal-format\nmsgid \"CheckSum = %x \"\nmsgstr \"校验和 = %x \"\n\n#: peinfounit.rspeclrruntimetable\nmsgid \"CLR Runtime table\"\nmsgstr \"CLR 运行时表\"\n\n#: peinfounit.rspecodeview\nmsgid \"Codeview\"\nmsgstr \"代码视图\"\n\n#: peinfounit.rspedebugfile\n#, object-pascal-format\nmsgid \"Debugfile =%s\"\nmsgstr \"调试文件 =%s\"\n\n#: peinfounit.rspedebugginginfotable\nmsgid \"Debugging info table\"\nmsgstr \"调试信息表\"\n\n#: peinfounit.rspedelayimportdescriptiontable\nmsgid \"Delay import descriptor table\"\nmsgstr \"延迟导入描述符表\"\n\n#: peinfounit.rspediscardable\nmsgid \"discardable, \"\nmsgstr \"可丢弃，\"\n\n#: peinfounit.rspedll\nmsgid \"DLL, \"\nmsgstr \"DLL，\"\n\n#: peinfounit.rspedllcharacteristics\n#, object-pascal-format\nmsgid \"Dll Characteristics = %x \"\nmsgstr \"DLL 特征 = %x \"\n\n#: peinfounit.rspedosentrypoint\n#, object-pascal-format\nmsgid \"dos entrypoint = %.4x:%.4x\"\nmsgstr \"DOS 入口点 = %.4x:%.4x\"\n\n#: peinfounit.rspedosstack\n#, object-pascal-format\nmsgid \"dos stack = %.4x:%.4x\"\nmsgstr \"DOS 堆栈 = %.4x:%.4x\"\n\n#: peinfounit.rspeentrypoint\n#, object-pascal-format\nmsgid \"Entry point = %.8x \"\nmsgstr \"入口点 = %.8x \"\n\n#: peinfounit.rspeexceptiontable\nmsgid \"Exception table\"\nmsgstr \"异常表\"\n\n#: peinfounit.rspeexecutable\nmsgid \"Executable, \"\nmsgstr \"可执行，\"\n\n#: peinfounit.rspeexecutablecode\nmsgid \"Executable code, \"\nmsgstr \"可执行代码，\"\n\n#: peinfounit.rspeexecutablememory\nmsgid \"executable memory, \"\nmsgstr \"可执行内存，\"\n\n#: peinfounit.rspeexporttable\nmsgid \"Export table\"\nmsgstr \"导出表\"\n\n#: peinfounit.rspefailureatallocationmemory\nmsgid \"Failure at allocating memory\"\nmsgstr \"分配内存失败\"\n\n#: peinfounit.rspefailurereadingmemory\nmsgid \"Failure reading memory\"\nmsgstr \"读取内存失败\"\n\n#: peinfounit.rspefilealignment\n#, object-pascal-format\nmsgid \"File Alignment = %x \"\nmsgstr \"文件对齐 = %x \"\n\n#: peinfounit.rspefirstthunk\n#, object-pascal-format\nmsgid \"FirstThunk=%x\"\nmsgstr \"第一个 thunk=%x\"\n\n#: peinfounit.rspeforwarderchain\n#, object-pascal-format\nmsgid \"Forwarder Chain=%x (-1 if no forwarders)\"\nmsgstr \"转发链=%x (-1 如果没有转发)\"\n\n#: peinfounit.rspeglobalpointertable\nmsgid \"Global pointer table\"\nmsgstr \"全局指针表\"\n\n#: peinfounit.rspeimport\n#, object-pascal-format\nmsgid \"Import %d : %s\"\nmsgstr \"导入 %d : %s\"\n\n#: peinfounit.rspeimportaddresstable\nmsgid \"import address table\"\nmsgstr \"导入地址表\"\n\n#: peinfounit.rspeimports\nmsgid \"imports:\"\nmsgstr \"导入：\"\n\n#: peinfounit.rspeimporttable\nmsgid \"Import table\"\nmsgstr \"导入表\"\n\n#: peinfounit.rspeinconsistent\nmsgid \" (inconsistent)\"\nmsgstr \" (不一致)\"\n\n#: peinfounit.rspeinitializeddata\nmsgid \"Initialized data, \"\nmsgstr \"初始化数据，\"\n\n#: peinfounit.rspelfanew\nmsgid \"lfanew=\"\nmsgstr \"lfanew=\"\n\n#: peinfounit.rspeloadconfigtable\nmsgid \"Load config table\"\nmsgstr \"加载配置表\"\n\n#: peinfounit.rspeloaderflags\n#, object-pascal-format\nmsgid \"Loader Flags = %x \"\nmsgstr \"加载器标志 = %x \"\n\n#: peinfounit.rspemachine\n#, object-pascal-format\nmsgid \"Machine=%.2x\"\nmsgstr \"机器=%.2x\"\n\n#: peinfounit.rspemachine64\n#, object-pascal-format\nmsgid \"Machine=%.2x (64 bit)\"\nmsgstr \"机器=%.2x (64 位)\"\n\n#: peinfounit.rspemajorimageversion\n#, object-pascal-format\nmsgid \"Major Image Version = %d \"\nmsgstr \"主要镜像版本 = %d \"\n\n#: peinfounit.rspemajorlinkerversion\n#, object-pascal-format\nmsgid \"Major linker version = %d \"\nmsgstr \"主要链接器版本 = %d \"\n\n#: peinfounit.rspemajoroperatingsystemversion\n#, object-pascal-format\nmsgid \"Major Operating System Version = %d \"\nmsgstr \"主要操作系统版本 = %d \"\n\n#: peinfounit.rspemajorsubsystemversion\n#, object-pascal-format\nmsgid \"Major Subsystem Version = %d \"\nmsgstr \"主要子系统版本 = %d \"\n\n#: peinfounit.rspemajorversion\n#, object-pascal-format\nmsgid \"Major version=%d\"\nmsgstr \"主要版本=%d\"\n\n#: peinfounit.rspeminorimageversion\n#, object-pascal-format\nmsgid \"Minor Image Version = %d \"\nmsgstr \"次要镜像版本 = %d \"\n\n#: peinfounit.rspeminorlinlerversion\n#, object-pascal-format\nmsgid \"Minor linker version = %d \"\nmsgstr \"次要链接器版本 = %d \"\n\n#: peinfounit.rspeminorsubsystemversion\n#, object-pascal-format\nmsgid \"Minor Subsystem Version = %d \"\nmsgstr \"次要子系统版本 = %d \"\n\n#: peinfounit.rspeminorversion\n#, object-pascal-format\nmsgid \"Minor version=%d\"\nmsgstr \"次要版本=%d\"\n\n#: peinfounit.rspemzheader\nmsgid \"MZ header\"\nmsgstr \"MZ 头\"\n\n#: peinfounit.rspename\n#, object-pascal-format\nmsgid \"Name = %x (%s)\"\nmsgstr \"名称 = %x (%s)\"\n\n#: peinfounit.rspename2\n#, object-pascal-format\nmsgid \"Name=%x : %s\"\nmsgstr \"名称=%x : %s\"\n\n#: peinfounit.rspenetrunfromswap\nmsgid \"Net: Run from swap, \"\nmsgstr \"网络：从交换区运行，\"\n\n#: peinfounit.rspenodbginfo\nmsgid \"No DBG info, \"\nmsgstr \"没有 DBG 信息，\"\n\n#: peinfounit.rspenolinenumbers\nmsgid \"No line numbers, \"\nmsgstr \"没有行号，\"\n\n#: peinfounit.rspenolocalsymbols\nmsgid \"No local symbols, \"\nmsgstr \"没有本地符号，\"\n\n#: peinfounit.rspenorelocations\nmsgid \"No relocations, \"\nmsgstr \"没有重定位，\"\n\n#: peinfounit.rspenotallmemorycouldbereadworkingwithapartialcopyhere\nmsgid \"Not all memory could be read, working with a partial copy here\"\nmsgstr \"并非所有内存都能被读取，这里正在使用部分副本\"\n\n#: peinfounit.rspenotcached\nmsgid \"not cached, \"\nmsgstr \"未缓存，\"\n\n#: peinfounit.rspenotpaged\nmsgid \"not paged, \"\nmsgstr \"未分页，\"\n\n#: peinfounit.rspenumberoffunctions\n#, object-pascal-format\nmsgid \"NumberOfFunctions = %d\"\nmsgstr \"函数数量 = %d\"\n\n#: peinfounit.rspenumberoflinenumbers\n#, object-pascal-format\nmsgid \"number of line numbers=%x\"\nmsgstr \"行号数量=%x\"\n\n#: peinfounit.rspenumberofnames\n#, object-pascal-format\nmsgid \"NumberOfNames = %d\"\nmsgstr \"名称数量 = %d\"\n\n#: peinfounit.rspenumberofrelocations\n#, object-pascal-format\nmsgid \"number of relocations=%x\"\nmsgstr \"重定位数量=%x\"\n\n#: peinfounit.rspenumberofrvaandsize\n#, object-pascal-format\nmsgid \"Number Of Rva And Sizes = %d \"\nmsgstr \"Rva 和大小数量 = %d \"\n\n#: peinfounit.rspenumberofsections\n#, object-pascal-format\nmsgid \"Number of sections=%d\"\nmsgstr \"节数量=%d\"\n\n#: peinfounit.rspeoptional\nmsgid \"-----optional-----\"\nmsgstr \"-----可选-----\"\n\n#: peinfounit.rspeoptionalheader\n#, object-pascal-format\nmsgid \"OptionalHeader size = %x\"\nmsgstr \"可选头大小 = %x\"\n\n#: peinfounit.rspeoptionalmagicnumber\n#, object-pascal-format\nmsgid \"Optional magic number = %x \"\nmsgstr \"可选魔数 = %x \"\n\n#: peinfounit.rspepeheader\nmsgid \"PE header\"\nmsgstr \"PE 头\"\n\n#: peinfounit.rspepeinfoimagesize\nmsgid \"PEInfo: Image size\"\nmsgstr \"PE 信息：图像大小\"\n\n#: peinfounit.rspepointertolinenumbers\n#, object-pascal-format\nmsgid \"Pointer to line numbers=%x\"\nmsgstr \"行号指针=%x\"\n\n#: peinfounit.rspepointertorawdata\n#, object-pascal-format\nmsgid \"Pointer to raw data=%x\"\nmsgstr \"原始数据指针=%x\"\n\n#: peinfounit.rspepointertorelocations\n#, object-pascal-format\nmsgid \"Pointer to relocations=%x\"\nmsgstr \"重定位指针=%x\"\n\n#: peinfounit.rspepreferedimagebase\n#, object-pascal-format\nmsgid \"Prefered imagebase = %.8x \"\nmsgstr \"首选图像基址 = %.8x \"\n\n#: peinfounit.rspepreferedimagebase2\n#, object-pascal-format\nmsgid \"Prefered imagebase = %.16x \"\nmsgstr \"首选图像基址 = %.16x \"\n\n#: peinfounit.rspereadablememory\nmsgid \"readable memory, \"\nmsgstr \"可读内存，\"\n\n#: peinfounit.rsperemovablerunfromswap\nmsgid \"Removable: Run from swap, \"\nmsgstr \"可移除：从交换区运行，\"\n\n#: peinfounit.rsperemoved\nmsgid \"removed, \"\nmsgstr \"已移除，\"\n\n#: peinfounit.rspereserved\nmsgid \"reserved\"\nmsgstr \"保留\"\n\n#: peinfounit.rsperesourcetable\nmsgid \"Resource table\"\nmsgstr \"资源表\"\n\n#: peinfounit.rspereversedbyteshi\nmsgid \"Reversed bytes HI, \"\nmsgstr \"字节反转 HI，\"\n\n#: peinfounit.rspereversedbyteslo\nmsgid \"Reversed bytes LO, \"\nmsgstr \"字节反转 LO，\"\n\n#: peinfounit.rspesectionallignment\n#, object-pascal-format\nmsgid \"Section allignment = %x \"\nmsgstr \"节对齐 = %x \"\n\n#: peinfounit.rspesections\nmsgid \"-----sections-----\"\nmsgstr \"-----节-----\"\n\n#: peinfounit.rspesharedmemory\nmsgid \"shared memory, \"\nmsgstr \"共享内存，\"\n\n#: peinfounit.rspesignature\n#, object-pascal-format\nmsgid \"Signature=%x (%s)\"\nmsgstr \"签名=%x (%s)\"\n\n#: peinfounit.rspesizeofcode\n#, object-pascal-format\nmsgid \"Size of code = %x (%d) \"\nmsgstr \"代码大小 = %x (%d) \"\n\n#: peinfounit.rspesizeofheader\n#, object-pascal-format\nmsgid \"Size Of Headers = %x \"\nmsgstr \"头大小 = %x \"\n\n#: peinfounit.rspesizeofheapcommit\n#, object-pascal-format\nmsgid \"Size Of Heap Commit = %x \"\nmsgstr \"堆提交大小 = %x \"\n\n#: peinfounit.rspesizeofheapreserve\n#, object-pascal-format\nmsgid \"Size Of Heap Reserve = %x \"\nmsgstr \"堆保留大小 = %x \"\n\n#: peinfounit.rspesizeofimage\n#, object-pascal-format\nmsgid \"Size Of Image = %x \"\nmsgstr \"图像大小 = %x \"\n\n#: peinfounit.rspesizeofinitializeddata\n#, object-pascal-format\nmsgid \"Size of initialized data = %x (%d)\"\nmsgstr \"初始化数据大小 = %x (%d)\"\n\n#: peinfounit.rspesizeofrawdata\n#, object-pascal-format\nmsgid \"size of raw data=%x\"\nmsgstr \"原始数据大小=%x\"\n\n#: peinfounit.rspesizeofstackcommit\n#, object-pascal-format\nmsgid \"Size Of Stack Commit = %x \"\nmsgstr \"堆栈提交大小 = %x \"\n\n#: peinfounit.rspesizeofstackreserve\n#, object-pascal-format\nmsgid \"Size Of Stack Reserve = %x \"\nmsgstr \"堆栈保留大小 = %x \"\n\n#: peinfounit.rspesizeofuninitializeddata\n#, object-pascal-format\nmsgid \"Size of uninitialized data = %x (%d) \"\nmsgstr \"未初始化数据大小 = %x (%d) \"\n\n#: peinfounit.rspestaticaddresses\nmsgid \"Static addresses\"\nmsgstr \"静态地址\"\n\n#: peinfounit.rspesubsystem\n#, object-pascal-format\nmsgid \"Subsystem = %x \"\nmsgstr \"子系统 = %x \"\n\n#: peinfounit.rspesymbolcount\n#, object-pascal-format\nmsgid \"Symbolcount = %x\"\nmsgstr \"符号计数 = %x\"\n\n#: peinfounit.rspesymboltableat\n#, object-pascal-format\nmsgid \"SymbolTable at %x\"\nmsgstr \"符号表在 %x\"\n\n#: peinfounit.rspesystemfile\nmsgid \"System file, \"\nmsgstr \"系统文件，\"\n\n#: peinfounit.rspetheheaderofthemodelecouldnobberead\nmsgid \"The header of the module could not be read\"\nmsgstr \"模块的头部无法读取\"\n\n#: peinfounit.rspetheimagesizeismorethan256\nmsgid \"The imagesize is more than 256 MB, is this the correct ammount? If not, edit here\"\nmsgstr \"图像大小超过 256 MB，这个数量正确吗？如果不正确，请在这里编辑\"\n\n#: peinfounit.rspethisisnotavakidpefile\nmsgid \"This is not a valid PE file\"\nmsgstr \"这不是一个有效的 PE 文件\"\n\n#: peinfounit.rspetimedatastamp\n#, object-pascal-format\nmsgid \"Time datastamp=%x\"\nmsgstr \"时间数据戳=%x\"\n\n#: peinfounit.rspetimedate\n#, object-pascal-format\nmsgid \"Time/Date =%d\"\nmsgstr \"时间/日期 =%d\"\n\n#: peinfounit.rspetimedatestamp\n#, object-pascal-format\nmsgid \"TimeDateStamp=%x (0=not bound -1=bound, and timestamp)\"\nmsgstr \"时间日期戳=%x (0=未绑定 -1=已绑定，和时间戳)\"\n\n#: peinfounit.rspetlstable\nmsgid \"TLS table\"\nmsgstr \"TLS 表\"\n\n#: peinfounit.rspetype\n#, object-pascal-format\nmsgid \"Type = %d\"\nmsgstr \"类型 = %d\"\n\n#: peinfounit.rspeuninitializeddata\nmsgid \"Uninitialized data, \"\nmsgstr \"未初始化的数据，\"\n\n#: peinfounit.rspeupsystemonly\nmsgid \"UP system only, \"\nmsgstr \"仅限 UP 系统，\"\n\n#: peinfounit.rspevirtualaddress\n#, object-pascal-format\nmsgid \"Virtual Address=%x\"\nmsgstr \"虚拟地址=%x\"\n\n#: peinfounit.rspevirtualaddressbase\n#, object-pascal-format\nmsgid \"Virtual address base: %.8x (size=%x (%d))\"\nmsgstr \"虚拟地址基址：%.8x (大小=%x (%d))\"\n\n#: peinfounit.rspevirtualsize\n#, object-pascal-format\nmsgid \"Virtual Size=%x\"\nmsgstr \"虚拟大小=%x\"\n\n#: peinfounit.rspewin32versionvalue\n#, object-pascal-format\nmsgid \"Win32 Version Value = %x \"\nmsgstr \"Win32 版本值 = %x \"\n\n#: peinfounit.rspewritablememory\nmsgid \"writable memory, \"\nmsgstr \"可写内存，\"\n\n#: peinfounit.rsthisisnotavalidimage\nmsgid \"This is not a valid image\"\nmsgstr \"这不是一个有效的图像\"\n\n#: plugin.rserrordisabling\n#, object-pascal-format\nmsgid \"Error disabling %s\"\nmsgstr \"禁用 %s 时出错\"\n\n#: plugin.rserrorenabling\n#, object-pascal-format\nmsgid \"Error enabling %s\"\nmsgstr \"启用 %s 时出错\"\n\n#: plugin.rserrorloadingonlydllfilesareallowed\n#, object-pascal-format\nmsgid \"Error loading %s. Only DLL files are allowed\"\nmsgstr \"加载 %s 时出错。仅允许 DLL 文件\"\n\n#: plugin.rserrorloadingthedllismissingtheceplugin_getversione\n#, object-pascal-format\nmsgid \"Error loading %s. The dll is missing the CEPlugin_GetVersion export\"\nmsgstr \"加载 %s 时出错。该 dll 缺少 CEPlugin_GetVersion 导出\"\n\n#: plugin.rserrorloadingthedllismissingtheceplugin_getversionf\n#, object-pascal-format\nmsgid \"Error loading %s. The dll is missing the CEPlugin_GetVersion function\"\nmsgstr \"加载 %s 时出错。该 dll 缺少 CEPlugin_GetVersion 函数\"\n\n#: plugin.rserrorloadingthegetversionfunctionreturnedfalse\n#, object-pascal-format\nmsgid \"Error loading %s. The GetVersion function returned FALSE\"\nmsgstr \"加载 %s 时出错。GetVersion 函数返回 FALSE\"\n\n#: plugin.rserrorloadingthisdllrequiresanewerversionofcetofunc\n#, object-pascal-format\nmsgid \"Error loading %s. This dll requires a newer version of ce to function properly\"\nmsgstr \"加载 %s 时出错。此 dll 需要较新版本的 CE 才能正常工作\"\n\n#: plugin.rsismissingtheceplugin_disablepluginexport\n#, object-pascal-format\nmsgid \"%s is missing the CEPlugin_DisablePlugin export\"\nmsgstr \"%s 缺少 CEPlugin_DisablePlugin 导出\"\n\n#: plugin.rsismissingtheceplugin_initializepluginexport\n#, object-pascal-format\nmsgid \"%s is missing the CEPlugin_InitializePlugin export\"\nmsgstr \"%s 缺少 CEPlugin_InitializePlugin 导出\"\n\n#: plugin.rsplugtheplugindllcouldnotbeloaded\nmsgid \"The plugin dll could not be loaded:\"\nmsgstr \"插件 dll 无法加载：\"\n\n#: pluginexports.rsloadmodulefailed\nmsgid \"LoadModule failed\"\nmsgstr \"加载模块失败\"\n\n#: pointerscanconnector.rserrorwhileconnecting\nmsgid \"Error while connecting: \"\nmsgstr \"连接时出错：\"\n\n#: pointerscanconnector.rsinvalidresponsefrom\nmsgid \"invalid response from \"\nmsgstr \"无效的响应来自\"\n\n#: pointerscanconnector.rssomeoneforgottogivethisconnector\nmsgid \"Someone forgot to give this connector an OnConnected event...\"\nmsgstr \"有人忘记给这个连接器一个 OnConnected 事件...\"\n\n#: pointerscancontroller.rsallpathsreceived\nmsgid \"All paths received\"\nmsgstr \"所有路径已接收\"\n\n#: pointerscancontroller.rsfailurecopyingtargetprocessmemory\nmsgid \"Failure copying target process memory\"\nmsgstr \"复制目标进程内存失败\"\n\n#: pointerscancontroller.rsinvaliddata\nmsgid \"invalid data:\"\nmsgstr \"无效数据：\"\n\n#: pointerscancontroller.rsnoupdatefromtheclientforover120sec\nmsgid \"No update from the client for over 120 seconds\"\nmsgstr \"客户端超过 120 秒没有更新\"\n\n#: pointerscancontroller.rspscachildtriedtoconnect\nmsgid \"A child tried to connect\"\nmsgstr \"一个子进程尝试连接\"\n\n#: pointerscancontroller.rspscalreadystillconnectedtothischild\nmsgid \"Already/still connected to this child\"\nmsgstr \"已经/仍然连接到这个子进程\"\n\n#: pointerscancontroller.rspscaparenttriedtoconnect\nmsgid \"A parent tried to connect\"\nmsgstr \"一个父进程尝试连接\"\n\n#: pointerscancontroller.rspscchildisntidlewhilepreviouslyitwas\nmsgid \"child isn't idle while previously it was...\"\nmsgstr \"子进程不再空闲，而之前是空闲的...\"\n\n#: pointerscancontroller.rspscduringscanfinishing\nmsgid \"During scan finishing: \"\nmsgstr \"在扫描完成期间：\"\n\n#: pointerscancontroller.rspscerror\nmsgid \" (Error: \"\nmsgstr \"（错误：\"\n\n#: pointerscancontroller.rspscfailuretobindport\nmsgid \"Failure to bind port \"\nmsgstr \"绑定端口失败\"\n\n#: pointerscancontroller.rspscfailuretolisten\nmsgid \"Failure to listen\"\nmsgstr \"监听失败\"\n\n#: pointerscancontroller.rspscforsomeunknownreasontheuntrustedchildisntidleanymore\nmsgid \"For some unknown reason the untrusted child isn't idle anymore\"\nmsgstr \"由于某种未知原因，不受信任的子进程不再空闲\"\n\n#: pointerscancontroller.rspschelloafterinitializtion\nmsgid \"HELLO after initializtion\"\nmsgstr \"初始化后你好\"\n\n#: pointerscancontroller.rspscimpossibleerroruseloadedpointermapwasfalseetc\nmsgid \"Impossible error: UseLoadedPointermap was false when a child message got handled\"\nmsgstr \"不可能的错误：当处理子消息时 UseLoadedPointermap 为 false\"\n\n#: pointerscancontroller.rspscinvalidchildpassword\nmsgid \"Invalid child password\"\nmsgstr \"无效的子进程密码\"\n\n#: pointerscancontroller.rspscinvalidcommandwhilewaitingforhello\nmsgid \"Invalid command while waiting for hello\"\nmsgstr \"在等待 hello 时无效的命令\"\n\n#: pointerscancontroller.rspscinvalidhandshakesignature\nmsgid \"Invalid handshake signature\"\nmsgstr \"无效的握手签名\"\n\n#: pointerscancontroller.rspscinvalidmessage\nmsgid \"Invalid message\"\nmsgstr \"无效的消息\"\n\n#: pointerscancontroller.rspscinvalidmessagereceived\nmsgid \"Invalid message received\"\nmsgstr \"接收到无效的消息\"\n\n#: pointerscancontroller.rspscinvalidparentpassword\nmsgid \"Invalid parent password\"\nmsgstr \"无效的父进程密码\"\n\n#: pointerscancontroller.rspscinvalidqueuefile\nmsgid \"Invalid queue file\"\nmsgstr \"无效的队列文件\"\n\n#: pointerscancontroller.rspscinvalidreplyforpsupdatereplycmdcurrentscanhasended\nmsgid \"Invalid reply for PSUPDATEREPLYCMD_CURRENTSCANHASENDED\"\nmsgstr \"PSUPDATEREPLYCMD_CURRENTSCANHASENDED 的无效回复\"\n\n#: pointerscancontroller.rspscinvalidresultreceivedafteruploadingthescanresults\nmsgid \"Invalid result received after uploading the scanresults\"\nmsgstr \"上传扫描结果后接收到无效的结果\"\n\n#: pointerscancontroller.rspscinvalidresultreceivedfrompsupdatereplycmdherearesomepaths\nmsgid \"Invalid result received from PSUPDATEREPLYCMD_HEREARESOMEPATHS\"\nmsgstr \"从 PSUPDATEREPLYCMD_HEREARESOMEPATHS 接收到无效的结果\"\n\n#: pointerscancontroller.rspscinvalidscandatareceivedfilecount\nmsgid \"Invalid scandata received. filecount=0\"\nmsgstr \"接收到无效的扫描数据。文件数量=0\"\n\n#: pointerscancontroller.rspscinvalidupdatestatusreplyreceived\nmsgid \"Invalid UpdateStatus reply received\"\nmsgstr \"接收到无效的 UpdateStatus 回复\"\n\n#: pointerscancontroller.rspscnewscanstartedwhilenotdone\nmsgid \"New scan started while not done\"\nmsgstr \"在未完成时启动新扫描\"\n\n#: pointerscancontroller.rspscnoresumeptrfilereaderpresent\nmsgid \"no resume ptr file reader present\"\nmsgstr \"没有恢复指针文件读取器\"\n\n#: pointerscancontroller.rspscparentdidntrespondproperlytopscmdprepareformytermination\nmsgid \"Parent didn't respond properly to PSCMD_PREPAREFORMYTERMINATION\"\nmsgstr \"父进程未正确响应 PSCMD_PREPAREFORMYTERMINATION\"\n\n#: pointerscancontroller.rspscsleeping\nmsgid \":Sleeping\"\nmsgstr \":睡眠中\"\n\n#: pointerscancontroller.rspscsuccesfullysentscandatatochild\nmsgid \"Succesfully sent scandata to child\"\nmsgstr \"成功将扫描数据发送到子进程\"\n\n#: pointerscancontroller.rspscterminated\nmsgid \":Terminated\"\nmsgstr \":已终止\"\n\n#: pointerscancontroller.rspscthechilddidntrespondtopsupdatereplycmdeverythingokasexpected\nmsgid \"The child didn't respond to PSUPDATEREPLYCMD_EVERYTHINGOK as expected\"\nmsgstr \"子进程未按预期响应 PSUPDATEREPLYCMD_EVERYTHINGOK\"\n\n#: pointerscancontroller.rspscthechildissendingmeresultsofadifferentscan\nmsgid \"The child is sending me results of a different scan\"\nmsgstr \"子进程正在向我发送不同扫描的结果\"\n\n#: pointerscancontroller.rspscthechildtriedtosendanegativeamount\nmsgid \"The child tried to send a negative amount\"\nmsgstr \"子进程尝试发送负数\"\n\n#: pointerscancontroller.rspscthechildtriedtosendmeresultswhileiwasstillbusy\nmsgid \"The child tried to send me results while I was still busy\"\nmsgstr \"子进程在我仍然忙碌时尝试向我发送结果\"\n\n#: pointerscancontroller.rspscthechildtriedtosendmorepathsatoncethanallowed\nmsgid \"The child tried to send more paths at once than allowed\"\nmsgstr \"子进程尝试一次发送超过允许的路径数量\"\n\n#: pointerscancontroller.rspscthechildtriedtosendmorepathsthanallowedafterarequest\nmsgid \"The child tried to send more paths than allowed after a request\"\nmsgstr \"子进程在请求后尝试发送超过允许的路径数量\"\n\n#: pointerscancontroller.rspsctheparenttriedtosendmeanegativeammountofpaths\nmsgid \"The parent tried to send me a negative ammount of paths\"\nmsgstr \"父进程尝试向我发送负数量的路径\"\n\n#: pointerscancontroller.rspsctheparenttriedtosendmemorepathsthanallowedaafterupdate\nmsgid \"The parent tried to send me more paths than allowed (after update)\"\nmsgstr \"父进程在更新后尝试向我发送超过允许的路径数量\"\n\n#: pointerscancontroller.rspscthepointerlisthandlerwasdestroyedwithoutagoodreason\nmsgid \"The pointerlisthandler was destroyed without a good reason\"\nmsgstr \"指针列表处理程序在没有充分理由的情况下被销毁\"\n\n#: pointerscancontroller.rspscthescanwasterminated\nmsgid \"The scan was terminated\"\nmsgstr \"扫描已终止\"\n\n#: pointerscancontroller.rspsctheuploadwasterminated\nmsgid \"The upload was terminated\"\nmsgstr \"上传已终止\"\n\n#: pointerscancontroller.rspscworking\nmsgid \":Working\"\nmsgstr \":工作中\"\n\n#: pointerscancontroller.rspscwritingtodisk\nmsgid \":Writing to disk\"\nmsgstr \":正在写入磁盘\"\n\n#: pointerscancontroller.rssavingpointermap\nmsgid \"Saving pointermap\"\nmsgstr \"保存指针映射\"\n\n#: pointerscannerfrm.rsaddressspecifiersfoundinthewholeprocess\nmsgid \"Address specifiers found in the whole process\"\nmsgstr \"在整个进程中发现地址说明符\"\n\n#: pointerscannerfrm.rsareyousureyouwishyouforceadisconnect\nmsgid \"Are you sure you wish you force a disconnect. The current paths will be lost\"\nmsgstr \"你确定要强制断开连接吗？当前路径将会丢失\"\n\n#: pointerscannerfrm.rsceinjectedpointerscan\nmsgid \"CE Injected Pointerscan\"\nmsgstr \"CE 注入指针扫描\"\n\n#: pointerscannerfrm.rscurrentlevel\nmsgid \"Current Level\"\nmsgstr \"当前级别\"\n\n#: pointerscannerfrm.rserrorduringscan\nmsgid \"Error during scan\"\nmsgstr \"扫描期间出错\"\n\n#: pointerscannerfrm.rsevaluated\nmsgid \"Evaluated\"\nmsgstr \"已评估\"\n\n#: pointerscannerfrm.rsgeneratingpointermap\nmsgid \"Generating pointermap...\"\nmsgstr \"正在生成指针映射...\"\n\n#: pointerscannerfrm.rsisnotavalid4bytevalue\n#, object-pascal-format\nmsgid \"%s is not a valid 4 byte value\"\nmsgstr \"%s 不是有效的 4 字节值\"\n\n#: pointerscannerfrm.rsisnotavaliddoublevalue\n#, object-pascal-format\nmsgid \"%s is not a valid double value\"\nmsgstr \"%s 不是有效的双精度值\"\n\n#: pointerscannerfrm.rsisnotavalidfloatingpointvalue\n#, object-pascal-format\nmsgid \"%s is not a valid floating point value\"\nmsgstr \"%s 不是有效的浮点值\"\n\n#: pointerscannerfrm.rslookingfor\nmsgid \"Looking for\"\nmsgstr \"正在寻找\"\n\n#: pointerscannerfrm.rsonlythefirst1000000entrieswillbedisplayed\nmsgid \"\"\n\"Only the first 1000000 entries will be displayed. Rescan will still work with all results.  (This is normal for a \"\n\"pointerscan, you MUST do a few rescans)\"\nmsgstr \"仅显示前 1000000 条条目。重新扫描仍将对所有结果有效。（这对于指针扫描是正常的，你必须进行几次重新扫描）\"\n\n#: pointerscannerfrm.rsoutofdiskspacecleanupthediskorstop\nmsgid \"OUT OF DISKSPACE! Clean up the disk or stop\"\nmsgstr \"磁盘空间不足！清理磁盘或停止\"\n\n#: pointerscannerfrm.rspointercount\nmsgid \"Pointer paths\"\nmsgstr \"指针路径\"\n\n#: pointerscannerfrm.rspointerpathsfound\nmsgid \"Pointer paths found\"\nmsgstr \"找到的指针路径\"\n\n#: pointerscannerfrm.rspointerscanresult\nmsgid \"pointerscan result\"\nmsgstr \"指针扫描结果\"\n\n#: pointerscannerfrm.rspointsto\nmsgid \"Points to\"\nmsgstr \"指向\"\n\n#: pointerscannerfrm.rspsactive\nmsgid \" (Active)\"\nmsgstr \" （活动）\"\n\n#: pointerscannerfrm.rspschildren\nmsgid \"Children:\"\nmsgstr \"子项：\"\n\n#: pointerscannerfrm.rspsconnectingto\nmsgid \"Connecting to:\"\nmsgstr \"连接到：\"\n\n#: pointerscannerfrm.rspsdisconnected\nmsgid \" (Disconnected)\"\nmsgstr \" （已断开连接）\"\n\n#: pointerscannerfrm.rspsdownloadingandhandlingresults\nmsgid \" (Downloading and handling results)\"\nmsgstr \" （正在下载和处理结果）\"\n\n#: pointerscannerfrm.rspsdownloadingscandata\n#, object-pascal-format\nmsgid \"Downloading scandata: %.1f%% (%dKB/%dKB : %d KB/sec)\"\nmsgstr \"下载扫描数据：%.1f%% (%dKB/%dKB : %d KB/秒)\"\n\n#: pointerscannerfrm.rspsdoyouwishtoresumethecurrentpointerscanatalatertime\nmsgid \"Do you wish to resume the current pointerscan at a later time?\"\nmsgstr \"你希望稍后恢复当前的指针扫描吗？\"\n\n#: pointerscannerfrm.rspsdynamicqueusize\nmsgid \" Dynamic queue size:\"\nmsgstr \" 动态队列大小：\"\n\n#: pointerscannerfrm.rspsexportaborted\nmsgid \"Export aborted\"\nmsgstr \"导出中止\"\n\n#: pointerscannerfrm.rspsexporting\nmsgid \"Exporting...\"\nmsgstr \"正在导出...\"\n\n#: pointerscannerfrm.rspsexporttodatabase\nmsgid \"Export to database\"\nmsgstr \"导出到数据库\"\n\n#: pointerscannerfrm.rspsexporttodatabasebiggersizeornot\nmsgid \"Do you want \\\"result\\\" table with indexes and keys? It will take up additional disk space.\"\nmsgstr \"你想要带有索引和键的“结果”表吗？这将占用额外的磁盘空间。\"\n\n#: pointerscannerfrm.rspsexporttodatabasebiggersizeornot_resultid\nmsgid \"Do you want resultid column filled? It will take up additional disk space.\"\nmsgstr \"你想填充 resultid 列吗？这将占用额外的磁盘空间。\"\n\n#: pointerscannerfrm.rspsfindbyaddresspart1\nmsgid \"Find by address requires an address. \\\"\"\nmsgstr \"按地址查找需要一个地址。“\"\n\n#: pointerscannerfrm.rspsfindbyaddresspart2\nmsgid \"\\\" is not a valid address\"\nmsgstr \"” 不是有效的地址\"\n\n#: pointerscannerfrm.rspsgiveanamefortheseresults\nmsgid \"Give a name for these results\"\nmsgstr \"为这些结果命名\"\n\n#: pointerscannerfrm.rspsidle\nmsgid \" (Idle)\"\nmsgstr \" （空闲）\"\n\n#: pointerscannerfrm.rspsimporting\nmsgid \"Importing...\"\nmsgstr \"正在导入...\"\n\n#: pointerscannerfrm.rspsimporting_sortmethod\nmsgid \"Do you wish to use offsets sum for sorting?\"\nmsgstr \"你希望使用偏移量总和进行排序吗？\"\n\n#: pointerscannerfrm.rspsimporting_sortornot\nmsgid \"Do you wish to sort pointerlist by level, then module, then offsets?\"\nmsgstr \"你希望按级别、模块、然后偏移量对指针列表进行排序吗？\"\n\n#: pointerscannerfrm.rspsinvaliddatabase\nmsgid \"Invalid database\"\nmsgstr \"无效的数据库\"\n\n#: pointerscannerfrm.rspslastupdate\nmsgid \"Last update: \"\nmsgstr \"最后更新：\"\n\n#: pointerscannerfrm.rspslowestknownpath\nmsgid \"Lowest known path:\"\nmsgstr \"已知最低路径：\"\n\n#: pointerscannerfrm.rspsparent\nmsgid \"Parent: \"\nmsgstr \"父项：\"\n\n#: pointerscannerfrm.rspsparentdisconnectedwaitingforreconnect\nmsgid \"Parent: <disconnected> (Waiting for reconnect)\"\nmsgstr \"父级：<disconnected>（等待重新连接）\"\n\n#: pointerscannerfrm.rspsparentnone\nmsgid \"Parent: <none>\"\nmsgstr \"父级：<none>\"\n\n#: pointerscannerfrm.rspspathsevaluated\nmsgid \"Paths evaluated: \"\nmsgstr \"评估的路径：\"\n\n#: pointerscannerfrm.rspspathsseconds\n#, object-pascal-format\nmsgid \"Paths / seconds: (%.0n / s)\"\nmsgstr \"路径/秒：（%.0n / s）\"\n\n#: pointerscannerfrm.rspspscanguiupdatetimererror\nmsgid \"pscangui update timer error: \"\nmsgstr \"pscangui 更新计时器错误：\"\n\n#: pointerscannerfrm.rspsqueued\nmsgid \" (Queued: \"\nmsgstr \"（排队： \"\n\n#: pointerscannerfrm.rspsqueuesize\nmsgid \"Queuesize: \"\nmsgstr \"队列大小：\"\n\n#: pointerscannerfrm.rspsrescanning\nmsgid \"Rescanning\"\nmsgstr \"重新扫描\"\n\n#: pointerscannerfrm.rspsresultsfound\nmsgid \"Results found: \"\nmsgstr \"找到的结果：\"\n\n#: pointerscannerfrm.rspsscanduration\nmsgid \"Scan duration: \"\nmsgstr \"扫描持续时间：\"\n\n#: pointerscannerfrm.rspssecondsago\nmsgid \" seconds ago\"\nmsgstr \" 秒前\"\n\n#: pointerscannerfrm.rspsstaticqueuesize\nmsgid \"Static queue size: \"\nmsgstr \"静态队列大小：\"\n\n#: pointerscannerfrm.rspsstatistics\nmsgid \"Statistics\"\nmsgstr \"统计信息\"\n\n#: pointerscannerfrm.rspsthereisalreadyapointerfilewiththsinamepresentinthisdatabase\nmsgid \"There is already a pointerfile with this name present in this database. Replace it's content with this one ?\"\nmsgstr \"数据库中已经存在同名的指针文件。是否用这个内容替换它的内容？\"\n\n#: pointerscannerfrm.rspsthisdatabasedoesntcontainanypointerfiles\nmsgid \"This database does not contain any pointer files\"\nmsgstr \"此数据库不包含任何指针文件\"\n\n#: pointerscannerfrm.rspsthreadcount\nmsgid \"Threadcount: \"\nmsgstr \"线程数：\"\n\n#: pointerscannerfrm.rspstimespentwriting\nmsgid \"Time spent writing: \"\nmsgstr \"写入花费的时间：\"\n\n#: pointerscannerfrm.rspstotalpathsevaluater\nmsgid \"Total paths evaluated: \"\nmsgstr \"评估的总路径：\"\n\n#: pointerscannerfrm.rspstotalpathsseconds\n#, object-pascal-format\nmsgid \"Total paths / seconds: (%.0n / s)\"\nmsgstr \"总路径/秒：（%.0n / s）\"\n\n#: pointerscannerfrm.rspstotalqueuesize\nmsgid \"Total Queuesize: \"\nmsgstr \"总队列大小：\"\n\n#: pointerscannerfrm.rspstrusted\nmsgid \" (Trusted)\"\nmsgstr \"（受信任）\"\n\n#: pointerscannerfrm.rspstrusted2\nmsgid \"Trusted: \"\nmsgstr \"受信任：\"\n\n#: pointerscannerfrm.rspsuniquepointervaluesintarget\nmsgid \"Unique pointervalues in target:\"\nmsgstr \"目标中的唯一指针值：\"\n\n#: pointerscannerfrm.rspsuploadingscandata\n#, object-pascal-format\nmsgid \" (Uploading scandata: %.1f%% (%dKB/%dKB : %d KB/sec)\"\nmsgstr \"（上传扫描数据：%.1f%%（%dKB/%dKB : %d KB/秒）\"\n\n#: pointerscannerfrm.rssleeping\nmsgid \"Sleeping\"\nmsgstr \"睡眠中\"\n\n#: pointerscannerfrm.rsterminating\nmsgid \"Terminating\"\nmsgstr \"终止中\"\n\n#: pointerscannerfrm.rstime\nmsgid \"Time\"\nmsgstr \"时间\"\n\n#: pointerscannerfrm.rswritingtodisk\nmsgid \"Writing to disk\"\nmsgstr \"写入磁盘\"\n\n#: pointerscannersettingsfrm.rscouldnotberesolvedtoanipaddress\nmsgid \"could not be resolved to an IP address\"\nmsgstr \"无法解析为 IP 地址\"\n\n#: pointerscannersettingsfrm.rsfilename\nmsgid \"Filename\"\nmsgstr \"文件名\"\n\n#: pointerscannersettingsfrm.rshasaninvalidport\n#, object-pascal-format\nmsgid \"%s has an invalid port (%s)\"\nmsgstr \"%s 的端口无效（%s）\"\n\n#: pointerscannersettingsfrm.rshasnotbeengivenavalidaddress\n#, object-pascal-format\nmsgid \"%s has not been given a valid address\"\nmsgstr \"%s 未提供有效地址\"\n\n#: pointerscannersettingsfrm.rsmaxdeviation\nmsgid \"Max deviation\"\nmsgstr \"最大偏差\"\n\n#: pointerscannersettingsfrm.rsmaxdeviationexplentation\nmsgid \"The maximum offset size by which the ending offset can differ\"\nmsgstr \"结束偏移量可以不同的最大偏移量大小\"\n\n#: pointerscannersettingsfrm.rsnocomparefiles\nmsgid \"\"\n\"If you do not use the compare results with other saved pointermap option you will get billions of useless results and \"\n\"giga/terrabytes of wasted diskspace and rescans will take hours if not days. Are you sure ?\"\nmsgstr \"如果不使用与其他保存的指针图比较结果的选项，你将得到数十亿个无用的结果和数千兆/太字节的浪费磁盘空间，重新扫描将需要数小时甚至数天。你确定吗？\"\n\n#: pointerscannersettingsfrm.rspleasefillinanaddresstolookfor\nmsgid \"Please fill in an address to look for\"\nmsgstr \"请填写一个地址以进行查找\"\n\n#: pointerscannersettingsfrm.rsreusedthesamefile\nmsgid \"This file is already in the list of scandata files to be used\"\nmsgstr \"此文件已在要使用的扫描数据文件列表中\"\n\n#: pointerscannersettingsfrm.rsscandatafilter\nmsgid \"All files (*.*)|*.*|Scan Data (*.scandata)|*.scandata\"\nmsgstr \"所有文件 (*.*)|*.*|扫描数据 (*.scandata)|*.scandata\"\n\n#: pointerscannersettingsfrm.rsselectafile\nmsgid \"<Select a file>\"\nmsgstr \"选择一个文件\"\n\n#: pointerscannersettingsfrm.strmaxoffsetsisstupid\nmsgid \"Sorry, but the max offsets should be 1 or higher, or else disable the checkbox\"\nmsgstr \"抱歉，但最大偏移量应为 1 或更高，否则请禁用复选框\"\n\n#: pointerscanresultreader.rsbuggedlist\nmsgid \"BuggedList\"\nmsgstr \"BuggedList\"\n\n#: pointerscanresultreader.rspsrcorruptedpointerscanfile\nmsgid \"Corrupted pointerscan file\"\nmsgstr \"损坏的指针扫描文件\"\n\n#: pointerscanresultreader.rspsrinvalidpointerscanfileversion\nmsgid \"Invalid pointerscan file version\"\nmsgstr \"无效的指针扫描文件版本\"\n\n#: pointerscansettingsipconnectionlist.rspssiclstable\nmsgid \"Stable\"\nmsgstr \"稳定\"\n\n#: pointervaluelist.rsallocatingbytestobuffer\n#, object-pascal-format\nmsgid \"Allocating %s bytes to 'buffer'\"\nmsgstr \"分配 %s 字节到 'buffer'\"\n\n#: pointervaluelist.rspointervaluesetuperror\nmsgid \"Pointer value setup error\"\nmsgstr \"指针值设置错误\"\n\n#: processwindowunit.rsattachdebuggerornot\nmsgid \"\"\n\"Are you sure you want to attach the debugger and not just open this process? (You can later on always attach the \"\n\"debugger)\"\nmsgstr \"你确定要附加调试器而不是仅仅打开此进程吗？（你可以稍后始终附加调试器）\"\n\n#: processwindowunit.rsentertheprocessid\nmsgid \"Enter the ProcessID\"\nmsgstr \"输入进程 ID\"\n\n#: processwindowunit.rsmanualpid\nmsgid \"Manual PID\"\nmsgstr \"手动 PID\"\n\n#: processwindowunit.rsoptionallaunchparameters\nmsgid \"Optional launch parameters\"\nmsgstr \"可选启动参数\"\n\n#: processwindowunit.rspleaseselectanotherprocess\nmsgid \"Please select another process\"\nmsgstr \"请选择另一个进程\"\n\n#: processwindowunit.rsprocesslistlong\nmsgid \"Process List(long)\"\nmsgstr \"进程列表（长）\"\n\n#: processwindowunit.rsscanningclicktostop\nmsgid \"Scanning (Click to stop)\"\nmsgstr \"扫描中（点击停止）\"\n\n#: processwindowunit.rswhatareyoulookingfor\nmsgid \"What are you looking for?\"\nmsgstr \"你在寻找什么？\"\n\n#: savedisassemblyfrm.rscopydisassembledoutput\nmsgid \"Copy disassembled output\"\nmsgstr \"复制反汇编输出\"\n\n#: savedisassemblyfrm.rsstopcopying\nmsgid \"Stop copying\"\nmsgstr \"停止复制\"\n\n#: savedisassemblyfrm.rsstopsaving\nmsgid \"Stop saving\"\nmsgstr \"停止保存\"\n\n#: savedscanhandler.rsfailureinfindinginthefirstscanresults\n#, object-pascal-format\nmsgid \"Failure in finding %s in the first scan results\"\nmsgstr \"在第一次扫描结果中未能找到 %s\"\n\n#: savedscanhandler.rsfailureinfindinginthepreviousscanresults\n#, object-pascal-format\nmsgid \"Failure in finding %s in the previous scan results\"\nmsgstr \"在之前的扫描结果中未能找到 %s\"\n\n#: savedscanhandler.rsinvalidorderofcallinggetpointertoaddress\nmsgid \"Invalid order of calling getpointertoaddress\"\nmsgstr \"调用 getpointertoaddress 的顺序无效\"\n\n#: savedscanhandler.rsmaxaddresslistcountis0meanstheaddresslistisbad\nmsgid \"maxaddresslistcount is 0 (Means: the addresslist is bad)\"\nmsgstr \"maxaddresslistcount 为 0（意味着：地址列表无效）\"\n\n#: savedscanhandler.rsnofirstscandatafilesfound\nmsgid \"No first scan data files found\"\nmsgstr \"未找到第一次扫描数据文件\"\n\n#: speedhack2.rsfailureconfiguringspeedhackpart\nmsgid \"Failure configuring speedhack part\"\nmsgstr \"配置速度黑客部分失败\"\n\n#: speedhack2.rsfailureenablingspeedhackdllinjectionfailed\nmsgid \"Failure enabling speedhack. (DLL injection failed)\"\nmsgstr \"启用速度黑客失败。（DLL 注入失败）\"\n\n#: speedhack2.rsfailuresettingspeed\nmsgid \"Failure setting speed\"\nmsgstr \"设置速度失败\"\n\n#: structuresfrm.rshowmanybytesdoyouwanttoshiftthisandfollowingoffset\nmsgid \"How many bytes do you want to shift this and following offsets?\"\nmsgstr \"你想要移动多少字节到这个和后面的偏移量？\"\n\n#: structuresfrm2.rs2bytewithvalue2\n#, object-pascal-format\nmsgid \"2 Byte: %s\"\nmsgstr \"2 字节：%s\"\n\n#: structuresfrm2.rsaddressvalue\nmsgid \"Address: Value\"\nmsgstr \"地址：值\"\n\n#: structuresfrm2.rsarrayofbyte\nmsgid \"Array of Byte\"\nmsgstr \"字节数组\"\n\n#: structuresfrm2.rsbytewithvalue\n#, object-pascal-format\nmsgid \"Byte: %s\"\nmsgstr \"字节：%s\"\n\n#: structuresfrm2.rschangegroup2\nmsgid \"Change Group\"\nmsgstr \"更改组\"\n\n#: structuresfrm2.rschanges\nmsgid \"Changes\"\nmsgstr \"更改\"\n\n#: structuresfrm2.rscreatenewstructurefromchanged\nmsgid \"Create new structure from changed\"\nmsgstr \"从更改中创建新结构\"\n\n#: structuresfrm2.rscreatenewstructurefromunchanged\nmsgid \"Create new structure from unchanged\"\nmsgstr \"从未更改中创建新结构\"\n\n#: structuresfrm2.rsdefinepointer\nmsgid \"Define pointer\"\nmsgstr \"定义指针\"\n\n#: structuresfrm2.rsdeleteaddress\nmsgid \"Delete address\"\nmsgstr \"删除地址\"\n\n#: structuresfrm2.rsfillintheoffsetyouwanttogoto\nmsgid \"Fill in the Offset you want to go to\"\nmsgstr \"填写你想要去的偏移量\"\n\n#: structuresfrm2.rshex\nmsgid \"(Hex)\"\nmsgstr \"(十六进制)\"\n\n#: structuresfrm2.rshowmanybytesdoyouwanttoshiftthisandfollowingoffset\nmsgid \"How many bytes do you want to shift this and following offsets? (Decimal)\"\nmsgstr \"你想要移动多少字节到这个和后面的偏移量？（十进制）\"\n\n#: structuresfrm2.rslinkwithmemoryview\nmsgid \"Link with memoryview\"\nmsgstr \"与内存视图链接\"\n\n#: structuresfrm2.rslinkwithmemoryviewwindow\nmsgid \"Link with memoryview window\"\nmsgstr \"与内存视图窗口链接\"\n\n#: structuresfrm2.rsnamethenewstructure\nmsgid \"Name the new structure\"\nmsgstr \"给新结构命名\"\n\n#: structuresfrm2.rspointertoinstanceofclassname\n#, object-pascal-format\nmsgid \"Pointer to instance of %s\"\nmsgstr \"指向 %s 实例的指针\"\n\n#: structuresfrm2.rssf2areyousureyouwanttodeleteallthedefinedstructures\nmsgid \"Are you sure you want to delete all the defined structures ?\"\nmsgstr \"你确定要删除所有已定义的结构吗？\"\n\n#: structuresfrm2.rssf2areyousureyouwanttodeletethestructurenamed\nmsgid \"Are you sure you want to delete the structure named :\"\nmsgstr \"你确定要删除名为的结构：\"\n\n#: structuresfrm2.rssf2autocreatedfrom\nmsgid \"Autocreated from \"\nmsgstr \"自动创建自 \"\n\n#: structuresfrm2.rssf2autocreatestructure\nmsgid \"Autocreate structure\"\nmsgstr \"自动创建结构\"\n\n#: structuresfrm2.rssf2autocreatestructuresize\nmsgid \"Autocreate structure size: \"\nmsgstr \"自动创建结构大小：\"\n\n#: structuresfrm2.rssf2defaultsize\nmsgid \"Default size:\"\nmsgstr \"默认大小：\"\n\n#: structuresfrm2.rssf2deletegroup\nmsgid \"Delete group\"\nmsgstr \"删除组\"\n\n#: structuresfrm2.rssf2givethenewname\nmsgid \"Give the new name\"\nmsgstr \"给新名称\"\n\n#: structuresfrm2.rssf2givethenewnameforthegroup\nmsgid \"Give the new name for the group\"\nmsgstr \"给该组的新名称\"\n\n#: structuresfrm2.rssf2givethenewnameforthisstructure\nmsgid \"Give the new name for this structure\"\nmsgstr \"给这个结构的新名称\"\n\n#: structuresfrm2.rssf2grouppicker\nmsgid \"Group picker\"\nmsgstr \"组选择器\"\n\n#: structuresfrm2.rssf2hex\nmsgid \" (Hex)\"\nmsgstr \" （十六进制）\"\n\n#: structuresfrm2.rssf2nameforthisgroup\nmsgid \"Name for this group\"\nmsgstr \"该组的名称\"\n\n#: structuresfrm2.rssf2newcolumnname\nmsgid \"New column name\"\nmsgstr \"新列名称\"\n\n#: structuresfrm2.rssf2newgroup\nmsgid \"<New group>\"\nmsgstr \" <新组> \"\n\n#: structuresfrm2.rssf2newvalueforthisaddress\nmsgid \"New value for this address:\"\nmsgstr \"该地址的新值：\"\n\n#: structuresfrm2.rssf2renamegroup\nmsgid \"Rename group\"\nmsgstr \"重命名组\"\n\n#: structuresfrm2.rssf2secletthegroupthiscolumnshouldbecomepartof\nmsgid \"Select the group this column should become part of\"\nmsgstr \"选择该列应成为的一部分的组\"\n\n#: structuresfrm2.rssf2setnamerename\nmsgid \"Set name/Rename\"\nmsgstr \"设置名称/重命名\"\n\n#: structuresfrm2.rssf2shadowcopyat\n#, object-pascal-format\nmsgid \"Lock ( Shadowcopy at %s )\"\nmsgstr \"锁定（在 %s 的影像副本）\"\n\n#: structuresfrm2.rssf2signed\nmsgid \" (Signed)\"\nmsgstr \" （有符号）\"\n\n#: structuresfrm2.rssf2structurerename\nmsgid \"Structure rename\"\nmsgstr \"结构重命名\"\n\n#: structuresfrm2.rssf2thegapbetweenoffset\n#, object-pascal-format\nmsgid \"The gap between offset %x and %x is %d bytes long. Autofill this?\"\nmsgstr \"偏移量 %x 和 %x 之间的间隙为 %d 字节。自动填充吗？\"\n\n#: structuresfrm2.rssf2thegroupscancommandhasbeencopiedtotheclipboard\nmsgid \"The groupscan command has been copied to the clipboard\"\nmsgstr \"groupscan 命令已复制到剪贴板\"\n\n#: structuresfrm2.rssf2to\nmsgid \" to \"\nmsgstr \" 到 \"\n\n#: structuresfrm2.rssf2tstructcolumncreateerror\nmsgid \"TStructColumn.create Error\"\nmsgstr \"TStructColumn.create 错误\"\n\n#: structuresfrm2.rssf2unknowncustomtype\nmsgid \"Unknown custom type\"\nmsgstr \"未知的自定义类型\"\n\n#: structuresfrm2.rssf2whatnameshouldthiscolumnhave\nmsgid \"What name should this column have?\"\nmsgstr \"这个列应该叫什么名字？\"\n\n#: structuresfrm2.rssignedinteger\nmsgid \"Signed Integer\"\nmsgstr \"有符号整数\"\n\n#: structuresfrm2.rsspider\nmsgid \"Spider\"\nmsgstr \"Spider\"\n\n#: structuresfrm2.rsstopwatchforchanges\nmsgid \"Stop watch for changes\"\nmsgstr \"监视更改\"\n\n#: structuresfrm2.rsstructalreadyexists\n#, object-pascal-format\nmsgid \"\"\n\"This is detected as structure named %s which already exists. Define a new version of this structure? (Click no to go to \"\n\"the existing one)\"\nmsgstr \"这被检测为名为 %s 的结构，该结构已存在。要定义该结构的新版本吗？（点击否以转到现有结构）\"\n\n#: structuresfrm2.rsstructureaccessoutsidemainthread\nmsgid \"Structure access outside of main thread is not allowed. Synchronize first\"\nmsgstr \"不允许在主线程外访问结构。请先同步\"\n\n#: structuresfrm2.rsstructurename\nmsgid \"Structure name\"\nmsgstr \"结构名称\"\n\n#: structuresfrm2.rsthestructuregotchanged\nmsgid \"The structure got changed. Aborting\"\nmsgstr \"结构已更改。正在中止\"\n\n#: structuresfrm2.rsunchanged\nmsgid \"Unchanged\"\nmsgstr \"未更改\"\n\n#: structuresfrm2.rsundefined\nmsgid \"undefined\"\nmsgstr \"未定义\"\n\n#: structuresfrm2.rsunlinkfrommemoryviewwindow\nmsgid \"Unlink from memoryview window\"\nmsgstr \"从内存视图窗口中取消链接\"\n\n#: structuresfrm2.rsunsignedinteger\nmsgid \"Unsigned Integer\"\nmsgstr \"无符号整数\"\n\n#: structuresfrm2.rsupgradepointer\nmsgid \"Upgrade child structure to full structure\"\nmsgstr \"将子结构升级为完整结构\"\n\n#: structuresfrm2.rswarnaboutlessthan2addresses\nmsgid \"It's not recommended to run the structure compare with just one address in a group\"\nmsgstr \"不建议在组中仅使用一个地址运行结构比较\"\n\n#: structuresfrm2.rswasoldvalue\n#, object-pascal-format\nmsgid \"(was %s)\"\nmsgstr \"（曾是 %s）\"\n\n#: structuresfrm2.rswatchforchanges\nmsgid \"Watch for changes\"\nmsgstr \"监视更改\"\n\n#: structuresfrm2.rswhichmemoryviewtolinkwith\nmsgid \"Which memoryview to link with?\"\nmsgstr \"要链接哪个内存视图？\"\n\n#: structuresfrm2.rswrongversion\nmsgid \"\"\n\"This structure file was generated with a newer version of Cheat Engine. (That means there's more than likely a new \"\n\"version so please update....)\"\nmsgstr \"此结构文件是使用较新版本的 Cheat Engine 生成的。（这意味着很可能有新版本，请更新....）\"\n\n#: symbolconfigunit.rsareyousureyouwanttoremoveallsymbolsfromthelist\nmsgid \"Are you sure you want to remove all symbols from the list?\"\nmsgstr \"你确定要从列表中删除所有符号吗？\"\n\n#: symbolconfigunit.rsareyousureyouwanttoremovethissymbolfromthelist\nmsgid \"Are you sure you want to remove this symbol from the list?\"\nmsgstr \"你确定要从列表中删除此符号吗？\"\n\n#: symbolhandler.rsalreadyexists\nmsgid \"already exists\"\nmsgstr \"已存在\"\n\n#: symbolhandler.rserrorallocatingmemory\nmsgid \"Error allocating memory\"\nmsgstr \"分配内存时出错\"\n\n#: symbolhandler.rsfailuredeterminingwhatmeans\n#, object-pascal-format\nmsgid \"Failure determining what %s means\"\nmsgstr \"无法确定 %s 的含义\"\n\n#: symbolhandler.rspleaseprovideabiggersize\nmsgid \"Please provide a bigger size\"\nmsgstr \"请提供更大的尺寸\"\n\n#: symbolhandler.rssymbolloaderthreadhascrashed\nmsgid \"Symbolloaderthread has crashed\"\nmsgstr \"符号加载线程已崩溃\"\n\n#: symbolhandler.rsthesymbolnamedwaspreviouslydeclared\n#, object-pascal-format\nmsgid \"\"\n\"The symbol named %s was previously declared with a size of %s instead of %s. all scripts that use this memory must give \"\n\"the same size. Adjust the size, or delete the old alloc from the userdefined symbol list\"\nmsgstr \"名为 %s 的符号之前声明的大小为 %s，而不是 %s。所有使用此内存的脚本必须给出相同的大小。调整大小，或从用户定义的符号列表中删除旧的分配\"\n\n#: symbolhandler.rsyoucantaddasymbolwithaddress0\nmsgid \"You can't add a symbol with address 0\"\nmsgstr \"你不能添加地址为 0 的符号\"\n\n#: symbolhandler.rsyoucantchangethissettingatthemoment\nmsgid \"You can't change this setting at the moment\"\nmsgstr \"你目前无法更改此设置\"\n\n#: tableconverter.rstoooldtable\nmsgid \"This table is too old to be used. Get Cheat Engine 5.6 and open/resave this table\"\nmsgstr \"此表格太旧，无法使用。请获取 Cheat Engine 5.6 并打开/重新保存此表格\"\n\n#: tabout.button2.caption\nmsgid \"Patreon\"\nmsgstr \"Patreon\"\n\n#: tabout.button2.hint\nmsgid \"If you like Cheat Engine and want to contribute something to the development, join CE's Patreon\"\nmsgstr \"如果你喜欢 Cheat Engine 并想为开发贡献一些东西，请加入 CE 的 Patreon\"\n\n#: tabout.caption\nmsgid \"About Cheat Engine\"\nmsgstr \"关于 Cheat Engine\"\n\n#: tabout.label1.caption\nmsgid \"Made by: Dark Byte\"\nmsgstr \"\"\n\"作者：Dark Byte\\n\"\n\"翻译：B站 @Game-Zone\"\n\n#: tabout.label10.caption\nmsgid \"Script engine powered by Lua\"\nmsgstr \"脚本引擎由 Lua 提供支持\"\n\n#: tabout.label2.caption\nmsgid \"Special thanks to:\"\nmsgstr \"特别感谢：\"\n\n#: tabout.label21.caption\nmsgid \"Metael\"\nmsgstr \"Metael\"\n\n#: tabout.label22.caption\nmsgid \"wh1t3y\"\nmsgstr \"wh1t3y\"\n\n#: tabout.label23.caption\nmsgid \"A. Wiseman\"\nmsgstr \"A. Wiseman\"\n\n#: tabout.label24.caption\nmsgid \"SWAT-Squad\"\nmsgstr \"SWAT-Squad\"\n\n#: tabout.label25.caption\nmsgid \"Psy\"\nmsgstr \"Psy\"\n\n#: tabout.label26.caption\nmsgid \"Kickclock\"\nmsgstr \"Kickclock\"\n\n#: tabout.label27.caption\nmsgid \"Recifense\"\nmsgstr \"Recifense\"\n\n#: tabout.label28.caption\nmsgid \"Geri\"\nmsgstr \"Geri\"\n\n#: tabout.label29.caption\nmsgid \"Emperor\"\nmsgstr \"Emperor\"\n\n#: tabout.label3.caption\nmsgid \"supMarco\"\nmsgstr \"supMarco\"\n\n#: tabout.label30.caption\nmsgid \"Jgoemat\"\nmsgstr \"Jgoemat\"\n\n#: tabout.label31.caption\nmsgid \"mgr.inz.Player\"\nmsgstr \"mgr.inz.Player\"\n\n#: tabout.label32.caption\nmsgid \"justa_dude\"\nmsgstr \"justa_dude\"\n\n#: tabout.label33.caption\nmsgid \"SER[G]ANT\"\nmsgstr \"SER[G]ANT\"\n\n#: tabout.label34.caption\nmsgid \"Atom0s\"\nmsgstr \"Atom0s\"\n\n#: tabout.label5.caption\nmsgid \"And all the other people that helped me out\"\nmsgstr \"以及所有其他帮助过我的人\"\n\n#: tabout.label6.caption\nmsgid \"C Compiler by Tiny C-Compiler\"\nmsgstr \"C 编译器由 Tiny C-Compiler 提供\"\n\n#: tabout.label8.caption\nmsgid \"Website\"\nmsgstr \"网站\"\n\n#: tabout.label9.caption\nmsgid \"Message Board\"\nmsgstr \"留言板\"\n\n#: tabout.lbldbvm.caption\nmsgid \"your system may or may not support dbvm\"\nmsgstr \"你的系统可能支持也可能不支持 dbvm\"\n\n#: tadvancedoptions.caption\nmsgid \"Code list/Pause\"\nmsgstr \"代码列表/暂停\"\n\n#: tadvancedoptions.label1.caption\nmsgid \"Code list:\"\nmsgstr \"代码列表：\"\n\n#: tadvancedoptions.midbvmfindwhatcodeaccesses.caption\nmsgid \"DBVM Find....\"\nmsgstr \"DBVM 查找....\"\n\n#: tadvancedoptions.misetcolor.caption\nmsgid \"Set color\"\nmsgstr \"设置颜色\"\n\n#: tadvancedoptions.opendialog1.title\nmsgid \"Select the file you want to search\"\nmsgstr \"选择你想要搜索的文件\"\n\n#: tadvancedoptions.openthedisassemblerhere1.caption\nmsgid \"Open the disassembler at this location\"\nmsgstr \"在此位置打开反汇编器\"\n\n#: tadvancedoptions.remove1.caption\nmsgid \"Remove from list\"\nmsgstr \"从列表中移除\"\n\n#: tadvancedoptions.replaceall1.caption\nmsgid \"Replace all\"\nmsgstr \"全部替换\"\n\n#: tanchoreditor.caption\nmsgid \"AnchorEditor\"\nmsgstr \"AnchorEditor\"\n\n#: tanchoreditor.gbborderspace.caption\nmsgid \"border space\"\nmsgstr \"边框间距\"\n\n#: tanchoreditor.gbbottom.caption\nmsgid \"Bottom anchor\"\nmsgstr \"底部锚点\"\n\n#: tanchoreditor.gbleft.caption\nmsgid \"Left anchor\"\nmsgstr \"左侧锚点\"\n\n#: tanchoreditor.gbright.caption\nmsgid \"Right anchor\"\nmsgstr \"右侧锚点\"\n\n#: tanchoreditor.gbtop.caption\nmsgid \"Top anchor\"\nmsgstr \"顶部锚点\"\n\n#: tcalloralldialog.button2.caption\nmsgid \"Call's only\"\nmsgstr \"仅调用\"\n\n#: tcalloralldialog.label1.caption\nmsgid \"Load all instructions into the list or just the CALL's ?\"\nmsgstr \"将所有指令加载到列表中还是仅加载 CALL 的？\"\n\n#: tchangeoffset.caption\nmsgid \"Recalculate addres\"\nmsgstr \"重新计算地址\"\n\n#: tchangeoffset.change.caption\nmsgid \"Change\"\nmsgstr \"更改\"\n\n#: tfindwindow.labelarray.caption\nmsgid \"Array to scan\"\nmsgstr \"要扫描的数组\"\n\n#: tfindwindow.labeltype.caption\nmsgid \"Type:\"\nmsgstr \"类型：\"\n\n#: tfindwindow.rbarbyte.caption\nmsgid \"(Array of) byte\"\nmsgstr \"字节（数组）\"\n\n#: tformaddresschange.caption\nmsgid \"Change address\"\nmsgstr \"更改地址\"\n\n#: tformaddresschange.label2.caption\nmsgid \"Startbit:\"\nmsgstr \"起始位：\"\n\n#: tformaddresschange.lblvalue.caption\nmsgid \"=Value\"\nmsgstr \"=值\"\n\n#: tformaddresschange.miaddoffsetabove.caption\nmsgid \"Add Offset Above\"\nmsgstr \"添加上方偏移量\"\n\n#: tformaddresschange.miaddoffsetbelow.caption\nmsgid \"Add Offset Below\"\nmsgstr \"添加下方偏移量\"\n\n#: tformaddresschange.micopyvaluetoclipboard.caption\nmsgid \"Copy this value to Clipboard\"\nmsgstr \"将此值复制到剪贴板\"\n\n#: tformaddresschange.miupdateafterinterval.caption\nmsgid \"Only update the offset after a specific amount of time\"\nmsgstr \"仅在特定时间后更新偏移量\"\n\n#: tformaddresschange.miupdateonreinterpretonly.caption\nmsgid \"Only update the offset when the memory record gets reinterpreted\"\nmsgstr \"仅在内存记录被重新解释时更新偏移量\"\n\n#: tformdesigner.cebutton.caption\nmsgid \"CEButton\"\nmsgstr \"CEButton\"\n\n#: tformdesigner.cebutton.hint\nmsgid \"Button\"\nmsgstr \"按钮\"\n\n#: tformdesigner.cecheckbox.caption\nmsgid \"CECheckbox\"\nmsgstr \"CECheckbox\"\n\n#: tformdesigner.cecheckbox.hint\nmsgid \"CheckBox\"\nmsgstr \"复选框\"\n\n#: tformdesigner.cecombobox.caption\nmsgid \"CEComboBox\"\nmsgstr \"CEComboBox\"\n\n#: tformdesigner.cecombobox.hint\nmsgid \"ComboBox\"\nmsgstr \"组合框\"\n\n#: tformdesigner.ceedit.caption\nmsgid \"CEEdit\"\nmsgstr \"CEEdit\"\n\n#: tformdesigner.cegroupbox.caption\nmsgid \"CEGroupBox\"\nmsgstr \"CEGroupBox\"\n\n#: tformdesigner.cegroupbox.hint\nmsgid \"GroupBox\"\nmsgstr \"组框\"\n\n#: tformdesigner.ceimage.caption\nmsgid \"CEImage\"\nmsgstr \"CEImage\"\n\n#: tformdesigner.celabel.caption\nmsgid \"CELabel\"\nmsgstr \"CELabel\"\n\n#: tformdesigner.celabel.hint\nmsgid \"Label\"\nmsgstr \"标签\"\n\n#: tformdesigner.celistbox.caption\nmsgid \"CEListBox\"\nmsgstr \"CEListBox\"\n\n#: tformdesigner.celistbox.hint\nmsgid \"Listbox\"\nmsgstr \"列表框\"\n\n#: tformdesigner.celistview.caption\nmsgid \"CEListView\"\nmsgstr \"CEListView\"\n\n#: tformdesigner.celistview.hint\nmsgid \"ListView\"\nmsgstr \"列表视图\"\n\n#: tformdesigner.cememo.caption\nmsgid \"CEMemo\"\nmsgstr \"CEMemo\"\n\n#: tformdesigner.cememo.hint\nmsgid \"Memo\"\nmsgstr \"备忘录\"\n\n#: tformdesigner.ceopendialog.caption\nmsgid \"CEOpenDialog\"\nmsgstr \"CEOpenDialog\"\n\n#: tformdesigner.ceopendialog.hint\nmsgid \"Opendialog\"\nmsgstr \"打开对话框\"\n\n#: tformdesigner.cepagecontrol.caption\nmsgid \"CEPageControl\"\nmsgstr \"CEPageControl\"\n\n#: tformdesigner.cepagecontrol.hint\nmsgid \"PageControl\"\nmsgstr \"页面控制\"\n\n#: tformdesigner.cepanel.caption\nmsgid \"CEPanel\"\nmsgstr \"CEPanel\"\n\n#: tformdesigner.cepanel.hint\nmsgid \"Panel\"\nmsgstr \"面板\"\n\n#: tformdesigner.ceprogressbar.caption\nmsgid \"CEProgressbar\"\nmsgstr \"CEProgressbar\"\n\n#: tformdesigner.ceprogressbar.hint\nmsgid \"ProgressBar\"\nmsgstr \"进度条\"\n\n#: tformdesigner.ceradiogroup.caption\nmsgid \"CERadioGroup\"\nmsgstr \"CERadioGroup\"\n\n#: tformdesigner.ceradiogroup.hint\nmsgid \"RadioGroup\"\nmsgstr \"单选组\"\n\n#: tformdesigner.cesavedialog.caption\nmsgid \"CESavedialog\"\nmsgstr \"CESavedialog\"\n\n#: tformdesigner.cesavedialog.hint\nmsgid \"Savedialog\"\nmsgstr \"保存对话框\"\n\n#: tformdesigner.cesplitter.caption\nmsgid \"CESplitter\"\nmsgstr \"CESplitter\"\n\n#: tformdesigner.cesplitter.hint\nmsgid \"Splitter\"\nmsgstr \"分隔符\"\n\n#: tformdesigner.cetimer.caption\nmsgid \"CETimer\"\nmsgstr \"CETimer\"\n\n#: tformdesigner.cetimer.hint\nmsgid \"Timer\"\nmsgstr \"计时器\"\n\n#: tformdesigner.cetogglebox.caption\nmsgid \"CEToggleBox\"\nmsgstr \"CEToggleBox\"\n\n#: tformdesigner.cetogglebox.hint\nmsgid \"Togglebox\"\nmsgstr \"切换框\"\n\n#: tformdesigner.cetrackbar.caption\nmsgid \"CETrackBar\"\nmsgstr \"CETrackBar\"\n\n#: tformdesigner.cetrackbar.hint\nmsgid \"TrackBar\"\nmsgstr \"滑块\"\n\n#: tformdesigner.cetreeview.caption\nmsgid \"CETreeview\"\nmsgstr \"CETreeview\"\n\n#: tformdesigner.cetreeview.hint\nmsgid \"Treeview\"\nmsgstr \"树视图\"\n\n#: tformdesigner.lazvirtualstringtree.caption\nmsgid \"LazVirtualStringTree\"\nmsgstr \"LazVirtualStringTree\"\n\n#: tformdesigner.lazvirtualstringtree.hint\nmsgid \"VirtualStringTree\"\nmsgstr \"虚拟字符串树\"\n\n#: tformdesigner.menuitem2.caption\nmsgid \"Add unlisted object\"\nmsgstr \"添加未列出的对象\"\n\n#: tformdesigner.miadditems.caption\nmsgid \"Add Items\"\nmsgstr \"添加项目\"\n\n#: tformdesigner.miaddsubmenu.caption\nmsgid \"Add sub menu items\"\nmsgstr \"添加子菜单项\"\n\n#: tformdesigner.miaddtab.caption\nmsgid \"Add Tab\"\nmsgstr \"添加选项卡\"\n\n#: tformdesigner.mibringtofront.caption\nmsgid \"Bring to front\"\nmsgstr \"置于最前面\"\n\n#: tformdesigner.miloadlfm.caption\nmsgid \"Load LFM\"\nmsgstr \"加载 LFM\"\n\n#: tformdesigner.mimenumovedown.caption\nmsgid \"Move down\"\nmsgstr \"向下移动\"\n\n#: tformdesigner.mimenumoveup.caption\nmsgid \"Move up\"\nmsgstr \"向上移动\"\n\n#: tformdesigner.misavelfm.caption\nmsgid \"Save LFM\"\nmsgstr \"保存 LFM\"\n\n#: tformdesigner.misendtoback.caption\nmsgid \"Send to back\"\nmsgstr \"发送到后面\"\n\n#: tformdesigner.misetupmainmenu.caption\nmsgid \"Add menu items\"\nmsgstr \"添加菜单项\"\n\n#: tformdesigner.noselection.caption\nmsgid \"NoSelection\"\nmsgstr \"无选择\"\n\n#: tformdesigner.paintbox.caption\nmsgid \"CEPaintBox\"\nmsgstr \"CEPaintBox\"\n\n#: tformdesigner.paintbox.hint\nmsgid \"PaintBox\"\nmsgstr \"画布\"\n\n#: tformdesigner.toolbar1.caption\nmsgid \"ToolBar1\"\nmsgstr \"工具栏1\"\n\n#: tformdesigner.toolbutton6.caption\nmsgid \"ToolButton6\"\nmsgstr \"工具按钮6\"\n\n#: tformdifferentbitsize.caption\nmsgid \"Different sized row of bits\"\nmsgstr \"不同大小的位行\"\n\n#: tformdifferentbitsize.edit1.text\nmsgid \"Edit1\"\nmsgstr \"编辑1\"\n\n#: tformdifferentbitsize.label1.caption\nmsgid \"\"\n\"The last time you scanned the number of bits was 90 and now it is 12. Please tell me how and how much i must change the \"\n\"bit offset to successfully scan. (Left arrow+right arrow move the bits)\"\nmsgstr \"你上次扫描的位数是 90，现在是 12。请告诉我我必须如何以及多少更改位偏移量才能成功扫描。（左箭头+右箭头移动位）\"\n\n#: tformdifferentbitsize.labelnew.caption\nmsgid \"LabelNew\"\nmsgstr \"新标签\"\n\n#: tformdifferentbitsize.labelold.caption\nmsgid \"LabelOld\"\nmsgstr \"旧标签\"\n\n#: tformdifferentbitsize.ohnoyoufoundme1.caption\nmsgid \"Oh no! You found me!!!\"\nmsgstr \"哦，不！你找到了我！！！\"\n\n#: tformfoundcodelistextra.caption\nmsgid \"Extra info\"\nmsgstr \"额外信息\"\n\n#: tformfoundcodelistextra.copyaddresstoclipboard1.caption\nmsgid \"Copy info to clipboard\"\nmsgstr \"复制信息到剪贴板\"\n\n#: tformfoundcodelistextra.copyguesstoclipboard1.caption\nmsgid \"Copy easy guess to clipboard\"\nmsgstr \"复制简单猜测到剪贴板\"\n\n#: tformfoundcodelistextra.label10.caption\nmsgid \">>\"\nmsgstr \">>\"\n\n#: tformfoundcodelistextra.label17.caption\nmsgid \"yyy123\"\nmsgstr \"yyy123\"\n\n#: tformfoundcodelistextra.label18.caption\nmsgid \"The registers shown here are AFTER the instruction has been executed\"\nmsgstr \"这里显示的寄存器是在指令执行后\"\n\n#: tformfoundcodelistextra.label2.caption\nmsgid \"Label2\"\nmsgstr \"标签2\"\n\n#: tformfoundcodelistextra.label5.caption\nmsgid \"Label5\"\nmsgstr \"标签5\"\n\n#: tformfoundcodelistextra.label6.caption\nmsgid \"xxx123\"\nmsgstr \"xxx123\"\n\n#: tformfoundcodelistextra.lblcr3.caption\nmsgid \"CR3=XXXXXXXX\"\nmsgstr \"CR3=XXXXXXXX\"\n\n#: tformfoundcodelistextra.lblfsbase.caption\nmsgid \"FSBase=XXXXXXXX\"\nmsgstr \"FSBase=XXXXXXXX\"\n\n#: tformfoundcodelistextra.lblgsbase.caption\nmsgid \"GSBase=XXXXXXXX\"\nmsgstr \"GSBase=XXXXXXXX\"\n\n#: tformfoundcodelistextra.lblgsbasekernel.caption\nmsgid \"GSBase K=XXXXXXXX\"\nmsgstr \"GSBase K=XXXXXXXX\"\n\n#: tformfoundcodelistextra.lblphysicaladdress.caption\nmsgid \"Physical Address=XXXXXXXX\"\nmsgstr \"物理地址=XXXXXXXX\"\n\n#: tformfoundcodelistextra.lblrax.caption\nmsgid \"EAX=DDDDDDDDDDDDDDDD\"\nmsgstr \"EAX=DDDDDDDDDDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrbp.caption\nmsgid \"EBP=DDDDDDDDDDDDDDDD\"\nmsgstr \"EBP=DDDDDDDDDDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrbx.caption\nmsgid \"EBX=DDDDDDDD\"\nmsgstr \"EBX=DDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrcx.caption\nmsgid \"ECX=DDDDDDDD\"\nmsgstr \"ECX=DDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrdi.caption\nmsgid \"EDI=DDDDDDDD\"\nmsgstr \"EDI=DDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrdx.caption\nmsgid \"EDX=DDDDDDDDDDDDDDDD\"\nmsgstr \"EDX=DDDDDDDDDDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrip.caption\nmsgid \"EIP=DDDDDDDD\"\nmsgstr \"EIP=DDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrsi.caption\nmsgid \"ESI=DDDDDDDD\"\nmsgstr \"ESI=DDDDDDDD\"\n\n#: tformfoundcodelistextra.lblrsp.caption\nmsgid \"ESP=DDDDDDDD\"\nmsgstr \"ESP=DDDDDDDD\"\n\n#: tformfoundcodelistextra.lblvirtualaddress.caption\nmsgid \"Virtual Address=XXXXXXXX\"\nmsgstr \"虚拟地址=XXXXXXXX\"\n\n#: tformfoundcodelistextra.sbshowipt.caption\nmsgid \"IPT\"\nmsgstr \"IPT\"\n\n#: tformhotkey.caption\nmsgid \"Change hotkey\"\nmsgstr \"更改热键\"\n\n#: tformhotkey.label1.caption\nmsgid \"Press the new hotkey combination in below:\"\nmsgstr \"在下面按下新的热键组合：\"\n\n#: tformmemoryregions.listview1.columns[1].caption\nmsgid \"Allocation Protect\"\nmsgstr \"分配保护\"\n\n#: tformmemoryregions.listview1.columns[2].caption\nmsgid \"State\"\nmsgstr \"状态\"\n\n#: tformmemoryregions.savedialog1.title\nmsgid \"Give the basename of the regions to be saved. (Can be a CT file)\"\nmsgstr \"给出要保存的区域的基本名称。（可以是 CT 文件）\"\n\n#: tformmemoryregions.saveselectedregions1.caption\nmsgid \"Save selected regions\"\nmsgstr \"保存选定区域\"\n\n#: tformmemoryregions.selectallreadablememory1.caption\nmsgid \"Select all readable memory\"\nmsgstr \"选择所有可读内存\"\n\n#: tformmemoryregions.setselectedregionstobewritable1.caption\nmsgid \"Set selected regions to be writable\"\nmsgstr \"将选定区域设置为可写\"\n\n#: tformmemoryregions.statusbar1.panels[0].text\nmsgid \"Hold ctrl when opening this window to also see kernelmode regions\"\nmsgstr \"打开此窗口时按住 ctrl 以查看内核模式区域\"\n\n#: tformpointerorpointee.btnfindwhatwritespointee.caption\nmsgid \"Find what writes to the address pointed at by this pointer\"\nmsgstr \"查找写入此指针所指向地址的内容\"\n\n#: tformpointerorpointee.btnfindwhatwritespointer.caption\nmsgid \"Find what writes to this pointer\"\nmsgstr \"查找写入此指针的内容\"\n\n#: tformpointerorpointee.caption\nmsgid \"Cheat Engine Pointer\"\nmsgstr \"作弊引擎指针\"\n\n#: tformpointerorpointee.label1.caption\nmsgid \"This is a pointer.\"\nmsgstr \"这是一个指针。\"\n\n#: tformsettings.aboutlabel.caption\nmsgid \"About CE\"\nmsgstr \"关于 CE\"\n\n#: tformsettings.askforreplacewithnops.caption\nmsgid \"Ask for replace with nop\"\nmsgstr \"请求用 nop 替换\"\n\n#: tformsettings.btnmakekerneldebugpossible.caption\nmsgid \"Make possible\"\nmsgstr \"使之成为可能\"\n\n#: tformsettings.btnrestorekernelprotection.caption\nmsgid \"Restore Protection\"\nmsgstr \"恢复保护\"\n\n#: tformsettings.btnselectlanguage.caption\nmsgid \"Select Language\"\nmsgstr \"选择语言\"\n\n#: tformsettings.btnsettoolshortcut.caption\nmsgid \"Set shortcut\"\nmsgstr \"设置快捷键\"\n\n#: tformsettings.button4.caption\nmsgid \"Add new\"\nmsgstr \"添加新项\"\n\n#: tformsettings.caption\nmsgid \"Cheat Engine settings\"\nmsgstr \"作弊引擎设置\"\n\n#: tformsettings.cbalwaysaskforpassword.caption\nmsgid \"Always ask for password when signing\"\nmsgstr \"每次签名时都要求输入密码\"\n\n#: tformsettings.cbalwaysattempttolaunchasadmin.caption\nmsgid \"Always attempt to launch as admin\"\nmsgstr \"始终尝试以管理员身份启动\"\n\n#: tformsettings.cbalwaysautoattach.caption\nmsgid \"Even autoattach when another process has already been selected\"\nmsgstr \"即使在另一个进程已经被选择时也自动附加\"\n\n#: tformsettings.cbalwaysforceload.caption\nmsgid \"Always force load modules\"\nmsgstr \"始终强制加载模块\"\n\n#: tformsettings.cbalwaysforceload.hint\nmsgid \"\"\n\"When enabled CE's internal injectDLL routine will not use loadlibrary in the target at all and always use manual \"\n\"mapping to load the dll\\n\"\n\"(When disabled CE will still use manual mapping when normal dll injection fails)\"\nmsgstr \"\"\n\"启用时，CE 的内部 injectDLL 例程将完全不使用 loadlibrary，而始终使用手动映射来加载 dll\\\\n\"\n\"（禁用时，CE 在正常 dll 注入失败时仍会使用手动映射）\"\n\n#: tformsettings.cbalwayssigntable.caption\nmsgid \"Always sign Cheat Tables when saving\"\nmsgstr \"保存时始终签名 Cheat Tables\"\n\n#: tformsettings.cbasktoattachtorosetta.caption\nmsgid \"Ask to attach\"\nmsgstr \"询问是否附加\"\n\n#: tformsettings.cbasktoclearlistonopen.caption\nmsgid \"Ask to clear list on opening new process\"\nmsgstr \"在打开新进程时询问是否清除列表\"\n\n#: tformsettings.cbasktoclearlistonopen.hint\nmsgid \"When unchecked CE will not clear the list when opening a process\"\nmsgstr \"未选中时，CE 在打开进程时不会清除列表\"\n\n#: tformsettings.cbattachdebuggertorosettaonprocessopen.caption\nmsgid \"Attach debugger to Rosetta targets when opening a process\"\nmsgstr \"在打开进程时将调试器附加到 Rosetta 目标\"\n\n#: tformsettings.cbcanstepkernelcode.caption\nmsgid \"Ability to step through kernel code\"\nmsgstr \"逐步执行内核代码的能力\"\n\n#: tformsettings.cbdbvmdebugkernelmodebreaks.caption\nmsgid \"Kernelmode breaks (when possible)\"\nmsgstr \"内核模式断点（如果可能）\"\n\n#: tformsettings.cbdbvmdebugtargetedprocessonly.caption\nmsgid \"Targeted process only\"\nmsgstr \"仅针对目标进程\"\n\n#: tformsettings.cbdbvmdebugtriggercow.caption\nmsgid \"Trigger copy-on-write before activating watches\"\nmsgstr \"在激活监视之前触发写时复制\"\n\n#: tformsettings.cbdisabledarkmodesupport.caption\nmsgid \"Disable Dark Mode support (Requires a restart)\"\nmsgstr \"禁用暗模式支持（需要重启）\"\n\n#: tformsettings.cbdontopenhandle.caption\nmsgid \"Do not try to obtain handles\"\nmsgstr \"不要尝试获取句柄\"\n\n#: tformsettings.cbdontusetempdir.caption\nmsgid \"Don't store the temporary scanfiles in the windows tempdir\"\nmsgstr \"不要将临时扫描文件存储在 Windows 临时目录中\"\n\n#: tformsettings.cbdpiaware.caption\nmsgid \"DPI Aware (Requires a restart)\"\nmsgstr \"DPI 感知（需要重启）\"\n\n#: tformsettings.cbfastscan.caption\nmsgid \"Fast scan on by default\"\nmsgstr \"默认开启快速扫描\"\n\n#: tformsettings.cbgdbwritecode.caption\nmsgid \"Use GDB to write code\"\nmsgstr \"使用 GDB 编写代码\"\n\n#: tformsettings.cbgdbwritecode2.caption\nmsgid \"Use debugserver to write code\"\nmsgstr \"使用 debugserver 编写代码\"\n\n#: tformsettings.cbglobaldebug.caption\nmsgid \"Use Global Debug routines\"\nmsgstr \"使用全局调试例程\"\n\n#: tformsettings.cbhandlebreakpoints.caption\nmsgid \"Handle beakpoints not caused by CE\"\nmsgstr \"处理不是由 CE 引起的断点\"\n\n#: tformsettings.cbhideiptcapability.caption\nmsgid \"Hide IPT features from GUI\"\nmsgstr \"从 GUI 隐藏 IPT 功能\"\n\n#: tformsettings.cbhideiptcapability.hint\nmsgid \"In case you really do not wish to be reminded of this\"\nmsgstr \"如果你真的不希望被提醒这个\"\n\n#: tformsettings.cbincremental.caption\nmsgid \"Incremental value\"\nmsgstr \"增量值\"\n\n#: tformsettings.cbinjectdllwithapc.caption\nmsgid \"Use APC to inject dll's\"\nmsgstr \"使用 APC 注入 dll\"\n\n#: tformsettings.cbipttracesize.text\nmsgid \"8KB\"\nmsgstr \"8KB\"\n\n#: tformsettings.cbkdebug.caption\nmsgid \"Kernelmode debugger\"\nmsgstr \"内核模式调试器\"\n\n#: tformsettings.cbkernelquerymemoryregion.caption\nmsgid \"Query memory region routines\"\nmsgstr \"查询内存区域例程\"\n\n#: tformsettings.cbkernelreadwriteprocessmemory.caption\nmsgid \"Read/Write Process Memory  (Will cause slower scans)\"\nmsgstr \"读取/写入进程内存（将导致扫描变慢）\"\n\n#: tformsettings.cblaunchgdbserver.caption\nmsgid \"On debugstart launch gdbserver and connect to localhost on the given port\"\nmsgstr \"在调试开始时启动 gdbserver 并连接到给定端口的 localhost\"\n\n#: tformsettings.cblaunchgdbserver.hint\nmsgid \"\"\n\"When the debugger starts instead of asking for an HOST/PORT just launch a gdbserver instance yourself and connect to \"\n\"that\"\nmsgstr \"当调试器启动时，不要询问 HOST/PORT，只需自己启动一个 gdbserver 实例并连接到它\"\n\n#: tformsettings.cbluagarbagecollectall.caption\nmsgid \"Collect all garbage every few seconds\"\nmsgstr \"每隔几秒收集所有垃圾\"\n\n#: tformsettings.cbluaonlycollectwhenlarger.caption\nmsgid \"Only when the size is bigger than:\"\nmsgstr \"仅当大小大于：\"\n\n#: tformsettings.cbluapassivegarbagecollection.caption\nmsgid \"Passive garbage collection\"\nmsgstr \"被动垃圾收集\"\n\n#: tformsettings.cbluapassivegarbagecollection.hint\nmsgid \"\"\n\"Constantly runs a few steps of the garbage collector sequence. (Will take a while till all garbage is cleaned if there \"\n\"is a lot)\"\nmsgstr \"不断运行垃圾收集器序列的几个步骤。（如果有很多垃圾，清理完所有垃圾会花费一些时间）\"\n\n#: tformsettings.cbmanualmapveh.caption\nmsgid \"Manual map vehdebug dll\"\nmsgstr \"手动映射 vehdebug dll\"\n\n#: tformsettings.cbmemimage.caption\nmsgid \"MEM_IMAGE:Memory that is mapped into the view of an image section\"\nmsgstr \"MEM_IMAGE：映射到图像部分视图中的内存\"\n\n#: tformsettings.cbmemmapped.caption\nmsgid \"MEM_MAPPED:Memory that is mapped into the view of a section. (E.g:File mapping, emulator memory, slow)\"\nmsgstr \"MEM_MAPPED：映射到部分视图中的内存。（例如：文件映射，模拟器内存，速度较慢）\"\n\n#: tformsettings.cbmemprivate.caption\nmsgid \"MEM_PRIVATE:Memory that is private.\"\nmsgstr \"MEM_PRIVATE：私有内存。\"\n\n#: tformsettings.cbneverchangeprotection.caption\nmsgid \"Never change memory protection when editing\"\nmsgstr \"编辑时永远不要更改内存保护\"\n\n#: tformsettings.cbneverchangeprotection.hint\nmsgid \"\"\n\"When enabled CE will never call \\\"VirtualProtectEx\\\" before it changes memory. This means that read-only memory can not \"\n\"be changed then.  (code is usually read only)\"\nmsgstr \"启用时，CE 在更改内存之前永远不会调用“VirtualProtectEx”。这意味着只读内存无法更改。（代码通常是只读的）\"\n\n#: tformsettings.cboldpointeraddmethod.caption\nmsgid \"Pointer adding: Append pointerline instead of insert\"\nmsgstr \"指针添加：追加指针行而不是插入\"\n\n#: tformsettings.cboverridedefaultfont.caption\nmsgid \"Override the default font (Requires a restart)\"\nmsgstr \"覆盖默认字体（需要重启）\"\n\n#: tformsettings.cboverrideexistingbps.caption\nmsgid \"Override existing breakpoints when setting breakpoints\"\nmsgstr \"设置断点时覆盖现有断点\"\n\n#: tformsettings.cbpausewhenscanningonbydefault.caption\nmsgid \"Pause while scanning on by default\"\nmsgstr \"默认情况下在扫描时暂停\"\n\n#: tformsettings.cbprocessicons.caption\nmsgid \"Get process icons for processlist\"\nmsgstr \"获取进程列表的进程图标\"\n\n#: tformsettings.cbprocesswatcher.caption\nmsgid \"Enable use of the Process Watcher\"\nmsgstr \"启用进程监视器的使用\"\n\n#: tformsettings.cbprocesswatcheropenshandles.caption\nmsgid \"Open handle to processes on creation\"\nmsgstr \"在创建时打开进程的句柄\"\n\n#: tformsettings.cbrecordiptforfindwhatroutines.caption\nmsgid \"Record trace in elements of \\\"Find what ... \\\" routines\"\nmsgstr \"在“查找什么...”例程的元素中记录跟踪\"\n\n#: tformsettings.cbrecordiptforfindwhatroutines.hint\nmsgid \"\"\n\"When selected every single element in \\\"find what ...\\\" routines will get a copy of the trace for that threat at that \"\n\"time. (Can eat a lot of memory if this is high)\\n\"\n\"When deselected you can only get the trace information when stopped on a breakpoint. \"\nmsgstr \"当选中时，“查找什么...”例程中的每个元素都会在该时刻获得该线程的跟踪副本。（如果这个值很高，可能会消耗大量内存）当未选中时，只有在断点停止时才能获取跟踪信息。\"\n\n#: tformsettings.cbsavememoryregionscansettings.caption\nmsgid \"Save the memoryregions to scan options\"\nmsgstr \"将内存区域保存到扫描选项\"\n\n#: tformsettings.cbsavememoryregionscansettings.hint\nmsgid \"Saves \\\"Writable\\\" \\\"Executable\\\" \\\"Copy-On-Write\\\"  \"\nmsgstr \"保存“可写”“可执行”“写时复制”\"\n\n#: tformsettings.cbsavewindowpos.caption\nmsgid \"Save window positions\"\nmsgstr \"保存窗口位置\"\n\n#: tformsettings.cbshowallwindows.caption\nmsgid \"Show all windows in the taskbar\"\nmsgstr \"在任务栏中显示所有窗口\"\n\n#: tformsettings.cbshowassigned.caption\nmsgid \"Show values as if they are signed\"\nmsgstr \"将值显示为有符号数\"\n\n#: tformsettings.cbshowlanguagemenuitem.caption\nmsgid \"Show language selection menu item at the main screen\"\nmsgstr \"在主屏幕上显示语言选择菜单项\"\n\n#: tformsettings.cbshowmainmenu.caption\nmsgid \"Show main menu\"\nmsgstr \"显示主菜单\"\n\n#: tformsettings.cbshowprocesslist.caption\nmsgid \"Show process list in main menu\"\nmsgstr \"在主菜单中显示进程列表\"\n\n#: tformsettings.cbshowtools.caption\nmsgid \"Show 'tools' menu item\"\nmsgstr \"显示“工具”菜单项\"\n\n#: tformsettings.cbshowundo.caption\nmsgid \"Show undo button\"\nmsgstr \"显示撤销按钮\"\n\n#: tformsettings.cbsimplecopypaste.caption\nmsgid \"Simple paste\"\nmsgstr \"简单粘贴\"\n\n#: tformsettings.cbskippdb.caption\nmsgid \"Do not load external debug symbols like .PDB/.DBG files (Breaks tables that use these symbols)\"\nmsgstr \"不加载外部调试符号，如 .PDB/.DBG 文件（会破坏使用这些符号的表）\"\n\n#: tformsettings.cbskip_page_nocache.caption\nmsgid \"Don't scan memory that is protected with the No Cache option\"\nmsgstr \"不要扫描受 No Cache 选项保护的内存\"\n\n#: tformsettings.cbskip_page_nocache.hint\nmsgid \"Some systems crash when trying to read memory with this protection. If that happens check this option.\"\nmsgstr \"某些系统在尝试读取具有此保护的内存时会崩溃。如果发生这种情况，请检查此选项。\"\n\n#: tformsettings.cbskip_page_writecombine.caption\nmsgid \"Don't scan memory that is protected with the Write Combine option\"\nmsgstr \"不要扫描受 Write Combine 选项保护的内存\"\n\n#: tformsettings.cbupdatefoundlist.caption\nmsgid \"Update the list of found addresses even after scanning\"\nmsgstr \"即使在扫描后也更新找到的地址列表\"\n\n#: tformsettings.cbusedbvmdebugger.caption\nmsgid \"DBVM-level debugger\"\nmsgstr \"DBVM 级调试器\"\n\n#: tformsettings.cbusegdbserver.caption\nmsgid \"GDB Server Debugger\"\nmsgstr \"GDB 服务器调试器\"\n\n#: tformsettings.cbuseintelpt.caption\nmsgid \"Use intel-PT feature when the debugger is enabled\"\nmsgstr \"启用调试器时使用 intel-PT 功能\"\n\n#: tformsettings.cbusemacdebugger.caption\nmsgid \"MacOS debugger\"\nmsgstr \"MacOS 调试器\"\n\n#: tformsettings.cbuserosettadebugserver.caption\nmsgid \"Use rosetta debugserver on rosetta targets\"\nmsgstr \"在 rosetta 目标上使用 rosetta debugserver\"\n\n#: tformsettings.cbusethreadforfreeze.caption\nmsgid \"Use thread for freeze\"\nmsgstr \"使用线程进行冻结\"\n\n#: tformsettings.cbusewindowsdebugger.caption\nmsgid \"Windows debugger\"\nmsgstr \"Windows 调试器\"\n\n#: tformsettings.cbvehrealcontextonthreadcreation.caption\nmsgid \"Get/Set thread context on creation\"\nmsgstr \"在创建时获取/设置线程上下文\"\n\n#: tformsettings.cbwaitafterguiupdate.caption\nmsgid \"Wait after gui updates\"\nmsgstr \"在 GUI 更新后等待\"\n\n#: tformsettings.cbwaitafterguiupdate.hint\nmsgid \"\"\n\"Sometimes when using one of the \\\"find out what...\\\" functions they get hit so often that the gui has no time to \"\n\"update, resulting in anoying behaviour like certain windows not closing or unresponsive buttons.\\n\"\n\"With this option enabled the debugger will give the gui some time to handle the messages before it sends it a new \"\n\"update.\\n\"\n\"Downside: The game may become slightly slower when using these functions. (Of course, if it has been hammering the gui, \"\n\"it would already have been frozen)\"\nmsgstr \"\"\n\"有时在使用“找出什么...”功能时，它们被触发得如此频繁，以至于 GUI 没有时间更新，导致某些窗口无法关闭或按钮无响应等烦人行为。启用此选项后，调试器将给 GUI \"\n\"一些时间来处理消息，然后再发送新的更新。缺点：使用这些功能时，游戏可能会变得稍微慢一些。（当然，如果它一直在冲击 GUI，它已经被冻结）\"\n\n#: tformsettings.cbwriteloggingon.caption\nmsgid \"Enable write logging by default\"\nmsgstr \"默认启用写入日志\"\n\n#: tformsettings.cbwriteloggingon.hint\nmsgid \"When enabled CE will record writes done by the user and allows the user to undo those changes\"\nmsgstr \"启用后，CE 将记录用户所做的写入，并允许用户撤销这些更改\"\n\n#: tformsettings.checkbox1.caption\nmsgid \"Try to prevent detection of the debugger\"\nmsgstr \"尝试防止调试器被检测\"\n\n#: tformsettings.checkbox4.caption\nmsgid \"Use APC to create new threads\"\nmsgstr \"使用 APC 创建新线程\"\n\n#: tformsettings.codefinder.caption\nmsgid \"CodeFinder\"\nmsgstr \"CodeFinder\"\n\n#: tformsettings.editautoattach.hint\nmsgid \"Type the name of the process you want to automatically open. Note: Only works when NO process has been opened yet\"\nmsgstr \"输入你想要自动打开的进程名称。注意：仅在尚未打开任何进程时有效\"\n\n#: tformsettings.editfreezeinterval.hint\nmsgid \"The number of milliseconds that Cheat Engine will wait before resetting the frozen addresses to their original value.\"\nmsgstr \"Cheat Engine 等待的毫秒数，在此期间将冻结的地址重置为其原始值。\"\n\n#: tformsettings.editupdatefoundinterval.hint\nmsgid \"The number of milliseconds that Cheat Engine will wait before refreshing the list of found addresses\"\nmsgstr \"Cheat Engine 等待的毫秒数，在此期间刷新找到的地址列表\"\n\n#: tformsettings.editupdateinterval.hint\nmsgid \"The number of milliseconds that Cheat Engine will wait before refreshing the list of addresses\"\nmsgstr \"Cheat Engine 等待的毫秒数，在此期间刷新地址列表\"\n\n#: tformsettings.edtrepeatdelay.hint\nmsgid \"\"\n\"The delay in milliseconds to wait before starting a next scan when the 'repeat' checkbox is ticked\\n\"\n\"\\n\"\n\"0=no wait\"\nmsgstr \"\"\n\"在勾选“重复”复选框后，开始下一个扫描前的延迟（毫秒）\\n\"\n\"\\n\"\n\"0=不等待\"\n\n#: tformsettings.edtrosettadebugserverlaunchcommand.text\nmsgid \"/usr/libexec/rosetta/debugserver 0.0.0.0:33453\"\nmsgstr \"/usr/libexec/rosetta/debugserver 0.0.0.0:33453\"\n\n#: tformsettings.gballtypes.caption\nmsgid \"The 'all' type includes\"\nmsgstr \"“所有”类型包括\"\n\n#: tformsettings.gbdebuggerinterface.caption\nmsgid \"Debugger method\"\nmsgstr \"调试器方法\"\n\n#: tformsettings.gbunexpectedexceptionhandling.caption\nmsgid \"When CE starts default behaviour for unexpected breakpoints\"\nmsgstr \"当 CE 启动时，默认行为对于意外的断点\"\n\n#: tformsettings.groupbox1.caption\nmsgid \"Address list specific\"\nmsgstr \"地址列表特定\"\n\n#: tformsettings.groupbox2.caption\nmsgid \"Debugger interface config\"\nmsgstr \"调试器接口配置\"\n\n#: tformsettings.groupbox3.caption\nmsgid \"Use the following CE Kernel routines instead of the original windows version\"\nmsgstr \"使用以下 CE 内核例程，而不是原始 Windows 版本\"\n\n#: tformsettings.groupbox4.caption\nmsgid \"Prefered breakpoint method\"\nmsgstr \"首选断点方法\"\n\n#: tformsettings.groupbox5.caption\nmsgid \"Table: Lua scripts\"\nmsgstr \"表：Lua 脚本\"\n\n#: tformsettings.label1.caption\nmsgid \"Size of scanbuffer (KB) :\"\nmsgstr \"扫描缓冲区大小 (KB)：\"\n\n#: tformsettings.label10.caption\nmsgid \"Current Language:\"\nmsgstr \"当前语言：\"\n\n#: tformsettings.label14.caption\nmsgid \"Freeze interval\"\nmsgstr \"冻结间隔\"\n\n#: tformsettings.label15.caption\nmsgid \"(Can affect scan speed a lot)\"\nmsgstr \"（可能会大大影响扫描速度）\"\n\n#: tformsettings.label18.caption\nmsgid \"Found address list update interval\"\nmsgstr \"找到地址列表更新间隔\"\n\n#: tformsettings.label2.caption\nmsgid \"Store the temporary scanfiles here instead:\"\nmsgstr \"将临时扫描文件存储在这里：\"\n\n#: tformsettings.label20.caption\nmsgid \"Megabyte\"\nmsgstr \"兆字节\"\n\n#: tformsettings.label21.caption\nmsgid \"Scan the following memory region types:\"\nmsgstr \"扫描以下内存区域类型：\"\n\n#: tformsettings.label22.caption\nmsgid \"The following plugins are available:\"\nmsgstr \"以下插件可用：\"\n\n#: tformsettings.label23.caption\nmsgid \"Automatically attach to processes named\"\nmsgstr \"自动附加到名为的进程\"\n\n#: tformsettings.label24.caption\nmsgid \"(Seperate entries with ; )\"\nmsgstr \"（用 ; 分隔条目）\"\n\n#: tformsettings.label26.caption\nmsgid \"GDBServer launch command\"\nmsgstr \"GDBServer 启动命令\"\n\n#: tformsettings.label3.caption\nmsgid \"Thread priority\"\nmsgstr \"线程优先级\"\n\n#: tformsettings.label4.caption\nmsgid \"Single line assembler:\"\nmsgstr \"单行汇编：\"\n\n#: tformsettings.label5.caption\nmsgid \"Default return value\"\nmsgstr \"默认返回值\"\n\n#: tformsettings.label6.caption\nmsgid \"Size of stack to record on \\\"Find what... routines\\\"\"\nmsgstr \"在“查找内容...”例程中记录的堆栈大小\"\n\n#: tformsettings.label9.caption\nmsgid \"The folowing languages are available:\"\nmsgstr \"以下语言可用：\"\n\n#: tformsettings.lblapplicationtool.caption\nmsgid \"Application/Command\"\nmsgstr \"应用程序/命令\"\n\n#: tformsettings.lblcurrentlanguage.caption\nmsgid \"English\"\nmsgstr \"英语\"\n\n#: tformsettings.lblmaxiptsize.caption\nmsgid \"Maximum ipt tracesize\"\nmsgstr \"最大 IPT 跟踪大小\"\n\n#: tformsettings.lblrepeatdelay.caption\nmsgid \"Repeat scan delay\"\nmsgstr \"重复扫描延迟\"\n\n#: tformsettings.lblrosettalaunchcommand.caption\nmsgid \"Rosetta debugserver launch command\"\nmsgstr \"Rosetta 调试服务器启动命令\"\n\n#: tformsettings.lblshortcut.caption\nmsgid \"Shortcut:\"\nmsgstr \"快捷方式：\"\n\n#: tformsettings.lblshortcuttext.caption\nmsgid \"xxxxxxxx\"\nmsgstr \"xxxxxxxx\"\n\n#: tformsettings.lblthreadfollowing.caption\nmsgid \"Thread following:\"\nmsgstr \"线程跟踪：\"\n\n#: tformsettings.lvtools.columns[1].caption\nmsgid \"Application\"\nmsgstr \"应用程序\"\n\n#: tformsettings.lvtools.columns[2].caption\nmsgid \"Shortcut\"\nmsgstr \"快捷方式\"\n\n#: tformsettings.miunexpectedbreakpointsbreakwheninsideregion.caption\nmsgid \"Break when inside specific regions\"\nmsgstr \"在特定区域内中断\"\n\n#: tformsettings.miunexpectedbreakpointsignore.caption\nmsgid \"Ignore\"\nmsgstr \"忽略\"\n\n#: tformsettings.rbdebugasbreakpoint.caption\nmsgid \"Hardware Breakpoints (Max 4)\"\nmsgstr \"硬件断点（最多 4 个）\"\n\n#: tformsettings.rbint3asbreakpoint.caption\nmsgid \"Int3 instructions (Execute BP only, falls back to hardware bp) (Unlimited)\"\nmsgstr \"Int3 指令（仅执行 BP，回退到硬件 BP）（无限制）\"\n\n#: tformsettings.rbmacdebugtasklevel.caption\nmsgid \"Task Level\"\nmsgstr \"任务级别\"\n\n#: tformsettings.rbmacdebugthreadlevel.caption\nmsgid \"Thread level\"\nmsgstr \"线程级别\"\n\n#: tformsettings.rbpageexceptions.caption\nmsgid \"Page exceptions (Extremely slow to unplayable, buggy, best used if nothing else works. Does not use debug registers)\"\nmsgstr \"页面异常（极慢到无法播放，存在错误，最好在其他方法无效时使用。不使用调试寄存器）\"\n\n#: tformsettings.rbvehhookthreadcreation.caption\nmsgid \"Hook thread-create and destroy api's\"\nmsgstr \"钩住线程创建和销毁 API\"\n\n#: tformsettings.rbvehpollthread.caption\nmsgid \"Poll for threads\"\nmsgstr \"轮询线程\"\n\n#: tformsettings.rbvehuseprocesswatcher.caption\nmsgid \"Use processwatcher\"\nmsgstr \"使用进程监视器\"\n\n#: tformsettings.replacewithnops.caption\nmsgid \"Replace incomplete opcodes with nops\"\nmsgstr \"用 NOP 替换不完整的操作码\"\n\n#: tformsettings.replacewithnops.hint\nmsgid \"\"\n\"If you type in a opcode and it is smaller than the opcode you replaced, it will fill the missing bytes with NOP \"\n\"instructions. If the opcode is longer it will replace the opcode(s) that have been overwritten with NOP's\"\nmsgstr \"如果你输入的操作码小于你替换的操作码，它将用 NOP 指令填充缺失的字节。如果操作码更长，它将用 NOP 替换被覆盖的操作码\"\n\n#: tformsettings.tabsheet1.caption\nmsgid \"DBVM\"\nmsgstr \"DBVM\"\n\n#: tformsettings.tauntoldosuser.caption\nmsgid \"I really recommend upgrading to Windows 2000 or later mister Flintstone\"\nmsgstr \"我真的推荐升级到 Windows 2000 或更高版本，弗林斯通先生\"\n\n#: tformsettings.tskerneldebugconfig.caption\nmsgid \"Kernel Debug\"\nmsgstr \"内核调试\"\n\n#: tformsettings.tsmacdebuggerinterface.caption\nmsgid \"Mac Debug\"\nmsgstr \"Mac 调试\"\n\n#: tformsettings.tssigning.caption\nmsgid \"tsSigning\"\nmsgstr \"tsSigning\"\n\n#: tformsettings.tstools.caption\nmsgid \"tsTools\"\nmsgstr \"tsTools\"\n\n#: tformsettings.tswindowsdebuggerconfig.caption\nmsgid \"Windows Debugger\"\nmsgstr \"Windows 调试器\"\n\n#: tfoundcodedialog.btnaddtocodelist.hint\nmsgid \"The selected addresses will be added to the code list in the advanced options window.\"\nmsgstr \"所选地址将被添加到高级选项窗口中的代码列表。\"\n\n#: tfoundcodedialog.btnextrainfo.caption\nmsgid \"More information\"\nmsgstr \"更多信息\"\n\n#: tfoundcodedialog.btnextrainfo.hint\nmsgid \"Shows more information about the state of the system when that instruction got executed\"\nmsgstr \"显示该指令执行时系统状态的更多信息\"\n\n#: tfoundcodedialog.btnopendisassembler.caption\nmsgid \"Show disassembler\"\nmsgstr \"显示反汇编器\"\n\n#: tfoundcodedialog.btnopendisassembler.hint\nmsgid \"This will open the memoryview and bring the disassemblerview to the selected address\"\nmsgstr \"这将打开内存视图并将反汇编视图带到所选地址\"\n\n#: tfoundcodedialog.btnreplacewithnops.hint\nmsgid \"This will replace the selected addresses with code that does nothing. (Nops)\"\nmsgstr \"这将用不执行任何操作的代码替换所选地址。（NOP）\"\n\n#: tfoundcodedialog.description.caption\nmsgid \"example\"\nmsgstr \"示例\"\n\n#: tfoundcodedialog.mifindwhataccesses.caption\nmsgid \"Check if found opcodes also access other addresses (max 8)\"\nmsgstr \"检查找到的操作码是否也访问其他地址（最多 8 个）\"\n\n#: tfoundcodedialog.misavetofile.caption\nmsgid \"Save selection to file\"\nmsgstr \"将选择保存到文件\"\n\n#: tfoundcodedialog.replacewithcodethatdoesnothingnop1.caption\nmsgid \"Replace with code that does nothing (NOP)\"\nmsgstr \"用不执行任何操作的代码替换（NOP）\"\n\n#: tfoundcodedialog.showthisaddressinthedisassembler1.caption\nmsgid \"Show this address in the disassembler\"\nmsgstr \"在反汇编器中显示此地址\"\n\n#: tframehotkeyconfig.cbstoponrelease.caption\nmsgid \"Stop on release\"\nmsgstr \"在释放时停止\"\n\n#: tframehotkeyconfig.edthotkeydelay.hint\nmsgid \"Lets you specify how quickly a hotkey is repeated\"\nmsgstr \"让你指定热键重复的速度\"\n\n#: tframehotkeyconfig.edtkeypollinterval.hint\nmsgid \"Determines how quickly a hotkey keypress is detected\"\nmsgstr \"确定热键按下的检测速度\"\n\n#: tframehotkeyconfig.label1.caption\nmsgid \"Functions\"\nmsgstr \"功能\"\n\n#: tframehotkeyconfig.label3.caption\nmsgid \"Speed delta\"\nmsgstr \"速度增量\"\n\n#: tframehotkeyconfig.label4.caption\nmsgid \"Keypoll interval (milliseconds)\"\nmsgstr \"键盘轮询间隔（毫秒）\"\n\n#: tframehotkeyconfig.label5.caption\nmsgid \"Delay between reactivating hotkeys\"\nmsgstr \"重新激活热键之间的延迟\"\n\n#: tframehotkeyconfig.label52.caption\nmsgid \"Speed        \"\nmsgstr \"速度\"\n\n#: tfrmaaeditprefs.btnfont.caption\nmsgid \"font\"\nmsgstr \"字体\"\n\n#: tfrmaaeditprefs.caption\nmsgid \"Editor preferences\"\nmsgstr \"编辑器首选项\"\n\n#: tfrmaaeditprefs.cbshowgutter.caption\nmsgid \"Show bar on left\"\nmsgstr \"在左侧显示栏\"\n\n#: tfrmaaeditprefs.cbshowlinenumbers.caption\nmsgid \"Show line numbers\"\nmsgstr \"显示行号\"\n\n#: tfrmaaeditprefs.cbsmarttab.caption\nmsgid \"Smart tab\"\nmsgstr \"智能制表符\"\n\n#: tfrmaaeditprefs.cbtabstospace.caption\nmsgid \"Tabs to space\"\nmsgstr \"制表符转为空格\"\n\n#: tfrmaaeditprefs.label1.caption\nmsgid \"Tab Width\"\nmsgstr \"制表符宽度\"\n\n#: tfrmaccessedmemory.caption\nmsgid \"Find accessed memory regions\"\nmsgstr \"查找访问的内存区域\"\n\n#: tfrmaccessedmemory.label1.caption\nmsgid \"Hotkey to (re)start monitoring\"\nmsgstr \"监控的（重新）启动热键\"\n\n#: tfrmaccessedmemory.label3.caption\nmsgid \"Hotkey to stop monitoring\"\nmsgstr \"停止监控的热键\"\n\n#: tfrmaccessedmemory.lbllost.caption\nmsgid \"Lost\"\nmsgstr \"丢失\"\n\n#: tfrmaccessedmemory.vsresults.header.columns[0].text\nmsgid \"Page Base\"\nmsgstr \"页面基址\"\n\n#: tfrmaccessedmemory.vsresults.header.columns[1].text\nmsgid \"First Accessed By\"\nmsgstr \"首次访问者\"\n\n#: tfrmaddtocodelist.edit1.text\nmsgid \"DDDDDDDD\"\nmsgstr \"DDDDDDDD\"\n\n#: tfrmaddtocodelist.edit2.text\nmsgid \"FFFFFFFF\"\nmsgstr \"FFFFFFFF\"\n\n#: tfrmautoinject.apihook1.caption\nmsgid \"API Hook\"\nmsgstr \"API Hook\"\n\n#: tfrmautoinject.assigntocurrentcheattable1.caption\nmsgid \"Assign to current cheat table\"\nmsgstr \"分配给当前作弊表\"\n\n#: tfrmautoinject.caption\nmsgid \"Auto assemble\"\nmsgstr \"自动组装\"\n\n#: tfrmautoinject.cheattablecompliantcodee1.caption\nmsgid \"Cheat Table Framework Code\"\nmsgstr \"作弊表框架代码\"\n\n#: tfrmautoinject.codeinjection1.caption\nmsgid \"Code Injection\"\nmsgstr \"代码注入\"\n\n#: tfrmautoinject.coderelocation1.caption\nmsgid \"Code Relocation\"\nmsgstr \"代码重定位\"\n\n#: tfrmautoinject.emplate1.caption\nmsgid \"Template\"\nmsgstr \"模板\"\n\n#: tfrmautoinject.exit1.caption\nmsgid \"Exit\"\nmsgstr \"退出\"\n\n#: tfrmautoinject.inject1.caption\nmsgid \"Inject\"\nmsgstr \"注入\"\n\n#: tfrmautoinject.injectincurrentprocess1.caption\nmsgid \"Inject into current process\"\nmsgstr \"注入到当前进程\"\n\n#: tfrmautoinject.injectintocurrentprocessandexecute1.caption\nmsgid \"Inject into current process and execute\"\nmsgstr \"注入到当前进程并执行\"\n\n#: tfrmautoinject.menuaobinjection.caption\nmsgid \"AOB Injection\"\nmsgstr \"AOB 注入\"\n\n#: tfrmautoinject.menufullinjection.caption\nmsgid \"Full Injection\"\nmsgstr \"完全注入\"\n\n#: tfrmautoinject.menuitem1.caption\nmsgid \"C highlighting preferences\"\nmsgstr \"C 语言高亮首选项\"\n\n#: tfrmautoinject.menuitem3.caption\nmsgid \"Auto assembler syntax highlighting preferences\"\nmsgstr \"自动汇编语法高亮首选项\"\n\n#: tfrmautoinject.mi1byteexceptionjmp.caption\nmsgid \"1 Byte Exception JMP\"\nmsgstr \"1 字节异常 JMP\"\n\n#: tfrmautoinject.micalllua.caption\nmsgid \"Call CE Lua Function\"\nmsgstr \"调用 CE Lua 函数\"\n\n#: tfrmautoinject.micopy.caption\nmsgid \"&Copy\"\nmsgstr \"&复制\"\n\n#: tfrmautoinject.micut.caption\nmsgid \"Cu&t\"\nmsgstr \"剪切\"\n\n#: tfrmautoinject.mifind.caption\nmsgid \"&Find...\"\nmsgstr \"&查找...\"\n\n#: tfrmautoinject.miluasyntaxcheck.caption\nmsgid \"Syntax Check\"\nmsgstr \"语法检查\"\n\n#: tfrmautoinject.mimoveleft.caption\nmsgid \"Move left\"\nmsgstr \"向左移动\"\n\n#: tfrmautoinject.mimoveright.caption\nmsgid \"Move right\"\nmsgstr \"向右移动\"\n\n#: tfrmautoinject.minewtab.caption\nmsgid \"New Tab\"\nmsgstr \"新建标签页\"\n\n#: tfrmautoinject.mipaste.caption\nmsgid \"&Paste\"\nmsgstr \"&粘贴\"\n\n#: tfrmautoinject.miundo.caption\nmsgid \"&Undo\"\nmsgstr \"&撤销\"\n\n#: tfrmautoinject.syntaxhighlighting1.caption\nmsgid \"Syntax highlighting\"\nmsgstr \"语法高亮\"\n\n#: tfrmbranchmapper.button1.caption\nmsgid \"Start mapping\"\nmsgstr \"开始映射\"\n\n#: tfrmbranchmapper.caption\nmsgid \"Branch Mapper\"\nmsgstr \"分支映射器\"\n\n#: tfrmbranchmapper.label1.caption\nmsgid \"Record branch destinations in the following threads:\"\nmsgstr \"在以下线程中记录分支目标：\"\n\n#: tfrmbranchmapper.label2.caption\nmsgid \"Found: \"\nmsgstr \"找到：\"\n\n#: tfrmbreakpointcondition.caption\nmsgid \"Breakpoint condition\"\nmsgstr \"断点条件\"\n\n#: tfrmbreakpointcondition.label1.caption\nmsgid \"Give a formula that must return true if you want the breakpoint to trigger a break\"\nmsgstr \"给出一个必须返回 true 的公式，如果你希望断点触发中断\"\n\n#: tfrmbreakpointcondition.label2.caption\nmsgid \"Example: EAX == 0x1234  (case sensitive and hexadecimal starts with 0x ) (Lua)\"\nmsgstr \"示例：EAX == 0x1234（区分大小写，十六进制以 0x 开头）（Lua）\"\n\n#: tfrmbreakpointcondition.rbcomplex.caption\nmsgid \"Complex\"\nmsgstr \"复杂\"\n\n#: tfrmbreakpointcondition.rbeasy.caption\nmsgid \"Easy\"\nmsgstr \"简单\"\n\n#: tfrmbreakpointcondition.tabsheet1.caption\nmsgid \"Easy formula\"\nmsgstr \"简单公式\"\n\n#: tfrmbreakpointcondition.tabsheet2.caption\nmsgid \"Complex function\"\nmsgstr \"复杂函数\"\n\n#: tfrmbreakpointlist.caption\nmsgid \"Breakpoint list\"\nmsgstr \"断点列表\"\n\n#: tfrmbreakpointlist.listview1.columns[2].caption\nmsgid \"Trigger\"\nmsgstr \"触发器\"\n\n#: tfrmbreakpointlist.listview1.columns[4].caption\nmsgid \"On Hit\"\nmsgstr \"命中时\"\n\n#: tfrmbreakpointlist.listview1.columns[6].caption\nmsgid \"Pending deletion\"\nmsgstr \"待删除\"\n\n#: tfrmbreakpointlist.menuitem2.caption\nmsgid \"Disable breakpoint\"\nmsgstr \"禁用断点\"\n\n#: tfrmbreakpointlist.midelbreakpoint.caption\nmsgid \"Delete breakpoint\"\nmsgstr \"删除断点\"\n\n#: tfrmbreakpointlist.mipagewide.caption\nmsgid \"Change to pagewide breakpoint\"\nmsgstr \"更改为页面断点\"\n\n#: tfrmbreakpointlist.misetcondition.caption\nmsgid \"Set/change condition\"\nmsgstr \"设置/更改条件\"\n\n#: tfrmbreakpointlist.mishowshadow.caption\nmsgid \"Show shadow breakpoints\"\nmsgstr \"显示影子断点\"\n\n#: tfrmbreakthread.caption\nmsgid \"Break Thread\"\nmsgstr \"中断线程\"\n\n#: tfrmbreakthread.label1.caption\nmsgid \"This process has more than 1 thread. Select the thread you wish to break\"\nmsgstr \"此进程有多个线程。选择你希望中断的线程\"\n\n#: tfrmcapturedtimers.button2.caption\nmsgid \"Send timer messages\"\nmsgstr \"发送定时器消息\"\n\n#: tfrmcapturedtimers.caption\nmsgid \"Captured Timers\"\nmsgstr \"捕获的定时器\"\n\n#: tfrmcapturedtimers.label1.caption\nmsgid \"The following WM_TIMER messages have been received\"\nmsgstr \"已接收以下 WM_TIMER 消息\"\n\n#: tfrmcapturedtimers.listview1.columns[0].caption\nmsgid \"Window Handle\"\nmsgstr \"窗口句柄\"\n\n#: tfrmcapturedtimers.listview1.columns[1].caption\nmsgid \"Window Title\"\nmsgstr \"窗口标题\"\n\n#: tfrmcapturedtimers.listview1.columns[2].caption\nmsgid \"Window Class\"\nmsgstr \"窗口类\"\n\n#: tfrmcapturedtimers.listview1.columns[3].caption\nmsgid \"Timer ID\"\nmsgstr \"定时器 ID\"\n\n#: tfrmcapturedtimers.listview1.columns[4].caption\nmsgid \"TimerProc\"\nmsgstr \"定时器过程\"\n\n#: tfrmchangedaddresses.caption\nmsgid \"Changed Addresses\"\nmsgstr \"已更改的地址\"\n\n#: tfrmchangedaddresses.editcodeaddress.text\nmsgid \"01234567890ABCDEF\"\nmsgstr \"01234567890ABCDEF\"\n\n#: tfrmchangedaddresses.labelcodeaddress.caption\nmsgid \"Code Address\"\nmsgstr \"代码地址\"\n\n#: tfrmchangedaddresses.lblinfo.caption\nmsgid \"The following addresses have been accessed by the code you selected\"\nmsgstr \"已访问以下地址的代码\"\n\n#: tfrmchangedaddresses.micodeaddressbrowsememoryregion.caption\nmsgid \"Browse Memory Region\"\nmsgstr \"浏览内存区域\"\n\n#: tfrmchangedaddresses.micodeaddresscopy.caption\nmsgid \"Copy Code Address to Clipboard\"\nmsgstr \"复制代码地址到剪贴板\"\n\n#: tfrmchangedaddresses.micodeaddressdisassemblememoryregion.caption\nmsgid \"Disassemble Memory Region\"\nmsgstr \"反汇编内存区域\"\n\n#: tfrmchangedaddresses.micommonalitiessubgroup.caption\nmsgid \"Find commonalities between addresses\"\nmsgstr \"查找地址之间的共性\"\n\n#: tfrmchangedaddresses.micopytoaddresslist.caption\nmsgid \"Copy selected addresses to addresslist\"\nmsgstr \"将选定地址复制到地址列表\"\n\n#: tfrmchangedaddresses.mideleteselectedentries.caption\nmsgid \"Delete selected entries\"\nmsgstr \"删除选定条目\"\n\n#: tfrmchangedaddresses.midissect.caption\nmsgid \"Open dissect data with selected addresses\"\nmsgstr \"使用选定地址打开解剖数据\"\n\n#: tfrmchangedaddresses.migroupclear.caption\nmsgid \"Clear Selection\"\nmsgstr \"清除选择\"\n\n#: tfrmchangedaddresses.mimarkasgroup1.caption\nmsgid \"Mark selection as group 1\"\nmsgstr \"将选择标记为组 1\"\n\n#: tfrmchangedaddresses.mimarkasgroup2.caption\nmsgid \"Mark selection as group 2 (Nothing means everything else)\"\nmsgstr \"将选择标记为组 2（无表示其他所有）\"\n\n#: tfrmchangedaddresses.miresetcount.caption\nmsgid \"Reset count\"\nmsgstr \"重置计数\"\n\n#: tfrmchangedaddresses.miscanforcommonalities.caption\nmsgid \"Scan for commonalities\"\nmsgstr \"扫描共性\"\n\n#: tfrmchangedaddresses.mishowiptlog.caption\nmsgid \"Show IPT log\"\nmsgstr \"显示 IPT 日志\"\n\n#: tfrmchangedaddresses.panelcontent.caption\nmsgid \"PanelContent\"\nmsgstr \"面板内容\"\n\n#: tfrmchangedaddresses.showregisterstates1.caption\nmsgid \"Show register states\"\nmsgstr \"显示寄存器状态\"\n\n#: tfrmchangedaddressescommonalityscanner.caption\nmsgid \"Commonality scanner\"\nmsgstr \"共性扫描器\"\n\n#: tfrmchangedaddressescommonalityscanner.lvregisters.columns[0].caption\nmsgid \"Register\"\nmsgstr \"寄存器\"\n\n#: tfrmchangedaddressescommonalityscanner.lvregisters.columns[1].caption\nmsgid \"Status\"\nmsgstr \"状态\"\n\n#: tfrmcodecavescanner.caption\nmsgid \"Scan for codecaves\"\nmsgstr \"扫描代码洞\"\n\n#: tfrmcodecavescanner.cbnoexecute.caption\nmsgid \"Also scan non-executable read-only memory\"\nmsgstr \"还扫描不可执行的只读内存\"\n\n#: tfrmcodecavescanner.copytoclipboard1.caption\nmsgid \"Copy selection(s) to clipboard\"\nmsgstr \"将选择复制到剪贴板\"\n\n#: tfrmcodecavescanner.label1.caption\nmsgid \"Start Address\"\nmsgstr \"起始地址\"\n\n#: tfrmcodecavescanner.label2.caption\nmsgid \"Stop Address\"\nmsgstr \"停止地址\"\n\n#: tfrmcodecavescanner.label3.caption\nmsgid \"Size of cave\"\nmsgstr \"洞的大小\"\n\n#: tfrmcodefilter.btncancel.hint\nmsgid \"Cancels the current operation\"\nmsgstr \"取消当前操作\"\n\n#: tfrmcodefilter.btnfilteroutexecutedaddresses.caption\nmsgid \"Has not been executed\"\nmsgstr \"尚未执行\"\n\n#: tfrmcodefilter.btnfilteroutexecutedaddresses.hint\nmsgid \"\"\n\"Removes all addresses from the list that have been executed, and resets the breakpoints on the remaining addresses if \"\n\"the filter is active\"\nmsgstr \"从列表中移除所有已执行的地址，并在过滤器激活时重置剩余地址的断点\"\n\n#: tfrmcodefilter.btnfilteroutnonexecutedaddresses.caption\nmsgid \"Has been executed\"\nmsgstr \"已执行\"\n\n#: tfrmcodefilter.btnfilteroutnonexecutedaddresses.hint\nmsgid \"\"\n\"Removes all addresses from the list that have not been executed, and resets the breakpoints on the remaining addresses \"\n\"if the filter is active\"\nmsgstr \"从列表中移除所有未执行的地址，并在过滤器激活时重置剩余地址的断点\"\n\n#: tfrmcodefilter.btnfromunwindinfo.caption\nmsgid \"From Unwind Info\"\nmsgstr \"来自展开信息\"\n\n#: tfrmcodefilter.btnloadaddressesbydisassembling.caption\nmsgid \"From Disassembler\"\nmsgstr \"来自反汇编器\"\n\n#: tfrmcodefilter.btnloadaddressesbydisassembling.hint\nmsgid \"Disassembles the code and marks calls.  This can be inaccurate and might end up writing 0xcc's at random/wrong locations\"\nmsgstr \"反汇编代码并标记调用。这可能不准确，可能会在随机/错误的位置写入 0xcc\"\n\n#: tfrmcodefilter.btnloadaddressesfromfile.caption\nmsgid \"From File\"\nmsgstr \"来自文件\"\n\n#: tfrmcodefilter.btnloadaddressesfromfile.hint\nmsgid \"Loads a file containing a list of addresses (e.g from a previous filter session or from the branch mapper)\"\nmsgstr \"加载包含地址列表的文件（例如来自之前的过滤会话或分支映射器）\"\n\n#: tfrmcodefilter.btnloadaddressesfromtrace.caption\nmsgid \"From Trace\"\nmsgstr \"来自跟踪\"\n\n#: tfrmcodefilter.btnloadaddressesfromtrace.hint\nmsgid \"Load a previous trace and filters out the CALL's from there\"\nmsgstr \"加载之前的跟踪并过滤掉其中的调用\"\n\n#: tfrmcodefilter.frmlaunchbranchmapper.caption\nmsgid \"Launch branch mapper\"\nmsgstr \"启动分支映射器\"\n\n#: tfrmcodefilter.frmlaunchbranchmapper.hint\nmsgid \"\"\n\"Starts a single stepping (branch only) trace and records all unique IP's encountered.  You can use the results from \"\n\"this with the \\\"From File\\\" address list\\n\"\n\"Make sure that the code you're interested in is executed at least once\\n\"\n\"\\n\"\n\"<WARNING: SLOW and recommended as last resort>\"\nmsgstr \"\"\n\"开始单步跟踪（仅分支）并记录所有遇到的唯一 IP。你可以将此结果与“来自文件”的地址列表一起使用\\n\"\n\"确保你感兴趣的代码至少执行一次\\n\"\n\"\\n\"\n\"<WARNING: SLOW and recommended as last resort>\"\n\n#: tfrmcodefilter.groupbox1.caption\nmsgid \"Load address list\"\nmsgstr \"加载地址列表\"\n\n#: tfrmcodefilter.label1.caption\nmsgid \"\"\n\"This will place software breakpoints(0xcc) on many locations of interest (Usually CALLs) and then track which ones get \"\n\"executed and which ones do not.\\n\"\n\"By specifying that some code has been executed and some not you can filter down the list till it's only ones you're \"\n\"interested in\"\nmsgstr \"这将会在许多感兴趣的位置（通常是 CALLs）放置软件断点（0xcc），然后跟踪哪些被执行，哪些没有。通过指定某些代码已被执行而某些没有，你可以过滤列表，直到只剩下你感兴趣的部分。\"\n\n#: tfrmcodefilter.label3.caption\nmsgid \"Addresses executed since last filter operation:\"\nmsgstr \"自上次过滤操作以来执行的地址：\"\n\n#: tfrmcodefilter.lbladdresslist.caption\nmsgid \"Address List\"\nmsgstr \"地址列表\"\n\n#: tfrmcodefilter.lblstatus.caption\nmsgid \"Doing something\"\nmsgstr \"正在执行某些操作\"\n\n#: tfrmcodefilter.lvresults.columns[1].caption\nmsgid \"Executed\"\nmsgstr \"已执行\"\n\n#: tfrmcodefilter.mideleteselecteditems.caption\nmsgid \"Delete selected addresses\"\nmsgstr \"删除选定的地址\"\n\n#: tfrmcodefilter.misaveaddresslist.caption\nmsgid \"Save addresslist\"\nmsgstr \"保存地址列表\"\n\n#: tfrmcr3switcher.caption\nmsgid \"Pagebase Switcher (CR3)\"\nmsgstr \"页面基址切换器（CR3）\"\n\n#: tfrmcr3switcher.edtnewcr3.hint\nmsgid \"Set to 0 or empty and click set to go back to normal windows or DBK memory API\"\nmsgstr \"设置为 0 或空，然后点击设置以返回正常的 Windows 或 DBK 内存 API\"\n\n#: tfrmcr3switcher.label1.caption\nmsgid \"Select or type the new page base address (CR3) for this memory view window\"\nmsgstr \"为此内存视图窗口选择或输入新的页面基址（CR3）\"\n\n#: tfrmcr3switcher.menuitem1.caption\nmsgid \"Record CR3 list\"\nmsgstr \"记录 CR3 列表\"\n\n#: tfrmd3dhooksnapshotconfig.caption\nmsgid \"D3DHook: Configure snapshot\"\nmsgstr \"D3DHook：配置快照\"\n\n#: tfrmd3dhooksnapshotconfig.cbalsooutputpng.caption\nmsgid \"Also save picture next to snapshot file\"\nmsgstr \"也在快照文件旁边保存图片\"\n\n#: tfrmd3dhooksnapshotconfig.cbalsooutputpng.hint\nmsgid \"Use this if you have a more efficient way of rendering .PNG's to select the snapshot you wish\"\nmsgstr \"如果你有更高效的方式来渲染 .PNG，请使用此选项选择你希望的快照\"\n\n#: tfrmd3dhooksnapshotconfig.cbcleardepth.caption\nmsgid \"Clear depth buffer\"\nmsgstr \"清除深度缓冲区\"\n\n#: tfrmd3dhooksnapshotconfig.cbprogressive.caption\nmsgid \"Progressive snapshots (Do not clear background)\"\nmsgstr \"渐进快照（不清除背景）\"\n\n#: tfrmd3dhooksnapshotconfig.edtfullsnapshot.hint\nmsgid \"When this key is pressed all renders that occur will be stored\"\nmsgstr \"当按下此键时，所有发生的渲染将被存储\"\n\n#: tfrmd3dhooksnapshotconfig.edtsmallsnapshot.hint\nmsgid \"When this key is pressed all renders that occur below the mouse cursor will be stored\"\nmsgstr \"当按下此键时，鼠标光标下发生的所有渲染将被存储\"\n\n#: tfrmd3dhooksnapshotconfig.gbpictureformat.caption\nmsgid \"Picture Format\"\nmsgstr \"图片格式\"\n\n#: tfrmd3dhooksnapshotconfig.label1.caption\nmsgid \"Snapshot folder\"\nmsgstr \"快照文件夹\"\n\n#: tfrmd3dhooksnapshotconfig.label2.caption\nmsgid \"Full snapshot key\"\nmsgstr \"完整快照键\"\n\n#: tfrmd3dhooksnapshotconfig.label3.caption\nmsgid \"Focused snapshot key\"\nmsgstr \"聚焦快照键\"\n\n#: tfrmd3dhooksnapshotconfig.rbformatbmp.caption\nmsgid \"BMP (Fast, but requires a gigantic harddisk) \"\nmsgstr \"BMP（快速，但需要巨大的硬盘）\"\n\n#: tfrmd3dhooksnapshotconfig.rbformatpng.caption\nmsgid \"PNG (Slow, small files)\"\nmsgstr \"PNG（慢，小文件）\"\n\n#: tfrmd3dtrainergeneratoroptions.button2.caption\nmsgid \"Set background picture\"\nmsgstr \"设置背景图片\"\n\n#: tfrmd3dtrainergeneratoroptions.caption\nmsgid \"Direct3D Hook Options\"\nmsgstr \"Direct3D 钩子选项\"\n\n#: tfrmd3dtrainergeneratoroptions.cballowdrag.caption\nmsgid \"Allow user to drag trainer around\"\nmsgstr \"允许用户拖动训练器\"\n\n#: tfrmd3dtrainergeneratoroptions.cbhascheckbox.caption\nmsgid \"Cheats have checkboxes\"\nmsgstr \"作弊项有复选框\"\n\n#: tfrmd3dtrainergeneratoroptions.cbshowhotkeys.caption\nmsgid \"Show hotkeys\"\nmsgstr \"显示热键\"\n\n#: tfrmd3dtrainergeneratoroptions.cbstretch.caption\nmsgid \"Scale the background image\"\nmsgstr \"缩放背景图像\"\n\n#: tfrmd3dtrainergeneratoroptions.cbstretch.hint\nmsgid \"\"\n\"If selected the background image will get resized so that cheat entries will fit inside it\\n\"\n\"This is useful if you pick a 1x1 pixel size bitmap that you wish to stretch\"\nmsgstr \"\"\n\"如果选择，背景图像将被调整大小，以便作弊条目适合其中\\n\"\n\"如果你选择一个 1x1 像素大小的位图并希望拉伸，这很有用\"\n\n#: tfrmd3dtrainergeneratoroptions.cbused3dkeys.caption\nmsgid \"Use button to hide/show trainer\"\nmsgstr \"使用按钮隐藏/显示训练器\"\n\n#: tfrmd3dtrainergeneratoroptions.label1.caption\nmsgid \"Transparency\"\nmsgstr \"透明度\"\n\n#: tfrmd3dtrainergeneratoroptions.label2.caption\nmsgid \"Position\"\nmsgstr \"位置\"\n\n#: tfrmd3dtrainergeneratoroptions.label3.caption\nmsgid \"Background picture:\"\nmsgstr \"背景图片：\"\n\n#: tfrmd3dtrainergeneratoroptions.label4.caption\nmsgid \"Distance between lines in pixels\"\nmsgstr \"行间距（像素）\"\n\n#: tfrmd3dtrainergeneratoroptions.label5.caption\nmsgid \"Text distance from top\"\nmsgstr \"文本距离顶部\"\n\n#: tfrmd3dtrainergeneratoroptions.label6.caption\nmsgid \"Text distance from border\"\nmsgstr \"文本距离边框\"\n\n#: tfrmd3dtrainergeneratoroptions.lbltextcolor.caption\nmsgid \"Font text\"\nmsgstr \"字体文本\"\n\n#: tfrmd3dtrainergeneratoroptions.rbbottomleft.caption\nmsgid \"Bottom left\"\nmsgstr \"左下角\"\n\n#: tfrmd3dtrainergeneratoroptions.rbbottomright.caption\nmsgid \"Bottom right\"\nmsgstr \"右下角\"\n\n#: tfrmd3dtrainergeneratoroptions.rbcenter.caption\nmsgid \"Center\"\nmsgstr \"居中\"\n\n#: tfrmd3dtrainergeneratoroptions.rbtopleft.caption\nmsgid \"Top left\"\nmsgstr \"左上角\"\n\n#: tfrmd3dtrainergeneratoroptions.rbtopright.caption\nmsgid \"Top right\"\nmsgstr \"右上角\"\n\n#: tfrmdbvmwatchconfig.btnok.caption\nmsgid \"Start watch\"\nmsgstr \"开始监视\"\n\n#: tfrmdbvmwatchconfig.caption\nmsgid \"DBVM Watch Config\"\nmsgstr \"DBVM 监视配置\"\n\n#: tfrmdbvmwatchconfig.cblockpage.caption\nmsgid \"Lock page\"\nmsgstr \"锁定页面\"\n\n#: tfrmdbvmwatchconfig.cblockpage.hint\nmsgid \"\"\n\"This prevents the given page to get swapped out and later replaced by another physical address.  (Make sure you unlock \"\n\"before the game quits)\"\nmsgstr \"这防止给定页面被换出并随后被另一个物理地址替换。（确保在游戏退出前解锁）\"\n\n#: tfrmdbvmwatchconfig.cbmultiplerip.caption\nmsgid \"Same instruction multiple times (different registers)\"\nmsgstr \"相同指令多次（不同寄存器）\"\n\n#: tfrmdbvmwatchconfig.cbsavefpu.caption\nmsgid \"Log FPU data\"\nmsgstr \"记录 FPU 数据\"\n\n#: tfrmdbvmwatchconfig.cbsavestack.caption\nmsgid \"Log stack\"\nmsgstr \"记录堆栈\"\n\n#: tfrmdbvmwatchconfig.cbsavestack.hint\nmsgid \"Saves a stacksnapshot of 4KB for each logged entry\"\nmsgstr \"为每个记录的条目保存 4KB 的堆栈快照\"\n\n#: tfrmdbvmwatchconfig.cbwholepage.caption\nmsgid \"Log whole page instead of address range\"\nmsgstr \"记录整个页面而不是地址范围\"\n\n#: tfrmdbvmwatchconfig.gbaccesstype.caption\nmsgid \"Access Type\"\nmsgstr \"访问类型\"\n\n#: tfrmdbvmwatchconfig.label3.caption\nmsgid \"Max buffersize (entries)\"\nmsgstr \"最大缓冲区大小（条目）\"\n\n#: tfrmdbvmwatchconfig.lblphysicaladdress.caption\nmsgid \"Physical Address:\"\nmsgstr \"物理地址：\"\n\n#: tfrmdbvmwatchconfig.lblvirtualaddress.caption\nmsgid \"Virtual Address: \"\nmsgstr \"虚拟地址：\"\n\n#: tfrmdbvmwatchconfig.rbexecuteaccess.caption\nmsgid \"Execute Access\"\nmsgstr \"执行访问\"\n\n#: tfrmdbvmwatchconfig.rbreadaccess.caption\nmsgid \"Read/Write Access\"\nmsgstr \"读/写访问\"\n\n#: tfrmdbvmwatchconfig.rbwriteaccess.caption\nmsgid \"Write Access \"\nmsgstr \"写访问\"\n\n#: tfrmdebuggerattachtimeout.button1.caption\nmsgid \"Cancel wait\"\nmsgstr \"取消等待\"\n\n#: tfrmdebuggerattachtimeout.label1.caption\nmsgid \"\"\n\"The debugger attach is taking a while. This is normal when there are many symbols or the system is slow so please be \"\n\"patient. But if you don't have the time to wait or the program has crashed to desktop, then you can cancel this wait. \\n\"\n\"\\n\"\n\"Beware though that this will not stop the attaching process currently going on in the target process so you may have to \"\n\"restart the target process if you do wish to debug anyhow (and it may still freeze a few moments while symbols are \"\n\"being waited for)\\n\"\n\"\\n\"\n\"(This window will disappear automatically when attaching has finished. Closing it manually is the same as pressing \"\n\"cancel)\"\nmsgstr \"\"\n\"调试器附加需要一些时间。当符号很多或系统较慢时，这是正常的，所以请耐心等待。但如果你没有时间等待或程序已经崩溃到桌面，那么你可以取消这个等待。\\n\"\n\"\\n\"\n\"不过要注意，这不会停止当前在目标进程中进行的附加过程，因此如果你确实希望调试，可能需要重新启动目标进程（而且在等待符号时可能仍会冻结几秒钟）。\\n\"\n\"\\n\"\n\"（当附加完成时，这个窗口会自动消失。手动关闭它与按下取消是一样的）\"\n\n#: tfrmdebuggerattachtimeout.lblstatus.caption\nmsgid \"---\"\nmsgstr \"---\"\n\n#: tfrmdebugsymbolstructurelist.caption\nmsgid \"Symbol structures\"\nmsgstr \"符号结构\"\n\n#: tfrmdebugsymbolstructurelist.label2.caption\nmsgid \"Search pattern:\"\nmsgstr \"搜索模式：\"\n\n#: tfrmdebugsymbolstructurelist.lblcount.caption\nmsgid \"There are currently xxx structures in the database\"\nmsgstr \"数据库中当前有 xxx 个结构\"\n\n#: tfrmdisassemblyscan.caption\nmsgid \"Assemblyscan\"\nmsgstr \"汇编扫描\"\n\n#: tfrmdisassemblyscan.menuitem1.caption\nmsgid \"Go to this address\"\nmsgstr \"转到此地址\"\n\n#: tfrmdissectcode.caption\nmsgid \"Dissect Code\"\nmsgstr \"剖析代码\"\n\n#: tfrmdissectcode.label1.caption\nmsgid \"Maximum offset:\"\nmsgstr \"最大偏移量：\"\n\n#: tfrmdissectcode.label10.caption\nmsgid \"Custom range stop\"\nmsgstr \"自定义范围停止\"\n\n#: tfrmdissectcode.label11.caption\nmsgid \"Calls:\"\nmsgstr \"调用：\"\n\n#: tfrmdissectcode.label2.caption\nmsgid \"Select the module(s) to dissect\"\nmsgstr \"选择要剖析的模块\"\n\n#: tfrmdissectcode.label3.caption\nmsgid \"Hold CTRL to select multiple modules\"\nmsgstr \"按住 CTRL 选择多个模块\"\n\n#: tfrmdissectcode.label4.caption\nmsgid \"String references found:\"\nmsgstr \"找到的字符串引用：\"\n\n#: tfrmdissectcode.label5.caption\nmsgid \"Conditional Jumps:\"\nmsgstr \"条件跳转：\"\n\n#: tfrmdissectcode.label7.caption\nmsgid \"00:00:00\"\nmsgstr \"00:00:00\"\n\n#: tfrmdissectcode.label8.caption\nmsgid \"Custom range start\"\nmsgstr \"自定义范围开始\"\n\n#: tfrmdissectcode.label9.caption\nmsgid \"Unconditional Jumps:\"\nmsgstr \"无条件跳转：\"\n\n#: tfrmdissectwindow.button2.caption\nmsgid \"Toggle visible\"\nmsgstr \"切换可见\"\n\n#: tfrmdissectwindow.button3.caption\nmsgid \"Close window\"\nmsgstr \"关闭窗口\"\n\n#: tfrmdissectwindow.button4.caption\nmsgid \"Capture Timer Messages\"\nmsgstr \"捕获计时器消息\"\n\n#: tfrmdissectwindow.button6.caption\nmsgid \"Change text\"\nmsgstr \"更改文本\"\n\n#: tfrmdriverlist.find1.caption\nmsgid \"Find Driver\"\nmsgstr \"查找驱动程序\"\n\n#: tfrmdriverlist.menuitem1.caption\nmsgid \"Find Exportname\"\nmsgstr \"查找导出名称\"\n\n#: tfrmedithistory.caption\nmsgid \"Write log\"\nmsgstr \"写入日志\"\n\n#: tfrmedithistory.cblogwrites.caption\nmsgid \"Enable write logging\"\nmsgstr \"启用写入日志\"\n\n#: tfrmedithistory.lvwritelog.columns[1].caption\nmsgid \"Original bytes\"\nmsgstr \"原始字节\"\n\n#: tfrmedithistory.lvwritelog.columns[2].caption\nmsgid \"New bytes\"\nmsgstr \"新字节\"\n\n#: tfrmenumeratedlls.button2.caption\nmsgid \"Cancel Enum\"\nmsgstr \"取消枚举\"\n\n#: tfrmenumeratedlls.caption\nmsgid \"Enumerate DLL's\"\nmsgstr \"枚举 DLL\"\n\n#: tfrmenumeratedlls.copysymbolname.caption\nmsgid \"Copy Symbol Name\"\nmsgstr \"复制符号名称\"\n\n#: tfrmexceptionignorelist.btnadd.caption\nmsgid \"Add Exception \"\nmsgstr \"添加异常\"\n\n#: tfrmexceptionignorelist.caption\nmsgid \"Exception ignore list\"\nmsgstr \"异常忽略列表\"\n\n#: tfrmexceptionignorelist.label1.caption\nmsgid \"The following exceptions will be ignored\"\nmsgstr \"以下异常将被忽略\"\n\n#: tfrmexceptionignorelist.label2.caption\nmsgid \"Exception code\"\nmsgstr \"异常代码\"\n\n#: tfrmexcludehide.caption\nmsgid \"Show/Hide settings\"\nmsgstr \"显示/隐藏设置\"\n\n#: tfrmexcludehide.label1.caption\nmsgid \"\"\n\"Select the processes you want to exclude from being hidden. Doubleclick the process to add it to the list. (Or remove \"\n\"it from the list)\"\nmsgstr \"选择要排除在隐藏之外的进程。双击进程将其添加到列表中。（或从列表中移除）\"\n\n#: tfrmexcludehide.label2.caption\nmsgid \"Current process list\"\nmsgstr \"当前进程列表\"\n\n#: tfrmexcludehide.label3.caption\nmsgid \"List of processes that will not hide\"\nmsgstr \"不会隐藏的进程列表\"\n\n#: tfrmexcludehide.label4.caption\nmsgid \"\"\n\"Select the way cheat Engine hides/shows windows. (Will not work if a window that gets hidden or shown is not \"\n\"responding. E.g:Paused)\"\nmsgstr \"选择 Cheat Engine 隐藏/显示窗口的方式。（如果被隐藏或显示的窗口没有响应，则无效。例如：暂停）\"\n\n#: tfrmexcludehide.radiobutton1.caption\nmsgid \"Only hide/show the foreground window\"\nmsgstr \"仅隐藏/显示前景窗口\"\n\n#: tfrmexcludehide.radiobutton2.caption\nmsgid \"Hide/show ALL windows\"\nmsgstr \"隐藏/显示所有窗口\"\n\n#: tfrmexetrainergenerator.btnaddfile.caption\nmsgid \"Add file(s)\"\nmsgstr \"添加文件\"\n\n#: tfrmexetrainergenerator.btnremovefile.caption\nmsgid \"Remove file\"\nmsgstr \"移除文件\"\n\n#: tfrmexetrainergenerator.button1.caption\nmsgid \"Change EXE Icon\"\nmsgstr \"更改 EXE 图标\"\n\n#: tfrmexetrainergenerator.button3.caption\nmsgid \"Add folder\"\nmsgstr \"添加文件夹\"\n\n#: tfrmexetrainergenerator.caption\nmsgid \"Exe Trainer Generator\"\nmsgstr \"Exe 训练器生成器\"\n\n#: tfrmexetrainergenerator.cbccode.caption\nmsgid \"C-Code\"\nmsgstr \"C代码\"\n\n#: tfrmexetrainergenerator.cbd3dhook.caption\nmsgid \"D3DHook\"\nmsgstr \"D3DHook\"\n\n#: tfrmexetrainergenerator.cbdotnet.caption\nmsgid \".NET\"\nmsgstr \".NET\"\n\n#: tfrmexetrainergenerator.cbgigantic.caption\nmsgid \"Gigantic\"\nmsgstr \"巨大\"\n\n#: tfrmexetrainergenerator.cbgigantic.hint\nmsgid \"Puts the Cheat Engine executable, dll's and other requirements into the trainer\"\nmsgstr \"将 Cheat Engine 可执行文件、dll 和其他要求放入训练器中\"\n\n#: tfrmexetrainergenerator.cbincludes.caption\nmsgid \"C-#includes\"\nmsgstr \"C-#includes\"\n\n#: tfrmexetrainergenerator.cbkerneldebug.caption\nmsgid \"Kernel Tools\"\nmsgstr \"内核工具\"\n\n#: tfrmexetrainergenerator.cbmodplayer.caption\nmsgid \"Module Player\"\nmsgstr \"模块播放器\"\n\n#: tfrmexetrainergenerator.cbspeedhack.caption\nmsgid \"Speedhack\"\nmsgstr \"速度黑客\"\n\n#: tfrmexetrainergenerator.cbtiny.caption\nmsgid \"Tiny\"\nmsgstr \"微型\"\n\n#: tfrmexetrainergenerator.cbtiny.hint\nmsgid \"Only put the trainer data in the trainer. The user must have Cheat Engine installed to run this trainer\"\nmsgstr \"仅将训练器数据放入训练器中。用户必须安装 Cheat Engine 才能运行此训练器\"\n\n#: tfrmexetrainergenerator.groupbox1.caption\nmsgid \"Process\"\nmsgstr \"进程\"\n\n#: tfrmexetrainergenerator.groupbox2.caption\nmsgid \"Features used\"\nmsgstr \"使用的功能\"\n\n#: tfrmexetrainergenerator.groupbox3.caption\nmsgid \"Extra files\"\nmsgstr \"额外文件\"\n\n#: tfrmexetrainergenerator.groupbox4.caption\nmsgid \"Trainer size\"\nmsgstr \"训练器大小\"\n\n#: tfrmexetrainergenerator.listview1.columns[1].caption\nmsgid \"Relative folder\"\nmsgstr \"相对文件夹\"\n\n#: tfrmexetrainergenerator.mieditfolder.caption\nmsgid \"Edit folder\"\nmsgstr \"编辑文件夹\"\n\n#: tfrmexetrainergenerator.rb32.caption\nmsgid \"Target is 32-bit\"\nmsgstr \"目标是 32 位\"\n\n#: tfrmexetrainergenerator.rb64.caption\nmsgid \"Target is 64-bit\"\nmsgstr \"目标是 64 位\"\n\n#: tfrmfillmemory.caption\nmsgid \"Fill memory\"\nmsgstr \"填充内存\"\n\n#: tfrmfillmemory.label3.caption\nmsgid \"Fill with\"\nmsgstr \"填充为\"\n\n#: tfrmfinddialog.gbdirection.caption\nmsgid \"Direction\"\nmsgstr \"方向\"\n\n#: tfrmfinddialog.lbldescription.caption\nmsgid \"Enter the text to search:\"\nmsgstr \"输入要搜索的文本：\"\n\n#: tfrmfinddialog.rbdirectiondown.caption\nmsgid \"Down\"\nmsgstr \"下\"\n\n#: tfrmfinddialog.rbdirectionup.caption\nmsgid \"Up\"\nmsgstr \"上\"\n\n#: tfrmfindstatics.checkbox1.caption\nmsgid \"Only disassemble and check executable code\"\nmsgstr \"仅反汇编并检查可执行代码\"\n\n#: tfrmfindstatics.edit1.text\nmsgid \"00401000\"\nmsgstr \"00401000\"\n\n#: tfrmfindstatics.edit2.text\nmsgid \"00700000\"\nmsgstr \"00700000\"\n\n#: tfrmfindstatics.label4.caption\nmsgid \"Filter addresses\"\nmsgstr \"过滤地址\"\n\n#: tfrmfindstatics.listview1.columns[1].caption\nmsgid \"Pointer?\"\nmsgstr \"指针？\"\n\n#: tfrmfindstatics.listview1.columns[2].caption\nmsgid \"Reference count\"\nmsgstr \"引用计数\"\n\n#: tfrmfloatingpointpanel.caption\nmsgid \"FPU\"\nmsgstr \"FPU\"\n\n#: tfrmfloatingpointpanel.cbclassicview.caption\nmsgid \"Classic view\"\nmsgstr \"经典视图\"\n\n#: tfrmfloatingpointpanel.cbcontextsection.text\nmsgid \"XMMRegisters\"\nmsgstr \"XMM寄存器\"\n\n#: tfrmfloatingpointpanel.tabsheet2.caption\nmsgid \"Extended\"\nmsgstr \"扩展\"\n\n#: tfrmfoundlistpreferences.btnfont.caption\nmsgid \"Font\"\nmsgstr \"字体\"\n\n#: tfrmfoundlistpreferences.caption\nmsgid \"Foundlist Customizer\"\nmsgstr \"找到列表自定义器\"\n\n#: tfrmfoundlistpreferences.cbshowstaticasstatic.caption\nmsgid \"Show static addresses using their static notation\"\nmsgstr \"使用其静态表示法显示静态地址\"\n\n#: tfrmfoundlistpreferences.cbusethisfontsize.caption\nmsgid \"override font size\"\nmsgstr \"覆盖字体大小\"\n\n#: tfrmfoundlistpreferences.label2.caption\nmsgid \"Example\"\nmsgstr \"示例\"\n\n#: tfrmfoundlistpreferences.label3.caption\nmsgid \"Dynamic\"\nmsgstr \"动态\"\n\n#: tfrmfoundlistpreferences.label4.caption\nmsgid \"Normal value\"\nmsgstr \"正常值\"\n\n#: tfrmfoundlistpreferences.label7.caption\nmsgid \"'Compare To' header color\"\nmsgstr \"'比较到'标题颜色\"\n\n#: tfrmfoundlistpreferences.pnlexample.caption\nmsgid \"pnlExample\"\nmsgstr \"pnl示例\"\n\n#: tfrmgdbserverconnectdialog.caption\nmsgid \"GDB Server connect\"\nmsgstr \"GDB 服务器连接\"\n\n#: tfrmgdbserverconnectdialog.edit1.text\nmsgid \"localhost\"\nmsgstr \"本地主机\"\n\n#: tfrmgdbserverconnectdialog.label1.caption\nmsgid \"Hostname\"\nmsgstr \"主机名\"\n\n#: tfrmgdtinfo.caption\nmsgid \"GDT\"\nmsgstr \"GDT\"\n\n#: tfrmgroupscanalgoritmgenerator.cboutoforder.caption\nmsgid \"Out of order\"\nmsgstr \"无序\"\n\n#: tfrmgroupscanalgoritmgenerator.cbtypealigned.caption\nmsgid \"Must be type-aligned\"\nmsgstr \"必须按类型对齐\"\n\n#: tfrmgroupscanalgoritmgenerator.lblblockalignment.caption\nmsgid \"Block alignment\"\nmsgstr \"块对齐\"\n\n#: tfrmgroupscanalgoritmgenerator.lblblocksize.caption\nmsgid \"Blocksize\"\nmsgstr \"块大小\"\n\n#: tfrmgroupscanalgoritmgenerator.lblmin.caption\nmsgid \"lblMin\"\nmsgstr \"lblMin\"\n\n#: tfrmgroupscanalgoritmgenerator.lblmustbedividable.caption\nmsgid \"Must be dividable by 4\"\nmsgstr \"必须能被 4 整除\"\n\n#: tfrmgroupscanalgoritmgenerator.lblwildcardexplanation.caption\nmsgid \"Leave a value empty or use * for wildcard\"\nmsgstr \"留空值或使用 * 作为通配符\"\n\n#: tfrmheaps.caption\nmsgid \"Current Heaplist\"\nmsgstr \"当前堆列表\"\n\n#: tfrmhighlightereditor.caption\nmsgid \"Highlighter configurator\"\nmsgstr \"高亮配置器\"\n\n#: tfrmhighlightereditor.cbbold.caption\nmsgid \"Bold\"\nmsgstr \"粗体\"\n\n#: tfrmhighlightereditor.cbitalic.caption\nmsgid \"Italic\"\nmsgstr \"斜体\"\n\n#: tfrmhighlightereditor.cbstrikeout.caption\nmsgid \"Strikeout\"\nmsgstr \"删除线\"\n\n#: tfrmhighlightereditor.cbunderline.caption\nmsgid \"Underline\"\nmsgstr \"下划线\"\n\n#: tfrmhighlightereditor.label3.caption\nmsgid \"Foreground Color\"\nmsgstr \"前景色\"\n\n#: tfrmhighlightereditor.label4.caption\nmsgid \"Style\"\nmsgstr \"样式\"\n\n#: tfrmidt.caption\nmsgid \"IDT\"\nmsgstr \"IDT\"\n\n#: tfrmiptlogdisplay.caption\nmsgid \"IPT Log Display\"\nmsgstr \"IPT 日志显示\"\n\n#: tfrmiptlogdisplay.cbshowastree.caption\nmsgid \"Show as tree\"\nmsgstr \"以树形显示\"\n\n#: tfrmiptlogdisplay.menuitem3.caption\nmsgid \"Save to textfile\"\nmsgstr \"保存到文本文件\"\n\n#: tfrmloadmemory.caption\nmsgid \"Load Memory Region\"\nmsgstr \"加载内存区域\"\n\n#: tfrmluaengine.cbshowonprint.caption\nmsgid \"Show on \\\"print\\\"\"\nmsgstr \"在“打印”上显示\"\n\n#: tfrmluaengine.menuitem2.caption\nmsgid \"Open script\"\nmsgstr \"打开脚本\"\n\n#: tfrmluaengine.menuitem3.caption\nmsgid \"Save current script\"\nmsgstr \"保存当前脚本\"\n\n#: tfrmluaengine.menuitem5.caption\nmsgid \"Clear output\"\nmsgstr \"清除输出\"\n\n#: tfrmluaengine.miautocomplete.caption\nmsgid \"Autocomplete\"\nmsgstr \"自动完成\"\n\n#: tfrmluaengine.mictrlccancelsscript.caption\nmsgid \"Ctrl+Alt+C cancels current script\"\nmsgstr \"Ctrl+Alt+C 取消当前脚本\"\n\n#: tfrmluaengine.mictrlccancelsscript.hint\nmsgid \"\"\n\"This makes the the script run under the Lua debugger even when no breakpoint is set. This will allow the script to get \"\n\"canceled when it sees CTRL and C are down (Slows down the script slightly)\"\nmsgstr \"这使得脚本在 Lua 调试器下运行，即使没有设置断点。这将允许脚本在看到 CTRL 和 C 被按下时被取消（稍微减慢脚本速度）\"\n\n#: tfrmluaengine.mifindreplace.caption\nmsgid \"Find/Replace\"\nmsgstr \"查找/替换\"\n\n#: tfrmluaengine.miresizeoutput.caption\nmsgid \"Resize output on resize\"\nmsgstr \"在调整大小时调整输出\"\n\n#: tfrmluaengine.misavecurrentscriptas.caption\nmsgid \"Save current script as...\"\nmsgstr \"将当前脚本另存为...\"\n\n#: tfrmluaengine.mishowscriptinoutput.caption\nmsgid \"Show script in output\"\nmsgstr \"在输出中显示脚本\"\n\n#: tfrmluaengine.misinglestep.caption\nmsgid \"Single step\"\nmsgstr \"单步执行\"\n\n#: tfrmluaengine.tbrun.caption\nmsgid \"tbRun\"\nmsgstr \"tbRun\"\n\n#: tfrmluaengine.tbrun.hint\nmsgid \"Continue\"\nmsgstr \"继续\"\n\n#: tfrmluaengine.tbsinglestep.caption\nmsgid \"tbSingleStep\"\nmsgstr \"tbSingleStep\"\n\n#: tfrmluaengine.tbsinglestep.hint\nmsgid \"Single Step\"\nmsgstr \"单步执行\"\n\n#: tfrmluaengine.tbstopdebug.caption\nmsgid \"tbStopDebug\"\nmsgstr \"tbStopDebug\"\n\n#: tfrmluascriptquestion.caption\nmsgid \"Execute this lua script?\"\nmsgstr \"执行这个 lua 脚本吗？\"\n\n#: tfrmluascriptquestion.groupbox5.caption\nmsgid \"Future reference:\"\nmsgstr \"供将来参考：\"\n\n#: tfrmluascriptquestion.rbalways.hint\nmsgid \"Don't show this dialog anymore and always execute the scripts\"\nmsgstr \"不再显示此对话框并始终执行脚本\"\n\n#: tfrmluascriptquestion.rbalwaysask.hint\nmsgid \"Always show this dialog, even if trusted\"\nmsgstr \"始终显示此对话框，即使是受信任的\"\n\n#: tfrmluascriptquestion.rbnever.hint\nmsgid \"Don't show this dialog anymore and never execute the scripts\"\nmsgstr \"不再显示此对话框并永远不执行脚本\"\n\n#: tfrmluascriptquestion.rbsignedonly.hint\nmsgid \"Only automatically execute lua scripts from trusted sources, else ask\"\nmsgstr \"仅自动执行来自受信任来源的 lua 脚本，否则询问\"\n\n#: tfrmmemoryallochandler.btnreload.caption\nmsgid \"Reload\"\nmsgstr \"重新加载\"\n\n#: tfrmmemoryallochandler.button1.caption\nmsgid \"Check Address\"\nmsgstr \"检查地址\"\n\n#: tfrmmemoryallochandler.caption\nmsgid \"Memory Allocations\"\nmsgstr \"内存分配\"\n\n#: tfrmmemoryallochandler.cbhookallocs.caption\nmsgid \"Hook alloc functions\"\nmsgstr \"钩住分配函数\"\n\n#: tfrmmemoryallochandler.groupbox1.caption\nmsgid \"Data\"\nmsgstr \"数据\"\n\n#: tfrmmemoryallochandler.label1.caption\nmsgid \"Flags:\"\nmsgstr \"标志：\"\n\n#: tfrmmemoryallochandler.label2.caption\nmsgid \"Base Address:\"\nmsgstr \"基地址：\"\n\n#: tfrmmemoryallochandler.label3.caption\nmsgid \"HeapHandle\"\nmsgstr \"HeapHandle\"\n\n#: tfrmmemoryallochandler.lblerr.caption\nmsgid \"Couldn't find in heap. Found using the Alloc hook. (Not very useful)\"\nmsgstr \"在堆中找不到。使用分配钩子找到。（不是很有用）\"\n\n#: tfrmmemoryallochandler.statusbar1.panels[0].text\nmsgid \"-\"\nmsgstr \"-\"\n\n#: tfrmmemoryallochandler.statusbar1.panels[1].text\nmsgid \"--\"\nmsgstr \"--\"\n\n#: tfrmmemoryrecorddropdownsettings.caption\nmsgid \"Dropdown options\"\nmsgstr \"下拉选项\"\n\n#: tfrmmemoryrecorddropdownsettings.cbdisallowuserinput.caption\nmsgid \"Disallow manual user input\"\nmsgstr \"不允许手动用户输入\"\n\n#: tfrmmemoryrecorddropdownsettings.cbdisplayasdropdownitem.caption\nmsgid \"Make the record display values like the dropdown list\"\nmsgstr \"使记录显示的值像下拉列表一样\"\n\n#: tfrmmemoryrecorddropdownsettings.cbonlyshowdescription.caption\nmsgid \"Only show the description part\"\nmsgstr \"仅显示描述部分\"\n\n#: tfrmmemoryrecorddropdownsettings.label1.caption\nmsgid \"Leave empty for no dropdown list\"\nmsgstr \"留空以不显示下拉列表\"\n\n#: tfrmmemoryrecorddropdownsettings.label2.caption\nmsgid \"Value:Description or (memrecdescription)\"\nmsgstr \"值：描述或（memrecdescription）\"\n\n#: tfrmmemoryrecorddropdownsettings.label3.caption\nmsgid \"*:Text Value to display if no value in the list is found\"\nmsgstr \"*:如果列表中未找到值，则显示的文本值\"\n\n#: tfrmmemoryrecorddropdownsettings.lblformat.caption\nmsgid \"Format:\"\nmsgstr \"格式：\"\n\n#: tfrmmemreccombobox.label1.caption\nmsgid \"Change value to:\"\nmsgstr \"更改值为：\"\n\n#: tfrmmemviewpreferences.btnfont.caption\nmsgid \"Change disassembler font\"\nmsgstr \"更改反汇编器字体\"\n\n#: tfrmmemviewpreferences.btnhexfont.caption\nmsgid \"Change hexview font\"\nmsgstr \"更改十六进制视图字体\"\n\n#: tfrmmemviewpreferences.btnregisterviewfont.caption\nmsgid \"Change registerview font\"\nmsgstr \"更改寄存器视图字体\"\n\n#: tfrmmemviewpreferences.caption\nmsgid \"Disassembler Preferences\"\nmsgstr \"反汇编器首选项\"\n\n#: tfrmmemviewpreferences.cbcenterdisassemblerwhenoutsideview.caption\nmsgid \"Center disassembler when changing address outside of current view\"\nmsgstr \"在更改当前视图外的地址时居中反汇编器\"\n\n#: tfrmmemviewpreferences.cboriginalrenderingsystem.caption\nmsgid \"Original rendering system (Slow on mac)\"\nmsgstr \"原始渲染系统（在 Mac 上较慢）\"\n\n#: tfrmmemviewpreferences.cbpastemovescursor.caption\nmsgid \"Paste moves cursor\"\nmsgstr \"粘贴移动光标\"\n\n#: tfrmmemviewpreferences.cbpastemovescursor.hint\nmsgid \"When pasting move the cursor by the size of the paste\"\nmsgstr \"粘贴时按粘贴的大小移动光标\"\n\n#: tfrmmemviewpreferences.cbshowstatusbar.caption\nmsgid \"Show statusbar\"\nmsgstr \"显示状态栏\"\n\n#: tfrmmemviewpreferences.groupbox2.caption\nmsgid \"Disassembler\"\nmsgstr \"反汇编器\"\n\n#: tfrmmemviewpreferences.groupbox3.caption\nmsgid \"Hexview\"\nmsgstr \"十六进制视图\"\n\n#: tfrmmemviewpreferences.groupbox6.caption\nmsgid \"Register panel\"\nmsgstr \"寄存器面板\"\n\n#: tfrmmemviewpreferences.groupbox7.hint\nmsgid \"Left click to change the font color, rightclick to change the background color\"\nmsgstr \"左键单击更改字体颜色，右键单击更改背景颜色\"\n\n#: tfrmmemviewpreferences.label4.caption\nmsgid \"Thickness\"\nmsgstr \"厚度\"\n\n#: tfrmmemviewpreferences.label5.caption\nmsgid \"Spacing\"\nmsgstr \"间距\"\n\n#: tfrmmemviewpreferences.label6.caption\nmsgid \"Above\"\nmsgstr \"上方\"\n\n#: tfrmmemviewpreferences.label7.caption\nmsgid \"Below\"\nmsgstr \"下方\"\n\n#: tfrmmemviewpreferences.lblhexcursor.caption\nmsgid \"Cursor\"\nmsgstr \"光标\"\n\n#: tfrmmemviewpreferences.lblhexdifferent.caption\nmsgid \"Different\"\nmsgstr \"不同\"\n\n#: tfrmmemviewpreferences.lblhexediting.caption\nmsgid \"Editing\"\nmsgstr \"编辑\"\n\n#: tfrmmemviewpreferences.lblhexfadecolor.caption\nmsgid \"FadeColor\"\nmsgstr \"渐变颜色\"\n\n#: tfrmmemviewpreferences.lblhexsecondaryediting.caption\nmsgid \"SecondaryEditing\"\nmsgstr \"二次编辑\"\n\n#: tfrmmemviewpreferences.lblhexseperator.caption\nmsgid \"Seperator line\"\nmsgstr \"分隔线\"\n\n#: tfrmmemviewpreferences.lblhextopline.caption\nmsgid \"Top line\"\nmsgstr \"顶部线\"\n\n#: tfrmmemviewpreferences.lblnormal.caption\nmsgid \"Default color\"\nmsgstr \"默认颜色\"\n\n#: tfrmmemviewpreferences.lblreghighlightaccess.caption\nmsgid \"Highlight Access\"\nmsgstr \"高亮访问\"\n\n#: tfrmmemviewpreferences.lblreghighlightchange.caption\nmsgid \"Highlight Change\"\nmsgstr \"高亮更改\"\n\n#: tfrmmemviewpreferences.mirestoretodefaults.caption\nmsgid \"Restore to defaults\"\nmsgstr \"恢复默认设置\"\n\n#: tfrmmicrotransactions.bitbtn1.caption\nmsgid \"BUY 10 for $0.99\"\nmsgstr \"购买 10 个，价格 $0.99\"\n\n#: tfrmmicrotransactions.bitbtn2.caption\nmsgid \"BUY 100 for $8.99\"\nmsgstr \"购买 100 个，价格 $8.99\"\n\n#: tfrmmicrotransactions.bitbtn3.caption\nmsgid \"BUY 1000 for $79.99\"\nmsgstr \"购买 1000 个，价格 $79.99\"\n\n#: tfrmmicrotransactions.caption\nmsgid \"Cheat-E-Coins\"\nmsgstr \"作弊币\"\n\n#: tfrmmicrotransactions.label1.caption\nmsgid \"Cheat-E-coins left in your inventory:\"\nmsgstr \"你库存中剩余的作弊币：\"\n\n#: tfrmmodifyregisters.caption\nmsgid \"Modify register(s) at xxxxxxxx\"\nmsgstr \"在 xxxxxxxx 修改寄存器\"\n\n#: tfrmmodifyregisters.cbaf.caption\nmsgid \"AF\"\nmsgstr \"AF\"\n\n#: tfrmmodifyregisters.cbcf.caption\nmsgid \"CF\"\nmsgstr \"CF\"\n\n#: tfrmmodifyregisters.cbchangeext.caption\nmsgid \"Change extended state (FPU/XMM)\"\nmsgstr \"更改扩展状态（FPU/XMM）\"\n\n#: tfrmmodifyregisters.cbof.caption\nmsgid \"OF\"\nmsgstr \"OF\"\n\n#: tfrmmodifyregisters.cbpf.caption\nmsgid \"PF\"\nmsgstr \"PF\"\n\n#: tfrmmodifyregisters.cbsf.caption\nmsgid \"SF\"\nmsgstr \"SF\"\n\n#: tfrmmodifyregisters.cbusedbvm.caption\nmsgid \"Use DBVM Cloaked BP's\"\nmsgstr \"使用 DBVM 隐藏的 BP\"\n\n#: tfrmmodifyregisters.cbzf.caption\nmsgid \"ZF\"\nmsgstr \"ZF\"\n\n#: tfrmmodifyregisters.label1.caption\nmsgid \"EAX\"\nmsgstr \"EAX\"\n\n#: tfrmmodifyregisters.label10.caption\nmsgid \"PA\"\nmsgstr \"PA\"\n\n#: tfrmmodifyregisters.label17.caption\nmsgid \"R8\"\nmsgstr \"R8\"\n\n#: tfrmmodifyregisters.label18.caption\nmsgid \"R9\"\nmsgstr \"R9\"\n\n#: tfrmmodifyregisters.label19.caption\nmsgid \"R10\"\nmsgstr \"R10\"\n\n#: tfrmmodifyregisters.label2.caption\nmsgid \"EBX\"\nmsgstr \"EBX\"\n\n#: tfrmmodifyregisters.label20.caption\nmsgid \"R11\"\nmsgstr \"R11\"\n\n#: tfrmmodifyregisters.label21.caption\nmsgid \"R12\"\nmsgstr \"R12\"\n\n#: tfrmmodifyregisters.label22.caption\nmsgid \"R13\"\nmsgstr \"R13\"\n\n#: tfrmmodifyregisters.label23.caption\nmsgid \"R14\"\nmsgstr \"R14\"\n\n#: tfrmmodifyregisters.label24.caption\nmsgid \"R15\"\nmsgstr \"R15\"\n\n#: tfrmmodifyregisters.label25.caption\nmsgid \"Leave blank if you don't want to edit the register or flag\"\nmsgstr \"如果你不想编辑寄存器或标志，请留空\"\n\n#: tfrmmodifyregisters.label3.caption\nmsgid \"ECX\"\nmsgstr \"ECX\"\n\n#: tfrmmodifyregisters.label4.caption\nmsgid \"EDX\"\nmsgstr \"EDX\"\n\n#: tfrmmodifyregisters.label5.caption\nmsgid \"ESI\"\nmsgstr \"ESI\"\n\n#: tfrmmodifyregisters.label6.caption\nmsgid \"EDI\"\nmsgstr \"EDI\"\n\n#: tfrmmodifyregisters.label7.caption\nmsgid \"EBP\"\nmsgstr \"EBP\"\n\n#: tfrmmodifyregisters.label8.caption\nmsgid \"ESP\"\nmsgstr \"ESP\"\n\n#: tfrmmodifyregisters.label9.caption\nmsgid \"EIP\"\nmsgstr \"EIP\"\n\n#: tfrmmodulesafety.caption\nmsgid \"Module safety\"\nmsgstr \"模块安全性\"\n\n#: tfrmmodulesafety.cbglobaldeny.caption\nmsgid \"Global\"\nmsgstr \"全局\"\n\n#: tfrmmodulesafety.rballowlist.caption\nmsgid \"Prevent all modules from getting loaded except:\"\nmsgstr \"防止所有模块加载，除非：\"\n\n#: tfrmmodulesafety.rbdenylist.caption\nmsgid \"Allow all modules to be loaded except:\"\nmsgstr \"允许加载所有模块，除非：\"\n\n#: tfrmnetworkconfig.caption\nmsgid \"Connect to server\"\nmsgstr \"连接到服务器\"\n\n#: tfrmnetworkconfig.groupbox1.caption\nmsgid \"Discovered and previous servers\"\nmsgstr \"发现的和以前的服务器\"\n\n#: tfrmnetworkconfig.lbloptionalname.caption\nmsgid \"Name (Optional)\"\nmsgstr \"名称（可选）\"\n\n#: tfrmnetworkconfig.lviplist.columns[0].caption\nmsgid \"IP/Name\"\nmsgstr \"IP/名称\"\n\n#: tfrmnetworkdatacompression.caption\nmsgid \"Compression level\"\nmsgstr \"压缩级别\"\n\n#: tfrmnetworkdatacompression.label1.caption\nmsgid \"\"\n\"Change the compression level you wish to use when transferring/receiving memory.\\n\"\n\"Pick a good balance between cpu power of the device and network bandwidth\"\nmsgstr \"更改在传输/接收内存时希望使用的压缩级别。选择设备的 CPU 功率和网络带宽之间的良好平衡\"\n\n#: tfrmnetworkdatacompression.lblmaxcompression.caption\nmsgid \"Max Compression\"\nmsgstr \"最大压缩\"\n\n#: tfrmnetworkdatacompression.lblnone.caption\nmsgid \"No Compression\"\nmsgstr \"无压缩\"\n\n#: tfrmpastetableentry.caption\nmsgid \"Paste table entries\"\nmsgstr \"粘贴表项\"\n\n#: tfrmpastetableentry.cbchildrenaswell.caption\nmsgid \"Adjust children as well\"\nmsgstr \"同时调整子项\"\n\n#: tfrmpastetableentry.label1.caption\nmsgid \"Text to find:\"\nmsgstr \"要查找的文本：\"\n\n#: tfrmpastetableentry.label2.caption\nmsgid \"Replace with:\"\nmsgstr \"替换为：\"\n\n#: tfrmpastetableentry.label3.caption\nmsgid \"Adjust address by: \"\nmsgstr \"地址调整：\"\n\n#: tfrmpastetableentry.label4.caption\nmsgid \"Adjust pointer last offset by: \"\nmsgstr \"指针最后偏移调整：\"\n\n#: tfrmpeinfo.caption\nmsgid \"Portable Executable (PE) Info\"\nmsgstr \"可移植执行文件（PE）信息\"\n\n#: tfrmpeinfo.groupbox1.caption\nmsgid \"MZ-Start\"\nmsgstr \"MZ-开始\"\n\n#: tfrmpeinfo.label1.caption\nmsgid \"No file opened\"\nmsgstr \"未打开文件\"\n\n#: tfrmpeinfo.micopyeverything.caption\nmsgid \"Copy everything to clipboard\"\nmsgstr \"将所有内容复制到剪贴板\"\n\n#: tfrmpeinfo.micopytab.caption\nmsgid \"Copy tab to clipboard\"\nmsgstr \"将选项卡复制到剪贴板\"\n\n#: tfrmpeinfo.radiobutton2.caption\nmsgid \"Memory\"\nmsgstr \"内存\"\n\n#: tfrmpeinfo.tabsheet2.caption\nmsgid \"Imports\"\nmsgstr \"导入\"\n\n#: tfrmpeinfo.tabsheet3.caption\nmsgid \"Exports\"\nmsgstr \"导出\"\n\n#: tfrmpeinfo.tabsheet4.caption\nmsgid \"Base Relocations\"\nmsgstr \"基本重定位\"\n\n#: tfrmpointerscanner.btnconnect.caption\nmsgid \"Add to connection list\"\nmsgstr \"添加到连接列表\"\n\n#: tfrmpointerscanner.btndecreasethreadcount.caption\nmsgid \"Decrease worker count\"\nmsgstr \"减少工作线程数量\"\n\n#: tfrmpointerscanner.btnincreasethreadcount.caption\nmsgid \"Increase worker count\"\nmsgstr \"增加工作线程数量\"\n\n#: tfrmpointerscanner.btnstoprescanloop.caption\nmsgid \"Stop rescan loop\"\nmsgstr \"停止重新扫描循环\"\n\n#: tfrmpointerscanner.btnstopscan.hint\nmsgid \"This will stop the current scan and show you the results it has found\"\nmsgstr \"这将停止当前扫描并显示已找到的结果\"\n\n#: tfrmpointerscanner.cbnonresponsive.caption\nmsgid \"Non responsive connection\"\nmsgstr \"无响应的连接\"\n\n#: tfrmpointerscanner.cbtestcrappyconnection.caption\nmsgid \"Simulate no connection\"\nmsgstr \"模拟无连接\"\n\n#: tfrmpointerscanner.cbtrusted.caption\nmsgid \"Trust stability\"\nmsgstr \"信任稳定性\"\n\n#: tfrmpointerscanner.cbtrusted.hint\nmsgid \"Trust that this server will not disappear during the scan and that the children it trusts itself won't do so either\"\nmsgstr \"信任该服务器在扫描期间不会消失，并且它信任的子项也不会消失\"\n\n#: tfrmpointerscanner.lblthreadpriority.caption\nmsgid \"Scanner thread priority:\"\nmsgstr \"扫描线程优先级：\"\n\n#: tfrmpointerscanner.menuitem1.caption\nmsgid \"Show modulelist\"\nmsgstr \"显示模块列表\"\n\n#: tfrmpointerscanner.menuitem2.caption\nmsgid \"Distributed pointer scan\"\nmsgstr \"分布式指针扫描\"\n\n#: tfrmpointerscanner.method3fastspeedandaveragememoryusage1.caption\nmsgid \"Scan for pointer\"\nmsgstr \"扫描指针\"\n\n#: tfrmpointerscanner.micreatepsnnode.caption\nmsgid \"Setup as PSN worker and/or node\"\nmsgstr \"设置为 PSN 工作线程和/或节点\"\n\n#: tfrmpointerscanner.midisconnect.caption\nmsgid \"Disconnect\"\nmsgstr \"断开连接\"\n\n#: tfrmpointerscanner.miexporttosqlite.caption\nmsgid \"Export to sqlite database\"\nmsgstr \"导出到 sqlite 数据库\"\n\n#: tfrmpointerscanner.miforcedisconnect.caption\nmsgid \"Unsafe disconnect\"\nmsgstr \"不安全断开连接\"\n\n#: tfrmpointerscanner.miimportfromsqlite.caption\nmsgid \"Import from sqlite database\"\nmsgstr \"从 sqlite 数据库导入\"\n\n#: tfrmpointerscanner.miresume.caption\nmsgid \"Resume scan\"\nmsgstr \"恢复扫描\"\n\n#: tfrmpointerscanner.pnldata.caption\nmsgid \"pnlData\"\nmsgstr \"pnlData\"\n\n#: tfrmpointerscanner.pointerscanner1.caption\nmsgid \"Pointer scanner\"\nmsgstr \"指针扫描器\"\n\n#: tfrmpointerscanner.rescanmemory1.caption\nmsgid \"Rescan memory - Removes pointers not pointing to the right address\"\nmsgstr \"重新扫描内存 - 移除未指向正确地址的指针\"\n\n#: tfrmpointerscanner.resyncmodulelist1.caption\nmsgid \"Resync modulelist\"\nmsgstr \"重新同步模块列表\"\n\n#: tfrmpointerscanner.savedialog1.title\nmsgid \"Specify the filename you want to store the results\"\nmsgstr \"指定要存储结果的文件名\"\n\n#: tfrmpointerscanner.savedialog2.title\nmsgid \"Specify the filename for the pointermap you're about to generate\"\nmsgstr \"指定即将生成的指针图的文件名\"\n\n#: tfrmpointerscannersettings.caption\nmsgid \"Pointerscanner scanoptions\"\nmsgstr \"指针扫描器扫描选项\"\n\n#: tfrmpointerscannersettings.cbacceptnonmodulevtable.caption\nmsgid \"Also accept non-module addresses\"\nmsgstr \"也接受非模块地址\"\n\n#: tfrmpointerscannersettings.cballigned.caption\nmsgid \"Addresses must be 32-bit alligned\"\nmsgstr \"地址必须是 32 位对齐的\"\n\n#: tfrmpointerscannersettings.cballigned.hint\nmsgid \"\"\n\"When enabled, only pointers that are stored in an address dividable by 4 are looked at\\n\"\n\"When disabled, it won't bother.\\n\"\n\"\\n\"\n\"pro: Fast scans\\n\"\n\"Con: On some horrible designed games that you shouldn't even play it won't find the paths\"\nmsgstr \"\"\n\"启用时，仅查看存储在可被 4 整除的地址中的指针\\n\"\n\"禁用时，将不予考虑。\\n\"\n\"\\n\"\n\"优点：快速扫描\\n\"\n\"缺点：在一些设计糟糕的游戏中，甚至不应该玩的游戏中，它无法找到路径\"\n\n#: tfrmpointerscannersettings.cballowruntimeworkers.caption\nmsgid \"Allow scanners to connect at runtime\"\nmsgstr \"允许扫描器在运行时连接\"\n\n#: tfrmpointerscannersettings.cballowruntimeworkers.hint\nmsgid \"Opens a port that other systems running the pointerscanner can connect to and help out with the scan\"\nmsgstr \"打开一个端口，其他运行指针扫描器的系统可以连接并帮助进行扫描\"\n\n#: tfrmpointerscannersettings.cbbenchmark.caption\nmsgid \"Benchmark system\"\nmsgstr \"基准测试系统\"\n\n#: tfrmpointerscannersettings.cbclasspointersonly.caption\nmsgid \"First element of pointerstruct must point to module (e.g vtable)\"\nmsgstr \"指针结构的第一个元素必须指向模块（例如 vtable）\"\n\n#: tfrmpointerscannersettings.cbclasspointersonly.hint\nmsgid \"\"\n\"Object oriented programming languages tend to implement classobjects by having a pointer in the first element to \"\n\"something that describes the class\\n\"\n\"With this option enabled, ce will check if it's a classobject by checking that rule. If not, it won't see it as a \"\n\"pointer.\\n\"\n\"pro:Tremendous speed increase and almost perfect pointers\\n\"\n\"con:Doesn't work with runtime generated classes (java, .net) \"\nmsgstr \"\"\n\"面向对象编程语言倾向于通过在第一个元素中放置指向描述类的内容的指针来实现类对象\\n\"\n\"启用此选项后，CE 将通过检查该规则来判断它是否是类对象。如果不是，它将不会被视为指针。\\n\"\n\"优点：速度大幅提升，几乎完美的指针\\n\"\n\"缺点：不适用于运行时生成的类（Java，.NET）\"\n\n#: tfrmpointerscannersettings.cbcomparetootherpointermaps.caption\nmsgid \"Compare results with other saved pointermap(s)\"\nmsgstr \"与其他保存的指针映射比较结果\"\n\n#: tfrmpointerscannersettings.cbcomparetootherpointermaps.hint\nmsgid \"\"\n\"When ticked you can add other pointermaps which will be used to verify that the pointers it finds are correct. You will \"\n\"have to fill in the correct address for each pointermap you provide.\\n\"\n\"Note: expect at least the size of the game itself in memory for every pointermap used\\n\"\nmsgstr \"\"\n\"勾选后，可以添加其他指针映射，这些映射将用于验证找到的指针是否正确。你需要为每个提供的指针映射填写正确的地址。\\n\"\n\"注意：每个使用的指针映射在内存中至少需要与游戏本身的大小相同\"\n\n#: tfrmpointerscannersettings.cbcompressedpointerscanfile.caption\nmsgid \"Compressed pointerscan file\"\nmsgstr \"压缩指针扫描文件\"\n\n#: tfrmpointerscannersettings.cbcompressedpointerscanfile.hint\nmsgid \"\"\n\"Compresses the generated .PTR files slightly so they take less space on the disk and less time writing to disk.\\n\"\n\"Most of the time the bottleneck of a pointerscan is disk writing, so it is recommended to use this option.\\n\"\n\"\\n\"\n\"Compressed .PTR files can not be read out by older Cheat Engine versions\"\nmsgstr \"\"\n\"稍微压缩生成的 .PTR 文件，以便它们在磁盘上占用更少的空间，并减少写入磁盘的时间。大多数情况下，指针扫描的瓶颈是磁盘写入，因此建议使用此选项。\\n\"\n\"\\n\"\n\"压缩的 .PTR 文件无法被旧版本的 Cheat Engine 读取\"\n\n#: tfrmpointerscannersettings.cbconnecttonode.caption\nmsgid \"Connect to pointerscan node\"\nmsgstr \"连接到指针扫描节点\"\n\n#: tfrmpointerscannersettings.cbconnecttonode.hint\nmsgid \"\"\n\"When checked will send a broadcast message on the local network which will tell pointer scanner systems to join this \"\n\"scan if they are set to auto join\\n\"\n\"\\n\"\n\"You can use \\\"Setup specific IP's to notify\\\" to notify systems of this scan that are outside of the local network\"\nmsgstr \"\"\n\"选中后，将在本地网络上发送广播消息，告知指针扫描系统如果设置为自动加入，则加入此扫描。\\n\"\n\"\\n\"\n\"你可以使用“设置特定 IP 通知”来通知位于本地网络外的系统参与此扫描\"\n\n#: tfrmpointerscannersettings.cbheaponly.caption\nmsgid \"Only allow static and heap addresses in the path\"\nmsgstr \"仅允许路径中的静态和堆地址\"\n\n#: tfrmpointerscannersettings.cbheaponly.hint\nmsgid \"If the address you search for isn't a heap address, the scan will return 0 results\"\nmsgstr \"如果你搜索的地址不是堆地址，扫描将返回 0 个结果\"\n\n#: tfrmpointerscannersettings.cbignoreupperbyte.caption\nmsgid \"Ignore upper byte of pointers\"\nmsgstr \"忽略指针的高字节\"\n\n#: tfrmpointerscannersettings.cbmaxoffsetspernode.caption\nmsgid \"Max different offsets per node:\"\nmsgstr \"每个节点的最大不同偏移量：\"\n\n#: tfrmpointerscannersettings.cbmaxoffsetspernode.hint\nmsgid \"\"\n\"When the pointerscan looks through the list of pointers with a specific value, it goes through every single pointer \"\n\"that has that value. Every time increasing the offset slightly.\\n\"\n\"With this feature enabled the pointerscan will only check the first few pointers with that value.\\n\"\n\"\\n\"\n\"pro: Extremely fast, and the results have the lowest pointer paths possible.\\n\"\n\"con: You'll miss a lot of pointers that might be valid too \"\nmsgstr \"\"\n\"当指针扫描查看具有特定值的指针列表时，它会检查每个具有该值的指针。每次稍微增加偏移量。启用此功能后，指针扫描将仅检查具有该值的前几个指针。\\n\"\n\"\\n\"\n\"优点：极快，结果具有最低的指针路径。 \\n\"\n\"缺点：你会错过很多可能也是有效的指针\"\n\n#: tfrmpointerscannersettings.cbmustendwithspecificoffset.caption\nmsgid \"Pointers must end with specific offsets\"\nmsgstr \"指针必须以特定的偏移量结束\"\n\n#: tfrmpointerscannersettings.cbmuststartwithbase.caption\nmsgid \"Base address must be in specific range\"\nmsgstr \"基地址必须在特定范围内\"\n\n#: tfrmpointerscannersettings.cbmuststartwithbase.hint\nmsgid \"\"\n\"Will only mark the given range as valid base address (Will reduce the number of results)\\n\"\n\"This internally makes use of the \\\"Only find paths with a static address\\\" feature by marking the provided range as \"\n\"static only, so it must be enabled.\"\nmsgstr \"\"\n\"将仅标记给定范围为有效基地址（将减少结果数量） \\n\"\n\"这在内部利用了“仅查找具有静态地址的路径”功能，通过仅将提供的范围标记为静态，因此必须启用。\"\n\n#: tfrmpointerscannersettings.cbnegativeoffsets.caption\nmsgid \"Also scan for negative offsets\"\nmsgstr \"还扫描负偏移量\"\n\n#: tfrmpointerscannersettings.cbnegativeoffsets.hint\nmsgid \"\"\n\"Let's you scan for negative offsets\\n\"\n\"Can not be used in combination with compressed pointerscan files\"\nmsgstr \"\"\n\"让你扫描负偏移量 \\n\"\n\"不能与压缩指针扫描文件结合使用\"\n\n#: tfrmpointerscannersettings.cbnoloop.caption\nmsgid \"No looping pointers\"\nmsgstr \"不允许循环指针\"\n\n#: tfrmpointerscannersettings.cbnoloop.hint\nmsgid \"\"\n\"This will filter out pointerpaths that ended up in a loop\\n\"\n\"e.g:\\n\"\n\"base->p1->p2->p3->p1->p4\\n\"\n\"\\n\"\n\"you could just as well do base->p1->p4 then, so throw this one away (base->p1->p4 will be found another way)\\n\"\n\"\\n\"\n\"pro: Less results so less diskspace used\\n\"\n\"con: slightly slows down the scan as it needs to check for loops every single iteration \"\nmsgstr \"\"\n\"这将过滤掉最终进入循环的指针路径 \\n\"\n\"例如： \\n\"\n\"base->p1->p2->p3->p1->p4 \\n\"\n\"\\n\"\n\"你也可以直接做 base->p1->p4，因此丢弃这个（base->p1->p4 将以另一种方式找到） \\n\"\n\"\\n\"\n\"优点：结果更少，因此使用的磁盘空间更少 \\n\"\n\"缺点：稍微减慢扫描，因为每次迭代都需要检查循环\"\n\n#: tfrmpointerscannersettings.cbnoreadonly.caption\nmsgid \"Don't include pointers with read-only nodes\"\nmsgstr \"不要包含只读节点的指针\"\n\n#: tfrmpointerscannersettings.cbnoreadonly.hint\nmsgid \"\"\n\"When checked the pointerscan will throw away memory that is readonly. So when it looks for paths, it won't encounter \"\n\"paths that pass through read only memory blocks.\\n\"\n\"\\n\"\n\"When it's unchecked, it does include readonly memory\\n\"\n\"\\n\"\n\"\\n\"\n\"pro: faster, less useless results\\n\"\n\"con: If the game decides to mark a pointer as readonly ce won't find it \"\nmsgstr \"\"\n\"选中时，指针扫描将丢弃只读的内存。因此，当它查找路径时，不会遇到经过只读内存块的路径。 \\n\"\n\"\\n\"\n\"未选中时，它确实包括只读内存 \\n\"\n\"\\n\"\n\"优点：更快，结果更少 \\n\"\n\"缺点：如果游戏决定将指针标记为只读，CE 将无法找到它\"\n\n#: tfrmpointerscannersettings.cbonlyonestatic.caption\nmsgid \"Stop traversing a path when a static has been found\"\nmsgstr \"找到静态时停止遍历路径\"\n\n#: tfrmpointerscannersettings.cbonlyonestatic.hint\nmsgid \"\"\n\"When the pointerscanner goes through the list of pointervalues with a specific value, this will stop exploring other \"\n\"paths as soon as it encounters a static pointer to that value\\n\"\n\"\\n\"\n\"pro: Fast\\n\"\n\"con: You may miss some valid results \"\nmsgstr \"\"\n\"当指针扫描器遍历具有特定值的指针值列表时，一旦遇到指向该值的静态指针，它将停止探索其他路径。\\n\"\n\"\\n\"\n\"优点：快速  \\n\"\n\"缺点：你可能会错过一些有效结果\"\n\n#: tfrmpointerscannersettings.cbscanresidentmemory.caption\nmsgid \"Only scan resident memory\"\nmsgstr \"仅扫描常驻内存\"\n\n#: tfrmpointerscannersettings.cbscanresidentmemory.hint\nmsgid \"Skip paged out memory pages\"\nmsgstr \"跳过分页内存页面\"\n\n#: tfrmpointerscannersettings.cbshowadvancedoptions.caption\nmsgid \"Show advanced options\"\nmsgstr \"显示高级选项\"\n\n#: tfrmpointerscannersettings.cbstackonly.caption\nmsgid \"Stack addresses as ONLY static address\"\nmsgstr \"将堆栈地址视为唯一静态地址\"\n\n#: tfrmpointerscannersettings.cbstackonly.hint\nmsgid \"\"\n\"Enable this if you wish to only find pointer paths with a stack address.\\n\"\n\"Combine this with \\\"Only find paths with a static address\\\" (default on) else this option will have no effect\\n\"\n\"\\n\"\n\"pro: You'll only get paths from the stack\\n\"\n\"con: You don't get paths from random dll's or the .exe \"\nmsgstr \"\"\n\"如果你希望仅找到具有堆栈地址的指针路径，请启用此选项。  \\n\"\n\"将此与“仅查找具有静态地址的路径”（默认开启）结合使用，否则此选项将无效。\\n\"\n\"\\n\"\n\"优点：你只会获得来自堆栈的路径  \\n\"\n\"缺点：你不会获得来自随机 dll 或 .exe 的路径\"\n\n#: tfrmpointerscannersettings.cbstaticonly.caption\nmsgid \"Only find paths with a static address\"\nmsgstr \"仅查找具有静态地址的路径\"\n\n#: tfrmpointerscannersettings.cbstaticonly.hint\nmsgid \"\"\n\"When checked the pointerscan will only store a path when it starts with a static address. (or easily looked up address)\\n\"\n\"When it's disabled, it finds every single pointer path\\n\"\n\"\\n\"\n\"pro: Fast\\n\"\n\"con: It may miss pointers that are accessed by special paths like thread local storage. (but even then they'd be \"\n\"useless for ce as they will change)\"\nmsgstr \"\"\n\"选中时，指针扫描仅在路径以静态地址（或易于查找的地址）开头时存储路径。  \\n\"\n\"禁用时，它会找到每一个指针路径。\\n\"\n\"\\n\"\n\"优点：快速  \\n\"\n\"缺点：它可能会错过通过特殊路径（如线程局部存储）访问的指针。（但即使那样，对于 CE 来说它们也是无用的，因为它们会改变）\"\n\n#: tfrmpointerscannersettings.cbstaticstacks.caption\nmsgid \"Allow stack addresses of the first thread(s) to be handled as static\"\nmsgstr \"允许将第一个线程的堆栈地址视为静态\"\n\n#: tfrmpointerscannersettings.cbstaticstacks.hint\nmsgid \"\"\n\"This allows the stack of threads to be seen as static addresses by the pointerscan.\\n\"\n\"The main thread is always a sure bet that it's the first one in the list. And often the second thread created is pretty \"\n\"stable as well.\\n\"\n\"With more there's a bigger change they get created and destroyed randomly\\n\"\n\"\\n\"\n\"When a program enters a function and exits it, the stack pointer decreases and increases, and the data there gets \"\n\"written to.\\n\"\n\"The farther the game is inside function calls, the more static the older data will be.\\n\"\n\"\\n\"\n\"With max stack offset: you can set the max size that can be deemed as static enough.\\n\"\n\"\\n\"\n\"pro: It finds paths otherwise never found\\n\"\n\"con: More results, more diskspace \"\nmsgstr \"\"\n\"这允许线程的堆栈被指针扫描视为静态地址。主线程总是可以确定是列表中的第一个线程。通常，创建的第二个线程也相当稳定。随着线程数量的增加，它们被创建和销毁的随机性也会增加。\\n\"\n\"\\n\"\n\"当程序进入一个函数并退出时，堆栈指针会减少和增加，数据会被写入。游戏在函数调用内部越深，旧数据就会越静态。\\n\"\n\"\\n\"\n\"通过最大堆栈偏移量：你可以设置可以被视为足够静态的最大大小。\\n\"\n\"\\n\"\n\"优点：它可以找到其他方法无法找到的路径。  \\n\"\n\"缺点：结果更多，占用更多磁盘空间\"\n\n#: tfrmpointerscannersettings.cbuseheapdata.caption\nmsgid \"Improve pointerscan with gathered heap data\"\nmsgstr \"通过收集的堆数据改善指针扫描\"\n\n#: tfrmpointerscannersettings.cbuseheapdata.hint\nmsgid \"\"\n\"When this is checked the heap is used to figure out the offset sizes, instead of blindly guessing them.\\n\"\n\"pro: Greatly improve speed and a lot less useless results\\n\"\n\"con: if the game allocates gigantic chunks of heap memory, and then divides it up itself, this will give wrong results.\\n\"\n\"\\n\"\n\"In other cases this will give perfect pointers \"\nmsgstr \"\"\n\"当选中此项时，堆将用于确定偏移量大小，而不是盲目猜测。  \\n\"\n\"优点：大大提高速度，减少无用结果。  \\n\"\n\"缺点：如果游戏分配了巨大的堆内存块，然后自己进行划分，这将导致错误结果。\\n\"\n\"\\n\"\n\"在其他情况下，这将提供完美的指针。\"\n\n#: tfrmpointerscannersettings.cbuseloadedpointermap.hint\nmsgid \"\"\n\"Use this if you have created a pointermap on a system that runs the game, but you wish to do the scan on another system \"\n\"(or multiple systems).\\n\"\n\"Checking this option will open a dialog where you can select the pointermap\"\nmsgstr \"如果你在运行游戏的系统上创建了指针映射，但希望在另一个系统（或多个系统）上进行扫描，请使用此选项。选中此选项将打开一个对话框，你可以选择指针映射。\"\n\n#: tfrmpointerscannersettings.edtthreadstacks.hint\nmsgid \"\"\n\"Fill in the total number of threads that should be allowed to be used as a stack lookup.\\n\"\n\"Thread 1 is usually the main thread of the game, but if that one spawns another thread for game related events, you \"\n\"might want to have that secondary thread as well.\\n\"\n\"More threads is not recommend as they may get created and destroyed on the fly, and are therefore useless as a lookup \"\n\"base, but it depends on the game.\"\nmsgstr \"填写允许作为堆栈查找使用的线程总数。线程 1 通常是游戏的主线程，但如果该线程为与游戏相关的事件生成另一个线程，你可能也希望包含该辅助线程。更多线程不推荐，因为它们可能会动态创建和销毁，因此作为查找基础是无用的，但这取决于游戏。\"\n\n#: tfrmpointerscannersettings.label12.caption\nmsgid \"Max level\"\nmsgstr \"最大级别\"\n\n#: tfrmpointerscannersettings.label13.caption\nmsgid \"Pointer path may only be inside this region:\"\nmsgstr \"指针路径只能在此区域内：\"\n\n#: tfrmpointerscannersettings.label3.caption\nmsgid \"Maximum offset value:\"\nmsgstr \"最大偏移值：\"\n\n#: tfrmpointerscannersettings.label9.caption\nmsgid \"Nr of threads scanning:\"\nmsgstr \"扫描线程数：\"\n\n#: tfrmpointerscannersettings.lblnumberofstackthreads.caption\nmsgid \"Number of threads from oldest to newest:\"\nmsgstr \"从最旧到最新的线程数：\"\n\n#: tfrmpointerscannersettings.lblport.caption\nmsgid \"Port:\"\nmsgstr \"端口：\"\n\n#: tfrmpointerscannersettings.lblstacksize.caption\nmsgid \"Max stackoffset to be deemed static enough:\"\nmsgstr \"被认为足够静态的最大堆栈偏移：\"\n\n#: tfrmpointerscannersettings.rbfindaddress.caption\nmsgid \"Scan for address\"\nmsgstr \"扫描地址\"\n\n#: tfrmpointerscannersettings.rbfindvalue.caption\nmsgid \"Scan for addresses with value\"\nmsgstr \"扫描具有值的地址\"\n\n#: tfrmprocessinfo.button2.caption\nmsgid \"Threads>>\"\nmsgstr \"线程>>\"\n\n#: tfrmprocessinfo.caption\nmsgid \"Process/System Info\"\nmsgstr \"进程/系统信息\"\n\n#: tfrmprocessinfo.label1.caption\nmsgid \"CR3:\"\nmsgstr \"CR3：\"\n\n#: tfrmprocessinfo.label2.caption\nmsgid \"CR4:\"\nmsgstr \"CR4：\"\n\n#: tfrmprocessinfo.label3.caption\nmsgid \"PEProcess:\"\nmsgstr \"PEProcess：\"\n\n#: tfrmprocessinfo.label4.caption\nmsgid \"IDT:\"\nmsgstr \"IDT：\"\n\n#: tfrmprocessinfo.label5.caption\nmsgid \"SDT:\"\nmsgstr \"SDT：\"\n\n#: tfrmprocessinfo.label6.caption\nmsgid \"SSDT:\"\nmsgstr \"SSDT：\"\n\n#: tfrmprocessinfo.label7.caption\nmsgid \"GDT:\"\nmsgstr \"GDT：\"\n\n#: tfrmprocessinfo.label8.caption\nmsgid \"Valid Handle:\"\nmsgstr \"有效句柄：\"\n\n#: tfrmprocessinfo.label9.caption\nmsgid \"CR0:\"\nmsgstr \"CR0：\"\n\n#: tfrmprocessinfo.lblcr0.caption\nmsgid \"lblcr0\"\nmsgstr \"lblcr0\"\n\n#: tfrmprocessinfo.lblcr3.caption\nmsgid \"lblcr3\"\nmsgstr \"lblcr3\"\n\n#: tfrmprocessinfo.lblcr4.caption\nmsgid \"lblcr4\"\nmsgstr \"lblcr4\"\n\n#: tfrmprocessinfo.lblgdt.caption\nmsgid \"lblGdt\"\nmsgstr \"lblGdt\"\n\n#: tfrmprocessinfo.lblisvalid.caption\nmsgid \"lblisvalid\"\nmsgstr \"lblisvalid\"\n\n#: tfrmprocessinfo.lblpeprocess.caption\nmsgid \"lblPEPROCESS\"\nmsgstr \"lblPEPROCESS\"\n\n#: tfrmprocessinfo.lblsdt.caption\nmsgid \"lblSdt\"\nmsgstr \"lblSdt\"\n\n#: tfrmprocessinfo.lblssdt.caption\nmsgid \"lblSsdt\"\nmsgstr \"lblSsdt\"\n\n#: tfrmprocesswatcher.btnattach.caption\nmsgid \"Attach to process\"\nmsgstr \"附加到进程\"\n\n#: tfrmprocesswatcher.btnopen.caption\nmsgid \"Open process\"\nmsgstr \"打开进程\"\n\n#: tfrmprocesswatcher.showthreadids1.caption\nmsgid \"Show ThreadID's\"\nmsgstr \"显示线程 ID\"\n\n#: tfrmprocesswatcherextra.caption\nmsgid \"Processwatcher Extra\"\nmsgstr \"进程监视器扩展\"\n\n#: tfrmrearrangestructurelist.caption\nmsgid \"Manage structure list\"\nmsgstr \"管理结构列表\"\n\n#: tfrmrearrangestructurelist.menuitem1.caption\nmsgid \"Delete selected records\"\nmsgstr \"删除选定记录\"\n\n#: tfrmreferencedfunctions.menuitem1.caption\nmsgid \"Copy list to clipboard\"\nmsgstr \"复制列表到剪贴板\"\n\n#: tfrmreferencedfunctions.mifilter.caption\nmsgid \"Filter by name\"\nmsgstr \"按名称过滤\"\n\n#: tfrmreferencedfunctions.misort.caption\nmsgid \"Sort by name\"\nmsgstr \"按名称排序\"\n\n#: tfrmreferencedstrings.caption\nmsgid \"Referenced Strings\"\nmsgstr \"引用字符串\"\n\n#: tfrmrescanpointer.caption\nmsgid \"Rescan pointerlist\"\nmsgstr \"重新扫描指针列表\"\n\n#: tfrmrescanpointer.cbbasepointermustbeinrange.caption\nmsgid \"Base pointer must be in range\"\nmsgstr \"基指针必须在范围内\"\n\n#: tfrmrescanpointer.cbchangebasepointeroffset.caption\nmsgid \"Change base pointer address by specific offset\"\nmsgstr \"通过特定偏移量更改基指针地址\"\n\n#: tfrmrescanpointer.cbdelay.caption\nmsgid \"Delay rescan for\"\nmsgstr \"延迟重新扫描\"\n\n#: tfrmrescanpointer.cbfilteroutaccessible.caption\nmsgid \"Only filter out accessible pointers\"\nmsgstr \"仅过滤可访问的指针\"\n\n#: tfrmrescanpointer.cbluafilter.caption\nmsgid \"Lua filter. function\"\nmsgstr \"Lua 过滤器。函数\"\n\n#: tfrmrescanpointer.cbluafilter.hint\nmsgid \"\"\n\"When checked this will call the given function for every pointer being evaluated. Return true if it's valid, false if \"\n\"not\\n\"\n\"base is the base address (integer)\\n\"\n\"offset is a table with offsets\\n\"\n\"target is the address the pointer points to. Can be nil\"\nmsgstr \"\"\n\"选中时，这将对每个被评估的指针调用给定的函数。如果有效返回 true，如果无效返回 false\\n\"\n\"base 是基地址（整数）\\n\"\n\"offset 是一个包含偏移量的表\\n\"\n\"target 是指针指向的地址。可以为 nil\"\n\n#: tfrmrescanpointer.cbmustendwithspecificoffsets.caption\nmsgid \"Must end with offsets\"\nmsgstr \"必须以偏移量结束\"\n\n#: tfrmrescanpointer.cbmuststartwithspecificoffsets.caption\nmsgid \"Must start with offsets\"\nmsgstr \"必须以偏移量开始\"\n\n#: tfrmrescanpointer.cbnovaluecheck.caption\nmsgid \"Only filter out invalid pointers\"\nmsgstr \"仅过滤无效指针\"\n\n#: tfrmrescanpointer.cbrepeat.caption\nmsgid \"Repeat rescan until stopped\"\nmsgstr \"重复重新扫描直到停止\"\n\n#: tfrmrescanpointer.cbusesavedpointermap.hint\nmsgid \"\"\n\"Normally this should not be used. Saved pointermaps are best suited for the initial scan.\\n\"\n\"One case where it could be useful is where you have a pointerfile that is too big to send to someone else, but the \"\n\"scandata file is not. In that case, ask the other person for the scandata and do the scan on your system against the \"\n\"current pointerfile\"\nmsgstr \"\"\n\"通常不应使用此功能。保存的指针图最适合初始扫描。\\n\"\n\"一个可能有用的情况是，当你有一个太大而无法发送给其他人的指针文件，但扫描数据文件却不大。在这种情况下，向其他人请求扫描数据，并在你的系统上针对当前指针文件进行扫描\"\n\n#: tfrmrescanpointer.edtbaseend.text\nmsgid \"FFFFFFFFFFFFFFFF\"\nmsgstr \"FFFFFFFFFFFFFFFF\"\n\n#: tfrmrescanpointer.edtbasestart.text\nmsgid \"0000000000000000\"\nmsgstr \"0000000000000000\"\n\n#: tfrmrescanpointer.edtrescanfunction.text\nmsgid \"RescanFilter\"\nmsgstr \"重新扫描过滤器\"\n\n#: tfrmrescanpointer.label1.caption\nmsgid \"seconds\"\nmsgstr \"秒\"\n\n#: tfrmrescanpointer.label2.caption\nmsgid \"New base address\"\nmsgstr \"新的基地址\"\n\n#: tfrmrescanpointer.label3.caption\nmsgid \"Original base address\"\nmsgstr \"原始基地址\"\n\n#: tfrmrescanpointer.lblluaparams.caption\nmsgid \"(base, offsets, target):bool\"\nmsgstr \"(基址，偏移量，目标)：布尔值\"\n\n#: tfrmrescanpointer.lbloffset.caption\nmsgid \"=XXXX\"\nmsgstr \"=XXXX\"\n\n#: tfrmrescanpointer.lbloriginalbase.caption\nmsgid \"<address>\"\nmsgstr \"<address>\"\n\n#: tfrmrescanpointer.rbfindaddress.caption\nmsgid \"Address to find:\"\nmsgstr \"要查找的地址：\"\n\n#: tfrmrescanpointer.rbfindvalue.caption\nmsgid \"Value to find:\"\nmsgstr \"要查找的值：\"\n\n#: tfrmsavedisassembly.cbopcode.caption\nmsgid \"opcode\"\nmsgstr \"操作码\"\n\n#: tfrmsavememoryregion.caption\nmsgid \"Save memoryregion\"\nmsgstr \"保存内存区域\"\n\n#: tfrmsavememoryregion.dontinclude.caption\nmsgid \"Don't include Cheat Engine header in file\"\nmsgstr \"文件中不包含 Cheat Engine 头部\"\n\n#: tfrmsavememoryregion.label1.caption\nmsgid \"Add the region(s) of memory you want to save\"\nmsgstr \"添加要保存的内存区域\"\n\n#: tfrmsavesnapshots.btncombinedselect.caption\nmsgid \"Combined select\"\nmsgstr \"组合选择\"\n\n#: tfrmsavesnapshots.btnsave.caption\nmsgid \"Save selected snapshots\"\nmsgstr \"保存选定的快照\"\n\n#: tfrmsavesnapshots.caption\nmsgid \"Save snapshots\"\nmsgstr \"保存快照\"\n\n#: tfrmsavesnapshots.label1.caption\nmsgid \"Select the snapshot(s) you wish to save\"\nmsgstr \"选择你希望保存的快照\"\n\n#: tfrmsavesnapshots.lbldeselectall.caption\nmsgid \"Deselect all\"\nmsgstr \"取消全选\"\n\n#: tfrmsavesnapshots.savedialog1.title\nmsgid \"Give a base path and filename\"\nmsgstr \"提供基本路径和文件名\"\n\n#: tfrmselectionlist.btnok.caption\nmsgid \"    OK    \"\nmsgstr \"    确定    \"\n\n#: tfrmselectionlist.caption\nmsgid \"title\"\nmsgstr \"标题\"\n\n#: tfrmsetuppsnnode.btnok.caption\nmsgid \"Launch\"\nmsgstr \"启动\"\n\n#: tfrmsetuppsnnode.button1.caption\nmsgid \"Setup trusted IP list\"\nmsgstr \"设置受信任的 IP 列表\"\n\n#: tfrmsetuppsnnode.caption\nmsgid \"Setup pointerscan network node\"\nmsgstr \"设置指针扫描网络节点\"\n\n#: tfrmsetuppsnnode.cballowchildren.caption\nmsgid \"Allow children to connect to me\"\nmsgstr \"允许子节点连接到我\"\n\n#: tfrmsetuppsnnode.cballowparents.caption\nmsgid \"Allow parents to connect to me\"\nmsgstr \"允许父节点连接到我\"\n\n#: tfrmsetuppsnnode.cballowtempfiles.caption\nmsgid \"Allow temp file usage\"\nmsgstr \"允许临时文件使用\"\n\n#: tfrmsetuppsnnode.cballowtempfiles.hint\nmsgid \"\"\n\"When checked it will save the scandata files it receives into temporary files on the harddisk\\n\"\n\"If it's unchecked these files will stay in memory in their original file format as well as their extracted format\\n\"\n\"\\n\"\n\"This can be useful when on a system with no disk access but lots of RAM\"\nmsgstr \"\"\n\"选中时，它将把接收到的扫描数据文件保存到硬盘的临时文件中\\n\"\n\"如果未选中，这些文件将以其原始文件格式以及提取格式保留在内存中\\n\"\n\"\\n\"\n\"在没有磁盘访问但有大量 RAM 的系统上，这可能会很有用\"\n\n#: tfrmsetuppsnnode.cbautotrustchildren.caption\nmsgid \"Automatically trust stability of all new childnodes\"\nmsgstr \"自动信任所有新子节点的稳定性\"\n\n#: tfrmsetuppsnnode.cbautotrustchildren.hint\nmsgid \"\"\n\"Normally when a worker terminates before the scan is done it will send all it's paths to it's connected node and then \"\n\"close, but if the system would crash it wouldn't be able to send it's queues to the node, causing in a loss of possible \"\n\"paths to examine\\n\"\n\"\\n\"\n\"When unchecked the owning controller/scanner will only send it one pointerpath queue element at a time and remembers \"\n\"that queue element until the worker reports that it has 0 queue elements, meaning it successfully completed the work \"\n\"item.\\n\"\n\"Also note that under normal circumstaces the node will accept new paths from the worker, but in the case of non stable \"\n\"workers this is not done and the worker has to do all the sub paths it generated itself\\n\"\n\"\\n\"\n\"In the node screen you will be able to change the state of a worker\"\nmsgstr \"\"\n\"通常，当工作者在扫描完成之前终止时，它会将所有路径发送到其连接的节点，然后关闭，但如果系统崩溃，它将无法将队列发送到节点，从而导致可能的路径丢失\\n\"\n\"\\n\"\n\"未选中时，拥有控制器/扫描器将一次只发送一个指针路径队列元素，并记住该队列元素，直到工作者报告它有 0 个队列元素，这意味着它成功完成了工作项。\\n\"\n\"还要注意，在正常情况下，节点将接受来自工作者的新路径，但在不稳定的工作者情况下，这不会发生，工作者必须自己处理生成的所有子路径\\n\"\n\"\\n\"\n\"在节点屏幕中，你将能够更改工作者的状态\"\n\n#: tfrmsetuppsnnode.cbconnecttoothernode.caption\nmsgid \"Connect to other node as\"\nmsgstr \"连接到其他节点作为\"\n\n#: tfrmsetuppsnnode.cbconnecttoothernode.hint\nmsgid \"Connect to another system as it's parent or child\"\nmsgstr \"连接到另一个系统作为它的父节点或子节点\"\n\n#: tfrmsetuppsnnode.cbmaxfoundresults.caption\nmsgid \"Stop scans after finding max amount of results\"\nmsgstr \"在找到最大结果数量后停止扫描\"\n\n#: tfrmsetuppsnnode.cbmaxfoundresults.hint\nmsgid \"\"\n\"This will terminate all the children and disconnect from the parent after having found at least the given amount of \"\n\"results\\n\"\n\"It's slightly innacurate as the check is only done every 10 seconds or so\\n\"\n\"\\n\"\n\"Note: This only has effect when there is at least one parent in the queue. Otherwise it's not going to disconnect\"\nmsgstr \"\"\n\"这将终止所有子节点并在找到至少给定数量的结果后与父节点断开连接。  \\n\"\n\"这有些不准确，因为检查仅每 10 秒左右进行一次。  \\n\"\n\"\\n\"\n\"注意：这仅在队列中至少有一个父节点时有效。否则将不会断开连接。\"\n\n#: tfrmsetuppsnnode.cbmaxtimetoscan.caption\nmsgid \"Stop scans after specific time\"\nmsgstr \"在特定时间后停止扫描\"\n\n#: tfrmsetuppsnnode.cbmaxtimetoscan.hint\nmsgid \"\"\n\"This will terminate all the children and disconnect from the parent after scanning for the given amount of time.\\n\"\n\"\\n\"\n\"Note: This only has effect when there is at least one parent in the queue. Otherwise it's not going to disconnect\"\nmsgstr \"\"\n\"这将在扫描给定时间后终止所有子节点并与父节点断开连接。  \\n\"\n\"\\n\"\n\"注意：这仅在队列中至少有一个父节点时有效。否则将不会断开连接。\"\n\n#: tfrmsetuppsnnode.edtconnectip.text\nmsgid \"127.0.0.1\"\nmsgstr \"127.0.0.1\"\n\n#: tfrmsetuppsnnode.edtthreadcount.hint\nmsgid \"\"\n\"The number of threads to scan.\\n\"\n\"Hint: Can be 0\"\nmsgstr \"\"\n\"扫描的线程数量。  \\n\"\n\"提示：可以是 0\"\n\n#: tfrmsetuppsnnode.label3.caption\nmsgid \"Found pointer paths\"\nmsgstr \"找到指针路径\"\n\n#: tfrmsetuppsnnode.lbllistenport.caption\nmsgid \"Listen port\"\nmsgstr \"监听端口\"\n\n#: tfrmsetuppsnnode.lblpriority.caption\nmsgid \"Priority\"\nmsgstr \"优先级\"\n\n#: tfrmsetuppsnnode.lblpublicname.caption\nmsgid \"Public name\"\nmsgstr \"公共名称\"\n\n#: tfrmsetuppsnnode.lblthreadcount.caption\nmsgid \"Threadcount\"\nmsgstr \"线程数\"\n\n#: tfrmsetuppsnnode.rbconnectaschild.caption\nmsgid \"child\"\nmsgstr \"子节点\"\n\n#: tfrmsetuppsnnode.rbconnectasparent.caption\nmsgid \"parent\"\nmsgstr \"父节点\"\n\n#: tfrmsnapshothandler.lblcompare.caption\nmsgid \"Compare selected snapshots\"\nmsgstr \"比较选定的快照\"\n\n#: tfrmsnapshothandler.menuitem2.caption\nmsgid \"Config\"\nmsgstr \"配置\"\n\n#: tfrmsnapshothandler.menuitem4.caption\nmsgid \"Open snapshot(s)\"\nmsgstr \"打开快照\"\n\n#: tfrmsnapshothandler.miconfig.caption\nmsgid \"Configure snapshot settings\"\nmsgstr \"配置快照设置\"\n\n#: tfrmsnapshothandler.rbcb.caption\nmsgid \"ConstantBuffer\"\nmsgstr \"常量缓冲区\"\n\n#: tfrmsortpointerlist.caption\nmsgid \"Sorting\"\nmsgstr \"排序\"\n\n#: tfrmsortpointerlist.label1.caption\nmsgid \"Sorting the pointerlist. Please wait....\"\nmsgstr \"正在排序指针列表。请稍候....\"\n\n#: tfrmsourcedisplay.caption\nmsgid \"frmSourceDisplay\"\nmsgstr \"frmSourceDisplay\"\n\n#: tfrmsourcedisplay.menuitem1.caption\nmsgid \"View Disassembly\"\nmsgstr \"查看反汇编\"\n\n#: tfrmsourcedisplay.menuitem2.caption\nmsgid \"Toggle BP\"\nmsgstr \"切换 BP\"\n\n#: tfrmsourcedisplay.menuitem7.caption\nmsgid \"Run Till...\"\nmsgstr \"运行直到...\"\n\n#: tfrmsourcedisplay.tbrun.hint\nmsgid \"Run (F9)\"\nmsgstr \"运行 (F9)\"\n\n#: tfrmsourcedisplay.tbruntill.hint\nmsgid \"(Run Till...) F4\"\nmsgstr \"(运行到...) F4\"\n\n#: tfrmsourcedisplay.tbstepinto.hint\nmsgid \"Step Into (F7)\"\nmsgstr \"逐步进入 (F7)\"\n\n#: tfrmsourcedisplay.tbstepout.hint\nmsgid \"(Step Out) Shift+F8\"\nmsgstr \"(逐步退出) Shift+F8\"\n\n#: tfrmsourcedisplay.tbstepover.hint\nmsgid \"Step Over(F8)\"\nmsgstr \"逐步跳过(F8)\"\n\n#: tfrmsourcedisplay.tbtogglebreakpoint.hint\nmsgid \"Toggle Breakpoint (F5)\"\nmsgstr \"切换断点 (F5)\"\n\n#: tfrmstacktrace.listview1.columns[0].caption\nmsgid \"PC\"\nmsgstr \"PC\"\n\n#: tfrmstacktrace.listview1.columns[2].caption\nmsgid \"Frame\"\nmsgstr \"帧\"\n\n#: tfrmstacktrace.listview1.columns[3].caption\nmsgid \"Return\"\nmsgstr \"返回\"\n\n#: tfrmstacktrace.mimanualstackwalk.caption\nmsgid \"Manual input\"\nmsgstr \"手动输入\"\n\n#: tfrmstackview.caption\nmsgid \"Stack View\"\nmsgstr \"堆栈视图\"\n\n#: tfrmstackview.lvstack.columns[2].caption\nmsgid \"Secondary\"\nmsgstr \"次要\"\n\n#: tfrmstackview.menuitem3.caption\nmsgid \"Lock and add this view to a structure dissect window\"\nmsgstr \"锁定并将此视图添加到结构解析窗口\"\n\n#: tfrmstackview.menuitem6.caption\nmsgid \"Copy Line\"\nmsgstr \"复制行\"\n\n#: tfrmstackview.micopyaddress.caption\nmsgid \"Copy Address\"\nmsgstr \"复制地址\"\n\n#: tfrmstackview.micopysecondary.caption\nmsgid \"Copy Secondary\"\nmsgstr \"复制次要\"\n\n#: tfrmstackview.micopyvalue.caption\nmsgid \"Copy Value\"\nmsgstr \"复制值\"\n\n#: tfrmstackview.milockandtrace.caption\nmsgid \"Lock and do manual stacktrace\"\nmsgstr \"锁定并进行手动堆栈跟踪\"\n\n#: tfrmstackview.misetcolor.caption\nmsgid \"Set background color to address\"\nmsgstr \"将背景颜色设置为地址\"\n\n#: tfrmstringpointerscan.cbmappointervalues.caption\nmsgid \"Store values during scan\"\nmsgstr \"在扫描期间存储值\"\n\n#: tfrmstringpointerscan.cbmappointervalues.hint\nmsgid \"\"\n\"During the scan the values of pointer will be stored in memory for quick lookup when the same address is encountered \"\n\"again\\n\"\n\"If the pointerlist has mostly unique addresses this can cause you to get out of memory errors\\n\"\n\"\\n\"\n\"Enabled: Fast- Memory gobbler\\n\"\n\"Disabled: Slower- Not too much memory eaten\"\nmsgstr \"\"\n\"在扫描期间，指针的值将存储在内存中，以便在再次遇到相同地址时快速查找\\n\"\n\"如果指针列表大多数地址是唯一的，这可能会导致内存不足错误\\n\"\n\"\\n\"\n\"启用：快速- 内存消耗者\\n\"\n\"禁用：较慢- 不会消耗太多内存\"\n\n#: tfrmstringpointerscan.cbmustbestart.caption\nmsgid \"Must be start\"\nmsgstr \"必须开始\"\n\n#: tfrmstringpointerscan.cbpointerinrange.caption\nmsgid \"Pointer must be in range\"\nmsgstr \"指针必须在范围内\"\n\n#: tfrmstringpointerscan.cbregexp.caption\nmsgid \"Strings must match reg exp\"\nmsgstr \"字符串必须匹配正则表达式\"\n\n#: tfrmstringpointerscan.cbreusestringmap.caption\nmsgid \"Use existing stringmap\"\nmsgstr \"使用现有字符串映射\"\n\n#: tfrmstringpointerscan.lblalign.caption\nmsgid \"Alignsize\"\nmsgstr \"对齐大小\"\n\n#: tfrmstringpointerscan.lblbaseregion.caption\nmsgid \"Base region\"\nmsgstr \"基本区域\"\n\n#: tfrmstringpointerscan.lblcompare.caption\nmsgid \"Compare type\"\nmsgstr \"比较类型\"\n\n#: tfrmstringpointerscan.lblextra.caption\nmsgid \"Compare against\"\nmsgstr \"比较对象\"\n\n#: tfrmstringpointerscan.lblstring.caption\nmsgid \"String:\"\nmsgstr \"字符串：\"\n\n#: tfrmstringpointerscan.rbdatascan.caption\nmsgid \"Data scan\"\nmsgstr \"数据扫描\"\n\n#: tfrmstringpointerscan.rbdiffdontcare.caption\nmsgid \"Don't care for difference\"\nmsgstr \"不关心差异\"\n\n#: tfrmstringpointerscan.rbmustbedifferent.caption\nmsgid \"Must be different\"\nmsgstr \"必须不同\"\n\n#: tfrmstringpointerscan.rbmustbesame.caption\nmsgid \"Must be the same\"\nmsgstr \"必须相同\"\n\n#: tfrmstringpointerscan.rbstringscan.caption\nmsgid \"String scan\"\nmsgstr \"字符串扫描\"\n\n#: tfrmstructurecompare.cbsameonly.caption\nmsgid \"Only find matching groups\"\nmsgstr \"仅查找匹配组\"\n\n#: tfrmstructurecompare.cbsameonly.hint\nmsgid \"\"\n\"With this enabled it will only return results when both group 1 has matching values and group 2 has matching values, \"\n\"and group2's value is not the same as group1\"\nmsgstr \"启用此选项时，仅当组 1 和组 2 都有匹配值，并且组 2 的值与组 1 不同，才会返回结果\"\n\n#: tfrmstructurecompare.edtalignsize.hint\nmsgid \"1,2 or 4\"\nmsgstr \"1, 2 或 4\"\n\n#: tfrmstructurecompare.gbnlf.caption\nmsgid \"Group 2\"\nmsgstr \"组 2\"\n\n#: tfrmstructurecompare.lblalign.caption\nmsgid \"element compare size\"\nmsgstr \"元素比较大小\"\n\n#: tfrmstructurecompare.mimaxaddresses.caption\nmsgid \"Max addresses shown : 32\"\nmsgstr \"最大显示地址：32\"\n\n#: tfrmstructurecompare.mimaxaddresses.hint\nmsgid \"This lets you specify the maximum number of addresses to show per line\"\nmsgstr \"这让你可以指定每行显示的最大地址数量\"\n\n#: tfrmstructures2.addextraaddress1.caption\nmsgid \"Add extra address\"\nmsgstr \"添加额外地址\"\n\n#: tfrmstructures2.definenewstructure1.caption\nmsgid \"Define new structure\"\nmsgstr \"定义新结构\"\n\n#: tfrmstructures2.deletecurrentstructure1.caption\nmsgid \"Delete structure\"\nmsgstr \"删除结构\"\n\n#: tfrmstructures2.headercontrol1.sections[0].text\nmsgid \"Offset-description\"\nmsgstr \"偏移描述\"\n\n#: tfrmstructures2.menuitem3.caption\nmsgid \"Save values\"\nmsgstr \"保存值\"\n\n#: tfrmstructures2.menuitem5.caption\nmsgid \"Add new group\"\nmsgstr \"添加新组\"\n\n#: tfrmstructures2.menuitem8.caption\nmsgid \"Manage structurelist\"\nmsgstr \"管理结构列表\"\n\n#: tfrmstructures2.miaddallinrowtoaddresslist.caption\nmsgid \"Add all in row to address list\"\nmsgstr \"将行中的所有项添加到地址列表\"\n\n#: tfrmstructures2.miaddchildelement.caption\nmsgid \"Add child element\"\nmsgstr \"添加子元素\"\n\n#: tfrmstructures2.miaddelement.caption\nmsgid \"Add element\"\nmsgstr \"添加元素\"\n\n#: tfrmstructures2.miaddtoaddresslist.caption\nmsgid \"Add to address list\"\nmsgstr \"添加到地址列表\"\n\n#: tfrmstructures2.miautocreate.caption\nmsgid \"Autocreate local structures when expanding undefined pointer types\"\nmsgstr \"扩展未定义指针类型时自动创建本地结构\"\n\n#: tfrmstructures2.miautodestroylocal.caption\nmsgid \"Autodestroy local structures when closed\"\nmsgstr \"关闭时自动销毁本地结构\"\n\n#: tfrmstructures2.miautofillgaps.caption\nmsgid \"Fill gaps automatically\"\nmsgstr \"自动填充空隙\"\n\n#: tfrmstructures2.miautoguess.caption\nmsgid \"Autoguess offset types\"\nmsgstr \"自动猜测偏移类型\"\n\n#: tfrmstructures2.miautostructsize.caption\nmsgid \"Autocreate structure size: 4096\"\nmsgstr \"自动创建结构大小：4096\"\n\n#: tfrmstructures2.mibrowseaddress.caption\nmsgid \"Memory browse this address\"\nmsgstr \"内存浏览此地址\"\n\n#: tfrmstructures2.mibrowsepointer.caption\nmsgid \"Memory browse pointer\"\nmsgstr \"内存浏览指针\"\n\n#: tfrmstructures2.michangeallvaluesinrow.caption\nmsgid \"Change all values in row\"\nmsgstr \"更改行中的所有值\"\n\n#: tfrmstructures2.michangeelement.caption\nmsgid \"Change element\"\nmsgstr \"更改元素\"\n\n#: tfrmstructures2.michangetype.caption\nmsgid \"Change Type\"\nmsgstr \"更改类型\"\n\n#: tfrmstructures2.michangetype2bytehex.caption\nmsgid \"2 Byte (Hex)\"\nmsgstr \"2 字节（十六进制）\"\n\n#: tfrmstructures2.michangetype4bytehex.caption\nmsgid \"4 Byte (Hex)\"\nmsgstr \"4 字节（十六进制）\"\n\n#: tfrmstructures2.michangetype8bytehex.caption\nmsgid \"8 Byte (Hex)\"\nmsgstr \"8 字节（十六进制）\"\n\n#: tfrmstructures2.michangetypearrayofbyte.caption\nmsgid \"Array Of Byte\"\nmsgstr \"字节数组\"\n\n#: tfrmstructures2.michangetypebytehex.caption\nmsgid \"Byte (Hex)\"\nmsgstr \"字节（十六进制）\"\n\n#: tfrmstructures2.miclear.caption\nmsgid \"Delete all structures\"\nmsgstr \"删除所有结构\"\n\n#: tfrmstructures2.micollapseall.caption\nmsgid \"Collapse all pointers\"\nmsgstr \"折叠所有指针\"\n\n#: tfrmstructures2.micommands.caption\nmsgid \"Structure Options\"\nmsgstr \"结构选项\"\n\n#: tfrmstructures2.micommonalityscan.caption\nmsgid \"Scan for commonalities using the structure compare window\"\nmsgstr \"使用结构比较窗口扫描共同点\"\n\n#: tfrmstructures2.micopy.caption\nmsgid \"Copy element(s)\"\nmsgstr \"复制元素\"\n\n#: tfrmstructures2.midefaulthexadecimal.caption\nmsgid \"New integer types default to hexadecimal\"\nmsgstr \"新的整数类型默认为十六进制\"\n\n#: tfrmstructures2.midefinenewstructurefromdebugdata.caption\nmsgid \"Define new structure from debug data\"\nmsgstr \"从调试数据定义新结构\"\n\n#: tfrmstructures2.mideleteelement.caption\nmsgid \"Delete element(s)\"\nmsgstr \"删除元素\"\n\n#: tfrmstructures2.midonotsavelocal.caption\nmsgid \"Do not save autocreated local structures\"\nmsgstr \"不保存自动创建的本地结构\"\n\n#: tfrmstructures2.mieverythinghex.caption\nmsgid \"View everything as hexadecimal\"\nmsgstr \"将所有内容视为十六进制\"\n\n#: tfrmstructures2.miexpandall.caption\nmsgid \"Expand all defined and undefined pointers\"\nmsgstr \"展开所有已定义和未定义的指针\"\n\n#: tfrmstructures2.miexpandalldefined.caption\nmsgid \"Expand all defined pointers\"\nmsgstr \"展开所有已定义的指针\"\n\n#: tfrmstructures2.miexportall.caption\nmsgid \"Export all structures\"\nmsgstr \"导出所有结构\"\n\n#: tfrmstructures2.mifillgaps.caption\nmsgid \"Fill gaps\"\nmsgstr \"填充空隙\"\n\n#: tfrmstructures2.mifindrelations.caption\nmsgid \"Find relations\"\nmsgstr \"查找关系\"\n\n#: tfrmstructures2.mifindvalue.caption\nmsgid \"Find value\"\nmsgstr \"查找值\"\n\n#: tfrmstructures2.mifullupgrade.caption\nmsgid \"Upgrade this child to full structure\"\nmsgstr \"将此子项升级为完整结构\"\n\n#: tfrmstructures2.miopeninnewwindow.caption\nmsgid \"Open in new window\"\nmsgstr \"在新窗口中打开\"\n\n#: tfrmstructures2.mipaste.caption\nmsgid \"Paste elements(s)\"\nmsgstr \"粘贴元素\"\n\n#: tfrmstructures2.mirlecompression.caption\nmsgid \"Enable RLE Compression\"\nmsgstr \"启用 RLE 压缩\"\n\n#: tfrmstructures2.mishowaddresses.caption\nmsgid \"Show addresses\"\nmsgstr \"显示地址\"\n\n#: tfrmstructures2.mishowtypeforentrieswithnodescription.caption\nmsgid \"Show type for entries with no description\"\nmsgstr \"显示没有描述的条目的类型\"\n\n#: tfrmstructures2.miupdateinterval.caption\nmsgid \"Update interval: 500\"\nmsgstr \"更新间隔：500\"\n\n#: tfrmstructures2.miupdateoffsets.caption\nmsgid \"Update this and following offsets\"\nmsgstr \"更新此偏移量及后续偏移量\"\n\n#: tfrmstructures2.open1.caption\nmsgid \"Import\"\nmsgstr \"导入\"\n\n#: tfrmstructures2.save1.caption\nmsgid \"Export current structure\"\nmsgstr \"导出当前结构\"\n\n#: tfrmstructures2elementinfo.caption\nmsgid \"Structure Info\"\nmsgstr \"结构信息\"\n\n#: tfrmstructures2elementinfo.cbexpandchangesaddress.caption\nmsgid \"Expanding this node will change the address\"\nmsgstr \"展开此节点将更改地址\"\n\n#: tfrmstructures2elementinfo.cbnestedstructure.caption\nmsgid \"Nested Structure\"\nmsgstr \"嵌套结构\"\n\n#: tfrmstructures2elementinfo.label2.caption\nmsgid \"Bytesize\"\nmsgstr \"字节大小\"\n\n#: tfrmstructures2elementinfo.label5.caption\nmsgid \"Structure pointed to\"\nmsgstr \"指向的结构\"\n\n#: tfrmstructures2elementinfo.lbloffsetinto.caption\nmsgid \"Offset into\"\nmsgstr \"偏移量到\"\n\n#: tfrmsymboleventtakinglong.button1.caption\nmsgid \"Cancel this symbol lookup\"\nmsgstr \"取消此符号查找\"\n\n#: tfrmsymboleventtakinglong.caption\nmsgid \"Symbol lookup taking long\"\nmsgstr \"符号查找耗时较长\"\n\n#: tfrmsymboleventtakinglong.cbskipallsymbols.caption\nmsgid \"And skip all symbols until loaded\"\nmsgstr \"并跳过所有符号直到加载完成\"\n\n#: tfrmsymboleventtakinglong.cbskipthissymbol.caption\nmsgid \"And skip this symbol until loaded\"\nmsgstr \"并跳过此符号直到加载完成\"\n\n#: tfrmsymboleventtakinglong.label1.caption\nmsgid \"\"\n\"The symbolloader is still busy enumerating the symbols and the current symbol being looked up is taking a while (and \"\n\"taking away time to enumerate the symbols)\"\nmsgstr \"符号加载器仍在忙于枚举符号，当前正在查找的符号耗时较长（并占用枚举符号的时间）\"\n\n#: tfrmsymboleventtakinglong.lblsymbol.caption\nmsgid \"lblSymbol\"\nmsgstr \"lblSymbol\"\n\n#: tfrmsymboleventtakinglong.lbltype.caption\nmsgid \"Symbol:\"\nmsgstr \"符号：\"\n\n#: tfrmsymbolhandler.button1.caption\nmsgid \"Add symbol\"\nmsgstr \"添加符号\"\n\n#: tfrmsymbolhandler.caption\nmsgid \"Symbol config\"\nmsgstr \"符号配置\"\n\n#: tfrmsymbolhandler.label1.caption\nmsgid \"Userdefined symbols:\"\nmsgstr \"用户定义符号：\"\n\n#: tfrmsymbolhandler.label3.caption\nmsgid \"Unique symbolname\"\nmsgstr \"唯一符号名称\"\n\n#: tfrmsymbolhandler.label4.caption\nmsgid \"Symbol groups:\"\nmsgstr \"符号组：\"\n\n#: tfrmsymbolhandler.listview1.columns[0].caption\nmsgid \"Symbolname\"\nmsgstr \"符号名称\"\n\n#: tfrmsymbolhandler.listview1.columns[2].caption\nmsgid \"AllocSize\"\nmsgstr \"分配大小\"\n\n#: tfrmsymbolhandler.menuitem1.caption\nmsgid \"Delete all\"\nmsgstr \"全部删除\"\n\n#: tfrmsymbolhandler.miunregister.caption\nmsgid \"Unregister\"\nmsgstr \"注销\"\n\n#: tfrmsymbolhandler.miunregisterall.caption\nmsgid \"Unregister all\"\nmsgstr \"全部注销\"\n\n#: tfrmsymbolhandler.panel3.caption\nmsgid \"Panel3\"\nmsgstr \"面板3\"\n\n#: tfrmthreadlist.lbliswow64.caption\nmsgid \"Hold ctrl when expanding to see the 32-bit context of a thread\"\nmsgstr \"在展开时按住 ctrl 以查看线程的 32 位上下文\"\n\n#: tfrmthreadlist.menuitem1.caption\nmsgid \"Stackview\"\nmsgstr \"堆栈视图\"\n\n#: tfrmthreadlist.micleardebugregisters.caption\nmsgid \"Clear debug registers\"\nmsgstr \"清除调试寄存器\"\n\n#: tfrmthreadlist.mifreezethread.caption\nmsgid \"Freeze thread\"\nmsgstr \"冻结线程\"\n\n#: tfrmthreadlist.miresumethread.caption\nmsgid \"Resume thread\"\nmsgstr \"恢复线程\"\n\n#: tfrmthreadunsafecodewarning.btnignore.caption\nmsgid \"Ignore warnings\"\nmsgstr \"忽略警告\"\n\n#: tfrmthreadunsafecodewarning.btnignore.hint\nmsgid \"Keep running the script and don't show this warning anymore\"\nmsgstr \"继续运行脚本，不再显示此警告\"\n\n#: tfrmthreadunsafecodewarning.btnkill.caption\nmsgid \"Kill scripts that do this\"\nmsgstr \"终止执行此操作的脚本\"\n\n#: tfrmthreadunsafecodewarning.btnkill.hint\nmsgid \"Stops the current script\"\nmsgstr \"停止当前脚本\"\n\n#: tfrmthreadunsafecodewarning.caption\nmsgid \"Threadunsafe GUI access detected\"\nmsgstr \"检测到线程不安全的 GUI 访问\"\n\n#: tfrmthreadunsafecodewarning.cbremember.caption\nmsgid \"Remember choice when restarting Cheat Engine\"\nmsgstr \"重启 Cheat Engine 时记住选择\"\n\n#: tfrmthreadunsafecodewarning.label1.caption\nmsgid \"\"\n\"A Lua script currently being executed doesn't properly synchronize it's GUI access code with the main GUI thread. \\n\"\n\"This can lead to random heap memory changes which will ultimately lead to unpredictable 'access violation' \\n\"\n\"errors and other random behaviour\\n\"\n\"\\n\"\n\"Please edit the script and encaplulate all the access to GUI controls using :\\\"synchronize(function() <your code> \"\n\"end)\\\" \\n\"\n\"or ask the person who made the current table to fix this for you\"\nmsgstr \"\"\n\"当前正在执行的 Lua 脚本没有正确同步其 GUI 访问代码与主 GUI 线程。\\n\"\n\"这可能导致随机的堆内存变化，最终导致不可预测的“访问冲突”错误和其他随机行为。\\n\"\n\"\\n\"\n\"请编辑脚本，并使用：“synchronize(function() <你的代码> end)” 封装对 GUI 控件的所有访问，\\n\"\n\"或者请制作当前表格的人为你修复这个问题\"\n\n#: tfrmtracer.btnstopsearch.caption\nmsgid \"Stop Search\"\nmsgstr \"停止搜索\"\n\n#: tfrmtracer.cbfpuxmm.caption\nmsgid \"Compare FPU/XMM\"\nmsgstr \"比较 FPU/XMM\"\n\n#: tfrmtracer.cbignorestackpointers.caption\nmsgid \"Ignore stackpointers\"\nmsgstr \"忽略堆栈指针\"\n\n#: tfrmtracer.lbladdressed.caption\nmsgid \"Accesses Address:\"\nmsgstr \"访问地址：\"\n\n#: tfrmtracer.menuitem7.caption\nmsgid \"Change Font\"\nmsgstr \"更改字体\"\n\n#: tfrmtracer.miload.caption\nmsgid \"Open trace\"\nmsgstr \"打开跟踪\"\n\n#: tfrmtracer.minewtrace.caption\nmsgid \"New trace\"\nmsgstr \"新建跟踪\"\n\n#: tfrmtracer.miopentraceforcompare.caption\nmsgid \"Open trace for comparison\"\nmsgstr \"打开用于比较的跟踪\"\n\n#: tfrmtracer.mirealigncompare.caption\nmsgid \"Reallign compare\"\nmsgstr \"重新对齐比较\"\n\n#: tfrmtracer.misave.caption\nmsgid \"Save trace\"\nmsgstr \"保存跟踪\"\n\n#: tfrmtracer.misavetodisk.caption\nmsgid \"Save results to disk as textfile\"\nmsgstr \"将结果保存为文本文件到磁盘\"\n\n#: tfrmtracer.pnlregisters.hint\nmsgid \"\"\n\"Rightclick to copy to clipboard\\n\"\n\"Middleclick to ignore it when comparing traces\"\nmsgstr \"\"\n\"右键单击复制到剪贴板\\n\"\n\"中键单击在比较跟踪时忽略它\"\n\n#: tfrmtracerconfig.caption\nmsgid \"Break and Trace config\"\nmsgstr \"中断和跟踪配置\"\n\n#: tfrmtracerconfig.cbbranchesonly.caption\nmsgid \"Branches only\"\nmsgstr \"仅分支\"\n\n#: tfrmtracerconfig.cbdbvmbreakandtrace.caption\nmsgid \"DBVM Native Break and Trace\"\nmsgstr \"DBVM 原生中断和跟踪\"\n\n#: tfrmtracerconfig.cbdbvmbreakandtrace.hint\nmsgid \"Let DBVM do the break and trace internally\"\nmsgstr \"让 DBVM 在内部进行中断和跟踪\"\n\n#: tfrmtracerconfig.cbdbvmtriggercow.caption\nmsgid \"Trigger copy-on-write\"\nmsgstr \"触发写时复制\"\n\n#: tfrmtracerconfig.cbdereferenceaddresses.caption\nmsgid \"Dereference Addresses (Slows down)\"\nmsgstr \"解除引用地址（会减慢速度）\"\n\n#: tfrmtracerconfig.cbsavestack.caption\nmsgid \"Save stack snapshots (Eats memory)\"\nmsgstr \"保存堆栈快照（占用内存）\"\n\n#: tfrmtracerconfig.cbskipsystemmodules.caption\nmsgid \"Skip system modules\"\nmsgstr \"跳过系统模块\"\n\n#: tfrmtracerconfig.cbstayinsideinitialmodule.caption\nmsgid \"Stay inside initial module\"\nmsgstr \"停留在初始模块内\"\n\n#: tfrmtracerconfig.cbstepover.caption\nmsgid \"Step over instead of single step\"\nmsgstr \"跳过而不是单步执行\"\n\n#: tfrmtracerconfig.cbstepoverrep.caption\nmsgid \"Step over rep instructions\"\nmsgstr \"跳过重复指令\"\n\n#: tfrmtracerconfig.groupbox1.caption\nmsgid \"Breakpoint method\"\nmsgstr \"断点方法\"\n\n#: tfrmtracerconfig.label1.caption\nmsgid \"Maximal trace count:\"\nmsgstr \"最大跟踪计数：\"\n\n#: tfrmtracerconfig.label2.caption\nmsgid \"Stop condition (Optional, LUA format)\"\nmsgstr \"停止条件（可选，LUA 格式）\"\n\n#: tfrmtracerconfig.label3.caption\nmsgid \"Start condition (Optional, LUA format)\"\nmsgstr \"开始条件（可选，LUA 格式）\"\n\n#: tfrmtracerconfig.rbbpsoftware.caption\nmsgid \"Software breakpoint\"\nmsgstr \"软件断点\"\n\n#: tfrmtrainergenerator.btnaddhotkey.caption\nmsgid \"Add Hotkey\"\nmsgstr \"添加热键\"\n\n#: tfrmtrainergenerator.btnaddsounds.caption\nmsgid \"Add sound(s)\"\nmsgstr \"添加声音\"\n\n#: tfrmtrainergenerator.btndelete.caption\nmsgid \"Delete Hotkey\"\nmsgstr \"删除热键\"\n\n#: tfrmtrainergenerator.button1.caption\nmsgid \"Set Icon\"\nmsgstr \"设置图标\"\n\n#: tfrmtrainergenerator.button2.caption\nmsgid \"Set Side Image\"\nmsgstr \"设置侧面图像\"\n\n#: tfrmtrainergenerator.button5.caption\nmsgid \"Generate trainer\"\nmsgstr \"生成训练器\"\n\n#: tfrmtrainergenerator.button5.hint\nmsgid \"Generates the trainer script and saves the current table as a .CETRAINER\"\nmsgstr \"生成训练器脚本并将当前表保存为 .CETRAINER\"\n\n#: tfrmtrainergenerator.caption\nmsgid \"Trainer generator\"\nmsgstr \"训练器生成器\"\n\n#: tfrmtrainergenerator.cbcanresize.caption\nmsgid \"User can resize window\"\nmsgstr \"用户可以调整窗口大小\"\n\n#: tfrmtrainergenerator.cbconfigd3dhook.caption\nmsgid \"Configure\"\nmsgstr \"配置\"\n\n#: tfrmtrainergenerator.cboutput.text\nmsgid \"EXE\"\nmsgstr \"EXE\"\n\n#: tfrmtrainergenerator.cbplaysoundonaction.caption\nmsgid \"Play sound on activate/deactivate\"\nmsgstr \"激活/停用时播放声音\"\n\n#: tfrmtrainergenerator.cbplayxm.caption\nmsgid \"Play mod music file\"\nmsgstr \"播放模组音乐文件\"\n\n#: tfrmtrainergenerator.cbpopuponkeypress.caption\nmsgid \"Popup trainer on keypress\"\nmsgstr \"按键时弹出训练器\"\n\n#: tfrmtrainergenerator.cbprotect.caption\nmsgid \"Protect trainer from editing/reading\"\nmsgstr \"保护训练器不被编辑/读取\"\n\n#: tfrmtrainergenerator.cbprotect.hint\nmsgid \"\"\n\"Will encrypt the generated cetrainer file and when Cheat Engine loads this file back it will destroy the main form \"\n\"preventing the user from doing anything with it.\\n\"\n\"Does not affect the standalone trainer because that one is protected by default\"\nmsgstr \"将加密生成的 cetrainer 文件，当 Cheat Engine 重新加载此文件时，将销毁主窗口，防止用户对其进行任何操作。不会影响独立训练器，因为该训练器默认受到保护\"\n\n#: tfrmtrainergenerator.cbstopplaying.caption\nmsgid \"Stop playing when\"\nmsgstr \"停止播放时\"\n\n#: tfrmtrainergenerator.cbused3dhook.caption\nmsgid \"Use Direct3D Hook\"\nmsgstr \"使用 Direct3D Hook\"\n\n#: tfrmtrainergenerator.edtcaption.text\nmsgid \"My trainer\"\nmsgstr \"我的训练器\"\n\n#: tfrmtrainergenerator.groupbox2.caption\nmsgid \"Automated gui config options\"\nmsgstr \"自动化 GUI 配置选项\"\n\n#: tfrmtrainergenerator.label1.caption\nmsgid \"Freeze interval (in milliseconds)\"\nmsgstr \"冻结间隔（以毫秒为单位）\"\n\n#: tfrmtrainergenerator.label2.caption\nmsgid \"Processname\"\nmsgstr \"进程名称\"\n\n#: tfrmtrainergenerator.label3.caption\nmsgid \"About text:\"\nmsgstr \"关于文本：\"\n\n#: tfrmtrainergenerator.label4.caption\nmsgid \"Title\"\nmsgstr \"标题\"\n\n#: tfrmtrainergenerator.label6.caption\nmsgid \"\"\n\"Tip: The trainer generator is a tool for beginners. It is recommended to learn lua and the formdesigner and save as \"\n\".exe manually to experience the full power of a Cheat Engine trainer\"\nmsgstr \"提示：训练器生成器是初学者的工具。建议学习 LUA 和表单设计器，并手动保存为 .exe，以体验 Cheat Engine 训练器的全部功能\"\n\n#: tfrmtrainergenerator.menuitem1.caption\nmsgid \"Rebuild Trainer Cheatlist\"\nmsgstr \"重建 Trainer Cheatlist\"\n\n#: tfrmtrainergenerator.menuitem2.caption\nmsgid \"Only generate the script\"\nmsgstr \"仅生成脚本\"\n\n#: tfrmtrainergenerator.opendialog2.title\nmsgid \"Open icon file\"\nmsgstr \"打开图标文件\"\n\n#: tfrmtrainergenerator.rbstopwhenattached.caption\nmsgid \"Game has been attached\"\nmsgstr \"游戏已附加\"\n\n#: tfrmtrainergenerator.rbstopwhenfocuslost.caption\nmsgid \"Trainer loses focus\"\nmsgstr \"Trainer 失去焦点\"\n\n#: tfrmultimap.btnfiltercallcount.caption\nmsgid \"Filter out routine(s) where callcount is NOT\"\nmsgstr \"过滤掉调用次数不是的例程\"\n\n#: tfrmultimap.btnfiltermodule.caption\nmsgid \"Filter out routines not in a specific module\"\nmsgstr \"过滤掉不在特定模块中的例程\"\n\n#: tfrmultimap.btnnotcalled.caption\nmsgid \"Filter out routine(s) that where not CALL'ed\"\nmsgstr \"过滤掉未被调用的例程\"\n\n#: tfrmultimap.btnpause.caption\nmsgid \"Pause/Resume\"\nmsgstr \"暂停/恢复\"\n\n#: tfrmultimap.btnret.caption\nmsgid \"Filter out return from RET's\"\nmsgstr \"过滤掉 RET 的返回\"\n\n#: tfrmultimap.button5.caption\nmsgid \"Show matching routines\"\nmsgstr \"显示匹配的例程\"\n\n#: tfrmultimap.cbfilterfuturepaths.caption\nmsgid \"Filter future branches\"\nmsgstr \"过滤未来的分支\"\n\n#: tfrmultimap.cbfilteroutnewentries.caption\nmsgid \"Mark all new branches as filtered out\"\nmsgstr \"将所有新分支标记为已过滤\"\n\n#: tfrmultimap.cblogtofile.caption\nmsgid \"Log directly to file\"\nmsgstr \"直接记录到文件\"\n\n#: tfrmultimap.cbparsedata.caption\nmsgid \"Parse data\"\nmsgstr \"解析数据\"\n\n#: tfrmultimap.cbpreemptiveflush.caption\nmsgid \"Preemptive flushing\"\nmsgstr \"预先清空\"\n\n#: tfrmultimap.cbpreemptiveflush.hint\nmsgid \"When enabled Cheat Engine will flush the data for each cpu instead of only when the buffer is full\"\nmsgstr \"启用时，Cheat Engine 将为每个 CPU 清空数据，而不仅仅是在缓冲区满时\"\n\n#: tfrmultimap.edtfilename.text\nmsgid \"c:\\\\log.dat\"\nmsgstr \"c:\\\\log.dat\"\n\n#: tfrmultimap.label1.caption\nmsgid \"Worker threads\"\nmsgstr \"工作线程\"\n\n#: tfrmultimap.label2.caption\nmsgid \"Event buffer size\"\nmsgstr \"事件缓冲区大小\"\n\n#: tfrmultimap.label5.caption\nmsgid \"Branch targets:\"\nmsgstr \"分支目标：\"\n\n#: tfrmultimap.label6.caption\nmsgid \"\"\n\"General tip: \\\"Pause/Resume\\\", \\\"Code did not get executed\\\" and \\\"Code has been executed\\\" can be rightclicked and \"\n\"assigned a hotkey for use inside games so you don't have to alt tab out\"\nmsgstr \"一般提示：“暂停/恢复”、“代码未执行”和“代码已执行”可以右键单击并分配热键以在游戏中使用，这样你就不必切换到其他窗口\"\n\n#: tfrmultimap.listview1.columns[0].caption\nmsgid \"Address To\"\nmsgstr \"地址到\"\n\n#: tfrmultimap.listview1.columns[1].caption\nmsgid \"Last origin\"\nmsgstr \"最后来源\"\n\n#: tfrmultimap.menuitem1.caption\nmsgid \"Add selection to code list\"\nmsgstr \"将选择添加到代码列表\"\n\n#: tfrmultimap.menuitem2.caption\nmsgid \"Flush buffers\"\nmsgstr \"清空缓冲区\"\n\n#: tfrmultimap2.btnaddrange.caption\nmsgid \"Add range\"\nmsgstr \"添加范围\"\n\n#: tfrmultimap2.btncancelfilter.caption\nmsgid \"Cancel filter operation\"\nmsgstr \"取消过滤操作\"\n\n#: tfrmultimap2.btnfiltercallcount.caption\nmsgid \"Filter out instructions where callcount is NOT\"\nmsgstr \"过滤掉调用次数不是的指令\"\n\n#: tfrmultimap2.btnfiltermodule.caption\nmsgid \"Filter out instructions not in a specific range\"\nmsgstr \"过滤掉不在特定范围内的指令\"\n\n#: tfrmultimap2.btnnotcalled.caption\nmsgid \"Filter out everything except CALL\"\nmsgstr \"过滤掉除 CALL 之外的所有内容\"\n\n#: tfrmultimap2.btnrecordpause.caption\nmsgid \"Record / Pause\"\nmsgstr \"记录 / 暂停\"\n\n#: tfrmultimap2.btnshowresults.caption\nmsgid \"Show the current valid instruction list\"\nmsgstr \"显示当前有效指令列表\"\n\n#: tfrmultimap2.cbautoprocess.caption\nmsgid \"Autoprocess tracefiles\"\nmsgstr \"自动处理跟踪文件\"\n\n#: tfrmultimap2.cbautoprocess.hint\nmsgid \"\"\n\"When enabled this will check the filesize every few seconds, and will process the files when they have grown beyond the \"\n\"given size.\\n\"\n\"\\n\"\n\"Note: Due to the way the processing is done, trace data will still be written to disk during the processing. If you \"\n\"generate more data than can be processed at a time, the filesize will keep growing. You can combine this with the \"\n\"\\\"Pause target while processing\\\" option so that it shouldn't generate too much data\"\nmsgstr \"\"\n\"启用后，这将每隔几秒检查文件大小，并在文件超过给定大小时处理它们。\\n\"\n\"\\n\"\n\"注意：由于处理方式，跟踪数据在处理期间仍会写入磁盘。如果你生成的数据超过一次可以处理的量，文件大小将持续增长。你可以将此与“处理时暂停目标”选项结合使用，以避免生成过多数据\"\n\n#: tfrmultimap2.cbdontdeletetracefiles.caption\nmsgid \"Don't delete trace files\"\nmsgstr \"不要删除跟踪文件\"\n\n#: tfrmultimap2.cbdontdeletetracefiles.hint\nmsgid \"\"\n\"Normally Cheat Engine will delete the trace files after they have been processed. But if you wish to save them for your \"\n\"own use, check this box\\n\"\n\"\\n\"\n\"These trace files can grow really big, so make sure you have enough diskspace\"\nmsgstr \"\"\n\"通常，Cheat Engine 会在处理后删除跟踪文件。但如果你希望保存它们以供自己使用，请勾选此框\\n\"\n\"\\n\"\n\"这些跟踪文件可能会变得非常大，因此请确保你有足够的磁盘空间\"\n\n#: tfrmultimap2.cbfilterfuturepaths.caption\nmsgid \"Exclude new addresses\"\nmsgstr \"排除新地址\"\n\n#: tfrmultimap2.cbfilteroutnewentries.caption\nmsgid \"Mark all new addresses as filtered out\"\nmsgstr \"将所有新地址标记为已过滤\"\n\n#: tfrmultimap2.cbiptdonotprocessnewthreads.caption\nmsgid \"Do not process new threads after initial launch\"\nmsgstr \"初始启动后不处理新线程\"\n\n#: tfrmultimap2.cbkernelmode.caption\nmsgid \"Kernelmode\"\nmsgstr \"内核模式\"\n\n#: tfrmultimap2.cbnointerrupts.caption\nmsgid \"Do not trigger interrupts when full\"\nmsgstr \"满时不触发中断\"\n\n#: tfrmultimap2.cbnointerrupts.hint\nmsgid \"\"\n\"In Windows 10, when a PMI triggers, it will BSOD with \\\"PROFILER_CONFIGURATION_ILLEGAL\\\" if you use ranges and don't \"\n\"have a kernelmode debugger attached\\n\"\n\"\\n\"\n\"Tip: Use a huge buffer and autoprocess/flush the tracefiles\\n\"\n\"Tip2: If DBVM is running it will hide the fact that regions are used from windows, and this you can just use interrupts \"\n\"like before\"\nmsgstr \"\"\n\"在 Windows 10 中，当 PMI 触发时，如果你使用范围并且没有附加内核模式调试器，它将出现 BSOD，错误信息为“PROFILER_CONFIGURATION_ILLEGAL”\\n\"\n\"\\n\"\n\"提示：使用一个巨大的缓冲区并自动处理/刷新跟踪文件\\n\"\n\"提示2：如果 DBVM 正在运行，它将隐藏 Windows 使用区域的事实，这样你可以像以前一样使用中断\"\n\n#: tfrmultimap2.cbparsetotextfile.caption\nmsgid \"Parse trace to textfile\"\nmsgstr \"将跟踪解析为文本文件\"\n\n#: tfrmultimap2.cbparsetotextfile.hint\nmsgid \"\"\n\"When enabled will write the sequence of events as they happen as plain text to a file called cpu#trace.txt.\\n\"\n\"This file contains the disassemble and some event data that happens along the way.\\n\"\n\"\\n\"\n\"It is recommended to use a very small range, and a stop condition\"\nmsgstr \"启用时，将事件序列以纯文本形式写入名为 cpu#trace.txt 的文件中。此文件包含反汇编和在此过程中发生的一些事件数据。建议使用非常小的范围和停止条件。\"\n\n#: tfrmultimap2.cbpausetargetwhileprocessing.caption\nmsgid \"Pause target while processing\"\nmsgstr \"处理时暂停目标\"\n\n#: tfrmultimap2.cbtraceallprocesses.caption\nmsgid \"Trace all processes\"\nmsgstr \"跟踪所有进程\"\n\n#: tfrmultimap2.cbtraceinterval.caption\nmsgid \"every \"\nmsgstr \"每个\"\n\n#: tfrmultimap2.cbusermode.caption\nmsgid \"Usermode\"\nmsgstr \"用户模式\"\n\n#: tfrmultimap2.cbwhenfilesizeabove.caption\nmsgid \"when filesize above\"\nmsgstr \"当文件大小超过\"\n\n#: tfrmultimap2.cbwiniptbuffersize.text\nmsgid \"4MB\"\nmsgstr \"4MB\"\n\n#: tfrmultimap2.detargetfolder.hint\nmsgid \"\"\n\"The folder to store the processor trace files. \\n\"\n\"These files can be quite big (a few seconds can already be over 200MB of space or more)\"\nmsgstr \"存储处理器跟踪文件的文件夹。 这些文件可能会非常大（几秒钟的时间可能已经超过 200MB 或更多）\"\n\n#: tfrmultimap2.detextout.hint\nmsgid \"\"\n\"The folder to store the trace output to\\n\"\n\"It is recommended to use a small region with a stop condition, else this disk will be full before you know it\"\nmsgstr \"存储跟踪输出的文件夹。建议使用小范围和停止条件，否则在你意识到之前，这个磁盘将会满。\"\n\n#: tfrmultimap2.gbrange.caption\nmsgid \"Ranges: (Empty for all) (Max 0) \"\nmsgstr \"范围：（为空表示全部）（最大 0）\"\n\n#: tfrmultimap2.label2.caption\nmsgid \"MB\"\nmsgstr \"MB\"\n\n#: tfrmultimap2.lblbuffersizeperthread.caption\nmsgid \"Buffersize per Thread\"\nmsgstr \"每个线程的缓冲区大小\"\n\n#: tfrmultimap2.lblbufferspercpu.caption\nmsgid \"Buffer per CPU\"\nmsgstr \"每个 CPU 的缓冲区\"\n\n#: tfrmultimap2.lblkb.caption\nmsgid \"KB\"\nmsgstr \"KB\"\n\n#: tfrmultimap2.listview1.columns[2].caption\nmsgid \"Invalidated\"\nmsgstr \"无效\"\n\n#: tfrmultimap2.lvthreads.columns[3].caption\nmsgid \"Processing\"\nmsgstr \"处理中\"\n\n#: tfrmultimap2.menuitem3.caption\nmsgid \"Open tracefile reader\"\nmsgstr \"打开跟踪文件读取器\"\n\n#: tfrmultimap2.menuitem5.caption\nmsgid \"Debug: Process tracefile\"\nmsgstr \"调试：处理跟踪文件\"\n\n#: tfrmultimap2.migetrangeconfig.caption\nmsgid \"Get rangeconfig\"\nmsgstr \"获取范围配置\"\n\n#: tfrmultimap2.mirangedeleteselected.caption\nmsgid \"Delete Selected\"\nmsgstr \"删除选定项\"\n\n#: tfrmultimap2.rblogtofolder.caption\nmsgid \"Process data later\"\nmsgstr \"稍后处理数据\"\n\n#: tfrmultimap2.rblogtofolder.hint\nmsgid \"\"\n\"CE will write the results to disk as quickly as possible but won't process it until the recording is stopped, or a \"\n\"filter function is being used.\"\nmsgstr \"CE 将尽快将结果写入磁盘，但在录制停止或使用过滤功能之前不会处理它。\"\n\n#: tfrmultimap2.rbruntimeparsing.caption\nmsgid \"Process data while recording\"\nmsgstr \"在录制时处理数据\"\n\n#: tfrmultimap2.rbruntimeparsing.hint\nmsgid \"Constantly process the data instead of waiting for the user's input\"\nmsgstr \"不断处理数据，而不是等待用户输入\"\n\n#: tfrmwatchlist.caption\nmsgid \"Watch list\"\nmsgstr \"观察列表\"\n\n#: tfrmwatchlist.lvwatchlist.columns[0].caption\nmsgid \"Address/Expression\"\nmsgstr \"地址/表达式\"\n\n#: tfrmwatchlist.menuitem3.caption\nmsgid \"Refresh values\"\nmsgstr \"刷新值\"\n\n#: tfrmwatchlist.menuitem4.caption\nmsgid \"Browse memory region\"\nmsgstr \"浏览内存区域\"\n\n#: tfrmwatchlist.miadditem.caption\nmsgid \"Add Item\"\nmsgstr \"添加项目\"\n\n#: tfrmwatchlist.micopytoclipboard.caption\nmsgid \"Copy expression(s) to clipboard\"\nmsgstr \"复制表达式到剪贴板\"\n\n#: tfrmwatchlist.micopytoclipboardex.caption\nmsgid \"Copy expression(s) and value(s) to clipboard\"\nmsgstr \"复制表达式和数值到剪贴板\"\n\n#: tfrmwatchlist.mideleteitems.caption\nmsgid \"Delete Item(s)\"\nmsgstr \"删除项目\"\n\n#: tfrmwatchlist.miedititem.caption\nmsgid \"Edit Item\"\nmsgstr \"编辑项目\"\n\n#: tfrmwatchlist.mipastefromclipboard.caption\nmsgid \"Paste expression(s) from clipboard\"\nmsgstr \"从剪贴板粘贴表达式\"\n\n#: tfrmwatchlistaddentry.caption\nmsgid \"Add watcher entry\"\nmsgstr \"添加观察者条目\"\n\n#: tfrmwatchlistaddentry.edtexpression.texthint\nmsgid \"Expression\"\nmsgstr \"表达式\"\n\n#: thotkeyform.btncreatehotkey.caption\nmsgid \"Create hotkey\"\nmsgstr \"创建热键\"\n\n#: thotkeyform.btnedithotkey.caption\nmsgid \"Edit Hotkey\"\nmsgstr \"编辑热键\"\n\n#: thotkeyform.caption\nmsgid \"Set/Change hotkey\"\nmsgstr \"设置/更改热键\"\n\n#: thotkeyform.cbonlywhiledown.caption\nmsgid \"Only while hotkey is down/Restore when released\"\nmsgstr \"仅在热键按下时/释放时恢复\"\n\n#: thotkeyform.edtactivatetext.text\nmsgid \"{MRDescription} Activated\"\nmsgstr \"{MRDescription} 已激活\"\n\n#: thotkeyform.edtdeactivatetext.text\nmsgid \"{MRDescription} Deactivated\"\nmsgstr \"{MRDescription} 已停用\"\n\n#: thotkeyform.edtdescription.hint\nmsgid \"When autogenerating a trainer this field will be used as description\"\nmsgstr \"在自动生成训练器时，此字段将用作描述\"\n\n#: thotkeyform.label1.caption\nmsgid \"Type the keys you want to set the hotkey to\"\nmsgstr \"输入你想设置热键的按键\"\n\n#: thotkeyform.label2.caption\nmsgid \"Description (Optional)\"\nmsgstr \"描述（可选）\"\n\n#: thotkeyform.lblactivatesound.caption\nmsgid \"Activate sound\"\nmsgstr \"激活声音\"\n\n#: thotkeyform.lbldeactivatesound.caption\nmsgid \"Deactivate sound\"\nmsgstr \"停用声音\"\n\n#: thotkeyform.listview1.columns[1].caption\nmsgid \"On Hotkey\"\nmsgstr \"按热键\"\n\n#: thotkeyform.miaddsound.caption\nmsgid \"Add sounds\"\nmsgstr \"添加声音\"\n\n#: thotkeyform.tabsheet1.caption\nmsgid \"TabSheet1\"\nmsgstr \"选项卡1\"\n\n#: thotkeyform.tabsheet2.caption\nmsgid \"TabSheet2\"\nmsgstr \"选项卡2\"\n\n#: tinputboxtop.edit1.text\nmsgid \"edit1\"\nmsgstr \"编辑1\"\n\n#: tlgunit.rsyouwin\nmsgid \"OMG, You must have cheated or don't have a life. (Although some people claim that thats the same)\"\nmsgstr \"天哪，你一定是作弊了，或者没有生活。（虽然有些人声称这两者是一样的）\"\n\n#: tmainform.a1.caption\nmsgid \"a\"\nmsgstr \"a\"\n\n#: tmainform.actautoassemble.caption\nmsgid \"actAutoAssemble\"\nmsgstr \"actAutoAssemble\"\n\n#: tmainform.actmemoryview.caption\nmsgid \"actMemoryView\"\nmsgstr \"actMemoryView\"\n\n#: tmainform.actopendissectstructure.caption\nmsgid \"actOpenDissectStructure\"\nmsgstr \"actOpenDissectStructure\"\n\n#: tmainform.actopenluaengine.caption\nmsgid \"actOpenLuaEngine\"\nmsgstr \"actOpenLuaEngine\"\n\n#: tmainform.advancedbutton.caption\nmsgid \"Advanced Options\"\nmsgstr \"高级选项\"\n\n#: tmainform.advancedbutton.hint\nmsgid \"Codelist and pause\"\nmsgstr \"代码列表和暂停\"\n\n#: tmainform.b1.caption\nmsgid \"b\"\nmsgstr \"b\"\n\n#: tmainform.btnaddaddressmanually.caption\nmsgid \"Add Address Manually\"\nmsgstr \"手动添加地址\"\n\n#: tmainform.btnfirst.caption\nmsgid \"First Scan2\"\nmsgstr \"第一次扫描2\"\n\n#: tmainform.btnmemoryview.caption\nmsgid \"Memory View\"\nmsgstr \"内存视图\"\n\n#: tmainform.btnnext.caption\nmsgid \"Next scan 2\"\nmsgstr \"下一次扫描2\"\n\n#: tmainform.c1.caption\nmsgid \"c\"\nmsgstr \"c\"\n\n#: tmainform.calculatenewvaluepart21.caption\nmsgid \"Recalculate new addresses\"\nmsgstr \"重新计算新地址\"\n\n#: tmainform.cbcopyonwrite.caption\nmsgid \"CopyOnWrite\"\nmsgstr \"写时复制\"\n\n#: tmainform.cbcopyonwrite.hint\nmsgid \"\"\n\"Unchecked:\\n\"\n\"Do not scan copy-on-write memory\\n\"\n\"\\n\"\n\"Checked:\\n\"\n\"Only scan copy-on-write memory\\n\"\n\"\\n\"\n\"Gray:\\n\"\n\"Don't care if it's copy-on-write or not\"\nmsgstr \"\"\n\"未选中：\\n\"\n\"不扫描写时复制内存\\n\"\n\"\\n\"\n\"选中：\\n\"\n\"仅扫描写时复制内存\\n\"\n\"\\n\"\n\"灰色：\\n\"\n\"不在乎是否是写时复制\"\n\n#: tmainform.cbexecutable.caption\nmsgid \"Executable\"\nmsgstr \"可执行文件\"\n\n#: tmainform.cbexecutable.hint\nmsgid \"\"\n\"Unchecked:\\n\"\n\"Do not scan executable memory\\n\"\n\"\\n\"\n\"Checked:\\n\"\n\"Only scan executable memory\\n\"\n\"\\n\"\n\"Gray:\\n\"\n\"Don't care if it's executable or not\"\nmsgstr \"\"\n\"未选中：\\n\"\n\"不扫描可执行内存\\n\"\n\"\\n\"\n\"已选中：\\n\"\n\"仅扫描可执行内存\\n\"\n\"\\n\"\n\"灰色：\\n\"\n\"不在乎是否可执行\"\n\n#: tmainform.cbfastscan.caption\nmsgid \"Fast Scan\"\nmsgstr \"快速扫描\"\n\n#: tmainform.cbfastscan.hint\nmsgid \"\"\n\"Speeds up the scan and decreases useless results by skipping unaligned memory, or only scans addresses ending with \"\n\"specific digits\"\nmsgstr \"通过跳过未对齐的内存或仅扫描以特定数字结尾的地址来加快扫描速度并减少无用结果\"\n\n#: tmainform.cbfloatsimple.caption\nmsgid \"Simple values only\"\nmsgstr \"仅限简单值\"\n\n#: tmainform.cbhexadecimal.hint\nmsgid \"When checked the value you type in is hexadecimal\"\nmsgstr \"选中时，你输入的值将被视为十六进制\"\n\n#: tmainform.cbluaformula.caption\nmsgid \"Lua formula\"\nmsgstr \"Lua 公式\"\n\n#: tmainform.cbluaformula.hint\nmsgid \"\"\n\"When checked the value will be interpreted as a Lua script. \\n\"\n\"local variables available: \\n\"\n\"value, previousvalue\\n\"\n\"\\n\"\n\"example:\\n\"\n\"value>5 and value~=8\"\nmsgstr \"\"\n\"选中时，值将被解释为 Lua 脚本。\\n\"\n\"可用的局部变量：\\n\"\n\"value, previousvalue\\n\"\n\"\\n\"\n\"示例：\\n\"\n\"value>5 和 value~=8\"\n\n#: tmainform.cbnewluastate.caption\nmsgid \"Separate Lua state\"\nmsgstr \"单独的 Lua 状态\"\n\n#: tmainform.cbnewluastate.hint\nmsgid \"\"\n\"When checked, the Lua environment used will be limited to just some basic functions and you won't have access to \"\n\"userdefined functions.\\n\"\n\"The positive side is that this allows multiple threads to scan at the same time, so will be a lot faster\"\nmsgstr \"\"\n\"选中时，使用的 Lua 环境将仅限于一些基本函数，你将无法访问用户定义的函数。\\n\"\n\"积极的一面是，这允许多个线程同时扫描，因此会快得多\"\n\n#: tmainform.cbnot.caption\nmsgid \"Not\"\nmsgstr \"不\"\n\n#: tmainform.cbnot.hint\nmsgid \"When checked CE will find everything EXCEPT the value/range you've given\"\nmsgstr \"选中时，CE 将找到所有除了你给定的值/范围以外的内容\"\n\n#: tmainform.cbpausewhilescanning.caption\nmsgid \"Pause the game while scanning\"\nmsgstr \"扫描时暂停游戏\"\n\n#: tmainform.cbpercentage.caption\nmsgid \"Percent\"\nmsgstr \"百分比\"\n\n#: tmainform.cbpresentmemoryonly.caption\nmsgid \"Active memory only\"\nmsgstr \"仅活动内存\"\n\n#: tmainform.cbpresentmemoryonly.hint\nmsgid \"Only scans the working set of a process\"\nmsgstr \"仅扫描进程的工作集\"\n\n#: tmainform.cbrepeatuntilstopped.caption\nmsgid \"Repeat\"\nmsgstr \"重复\"\n\n#: tmainform.cbrepeatuntilstopped.hint\nmsgid \"Repeats the unchanged value scan until it gets stopped\"\nmsgstr \"重复未更改的值扫描，直到停止\"\n\n#: tmainform.cbspeedhack.hint\nmsgid \"Enable speedhack\"\nmsgstr \"启用速度hack\"\n\n#: tmainform.cbwritable.caption\nmsgid \"Writable\"\nmsgstr \"可写\"\n\n#: tmainform.cbwritable.hint\nmsgid \"\"\n\"Unchecked:\\n\"\n\"Do not scan writable memory\\n\"\n\"\\n\"\n\"Checked:\\n\"\n\"Only scan writable memory\\n\"\n\"\\n\"\n\"Gray:\\n\"\n\"Don't care if it's writable memory or not\"\nmsgstr \"\"\n\"未选中：\\n\"\n\"不扫描可写内存\\n\"\n\"\\n\"\n\"已选中：\\n\"\n\"仅扫描可写内存\\n\"\n\"\\n\"\n\"灰色：\\n\"\n\"不在乎是否可写内存\"\n\n#: tmainform.change1.caption\nmsgid \"Change record\"\nmsgstr \"更改记录\"\n\n#: tmainform.commentbutton.caption\nmsgid \"Table Extras\"\nmsgstr \"表格附加项\"\n\n#: tmainform.copyselectedaddresses1.caption\nmsgid \"Copy selected addresses\"\nmsgstr \"复制选定地址\"\n\n#: tmainform.creategroup.caption\nmsgid \"Create header\"\nmsgstr \"创建头部\"\n\n#: tmainform.d1.caption\nmsgid \"d\"\nmsgstr \"d\"\n\n#: tmainform.deletethisrecord1.caption\nmsgid \"Delete this record\"\nmsgstr \"删除此记录\"\n\n#: tmainform.e1.caption\nmsgid \"e\"\nmsgstr \"e\"\n\n#: tmainform.edit3.caption\nmsgid \"&Edit\"\nmsgstr \"编辑\"\n\n#: tmainform.file1.caption\nmsgid \"&File\"\nmsgstr \"文件\"\n\n#: tmainform.foundcountlabel.hint\nmsgid \"This shows the amount of addresses found\"\nmsgstr \"这显示了找到的地址数量\"\n\n#: tmainform.foundlist3.hint\nmsgid \"This list shows all the found addresses that matched your last scan\"\nmsgstr \"此列表显示了与您上次扫描匹配的所有找到的地址\"\n\n#: tmainform.freezealladdresses2.caption\nmsgid \"Toggle selected records\"\nmsgstr \"切换选定记录\"\n\n#: tmainform.gbscanoptions.caption\nmsgid \"Memory Scan Options\"\nmsgstr \"内存扫描选项\"\n\n#: tmainform.helpindex1.caption\nmsgid \"Cheat Engine Help\"\nmsgstr \"Cheat Engine 帮助\"\n\n#: tmainform.label54.caption\nmsgid \"Speed\"\nmsgstr \"速度\"\n\n#: tmainform.lblcomparetosavedscan.caption\nmsgid \"<xxxx>\"\nmsgstr \"<xxxx>\"\n\n#: tmainform.lblscantype.caption\nmsgid \"Scan Type\"\nmsgstr \"扫描类型\"\n\n#: tmainform.lblsigned.caption\nmsgid \"\"\n\"This table has been signed by\\n\"\n\"Someone\"\nmsgstr \"此表已由某人签名\"\n\n#: tmainform.lblvaluetype.caption\nmsgid \"Value Type\"\nmsgstr \"值类型\"\n\n#: tmainform.menuitem1.caption\nmsgid \"Select All\"\nmsgstr \"全选\"\n\n#: tmainform.menuitem15.caption\nmsgid \"Cheat Engine Tutorial Games\"\nmsgstr \"Cheat Engine 教程游戏\"\n\n#: tmainform.menuitem16.caption\nmsgid \"Cheat Engine Tutorial (AArch64)\"\nmsgstr \"Cheat Engine 教程 (AArch64)\"\n\n#: tmainform.menuitem17.caption\nmsgid \"Memory read method\"\nmsgstr \"内存读取方法\"\n\n#: tmainform.menuitem18.caption\nmsgid \"Memory write method\"\nmsgstr \"内存写入方法\"\n\n#: tmainform.menuitem2.caption\nmsgid \"New Item1\"\nmsgstr \"新项目1\"\n\n#: tmainform.menuitem7.caption\nmsgid \"Quit\"\nmsgstr \"退出\"\n\n#: tmainform.menuitem9.caption\nmsgid \"Generate generic trainer lua script from table\"\nmsgstr \"从表格生成通用训练器 lua 脚本\"\n\n#: tmainform.mi3d.caption\nmsgid \"D3D\"\nmsgstr \"D3D\"\n\n#: tmainform.miaddaddress.caption\nmsgid \"Add selected addresses to the addresslist\"\nmsgstr \"将选定地址添加到地址列表\"\n\n#: tmainform.miaddfile.caption\nmsgid \"Add file\"\nmsgstr \"添加文件\"\n\n#: tmainform.miaddtab.caption\nmsgid \"Add scan tab\"\nmsgstr \"添加扫描标签\"\n\n#: tmainform.miallowcollapse.caption\nmsgid \"Allow left and right arrow keys to collapse and expand\"\nmsgstr \"允许左右箭头键折叠和展开\"\n\n#: tmainform.mialwayshidechildren.caption\nmsgid \"Always hide children\"\nmsgstr \"始终隐藏子项\"\n\n#: tmainform.miasyncscript.caption\nmsgid \"Execute asynchronous\"\nmsgstr \"异步执行\"\n\n#: tmainform.miautoassembleerrormessage.caption\nmsgid \"<Error message here>\"\nmsgstr \"<Error message here>\"\n\n#: tmainform.mibindactivation.caption\nmsgid \"Activating this entry activates it's children\"\nmsgstr \"激活此条目会激活其子项\"\n\n#: tmainform.mibinddeactivation.caption\nmsgid \"Deactivating this entry deactivates it's children\"\nmsgstr \"停用此条目会停用其子项\"\n\n#: tmainform.michangecolor.caption\nmsgid \"Change color\"\nmsgstr \"更改颜色\"\n\n#: tmainform.michangevalue.caption\nmsgid \"Change value of selected addresses\"\nmsgstr \"更改选定地址的值\"\n\n#: tmainform.michangevalueback.caption\nmsgid \"Change value of selected addresses back to previous/saved value\"\nmsgstr \"将选定地址的值更改回之前/保存的值\"\n\n#: tmainform.miclearworkingset.caption\nmsgid \"Clear active memory\"\nmsgstr \"清除活动内存\"\n\n#: tmainform.miclosetab.caption\nmsgid \"Close tab\"\nmsgstr \"关闭标签\"\n\n#: tmainform.micreateluaform.caption\nmsgid \"Create form\"\nmsgstr \"创建表单\"\n\n#: tmainform.midbvmfindwhatwritesoraccesses.caption\nmsgid \"DBVM Find out what writes or accesses this address\"\nmsgstr \"DBVM 查找写入或访问此地址的内容\"\n\n#: tmainform.midefinenewcustomtype.caption\nmsgid \"Define new custom type (Auto Assembler)\"\nmsgstr \"定义新的自定义类型（自动汇编器）\"\n\n#: tmainform.midefinenewcustomtypelua.caption\nmsgid \"Define new custom type (LUA)\"\nmsgstr \"定义新的自定义类型（LUA）\"\n\n#: tmainform.mideletecustomtype.caption\nmsgid \"Delete selected custom type\"\nmsgstr \"删除选定的自定义类型\"\n\n#: tmainform.mideletesavedscanresults.caption\nmsgid \"Delete scanresult\"\nmsgstr \"删除扫描结果\"\n\n#: tmainform.midotnet.caption\nmsgid \".Net\"\nmsgstr \".Net\"\n\n#: tmainform.mieditcustomtype.caption\nmsgid \"Edit selected custom type\"\nmsgstr \"编辑选定的自定义类型\"\n\n#: tmainform.mienablelcldebug.caption\nmsgid \"Generate errorlogs\"\nmsgstr \"生成错误日志\"\n\n#: tmainform.miforgotscan.caption\nmsgid \"Reload the previous value list (Forgot value scan)\"\nmsgstr \"重新加载之前的值列表（忘记值扫描）\"\n\n#: tmainform.mifreezenegative.caption\nmsgid \"Freeze negative\"\nmsgstr \"冻结负值\"\n\n#: tmainform.mifreezepositive.caption\nmsgid \"Freeze positive\"\nmsgstr \"冻结正值\"\n\n#: tmainform.migetdotnetobjectlist.caption\nmsgid \"Get object list\"\nmsgstr \"获取对象列表\"\n\n#: tmainform.migroupconfig.caption\nmsgid \"Group config\"\nmsgstr \"组配置\"\n\n#: tmainform.mihelp.caption\nmsgid \"&Help\"\nmsgstr \"&帮助\"\n\n#: tmainform.mihidechildren.caption\nmsgid \"Hide children when deactivated\"\nmsgstr \"停用时隐藏子项\"\n\n#: tmainform.mihookd3d.caption\nmsgid \"Hook Direct3D\"\nmsgstr \"钩住 Direct3D\"\n\n#: tmainform.miloadrecent.caption\nmsgid \"Load Recent\"\nmsgstr \"加载最近\"\n\n#: tmainform.milockmouseingame.caption\nmsgid \"Lock mouse in game window\"\nmsgstr \"在游戏窗口中锁定鼠标\"\n\n#: tmainform.miluadocumentation.caption\nmsgid \"Lua documentation\"\nmsgstr \"Lua 文档\"\n\n#: tmainform.mimanualexpandcollapse.caption\nmsgid \"Manual expand/collapse\"\nmsgstr \"手动展开/折叠\"\n\n#: tmainform.mimemrechidecheckbox.caption\nmsgid \"Hide checkbox\"\nmsgstr \"隐藏复选框\"\n\n#: tmainform.mimemrecwithnocheckboxstartsleft.caption\nmsgid \"Description at start\"\nmsgstr \"开始时的描述\"\n\n#: tmainform.minetworkreaduseptrace.caption\nmsgid \"1: ptrace peek\"\nmsgstr \"1: ptrace peek\"\n\n#: tmainform.minetworkreadusevmread.caption\nmsgid \"2: process_vm_readv\"\nmsgstr \"2: process_vm_readv\"\n\n#: tmainform.minetworkwriteuseptrace.caption\nmsgid \"1: ptrace poke\"\nmsgstr \"1: ptrace poke\"\n\n#: tmainform.minetworkwriteusevmwrite.caption\nmsgid \"2:process_vm_writev\"\nmsgstr \"2: process_vm_writev\"\n\n#: tmainform.miobfuscatetable.caption\nmsgid \"Obfuscate currently loaded table\"\nmsgstr \"混淆当前加载的表\"\n\n#: tmainform.mionlyshowcurrentcomparetocolumn.caption\nmsgid \"Only show current \\\"compare to\\\" column\"\nmsgstr \"仅显示当前的“比较”列\"\n\n#: tmainform.mipresetall.caption\nmsgid \"Preset: Scan all memory\"\nmsgstr \"预设：扫描所有内存\"\n\n#: tmainform.mipresetwritable.caption\nmsgid \"Preset: Scan writable memory\"\nmsgstr \"预设：扫描可写内存\"\n\n#: tmainform.mirecordconfig.caption\nmsgid \"Record config\"\nmsgstr \"记录配置\"\n\n#: tmainform.mirecordconfigdeactivaterestore.caption\nmsgid \"Restore to original\"\nmsgstr \"恢复到原始状态\"\n\n#: tmainform.mirecordconfigdeactivatesetvalue.caption\nmsgid \"Set value\"\nmsgstr \"设置值\"\n\n#: tmainform.mirecordconfigonactivate.caption\nmsgid \"On Activate\"\nmsgstr \"激活时\"\n\n#: tmainform.mirecordconfigondeactivate.caption\nmsgid \"On Deactivate\"\nmsgstr \"停用时\"\n\n#: tmainform.mirecursivesetvalue.caption\nmsgid \"Setting a value to this entry sets same value to children\"\nmsgstr \"将此条目的值设置为相同值将设置给子项\"\n\n#: tmainform.miresetrange.caption\nmsgid \"Reset range\"\nmsgstr \"重置范围\"\n\n#: tmainform.miresyncformswithlua.caption\nmsgid \"Resynchronize forms with Lua\"\nmsgstr \"与 Lua 重新同步表单\"\n\n#: tmainform.misavefile.caption\nmsgid \"Save File\"\nmsgstr \"保存文件\"\n\n#: tmainform.misavescanresults.caption\nmsgid \"Save current scanresults\"\nmsgstr \"保存当前扫描结果\"\n\n#: tmainform.miscandirtyonly.caption\nmsgid \"Scan changed regions only\"\nmsgstr \"仅扫描更改的区域\"\n\n#: tmainform.miscanpagedonly.caption\nmsgid \"Scan paged (physical) memory only\"\nmsgstr \"仅扫描分页（物理）内存\"\n\n#: tmainform.misetcrosshair.caption\nmsgid \"Set custom crosshair\"\nmsgstr \"设置自定义十字准线\"\n\n#: tmainform.misetdropdownoptions.caption\nmsgid \"Set/Change dropdown selection options\"\nmsgstr \"设置/更改下拉选择选项\"\n\n#: tmainform.misetupsnapshotkeys.caption\nmsgid \"Start and configure snapshot recording\"\nmsgstr \"开始并配置快照录制\"\n\n#: tmainform.mishowcustomtypedebug.caption\nmsgid \"Show custom type debug info\"\nmsgstr \"显示自定义类型调试信息\"\n\n#: tmainform.mishowluascript.caption\nmsgid \"Show Cheat Table Lua Script\"\nmsgstr \"显示作弊表 Lua 脚本\"\n\n#: tmainform.mishowpreviousvalue.caption\nmsgid \"Show previous value column(s)\"\nmsgstr \"显示之前的值列\"\n\n#: tmainform.misigntable.caption\nmsgid \"Sign Table\"\nmsgstr \"签名表\"\n\n#: tmainform.mitable.caption\nmsgid \"Table\"\nmsgstr \"表\"\n\n#: tmainform.mitestaccessviolationthread.caption\nmsgid \"Test access violation in thread\"\nmsgstr \"测试线程中的访问冲突\"\n\n#: tmainform.mitutorial.caption\nmsgid \"Cheat Engine Tutorial\"\nmsgstr \"Cheat Engine 教程\"\n\n#: tmainform.miwireframe.caption\nmsgid \"Toggle wireframe mode\"\nmsgstr \"切换线框模式\"\n\n#: tmainform.mizbuffer.caption\nmsgid \"Toggle disabled zbuffer\"\nmsgstr \"切换禁用的 zbuffer\"\n\n#: tmainform.mizeroterminate.caption\nmsgid \"Zero-Terminate string\"\nmsgstr \"零终止字符串\"\n\n#: tmainform.ools1.caption\nmsgid \"&Tools\"\nmsgstr \"&工具\"\n\n#: tmainform.openprocess1.caption\nmsgid \"Open Process window\"\nmsgstr \"打开进程窗口\"\n\n#: tmainform.plugins2.caption\nmsgid \"P&lugins\"\nmsgstr \"插件(&P)\"\n\n#: tmainform.pointerscanforthisaddress1.caption\nmsgid \"Pointer scan for this address\"\nmsgstr \"针对该地址的指针扫描\"\n\n#: tmainform.process1.caption\nmsgid \"&Process\"\nmsgstr \"&进程\"\n\n#: tmainform.processlabel.caption\nmsgid \"No Process Selected\"\nmsgstr \"未选择进程\"\n\n#: tmainform.progressbar.hint\nmsgid \"This shows how far Cheat Engine is with searching\"\nmsgstr \"这显示了 Cheat Engine 搜索的进度\"\n\n#: tmainform.rbbit.caption\nmsgid \"Bits\"\nmsgstr \"位\"\n\n#: tmainform.rbfsmaligned.caption\nmsgid \"Alignment\"\nmsgstr \"对齐\"\n\n#: tmainform.rbfsmaligned.hint\nmsgid \"When set and fastscan is enabled will scan the memory address if it is dividable by the given value\"\nmsgstr \"当设置并启用快速扫描时，如果内存地址可以被给定值整除，则会扫描该内存地址\"\n\n#: tmainform.rbfsmlastdigts.caption\nmsgid \"Last Digits\"\nmsgstr \"最后数字\"\n\n#: tmainform.rbfsmlastdigts.hint\nmsgid \"When set and fastscan is enabled will only scan and return addresses that end with the given digits\"\nmsgstr \"当设置并启用快速扫描时，将仅扫描并返回以给定数字结尾的地址\"\n\n#: tmainform.rt1.caption\nmsgid \"Rounded (default)\"\nmsgstr \"四舍五入（默认）\"\n\n#: tmainform.rt2.caption\nmsgid \"Rounded (extreme)\"\nmsgstr \"四舍五入（极端）\"\n\n#: tmainform.rt3.caption\nmsgid \"Truncated\"\nmsgstr \"截断\"\n\n#: tmainform.sbclearactivememory.hint\nmsgid \"Clear RAM usage of target process\"\nmsgstr \"清除目标进程的 RAM 使用情况\"\n\n#: tmainform.sbopenprocess.hint\nmsgid \"Select a process to open\"\nmsgstr \"选择一个进程以打开\"\n\n#: tmainform.scantype.text\nmsgid \"Exact value\"\nmsgstr \"精确值\"\n\n#: tmainform.selectallitems1.caption\nmsgid \"Select all items\"\nmsgstr \"选择所有项目\"\n\n#: tmainform.sethotkey1.caption\nmsgid \"Assign hotkey\"\nmsgstr \"分配热键\"\n\n#: tmainform.smarteditaddresses1.caption\nmsgid \"Smart edit address(es)\"\nmsgstr \"智能编辑地址\"\n\n#: tmainform.speedbutton2.hint\nmsgid \"Delete all addresses from the list\"\nmsgstr \"从列表中删除所有地址\"\n\n#: tmainform.speedbutton3.hint\nmsgid \"Copy all selected items to the address list\"\nmsgstr \"将所有选定项目复制到地址列表\"\n\n#: tmainform.toaddress.text\nmsgid \"ffffffff\"\nmsgstr \"ffffffff\"\n\n#: tmainform.undoscan.caption\nmsgid \"Undo Scan\"\nmsgstr \"撤销扫描\"\n\n#: tmemorybrowser.all1.caption\nmsgid \"Full stack\"\nmsgstr \"完整堆栈\"\n\n#: tmemorybrowser.allocatenonpagedmemory1.caption\nmsgid \"Allocate nonpaged memory\"\nmsgstr \"分配非分页内存\"\n\n#: tmemorybrowser.assemble1.caption\nmsgid \"Assemble\"\nmsgstr \"汇编\"\n\n#: tmemorybrowser.assemblycode1.caption\nmsgid \"Find assembly code\"\nmsgstr \"查找汇编代码\"\n\n#: tmemorybrowser.autoinject1.caption\nmsgid \"Auto Assemble\"\nmsgstr \"自动汇编\"\n\n#: tmemorybrowser.breakandtraceinstructions1.caption\nmsgid \"Break and trace instructions\"\nmsgstr \"中断和跟踪指令\"\n\n#: tmemorybrowser.breakpointlist1.caption\nmsgid \"Breakpointlist\"\nmsgstr \"断点列表\"\n\n#: tmemorybrowser.caption\nmsgid \"Memory Viewer\"\nmsgstr \"内存查看器\"\n\n#: tmemorybrowser.changestateofregisteratthislocation1.caption\nmsgid \"Change register at this location\"\nmsgstr \"在此位置更改寄存器\"\n\n#: tmemorybrowser.continueanddetachdebugger1.caption\nmsgid \"Continue and  detach debugger\"\nmsgstr \"继续并分离调试器\"\n\n#: tmemorybrowser.copybytesandopcodes.caption\nmsgid \"Bytes+Opcodes\"\nmsgstr \"字节+操作码\"\n\n#: tmemorybrowser.copybytesandopcodesandcomments.caption\nmsgid \"Bytes+Opcodes+Comments\"\nmsgstr \"字节+操作码+注释\"\n\n#: tmemorybrowser.copyopcodes.caption\nmsgid \"Opcodes\"\nmsgstr \"操作码\"\n\n#: tmemorybrowser.createthread1.caption\nmsgid \"Create Thread\"\nmsgstr \"创建线程\"\n\n#: tmemorybrowser.disectwindow1.caption\nmsgid \"Dissect window(s)\"\nmsgstr \"解剖窗口\"\n\n#: tmemorybrowser.dispbytes.caption\nmsgid \"Byte hex\"\nmsgstr \"字节十六进制\"\n\n#: tmemorybrowser.dispchar.caption\nmsgid \"Byte decimal\"\nmsgstr \"字节十进制\"\n\n#: tmemorybrowser.dispdwords.caption\nmsgid \"4 Byte hex\"\nmsgstr \"4 字节十六进制\"\n\n#: tmemorybrowser.dispints.caption\nmsgid \"4 Byte decimal\"\nmsgstr \"4 字节十进制\"\n\n#: tmemorybrowser.displaytype1.caption\nmsgid \"Display Type\"\nmsgstr \"显示类型\"\n\n#: tmemorybrowser.displongs.caption\nmsgid \"8 Byte decimal\"\nmsgstr \"8 字节十进制\"\n\n#: tmemorybrowser.dispqwords.caption\nmsgid \"8 Byte hex\"\nmsgstr \"8 字节十六进制\"\n\n#: tmemorybrowser.dispshorts.caption\nmsgid \"2 Byte decimal\"\nmsgstr \"2 字节十进制\"\n\n#: tmemorybrowser.dispwords.caption\nmsgid \"2 Byte hex\"\nmsgstr \"2 字节十六进制\"\n\n#: tmemorybrowser.dissectcode1.caption\nmsgid \"Dissect code\"\nmsgstr \"解析代码\"\n\n#: tmemorybrowser.dissectpeheaders1.caption\nmsgid \"Dissect PE headers\"\nmsgstr \"解析 PE 头\"\n\n#: tmemorybrowser.enumeratedllsandsymbols1.caption\nmsgid \"Enumerate DLL's and Symbols\"\nmsgstr \"枚举 DLL 和符号\"\n\n#: tmemorybrowser.fillmemory1.caption\nmsgid \"Fill Memory\"\nmsgstr \"填充内存\"\n\n#: tmemorybrowser.findmemory1.caption\nmsgid \"Find memory\"\nmsgstr \"查找内存\"\n\n#: tmemorybrowser.findoutwhataddressesthisinstructionaccesses1.caption\nmsgid \"Find out what addresses this instruction accesses\"\nmsgstr \"找出该指令访问了哪些地址\"\n\n#: tmemorybrowser.gdtlist1.caption\nmsgid \"GDT list\"\nmsgstr \"GDT 列表\"\n\n#: tmemorybrowser.getaddress1.caption\nmsgid \"Get address\"\nmsgstr \"获取地址\"\n\n#: tmemorybrowser.goto1.caption\nmsgid \"Goto address\"\nmsgstr \"转到地址\"\n\n#: tmemorybrowser.gotoaddress1.caption\nmsgid \"Go to address\"\nmsgstr \"前往地址\"\n\n#: tmemorybrowser.heaps1.caption\nmsgid \"Heaplist\"\nmsgstr \"堆列表\"\n\n#: tmemorybrowser.idtlist1.caption\nmsgid \"IDT list\"\nmsgstr \"IDT 列表\"\n\n#: tmemorybrowser.injectdll1.caption\nmsgid \"Inject DLL\"\nmsgstr \"注入 DLL\"\n\n#: tmemorybrowser.kerneltools1.caption\nmsgid \"Kernel tools\"\nmsgstr \"内核工具\"\n\n#: tmemorybrowser.loadmemolryregion1.caption\nmsgid \"Load memory region\"\nmsgstr \"加载内存区域\"\n\n#: tmemorybrowser.loadsymbolfile1.caption\nmsgid \"Load symbol file\"\nmsgstr \"加载符号文件\"\n\n#: tmemorybrowser.lvstacktracedata.columns[1].caption\nmsgid \"DWORD\"\nmsgstr \"DWORD\"\n\n#: tmemorybrowser.lvstacktracedata.hint\nmsgid \"\"\n\"Shows the current stack.\\n\"\n\"Tip: When doubleclicking the value and it represents an address, then you can hold shift to make it show in the \"\n\"disassembler, and ctrl to make it show in the memory view. Else Cheat Engine will guess it for you based on if it's \"\n\"executable memory or not\"\nmsgstr \"显示当前堆栈。提示：当双击该值并且它表示一个地址时，可以按住 shift 使其在反汇编器中显示，按住 ctrl 使其在内存视图中显示。否则，Cheat Engine 将根据它是否是可执行内存来猜测。\"\n\n#: tmemorybrowser.makepagewritable1.caption\nmsgid \"Change page protection\"\nmsgstr \"更改页面保护\"\n\n#: tmemorybrowser.maxstacktracesize1.caption\nmsgid \"Max stack: 4096\"\nmsgstr \"最大堆栈：4096\"\n\n#: tmemorybrowser.memoryregions1.caption\nmsgid \"Memory Regions\"\nmsgstr \"内存区域\"\n\n#: tmemorybrowser.menuitem10.caption\nmsgid \"All strings\"\nmsgstr \"所有字符串\"\n\n#: tmemorybrowser.menuitem12.caption\nmsgid \"Apply changes to file\"\nmsgstr \"将更改应用于文件\"\n\n#: tmemorybrowser.menuitem14.caption\nmsgid \"Use windows debug symbols\"\nmsgstr \"使用 Windows 调试符号\"\n\n#: tmemorybrowser.menuitem15.caption\nmsgid \"Overlay with structure\"\nmsgstr \"与结构叠加\"\n\n#: tmemorybrowser.menuitem17.caption\nmsgid \"Generate structure from datastream and template\"\nmsgstr \"从数据流和模板生成结构\"\n\n#: tmemorybrowser.menuitem18.caption\nmsgid \"Graphical memory view\"\nmsgstr \"图形内存视图\"\n\n#: tmemorybrowser.menuitem4.caption\nmsgid \"Disable toolbar\"\nmsgstr \"禁用工具栏\"\n\n#: tmemorybrowser.menuitem9.caption\nmsgid \"Change fade timer\"\nmsgstr \"更改淡入计时器\"\n\n#: tmemorybrowser.miaddtothecodelist.caption\nmsgid \"Add to the code list\"\nmsgstr \"添加到代码列表\"\n\n#: tmemorybrowser.miarcharm.caption\nmsgid \"ARM\"\nmsgstr \"ARM\"\n\n#: tmemorybrowser.miarchitecture.caption\nmsgid \"Architecture\"\nmsgstr \"架构\"\n\n#: tmemorybrowser.miarchx86.caption\nmsgid \"X86\"\nmsgstr \"X86\"\n\n#: tmemorybrowser.mibinutils.caption\nmsgid \"BinUtils\"\nmsgstr \"BinUtils\"\n\n#: tmemorybrowser.mibreakonexceptions.caption\nmsgid \"Break on unexpected exceptions\"\nmsgstr \"在意外异常时中断\"\n\n#: tmemorybrowser.michangeprotectionre.caption\nmsgid \"Read Execute\"\nmsgstr \"读取执行\"\n\n#: tmemorybrowser.michangeprotectionrw.caption\nmsgid \"Read Write\"\nmsgstr \"读取写入\"\n\n#: tmemorybrowser.michangeprotectionrwe.caption\nmsgid \"Read Write Execute\"\nmsgstr \"读取写入执行\"\n\n#: tmemorybrowser.miclearcache.caption\nmsgid \"Clear GDB cache for this page\"\nmsgstr \"清除此页面的 GDB 缓存\"\n\n#: tmemorybrowser.miconditionalbreak.caption\nmsgid \"Set/Change break condition\"\nmsgstr \"设置/更改断点条件\"\n\n#: tmemorybrowser.micopyaddressesonly.caption\nmsgid \"Addresses only\"\nmsgstr \"仅地址\"\n\n#: tmemorybrowser.micopybytesonly.caption\nmsgid \"Bytes only (no address)\"\nmsgstr \"仅字节（无地址）\"\n\n#: tmemorybrowser.micopyopcodesonly.caption\nmsgid \"Opcodes only (no address)\"\nmsgstr \"仅操作码（无地址）\"\n\n#: tmemorybrowser.micr3switcher.caption\nmsgid \"CR3 Switcher\"\nmsgstr \"CR3 切换器\"\n\n#: tmemorybrowser.midatabreakpointmenu.caption\nmsgid \"Data Breakpoint\"\nmsgstr \"数据断点\"\n\n#: tmemorybrowser.midbvmactivatecloak.caption\nmsgid \"DBVM Activate Cloak\"\nmsgstr \"DBVM 激活隐身\"\n\n#: tmemorybrowser.midbvmdisablecloak.caption\nmsgid \"DBVM Disable Cloak\"\nmsgstr \"DBVM 禁用隐身\"\n\n#: tmemorybrowser.midbvmfindoutwhataddressesthisinstructionaccesses.caption\nmsgid \"DBVM Find out what addresses this instruction accesses\"\nmsgstr \"DBVM 查找此指令访问的地址\"\n\n#: tmemorybrowser.midebugevents.caption\nmsgid \"Debug events\"\nmsgstr \"调试事件\"\n\n#: tmemorybrowser.midebugexecutetillreturn.caption\nmsgid \"Step Out - Execute till return\"\nmsgstr \"步出 - 执行直到返回\"\n\n#: tmemorybrowser.midebugsetaddress.caption\nmsgid \"Set Address\"\nmsgstr \"设置地址\"\n\n#: tmemorybrowser.midebugtogglebreakpoint.caption\nmsgid \"Toggle breakpoint\"\nmsgstr \"切换断点\"\n\n#: tmemorybrowser.mideletebp.caption\nmsgid \"Delete Breakpoint\"\nmsgstr \"删除断点\"\n\n#: tmemorybrowser.midisassemblertype.caption\nmsgid \"Disassembly output\"\nmsgstr \"反汇编输出\"\n\n#: tmemorybrowser.midisassembly32.caption\nmsgid \"32-bit\"\nmsgstr \"32 位\"\n\n#: tmemorybrowser.midisassembly64.caption\nmsgid \"64-bit\"\nmsgstr \"64 位\"\n\n#: tmemorybrowser.midissectdata.caption\nmsgid \"Dissect data/structures old\"\nmsgstr \"解析数据/结构（旧）\"\n\n#: tmemorybrowser.midissectdata2.caption\nmsgid \"Dissect data/structures\"\nmsgstr \"解析数据/结构\"\n\n#: tmemorybrowser.miexceptionignorelist.caption\nmsgid \"Manage exception code filter\"\nmsgstr \"管理异常代码过滤器\"\n\n#: tmemorybrowser.miexceptionregionmanagelist.caption\nmsgid \"Manage exception region list\"\nmsgstr \"管理异常区域列表\"\n\n#: tmemorybrowser.mifindwhatwrites.caption\nmsgid \"Find out what writes this address\"\nmsgstr \"查找写入此地址的内容\"\n\n#: tmemorybrowser.mifollowinhexview.caption\nmsgid \"Follow in hexview when stepping\"\nmsgstr \"在步进时跟随十六进制视图\"\n\n#: tmemorybrowser.mignuassembler.caption\nmsgid \"GNU Assembler\"\nmsgstr \"GNU 汇编器\"\n\n#: tmemorybrowser.mihidetoolbar.caption\nmsgid \"Hide toolbar\"\nmsgstr \"隐藏工具栏\"\n\n#: tmemorybrowser.miiptlog.caption\nmsgid \"IPT Log\"\nmsgstr \"IPT 日志\"\n\n#: tmemorybrowser.mikernelmodesymbols.caption\nmsgid \"Kernelmode symbols\"\nmsgstr \"内核模式符号\"\n\n#: tmemorybrowser.miopenindissectdata.caption\nmsgid \"Open in dissect data/structure\"\nmsgstr \"在解析数据/结构中打开\"\n\n#: tmemorybrowser.mipaging.caption\nmsgid \"Paging\"\nmsgstr \"分页\"\n\n#: tmemorybrowser.miseperators.caption\nmsgid \"Seperators\"\nmsgstr \"分隔符\"\n\n#: tmemorybrowser.misetbreakpointdbvmexec.caption\nmsgid \"DBVM Breakpoint (+1 instruction)\"\nmsgstr \"DBVM 断点（+1 指令）\"\n\n#: tmemorybrowser.misetbreakpointpe.caption\nmsgid \"Exception Breakpoint (+1 instruction)\"\nmsgstr \"异常断点（+1 指令）\"\n\n#: tmemorybrowser.misetspecificbreakpoint.caption\nmsgid \"Set specific breakpoint type\"\nmsgstr \"设置特定断点类型\"\n\n#: tmemorybrowser.mishowindisassembler.caption\nmsgid \"Show in disassembler\"\nmsgstr \"在反汇编器中显示\"\n\n#: tmemorybrowser.mishowinhexview.caption\nmsgid \"Show in hexview\"\nmsgstr \"在十六进制视图中显示\"\n\n#: tmemorybrowser.mishowmoduleaddresses.caption\nmsgid \"Show module addresses\"\nmsgstr \"显示模块地址\"\n\n#: tmemorybrowser.mishowsectionaddresses.caption\nmsgid \"Show section addresses\"\nmsgstr \"显示节地址\"\n\n#: tmemorybrowser.mishowsymbols.caption\nmsgid \"Show symbols\"\nmsgstr \"显示符号\"\n\n#: tmemorybrowser.mitextencodingascii.caption\nmsgid \"Ascii\"\nmsgstr \"ASCII\"\n\n#: tmemorybrowser.mitextencodingutf8.caption\nmsgid \"UTF-8\"\nmsgstr \"UTF-8\"\n\n#: tmemorybrowser.miunexpectedexceptionbreakifinregion.caption\nmsgid \"Only in specified regions\"\nmsgstr \"仅在指定区域内\"\n\n#: tmemorybrowser.miuserdefinedcomment.caption\nmsgid \"Set/Change comment\"\nmsgstr \"设置/更改注释\"\n\n#: tmemorybrowser.miuserdefinedheader.caption\nmsgid \"Set/Change header\"\nmsgstr \"设置/更改标题\"\n\n#: tmemorybrowser.miuserdefinedsymbols.caption\nmsgid \"Userdefined symbols\"\nmsgstr \"用户定义符号\"\n\n#: tmemorybrowser.modulesonly1.caption\nmsgid \"Modules only\"\nmsgstr \"仅模块\"\n\n#: tmemorybrowser.nonsystemmodulesonly1.caption\nmsgid \"Non system modules only\"\nmsgstr \"仅非系统模块\"\n\n#: tmemorybrowser.onlyshowjumplineswithinrange1.caption\nmsgid \"Only show jumplines within range\"\nmsgstr \"仅在范围内显示跳转行\"\n\n#: tmemorybrowser.opendlldialog.title\nmsgid \"Select the module you want to inject\"\nmsgstr \"选择要注入的模块\"\n\n#: tmemorybrowser.pastefromclipboard1.caption\nmsgid \"Paste from clipboard\"\nmsgstr \"从剪贴板粘贴\"\n\n#: tmemorybrowser.referencedstrings1.caption\nmsgid \"Referenced strings\"\nmsgstr \"引用字符串\"\n\n#: tmemorybrowser.reservememory1.caption\nmsgid \"Allocate Memory\"\nmsgstr \"分配内存\"\n\n#: tmemorybrowser.savememoryregion1.caption\nmsgid \"Save memory region\"\nmsgstr \"保存内存区域\"\n\n#: tmemorybrowser.sbshowfloats.caption\nmsgid \">\"\nmsgstr \">\"\n\n#: tmemorybrowser.scanforcodecaves1.caption\nmsgid \"Scan for code caves\"\nmsgstr \"扫描代码洞\"\n\n#: tmemorybrowser.search1.caption\nmsgid \"Search memory...\"\nmsgstr \"搜索内存中...\"\n\n#: tmemorybrowser.sericedescriptortable1.caption\nmsgid \"Service Descriptor Table\"\nmsgstr \"服务描述符表\"\n\n#: tmemorybrowser.setsymbolsearchpath1.caption\nmsgid \"Set symbol searchpath\"\nmsgstr \"设置符号搜索路径\"\n\n#: tmemorybrowser.showdebugtoolbar1.caption\nmsgid \"Show debug toolbar\"\nmsgstr \"显示调试工具栏\"\n\n#: tmemorybrowser.showjumplines1.caption\nmsgid \"Show jumplines\"\nmsgstr \"显示跳转行\"\n\n#: tmemorybrowser.showvaluesofstaticaddresses1.caption\nmsgid \"Show 'Comment' row\"\nmsgstr \"显示“注释”行\"\n\n#: tmemorybrowser.tbrun.hint\nmsgid \"F9\"\nmsgstr \"F9\"\n\n#: tmemorybrowser.tbruntill.hint\nmsgid \"F4\"\nmsgstr \"F4\"\n\n#: tmemorybrowser.tbrununhandled.hint\nmsgid \"Shift+F9\"\nmsgstr \"Shift+F9\"\n\n#: tmemorybrowser.tbstepinto.hint\nmsgid \"F7\"\nmsgstr \"F7\"\n\n#: tmemorybrowser.tbstepout.hint\nmsgid \"Shift+F8\"\nmsgstr \"Shift+F8\"\n\n#: tmemorybrowser.tbstepover.hint\nmsgid \"F8\"\nmsgstr \"F8\"\n\n#: tmemorybrowser.tbtogglebreakpoint.caption\nmsgid \"Toggle Breakpoint\"\nmsgstr \"切换断点\"\n\n#: tmemorybrowser.tbtogglebreakpoint.hint\nmsgid \"F5\"\nmsgstr \"F5\"\n\n#: tmemorybrowser.watchmemoryallocations1.caption\nmsgid \"Watch memory allocations\"\nmsgstr \"监视内存分配\"\n\n#: tprocesswindow.btnattachdebugger.caption\nmsgid \"Attach debugger to process\"\nmsgstr \"将调试器附加到进程\"\n\n#: tprocesswindow.inputpidmanually1.caption\nmsgid \"Input PID manually\"\nmsgstr \"手动输入 PID\"\n\n#: tprocesswindow.michangefont.caption\nmsgid \"Change font\"\nmsgstr \"更改字体\"\n\n#: tprocesswindow.miconvertpidtodecimal.caption\nmsgid \"Convert PID to decimal\"\nmsgstr \"将 PID 转换为十进制\"\n\n#: tprocesswindow.miownprocessesonly.caption\nmsgid \"Only show processes of the current user\"\nmsgstr \"仅显示当前用户的进程\"\n\n#: tprocesswindow.miprocesslistlong.caption\nmsgid \"Process List (Long)\"\nmsgstr \"进程列表（长）\"\n\n#: tprocesswindow.mishowinvisibleitems.caption\nmsgid \"Show invisible windows\"\nmsgstr \"显示不可见窗口\"\n\n#: trainergenerator.rsaaaaw\nmsgid \"aaaaw :(\"\nmsgstr \"aaaaw :(\"\n\n#: trainergenerator.rsalreadyatrainerformdefined\nmsgid \"\"\n\"There is already a trainer form defined. Continuing will erase the current trainerscript and cheats in the trainer and \"\n\"replace them with the current hotkeys defined in your current cheat table (Layout and images will remain unchanged). \"\n\"Continue ?\"\nmsgstr \"已经定义了一个训练器表单。继续将会擦除当前训练脚本和训练器中的作弊，并用当前作弊表中定义的热键替换它们（布局和图像将保持不变）。继续吗？\"\n\n#: trainergenerator.rsautogenwarningpart1\nmsgid \"This is autogenerated code. Changing code in this block will\"\nmsgstr \"这是自动生成的代码。更改此块中的代码将\"\n\n#: trainergenerator.rsautogenwarningpart2\nmsgid \"get erased and rewritten if you regenerate the trainer code\"\nmsgstr \"在重新生成训练器代码时被擦除和重写\"\n\n#: trainergenerator.rsbutallowdecrease\nmsgid \"but allow decrease\"\nmsgstr \"但允许减少\"\n\n#: trainergenerator.rsbutallowincrease\nmsgid \"but allow increase\"\nmsgstr \"但允许增加\"\n\n#: trainergenerator.rsby\nmsgid \"by\"\nmsgstr \"通过\"\n\n#: trainergenerator.rscheatentries\nmsgid \"Cheat Entries\"\nmsgstr \"作弊条目\"\n\n#: trainergenerator.rsdeactive\nmsgid \"(De)active\"\nmsgstr \"（停）用\"\n\n#: trainergenerator.rsdecrease\nmsgid \"Decrease\"\nmsgstr \"减少\"\n\n#: trainergenerator.rsdosomethingwith\nmsgid \"Do something with\"\nmsgstr \"对...做一些事情\"\n\n#: trainergenerator.rseffect\nmsgid \"Effect\"\nmsgstr \"效果\"\n\n#: trainergenerator.rsgobacktogenerateddesigner\nmsgid \"Go back to generated designer\"\nmsgstr \"返回生成的设计器\"\n\n#: trainergenerator.rsincrease\nmsgid \"Increase\"\nmsgstr \"增加\"\n\n#: trainergenerator.rsinvalidtrainerscript\nmsgid \"\"\n\"The current lua script only has a half TRAINERGENERATORSTART/TRAINERGENERATORSTOP block. Please fix this first \"\n\"(Removing is the easiest option)\"\nmsgstr \"当前的 lua 脚本只有一个半的 TRAINERGENERATORSTART/TRAINERGENERATORSTOP 块。请先修复这个问题（删除是最简单的选项）\"\n\n#: trainergenerator.rsnocheatpanel\n#, object-pascal-format\nmsgid \"\"\n\"The current trainer form does not have a panel named 'CHEATPANEL' so can not be reused by the automated trainer \"\n\"generator.%sDo you want to start from scratch? (If you want to create a trainer from your current script you can just \"\n\"save your table as .EXE instead of using the automated trainer generator)\"\nmsgstr \"当前的训练器表单没有名为“CHEATPANEL”的面板，因此无法被自动训练器生成器重用。%s你想从头开始吗？（如果你想从当前脚本创建训练器，可以将你的表格保存为 .EXE，而不是使用自动训练器生成器）\"\n\n#: trainergenerator.rsonclosewarning\nmsgid \"This form had an onClose event. Good thing this was only a stub, else Cheat Engine would have terminated\"\nmsgstr \"此表单有一个 onClose 事件。好在这只是一个存根，否则 Cheat Engine 将会终止\"\n\n#: trainergenerator.rspleaseselecttypeinaprocessname\nmsgid \"Please select/type in a processname\"\nmsgstr \"请选择/输入一个进程名称\"\n\n#: trainergenerator.rsselectthecheatentryyouwanttosetthehotkeyfor\nmsgid \"Select the cheat entry you want to set the hotkey for\"\nmsgstr \"选择你想要设置热键的作弊条目\"\n\n#: trainergenerator.rsthankyou\nmsgid \"Thank you! :)\"\nmsgstr \"谢谢！ :)\"\n\n#: trainergenerator.rstipyoudonthavetousethetrainergeneratorifyoudontwantto\nmsgid \"Tip: You don't have to use the trainer generator if you don't want to. You can just save your table as .EXE or CETRAINER\"\nmsgstr \"提示：如果你不想使用训练器生成器，可以直接将你的表保存为 .EXE 或 CETRAINER\"\n\n#: trainergenerator.rsto\nmsgid \"to\"\nmsgstr \"到\"\n\n#: trainergenerator.rsunfreeze\nmsgid \"(Un)Freeze\"\nmsgstr \"（解）冻\"\n\n#: trainergenerator.rsyouneedacheattablewithcheatentries\nmsgid \"You need a cheat table with cheat entries\"\nmsgstr \"你需要一个包含作弊条目的作弊表\"\n\n#: tregisters.caption\nmsgid \"Registers\"\nmsgstr \"寄存器\"\n\n#: tregisters.eaxlabel.caption\nmsgid \"EAX 0123456789ABCDEF\"\nmsgstr \"EAX 0123456789ABCDEF\"\n\n#: tregisters.micopyallregisterstoclipboard.caption\nmsgid \"Copy all registers values to clipboard\"\nmsgstr \"将所有寄存器值复制到剪贴板\"\n\n#: tregisters.micopyregistervaluetoclipboard.caption\nmsgid \"Copy selected register value to clipboard\"\nmsgstr \"将选定的寄存器值复制到剪贴板\"\n\n#: ttlg.caption\nmsgid \"TLG:The Lame Game\"\nmsgstr \"TLG：无聊游戏\"\n\n#: ttlg.label1.caption\nmsgid \"Score:\"\nmsgstr \"分数：\"\n\n#: ttypeform.label1.caption\nmsgid \"Select the new type:\"\nmsgstr \"选择新类型：\"\n\n#: tvaluechangeform.caption\nmsgid \"Change Offset: ########\"\nmsgstr \"更改偏移量：########\"\n\n#: tvaluechangeform.cbvartype.text\nmsgid \"1 Byte\"\nmsgstr \"1 字节\"\n\n#: typepopup.rsinvalidlength\nmsgid \"Invalid length\"\nmsgstr \"无效长度\"\n\n#: unrandomizer.rsthefollowingaddressesgotchanged\nmsgid \"The following addresses got changed\"\nmsgstr \"以下地址已被更改\"\n\n#: unrandomizer.rstheunrandomizerwillcurrentlynotworkon64bitapplicat\nmsgid \"The unrandomizer will currently not work on 64-bit applications\"\nmsgstr \"当前随机化器无法在 64 位应用程序上工作\"\n\n#: valuechange.rschangeoffset\n#, object-pascal-format\nmsgid \"Change offset %s\"\nmsgstr \"更改偏移量 %s\"\n\n#: valuechange.rspartofthestringisunreadable\nmsgid \"Part of the string is unreadable!\"\nmsgstr \"字符串的一部分无法读取！\"\n\n#: vartypestrings.rs_vtautoassembler\nmsgid \"Auto Assembler Script\"\nmsgstr \"自动汇编脚本\"\n\n#: vartypestrings.rs_vtcodepagestring\nmsgid \"CodePage String\"\nmsgstr \"代码页字符串\"\n\n#: vartypestrings.rs_vtcustom\nmsgid \"Custom\"\nmsgstr \"自定义\"\n\n#: vartypestrings.rs_vtgrouped\nmsgid \"Grouped\"\nmsgstr \"分组\"\n\n#: vartypestrings.rs_vtpointerornested\nmsgid \"Pointer or Nested Structure\"\nmsgstr \"指针或嵌套结构\"\n\n#: vartypestrings.rs_vtunicodestring\nmsgid \"Unicode String\"\nmsgstr \"Unicode 字符串\"\n\n#: vartypestrings.rs_vtwidestring\nmsgid \"Widestring\"\nmsgstr \"宽字符串\"\n\n#: vehdebugger.rscheatenginefailedtogetintotheconfig\n#, object-pascal-format\nmsgid \"Cheat Engine failed to get into the config of the selected program. (Error=%s)\"\nmsgstr \"Cheat Engine 无法进入所选程序的配置。 (错误=%s)\"\n\n#: vehdebugger.rserrorwhiletryingtocreatetheconfigurationstructure\n#, object-pascal-format\nmsgid \"\"\n\"Error while trying to create the configuration structure! (Which effectively renders this whole feature useless) \"\n\"Errorcode=%s\"\nmsgstr \"尝试创建配置结构时出错！ (这实际上使整个功能无效) 错误代码=%s\"\n\n#: vehdebugger.rsfailureduplicatingtheeventhandlestotheotherprocess\nmsgid \"Failure duplicating the event handles to the other process\"\nmsgstr \"将事件句柄复制到其他进程时失败\"\n\n#: vehdebugger.rsfailureduplicatingthefilemapping\nmsgid \"Failure duplicating the filemapping\"\nmsgstr \"复制文件映射时失败\"\n\n#: vehdebugger.rsthevehdllseemstohavefailedtoload\nmsgid \"The VEH dll seems to have failed to load\"\nmsgstr \"VEH dll 似乎加载失败\"\n\n#: vehdebugger.rsvehdebugerror\nmsgid \"VEH Debug error\"\nmsgstr \"VEH 调试错误\"\n\n#: vehdebugger.rswrongvehdllversion\n#, object-pascal-format\nmsgid \"The version of the VEH dll inside the target process (%x) does not match what was expected %x\"\nmsgstr \"目标进程中的 VEH dll 版本 (%x) 与预期的 %x 不匹配\"\n\n#: vmxfunctions.rsinvalidinstruction\nmsgid \"Invalid instruction\"\nmsgstr \"无效指令\"\n\n#: windowsdebugger.rserrorattachingthewindowsdebugger\n#, object-pascal-format\nmsgid \"Error attaching the windows debugger: %s\"\nmsgstr \"附加 Windows 调试器时出错：%s\"\n\n#: zstreamext.rsaseekwasdoneforanotherpurpose\nmsgid \"A seek was done for another purpose than getting the position\"\nmsgstr \"进行的查找不是为了获取位置\"\n\n#: assemblerarm.rsinvalidregister\nmsgctxt \"assemblerarm.rsinvalidregister\"\nmsgid \"Invalid register\"\nmsgstr \"无效寄存器\"\n\n#: assemblerunit.rsinvalidaddress\nmsgctxt \"assemblerunit.rsinvalidaddress\"\nmsgid \"Invalid address\"\nmsgstr \"无效地址\"\n\n#: assemblerunit.rsinvalidregister\nmsgctxt \"assemblerunit.rsinvalidregister\"\nmsgid \"Invalid register\"\nmsgstr \"无效寄存器\"\n\n#: autoassembler.rscouldnotbefound\n#, object-pascal-format\nmsgctxt \"autoassembler.rscouldnotbefound\"\nmsgid \"%s could not be found\"\nmsgstr \"%s 找不到\"\n\n#: autoassembler.rsxcouldnotbefound\n#, object-pascal-format\nmsgctxt \"autoassembler.rsxcouldnotbefound\"\nmsgid \"%s could not be found\"\nmsgstr \"%s 找不到\"\n\n#: cefuncproc.rsalt\nmsgctxt \"cefuncproc.rsalt\"\nmsgid \"Alt\"\nmsgstr \"Alt\"\n\n#: cefuncproc.rsapplicationskey\nmsgctxt \"cefuncproc.rsapplicationskey\"\nmsgid \"Applications key\"\nmsgstr \"应用程序键\"\n\n#: cefuncproc.rsbackspace\nmsgctxt \"cefuncproc.rsbackspace\"\nmsgid \"Backspace\"\nmsgstr \"退格键\"\n\n#: cefuncproc.rsbreak\nmsgctxt \"cefuncproc.rsbreak\"\nmsgid \"Break\"\nmsgstr \"中断\"\n\n#: cefuncproc.rscapslock\nmsgctxt \"cefuncproc.rscapslock\"\nmsgid \"Caps Lock\"\nmsgstr \"大写锁定\"\n\n#: cefuncproc.rscefpicantgettheprocesslistyouarepropablyuseinwindowsntetc\nmsgctxt \"cefuncproc.rscefpicantgettheprocesslistyouarepropablyuseinwindowsntetc\"\nmsgid \"I can't get the process list. You are propably using windows NT. Use the window list instead!\"\nmsgstr \"我无法获取进程列表。你可能正在使用 Windows NT。请改用窗口列表！\"\n\n#: cefuncproc.rsclear\nmsgctxt \"cefuncproc.rsclear\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: cefuncproc.rsctrl\nmsgctxt \"cefuncproc.rsctrl\"\nmsgid \"Ctrl\"\nmsgstr \"Ctrl\"\n\n#: cefuncproc.rsdownarrow\nmsgctxt \"cefuncproc.rsdownarrow\"\nmsgid \"Down Arrow\"\nmsgstr \"向下箭头\"\n\n#: cefuncproc.rsend\nmsgctxt \"cefuncproc.rsend\"\nmsgid \"End\"\nmsgstr \"结束\"\n\n#: cefuncproc.rsenter\nmsgctxt \"cefuncproc.rsenter\"\nmsgid \"Enter\"\nmsgstr \"回车\"\n\n#: cefuncproc.rsesc\nmsgctxt \"cefuncproc.rsesc\"\nmsgid \"Esc\"\nmsgstr \"Esc\"\n\n#: cefuncproc.rsexecute\nmsgctxt \"cefuncproc.rsexecute\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: cefuncproc.rshelp\nmsgctxt \"cefuncproc.rshelp\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#: cefuncproc.rshome\nmsgctxt \"cefuncproc.rshome\"\nmsgid \"Home\"\nmsgstr \"主页\"\n\n#: cefuncproc.rsicantgettheprocesslistyouarepropablyusingwindowsnt\nmsgctxt \"cefuncproc.rsicantgettheprocesslistyouarepropablyusingwindowsnt\"\nmsgid \"I can't get the process list. You are propably using windows NT. Use the window list instead!\"\nmsgstr \"我无法获取进程列表。你可能正在使用 Windows NT。请改用窗口列表！\"\n\n#: cefuncproc.rsinsert\nmsgctxt \"cefuncproc.rsinsert\"\nmsgid \"Insert\"\nmsgstr \"插入\"\n\n#: cefuncproc.rsleftarrow\nmsgctxt \"cefuncproc.rsleftarrow\"\nmsgid \"Left Arrow\"\nmsgstr \"向左箭头\"\n\n#: cefuncproc.rsleftwindowskey\nmsgctxt \"cefuncproc.rsleftwindowskey\"\nmsgid \"Left Windows key\"\nmsgstr \"左 Windows 键\"\n\n#: cefuncproc.rsnumeric\nmsgctxt \"cefuncproc.rsnumeric\"\nmsgid \"numeric\"\nmsgstr \"数字\"\n\n#: cefuncproc.rsnumlock\nmsgctxt \"cefuncproc.rsnumlock\"\nmsgid \"Num Lock\"\nmsgstr \"数字锁定\"\n\n#: cefuncproc.rspagedown\nmsgctxt \"cefuncproc.rspagedown\"\nmsgid \"Page Down\"\nmsgstr \"向下翻页\"\n\n#: cefuncproc.rspageup\nmsgctxt \"cefuncproc.rspageup\"\nmsgid \"Page Up\"\nmsgstr \"向上翻页\"\n\n#: cefuncproc.rspause\nmsgctxt \"cefuncproc.rspause\"\nmsgid \"Pause\"\nmsgstr \"暂停\"\n\n#: cefuncproc.rsprint\nmsgctxt \"cefuncproc.rsprint\"\nmsgid \"Print\"\nmsgstr \"打印\"\n\n#: cefuncproc.rsprintscreen\nmsgctxt \"cefuncproc.rsprintscreen\"\nmsgid \"Print Screen\"\nmsgstr \"打印屏幕\"\n\n#: cefuncproc.rsrightarrow\nmsgctxt \"cefuncproc.rsrightarrow\"\nmsgid \"Right Arrow\"\nmsgstr \"向右箭头\"\n\n#: cefuncproc.rsrightwindowskey\nmsgctxt \"cefuncproc.rsrightwindowskey\"\nmsgid \"Right Windows key\"\nmsgstr \"右 Windows 键\"\n\n#: cefuncproc.rsscrolllock\nmsgctxt \"cefuncproc.rsscrolllock\"\nmsgid \"Scroll Lock\"\nmsgstr \"滚动锁定\"\n\n#: cefuncproc.rsselect\nmsgctxt \"cefuncproc.rsselect\"\nmsgid \"Select\"\nmsgstr \"选择\"\n\n#: cefuncproc.rsseparator\nmsgctxt \"cefuncproc.rsseparator\"\nmsgid \"Separator\"\nmsgstr \"分隔符\"\n\n#: cefuncproc.rsshift\nmsgctxt \"cefuncproc.rsshift\"\nmsgid \"Shift\"\nmsgstr \"Shift\"\n\n#: cefuncproc.rsspacebar\nmsgctxt \"cefuncproc.rsspacebar\"\nmsgid \"Space bar\"\nmsgstr \"空格键\"\n\n#: cefuncproc.rstab\nmsgctxt \"cefuncproc.rstab\"\nmsgid \"Tab\"\nmsgstr \"Tab\"\n\n#: cefuncproc.rsuparrow\nmsgctxt \"cefuncproc.rsuparrow\"\nmsgid \"Up Arrow\"\nmsgstr \"向上箭头\"\n\n#: changeoffsetunit.rsthisisnotanvalidvalue\nmsgctxt \"changeoffsetunit.rsthisisnotanvalidvalue\"\nmsgid \"This is not an valid value\"\nmsgstr \"这不是一个有效值\"\n\n#: customtypehandler.rsundefinederror\nmsgctxt \"customtypehandler.rsundefinederror\"\nmsgid \"Undefined error\"\nmsgstr \"未定义错误\"\n\n#: debuggertypedefinitions.rsbreak\nmsgctxt \"debuggertypedefinitions.rsbreak\"\nmsgid \"Break\"\nmsgstr \"中断\"\n\n#: debuggertypedefinitions.rsbreakandtrace\nmsgctxt \"debuggertypedefinitions.rsbreakandtrace\"\nmsgid \"Break and trace\"\nmsgstr \"中断和跟踪\"\n\n#: debuggertypedefinitions.rsdbvmbreakpoint\nmsgctxt \"debuggertypedefinitions.rsdbvmbreakpoint\"\nmsgid \"DBVM Breakpoint\"\nmsgstr \"DBVM 断点\"\n\n#: debuggertypedefinitions.rsexceptionbreakpoint\nmsgctxt \"debuggertypedefinitions.rsexceptionbreakpoint\"\nmsgid \"Exception Breakpoint\"\nmsgstr \"异常断点\"\n\n#: debuggertypedefinitions.rshardwarebreakpoint\nmsgctxt \"debuggertypedefinitions.rshardwarebreakpoint\"\nmsgid \"Hardware Breakpoint\"\nmsgstr \"硬件断点\"\n\n#: debuggertypedefinitions.rssoftwarebreakpoint\nmsgctxt \"debuggertypedefinitions.rssoftwarebreakpoint\"\nmsgid \"Software Breakpoint\"\nmsgstr \"软件断点\"\n\n#: debughelper.rsdebuggerattachtimeout\nmsgctxt \"debughelper.rsdebuggerattachtimeout\"\nmsgid \"Debugger attach timeout\"\nmsgstr \"调试器附加超时\"\n\n#: debughelper.rsno\nmsgctxt \"debughelper.rsno\"\nmsgid \"No\"\nmsgstr \"否\"\n\n#: debughelper.rsyes\nmsgctxt \"debughelper.rsyes\"\nmsgid \"Yes\"\nmsgstr \"是\"\n\n#: disassemblerviewunit.rsaddress\nmsgctxt \"disassemblerviewunit.rsaddress\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: disassemblerviewunit.rsbytes\nmsgctxt \"disassemblerviewunit.rsbytes\"\nmsgid \"Bytes\"\nmsgstr \"字节\"\n\n#: disassemblerviewunit.rscomment\nmsgctxt \"disassemblerviewunit.rscomment\"\nmsgid \"Comment\"\nmsgstr \"注释\"\n\n#: disassemblerviewunit.rscopy\nmsgctxt \"disassemblerviewunit.rscopy\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: dissectcodeunit.rsdone\nmsgctxt \"dissectcodeunit.rsdone\"\nmsgid \"done\"\nmsgstr \"完成\"\n\n#: dissectcodeunit.rsstart\nmsgctxt \"dissectcodeunit.rsstart\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: dissectcodeunit.rsstop\nmsgctxt \"dissectcodeunit.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: dotnettypes.rsdnt2byte\nmsgctxt \"dotnettypes.rsdnt2byte\"\nmsgid \"2 Byte\"\nmsgstr \"2 字节\"\n\n#: dotnettypes.rsdnt4byte\nmsgctxt \"dotnettypes.rsdnt4byte\"\nmsgid \"4 Byte\"\nmsgstr \"4 字节\"\n\n#: dotnettypes.rsdnt8byte\nmsgctxt \"dotnettypes.rsdnt8byte\"\nmsgid \"8 Byte\"\nmsgstr \"8 字节\"\n\n#: dotnettypes.rsdntbyte\nmsgctxt \"dotnettypes.rsdntbyte\"\nmsgid \"Byte\"\nmsgstr \"字节\"\n\n#: dotnettypes.rsdntdouble\nmsgctxt \"dotnettypes.rsdntdouble\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: dotnettypes.rsdntfloat\nmsgctxt \"dotnettypes.rsdntfloat\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: dotnettypes.rsdntpointer\nmsgctxt \"dotnettypes.rsdntpointer\"\nmsgid \"Pointer\"\nmsgstr \"指针\"\n\n#: dotnettypes.rsdntsigned\nmsgctxt \"dotnettypes.rsdntsigned\"\nmsgid \"Signed\"\nmsgstr \"有符号\"\n\n#: dotnettypes.rsdntstring\nmsgctxt \"dotnettypes.rsdntstring\"\nmsgid \"String\"\nmsgstr \"字符串\"\n\n#: driverlist.rsdlnothingfound\nmsgctxt \"driverlist.rsdlnothingfound\"\nmsgid \"nothing found\"\nmsgstr \"未找到任何内容\"\n\n#: feces.rsfailedcreatinghasalgorithmprovider\nmsgctxt \"feces.rsfailedcreatinghasalgorithmprovider\"\nmsgid \"Failed creating has algorithm provider\"\nmsgstr \"创建哈希算法提供程序失败\"\n\n#: feces.rsfailedcreatinghasalgorithmprovider2\nmsgctxt \"feces.rsfailedcreatinghasalgorithmprovider2\"\nmsgid \"Failed creating has algorithm provider\"\nmsgstr \"创建哈希算法提供程序失败\"\n\n#: formaddresschangeunit.rsacremoveoffset\nmsgctxt \"formaddresschangeunit.rsacremoveoffset\"\nmsgid \"Remove Offset\"\nmsgstr \"移除偏移量\"\n\n#: formaddtocodelist.rspleasefillinavalidfromaddress\nmsgctxt \"formaddtocodelist.rspleasefillinavalidfromaddress\"\nmsgid \"Please fill in a valid 'From' address\"\nmsgstr \"请填写有效的“从”地址\"\n\n#: formaddtocodelist.rspleasefillinavalidtoaddress\nmsgctxt \"formaddtocodelist.rspleasefillinavalidtoaddress\"\nmsgid \"Please fill in a valid 'To' address\"\nmsgstr \"请填写有效的“到”地址\"\n\n#: formaddtocodelist.rsregiontoadd\nmsgctxt \"formaddtocodelist.rsregiontoadd\"\nmsgid \"Region to add\"\nmsgstr \"要添加的区域\"\n\n#: formchangedaddresses.rsclose\nmsgctxt \"formchangedaddresses.rsclose\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: formchangedaddresses.rsfilter\nmsgctxt \"formchangedaddresses.rsfilter\"\nmsgid \"Filter\"\nmsgstr \"过滤\"\n\n#: formchangedaddresses.rsneedsiptfindwhat\nmsgctxt \"formchangedaddresses.rsneedsiptfindwhat\"\nmsgid \"\"\n\"The debugger did not collect any IPT data. This may be due to the Intel PT feature not being enabled in \"\n\"settings/malfunctioning, or that the option to also log the trace in \\\"find what...\\\" results was disabled. Do you wish \"\n\"to enable this for this debugging session? You will need to recollect this information again though.\\n\"\n\"(This is for this session only. If you wish to always turn it on from the start, go to settings->debugger options, and \"\n\"enable \\\"Use Intel-PT feature\\\" and the suboption for recording elements in \\\"find what ...\\\" routines)\"\nmsgstr \"\"\n\"调试器未收集任何 IPT 数据。这可能是由于 Intel PT 功能未在设置中启用/故障，或者未启用在“查找什么...”结果中记录跟踪的选项。你希望在此调试会话中启用此功能吗？不过你需要再次收集这些信息。\\n\"\n\"（这仅适用于此会话。如果你希望从一开始就始终启用此功能，请转到设置->调试器选项，并启用“使用 Intel-PT 功能”以及在“查找什么...”例程中记录元素的子选项）\"\n\n#: formchangedaddresses.rsnodescription\nmsgctxt \"formchangedaddresses.rsnodescription\"\nmsgid \"No Description\"\nmsgstr \"无描述\"\n\n#: formchangedaddresses.rsstop\nmsgctxt \"formchangedaddresses.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: formdesignerunit.rsformdesignercaption\nmsgctxt \"formdesignerunit.rsformdesignercaption\"\nmsgid \"Form Designer\"\nmsgstr \"表单设计器\"\n\n#: formfoundcodelistextraunit.rsneedsiptfindwhat\nmsgctxt \"formfoundcodelistextraunit.rsneedsiptfindwhat\"\nmsgid \"\"\n\"The debugger did not collect any IPT data. This may be due to the Intel PT feature not being enabled in \"\n\"settings/malfunctioning, or that the option to also log the trace in \\\"find what...\\\" results was disabled. Do you wish \"\n\"to enable this for this debugging session? You will need to recollect this information again though.\\n\"\n\"(This is for this session only. If you wish to always turn it on from the start, go to settings->debugger options, and \"\n\"enable \\\"Use Intel-PT feature\\\" and the suboption for recording elements in \\\"find what ...\\\" routines)\"\nmsgstr \"\"\n\"调试器未收集任何 IPT 数据。这可能是由于 Intel PT 功能未在设置中启用/故障，或者未启用在“查找什么...”结果中记录跟踪的选项。你希望在此调试会话中启用此功能吗？不过你需要再次收集这些信息。\\n\"\n\"（这仅适用于此会话。如果你希望从一开始就始终启用此功能，请转到设置->调试器选项，并启用“使用 Intel-PT 功能”以及在“查找什么...”例程中记录元素的子选项）\"\n\n#: formhotkeyunit.rsalt\nmsgctxt \"formhotkeyunit.rsalt\"\nmsgid \"Alt\"\nmsgstr \"Alt\"\n\n#: formhotkeyunit.rsapplicationskey\nmsgctxt \"formhotkeyunit.rsapplicationskey\"\nmsgid \"Applications key\"\nmsgstr \"应用程序键\"\n\n#: formhotkeyunit.rsbackspace\nmsgctxt \"formhotkeyunit.rsbackspace\"\nmsgid \"Backspace\"\nmsgstr \"退格键\"\n\n#: formhotkeyunit.rscapslock\nmsgctxt \"formhotkeyunit.rscapslock\"\nmsgid \"Caps Lock\"\nmsgstr \"大写锁定\"\n\n#: formhotkeyunit.rsclear\nmsgctxt \"formhotkeyunit.rsclear\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: formhotkeyunit.rsctrl\nmsgctxt \"formhotkeyunit.rsctrl\"\nmsgid \"Ctrl\"\nmsgstr \"Ctrl\"\n\n#: formhotkeyunit.rsdelete\nmsgctxt \"formhotkeyunit.rsdelete\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: formhotkeyunit.rsdownarrow\nmsgctxt \"formhotkeyunit.rsdownarrow\"\nmsgid \"Down Arrow\"\nmsgstr \"向下箭头\"\n\n#: formhotkeyunit.rsend\nmsgctxt \"formhotkeyunit.rsend\"\nmsgid \"End\"\nmsgstr \"结束\"\n\n#: formhotkeyunit.rsenter\nmsgctxt \"formhotkeyunit.rsenter\"\nmsgid \"Enter\"\nmsgstr \"回车\"\n\n#: formhotkeyunit.rsesc\nmsgctxt \"formhotkeyunit.rsesc\"\nmsgid \"Esc\"\nmsgstr \"Esc\"\n\n#: formhotkeyunit.rsexecute\nmsgctxt \"formhotkeyunit.rsexecute\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: formhotkeyunit.rshelp\nmsgctxt \"formhotkeyunit.rshelp\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#: formhotkeyunit.rshome\nmsgctxt \"formhotkeyunit.rshome\"\nmsgid \"Home\"\nmsgstr \"主页\"\n\n#: formhotkeyunit.rsinsert\nmsgctxt \"formhotkeyunit.rsinsert\"\nmsgid \"Insert\"\nmsgstr \"插入\"\n\n#: formhotkeyunit.rsleftarrow\nmsgctxt \"formhotkeyunit.rsleftarrow\"\nmsgid \"Left Arrow\"\nmsgstr \"向左箭头\"\n\n#: formhotkeyunit.rsleftwindowskey\nmsgctxt \"formhotkeyunit.rsleftwindowskey\"\nmsgid \"Left Windows key\"\nmsgstr \"左 Windows 键\"\n\n#: formhotkeyunit.rsnumeric\nmsgctxt \"formhotkeyunit.rsnumeric\"\nmsgid \"numeric\"\nmsgstr \"数字键\"\n\n#: formhotkeyunit.rsnumlock\nmsgctxt \"formhotkeyunit.rsnumlock\"\nmsgid \"Num Lock\"\nmsgstr \"数字锁定\"\n\n#: formhotkeyunit.rspagedown\nmsgctxt \"formhotkeyunit.rspagedown\"\nmsgid \"Page Down\"\nmsgstr \"向下翻页\"\n\n#: formhotkeyunit.rspageup\nmsgctxt \"formhotkeyunit.rspageup\"\nmsgid \"Page Up\"\nmsgstr \"向上翻页\"\n\n#: formhotkeyunit.rspause\nmsgctxt \"formhotkeyunit.rspause\"\nmsgid \"Pause\"\nmsgstr \"暂停\"\n\n#: formhotkeyunit.rsprint\nmsgctxt \"formhotkeyunit.rsprint\"\nmsgid \"Print\"\nmsgstr \"打印\"\n\n#: formhotkeyunit.rsprintscreen\nmsgctxt \"formhotkeyunit.rsprintscreen\"\nmsgid \"Print Screen\"\nmsgstr \"打印屏幕\"\n\n#: formhotkeyunit.rsrightarrow\nmsgctxt \"formhotkeyunit.rsrightarrow\"\nmsgid \"Right Arrow\"\nmsgstr \"向右箭头\"\n\n#: formhotkeyunit.rsrightwindowskey\nmsgctxt \"formhotkeyunit.rsrightwindowskey\"\nmsgid \"Right Windows key\"\nmsgstr \"右 Windows 键\"\n\n#: formhotkeyunit.rsscrolllock\nmsgctxt \"formhotkeyunit.rsscrolllock\"\nmsgid \"Scroll Lock\"\nmsgstr \"滚动锁定\"\n\n#: formhotkeyunit.rsselect\nmsgctxt \"formhotkeyunit.rsselect\"\nmsgid \"Select\"\nmsgstr \"选择\"\n\n#: formhotkeyunit.rsseparator\nmsgctxt \"formhotkeyunit.rsseparator\"\nmsgid \"Separator\"\nmsgstr \"分隔符\"\n\n#: formhotkeyunit.rsshift\nmsgctxt \"formhotkeyunit.rsshift\"\nmsgid \"Shift\"\nmsgstr \"Shift\"\n\n#: formhotkeyunit.rsspacebar\nmsgctxt \"formhotkeyunit.rsspacebar\"\nmsgid \"Space bar\"\nmsgstr \"空格键\"\n\n#: formhotkeyunit.rstab\nmsgctxt \"formhotkeyunit.rstab\"\nmsgid \"Tab\"\nmsgstr \"制表符\"\n\n#: formhotkeyunit.rsuparrow\nmsgctxt \"formhotkeyunit.rsuparrow\"\nmsgid \"Up Arrow\"\nmsgstr \"向上箭头\"\n\n#: formmemoryregionsunit.rsdone\nmsgctxt \"formmemoryregionsunit.rsdone\"\nmsgid \"done\"\nmsgstr \"完成\"\n\n#: formmemoryregionsunit.rsexecute\nmsgctxt \"formmemoryregionsunit.rsexecute\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: formmemoryregionsunit.rsimage\nmsgctxt \"formmemoryregionsunit.rsimage\"\nmsgid \"Image\"\nmsgstr \"图像\"\n\n#: formmemoryregionsunit.rsmemoryregions\nmsgctxt \"formmemoryregionsunit.rsmemoryregions\"\nmsgid \"Memory regions\"\nmsgstr \"内存区域\"\n\n#: formmemoryregionsunit.rsnoaccess\nmsgctxt \"formmemoryregionsunit.rsnoaccess\"\nmsgid \"No Access\"\nmsgstr \"无访问权限\"\n\n#: formmemoryregionsunit.rsread\nmsgctxt \"formmemoryregionsunit.rsread\"\nmsgid \"Read\"\nmsgstr \"读取\"\n\n#: formmemoryregionsunit.rswritecombine\nmsgctxt \"formmemoryregionsunit.rswritecombine\"\nmsgid \"Write Combine\"\nmsgstr \"写入合并\"\n\n#: formmemoryregionsunit.rswritecopy\nmsgctxt \"formmemoryregionsunit.rswritecopy\"\nmsgid \"Write Copy\"\nmsgstr \"写入复制\"\n\n#: formsettingsunit.rs2bytes\nmsgctxt \"formsettingsunit.rs2bytes\"\nmsgid \"2 Bytes\"\nmsgstr \"2 字节\"\n\n#: formsettingsunit.rs4bytes\nmsgctxt \"formsettingsunit.rs4bytes\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: formsettingsunit.rs8bytes\nmsgctxt \"formsettingsunit.rs8bytes\"\nmsgid \"8 Bytes\"\nmsgstr \"8 字节\"\n\n#: formsettingsunit.rsallcustomtypes\nmsgctxt \"formsettingsunit.rsallcustomtypes\"\nmsgid \"All Custom Types\"\nmsgstr \"所有自定义类型\"\n\n#: formsettingsunit.rsarrayofbyte\nmsgctxt \"formsettingsunit.rsarrayofbyte\"\nmsgid \"Array of byte\"\nmsgstr \"字节数组\"\n\n#: formsettingsunit.rsbinary\nmsgctxt \"formsettingsunit.rsbinary\"\nmsgid \"Binary\"\nmsgstr \"二进制\"\n\n#: formsettingsunit.rsbyte\nmsgctxt \"formsettingsunit.rsbyte\"\nmsgid \"Byte\"\nmsgstr \"字节\"\n\n#: formsettingsunit.rsdebuggeroptions\nmsgctxt \"formsettingsunit.rsdebuggeroptions\"\nmsgid \"Debugger Options\"\nmsgstr \"调试器选项\"\n\n#: formsettingsunit.rsdouble\nmsgctxt \"formsettingsunit.rsdouble\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: formsettingsunit.rsextra\nmsgctxt \"formsettingsunit.rsextra\"\nmsgid \"Extra\"\nmsgstr \"额外\"\n\n#: formsettingsunit.rsfloat\nmsgctxt \"formsettingsunit.rsfloat\"\nmsgid \"Float\"\nmsgstr \"浮点\"\n\n#: formsettingsunit.rsgeneralsettings\nmsgctxt \"formsettingsunit.rsgeneralsettings\"\nmsgid \"General Settings\"\nmsgstr \"常规设置\"\n\n#: formsettingsunit.rshigher\nmsgctxt \"formsettingsunit.rshigher\"\nmsgid \"Higher\"\nmsgstr \"更高\"\n\n#: formsettingsunit.rshighest\nmsgctxt \"formsettingsunit.rshighest\"\nmsgid \"Highest\"\nmsgstr \"最高\"\n\n#: formsettingsunit.rshotkeys\nmsgctxt \"formsettingsunit.rshotkeys\"\nmsgid \"Hotkeys\"\nmsgstr \"热键\"\n\n#: formsettingsunit.rsidle\nmsgctxt \"formsettingsunit.rsidle\"\nmsgid \"Idle\"\nmsgstr \"空闲\"\n\n#: formsettingsunit.rslanguages\nmsgctxt \"formsettingsunit.rslanguages\"\nmsgid \"Languages\"\nmsgstr \"语言\"\n\n#: formsettingsunit.rslower\nmsgctxt \"formsettingsunit.rslower\"\nmsgid \"Lower\"\nmsgstr \"较低\"\n\n#: formsettingsunit.rslowest\nmsgctxt \"formsettingsunit.rslowest\"\nmsgid \"Lowest\"\nmsgstr \"最低\"\n\n#: formsettingsunit.rsluaoptions\nmsgctxt \"formsettingsunit.rsluaoptions\"\nmsgid \"Lua\"\nmsgstr \"Lua\"\n\n#: formsettingsunit.rsnextscan\nmsgctxt \"formsettingsunit.rsnextscan\"\nmsgid \"Next Scan\"\nmsgstr \"下一个扫描\"\n\n#: formsettingsunit.rsnormal\nmsgctxt \"formsettingsunit.rsnormal\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: formsettingsunit.rsplugins\nmsgctxt \"formsettingsunit.rsplugins\"\nmsgid \"Plugins\"\nmsgstr \"插件\"\n\n#: formsettingsunit.rsscansettings\nmsgctxt \"formsettingsunit.rsscansettings\"\nmsgid \"Scan Settings\"\nmsgstr \"扫描设置\"\n\n#: formsettingsunit.rssymbols\nmsgctxt \"formsettingsunit.rssymbols\"\nmsgid \"Symbols\"\nmsgstr \"符号\"\n\n#: formsettingsunit.rstext\nmsgctxt \"formsettingsunit.rstext\"\nmsgid \"Text\"\nmsgstr \"文本\"\n\n#: formsettingsunit.rstimecritical\nmsgctxt \"formsettingsunit.rstimecritical\"\nmsgid \"TimeCritical\"\nmsgstr \"时间关键\"\n\n#: formsettingsunit.rstools\nmsgctxt \"formsettingsunit.rstools\"\nmsgid \"Tools\"\nmsgstr \"工具\"\n\n#: formsettingsunit.rsunrandomizer\nmsgctxt \"formsettingsunit.rsunrandomizer\"\nmsgid \"Unrandomizer\"\nmsgstr \"去随机化\"\n\n#: foundcodeunit.strclose\nmsgctxt \"foundcodeunit.strclose\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: foundlisthelper.rserror\nmsgctxt \"foundlisthelper.rserror\"\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: foundlisthelper.rsundefinederror\nmsgctxt \"foundlisthelper.rsundefinederror\"\nmsgid \"Undefined error\"\nmsgstr \"未定义错误\"\n\n#: frmautoinjectunit.rs14bytejmp\nmsgctxt \"frmautoinjectunit.rs14bytejmp\"\nmsgid \"14 Byte JMP (>2GB Distance)\"\nmsgstr \"14 字节 JMP (>2GB 距离)\"\n\n#: frmautoinjectunit.rs5bytejmp\nmsgctxt \"frmautoinjectunit.rs5bytejmp\"\nmsgid \"5 Byte JMP (<2GB Distance)\"\nmsgstr \"5 字节 JMP (<2GB 距离)\"\n\n#: frmbranchmapperunit.rssaveresultstofile\nmsgctxt \"frmbranchmapperunit.rssaveresultstofile\"\nmsgid \"Save results to file\"\nmsgstr \"将结果保存到文件\"\n\n#: frmbranchmapperunit.rsstop\nmsgctxt \"frmbranchmapperunit.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: frmchangedaddressescommonalityscannerunit.rsbaseaddress\nmsgctxt \"frmchangedaddressescommonalityscannerunit.rsbaseaddress\"\nmsgid \"Base Address\"\nmsgstr \"基地址\"\n\n#: frmcodefilterunit.rscodefilter\nmsgctxt \"frmcodefilterunit.rscodefilter\"\nmsgid \"Code Filter\"\nmsgstr \"代码过滤器\"\n\n#: frmcodefilterunit.rsno\nmsgctxt \"frmcodefilterunit.rsno\"\nmsgid \"No\"\nmsgstr \"否\"\n\n#: frmcodefilterunit.rsshowrefreshlist\nmsgctxt \"frmcodefilterunit.rsshowrefreshlist\"\nmsgid \"Refresh list\"\nmsgstr \"刷新列表\"\n\n#: frmcodefilterunit.rsyes\nmsgctxt \"frmcodefilterunit.rsyes\"\nmsgid \"Yes\"\nmsgstr \"是\"\n\n#: frmdisassemblyscanunit.rsdone\nmsgctxt \"frmdisassemblyscanunit.rsdone\"\nmsgid \"Done\"\nmsgstr \"完成\"\n\n#: frmdisassemblyscanunit.rsdsclose\nmsgctxt \"frmdisassemblyscanunit.rsdsclose\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: frmdissectwindowunit.rsdissectwindows\nmsgctxt \"frmdissectwindowunit.rsdissectwindows\"\nmsgid \"Dissect Windows\"\nmsgstr \"剖析窗口\"\n\n#: frmenumeratedllsunit.rsnothingfound\nmsgctxt \"frmenumeratedllsunit.rsnothingfound\"\nmsgid \"nothing found\"\nmsgstr \"未找到任何内容\"\n\n#: frmexetrainergeneratorunit.rsdefault\nmsgctxt \"frmexetrainergeneratorunit.rsdefault\"\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: frmexetrainergeneratorunit.rsgenerate\nmsgctxt \"frmexetrainergeneratorunit.rsgenerate\"\nmsgid \"Generate\"\nmsgstr \"生成\"\n\n#: frmexetrainergeneratorunit.rsmax\nmsgctxt \"frmexetrainergeneratorunit.rsmax\"\nmsgid \"Max\"\nmsgstr \"最大\"\n\n#: frmexetrainergeneratorunit.rsnone\nmsgctxt \"frmexetrainergeneratorunit.rsnone\"\nmsgid \"None\"\nmsgstr \"无\"\n\n#: frmexetrainergeneratorunit.rssaving\nmsgctxt \"frmexetrainergeneratorunit.rssaving\"\nmsgid \"Saving...\"\nmsgstr \"保存中...\"\n\n#: frmfillmemoryunit.rspleasefillinavalidfromaddress\nmsgctxt \"frmfillmemoryunit.rspleasefillinavalidfromaddress\"\nmsgid \"Please fill in a valid 'From' address\"\nmsgstr \"请填写有效的“从”地址\"\n\n#: frmfillmemoryunit.rspleasefillinavalidtoaddress\nmsgctxt \"frmfillmemoryunit.rspleasefillinavalidtoaddress\"\nmsgid \"Please fill in a valid 'To' address\"\nmsgstr \"请填写有效的“到”地址\"\n\n#: frmfindstaticsunit.strscan\nmsgctxt \"frmfindstaticsunit.strscan\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: frmfindstaticsunit.strstop\nmsgctxt \"frmfindstaticsunit.strstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: frmfindstaticsunit.strstopping\nmsgctxt \"frmfindstaticsunit.strstopping\"\nmsgid \"Stopping...\"\nmsgstr \"正在停止...\"\n\n#: frmgroupscanalgoritmgeneratorunit.rsadd\nmsgctxt \"frmgroupscanalgoritmgeneratorunit.rsadd\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: frmluaengineunit.rsleundefinederror\nmsgctxt \"frmluaengineunit.rsleundefinederror\"\nmsgid \"Undefined error\"\nmsgstr \"未定义错误\"\n\n#: frmluaengineunit.rsluaengine\nmsgctxt \"frmluaengineunit.rsluaengine\"\nmsgid \"Lua Engine\"\nmsgstr \"Lua 引擎\"\n\n#: frmmemviewpreferencesunit.rsbackgroundcolor\nmsgctxt \"frmmemviewpreferencesunit.rsbackgroundcolor\"\nmsgid \"Background color\"\nmsgstr \"背景颜色\"\n\n#: frmmemviewpreferencesunit.rscallcolor\nmsgctxt \"frmmemviewpreferencesunit.rscallcolor\"\nmsgid \"Call color\"\nmsgstr \"调用颜色\"\n\n#: frmmemviewpreferencesunit.rsconditionaljumpcolor\nmsgctxt \"frmmemviewpreferencesunit.rsconditionaljumpcolor\"\nmsgid \"Conditional jump color\"\nmsgstr \"条件跳转颜色\"\n\n#: frmmemviewpreferencesunit.rsdcbreakpoint\nmsgctxt \"frmmemviewpreferencesunit.rsdcbreakpoint\"\nmsgid \"Breakpoint\"\nmsgstr \"断点\"\n\n#: frmmemviewpreferencesunit.rsdchighlighted\nmsgctxt \"frmmemviewpreferencesunit.rsdchighlighted\"\nmsgid \"Highlighted\"\nmsgstr \"高亮\"\n\n#: frmmemviewpreferencesunit.rsdcnormal\nmsgctxt \"frmmemviewpreferencesunit.rsdcnormal\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: frmmemviewpreferencesunit.rshexadecimalcolor\nmsgctxt \"frmmemviewpreferencesunit.rshexadecimalcolor\"\nmsgid \"Hexadecimal color\"\nmsgstr \"十六进制颜色\"\n\n#: frmmemviewpreferencesunit.rsregistercolor\nmsgctxt \"frmmemviewpreferencesunit.rsregistercolor\"\nmsgid \"Register color\"\nmsgstr \"寄存器颜色\"\n\n#: frmmemviewpreferencesunit.rssymbolcolor\nmsgctxt \"frmmemviewpreferencesunit.rssymbolcolor\"\nmsgid \"Symbol color\"\nmsgstr \"符号颜色\"\n\n#: frmmemviewpreferencesunit.rsunconditionaljumpcolor\nmsgctxt \"frmmemviewpreferencesunit.rsunconditionaljumpcolor\"\nmsgid \"Unconditional jump color\"\nmsgstr \"无条件跳转颜色\"\n\n#: frmpointerrescanconnectdialogunit.rscouldnotberesolved\nmsgctxt \"frmpointerrescanconnectdialogunit.rscouldnotberesolved\"\nmsgid \" could not be resolved\"\nmsgstr \"无法解析\"\n\n#: frmpointerrescanconnectdialogunit.rshost\nmsgctxt \"frmpointerrescanconnectdialogunit.rshost\"\nmsgid \"host:\"\nmsgstr \"主机：\"\n\n#: frmprocesswatcherunit.rsfirstselectaprocess\nmsgctxt \"frmprocesswatcherunit.rsfirstselectaprocess\"\nmsgid \"First select a process!\"\nmsgstr \"请先选择一个进程！\"\n\n#: frmprocesswatcherunit.rsisntavalidprocessid\n#, object-pascal-format\nmsgctxt \"frmprocesswatcherunit.rsisntavalidprocessid\"\nmsgid \"%s isn't a valid processID\"\nmsgstr \"%s 不是有效的进程 ID\"\n\n#: frmregistersunit.rsnodescription\nmsgctxt \"frmregistersunit.rsnodescription\"\nmsgid \"No Description\"\nmsgstr \"没有描述\"\n\n#: frmrescanpointerunit.rsadd\nmsgctxt \"frmrescanpointerunit.rsadd\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: frmrescanpointerunit.rsremove\nmsgctxt \"frmrescanpointerunit.rsremove\"\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#: frmrescanpointerunit.rsrpentertheipaddressestonotifyexplicitly\nmsgctxt \"frmrescanpointerunit.rsrpentertheipaddressestonotifyexplicitly\"\nmsgid \"Enter the IP addresses to notify explicitly\"\nmsgstr \"请输入要明确通知的 IP 地址\"\n\n#: frmrescanpointerunit.rsrpiplist\nmsgctxt \"frmrescanpointerunit.rsrpiplist\"\nmsgid \"IP List\"\nmsgstr \"IP 列表\"\n\n#: frmrescanpointerunit.rsrplastoffset\nmsgctxt \"frmrescanpointerunit.rsrplastoffset\"\nmsgid \"Last offset\"\nmsgstr \"最后偏移量\"\n\n#: frmrescanpointerunit.rsrpusesavedpointermap2\nmsgctxt \"frmrescanpointerunit.rsrpusesavedpointermap2\"\nmsgid \"Use saved pointermap\"\nmsgstr \"使用保存的指针映射\"\n\n#: frmresumepointerscanunit.rsrpsentertheipaddressestonotifyexplicitly\nmsgctxt \"frmresumepointerscanunit.rsrpsentertheipaddressestonotifyexplicitly\"\nmsgid \"Enter the IP addresses to notify explicitly\"\nmsgstr \"请输入要明确通知的 IP 地址\"\n\n#: frmresumepointerscanunit.rsrpsiplist\nmsgctxt \"frmresumepointerscanunit.rsrpsiplist\"\nmsgid \"IP List\"\nmsgstr \"IP 列表\"\n\n#: frmsavememoryregionunit.rsisnotavalidaddress\n#, object-pascal-format\nmsgctxt \"frmsavememoryregionunit.rsisnotavalidaddress\"\nmsgid \"%s is not a valid address\"\nmsgstr \"%s 不是有效的地址\"\n\n#: frmsnapshothandlerunit.rsshcompare\nmsgctxt \"frmsnapshothandlerunit.rsshcompare\"\nmsgid \"Compare\"\nmsgstr \"比较\"\n\n#: frmsnapshothandlerunit.rsshlockandaddtostructuredissect\nmsgctxt \"frmsnapshothandlerunit.rsshlockandaddtostructuredissect\"\nmsgid \"Lock and add to structure dissect\"\nmsgstr \"锁定并添加到结构解析\"\n\n#: frmsnapshothandlerunit.rsshnewwindow\nmsgctxt \"frmsnapshothandlerunit.rsshnewwindow\"\nmsgid \"<New window>\"\nmsgstr \"<新窗口>\"\n\n#: frmsnapshothandlerunit.rsshselectthestructuredissectwindowyouwishtoaddthisregionto\nmsgctxt \"frmsnapshothandlerunit.rsshselectthestructuredissectwindowyouwishtoaddthisregionto\"\nmsgid \"Select the structure dissect window you wish to add this region to\"\nmsgstr \"选择你希望将此区域添加到的结构解析窗口\"\n\n#: frmsnapshothandlerunit.rsshthestructureslistisbroken\nmsgctxt \"frmsnapshothandlerunit.rsshthestructureslistisbroken\"\nmsgid \"The structures list is broken\"\nmsgstr \"结构列表已损坏\"\n\n#: frmsnapshothandlerunit.rsshview\nmsgctxt \"frmsnapshothandlerunit.rsshview\"\nmsgid \"View\"\nmsgstr \"查看\"\n\n#: frmstackviewunit.rslockandaddtostructuredissect\nmsgctxt \"frmstackviewunit.rslockandaddtostructuredissect\"\nmsgid \"Lock and add to structure dissect\"\nmsgstr \"锁定并添加到结构解析\"\n\n#: frmstackviewunit.rsnewwindow\nmsgctxt \"frmstackviewunit.rsnewwindow\"\nmsgid \"<New window>\"\nmsgstr \"<新窗口>\"\n\n#: frmstackviewunit.rsselectthestructuredissectwindowyouwishtoaddthisreg\nmsgctxt \"frmstackviewunit.rsselectthestructuredissectwindowyouwishtoaddthisreg\"\nmsgid \"Select the structure dissect window you wish to add this region to\"\nmsgstr \"选择你希望将此区域添加到的结构解析窗口\"\n\n#: frmstackviewunit.rsthestructureslistisbroken\nmsgctxt \"frmstackviewunit.rsthestructureslistisbroken\"\nmsgid \"The structures list is broken\"\nmsgstr \"结构列表已损坏\"\n\n#: frmstringmapunit.rsnoreadablememoryfound\nmsgctxt \"frmstringmapunit.rsnoreadablememoryfound\"\nmsgid \"No readable memory found\"\nmsgstr \"未找到可读内存\"\n\n#: frmstringmapunit.rsstop\nmsgctxt \"frmstringmapunit.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: frmstringpointerscanunit.rsareyousureyo\nmsgctxt \"frmstringpointerscanunit.rsareyousureyo\"\nmsgid \"Are you sure you wish to start a new scan?\"\nmsgstr \"你确定要开始新的扫描吗？\"\n\n#: frmstringpointerscanunit.rsgeneratedscanning\nmsgctxt \"frmstringpointerscanunit.rsgeneratedscanning\"\nmsgid \"Generated. Scanning...\"\nmsgstr \"生成中。扫描中...\"\n\n#: frmstringpointerscanunit.rsgeneratingstringmap\nmsgctxt \"frmstringpointerscanunit.rsgeneratingstringmap\"\nmsgid \"Generating stringmap\"\nmsgstr \"生成字符串映射\"\n\n#: frmstringpointerscanunit.rsscan\nmsgctxt \"frmstringpointerscanunit.rsscan\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: frmstringpointerscanunit.rsscanningfoun\n#, object-pascal-format\nmsgctxt \"frmstringpointerscanunit.rsscanningfoun\"\nmsgid \"Scanning... Found %s\"\nmsgstr \"扫描中... 找到 %s\"\n\n#: frmstringpointerscanunit.rsspsuaddress\nmsgctxt \"frmstringpointerscanunit.rsspsuaddress\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: frmstringpointerscanunit.rsspsuaddress2\nmsgctxt \"frmstringpointerscanunit.rsspsuaddress2\"\nmsgid \"Address 2\"\nmsgstr \"地址 2\"\n\n#: frmstringpointerscanunit.rsspsuerrorduringscannoscanresults\nmsgctxt \"frmstringpointerscanunit.rsspsuerrorduringscannoscanresults\"\nmsgid \"Error during scan. No scanresults available\"\nmsgstr \"扫描期间出错。没有可用的扫描结果\"\n\n#: frmstringpointerscanunit.rsspsuexception\nmsgctxt \"frmstringpointerscanunit.rsspsuexception\"\nmsgid \"Exception:\"\nmsgstr \"异常：\"\n\n#: frmstringpointerscanunit.rsspsufound\nmsgctxt \"frmstringpointerscanunit.rsspsufound\"\nmsgid \"Found:\"\nmsgstr \"找到：\"\n\n#: frmstringpointerscanunit.rsspsufuuuu\nmsgctxt \"frmstringpointerscanunit.rsspsufuuuu\"\nmsgid \"FUUUU\"\nmsgstr \"FUUUU\"\n\n#: frmstringpointerscanunit.rsspsufuuuuu\nmsgctxt \"frmstringpointerscanunit.rsspsufuuuuu\"\nmsgid \"FUUUUU\"\nmsgstr \"FUUUUU\"\n\n#: frmstringpointerscanunit.rsspsunotyetimplemented\nmsgctxt \"frmstringpointerscanunit.rsspsunotyetimplemented\"\nmsgid \"Not yet implemented\"\nmsgstr \"尚未实现\"\n\n#: frmstringpointerscanunit.rsspsuoffset\nmsgctxt \"frmstringpointerscanunit.rsspsuoffset\"\nmsgid \"Offset \"\nmsgstr \"偏移量 \"\n\n#: frmstringpointerscanunit.rsspsurescan\nmsgctxt \"frmstringpointerscanunit.rsspsurescan\"\nmsgid \"Rescan\"\nmsgstr \"重新扫描\"\n\n#: frmstringpointerscanunit.rsspsuscandonefound\nmsgctxt \"frmstringpointerscanunit.rsspsuscandonefound\"\nmsgid \"Scan done! Found \"\nmsgstr \"扫描完成！找到 \"\n\n#: frmstringpointerscanunit.rsstop\nmsgctxt \"frmstringpointerscanunit.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: frmstringpointerscanunit.rsterminating\nmsgctxt \"frmstringpointerscanunit.rsterminating\"\nmsgid \"Terminating...\"\nmsgstr \"正在终止...\"\n\n#: frmstringpointerscanunit.rsthisaddressisnotaccessible\nmsgctxt \"frmstringpointerscanunit.rsthisaddressisnotaccessible\"\nmsgid \"This address is not accessible\"\nmsgstr \"此地址不可访问\"\n\n#: frmstructurecompareunit.rsareyousureyo\nmsgctxt \"frmstructurecompareunit.rsareyousureyo\"\nmsgid \"Are you sure you wish to start a new scan?\"\nmsgstr \"你确定要开始新的扫描吗？\"\n\n#: frmstructurecompareunit.rsgeneratedscanning\nmsgctxt \"frmstructurecompareunit.rsgeneratedscanning\"\nmsgid \"Generated. Scanning...\"\nmsgstr \"生成中。扫描中...\"\n\n#: frmstructurecompareunit.rsgeneratingstringmap\nmsgctxt \"frmstructurecompareunit.rsgeneratingstringmap\"\nmsgid \"Generating stringmap\"\nmsgstr \"生成字符串映射\"\n\n#: frmstructurecompareunit.rsscan\nmsgctxt \"frmstructurecompareunit.rsscan\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: frmstructurecompareunit.rsscanningfoun\n#, object-pascal-format\nmsgctxt \"frmstructurecompareunit.rsscanningfoun\"\nmsgid \"Scanning... Found %s\"\nmsgstr \"扫描中... 找到 %s\"\n\n#: frmstructurecompareunit.rsspslock\nmsgctxt \"frmstructurecompareunit.rsspslock\"\nmsgid \"Lock\"\nmsgstr \"锁定\"\n\n#: frmstructurecompareunit.rsspsuaddress\nmsgctxt \"frmstructurecompareunit.rsspsuaddress\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: frmstructurecompareunit.rsspsuaddress2\nmsgctxt \"frmstructurecompareunit.rsspsuaddress2\"\nmsgid \"Address 2\"\nmsgstr \"地址 2\"\n\n#: frmstructurecompareunit.rsspsuerrorduringscannoscanresults\nmsgctxt \"frmstructurecompareunit.rsspsuerrorduringscannoscanresults\"\nmsgid \"Error during scan. No scanresults available\"\nmsgstr \"扫描期间出错。没有可用的扫描结果\"\n\n#: frmstructurecompareunit.rsspsuexception\nmsgctxt \"frmstructurecompareunit.rsspsuexception\"\nmsgid \"Exception:\"\nmsgstr \"异常：\"\n\n#: frmstructurecompareunit.rsspsufound\nmsgctxt \"frmstructurecompareunit.rsspsufound\"\nmsgid \"Found:\"\nmsgstr \"找到：\"\n\n#: frmstructurecompareunit.rsspsufuuuu\nmsgctxt \"frmstructurecompareunit.rsspsufuuuu\"\nmsgid \"FUUUU\"\nmsgstr \"FUUUU\"\n\n#: frmstructurecompareunit.rsspsufuuuuu\nmsgctxt \"frmstructurecompareunit.rsspsufuuuuu\"\nmsgid \"FUUUUU\"\nmsgstr \"FUUUUU\"\n\n#: frmstructurecompareunit.rsspsunotyetimplemented\nmsgctxt \"frmstructurecompareunit.rsspsunotyetimplemented\"\nmsgid \"Not yet implemented\"\nmsgstr \"尚未实现\"\n\n#: frmstructurecompareunit.rsspsuoffset\nmsgctxt \"frmstructurecompareunit.rsspsuoffset\"\nmsgid \"Offset \"\nmsgstr \"偏移量 \"\n\n#: frmstructurecompareunit.rsspsurescan\nmsgctxt \"frmstructurecompareunit.rsspsurescan\"\nmsgid \"Rescan\"\nmsgstr \"重新扫描\"\n\n#: frmstructurecompareunit.rsspsuscandonefound\nmsgctxt \"frmstructurecompareunit.rsspsuscandonefound\"\nmsgid \"Scan done! Found \"\nmsgstr \"扫描完成！找到 \"\n\n#: frmstructurecompareunit.rsstop\nmsgctxt \"frmstructurecompareunit.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: frmstructurecompareunit.rsstructurecompare\nmsgctxt \"frmstructurecompareunit.rsstructurecompare\"\nmsgid \"Structure Compare\"\nmsgstr \"结构比较\"\n\n#: frmstructurecompareunit.rsterminating\nmsgctxt \"frmstructurecompareunit.rsterminating\"\nmsgid \"Terminating...\"\nmsgstr \"正在终止...\"\n\n#: frmstructurecompareunit.rsthisaddressisnotaccessible\nmsgctxt \"frmstructurecompareunit.rsthisaddressisnotaccessible\"\nmsgid \"This address is not accessible\"\nmsgstr \"此地址不可访问\"\n\n#: frmstructurelinkerunit.strisnotavalidaddress\n#, object-pascal-format\nmsgctxt \"frmstructurelinkerunit.strisnotavalidaddress\"\nmsgid \"%s is not a valid address\"\nmsgstr \"%s 不是有效地址\"\n\n#: frmstructures2elementinfounit.rsundefined\nmsgctxt \"frmstructures2elementinfounit.rsundefined\"\nmsgid \"Undefined\"\nmsgstr \"未定义\"\n\n#: frmstructuresconfigunit.rshighlighted\nmsgctxt \"frmstructuresconfigunit.rshighlighted\"\nmsgid \"Highlighted\"\nmsgstr \"高亮\"\n\n#: frmstructuresconfigunit.rsnormal\nmsgctxt \"frmstructuresconfigunit.rsnormal\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: frmstructuresnewstructureunit.rssize\nmsgctxt \"frmstructuresnewstructureunit.rssize\"\nmsgid \"Size:\"\nmsgstr \"大小：\"\n\n#: frmthreadlistunit.rstlchangevalue\nmsgctxt \"frmthreadlistunit.rstlchangevalue\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: frmthreadlistunit.rstlexecute\nmsgctxt \"frmthreadlistunit.rstlexecute\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: frmtracerunit.rssearch\nmsgctxt \"frmtracerunit.rssearch\"\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: frmtracerunit.rstracer\nmsgctxt \"frmtracerunit.rstracer\"\nmsgid \"Tracer\"\nmsgstr \"跟踪器\"\n\n#: frmultimap2unit.rsinstructionpointerlistsize\nmsgctxt \"frmultimap2unit.rsinstructionpointerlistsize\"\nmsgid \"Instruction Pointer List Size:\"\nmsgstr \"指令指针列表大小：\"\n\n#: frmultimap2unit.rspaused\nmsgctxt \"frmultimap2unit.rspaused\"\nmsgid \"Paused\"\nmsgstr \"已暂停\"\n\n#: frmultimap2unit.rsthread\nmsgctxt \"frmultimap2unit.rsthread\"\nmsgid \"Thread\"\nmsgstr \"线程\"\n\n#: frmultimapunit.rsuupause\nmsgctxt \"frmultimapunit.rsuupause\"\nmsgid \"Pause\"\nmsgstr \"暂停\"\n\n#: gnuassembler.rscouldnotbefound\nmsgctxt \"gnuassembler.rscouldnotbefound\"\nmsgid \" could not be found\"\nmsgstr \" 找不到\"\n\n#: hexviewunit.rsaddress\nmsgctxt \"hexviewunit.rsaddress\"\nmsgid \"address\"\nmsgstr \"地址\"\n\n#: hexviewunit.rsbytes\nmsgctxt \"hexviewunit.rsbytes\"\nmsgid \"bytes\"\nmsgstr \"字节\"\n\n#: hexviewunit.rsexecute\nmsgctxt \"hexviewunit.rsexecute\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: hexviewunit.rsnoaccess\nmsgctxt \"hexviewunit.rsnoaccess\"\nmsgid \"No Access\"\nmsgstr \"无访问权限\"\n\n#: hexviewunit.rsphysicaladdress\nmsgctxt \"hexviewunit.rsphysicaladdress\"\nmsgid \"Physical Address\"\nmsgstr \"物理地址\"\n\n#: hexviewunit.rsprotect\nmsgctxt \"hexviewunit.rsprotect\"\nmsgid \"Protect\"\nmsgstr \"保护\"\n\n#: hexviewunit.rssize\nmsgctxt \"hexviewunit.rssize\"\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: hexviewunit.rswritecombine\nmsgctxt \"hexviewunit.rswritecombine\"\nmsgid \"Write Combine\"\nmsgstr \"写入合并\"\n\n#: hexviewunit.rswritecopy\nmsgctxt \"hexviewunit.rswritecopy\"\nmsgid \"Write Copy\"\nmsgstr \"写入复制\"\n\n#: hotkeys.rstogglefreeze\nmsgctxt \"hotkeys.rstogglefreeze\"\nmsgid \"Toggle freeze\"\nmsgstr \"切换冻结\"\n\n#: luacaller.rsisnotyetsupported\nmsgctxt \"luacaller.rsisnotyetsupported\"\nmsgid \" is not yet supported\"\nmsgstr \" 尚未支持\"\n\n#: luacaller.rsthistypeofmethod\nmsgctxt \"luacaller.rsthistypeofmethod\"\nmsgid \"This type of method:\"\nmsgstr \"此类型的方法：\"\n\n#: luadissectcode.rscouldnotbefound\nmsgctxt \"luadissectcode.rscouldnotbefound\"\nmsgid \" could not be found\"\nmsgstr \" 找不到\"\n\n#: luahandler.rspluginaddress\nmsgctxt \"luahandler.rspluginaddress\"\nmsgid \"Plugin Address\"\nmsgstr \"插件地址\"\n\n#: luaobject.rsisnotyetsupported\nmsgctxt \"luaobject.rsisnotyetsupported\"\nmsgid \" is not yet supported\"\nmsgstr \" 尚未支持\"\n\n#: luaobject.rsthistypeofmethod\nmsgctxt \"luaobject.rsthistypeofmethod\"\nmsgid \"This type of method:\"\nmsgstr \"此类型的方法：\"\n\n#: luastructurefrm.rsgroup1\nmsgctxt \"luastructurefrm.rsgroup1\"\nmsgid \"Group 1\"\nmsgstr \"组 1\"\n\n#: luasyntax.syns_langlua\nmsgctxt \"luasyntax.syns_langlua\"\nmsgid \"Lua\"\nmsgstr \"Lua\"\n\n#: mainunit.rsand\nmsgctxt \"mainunit.rsand\"\nmsgid \"and\"\nmsgstr \"和\"\n\n#: mainunit.rsareyousure\nmsgctxt \"mainunit.rsareyousure\"\nmsgid \"Are you sure?\"\nmsgstr \"你确定吗？\"\n\n#: mainunit.rsareyousureyouwanttodelete\n#, object-pascal-format\nmsgctxt \"mainunit.rsareyousureyouwanttodelete\"\nmsgid \"Are you sure you want to delete %s?\"\nmsgstr \"你确定要删除 %s 吗？\"\n\n#: mainunit.rscancel\nmsgctxt \"mainunit.rscancel\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: mainunit.rschangevalue\nmsgctxt \"mainunit.rschangevalue\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: mainunit.rscomparetosavedscan\nmsgctxt \"mainunit.rscomparetosavedscan\"\nmsgid \"Compare to first/saved scan\"\nmsgstr \"与第一次/保存的扫描进行比较\"\n\n#: mainunit.rsdecimal\nmsgctxt \"mainunit.rsdecimal\"\nmsgid \"Decimal\"\nmsgstr \"十进制\"\n\n#: mainunit.rsdelete\nmsgctxt \"mainunit.rsdelete\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: mainunit.rsedit\nmsgctxt \"mainunit.rsedit\"\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: mainunit.rsenablespeedhack\nmsgctxt \"mainunit.rsenablespeedhack\"\nmsgid \"Enable Speedhack\"\nmsgstr \"启用速度hack\"\n\n#: mainunit.rshex\nmsgctxt \"mainunit.rshex\"\nmsgid \"Hex\"\nmsgstr \"十六进制\"\n\n#: mainunit.rshexadecimal\nmsgctxt \"mainunit.rshexadecimal\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制数\"\n\n#: mainunit.rsmugenerategroupscancommand\nmsgctxt \"mainunit.rsmugenerategroupscancommand\"\nmsgid \"Generate groupscan command\"\nmsgstr \"生成组扫描命令\"\n\n#: mainunit.rspleasewait\nmsgctxt \"mainunit.rspleasewait\"\nmsgid \"<Processing>\"\nmsgstr \"请稍候\"\n\n#: mainunit.rsprevious\nmsgctxt \"mainunit.rsprevious\"\nmsgid \"Previous\"\nmsgstr \"上一个\"\n\n#: mainunit.rsprocessing\nmsgctxt \"mainunit.rsprocessing\"\nmsgid \"<Processing>\"\nmsgstr \"处理中\"\n\n#: mainunit.rsremoveselectedaddresses\nmsgctxt \"mainunit.rsremoveselectedaddresses\"\nmsgid \"Remove selected addresses\"\nmsgstr \"移除选定地址\"\n\n#: mainunit.rsrename\nmsgctxt \"mainunit.rsrename\"\nmsgid \"Rename\"\nmsgstr \"重命名\"\n\n#: mainunit.rsscan\nmsgctxt \"mainunit.rsscan\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: mainunit.rssethotkeys\nmsgctxt \"mainunit.rssethotkeys\"\nmsgid \"Set hotkeys\"\nmsgstr \"设置热键\"\n\n#: mainunit.rsshowasbinary\nmsgctxt \"mainunit.rsshowasbinary\"\nmsgid \"Show as binary\"\nmsgstr \"以二进制形式显示\"\n\n#: mainunit.rsshowashexadecimal\nmsgctxt \"mainunit.rsshowashexadecimal\"\nmsgid \"Show as hexadecimal\"\nmsgstr \"以十六进制形式显示\"\n\n#: mainunit.stralreadyin\nmsgctxt \"mainunit.stralreadyin\"\nmsgid \"This address is already in the list\"\nmsgstr \"此地址已在列表中\"\n\n#: mainunit.strchangedescription1\nmsgctxt \"mainunit.strchangedescription1\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: mainunit.strchangescript\nmsgctxt \"mainunit.strchangescript\"\nmsgid \"Change script\"\nmsgstr \"更改脚本\"\n\n#: mainunit.strerror\nmsgctxt \"mainunit.strerror\"\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: mainunit.strforcerecheck\nmsgctxt \"mainunit.strforcerecheck\"\nmsgid \"Force recheck symbols\"\nmsgstr \"强制重新检查符号\"\n\n#: mainunit.strnotavalidvalue\nmsgctxt \"mainunit.strnotavalidvalue\"\nmsgid \"This is not an valid value\"\nmsgstr \"这不是有效值\"\n\n#: mainunit.stropcodechanged\nmsgctxt \"mainunit.stropcodechanged\"\nmsgid \"The following opcodes changed the selected address\"\nmsgstr \"以下操作码更改了选定地址\"\n\n#: mainunit.strphysicalmemory\nmsgctxt \"mainunit.strphysicalmemory\"\nmsgid \"Physical Memory\"\nmsgstr \"物理内存\"\n\n#: mainunit.strrecalculateaddress\nmsgctxt \"mainunit.strrecalculateaddress\"\nmsgid \"Recalculate address\"\nmsgstr \"重新计算地址\"\n\n#: mainunit.strunknownextension\nmsgctxt \"mainunit.strunknownextension\"\nmsgid \"Unknown extension\"\nmsgstr \"未知扩展名\"\n\n#: mainunit.strvalue\nmsgctxt \"mainunit.strvalue\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: mainunit2.cename\nmsgctxt \"mainunit2.cename\"\nmsgid \"Cheat Engine\"\nmsgstr \"Cheat Engine\"\n\n#: mainunit2.rscheatengine\nmsgctxt \"mainunit2.rscheatengine\"\nmsgid \"Cheat Engine\"\nmsgstr \"Cheat Engine\"\n\n#: mainunit2.strchangedvalue\nmsgctxt \"mainunit2.strchangedvalue\"\nmsgid \"Changed value\"\nmsgstr \"更改的值\"\n\n#: mainunit2.strfirstscan\nmsgctxt \"mainunit2.strfirstscan\"\nmsgid \"First Scan\"\nmsgstr \"第一次扫描\"\n\n#: mainunit2.strnewscan\nmsgctxt \"mainunit2.strnewscan\"\nmsgid \"New Scan\"\nmsgstr \"新扫描\"\n\n#: mainunit2.strnodescription\nmsgctxt \"mainunit2.strnodescription\"\nmsgid \"No description\"\nmsgstr \"没有描述\"\n\n#: mainunit2.strok\nmsgctxt \"mainunit2.strok\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: mainunit2.strstart\nmsgctxt \"mainunit2.strstart\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: mainunit2.strstop\nmsgctxt \"mainunit2.strstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: memorybrowserformunit.rsaddress\nmsgctxt \"memorybrowserformunit.rsaddress\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: memorybrowserformunit.rsassemblyscan\nmsgctxt \"memorybrowserformunit.rsassemblyscan\"\nmsgid \"Assembly scan\"\nmsgstr \"汇编扫描\"\n\n#: memorybrowserformunit.rscomment\nmsgctxt \"memorybrowserformunit.rscomment\"\nmsgid \"Comment\"\nmsgstr \"评论\"\n\n#: memorybrowserformunit.rsinputtheassemblycodetofindwilcardssupported\nmsgctxt \"memorybrowserformunit.rsinputtheassemblycodetofindwilcardssupported\"\nmsgid \"Input the assembly code to find. Wildcards( * ) supported.\"\nmsgstr \"输入要查找的汇编代码。支持通配符（*）。\"\n\n#: memorybrowserformunit.rsisnotavalidvalue\n#, object-pascal-format\nmsgctxt \"memorybrowserformunit.rsisnotavalidvalue\"\nmsgid \"%s is not a valid value\"\nmsgstr \"%s 不是有效的值\"\n\n#: memorybrowserformunit.rslinkwithotherhexview\nmsgctxt \"memorybrowserformunit.rslinkwithotherhexview\"\nmsgid \"Link with other hexview\"\nmsgstr \"与其他十六进制视图链接\"\n\n#: memorybrowserformunit.rsparameters\nmsgctxt \"memorybrowserformunit.rsparameters\"\nmsgid \"Parameters\"\nmsgstr \"参数\"\n\n#: memorybrowserformunit.rsreplacewithcodethatdoesnothing\nmsgctxt \"memorybrowserformunit.rsreplacewithcodethatdoesnothing\"\nmsgid \"Replace with code that does nothing\"\nmsgstr \"替换为无操作的代码\"\n\n#: memorybrowserformunit.rsrestorewithorginalcode\nmsgctxt \"memorybrowserformunit.rsrestorewithorginalcode\"\nmsgid \"Restore with original code\"\nmsgstr \"恢复为原始代码\"\n\n#: memorybrowserformunit.rssetbreakpoint\nmsgctxt \"memorybrowserformunit.rssetbreakpoint\"\nmsgid \"Set breakpoint\"\nmsgstr \"设置断点\"\n\n#: memorybrowserformunit.rssetcustomalignment\nmsgctxt \"memorybrowserformunit.rssetcustomalignment\"\nmsgid \"Set custom alignment\"\nmsgstr \"设置自定义对齐\"\n\n#: memorybrowserformunit.rsshowdifference\nmsgctxt \"memorybrowserformunit.rsshowdifference\"\nmsgid \"Show difference\"\nmsgstr \"显示差异\"\n\n#: memorybrowserformunit.rsstacktrace\nmsgctxt \"memorybrowserformunit.rsstacktrace\"\nmsgid \"Stacktrace\"\nmsgstr \"堆栈跟踪\"\n\n#: memorybrowserformunit.rsvalue\nmsgctxt \"memorybrowserformunit.rsvalue\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: memoryrecordunit.rsactivate\nmsgctxt \"memoryrecordunit.rsactivate\"\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#: memoryrecordunit.rsdeactivate\nmsgctxt \"memoryrecordunit.rsdeactivate\"\nmsgid \"Deactivate\"\nmsgstr \"停用\"\n\n#: memoryrecordunit.rserror\nmsgctxt \"memoryrecordunit.rserror\"\nmsgid \"error\"\nmsgstr \"错误\"\n\n#: memoryrecordunit.rsp\nmsgctxt \"memoryrecordunit.rsp\"\nmsgid \"P->\"\nmsgstr \"P-&gt;\"\n\n#: memoryrecordunit.rssetvalue\nmsgctxt \"memoryrecordunit.rssetvalue\"\nmsgid \"Set Value\"\nmsgstr \"设置值\"\n\n#: memoryrecordunit.rsunknown\nmsgctxt \"memoryrecordunit.rsunknown\"\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#: memscan.rsisnotavalidvalue\n#, object-pascal-format\nmsgctxt \"memscan.rsisnotavalidvalue\"\nmsgid \"%s is not a valid value\"\nmsgstr \"%s 不是有效的值\"\n\n#: memscan.rsnoreadablememoryfound\nmsgctxt \"memscan.rsnoreadablememoryfound\"\nmsgid \"No readable memory found\"\nmsgstr \"未找到可读内存\"\n\n#: memscan.rsunknown\nmsgctxt \"memscan.rsunknown\"\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#: networkconfig.rscouldnotberesolved\nmsgctxt \"networkconfig.rscouldnotberesolved\"\nmsgid \" could not be resolved\"\nmsgstr \"无法解析\"\n\n#: networkconfig.rsfailurecreatingsocket\nmsgctxt \"networkconfig.rsfailurecreatingsocket\"\nmsgid \"Failure creating socket\"\nmsgstr \"创建套接字失败\"\n\n#: networkconfig.rshost\nmsgctxt \"networkconfig.rshost\"\nmsgid \"host:\"\nmsgstr \"主机：\"\n\n#: opensave.rsunknownextention\nmsgctxt \"opensave.rsunknownextention\"\nmsgid \"Unknown extension\"\nmsgstr \"未知扩展名\"\n\n#: peinfounit.rspeunknown\nmsgctxt \"peinfounit.rspeunknown\"\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#: pluginexports.rspluginaddress\nmsgctxt \"pluginexports.rspluginaddress\"\nmsgid \"Plugin Address\"\nmsgstr \"插件地址\"\n\n#: pointeraddresslist.rspalinvalidscandatafile\nmsgctxt \"pointeraddresslist.rspalinvalidscandatafile\"\nmsgid \"Invalid scandata file\"\nmsgstr \"无效的扫描数据文件\"\n\n#: pointeraddresslist.rspalinvalidscandataversion\nmsgctxt \"pointeraddresslist.rspalinvalidscandataversion\"\nmsgid \"Invalid scandata version\"\nmsgstr \"无效的扫描数据版本\"\n\n#: pointerscanconnector.rscouldnotberesolved\nmsgctxt \"pointerscanconnector.rscouldnotberesolved\"\nmsgid \" could not be resolved\"\nmsgstr \"无法解析\"\n\n#: pointerscanconnector.rsfailurecreatingsocket\nmsgctxt \"pointerscanconnector.rsfailurecreatingsocket\"\nmsgid \"Failure creating socket\"\nmsgstr \"创建套接字失败\"\n\n#: pointerscanconnector.rshost\nmsgctxt \"pointerscanconnector.rshost\"\nmsgid \"host:\"\nmsgstr \"主机：\"\n\n#: pointerscancontroller.rspscfailurecreatingsocket\nmsgctxt \"pointerscancontroller.rspscfailurecreatingsocket\"\nmsgid \"Failure creating socket\"\nmsgstr \"创建套接字失败\"\n\n#: pointerscannerfrm.rsactive\nmsgctxt \"pointerscannerfrm.rsactive\"\nmsgid \"Active\"\nmsgstr \"活动\"\n\n#: pointerscannerfrm.rsbaseaddress\nmsgctxt \"pointerscannerfrm.rsbaseaddress\"\nmsgid \"Base Address\"\nmsgstr \"基地址\"\n\n#: pointerscannerfrm.rsoffset\nmsgctxt \"pointerscannerfrm.rsoffset\"\nmsgid \"Offset\"\nmsgstr \"偏移量\"\n\n#: pointerscannerfrm.rspointerscan\nmsgctxt \"pointerscannerfrm.rspointerscan\"\nmsgid \"Pointer scan\"\nmsgstr \"指针扫描\"\n\n#: pointerscannerfrm.rspsgeneratingpointermap\nmsgctxt \"pointerscannerfrm.rspsgeneratingpointermap\"\nmsgid \"Generating pointermap\"\nmsgstr \"正在生成指针映射\"\n\n#: pointerscannerfrm.rspsnetwork\nmsgctxt \"pointerscannerfrm.rspsnetwork\"\nmsgid \"Network\"\nmsgstr \"网络\"\n\n#: pointerscannerfrm.rspsthreads\nmsgctxt \"pointerscannerfrm.rspsthreads\"\nmsgid \"Threads\"\nmsgstr \"线程\"\n\n#: pointerscannerfrm.rssavingandterminating\nmsgctxt \"pointerscannerfrm.rssavingandterminating\"\nmsgid \"Saving...\"\nmsgstr \"保存中...\"\n\n#: pointerscannerfrm.rsstop\nmsgctxt \"pointerscannerfrm.rsstop\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: pointerscannerfrm.rsthread\nmsgctxt \"pointerscannerfrm.rsthread\"\nmsgid \"Thread\"\nmsgstr \"线程\"\n\n#: pointerscannerfrm.rsthreads\nmsgctxt \"pointerscannerfrm.rsthreads\"\nmsgid \"Threads\"\nmsgstr \"线程\"\n\n#: pointerscannersettingsfrm.rsadd\nmsgctxt \"pointerscannersettingsfrm.rsadd\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: pointerscannersettingsfrm.rsaddress\nmsgctxt \"pointerscannersettingsfrm.rsaddress\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: pointerscannersettingsfrm.rsfrom\nmsgctxt \"pointerscannersettingsfrm.rsfrom\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: pointerscannersettingsfrm.rshigher\nmsgctxt \"pointerscannersettingsfrm.rshigher\"\nmsgid \"Higher\"\nmsgstr \"更高\"\n\n#: pointerscannersettingsfrm.rshighest\nmsgctxt \"pointerscannersettingsfrm.rshighest\"\nmsgid \"Highest\"\nmsgstr \"最高\"\n\n#: pointerscannersettingsfrm.rsidle\nmsgctxt \"pointerscannersettingsfrm.rsidle\"\nmsgid \"Idle\"\nmsgstr \"空闲\"\n\n#: pointerscannersettingsfrm.rsinvalidaddress\nmsgctxt \"pointerscannersettingsfrm.rsinvalidaddress\"\nmsgid \"Invalid address\"\nmsgstr \"无效地址\"\n\n#: pointerscannersettingsfrm.rslastoffset\nmsgctxt \"pointerscannersettingsfrm.rslastoffset\"\nmsgid \"Last offset\"\nmsgstr \"最后偏移量\"\n\n#: pointerscannersettingsfrm.rslimitscantospecifiedregionfile\nmsgctxt \"pointerscannersettingsfrm.rslimitscantospecifiedregionfile\"\nmsgid \"Limit scan to specified region file\"\nmsgstr \"限制扫描到指定区域文件\"\n\n#: pointerscannersettingsfrm.rslower\nmsgctxt \"pointerscannersettingsfrm.rslower\"\nmsgid \"Lower\"\nmsgstr \"更低\"\n\n#: pointerscannersettingsfrm.rslowest\nmsgctxt \"pointerscannersettingsfrm.rslowest\"\nmsgid \"Lowest\"\nmsgstr \"最低\"\n\n#: pointerscannersettingsfrm.rsnormal\nmsgctxt \"pointerscannersettingsfrm.rsnormal\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: pointerscannersettingsfrm.rsremove\nmsgctxt \"pointerscannersettingsfrm.rsremove\"\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#: pointerscannersettingsfrm.rstimecritical\nmsgctxt \"pointerscannersettingsfrm.rstimecritical\"\nmsgid \"TimeCritical\"\nmsgstr \"时间关键\"\n\n#: pointerscannersettingsfrm.rsto\nmsgctxt \"pointerscannersettingsfrm.rsto\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: pointerscannersettingsfrm.rsuseloadedpointermap\nmsgctxt \"pointerscannersettingsfrm.rsuseloadedpointermap\"\nmsgid \"Use saved pointermap\"\nmsgstr \"使用保存的指针映射\"\n\n#: pointerscansettingsipconnectionlist.rspssicladd\nmsgctxt \"pointerscansettingsipconnectionlist.rspssicladd\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: pointerscansettingsipconnectionlist.rspssiclhost\nmsgctxt \"pointerscansettingsipconnectionlist.rspssiclhost\"\nmsgid \"Host\"\nmsgstr \"主机\"\n\n#: pointerscansettingsipconnectionlist.rspssiclpassword\nmsgctxt \"pointerscansettingsipconnectionlist.rspssiclpassword\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: pointerscansettingsipconnectionlist.rspssiclport\nmsgctxt \"pointerscansettingsipconnectionlist.rspssiclport\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: pointerscansettingsipconnectionlist.rspssiclremove\nmsgctxt \"pointerscansettingsipconnectionlist.rspssiclremove\"\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#: pointervaluelist.rsnomemoryfoundinthespecifiedregion\nmsgctxt \"pointervaluelist.rsnomemoryfoundinthespecifiedregion\"\nmsgid \"No memory found in the specified region\"\nmsgstr \"在指定区域未找到内存\"\n\n#: pointervaluelist.rspvinvalidscandatafile\nmsgctxt \"pointervaluelist.rspvinvalidscandatafile\"\nmsgid \"Invalid scandata file\"\nmsgstr \"无效的扫描数据文件\"\n\n#: pointervaluelist.rspvinvalidscandataversion\nmsgctxt \"pointervaluelist.rspvinvalidscandataversion\"\nmsgid \"Invalid scandata version\"\nmsgstr \"无效的扫描数据版本\"\n\n#: pointervaluelist.rspvnotenoughmemoryfreetoscan\nmsgctxt \"pointervaluelist.rspvnotenoughmemoryfreetoscan\"\nmsgid \"Not enough memory free to scan\"\nmsgstr \"没有足够的内存可供扫描\"\n\n#: processlist.rsicantgettheprocesslistyouarepropablyusingwindowsnt\nmsgctxt \"processlist.rsicantgettheprocesslistyouarepropablyusingwindowsnt\"\nmsgid \"I can't get the process list. You are propably using windows NT. Use the window list instead!\"\nmsgstr \"我无法获取进程列表。你可能正在使用 Windows NT。请改用窗口列表！\"\n\n#: processwindowunit.rsapplications\nmsgctxt \"processwindowunit.rsapplications\"\nmsgid \"Applications\"\nmsgstr \"应用程序\"\n\n#: processwindowunit.rscreateprocess\nmsgctxt \"processwindowunit.rscreateprocess\"\nmsgid \"Create Process\"\nmsgstr \"创建进程\"\n\n#: processwindowunit.rsfilter\nmsgctxt \"processwindowunit.rsfilter\"\nmsgid \"Filter\"\nmsgstr \"过滤器\"\n\n#: processwindowunit.rsfirstselectaprocess\nmsgctxt \"processwindowunit.rsfirstselectaprocess\"\nmsgid \"First select a process!\"\nmsgstr \"请先选择一个进程！\"\n\n#: processwindowunit.rsisntavalidprocessid\n#, object-pascal-format\nmsgctxt \"processwindowunit.rsisntavalidprocessid\"\nmsgid \"%s isn't a valid processID\"\nmsgstr \"%s 不是有效的进程 ID\"\n\n#: processwindowunit.rsphysicalmemory\nmsgctxt \"processwindowunit.rsphysicalmemory\"\nmsgid \"Physical Memory\"\nmsgstr \"物理内存\"\n\n#: processwindowunit.rsprocesses\nmsgctxt \"processwindowunit.rsprocesses\"\nmsgid \"Processes\"\nmsgstr \"进程\"\n\n#: processwindowunit.rsprocesslist\nmsgctxt \"processwindowunit.rsprocesslist\"\nmsgid \"Process List\"\nmsgstr \"进程列表\"\n\n#: processwindowunit.rswindows\nmsgctxt \"processwindowunit.rswindows\"\nmsgid \"Windows\"\nmsgstr \"窗口\"\n\n#: processwindowunit.rsyoucanonlyloadexefiles\nmsgctxt \"processwindowunit.rsyoucanonlyloadexefiles\"\nmsgid \"You can only load EXE files\"\nmsgstr \"你只能加载 EXE 文件\"\n\n#: savedisassemblyfrm.rscopy\nmsgctxt \"savedisassemblyfrm.rscopy\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: savedisassemblyfrm.rssave\nmsgctxt \"savedisassemblyfrm.rssave\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: savedisassemblyfrm.rssavedisassembledoutput\nmsgctxt \"savedisassemblyfrm.rssavedisassembledoutput\"\nmsgid \"Save disassembled output\"\nmsgstr \"保存反汇编输出\"\n\n#: structuresaddelementfrm.rssae2bytes\nmsgctxt \"structuresaddelementfrm.rssae2bytes\"\nmsgid \"2 Bytes\"\nmsgstr \"2 字节\"\n\n#: structuresaddelementfrm.rssae4bytes\nmsgctxt \"structuresaddelementfrm.rssae4bytes\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: structuresfrm.rsareyousureyouwanttodelete\n#, object-pascal-format\nmsgctxt \"structuresfrm.rsareyousureyouwanttodelete\"\nmsgid \"Are you sure you want to delete %s?\"\nmsgstr \"你确定要删除 %s 吗？\"\n\n#: structuresfrm.rsareyousureyouwanttoremoveallstructures\nmsgctxt \"structuresfrm.rsareyousureyouwanttoremoveallstructures\"\nmsgid \"Are you sure you want to remove all structures?\"\nmsgstr \"你确定要移除所有结构吗？\"\n\n#: structuresfrm.rsautogeneratedfor\n#, object-pascal-format\nmsgctxt \"structuresfrm.rsautogeneratedfor\"\nmsgid \"Autogenerated for %s\"\nmsgstr \"为 %s 自动生成\"\n\n#: structuresfrm.rschangegroup\nmsgctxt \"structuresfrm.rschangegroup\"\nmsgid \"Change group\"\nmsgstr \"更改组\"\n\n#: structuresfrm.rsdissectdata\nmsgctxt \"structuresfrm.rsdissectdata\"\nmsgid \"Dissect Data\"\nmsgstr \"解剖数据\"\n\n#: structuresfrm.rsdoyouwantcheatenginetotryandfillinthemostbasictype\nmsgctxt \"structuresfrm.rsdoyouwantcheatenginetotryandfillinthemostbasictype\"\nmsgid \"Do you want Cheat Engine to try and fill in the most basic types of the struct using the current address?\"\nmsgstr \"你希望 Cheat Engine 尝试使用当前地址填充结构的最基本类型吗？\"\n\n#: structuresfrm.rsfirstselectastructureyouwanttomodifyordefine\nmsgctxt \"structuresfrm.rsfirstselectastructureyouwanttomodifyordefine\"\nmsgid \"First select a structure you want to modify or define one first\"\nmsgstr \"请先选择一个你想修改的结构，或者先定义一个\"\n\n#: structuresfrm.rsgivetheaddressofthiselement\nmsgctxt \"structuresfrm.rsgivetheaddressofthiselement\"\nmsgid \"Give the address of this element\"\nmsgstr \"给出此元素的地址\"\n\n#: structuresfrm.rsgivethenameforthisstructure\nmsgctxt \"structuresfrm.rsgivethenameforthisstructure\"\nmsgid \"Give the name for this structure\"\nmsgstr \"给出此结构的名称\"\n\n#: structuresfrm.rsgivethenewnameofthisstructure\nmsgctxt \"structuresfrm.rsgivethenewnameofthisstructure\"\nmsgid \"Give the new name of this structure\"\nmsgstr \"给出此结构的新名称\"\n\n#: structuresfrm.rsihavenoideawhatmeans\n#, object-pascal-format\nmsgctxt \"structuresfrm.rsihavenoideawhatmeans\"\nmsgid \"I have no idea what %s means\"\nmsgstr \"我不知道 %s 的意思\"\n\n#: structuresfrm.rslockmemory\nmsgctxt \"structuresfrm.rslockmemory\"\nmsgid \"Lock memory\"\nmsgstr \"锁定内存\"\n\n#: structuresfrm.rsmemorydissect\nmsgctxt \"structuresfrm.rsmemorydissect\"\nmsgid \"Memory dissect\"\nmsgstr \"内存解剖\"\n\n#: structuresfrm.rsnewinterval\nmsgctxt \"structuresfrm.rsnewinterval\"\nmsgid \"New interval\"\nmsgstr \"新间隔\"\n\n#: structuresfrm.rspleasegiveastartingoffsettoevaluate\nmsgctxt \"structuresfrm.rspleasegiveastartingoffsettoevaluate\"\nmsgid \"Please give a starting offset to evaluate\"\nmsgstr \"请给出一个起始偏移量以进行评估\"\n\n#: structuresfrm.rspleasegiveastartingsizeofthestructyoucanchangethis\nmsgctxt \"structuresfrm.rspleasegiveastartingsizeofthestructyoucanchangethis\"\nmsgid \"Please give a starting size of the struct (You can change this later if needed)\"\nmsgstr \"请给出结构的起始大小（如果需要，可以稍后更改）\"\n\n#: structuresfrm.rspleasegivethesizeoftheblocktoevaluate\nmsgctxt \"structuresfrm.rspleasegivethesizeoftheblocktoevaluate\"\nmsgid \"Please give the size of the block to evaluate\"\nmsgstr \"请给出要评估的块的大小\"\n\n#: structuresfrm.rspointerto\nmsgctxt \"structuresfrm.rspointerto\"\nmsgid \"Pointer\"\nmsgstr \"指针\"\n\n#: structuresfrm.rsrecalculatebaseofstructure\nmsgctxt \"structuresfrm.rsrecalculatebaseofstructure\"\nmsgid \"Recalculate base of structure\"\nmsgstr \"重新计算结构的基址\"\n\n#: structuresfrm.rsrenamestructure\nmsgctxt \"structuresfrm.rsrenamestructure\"\nmsgid \"Rename structure\"\nmsgstr \"重命名结构\"\n\n#: structuresfrm.rsstructuredefine\nmsgctxt \"structuresfrm.rsstructuredefine\"\nmsgid \"Structure define\"\nmsgstr \"结构定义\"\n\n#: structuresfrm.rsstructuredefiner\nmsgctxt \"structuresfrm.rsstructuredefiner\"\nmsgid \"Structure definer\"\nmsgstr \"结构定义器\"\n\n#: structuresfrm.rsstructureviewlock\nmsgctxt \"structuresfrm.rsstructureviewlock\"\nmsgid \"Structure view lock\"\nmsgstr \"结构视图锁定\"\n\n#: structuresfrm.rsthisisnotavalidstructurefile\nmsgctxt \"structuresfrm.rsthisisnotavalidstructurefile\"\nmsgid \"This is not a valid structure file\"\nmsgstr \"这不是一个有效的结构文件\"\n\n#: structuresfrm.rsthisisquiteabigstructurehowmanybytesdoyouwanttosav\nmsgctxt \"structuresfrm.rsthisisquiteabigstructurehowmanybytesdoyouwanttosav\"\nmsgid \"This is quite a big structure. How many bytes do you want to save?\"\nmsgstr \"这是一个相当大的结构。你想保存多少字节？\"\n\n#: structuresfrm.rsunkownfileextension\nmsgctxt \"structuresfrm.rsunkownfileextension\"\nmsgid \"Unknown file extension\"\nmsgstr \"未知的文件扩展名\"\n\n#: structuresfrm.rsunlockmemory\nmsgctxt \"structuresfrm.rsunlockmemory\"\nmsgid \"Unlock memory\"\nmsgstr \"解锁内存\"\n\n#: structuresfrm.rsunnamedstructure\nmsgctxt \"structuresfrm.rsunnamedstructure\"\nmsgid \"unnamed structure\"\nmsgstr \"未命名结构\"\n\n#: structuresfrm.rsupdateinterval\nmsgctxt \"structuresfrm.rsupdateinterval\"\nmsgid \"Update interval\"\nmsgstr \"更新间隔\"\n\n#: structuresfrm.rswhichgroupdoyouwanttosetthisaddressto\nmsgctxt \"structuresfrm.rswhichgroupdoyouwanttosetthisaddressto\"\nmsgid \"Which group do you want to set this address to?\"\nmsgstr \"你想将这个地址设置到哪个组？\"\n\n#: structuresfrm2.rsareyousureyouwanttodelete\n#, object-pascal-format\nmsgctxt \"structuresfrm2.rsareyousureyouwanttodelete\"\nmsgid \"Are you sure you want to delete %s?\"\nmsgstr \"你确定要删除 %s 吗？\"\n\n#: structuresfrm2.rsareyousureyouwanttoremoveallstructures\nmsgctxt \"structuresfrm2.rsareyousureyouwanttoremoveallstructures\"\nmsgid \"Are you sure you want to remove all structures?\"\nmsgstr \"你确定要移除所有结构吗？\"\n\n#: structuresfrm2.rsautogeneratedfor\n#, object-pascal-format\nmsgctxt \"structuresfrm2.rsautogeneratedfor\"\nmsgid \"Autogenerated for %s\"\nmsgstr \"为 %s 自动生成\"\n\n#: structuresfrm2.rschangegroup\nmsgctxt \"structuresfrm2.rschangegroup\"\nmsgid \"Change group\"\nmsgstr \"更改组\"\n\n#: structuresfrm2.rscopy\nmsgctxt \"structuresfrm2.rscopy\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: structuresfrm2.rscut\nmsgctxt \"structuresfrm2.rscut\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: structuresfrm2.rsdissectdata\nmsgctxt \"structuresfrm2.rsdissectdata\"\nmsgid \"Dissect Data\"\nmsgstr \"解剖数据\"\n\n#: structuresfrm2.rsdoyouwantcheatenginetotryandfillinthemostbasictype\nmsgctxt \"structuresfrm2.rsdoyouwantcheatenginetotryandfillinthemostbasictype\"\nmsgid \"Do you want Cheat Engine to try and fill in the most basic types of the struct using the current address?\"\nmsgstr \"你想让 Cheat Engine 尝试填充结构的最基本类型吗？\"\n\n#: structuresfrm2.rsfirstselectastructureyouwanttomodifyordefine\nmsgctxt \"structuresfrm2.rsfirstselectastructureyouwanttomodifyordefine\"\nmsgid \"First select a structure you want to modify or define one first\"\nmsgstr \"首先选择一个你想修改的结构，或者先定义一个\"\n\n#: structuresfrm2.rsfs2structuredefine\nmsgctxt \"structuresfrm2.rsfs2structuredefine\"\nmsgid \"Structure define\"\nmsgstr \"结构定义\"\n\n#: structuresfrm2.rsgivetheaddressofthiselement\nmsgctxt \"structuresfrm2.rsgivetheaddressofthiselement\"\nmsgid \"Give the address of this element\"\nmsgstr \"给出这个元素的地址\"\n\n#: structuresfrm2.rsgivethenameforthisstructure\nmsgctxt \"structuresfrm2.rsgivethenameforthisstructure\"\nmsgid \"Give the name for this structure\"\nmsgstr \"给这个结构命名\"\n\n#: structuresfrm2.rsgivethenewnameofthisstructure\nmsgctxt \"structuresfrm2.rsgivethenewnameofthisstructure\"\nmsgid \"Give the new name of this structure\"\nmsgstr \"给这个结构的新名称\"\n\n#: structuresfrm2.rsgotooffset\nmsgctxt \"structuresfrm2.rsgotooffset\"\nmsgid \"Go to Offset\"\nmsgstr \"转到偏移量\"\n\n#: structuresfrm2.rshexadecimal\nmsgctxt \"structuresfrm2.rshexadecimal\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: structuresfrm2.rsihavenoideawhatmeans\n#, object-pascal-format\nmsgctxt \"structuresfrm2.rsihavenoideawhatmeans\"\nmsgid \"I have no idea what %s means\"\nmsgstr \"我不知道 %s 的意思\"\n\n#: structuresfrm2.rslock\nmsgctxt \"structuresfrm2.rslock\"\nmsgid \"Lock\"\nmsgstr \"锁定\"\n\n#: structuresfrm2.rslockmemory\nmsgctxt \"structuresfrm2.rslockmemory\"\nmsgid \"Lock memory\"\nmsgstr \"锁定内存\"\n\n#: structuresfrm2.rsmemorydissect\nmsgctxt \"structuresfrm2.rsmemorydissect\"\nmsgid \"Memory dissect\"\nmsgstr \"内存解剖\"\n\n#: structuresfrm2.rsnewinterval\nmsgctxt \"structuresfrm2.rsnewinterval\"\nmsgid \"New interval\"\nmsgstr \"新间隔\"\n\n#: structuresfrm2.rsp\nmsgctxt \"structuresfrm2.rsp\"\nmsgid \"P->\"\nmsgstr \"P->\"\n\n#: structuresfrm2.rspaste\nmsgctxt \"structuresfrm2.rspaste\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: structuresfrm2.rspleasegiveastartingoffsettoevaluate\nmsgctxt \"structuresfrm2.rspleasegiveastartingoffsettoevaluate\"\nmsgid \"Please give a starting offset to evaluate\"\nmsgstr \"请给出一个起始偏移量以进行评估\"\n\n#: structuresfrm2.rspleasegiveastartingsizeofthestructyoucanchangethis\nmsgctxt \"structuresfrm2.rspleasegiveastartingsizeofthestructyoucanchangethis\"\nmsgid \"Please give a starting size of the struct (You can change this later if needed)\"\nmsgstr \"请给出结构的起始大小（如果需要，你可以稍后更改此项）\"\n\n#: structuresfrm2.rspleasegivethesizeoftheblocktoevaluate\nmsgctxt \"structuresfrm2.rspleasegivethesizeoftheblocktoevaluate\"\nmsgid \"Please give the size of the block to evaluate\"\nmsgstr \"请给出要评估的块的大小\"\n\n#: structuresfrm2.rspointer\nmsgctxt \"structuresfrm2.rspointer\"\nmsgid \"Pointer\"\nmsgstr \"指针\"\n\n#: structuresfrm2.rspointerto\nmsgctxt \"structuresfrm2.rspointerto\"\nmsgid \"Pointer\"\nmsgstr \"指向\"\n\n#: structuresfrm2.rsrecalculatebaseofstructure\nmsgctxt \"structuresfrm2.rsrecalculatebaseofstructure\"\nmsgid \"Recalculate base of structure\"\nmsgstr \"重新计算结构的基址\"\n\n#: structuresfrm2.rsrenamestructure\nmsgctxt \"structuresfrm2.rsrenamestructure\"\nmsgid \"Rename structure\"\nmsgstr \"重命名结构\"\n\n#: structuresfrm2.rssf2changevalue\nmsgctxt \"structuresfrm2.rssf2changevalue\"\nmsgid \"Change Value\"\nmsgstr \"更改值\"\n\n#: structuresfrm2.rssf2group\nmsgctxt \"structuresfrm2.rssf2group\"\nmsgid \"Group \"\nmsgstr \"组\"\n\n#: structuresfrm2.rssf2group1\nmsgctxt \"structuresfrm2.rssf2group1\"\nmsgid \"Group 1\"\nmsgstr \"组 1\"\n\n#: structuresfrm2.rssf2group2\nmsgctxt \"structuresfrm2.rssf2group2\"\nmsgid \"Group \"\nmsgstr \"组\"\n\n#: structuresfrm2.rssf2newgroup2\nmsgctxt \"structuresfrm2.rssf2newgroup2\"\nmsgid \"New group\"\nmsgstr \"新组\"\n\n#: structuresfrm2.rssf2rename\nmsgctxt \"structuresfrm2.rssf2rename\"\nmsgid \"Rename\"\nmsgstr \"重命名\"\n\n#: structuresfrm2.rsstructuredefine\nmsgctxt \"structuresfrm2.rsstructuredefine\"\nmsgid \"Structure define\"\nmsgstr \"结构定义\"\n\n#: structuresfrm2.rsstructuredefiner\nmsgctxt \"structuresfrm2.rsstructuredefiner\"\nmsgid \"Structure definer\"\nmsgstr \"结构定义器\"\n\n#: structuresfrm2.rsstructuredissect\nmsgctxt \"structuresfrm2.rsstructuredissect\"\nmsgid \"Structure dissect\"\nmsgstr \"结构解析\"\n\n#: structuresfrm2.rsstructureviewlock\nmsgctxt \"structuresfrm2.rsstructureviewlock\"\nmsgid \"Structure view lock\"\nmsgstr \"结构视图锁定\"\n\n#: structuresfrm2.rsthisisnotavalidstructurefile\nmsgctxt \"structuresfrm2.rsthisisnotavalidstructurefile\"\nmsgid \"This is not a valid structure file\"\nmsgstr \"这不是一个有效的结构文件\"\n\n#: structuresfrm2.rsthisisquiteabigstructurehowmanybytesdoyouwanttosav\nmsgctxt \"structuresfrm2.rsthisisquiteabigstructurehowmanybytesdoyouwanttosav\"\nmsgid \"This is quite a big structure. How many bytes do you want to save?\"\nmsgstr \"这是一个相当大的结构。你想保存多少字节？\"\n\n#: structuresfrm2.rsunicodestring\nmsgctxt \"structuresfrm2.rsunicodestring\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: structuresfrm2.rsunkownfileextension\nmsgctxt \"structuresfrm2.rsunkownfileextension\"\nmsgid \"Unknown file extension\"\nmsgstr \"未知文件扩展名\"\n\n#: structuresfrm2.rsunlockmemory\nmsgctxt \"structuresfrm2.rsunlockmemory\"\nmsgid \"Unlock memory\"\nmsgstr \"解锁内存\"\n\n#: structuresfrm2.rsunnamedstructure\nmsgctxt \"structuresfrm2.rsunnamedstructure\"\nmsgid \"unnamed structure\"\nmsgstr \"未命名结构\"\n\n#: structuresfrm2.rsupdateinterval\nmsgctxt \"structuresfrm2.rsupdateinterval\"\nmsgid \"Update interval\"\nmsgstr \"更新间隔\"\n\n#: structuresfrm2.rswhichgroupdoyouwanttosetthisaddressto\nmsgctxt \"structuresfrm2.rswhichgroupdoyouwanttosetthisaddressto\"\nmsgid \"Which group do you want to set this address to?\"\nmsgstr \"你想将这个地址设置到哪个组？\"\n\n#: tabout.button1.caption\nmsgctxt \"tabout.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tabout.groupbox1.caption\nmsgctxt \"tabout.groupbox1.caption\"\nmsgid \"Cheat Engine\"\nmsgstr \"Cheat Engine\"\n\n#: tadvancedoptions.button1.caption\nmsgctxt \"tadvancedoptions.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tadvancedoptions.findoutwhatthiscodechanges1.caption\nmsgctxt \"tadvancedoptions.findoutwhatthiscodechanges1.caption\"\nmsgid \"Find out what addresses this code writes to\"\nmsgstr \"找出这个代码写入了哪些地址\"\n\n#: tadvancedoptions.lvcodelist.columns[0].caption\nmsgctxt \"tadvancedoptions.lvcodelist.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tadvancedoptions.lvcodelist.columns[1].caption\nmsgctxt \"tadvancedoptions.lvcodelist.columns[1].caption\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#: tadvancedoptions.micopytoclipboard.caption\nmsgctxt \"tadvancedoptions.micopytoclipboard.caption\"\nmsgid \"Copy address to clipboard\"\nmsgstr \"复制地址到剪贴板\"\n\n#: tadvancedoptions.minewgroup.caption\nmsgctxt \"tadvancedoptions.minewgroup.caption\"\nmsgid \"New group\"\nmsgstr \"新组\"\n\n#: tadvancedoptions.mireplacewithnops.caption\nmsgctxt \"tadvancedoptions.mireplacewithnops.caption\"\nmsgid \"Replace with code that does nothing\"\nmsgstr \"用无操作代码替换\"\n\n#: tadvancedoptions.mirestorewithoriginal.caption\nmsgctxt \"tadvancedoptions.mirestorewithoriginal.caption\"\nmsgid \"Restore with original code\"\nmsgstr \"用原始代码恢复\"\n\n#: tadvancedoptions.pausebutton.hint\nmsgctxt \"tadvancedoptions.pausebutton.hint\"\nmsgid \"Pause the game\"\nmsgstr \"暂停游戏\"\n\n#: tadvancedoptions.rename1.caption\nmsgctxt \"tadvancedoptions.rename1.caption\"\nmsgid \"Rename\"\nmsgstr \"重命名\"\n\n#: tanchoreditor.cbbottomanchorenabled.caption\nmsgctxt \"tanchoreditor.cbbottomanchorenabled.caption\"\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\n#: tanchoreditor.cbleftanchorenabled.caption\nmsgctxt \"tanchoreditor.cbleftanchorenabled.caption\"\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\n#: tanchoreditor.cbrightanchorenabled.caption\nmsgctxt \"tanchoreditor.cbrightanchorenabled.caption\"\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\n#: tanchoreditor.cbtopanchorenabled.caption\nmsgctxt \"tanchoreditor.cbtopanchorenabled.caption\"\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\n#: tanchoreditor.label2.caption\nmsgctxt \"tanchoreditor.label2.caption\"\nmsgid \"Control\"\nmsgstr \"控制\"\n\n#: tanchoreditor.label3.caption\nmsgctxt \"tanchoreditor.label3.caption\"\nmsgid \"Control\"\nmsgstr \"控制\"\n\n#: tanchoreditor.label5.caption\nmsgctxt \"tanchoreditor.label5.caption\"\nmsgid \"Control\"\nmsgstr \"控制\"\n\n#: tanchoreditor.label6.caption\nmsgctxt \"tanchoreditor.label6.caption\"\nmsgid \"Control\"\nmsgstr \"控制\"\n\n#: tcalloralldialog.button1.caption\nmsgctxt \"tcalloralldialog.button1.caption\"\nmsgid \"All\"\nmsgstr \"全部\"\n\n#: tcalloralldialog.button3.caption\nmsgctxt \"tcalloralldialog.button3.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tcalloralldialog.caption\nmsgctxt \"tcalloralldialog.caption\"\nmsgid \"Code Filter\"\nmsgstr \"代码过滤器\"\n\n#: tchangeoffset.cancel.caption\nmsgctxt \"tchangeoffset.cancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tchangeoffset.cbhexadecimal.caption\nmsgctxt \"tchangeoffset.cbhexadecimal.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: tcomments.caption\nmsgctxt \"tcomments.caption\"\nmsgid \"Comments\"\nmsgstr \"评论\"\n\n#: tcomments.tscomment.caption\nmsgctxt \"tcomments.tscomment.caption\"\nmsgid \"Comments\"\nmsgstr \"评论\"\n\n#: tfindwindow.btncancel.caption\nmsgctxt \"tfindwindow.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfindwindow.btnok.caption\nmsgctxt \"tfindwindow.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfindwindow.caption\nmsgctxt \"tfindwindow.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfindwindow.cbunicode.caption\nmsgctxt \"tfindwindow.cbunicode.caption\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: tfindwindow.label2.caption\nmsgctxt \"tfindwindow.label2.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfindwindow.label3.caption\nmsgctxt \"tfindwindow.label3.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfindwindow.rbtext.caption\nmsgctxt \"tfindwindow.rbtext.caption\"\nmsgid \"Text\"\nmsgstr \"文本\"\n\n#: tformaddresschange.btncancel.caption\nmsgctxt \"tformaddresschange.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tformaddresschange.btnok.caption\nmsgctxt \"tformaddresschange.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformaddresschange.cbcodepage.caption\nmsgctxt \"tformaddresschange.cbcodepage.caption\"\nmsgid \"Codepage\"\nmsgstr \"代码页\"\n\n#: tformaddresschange.cbhex.caption\nmsgctxt \"tformaddresschange.cbhex.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: tformaddresschange.cbpointer.caption\nmsgctxt \"tformaddresschange.cbpointer.caption\"\nmsgid \"Pointer\"\nmsgstr \"指针\"\n\n#: tformaddresschange.cbsigned.caption\nmsgctxt \"tformaddresschange.cbsigned.caption\"\nmsgid \"Signed\"\nmsgstr \"有符号\"\n\n#: tformaddresschange.cbunicode.caption\nmsgctxt \"tformaddresschange.cbunicode.caption\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: tformaddresschange.cbvartype.text\nmsgctxt \"tformaddresschange.cbvartype.text\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tformaddresschange.edtsize.text\nmsgctxt \"tformaddresschange.edtsize.text\"\nmsgid \"10\"\nmsgstr \"10\"\n\n#: tformaddresschange.label10.caption\nmsgctxt \"tformaddresschange.label10.caption\"\nmsgid \"6\"\nmsgstr \"6\"\n\n#: tformaddresschange.label11.caption\nmsgctxt \"tformaddresschange.label11.caption\"\nmsgid \"7\"\nmsgstr \"7\"\n\n#: tformaddresschange.label4.caption\nmsgctxt \"tformaddresschange.label4.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tformaddresschange.label5.caption\nmsgctxt \"tformaddresschange.label5.caption\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tformaddresschange.label6.caption\nmsgctxt \"tformaddresschange.label6.caption\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tformaddresschange.label7.caption\nmsgctxt \"tformaddresschange.label7.caption\"\nmsgid \"3\"\nmsgstr \"3\"\n\n#: tformaddresschange.label8.caption\nmsgctxt \"tformaddresschange.label8.caption\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tformaddresschange.label9.caption\nmsgctxt \"tformaddresschange.label9.caption\"\nmsgid \"5\"\nmsgstr \"5\"\n\n#: tformaddresschange.labeladdress.caption\nmsgctxt \"tformaddresschange.labeladdress.caption\"\nmsgid \"Address:\"\nmsgstr \"地址：\"\n\n#: tformaddresschange.labeldescription.caption\nmsgctxt \"tformaddresschange.labeldescription.caption\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: tformaddresschange.labeltype.caption\nmsgctxt \"tformaddresschange.labeltype.caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: tformaddresschange.lengthlabel.caption\nmsgctxt \"tformaddresschange.lengthlabel.caption\"\nmsgid \"Length\"\nmsgstr \"长度\"\n\n#: tformaddresschange.miaddaddresstolist.caption\nmsgctxt \"tformaddresschange.miaddaddresstolist.caption\"\nmsgid \"Add this address to the list\"\nmsgstr \"将此地址添加到列表\"\n\n#: tformaddresschange.micopy.caption\nmsgctxt \"tformaddresschange.micopy.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tformaddresschange.micopyaddresstoclipboard.caption\nmsgctxt \"tformaddresschange.micopyaddresstoclipboard.caption\"\nmsgid \"Copy this address to Clipboard\"\nmsgstr \"将此地址复制到剪贴板\"\n\n#: tformaddresschange.micopyfinaladdresstoclipboard.caption\nmsgctxt \"tformaddresschange.micopyfinaladdresstoclipboard.caption\"\nmsgid \"Copy this address to Clipboard\"\nmsgstr \"将此地址复制到剪贴板\"\n\n#: tformaddresschange.micut.caption\nmsgctxt \"tformaddresschange.micut.caption\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: tformaddresschange.mipaste.caption\nmsgctxt \"tformaddresschange.mipaste.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tformaddresschange.miremoveoffset.caption\nmsgctxt \"tformaddresschange.miremoveoffset.caption\"\nmsgid \"Remove Offset\"\nmsgstr \"移除偏移量\"\n\n#: tformdebugstrings.button1.caption\nmsgctxt \"tformdebugstrings.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformdebugstrings.caption\nmsgctxt \"tformdebugstrings.caption\"\nmsgid \"Debug strings\"\nmsgstr \"调试字符串\"\n\n#: tformdesigner.calendar.caption\nmsgctxt \"tformdesigner.calendar.caption\"\nmsgid \"Calendar\"\nmsgstr \"日历\"\n\n#: tformdesigner.calendar.hint\nmsgctxt \"tformdesigner.calendar.hint\"\nmsgid \"Calendar\"\nmsgstr \"日历\"\n\n#: tformdesigner.caption\nmsgctxt \"tformdesigner.caption\"\nmsgid \"Form Designer\"\nmsgstr \"表单设计器\"\n\n#: tformdesigner.cecustombutton.caption\nmsgctxt \"tformdesigner.cecustombutton.caption\"\nmsgid \"CECustomButton\"\nmsgstr \"CECustomButton\"\n\n#: tformdesigner.cecustombutton.hint\nmsgctxt \"tformdesigner.cecustombutton.hint\"\nmsgid \"CECustomButton\"\nmsgstr \"CECustomButton\"\n\n#: tformdesigner.ceedit.hint\nmsgctxt \"tformdesigner.ceedit.hint\"\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: tformdesigner.ceimage.hint\nmsgctxt \"tformdesigner.ceimage.hint\"\nmsgid \"Image\"\nmsgstr \"图像\"\n\n#: tformdesigner.checklistbox.caption\nmsgctxt \"tformdesigner.checklistbox.caption\"\nmsgid \"CheckListBox\"\nmsgstr \"复选框\"\n\n#: tformdesigner.checklistbox.hint\nmsgctxt \"tformdesigner.checklistbox.hint\"\nmsgid \"CheckListBox\"\nmsgstr \"复选框\"\n\n#: tformdesigner.colorbox.caption\nmsgctxt \"tformdesigner.colorbox.caption\"\nmsgid \"ColorBox\"\nmsgstr \"颜色框\"\n\n#: tformdesigner.colorbox.hint\nmsgctxt \"tformdesigner.colorbox.hint\"\nmsgid \"ColorBox\"\nmsgstr \"颜色框\"\n\n#: tformdesigner.finddialog.caption\nmsgctxt \"tformdesigner.finddialog.caption\"\nmsgid \"FindDialog\"\nmsgstr \"查找对话框\"\n\n#: tformdesigner.finddialog.hint\nmsgctxt \"tformdesigner.finddialog.hint\"\nmsgid \"FindDialog\"\nmsgstr \"查找对话框\"\n\n#: tformdesigner.mainmenu.caption\nmsgctxt \"tformdesigner.mainmenu.caption\"\nmsgid \"MainMenu\"\nmsgstr \"主菜单\"\n\n#: tformdesigner.mainmenu.hint\nmsgctxt \"tformdesigner.mainmenu.hint\"\nmsgid \"MainMenu\"\nmsgstr \"主菜单\"\n\n#: tformdesigner.menuitem1.caption\nmsgctxt \"tformdesigner.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tformdesigner.mianchoreditor.caption\nmsgctxt \"tformdesigner.mianchoreditor.caption\"\nmsgid \"Anchor Editor\"\nmsgstr \"锚点编辑器\"\n\n#: tformdesigner.mianchoreditor2.caption\nmsgctxt \"tformdesigner.mianchoreditor2.caption\"\nmsgid \"Anchor Editor\"\nmsgstr \"锚点编辑器\"\n\n#: tformdesigner.midelete.caption\nmsgctxt \"tformdesigner.midelete.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tformdesigner.miload.caption\nmsgctxt \"tformdesigner.miload.caption\"\nmsgid \"Load\"\nmsgstr \"加载\"\n\n#: tformdesigner.misave.caption\nmsgctxt \"tformdesigner.misave.caption\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: tformdesigner.popupmenu.caption\nmsgctxt \"tformdesigner.popupmenu.caption\"\nmsgid \"PopupMenu\"\nmsgstr \"弹出菜单\"\n\n#: tformdesigner.popupmenu.hint\nmsgctxt \"tformdesigner.popupmenu.hint\"\nmsgid \"PopupMenu\"\nmsgstr \"弹出菜单\"\n\n#: tformdesigner.radiobutton.caption\nmsgctxt \"tformdesigner.radiobutton.caption\"\nmsgid \"RadioButton\"\nmsgstr \"单选按钮\"\n\n#: tformdesigner.radiobutton.hint\nmsgctxt \"tformdesigner.radiobutton.hint\"\nmsgid \"RadioButton\"\nmsgstr \"单选按钮\"\n\n#: tformdesigner.scrollbox.caption\nmsgctxt \"tformdesigner.scrollbox.caption\"\nmsgid \"ScrollBox\"\nmsgstr \"滚动框\"\n\n#: tformdesigner.scrollbox.hint\nmsgctxt \"tformdesigner.scrollbox.hint\"\nmsgid \"ScrollBox\"\nmsgstr \"滚动框\"\n\n#: tformdesigner.selectdirectorydialog.caption\nmsgctxt \"tformdesigner.selectdirectorydialog.caption\"\nmsgid \"SelectDirectoryDialog\"\nmsgstr \"选择目录对话框\"\n\n#: tformdesigner.selectdirectorydialog.hint\nmsgctxt \"tformdesigner.selectdirectorydialog.hint\"\nmsgid \"SelectDirectoryDialog\"\nmsgstr \"选择目录对话框\"\n\n#: tformdesigner.toolbutton1.caption\nmsgctxt \"tformdesigner.toolbutton1.caption\"\nmsgid \"ToolButton1\"\nmsgstr \"工具按钮1\"\n\n#: tformdifferentbitsize.button1.caption\nmsgctxt \"tformdifferentbitsize.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformfoundcodelistextra.button1.caption\nmsgctxt \"tformfoundcodelistextra.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformfoundcodelistextra.label1.caption\nmsgctxt \"tformfoundcodelistextra.label1.caption\"\nmsgid \"Label1\"\nmsgstr \"标签1\"\n\n#: tformfoundcodelistextra.label3.caption\nmsgctxt \"tformfoundcodelistextra.label3.caption\"\nmsgid \"Label3\"\nmsgstr \"标签3\"\n\n#: tformfoundcodelistextra.label4.caption\nmsgctxt \"tformfoundcodelistextra.label4.caption\"\nmsgid \"Label4\"\nmsgstr \"标签4\"\n\n#: tformfoundcodelistextra.sbshowfloats.caption\nmsgctxt \"tformfoundcodelistextra.sbshowfloats.caption\"\nmsgid \"F\"\nmsgstr \"F\"\n\n#: tformfoundcodelistextra.sbshowfloats.hint\nmsgctxt \"tformfoundcodelistextra.sbshowfloats.hint\"\nmsgid \"Floating point registers\"\nmsgstr \"浮点寄存器\"\n\n#: tformfoundcodelistextra.sbshowipt.hint\nmsgctxt \"tformfoundcodelistextra.sbshowipt.hint\"\nmsgid \"Stack view\"\nmsgstr \"堆栈视图\"\n\n#: tformfoundcodelistextra.sbshowstack.caption\nmsgctxt \"tformfoundcodelistextra.sbshowstack.caption\"\nmsgid \"S\"\nmsgstr \"S\"\n\n#: tformfoundcodelistextra.sbshowstack.hint\nmsgctxt \"tformfoundcodelistextra.sbshowstack.hint\"\nmsgid \"Stack view\"\nmsgstr \"堆栈视图\"\n\n#: tformhotkey.button1.caption\nmsgctxt \"tformhotkey.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformhotkey.button2.caption\nmsgctxt \"tformhotkey.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tformmemoryregions.button1.caption\nmsgctxt \"tformmemoryregions.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformmemoryregions.caption\nmsgctxt \"tformmemoryregions.caption\"\nmsgid \"Memory regions\"\nmsgstr \"内存区域\"\n\n#: tformmemoryregions.listview1.columns[0].caption\nmsgctxt \"tformmemoryregions.listview1.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tformmemoryregions.listview1.columns[3].caption\nmsgctxt \"tformmemoryregions.listview1.columns[3].caption\"\nmsgid \"Protect\"\nmsgstr \"保护\"\n\n#: tformmemoryregions.listview1.columns[4].caption\nmsgctxt \"tformmemoryregions.listview1.columns[4].caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: tformmemoryregions.listview1.columns[5].caption\nmsgctxt \"tformmemoryregions.listview1.columns[5].caption\"\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: tformmemoryregions.listview1.columns[6].caption\nmsgctxt \"tformmemoryregions.listview1.columns[6].caption\"\nmsgid \"Extra\"\nmsgstr \"额外\"\n\n#: tformsettings.assembler.caption\nmsgctxt \"tformsettings.assembler.caption\"\nmsgid \"Debugger Options\"\nmsgstr \"调试器选项\"\n\n#: tformsettings.btncancel.caption\nmsgctxt \"tformsettings.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tformsettings.btnok.caption\nmsgctxt \"tformsettings.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tformsettings.btnsetfont.caption\nmsgctxt \"tformsettings.btnsetfont.caption\"\nmsgid \"Set Font\"\nmsgstr \"设置字体\"\n\n#: tformsettings.btntooldelete.caption\nmsgctxt \"tformsettings.btntooldelete.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tformsettings.btntoolnew.caption\nmsgctxt \"tformsettings.btntoolnew.caption\"\nmsgid \"New\"\nmsgstr \"新建\"\n\n#: tformsettings.button5.caption\nmsgctxt \"tformsettings.button5.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tformsettings.cballbyte.caption\nmsgctxt \"tformsettings.cballbyte.caption\"\nmsgid \"Byte\"\nmsgstr \"字节\"\n\n#: tformsettings.cballcustom.caption\nmsgctxt \"tformsettings.cballcustom.caption\"\nmsgid \"All Custom Types\"\nmsgstr \"所有自定义类型\"\n\n#: tformsettings.cballdouble.caption\nmsgctxt \"tformsettings.cballdouble.caption\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: tformsettings.cballdword.caption\nmsgctxt \"tformsettings.cballdword.caption\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tformsettings.cballocsaddtowatchedregions.caption\nmsgctxt \"tformsettings.cballocsaddtowatchedregions.caption\"\nmsgid \"Automatically add allocated memory by CE as watched regions\"\nmsgstr \"自动将 CE 分配的内存添加为监视区域\"\n\n#: tformsettings.cballqword.caption\nmsgctxt \"tformsettings.cballqword.caption\"\nmsgid \"8 Bytes\"\nmsgstr \"8 字节\"\n\n#: tformsettings.cballsingle.caption\nmsgctxt \"tformsettings.cballsingle.caption\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: tformsettings.cballword.caption\nmsgctxt \"tformsettings.cballword.caption\"\nmsgid \"2 Bytes\"\nmsgstr \"2 字节\"\n\n#: tformsettings.cbclearsymbolsonprocessopen.caption\nmsgctxt \"tformsettings.cbclearsymbolsonprocessopen.caption\"\nmsgid \"Clear all symbols when a new process is opened\"\nmsgstr \"打开新进程时清除所有符号\"\n\n#: tformsettings.cbdontdeletesymbols.caption\nmsgctxt \"tformsettings.cbdontdeletesymbols.caption\"\nmsgid \"Don't delete symbols when synchronizing\"\nmsgstr \"同步时不删除符号\"\n\n#: tformsettings.cbdontdeletesymbols.hint\nmsgctxt \"tformsettings.cbdontdeletesymbols.hint\"\nmsgid \"\"\n\"When synchronizing and another CE instance has updated the symbols of the current process, only load new symbols, don't \"\n\"delete symbols that got removed\"\nmsgstr \"在同步时，如果另一个 CE 实例更新了当前进程的符号，仅加载新符号，不删除已移除的符号\"\n\n#: tformsettings.cbgdbwritecode.hint\nmsgctxt \"tformsettings.cbgdbwritecode.hint\"\nmsgid \"Use this in case the target JIT's code to native code\"\nmsgstr \"在目标 JIT 的代码转换为本机代码时使用此选项\"\n\n#: tformsettings.cbgdbwritecode2.hint\nmsgctxt \"tformsettings.cbgdbwritecode2.hint\"\nmsgid \"Use this in case the target JIT's code to native code\"\nmsgstr \"在目标 JIT 的代码转换为本机代码时使用此选项\"\n\n#: tformsettings.cbkernelopenprocess.caption\nmsgctxt \"tformsettings.cbkernelopenprocess.caption\"\nmsgid \"Open Process\"\nmsgstr \"打开进程\"\n\n#: tformsettings.cbsymbolsyncinterval.caption\nmsgctxt \"tformsettings.cbsymbolsyncinterval.caption\"\nmsgid \"Synchronize every few seconds\"\nmsgstr \"每隔几秒同步\"\n\n#: tformsettings.cbsymbolsyncinterval.hint\nmsgctxt \"tformsettings.cbsymbolsyncinterval.hint\"\nmsgid \"\"\n\"When checked the symbols will be synchronized with other CE instances every few seconds. When not checked, only when a \"\n\"CE instance gets closed or a different process gets opened\"\nmsgstr \"选中时，符号将每隔几秒与其他 CE 实例同步。未选中时，仅在 CE 实例关闭或打开不同进程时同步\"\n\n#: tformsettings.cbsynchronizesymbols.caption\nmsgctxt \"tformsettings.cbsynchronizesymbols.caption\"\nmsgid \"Synchronize symbols\"\nmsgstr \"同步符号\"\n\n#: tformsettings.cbsynchronizesymbols.hint\nmsgctxt \"tformsettings.cbsynchronizesymbols.hint\"\nmsgid \"\"\n\"Share symbollists with other CE instances that have the same process open, and remember them when closing and reopening \"\n\"CE\"\nmsgstr \"与其他打开相同进程的 CE 实例共享符号列表，并在关闭和重新打开 CE 时记住它们\"\n\n#: tformsettings.cbusevehdebugger.caption\nmsgctxt \"tformsettings.cbusevehdebugger.caption\"\nmsgid \"VEH Debugger\"\nmsgstr \"VEH 调试器\"\n\n#: tformsettings.combothreadpriority.text\nmsgctxt \"tformsettings.combothreadpriority.text\"\nmsgid \"Higher\"\nmsgstr \"更高\"\n\n#: tformsettings.default1.caption\nmsgctxt \"tformsettings.default1.caption\"\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: tformsettings.editfreezeinterval.text\nmsgctxt \"tformsettings.editfreezeinterval.text\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tformsettings.editupdatefoundinterval.text\nmsgctxt \"tformsettings.editupdatefoundinterval.text\"\nmsgid \"1000\"\nmsgstr \"1000\"\n\n#: tformsettings.editupdateinterval.text\nmsgctxt \"tformsettings.editupdateinterval.text\"\nmsgid \"500\"\nmsgstr \"500\"\n\n#: tformsettings.edtdefault.text\nmsgctxt \"tformsettings.edtdefault.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tformsettings.edtgdbport.text\nmsgctxt \"tformsettings.edtgdbport.text\"\nmsgid \"33453\"\nmsgstr \"33453\"\n\n#: tformsettings.edtrepeatdelay.text\nmsgctxt \"tformsettings.edtrepeatdelay.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tformsettings.edtrosettadebugserverport.text\nmsgctxt \"tformsettings.edtrosettadebugserverport.text\"\nmsgid \"33453\"\nmsgstr \"33453\"\n\n#: tformsettings.edtstacksize.text\nmsgctxt \"tformsettings.edtstacksize.text\"\nmsgid \"4096\"\nmsgstr \"4096\"\n\n#: tformsettings.edtsymbolsynctimer.text\nmsgctxt \"tformsettings.edtsymbolsynctimer.text\"\nmsgid \"10\"\nmsgstr \"10\"\n\n#: tformsettings.edtwritelogsize.text\nmsgctxt \"tformsettings.edtwritelogsize.text\"\nmsgid \"250\"\nmsgstr \"250\"\n\n#: tformsettings.extra.caption\nmsgctxt \"tformsettings.extra.caption\"\nmsgid \"Extra\"\nmsgstr \"额外\"\n\n#: tformsettings.generalsettings.caption\nmsgctxt \"tformsettings.generalsettings.caption\"\nmsgid \"General Settings\"\nmsgstr \"常规设置\"\n\n#: tformsettings.label11.caption\nmsgctxt \"tformsettings.label11.caption\"\nmsgid \"ms\"\nmsgstr \"毫秒\"\n\n#: tformsettings.label12.caption\nmsgctxt \"tformsettings.label12.caption\"\nmsgid \"ms\"\nmsgstr \"毫秒\"\n\n#: tformsettings.label13.caption\nmsgctxt \"tformsettings.label13.caption\"\nmsgid \"Update interval\"\nmsgstr \"更新间隔\"\n\n#: tformsettings.label16.caption\nmsgctxt \"tformsettings.label16.caption\"\nmsgid \"When a table has a lua script, execute it:\"\nmsgstr \"当表中有 lua 脚本时，执行它：\"\n\n#: tformsettings.label17.caption\nmsgctxt \"tformsettings.label17.caption\"\nmsgid \"Seconds\"\nmsgstr \"秒\"\n\n#: tformsettings.label19.caption\nmsgctxt \"tformsettings.label19.caption\"\nmsgid \"ms\"\nmsgstr \"毫秒\"\n\n#: tformsettings.label25.caption\nmsgctxt \"tformsettings.label25.caption\"\nmsgid \"ms\"\nmsgstr \"毫秒\"\n\n#: tformsettings.label27.caption\nmsgctxt \"tformsettings.label27.caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tformsettings.label7.caption\nmsgctxt \"tformsettings.label7.caption\"\nmsgid \"Bytes\"\nmsgstr \"字节\"\n\n#: tformsettings.label8.caption\nmsgctxt \"tformsettings.label8.caption\"\nmsgid \"Max log size (nr of entries)\"\nmsgstr \"最大日志大小（条目数）\"\n\n#: tformsettings.languages.caption\nmsgctxt \"tformsettings.languages.caption\"\nmsgid \"Languages\"\nmsgstr \"语言\"\n\n#: tformsettings.lblrosettaport.caption\nmsgctxt \"tformsettings.lblrosettaport.caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tformsettings.lbltoolsname.caption\nmsgctxt \"tformsettings.lbltoolsname.caption\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#: tformsettings.lvtools.columns[0].caption\nmsgctxt \"tformsettings.lvtools.columns[0].caption\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#: tformsettings.menuitem1.caption\nmsgctxt \"tformsettings.menuitem1.caption\"\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n#: tformsettings.miluaexecalways.caption\nmsgctxt \"tformsettings.miluaexecalways.caption\"\nmsgid \"Always\"\nmsgstr \"始终\"\n\n#: tformsettings.miluaexecask.caption\nmsgctxt \"tformsettings.miluaexecask.caption\"\nmsgid \"Always ask\"\nmsgstr \"始终询问\"\n\n#: tformsettings.miluaexecnever.caption\nmsgctxt \"tformsettings.miluaexecnever.caption\"\nmsgid \"Never\"\nmsgstr \"从不\"\n\n#: tformsettings.miluaexecsignedonly.caption\nmsgctxt \"tformsettings.miluaexecsignedonly.caption\"\nmsgid \"Only when signed, else ask\"\nmsgstr \"仅在签名时，否则询问\"\n\n#: tformsettings.miunexpectedbreakpointsbreak.caption\nmsgctxt \"tformsettings.miunexpectedbreakpointsbreak.caption\"\nmsgid \"Break\"\nmsgstr \"中断\"\n\n#: tformsettings.plugins.caption\nmsgctxt \"tformsettings.plugins.caption\"\nmsgid \"Plugins\"\nmsgstr \"插件\"\n\n#: tformsettings.scansettings.caption\nmsgctxt \"tformsettings.scansettings.caption\"\nmsgid \"Scan Settings\"\nmsgstr \"扫描设置\"\n\n#: tformsettings.tsgdbdebug.caption\nmsgctxt \"tformsettings.tsgdbdebug.caption\"\nmsgid \"GDB Server\"\nmsgstr \"GDB 服务器\"\n\n#: tformsettings.tshotkeys.caption\nmsgctxt \"tformsettings.tshotkeys.caption\"\nmsgid \"Hotkeys\"\nmsgstr \"热键\"\n\n#: tformsettings.tslua.caption\nmsgctxt \"tformsettings.tslua.caption\"\nmsgid \"Lua\"\nmsgstr \"Lua\"\n\n#: tformsettings.tssymbols.caption\nmsgctxt \"tformsettings.tssymbols.caption\"\nmsgid \"Symbols\"\nmsgstr \"符号\"\n\n#: tformsettings.tsvehdebugconfig.caption\nmsgctxt \"tformsettings.tsvehdebugconfig.caption\"\nmsgid \"VEH Debugger\"\nmsgstr \"VEH 调试器\"\n\n#: tformsettings.unrandomizer.caption\nmsgctxt \"tformsettings.unrandomizer.caption\"\nmsgid \"Unrandomizer\"\nmsgstr \"去随机化器\"\n\n#: tfoundcodedialog.addtothecodelist1.caption\nmsgctxt \"tfoundcodedialog.addtothecodelist1.caption\"\nmsgid \"Add to the codelist\"\nmsgstr \"添加到代码列表\"\n\n#: tfoundcodedialog.btnaddtocodelist.caption\nmsgctxt \"tfoundcodedialog.btnaddtocodelist.caption\"\nmsgid \"Add to the codelist\"\nmsgstr \"添加到代码列表\"\n\n#: tfoundcodedialog.btnok.caption\nmsgctxt \"tfoundcodedialog.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfoundcodedialog.btnreplacewithnops.caption\nmsgctxt \"tfoundcodedialog.btnreplacewithnops.caption\"\nmsgid \"Replace\"\nmsgstr \"替换\"\n\n#: tfoundcodedialog.caption\nmsgctxt \"tfoundcodedialog.caption\"\nmsgid \"The following opcodes changed the selected address\"\nmsgstr \"以下操作码更改了所选地址\"\n\n#: tfoundcodedialog.copyselectiontoclipboard1.caption\nmsgctxt \"tfoundcodedialog.copyselectiontoclipboard1.caption\"\nmsgid \"Copy selection to clipboard\"\nmsgstr \"复制选择到剪贴板\"\n\n#: tfoundcodedialog.foundcodelist.columns[0].caption\nmsgctxt \"tfoundcodedialog.foundcodelist.columns[0].caption\"\nmsgid \"Count\"\nmsgstr \"计数\"\n\n#: tfoundcodedialog.foundcodelist.columns[1].caption\nmsgctxt \"tfoundcodedialog.foundcodelist.columns[1].caption\"\nmsgid \"Instruction\"\nmsgstr \"指令\"\n\n#: tfoundcodedialog.menuitem1.caption\nmsgctxt \"tfoundcodedialog.menuitem1.caption\"\nmsgid \"Select all\"\nmsgstr \"全选\"\n\n#: tfoundcodedialog.mifindwhatcodeaccesses.caption\nmsgctxt \"tfoundcodedialog.mifindwhatcodeaccesses.caption\"\nmsgid \"Find out what addresses this code accesses\"\nmsgstr \"找出此代码访问了哪些地址\"\n\n#: tfoundcodedialog.moreinfo1.caption\nmsgctxt \"tfoundcodedialog.moreinfo1.caption\"\nmsgid \"More Info\"\nmsgstr \"更多信息\"\n\n#: tframehotkeyconfig.btnexcludeprocesses.caption\nmsgctxt \"tframehotkeyconfig.btnexcludeprocesses.caption\"\nmsgid \"More...\"\nmsgstr \"更多...\"\n\n#: tframehotkeyconfig.button3.caption\nmsgctxt \"tframehotkeyconfig.button3.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tframehotkeyconfig.cbcenteronpopup.caption\nmsgctxt \"tframehotkeyconfig.cbcenteronpopup.caption\"\nmsgid \"Center Cheat Engine when bringing to front\"\nmsgstr \"将 Cheat Engine 居中显示在前面\"\n\n#: tframehotkeyconfig.cbhideallwindows.caption\nmsgctxt \"tframehotkeyconfig.cbhideallwindows.caption\"\nmsgid \"Hide some/all windows instead of trying to bring cheat engine to front\"\nmsgstr \"隐藏某些/所有窗口，而不是尝试将 Cheat Engine 显示在前面\"\n\n#: tframehotkeyconfig.edit4.text\nmsgctxt \"tframehotkeyconfig.edit4.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tframehotkeyconfig.edthotkeydelay.text\nmsgctxt \"tframehotkeyconfig.edthotkeydelay.text\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tframehotkeyconfig.edtkeypollinterval.text\nmsgctxt \"tframehotkeyconfig.edtkeypollinterval.text\"\nmsgid \"100\"\nmsgstr \"100\"\n\n#: tframehotkeyconfig.edtshspeed.text\nmsgctxt \"tframehotkeyconfig.edtshspeed.text\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tframehotkeyconfig.label2.caption\nmsgctxt \"tframehotkeyconfig.label2.caption\"\nmsgid \"Hotkey\"\nmsgstr \"热键\"\n\n#: tframehotkeyconfig.menuitem1.caption\nmsgctxt \"tframehotkeyconfig.menuitem1.caption\"\nmsgid \"Clear list\"\nmsgstr \"清除列表\"\n\n#: tfrmaaeditprefs.button1.caption\nmsgctxt \"tfrmaaeditprefs.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmaaeditprefs.button2.caption\nmsgctxt \"tfrmaaeditprefs.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmaaeditprefs.cbfontquality.hint\nmsgctxt \"tfrmaaeditprefs.cbfontquality.hint\"\nmsgid \"The font quality can impact speed\"\nmsgstr \"字体质量会影响速度\"\n\n#: tfrmaaeditprefs.edttabwidth.text\nmsgctxt \"tfrmaaeditprefs.edttabwidth.text\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tfrmaaeditprefs.label2.caption\nmsgctxt \"tfrmaaeditprefs.label2.caption\"\nmsgid \"Font quality\"\nmsgstr \"字体质量\"\n\n#: tfrmaccessedmemory.btnclearsmallsnapshot.caption\nmsgctxt \"tfrmaccessedmemory.btnclearsmallsnapshot.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmaccessedmemory.btnclearsmallsnapshot1.caption\nmsgctxt \"tfrmaccessedmemory.btnclearsmallsnapshot1.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmaccessedmemory.button1.caption\nmsgctxt \"tfrmaccessedmemory.button1.caption\"\nmsgid \"Set hotkeys\"\nmsgstr \"设置热键\"\n\n#: tfrmaccessedmemory.button2.caption\nmsgctxt \"tfrmaccessedmemory.button2.caption\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: tfrmaccessedmemory.button3.caption\nmsgctxt \"tfrmaccessedmemory.button3.caption\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tfrmaccessedmemory.menuitem4.caption\nmsgctxt \"tfrmaccessedmemory.menuitem4.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmaddtocodelist.button1.caption\nmsgctxt \"tfrmaddtocodelist.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmaddtocodelist.button2.caption\nmsgctxt \"tfrmaddtocodelist.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmaddtocodelist.caption\nmsgctxt \"tfrmaddtocodelist.caption\"\nmsgid \"Region to add\"\nmsgstr \"要添加的区域\"\n\n#: tfrmaddtocodelist.label1.caption\nmsgctxt \"tfrmaddtocodelist.label1.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmaddtocodelist.label2.caption\nmsgctxt \"tfrmaddtocodelist.label2.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfrmassemblyscan.btnok.caption\nmsgctxt \"tfrmassemblyscan.btnok.caption\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: tfrmassemblyscan.caption\nmsgctxt \"tfrmassemblyscan.caption\"\nmsgid \"Assembly scan\"\nmsgstr \"程序集扫描\"\n\n#: tfrmassemblyscan.lblfrom.caption\nmsgctxt \"tfrmassemblyscan.lblfrom.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmassemblyscan.lblinputassemblycode.caption\nmsgctxt \"tfrmassemblyscan.lblinputassemblycode.caption\"\nmsgid \"\"\n\"Input the assembly code to find. Wildcards supported:\\n\"\n\"* matches zero or more chars, ? matches exactly one char\\n\"\n\"^ matches the start and $ matches the end of line.\"\nmsgstr \"\"\n\"输入要查找的汇编代码。支持通配符：\\n\"\n\"* 匹配零个或多个字符，？匹配一个字符\\n\"\n\"^ 匹配行的开始，$ 匹配行的结束。\"\n\n#: tfrmassemblyscan.lblto.caption\nmsgctxt \"tfrmassemblyscan.lblto.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfrmautoinject.aapref1.caption\nmsgctxt \"tfrmautoinject.aapref1.caption\"\nmsgid \"Preferences\"\nmsgstr \"首选项\"\n\n#: tfrmautoinject.btnexecute.caption\nmsgctxt \"tfrmautoinject.btnexecute.caption\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: tfrmautoinject.close1.caption\nmsgctxt \"tfrmautoinject.close1.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmautoinject.file1.caption\nmsgctxt \"tfrmautoinject.file1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmautoinject.load1.caption\nmsgctxt \"tfrmautoinject.load1.caption\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#: tfrmautoinject.menuitem2.caption\nmsgctxt \"tfrmautoinject.menuitem2.caption\"\nmsgid \"Lua syntax highlighting preferences\"\nmsgstr \"Lua 语法高亮首选项\"\n\n#: tfrmautoinject.mi14bytejmp.caption\nmsgctxt \"tfrmautoinject.mi14bytejmp.caption\"\nmsgid \"14 Byte JMP (>2GB Distance)\"\nmsgstr \"14 字节 JMP (>2GB 距离)\"\n\n#: tfrmautoinject.mi5bytejmp.caption\nmsgctxt \"tfrmautoinject.mi5bytejmp.caption\"\nmsgid \"5 Byte JMP (<2GB Distance)\"\nmsgstr \"5 字节 JMP (<2GB 距离)\"\n\n#: tfrmautoinject.mifindnext.caption\nmsgctxt \"tfrmautoinject.mifindnext.caption\"\nmsgid \"Find Next\"\nmsgstr \"查找下一个\"\n\n#: tfrmautoinject.mifindprevious.caption\nmsgctxt \"tfrmautoinject.mifindprevious.caption\"\nmsgid \"Find Previous\"\nmsgstr \"查找上一个\"\n\n#: tfrmautoinject.minewwindow.caption\nmsgctxt \"tfrmautoinject.minewwindow.caption\"\nmsgid \"New Window\"\nmsgstr \"新窗口\"\n\n#: tfrmautoinject.miredo.caption\nmsgctxt \"tfrmautoinject.miredo.caption\"\nmsgid \"Redo\"\nmsgstr \"重做\"\n\n#: tfrmautoinject.mirenametab.caption\nmsgctxt \"tfrmautoinject.mirenametab.caption\"\nmsgid \"Rename\"\nmsgstr \"重命名\"\n\n#: tfrmautoinject.mireplace.caption\nmsgctxt \"tfrmautoinject.mireplace.caption\"\nmsgid \"Replace\"\nmsgstr \"替换\"\n\n#: tfrmautoinject.opendialog1.title\nmsgctxt \"tfrmautoinject.opendialog1.title\"\nmsgid \"Open CE assembly file\"\nmsgstr \"打开 CE 汇编文件\"\n\n#: tfrmautoinject.save1.caption\nmsgctxt \"tfrmautoinject.save1.caption\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: tfrmautoinject.saveas1.caption\nmsgctxt \"tfrmautoinject.saveas1.caption\"\nmsgid \"Save As...\"\nmsgstr \"另存为...\"\n\n#: tfrmautoinject.savedialog1.title\nmsgctxt \"tfrmautoinject.savedialog1.title\"\nmsgid \"Save CE assembly file\"\nmsgstr \"保存 CE 汇编文件\"\n\n#: tfrmautoinject.view1.caption\nmsgctxt \"tfrmautoinject.view1.caption\"\nmsgid \"View\"\nmsgstr \"查看\"\n\n#: tfrmbranchmapper.button2.caption\nmsgctxt \"tfrmbranchmapper.button2.caption\"\nmsgid \"Save results to file\"\nmsgstr \"将结果保存到文件\"\n\n#: tfrmbranchmapper.panel1.caption\nmsgctxt \"tfrmbranchmapper.panel1.caption\"\nmsgid \"Panel1\"\nmsgstr \"面板1\"\n\n#: tfrmbreakpointcondition.button1.caption\nmsgctxt \"tfrmbreakpointcondition.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmbreakpointcondition.button2.caption\nmsgctxt \"tfrmbreakpointcondition.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmbreakpointlist.listview1.columns[0].caption\nmsgctxt \"tfrmbreakpointlist.listview1.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmbreakpointlist.listview1.columns[1].caption\nmsgctxt \"tfrmbreakpointlist.listview1.columns[1].caption\"\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: tfrmbreakpointlist.listview1.columns[3].caption\nmsgctxt \"tfrmbreakpointlist.listview1.columns[3].caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: tfrmbreakpointlist.listview1.columns[5].caption\nmsgctxt \"tfrmbreakpointlist.listview1.columns[5].caption\"\nmsgid \"Active\"\nmsgstr \"活动\"\n\n#: tfrmbreakthread.button1.caption\nmsgctxt \"tfrmbreakthread.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmbreakthread.button2.caption\nmsgctxt \"tfrmbreakthread.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmcapturedtimers.button1.caption\nmsgctxt \"tfrmcapturedtimers.button1.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmcapturedtimers.edit1.text\nmsgctxt \"tfrmcapturedtimers.edit1.text\"\nmsgid \"10\"\nmsgstr \"10\"\n\n#: tfrmcapturedtimers.listview1.columns[5].caption\nmsgctxt \"tfrmcapturedtimers.listview1.columns[5].caption\"\nmsgid \"Count\"\nmsgstr \"计数\"\n\n#: tfrmchangedaddresses.browsethismemoryregion1.caption\nmsgctxt \"tfrmchangedaddresses.browsethismemoryregion1.caption\"\nmsgid \"Browse this memory region\"\nmsgstr \"浏览此内存区域\"\n\n#: tfrmchangedaddresses.cbdisplaytype.text\nmsgctxt \"tfrmchangedaddresses.cbdisplaytype.text\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tfrmchangedaddresses.changedlist.columns[0].caption\nmsgctxt \"tfrmchangedaddresses.changedlist.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmchangedaddresses.changedlist.columns[1].caption\nmsgctxt \"tfrmchangedaddresses.changedlist.columns[1].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tfrmchangedaddresses.changedlist.columns[2].caption\nmsgctxt \"tfrmchangedaddresses.changedlist.columns[2].caption\"\nmsgid \"Count\"\nmsgstr \"计数\"\n\n#: tfrmchangedaddresses.micbshowashexadecimal.caption\nmsgctxt \"tfrmchangedaddresses.micbshowashexadecimal.caption\"\nmsgid \"Show as hexadecimal\"\nmsgstr \"显示为十六进制\"\n\n#: tfrmchangedaddresses.micbshowassigned.caption\nmsgctxt \"tfrmchangedaddresses.micbshowassigned.caption\"\nmsgid \"Show as signed\"\nmsgstr \"显示为有符号\"\n\n#: tfrmchangedaddresses.michangevalue.caption\nmsgctxt \"tfrmchangedaddresses.michangevalue.caption\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: tfrmchangedaddresses.micopyaddresstoclipboard.caption\nmsgctxt \"tfrmchangedaddresses.micopyaddresstoclipboard.caption\"\nmsgid \"Copy address to clipboard\"\nmsgstr \"复制地址到剪贴板\"\n\n#: tfrmchangedaddresses.micopyvaluetoclipboard.caption\nmsgctxt \"tfrmchangedaddresses.micopyvaluetoclipboard.caption\"\nmsgid \"Copy value to clipboard\"\nmsgstr \"复制值到剪贴板\"\n\n#: tfrmchangedaddresses.misetfilter.caption\nmsgctxt \"tfrmchangedaddresses.misetfilter.caption\"\nmsgid \"Filter\"\nmsgstr \"过滤\"\n\n#: tfrmchangedaddresses.okbutton.caption\nmsgctxt \"tfrmchangedaddresses.okbutton.caption\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tfrmcodecavescanner.btnstart.caption\nmsgctxt \"tfrmcodecavescanner.btnstart.caption\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: tfrmcodecavescanner.label4.caption\nmsgctxt \"tfrmcodecavescanner.label4.caption\"\nmsgid \"                      \"\nmsgstr \"                      \"\n\n#: tfrmcodefilter.btncancel.caption\nmsgctxt \"tfrmcodefilter.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmcodefilter.btnshowlist.caption\nmsgctxt \"tfrmcodefilter.btnshowlist.caption\"\nmsgid \"Refresh list\"\nmsgstr \"刷新列表\"\n\n#: tfrmcodefilter.btnstart.caption\nmsgctxt \"tfrmcodefilter.btnstart.caption\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: tfrmcodefilter.btnstop.caption\nmsgctxt \"tfrmcodefilter.btnstop.caption\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tfrmcodefilter.caption\nmsgctxt \"tfrmcodefilter.caption\"\nmsgid \"Code Filter\"\nmsgstr \"代码过滤器\"\n\n#: tfrmcodefilter.lblexecutecount.caption\nmsgctxt \"tfrmcodefilter.lblexecutecount.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmcodefilter.lvresults.columns[0].caption\nmsgctxt \"tfrmcodefilter.lvresults.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmcodefilter.miclearlist.caption\nmsgctxt \"tfrmcodefilter.miclearlist.caption\"\nmsgid \"Clear list\"\nmsgstr \"清除列表\"\n\n#: tfrmcodefilter.panel1.caption\nmsgctxt \"tfrmcodefilter.panel1.caption\"\nmsgid \"Panel1\"\nmsgstr \"面板1\"\n\n#: tfrmcr3switcher.btnsetcr3.caption\nmsgctxt \"tfrmcr3switcher.btnsetcr3.caption\"\nmsgid \"Set\"\nmsgstr \"设置\"\n\n#: tfrmd3dhooksnapshotconfig.btnclearfullsnapshot.caption\nmsgctxt \"tfrmd3dhooksnapshotconfig.btnclearfullsnapshot.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmd3dhooksnapshotconfig.btnclearsmallsnapshot.caption\nmsgctxt \"tfrmd3dhooksnapshotconfig.btnclearsmallsnapshot.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmd3dhooksnapshotconfig.mbcancel.caption\nmsgctxt \"tfrmd3dhooksnapshotconfig.mbcancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmd3dhooksnapshotconfig.mbok.caption\nmsgctxt \"tfrmd3dhooksnapshotconfig.mbok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmd3dtrainergeneratoroptions.btnclear.caption\nmsgctxt \"tfrmd3dtrainergeneratoroptions.btnclear.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmd3dtrainergeneratoroptions.button3.caption\nmsgctxt \"tfrmd3dtrainergeneratoroptions.button3.caption\"\nmsgid \"Set Font\"\nmsgstr \"设置字体\"\n\n#: tfrmd3dtrainergeneratoroptions.button4.caption\nmsgctxt \"tfrmd3dtrainergeneratoroptions.button4.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmd3dtrainergeneratoroptions.edtdistancebetweenlines.text\nmsgctxt \"tfrmd3dtrainergeneratoroptions.edtdistancebetweenlines.text\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tfrmd3dtrainergeneratoroptions.edtdistancefromborder.text\nmsgctxt \"tfrmd3dtrainergeneratoroptions.edtdistancefromborder.text\"\nmsgid \"8\"\nmsgstr \"8\"\n\n#: tfrmd3dtrainergeneratoroptions.edtdistancefromtop.text\nmsgctxt \"tfrmd3dtrainergeneratoroptions.edtdistancefromtop.text\"\nmsgid \"8\"\nmsgstr \"8\"\n\n#: tfrmdbvmwatchconfig.button2.caption\nmsgctxt \"tfrmdbvmwatchconfig.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmdbvmwatchconfig.edtphysicaladdress.texthint\nmsgctxt \"tfrmdbvmwatchconfig.edtphysicaladdress.texthint\"\nmsgid \"Physical Address\"\nmsgstr \"物理地址\"\n\n#: tfrmdebuggerattachtimeout.caption\nmsgctxt \"tfrmdebuggerattachtimeout.caption\"\nmsgid \"Debugger attach timeout\"\nmsgstr \"调试器附加超时\"\n\n#: tfrmdebugsymbolstructurelist.btnsearch.caption\nmsgctxt \"tfrmdebugsymbolstructurelist.btnsearch.caption\"\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: tfrmdebugsymbolstructurelist.btnselect.caption\nmsgctxt \"tfrmdebugsymbolstructurelist.btnselect.caption\"\nmsgid \"Select\"\nmsgstr \"选择\"\n\n#: tfrmdebugsymbolstructurelist.lvstructlist.columns[0].caption\nmsgctxt \"tfrmdebugsymbolstructurelist.lvstructlist.columns[0].caption\"\nmsgid \"Structures\"\nmsgstr \"结构\"\n\n#: tfrmdisassemblyscan.btncancel.caption\nmsgctxt \"tfrmdisassemblyscan.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmdisassemblyscan.label1.caption\nmsgctxt \"tfrmdisassemblyscan.label1.caption\"\nmsgid \"                      \"\nmsgstr \"                      \"\n\n#: tfrmdisassemblyscan.menuitem2.caption\nmsgctxt \"tfrmdisassemblyscan.menuitem2.caption\"\nmsgid \"Copy selection to clipboard\"\nmsgstr \"复制选择到剪贴板\"\n\n#: tfrmdissectcode.btnstart.caption\nmsgctxt \"tfrmdissectcode.btnstart.caption\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: tfrmdissectcode.cbincludesystemmodules.caption\nmsgctxt \"tfrmdissectcode.cbincludesystemmodules.caption\"\nmsgid \"Include system modules\"\nmsgstr \"包含系统模块\"\n\n#: tfrmdissectcode.label6.caption\nmsgctxt \"tfrmdissectcode.label6.caption\"\nmsgid \"Estimated time left:\"\nmsgstr \"预计剩余时间：\"\n\n#: tfrmdissectcode.lblcalls.caption\nmsgctxt \"tfrmdissectcode.lblcalls.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmdissectcode.lblconditionaljumps.caption\nmsgctxt \"tfrmdissectcode.lblconditionaljumps.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmdissectcode.lblmaxoffset.caption\nmsgctxt \"tfrmdissectcode.lblmaxoffset.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmdissectcode.lblstringref.caption\nmsgctxt \"tfrmdissectcode.lblstringref.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmdissectcode.lblunconditionaljumps.caption\nmsgctxt \"tfrmdissectcode.lblunconditionaljumps.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmdissectcode.menuitem1.caption\nmsgctxt \"tfrmdissectcode.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmdissectcode.menuitem2.caption\nmsgctxt \"tfrmdissectcode.menuitem2.caption\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#: tfrmdissectcode.menuitem3.caption\nmsgctxt \"tfrmdissectcode.menuitem3.caption\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: tfrmdissectwindow.button1.caption\nmsgctxt \"tfrmdissectwindow.button1.caption\"\nmsgid \"More Info\"\nmsgstr \"更多信息\"\n\n#: tfrmdissectwindow.button5.caption\nmsgctxt \"tfrmdissectwindow.button5.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmdissectwindow.caption\nmsgctxt \"tfrmdissectwindow.caption\"\nmsgid \"Dissect Windows\"\nmsgstr \"解剖窗口\"\n\n#: tfrmdriverlist.button1.caption\nmsgctxt \"tfrmdriverlist.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmdriverlist.caption\nmsgctxt \"tfrmdriverlist.caption\"\nmsgid \"Driver list\"\nmsgstr \"驱动程序列表\"\n\n#: tfrmedithistory.button1.caption\nmsgctxt \"tfrmedithistory.button1.caption\"\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n#: tfrmedithistory.edtmaxwritelogsize.text\nmsgctxt \"tfrmedithistory.edtmaxwritelogsize.text\"\nmsgid \"250\"\nmsgstr \"250\"\n\n#: tfrmedithistory.label1.caption\nmsgctxt \"tfrmedithistory.label1.caption\"\nmsgid \"Max log size (nr of entries)\"\nmsgstr \"最大日志大小（条目数）\"\n\n#: tfrmedithistory.lvwritelog.columns[0].caption\nmsgctxt \"tfrmedithistory.lvwritelog.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmedithistory.miundo.caption\nmsgctxt \"tfrmedithistory.miundo.caption\"\nmsgid \"Undo\"\nmsgstr \"撤销\"\n\n#: tfrmenumeratedlls.button1.caption\nmsgctxt \"tfrmenumeratedlls.button1.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmenumeratedlls.find.caption\nmsgctxt \"tfrmenumeratedlls.find.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfrmenumeratedlls.label2.caption\nmsgctxt \"tfrmenumeratedlls.label2.caption\"\nmsgid \"Symbols\"\nmsgstr \"符号\"\n\n#: tfrmenumeratedlls.mifindnext.caption\nmsgctxt \"tfrmenumeratedlls.mifindnext.caption\"\nmsgid \"Find Next...\"\nmsgstr \"查找下一个...\"\n\n#: tfrmexceptionignorelist.midelete.caption\nmsgctxt \"tfrmexceptionignorelist.midelete.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tfrmexcludehide.button1.caption\nmsgctxt \"tfrmexcludehide.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmexcludehide.button2.caption\nmsgctxt \"tfrmexcludehide.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmexetrainergenerator.btngeneratetrainer.caption\nmsgctxt \"tfrmexetrainergenerator.btngeneratetrainer.caption\"\nmsgid \"Generate\"\nmsgstr \"生成\"\n\n#: tfrmexetrainergenerator.cbvehdebug.caption\nmsgctxt \"tfrmexetrainergenerator.cbvehdebug.caption\"\nmsgid \"VEH Debugger\"\nmsgstr \"VEH 调试器\"\n\n#: tfrmexetrainergenerator.combocompression.text\nmsgctxt \"tfrmexetrainergenerator.combocompression.text\"\nmsgid \"Max\"\nmsgstr \"最大\"\n\n#: tfrmexetrainergenerator.label1.caption\nmsgctxt \"tfrmexetrainergenerator.label1.caption\"\nmsgid \"Compression\"\nmsgstr \"压缩\"\n\n#: tfrmexetrainergenerator.listview1.columns[0].caption\nmsgctxt \"tfrmexetrainergenerator.listview1.columns[0].caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmfillmemory.button1.caption\nmsgctxt \"tfrmfillmemory.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmfillmemory.button2.caption\nmsgctxt \"tfrmfillmemory.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmfillmemory.edit3.text\nmsgctxt \"tfrmfillmemory.edit3.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmfillmemory.label1.caption\nmsgctxt \"tfrmfillmemory.label1.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmfillmemory.label2.caption\nmsgctxt \"tfrmfillmemory.label2.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfrmfinddialog.btnfind.caption\nmsgctxt \"tfrmfinddialog.btnfind.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfrmfinddialog.button1.caption\nmsgctxt \"tfrmfinddialog.button1.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmfinddialog.caption\nmsgctxt \"tfrmfinddialog.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfrmfinddialog.cbcasesensitive.caption\nmsgctxt \"tfrmfinddialog.cbcasesensitive.caption\"\nmsgid \"Case sensitive\"\nmsgstr \"区分大小写\"\n\n#: tfrmfinddialog.label1.caption\nmsgctxt \"tfrmfinddialog.label1.caption\"\nmsgid \"Text\"\nmsgstr \"文本\"\n\n#: tfrmfindstatics.button1.caption\nmsgctxt \"tfrmfindstatics.button1.caption\"\nmsgid \"Stopping...\"\nmsgstr \"停止中...\"\n\n#: tfrmfindstatics.caption\nmsgctxt \"tfrmfindstatics.caption\"\nmsgid \"Find static addresses\"\nmsgstr \"查找静态地址\"\n\n#: tfrmfindstatics.edit3.text\nmsgctxt \"tfrmfindstatics.edit3.text\"\nmsgid \"00400000\"\nmsgstr \"00400000\"\n\n#: tfrmfindstatics.edit4.text\nmsgctxt \"tfrmfindstatics.edit4.text\"\nmsgid \"7FFFFFFF\"\nmsgstr \"7FFFFFFF\"\n\n#: tfrmfindstatics.label1.caption\nmsgctxt \"tfrmfindstatics.label1.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmfindstatics.label2.caption\nmsgctxt \"tfrmfindstatics.label2.caption\"\nmsgid \"To:\"\nmsgstr \"到：\"\n\n#: tfrmfindstatics.label5.caption\nmsgctxt \"tfrmfindstatics.label5.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmfindstatics.label6.caption\nmsgctxt \"tfrmfindstatics.label6.caption\"\nmsgid \"To:\"\nmsgstr \"到：\"\n\n#: tfrmfindstatics.listview1.columns[0].caption\nmsgctxt \"tfrmfindstatics.listview1.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmfloatingpointpanel.cbdisplaytype.text\nmsgctxt \"tfrmfloatingpointpanel.cbdisplaytype.text\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: tfrmfoundlistpreferences.btncancel.caption\nmsgctxt \"tfrmfoundlistpreferences.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmfoundlistpreferences.btnok.caption\nmsgctxt \"tfrmfoundlistpreferences.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmfoundlistpreferences.label1.caption\nmsgctxt \"tfrmfoundlistpreferences.label1.caption\"\nmsgid \"Static\"\nmsgstr \"静态\"\n\n#: tfrmfoundlistpreferences.label5.caption\nmsgctxt \"tfrmfoundlistpreferences.label5.caption\"\nmsgid \"Changed value\"\nmsgstr \"更改的值\"\n\n#: tfrmfoundlistpreferences.label6.caption\nmsgctxt \"tfrmfoundlistpreferences.label6.caption\"\nmsgid \"Background color\"\nmsgstr \"背景颜色\"\n\n#: tfrmfoundlistpreferences.listview1.columns[0].caption\nmsgctxt \"tfrmfoundlistpreferences.listview1.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmfoundlistpreferences.listview1.columns[1].caption\nmsgctxt \"tfrmfoundlistpreferences.listview1.columns[1].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tfrmgdbserverconnectdialog.button1.caption\nmsgctxt \"tfrmgdbserverconnectdialog.button1.caption\"\nmsgid \"Connect\"\nmsgstr \"连接\"\n\n#: tfrmgdbserverconnectdialog.edit2.text\nmsgctxt \"tfrmgdbserverconnectdialog.edit2.text\"\nmsgid \"33453\"\nmsgstr \"33453\"\n\n#: tfrmgdbserverconnectdialog.label2.caption\nmsgctxt \"tfrmgdbserverconnectdialog.label2.caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tfrmgroupscanalgoritmgenerator.btncancel.caption\nmsgctxt \"tfrmgroupscanalgoritmgenerator.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmgroupscanalgoritmgenerator.btnok.caption\nmsgctxt \"tfrmgroupscanalgoritmgenerator.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmgroupscanalgoritmgenerator.caption\nmsgctxt \"tfrmgroupscanalgoritmgenerator.caption\"\nmsgid \"Generate groupscan command\"\nmsgstr \"生成组扫描命令\"\n\n#: tfrmgroupscanalgoritmgenerator.edtblockalignment.text\nmsgctxt \"tfrmgroupscanalgoritmgenerator.edtblockalignment.text\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tfrmheaps.button1.caption\nmsgctxt \"tfrmheaps.button1.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmheaps.listview1.columns[0].caption\nmsgctxt \"tfrmheaps.listview1.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmheaps.listview1.columns[1].caption\nmsgctxt \"tfrmheaps.listview1.columns[1].caption\"\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: tfrmhighlightereditor.button1.caption\nmsgctxt \"tfrmhighlightereditor.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmhighlightereditor.button2.caption\nmsgctxt \"tfrmhighlightereditor.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmhighlightereditor.label2.caption\nmsgctxt \"tfrmhighlightereditor.label2.caption\"\nmsgid \"Background Color\"\nmsgstr \"背景颜色\"\n\n#: tfrmiptlogdisplay.btnfetchall.caption\nmsgctxt \"tfrmiptlogdisplay.btnfetchall.caption\"\nmsgid \"Fetch All\"\nmsgstr \"获取所有\"\n\n#: tfrmiptlogdisplay.btnfetchmore.caption\nmsgctxt \"tfrmiptlogdisplay.btnfetchmore.caption\"\nmsgid \"Fetch more\"\nmsgstr \"获取更多\"\n\n#: tfrmiptlogdisplay.lblcount.caption\nmsgctxt \"tfrmiptlogdisplay.lblcount.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmiptlogdisplay.lvresults.columns[0].caption\nmsgctxt \"tfrmiptlogdisplay.lvresults.columns[0].caption\"\nmsgid \"Frequency\"\nmsgstr \"频率\"\n\n#: tfrmiptlogdisplay.lvresults.columns[1].caption\nmsgctxt \"tfrmiptlogdisplay.lvresults.columns[1].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmiptlogdisplay.lvresults.columns[2].caption\nmsgctxt \"tfrmiptlogdisplay.lvresults.columns[2].caption\"\nmsgid \"Instruction\"\nmsgstr \"指令\"\n\n#: tfrmiptlogdisplay.menuitem1.caption\nmsgctxt \"tfrmiptlogdisplay.menuitem1.caption\"\nmsgid \"Expand all\"\nmsgstr \"展开全部\"\n\n#: tfrmiptlogdisplay.menuitem2.caption\nmsgctxt \"tfrmiptlogdisplay.menuitem2.caption\"\nmsgid \"Collapse all\"\nmsgstr \"折叠全部\"\n\n#: tfrmiptlogdisplay.mifile.caption\nmsgctxt \"tfrmiptlogdisplay.mifile.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmiptlogdisplay.misavetofile.caption\nmsgctxt \"tfrmiptlogdisplay.misavetofile.caption\"\nmsgid \"Save to file\"\nmsgstr \"保存到文件\"\n\n#: tfrmloadmemory.button1.caption\nmsgctxt \"tfrmloadmemory.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmloadmemory.button2.caption\nmsgctxt \"tfrmloadmemory.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmloadmemory.button3.caption\nmsgctxt \"tfrmloadmemory.button3.caption\"\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: tfrmloadmemory.label1.caption\nmsgctxt \"tfrmloadmemory.label1.caption\"\nmsgid \"Address:\"\nmsgstr \"地址：\"\n\n#: tfrmluaengine.btnexecute.caption\nmsgctxt \"tfrmluaengine.btnexecute.caption\"\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: tfrmluaengine.caption\nmsgctxt \"tfrmluaengine.caption\"\nmsgid \"Lua Engine\"\nmsgstr \"Lua 引擎\"\n\n#: tfrmluaengine.groupbox1.caption\nmsgctxt \"tfrmluaengine.groupbox1.caption\"\nmsgid \"Output\"\nmsgstr \"输出\"\n\n#: tfrmluaengine.menuitem1.caption\nmsgctxt \"tfrmluaengine.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmluaengine.menuitem11.caption\nmsgctxt \"tfrmluaengine.menuitem11.caption\"\nmsgid \"New window\"\nmsgstr \"新窗口\"\n\n#: tfrmluaengine.menuitem15.caption\nmsgctxt \"tfrmluaengine.menuitem15.caption\"\nmsgid \"Lua syntax highlighting preferences\"\nmsgstr \"Lua 语法高亮偏好设置\"\n\n#: tfrmluaengine.micopy.caption\nmsgctxt \"tfrmluaengine.micopy.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tfrmluaengine.micut.caption\nmsgctxt \"tfrmluaengine.micut.caption\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: tfrmluaengine.midebug.caption\nmsgctxt \"tfrmluaengine.midebug.caption\"\nmsgid \"Debug\"\nmsgstr \"调试\"\n\n#: tfrmluaengine.mifind.caption\nmsgctxt \"tfrmluaengine.mifind.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfrmluaengine.mipaste.caption\nmsgctxt \"tfrmluaengine.mipaste.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tfrmluaengine.miredo.caption\nmsgctxt \"tfrmluaengine.miredo.caption\"\nmsgid \"Redo\"\nmsgstr \"重做\"\n\n#: tfrmluaengine.mirun.caption\nmsgctxt \"tfrmluaengine.mirun.caption\"\nmsgid \"Run\"\nmsgstr \"运行\"\n\n#: tfrmluaengine.misetbreakpoint.caption\nmsgctxt \"tfrmluaengine.misetbreakpoint.caption\"\nmsgid \"Set breakpoint\"\nmsgstr \"设置断点\"\n\n#: tfrmluaengine.miundo.caption\nmsgctxt \"tfrmluaengine.miundo.caption\"\nmsgid \"Undo\"\nmsgstr \"撤销\"\n\n#: tfrmluaengine.miview.caption\nmsgctxt \"tfrmluaengine.miview.caption\"\nmsgid \"View\"\nmsgstr \"查看\"\n\n#: tfrmluaengine.tbdebug.caption\nmsgctxt \"tfrmluaengine.tbdebug.caption\"\nmsgid \"tbDebug\"\nmsgstr \"tbDebug\"\n\n#: tfrmluaengine.tbstopdebug.hint\nmsgctxt \"tfrmluaengine.tbstopdebug.hint\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tfrmluaengine.toolbutton1.caption\nmsgctxt \"tfrmluaengine.toolbutton1.caption\"\nmsgid \"ToolButton1\"\nmsgstr \"工具按钮1\"\n\n#: tfrmluascriptquestion.button1.caption\nmsgctxt \"tfrmluascriptquestion.button1.caption\"\nmsgid \"Yes\"\nmsgstr \"是\"\n\n#: tfrmluascriptquestion.button2.caption\nmsgctxt \"tfrmluascriptquestion.button2.caption\"\nmsgid \"No\"\nmsgstr \"否\"\n\n#: tfrmluascriptquestion.label16.caption\nmsgctxt \"tfrmluascriptquestion.label16.caption\"\nmsgid \"When a table has a lua script, execute it:\"\nmsgstr \"当表有 Lua 脚本时，执行它：\"\n\n#: tfrmluascriptquestion.rbalways.caption\nmsgctxt \"tfrmluascriptquestion.rbalways.caption\"\nmsgid \"Always\"\nmsgstr \"总是\"\n\n#: tfrmluascriptquestion.rbalwaysask.caption\nmsgctxt \"tfrmluascriptquestion.rbalwaysask.caption\"\nmsgid \"Always ask\"\nmsgstr \"总是询问\"\n\n#: tfrmluascriptquestion.rbnever.caption\nmsgctxt \"tfrmluascriptquestion.rbnever.caption\"\nmsgid \"Never\"\nmsgstr \"从不\"\n\n#: tfrmluascriptquestion.rbsignedonly.caption\nmsgctxt \"tfrmluascriptquestion.rbsignedonly.caption\"\nmsgid \"Only when signed, else ask\"\nmsgstr \"仅在签名时询问，否则询问\"\n\n#: tfrmmemoryallochandler.label4.caption\nmsgctxt \"tfrmmemoryallochandler.label4.caption\"\nmsgid \"Size:\"\nmsgstr \"大小：\"\n\n#: tfrmmemoryallochandler.lblbaseaddress.caption\nmsgctxt \"tfrmmemoryallochandler.lblbaseaddress.caption\"\nmsgid \"xxxx\"\nmsgstr \"xxxx\"\n\n#: tfrmmemoryallochandler.lblflags.caption\nmsgctxt \"tfrmmemoryallochandler.lblflags.caption\"\nmsgid \"xxxx\"\nmsgstr \"xxxx\"\n\n#: tfrmmemoryallochandler.lblheaphandle.caption\nmsgctxt \"tfrmmemoryallochandler.lblheaphandle.caption\"\nmsgid \"xxxx\"\nmsgstr \"xxxx\"\n\n#: tfrmmemoryallochandler.lblsize.caption\nmsgctxt \"tfrmmemoryallochandler.lblsize.caption\"\nmsgid \"xxxx\"\nmsgstr \"xxxx\"\n\n#: tfrmmemoryrecorddropdownsettings.btncancel.caption\nmsgctxt \"tfrmmemoryrecorddropdownsettings.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmmemoryrecorddropdownsettings.btnok.caption\nmsgctxt \"tfrmmemoryrecorddropdownsettings.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmmemoryrecorddropdownsettings.copy1.caption\nmsgctxt \"tfrmmemoryrecorddropdownsettings.copy1.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tfrmmemoryrecorddropdownsettings.cut1.caption\nmsgctxt \"tfrmmemoryrecorddropdownsettings.cut1.caption\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: tfrmmemoryrecorddropdownsettings.paste1.caption\nmsgctxt \"tfrmmemoryrecorddropdownsettings.paste1.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tfrmmemoryrecorddropdownsettings.undo1.caption\nmsgctxt \"tfrmmemoryrecorddropdownsettings.undo1.caption\"\nmsgid \"Undo\"\nmsgstr \"撤销\"\n\n#: tfrmmemreccombobox.btncancel.caption\nmsgctxt \"tfrmmemreccombobox.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmmemreccombobox.btnok.caption\nmsgctxt \"tfrmmemreccombobox.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmmemreccombobox.caption\nmsgctxt \"tfrmmemreccombobox.caption\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: tfrmmemviewpreferences.button2.caption\nmsgctxt \"tfrmmemviewpreferences.button2.caption\"\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n#: tfrmmemviewpreferences.button3.caption\nmsgctxt \"tfrmmemviewpreferences.button3.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmmemviewpreferences.cbcolorgroup.text\nmsgctxt \"tfrmmemviewpreferences.cbcolorgroup.text\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: tfrmmemviewpreferences.cbfontquality.hint\nmsgctxt \"tfrmmemviewpreferences.cbfontquality.hint\"\nmsgid \"The font quality can impact speed\"\nmsgstr \"字体质量可能影响速度\"\n\n#: tfrmmemviewpreferences.cbfontquality.text\nmsgctxt \"tfrmmemviewpreferences.cbfontquality.text\"\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: tfrmmemviewpreferences.edthexspacebetweenlines.text\nmsgctxt \"tfrmmemviewpreferences.edthexspacebetweenlines.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmmemviewpreferences.edtjlspacing.text\nmsgctxt \"tfrmmemviewpreferences.edtjlspacing.text\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tfrmmemviewpreferences.edtjlthickness.text\nmsgctxt \"tfrmmemviewpreferences.edtjlthickness.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tfrmmemviewpreferences.edtspaceabovelines.text\nmsgctxt \"tfrmmemviewpreferences.edtspaceabovelines.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmmemviewpreferences.edtspacebelowlines.text\nmsgctxt \"tfrmmemviewpreferences.edtspacebelowlines.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmmemviewpreferences.groupbox1.caption\nmsgctxt \"tfrmmemviewpreferences.groupbox1.caption\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: tfrmmemviewpreferences.groupbox4.caption\nmsgctxt \"tfrmmemviewpreferences.groupbox4.caption\"\nmsgid \"Jumplines\"\nmsgstr \"跳行\"\n\n#: tfrmmemviewpreferences.groupbox5.caption\nmsgctxt \"tfrmmemviewpreferences.groupbox5.caption\"\nmsgid \"Space between lines\"\nmsgstr \"行间距\"\n\n#: tfrmmemviewpreferences.groupbox7.caption\nmsgctxt \"tfrmmemviewpreferences.groupbox7.caption\"\nmsgid \"Text\"\nmsgstr \"文本\"\n\n#: tfrmmemviewpreferences.label1.caption\nmsgctxt \"tfrmmemviewpreferences.label1.caption\"\nmsgid \"Font quality\"\nmsgstr \"字体质量\"\n\n#: tfrmmemviewpreferences.label3.caption\nmsgctxt \"tfrmmemviewpreferences.label3.caption\"\nmsgid \"Space between lines\"\nmsgstr \"行间距\"\n\n#: tfrmmemviewpreferences.lblcall.caption\nmsgctxt \"tfrmmemviewpreferences.lblcall.caption\"\nmsgid \"Call color\"\nmsgstr \"调用颜色\"\n\n#: tfrmmemviewpreferences.lblconditionaljump.caption\nmsgctxt \"tfrmmemviewpreferences.lblconditionaljump.caption\"\nmsgid \"Conditional jump color\"\nmsgstr \"条件跳转颜色\"\n\n#: tfrmmemviewpreferences.lblhex.caption\nmsgctxt \"tfrmmemviewpreferences.lblhex.caption\"\nmsgid \"Hexadecimal color\"\nmsgstr \"十六进制颜色\"\n\n#: tfrmmemviewpreferences.lblhexbreakpoint.caption\nmsgctxt \"tfrmmemviewpreferences.lblhexbreakpoint.caption\"\nmsgid \"Breakpoint\"\nmsgstr \"断点\"\n\n#: tfrmmemviewpreferences.lblhexhighlighted.caption\nmsgctxt \"tfrmmemviewpreferences.lblhexhighlighted.caption\"\nmsgid \"Highlighted\"\nmsgstr \"高亮\"\n\n#: tfrmmemviewpreferences.lblhexnormal.caption\nmsgctxt \"tfrmmemviewpreferences.lblhexnormal.caption\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: tfrmmemviewpreferences.lblhexstatic.caption\nmsgctxt \"tfrmmemviewpreferences.lblhexstatic.caption\"\nmsgid \"Static\"\nmsgstr \"静态\"\n\n#: tfrmmemviewpreferences.lblregister.caption\nmsgctxt \"tfrmmemviewpreferences.lblregister.caption\"\nmsgid \"Register color\"\nmsgstr \"寄存器颜色\"\n\n#: tfrmmemviewpreferences.lblsymbol.caption\nmsgctxt \"tfrmmemviewpreferences.lblsymbol.caption\"\nmsgid \"Symbol color\"\nmsgstr \"符号颜色\"\n\n#: tfrmmemviewpreferences.lblunconditionaljump.caption\nmsgctxt \"tfrmmemviewpreferences.lblunconditionaljump.caption\"\nmsgid \"Unconditional jump color\"\nmsgstr \"无条件跳转颜色\"\n\n#: tfrmmodifyregisters.button1.caption\nmsgctxt \"tfrmmodifyregisters.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmmodifyregisters.button2.caption\nmsgctxt \"tfrmmodifyregisters.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmmodifyregisters.edtpa.texthint\nmsgctxt \"tfrmmodifyregisters.edtpa.texthint\"\nmsgid \"Physical Address\"\nmsgstr \"物理地址\"\n\n#: tfrmmodifyregisters.lblflags.caption\nmsgctxt \"tfrmmodifyregisters.lblflags.caption\"\nmsgid \"Flags\"\nmsgstr \"标志\"\n\n#: tfrmmodulesafety.button1.caption\nmsgctxt \"tfrmmodulesafety.button1.caption\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: tfrmmodulesafety.button2.caption\nmsgctxt \"tfrmmodulesafety.button2.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmmodulesafety.remove1.caption\nmsgctxt \"tfrmmodulesafety.remove1.caption\"\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#: tfrmmultilineinputquery.button1.caption\nmsgctxt \"tfrmmultilineinputquery.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmmultilineinputquery.button2.caption\nmsgctxt \"tfrmmultilineinputquery.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmmultilineinputquery.lblprompt.caption\nmsgctxt \"tfrmmultilineinputquery.lblprompt.caption\"\nmsgid \"caption\"\nmsgstr \"标题\"\n\n#: tfrmnetworkconfig.btnconnect.caption\nmsgctxt \"tfrmnetworkconfig.btnconnect.caption\"\nmsgid \"Connect\"\nmsgstr \"连接\"\n\n#: tfrmnetworkconfig.button2.caption\nmsgctxt \"tfrmnetworkconfig.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmnetworkconfig.label1.caption\nmsgctxt \"tfrmnetworkconfig.label1.caption\"\nmsgid \"Host\"\nmsgstr \"主机\"\n\n#: tfrmnetworkconfig.label2.caption\nmsgctxt \"tfrmnetworkconfig.label2.caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tfrmnetworkconfig.lviplist.columns[1].caption\nmsgctxt \"tfrmnetworkconfig.lviplist.columns[1].caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tfrmnetworkconfig.midelete.caption\nmsgctxt \"tfrmnetworkconfig.midelete.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tfrmnetworkconfig.mirefresh.caption\nmsgctxt \"tfrmnetworkconfig.mirefresh.caption\"\nmsgid \"Refresh list\"\nmsgstr \"刷新列表\"\n\n#: tfrmpastetableentry.button1.caption\nmsgctxt \"tfrmpastetableentry.button1.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tfrmpastetableentry.button2.caption\nmsgctxt \"tfrmpastetableentry.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmpastetableentry.edtoffset.text\nmsgctxt \"tfrmpastetableentry.edtoffset.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmpastetableentry.edtpointerlastoffset.text\nmsgctxt \"tfrmpastetableentry.edtpointerlastoffset.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmpastetableentry.groupbox1.caption\nmsgctxt \"tfrmpastetableentry.groupbox1.caption\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: tfrmpastetableentry.groupbox2.caption\nmsgctxt \"tfrmpastetableentry.groupbox2.caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmpeinfo.button1.caption\nmsgctxt \"tfrmpeinfo.button1.caption\"\nmsgid \"Info\"\nmsgstr \"信息\"\n\n#: tfrmpeinfo.groupbox2.caption\nmsgctxt \"tfrmpeinfo.groupbox2.caption\"\nmsgid \"Info\"\nmsgstr \"信息\"\n\n#: tfrmpeinfo.label2.caption\nmsgctxt \"tfrmpeinfo.label2.caption\"\nmsgid \"address\"\nmsgstr \"地址\"\n\n#: tfrmpeinfo.radiobutton1.caption\nmsgctxt \"tfrmpeinfo.radiobutton1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmpeinfo.tabsheet1.caption\nmsgctxt \"tfrmpeinfo.tabsheet1.caption\"\nmsgid \"All\"\nmsgstr \"全部\"\n\n#: tfrmpointerscanner.btnstopscan.caption\nmsgctxt \"tfrmpointerscanner.btnstopscan.caption\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tfrmpointerscanner.caption\nmsgctxt \"tfrmpointerscanner.caption\"\nmsgid \"Pointer scan\"\nmsgstr \"指针扫描\"\n\n#: tfrmpointerscanner.cbpriority.text\nmsgctxt \"tfrmpointerscanner.cbpriority.text\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: tfrmpointerscanner.cbtype.text\nmsgctxt \"tfrmpointerscanner.cbtype.text\"\nmsgid \"4 Byte\"\nmsgstr \"4 字节\"\n\n#: tfrmpointerscanner.edtport.text\nmsgctxt \"tfrmpointerscanner.edtport.text\"\nmsgid \"52737\"\nmsgstr \"52737\"\n\n#: tfrmpointerscanner.file1.caption\nmsgctxt \"tfrmpointerscanner.file1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmpointerscanner.gbnetwork.caption\nmsgctxt \"tfrmpointerscanner.gbnetwork.caption\"\nmsgid \"Network\"\nmsgstr \"网络\"\n\n#: tfrmpointerscanner.lblip.caption\nmsgctxt \"tfrmpointerscanner.lblip.caption\"\nmsgid \"IP\"\nmsgstr \"IP\"\n\n#: tfrmpointerscanner.lblpassword.caption\nmsgctxt \"tfrmpointerscanner.lblpassword.caption\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: tfrmpointerscanner.lblport.caption\nmsgctxt \"tfrmpointerscanner.lblport.caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tfrmpointerscanner.lblprogressbar1.caption\nmsgctxt \"tfrmpointerscanner.lblprogressbar1.caption\"\nmsgid \"Generating pointermap\"\nmsgstr \"正在生成指针图\"\n\n#: tfrmpointerscanner.mihexadecimal.caption\nmsgctxt \"tfrmpointerscanner.mihexadecimal.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: tfrmpointerscanner.misigned.caption\nmsgctxt \"tfrmpointerscanner.misigned.caption\"\nmsgid \"Signed\"\nmsgstr \"有符号\"\n\n#: tfrmpointerscanner.new1.caption\nmsgctxt \"tfrmpointerscanner.new1.caption\"\nmsgid \"New\"\nmsgstr \"新建\"\n\n#: tfrmpointerscanner.open1.caption\nmsgctxt \"tfrmpointerscanner.open1.caption\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#: tfrmpointerscannersettings.btncancel.caption\nmsgctxt \"tfrmpointerscannersettings.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmpointerscannersettings.btnok.caption\nmsgctxt \"tfrmpointerscannersettings.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmpointerscannersettings.cbincludesystemmodules.caption\nmsgctxt \"tfrmpointerscannersettings.cbincludesystemmodules.caption\"\nmsgid \"Include system modules\"\nmsgstr \"包含系统模块\"\n\n#: tfrmpointerscannersettings.cblimitscantoregionfile.caption\nmsgctxt \"tfrmpointerscannersettings.cblimitscantoregionfile.caption\"\nmsgid \"Limit scan to specified region file\"\nmsgstr \"限制扫描到指定区域文件\"\n\n#: tfrmpointerscannersettings.cbuseloadedpointermap.caption\nmsgctxt \"tfrmpointerscannersettings.cbuseloadedpointermap.caption\"\nmsgid \"Use saved pointermap\"\nmsgstr \"使用保存的指针图\"\n\n#: tfrmpointerscannersettings.cbvaluetype.text\nmsgctxt \"tfrmpointerscannersettings.cbvaluetype.text\"\nmsgid \"4 Byte\"\nmsgstr \"4 字节\"\n\n#: tfrmpointerscannersettings.combobox1.text\nmsgctxt \"tfrmpointerscannersettings.combobox1.text\"\nmsgid \"Normal\"\nmsgstr \"正常\"\n\n#: tfrmpointerscannersettings.editmaxlevel.text\nmsgctxt \"tfrmpointerscannersettings.editmaxlevel.text\"\nmsgid \"7\"\nmsgstr \"7\"\n\n#: tfrmpointerscannersettings.edtdistributedport.text\nmsgctxt \"tfrmpointerscannersettings.edtdistributedport.text\"\nmsgid \"52737\"\nmsgstr \"52737\"\n\n#: tfrmpointerscannersettings.edtmaxoffsetspernode.text\nmsgctxt \"tfrmpointerscannersettings.edtmaxoffsetspernode.text\"\nmsgid \"3\"\nmsgstr \"3\"\n\n#: tfrmpointerscannersettings.edtreversestart.text\nmsgctxt \"tfrmpointerscannersettings.edtreversestart.text\"\nmsgid \"00000000\"\nmsgstr \"00000000\"\n\n#: tfrmpointerscannersettings.edtreversestop.text\nmsgctxt \"tfrmpointerscannersettings.edtreversestop.text\"\nmsgid \"7FFFFFFF\"\nmsgstr \"7FFFFFFF\"\n\n#: tfrmpointerscannersettings.edtstacksize.text\nmsgctxt \"tfrmpointerscannersettings.edtstacksize.text\"\nmsgid \"4096\"\nmsgstr \"4096\"\n\n#: tfrmpointerscannersettings.edtthreadcount.text\nmsgctxt \"tfrmpointerscannersettings.edtthreadcount.text\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tfrmpointerscannersettings.edtthreadstacks.text\nmsgctxt \"tfrmpointerscannersettings.edtthreadstacks.text\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tfrmpointerscannersettings.label1.caption\nmsgctxt \"tfrmpointerscannersettings.label1.caption\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: tfrmpointerscannersettings.label10.caption\nmsgctxt \"tfrmpointerscannersettings.label10.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmpointerscannersettings.label11.caption\nmsgctxt \"tfrmpointerscannersettings.label11.caption\"\nmsgid \"To:\"\nmsgstr \"到：\"\n\n#: tfrmpointerscannersettings.label2.caption\nmsgctxt \"tfrmpointerscannersettings.label2.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfrmpointerscannersettings.label4.caption\nmsgctxt \"tfrmpointerscannersettings.label4.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmpointerscannersettings.rbgeneratepointermap.caption\nmsgctxt \"tfrmpointerscannersettings.rbgeneratepointermap.caption\"\nmsgid \"Generate pointermap\"\nmsgstr \"生成指针图\"\n\n#: tfrmprocessinfo.button1.caption\nmsgctxt \"tfrmprocessinfo.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmprocesswatcher.caption\nmsgctxt \"tfrmprocesswatcher.caption\"\nmsgid \"Process watcher\"\nmsgstr \"进程监视器\"\n\n#: tfrmreferencedfunctions.caption\nmsgctxt \"tfrmreferencedfunctions.caption\"\nmsgid \"Referenced functions\"\nmsgstr \"引用函数\"\n\n#: tfrmreferencedfunctions.lvcalllist.columns[0].caption\nmsgctxt \"tfrmreferencedfunctions.lvcalllist.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmreferencedfunctions.lvcalllist.columns[1].caption\nmsgctxt \"tfrmreferencedfunctions.lvcalllist.columns[1].caption\"\nmsgid \"Refcount\"\nmsgstr \"引用计数\"\n\n#: tfrmreferencedfunctions.mifind.caption\nmsgctxt \"tfrmreferencedfunctions.mifind.caption\"\nmsgid \"Find...\"\nmsgstr \"查找...\"\n\n#: tfrmreferencedstrings.find1.caption\nmsgctxt \"tfrmreferencedstrings.find1.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfrmreferencedstrings.findnext1.caption\nmsgctxt \"tfrmreferencedstrings.findnext1.caption\"\nmsgid \"Find Next\"\nmsgstr \"查找下一个\"\n\n#: tfrmreferencedstrings.lvstringlist.columns[0].caption\nmsgctxt \"tfrmreferencedstrings.lvstringlist.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmreferencedstrings.lvstringlist.columns[1].caption\nmsgctxt \"tfrmreferencedstrings.lvstringlist.columns[1].caption\"\nmsgid \"Refcount\"\nmsgstr \"引用计数\"\n\n#: tfrmreferencedstrings.lvstringlist.columns[2].caption\nmsgctxt \"tfrmreferencedstrings.lvstringlist.columns[2].caption\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: tfrmreferencedstrings.lvstringlist.columns[3].caption\nmsgctxt \"tfrmreferencedstrings.lvstringlist.columns[3].caption\"\nmsgid \"String\"\nmsgstr \"字符串\"\n\n#: tfrmreferencedstrings.search1.caption\nmsgctxt \"tfrmreferencedstrings.search1.caption\"\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: tfrmrescanpointer.button1.caption\nmsgctxt \"tfrmrescanpointer.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmrescanpointer.button2.caption\nmsgctxt \"tfrmrescanpointer.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmrescanpointer.cbusesavedpointermap.caption\nmsgctxt \"tfrmrescanpointer.cbusesavedpointermap.caption\"\nmsgid \"Use saved pointermap\"\nmsgstr \"使用保存的指针图\"\n\n#: tfrmrescanpointer.cbvaluetype.text\nmsgctxt \"tfrmrescanpointer.cbvaluetype.text\"\nmsgid \"4 Byte\"\nmsgstr \"4 字节\"\n\n#: tfrmrescanpointer.edtdelay.text\nmsgctxt \"tfrmrescanpointer.edtdelay.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmrescanpointer.lbland.caption\nmsgctxt \"tfrmrescanpointer.lbland.caption\"\nmsgid \"and\"\nmsgstr \"和\"\n\n#: tfrmsavedisassembly.button1.caption\nmsgctxt \"tfrmsavedisassembly.button1.caption\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: tfrmsavedisassembly.caption\nmsgctxt \"tfrmsavedisassembly.caption\"\nmsgid \"Save disassembled output\"\nmsgstr \"保存反汇编输出\"\n\n#: tfrmsavedisassembly.cbaddress.caption\nmsgctxt \"tfrmsavedisassembly.cbaddress.caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmsavedisassembly.cbbytes.caption\nmsgctxt \"tfrmsavedisassembly.cbbytes.caption\"\nmsgid \"bytes\"\nmsgstr \"字节\"\n\n#: tfrmsavedisassembly.cbcomment.caption\nmsgctxt \"tfrmsavedisassembly.cbcomment.caption\"\nmsgid \"Comment\"\nmsgstr \"注释\"\n\n#: tfrmsavedisassembly.label1.caption\nmsgctxt \"tfrmsavedisassembly.label1.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmsavedisassembly.label2.caption\nmsgctxt \"tfrmsavedisassembly.label2.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfrmsavememoryregion.button1.caption\nmsgctxt \"tfrmsavememoryregion.button1.caption\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: tfrmsavememoryregion.button2.caption\nmsgctxt \"tfrmsavememoryregion.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmsavememoryregion.button3.caption\nmsgctxt \"tfrmsavememoryregion.button3.caption\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: tfrmsavememoryregion.label2.caption\nmsgctxt \"tfrmsavememoryregion.label2.caption\"\nmsgid \"From\"\nmsgstr \"从\"\n\n#: tfrmsavememoryregion.label3.caption\nmsgctxt \"tfrmsavememoryregion.label3.caption\"\nmsgid \"To\"\nmsgstr \"到\"\n\n#: tfrmsavememoryregion.miclearlist.caption\nmsgctxt \"tfrmsavememoryregion.miclearlist.caption\"\nmsgid \"Clear list\"\nmsgstr \"清除列表\"\n\n#: tfrmsavesnapshots.btndone.caption\nmsgctxt \"tfrmsavesnapshots.btndone.caption\"\nmsgid \"Done\"\nmsgstr \"完成\"\n\n#: tfrmsavesnapshots.lblselectall.caption\nmsgctxt \"tfrmsavesnapshots.lblselectall.caption\"\nmsgid \"Select all\"\nmsgstr \"全选\"\n\n#: tfrmselectionlist.label1.caption\nmsgctxt \"tfrmselectionlist.label1.caption\"\nmsgid \"caption\"\nmsgstr \"标题\"\n\n#: tfrmsetuppsnnode.btncancel.caption\nmsgctxt \"tfrmsetuppsnnode.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmsetuppsnnode.cbpriority.text\nmsgctxt \"tfrmsetuppsnnode.cbpriority.text\"\nmsgid \"Lower\"\nmsgstr \"较低\"\n\n#: tfrmsetuppsnnode.edtconnectport.text\nmsgctxt \"tfrmsetuppsnnode.edtconnectport.text\"\nmsgid \"52737\"\nmsgstr \"52737\"\n\n#: tfrmsetuppsnnode.edtport.text\nmsgctxt \"tfrmsetuppsnnode.edtport.text\"\nmsgid \"52737\"\nmsgstr \"52737\"\n\n#: tfrmsetuppsnnode.edtthreadcount.text\nmsgctxt \"tfrmsetuppsnnode.edtthreadcount.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmsetuppsnnode.label4.caption\nmsgctxt \"tfrmsetuppsnnode.label4.caption\"\nmsgid \"Seconds\"\nmsgstr \"秒\"\n\n#: tfrmsetuppsnnode.lblip.caption\nmsgctxt \"tfrmsetuppsnnode.lblip.caption\"\nmsgid \"IP\"\nmsgstr \"IP\"\n\n#: tfrmsetuppsnnode.lblpassword.caption\nmsgctxt \"tfrmsetuppsnnode.lblpassword.caption\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: tfrmsetuppsnnode.lblpasswordchild.caption\nmsgctxt \"tfrmsetuppsnnode.lblpasswordchild.caption\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: tfrmsetuppsnnode.lblpasswordparent.caption\nmsgctxt \"tfrmsetuppsnnode.lblpasswordparent.caption\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: tfrmsetuppsnnode.lblport.caption\nmsgctxt \"tfrmsetuppsnnode.lblport.caption\"\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: tfrmsnapshothandler.btncompare.caption\nmsgctxt \"tfrmsnapshothandler.btncompare.caption\"\nmsgid \"Compare\"\nmsgstr \"比较\"\n\n#: tfrmsnapshothandler.caption\nmsgctxt \"tfrmsnapshothandler.caption\"\nmsgid \"Snapshot handler\"\nmsgstr \"快照处理器\"\n\n#: tfrmsnapshothandler.menuitem1.caption\nmsgctxt \"tfrmsnapshothandler.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmsnapshothandler.menuitem8.caption\nmsgctxt \"tfrmsnapshothandler.menuitem8.caption\"\nmsgid \"Clear List\"\nmsgstr \"清除列表\"\n\n#: tfrmsnapshothandler.rbstack.caption\nmsgctxt \"tfrmsnapshothandler.rbstack.caption\"\nmsgid \"Stack\"\nmsgstr \"堆栈\"\n\n#: tfrmsortpointerlist.button1.caption\nmsgctxt \"tfrmsortpointerlist.button1.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmsortpointerlist.lbltimeleft.caption\nmsgctxt \"tfrmsortpointerlist.lbltimeleft.caption\"\nmsgid \"Estimated time left:\"\nmsgstr \"预计剩余时间：\"\n\n#: tfrmsourcedisplay.menuitem3.caption\nmsgctxt \"tfrmsourcedisplay.menuitem3.caption\"\nmsgid \"Run\"\nmsgstr \"运行\"\n\n#: tfrmsourcedisplay.menuitem4.caption\nmsgctxt \"tfrmsourcedisplay.menuitem4.caption\"\nmsgid \"Step Into\"\nmsgstr \"单步进入\"\n\n#: tfrmsourcedisplay.menuitem5.caption\nmsgctxt \"tfrmsourcedisplay.menuitem5.caption\"\nmsgid \"Step Over\"\nmsgstr \"单步跳过\"\n\n#: tfrmsourcedisplay.menuitem6.caption\nmsgctxt \"tfrmsourcedisplay.menuitem6.caption\"\nmsgid \"Step Out\"\nmsgstr \"单步退出\"\n\n#: tfrmsourcedisplay.tbdebug.caption\nmsgctxt \"tfrmsourcedisplay.tbdebug.caption\"\nmsgid \"tbDebug\"\nmsgstr \"tbDebug\"\n\n#: tfrmsourcedisplay.tbseparator1.caption\nmsgctxt \"tfrmsourcedisplay.tbseparator1.caption\"\nmsgid \"tbSeparator1\"\nmsgstr \"tbSeparator1\"\n\n#: tfrmsourcedisplay.tbseparator2.caption\nmsgctxt \"tfrmsourcedisplay.tbseparator2.caption\"\nmsgid \"tbSeparator2\"\nmsgstr \"tbSeparator2\"\n\n#: tfrmsourcedisplay.tbseparator3.caption\nmsgctxt \"tfrmsourcedisplay.tbseparator3.caption\"\nmsgid \"tbSeparator3\"\nmsgstr \"tbSeparator3\"\n\n#: tfrmstacktrace.caption\nmsgctxt \"tfrmstacktrace.caption\"\nmsgid \"Stacktrace\"\nmsgstr \"堆栈跟踪\"\n\n#: tfrmstacktrace.listview1.columns[1].caption\nmsgctxt \"tfrmstacktrace.listview1.columns[1].caption\"\nmsgid \"Stack\"\nmsgstr \"堆栈\"\n\n#: tfrmstacktrace.listview1.columns[4].caption\nmsgctxt \"tfrmstacktrace.listview1.columns[4].caption\"\nmsgid \"Parameters\"\nmsgstr \"参数\"\n\n#: tfrmstacktrace.refresh1.caption\nmsgctxt \"tfrmstacktrace.refresh1.caption\"\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n#: tfrmstackview.lvstack.columns[0].caption\nmsgctxt \"tfrmstackview.lvstack.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmstackview.lvstack.columns[1].caption\nmsgctxt \"tfrmstackview.lvstack.columns[1].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tfrmstackview.miaddebp.caption\nmsgctxt \"tfrmstackview.miaddebp.caption\"\nmsgid \"(ebp+*)\"\nmsgstr \"(ebp+*)\"\n\n#: tfrmstackview.miaddesp.caption\nmsgctxt \"tfrmstackview.miaddesp.caption\"\nmsgid \"(esp+*)\"\nmsgstr \"(esp+*)\"\n\n#: tfrmstackview.miaddref.caption\n#, object-pascal-format\nmsgctxt \"tfrmstackview.miaddref.caption\"\nmsgid \"(ref+*) Ref will be %x\"\nmsgstr \"(ref+*) 引用将是 %x\"\n\n#: tfrmstackview.mifind.caption\nmsgctxt \"tfrmstackview.mifind.caption\"\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: tfrmstackview.mifindnext.caption\nmsgctxt \"tfrmstackview.mifindnext.caption\"\nmsgid \"Find Next...\"\nmsgstr \"查找下一个...\"\n\n#: tfrmstringpointerscan.btnnewscan.caption\nmsgctxt \"tfrmstringpointerscan.btnnewscan.caption\"\nmsgid \"New Scan\"\nmsgstr \"新扫描\"\n\n#: tfrmstringpointerscan.btnscan.caption\nmsgctxt \"tfrmstringpointerscan.btnscan.caption\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: tfrmstringpointerscan.caption\nmsgctxt \"tfrmstringpointerscan.caption\"\nmsgid \"Structure spider\"\nmsgstr \"结构蜘蛛\"\n\n#: tfrmstringpointerscan.cbcasesensitive.caption\nmsgctxt \"tfrmstringpointerscan.cbcasesensitive.caption\"\nmsgid \"Case sensitive\"\nmsgstr \"区分大小写\"\n\n#: tfrmstringpointerscan.cbhasshadow.caption\nmsgctxt \"tfrmstringpointerscan.cbhasshadow.caption\"\nmsgid \"Has Shadow\"\nmsgstr \"有阴影\"\n\n#: tfrmstringpointerscan.cbhasshadow.hint\nmsgctxt \"tfrmstringpointerscan.cbhasshadow.hint\"\nmsgid \"\"\n\"Use this if you're spidering a previously saved memory region that currently resides in a different location.\\n\"\n\"Most commonly used for stacks where stack pointers point to it's own structure\"\nmsgstr \"如果你正在爬取一个之前保存的内存区域，并且当前位于不同的位置，请使用此选项。最常用于堆栈，其中堆栈指针指向其自身结构。\"\n\n#: tfrmstringpointerscan.cbhasshadow2.caption\nmsgctxt \"tfrmstringpointerscan.cbhasshadow2.caption\"\nmsgid \"Has Shadow\"\nmsgstr \"有阴影\"\n\n#: tfrmstringpointerscan.cbhasshadow2.hint\nmsgctxt \"tfrmstringpointerscan.cbhasshadow2.hint\"\nmsgid \"\"\n\"Use this if you're spidering a previously saved memory region that currently resides in a different location.\\n\"\n\"Most commonly used for stacks where stack pointers point to it's own structure\"\nmsgstr \"如果你正在爬取一个之前保存的内存区域，而该区域当前位于不同的位置，请使用此选项。最常用于堆栈，其中堆栈指针指向其自身结构\"\n\n#: tfrmstringpointerscan.combocomparetype.text\nmsgctxt \"tfrmstringpointerscan.combocomparetype.text\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tfrmstringpointerscan.combotype.text\nmsgctxt \"tfrmstringpointerscan.combotype.text\"\nmsgid \"String\"\nmsgstr \"字符串\"\n\n#: tfrmstringpointerscan.edtalignsize.text\nmsgctxt \"tfrmstringpointerscan.edtalignsize.text\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tfrmstringpointerscan.edtmaxlevel.text\nmsgctxt \"tfrmstringpointerscan.edtmaxlevel.text\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tfrmstringpointerscan.edtstructsize.text\nmsgctxt \"tfrmstringpointerscan.edtstructsize.text\"\nmsgid \"4096\"\nmsgstr \"4096\"\n\n#: tfrmstringpointerscan.lbland.caption\nmsgctxt \"tfrmstringpointerscan.lbland.caption\"\nmsgid \"and\"\nmsgstr \"和\"\n\n#: tfrmstringpointerscan.lblinfo.caption\nmsgctxt \"tfrmstringpointerscan.lblinfo.caption\"\nmsgid \"Info\"\nmsgstr \"信息\"\n\n#: tfrmstringpointerscan.lblmaxlevel.caption\nmsgctxt \"tfrmstringpointerscan.lblmaxlevel.caption\"\nmsgid \"Max Level\"\nmsgstr \"最大级别\"\n\n#: tfrmstringpointerscan.lblsize.caption\nmsgctxt \"tfrmstringpointerscan.lblsize.caption\"\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: tfrmstringpointerscan.lblsize2.caption\nmsgctxt \"tfrmstringpointerscan.lblsize2.caption\"\nmsgid \"Size\"\nmsgstr \"大小\"\n\n#: tfrmstringpointerscan.lblstructsize.caption\nmsgctxt \"tfrmstringpointerscan.lblstructsize.caption\"\nmsgid \"Structsize\"\nmsgstr \"结构大小\"\n\n#: tfrmstringpointerscan.lblvds.caption\nmsgctxt \"tfrmstringpointerscan.lblvds.caption\"\nmsgid \"Variable display type\"\nmsgstr \"变量显示类型\"\n\n#: tfrmstringpointerscan.menuitem1.caption\nmsgctxt \"tfrmstringpointerscan.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmstringpointerscan.menuitem5.caption\nmsgctxt \"tfrmstringpointerscan.menuitem5.caption\"\nmsgid \"Rescan\"\nmsgstr \"重新扫描\"\n\n#: tfrmstringpointerscan.menuitem6.caption\nmsgctxt \"tfrmstringpointerscan.menuitem6.caption\"\nmsgid \"Filter pointerlist\"\nmsgstr \"过滤指针列表\"\n\n#: tfrmstringpointerscan.menuitem7.caption\nmsgctxt \"tfrmstringpointerscan.menuitem7.caption\"\nmsgid \"New Window\"\nmsgstr \"新窗口\"\n\n#: tfrmstringpointerscan.miclearcache.caption\nmsgctxt \"tfrmstringpointerscan.miclearcache.caption\"\nmsgid \"Clear pointer cache\"\nmsgstr \"清除指针缓存\"\n\n#: tfrmstringpointerscan.mifind.caption\nmsgctxt \"tfrmstringpointerscan.mifind.caption\"\nmsgid \"Find...\"\nmsgstr \"查找...\"\n\n#: tfrmstringpointerscan.mifindnext.caption\nmsgctxt \"tfrmstringpointerscan.mifindnext.caption\"\nmsgid \"Find Next\"\nmsgstr \"查找下一个\"\n\n#: tfrmstringpointerscan.minewscan.caption\nmsgctxt \"tfrmstringpointerscan.minewscan.caption\"\nmsgid \"New scan\"\nmsgstr \"新扫描\"\n\n#: tfrmstringpointerscan.miopen.caption\nmsgctxt \"tfrmstringpointerscan.miopen.caption\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#: tfrmstructurecompare.btnaddaddresslf.caption\nmsgctxt \"tfrmstructurecompare.btnaddaddresslf.caption\"\nmsgid \"Add Address\"\nmsgstr \"添加地址\"\n\n#: tfrmstructurecompare.btnaddaddressnlf.caption\nmsgctxt \"tfrmstructurecompare.btnaddaddressnlf.caption\"\nmsgid \"Add Address\"\nmsgstr \"添加地址\"\n\n#: tfrmstructurecompare.btnnewscan.caption\nmsgctxt \"tfrmstructurecompare.btnnewscan.caption\"\nmsgid \"New Scan\"\nmsgstr \"新扫描\"\n\n#: tfrmstructurecompare.btnscan.caption\nmsgctxt \"tfrmstructurecompare.btnscan.caption\"\nmsgid \"Scan\"\nmsgstr \"扫描\"\n\n#: tfrmstructurecompare.caption\nmsgctxt \"tfrmstructurecompare.caption\"\nmsgid \"Structure Compare\"\nmsgstr \"结构比较\"\n\n#: tfrmstructurecompare.cbhexadecimal.caption\nmsgctxt \"tfrmstructurecompare.cbhexadecimal.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: tfrmstructurecompare.combotype.text\nmsgctxt \"tfrmstructurecompare.combotype.text\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tfrmstructurecompare.edtalignsize.text\nmsgctxt \"tfrmstructurecompare.edtalignsize.text\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tfrmstructurecompare.edtmaxlevel.text\nmsgctxt \"tfrmstructurecompare.edtmaxlevel.text\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: tfrmstructurecompare.edtstructsize.text\nmsgctxt \"tfrmstructurecompare.edtstructsize.text\"\nmsgid \"4096\"\nmsgstr \"4096\"\n\n#: tfrmstructurecompare.gblf.caption\nmsgctxt \"tfrmstructurecompare.gblf.caption\"\nmsgid \"Group 1\"\nmsgstr \"组 1\"\n\n#: tfrmstructurecompare.lblinfo.caption\nmsgctxt \"tfrmstructurecompare.lblinfo.caption\"\nmsgid \"Info\"\nmsgstr \"信息\"\n\n#: tfrmstructurecompare.lblmaxlevel.caption\nmsgctxt \"tfrmstructurecompare.lblmaxlevel.caption\"\nmsgid \"Max Level\"\nmsgstr \"最大级别\"\n\n#: tfrmstructurecompare.lblstructsize.caption\nmsgctxt \"tfrmstructurecompare.lblstructsize.caption\"\nmsgid \"Structsize\"\nmsgstr \"结构大小\"\n\n#: tfrmstructurecompare.lblvds.caption\nmsgctxt \"tfrmstructurecompare.lblvds.caption\"\nmsgid \"Variable display type\"\nmsgstr \"变量显示类型\"\n\n#: tfrmstructurecompare.menuitem1.caption\nmsgctxt \"tfrmstructurecompare.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmstructurecompare.menuitem5.caption\nmsgctxt \"tfrmstructurecompare.menuitem5.caption\"\nmsgid \"Rescan\"\nmsgstr \"重新扫描\"\n\n#: tfrmstructurecompare.menuitem6.caption\nmsgctxt \"tfrmstructurecompare.menuitem6.caption\"\nmsgid \"Filter pointerlist\"\nmsgstr \"过滤指针列表\"\n\n#: tfrmstructurecompare.menuitem7.caption\nmsgctxt \"tfrmstructurecompare.menuitem7.caption\"\nmsgid \"New Window\"\nmsgstr \"新窗口\"\n\n#: tfrmstructurecompare.miclearcache.caption\nmsgctxt \"tfrmstructurecompare.miclearcache.caption\"\nmsgid \"Clear pointer cache\"\nmsgstr \"清除指针缓存\"\n\n#: tfrmstructurecompare.micopy.caption\nmsgctxt \"tfrmstructurecompare.micopy.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tfrmstructurecompare.micut.caption\nmsgctxt \"tfrmstructurecompare.micut.caption\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: tfrmstructurecompare.mideleteaddress.caption\nmsgctxt \"tfrmstructurecompare.mideleteaddress.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tfrmstructurecompare.mifind.caption\nmsgctxt \"tfrmstructurecompare.mifind.caption\"\nmsgid \"Find...\"\nmsgstr \"查找...\"\n\n#: tfrmstructurecompare.mifindnext.caption\nmsgctxt \"tfrmstructurecompare.mifindnext.caption\"\nmsgid \"Find Next\"\nmsgstr \"查找下一个\"\n\n#: tfrmstructurecompare.minewscan.caption\nmsgctxt \"tfrmstructurecompare.minewscan.caption\"\nmsgid \"New scan\"\nmsgstr \"新扫描\"\n\n#: tfrmstructurecompare.miopen.caption\nmsgctxt \"tfrmstructurecompare.miopen.caption\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#: tfrmstructurecompare.mipaste.caption\nmsgctxt \"tfrmstructurecompare.mipaste.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tfrmstructurecompare.mishadow.caption\nmsgctxt \"tfrmstructurecompare.mishadow.caption\"\nmsgid \"Lock\"\nmsgstr \"锁定\"\n\n#: tfrmstructures2.caption\nmsgctxt \"tfrmstructures2.caption\"\nmsgid \"Structure dissect\"\nmsgstr \"结构解剖\"\n\n#: tfrmstructures2.file1.caption\nmsgctxt \"tfrmstructures2.file1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmstructures2.miback.caption\nmsgctxt \"tfrmstructures2.miback.caption\"\nmsgid \"Back\"\nmsgstr \"返回\"\n\n#: tfrmstructures2.michangecolors.caption\nmsgctxt \"tfrmstructures2.michangecolors.caption\"\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#: tfrmstructures2.michangetype2byte.caption\nmsgctxt \"tfrmstructures2.michangetype2byte.caption\"\nmsgid \"2 Byte\"\nmsgstr \"2 字节\"\n\n#: tfrmstructures2.michangetype4byte.caption\nmsgctxt \"tfrmstructures2.michangetype4byte.caption\"\nmsgid \"4 Byte\"\nmsgstr \"4 字节\"\n\n#: tfrmstructures2.michangetype8byte.caption\nmsgctxt \"tfrmstructures2.michangetype8byte.caption\"\nmsgid \"8 Byte\"\nmsgstr \"8 字节\"\n\n#: tfrmstructures2.michangetypebyte.caption\nmsgctxt \"tfrmstructures2.michangetypebyte.caption\"\nmsgid \"Byte\"\nmsgstr \"字节\"\n\n#: tfrmstructures2.michangetypedouble.caption\nmsgctxt \"tfrmstructures2.michangetypedouble.caption\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: tfrmstructures2.michangetypefloat.caption\nmsgctxt \"tfrmstructures2.michangetypefloat.caption\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: tfrmstructures2.michangetypepointer.caption\nmsgctxt \"tfrmstructures2.michangetypepointer.caption\"\nmsgid \"Pointer\"\nmsgstr \"指针\"\n\n#: tfrmstructures2.michangetypestring.caption\nmsgctxt \"tfrmstructures2.michangetypestring.caption\"\nmsgid \"String\"\nmsgstr \"字符串\"\n\n#: tfrmstructures2.michangetypeunicode.caption\nmsgctxt \"tfrmstructures2.michangetypeunicode.caption\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: tfrmstructures2.michangevalue.caption\nmsgctxt \"tfrmstructures2.michangevalue.caption\"\nmsgid \"Change value\"\nmsgstr \"更改值\"\n\n#: tfrmstructures2.mifindnext.caption\nmsgctxt \"tfrmstructures2.mifindnext.caption\"\nmsgid \"Find Next\"\nmsgstr \"查找下一个\"\n\n#: tfrmstructures2.mifindprevious.caption\nmsgctxt \"tfrmstructures2.mifindprevious.caption\"\nmsgid \"Find Previous\"\nmsgstr \"查找上一个\"\n\n#: tfrmstructures2.migenerategroupscan.caption\nmsgctxt \"tfrmstructures2.migenerategroupscan.caption\"\nmsgid \"Generate groupscan command\"\nmsgstr \"生成组扫描命令\"\n\n#: tfrmstructures2.migotooffset.caption\nmsgctxt \"tfrmstructures2.migotooffset.caption\"\nmsgid \"Go to Offset\"\nmsgstr \"转到偏移量\"\n\n#: tfrmstructures2.minewwindow.caption\nmsgctxt \"tfrmstructures2.minewwindow.caption\"\nmsgid \"New window\"\nmsgstr \"新窗口\"\n\n#: tfrmstructures2.mirecalculateaddress.caption\nmsgctxt \"tfrmstructures2.mirecalculateaddress.caption\"\nmsgid \"Recalculate address\"\nmsgstr \"重新计算地址\"\n\n#: tfrmstructures2.miview.caption\nmsgctxt \"tfrmstructures2.miview.caption\"\nmsgid \"View\"\nmsgstr \"查看\"\n\n#: tfrmstructures2.renamestructure1.caption\nmsgctxt \"tfrmstructures2.renamestructure1.caption\"\nmsgid \"Rename structure\"\nmsgstr \"重命名结构\"\n\n#: tfrmstructures2.structures1.caption\nmsgctxt \"tfrmstructures2.structures1.caption\"\nmsgid \"Structures\"\nmsgstr \"结构\"\n\n#: tfrmstructures2elementinfo.button1.caption\nmsgctxt \"tfrmstructures2elementinfo.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmstructures2elementinfo.button2.caption\nmsgctxt \"tfrmstructures2elementinfo.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmstructures2elementinfo.cbhexadecimal.caption\nmsgctxt \"tfrmstructures2elementinfo.cbhexadecimal.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: tfrmstructures2elementinfo.cbsigned.caption\nmsgctxt \"tfrmstructures2elementinfo.cbsigned.caption\"\nmsgid \"Signed\"\nmsgstr \"有符号\"\n\n#: tfrmstructures2elementinfo.cbstructtype.text\nmsgctxt \"tfrmstructures2elementinfo.cbstructtype.text\"\nmsgid \"Undefined\"\nmsgstr \"未定义\"\n\n#: tfrmstructures2elementinfo.cbtype.text\nmsgctxt \"tfrmstructures2elementinfo.cbtype.text\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tfrmstructures2elementinfo.edtbytesize.text\nmsgctxt \"tfrmstructures2elementinfo.edtbytesize.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmstructures2elementinfo.edtchildstart.text\nmsgctxt \"tfrmstructures2elementinfo.edtchildstart.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmstructures2elementinfo.edtoffset.text\nmsgctxt \"tfrmstructures2elementinfo.edtoffset.text\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmstructures2elementinfo.label1.caption\nmsgctxt \"tfrmstructures2elementinfo.label1.caption\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: tfrmstructures2elementinfo.label3.caption\nmsgctxt \"tfrmstructures2elementinfo.label3.caption\"\nmsgid \"Offset\"\nmsgstr \"偏移量\"\n\n#: tfrmstructures2elementinfo.label4.caption\nmsgctxt \"tfrmstructures2elementinfo.label4.caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: tfrmstructures2elementinfo.label6.caption\nmsgctxt \"tfrmstructures2elementinfo.label6.caption\"\nmsgid \"Background Color\"\nmsgstr \"背景颜色\"\n\n#: tfrmsymboleventtakinglong.lblautocloseoncefound.caption\nmsgctxt \"tfrmsymboleventtakinglong.lblautocloseoncefound.caption\"\nmsgid \"This window will autoclose once the symbol has been found\"\nmsgstr \"一旦找到符号，此窗口将自动关闭\"\n\n#: tfrmsymbolhandler.delete1.caption\nmsgctxt \"tfrmsymbolhandler.delete1.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tfrmsymbolhandler.label2.caption\nmsgctxt \"tfrmsymbolhandler.label2.caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmsymbolhandler.listview1.columns[1].caption\nmsgctxt \"tfrmsymbolhandler.listview1.columns[1].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmthreadlist.caption\nmsgctxt \"tfrmthreadlist.caption\"\nmsgid \"Threadlist\"\nmsgstr \"线程列表\"\n\n#: tfrmthreadlist.mibreak.caption\nmsgctxt \"tfrmthreadlist.mibreak.caption\"\nmsgid \"Break\"\nmsgstr \"中断\"\n\n#: tfrmthreadlist.micopyvaluetoclipboard.caption\nmsgctxt \"tfrmthreadlist.micopyvaluetoclipboard.caption\"\nmsgid \"Copy value to clipboard\"\nmsgstr \"复制值到剪贴板\"\n\n#: tfrmthreadlist.mirefresh.caption\nmsgctxt \"tfrmthreadlist.mirefresh.caption\"\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n#: tfrmtracer.aflabel.caption\nmsgctxt \"tfrmtracer.aflabel.caption\"\nmsgid \"AF 0\"\nmsgstr \"AF 0\"\n\n#: tfrmtracer.button1.caption\nmsgctxt \"tfrmtracer.button1.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmtracer.caption\nmsgctxt \"tfrmtracer.caption\"\nmsgid \"Tracer\"\nmsgstr \"追踪器\"\n\n#: tfrmtracer.cflabel.caption\nmsgctxt \"tfrmtracer.cflabel.caption\"\nmsgid \"CF 0\"\nmsgstr \"CF 0\"\n\n#: tfrmtracer.cslabel.caption\nmsgctxt \"tfrmtracer.cslabel.caption\"\nmsgid \"CS 0000\"\nmsgstr \"CS 0000\"\n\n#: tfrmtracer.dflabel.caption\nmsgctxt \"tfrmtracer.dflabel.caption\"\nmsgid \"DF 0\"\nmsgstr \"DF 0\"\n\n#: tfrmtracer.dslabel.caption\nmsgctxt \"tfrmtracer.dslabel.caption\"\nmsgid \"DS 0000\"\nmsgstr \"DS 0000\"\n\n#: tfrmtracer.eaxlabel.caption\nmsgctxt \"tfrmtracer.eaxlabel.caption\"\nmsgid \"EAX 00000000\"\nmsgstr \"EAX 00000000\"\n\n#: tfrmtracer.ebplabel.caption\nmsgctxt \"tfrmtracer.ebplabel.caption\"\nmsgid \"EBP 00000000\"\nmsgstr \"EBP 00000000\"\n\n#: tfrmtracer.ebxlabel.caption\nmsgctxt \"tfrmtracer.ebxlabel.caption\"\nmsgid \"EBX 00000000\"\nmsgstr \"EBX 00000000\"\n\n#: tfrmtracer.ecxlabel.caption\nmsgctxt \"tfrmtracer.ecxlabel.caption\"\nmsgid \"ECX 00000000\"\nmsgstr \"ECX 00000000\"\n\n#: tfrmtracer.edilabel.caption\nmsgctxt \"tfrmtracer.edilabel.caption\"\nmsgid \"EDI 00000000\"\nmsgstr \"EDI 00000000\"\n\n#: tfrmtracer.edxlabel.caption\nmsgctxt \"tfrmtracer.edxlabel.caption\"\nmsgid \"EDX 00000000\"\nmsgstr \"EDX 00000000\"\n\n#: tfrmtracer.eiplabel.caption\nmsgctxt \"tfrmtracer.eiplabel.caption\"\nmsgid \"EIP 00000000\"\nmsgstr \"EIP 00000000\"\n\n#: tfrmtracer.esilabel.caption\nmsgctxt \"tfrmtracer.esilabel.caption\"\nmsgid \"ESI 00000000\"\nmsgstr \"ESI 00000000\"\n\n#: tfrmtracer.eslabel.caption\nmsgctxt \"tfrmtracer.eslabel.caption\"\nmsgid \"ES 0000\"\nmsgstr \"ES 0000\"\n\n#: tfrmtracer.esplabel.caption\nmsgctxt \"tfrmtracer.esplabel.caption\"\nmsgid \"ESP 00000000\"\nmsgstr \"ESP 00000000\"\n\n#: tfrmtracer.fslabel.caption\nmsgctxt \"tfrmtracer.fslabel.caption\"\nmsgid \"FS 0000\"\nmsgstr \"FS 0000\"\n\n#: tfrmtracer.gslabel.caption\nmsgctxt \"tfrmtracer.gslabel.caption\"\nmsgid \"GS 0000\"\nmsgstr \"GS 0000\"\n\n#: tfrmtracer.lblinstruction.caption\nmsgctxt \"tfrmtracer.lblinstruction.caption\"\nmsgid \"Instruction\"\nmsgstr \"指令\"\n\n#: tfrmtracer.menuitem1.caption\nmsgctxt \"tfrmtracer.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmtracer.menuitem2.caption\nmsgctxt \"tfrmtracer.menuitem2.caption\"\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: tfrmtracer.menuitem4.caption\nmsgctxt \"tfrmtracer.menuitem4.caption\"\nmsgid \"Find...\"\nmsgstr \"查找...\"\n\n#: tfrmtracer.menuitem5.caption\nmsgctxt \"tfrmtracer.menuitem5.caption\"\nmsgid \"Expand all\"\nmsgstr \"展开全部\"\n\n#: tfrmtracer.menuitem6.caption\nmsgctxt \"tfrmtracer.menuitem6.caption\"\nmsgid \"Collapse all\"\nmsgstr \"折叠全部\"\n\n#: tfrmtracer.misearchnext.caption\nmsgctxt \"tfrmtracer.misearchnext.caption\"\nmsgid \"Find Next\"\nmsgstr \"查找下一个\"\n\n#: tfrmtracer.oflabel.caption\nmsgctxt \"tfrmtracer.oflabel.caption\"\nmsgid \"OF 0\"\nmsgstr \"OF 0\"\n\n#: tfrmtracer.pflabel.caption\nmsgctxt \"tfrmtracer.pflabel.caption\"\nmsgid \"PF 0\"\nmsgstr \"PF 0\"\n\n#: tfrmtracer.sbshowfloats.caption\nmsgctxt \"tfrmtracer.sbshowfloats.caption\"\nmsgid \"Float\"\nmsgstr \"浮点\"\n\n#: tfrmtracer.sbshowfloats.hint\nmsgctxt \"tfrmtracer.sbshowfloats.hint\"\nmsgid \"Floating point registers\"\nmsgstr \"浮点寄存器\"\n\n#: tfrmtracer.sbshowstack.caption\nmsgctxt \"tfrmtracer.sbshowstack.caption\"\nmsgid \"Stack\"\nmsgstr \"堆栈\"\n\n#: tfrmtracer.sbshowstack.hint\nmsgctxt \"tfrmtracer.sbshowstack.hint\"\nmsgid \"Stack\"\nmsgstr \"堆栈\"\n\n#: tfrmtracer.sflabel.caption\nmsgctxt \"tfrmtracer.sflabel.caption\"\nmsgid \"SF 0\"\nmsgstr \"SF 0\"\n\n#: tfrmtracer.sslabel.caption\nmsgctxt \"tfrmtracer.sslabel.caption\"\nmsgid \"SS 0000\"\nmsgstr \"SS 0000\"\n\n#: tfrmtracer.zflabel.caption\nmsgctxt \"tfrmtracer.zflabel.caption\"\nmsgid \"ZF 0\"\nmsgstr \"ZF 0\"\n\n#: tfrmtracerconfig.btncancel.caption\nmsgctxt \"tfrmtracerconfig.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmtracerconfig.btnok.caption\nmsgctxt \"tfrmtracerconfig.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmtracerconfig.edtmaxtrace.text\nmsgctxt \"tfrmtracerconfig.edtmaxtrace.text\"\nmsgid \"1000\"\nmsgstr \"1000\"\n\n#: tfrmtracerconfig.rbbpdbvm.caption\nmsgctxt \"tfrmtracerconfig.rbbpdbvm.caption\"\nmsgid \"DBVM Breakpoint\"\nmsgstr \"DBVM 断点\"\n\n#: tfrmtracerconfig.rbbpexception.caption\nmsgctxt \"tfrmtracerconfig.rbbpexception.caption\"\nmsgid \"Exception Breakpoint\"\nmsgstr \"异常断点\"\n\n#: tfrmtracerconfig.rbbphardware.caption\nmsgctxt \"tfrmtracerconfig.rbbphardware.caption\"\nmsgid \"Hardware Breakpoint\"\nmsgstr \"硬件断点\"\n\n#: tfrmtracerconfig.rbbreakonaccess.caption\nmsgctxt \"tfrmtracerconfig.rbbreakonaccess.caption\"\nmsgid \"Break on Access\"\nmsgstr \"访问时中断\"\n\n#: tfrmtracerconfig.rbbreakonwrite.caption\nmsgctxt \"tfrmtracerconfig.rbbreakonwrite.caption\"\nmsgid \"Break on Write\"\nmsgstr \"写入时中断\"\n\n#: tfrmtrainergenerator.btndesignform.caption\nmsgctxt \"tfrmtrainergenerator.btndesignform.caption\"\nmsgid \"Design userinterface manually\"\nmsgstr \"手动设计用户界面\"\n\n#: tfrmtrainergenerator.button3.caption\nmsgctxt \"tfrmtrainergenerator.button3.caption\"\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: tfrmtrainergenerator.cbactivatesound.text\nmsgctxt \"tfrmtrainergenerator.cbactivatesound.text\"\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#: tfrmtrainergenerator.cbdeactivatesound.text\nmsgctxt \"tfrmtrainergenerator.cbdeactivatesound.text\"\nmsgid \"Deactivate\"\nmsgstr \"停用\"\n\n#: tfrmtrainergenerator.cbsupportcheatengine.caption\nmsgctxt \"tfrmtrainergenerator.cbsupportcheatengine.caption\"\nmsgid \"Don't support Cheat Engine (or yourself)\"\nmsgstr \"不支持 Cheat Engine（或自己）\"\n\n#: tfrmtrainergenerator.cetrainersavedialog.title\nmsgctxt \"tfrmtrainergenerator.cetrainersavedialog.title\"\nmsgid \"Save script as\"\nmsgstr \"另存为脚本\"\n\n#: tfrmtrainergenerator.ctsavedialog.title\nmsgctxt \"tfrmtrainergenerator.ctsavedialog.title\"\nmsgid \"Save script as\"\nmsgstr \"另存为脚本\"\n\n#: tfrmtrainergenerator.edtfreezeinterval.text\nmsgctxt \"tfrmtrainergenerator.edtfreezeinterval.text\"\nmsgid \"250\"\nmsgstr \"250\"\n\n#: tfrmtrainergenerator.exesavedialog.title\nmsgctxt \"tfrmtrainergenerator.exesavedialog.title\"\nmsgid \"Save script as\"\nmsgstr \"另存为脚本\"\n\n#: tfrmtrainergenerator.label5.caption\nmsgctxt \"tfrmtrainergenerator.label5.caption\"\nmsgid \"Output\"\nmsgstr \"输出\"\n\n#: tfrmtrainergenerator.lblactivatesound.caption\nmsgctxt \"tfrmtrainergenerator.lblactivatesound.caption\"\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#: tfrmtrainergenerator.lbldeactivatesound.caption\nmsgctxt \"tfrmtrainergenerator.lbldeactivatesound.caption\"\nmsgid \"Deactivate\"\nmsgstr \"停用\"\n\n#: tfrmtrainergenerator.lvcheats.columns[0].caption\nmsgctxt \"tfrmtrainergenerator.lvcheats.columns[0].caption\"\nmsgid \"Hotkey\"\nmsgstr \"热键\"\n\n#: tfrmtrainergenerator.lvcheats.columns[1].caption\nmsgctxt \"tfrmtrainergenerator.lvcheats.columns[1].caption\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: tfrmtrainergenerator.miedithotkey.caption\nmsgctxt \"tfrmtrainergenerator.miedithotkey.caption\"\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: tfrmultimap.btnexecuted.caption\nmsgctxt \"tfrmultimap.btnexecuted.caption\"\nmsgid \"Code has been executed\"\nmsgstr \"代码已执行\"\n\n#: tfrmultimap.btnnotexecuted.caption\nmsgctxt \"tfrmultimap.btnnotexecuted.caption\"\nmsgid \"Code did not get executed\"\nmsgstr \"代码未执行\"\n\n#: tfrmultimap.btnresetcount.caption\nmsgctxt \"tfrmultimap.btnresetcount.caption\"\nmsgid \"Reset Count\"\nmsgstr \"重置计数\"\n\n#: tfrmultimap.btnstart.caption\nmsgctxt \"tfrmultimap.btnstart.caption\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: tfrmultimap.btnstop.caption\nmsgctxt \"tfrmultimap.btnstop.caption\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tfrmultimap.button6.caption\nmsgctxt \"tfrmultimap.button6.caption\"\nmsgid \"Reset\"\nmsgstr \"重置\"\n\n#: tfrmultimap.button6.hint\nmsgctxt \"tfrmultimap.button6.hint\"\nmsgid \"If you lost track of what happened, use this. It will set execution count back to 0 of all the branches it has found\"\nmsgstr \"如果你失去了对发生事情的追踪，请使用这个。它会将所有找到的分支的执行计数重置为 0\"\n\n#: tfrmultimap.caption\nmsgctxt \"tfrmultimap.caption\"\nmsgid \"Ultimap\"\nmsgstr \"Ultimap\"\n\n#: tfrmultimap.cbfilterfuturepaths.hint\nmsgctxt \"tfrmultimap.cbfilterfuturepaths.hint\"\nmsgid \"When checked (default) will mark all subsequent paths after this as filtered out\"\nmsgstr \"选中后（默认）将把此后的所有路径标记为已过滤\"\n\n#: tfrmultimap.cbfilteroutnewentries.hint\nmsgctxt \"tfrmultimap.cbfilteroutnewentries.hint\"\nmsgid \"When this checkbox is ticked all newly added code entry points will be marked as entries that do not match the filters\"\nmsgstr \"当此复选框被选中时，所有新添加的代码入口点将被标记为不符合过滤条件的条目\"\n\n#: tfrmultimap.edit1.text\nmsgctxt \"tfrmultimap.edit1.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tfrmultimap.edtworkercount.text\nmsgctxt \"tfrmultimap.edtworkercount.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tfrmultimap.label3.caption\nmsgctxt \"tfrmultimap.label3.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmultimap.label4.caption\nmsgctxt \"tfrmultimap.label4.caption\"\nmsgid \"Label4\"\nmsgstr \"标签4\"\n\n#: tfrmultimap.lbllastfilterresult.caption\nmsgctxt \"tfrmultimap.lbllastfilterresult.caption\"\nmsgid \"Last filter results:\"\nmsgstr \"最后的过滤结果：\"\n\n#: tfrmultimap.listview1.columns[2].caption\nmsgctxt \"tfrmultimap.listview1.columns[2].caption\"\nmsgid \"Count\"\nmsgstr \"计数\"\n\n#: tfrmultimap.micopytoclipboard.caption\nmsgctxt \"tfrmultimap.micopytoclipboard.caption\"\nmsgid \"Copy selection to clipboard\"\nmsgstr \"将选择复制到剪贴板\"\n\n#: tfrmultimap.miremovehotkey.caption\nmsgctxt \"tfrmultimap.miremovehotkey.caption\"\nmsgid \"Remove hotkey\"\nmsgstr \"移除热键\"\n\n#: tfrmultimap.misethotkey.caption\nmsgctxt \"tfrmultimap.misethotkey.caption\"\nmsgid \"Set hotkey\"\nmsgstr \"设置热键\"\n\n#: tfrmultimap.panel2.caption\nmsgctxt \"tfrmultimap.panel2.caption\"\nmsgid \"Panel2\"\nmsgstr \"面板2\"\n\n#: tfrmultimap2.btnexecuted.caption\nmsgctxt \"tfrmultimap2.btnexecuted.caption\"\nmsgid \"Code has been executed\"\nmsgstr \"代码已执行\"\n\n#: tfrmultimap2.btnnotexecuted.caption\nmsgctxt \"tfrmultimap2.btnnotexecuted.caption\"\nmsgid \"Code did not get executed\"\nmsgstr \"代码未执行\"\n\n#: tfrmultimap2.btnreset.caption\nmsgctxt \"tfrmultimap2.btnreset.caption\"\nmsgid \"Reset\"\nmsgstr \"重置\"\n\n#: tfrmultimap2.btnreset.hint\nmsgctxt \"tfrmultimap2.btnreset.hint\"\nmsgid \"If you lost track of what happened, use this. It will set execution count back to 0 of all the branches it has found\"\nmsgstr \"如果你失去了对发生了什么的追踪，请使用此选项。它将把所有找到的分支的执行计数重置为 0\"\n\n#: tfrmultimap2.btnresetcount.caption\nmsgctxt \"tfrmultimap2.btnresetcount.caption\"\nmsgid \"Reset Count\"\nmsgstr \"重置计数\"\n\n#: tfrmultimap2.caption\nmsgctxt \"tfrmultimap2.caption\"\nmsgid \"Ultimap 2\"\nmsgstr \"Ultimap 2\"\n\n#: tfrmultimap2.cbfilterfuturepaths.hint\nmsgctxt \"tfrmultimap2.cbfilterfuturepaths.hint\"\nmsgid \"When checked (default) will mark all subsequent paths after this as filtered out\"\nmsgstr \"选中时（默认）将把此之后的所有路径标记为已过滤\"\n\n#: tfrmultimap2.cbfilteroutnewentries.hint\nmsgctxt \"tfrmultimap2.cbfilteroutnewentries.hint\"\nmsgid \"When this checkbox is ticked all newly added code entry points will be marked as entries that do not match the filters\"\nmsgstr \"当此复选框被选中时，所有新添加的代码入口点将被标记为不匹配过滤器的条目\"\n\n#: tfrmultimap2.cbwindowsbasedipt.caption\nmsgctxt \"tfrmultimap2.cbwindowsbasedipt.caption\"\nmsgid \"Use Built-in windows IPT suport\"\nmsgstr \"使用内置的 Windows IPT 支持\"\n\n#: tfrmultimap2.detargetfolder.text\nmsgctxt \"tfrmultimap2.detargetfolder.text\"\nmsgid \"d:\\\\lotsofspace\"\nmsgstr \"d:\\\\lotsofspace\"\n\n#: tfrmultimap2.detextout.text\nmsgctxt \"tfrmultimap2.detextout.text\"\nmsgid \"d:\\\\lotsofspace\"\nmsgstr \"d:\\\\lotsofspace\"\n\n#: tfrmultimap2.edtcallcount.text\nmsgctxt \"tfrmultimap2.edtcallcount.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tfrmultimap2.edtflushinterval.text\nmsgctxt \"tfrmultimap2.edtflushinterval.text\"\nmsgid \"10\"\nmsgstr \"10\"\n\n#: tfrmultimap2.gbthreads.caption\nmsgctxt \"tfrmultimap2.gbthreads.caption\"\nmsgid \"Threads\"\nmsgstr \"线程\"\n\n#: tfrmultimap2.label1.caption\nmsgctxt \"tfrmultimap2.label1.caption\"\nmsgid \"Paused\"\nmsgstr \"已暂停\"\n\n#: tfrmultimap2.label3.caption\nmsgctxt \"tfrmultimap2.label3.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tfrmultimap2.label4.caption\nmsgctxt \"tfrmultimap2.label4.caption\"\nmsgid \"Seconds\"\nmsgstr \"秒\"\n\n#: tfrmultimap2.lblipcount.caption\nmsgctxt \"tfrmultimap2.lblipcount.caption\"\nmsgid \"Instruction Pointer List Size:\"\nmsgstr \"指令指针列表大小：\"\n\n#: tfrmultimap2.lbllastfilterresult.caption\nmsgctxt \"tfrmultimap2.lbllastfilterresult.caption\"\nmsgid \"Last filter results:\"\nmsgstr \"最后的过滤结果：\"\n\n#: tfrmultimap2.listview1.columns[0].caption\nmsgctxt \"tfrmultimap2.listview1.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tfrmultimap2.listview1.columns[1].caption\nmsgctxt \"tfrmultimap2.listview1.columns[1].caption\"\nmsgid \"Count\"\nmsgstr \"计数\"\n\n#: tfrmultimap2.lvthreads.columns[0].caption\nmsgctxt \"tfrmultimap2.lvthreads.columns[0].caption\"\nmsgid \"ThreadID\"\nmsgstr \"线程ID\"\n\n#: tfrmultimap2.lvthreads.columns[1].caption\nmsgctxt \"tfrmultimap2.lvthreads.columns[1].caption\"\nmsgid \"Data received\"\nmsgstr \"接收到的数据\"\n\n#: tfrmultimap2.lvthreads.columns[2].caption\nmsgctxt \"tfrmultimap2.lvthreads.columns[2].caption\"\nmsgid \"Buffers missed\"\nmsgstr \"丢失的缓冲区\"\n\n#: tfrmultimap2.menuitem1.caption\nmsgctxt \"tfrmultimap2.menuitem1.caption\"\nmsgid \"Copy selection to clipboard\"\nmsgstr \"复制选定内容到剪贴板\"\n\n#: tfrmultimap2.menuitem2.caption\nmsgctxt \"tfrmultimap2.menuitem2.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tfrmultimap2.menuitem4.caption\nmsgctxt \"tfrmultimap2.menuitem4.caption\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: tfrmultimap2.mirangedeleteall.caption\nmsgctxt \"tfrmultimap2.mirangedeleteall.caption\"\nmsgid \"Clear List\"\nmsgstr \"清空列表\"\n\n#: tfrmultimap2.miremovehotkey.caption\nmsgctxt \"tfrmultimap2.miremovehotkey.caption\"\nmsgid \"Remove hotkey\"\nmsgstr \"移除热键\"\n\n#: tfrmultimap2.misethotkey.caption\nmsgctxt \"tfrmultimap2.misethotkey.caption\"\nmsgid \"Set hotkey\"\nmsgstr \"设置热键\"\n\n#: tfrmultimap2.panel2.caption\nmsgctxt \"tfrmultimap2.panel2.caption\"\nmsgid \"Panel2\"\nmsgstr \"面板2\"\n\n#: tfrmwatchlist.lvwatchlist.columns[1].caption\nmsgctxt \"tfrmwatchlist.lvwatchlist.columns[1].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tfrmwatchlistaddentry.btncancel.caption\nmsgctxt \"tfrmwatchlistaddentry.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tfrmwatchlistaddentry.btnok.caption\nmsgctxt \"tfrmwatchlistaddentry.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tfrmwatchlistaddentry.rgtype.caption\nmsgctxt \"tfrmwatchlistaddentry.rgtype.caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: thotkeyform.btnapply.caption\nmsgctxt \"thotkeyform.btnapply.caption\"\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n#: thotkeyform.btncancel.caption\nmsgctxt \"thotkeyform.btncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: thotkeyform.btnok.caption\nmsgctxt \"thotkeyform.btnok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: thotkeyform.button2.caption\nmsgctxt \"thotkeyform.button2.caption\"\nmsgid \"Clear\"\nmsgstr \"清空\"\n\n#: thotkeyform.cbactivatesound.text\nmsgctxt \"thotkeyform.cbactivatesound.text\"\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#: thotkeyform.cbdeactivatesound.text\nmsgctxt \"thotkeyform.cbdeactivatesound.text\"\nmsgid \"Deactivate\"\nmsgstr \"停用\"\n\n#: thotkeyform.cbforceenglishactivate.caption\nmsgctxt \"thotkeyform.cbforceenglishactivate.caption\"\nmsgid \"Force English\"\nmsgstr \"强制使用英语\"\n\n#: thotkeyform.cbforceenglishactivate.hint\nmsgctxt \"thotkeyform.cbforceenglishactivate.hint\"\nmsgid \"\"\n\"Tries to set the language of the windows speech synthesizer to English when speaking this. Won't speak if there is no \"\n\"English voice installed\"\nmsgstr \"尝试在说出此内容时将 Windows 语音合成器的语言设置为英语。如果没有安装英语语音，则不会说话\"\n\n#: thotkeyform.cbforceenglishdeactivate.caption\nmsgctxt \"thotkeyform.cbforceenglishdeactivate.caption\"\nmsgid \"Force English\"\nmsgstr \"强制使用英语\"\n\n#: thotkeyform.cbforceenglishdeactivate.hint\nmsgctxt \"thotkeyform.cbforceenglishdeactivate.hint\"\nmsgid \"\"\n\"Tries to set the language of the windows speech synthesizer to English when speaking this. Won't speak if there is no \"\n\"English voice installed\"\nmsgstr \"尝试在说出此内容时将 Windows 语音合成器的语言设置为英语。如果没有安装英语语音，则不会说话\"\n\n#: thotkeyform.cbfreezedirection.text\nmsgctxt \"thotkeyform.cbfreezedirection.text\"\nmsgid \"Toggle freeze\"\nmsgstr \"切换冻结\"\n\n#: thotkeyform.listview1.columns[0].caption\nmsgctxt \"thotkeyform.listview1.columns[0].caption\"\nmsgid \"Hotkey\"\nmsgstr \"热键\"\n\n#: thotkeyform.listview1.columns[2].caption\nmsgctxt \"thotkeyform.listview1.columns[2].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: thotkeyform.listview1.columns[3].caption\nmsgctxt \"thotkeyform.listview1.columns[3].caption\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: thotkeyform.midelete.caption\nmsgctxt \"thotkeyform.midelete.caption\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: tinputboxtop.button1.caption\nmsgctxt \"tinputboxtop.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tinputboxtop.button2.caption\nmsgctxt \"tinputboxtop.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tinputboxtop.label1.caption\nmsgctxt \"tinputboxtop.label1.caption\"\nmsgid \"Label1\"\nmsgstr \"标签1\"\n\n#: tmainform.actopen.hint\nmsgctxt \"tmainform.actopen.hint\"\nmsgid \"Open a cheat table or unprotected cetrainer\"\nmsgstr \"打开作弊表或未保护的训练器\"\n\n#: tmainform.actsave.hint\nmsgctxt \"tmainform.actsave.hint\"\nmsgid \"Save your current data. Save as .exe to create a standalone trainer\"\nmsgstr \"保存当前数据。另存为 .exe 以创建独立训练器\"\n\n#: tmainform.address1.caption\nmsgctxt \"tmainform.address1.caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tmainform.andlabel.caption\nmsgctxt \"tmainform.andlabel.caption\"\nmsgid \"and\"\nmsgstr \"和\"\n\n#: tmainform.browsethismemoryarrea1.caption\nmsgctxt \"tmainform.browsethismemoryarrea1.caption\"\nmsgid \"Browse this memory region\"\nmsgstr \"浏览此内存区域\"\n\n#: tmainform.browsethismemoryregion1.caption\nmsgctxt \"tmainform.browsethismemoryregion1.caption\"\nmsgid \"Browse this memory region\"\nmsgstr \"浏览此内存区域\"\n\n#: tmainform.browsethismemoryregioninthedisassembler1.caption\nmsgctxt \"tmainform.browsethismemoryregioninthedisassembler1.caption\"\nmsgid \"Disassemble this memory region\"\nmsgstr \"反汇编此内存区域\"\n\n#: tmainform.btnnewscan.caption\nmsgctxt \"tmainform.btnnewscan.caption\"\nmsgid \"First Scan\"\nmsgstr \"第一次扫描\"\n\n#: tmainform.btnnextscan.caption\nmsgctxt \"tmainform.btnnextscan.caption\"\nmsgid \"Next Scan\"\nmsgstr \"下一次扫描\"\n\n#: tmainform.btnsetspeedhack2.caption\nmsgctxt \"tmainform.btnsetspeedhack2.caption\"\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n#: tmainform.caption\nmsgctxt \"tmainform.caption\"\nmsgid \"Cheat Engine\"\nmsgstr \"Cheat Engine\"\n\n#: tmainform.cbcasesensitive.caption\nmsgctxt \"tmainform.cbcasesensitive.caption\"\nmsgid \"Case sensitive\"\nmsgstr \"区分大小写\"\n\n#: tmainform.cbcodepage.caption\nmsgctxt \"tmainform.cbcodepage.caption\"\nmsgid \"Codepage\"\nmsgstr \"代码页\"\n\n#: tmainform.cbcomparetosavedscan.caption\nmsgctxt \"tmainform.cbcomparetosavedscan.caption\"\nmsgid \"Compare to first/saved scan\"\nmsgstr \"与第一次/保存的扫描进行比较\"\n\n#: tmainform.cbhexadecimal.caption\nmsgctxt \"tmainform.cbhexadecimal.caption\"\nmsgid \"Hex\"\nmsgstr \"十六进制\"\n\n#: tmainform.cbspeedhack.caption\nmsgctxt \"tmainform.cbspeedhack.caption\"\nmsgid \"Enable Speedhack\"\nmsgstr \"启用速度破解\"\n\n#: tmainform.cbunicode.caption\nmsgctxt \"tmainform.cbunicode.caption\"\nmsgid \"UTF-16\"\nmsgstr \"UTF-16\"\n\n#: tmainform.cbunrandomizer.caption\nmsgctxt \"tmainform.cbunrandomizer.caption\"\nmsgid \"Unrandomizer\"\nmsgstr \"去随机化\"\n\n#: tmainform.changescript1.caption\nmsgctxt \"tmainform.changescript1.caption\"\nmsgid \"Change script\"\nmsgstr \"更改脚本\"\n\n#: tmainform.copy1.caption\nmsgctxt \"tmainform.copy1.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tmainform.copy2.caption\nmsgctxt \"tmainform.copy2.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tmainform.createprocess1.caption\nmsgctxt \"tmainform.createprocess1.caption\"\nmsgid \"Create Process\"\nmsgstr \"创建进程\"\n\n#: tmainform.cut1.caption\nmsgctxt \"tmainform.cut1.caption\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: tmainform.cut2.caption\nmsgctxt \"tmainform.cut2.caption\"\nmsgid \"Cut\"\nmsgstr \"剪切\"\n\n#: tmainform.description1.caption\nmsgctxt \"tmainform.description1.caption\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#: tmainform.editsh2.text\nmsgctxt \"tmainform.editsh2.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: tmainform.edtalignment.text\nmsgctxt \"tmainform.edtalignment.text\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: tmainform.findoutwhataccessesthisaddress1.caption\nmsgctxt \"tmainform.findoutwhataccessesthisaddress1.caption\"\nmsgid \"Find out what accesses this address\"\nmsgstr \"找出访问此地址的内容\"\n\n#: tmainform.forcerechecksymbols1.caption\nmsgctxt \"tmainform.forcerechecksymbols1.caption\"\nmsgid \"Force recheck symbols\"\nmsgstr \"强制重新检查符号\"\n\n#: tmainform.foundcountlabel.caption\nmsgctxt \"tmainform.foundcountlabel.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tmainform.foundlist3.columns[0].caption\nmsgctxt \"tmainform.foundlist3.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tmainform.foundlist3.columns[1].caption\nmsgctxt \"tmainform.foundlist3.columns[1].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tmainform.foundlist3.columns[2].caption\nmsgctxt \"tmainform.foundlist3.columns[2].caption\"\nmsgid \"Previous\"\nmsgstr \"之前\"\n\n#: tmainform.fromaddress.text\nmsgctxt \"tmainform.fromaddress.text\"\nmsgid \"00000000\"\nmsgstr \"00000000\"\n\n#: tmainform.label1.caption\nmsgctxt \"tmainform.label1.caption\"\nmsgid \"Start\"\nmsgstr \"开始\"\n\n#: tmainform.label2.caption\nmsgctxt \"tmainform.label2.caption\"\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: tmainform.label6.caption\nmsgctxt \"tmainform.label6.caption\"\nmsgid \"Found:\"\nmsgstr \"找到：\"\n\n#: tmainform.lblsh0.caption\nmsgctxt \"tmainform.lblsh0.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: tmainform.lblsh20.caption\nmsgctxt \"tmainform.lblsh20.caption\"\nmsgid \"500\"\nmsgstr \"500\"\n\n#: tmainform.load1.caption\nmsgctxt \"tmainform.load1.caption\"\nmsgid \"Load\"\nmsgstr \"加载\"\n\n#: tmainform.menuitem8.caption\nmsgctxt \"tmainform.menuitem8.caption\"\nmsgid \"Open Process\"\nmsgstr \"打开进程\"\n\n#: tmainform.miabout.caption\nmsgctxt \"tmainform.miabout.caption\"\nmsgid \"About\"\nmsgstr \"关于\"\n\n#: tmainform.micompression.caption\nmsgctxt \"tmainform.micompression.caption\"\nmsgid \"Compression\"\nmsgstr \"压缩\"\n\n#: tmainform.midisassemble.caption\nmsgctxt \"tmainform.midisassemble.caption\"\nmsgid \"Disassemble this memory region\"\nmsgstr \"反汇编此内存区域\"\n\n#: tmainform.midisplay2byte.caption\nmsgctxt \"tmainform.midisplay2byte.caption\"\nmsgid \"2 Bytes\"\nmsgstr \"2 字节\"\n\n#: tmainform.midisplay4byte.caption\nmsgctxt \"tmainform.midisplay4byte.caption\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tmainform.midisplay8byte.caption\nmsgctxt \"tmainform.midisplay8byte.caption\"\nmsgid \"8 Bytes\"\nmsgstr \"8 字节\"\n\n#: tmainform.midisplaybyte.caption\nmsgctxt \"tmainform.midisplaybyte.caption\"\nmsgid \"Byte\"\nmsgstr \"字节\"\n\n#: tmainform.midisplaydefault.caption\nmsgctxt \"tmainform.midisplaydefault.caption\"\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: tmainform.midisplaydouble.caption\nmsgctxt \"tmainform.midisplaydouble.caption\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: tmainform.midisplayfloat.caption\nmsgctxt \"tmainform.midisplayfloat.caption\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: tmainform.midisplayhex.caption\nmsgctxt \"tmainform.midisplayhex.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: tmainform.miflfindwhataccesses.caption\nmsgctxt \"tmainform.miflfindwhataccesses.caption\"\nmsgid \"Find out what accesses this address\"\nmsgstr \"找出访问此地址的内容\"\n\n#: tmainform.miflfindwhatwrites.caption\nmsgctxt \"tmainform.miflfindwhatwrites.caption\"\nmsgid \"Find out what writes to this address\"\nmsgstr \"找出写入此地址的内容\"\n\n#: tmainform.mifoundlistpreferences.caption\nmsgctxt \"tmainform.mifoundlistpreferences.caption\"\nmsgid \"Preferences\"\nmsgstr \"首选项\"\n\n#: tmainform.migeneratepointermap.caption\nmsgctxt \"tmainform.migeneratepointermap.caption\"\nmsgid \"Generate pointermap\"\nmsgstr \"生成指针图\"\n\n#: tmainform.milanguages.caption\nmsgctxt \"tmainform.milanguages.caption\"\nmsgid \"Languages\"\nmsgstr \"语言\"\n\n#: tmainform.minetwork.caption\nmsgctxt \"tmainform.minetwork.caption\"\nmsgid \"Network\"\nmsgstr \"网络\"\n\n#: tmainform.minetworkreaduseprocmem.caption\nmsgctxt \"tmainform.minetworkreaduseprocmem.caption\"\nmsgid \"0: /proc/pid/mem\"\nmsgstr \"0: /proc/pid/mem\"\n\n#: tmainform.minetworkwriteuseprocmem.caption\nmsgctxt \"tmainform.minetworkwriteuseprocmem.caption\"\nmsgid \"0: /proc/pid/mem\"\nmsgstr \"0: /proc/pid/mem\"\n\n#: tmainform.miopenfile.caption\nmsgctxt \"tmainform.miopenfile.caption\"\nmsgid \"Open File\"\nmsgstr \"打开文件\"\n\n#: tmainform.mirecordconfigactivatesetvalue.caption\nmsgctxt \"tmainform.mirecordconfigactivatesetvalue.caption\"\nmsgid \"Set Value\"\nmsgstr \"设置值\"\n\n#: tmainform.mirenametab.caption\nmsgctxt \"tmainform.mirenametab.caption\"\nmsgid \"Rename\"\nmsgstr \"重命名\"\n\n#: tmainform.misave.caption\nmsgctxt \"tmainform.misave.caption\"\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: tmainform.mishowasbinary.caption\nmsgctxt \"tmainform.mishowasbinary.caption\"\nmsgid \"Show as binary\"\nmsgstr \"以二进制形式显示\"\n\n#: tmainform.mishowassigned.caption\nmsgctxt \"tmainform.mishowassigned.caption\"\nmsgid \"Show as signed\"\nmsgstr \"以有符号形式显示\"\n\n#: tmainform.misnapshothandler.caption\nmsgctxt \"tmainform.misnapshothandler.caption\"\nmsgid \"Snapshot handler\"\nmsgstr \"快照处理程序\"\n\n#: tmainform.mitriggeraccessviolation.caption\nmsgctxt \"tmainform.mitriggeraccessviolation.caption\"\nmsgid \"Test access violation\"\nmsgstr \"测试访问冲突\"\n\n#: tmainform.mitutorial64.caption\nmsgctxt \"tmainform.mitutorial64.caption\"\nmsgid \"Cheat Engine Tutorial (x86_64)\"\nmsgstr \"Cheat Engine 教程 (x86_64)\"\n\n#: tmainform.miundovalue.caption\nmsgctxt \"tmainform.miundovalue.caption\"\nmsgid \"Undo last edit\"\nmsgstr \"撤销上次编辑\"\n\n#: tmainform.new1.caption\nmsgctxt \"tmainform.new1.caption\"\nmsgid \"Clear list\"\nmsgstr \"清空列表\"\n\n#: tmainform.paste1.caption\nmsgctxt \"tmainform.paste1.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tmainform.paste2.caption\nmsgctxt \"tmainform.paste2.caption\"\nmsgid \"Paste\"\nmsgstr \"粘贴\"\n\n#: tmainform.plugins1.caption\nmsgctxt \"tmainform.plugins1.caption\"\nmsgid \"Plugins\"\nmsgstr \"插件\"\n\n#: tmainform.rbdec.caption\nmsgctxt \"tmainform.rbdec.caption\"\nmsgid \"Decimal\"\nmsgstr \"十进制\"\n\n#: tmainform.removeselectedaddresses1.caption\nmsgctxt \"tmainform.removeselectedaddresses1.caption\"\nmsgid \"Remove selected addresses\"\nmsgstr \"删除选定地址\"\n\n#: tmainform.save1.caption\nmsgctxt \"tmainform.save1.caption\"\nmsgid \"Save As...\"\nmsgstr \"另存为...\"\n\n#: tmainform.scantext.caption\nmsgctxt \"tmainform.scantext.caption\"\nmsgid \"Scan Value\"\nmsgstr \"扫描值\"\n\n#: tmainform.scantext2.caption\nmsgctxt \"tmainform.scantext2.caption\"\nmsgid \"Scan Value\"\nmsgstr \"扫描值\"\n\n#: tmainform.setbreakpoint1.caption\nmsgctxt \"tmainform.setbreakpoint1.caption\"\nmsgid \"Find out what writes to this address\"\nmsgstr \"找出写入此地址的内容\"\n\n#: tmainform.settings1.caption\nmsgctxt \"tmainform.settings1.caption\"\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#: tmainform.settingsbutton.caption\nmsgctxt \"tmainform.settingsbutton.caption\"\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#: tmainform.showashexadecimal1.caption\nmsgctxt \"tmainform.showashexadecimal1.caption\"\nmsgid \"Show as hexadecimal\"\nmsgstr \"以十六进制显示\"\n\n#: tmainform.type1.caption\nmsgctxt \"tmainform.type1.caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: tmainform.value1.caption\nmsgctxt \"tmainform.value1.caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tmainform.vartype.text\nmsgctxt \"tmainform.vartype.text\"\nmsgid \"Binary\"\nmsgstr \"二进制\"\n\n#: tmemorybrowser.addthisaddresstothelist1.caption\nmsgctxt \"tmemorybrowser.addthisaddresstothelist1.caption\"\nmsgid \"Add this address to the list\"\nmsgstr \"将此地址添加到列表\"\n\n#: tmemorybrowser.aflabel.caption\nmsgctxt \"tmemorybrowser.aflabel.caption\"\nmsgid \"AF 0\"\nmsgstr \"AF 0\"\n\n#: tmemorybrowser.back1.caption\nmsgctxt \"tmemorybrowser.back1.caption\"\nmsgid \"Back\"\nmsgstr \"返回\"\n\n#: tmemorybrowser.cflabel.caption\nmsgctxt \"tmemorybrowser.cflabel.caption\"\nmsgid \"CF 0\"\nmsgstr \"CF 0\"\n\n#: tmemorybrowser.change1.caption\nmsgctxt \"tmemorybrowser.change1.caption\"\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: tmemorybrowser.copybytes.caption\nmsgctxt \"tmemorybrowser.copybytes.caption\"\nmsgid \"Bytes\"\nmsgstr \"字节\"\n\n#: tmemorybrowser.copytoclipboard1.caption\nmsgctxt \"tmemorybrowser.copytoclipboard1.caption\"\nmsgid \"Copy to clipboard\"\nmsgstr \"复制到剪贴板\"\n\n#: tmemorybrowser.cslabel.caption\nmsgctxt \"tmemorybrowser.cslabel.caption\"\nmsgid \"CS 0000\"\nmsgstr \"CS 0000\"\n\n#: tmemorybrowser.cut1.caption\nmsgctxt \"tmemorybrowser.cut1.caption\"\nmsgid \"Copy to clipboard\"\nmsgstr \"复制到剪贴板\"\n\n#: tmemorybrowser.debug1.caption\nmsgctxt \"tmemorybrowser.debug1.caption\"\nmsgid \"Debug\"\nmsgstr \"调试\"\n\n#: tmemorybrowser.debugstrings1.caption\nmsgctxt \"tmemorybrowser.debugstrings1.caption\"\nmsgid \"Debug strings\"\nmsgstr \"调试字符串\"\n\n#: tmemorybrowser.dflabel.caption\nmsgctxt \"tmemorybrowser.dflabel.caption\"\nmsgid \"DF 0\"\nmsgstr \"DF 0\"\n\n#: tmemorybrowser.dispdouble.caption\nmsgctxt \"tmemorybrowser.dispdouble.caption\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: tmemorybrowser.dispfloat.caption\nmsgctxt \"tmemorybrowser.dispfloat.caption\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: tmemorybrowser.dissectdata1.caption\nmsgctxt \"tmemorybrowser.dissectdata1.caption\"\nmsgid \"Pointer scan\"\nmsgstr \"指针扫描\"\n\n#: tmemorybrowser.driverlist1.caption\nmsgctxt \"tmemorybrowser.driverlist1.caption\"\nmsgid \"Driver list\"\nmsgstr \"驱动程序列表\"\n\n#: tmemorybrowser.dslabel.caption\nmsgctxt \"tmemorybrowser.dslabel.caption\"\nmsgid \"DS 0000\"\nmsgstr \"DS 0000\"\n\n#: tmemorybrowser.eaxlabel.caption\nmsgctxt \"tmemorybrowser.eaxlabel.caption\"\nmsgid \"EAX 00000000\"\nmsgstr \"EAX 00000000\"\n\n#: tmemorybrowser.ebplabel.caption\nmsgctxt \"tmemorybrowser.ebplabel.caption\"\nmsgid \"EBP 00000000\"\nmsgstr \"EBP 00000000\"\n\n#: tmemorybrowser.ebxlabel.caption\nmsgctxt \"tmemorybrowser.ebxlabel.caption\"\nmsgid \"EBX 00000000\"\nmsgstr \"EBX 00000000\"\n\n#: tmemorybrowser.ecxlabel.caption\nmsgctxt \"tmemorybrowser.ecxlabel.caption\"\nmsgid \"ECX 00000000\"\nmsgstr \"ECX 00000000\"\n\n#: tmemorybrowser.edilabel.caption\nmsgctxt \"tmemorybrowser.edilabel.caption\"\nmsgid \"EDI 00000000\"\nmsgstr \"EDI 00000000\"\n\n#: tmemorybrowser.edxlabel.caption\nmsgctxt \"tmemorybrowser.edxlabel.caption\"\nmsgid \"EDX 00000000\"\nmsgstr \"EDX 00000000\"\n\n#: tmemorybrowser.eiplabel.caption\nmsgctxt \"tmemorybrowser.eiplabel.caption\"\nmsgid \"EIP 00000000\"\nmsgstr \"EIP 00000000\"\n\n#: tmemorybrowser.esilabel.caption\nmsgctxt \"tmemorybrowser.esilabel.caption\"\nmsgid \"ESI 00000000\"\nmsgstr \"ESI 00000000\"\n\n#: tmemorybrowser.eslabel.caption\nmsgctxt \"tmemorybrowser.eslabel.caption\"\nmsgid \"ES 0000\"\nmsgstr \"ES 0000\"\n\n#: tmemorybrowser.esplabel.caption\nmsgctxt \"tmemorybrowser.esplabel.caption\"\nmsgid \"ESP 00000000\"\nmsgstr \"ESP 00000000\"\n\n#: tmemorybrowser.extra1.caption\nmsgctxt \"tmemorybrowser.extra1.caption\"\nmsgid \"Tools\"\nmsgstr \"工具\"\n\n#: tmemorybrowser.file1.caption\nmsgctxt \"tmemorybrowser.file1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tmemorybrowser.findstaticpointers1.caption\nmsgctxt \"tmemorybrowser.findstaticpointers1.caption\"\nmsgid \"Find static addresses\"\nmsgstr \"查找静态地址\"\n\n#: tmemorybrowser.follow1.caption\nmsgctxt \"tmemorybrowser.follow1.caption\"\nmsgid \"Follow\"\nmsgstr \"跟随\"\n\n#: tmemorybrowser.fslabel.caption\nmsgctxt \"tmemorybrowser.fslabel.caption\"\nmsgid \"FS 0000\"\nmsgstr \"FS 0000\"\n\n#: tmemorybrowser.gslabel.caption\nmsgctxt \"tmemorybrowser.gslabel.caption\"\nmsgid \"GS 0000\"\nmsgstr \"GS 0000\"\n\n#: tmemorybrowser.jumplines1.caption\nmsgctxt \"tmemorybrowser.jumplines1.caption\"\nmsgid \"Jumplines\"\nmsgstr \"跳转行\"\n\n#: tmemorybrowser.lblflags.caption\nmsgctxt \"tmemorybrowser.lblflags.caption\"\nmsgid \"Flags\"\nmsgstr \"标志\"\n\n#: tmemorybrowser.lblregisters.caption\nmsgctxt \"tmemorybrowser.lblregisters.caption\"\nmsgid \"Registers:\"\nmsgstr \"寄存器：\"\n\n#: tmemorybrowser.lblspecial.caption\nmsgctxt \"tmemorybrowser.lblspecial.caption\"\nmsgid \"Special\"\nmsgstr \"特殊\"\n\n#: tmemorybrowser.lvstacktracedata.columns[0].caption\nmsgctxt \"tmemorybrowser.lvstacktracedata.columns[0].caption\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: tmemorybrowser.lvstacktracedata.columns[2].caption\nmsgctxt \"tmemorybrowser.lvstacktracedata.columns[2].caption\"\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: tmemorybrowser.miaddebp.caption\nmsgctxt \"tmemorybrowser.miaddebp.caption\"\nmsgid \"(ebp+*)\"\nmsgstr \"(ebp+*)\"\n\n#: tmemorybrowser.miaddesp.caption\nmsgctxt \"tmemorybrowser.miaddesp.caption\"\nmsgid \"(esp+*)\"\nmsgstr \"(esp+*)\"\n\n#: tmemorybrowser.miaddref.caption\n#, object-pascal-format\nmsgctxt \"tmemorybrowser.miaddref.caption\"\nmsgid \"(ref+*) Ref will be %x\"\nmsgstr \"(ref+*) 引用将是 %x\"\n\n#: tmemorybrowser.miarchautodetect.caption\nmsgctxt \"tmemorybrowser.miarchautodetect.caption\"\nmsgid \"Autodetect\"\nmsgstr \"自动检测\"\n\n#: tmemorybrowser.mibinutilsselect.caption\nmsgctxt \"tmemorybrowser.mibinutilsselect.caption\"\nmsgid \"None\"\nmsgstr \"无\"\n\n#: tmemorybrowser.mibreakandtrace.caption\nmsgctxt \"tmemorybrowser.mibreakandtrace.caption\"\nmsgid \"Break and trace\"\nmsgstr \"中断和跟踪\"\n\n#: tmemorybrowser.michangeprotectionr.caption\nmsgctxt \"tmemorybrowser.michangeprotectionr.caption\"\nmsgid \"Read\"\nmsgstr \"读取\"\n\n#: tmemorybrowser.micodefilter.caption\nmsgctxt \"tmemorybrowser.micodefilter.caption\"\nmsgid \"Code Filter\"\nmsgstr \"代码过滤器\"\n\n#: tmemorybrowser.micomparestructures.caption\nmsgctxt \"tmemorybrowser.micomparestructures.caption\"\nmsgid \"Compare data/structures\"\nmsgstr \"比较数据/结构\"\n\n#: tmemorybrowser.midebugbreak.caption\nmsgctxt \"tmemorybrowser.midebugbreak.caption\"\nmsgid \"Break\"\nmsgstr \"中断\"\n\n#: tmemorybrowser.midebugrun.caption\nmsgctxt \"tmemorybrowser.midebugrun.caption\"\nmsgid \"Run\"\nmsgstr \"运行\"\n\n#: tmemorybrowser.midebugruntill.caption\nmsgctxt \"tmemorybrowser.midebugruntill.caption\"\nmsgid \"Run till...\"\nmsgstr \"运行直到...\"\n\n#: tmemorybrowser.midebugstep.caption\nmsgctxt \"tmemorybrowser.midebugstep.caption\"\nmsgid \"Step Into\"\nmsgstr \"逐步进入\"\n\n#: tmemorybrowser.midebugstepover.caption\nmsgctxt \"tmemorybrowser.midebugstepover.caption\"\nmsgid \"Step Over\"\nmsgstr \"逐步跳过\"\n\n#: tmemorybrowser.midisassemblyautodetect.caption\nmsgctxt \"tmemorybrowser.midisassemblyautodetect.caption\"\nmsgid \"Autodetect\"\nmsgstr \"自动检测\"\n\n#: tmemorybrowser.miexceptionregionautoaddallocs.caption\nmsgctxt \"tmemorybrowser.miexceptionregionautoaddallocs.caption\"\nmsgid \"Automatically add allocated memory by CE as watched regions\"\nmsgstr \"自动将 CE 分配的内存添加为监视区域\"\n\n#: tmemorybrowser.mifindwhataccesses.caption\nmsgctxt \"tmemorybrowser.mifindwhataccesses.caption\"\nmsgid \"Find out what accesses this address\"\nmsgstr \"找出访问此地址的内容\"\n\n#: tmemorybrowser.migotobookmark.caption\nmsgctxt \"tmemorybrowser.migotobookmark.caption\"\nmsgid \"Goto bookmark\"\nmsgstr \"转到书签\"\n\n#: tmemorybrowser.migotobookmark0.caption\nmsgctxt \"tmemorybrowser.migotobookmark0.caption\"\nmsgid \"Bookmark 0\"\nmsgstr \"书签 0\"\n\n#: tmemorybrowser.migotobookmark1.caption\nmsgctxt \"tmemorybrowser.migotobookmark1.caption\"\nmsgid \"Bookmark 1\"\nmsgstr \"书签 1\"\n\n#: tmemorybrowser.migotobookmark2.caption\nmsgctxt \"tmemorybrowser.migotobookmark2.caption\"\nmsgid \"Bookmark 2\"\nmsgstr \"书签 2\"\n\n#: tmemorybrowser.migotobookmark3.caption\nmsgctxt \"tmemorybrowser.migotobookmark3.caption\"\nmsgid \"Bookmark 3\"\nmsgstr \"书签 3\"\n\n#: tmemorybrowser.migotobookmark4.caption\nmsgctxt \"tmemorybrowser.migotobookmark4.caption\"\nmsgid \"Bookmark 4\"\nmsgstr \"书签 4\"\n\n#: tmemorybrowser.migotobookmark5.caption\nmsgctxt \"tmemorybrowser.migotobookmark5.caption\"\nmsgid \"Bookmark 5\"\nmsgstr \"书签 5\"\n\n#: tmemorybrowser.migotobookmark6.caption\nmsgctxt \"tmemorybrowser.migotobookmark6.caption\"\nmsgid \"Bookmark 6\"\nmsgstr \"书签 6\"\n\n#: tmemorybrowser.migotobookmark7.caption\nmsgctxt \"tmemorybrowser.migotobookmark7.caption\"\nmsgid \"Bookmark 7\"\nmsgstr \"书签 7\"\n\n#: tmemorybrowser.migotobookmark8.caption\nmsgctxt \"tmemorybrowser.migotobookmark8.caption\"\nmsgid \"Bookmark 8\"\nmsgstr \"书签 8\"\n\n#: tmemorybrowser.migotobookmark9.caption\nmsgctxt \"tmemorybrowser.migotobookmark9.caption\"\nmsgid \"Bookmark 9\"\nmsgstr \"书签 9\"\n\n#: tmemorybrowser.mihvback.caption\nmsgctxt \"tmemorybrowser.mihvback.caption\"\nmsgid \"Back\"\nmsgstr \"返回\"\n\n#: tmemorybrowser.mihvfollow.caption\nmsgctxt \"tmemorybrowser.mihvfollow.caption\"\nmsgid \"Follow\"\nmsgstr \"跟随\"\n\n#: tmemorybrowser.miloadtrace.caption\nmsgctxt \"tmemorybrowser.miloadtrace.caption\"\nmsgid \"Load trace\"\nmsgstr \"加载跟踪\"\n\n#: tmemorybrowser.milock.caption\nmsgctxt \"tmemorybrowser.milock.caption\"\nmsgid \"Link with other hexview\"\nmsgstr \"与其他十六进制视图链接\"\n\n#: tmemorybrowser.milockrowsize.caption\nmsgctxt \"tmemorybrowser.milockrowsize.caption\"\nmsgid \"Set custom alignment\"\nmsgstr \"设置自定义对齐\"\n\n#: tmemorybrowser.miluaengine.caption\nmsgctxt \"tmemorybrowser.miluaengine.caption\"\nmsgid \"Lua Engine\"\nmsgstr \"Lua 引擎\"\n\n#: tmemorybrowser.mipointerspider.caption\nmsgctxt \"tmemorybrowser.mipointerspider.caption\"\nmsgid \"Structure spider\"\nmsgstr \"结构爬虫\"\n\n#: tmemorybrowser.mireferencedfunctions.caption\nmsgctxt \"tmemorybrowser.mireferencedfunctions.caption\"\nmsgid \"Referenced functions\"\nmsgstr \"引用函数\"\n\n#: tmemorybrowser.mireplacewithnops.caption\nmsgctxt \"tmemorybrowser.mireplacewithnops.caption\"\nmsgid \"Replace with code that does nothing\"\nmsgstr \"替换为无操作的代码\"\n\n#: tmemorybrowser.mirununhandled.caption\nmsgctxt \"tmemorybrowser.mirununhandled.caption\"\nmsgid \"Run Unhandled\"\nmsgstr \"运行未处理\"\n\n#: tmemorybrowser.misearchforaccessiblestrings.caption\nmsgctxt \"tmemorybrowser.misearchforaccessiblestrings.caption\"\nmsgid \"Search for accessible strings\"\nmsgstr \"搜索可访问的字符串\"\n\n#: tmemorybrowser.miselectcurrentfunction.caption\nmsgctxt \"tmemorybrowser.miselectcurrentfunction.caption\"\nmsgid \"Select current function\"\nmsgstr \"选择当前函数\"\n\n#: tmemorybrowser.misepevery2bytes.caption\nmsgctxt \"tmemorybrowser.misepevery2bytes.caption\"\nmsgid \"2 Bytes\"\nmsgstr \"2 字节\"\n\n#: tmemorybrowser.misepevery4bytes.caption\nmsgctxt \"tmemorybrowser.misepevery4bytes.caption\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: tmemorybrowser.misepevery8bytes.caption\nmsgctxt \"tmemorybrowser.misepevery8bytes.caption\"\nmsgid \"8 Bytes\"\nmsgstr \"8 字节\"\n\n#: tmemorybrowser.misetbookmark0.caption\nmsgctxt \"tmemorybrowser.misetbookmark0.caption\"\nmsgid \"Bookmark 0\"\nmsgstr \"书签 0\"\n\n#: tmemorybrowser.misetbookmark1.caption\nmsgctxt \"tmemorybrowser.misetbookmark1.caption\"\nmsgid \"Bookmark 1\"\nmsgstr \"书签 1\"\n\n#: tmemorybrowser.misetbookmark2.caption\nmsgctxt \"tmemorybrowser.misetbookmark2.caption\"\nmsgid \"Bookmark 2\"\nmsgstr \"书签 2\"\n\n#: tmemorybrowser.misetbookmark3.caption\nmsgctxt \"tmemorybrowser.misetbookmark3.caption\"\nmsgid \"Bookmark 3\"\nmsgstr \"书签 3\"\n\n#: tmemorybrowser.misetbookmark4.caption\nmsgctxt \"tmemorybrowser.misetbookmark4.caption\"\nmsgid \"Bookmark 4\"\nmsgstr \"书签 4\"\n\n#: tmemorybrowser.misetbookmark5.caption\nmsgctxt \"tmemorybrowser.misetbookmark5.caption\"\nmsgid \"Bookmark 5\"\nmsgstr \"书签 5\"\n\n#: tmemorybrowser.misetbookmark6.caption\nmsgctxt \"tmemorybrowser.misetbookmark6.caption\"\nmsgid \"Bookmark 6\"\nmsgstr \"书签 6\"\n\n#: tmemorybrowser.misetbookmark7.caption\nmsgctxt \"tmemorybrowser.misetbookmark7.caption\"\nmsgid \"Bookmark 7\"\nmsgstr \"书签 7\"\n\n#: tmemorybrowser.misetbookmark8.caption\nmsgctxt \"tmemorybrowser.misetbookmark8.caption\"\nmsgid \"Bookmark 8\"\nmsgstr \"书签 8\"\n\n#: tmemorybrowser.misetbookmark9.caption\nmsgctxt \"tmemorybrowser.misetbookmark9.caption\"\nmsgid \"Bookmark 9\"\nmsgstr \"书签 9\"\n\n#: tmemorybrowser.misetbreakpointhw.caption\nmsgctxt \"tmemorybrowser.misetbreakpointhw.caption\"\nmsgid \"Hardware Breakpoint\"\nmsgstr \"硬件断点\"\n\n#: tmemorybrowser.misetbreakpointsw.caption\nmsgctxt \"tmemorybrowser.misetbreakpointsw.caption\"\nmsgid \"Software Breakpoint\"\nmsgstr \"软件断点\"\n\n#: tmemorybrowser.misetunsetbookmark.caption\nmsgctxt \"tmemorybrowser.misetunsetbookmark.caption\"\nmsgid \"Set/Unset bookmark\"\nmsgstr \"设置/取消书签\"\n\n#: tmemorybrowser.mishowdifference.caption\nmsgctxt \"tmemorybrowser.mishowdifference.caption\"\nmsgid \"Show difference\"\nmsgstr \"显示差异\"\n\n#: tmemorybrowser.mishowrelative.caption\nmsgctxt \"tmemorybrowser.mishowrelative.caption\"\nmsgid \"Show relative addresses\"\nmsgstr \"显示相对地址\"\n\n#: tmemorybrowser.mishowrelativedisassembler.caption\nmsgctxt \"tmemorybrowser.mishowrelativedisassembler.caption\"\nmsgid \"Show relative addresses\"\nmsgstr \"显示相对地址\"\n\n#: tmemorybrowser.misvcopy.caption\nmsgctxt \"tmemorybrowser.misvcopy.caption\"\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: tmemorybrowser.mitextencoding.caption\nmsgctxt \"tmemorybrowser.mitextencoding.caption\"\nmsgid \"Text Encoding\"\nmsgstr \"文本编码\"\n\n#: tmemorybrowser.mitextencoding16.caption\nmsgctxt \"tmemorybrowser.mitextencoding16.caption\"\nmsgid \"UTF-16\"\nmsgstr \"UTF-16\"\n\n#: tmemorybrowser.mitextencodingcodepage.caption\nmsgctxt \"tmemorybrowser.mitextencodingcodepage.caption\"\nmsgid \"Codepage\"\nmsgstr \"代码页\"\n\n#: tmemorybrowser.mitextpreferences.caption\nmsgctxt \"tmemorybrowser.mitextpreferences.caption\"\nmsgid \"Preferences\"\nmsgstr \"首选项\"\n\n#: tmemorybrowser.mitogglebreakpoint.caption\nmsgctxt \"tmemorybrowser.mitogglebreakpoint.caption\"\nmsgid \"Set breakpoint\"\nmsgstr \"设置断点\"\n\n#: tmemorybrowser.miultimap.caption\nmsgctxt \"tmemorybrowser.miultimap.caption\"\nmsgid \"Ultimap\"\nmsgstr \"Ultimap\"\n\n#: tmemorybrowser.miultimap2.caption\nmsgctxt \"tmemorybrowser.miultimap2.caption\"\nmsgid \"Ultimap 2\"\nmsgstr \"Ultimap 2\"\n\n#: tmemorybrowser.miundolastedit.caption\nmsgctxt \"tmemorybrowser.miundolastedit.caption\"\nmsgid \"Undo last edit\"\nmsgstr \"撤销上次编辑\"\n\n#: tmemorybrowser.miunexpectedexceptionbreakalways.caption\nmsgctxt \"tmemorybrowser.miunexpectedexceptionbreakalways.caption\"\nmsgid \"Always\"\nmsgstr \"始终\"\n\n#: tmemorybrowser.miunexpectedexceptionbreaknever.caption\nmsgctxt \"tmemorybrowser.miunexpectedexceptionbreaknever.caption\"\nmsgid \"Never\"\nmsgstr \"从不\"\n\n#: tmemorybrowser.miuserwriteinteger.caption\nmsgctxt \"tmemorybrowser.miuserwriteinteger.caption\"\nmsgid \"User write history\"\nmsgstr \"用户写入历史\"\n\n#: tmemorybrowser.miwatchaccess.caption\nmsgctxt \"tmemorybrowser.miwatchaccess.caption\"\nmsgid \"Break on Access\"\nmsgstr \"访问时中断\"\n\n#: tmemorybrowser.miwatchbpdbvm.caption\nmsgctxt \"tmemorybrowser.miwatchbpdbvm.caption\"\nmsgid \"DBVM Breakpoint\"\nmsgstr \"DBVM 断点\"\n\n#: tmemorybrowser.miwatchbpexception.caption\nmsgctxt \"tmemorybrowser.miwatchbpexception.caption\"\nmsgid \"Exception Breakpoint\"\nmsgstr \"异常断点\"\n\n#: tmemorybrowser.miwatchbphardware.caption\nmsgctxt \"tmemorybrowser.miwatchbphardware.caption\"\nmsgid \"Hardware Breakpoint\"\nmsgstr \"硬件断点\"\n\n#: tmemorybrowser.miwatchlist.caption\nmsgctxt \"tmemorybrowser.miwatchlist.caption\"\nmsgid \"Watchlist\"\nmsgstr \"监视列表\"\n\n#: tmemorybrowser.miwatchmemorypageaccess.caption\nmsgctxt \"tmemorybrowser.miwatchmemorypageaccess.caption\"\nmsgid \"Watch memory page access\"\nmsgstr \"监视内存页面访问\"\n\n#: tmemorybrowser.miwatchwrite.caption\nmsgctxt \"tmemorybrowser.miwatchwrite.caption\"\nmsgid \"Break on Write\"\nmsgstr \"写入时中断\"\n\n#: tmemorybrowser.newwindow1.caption\nmsgctxt \"tmemorybrowser.newwindow1.caption\"\nmsgid \"New window\"\nmsgstr \"新窗口\"\n\n#: tmemorybrowser.oflabel.caption\nmsgctxt \"tmemorybrowser.oflabel.caption\"\nmsgid \"OF 0\"\nmsgstr \"OF 0\"\n\n#: tmemorybrowser.pflabel.caption\nmsgctxt \"tmemorybrowser.pflabel.caption\"\nmsgid \"PF 0\"\nmsgstr \"PF 0\"\n\n#: tmemorybrowser.plugins1.caption\nmsgctxt \"tmemorybrowser.plugins1.caption\"\nmsgid \"Plugins\"\nmsgstr \"插件\"\n\n#: tmemorybrowser.savedisassemledoutput1.caption\nmsgctxt \"tmemorybrowser.savedisassemledoutput1.caption\"\nmsgid \"Save disassembled output\"\nmsgstr \"保存反汇编输出\"\n\n#: tmemorybrowser.search2.caption\nmsgctxt \"tmemorybrowser.search2.caption\"\nmsgid \"Search\"\nmsgstr \"搜索\"\n\n#: tmemorybrowser.sflabel.caption\nmsgctxt \"tmemorybrowser.sflabel.caption\"\nmsgid \"SF 0\"\nmsgstr \"SF 0\"\n\n#: tmemorybrowser.sslabel.caption\nmsgctxt \"tmemorybrowser.sslabel.caption\"\nmsgid \"SS 0000\"\nmsgstr \"SS 0000\"\n\n#: tmemorybrowser.stacktrace1.caption\nmsgctxt \"tmemorybrowser.stacktrace1.caption\"\nmsgid \"Stacktrace\"\nmsgstr \"堆栈跟踪\"\n\n#: tmemorybrowser.stacktrace2.caption\nmsgctxt \"tmemorybrowser.stacktrace2.caption\"\nmsgid \"Stacktrace\"\nmsgstr \"堆栈跟踪\"\n\n#: tmemorybrowser.tbdebug.caption\nmsgctxt \"tmemorybrowser.tbdebug.caption\"\nmsgid \"tbDebug\"\nmsgstr \"tbDebug\"\n\n#: tmemorybrowser.tbrun.caption\nmsgctxt \"tmemorybrowser.tbrun.caption\"\nmsgid \"Run\"\nmsgstr \"运行\"\n\n#: tmemorybrowser.tbruntill.caption\nmsgctxt \"tmemorybrowser.tbruntill.caption\"\nmsgid \"Run till...\"\nmsgstr \"运行直到...\"\n\n#: tmemorybrowser.tbrununhandled.caption\nmsgctxt \"tmemorybrowser.tbrununhandled.caption\"\nmsgid \"Run Unhandled\"\nmsgstr \"运行未处理\"\n\n#: tmemorybrowser.tbseparator1.caption\nmsgctxt \"tmemorybrowser.tbseparator1.caption\"\nmsgid \"tbSeparator1\"\nmsgstr \"tbSeparator1\"\n\n#: tmemorybrowser.tbseparator2.caption\nmsgctxt \"tmemorybrowser.tbseparator2.caption\"\nmsgid \"tbSeparator2\"\nmsgstr \"tbSeparator2\"\n\n#: tmemorybrowser.tbseparator3.caption\nmsgctxt \"tmemorybrowser.tbseparator3.caption\"\nmsgid \"tbSeparator3\"\nmsgstr \"tbSeparator3\"\n\n#: tmemorybrowser.tbstepinto.caption\nmsgctxt \"tmemorybrowser.tbstepinto.caption\"\nmsgid \"Step Into\"\nmsgstr \"逐步进入\"\n\n#: tmemorybrowser.tbstepout.caption\nmsgctxt \"tmemorybrowser.tbstepout.caption\"\nmsgid \"Step Out\"\nmsgstr \"逐步退出\"\n\n#: tmemorybrowser.tbstepover.caption\nmsgctxt \"tmemorybrowser.tbstepover.caption\"\nmsgid \"Step Over\"\nmsgstr \"逐步跳过\"\n\n#: tmemorybrowser.threadlist1.caption\nmsgctxt \"tmemorybrowser.threadlist1.caption\"\nmsgid \"Threadlist\"\nmsgstr \"线程列表\"\n\n#: tmemorybrowser.view1.caption\nmsgctxt \"tmemorybrowser.view1.caption\"\nmsgid \"View\"\nmsgstr \"视图\"\n\n#: tmemorybrowser.zflabel.caption\nmsgctxt \"tmemorybrowser.zflabel.caption\"\nmsgid \"ZF 0\"\nmsgstr \"ZF 0\"\n\n#: tprocesswindow.btnnetwork.caption\nmsgctxt \"tprocesswindow.btnnetwork.caption\"\nmsgid \"Network\"\nmsgstr \"网络\"\n\n#: tprocesswindow.cancelbutton.caption\nmsgctxt \"tprocesswindow.cancelbutton.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tprocesswindow.caption\nmsgctxt \"tprocesswindow.caption\"\nmsgid \"Process List\"\nmsgstr \"进程列表\"\n\n#: tprocesswindow.filter1.caption\nmsgctxt \"tprocesswindow.filter1.caption\"\nmsgid \"Filter\"\nmsgstr \"过滤器\"\n\n#: tprocesswindow.menuitem1.caption\nmsgctxt \"tprocesswindow.menuitem1.caption\"\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: tprocesswindow.menuitem3.caption\nmsgctxt \"tprocesswindow.menuitem3.caption\"\nmsgid \"Process watcher\"\nmsgstr \"进程监视器\"\n\n#: tprocesswindow.menuitem4.caption\nmsgctxt \"tprocesswindow.menuitem4.caption\"\nmsgid \"View\"\nmsgstr \"视图\"\n\n#: tprocesswindow.menuitem5.caption\nmsgctxt \"tprocesswindow.menuitem5.caption\"\nmsgid \"Preferences\"\nmsgstr \"首选项\"\n\n#: tprocesswindow.micreateprocess.caption\nmsgctxt \"tprocesswindow.micreateprocess.caption\"\nmsgid \"Create Process\"\nmsgstr \"创建进程\"\n\n#: tprocesswindow.miopenfile.caption\nmsgctxt \"tprocesswindow.miopenfile.caption\"\nmsgid \"Open File\"\nmsgstr \"打开文件\"\n\n#: tprocesswindow.mirefresh.caption\nmsgctxt \"tprocesswindow.mirefresh.caption\"\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n#: tprocesswindow.okbutton.caption\nmsgctxt \"tprocesswindow.okbutton.caption\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#: tprocesswindow.tsapplications.caption\nmsgctxt \"tprocesswindow.tsapplications.caption\"\nmsgid \"Applications\"\nmsgstr \"应用程序\"\n\n#: tprocesswindow.tsprocesses.caption\nmsgctxt \"tprocesswindow.tsprocesses.caption\"\nmsgid \"Processes\"\nmsgstr \"进程\"\n\n#: tprocesswindow.tswindows.caption\nmsgctxt \"tprocesswindow.tswindows.caption\"\nmsgid \"Windows\"\nmsgstr \"窗口\"\n\n#: trainergenerator.rsabout\nmsgctxt \"trainergenerator.rsabout\"\nmsgid \"About\"\nmsgstr \"关于\"\n\n#: trainergenerator.rsareyousure\nmsgctxt \"trainergenerator.rsareyousure\"\nmsgid \"Are you sure?\"\nmsgstr \"你确定吗？\"\n\n#: trainergenerator.rsclose\nmsgctxt \"trainergenerator.rsclose\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: trainergenerator.rsdesignuserinterfacemanually\nmsgctxt \"trainergenerator.rsdesignuserinterfacemanually\"\nmsgid \"Design userinterface manually\"\nmsgstr \"手动设计用户界面\"\n\n#: trainergenerator.rsdontsupportcheatengineoryourself\nmsgctxt \"trainergenerator.rsdontsupportcheatengineoryourself\"\nmsgid \"Don't support Cheat Engine (or yourself)\"\nmsgstr \"不支持 Cheat Engine（或你自己）\"\n\n#: trainergenerator.rshotkey\nmsgctxt \"trainergenerator.rshotkey\"\nmsgid \"Hotkey\"\nmsgstr \"热键\"\n\n#: trainergenerator.rsset\nmsgctxt \"trainergenerator.rsset\"\nmsgid \"Set\"\nmsgstr \"设置\"\n\n#: tregisters.ebplabel.caption\nmsgctxt \"tregisters.ebplabel.caption\"\nmsgid \"EBP 00000000\"\nmsgstr \"EBP 00000000\"\n\n#: tregisters.ebxlabel.caption\nmsgctxt \"tregisters.ebxlabel.caption\"\nmsgid \"EBX 00000000\"\nmsgstr \"EBX 00000000\"\n\n#: tregisters.ecxlabel.caption\nmsgctxt \"tregisters.ecxlabel.caption\"\nmsgid \"ECX 00000000\"\nmsgstr \"ECX 00000000\"\n\n#: tregisters.edilabel.caption\nmsgctxt \"tregisters.edilabel.caption\"\nmsgid \"EDI 00000000\"\nmsgstr \"EDI 00000000\"\n\n#: tregisters.edxlabel.caption\nmsgctxt \"tregisters.edxlabel.caption\"\nmsgid \"EDX 00000000\"\nmsgstr \"EDX 00000000\"\n\n#: tregisters.eiplabel.caption\nmsgctxt \"tregisters.eiplabel.caption\"\nmsgid \"EIP 00000000\"\nmsgstr \"EIP 00000000\"\n\n#: tregisters.esilabel.caption\nmsgctxt \"tregisters.esilabel.caption\"\nmsgid \"ESI 00000000\"\nmsgstr \"ESI 00000000\"\n\n#: tregisters.esplabel.caption\nmsgctxt \"tregisters.esplabel.caption\"\nmsgid \"ESP 00000000\"\nmsgstr \"ESP 00000000\"\n\n#: tregisters.labelregisters.caption\nmsgctxt \"tregisters.labelregisters.caption\"\nmsgid \"Registers:\"\nmsgstr \"寄存器：\"\n\n#: tregisters.lblaf.caption\nmsgctxt \"tregisters.lblaf.caption\"\nmsgid \"AF 0\"\nmsgstr \"AF 0\"\n\n#: tregisters.lblcf.caption\nmsgctxt \"tregisters.lblcf.caption\"\nmsgid \"CF 0\"\nmsgstr \"CF 0\"\n\n#: tregisters.lbldf.caption\nmsgctxt \"tregisters.lbldf.caption\"\nmsgid \"DF 0\"\nmsgstr \"DF 0\"\n\n#: tregisters.lblof.caption\nmsgctxt \"tregisters.lblof.caption\"\nmsgid \"OF 0\"\nmsgstr \"OF 0\"\n\n#: tregisters.lblpf.caption\nmsgctxt \"tregisters.lblpf.caption\"\nmsgid \"PF 0\"\nmsgstr \"PF 0\"\n\n#: tregisters.lblsf.caption\nmsgctxt \"tregisters.lblsf.caption\"\nmsgid \"SF 0\"\nmsgstr \"SF 0\"\n\n#: tregisters.lblzf.caption\nmsgctxt \"tregisters.lblzf.caption\"\nmsgid \"ZF 0\"\nmsgstr \"ZF 0\"\n\n#: tregisters.mibrowsememoryregion.caption\nmsgctxt \"tregisters.mibrowsememoryregion.caption\"\nmsgid \"Browse this memory region\"\nmsgstr \"浏览此内存区域\"\n\n#: tregisters.midisassemblememoryregion.caption\nmsgctxt \"tregisters.midisassemblememoryregion.caption\"\nmsgid \"Disassemble this memory region\"\nmsgstr \"反汇编此内存区域\"\n\n#: tregisters.sbshowfloats.caption\nmsgctxt \"tregisters.sbshowfloats.caption\"\nmsgid \"F\"\nmsgstr \"F\"\n\n#: tregisters.sbshowfloats.hint\nmsgctxt \"tregisters.sbshowfloats.hint\"\nmsgid \"Floating point registers\"\nmsgstr \"浮点寄存器\"\n\n#: tregisters.sbshowstack.caption\nmsgctxt \"tregisters.sbshowstack.caption\"\nmsgid \"S\"\nmsgstr \"S\"\n\n#: tregisters.sbshowstack.hint\nmsgctxt \"tregisters.sbshowstack.hint\"\nmsgid \"Stack view\"\nmsgstr \"堆栈视图\"\n\n#: ttlg.label2.caption\nmsgctxt \"ttlg.label2.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: ttypeform.bitlengthedit.text\nmsgctxt \"ttypeform.bitlengthedit.text\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: ttypeform.buttoncancel.caption\nmsgctxt \"ttypeform.buttoncancel.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: ttypeform.buttonok.caption\nmsgctxt \"ttypeform.buttonok.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: ttypeform.caption\nmsgctxt \"ttypeform.caption\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: ttypeform.cbcodepage.caption\nmsgctxt \"ttypeform.cbcodepage.caption\"\nmsgid \"Codepage\"\nmsgstr \"代码页\"\n\n#: ttypeform.cbhex.caption\nmsgctxt \"ttypeform.cbhex.caption\"\nmsgid \"Hexadecimal\"\nmsgstr \"十六进制\"\n\n#: ttypeform.cbsigned.caption\nmsgctxt \"ttypeform.cbsigned.caption\"\nmsgid \"Signed\"\nmsgstr \"有符号\"\n\n#: ttypeform.cbunicode.caption\nmsgctxt \"ttypeform.cbunicode.caption\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: ttypeform.labelbit0.caption\nmsgctxt \"ttypeform.labelbit0.caption\"\nmsgid \"0\"\nmsgstr \"0\"\n\n#: ttypeform.labelbit1.caption\nmsgctxt \"ttypeform.labelbit1.caption\"\nmsgid \"1\"\nmsgstr \"1\"\n\n#: ttypeform.labelbit2.caption\nmsgctxt \"ttypeform.labelbit2.caption\"\nmsgid \"2\"\nmsgstr \"2\"\n\n#: ttypeform.labelbit3.caption\nmsgctxt \"ttypeform.labelbit3.caption\"\nmsgid \"3\"\nmsgstr \"3\"\n\n#: ttypeform.labelbit4.caption\nmsgctxt \"ttypeform.labelbit4.caption\"\nmsgid \"4\"\nmsgstr \"4\"\n\n#: ttypeform.labelbit5.caption\nmsgctxt \"ttypeform.labelbit5.caption\"\nmsgid \"5\"\nmsgstr \"5\"\n\n#: ttypeform.labelbit6.caption\nmsgctxt \"ttypeform.labelbit6.caption\"\nmsgid \"6\"\nmsgstr \"6\"\n\n#: ttypeform.labelbit7.caption\nmsgctxt \"ttypeform.labelbit7.caption\"\nmsgid \"7\"\nmsgstr \"7\"\n\n#: ttypeform.labelbitlength.caption\nmsgctxt \"ttypeform.labelbitlength.caption\"\nmsgid \"Length\"\nmsgstr \"长度\"\n\n#: ttypeform.labellength.caption\nmsgctxt \"ttypeform.labellength.caption\"\nmsgid \"Length\"\nmsgstr \"长度\"\n\n#: ttypeform.lengthedit.text\nmsgctxt \"ttypeform.lengthedit.text\"\nmsgid \"10\"\nmsgstr \"10\"\n\n#: ttypeform.vartype.text\nmsgctxt \"ttypeform.vartype.text\"\nmsgid \"Binary\"\nmsgstr \"二进制\"\n\n#: tvaluechangeform.button1.caption\nmsgctxt \"tvaluechangeform.button1.caption\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: tvaluechangeform.button2.caption\nmsgctxt \"tvaluechangeform.button2.caption\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: tvaluechangeform.cbunicode.caption\nmsgctxt \"tvaluechangeform.cbunicode.caption\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: valuechange.rsunicode\nmsgctxt \"valuechange.rsunicode\"\nmsgid \"Unicode\"\nmsgstr \"Unicode\"\n\n#: vartypestrings.rs_vtall\nmsgctxt \"vartypestrings.rs_vtall\"\nmsgid \"All\"\nmsgstr \"全部\"\n\n#: vartypestrings.rs_vtbinary\nmsgctxt \"vartypestrings.rs_vtbinary\"\nmsgid \"Binary\"\nmsgstr \"二进制\"\n\n#: vartypestrings.rs_vtbyte\nmsgctxt \"vartypestrings.rs_vtbyte\"\nmsgid \"Byte\"\nmsgstr \"字节\"\n\n#: vartypestrings.rs_vtbytearray\nmsgctxt \"vartypestrings.rs_vtbytearray\"\nmsgid \"Array of byte\"\nmsgstr \"字节数组\"\n\n#: vartypestrings.rs_vtdouble\nmsgctxt \"vartypestrings.rs_vtdouble\"\nmsgid \"Double\"\nmsgstr \"双精度\"\n\n#: vartypestrings.rs_vtdword\nmsgctxt \"vartypestrings.rs_vtdword\"\nmsgid \"4 Bytes\"\nmsgstr \"4 字节\"\n\n#: vartypestrings.rs_vtpointer\nmsgctxt \"vartypestrings.rs_vtpointer\"\nmsgid \"Pointer\"\nmsgstr \"指针\"\n\n#: vartypestrings.rs_vtqword\nmsgctxt \"vartypestrings.rs_vtqword\"\nmsgid \"8 Bytes\"\nmsgstr \"8 字节\"\n\n#: vartypestrings.rs_vtsingle\nmsgctxt \"vartypestrings.rs_vtsingle\"\nmsgid \"Float\"\nmsgstr \"浮点数\"\n\n#: vartypestrings.rs_vtstring\nmsgctxt \"vartypestrings.rs_vtstring\"\nmsgid \"String\"\nmsgstr \"字符串\"\n\n#: vartypestrings.rs_vtword\nmsgctxt \"vartypestrings.rs_vtword\"\nmsgid \"2 Bytes\"\nmsgstr \"2 字节\"\n\n#: virtualmemory.rsnomemoryfoundinthespecifiedregion\nmsgctxt \"virtualmemory.rsnomemoryfoundinthespecifiedregion\"\nmsgid \"No memory found in the specified region\"\nmsgstr \"在指定区域未找到内存\"\n\n#: virtualmemory.rsnotenoughmemoryfreetoscan\nmsgctxt \"virtualmemory.rsnotenoughmemoryfreetoscan\"\nmsgid \"Not enough memory free to scan\"\nmsgstr \"没有足够的可用内存进行扫描\"\n\n#: vmxfunctions.rsbigerror\nmsgctxt \"vmxfunctions.rsbigerror\"\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: vmxfunctions.rssmallerror\nmsgctxt \"vmxfunctions.rssmallerror\"\nmsgid \"error\"\nmsgstr \"错误\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/lclstrconsts.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: lclstrconsts.hhshelpbrowsernotexecutable\nmsgid \"Browser %s%s%s not executable.\"\nmsgstr \"浏览器 %s%s%s 无法执行。\"\n\n#: lclstrconsts.hhshelpbrowsernotfound\nmsgid \"Browser %s%s%s not found.\"\nmsgstr \"浏览器 %s%s%s 未找到。\"\n\n#: lclstrconsts.hhshelperrorwhileexecuting\nmsgid \"Error while executing %s%s%s:%s%s\"\nmsgstr \"执行 %s%s%s 时出错：%s%s\"\n\n#: lclstrconsts.hhshelpnohtmlbrowserfound\nmsgid \"Unable to find a HTML browser.\"\nmsgstr \"无法找到 HTML 浏览器。\"\n\n#: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineoneinhelpconfigurehe\nmsgid \"No HTML Browser found.%sPlease define one in Environment -> Options -> Help -> Help Options\"\nmsgstr \"未找到 HTML 浏览器。%s请在环境 -> 选项 -> 帮助 -> 帮助选项中定义一个。\"\n\n#: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile\nmsgid \"The help database %s%s%s was unable to find file %s%s%s.\"\nmsgstr \"帮助数据库 %s%s%s 无法找到文件 %s%s%s。\"\n\n#: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl\nmsgid \"The macro %s in BrowserParams will be replaced by the URL.\"\nmsgstr \"浏览器参数中的宏 %s 将被 URL 替换。\"\n\n#: lclstrconsts.ifsalt\nmsgid \"Alt\"\nmsgstr \"Alt\"\n\n#: lclstrconsts.ifsctrl\nmsgid \"Ctrl\"\nmsgstr \"Ctrl\"\n\n#: lclstrconsts.ifsvk_accept\nmsgid \"Accept\"\nmsgstr \"接受\"\n\n#: lclstrconsts.ifsvk_apps\nmsgid \"application key\"\nmsgstr \"应用程序键\"\n\n#: lclstrconsts.ifsvk_back\nmsgid \"Backspace\"\nmsgstr \"退格\"\n\n#: lclstrconsts.ifsvk_capital\nmsgid \"Capital\"\nmsgstr \"大写\"\n\n#: lclstrconsts.ifsvk_clear\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n#: lclstrconsts.ifsvk_control\nmsgid \"Control\"\nmsgstr \"控制\"\n\n#: lclstrconsts.ifsvk_convert\nmsgid \"Convert\"\nmsgstr \"转换\"\n\n#: lclstrconsts.ifsvk_escape\nmsgid \"Escape\"\nmsgstr \"退出\"\n\n#: lclstrconsts.ifsvk_execute\nmsgid \"Execute\"\nmsgstr \"执行\"\n\n#: lclstrconsts.ifsvk_final\nmsgid \"Final\"\nmsgstr \"最终\"\n\n#: lclstrconsts.ifsvk_hanja\nmsgid \"Hanja\"\nmsgstr \"汉字\"\n\n#: lclstrconsts.ifsvk_help\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#: lclstrconsts.ifsvk_junja\nmsgid \"Junja\"\nmsgstr \"准字\"\n\n#: lclstrconsts.ifsvk_kana\nmsgid \"Kana\"\nmsgstr \"假名\"\n\n#: lclstrconsts.ifsvk_lbutton\nmsgid \"Mouse Button Left\"\nmsgstr \"鼠标左键\"\n\n#: lclstrconsts.ifsvk_lwin\nmsgid \"left windows key\"\nmsgstr \"左 Windows 键\"\n\n#: lclstrconsts.ifsvk_mbutton\nmsgid \"Mouse Button Middle\"\nmsgstr \"鼠标中键\"\n\n#: lclstrconsts.ifsvk_modechange\nmsgid \"Mode Change\"\nmsgstr \"模式切换\"\n\n#: lclstrconsts.ifsvk_nonconvert\nmsgid \"Nonconvert\"\nmsgstr \"不转换\"\n\n#: lclstrconsts.ifsvk_numlock\nmsgid \"Numlock\"\nmsgstr \"数字锁定\"\n\n#: lclstrconsts.ifsvk_numpad\nmsgid \"Numpad %d\"\nmsgstr \"数字键盘 %d\"\n\n#: lclstrconsts.ifsvk_pause\nmsgid \"Pause key\"\nmsgstr \"暂停键\"\n\n#: lclstrconsts.ifsvk_print\nmsgid \"Print\"\nmsgstr \"打印\"\n\n#: lclstrconsts.ifsvk_rbutton\nmsgid \"Mouse Button Right\"\nmsgstr \"鼠标右键\"\n\n#: lclstrconsts.ifsvk_return\nmsgid \"Return\"\nmsgstr \"返回\"\n\n#: lclstrconsts.ifsvk_rwin\nmsgid \"right windows key\"\nmsgstr \"右 Windows 键\"\n\n#: lclstrconsts.ifsvk_scroll\nmsgid \"Scroll\"\nmsgstr \"滚动\"\n\n#: lclstrconsts.ifsvk_select\nmsgid \"Select\"\nmsgstr \"选择\"\n\n#: lclstrconsts.ifsvk_shift\nmsgid \"Shift\"\nmsgstr \"Shift\"\n\n#: lclstrconsts.ifsvk_snapshot\nmsgid \"Snapshot\"\nmsgstr \"快照\"\n\n#: lclstrconsts.ifsvk_space\nmsgid \"Space key\"\nmsgstr \"空格键\"\n\n#: lclstrconsts.ifsvk_unknown\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#: lclstrconsts.liscannotexecute\nmsgid \"can not execute %s\"\nmsgstr \"无法执行 %s\"\n\n#: lclstrconsts.lisprogramfilenotfound\nmsgid \"program file not found %s\"\nmsgstr \"程序文件未找到 %s\"\n\n#: lclstrconsts.rs3ddkshadowcolorcaption\nmsgid \"3D Dark Shadow\"\nmsgstr \"3D 黑暗阴影\"\n\n#: lclstrconsts.rs3dlightcolorcaption\nmsgid \"3D Light\"\nmsgstr \"3D 光\"\n\n#: lclstrconsts.rsacontrolcannothaveitselfasparent\nmsgid \"A control can't have itself as a parent\"\nmsgstr \"控件不能将自身作为父控件\"\n\n#: lclstrconsts.rsactivebordercolorcaption\nmsgid \"Active Border\"\nmsgstr \"活动边框\"\n\n#: lclstrconsts.rsactivecaptioncolorcaption\nmsgid \"Active Caption\"\nmsgstr \"活动标题\"\n\n#: lclstrconsts.rsallfiles\nmsgid \"All files (%s)|%s|%s\"\nmsgstr \"所有文件 (%s)|%s|%s\"\n\n#: lclstrconsts.rsappworkspacecolorcaption\nmsgid \"Application Workspace\"\nmsgstr \"应用程序工作区\"\n\n#: lclstrconsts.rsaquacolorcaption\nmsgid \"Aqua\"\nmsgstr \"水蓝色\"\n\n#: lclstrconsts.rsbackgroundcolorcaption\nmsgid \"Desktop\"\nmsgstr \"桌面\"\n\n#: lclstrconsts.rsbackward\nmsgid \"Backward\"\nmsgstr \"向后\"\n\n#: lclstrconsts.rsbitmaps\nmsgid \"Bitmaps\"\nmsgstr \"位图\"\n\n#: lclstrconsts.rsblackcolorcaption\nmsgid \"Black\"\nmsgstr \"黑色\"\n\n#: lclstrconsts.rsblank\nmsgid \"Blank\"\nmsgstr \"空白\"\n\n#: lclstrconsts.rsbluecolorcaption\nmsgid \"Blue\"\nmsgstr \"蓝色\"\n\n#: lclstrconsts.rsbtnfacecolorcaption\nmsgid \"Button Face\"\nmsgstr \"按钮面\"\n\n#: lclstrconsts.rsbtnhighlightcolorcaption\nmsgid \"Button Highlight\"\nmsgstr \"按钮高亮\"\n\n#: lclstrconsts.rsbtnshadowcolorcaption\nmsgid \"Button Shadow\"\nmsgstr \"按钮阴影\"\n\n#: lclstrconsts.rsbtntextcolorcaption\nmsgid \"Button Text\"\nmsgstr \"按钮文本\"\n\n#: lclstrconsts.rscalculator\nmsgid \"Calculator\"\nmsgstr \"计算器\"\n\n#: lclstrconsts.rscannotfocus\nmsgid \"Can not focus\"\nmsgstr \"无法聚焦\"\n\n#: lclstrconsts.rscanvasdoesnotallowdrawing\nmsgid \"Canvas does not allow drawing\"\nmsgstr \"画布不允许绘图\"\n\n#: lclstrconsts.rscaptiontextcolorcaption\nmsgid \"Caption Text\"\nmsgstr \"标题文本\"\n\n#: lclstrconsts.rscasesensitive\nmsgid \"Case sensitive\"\nmsgstr \"区分大小写\"\n\n#: lclstrconsts.rscontrolclasscantcontainchildclass\nmsgid \"Control of class '%s' can't have control of class '%s' as a child\"\nmsgstr \"类 '%s' 的控件不能将类 '%s' 的控件作为子控件\"\n\n#: lclstrconsts.rscontrolhasnoparentwindow\nmsgid \"Control '%s' has no parent window\"\nmsgstr \"控件 '%s' 没有父窗口\"\n\n#: lclstrconsts.rscreamcolorcaption\nmsgid \"Cream\"\nmsgstr \"Cream\"\n\n#: lclstrconsts.rscreatinggdbcatchableerror\nmsgid \"Creating gdb catchable error:\"\nmsgstr \"创建 gdb 可捕获错误：\"\n\n#: lclstrconsts.rscursor\nmsgid \"Cursor\"\nmsgstr \"光标\"\n\n#: lclstrconsts.rscustomcolorcaption\nmsgid \"Custom ...\"\nmsgstr \"自定义 ...\"\n\n#: lclstrconsts.rsdefaultcolorcaption\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: lclstrconsts.rsdefaultfileinfovalue\nmsgid \"permissions user group size date time\"\nmsgstr \"权限 用户组 大小 日期 时间\"\n\n#: lclstrconsts.rsdeleterecord\nmsgid \"Delete record?\"\nmsgstr \"删除记录？\"\n\n#: lclstrconsts.rsdirection\nmsgid \"Direction\"\nmsgstr \"方向\"\n\n#: lclstrconsts.rsdirectory\nmsgid \"&Directory\"\nmsgstr \"&目录\"\n\n#: lclstrconsts.rsdocking\nmsgid \"Docking\"\nmsgstr \"停靠\"\n\n#: lclstrconsts.rsduplicateiconformat\nmsgid \"Duplicate icon format.\"\nmsgstr \"重复图标格式。\"\n\n#: lclstrconsts.rseditrecordhint\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: lclstrconsts.rsentirescope\nmsgid \"Search entire file\"\nmsgstr \"搜索整个文件\"\n\n#: lclstrconsts.rserrorcreatingdevicecontext\nmsgid \"Error creating device context for %s.%s\"\nmsgstr \"为 %s.%s 创建设备上下文时出错\"\n\n#: lclstrconsts.rserrorinlcl\nmsgid \"ERROR in LCL: \"\nmsgstr \"LCL 中的错误：\"\n\n#: lclstrconsts.rserroroccurredinataddressframe\nmsgid \"Error occurred in %s at %sAddress %s%s Frame %s\"\nmsgstr \"在 %s 的 %s 地址 %s%s 帧 %s 中发生错误\"\n\n#: lclstrconsts.rserrorreadingproperty\nmsgid \"Error reading %s%s%s: %s\"\nmsgstr \"读取 %s%s%s 时出错：%s\"\n\n#: lclstrconsts.rserrorwhilesavingbitmap\nmsgid \"Error while saving bitmap.\"\nmsgstr \"保存位图时出错。\"\n\n#: lclstrconsts.rsexception\nmsgid \"Exception\"\nmsgstr \"异常\"\n\n#: lclstrconsts.rsfddirectorymustexist\nmsgid \"Directory must exist\"\nmsgstr \"目录必须存在\"\n\n#: lclstrconsts.rsfddirectorynotexist\nmsgid \"The directory \\\"%s\\\" does not exist.\"\nmsgstr \"目录 \\\"%s\\\" 不存在。\"\n\n#: lclstrconsts.rsfdfilealreadyexists\nmsgid \"The file \\\"%s\\\" already exists. Overwrite ?\"\nmsgstr \"文件 \\\"%s\\\" 已存在。是否覆盖？\"\n\n#: lclstrconsts.rsfdfilemustexist\nmsgid \"File must exist\"\nmsgstr \"文件必须存在\"\n\n#: lclstrconsts.rsfdfilenotexist\nmsgid \"The file \\\"%s\\\" does not exist.\"\nmsgstr \"文件 \\\"%s\\\" 不存在。\"\n\n#: lclstrconsts.rsfdfilereadonly\nmsgid \"The file \\\"%s\\\" is not writable.\"\nmsgstr \"文件 \\\"%s\\\" 不能写入。\"\n\n#: lclstrconsts.rsfdfilereadonlytitle\nmsgid \"File is not writable\"\nmsgstr \"文件不可写\"\n\n#: lclstrconsts.rsfdfilesaveas\nmsgid \"Save file as\"\nmsgstr \"另存为\"\n\n#: lclstrconsts.rsfdopenfile\nmsgid \"Open existing file\"\nmsgstr \"打开现有文件\"\n\n#: lclstrconsts.rsfdoverwritefile\nmsgid \"Overwrite file ?\"\nmsgstr \"是否覆盖文件？\"\n\n#: lclstrconsts.rsfdpathmustexist\nmsgid \"Path must exist\"\nmsgstr \"路径必须存在\"\n\n#: lclstrconsts.rsfdpathnoexist\nmsgid \"The path \\\"%s\\\" does not exist.\"\nmsgstr \"路径 \\\"%s\\\" 不存在。\"\n\n#: lclstrconsts.rsfdselectdirectory\nmsgid \"Select Directory\"\nmsgstr \"选择目录\"\n\n#: lclstrconsts.rsfileinfofilenotfound\nmsgid \"(file not found: \\\"%s\\\")\"\nmsgstr \"(文件未找到：“%s”)\"\n\n#: lclstrconsts.rsfileinformation\nmsgid \"File information\"\nmsgstr \"文件信息\"\n\n#: lclstrconsts.rsfind\nmsgid \"Find\"\nmsgstr \"查找\"\n\n#: lclstrconsts.rsfindmore\nmsgid \"Find more\"\nmsgstr \"查找更多\"\n\n#: lclstrconsts.rsfirstrecordhint\nmsgid \"First\"\nmsgstr \"第一个\"\n\n#: lclstrconsts.rsfixedcolstoobig\nmsgid \"FixedCols can't be >= ColCount\"\nmsgstr \"FixedCols 不能大于或等于 ColCount\"\n\n#: lclstrconsts.rsfixedrowstoobig\nmsgid \"FixedRows can't be >= RowCount\"\nmsgstr \"FixedRows 不能大于或等于 RowCount\"\n\n#: lclstrconsts.rsformcolorcaption\nmsgid \"Form\"\nmsgstr \"表单\"\n\n#: lclstrconsts.rsformstreamingerror\nmsgid \"Form streaming \\\"%s\\\" error: %s\"\nmsgstr \"表单流 \\\"%s\\\" 错误：%s\"\n\n#: lclstrconsts.rsforward\nmsgid \"Forward\"\nmsgstr \"前进\"\n\n#: lclstrconsts.rsfuchsiacolorcaption\nmsgid \"Fuchsia\"\nmsgstr \"Fuchsia\"\n\n#: lclstrconsts.rsgdkoptiondebug\nmsgid \"--gdk-debug flags     Turn on specific GDK trace/debug messages.\"\nmsgstr \"--gdk-debug 标志     打开特定的 GDK 跟踪/调试消息。\"\n\n#: lclstrconsts.rsgdkoptionnodebug\nmsgid \"--gdk-no-debug flags  Turn off specific GDK trace/debug messages.\"\nmsgstr \"--gdk-no-debug 标志  关闭特定的 GDK 跟踪/调试消息。\"\n\n#: lclstrconsts.rsgif\nmsgid \"Graphics Interchange Format\"\nmsgstr \"图形交换格式\"\n\n#: lclstrconsts.rsgoptionfatalwarnings\nmsgid \"--g-fatal-warnings    Warnings and errors generated by Gtk+/GDK will halt the application.\"\nmsgstr \"--g-fatal-warnings    Gtk+/GDK 生成的警告和错误将停止应用程序。\"\n\n#: lclstrconsts.rsgradientactivecaptioncolorcaption\nmsgid \"Gradient Active Caption\"\nmsgstr \"渐变活动标题\"\n\n#: lclstrconsts.rsgradientinactivecaptioncolorcaption\nmsgid \"Gradient Inactive Caption\"\nmsgstr \"渐变非活动标题\"\n\n#: lclstrconsts.rsgraphic\nmsgid \"Graphic\"\nmsgstr \"图形\"\n\n#: lclstrconsts.rsgraycolorcaption\nmsgid \"Gray\"\nmsgstr \"灰色\"\n\n#: lclstrconsts.rsgraytextcolorcaption\nmsgid \"Gray Text\"\nmsgstr \"灰色文本\"\n\n#: lclstrconsts.rsgreencolorcaption\nmsgid \"Green\"\nmsgstr \"绿色\"\n\n#: lclstrconsts.rsgridfiledoesnotexists\nmsgid \"Grid file doesn't exists\"\nmsgstr \"网格文件不存在\"\n\n#: lclstrconsts.rsgridindexoutofrange\nmsgid \"Grid index out of range.\"\nmsgstr \"网格索引超出范围。\"\n\n#: lclstrconsts.rsgroupindexcannotbelessthanprevious\nmsgid \"GroupIndex cannot be less than a previous menu item's GroupIndex\"\nmsgstr \"GroupIndex 不能小于之前菜单项的 GroupIndex\"\n\n#: lclstrconsts.rsgtkfilter\nmsgid \"Filter:\"\nmsgstr \"过滤器：\"\n\n#: lclstrconsts.rsgtkhistory\nmsgid \"History:\"\nmsgstr \"历史：\"\n\n#: lclstrconsts.rsgtkoptionclass\nmsgid \"\"\n\"--class classname     Following Xt conventions, the class of a program is the program name with the initial character \"\n\"capitalized. For example, the classname for gimp is \\\"Gimp\\\". If --class is specified, the class of the program will be \"\n\"set to \\\"classname\\\".\"\nmsgstr \"--class classname     按照 Xt 约定，程序的类是程序名称的首字母大写。例如，gimp 的 classname 是 \\\"Gimp\\\"。如果指定了 --class，程序的类将设置为 \\\"classname\\\"。\"\n\n#: lclstrconsts.rsgtkoptiondebug\nmsgid \"--gtk-debug flags     Turn on specific Gtk+ trace/debug messages.\"\nmsgstr \"--gtk-debug flags     打开特定的 Gtk+ 跟踪/调试消息。\"\n\n#: lclstrconsts.rsgtkoptiondisplay\nmsgid \"\"\n\"--display h:s:d       Connect to the specified X server, where \\\"h\\\" is the hostname, \\\"s\\\" is the server number \"\n\"(usually 0), and \\\"d\\\" is the display number (typically omitted). If --display is not specified, the DISPLAY \"\n\"environment variable is used.\"\nmsgstr \"--display h:s:d       连接到指定的 X 服务器，其中 \\\"h\\\" 是主机名，\\\"s\\\" 是服务器编号（通常为 0），\\\"d\\\" 是显示编号（通常省略）。如果未指定 --display，将使用 DISPLAY 环境变量。\"\n\n#: lclstrconsts.rsgtkoptionmodule\nmsgid \"--gtk-module module   Load the specified module at startup.\"\nmsgstr \"--gtk-module module   在启动时加载指定的模块。\"\n\n#: lclstrconsts.rsgtkoptionname\nmsgid \"--name programe       Set program name to \\\"progname\\\". If not specified, program name will be set to ParamStrUTF8(0).\"\nmsgstr \"--name programe       将程序名称设置为 \\\"progname\\\"。如果未指定，程序名称将设置为 ParamStrUTF8(0)。\"\n\n#: lclstrconsts.rsgtkoptionnodebug\nmsgid \"--gtk-no-debug flags  Turn off specific Gtk+ trace/debug messages.\"\nmsgstr \"--gtk-no-debug flags  关闭特定的 Gtk+ 跟踪/调试消息。\"\n\n#: lclstrconsts.rsgtkoptionnotransient\nmsgid \"--lcl-no-transient    Do not set transient order for modal forms\"\nmsgstr \"--lcl-no-transient    不为模态表单设置瞬态顺序\"\n\n#: lclstrconsts.rsgtkoptionnoxshm\nmsgid \"--no-xshm             Disable use of the X Shared Memory Extension.\"\nmsgstr \"--no-xshm             禁用 X 共享内存扩展。\"\n\n#: lclstrconsts.rsgtkoptionsync\nmsgid \"\"\n\"--sync                Call XSynchronize (display, True) after the Xserver connection has been established. This makes \"\n\"debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received \"\n\"immediately after the protocol request that generated the error has been processed by the X server.\"\nmsgstr \"\"\n\"--sync                在建立 Xserver 连接后调用 XSynchronize (display, True)。这使得调试 X 协议错误变得更容易，因为 X 请求缓冲将被禁用，X 错误将在生成错误的协议请求被 X \"\n\"服务器处理后立即接收。\"\n\n#: lclstrconsts.rshelpalreadyregistered\nmsgid \"%s: Already registered\"\nmsgstr \"%s：已注册\"\n\n#: lclstrconsts.rshelpcontextnotfound\nmsgid \"Help Context not found\"\nmsgstr \"未找到帮助上下文\"\n\n#: lclstrconsts.rshelpdatabasenotfound\nmsgid \"Help Database not found\"\nmsgstr \"未找到帮助数据库\"\n\n#: lclstrconsts.rshelperror\nmsgid \"Help Error\"\nmsgstr \"帮助错误\"\n\n#: lclstrconsts.rshelphelpcontextnotfound\nmsgid \"Help context %s not found.\"\nmsgstr \"未找到帮助上下文 %s。\"\n\n#: lclstrconsts.rshelphelpcontextnotfoundindatabase\nmsgid \"Help context %s not found in Database %s%s%s.\"\nmsgstr \"在数据库 %s%s%s 中未找到帮助上下文 %s。\"\n\n#: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype\nmsgid \"Help Database %s%s%s did not found a viewer for a help page of type %s\"\nmsgstr \"帮助数据库 %s%s%s 未找到类型 %s 的帮助页面查看器\"\n\n#: lclstrconsts.rshelphelpdatabasenotfound\nmsgid \"Help Database %s%s%s not found\"\nmsgstr \"未找到帮助数据库 %s%s%s\"\n\n#: lclstrconsts.rshelphelpkeywordnotfound\nmsgid \"Help keyword %s%s%s not found.\"\nmsgstr \"未找到帮助关键字 %s%s%s。\"\n\n#: lclstrconsts.rshelphelpkeywordnotfoundindatabase\nmsgid \"Help keyword %s%s%s not found in Database %s%s%s.\"\nmsgstr \"在数据库 %s%s%s 中未找到帮助关键字 %s%s%s。\"\n\n#: lclstrconsts.rshelphelpnodehasnohelpdatabase\nmsgid \"Help node %s%s%s has no Help Database\"\nmsgstr \"帮助节点 %s%s%s 没有帮助数据库\"\n\n#: lclstrconsts.rshelpnohelpfoundforsource\nmsgid \"No help found for line %d, column %d of %s.\"\nmsgstr \"未找到 %s 的第 %d 行，第 %d 列的帮助。\"\n\n#: lclstrconsts.rshelpnohelpnodesavailable\nmsgid \"No help nodes available\"\nmsgstr \"没有可用的帮助节点\"\n\n#: lclstrconsts.rshelpnotfound\nmsgid \"Help not found\"\nmsgstr \"未找到帮助\"\n\n#: lclstrconsts.rshelpnotregistered\nmsgid \"%s: Not registered\"\nmsgstr \"%s：未注册\"\n\n#: lclstrconsts.rshelpselectorerror\nmsgid \"Help Selector Error\"\nmsgstr \"帮助选择器错误\"\n\n#: lclstrconsts.rshelpthereisnoviewerforhelptype\nmsgid \"There is no viewer for help type %s%s%s\"\nmsgstr \"没有查看器用于帮助类型 %s%s%s\"\n\n#: lclstrconsts.rshelpviewererror\nmsgid \"Help Viewer Error\"\nmsgstr \"帮助查看器错误\"\n\n#: lclstrconsts.rshelpviewernotfound\nmsgid \"Help Viewer not found\"\nmsgstr \"未找到帮助查看器\"\n\n#: lclstrconsts.rshighlightcolorcaption\nmsgid \"Highlight\"\nmsgstr \"高亮\"\n\n#: lclstrconsts.rshighlighttextcolorcaption\nmsgid \"Highlight Text\"\nmsgstr \"高亮文本\"\n\n#: lclstrconsts.rshotlightcolorcaption\nmsgid \"Hot Light\"\nmsgstr \"热光\"\n\n#: lclstrconsts.rsicns\nmsgid \"Mac OS X Icon\"\nmsgstr \"Mac OS X 图标\"\n\n#: lclstrconsts.rsicon\nmsgid \"Icon\"\nmsgstr \"图标\"\n\n#: lclstrconsts.rsiconimageempty\nmsgid \"Icon image cannot be empty\"\nmsgstr \"图标图像不能为空\"\n\n#: lclstrconsts.rsiconimageformat\nmsgid \"Icon image must have the same format\"\nmsgstr \"图标图像必须具有相同格式\"\n\n#: lclstrconsts.rsiconimageformatchange\nmsgid \"Cannot change format of icon image\"\nmsgstr \"无法更改图标图像的格式\"\n\n#: lclstrconsts.rsiconimagesize\nmsgid \"Icon image must have the same size\"\nmsgstr \"图标图像必须具有相同大小\"\n\n#: lclstrconsts.rsiconimagesizechange\nmsgid \"Cannot change size of icon image\"\nmsgstr \"无法更改图标图像的大小\"\n\n#: lclstrconsts.rsiconnocurrent\nmsgid \"Icon has no current image\"\nmsgstr \"图标当前没有图像\"\n\n#: lclstrconsts.rsinactivebordercolorcaption\nmsgid \"Inactive Border\"\nmsgstr \"非活动边框\"\n\n#: lclstrconsts.rsindexoutofbounds\nmsgid \"%s Index %d out of bounds 0 .. %d\"\nmsgstr \"%s 索引 %d 超出范围 0 .. %d\"\n\n#: lclstrconsts.rsindexoutofrange\nmsgid \"Index Out of range Cell[Col=%d Row=%d]\"\nmsgstr \"索引超出范围 单元格[列=%d 行=%d]\"\n\n#: lclstrconsts.rsinfobkcolorcaption\nmsgid \"Info Background\"\nmsgstr \"信息背景\"\n\n#: lclstrconsts.rsinfotextcolorcaption\nmsgid \"Info Text\"\nmsgstr \"信息文本\"\n\n#: lclstrconsts.rsinvaliddate\nmsgid \"Invalid Date : %s\"\nmsgstr \"无效日期：%s\"\n\n#: lclstrconsts.rsinvaliddaterangehint\nmsgid \"Invalid Date: %s. Must be between %s and %s\"\nmsgstr \"无效日期：%s。必须在 %s 和 %s 之间\"\n\n#: lclstrconsts.rsinvalidformobjectstream\nmsgid \"invalid Form object stream\"\nmsgstr \"无效的表单对象流\"\n\n#: lclstrconsts.rsinvalidpropertyvalue\nmsgid \"Invalid property value\"\nmsgstr \"无效的属性值\"\n\n#: lclstrconsts.rsinvalidstreamformat\nmsgid \"Invalid stream format\"\nmsgstr \"无效的流格式\"\n\n#: lclstrconsts.rsisalreadyassociatedwith\nmsgid \"%s is already associated with %s\"\nmsgstr \"%s 已经与 %s 关联\"\n\n#: lclstrconsts.rsjpeg\nmsgid \"Joint Picture Expert Group\"\nmsgstr \"联合图像专家组\"\n\n#: lclstrconsts.rslastrecordhint\nmsgid \"Last\"\nmsgstr \"最后\"\n\n#: lclstrconsts.rslimecolorcaption\nmsgid \"Lime\"\nmsgstr \"青柠\"\n\n#: lclstrconsts.rslistindexexceedsbounds\nmsgid \"List index exceeds bounds (%d)\"\nmsgstr \"列表索引超出范围 (%d)\"\n\n#: lclstrconsts.rslistmustbeempty\nmsgid \"List must be empty\"\nmsgstr \"列表必须为空\"\n\n#: lclstrconsts.rsmarooncolorcaption\nmsgid \"Maroon\"\nmsgstr \"栗色\"\n\n#: lclstrconsts.rsmbabort\nmsgid \"Abort\"\nmsgstr \"中止\"\n\n#: lclstrconsts.rsmball\nmsgid \"&All\"\nmsgstr \"&所有\"\n\n#: lclstrconsts.rsmbclose\nmsgid \"&Close\"\nmsgstr \"&关闭\"\n\n#: lclstrconsts.rsmbhelp\nmsgid \"&Help\"\nmsgstr \"&帮助\"\n\n#: lclstrconsts.rsmbignore\nmsgid \"&Ignore\"\nmsgstr \"&忽略\"\n\n#: lclstrconsts.rsmbno\nmsgid \"&No\"\nmsgstr \"&否\"\n\n#: lclstrconsts.rsmbnotoall\nmsgid \"No to all\"\nmsgstr \"全部否\"\n\n#: lclstrconsts.rsmbok\nmsgid \"&OK\"\nmsgstr \"&确定\"\n\n#: lclstrconsts.rsmbopen\nmsgid \"&Open\"\nmsgstr \"&打开\"\n\n#: lclstrconsts.rsmbretry\nmsgid \"&Retry\"\nmsgstr \"&重试\"\n\n#: lclstrconsts.rsmbsave\nmsgid \"&Save\"\nmsgstr \"&保存\"\n\n#: lclstrconsts.rsmbunlock\nmsgid \"&Unlock\"\nmsgstr \"&解锁\"\n\n#: lclstrconsts.rsmbyes\nmsgid \"&Yes\"\nmsgstr \"&是\"\n\n#: lclstrconsts.rsmbyestoall\nmsgid \"Yes to &All\"\nmsgstr \"是对&所有\"\n\n#: lclstrconsts.rsmedgraycolorcaption\nmsgid \"Medium Gray\"\nmsgstr \"中灰色\"\n\n#: lclstrconsts.rsmenubarcolorcaption\nmsgid \"Menu Bar\"\nmsgstr \"菜单栏\"\n\n#: lclstrconsts.rsmenuhighlightcolorcaption\nmsgid \"Menu Highlight\"\nmsgstr \"菜单高亮\"\n\n#: lclstrconsts.rsmenutextcolorcaption\nmsgid \"Menu Text\"\nmsgstr \"菜单文本\"\n\n#: lclstrconsts.rsmodified\nmsgid \"  modified \"\nmsgstr \"已修改\"\n\n#: lclstrconsts.rsmoneygreencolorcaption\nmsgid \"Money Green\"\nmsgstr \"钱绿色\"\n\n#: lclstrconsts.rsmtauthentication\nmsgid \"Authentication\"\nmsgstr \"认证\"\n\n#: lclstrconsts.rsmtconfirmation\nmsgid \"Confirmation\"\nmsgstr \"确认\"\n\n#: lclstrconsts.rsmtcustom\nmsgid \"Custom\"\nmsgstr \"自定义\"\n\n#: lclstrconsts.rsmtinformation\nmsgid \"Information\"\nmsgstr \"信息\"\n\n#: lclstrconsts.rsmtwarning\nmsgid \"Warning\"\nmsgstr \"警告\"\n\n#: lclstrconsts.rsnavycolorcaption\nmsgid \"Navy\"\nmsgstr \"海军蓝\"\n\n#: lclstrconsts.rsnonecolorcaption\nmsgid \"None\"\nmsgstr \"无\"\n\n#: lclstrconsts.rsnotavalidgridfile\nmsgid \"Not a valid grid file\"\nmsgstr \"不是有效的网格文件\"\n\n#: lclstrconsts.rsnowidgetset\nmsgid \"No widgetset object. Please check if the unit \\\"interfaces\\\" was added to the programs uses clause.\"\nmsgstr \"没有小部件集对象。请检查单元“interfaces”是否已添加到程序的使用条款中。\"\n\n#: lclstrconsts.rsolivecolorcaption\nmsgid \"Olive\"\nmsgstr \"橄榄色\"\n\n#: lclstrconsts.rspickdate\nmsgid \"Select a date\"\nmsgstr \"选择日期\"\n\n#: lclstrconsts.rspixmap\nmsgid \"Pixmap\"\nmsgstr \"位图\"\n\n#: lclstrconsts.rsportablebitmap\nmsgid \"Portable BitMap\"\nmsgstr \"可移植位图\"\n\n#: lclstrconsts.rsportablegraymap\nmsgid \"Portable GrayMap\"\nmsgstr \"可移植灰度图\"\n\n#: lclstrconsts.rsportablenetworkgraphic\nmsgid \"Portable Network Graphic\"\nmsgstr \"可移植网络图形\"\n\n#: lclstrconsts.rsportablepixmap\nmsgid \"Portable PixMap\"\nmsgstr \"可移植像素图\"\n\n#: lclstrconsts.rspostrecordhint\nmsgid \"Post\"\nmsgstr \"帖子\"\n\n#: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok\nmsgid \"%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program.\"\nmsgstr \"%s%s按 OK 忽略并冒险导致数据损坏。%s按取消以结束程序。\"\n\n#: lclstrconsts.rspropertydoesnotexist\nmsgid \"Property %s does not exist\"\nmsgstr \"属性 %s 不存在\"\n\n#: lclstrconsts.rspurplecolorcaption\nmsgid \"Purple\"\nmsgstr \"紫色\"\n\n#: lclstrconsts.rsqtoptiondograb\nmsgid \"\"\n\"-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need \"\n\"QT_DEBUG.\"\nmsgstr \"-dograb（仅在 X11 下），在调试器下运行可能会导致隐式 -nograb，使用 -dograb 进行覆盖。需要 QT_DEBUG。\"\n\n#: lclstrconsts.rsqtoptiongraphicsstyle\nmsgid \"\"\n\"-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, \"\n\"raster and opengl. OpenGL is still unstable.\"\nmsgstr \"-graphicssystem 参数，设置用于屏幕小部件和 QPixmaps 的后端。可用选项为 native、raster 和 opengl。OpenGL 仍然不稳定。\"\n\n#: lclstrconsts.rsqtoptionnograb\nmsgid \"-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG.\"\nmsgstr \"-nograb，告诉 Qt 它绝不能抓取鼠标或键盘。需要 QT_DEBUG。\"\n\n#: lclstrconsts.rsqtoptionreverse\nmsgid \"-reverse, sets the application's layout direction to Qt::RightToLeft.\"\nmsgstr \"-reverse，设置应用程序的布局方向为 Qt::RightToLeft。\"\n\n#: lclstrconsts.rsqtoptionsession\nmsgid \"-session session, restores the application from an earlier session.\"\nmsgstr \"-session session，恢复应用程序的早期会话。\"\n\n#: lclstrconsts.rsqtoptionstyle\nmsgid \"\"\n\"-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you \"\n\"compiled Qt with additional styles or have additional styles as plugins these will be available to the -style  command \"\n\"line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an \"\n\"application with default common style (windows).\"\nmsgstr \"\"\n\"-style style 或 -style=style，设置应用程序的 GUI 风格。可能的值为 motif、windows 和 platinum。如果你编译了带有额外样式的 Qt 或有额外样式作为插件，这些将在 -style \"\n\"命令行选项中可用。注意：并非所有样式在所有平台上都可用。如果样式参数不存在，Qt 将以默认的通用样式（windows）启动应用程序。\"\n\n#: lclstrconsts.rsqtoptionstylesheet\nmsgid \"\"\n\"-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file \"\n\"that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path.\"\nmsgstr \"-stylesheet stylesheet 或 -stylesheet=stylesheet，设置应用程序样式表。值必须是包含样式表的文件的路径。注意：样式表文件中的相对 URL 是相对于样式表文件的路径。\"\n\n#: lclstrconsts.rsqtoptionsync\nmsgid \"-sync (only under X11), switches to synchronous mode for debugging.\"\nmsgstr \"-sync（仅在 X11 下），切换到同步模式以进行调试。\"\n\n#: lclstrconsts.rsqtoptionwidgetcount\nmsgid \"\"\n\"-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets \"\n\"existed at the same time.\"\nmsgstr \"-widgetcount，在结束时打印调试消息，关于未销毁的部件数量和同时存在的最大部件数量。\"\n\n#: lclstrconsts.rsqtoptionx11bgcolor\nmsgid \"\"\n\"-bg or -background color, sets the default background color and an application palette (light and dark shades are \"\n\"calculated).\"\nmsgstr \"-bg 或 -background color，设置默认背景颜色和应用程序调色板（计算明暗色调）。\"\n\n#: lclstrconsts.rsqtoptionx11btncolor\nmsgid \"-btn or -button color, sets the default button color.\"\nmsgstr \"-btn 或 -button color，设置默认按钮颜色。\"\n\n#: lclstrconsts.rsqtoptionx11cmap\nmsgid \"-cmap, causes the application to install a private color map on an 8-bit display.\"\nmsgstr \"-cmap，导致应用程序在 8 位显示器上安装私有颜色映射。\"\n\n#: lclstrconsts.rsqtoptionx11display\nmsgid \"-display display, sets the X display (default is $DISPLAY).\"\nmsgstr \"-display display，设置 X 显示（默认是 $DISPLAY）。\"\n\n#: lclstrconsts.rsqtoptionx11fgcolor\nmsgid \"-fg or -foreground color, sets the default foreground color.\"\nmsgstr \"-fg 或 -foreground color，设置默认前景颜色。\"\n\n#: lclstrconsts.rsqtoptionx11font\nmsgid \"-fn or -font font, defines the application font. The font should be specified using an X logical font description.\"\nmsgstr \"-fn 或 -font font，定义应用程序字体。字体应使用 X 逻辑字体描述进行指定。\"\n\n#: lclstrconsts.rsqtoptionx11geometry\nmsgid \"-geometry geometry, sets the client geometry of the first window that is shown.\"\nmsgstr \"-geometry geometry，设置显示的第一个窗口的客户端几何形状。\"\n\n#: lclstrconsts.rsqtoptionx11im\nmsgid \"-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable).\"\nmsgstr \"-im，设置输入法服务器（相当于设置 XMODIFIERS 环境变量）。\"\n\n#: lclstrconsts.rsqtoptionx11inputstyle\nmsgid \"\"\n\"-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in \"\n\"the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the \"\n\"editing is done.\"\nmsgstr \"-inputstyle，定义输入如何插入到给定的部件中，例如 onTheSpot 使输入直接出现在部件中，而 overTheSpot 使输入出现在浮动在部件上方的框中，直到编辑完成才插入。\"\n\n#: lclstrconsts.rsqtoptionx11name\nmsgid \"-name name, sets the application name.\"\nmsgstr \"-name name，设置应用程序名称。\"\n\n#: lclstrconsts.rsqtoptionx11ncols\nmsgid \"\"\n\"-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using \"\n\"the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, \"\n\"6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used.\"\nmsgstr \"\"\n\"-ncols count，限制在 8 位显示器上分配的颜色立方体中的颜色数量，如果应用程序使用 QApplication::ManyColor 颜色规范。如果 count 为 216，则使用 6x6x6 颜色立方体（即 6 个红色、6 \"\n\"个绿色和 6 个蓝色的级别）；对于其他值，使用一个大约与 2x3x1 立方体成比例的立方体。\"\n\n#: lclstrconsts.rsqtoptionx11title\nmsgid \"-title title, sets the application title.\"\nmsgstr \"-title title，设置应用程序标题。\"\n\n#: lclstrconsts.rsqtoptionx11visual\nmsgid \"-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display.\"\nmsgstr \"-visual TrueColor，强制应用程序在 8 位显示器上使用 TrueColor 视觉。\"\n\n#: lclstrconsts.rsrasterimageendupdate\nmsgid \"Endupdate while no update in progress\"\nmsgstr \"结束更新时没有更新正在进行\"\n\n#: lclstrconsts.rsrasterimagesaveinupdate\nmsgid \"Cannot save image while update in progress\"\nmsgstr \"更新进行时无法保存图像\"\n\n#: lclstrconsts.rsrasterimageupdateall\nmsgid \"Cannot begin update all when canvas only update in progress\"\nmsgstr \"当画布仅更新进行时无法开始全部更新\"\n\n#: lclstrconsts.rsredcolorcaption\nmsgid \"Red\"\nmsgstr \"红色\"\n\n#: lclstrconsts.rsrefreshrecordshint\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n#: lclstrconsts.rsreplace\nmsgid \"Replace\"\nmsgstr \"替换\"\n\n#: lclstrconsts.rsreplaceall\nmsgid \"Replace all\"\nmsgstr \"全部替换\"\n\n#: lclstrconsts.rsscrollbarcolorcaption\nmsgid \"ScrollBar\"\nmsgstr \"滚动条\"\n\n#: lclstrconsts.rsscrollbaroutofrange\nmsgid \"ScrollBar property out of range\"\nmsgstr \"滚动条属性超出范围\"\n\n#: lclstrconsts.rsselectcolortitle\nmsgid \"Select color\"\nmsgstr \"选择颜色\"\n\n#: lclstrconsts.rsselectfonttitle\nmsgid \"Select a font\"\nmsgstr \"选择字体\"\n\n#: lclstrconsts.rssilvercolorcaption\nmsgid \"Silver\"\nmsgstr \"银色\"\n\n#: lclstrconsts.rssize\nmsgid \"  size \"\nmsgstr \"大小\"\n\n#: lclstrconsts.rsskybluecolorcaption\nmsgid \"Sky Blue\"\nmsgstr \"天蓝色\"\n\n#: lclstrconsts.rstealcolorcaption\nmsgid \"Teal\"\nmsgstr \"青色\"\n\n#: lclstrconsts.rstext\nmsgid \"Text\"\nmsgstr \"文本\"\n\n#: lclstrconsts.rstiff\nmsgid \"Tagged Image File Format\"\nmsgstr \"标记图像文件格式\"\n\n#: lclstrconsts.rsunabletoloaddefaultfont\nmsgid \"Unable to load default font\"\nmsgstr \"无法加载默认字体\"\n\n#: lclstrconsts.rsunknownerrorpleasereportthisbug\nmsgid \"Unknown Error, please report this bug\"\nmsgstr \"未知错误，请报告此错误\"\n\n#: lclstrconsts.rsunknownpictureextension\nmsgid \"Unknown picture extension\"\nmsgstr \"未知的图片扩展名\"\n\n#: lclstrconsts.rsunknownpictureformat\nmsgid \"Unknown picture format\"\nmsgstr \"未知的图片格式\"\n\n#: lclstrconsts.rsunsupportedbitmapformat\nmsgid \"Unsupported bitmap format.\"\nmsgstr \"不支持的位图格式。\"\n\n#: lclstrconsts.rsunsupportedclipboardformat\nmsgid \"Unsupported clipboard format: %s\"\nmsgstr \"不支持的剪贴板格式：%s\"\n\n#: lclstrconsts.rswarningunreleaseddcsdump\nmsgid \" WARNING: There are %d unreleased DCs, a detailed dump follows:\"\nmsgstr \"警告：有 %d 个未释放的 DC，详细转储如下：\"\n\n#: lclstrconsts.rswarningunreleasedgdiobjectsdump\nmsgid \" WARNING: There are %d unreleased GDIObjects, a detailed dump follows:\"\nmsgstr \"警告：有 %d 个未释放的 GDI 对象，详细转储如下：\"\n\n#: lclstrconsts.rswarningunreleasedmessagesinqueue\nmsgid \" WARNING: There are %d messages left in the queue! I'll free them\"\nmsgstr \"警告：队列中还有 %d 条消息！我将释放它们\"\n\n#: lclstrconsts.rswarningunreleasedtimerinfos\nmsgid \" WARNING: There are %d TimerInfo structures left, I'll free them\"\nmsgstr \"警告：还有 %d 个 TimerInfo 结构，我将释放它们\"\n\n#: lclstrconsts.rswarningunremovedpaintmessages\nmsgid \" WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left.\"\nmsgstr \"警告：还有 %s 个未移除的 LM_PAINT/LM_GtkPAINT 消息链接。\"\n\n#: lclstrconsts.rswhitecolorcaption\nmsgid \"White\"\nmsgstr \"白色\"\n\n#: lclstrconsts.rswholewordsonly\nmsgid \"Whole words only\"\nmsgstr \"仅全字匹配\"\n\n#: lclstrconsts.rswin32error\nmsgid \"Error:\"\nmsgstr \"错误：\"\n\n#: lclstrconsts.rswin32warning\nmsgid \"Warning:\"\nmsgstr \"警告：\"\n\n#: lclstrconsts.rswindowcolorcaption\nmsgid \"Window\"\nmsgstr \"窗口\"\n\n#: lclstrconsts.rswindowframecolorcaption\nmsgid \"Window Frame\"\nmsgstr \"窗口框架\"\n\n#: lclstrconsts.rswindowtextcolorcaption\nmsgid \"Window Text\"\nmsgstr \"窗口文本\"\n\n#: lclstrconsts.rsyellowcolorcaption\nmsgid \"Yellow\"\nmsgstr \"黄色\"\n\n#: lclstrconsts.scannotfocus\nmsgid \"Cannot focus a disabled or invisible window\"\nmsgstr \"无法聚焦于禁用或不可见的窗口\"\n\n#: lclstrconsts.sduplicatemenus\nmsgid \"Duplicate menus\"\nmsgstr \"重复菜单\"\n\n#: lclstrconsts.sinvalidactioncreation\nmsgid \"Invalid action creation\"\nmsgstr \"无效的操作创建\"\n\n#: lclstrconsts.sinvalidactionenumeration\nmsgid \"Invalid action enumeration\"\nmsgstr \"无效的操作枚举\"\n\n#: lclstrconsts.sinvalidactionregistration\nmsgid \"Invalid action registration\"\nmsgstr \"无效的操作注册\"\n\n#: lclstrconsts.sinvalidactionunregistration\nmsgid \"Invalid action unregistration\"\nmsgstr \"无效的操作注销\"\n\n#: lclstrconsts.sinvalidcharset\nmsgid \"The char set in mask \\\"%s\\\" is not valid!\"\nmsgstr \"掩码中的字符集“%s”无效！\"\n\n#: lclstrconsts.sinvalidimagesize\nmsgid \"Invalid image size\"\nmsgstr \"无效的图像大小\"\n\n#: lclstrconsts.sinvalidindex\nmsgid \"Invalid ImageList Index\"\nmsgstr \"无效的图像列表索引\"\n\n#: lclstrconsts.smenuindexerror\nmsgid \"Menu index out of range\"\nmsgstr \"菜单索引超出范围\"\n\n#: lclstrconsts.smenuitemisnil\nmsgid \"MenuItem is nil\"\nmsgstr \"菜单项为 nil\"\n\n#: lclstrconsts.smenunotfound\nmsgid \"Sub-menu is not in menu\"\nmsgstr \"子菜单不在菜单中\"\n\n#: lclstrconsts.smkcalt\nmsgid \"Alt+\"\nmsgstr \"Alt+\"\n\n#: lclstrconsts.smkcbksp\nmsgid \"BkSp\"\nmsgstr \"BkSp\"\n\n#: lclstrconsts.smkcctrl\nmsgid \"Ctrl+\"\nmsgstr \"Ctrl+\"\n\n#: lclstrconsts.smkcdel\nmsgid \"Del\"\nmsgstr \"Del\"\n\n#: lclstrconsts.smkcenter\nmsgid \"Enter\"\nmsgstr \"Enter\"\n\n#: lclstrconsts.smkcesc\nmsgid \"Esc\"\nmsgstr \"Esc\"\n\n#: lclstrconsts.smkcins\nmsgid \"Ins\"\nmsgstr \"Ins\"\n\n#: lclstrconsts.smkcmeta\nmsgid \"Meta+\"\nmsgstr \"Meta+\"\n\n#: lclstrconsts.smkcpgdn\nmsgid \"PgDn\"\nmsgstr \"PgDn\"\n\n#: lclstrconsts.smkcpgup\nmsgid \"PgUp\"\nmsgstr \"PgUp\"\n\n#: lclstrconsts.smkcshift\nmsgid \"Shift+\"\nmsgstr \"Shift+\"\n\n#: lclstrconsts.smkcspace\nmsgid \"Space\"\nmsgstr \"Space\"\n\n#: lclstrconsts.snomdiform\nmsgid \"No MDI form present.\"\nmsgstr \"没有 MDI 表单。\"\n\n#: lclstrconsts.snotimers\nmsgid \"No timers available\"\nmsgstr \"没有可用的计时器\"\n\n#: lclstrconsts.sparexpected\nmsgid \"Wrong token type: %s expected\"\nmsgstr \"错误的令牌类型：%s 预期\"\n\n#: lclstrconsts.sparinvalidfloat\nmsgid \"Invalid floating point number: %s\"\nmsgstr \"无效的浮点数：%s\"\n\n#: lclstrconsts.sparinvalidinteger\nmsgid \"Invalid integer number: %s\"\nmsgstr \"无效的整数：%s\"\n\n#: lclstrconsts.sparlocinfo\nmsgid \" (at %d,%d, stream offset %.8x)\"\nmsgstr \"（在 %d,%d，流偏移 %.8x）\"\n\n#: lclstrconsts.sparunterminatedbinvalue\nmsgid \"Unterminated byte value\"\nmsgstr \"未终止的字节值\"\n\n#: lclstrconsts.sparunterminatedstring\nmsgid \"Unterminated string\"\nmsgstr \"未终止的字符串\"\n\n#: lclstrconsts.sparwrongtokensymbol\nmsgid \"Wrong token symbol: %s expected but %s found\"\nmsgstr \"错误的令牌符号：%s 预期但找到 %s\"\n\n#: lclstrconsts.sparwrongtokentype\nmsgid \"Wrong token type: %s expected but %s found\"\nmsgstr \"错误的令牌类型：%s 预期但找到 %s\"\n\n#: lclstrconsts.ifsvk_cancel\nmsgctxt \"lclstrconsts.ifsvk_cancel\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: lclstrconsts.ifsvk_delete\nmsgctxt \"lclstrconsts.ifsvk_delete\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: lclstrconsts.ifsvk_down\nmsgctxt \"lclstrconsts.ifsvk_down\"\nmsgid \"Down\"\nmsgstr \"下\"\n\n#: lclstrconsts.ifsvk_end\nmsgctxt \"lclstrconsts.ifsvk_end\"\nmsgid \"End\"\nmsgstr \"结束\"\n\n#: lclstrconsts.ifsvk_home\nmsgctxt \"lclstrconsts.ifsvk_home\"\nmsgid \"Home\"\nmsgstr \"主页\"\n\n#: lclstrconsts.ifsvk_insert\nmsgctxt \"lclstrconsts.ifsvk_insert\"\nmsgid \"Insert\"\nmsgstr \"插入\"\n\n#: lclstrconsts.ifsvk_left\nmsgctxt \"lclstrconsts.ifsvk_left\"\nmsgid \"Left\"\nmsgstr \"左\"\n\n#: lclstrconsts.ifsvk_menu\nmsgctxt \"lclstrconsts.ifsvk_menu\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\n#: lclstrconsts.ifsvk_next\nmsgctxt \"lclstrconsts.ifsvk_next\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: lclstrconsts.ifsvk_prior\nmsgctxt \"lclstrconsts.ifsvk_prior\"\nmsgid \"Prior\"\nmsgstr \"上一个\"\n\n#: lclstrconsts.ifsvk_right\nmsgctxt \"lclstrconsts.ifsvk_right\"\nmsgid \"Right\"\nmsgstr \"右\"\n\n#: lclstrconsts.ifsvk_tab\nmsgctxt \"lclstrconsts.ifsvk_tab\"\nmsgid \"Tab\"\nmsgstr \"标签\"\n\n#: lclstrconsts.ifsvk_up\nmsgctxt \"lclstrconsts.ifsvk_up\"\nmsgid \"Up\"\nmsgstr \"上\"\n\n#: lclstrconsts.lislclresourcesnotfound\nmsgctxt \"lclstrconsts.lislclresourcesnotfound\"\nmsgid \"Resource %s not found\"\nmsgstr \"资源 %s 未找到\"\n\n#: lclstrconsts.rscancelrecordhint\nmsgctxt \"lclstrconsts.rscancelrecordhint\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: lclstrconsts.rsdeleterecordhint\nmsgctxt \"lclstrconsts.rsdeleterecordhint\"\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: lclstrconsts.rserror\nmsgctxt \"lclstrconsts.rserror\"\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: lclstrconsts.rsinactivecaptioncolorcaption\nmsgctxt \"lclstrconsts.rsinactivecaptioncolorcaption\"\nmsgid \"Inactive Caption\"\nmsgstr \"非活动标题\"\n\n#: lclstrconsts.rsinactivecaptiontext\nmsgctxt \"lclstrconsts.rsinactivecaptiontext\"\nmsgid \"Inactive Caption\"\nmsgstr \"非活动标题\"\n\n#: lclstrconsts.rsinsertrecordhint\nmsgctxt \"lclstrconsts.rsinsertrecordhint\"\nmsgid \"Insert\"\nmsgstr \"插入\"\n\n#: lclstrconsts.rsmbcancel\nmsgctxt \"lclstrconsts.rsmbcancel\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: lclstrconsts.rsmenucolorcaption\nmsgctxt \"lclstrconsts.rsmenucolorcaption\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\n#: lclstrconsts.rsmterror\nmsgctxt \"lclstrconsts.rsmterror\"\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: lclstrconsts.rsnextrecordhint\nmsgctxt \"lclstrconsts.rsnextrecordhint\"\nmsgid \"Next\"\nmsgstr \"下一个\"\n\n#: lclstrconsts.rspriorrecordhint\nmsgctxt \"lclstrconsts.rspriorrecordhint\"\nmsgid \"Prior\"\nmsgstr \"上一个\"\n\n#: lclstrconsts.rsresourcenotfound\nmsgctxt \"lclstrconsts.rsresourcenotfound\"\nmsgid \"Resource %s not found\"\nmsgstr \"资源 %s 未找到\"\n\n#: lclstrconsts.smkcdown\nmsgctxt \"lclstrconsts.smkcdown\"\nmsgid \"Down\"\nmsgstr \"下\"\n\n#: lclstrconsts.smkcend\nmsgctxt \"lclstrconsts.smkcend\"\nmsgid \"End\"\nmsgstr \"结束\"\n\n#: lclstrconsts.smkchome\nmsgctxt \"lclstrconsts.smkchome\"\nmsgid \"Home\"\nmsgstr \"主页\"\n\n#: lclstrconsts.smkcleft\nmsgctxt \"lclstrconsts.smkcleft\"\nmsgid \"Left\"\nmsgstr \"左\"\n\n#: lclstrconsts.smkcright\nmsgctxt \"lclstrconsts.smkcright\"\nmsgid \"Right\"\nmsgstr \"右\"\n\n#: lclstrconsts.smkctab\nmsgctxt \"lclstrconsts.smkctab\"\nmsgid \"Tab\"\nmsgstr \"标签\"\n\n#: lclstrconsts.smkcup\nmsgctxt \"lclstrconsts.smkcup\"\nmsgid \"Up\"\nmsgstr \"上\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/monoscript.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: monoscript-FITM\nmsgid \"Failure injecting the MonoDatacollector dll\"\nmsgstr \"注入 MonoDatacollector dll 失败\"\n\n#: monoscript-DYWTL\nmsgid \"\"\n\"Do you wish to let the mono extention figure out the name and start address? If it's not a proper object this may crash \"\n\"the target.\"\nmsgstr \"你是否希望让 mono 扩展自动确定名称和起始地址？如果这不是一个有效的对象，可能会导致目标崩溃。\"\n\n#: monoscript-IO\nmsgid \"Instances of \"\nmsgstr \"实例 \"\n\n#: monoscript-WTAJG\nmsgid \"Warning: These are just guesses. Validate them yourself\"\nmsgstr \"警告：这些只是猜测。请自行验证\"\n\n#: monoscript-AN\nmsgid \"address==nil\"\nmsgstr \"地址==nil\"\n\n#: monoscript-Invoke\nmsgid \"Invoke \"\nmsgstr \"调用 \"\n\n#: monoscript-IA\nmsgid \"Instance address\"\nmsgstr \"实例地址\"\n\n#: monoscript-PW\nmsgid \"<Please wait...>\"\nmsgstr \"<请稍候...>\"\n\n#: monoscript-Parameters\nmsgid \"Parameters\"\nmsgstr \"参数\"\n\n#: monoscript-OK\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: monoscript-Cancel\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: monoscript-Parameter\nmsgid \"parameter \"\nmsgstr \"参数 \"\n\n#: monoscript-INAVA\nmsgid \" is not a valid address\"\nmsgstr \" 不是有效地址\"\n\n#: monoscript-INAVV\nmsgid \"is not a valid value\"\nmsgstr \"不是有效值\"\n\n#: monoscript-IFT\nmsgid \"ILCode from %x to %x\"\nmsgstr \"ILCode 从 %x 到 %x\"\n\n#: monoscript-OX\nmsgid \"Offset %x\"\nmsgstr \"偏移 %x\"\n\n#: monoscript-Resolve\nmsgid \"Resolve \"\nmsgstr \"解析 \"\n\n#: monoscript-XSTS\nmsgid \"%x : %s (type: %s)\"\nmsgstr \"%x : %s (类型: %s)\"\n\n#: monoscript-AYSYWTE\nmsgid \"\"\n\"Are you sure you wish to expand the whole tree? This can take a while and Cheat Engine may look like it has crashed (It \"\n\"has not)\"\nmsgstr \"你确定要展开整个树吗？这可能需要一段时间，Cheat Engine 可能看起来像是崩溃了（实际上并没有）\"\n\n#: monoscript-FTL\nmsgid \"Failure to launch\"\nmsgstr \"启动失败\"\n\n#: monoscript-Mono\nmsgid \"Mono\"\nmsgstr \"Mono\"\n\n#: monoscript-AMF\nmsgid \"Activate mono features\"\nmsgstr \"激活 mono 功能\"\n\n#: monoscript-DM\nmsgid \"Dissect mono\"\nmsgstr \"剖析 mono\"\n\n#: monoscript-TMHFTI\nmsgid \"The mono handler failed to initialize\"\nmsgstr \"mono 处理程序初始化失败\"\n\n#: monoscript-IPMN\nmsgid \"Invalid parameters (Methodname could not be determined)\"\nmsgstr \"无效参数（无法确定方法名称）\"\n\n#: monoscript-IPCN\nmsgid \"Invalid parameters (Classname could not be determined)\"\nmsgstr \"无效参数（无法确定类名）\"\n\n#: monoscript-IPN\nmsgid \"Invalid parameters (name could not be determined)\"\nmsgstr \"无效参数（无法确定名称）\"\n\n#: monoscript-CNBF\nmsgid \" could not be found\"\nmsgstr \" 找不到\"\n\n#: monoscript-CNBJ\nmsgid \" could not be jitted\"\nmsgstr \" 无法被 jitted\"\n\n#: monoscript-STFDNWY\nmsgid \"Sorry this feature does not work yet.  getStructureCount needs patching first.\"\nmsgstr \"抱歉，此功能尚未完成。getStructureCount 需要先打补丁。\"\n\n#: monoscript-Removing\nmsgid \"Removing \"\nmsgstr \"正在移除 \"\n\n#: monoscript-RS\nmsgid \"Reloading Structure \"\nmsgstr \"正在重新加载结构 \"\n\n#: monoscript-TC\nmsgid \"The class \"\nmsgstr \"该类 \"\n\n#: monoscript-HNF\nmsgid \" has no fields\"\nmsgstr \" 没有字段\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/patchscan.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: patchscan-nave\nmsgid \"Not a valid executable\"\nmsgstr \"不是有效的可执行文件\"\n\n#: patchscan-navwe\nmsgid \"Not a valid windows executable\"\nmsgstr \"不是有效的 Windows 可执行文件\"\n\n#: patchscan-ttomicns\nmsgid \"This type of module is currently not supported\"\nmsgstr \"当前不支持此类型的模块\"\n\n#: patchscan-ce\nmsgid \"Compare error. \"\nmsgstr \"比较错误。\"\n\n#: patchscan-ml\nmsgid \"Module List\"\nmsgstr \"模块列表\"\n\n#: patchscan-stmtsfp\nmsgid \"Select the modules to scan for patches. Hold shift/ctrl to select multiple modules\"\nmsgstr \"选择要扫描补丁的模块。按住 Shift/ctrl 选择多个模块\"\n\n#: patchscan-ok\nmsgid \"  OK  \"\nmsgstr \"  确定  \"\n\n#: patchscan-cancel\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: patchscan-scanning\nmsgid \"Scanning: %s\"\nmsgstr \"扫描中：%s\"\n\n#: patchscan-ei\nmsgid \"Error in \"\nmsgstr \"错误在\"\n\n#: patchscan-pl\nmsgid \"Patch list\"\nmsgstr \"补丁列表\"\n\n#: patchscan-address\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: patchscan-original\nmsgid \"Original\"\nmsgstr \"原始\"\n\n#: patchscan-patched\nmsgid \"Patched\"\nmsgstr \"已修补\"\n\n#: patchscan-rwo\nmsgid \"Restore with original\"\nmsgstr \"恢复为原始\"\n\n#: patchscan-rp\nmsgid \"Reapply patch\"\nmsgstr \"重新应用补丁\"\n\n#: patchscan-sfp\nmsgid \"Scan for patches\"\nmsgstr \"扫描补丁\"\n"
  },
  {
    "path": "src/dependency/CE Translations/zh_CN/pseudocodediagram.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: gpt-po v1.2.3\\n\"\n\"Language-Team: \\n\"\n\"Language: new\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 3.5\\n\"\n\n#: pseudocodediagram-file\nmsgid \"File\"\nmsgstr \"文件\"\n\n#: pseudocodediagram-lff\nmsgid \"Load from file\"\nmsgstr \"从文件加载\"\n\n#: pseudocodediagram-stfywto\nmsgid \"Select the file you wish to open\"\nmsgstr \"选择你希望打开的文件\"\n\n#: pseudocodediagram-dfcc\nmsgid \"Diagram files (*.CEDIAG )|*.CEDIAG\"\nmsgstr \"图表文件 (*.CEDIAG )|*.CEDIAG\"\n\n#: pseudocodediagram-stf\nmsgid \"Save to file\"\nmsgstr \"保存到文件\"\n\n#: pseudocodediagram-fitfywtstda\nmsgid \"Fill in the filename you wish to save this diagram as\"\nmsgstr \"填写你希望保存此图表的文件名\"\n\n#: pseudocodediagram-sdti\nmsgid \"Save diagram to image\"\nmsgstr \"将图表保存为图像\"\n\n#: pseudocodediagram-fitfywtstdi\nmsgid \"Fill in the filename you wish to save this diagram image\"\nmsgstr \"填写你希望保存此图表图像的文件名\"\n\n#: pseudocodediagram-pfpp\nmsgid \"PNG files (*.PNG )|*.PNG\"\nmsgstr \"PNG 文件 (*.PNG )|*.PNG\"\n\n#: pseudocodediagram-close\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n#: pseudocodediagram-display\nmsgid \"Display\"\nmsgstr \"显示\"\n\n#: pseudocodediagram-spfu2oc\nmsgid \"Show path from Ultimap1/2 or Codefilter\"\nmsgstr \"显示来自 Ultimap1/2 或 Codefilter 的路径\"\n\n#: pseudocodediagram-spftw\nmsgid \"Show path from tracer window\"\nmsgstr \"显示来自跟踪器窗口的路径\"\n\n#: pseudocodediagram-tsa\nmsgid \"Tracer starting at %8x (%s)\"\nmsgstr \"跟踪器从 %8x (%s) 开始\"\n\n#: pseudocodediagram-tp\nmsgid \"Tracer paths\"\nmsgstr \"跟踪器路径\"\n\n#: pseudocodediagram-wtwsbu\nmsgid \"Which tracer window shall be used?\"\nmsgstr \"使用哪个跟踪器窗口？\"\n\n#: pseudocodediagram-ntwrv\nmsgid \"No tracerform with results visible\"\nmsgstr \"没有可见结果的跟踪器表单\"\n\n#: pseudocodediagram-v\nmsgid \"View\"\nmsgstr \"查看\"\n\n#: pseudocodediagram-z\nmsgid \"Zoom\"\nmsgstr \"缩放\"\n\n#: pseudocodediagram-zi\nmsgid \"Zoom in\"\nmsgstr \"放大\"\n\n#: pseudocodediagram-zo\nmsgid \"Zoom out\"\nmsgstr \"缩小\"\n\n#: pseudocodediagram-e\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: pseudocodediagram-nh\nmsgid \"new header\"\nmsgstr \"新建标题\"\n\n#: pseudocodediagram-nbbc\nmsgid \"new block background color (0xBBGGRR)\"\nmsgstr \"新建块背景颜色 (0xBBGGRR)\"\n\n#: pseudocodediagram-sl\nmsgid \"Sources list\"\nmsgstr \"源列表\"\n\n#: pseudocodediagram-dl\nmsgid \"Destinations list\"\nmsgstr \"目标列表\"\n\n#: pseudocodediagram-be\nmsgid \"Block editor\"\nmsgstr \"块编辑器\"\n\n#: pseudocodediagram-ok\nmsgid \"OK\"\nmsgstr \"确定\"\n\n#: pseudocodediagram-cancel\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: pseudocodediagram-gts\nmsgid \"Go to source\"\nmsgstr \"转到源\"\n\n#: pseudocodediagram-gtd\nmsgid \"Go to destination\"\nmsgstr \"转到目标\"\n\n#: pseudocodediagram-rap\nmsgid \"Remove all points\"\nmsgstr \"移除所有点\"\n\n#: pseudocodediagram-ebh\nmsgid \"Edit block header\"\nmsgstr \"编辑块标题\"\n\n#: pseudocodediagram-ebc\nmsgid \"Edit block color\"\nmsgstr \"编辑块颜色\"\n\n#: pseudocodediagram-ls\nmsgid \"List sources\"\nmsgstr \"列出源\"\n\n#: pseudocodediagram-ld\nmsgid \"List destinations\"\nmsgstr \"列出目标\"\n\n#: pseudocodediagram-eac\nmsgid \"Edit annotation color\"\nmsgstr \"编辑注释颜色\"\n\n#: pseudocodediagram-da\nmsgid \"Delete annotation\"\nmsgstr \"删除注释\"\n\n#: pseudocodediagram-ca\nmsgid \"Create annotation\"\nmsgstr \"创建注释\"\n\n#: pseudocodediagram-mdi\nmsgid \"[Diagram info]\"\nmsgstr \"[图表信息]\"\n\n#: pseudocodediagram-fstart\nmsgid \" Function start: 0x%X\"\nmsgstr \" 函数开始：0x%X\"\n\n#: pseudocodediagram-fstop\nmsgid \" Function stop: 0x%X\"\nmsgstr \" 函数停止：0x%X\"\n\n#: pseudocodediagram-dbc\nmsgid \" Diagram blocks count: %d\"\nmsgstr \" 图表块计数：%d\"\n\n#: pseudocodediagram-dlc\nmsgid \" Diagram links count: %d\"\nmsgstr \" 图表链接计数：%d\"\n\n#: pseudocodediagram-diagram\nmsgid \"Diagram\"\nmsgstr \"图表\"\n\n#: pseudocodediagram-sd\nmsgid \"Spawn diagram\"\nmsgstr \"生成图表\"\n"
  },
  {
    "path": "src/locale/de_DE/LC_MESSAGES/Game Cheats Manager.po",
    "content": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Game Cheats Manager\\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: \\n\"\n\"Language: de_DE\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 3.7\\n\"\n\nmsgid \"Dark\"\nmsgstr \"Dunkel\"\n\nmsgid \"Light\"\nmsgstr \"Hell\"\n\nmsgid \"Official Site\"\nmsgstr \"Offizielle Seite\"\n\nmsgid \"GCM Server\"\nmsgstr \"GCM-Server\"\n\nmsgid \"Yearly Subscription\"\nmsgstr \"Jahres-Abonnement\"\n\nmsgid \"Gifted Subscription\"\nmsgstr \"Geschenktes Abonnement\"\n\nmsgid \"Search for installed trainers\"\nmsgstr \"Installierte Trainer suchen\"\n\nmsgid \"Enter keywords to download trainers\"\nmsgstr \"Stichwörter eingeben, um Trainer herunterzuladen\"\n\nmsgid \"Options\"\nmsgstr \"Optionen\"\n\nmsgid \"Settings\"\nmsgstr \"Einstellungen\"\n\nmsgid \"Import Trainers\"\nmsgstr \"Trainer importieren\"\n\nmsgid \"Open Trainer Download Path\"\nmsgstr \"Trainer-Download-Pfad öffnen\"\n\nmsgid \"Add Paths to Whitelist\"\nmsgstr \"Pfade zur Whitelist hinzufügen\"\n\nmsgid \"About\"\nmsgstr \"Über\"\n\nmsgid \"Data Update\"\nmsgstr \"Daten-Update\"\n\nmsgid \"Update Translation Data\"\nmsgstr \"Übersetzungsdaten aktualisieren\"\n\nmsgid \"Update Trainer Search Data\"\nmsgstr \"Trainer-Suchdaten aktualisieren\"\n\nmsgid \"Update Trainers\"\nmsgstr \"Trainer aktualisieren\"\n\nmsgid \"Trainer Management\"\nmsgstr \"Trainer-Verwaltung\"\n\nmsgid \"Upload Trainer\"\nmsgstr \"Trainer hochladen\"\n\nmsgid \"Browse All Trainers\"\nmsgstr \"Alle Trainer durchsuchen\"\n\nmsgid \"Launch\"\nmsgstr \"Starten\"\n\nmsgid \"Delete\"\nmsgstr \"Löschen\"\n\nmsgid \"Trainer download path:\"\nmsgstr \"Trainer-Download-Pfad:\"\n\nmsgid \"Failure\"\nmsgstr \"Fehler\"\n\nmsgid \"Failed to update application.\"\nmsgstr \"Anwendung konnte nicht aktualisiert werden.\"\n\nmsgid \"Update Available\"\nmsgstr \"Update verfügbar\"\n\nmsgid \"New version found: {old_version} ➜ {new_version}\"\nmsgstr \"Neue Version gefunden: {old_version} ➜ {new_version}\"\n\nmsgid \"Would you like to update now?\"\nmsgstr \"Möchtest du jetzt aktualisieren?\"\n\nmsgid \"Update Check Failed\"\nmsgstr \"Update-Prüfung fehlgeschlagen\"\n\nmsgid \"Failed to check for software update. You can navigate to `Options` ➜ `About` to check for updates manually.\"\nmsgstr \"Die Suche nach einem Software-Update ist fehlgeschlagen. Du kannst unter `Optionen` ➜ `Über` manuell nach Updates suchen.\"\n\nmsgid \"Cheat Engine Required\"\nmsgstr \"Cheat Engine erforderlich\"\n\nmsgid \"Cheat Engine may not be installed on your system.\"\nmsgstr \"Cheat Engine ist möglicherweise nicht auf Ihrem System installiert.\"\n\nmsgid \".ct/.cetrainer files require Cheat Engine to run.\"\nmsgstr \".ct- und .cetrainer-Dateien benötigen Cheat Engine, um ausgeführt zu werden.\"\n\nmsgid \"Please download and install Cheat Engine, then make sure to open the file with Cheat Engine.\"\nmsgstr \"Bitte laden Sie Cheat Engine herunter und installieren Sie es. Stellen Sie anschließend sicher, dass die Datei mit Cheat Engine geöffnet wird.\"\n\nmsgid \"Note: The official Cheat Engine installer contains promotional software bundles. Make sure to skip them during installation.\"\nmsgstr \"Hinweis: Das offizielle Installationsprogramm von Cheat Engine enthält gebündelte Werbesoftware. Achten Sie darauf, diese Zusatzangebote während der Installation abzulehnen.\"\n\nmsgid \"Download from:\"\nmsgstr \"Download unter:\"\n\nmsgid \"Don't show again\"\nmsgstr \"Nicht mehr anzeigen\"\n\nmsgid \"Delete trainer\"\nmsgstr \"Trainer löschen\"\n\nmsgid \"Are you sure you want to delete \"\nmsgstr \"Bist du sicher, dass du löschen möchtest? \"\n\nmsgid \"Confirm\"\nmsgstr \"Bestätigen\"\n\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgid \"Error\"\nmsgstr \"Fehler\"\n\nmsgid \"Trainer is currently in use, please close any programs using the file and try again.\"\nmsgstr \"Der Trainer wird gerade verwendet. Bitte schließe alle Programme, die auf die Datei zugreifen, und versuche es erneut.\"\n\nmsgid \"Failed to delete {trainer_name}:\"\nmsgstr \"Konnte {trainer_name} nicht löschen:\"\n\nmsgid \"Change trainer download path\"\nmsgstr \"Trainer-Download-Pfad ändern\"\n\nmsgid \"Please choose a new path.\"\nmsgstr \"Bitte wähle einen neuen Pfad.\"\n\nmsgid \"Failed to change trainer download path.\"\nmsgstr \"Der Trainer-Download-Pfad konnte nicht geändert werden.\"\n\nmsgid \"Migrating existing trainers...\"\nmsgstr \"Vorhandene Trainer werden migriert...\"\n\nmsgid \"No path selected.\"\nmsgstr \"Kein Pfad ausgewählt.\"\n\nmsgid \"Error migrating trainers: \"\nmsgstr \"Fehler beim Migrieren der Trainer: \"\n\nmsgid \"Migration complete!\"\nmsgstr \"Migration abgeschlossen!\"\n\nmsgid \"Select trainers you want to import\"\nmsgstr \"Wähle die Trainer aus, die du importieren möchtest\"\n\nmsgid \"Failed to import trainer: \"\nmsgstr \"Trainer konnte nicht importiert werden: \"\n\nmsgid \"Delete original trainers\"\nmsgstr \"Ursprüngliche Trainer löschen\"\n\nmsgid \"Do you want to delete the original trainer files?\"\nmsgstr \"Möchtest du die ursprünglichen Trainer-Dateien löschen?\"\n\nmsgid \"Yes\"\nmsgstr \"Ja\"\n\nmsgid \"No\"\nmsgstr \"Nein\"\n\nmsgid \"Failed to delete original trainer: \"\nmsgstr \"Ursprünglicher Trainer konnte nicht gelöscht werden: \"\n\nmsgid \"Administrator Access Required\"\nmsgstr \"Administratorrechte erforderlich\"\n\nmsgid \"To proceed with adding the trainer download paths to the Windows Defender whitelist, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"Um die Trainer-Download-Pfade zur Windows-Defender-Whitelist hinzuzufügen, werden Administratorrechte benötigt. Es erscheint eine Benutzerkontensteuerung (UAC), um die Berechtigung zu bestätigen.\"\n\nmsgid \"Would you like to continue?\"\nmsgstr \"Möchtest du fortfahren?\"\n\nmsgid \"Success\"\nmsgstr \"Erfolg\"\n\nmsgid \"Successfully added paths to Windows Defender whitelist.\"\nmsgstr \"Pfade wurden erfolgreich zur Windows-Defender-Whitelist hinzugefügt.\"\n\nmsgid \"Failed to add paths to Windows Defender whitelist.\"\nmsgstr \"Pfade konnten nicht zur Windows-Defender-Whitelist hinzugefügt werden.\"\n\nmsgid \"Failed to translate, please update translation data.\"\nmsgstr \"Übersetzung fehlgeschlagen, bitte aktualisiere die Übersetzungsdaten.\"\n\nmsgid \"Searching...\"\nmsgstr \"Suche läuft...\"\n\nmsgid \"Translating search results...\"\nmsgstr \"Suchergebnisse werden übersetzt...\"\n\nmsgid \"No search results found.\"\nmsgstr \"Keine Suchergebnisse gefunden.\"\n\nmsgid \"Translating keywords...\"\nmsgstr \"Schlüsselwörter werden übersetzt...\"\n\nmsgid \"Search failed, please update trainer search data.\"\nmsgstr \"Suche fehlgeschlagen, bitte aktualisiere die Trainer-Suchdaten.\"\n\nmsgid \"Search from FLiNG success!\"\nmsgstr \"Suche von FLiNG erfolgreich!\"\n\nmsgid \"Search from XiaoXing success!\"\nmsgstr \"Suche von XiaoXing erfolgreich!\"\n\nmsgid \"Search from CT success!\"\nmsgstr \"Suche von CT erfolgreich!\"\n\nmsgid \"Search from GCM success!\"\nmsgstr \"Suche von GCM erfolgreich!\"\n\nmsgid \"Checking for internet connection...\"\nmsgstr \"Internetverbindung wird geprüft...\"\n\nmsgid \"No internet connection, download failed.\"\nmsgstr \"Keine Internetverbindung, Download fehlgeschlagen.\"\n\nmsgid \"Attention\"\nmsgstr \"Achtung\"\n\nmsgid \"\"\n\"This trainer requires additional setup before use. Please check the opened folder for instructions.\\n\"\n\"The instructions are always stored in the 'gcm-instructions' folder.\"\nmsgstr \"\"\n\"Dieser Trainer erfordert vor der Nutzung zusätzliche Einrichtung. Bitte überprüfe den geöffneten Ordner für Anweisungen.\\n\"\n\"Die Anweisungen befinden sich immer im Ordner 'gcm-instructions'.\"\n\nmsgid \"An error occurred when moving trainer: \"\nmsgstr \"Ein Fehler ist beim Verschieben des Trainers aufgetreten: \"\n\nmsgid \"Download success!\"\nmsgstr \"Download erfolgreich!\"\n\nmsgid \"Updating \"\nmsgstr \"Aktualisiere \"\n\nmsgid \"Trainer already exists, aborted download.\"\nmsgstr \"Trainer existiert bereits, Download abgebrochen.\"\n\nmsgid \"Downloading...\"\nmsgstr \"Lädt herunter...\"\n\nmsgid \"Failed to find trainer download link.\"\nmsgstr \"Trainer-Download-Link konnte nicht gefunden werden.\"\n\nmsgid \"Failed to find trainer version.\"\nmsgstr \"Trainer-Version konnte nicht gefunden werden.\"\n\nmsgid \"Internet request failed.\"\nmsgstr \"Internet-Anfrage fehlgeschlagen.\"\n\nmsgid \"An error occurred while downloading trainer: \"\nmsgstr \"Ein Fehler ist beim Herunterladen des Trainers aufgetreten: \"\n\nmsgid \"Decompressing...\"\nmsgstr \"Entpacke...\"\n\nmsgid \"An error occurred while extracting downloaded trainer: \"\nmsgstr \"Ein Fehler ist beim Entpacken des heruntergeladenen Trainers aufgetreten: \"\n\nmsgid \"Could not find the downloaded trainer file, please try turning your antivirus software off.\"\nmsgstr \"Die heruntergeladene Trainer-Datei konnte nicht gefunden werden. Versuche, deine Antivirus-Software auszuschalten.\"\n\nmsgid \"Removing trainer background music...\"\nmsgstr \"Hintergrundmusik des Trainers wird entfernt...\"\n\nmsgid \"Patching...\"\nmsgstr \"Patchen...\"\n\nmsgid \"Updating data from GCM\"\nmsgstr \"Daten von GCM werden aktualisiert\"\n\nmsgid \"Update from GCM failed\"\nmsgstr \"Update von GCM fehlgeschlagen\"\n\nmsgid \"Updating data from FLiNG\"\nmsgstr \"Daten von FLiNG werden aktualisiert\"\n\nmsgid \"Update from FLiGN failed\"\nmsgstr \"Update von FLiGN fehlgeschlagen\"\n\nmsgid \"Updating data from XiaoXing\"\nmsgstr \"Daten von XiaoXing werden aktualisiert\"\n\nmsgid \"Update from XiaoXing failed\"\nmsgstr \"Update von XiaoXing fehlgeschlagen\"\n\nmsgid \"Updating data from CT\"\nmsgstr \"Daten von CT werden aktualisiert\"\n\nmsgid \"Update from CT failed\"\nmsgstr \"Update von CT fehlgeschlagen\"\n\nmsgid \"Fetching trainer translations\"\nmsgstr \"Trainer-Übersetzungen werden abgerufen\"\n\nmsgid \"Fetch trainer translations failed\"\nmsgstr \"Abruf der Trainer-Übersetzungen fehlgeschlagen\"\n\nmsgid \"Failed to retrieve upload authorization.\"\nmsgstr \"Abruf der Upload-Berechtigung fehlgeschlagen.\"\n\nmsgid \"Failed to retrieve upload url.\"\nmsgstr \"Abruf der Upload-URL fehlgeschlagen.\"\n\nmsgid \"\"\n\"Upload successful! Thank you for your contribution.\\n\"\n\"Your trainer will be available for download after passing a manual review.\"\nmsgstr \"\"\n\"Upload erfolgreich! Vielen Dank für deinen Beitrag.\\n\"\n\"Dein Trainer wird nach einer manuellen Überprüfung zum Download bereitstehen.\"\n\nmsgid \"Upload failed: \"\nmsgstr \"Upload fehlgeschlagen: \"\n\nmsgid \"\"\n\"Wand is currently running,\\n\"\n\"please close the application first\"\nmsgstr \"\"\n\"Wand läuft gerade,\\n\"\n\"bitte schließe die Anwendung zuerst\"\n\nmsgid \"Failed to patch file:\"\nmsgstr \"Datei konnte nicht gepatcht werden:\"\n\nmsgid \"Failed to extract file:\"\nmsgstr \"Datei konnte nicht extrahiert werden:\"\n\nmsgid \"Wand Pro activated\"\nmsgstr \"Wand Pro aktiviert\"\n\nmsgid \"Failed to activate Wand Pro\"\nmsgstr \"Wand Pro konnte nicht aktiviert werden\"\n\nmsgid \"Wand Pro disabled\"\nmsgstr \"Wand Pro deaktiviert\"\n\nmsgid \"Wand auto update disabled\"\nmsgstr \"Wand Auto-Update deaktiviert\"\n\nmsgid \"Wand auto update enabled\"\nmsgstr \"Wand Auto-Update aktiviert\"\n\nmsgid \"\"\n\"Failed to enable Wand auto update,\\n\"\n\"please try reinstalling Wand\"\nmsgstr \"\"\n\"Wand Auto-Update konnte nicht aktiviert werden,\\n\"\n\"bitte versuche Wand neu zu installieren\"\n\nmsgid \"Failed to process Wand update file:\"\nmsgstr \"Wand Update-Datei konnte nicht verarbeitet werden:\"\n\nmsgid \"Deleted Wand version: \"\nmsgstr \"Wand-Version gelöscht: \"\n\nmsgid \"Failed to delete Wand version: \"\nmsgstr \"Wand-Version konnte nicht gelöscht werden: \"\n\nmsgid \"Checking for trainer updates\"\nmsgstr \"Suche nach Trainer-Updates\"\n\nmsgid \"Check trainer updates failed\"\nmsgstr \"Prüfung auf Trainer-Updates fehlgeschlagen\"\n\nmsgid \"Announcement\"\nmsgstr \"Ankündigung\"\n\nmsgid \"Warning\"\nmsgstr \"Warnung\"\n\nmsgid \"\"\n\"This software is open source and provided free of charge.\\n\"\n\"Resale is strictly prohibited, and developers reserve the right to pursue legal responsibility against the violators.\\n\"\n\"If you have paid for this software unofficially, please report the seller immediately.\\n\"\n\"Below are official links.\"\nmsgstr \"\"\n\"Diese Software ist quelloffen (Open Source) und wird kostenlos zur Verfügung gestellt.\\n\"\n\"Der Weiterverkauf ist strengstens untersagt, und die Entwickler behalten sich das Recht vor, rechtliche Schritte gegen Zuwiderhandelnde einzuleiten.\\n\"\n\"Wenn du diese Software inoffiziell bezahlt hast, melde den Verkäufer bitte umgehend.\\n\"\n\"Unten findest du die offiziellen Links.\"\n\nmsgid \"Official Website:\"\nmsgstr \"Offizielle Website:\"\n\nmsgid \"Bilibili:\"\nmsgstr \"Bilibili:\"\n\nmsgid \"Theme:\"\nmsgstr \"Design:\"\n\nmsgid \"Language:\"\nmsgstr \"Sprache:\"\n\nmsgid \"Launch app on system startup\"\nmsgstr \"App beim Systemstart ausführen\"\n\nmsgid \"Check for software update at startup\"\nmsgstr \"Beim Start nach Software-Updates suchen\"\n\nmsgid \"Use safe launch path (may fix trainers unable to launch)\"\nmsgstr \"Sicheren Startpfad verwenden (kann Probleme beim Starten von Trainern beheben)\"\n\nmsgid \"Always show search results in English\"\nmsgstr \"Suchergebnisse immer auf Englisch anzeigen\"\n\nmsgid \"Sort search results by origin\"\nmsgstr \"Suchergebnisse nach Herkunft sortieren\"\n\nmsgid \"Update trainer translations automatically\"\nmsgstr \"Trainer-Übersetzungen automatisch aktualisieren\"\n\nmsgid \"Apply\"\nmsgstr \"Anwenden\"\n\nmsgid \"Do you want to restart the application now to apply theme or language settings?\"\nmsgstr \"Möchtest du die Anwendung jetzt neu starten, um die Design- oder Spracheinstellungen anzuwenden?\"\n\nmsgid \"Settings saved.\"\nmsgstr \"Einstellungen gespeichert.\"\n\nmsgid \"Current version: \"\nmsgstr \"Aktuelle Version: \"\n\nmsgid \"Newest version: \"\nmsgstr \"Neueste Version: \"\n\nmsgid \"Loading...\"\nmsgstr \"Lädt...\"\n\nmsgid \"Update Now\"\nmsgstr \"Jetzt aktualisieren\"\n\nmsgid \"Failed to load\"\nmsgstr \"Laden fehlgeschlagen\"\n\nmsgid \"Contact Info (Optional):\"\nmsgstr \"Kontaktdaten (Optional):\"\n\nmsgid \"Email\"\nmsgstr \"E-Mail\"\n\nmsgid \"If you provide your Game-Zone Labs account email and your trainer is approved, a badge will be added to your account\"\nmsgstr \"Wenn Sie Ihre Game-Zone Labs-Konto-E-Mail angeben und Ihr Trainer genehmigt wird, erhalten Sie ein Abzeichen auf Ihrem Konto\"\n\nmsgid \"Trainer Name:\"\nmsgstr \"Trainer-Name:\"\n\nmsgid \"What game does it work for\"\nmsgstr \"Für welches Spiel ist er gedacht\"\n\nmsgid \"Trainer Source (Optional):\"\nmsgstr \"Trainer-Quelle (Optional):\"\n\nmsgid \"Original URL or author\"\nmsgstr \"Original-URL oder Autor\"\n\nmsgid \"If you made the trainer, please provide your author name\"\nmsgstr \"Wenn du den Trainer selbst erstellt hast, gib bitte deinen Autorennamen an\"\n\nmsgid \"Trainer File:\"\nmsgstr \"Trainer-Datei:\"\n\nmsgid \"Select a trainer file\"\nmsgstr \"Trainer-Datei auswählen\"\n\nmsgid \"If the trainer consists of multiple files, please compress them into a single archive (zip/rar/7z) before uploading\"\nmsgstr \"Falls der Trainer aus mehreren Dateien besteht, komprimieren Sie diese bitte vor dem Hochladen in ein einzelnes Archiv (zip/rar/7z)\"\n\nmsgid \"Additional Notes:\"\nmsgstr \"Zusätzliche Anmerkungen:\"\n\nmsgid \"Anything else to add...\"\nmsgstr \"Sonstige Ergänzungen...\"\n\nmsgid \"Please make sure the trainer you are about to upload is tested to be safe and functional.\"\nmsgstr \"Bitte stellen Sie sicher, dass der Trainer, den Sie hochladen möchten, getestet, sicher und funktionsfähig ist.\"\n\nmsgid \"For more info about trainer uploading, please join the QQ group to discuss: 186859946.\"\nmsgstr \"Für weitere Informationen zum Hochladen von Trainern tritt bitte der QQ-Gruppe bei: 186859946.\"\n\nmsgid \"Upload\"\nmsgstr \"Hochladen\"\n\nmsgid \"All Files (*)\"\nmsgstr \"Alle Dateien (*)\"\n\nmsgid \"Please select a valid file.\"\nmsgstr \"Bitte wähle eine gültige Datei aus.\"\n\nmsgid \"Please provide a trainer name.\"\nmsgstr \"Bitte gib einen Trainer-Namen an.\"\n\nmsgid \"Close\"\nmsgstr \"Schließen\"\n\nmsgid \"FLiNG\"\nmsgstr \"FLiNG\"\n\nmsgid \"XiaoXing\"\nmsgstr \"XiaoXing\"\n\nmsgid \"Enable search for GCM and Other trainers\"\nmsgstr \"Suche nach GCM- und anderen Trainern aktivieren\"\n\nmsgid \"Update GCM data automatically\"\nmsgstr \"GCM-Daten automatisch aktualisieren\"\n\nmsgid \"Update GCM and Other trainers automatically\"\nmsgstr \"GCM- und andere Trainer automatisch aktualisieren\"\n\nmsgid \"Official Website: \"\nmsgstr \"Offizielle Website: \"\n\nmsgid \"Download Server:\"\nmsgstr \"Download-Server:\"\n\nmsgid \"Remove trainer background music\"\nmsgstr \"Trainer-Hintergrundmusik entfernen\"\n\nmsgid \"Update FLiNG data automatically\"\nmsgstr \"FLiNG-Daten automatisch aktualisieren\"\n\nmsgid \"Update FLiNG trainers automatically\"\nmsgstr \"FLiNG-Trainer automatisch aktualisieren\"\n\nmsgid \"Enable search for XiaoXing trainers\"\nmsgstr \"Suche nach XiaoXing-Trainern aktivieren\"\n\nmsgid \"Unlock all functions\"\nmsgstr \"Alle Funktionen freischalten\"\n\nmsgid \"Update XiaoXing data automatically\"\nmsgstr \"XiaoXing-Daten automatisch aktualisieren\"\n\nmsgid \"Update XiaoXing trainers automatically\"\nmsgstr \"XiaoXing-Trainer automatisch aktualisieren\"\n\nmsgid \"Cheat Table Sources: \"\nmsgstr \"Cheat-Table-Quellen: \"\n\nmsgid \"Cheat Engine installation path:\"\nmsgstr \"Cheat Engine-Installationspfad:\"\n\nmsgid \"Reset to default\"\nmsgstr \"Auf Standard zurücksetzen\"\n\nmsgid \"Add Simplified Chinese\"\nmsgstr \"Vereinfachtes Chinesisch hinzufügen\"\n\nmsgid \"Enable Search for Cheat Tables\"\nmsgstr \"Suche nach Cheat Tables aktivieren\"\n\nmsgid \"Update Cheat Table data automatically\"\nmsgstr \"Cheat-Table-Daten automatisch aktualisieren\"\n\nmsgid \"Update Cheat Tables automatically\"\nmsgstr \"Cheat Tables automatisch aktualisieren\"\n\nmsgid \"Wand installation path:\"\nmsgstr \"Wand-Installationspfad:\"\n\nmsgid \"Installed Wand Versions:\"\nmsgstr \"Installierte Wand-Versionen:\"\n\nmsgid \"Patch Method:\"\nmsgstr \"Patch-Methode:\"\n\nmsgid \"Activate Wand Pro\"\nmsgstr \"Wand Pro aktivieren\"\n\nmsgid \"Disable Wand Auto Update\"\nmsgstr \"Wand Auto-Update deaktivieren\"\n\nmsgid \"Delete All Other Wand Versions\"\nmsgstr \"Alle anderen Wand-Versionen löschen\"\n\nmsgid \"Cheat Evolution installation path:\"\nmsgstr \"Cheat Evolution-Installationspfad:\"\n\nmsgid \"Activate PRO\"\nmsgstr \"PRO aktivieren\"\n\nmsgid \"Please select Wand installation path\"\nmsgstr \"Bitte wähle den Wand-Installationspfad\"\n\nmsgid \"Please select Cheat Engine installation path\"\nmsgstr \"Bitte wähle den Cheat Engine-Installationspfad\"\n\nmsgid \"Cheat Engine is installed\"\nmsgstr \"Cheat Engine ist installiert\"\n\nmsgid \"Wand not installed\"\nmsgstr \"Wand ist nicht installiert\"\n\nmsgid \"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"Um die Übersetzungsdateien hinzuzufügen, werden Administratorrechte benötigt. Es erscheint eine Benutzerkontensteuerung (UAC), um die Berechtigung zu bestätigen.\"\n\nmsgid \"Successfully added translation files\"\nmsgstr \"Übersetzungsdateien wurden erfolgreich hinzugefügt\"\n\nmsgid \"Failed to add translation files\"\nmsgstr \"Übersetzungsdateien konnten nicht hinzugefügt werden\"\n\nmsgid \"Please select Cheat Evolution installation path\"\nmsgstr \"Bitte wähle den Cheat Evolution-Installationspfad\"\n\nmsgid \"Please launch Cheat Evolution using CheatEvolution_patched.exe\"\nmsgstr \"Bitte starte Cheat Evolution mit CheatEvolution_patched.exe\"\n\nmsgid \"Invalid Cheat Evolution installation path\"\nmsgstr \"Ungültiger Cheat Evolution Installationspfad\"\n\nmsgid \"Cheat Evolution is installed and ready to patch\"\nmsgstr \"Cheat Evolution ist installiert und bereit zum Patchen\"\n\nmsgid \"Patch successful\"\nmsgstr \"Patch erfolgreich\"\n\nmsgid \"Failed to patch\"\nmsgstr \"Patch fehlgeschlagen\"\n"
  },
  {
    "path": "src/locale/en_US/LC_MESSAGES/Game Cheats Manager.po",
    "content": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Game Cheats Manager\\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: \\n\"\n\"Language: en_US\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 3.4.4\\n\"\n\nmsgid \"Dark\"\nmsgstr \"Dark\"\n\nmsgid \"Light\"\nmsgstr \"Light\"\n\nmsgid \"Official Site\"\nmsgstr \"Official Site\"\n\nmsgid \"GCM Server\"\nmsgstr \"GCM Server\"\n\nmsgid \"Yearly Subscription\"\nmsgstr \"Yearly Subscription\"\n\nmsgid \"Gifted Subscription\"\nmsgstr \"Gifted Subscription\"\n\nmsgid \"Search for installed trainers\"\nmsgstr \"Search for installed trainers\"\n\nmsgid \"Enter keywords to download trainers\"\nmsgstr \"Enter keywords to download trainers\"\n\nmsgid \"Options\"\nmsgstr \"Options\"\n\nmsgid \"Settings\"\nmsgstr \"Settings\"\n\nmsgid \"Import Trainers\"\nmsgstr \"Import Trainers\"\n\nmsgid \"Open Trainer Download Path\"\nmsgstr \"Open Trainer Download Path\"\n\nmsgid \"Add Paths to Whitelist\"\nmsgstr \"Add Paths to Whitelist\"\n\nmsgid \"About\"\nmsgstr \"About\"\n\nmsgid \"Data Update\"\nmsgstr \"Data Update\"\n\nmsgid \"Update Translation Data\"\nmsgstr \"Update Translation Data\"\n\nmsgid \"Update Trainer Search Data\"\nmsgstr \"Update Trainer Search Data\"\n\nmsgid \"Update Trainers\"\nmsgstr \"Update Trainers\"\n\nmsgid \"Trainer Management\"\nmsgstr \"Trainer Management\"\n\nmsgid \"Upload Trainer\"\nmsgstr \"Upload Trainer\"\n\nmsgid \"Browse All Trainers\"\nmsgstr \"Browse All Trainers\"\n\nmsgid \"Launch\"\nmsgstr \"Launch\"\n\nmsgid \"Delete\"\nmsgstr \"Delete\"\n\nmsgid \"Trainer download path:\"\nmsgstr \"Trainer download path:\"\n\nmsgid \"Failure\"\nmsgstr \"Failure\"\n\nmsgid \"Failed to update application.\"\nmsgstr \"Failed to update application.\"\n\nmsgid \"Update Available\"\nmsgstr \"Update Available\"\n\nmsgid \"New version found: {old_version} ➜ {new_version}\"\nmsgstr \"New version found: {old_version} ➜ {new_version}\"\n\nmsgid \"Would you like to update now?\"\nmsgstr \"Would you like to update now?\"\n\nmsgid \"Update Check Failed\"\nmsgstr \"Update Check Failed\"\n\nmsgid \"Failed to check for software update. You can navigate to `Options` ➜ `About` to check for updates manually.\"\nmsgstr \"Failed to check for software update. You can navigate to `Options` ➜ `About` to check for updates manually.\"\n\nmsgid \"Cheat Engine Required\"\nmsgstr \"Cheat Engine Required\"\n\nmsgid \"Cheat Engine may not be installed on your system.\"\nmsgstr \"Cheat Engine may not be installed on your system.\"\n\nmsgid \".ct/.cetrainer files require Cheat Engine to run.\"\nmsgstr \".ct/.cetrainer files require Cheat Engine to run.\"\n\nmsgid \"Please download and install Cheat Engine, then make sure to open the file with Cheat Engine.\"\nmsgstr \"Please download and install Cheat Engine, then make sure to open the file with Cheat Engine.\"\n\nmsgid \"Note: The official Cheat Engine installer contains promotional software bundles. Make sure to skip them during installation.\"\nmsgstr \"Note: The official Cheat Engine installer contains promotional software bundles. Make sure to skip them during installation.\"\n\nmsgid \"Download from:\"\nmsgstr \"Download from:\"\n\nmsgid \"Don't show again\"\nmsgstr \"Don't show again\"\n\nmsgid \"Delete trainer\"\nmsgstr \"Delete trainer\"\n\nmsgid \"Are you sure you want to delete \"\nmsgstr \"Are you sure you want to delete \"\n\nmsgid \"Confirm\"\nmsgstr \"Confirm\"\n\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgid \"Error\"\nmsgstr \"Error\"\n\nmsgid \"Trainer is currently in use, please close any programs using the file and try again.\"\nmsgstr \"Trainer is currently in use, please close any programs using the file and try again.\"\n\nmsgid \"Failed to delete {trainer_name}:\"\nmsgstr \"Failed to delete {trainer_name}:\"\n\nmsgid \"Change trainer download path\"\nmsgstr \"Change trainer download path\"\n\nmsgid \"Please choose a new path.\"\nmsgstr \"Please choose a new path.\"\n\nmsgid \"Failed to change trainer download path.\"\nmsgstr \"Failed to change trainer download path.\"\n\nmsgid \"Migrating existing trainers...\"\nmsgstr \"Migrating existing trainers...\"\n\nmsgid \"No path selected.\"\nmsgstr \"No path selected.\"\n\nmsgid \"Error migrating trainers: \"\nmsgstr \"Error migrating trainers: \"\n\nmsgid \"Migration complete!\"\nmsgstr \"Migration complete!\"\n\nmsgid \"Select trainers you want to import\"\nmsgstr \"Select trainers you want to import\"\n\nmsgid \"Failed to import trainer: \"\nmsgstr \"Failed to import trainer: \"\n\nmsgid \"Delete original trainers\"\nmsgstr \"Delete original trainers\"\n\nmsgid \"Do you want to delete the original trainer files?\"\nmsgstr \"Do you want to delete the original trainer files?\"\n\nmsgid \"Yes\"\nmsgstr \"Yes\"\n\nmsgid \"No\"\nmsgstr \"No\"\n\nmsgid \"Failed to delete original trainer: \"\nmsgstr \"Failed to delete original trainer: \"\n\nmsgid \"Administrator Access Required\"\nmsgstr \"Administrator Access Required\"\n\nmsgid \"To proceed with adding the trainer download paths to the Windows Defender whitelist, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"To proceed with adding the trainer download paths to the Windows Defender whitelist, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\n\nmsgid \"Would you like to continue?\"\nmsgstr \"Would you like to continue?\"\n\nmsgid \"Success\"\nmsgstr \"Success\"\n\nmsgid \"Successfully added paths to Windows Defender whitelist.\"\nmsgstr \"Successfully added paths to Windows Defender whitelist.\"\n\nmsgid \"Failed to add paths to Windows Defender whitelist.\"\nmsgstr \"Failed to add paths to Windows Defender whitelist.\"\n\nmsgid \"Failed to translate, please update translation data.\"\nmsgstr \"Failed to translate, please update translation data.\"\n\nmsgid \"Searching...\"\nmsgstr \"Searching...\"\n\nmsgid \"Translating search results...\"\nmsgstr \"Translating search results...\"\n\nmsgid \"No search results found.\"\nmsgstr \"No search results found.\"\n\nmsgid \"Translating keywords...\"\nmsgstr \"Translating keywords...\"\n\nmsgid \"Search failed, please update trainer search data.\"\nmsgstr \"Search failed, please update trainer search data.\"\n\nmsgid \"Search from FLiNG success!\"\nmsgstr \"Search from FLiNG success!\"\n\nmsgid \"Search from XiaoXing success!\"\nmsgstr \"Search from XiaoXing success!\"\n\nmsgid \"Search from CT success!\"\nmsgstr \"Search from CT success!\"\n\nmsgid \"Search from GCM success!\"\nmsgstr \"Search from GCM success!\"\n\nmsgid \"Checking for internet connection...\"\nmsgstr \"Checking for internet connection...\"\n\nmsgid \"No internet connection, download failed.\"\nmsgstr \"No internet connection, download failed.\"\n\nmsgid \"Attention\"\nmsgstr \"Attention\"\n\nmsgid \"\"\n\"This trainer requires additional setup before use. Please check the opened folder for instructions.\\n\"\n\"The instructions are always stored in the 'gcm-instructions' folder.\"\nmsgstr \"\"\n\"This trainer requires additional setup before use. Please check the opened folder for instructions.\\n\"\n\"The instructions are always stored in the 'gcm-instructions' folder.\"\n\nmsgid \"An error occurred when moving trainer: \"\nmsgstr \"An error occurred when moving trainer: \"\n\nmsgid \"Download success!\"\nmsgstr \"Download success!\"\n\nmsgid \"Updating \"\nmsgstr \"Updating \"\n\nmsgid \"Trainer already exists, aborted download.\"\nmsgstr \"Trainer already exists, aborted download.\"\n\nmsgid \"Downloading...\"\nmsgstr \"Downloading...\"\n\nmsgid \"Failed to find trainer download link.\"\nmsgstr \"Failed to find trainer download link.\"\n\nmsgid \"Failed to find trainer version.\"\nmsgstr \"Failed to find trainer version.\"\n\nmsgid \"Internet request failed.\"\nmsgstr \"Internet request failed.\"\n\nmsgid \"An error occurred while downloading trainer: \"\nmsgstr \"An error occurred while downloading trainer: \"\n\nmsgid \"Decompressing...\"\nmsgstr \"Decompressing...\"\n\nmsgid \"An error occurred while extracting downloaded trainer: \"\nmsgstr \"An error occurred while extracting downloaded trainer: \"\n\nmsgid \"Could not find the downloaded trainer file, please try turning your antivirus software off.\"\nmsgstr \"Could not find the downloaded trainer file, please try turning your antivirus software off.\"\n\nmsgid \"Removing trainer background music...\"\nmsgstr \"Removing trainer background music...\"\n\nmsgid \"Patching...\"\nmsgstr \"Patching...\"\n\nmsgid \"Updating data from GCM\"\nmsgstr \"Updating data from GCM\"\n\nmsgid \"Update from GCM failed\"\nmsgstr \"Update from GCM failed\"\n\nmsgid \"Updating data from FLiNG\"\nmsgstr \"Updating data from FLiNG\"\n\nmsgid \"Update from FLiGN failed\"\nmsgstr \"Update from FLiGN failed\"\n\nmsgid \"Updating data from XiaoXing\"\nmsgstr \"Updating data from XiaoXing\"\n\nmsgid \"Update from XiaoXing failed\"\nmsgstr \"Update from XiaoXing failed\"\n\nmsgid \"Updating data from CT\"\nmsgstr \"Updating data from CT\"\n\nmsgid \"Update from CT failed\"\nmsgstr \"Update from CT failed\"\n\nmsgid \"Fetching trainer translations\"\nmsgstr \"Fetching trainer translations\"\n\nmsgid \"Fetch trainer translations failed\"\nmsgstr \"Fetch trainer translations failed\"\n\nmsgid \"Failed to retrieve upload authorization.\"\nmsgstr \"Failed to retrieve upload authorization.\"\n\nmsgid \"Failed to retrieve upload url.\"\nmsgstr \"Failed to retrieve upload url.\"\n\nmsgid \"\"\n\"Upload successful! Thank you for your contribution.\\n\"\n\"Your trainer will be available for download after passing a manual review.\"\nmsgstr \"\"\n\"Upload successful! Thank you for your contribution.\\n\"\n\"Your trainer will be available for download after passing a manual review.\"\n\nmsgid \"Upload failed: \"\nmsgstr \"Upload failed: \"\n\nmsgid \"\"\n\"Wand is currently running,\\n\"\n\"please close the application first\"\nmsgstr \"\"\n\"Wand is currently running,\\n\"\n\"please close the application first\"\n\nmsgid \"Failed to patch file:\"\nmsgstr \"Failed to patch file:\"\n\nmsgid \"Failed to extract file:\"\nmsgstr \"Failed to extract file:\"\n\nmsgid \"Wand Pro activated\"\nmsgstr \"Wand Pro activated\"\n\nmsgid \"Failed to activate Wand Pro\"\nmsgstr \"Failed to activate Wand Pro\"\n\nmsgid \"Wand Pro disabled\"\nmsgstr \"Wand Pro disabled\"\n\nmsgid \"Wand auto update disabled\"\nmsgstr \"Wand auto update disabled\"\n\nmsgid \"Wand auto update enabled\"\nmsgstr \"Wand auto update enabled\"\n\nmsgid \"\"\n\"Failed to enable Wand auto update,\\n\"\n\"please try reinstalling Wand\"\nmsgstr \"\"\n\"Failed to enable Wand auto update,\\n\"\n\"please try reinstalling Wand\"\n\nmsgid \"Failed to process Wand update file:\"\nmsgstr \"Failed to process Wand update file:\"\n\nmsgid \"Deleted Wand version: \"\nmsgstr \"Deleted Wand version: \"\n\nmsgid \"Failed to delete Wand version: \"\nmsgstr \"Failed to delete Wand version: \"\n\nmsgid \"Checking for trainer updates\"\nmsgstr \"Checking for trainer updates\"\n\nmsgid \"Check trainer updates failed\"\nmsgstr \"Check trainer updates failed\"\n\nmsgid \"Announcement\"\nmsgstr \"Announcement\"\n\nmsgid \"Warning\"\nmsgstr \"Warning\"\n\nmsgid \"\"\n\"This software is open source and provided free of charge.\\n\"\n\"Resale is strictly prohibited, and developers reserve the right to pursue legal responsibility against the violators.\\n\"\n\"If you have paid for this software unofficially, please report the seller immediately.\\n\"\n\"Below are official links.\"\nmsgstr \"\"\n\"This software is open source and provided free of charge.\\n\"\n\"Resale is strictly prohibited, and developers reserve the right to pursue legal responsibility against the violators.\\n\"\n\"If you have paid for this software unofficially, please report the seller immediately.\\n\"\n\"Below are official links.\"\n\nmsgid \"Official Website:\"\nmsgstr \"Official Website:\"\n\nmsgid \"Bilibili:\"\nmsgstr \"Bilibili:\"\n\nmsgid \"Theme:\"\nmsgstr \"Theme:\"\n\nmsgid \"Language:\"\nmsgstr \"Language:\"\n\nmsgid \"Launch app on system startup\"\nmsgstr \"Launch app on system startup\"\n\nmsgid \"Check for software update at startup\"\nmsgstr \"Check for software update at startup\"\n\nmsgid \"Use safe launch path (may fix trainers unable to launch)\"\nmsgstr \"Use safe launch path (may fix trainers unable to launch)\"\n\nmsgid \"Always show search results in English\"\nmsgstr \"Always show search results in English\"\n\nmsgid \"Sort search results by origin\"\nmsgstr \"Sort search results by origin\"\n\nmsgid \"Update trainer translations automatically\"\nmsgstr \"Update trainer translations automatically\"\n\nmsgid \"Apply\"\nmsgstr \"Apply\"\n\nmsgid \"Do you want to restart the application now to apply theme or language settings?\"\nmsgstr \"Do you want to restart the application now to apply theme or language settings?\"\n\nmsgid \"Settings saved.\"\nmsgstr \"Settings saved.\"\n\nmsgid \"Current version: \"\nmsgstr \"Current version: \"\n\nmsgid \"Newest version: \"\nmsgstr \"Newest version: \"\n\nmsgid \"Loading...\"\nmsgstr \"Loading...\"\n\nmsgid \"Update Now\"\nmsgstr \"Update Now\"\n\nmsgid \"Failed to load\"\nmsgstr \"Failed to load\"\n\nmsgid \"Contact Info (Optional):\"\nmsgstr \"Contact Info (Optional):\"\n\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgid \"If you provide your Game-Zone Labs account email and your trainer is approved, a badge will be added to your account\"\nmsgstr \"If you provide your Game-Zone Labs account email and your trainer is approved, a badge will be added to your account\"\n\nmsgid \"Trainer Name:\"\nmsgstr \"Trainer Name:\"\n\nmsgid \"What game does it work for\"\nmsgstr \"What game does it work for\"\n\nmsgid \"Trainer Source (Optional):\"\nmsgstr \"Trainer Source (Optional):\"\n\nmsgid \"Original URL or author\"\nmsgstr \"Original URL or author\"\n\nmsgid \"If you made the trainer, please provide your author name\"\nmsgstr \"If you made the trainer, please provide your author name\"\n\nmsgid \"Trainer File:\"\nmsgstr \"Trainer File:\"\n\nmsgid \"Select a trainer file\"\nmsgstr \"Select a trainer file\"\n\nmsgid \"If the trainer consists of multiple files, please compress them into a single archive (zip/rar/7z) before uploading\"\nmsgstr \"If the trainer consists of multiple files, please compress them into a single archive (zip/rar/7z) before uploading\"\n\nmsgid \"Additional Notes:\"\nmsgstr \"Additional Notes:\"\n\nmsgid \"Anything else to add...\"\nmsgstr \"Anything else to add...\"\n\nmsgid \"Please make sure the trainer you are about to upload is tested to be safe and functional.\"\nmsgstr \"Please make sure the trainer you are about to upload is tested to be safe and functional.\"\n\nmsgid \"For more info about trainer uploading, please join the QQ group to discuss: 186859946.\"\nmsgstr \"For more info about trainer uploading, please join the QQ group to discuss: 186859946.\"\n\nmsgid \"Upload\"\nmsgstr \"Upload\"\n\nmsgid \"All Files (*)\"\nmsgstr \"All Files (*)\"\n\nmsgid \"Please select a valid file.\"\nmsgstr \"Please select a valid file.\"\n\nmsgid \"Please provide a trainer name.\"\nmsgstr \"Please provide a trainer name.\"\n\nmsgid \"Close\"\nmsgstr \"Close\"\n\nmsgid \"FLiNG\"\nmsgstr \"FLiNG\"\n\nmsgid \"XiaoXing\"\nmsgstr \"XiaoXing\"\n\nmsgid \"Enable search for GCM and Other trainers\"\nmsgstr \"Enable search for GCM and Other trainers\"\n\nmsgid \"Update GCM data automatically\"\nmsgstr \"Update GCM data automatically\"\n\nmsgid \"Update GCM and Other trainers automatically\"\nmsgstr \"Update GCM and Other trainers automatically\"\n\nmsgid \"Official Website: \"\nmsgstr \"Official Website: \"\n\nmsgid \"Download Server:\"\nmsgstr \"Download Server:\"\n\nmsgid \"Remove trainer background music\"\nmsgstr \"Remove trainer background music\"\n\nmsgid \"Update FLiNG data automatically\"\nmsgstr \"Update FLiNG data automatically\"\n\nmsgid \"Update FLiNG trainers automatically\"\nmsgstr \"Update FLiNG trainers automatically\"\n\nmsgid \"Enable search for XiaoXing trainers\"\nmsgstr \"Enable search for XiaoXing trainers\"\n\nmsgid \"Unlock all functions\"\nmsgstr \"Unlock all functions\"\n\nmsgid \"Update XiaoXing data automatically\"\nmsgstr \"Update XiaoXing data automatically\"\n\nmsgid \"Update XiaoXing trainers automatically\"\nmsgstr \"Update XiaoXing trainers automatically\"\n\nmsgid \"Cheat Table Sources: \"\nmsgstr \"Cheat Table Sources: \"\n\nmsgid \"Cheat Engine installation path:\"\nmsgstr \"Cheat Engine installation path:\"\n\nmsgid \"Reset to default\"\nmsgstr \"Reset to default\"\n\nmsgid \"Add Simplified Chinese\"\nmsgstr \"Add Simplified Chinese\"\n\nmsgid \"Enable Search for Cheat Tables\"\nmsgstr \"Enable Search for Cheat Tables\"\n\nmsgid \"Update Cheat Table data automatically\"\nmsgstr \"Update Cheat Table data automatically\"\n\nmsgid \"Update Cheat Tables automatically\"\nmsgstr \"Update Cheat Tables automatically\"\n\nmsgid \"Wand installation path:\"\nmsgstr \"Wand installation path:\"\n\nmsgid \"Installed Wand Versions:\"\nmsgstr \"Installed Wand Versions:\"\n\nmsgid \"Patch Method:\"\nmsgstr \"Patch Method:\"\n\nmsgid \"Activate Wand Pro\"\nmsgstr \"Activate Wand Pro\"\n\nmsgid \"Disable Wand Auto Update\"\nmsgstr \"Disable Wand Auto Update\"\n\nmsgid \"Delete All Other Wand Versions\"\nmsgstr \"Delete All Other Wand Versions\"\n\nmsgid \"Cheat Evolution installation path:\"\nmsgstr \"Cheat Evolution installation path:\"\n\nmsgid \"Activate PRO\"\nmsgstr \"Activate PRO\"\n\nmsgid \"Please select Wand installation path\"\nmsgstr \"Please select Wand installation path\"\n\nmsgid \"Please select Cheat Engine installation path\"\nmsgstr \"Please select Cheat Engine installation path\"\n\nmsgid \"Cheat Engine is installed\"\nmsgstr \"Cheat Engine is installed\"\n\nmsgid \"Wand not installed\"\nmsgstr \"Wand not installed\"\n\nmsgid \"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\n\nmsgid \"Successfully added translation files\"\nmsgstr \"Successfully added translation files\"\n\nmsgid \"Failed to add translation files\"\nmsgstr \"Failed to add translation files\"\n\nmsgid \"Please select Cheat Evolution installation path\"\nmsgstr \"Please select Cheat Evolution installation path\"\n\nmsgid \"Please launch Cheat Evolution using CheatEvolution_patched.exe\"\nmsgstr \"Please launch Cheat Evolution using CheatEvolution_patched.exe\"\n\nmsgid \"Invalid Cheat Evolution installation path\"\nmsgstr \"Invalid Cheat Evolution installation path\"\n\nmsgid \"Cheat Evolution is installed and ready to patch\"\nmsgstr \"Cheat Evolution is installed and ready to patch\"\n\nmsgid \"Patch successful\"\nmsgstr \"Patch successful\"\n\nmsgid \"Failed to patch\"\nmsgstr \"Failed to patch\"\n"
  },
  {
    "path": "src/locale/zh_CN/LC_MESSAGES/Game Cheats Manager.po",
    "content": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Game Cheats Manager\\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: \\n\"\n\"Language: zh_CN\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 3.4.4\\n\"\n\nmsgid \"Dark\"\nmsgstr \"深色\"\n\nmsgid \"Light\"\nmsgstr \"浅色\"\n\nmsgid \"Official Site\"\nmsgstr \"官方网站\"\n\nmsgid \"GCM Server\"\nmsgstr \"GCM 服务器\"\n\nmsgid \"Yearly Subscription\"\nmsgstr \"年费订阅\"\n\nmsgid \"Gifted Subscription\"\nmsgstr \"礼物订阅\"\n\nmsgid \"Search for installed trainers\"\nmsgstr \"搜索已安装修改器\"\n\nmsgid \"Enter keywords to download trainers\"\nmsgstr \"输入关键词下载修改器\"\n\nmsgid \"Options\"\nmsgstr \"选项\"\n\nmsgid \"Settings\"\nmsgstr \"设置\"\n\nmsgid \"Import Trainers\"\nmsgstr \"导入修改器\"\n\nmsgid \"Open Trainer Download Path\"\nmsgstr \"打开修改器下载路径\"\n\nmsgid \"Add Paths to Whitelist\"\nmsgstr \"添加路径至白名单\"\n\nmsgid \"About\"\nmsgstr \"关于\"\n\nmsgid \"Data Update\"\nmsgstr \"数据更新\"\n\nmsgid \"Update Translation Data\"\nmsgstr \"更新翻译数据\"\n\nmsgid \"Update Trainer Search Data\"\nmsgstr \"更新修改器检索数据\"\n\nmsgid \"Update Trainers\"\nmsgstr \"更新修改器\"\n\nmsgid \"Trainer Management\"\nmsgstr \"修改器管理\"\n\nmsgid \"Upload Trainer\"\nmsgstr \"上传修改器\"\n\nmsgid \"Browse All Trainers\"\nmsgstr \"查看所有修改器\"\n\nmsgid \"Launch\"\nmsgstr \"启动\"\n\nmsgid \"Delete\"\nmsgstr \"删除\"\n\nmsgid \"Trainer download path:\"\nmsgstr \"修改器下载路径：\"\n\nmsgid \"Failure\"\nmsgstr \"失败\"\n\nmsgid \"Failed to update application.\"\nmsgstr \"软件更新失败。\"\n\nmsgid \"Update Available\"\nmsgstr \"可用更新\"\n\nmsgid \"New version found: {old_version} ➜ {new_version}\"\nmsgstr \"发现新版本：{old_version} ➜ {new_version}\"\n\nmsgid \"Would you like to update now?\"\nmsgstr \"是否立即更新？\"\n\nmsgid \"Update Check Failed\"\nmsgstr \"检查更新失败\"\n\nmsgid \"Failed to check for software update. You can navigate to `Options` ➜ `About` to check for updates manually.\"\nmsgstr \"无法检查软件更新，请移至 `选项` ➜ `关于` 以手动检查更新。\"\n\nmsgid \"Cheat Engine Required\"\nmsgstr \"需要安装 Cheat Engine\"\n\nmsgid \"Cheat Engine may not be installed on your system.\"\nmsgstr \"您的系统上可能尚未安装 Cheat Engine。\"\n\nmsgid \".ct/.cetrainer files require Cheat Engine to run.\"\nmsgstr \".ct 和 .cetrainer 文件需要依赖 Cheat Engine 才能运行。\"\n\nmsgid \"Please download and install Cheat Engine, then make sure to open the file with Cheat Engine.\"\nmsgstr \"请下载并安装 Cheat Engine，然后请确保使用 Cheat Engine 打开该文件。\"\n\nmsgid \"Note: The official Cheat Engine installer contains promotional software bundles. Make sure to skip them during installation.\"\nmsgstr \"注意：Cheat Engine 官方安装程序内包含捆绑的推广软件。在安装过程中请注意跳过/拒绝这些捆绑内容。\"\n\nmsgid \"Download from:\"\nmsgstr \"下载地址：\"\n\nmsgid \"Don't show again\"\nmsgstr \"不再显示\"\n\nmsgid \"Delete trainer\"\nmsgstr \"删除修改器\"\n\nmsgid \"Are you sure you want to delete \"\nmsgstr \"确定要删除 \"\n\nmsgid \"Confirm\"\nmsgstr \"确认\"\n\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgid \"Error\"\nmsgstr \"错误\"\n\nmsgid \"Trainer is currently in use, please close any programs using the file and try again.\"\nmsgstr \"修改器当前正在使用中，请关闭使用该文件的所有程序，然后重试。\"\n\nmsgid \"Failed to delete {trainer_name}:\"\nmsgstr \"删除 {trainer_name} 失败：\"\n\nmsgid \"Change trainer download path\"\nmsgstr \"更改修改器下载路径\"\n\nmsgid \"Please choose a new path.\"\nmsgstr \"请选择一个新路径。\"\n\nmsgid \"Failed to change trainer download path.\"\nmsgstr \"更改修改器下载路径失败。\"\n\nmsgid \"Migrating existing trainers...\"\nmsgstr \"正在迁移现有修改器...\"\n\nmsgid \"No path selected.\"\nmsgstr \"未选择路径。\"\n\nmsgid \"Error migrating trainers: \"\nmsgstr \"迁移修改器时出错：\"\n\nmsgid \"Migration complete!\"\nmsgstr \"迁移完成！\"\n\nmsgid \"Select trainers you want to import\"\nmsgstr \"选择要导入的修改器\"\n\nmsgid \"Failed to import trainer: \"\nmsgstr \"导入修改器失败：\"\n\nmsgid \"Delete original trainers\"\nmsgstr \"删除原始修改器\"\n\nmsgid \"Do you want to delete the original trainer files?\"\nmsgstr \"是否要删除原始修改器文件？\"\n\nmsgid \"Yes\"\nmsgstr \"是\"\n\nmsgid \"No\"\nmsgstr \"否\"\n\nmsgid \"Failed to delete original trainer: \"\nmsgstr \"无法删除原始修改器：\"\n\nmsgid \"Administrator Access Required\"\nmsgstr \"需要管理员访问权限\"\n\nmsgid \"To proceed with adding the trainer download paths to the Windows Defender whitelist, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"若要将修改器下载路径添加到 Windows Defender 白名单中，需要管理员权限。请留意将弹出的用户帐户控制（UAC）提示。\"\n\nmsgid \"Would you like to continue?\"\nmsgstr \"是否要继续？\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Successfully added paths to Windows Defender whitelist.\"\nmsgstr \"已成功将路径添加到 Windows Defender 白名单。\"\n\nmsgid \"Failed to add paths to Windows Defender whitelist.\"\nmsgstr \"无法将路径添加到 Windows Defender 白名单。\"\n\nmsgid \"Failed to translate, please update translation data.\"\nmsgstr \"翻译失败，请更新翻译数据。\"\n\nmsgid \"Searching...\"\nmsgstr \"搜索中...\"\n\nmsgid \"Translating search results...\"\nmsgstr \"翻译搜索结果中...\"\n\nmsgid \"No search results found.\"\nmsgstr \"未找到相关修改器。\"\n\nmsgid \"Translating keywords...\"\nmsgstr \"翻译关键词中...\"\n\nmsgid \"Search failed, please update trainer search data.\"\nmsgstr \"搜索失败，请更新修改器检索数据。\"\n\nmsgid \"Search from FLiNG success!\"\nmsgstr \"风灵月影搜索成功！\"\n\nmsgid \"Search from XiaoXing success!\"\nmsgstr \"小幸搜索成功！\"\n\nmsgid \"Search from CT success!\"\nmsgstr \"CT 表搜索成功！\"\n\nmsgid \"Search from GCM success!\"\nmsgstr \"GCM 搜索成功！\"\n\nmsgid \"Checking for internet connection...\"\nmsgstr \"检查网络连接中...\"\n\nmsgid \"No internet connection, download failed.\"\nmsgstr \"没有网络连接，下载失败。\"\n\nmsgid \"Attention\"\nmsgstr \"警告\"\n\nmsgid \"\"\n\"This trainer requires additional setup before use. Please check the opened folder for instructions.\\n\"\n\"The instructions are always stored in the 'gcm-instructions' folder.\"\nmsgstr \"\"\n\"此修改器在使用前需要额外设置。请查看已打开的文件夹以获取说明。\\n\"\n\"相关说明始终存储在 'gcm-instructions' 文件夹中。\"\n\nmsgid \"An error occurred when moving trainer: \"\nmsgstr \"移动修改器时出错：\"\n\nmsgid \"Download success!\"\nmsgstr \"下载成功！\"\n\nmsgid \"Updating \"\nmsgstr \"正在更新 \"\n\nmsgid \"Trainer already exists, aborted download.\"\nmsgstr \"修改器已存在，已中止下载。\"\n\nmsgid \"Downloading...\"\nmsgstr \"下载中...\"\n\nmsgid \"Failed to find trainer download link.\"\nmsgstr \"获取修改器下载链接失败。\"\n\nmsgid \"Failed to find trainer version.\"\nmsgstr \"获取修改器版本失败。\"\n\nmsgid \"Internet request failed.\"\nmsgstr \"网络请求失败。\"\n\nmsgid \"An error occurred while downloading trainer: \"\nmsgstr \"下载修改器时出错：\"\n\nmsgid \"Decompressing...\"\nmsgstr \"解压中...\"\n\nmsgid \"An error occurred while extracting downloaded trainer: \"\nmsgstr \"解压下载的修改器时出错：\"\n\nmsgid \"Could not find the downloaded trainer file, please try turning your antivirus software off.\"\nmsgstr \"找不到下载的修改器，请尝试关闭杀毒软件。\"\n\nmsgid \"Removing trainer background music...\"\nmsgstr \"删除修改器背景音乐中...\"\n\nmsgid \"Patching...\"\nmsgstr \"打补丁中...\"\n\nmsgid \"Updating data from GCM\"\nmsgstr \"正在更新 GCM 数据\"\n\nmsgid \"Update from GCM failed\"\nmsgstr \"更新 GCM 数据失败\"\n\nmsgid \"Updating data from FLiNG\"\nmsgstr \"正在更新风灵月影数据\"\n\nmsgid \"Update from FLiGN failed\"\nmsgstr \"更新风灵月影数据失败\"\n\nmsgid \"Updating data from XiaoXing\"\nmsgstr \"正在更新小幸数据\"\n\nmsgid \"Update from XiaoXing failed\"\nmsgstr \"更新小幸数据失败\"\n\nmsgid \"Updating data from CT\"\nmsgstr \"正在更新 CT 表数据\"\n\nmsgid \"Update from CT failed\"\nmsgstr \"更新 CT 表数据失败\"\n\nmsgid \"Fetching trainer translations\"\nmsgstr \"正在获取修改器翻译\"\n\nmsgid \"Fetch trainer translations failed\"\nmsgstr \"获取修改器翻译失败\"\n\nmsgid \"Failed to retrieve upload authorization.\"\nmsgstr \"获取上传授权失败。\"\n\nmsgid \"Failed to retrieve upload url.\"\nmsgstr \"获取上传链接失败。\"\n\nmsgid \"\"\n\"Upload successful! Thank you for your contribution.\\n\"\n\"Your trainer will be available for download after passing a manual review.\"\nmsgstr \"\"\n\"上传成功！感谢您的贡献。\\n\"\n\"您的修改器将在通过人工审核后开放下载。\"\n\nmsgid \"Upload failed: \"\nmsgstr \"上传失败：\"\n\nmsgid \"\"\n\"Wand is currently running,\\n\"\n\"please close the application first\"\nmsgstr \"\"\n\"Wand 正在运行中，\\n\"\n\"请先关闭该应用程序\"\n\nmsgid \"Failed to patch file:\"\nmsgstr \"修补文件失败：\"\n\nmsgid \"Failed to extract file:\"\nmsgstr \"提取文件失败：\"\n\nmsgid \"Wand Pro activated\"\nmsgstr \"Wand 专业版已激活\"\n\nmsgid \"Failed to activate Wand Pro\"\nmsgstr \"Wand 专业版激活失败\"\n\nmsgid \"Wand Pro disabled\"\nmsgstr \"Wand 专业版已禁用\"\n\nmsgid \"Wand auto update disabled\"\nmsgstr \"Wand 自动更新已禁用\"\n\nmsgid \"Wand auto update enabled\"\nmsgstr \"Wand 自动更新已启用\"\n\nmsgid \"\"\n\"Failed to enable Wand auto update,\\n\"\n\"please try reinstalling Wand\"\nmsgstr \"\"\n\"无法启用 Wand 自动更新，\\n\"\n\"请尝试重新安装 Wand\"\n\nmsgid \"Failed to process Wand update file:\"\nmsgstr \"无法处理 Wand 更新文件：\"\n\nmsgid \"Deleted Wand version: \"\nmsgstr \"已删除 Wand 版本：\"\n\nmsgid \"Failed to delete Wand version: \"\nmsgstr \"删除 Wand 版本失败：\"\n\nmsgid \"Checking for trainer updates\"\nmsgstr \"正在检查修改器更新\"\n\nmsgid \"Check trainer updates failed\"\nmsgstr \"检查修改器更新失败\"\n\nmsgid \"Announcement\"\nmsgstr \"公告\"\n\nmsgid \"Warning\"\nmsgstr \"警告\"\n\nmsgid \"\"\n\"This software is open source and provided free of charge.\\n\"\n\"Resale is strictly prohibited, and developers reserve the right to pursue legal responsibility against the violators.\\n\"\n\"If you have paid for this software unofficially, please report the seller immediately.\\n\"\n\"Below are official links.\"\nmsgstr \"\"\n\"本软件为开源软件且完全免费。\\n\"\n\"严禁倒卖，软件开发者保留追究违反者法律责任的权利。\\n\"\n\"如果您是通过非官方购买方式获得本软件，请立即举报卖家。\\n\"\n\"以下为官方链接。\"\n\nmsgid \"Official Website:\"\nmsgstr \"官方网站:\"\n\nmsgid \"Bilibili:\"\nmsgstr \"B站作者主页:\"\n\nmsgid \"Theme:\"\nmsgstr \"主题：\"\n\nmsgid \"Language:\"\nmsgstr \"语言：\"\n\nmsgid \"Launch app on system startup\"\nmsgstr \"开机自启\"\n\nmsgid \"Check for software update at startup\"\nmsgstr \"软件启动时检查更新\"\n\nmsgid \"Use safe launch path (may fix trainers unable to launch)\"\nmsgstr \"使用安全启动路径（可能修复修改器无法启动的问题）\"\n\nmsgid \"Always show search results in English\"\nmsgstr \"始终以英文显示搜索结果\"\n\nmsgid \"Sort search results by origin\"\nmsgstr \"按修改器来源排序\"\n\nmsgid \"Update trainer translations automatically\"\nmsgstr \"自动更新修改器翻译数据\"\n\nmsgid \"Apply\"\nmsgstr \"应用\"\n\nmsgid \"Do you want to restart the application now to apply theme or language settings?\"\nmsgstr \"是否立即重启程序以应用主题或语言设置？\"\n\nmsgid \"Settings saved.\"\nmsgstr \"设置已保存。\"\n\nmsgid \"Current version: \"\nmsgstr \"当前版本：\"\n\nmsgid \"Newest version: \"\nmsgstr \"最新版本：\"\n\nmsgid \"Loading...\"\nmsgstr \"加载中...\"\n\nmsgid \"Update Now\"\nmsgstr \"立即更新\"\n\nmsgid \"Failed to load\"\nmsgstr \"加载失败\"\n\nmsgid \"Contact Info (Optional):\"\nmsgstr \"联系方式（选填）：\"\n\nmsgid \"Email\"\nmsgstr \"电子邮箱\"\n\nmsgid \"If you provide your Game-Zone Labs account email and your trainer is approved, a badge will be added to your account\"\nmsgstr \"如果您填写 Game-Zone 实验室 账号邮箱，且上传的修改器通过审核，您的账号将获得一枚徽章\"\n\nmsgid \"Trainer Name:\"\nmsgstr \"修改器名称：\"\n\nmsgid \"What game does it work for\"\nmsgstr \"适用于哪款游戏\"\n\nmsgid \"Trainer Source (Optional):\"\nmsgstr \"修改器来源（选填）：\"\n\nmsgid \"Original URL or author\"\nmsgstr \"原始链接或作者\"\n\nmsgid \"If you made the trainer, please provide your author name\"\nmsgstr \"如果修改器为自制，请提供你的作者名\"\n\nmsgid \"Trainer File:\"\nmsgstr \"修改器文件：\"\n\nmsgid \"Select a trainer file\"\nmsgstr \"选择修改器文件\"\n\nmsgid \"If the trainer consists of multiple files, please compress them into a single archive (zip/rar/7z) before uploading\"\nmsgstr \"如果修改器包含多个文件，请在上传前将其压缩为单个压缩包 (zip/rar/7z)\"\n\nmsgid \"Additional Notes:\"\nmsgstr \"备注：\"\n\nmsgid \"Anything else to add...\"\nmsgstr \"其他补充说明...\"\n\nmsgid \"Please make sure the trainer you are about to upload is tested to be safe and functional.\"\nmsgstr \"请确保您上传的修改器已经过测试，安全且可正常使用。\"\n\nmsgid \"For more info about trainer uploading, please join the QQ group to discuss: 186859946.\"\nmsgstr \"如需了解更多关于上传修改器的信息，请加入QQ群讨论：186859946。\"\n\nmsgid \"Upload\"\nmsgstr \"上传\"\n\nmsgid \"All Files (*)\"\nmsgstr \"所有文件 (*)\"\n\nmsgid \"Please select a valid file.\"\nmsgstr \"请选择一个有效的文件。\"\n\nmsgid \"Please provide a trainer name.\"\nmsgstr \"请提供修改器名称。\"\n\nmsgid \"Close\"\nmsgstr \"关闭\"\n\nmsgid \"FLiNG\"\nmsgstr \"风灵月影\"\n\nmsgid \"XiaoXing\"\nmsgstr \"小幸\"\n\nmsgid \"Enable search for GCM and Other trainers\"\nmsgstr \"允许搜索 GCM 及其他修改器\"\n\nmsgid \"Update GCM data automatically\"\nmsgstr \"自动更新 GCM 数据\"\n\nmsgid \"Update GCM and Other trainers automatically\"\nmsgstr \"自动更新 GCM 及其他修改器\"\n\nmsgid \"Official Website: \"\nmsgstr \"官方网站：\"\n\nmsgid \"Download Server:\"\nmsgstr \"下载服务器：\"\n\nmsgid \"Remove trainer background music\"\nmsgstr \"删除修改器背景音乐\"\n\nmsgid \"Update FLiNG data automatically\"\nmsgstr \"自动更新风灵月影数据\"\n\nmsgid \"Update FLiNG trainers automatically\"\nmsgstr \"自动更新风灵月影修改器\"\n\nmsgid \"Enable search for XiaoXing trainers\"\nmsgstr \"允许搜索小幸修改器\"\n\nmsgid \"Unlock all functions\"\nmsgstr \"解锁所有功能\"\n\nmsgid \"Update XiaoXing data automatically\"\nmsgstr \"自动更新小幸数据\"\n\nmsgid \"Update XiaoXing trainers automatically\"\nmsgstr \"自动更新小幸修改器\"\n\nmsgid \"Cheat Table Sources: \"\nmsgstr \"CT 表来源：\"\n\nmsgid \"Cheat Engine installation path:\"\nmsgstr \"Cheat Engine 安装路径：\"\n\nmsgid \"Reset to default\"\nmsgstr \"恢复默认\"\n\nmsgid \"Add Simplified Chinese\"\nmsgstr \"添加简体中文\"\n\nmsgid \"Enable Search for Cheat Tables\"\nmsgstr \"允许搜索 CT 表\"\n\nmsgid \"Update Cheat Table data automatically\"\nmsgstr \"自动更新 CT 表数据\"\n\nmsgid \"Update Cheat Tables automatically\"\nmsgstr \"自动更新 CT 表\"\n\nmsgid \"Wand installation path:\"\nmsgstr \"Wand 安装路径：\"\n\nmsgid \"Installed Wand Versions:\"\nmsgstr \"已安装的 Wand 版本：\"\n\nmsgid \"Patch Method:\"\nmsgstr \"激活方式：\"\n\nmsgid \"Activate Wand Pro\"\nmsgstr \"激活 Wand 专业版\"\n\nmsgid \"Disable Wand Auto Update\"\nmsgstr \"禁用 Wand 自动更新\"\n\nmsgid \"Delete All Other Wand Versions\"\nmsgstr \"删除所有其他 Wand 版本\"\n\nmsgid \"Cheat Evolution installation path:\"\nmsgstr \"Cheat Evolution 安装路径：\"\n\nmsgid \"Activate PRO\"\nmsgstr \"激活 PRO\"\n\nmsgid \"Please select Wand installation path\"\nmsgstr \"请选择 Wand 安装路径\"\n\nmsgid \"Please select Cheat Engine installation path\"\nmsgstr \"请选择 Cheat Engine 安装路径\"\n\nmsgid \"Cheat Engine is installed\"\nmsgstr \"已安装 Cheat Engine\"\n\nmsgid \"Wand not installed\"\nmsgstr \"未安装 Wand\"\n\nmsgid \"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"若要添加翻译文件，需要管理员权限。请留意将弹出的用户帐户控制（UAC）提示。\"\n\nmsgid \"Successfully added translation files\"\nmsgstr \"成功添加翻译文件\"\n\nmsgid \"Failed to add translation files\"\nmsgstr \"添加翻译文件失败\"\n\nmsgid \"Please select Cheat Evolution installation path\"\nmsgstr \"请选择 Cheat Evolution 安装路径\"\n\nmsgid \"Please launch Cheat Evolution using CheatEvolution_patched.exe\"\nmsgstr \"请使用 CheatEvolution_patched.exe 运行 Cheat Evolution\"\n\nmsgid \"Invalid Cheat Evolution installation path\"\nmsgstr \"无效的 Cheat Evolution 安装路径\"\n\nmsgid \"Cheat Evolution is installed and ready to patch\"\nmsgstr \"Cheat Evolution 已安装并准备好打补丁\"\n\nmsgid \"Patch successful\"\nmsgstr \"打补丁成功\"\n\nmsgid \"Failed to patch\"\nmsgstr \"打补丁失败\"\n"
  },
  {
    "path": "src/locale/zh_TW/LC_MESSAGES/Game Cheats Manager.po",
    "content": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Game Cheats Manager\\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: \\n\"\n\"Language: zh_TW\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 3.4.4\\n\"\n\nmsgid \"Dark\"\nmsgstr \"深色\"\n\nmsgid \"Light\"\nmsgstr \"淺色\"\n\nmsgid \"Official Site\"\nmsgstr \"官方網站\"\n\nmsgid \"GCM Server\"\nmsgstr \"GCM 伺服器\"\n\nmsgid \"Yearly Subscription\"\nmsgstr \"年費訂閱\"\n\nmsgid \"Gifted Subscription\"\nmsgstr \"禮物訂閱\"\n\nmsgid \"Search for installed trainers\"\nmsgstr \"搜尋已安裝修改器\"\n\nmsgid \"Enter keywords to download trainers\"\nmsgstr \"輸入關鍵詞下載修改器\"\n\nmsgid \"Options\"\nmsgstr \"選項\"\n\nmsgid \"Settings\"\nmsgstr \"設定\"\n\nmsgid \"Import Trainers\"\nmsgstr \"匯入修改器\"\n\nmsgid \"Open Trainer Download Path\"\nmsgstr \"打開修改器下載路徑\"\n\nmsgid \"Add Paths to Whitelist\"\nmsgstr \"添加路徑至白名單\"\n\nmsgid \"About\"\nmsgstr \"關於\"\n\nmsgid \"Data Update\"\nmsgstr \"資料更新\"\n\nmsgid \"Update Translation Data\"\nmsgstr \"更新翻譯資料\"\n\nmsgid \"Update Trainer Search Data\"\nmsgstr \"更新修改器檢索資料\"\n\nmsgid \"Update Trainers\"\nmsgstr \"更新修改器\"\n\nmsgid \"Trainer Management\"\nmsgstr \"修改器管理\"\n\nmsgid \"Upload Trainer\"\nmsgstr \"上傳修改器\"\n\nmsgid \"Browse All Trainers\"\nmsgstr \"查看所有修改器\"\n\nmsgid \"Launch\"\nmsgstr \"啟動\"\n\nmsgid \"Delete\"\nmsgstr \"刪除\"\n\nmsgid \"Trainer download path:\"\nmsgstr \"修改器下載路徑：\"\n\nmsgid \"Failure\"\nmsgstr \"失敗\"\n\nmsgid \"Failed to update application.\"\nmsgstr \"軟體更新失敗。\"\n\nmsgid \"Update Available\"\nmsgstr \"可用更新\"\n\nmsgid \"New version found: {old_version} ➜ {new_version}\"\nmsgstr \"發現新版本：{old_version} ➜ {new_version}\"\n\nmsgid \"Would you like to update now?\"\nmsgstr \"是否立即更新？\"\n\nmsgid \"Update Check Failed\"\nmsgstr \"檢查更新失敗\"\n\nmsgid \"Failed to check for software update. You can navigate to `Options` ➜ `About` to check for updates manually.\"\nmsgstr \"無法檢查軟體更新，請移至 `選項` ➜ `關於` 以手動檢查更新。\"\n\nmsgid \"Cheat Engine Required\"\nmsgstr \"需要安裝 Cheat Engine\"\n\nmsgid \"Cheat Engine may not be installed on your system.\"\nmsgstr \"您的系統上可能尚未安裝 Cheat Engine。\"\n\nmsgid \".ct/.cetrainer files require Cheat Engine to run.\"\nmsgstr \".ct 與 .cetrainer 檔案需要依賴 Cheat Engine 才能執行。\"\n\nmsgid \"Please download and install Cheat Engine, then make sure to open the file with Cheat Engine.\"\nmsgstr \"請下載並安裝 Cheat Engine，然後請確保使用 Cheat Engine 開啟該檔案。\"\n\nmsgid \"Note: The official Cheat Engine installer contains promotional software bundles. Make sure to skip them during installation.\"\nmsgstr \"注意：Cheat Engine 官方安裝程式內包含捆綁的推廣軟體。在安裝過程中請注意跳過/拒絕這些捆綁內容。\"\n\nmsgid \"Download from:\"\nmsgstr \"下載連結：\"\n\nmsgid \"Don't show again\"\nmsgstr \"不再顯示\"\n\nmsgid \"Delete trainer\"\nmsgstr \"刪除修改器\"\n\nmsgid \"Are you sure you want to delete \"\nmsgstr \"確定要刪除 \"\n\nmsgid \"Confirm\"\nmsgstr \"確認\"\n\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgid \"Error\"\nmsgstr \"錯誤\"\n\nmsgid \"Trainer is currently in use, please close any programs using the file and try again.\"\nmsgstr \"修改器目前正在使用中，請關閉使用該檔案的所有程式，然後重試。\"\n\nmsgid \"Failed to delete {trainer_name}:\"\nmsgstr \"刪除 {trainer_name} 失敗：\"\n\nmsgid \"Change trainer download path\"\nmsgstr \"更改修改器下載路徑\"\n\nmsgid \"Please choose a new path.\"\nmsgstr \"請選擇一個新路徑。\"\n\nmsgid \"Failed to change trainer download path.\"\nmsgstr \"更改修改器下載路徑失敗。\"\n\nmsgid \"Migrating existing trainers...\"\nmsgstr \"正在遷移現有修改器...\"\n\nmsgid \"No path selected.\"\nmsgstr \"未選擇路徑。\"\n\nmsgid \"Error migrating trainers: \"\nmsgstr \"遷移修改器時出錯：\"\n\nmsgid \"Migration complete!\"\nmsgstr \"遷移完成！\"\n\nmsgid \"Select trainers you want to import\"\nmsgstr \"選擇要匯入的修改器\"\n\nmsgid \"Failed to import trainer: \"\nmsgstr \"匯入修改器失敗：\"\n\nmsgid \"Delete original trainers\"\nmsgstr \"刪除原始修改器\"\n\nmsgid \"Do you want to delete the original trainer files?\"\nmsgstr \"是否要刪除原始修改器檔？\"\n\nmsgid \"Yes\"\nmsgstr \"是\"\n\nmsgid \"No\"\nmsgstr \"否\"\n\nmsgid \"Failed to delete original trainer: \"\nmsgstr \"無法刪除原始修改器：\"\n\nmsgid \"Administrator Access Required\"\nmsgstr \"需要管理員訪問許可權\"\n\nmsgid \"To proceed with adding the trainer download paths to the Windows Defender whitelist, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"若要將修改器下載路徑添加到 Windows Defender 白名單中，需要管理員權限。請留意將彈出的使用者帳戶控制（UAC）提示。\"\n\nmsgid \"Would you like to continue?\"\nmsgstr \"是否要繼續？\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Successfully added paths to Windows Defender whitelist.\"\nmsgstr \"已成功將路徑添加到 Windows Defender 白名單。\"\n\nmsgid \"Failed to add paths to Windows Defender whitelist.\"\nmsgstr \"無法將路徑添加到 Windows Defender 白名單。\"\n\nmsgid \"Failed to translate, please update translation data.\"\nmsgstr \"翻譯失敗，請更新翻譯數據。\"\n\nmsgid \"Searching...\"\nmsgstr \"搜尋中...\"\n\nmsgid \"Translating search results...\"\nmsgstr \"正在翻譯搜尋結果...\"\n\nmsgid \"No search results found.\"\nmsgstr \"未找到相關修改器。\"\n\nmsgid \"Translating keywords...\"\nmsgstr \"翻譯關鍵字...\"\n\nmsgid \"Search failed, please update trainer search data.\"\nmsgstr \"搜索失敗，請更新修改器檢索數據。\"\n\nmsgid \"Search from FLiNG success!\"\nmsgstr \"風靈月影搜尋成功！\"\n\nmsgid \"Search from XiaoXing success!\"\nmsgstr \"小幸搜尋成功！\"\n\nmsgid \"Search from CT success!\"\nmsgstr \"CT 表搜索成功！\"\n\nmsgid \"Search from GCM success!\"\nmsgstr \"GCM 搜尋成功！\"\n\nmsgid \"Checking for internet connection...\"\nmsgstr \"正在檢查網路連接...\"\n\nmsgid \"No internet connection, download failed.\"\nmsgstr \"沒有網路連接，下載失敗。\"\n\nmsgid \"Attention\"\nmsgstr \"警告\"\n\nmsgid \"\"\n\"This trainer requires additional setup before use. Please check the opened folder for instructions.\\n\"\n\"The instructions are always stored in the 'gcm-instructions' folder.\"\nmsgstr \"\"\n\"此修改器在使用前需要額外設定。請查看已開啟的資料夾以獲取說明。\\n\"\n\"相關說明始終存儲在 'gcm-instructions' 資料夾中。\"\n\nmsgid \"An error occurred when moving trainer: \"\nmsgstr \"移動修改器時出錯：\"\n\nmsgid \"Download success!\"\nmsgstr \"下載成功！\"\n\nmsgid \"Updating \"\nmsgstr \"正在更新\"\n\nmsgid \"Trainer already exists, aborted download.\"\nmsgstr \"修改器已存在，已中止下載。\"\n\nmsgid \"Downloading...\"\nmsgstr \"下載中...\"\n\nmsgid \"Failed to find trainer download link.\"\nmsgstr \"獲取修改器下載連結失敗。\"\n\nmsgid \"Failed to find trainer version.\"\nmsgstr \"獲取修改器版本失敗。\"\n\nmsgid \"Internet request failed.\"\nmsgstr \"網路請求失敗。\"\n\nmsgid \"An error occurred while downloading trainer: \"\nmsgstr \"下載修改器時出錯：\"\n\nmsgid \"Decompressing...\"\nmsgstr \"正在解壓...\"\n\nmsgid \"An error occurred while extracting downloaded trainer: \"\nmsgstr \"解壓下載修改器時出錯：\"\n\nmsgid \"Could not find the downloaded trainer file, please try turning your antivirus software off.\"\nmsgstr \"找不到下載的修改器，請嘗試關閉防毒軟體。\"\n\nmsgid \"Removing trainer background music...\"\nmsgstr \"刪除修改器背景音樂...\"\n\nmsgid \"Patching...\"\nmsgstr \"打補丁中...\"\n\nmsgid \"Updating data from GCM\"\nmsgstr \"正在更新 GCM 資料\"\n\nmsgid \"Update from GCM failed\"\nmsgstr \"更新 GCM 資料失敗\"\n\nmsgid \"Updating data from FLiNG\"\nmsgstr \"正在更新風靈月影資料\"\n\nmsgid \"Update from FLiGN failed\"\nmsgstr \"更新風靈月影資料失敗\"\n\nmsgid \"Updating data from XiaoXing\"\nmsgstr \"正在更新小幸資料\"\n\nmsgid \"Update from XiaoXing failed\"\nmsgstr \"更新小幸資料失敗\"\n\nmsgid \"Updating data from CT\"\nmsgstr \"正在更新 CT 表數據\"\n\nmsgid \"Update from CT failed\"\nmsgstr \"更新 CT 表數據失敗\"\n\nmsgid \"Fetching trainer translations\"\nmsgstr \"正在獲取修改器翻譯\"\n\nmsgid \"Fetch trainer translations failed\"\nmsgstr \"獲取修改器翻譯失敗\"\n\nmsgid \"Failed to retrieve upload authorization.\"\nmsgstr \"獲取上傳授權失敗。\"\n\nmsgid \"Failed to retrieve upload url.\"\nmsgstr \"獲取上傳連結失敗。\"\n\nmsgid \"\"\n\"Upload successful! Thank you for your contribution.\\n\"\n\"Your trainer will be available for download after passing a manual review.\"\nmsgstr \"\"\n\"上傳成功！感謝您的貢獻。\\n\"\n\"您的修改器將在通過人工審核後開放下載。\"\n\nmsgid \"Upload failed: \"\nmsgstr \"上傳失敗：\"\n\nmsgid \"\"\n\"Wand is currently running,\\n\"\n\"please close the application first\"\nmsgstr \"\"\n\"Wand 正在執行中，\\n\"\n\"請先關閉該應用程式\"\n\nmsgid \"Failed to patch file:\"\nmsgstr \"修補文件失敗：\"\n\nmsgid \"Failed to extract file:\"\nmsgstr \"提取文件失敗：\"\n\nmsgid \"Wand Pro activated\"\nmsgstr \"Wand 專業版已啟用\"\n\nmsgid \"Failed to activate Wand Pro\"\nmsgstr \"Wand 專業版啟用失敗\"\n\nmsgid \"Wand Pro disabled\"\nmsgstr \"Wand 專業版已停用\"\n\nmsgid \"Wand auto update disabled\"\nmsgstr \"Wand 自動更新已停用\"\n\nmsgid \"Wand auto update enabled\"\nmsgstr \"Wand 自動更新已啟用\"\n\nmsgid \"\"\n\"Failed to enable Wand auto update,\\n\"\n\"please try reinstalling Wand\"\nmsgstr \"\"\n\"無法啟用 Wand 自動更新，\\n\"\n\"請嘗試重新安裝 Wand\"\n\nmsgid \"Failed to process Wand update file:\"\nmsgstr \"無法處理 Wand 更新文件：\"\n\nmsgid \"Deleted Wand version: \"\nmsgstr \"已刪除 Wand 版本：\"\n\nmsgid \"Failed to delete Wand version: \"\nmsgstr \"刪除 Wand 版本失敗：\"\n\nmsgid \"Checking for trainer updates\"\nmsgstr \"正在檢查修改器更新\"\n\nmsgid \"Check trainer updates failed\"\nmsgstr \"檢查修改器更新失敗\"\n\nmsgid \"Announcement\"\nmsgstr \"公告\"\n\nmsgid \"Warning\"\nmsgstr \"警告\"\n\nmsgid \"\"\n\"This software is open source and provided free of charge.\\n\"\n\"Resale is strictly prohibited, and developers reserve the right to pursue legal responsibility against the violators.\\n\"\n\"If you have paid for this software unofficially, please report the seller immediately.\\n\"\n\"Below are official links.\"\nmsgstr \"\"\n\"本軟體為開源軟體且完全免費。\\n\"\n\"嚴禁倒賣，軟體開發者保留追究違反者法律責任的權利。\\n\"\n\"如果您是透過非官方購買方式獲得本軟體，請立即檢舉賣家。\\n\"\n\"以下為官方連結。\"\n\nmsgid \"Official Website:\"\nmsgstr \"官方網站:\"\n\nmsgid \"Bilibili:\"\nmsgstr \"B站作者首頁:\"\n\nmsgid \"Theme:\"\nmsgstr \"外觀:\"\n\nmsgid \"Language:\"\nmsgstr \"語言：\"\n\nmsgid \"Launch app on system startup\"\nmsgstr \"開機自啟\"\n\nmsgid \"Check for software update at startup\"\nmsgstr \"軟體啟動時檢查更新\"\n\nmsgid \"Use safe launch path (may fix trainers unable to launch)\"\nmsgstr \"使用安全啟動路徑（可能修復修改器無法啟動的問題）\"\n\nmsgid \"Always show search results in English\"\nmsgstr \"始終以英文顯示搜尋結果\"\n\nmsgid \"Sort search results by origin\"\nmsgstr \"按修改器來源排序\"\n\nmsgid \"Update trainer translations automatically\"\nmsgstr \"自動更新修改器翻譯資料\"\n\nmsgid \"Apply\"\nmsgstr \"應用\"\n\nmsgid \"Do you want to restart the application now to apply theme or language settings?\"\nmsgstr \"是否立即重啟程式以應用主題或語言設定？\"\n\nmsgid \"Settings saved.\"\nmsgstr \"設定已儲存。\"\n\nmsgid \"Current version: \"\nmsgstr \"目前版本：\"\n\nmsgid \"Newest version: \"\nmsgstr \"最新版本：\"\n\nmsgid \"Loading...\"\nmsgstr \"載入中...\"\n\nmsgid \"Update Now\"\nmsgstr \"立即更新\"\n\nmsgid \"Failed to load\"\nmsgstr \"載入失敗\"\n\nmsgid \"Contact Info (Optional):\"\nmsgstr \"聯絡方式（選填）：\"\n\nmsgid \"Email\"\nmsgstr \"電子郵箱\"\n\nmsgid \"If you provide your Game-Zone Labs account email and your trainer is approved, a badge will be added to your account\"\nmsgstr \"如果您填寫 Game-Zone Labs 帳號郵箱，且上傳的修改器通過審核，您的帳號將獲得一枚徽章\"\n\nmsgid \"Trainer Name:\"\nmsgstr \"修改器名稱：\"\n\nmsgid \"What game does it work for\"\nmsgstr \"適用於哪款遊戲\"\n\nmsgid \"Trainer Source (Optional):\"\nmsgstr \"修改器來源（選填）：\"\n\nmsgid \"Original URL or author\"\nmsgstr \"原始連結或作者\"\n\nmsgid \"If you made the trainer, please provide your author name\"\nmsgstr \"如果修改器為自製，請提供你的作者名\"\n\nmsgid \"Trainer File:\"\nmsgstr \"修改器檔案：\"\n\nmsgid \"Select a trainer file\"\nmsgstr \"選擇修改器檔案\"\n\nmsgid \"If the trainer consists of multiple files, please compress them into a single archive (zip/rar/7z) before uploading\"\nmsgstr \"如果修改器包含多個檔案，請在上傳前將其壓縮為單個壓縮檔 (zip/rar/7z)\"\n\nmsgid \"Additional Notes:\"\nmsgstr \"備註：\"\n\nmsgid \"Anything else to add...\"\nmsgstr \"其他補充說明...\"\n\nmsgid \"Please make sure the trainer you are about to upload is tested to be safe and functional.\"\nmsgstr \"請確保您上傳的修改器已經過測試，安全且可正常使用。\"\n\nmsgid \"For more info about trainer uploading, please join the QQ group to discuss: 186859946.\"\nmsgstr \"如需了解更多關於上傳修改器的資訊，請加入QQ群討論：186859946。\"\n\nmsgid \"Upload\"\nmsgstr \"上傳\"\n\nmsgid \"All Files (*)\"\nmsgstr \"所有檔案 (*)\"\n\nmsgid \"Please select a valid file.\"\nmsgstr \"請選擇一個有效的檔案。\"\n\nmsgid \"Please provide a trainer name.\"\nmsgstr \"請提供修改器名稱。\"\n\nmsgid \"Close\"\nmsgstr \"關閉\"\n\nmsgid \"FLiNG\"\nmsgstr \"風靈月影\"\n\nmsgid \"XiaoXing\"\nmsgstr \"小幸\"\n\nmsgid \"Enable search for GCM and Other trainers\"\nmsgstr \"允許搜尋 GCM 及其他修改器\"\n\nmsgid \"Update GCM data automatically\"\nmsgstr \"自動更新 GCM 資料\"\n\nmsgid \"Update GCM and Other trainers automatically\"\nmsgstr \"自動更新 GCM 及其他修改器\"\n\nmsgid \"Official Website: \"\nmsgstr \"官方網站：\"\n\nmsgid \"Download Server:\"\nmsgstr \"下載伺服器：\"\n\nmsgid \"Remove trainer background music\"\nmsgstr \"刪除修改器背景音樂\"\n\nmsgid \"Update FLiNG data automatically\"\nmsgstr \"自動更新風靈月影資料\"\n\nmsgid \"Update FLiNG trainers automatically\"\nmsgstr \"自動更新風靈月影修改器\"\n\nmsgid \"Enable search for XiaoXing trainers\"\nmsgstr \"允許搜尋小幸修改器\"\n\nmsgid \"Unlock all functions\"\nmsgstr \"解鎖所有功能\"\n\nmsgid \"Update XiaoXing data automatically\"\nmsgstr \"自動更新小幸資料\"\n\nmsgid \"Update XiaoXing trainers automatically\"\nmsgstr \"自動更新小幸修改器\"\n\nmsgid \"Cheat Table Sources: \"\nmsgstr \"CT 表來源：\"\n\nmsgid \"Cheat Engine installation path:\"\nmsgstr \"Cheat Engine 安裝路徑：\"\n\nmsgid \"Reset to default\"\nmsgstr \"復原預設\"\n\nmsgid \"Add Simplified Chinese\"\nmsgstr \"添加簡體中文\"\n\nmsgid \"Enable Search for Cheat Tables\"\nmsgstr \"允許搜索 CT 表\"\n\nmsgid \"Update Cheat Table data automatically\"\nmsgstr \"自動更新 CT 表數據\"\n\nmsgid \"Update Cheat Tables automatically\"\nmsgstr \"自動更新 CT 表\"\n\nmsgid \"Wand installation path:\"\nmsgstr \"Wand 安裝路徑：\"\n\nmsgid \"Installed Wand Versions:\"\nmsgstr \"已安裝的 Wand 版本：\"\n\nmsgid \"Patch Method:\"\nmsgstr \"激活方式：\"\n\nmsgid \"Activate Wand Pro\"\nmsgstr \"啟用 Wand 專業版\"\n\nmsgid \"Disable Wand Auto Update\"\nmsgstr \"停用 Wand 自動更新\"\n\nmsgid \"Delete All Other Wand Versions\"\nmsgstr \"刪除所有其他 Wand 版本\"\n\nmsgid \"Cheat Evolution installation path:\"\nmsgstr \"Cheat Evolution 安裝路徑：\"\n\nmsgid \"Activate PRO\"\nmsgstr \"啟用 PRO\"\n\nmsgid \"Please select Wand installation path\"\nmsgstr \"請選擇 Wand 安裝路徑\"\n\nmsgid \"Please select Cheat Engine installation path\"\nmsgstr \"請選擇 Cheat Engine 安裝路徑\"\n\nmsgid \"Cheat Engine is installed\"\nmsgstr \"已安裝 Cheat Engine\"\n\nmsgid \"Wand not installed\"\nmsgstr \"未安裝 Wand\"\n\nmsgid \"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\"\nmsgstr \"若要添加翻譯文件，需要管理員權限。請留意將彈出的使用者帳戶控制（UAC）提示。\"\n\nmsgid \"Successfully added translation files\"\nmsgstr \"成功添加翻譯文件\"\n\nmsgid \"Failed to add translation files\"\nmsgstr \"添加翻譯文件失敗\"\n\nmsgid \"Please select Cheat Evolution installation path\"\nmsgstr \"請選擇 Cheat Evolution 安裝路徑\"\n\nmsgid \"Please launch Cheat Evolution using CheatEvolution_patched.exe\"\nmsgstr \"請使用 CheatEvolution_patched.exe 運行 Cheat Evolution\"\n\nmsgid \"Invalid Cheat Evolution installation path\"\nmsgstr \"無效的 Cheat Evolution 安裝路徑\"\n\nmsgid \"Cheat Evolution is installed and ready to patch\"\nmsgstr \"Cheat Evolution 已安裝並準備好打補丁\"\n\nmsgid \"Patch successful\"\nmsgstr \"打補丁成功\"\n\nmsgid \"Failed to patch\"\nmsgstr \"打補丁失敗\"\n"
  },
  {
    "path": "src/scripts/config.py",
    "content": "import ctypes\nimport gettext\nimport json\nimport locale\nimport os\nimport re\nimport sys\nimport tempfile\n\nimport pinyin\nimport polib\nimport zhon.cedict as chinese_characters\n\nfrom secret_config import *\n\n\n# All resources in development mode are relative to `src` folder\ndef resource_path(relative_path):\n    # Pyinstaller\n    if hasattr(sys, \"_MEIPASS\"):\n        full_path = os.path.join(sys._MEIPASS, relative_path)\n    # Others like Nuitka\n    elif sys.argv[0].endswith('.exe'):\n        full_path = os.path.join(os.path.dirname(sys.executable), relative_path)\n    # Development\n    else:\n        if relative_path == \"Updater.exe\":\n            full_path = os.path.join(os.path.dirname(__file__), '../../../Updater/target/release', relative_path)\n        else:\n            full_path = os.path.join(os.path.dirname(__file__), '..', relative_path)\n\n    if not os.path.exists(full_path):\n        formatted_message = (\n            f\"Couldn't find {os.path.basename(full_path)}. Please try reinstalling the application.\\n\"\n            f\"无法找到 {os.path.basename(full_path)}. 请尝试重新安装应用程序。\"\n        )\n        ctypes.windll.user32.MessageBoxW(0, formatted_message, \"Failure\", 0x10)\n        sys.exit(1)\n\n    return full_path\n\n\ndef apply_settings(settings):\n    with open(SETTINGS_FILE, \"w\", encoding=\"utf-8\") as f:\n        json.dump(settings, f, indent=4)\n\n\ndef load_settings():\n    locale.setlocale(locale.LC_ALL, '')\n    system_locale = locale.getlocale()[0]\n    # print(f\"System locale: {system_locale}\")\n    locale_mapping = {\n        \"English_United States\": \"en_US\",\n        \"Chinese (Simplified)_China\": \"zh_CN\",\n        \"Chinese (Simplified)_Hong Kong SAR\": \"zh_CN\",\n        \"Chinese (Simplified)_Macao SAR\": \"zh_CN\",\n        \"Chinese (Simplified)_Singapore\": \"zh_CN\",\n        \"Chinese (Traditional)_Hong Kong SAR\": \"zh_TW\",\n        \"Chinese (Traditional)_Macao SAR\": \"zh_TW\",\n        \"Chinese (Traditional)_Taiwan\": \"zh_TW\",\n        \"German_Austria\": \"de_DE\",\n        \"German_Belgium\": \"de_DE\",\n        \"de_DE\": \"de_DE\",\n        \"German_Italy\": \"de_DE\",\n        \"German_Liechtenstein\": \"de_DE\",\n        \"German_Luxembourg\": \"de_DE\",\n        \"German_Switzerland\": \"de_DE\"\n    }\n    app_locale = locale_mapping.get(system_locale, 'en_US')\n\n    default_settings = {\n        \"downloadPath\": os.path.join(os.environ[\"APPDATA\"], \"GCM Trainers\"),\n        \"language\": app_locale,\n        \"theme\": \"dark\",\n        \"safePath\": True,\n        \"enSearchResults\": False,\n        \"sortByOrigin\": True,\n        \"checkAppUpdate\": True,\n        \"launchAppOnStartup\": False,\n        \"showWarning\": True,\n        \"showCEPrompt\": True,\n        \"autoUpdateTranslations\": True,\n        \"lastSeenAnnouncementId\": \"\",\n\n        # Trainer management configs\n        \"enableGCM\": True,\n        \"autoUpdateGCMData\": True,\n        \"autoUpdateGCMTrainers\": True,\n        \"flingDownloadServer\": \"gcm\",\n        \"removeFlingBgMusic\": True,\n        \"autoUpdateFlingData\": True,\n        \"autoUpdateFlingTrainers\": True,\n        \"enableXiaoXing\": True,\n        \"unlockXiaoXing\": False,\n        \"autoUpdateXiaoXingData\": True,\n        \"autoUpdateXiaoXingTrainers\": True,\n        \"weModPath\": wemod_install_path,\n        \"cePath\": ce_install_path,\n        \"enableCT\": True,\n        \"autoUpdateCTData\": True,\n        \"autoUpdateCTTrainers\": True,\n        \"cevoPath\": \"\",\n    }\n\n    try:\n        with open(SETTINGS_FILE, \"r\", encoding=\"utf-8\") as f:\n            settings = json.load(f)\n    except Exception as e:\n        print(\"Error loading settings json\" + str(e))\n        settings = default_settings\n\n    for key, value in default_settings.items():\n        settings.setdefault(key, value)\n\n    with open(SETTINGS_FILE, \"w\", encoding=\"utf-8\") as f:\n        json.dump(settings, f, indent=4)\n\n    return settings\n\n\ndef get_translator():\n    if not sys.argv[0].endswith('.exe'):\n        for root, dirs, files in os.walk(resource_path(\"locale/\")):\n            for file in files:\n                if file.endswith(\".po\"):\n                    po = polib.pofile(os.path.join(root, file))\n                    po.save_as_mofile(os.path.join(root, os.path.splitext(file)[0] + \".mo\"))\n\n    lang = settings[\"language\"]\n    gettext.bindtextdomain(\"Game Cheats Manager\", resource_path(\"locale/\"))\n    gettext.textdomain(\"Game Cheats Manager\")\n    lang = gettext.translation(\"Game Cheats Manager\", resource_path(\"locale/\"), languages=[lang])\n    lang.install()\n    return lang.gettext\n\n\ndef is_chinese(text):\n    for char in text:\n        if char in chinese_characters.all:\n            return True\n    return False\n\n\ndef sort_trainers_key(name):\n    if is_chinese(name):\n        return pinyin.get(name, format=\"strip\", delimiter=\" \")\n    return name\n\n\ndef sort_trainers_key_ignore_prefix(name):\n    prefix_regex = re.compile(r\"^\\[.*?\\]\\s*\")\n    real_name = prefix_regex.sub(\"\", name)\n\n    if is_chinese(real_name):\n        return pinyin.get(real_name, format=\"strip\", delimiter=\" \")\n    return real_name\n\n\ndef ensure_trainer_download_path_is_valid():\n    try:\n        os.makedirs(settings[\"downloadPath\"], exist_ok=True)\n    except Exception:\n        settings[\"downloadPath\"] = os.path.join(os.environ[\"APPDATA\"], \"GCM Trainers\")\n        apply_settings(settings)\n        os.makedirs(settings[\"downloadPath\"], exist_ok=True)\n\n\ndef findWeModInstallPath():\n    install_path = os.path.join(os.environ[\"LOCALAPPDATA\"], \"Wand\")\n    if os.path.exists(install_path):\n        return install_path\n    return os.path.join(os.environ[\"LOCALAPPDATA\"], \"WeMod\")\n\n\ndef findCEInstallPath():\n    base_path = r'C:\\Program Files'\n    latest_version = []\n    latest_path = \"\"\n\n    if os.path.exists(base_path):\n        for folder in os.listdir(base_path):\n            if folder.startswith(\"Cheat Engine\"):\n                match = re.search(r\"Cheat Engine (\\d+(?:\\.\\d+)*)\", folder)\n                if match:\n                    # Parse version into a list of integers (e.g., '7.5.1' -> [7, 5, 1])\n                    version = list(map(int, match.group(1).split('.')))\n                    while len(version) < 3:\n                        version.append(0)\n                    if version > latest_version:\n                        latest_version = version\n                        latest_path = os.path.join(base_path, folder)\n                else:\n                    latest_path = os.path.join(base_path, folder)\n\n    return latest_path\n\n\nsetting_path = os.path.join(os.environ[\"APPDATA\"], \"GCM Settings\")\nos.makedirs(setting_path, exist_ok=True)\n\nSETTINGS_FILE = os.path.join(setting_path, \"settings.json\")\nDATABASE_PATH = os.path.join(setting_path, \"db\")\nos.makedirs(DATABASE_PATH, exist_ok=True)\nDOWNLOAD_TEMP_DIR = os.path.join(tempfile.gettempdir(), \"GameCheatsManagerTemp\", \"download\")\nVERSION_TEMP_DIR = os.path.join(tempfile.gettempdir(), \"GameCheatsManagerTemp\", \"version\")\nWEMOD_TEMP_DIR = os.path.join(tempfile.gettempdir(), \"GameCheatsManagerTemp\", \"wemod\")\n\nwemod_install_path = findWeModInstallPath()\nce_install_path = findCEInstallPath()\n\nsettings = load_settings()\ntr = get_translator()\n\nlanguage_options = {\n    \"English (US)\": \"en_US\",\n    \"简体中文\": \"zh_CN\",\n    \"繁體中文\": \"zh_TW\",\n    \"Deutsch\": \"de_DE\"\n}\n\ntheme_options = {\n    tr(\"Dark\"): \"dark\",\n    tr(\"Light\"): \"light\"\n}\n\nserver_options = {\n    tr(\"Official Site\"): \"official\",\n    tr(\"GCM Server\"): \"gcm\"\n}\n\npatch_methods = {\n    tr(\"Yearly Subscription\"): \"yearly_sub\",\n    tr(\"Gifted Subscription\"): \"gifted_sub\"\n}\n\nfont_config = {\n    \"en_US\": resource_path(\"assets/NotoSans-Regular.ttf\"),\n    \"zh_CN\": resource_path(\"assets/NotoSansSC-Regular.ttf\"),\n    \"zh_TW\": resource_path(\"assets/NotoSansTC-Regular.ttf\"),\n    \"de_DE\": resource_path(\"assets/NotoSans-Regular.ttf\")\n}\n\nensure_trainer_download_path_is_valid()\nif settings[\"theme\"] not in theme_options.values():\n    settings[\"theme\"] = \"dark\"\n    apply_settings(settings)\nif settings[\"flingDownloadServer\"] not in server_options.values():\n    settings[\"flingDownloadServer\"] = \"official\"\n    apply_settings(settings)\n\nif settings[\"theme\"] == \"dark\":\n    dropDownArrow_path = resource_path(\"assets/dropdown-white.png\").replace(\"\\\\\", \"/\")\nelif settings[\"theme\"] == \"light\":\n    dropDownArrow_path = resource_path(\"assets/dropdown-black.png\").replace(\"\\\\\", \"/\")\ncheckMark_path = resource_path(\"assets/check-mark.png\").replace(\"\\\\\", \"/\")\nupArrow_path = resource_path(\"assets/up.png\").replace(\"\\\\\", \"/\")\ndownArrow_path = resource_path(\"assets/down.png\").replace(\"\\\\\", \"/\")\nleftArrow_path = resource_path(\"assets/left.png\").replace(\"\\\\\", \"/\")\nrightArrow_path = resource_path(\"assets/right.png\").replace(\"\\\\\", \"/\")\nresourceHacker_path = resource_path(\"dependency/ResourceHacker.exe\")\nunzip_path = resource_path(\"dependency/7z/7z.exe\")\nbinmay_path = resource_path(\"dependency/binmay.exe\")\nemptyMidi_path = resource_path(\"dependency/TrainerBGM.mid\")\nelevator_path = resource_path(\"dependency/Elevate.exe\")\nupdater_path = resource_path(\"Updater.exe\")\n"
  },
  {
    "path": "src/scripts/main.py",
    "content": "import ctypes\nfrom ctypes import wintypes\nimport hashlib\nimport os\nfrom queue import Queue\nimport shutil\nimport stat\nimport subprocess\nimport sys\nimport tempfile\nimport webbrowser\nimport winreg\n\nfrom PyQt6.QtCore import Qt, QTimer\nfrom PyQt6.QtGui import QAction, QColor, QFont, QFontDatabase, QIcon, QPainter, QPixmap\nfrom PyQt6.QtWidgets import QApplication, QFileDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QListWidgetItem, QMainWindow, QMessageBox, QProgressBar, QStatusBar, QVBoxLayout, QWidget\nfrom tendo import singleton\nfrom PyQt6.QtSvg import QSvgRenderer\nfrom PyQt6.QtSvgWidgets import QSvgWidget\n\nimport style_sheet\nfrom widgets.custom_dialogs import *\nfrom widgets.custom_widgets import *\nfrom widgets.trainer_management import *\nfrom threads.download_display_thread import *\nfrom threads.download_trainers_thread import *\nfrom threads.other_threads import *\nfrom threads.update_trainers_thread import *\n\n\nclass GameCheatsManager(QMainWindow):\n\n    def __init__(self):\n        super().__init__()\n\n        # Single instance check and basic UI setup\n        try:\n            self.single_instance_checker = singleton.SingleInstance()\n        except singleton.SingleInstanceException:\n            sys.exit(1)\n        except Exception as e:\n            print(str(e))\n\n        self.setWindowTitle(\"Game Cheats Manager\")\n        self.setWindowIcon(QIcon(resource_path(\"assets/logo.ico\")))\n        self.setMinimumSize(700, 520)\n\n        # Version and links\n        self.appVersion = \"2.5.0-beta.2\"\n        self.websiteLink = \"https://gamezonelabs.com\"\n        self.allTrainersLink = \"https://gamezonelabs.com/products/game-cheats-manager/trainers\"\n        self.githubLink = \"https://github.com/dyang886/Game-Cheats-Manager\"\n        self.bilibiliLink = \"https://space.bilibili.com/256673766\"\n\n        # Variable management\n        self.trainerSearchEntryPrompt = tr(\"Search for installed trainers\")\n        self.downloadSearchEntryPrompt = tr(\"Enter keywords to download trainers\")\n        self.trainerDownloadPath = os.path.normpath(settings[\"downloadPath\"])\n\n        self.trainers = {}  # Store installed trainers: {trainer name: trainer path}\n        self.searchable = True  # able to search online trainers or not\n        self.downloadable = False  # able to double click on download list or not\n        self.downloadQueue = Queue()\n        self.downloadProgressBar = None\n        self.downloadProgressLabel = None\n        self.currentlyDownloading = False\n        self.currentlyUpdatingTrainers = False\n        self.currentlyUpdatingGCM = False\n        self.currentlyUpdatingFling = False\n        self.currentlyUpdatingXiaoXing = False\n        self.currentlyUpdatingCT = False\n        self.currentlyUpdatingTrans = False\n\n        # Window references\n        self.settings_window = None\n        self.about_window = None\n        self.trainer_manage_window = None\n        self.trainer_upload_window = None\n\n        # Main widget group\n        centralWidget = QWidget(self)\n        self.setCentralWidget(centralWidget)\n        mainLayout = QGridLayout(centralWidget)\n        mainLayout.setSpacing(15)\n        mainLayout.setContentsMargins(30, 20, 30, 10)\n        centralWidget.setLayout(mainLayout)\n        self.init_settings()\n\n        # Menu setup\n        menu = self.menuBar()\n\n        # Options menu\n        optionMenu = menu.addMenu(tr(\"Options\"))\n\n        settingsAction = QAction(tr(\"Settings\"), self)\n        settingsAction.triggered.connect(self.open_settings)\n        optionMenu.addAction(settingsAction)\n\n        importAction = QAction(tr(\"Import Trainers\"), self)\n        importAction.triggered.connect(self.import_files)\n        optionMenu.addAction(importAction)\n\n        openDirectoryAction = QAction(tr(\"Open Trainer Download Path\"), self)\n        openDirectoryAction.triggered.connect(self.open_trainer_directory)\n        optionMenu.addAction(openDirectoryAction)\n\n        whiteListAction = QAction(tr(\"Add Paths to Whitelist\"), self)\n        whiteListAction.triggered.connect(self.add_whitelist)\n        optionMenu.addAction(whiteListAction)\n\n        aboutAction = QAction(tr(\"About\"), self)\n        aboutAction.triggered.connect(self.open_about)\n        optionMenu.addAction(aboutAction)\n\n        # Data update menu\n        dataMenu = menu.addMenu(tr(\"Data Update\"))\n\n        updateTranslations = QAction(tr(\"Update Translation Data\"), self)\n        updateTranslations.triggered.connect(self.fetch_trainer_translations)\n        dataMenu.addAction(updateTranslations)\n\n        updateTrainerSearchData = QAction(tr(\"Update Trainer Search Data\"), self)\n        updateTrainerSearchData.triggered.connect(self.fetch_trainer_search_data)\n        dataMenu.addAction(updateTrainerSearchData)\n\n        updateTrainers = QAction(tr(\"Update Trainers\"), self)\n        updateTrainers.triggered.connect(self.update_trainers)\n        dataMenu.addAction(updateTrainers)\n\n        # Trainer management menu\n        trainerManagement = QAction(tr(\"Trainer Management\"), self)\n        trainerManagement.triggered.connect(self.open_trainer_management)\n        menu.addAction(trainerManagement)\n\n        # Upload menu\n        uploadTrainerAction = QAction(tr(\"Upload Trainer\"), self)\n        uploadTrainerAction.triggered.connect(self.open_trainer_upload)\n        menu.addAction(uploadTrainerAction)\n\n        # Browse all trainers menu\n        browseAllTrainersAction = QAction(tr(\"Browse All Trainers\"), self)\n        browseAllTrainersAction.triggered.connect(self.browse_all_trainers)\n        menu.addAction(browseAllTrainersAction)\n\n        # Status bar setup\n        self.statusbar = QStatusBar()\n        self.setStatusBar(self.statusbar)\n\n        # ===========================================================================\n        # Column 1 - trainers\n        # ===========================================================================\n        trainersLayout = QVBoxLayout()\n        trainersLayout.setSpacing(10)\n        mainLayout.addLayout(trainersLayout, 0, 0)\n\n        # Search installed trainers\n        trainerSearchLayout = QHBoxLayout()\n        trainerSearchLayout.setSpacing(10)\n        trainerSearchLayout.setContentsMargins(20, 0, 20, 0)\n        trainersLayout.addLayout(trainerSearchLayout)\n\n        searchSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"10\" viewBox=\"0 0 512 512\"><path fill=\"gray\" d=\"M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z\"/></svg>'\n        searchSvgWidget = QSvgWidget()\n        searchSvgWidget.renderer().load(searchSvg.encode('utf-8'))\n        searchSvgWidget.setFixedSize(22, 22)\n        trainerSearchLayout.addWidget(searchSvgWidget)\n\n        self.trainerSearchEntry = QLineEdit()\n        trainerSearchLayout.addWidget(self.trainerSearchEntry)\n        self.trainerSearchEntry.setPlaceholderText(self.trainerSearchEntryPrompt)\n        self.trainerSearchEntry.textChanged.connect(self.update_list)\n\n        # Display installed trainers\n        self.flingListBox = MultilingualListWidget()\n        self.flingListBox.itemActivated.connect(self.launch_trainer)\n        trainersLayout.addWidget(self.flingListBox)\n\n        # Launch and delete buttons\n        bottomLayout = QHBoxLayout()\n        bottomLayout.setSpacing(6)\n        trainersLayout.addLayout(bottomLayout)\n\n        self.launchButton = CustomButton(tr(\"Launch\"))\n        bottomLayout.addWidget(self.launchButton)\n        self.launchButton.clicked.connect(self.launch_trainer)\n\n        self.deleteButton = CustomButton(tr(\"Delete\"))\n        bottomLayout.addWidget(self.deleteButton)\n        self.deleteButton.clicked.connect(self.delete_trainer)\n\n        # ===========================================================================\n        # Column 2 - downloads\n        # ===========================================================================\n        downloadsLayout = QVBoxLayout()\n        downloadsLayout.setSpacing(10)\n        mainLayout.addLayout(downloadsLayout, 0, 1)\n\n        # Search online trainers\n        downloadSearchLayout = QHBoxLayout()\n        downloadSearchLayout.setSpacing(10)\n        downloadSearchLayout.setContentsMargins(20, 0, 20, 0)\n        downloadsLayout.addLayout(downloadSearchLayout)\n\n        downloadSearchSvgWidget = QSvgWidget()\n        downloadSearchSvgWidget.renderer().load(searchSvg.encode('utf-8'))\n        downloadSearchSvgWidget.setFixedSize(22, 22)\n        downloadSearchLayout.addWidget(downloadSearchSvgWidget)\n\n        self.downloadSearchEntry = QLineEdit()\n        actionIconStyle = LargerActionIconStyle(self.downloadSearchEntry.style())\n        actionIconStyle.setParent(self.downloadSearchEntry)\n        self.downloadSearchEntry.setStyle(actionIconStyle)\n        self.downloadSearchEntry.setPlaceholderText(self.downloadSearchEntryPrompt)\n        self.downloadSearchEntry.returnPressed.connect(self.on_enter_press)\n\n        enterSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M20 7V8.2C20 9.88016 20 10.7202 19.673 11.362C19.3854 11.9265 18.9265 12.3854 18.362 12.673C17.7202 13 16.8802 13 15.2 13H4M4 13L8 9M4 13L8 17\" stroke=\"gray\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n        enterActionRenderer = QSvgRenderer(enterSvg.encode('utf-8'))\n        enterActionPixmap = QPixmap(32, 32)\n        enterActionPixmap.fill(Qt.GlobalColor.transparent)\n        enterActionPainter = QPainter(enterActionPixmap)\n        enterActionRenderer.render(enterActionPainter)\n        enterActionPainter.end()\n        self.downloadSearchAction = self.downloadSearchEntry.addAction(\n            QIcon(enterActionPixmap), QLineEdit.ActionPosition.TrailingPosition\n        )\n        self.downloadSearchAction.triggered.connect(self.on_enter_press)\n        downloadSearchLayout.addWidget(self.downloadSearchEntry)\n\n        # Display trainer search results\n        self.downloadListBox = MultilingualListWidget()\n        self.downloadListBox.itemActivated.connect(self.on_download_start)\n        downloadsLayout.addWidget(self.downloadListBox)\n\n        # Change trainer download path\n        changeDownloadPathLayout = QVBoxLayout()\n        changeDownloadPathLayout.setSpacing(2)\n        downloadsLayout.addLayout(changeDownloadPathLayout)\n\n        changeDownloadPathLayout.addWidget(QLabel(tr(\"Trainer download path:\")))\n\n        downloadPathLayout = QHBoxLayout()\n        downloadPathLayout.setSpacing(5)\n        changeDownloadPathLayout.addLayout(downloadPathLayout)\n\n        self.downloadPathEntry = QLineEdit()\n        self.downloadPathEntry.setReadOnly(True)\n        self.downloadPathEntry.setText(self.trainerDownloadPath)\n        downloadPathLayout.addWidget(self.downloadPathEntry)\n\n        self.fileDialogButton = CustomButton(\"...\")\n        downloadPathLayout.addWidget(self.fileDialogButton)\n        self.fileDialogButton.clicked.connect(self.change_path)\n\n        self.show_cheats()\n        self.cleanup_launch_junctions()\n\n        # Show warning pop up\n        if settings[\"showWarning\"]:\n            dialog = CopyRightWarning(self)\n            dialog.show()\n\n        # Check for server announcements\n        self.announcementFetcher = AnnouncementFetchWorker()\n        self.announcementFetcher.announcementFetched.connect(self.show_announcement)\n        self.announcementFetcher.start()\n\n        # Check for software update\n        if settings['checkAppUpdate']:\n            self.versionFetcher = VersionFetchWorker('GCM')\n            self.versionFetcher.versionFetched.connect(lambda latest_version: self.send_notification(True, latest_version))\n            self.versionFetcher.fetchFailed.connect(lambda: self.send_notification(False))\n            self.versionFetcher.start()\n\n        # Update database, trainer update\n        self.timer = QTimer(self)\n        self.timer.timeout.connect(self.on_main_interval)\n        self.on_main_interval()\n        self.timer.start(3600000)\n\n    # ===========================================================================\n    # Core functions\n    # ===========================================================================\n    def closeEvent(self, event):\n        self.cleanup_launch_junctions()\n        super().closeEvent(event)\n        os._exit(0)\n\n    def show_announcement(self, data):\n        dialog = AnnouncementDialog(data, self)\n        dialog.show()\n        self.announcementFetcher.quit()\n\n    def start_update(self, version):\n        try:\n            pid = str(os.getpid())\n            s3_path = f'GCM/Game Cheats Manager Setup {version}.exe'\n            subprocess.Popen(\n                [updater_path, '--pid', pid, '--s3-path', s3_path, '--theme', settings[\"theme\"], '--language', settings[\"language\"]],\n                creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP,\n                start_new_session=True\n            )\n\n        except subprocess.SubprocessError:\n            QMessageBox.critical(self, tr(\"Failure\"), tr(\"Failed to update application.\"))\n\n    def send_notification(self, success, latest_version=0):\n        # Keep a reference to prevent garbage collection\n        self._active_toast = None\n\n        if success and latest_version > self.appVersion:\n            title = tr('Update Available')\n            message = tr('New version found: {old_version} ➜ {new_version}').format(\n                old_version=self.appVersion,\n                new_version=latest_version\n            ) + '\\n' + tr('Would you like to update now?')\n\n            self._active_toast = ToastNotification(\n                title=title,\n                message=message,\n                notification_type=\"update\",\n            )\n            self._active_toast.action_accepted.connect(lambda: self.start_update(latest_version))\n            self._active_toast.show_notification()\n\n        elif not success:\n            title = tr('Update Check Failed')\n            message = tr('Failed to check for software update. You can navigate to `Options` ➜ `About` to check for updates manually.')\n\n            self._active_toast = ToastNotification(\n                title=title,\n                message=message,\n                notification_type=\"error\",\n            )\n            self._active_toast.show_notification()\n\n        self.versionFetcher.quit()\n\n    def init_settings(self):\n        if settings[\"theme\"] == \"dark\":\n            style = style_sheet.black\n        elif settings[\"theme\"] == \"light\":\n            style = style_sheet.white\n\n        style = style.format(\n            check_mark=checkMark_path,\n            drop_down_arrow=dropDownArrow_path,\n            scroll_bar_top=upArrow_path,\n            scroll_bar_bottom=downArrow_path,\n            scroll_bar_left=leftArrow_path,\n            scroll_bar_right=rightArrow_path,\n        )\n        self.setStyleSheet(style)\n\n    def on_enter_press(self):\n        keyword = self.downloadSearchEntry.text()\n        if keyword and self.searchable:\n            self.download_display(keyword)\n\n    def on_download_start(self, item):\n        index = self.downloadListBox.row(item)\n        if index >= 0 and self.downloadable:\n            self.download_trainers(index)\n\n    def disable_download_widgets(self):\n        self.downloadSearchEntry.setEnabled(False)\n        self.fileDialogButton.setEnabled(False)\n\n    def enable_download_widgets(self):\n        self.downloadSearchEntry.setEnabled(True)\n        self.fileDialogButton.setEnabled(True)\n\n    def disable_all_widgets(self):\n        self.downloadSearchEntry.setEnabled(False)\n        self.fileDialogButton.setEnabled(False)\n        self.trainerSearchEntry.setEnabled(False)\n        self.launchButton.setEnabled(False)\n        self.deleteButton.setEnabled(False)\n\n    def enable_all_widgets(self):\n        self.downloadSearchEntry.setEnabled(True)\n        self.fileDialogButton.setEnabled(True)\n        self.trainerSearchEntry.setEnabled(True)\n        self.launchButton.setEnabled(True)\n        self.deleteButton.setEnabled(True)\n\n    def update_list(self):\n        search_text = self.trainerSearchEntry.text().lower()\n        if search_text == \"\":\n            self.show_cheats()\n            return\n\n        self.flingListBox.clear()\n        for trainerName in self.trainers.keys():\n            if search_text in trainerName.lower():\n                self.flingListBox.addItem(trainerName)\n\n    def show_cheats(self):\n        self.flingListBox.clear()\n        self.trainers = {}\n        sort_key_func = sort_trainers_key if settings[\"sortByOrigin\"] else sort_trainers_key_ignore_prefix\n        entries = sorted(\n            os.scandir(self.trainerDownloadPath),\n            key=lambda dirent: sort_key_func(dirent.name)\n        )\n        default_extensions = [\".exe\", \".ct\", \".cetrainer\"]\n\n        for trainer in entries:\n            trainerPath = os.path.normpath(trainer.path)\n            if os.path.isfile(trainerPath):\n                trainerName, trainerExt = os.path.splitext(os.path.basename(trainerPath))\n                if trainerExt.lower() in default_extensions and os.path.getsize(trainerPath) != 0:\n                    self.flingListBox.addItem(trainerName)\n                    self.trainers[trainerName] = trainerPath\n            else:\n                exe_exclusions = [\"flashplayer_22.0.0.210_ax_debug.exe\"]\n                trainerName = os.path.basename(trainerPath)\n\n                # Check gcm_info.json for custom extension\n                gcm_info_path = os.path.join(trainerPath, \"gcm_info.json\")\n                custom_ext = None\n                if os.path.exists(gcm_info_path):\n                    with open(gcm_info_path, 'r', encoding='utf-8') as f:\n                        custom_ext = json.load(f).get(\"extension\")\n\n                # Determine target extensions: use custom if specified, otherwise defaults\n                if custom_ext == \"none\":\n                    self.flingListBox.addItem(trainerName)\n                    self.trainers[trainerName] = trainerPath\n                    continue\n\n                target_exts = [\".\" + custom_ext] if custom_ext else default_extensions\n\n                matched_path = None\n                for ext in target_exts:\n                    for file in os.scandir(trainerPath):\n                        if file.is_file() and os.path.splitext(file.name)[1].lower() == ext and file.name not in exe_exclusions:\n                            matched_path = os.path.normpath(file.path)\n                            break\n                    if matched_path:\n                        break\n\n                if matched_path:\n                    self.flingListBox.addItem(trainerName)\n                    self.trainers[trainerName] = matched_path\n                elif os.path.exists(gcm_info_path):\n                    self.flingListBox.addItem(trainerName)\n                    self.trainers[trainerName] = trainerPath\n\n    def cleanup_launch_junctions(self):\n        temp_dir = tempfile.gettempdir()\n        try:\n            for item in os.listdir(temp_dir):\n                if item.startswith(\"GCM_Launch_\"):\n                    junction_path = os.path.join(temp_dir, item)\n                    try:\n                        subprocess.run(f'rmdir \"{junction_path}\"', shell=True, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n                    except Exception:\n                        pass\n        except Exception as e:\n            print(f\"Error during junction cleanup: {e}\")\n\n    def get_ascii_launch_path(self, original_exe_path):\n        # 1. Check if the entire path is already purely ASCII\n        try:\n            original_exe_path.encode('ascii')\n            return original_exe_path\n        except UnicodeEncodeError:\n            pass\n\n        # 2. Try Windows Short Path (8.3 format)\n        _GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW\n        _GetShortPathNameW.argtypes = [wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.DWORD]\n        _GetShortPathNameW.restype = wintypes.DWORD\n\n        output_buf_size = _GetShortPathNameW(original_exe_path, None, 0)\n        if output_buf_size > 0:\n            output_buf = ctypes.create_unicode_buffer(output_buf_size)\n            _GetShortPathNameW(original_exe_path, output_buf, output_buf_size)\n            short_path = output_buf.value\n            try:\n                short_path.encode('ascii')\n                return short_path\n            except UnicodeEncodeError:\n                pass\n\n        # 3. Ultimate Fallback: Unique Directory Junction in %TEMP%\n        temp_dir = tempfile.gettempdir()\n        exe_dir = os.path.dirname(original_exe_path)\n        original_exe_name = os.path.basename(original_exe_path)\n\n        # Create a short, stable hash of the directory path to prevent collisions\n        # e.g., \"GCM_Launch_8a4f9b2c\"\n        path_hash = hashlib.md5(exe_dir.encode('utf-8')).hexdigest()[:8]\n        junction_dir = os.path.join(temp_dir, f\"GCM_Launch_{path_hash}\")\n\n        # Remove old junction if it exists\n        if os.path.exists(junction_dir):\n            try:\n                subprocess.run(f'rmdir \"{junction_dir}\"', shell=True, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n            except Exception:\n                pass\n\n        # If it doesn't exist (or was successfully removed), create the new junction\n        if not os.path.exists(junction_dir):\n            try:\n                command = f'mklink /J \"{junction_dir}\" \"{exe_dir}\"'\n                subprocess.run(command, shell=True, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n            except Exception as e:\n                print(f\"Failed to create ASCII junction fallback: {e}\")\n                return original_exe_path\n\n        return os.path.join(junction_dir, original_exe_name)\n\n    def is_cheat_engine_available(self, ext):\n        # 1. Check Windows 10/11 UserChoice (When user selects \"Always use this app\")\n        try:\n            with winreg.OpenKey(winreg.HKEY_CURRENT_USER, rf\"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\{ext}\\UserChoice\") as key:\n                prog_id, _ = winreg.QueryValueEx(key, \"ProgId\")\n\n            with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, rf\"{prog_id}\\shell\\open\\command\") as cmd_key:\n                command, _ = winreg.QueryValueEx(cmd_key, \"\")\n\n            if command and \"cheatengine\" in command.lower().replace(\" \", \"\"):\n                return True\n        except (FileNotFoundError, OSError):\n            pass\n\n        # 2. Check Standard ProgID\n        try:\n            with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, ext) as key:\n                prog_id, _ = winreg.QueryValueEx(key, \"\")\n\n            with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, rf\"{prog_id}\\shell\\open\\command\") as cmd_key:\n                command, _ = winreg.QueryValueEx(cmd_key, \"\")\n\n            if command and \"cheatengine\" in command.lower().replace(\" \", \"\"):\n                return True\n        except (FileNotFoundError, OSError):\n            pass\n\n        return False\n\n    def prompt_cheat_engine_install(self):\n        msg_box = QMessageBox(self)\n        msg_box.setIcon(QMessageBox.Icon.Warning)\n        msg_box.setWindowTitle(tr(\"Cheat Engine Required\"))\n        msg_box.setText(\n            tr(\"Cheat Engine may not be installed on your system.\") + \"<br><br>\" +\n            tr(\".ct/.cetrainer files require Cheat Engine to run.\") + \" \" +\n            tr(\"Please download and install Cheat Engine, then make sure to open the file with Cheat Engine.\") + \"<br><br>\" +\n            tr(\"Note: The official Cheat Engine installer contains promotional software bundles. Make sure to skip them during installation.\") + \"<br><br>\" +\n            tr(\"Download from:\") + ' <a href=\"https://www.cheatengine.org\">https://www.cheatengine.org</a>'\n        )\n        msg_box.setTextFormat(Qt.TextFormat.RichText)\n        msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)\n        ok_button = msg_box.button(QMessageBox.StandardButton.Ok)\n        ok_button.setText(\"OK\")\n        dontShowCheckbox = QCheckBox(tr(\"Don't show again\"))\n        dontShowCheckbox.setStyleSheet(\"margin-top: 10px;\")\n        msg_box.setCheckBox(dontShowCheckbox)\n        msg_box.exec()\n        if dontShowCheckbox.isChecked():\n            settings[\"showCEPrompt\"] = False\n            apply_settings(settings)\n\n    def launch_trainer(self):\n        try:\n            selection = self.flingListBox.currentRow()\n            if selection != -1:\n                trainerName = self.flingListBox.item(selection).text()\n                originalPath = os.path.normpath(self.trainers[trainerName])\n\n                # Folder-only trainer (no launchable file) — open the folder\n                if os.path.isdir(originalPath):\n                    os.startfile(originalPath)\n                    return\n\n                # Get a safe ASCII path to prevent legacy trainers from crashing\n                if settings[\"safePath\"]:\n                    trainerPath = self.get_ascii_launch_path(originalPath)\n                else:\n                    trainerPath = originalPath\n                print(f\"Trainer launch path: {trainerPath}\")\n                trainerDir = os.path.dirname(trainerPath)\n                trainerExt = os.path.splitext(originalPath)[1].lower()\n\n                # Check if Cheat Engine is installed before launching .ct/.cetrainer files\n                if trainerExt in [\".ct\", \".cetrainer\"] and settings[\"showCEPrompt\"] and not self.is_cheat_engine_available(trainerExt):\n                    self.prompt_cheat_engine_install()\n\n                # Use \"runas\" for exe files (run as admin), \"open\" for other files (use default app)\n                verb = \"runas\" if trainerExt == \".exe\" else \"open\"\n                ctypes.windll.shell32.ShellExecuteW(\n                    None, verb, trainerPath, None, trainerDir, 1\n                )\n        except Exception as e:\n            print(str(e))\n\n    def delete_trainer(self):\n        index = self.flingListBox.currentRow()\n        if index != -1:\n            trainerName = self.flingListBox.item(index).text()\n            trainerPath = self.trainers[trainerName]\n\n            msg_box = QMessageBox(\n                QMessageBox.Icon.Question,\n                tr('Delete trainer'),\n                tr('Are you sure you want to delete ') + f\"{trainerName}?\",\n                QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,\n                self\n            )\n\n            yes_button = msg_box.button(QMessageBox.StandardButton.Yes)\n            yes_button.setText(tr(\"Confirm\"))\n            no_button = msg_box.button(QMessageBox.StandardButton.No)\n            no_button.setText(tr(\"Cancel\"))\n            reply = msg_box.exec()\n\n            if reply == QMessageBox.StandardButton.Yes:\n                try:\n                    if os.path.isdir(trainerPath):\n                        shutil.rmtree(trainerPath)\n                    else:\n                        os.chmod(trainerPath, stat.S_IWRITE)\n                        parent_dir = os.path.dirname(trainerPath)\n                        if os.path.basename(parent_dir) == trainerName:\n                            shutil.rmtree(parent_dir)\n                        else:\n                            os.remove(trainerPath)\n                    self.flingListBox.takeItem(index)\n                    self.show_cheats()\n                except PermissionError as e:\n                    QMessageBox.critical(self, tr(\"Error\"), tr(\"Trainer is currently in use, please close any programs using the file and try again.\"))\n                except Exception as e:\n                    QMessageBox.critical(self, tr(\"Error\"), tr(\"Failed to delete {trainer_name}:\").format(trainer_name=trainerName) + f\"\\n{str(e)}\")\n                    self.show_cheats()\n\n    def findWidgetInStatusBar(self, statusbar, widgetName):\n        for widget in statusbar.children():\n            if widget.objectName() == widgetName:\n                return widget\n        return None\n\n    def change_path(self):\n        self.downloadListBox.clear()\n        self.disable_all_widgets()\n        initialPath = self.downloadPathEntry.text() or os.path.expanduser(\"~\")\n        folder = QFileDialog.getExistingDirectory(self, tr(\"Change trainer download path\"), initialPath)\n\n        if folder:\n            changedPath = os.path.normpath(os.path.join(folder, \"GCM Trainers\"))\n            if self.downloadPathEntry.text() == changedPath:\n                QMessageBox.critical(self, tr(\"Error\"), tr(\"Please choose a new path.\"))\n                self.on_message(tr(\"Failed to change trainer download path.\"), \"failure\")\n                self.enable_all_widgets()\n                return\n\n            self.downloadListBox.addItem(tr(\"Migrating existing trainers...\"))\n            item = self.downloadListBox.item(self.downloadListBox.count() - 1)\n            item.setFlags(Qt.ItemFlag.NoItemFlags)\n            migration_thread = PathChangeThread(self.trainerDownloadPath, changedPath, self)\n            migration_thread.finished.connect(self.on_migration_finished)\n            migration_thread.error.connect(self.on_migration_error)\n            migration_thread.start()\n\n        else:\n            self.downloadListBox.addItem(tr(\"No path selected.\"))\n            item = self.downloadListBox.item(self.downloadListBox.count() - 1)\n            item.setFlags(Qt.ItemFlag.NoItemFlags)\n            self.enable_all_widgets()\n            return\n\n    def download_display(self, keyword):\n        self.disable_download_widgets()\n        self.downloadListBox.clear()\n        self.downloadable = False\n        self.searchable = False\n\n        display_thread = DownloadDisplayThread(keyword, self)\n        display_thread.message.connect(self.on_message, Qt.ConnectionType.BlockingQueuedConnection)\n        display_thread.finished.connect(self.on_display_finished)\n        display_thread.start()\n\n    def fetch_trainer_translations(self):\n        if not self.currentlyUpdatingTrans:\n            self.currentlyUpdatingTrans = True\n            fetch_trainer_details_thread = FetchTrainerTranslations(self)\n            fetch_trainer_details_thread.message.connect(self.on_status_load)\n            fetch_trainer_details_thread.update.connect(self.on_status_update)\n            fetch_trainer_details_thread.finished.connect(self.on_interval_finished)\n            fetch_trainer_details_thread.start()\n\n    def fetch_gcm_data(self):\n        if not self.currentlyUpdatingGCM:\n            self.currentlyUpdatingGCM = True\n            fetch_gcm_site_thread = FetchGCMSite(self)\n            fetch_gcm_site_thread.message.connect(self.on_status_load)\n            fetch_gcm_site_thread.update.connect(self.on_status_update)\n            fetch_gcm_site_thread.finished.connect(self.on_interval_finished)\n            fetch_gcm_site_thread.start()\n\n    def fetch_fling_data(self):\n        if not self.currentlyUpdatingFling:\n            self.currentlyUpdatingFling = True\n            fetch_fling_site_thread = FetchFlingSite(self)\n            fetch_fling_site_thread.message.connect(self.on_status_load)\n            fetch_fling_site_thread.update.connect(self.on_status_update, Qt.ConnectionType.BlockingQueuedConnection)\n            fetch_fling_site_thread.finished.connect(self.on_interval_finished)\n            fetch_fling_site_thread.start()\n\n    def fetch_xiaoxing_data(self):\n        if not self.currentlyUpdatingXiaoXing:\n            self.currentlyUpdatingXiaoXing = True\n            fetch_xiaoxing_site_thread = FetchXiaoXingSite(self)\n            fetch_xiaoxing_site_thread.message.connect(self.on_status_load)\n            fetch_xiaoxing_site_thread.update.connect(self.on_status_update)\n            fetch_xiaoxing_site_thread.finished.connect(self.on_interval_finished)\n            fetch_xiaoxing_site_thread.start()\n\n    def fetch_ct_data(self):\n        if not self.currentlyUpdatingCT:\n            self.currentlyUpdatingCT = True\n            fetch_ct_site_thread = FetchCTSite(self)\n            fetch_ct_site_thread.message.connect(self.on_status_load)\n            fetch_ct_site_thread.update.connect(self.on_status_update)\n            fetch_ct_site_thread.finished.connect(self.on_interval_finished)\n            fetch_ct_site_thread.start()\n\n    def update_trainers(self, auto_check=False):\n        if not self.currentlyUpdatingTrainers:\n            self.currentlyUpdatingTrainers = True\n            trainer_update_thread = UpdateTrainers(self.trainers, auto_check, self)\n            trainer_update_thread.message.connect(self.on_status_load)\n            trainer_update_thread.update.connect(self.on_status_update)\n            trainer_update_thread.updateTrainer.connect(self.on_trainer_update)\n            trainer_update_thread.finished.connect(self.on_interval_finished)\n            trainer_update_thread.start()\n\n    def fetch_trainer_search_data(self):\n        self.fetch_fling_data()\n        if settings[\"enableXiaoXing\"]:\n            self.fetch_xiaoxing_data()\n        if settings[\"enableCT\"]:\n            self.fetch_ct_data()\n        if settings[\"enableGCM\"]:\n            self.fetch_gcm_data()\n\n    def on_main_interval(self):\n        if settings[\"autoUpdateTranslations\"]:\n            self.fetch_trainer_translations()\n        if settings[\"autoUpdateGCMData\"]:\n            self.fetch_gcm_data()\n        if settings[\"autoUpdateFlingData\"]:\n            self.fetch_fling_data()\n        if settings[\"autoUpdateXiaoXingData\"]:\n            self.fetch_xiaoxing_data()\n        if settings[\"autoUpdateCTData\"]:\n            self.fetch_ct_data()\n        if settings[\"autoUpdateGCMTrainers\"] or settings[\"autoUpdateFlingTrainers\"] or settings[\"autoUpdateXiaoXingTrainers\"] or settings[\"autoUpdateCTTrainers\"]:\n            self.update_trainers(True)\n\n    def download_trainers(self, index):\n        self.enqueue_download(index, self.trainers, self.trainerDownloadPath, None)\n\n    def on_trainer_update(self, update_entry):\n        self.enqueue_download(None, None, self.trainerDownloadPath, update_entry)\n\n    def enqueue_download(self, index, trainers, trainerDownloadPath, update_entry):\n        self.downloadQueue.put((index, trainers, trainerDownloadPath, update_entry))\n        if not self.currentlyDownloading:\n            self.start_next_download()\n\n    def start_next_download(self):\n        if not self.downloadQueue.empty():\n            self.currentlyDownloading = True\n            self.disable_download_widgets()\n            self.downloadListBox.clear()\n            self.downloadable = False\n            self.searchable = False\n\n            index, trainers, trainerDownloadPath, update_entry = self.downloadQueue.get()\n            download_thread = DownloadTrainersThread(index, trainers, trainerDownloadPath, update_entry, self)\n            download_thread.message.connect(self.on_message, Qt.ConnectionType.BlockingQueuedConnection)\n            download_thread.messageBox.connect(self.on_message_box)\n            download_thread.progress.connect(self.on_download_progress)\n            download_thread.finished.connect(self.on_download_finished)\n            download_thread.start()\n        else:\n            self.currentlyDownloading = False\n\n    def on_message(self, message, type=None):\n        noSelectFlags = Qt.ItemFlag.NoItemFlags\n\n        if type == \"clear\":\n            self.downloadListBox.clear()\n            self.downloadProgressBar = None\n        elif type == \"result\":\n            item = QListWidgetItem(message)\n            self.downloadListBox.addItem(item)\n        elif type == \"download\":\n            widget = QWidget()\n            widgetLayout = QVBoxLayout(widget)\n            widgetLayout.setContentsMargins(4, 2, 4, 2)\n            widgetLayout.setSpacing(2)\n            headerLayout = QHBoxLayout()\n            headerLayout.setContentsMargins(0, 0, 0, 0)\n            headerLayout.setSpacing(10)\n            label = QLabel(message)\n            headerLayout.addWidget(label)\n            self.downloadProgressLabel = QLabel()\n            self.downloadProgressLabel.setStyleSheet(\"color: gray;\")\n            headerLayout.addWidget(self.downloadProgressLabel)\n            headerLayout.addStretch()\n            widgetLayout.addLayout(headerLayout)\n            self.downloadProgressBar = QProgressBar()\n            self.downloadProgressBar.setRange(0, 0)\n            self.downloadProgressBar.setFixedHeight(15)\n            widgetLayout.addWidget(self.downloadProgressBar)\n            item = QListWidgetItem()\n            item.setFlags(noSelectFlags)\n            item.setSizeHint(widget.sizeHint())\n            self.downloadListBox.addItem(item)\n            self.downloadListBox.setItemWidget(item, widget)\n        elif type == \"success\":\n            self.downloadProgressBar = None\n            self.downloadProgressLabel = None\n            item = QListWidgetItem(message)\n            item.setFlags(noSelectFlags)\n            item.setForeground(QColor('green'))\n            # item.setBackground(QColor(0, 255, 0, 20))\n            self.downloadListBox.addItem(item)\n        elif type == \"failure\":\n            self.downloadProgressBar = None\n            self.downloadProgressLabel = None\n            item = QListWidgetItem(message)\n            item.setFlags(noSelectFlags)\n            item.setForeground(QColor('red'))\n            # item.setBackground(QColor(255, 0, 0, 20))\n            self.downloadListBox.addItem(item)\n        else:\n            item = QListWidgetItem(message)\n            item.setFlags(noSelectFlags)\n            self.downloadListBox.addItem(item)\n\n    @staticmethod\n    def format_size(num_bytes):\n        for unit in ('B', 'KB', 'MB', 'GB'):\n            if num_bytes < 1024:\n                return f\"{num_bytes:.1f} {unit}\" if unit != 'B' else f\"{num_bytes} {unit}\"\n            num_bytes /= 1024\n        return f\"{num_bytes:.1f} TB\"\n\n    def on_download_progress(self, downloaded, total):\n        if self.downloadProgressBar:\n            if total > 0:\n                if self.downloadProgressBar.maximum() == 0:\n                    self.downloadProgressBar.setRange(0, 100)\n                self.downloadProgressBar.setValue(int(downloaded * 100 / total))\n            if self.downloadProgressLabel:\n                if total > 0:\n                    self.downloadProgressLabel.setText(\n                        f\"{self.format_size(downloaded)} / {self.format_size(total)}\"\n                    )\n                else:\n                    self.downloadProgressLabel.setText(self.format_size(downloaded))\n\n    def on_message_box(self, type, title, text):\n        if type == \"info\":\n            QMessageBox.information(self, title, text)\n        elif type == \"error\":\n            QMessageBox.critical(self, title, text)\n\n    def on_migration_error(self, error_message):\n        QMessageBox.critical(self, tr(\"Error\"), tr(\"Error migrating trainers: \") + error_message)\n        self.on_message(tr(\"Failed to change trainer download path.\"), \"failure\")\n        self.show_cheats()\n        self.enable_all_widgets()\n\n    def on_migration_finished(self, new_path):\n        self.trainerDownloadPath = new_path\n        settings[\"downloadPath\"] = self.trainerDownloadPath\n        apply_settings(settings)\n        self.show_cheats()\n        self.on_message(tr(\"Migration complete!\"), \"success\")\n        self.downloadPathEntry.setText(self.trainerDownloadPath)\n        self.enable_all_widgets()\n\n    def on_display_finished(self, status):\n        # 0: success; 1: failure\n        if status:\n            self.downloadable = False\n        else:\n            self.downloadable = True\n\n        self.searchable = True\n        self.enable_download_widgets()\n\n    def on_download_finished(self, status):\n        self.downloadable = False\n        self.searchable = True\n        self.enable_download_widgets()\n        self.show_cheats()\n        self.currentlyDownloading = False\n        self.start_next_download()\n\n    def on_status_load(self, widgetName, message):\n        statusWidget = StatusMessageWidget(widgetName, message)\n        self.statusbar.addWidget(statusWidget)\n\n    def on_status_update(self, widgetName, newMessage, state):\n        target = self.findWidgetInStatusBar(self.statusbar, widgetName)\n        target.update_message(newMessage, state)\n\n    def on_interval_finished(self, widgetName):\n        target = self.findWidgetInStatusBar(self.statusbar, widgetName)\n        if target:\n            target.deleteLater()\n\n        if widgetName == \"gcm\":\n            self.currentlyUpdatingGCM = False\n        elif widgetName == \"fling\":\n            self.currentlyUpdatingFling = False\n        elif widgetName == \"xiaoxing\":\n            self.currentlyUpdatingXiaoXing = False\n        elif widgetName == \"ct\":\n            self.currentlyUpdatingCT = False\n        elif widgetName == \"translations\":\n            self.currentlyUpdatingTrans = False\n        elif widgetName == \"trainerUpdate\":\n            self.currentlyUpdatingTrainers = False\n\n    # ===========================================================================\n    # Menu functions\n    # ===========================================================================\n    def open_settings(self):\n        if self.settings_window is not None and self.settings_window.isVisible():\n            self.settings_window.raise_()\n            self.settings_window.activateWindow()\n        else:\n            self.settings_window = SettingsDialog(self)\n            self.settings_window.show()\n\n    def import_files(self):\n        file_names, _ = QFileDialog.getOpenFileNames(self, tr(\"Select trainers you want to import\"), \"\", \"Trainer Files (*.exe *.ct)\")\n        if file_names:\n            for file_name in file_names:\n                try:\n                    dst = os.path.join(self.trainerDownloadPath, os.path.basename(file_name))\n                    if os.path.exists(dst):\n                        os.chmod(dst, stat.S_IWRITE)\n                    shutil.copy(file_name, dst)\n                    print(\"Trainer copied: \", file_name)\n                except Exception as e:\n                    QMessageBox.critical(self, tr(\"Failure\"), tr(\"Failed to import trainer: \") + f\"{file_name}\\n{str(e)}\")\n                self.show_cheats()\n\n            msg_box = QMessageBox(\n                QMessageBox.Icon.Question,\n                tr(\"Delete original trainers\"),\n                tr(\"Do you want to delete the original trainer files?\"),\n                QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,\n                self\n            )\n\n            yes_button = msg_box.button(QMessageBox.StandardButton.Yes)\n            yes_button.setText(tr(\"Yes\"))\n            no_button = msg_box.button(QMessageBox.StandardButton.No)\n            no_button.setText(tr(\"No\"))\n            reply = msg_box.exec()\n\n            if reply == QMessageBox.StandardButton.Yes:\n                for file_name in file_names:\n                    try:\n                        os.remove(file_name)\n                    except Exception as e:\n                        QMessageBox.critical(self, tr(\"Failure\"), tr(\"Failed to delete original trainer: \") + f\"{file_name}\\n{str(e)}\")\n\n    def open_trainer_directory(self):\n        os.startfile(self.trainerDownloadPath)\n\n    def add_whitelist(self):\n        msg_box = QMessageBox(\n            QMessageBox.Icon.Question,\n            tr(\"Administrator Access Required\"),\n            tr(\"To proceed with adding the trainer download paths to the Windows Defender whitelist, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\") +\n            \"\\n\\n\" + tr(\"Would you like to continue?\"),\n            QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,\n            self\n        )\n\n        yes_button = msg_box.button(QMessageBox.StandardButton.Yes)\n        yes_button.setText(tr(\"Yes\"))\n        no_button = msg_box.button(QMessageBox.StandardButton.No)\n        no_button.setText(tr(\"No\"))\n        reply = msg_box.exec()\n\n        if reply == QMessageBox.StandardButton.Yes:\n            paths = [DOWNLOAD_TEMP_DIR, settings[\"downloadPath\"]]\n\n            try:\n                subprocess.run([elevator_path, 'whitelist'] + paths, check=True, shell=True)\n                QMessageBox.information(self, tr(\"Success\"), tr(\"Successfully added paths to Windows Defender whitelist.\"))\n\n            except subprocess.CalledProcessError:\n                QMessageBox.critical(self, tr(\"Failure\"), tr(\"Failed to add paths to Windows Defender whitelist.\"))\n\n    def open_about(self):\n        if self.about_window is not None and self.about_window.isVisible():\n            self.about_window.raise_()\n            self.about_window.activateWindow()\n        else:\n            self.about_window = AboutDialog(self)\n            self.about_window.show()\n\n    def open_trainer_management(self):\n        if self.trainer_manage_window is not None and self.trainer_manage_window.isVisible():\n            self.trainer_manage_window.raise_()\n            self.trainer_manage_window.activateWindow()\n        else:\n            self.trainer_manage_window = TrainerManagementDialog(self)\n            self.trainer_manage_window.show()\n\n    def open_trainer_upload(self):\n        if self.trainer_upload_window is not None and self.trainer_upload_window.isVisible():\n            self.trainer_upload_window.raise_()\n            self.trainer_upload_window.activateWindow()\n        else:\n            self.trainer_upload_window = TrainerUploadDialog(self)\n            self.trainer_upload_window.show()\n\n    def browse_all_trainers(self):\n        webbrowser.open(self.allTrainersLink)\n\n\nif __name__ == \"__main__\":\n    app = QApplication(sys.argv)\n\n    # Load the selected font\n    primary_font_path = font_config[settings[\"language\"]]\n    primary_font_id = QFontDatabase.addApplicationFont(primary_font_path)\n    primary_font_families = QFontDatabase.applicationFontFamilies(primary_font_id)\n    custom_font = QFont(primary_font_families[0], 10)\n    custom_font.setHintingPreference(QFont.HintingPreference.PreferNoHinting)\n    app.setFont(custom_font)\n\n    mainWin = GameCheatsManager()\n    mainWin.show()\n\n    qr = mainWin.frameGeometry()\n    cp = mainWin.screen().availableGeometry().center()\n    qr.moveCenter(cp)\n    mainWin.move(qr.topLeft())\n\n    sys.exit(app.exec())\n"
  },
  {
    "path": "src/scripts/style_sheet.py",
    "content": "white = \"\"\"\n    QMainWindow {{\n        background-color: #ffffff;\n    }}\n\n    QStatusBar::item {{\n        border: none;\n    }}\n\n    QMenuBar {{\n        background-color: #f9f9f9;\n    }}\n\n    QMenuBar::item {{\n        background-color: #f9f9f9;\n        color: #000000;\n        padding: 5px;\n    }}\n\n    QMenuBar::item:selected {{\n        background-color: #e6e6e6;\n    }}\n\n    QMenu {{\n        background-color: #ffffff;\n        border: 2px solid #000000;\n        border-radius: 5px;\n    }}\n\n    QMenu::item {{\n        background-color: #ffffff;\n        color: #000000;\n    }}\n\n    QMenu::item:selected {{\n        background-color: #e6e6e6;\n    }}\n\n    QStatusBar {{\n        color: black;\n    }}\n\n    QCheckBox {{\n        color: black;\n    }}\n\n    QCheckBox::indicator {{\n        width: 16px;\n        height: 16px;\n        border-radius: 5px;\n    }}\n\n    QCheckBox::indicator:unchecked {{\n        background-color: #ffffff;\n        border: 1px solid #cccccc;\n    }}\n\n    QCheckBox::indicator:checked {{\n        background-color: #0057b7;\n        border: 1px solid #bbbbbb;\n        image: url({check_mark});\n    }}\n\n    QPushButton {{\n        padding: 7px;\n        border-radius: 3px;\n        border: 1px solid #dddddd;\n        background-color: #f9f9f9;\n        color: #000000;\n        outline: none;\n    }}\n\n    QPushButton:hover {{\n        background-color: #f2f2f2;\n    }}\n\n    QPushButton:pressed {{\n        background-color: #e6e6e6;\n    }}\n\n    QComboBox {{\n        padding: 7px;\n        border-radius: 3px;\n        border: 1px solid #dddddd;\n        background-color: #f9f9f9;\n        color: #000000;\n    }}\n\n    QComboBox::drop-down {{\n        border: 0px;\n        padding-right: 10px;\n    }}\n\n    QComboBox::down-arrow {{\n        image: url({drop_down_arrow});\n        width: 10px;\n    }}\n\n    QComboBox QAbstractItemView {{\n        background-color: #f9f9f9;\n        color: #000000;\n        border: 1px solid #dddddd;\n    }}\n\n    QDialog {{\n        background-color: #ffffff;\n    }}\n\n    QLabel {{\n        color: #000000;\n    }}\n\n    QTextEdit {{\n        background-color: #f9f9f9;\n        color: #000000;\n        border: 1px solid #dddddd;\n        border-radius: 3px;\n        padding: 6px;\n    }}\n\n    QTextEdit:focus {{\n        border-bottom: 2px solid #0057b7;\n    }}\n\n    QLineEdit {{\n        background-color: #f9f9f9;\n        color: #000000;\n        border: 1px solid #dddddd;\n        border-radius: 3px;\n        padding: 6px;\n    }}\n\n    QLineEdit:focus {{\n        border-bottom: 2px solid #0057b7;\n    }}\n\n    QListWidget {{\n        border: 1px solid #bfbfbf;\n        border-radius: 3px;\n        background-color: #ffffff;\n        color: #000000;\n        outline: none;\n    }}\n\n    QListWidget::item {{\n        border-left: 3px solid transparent;\n    }}\n\n    QListWidget::item:hover {{\n        background-color: #f2f2f2;\n    }}\n\n    QListWidget::item:selected {{\n        color: #000000;\n        background-color: #e6e6e6;\n        border-left: 3px solid #0080e3;\n    }}\n\n    QScrollBar:vertical {{\n        background-color: #f0f0f0;\n        width: 15px;\n        margin: 15px 0 15px 0;\n    }}\n\n    QScrollBar::handle:vertical {{\n        background-color: #cccccc;\n        min-height: 20px;\n        border-radius: 3px;\n        margin: 0 4px 0 4px;\n    }}\n\n    QScrollBar::handle:vertical:hover {{\n        background-color: #d6d6d6;\n    }}\n\n    QScrollBar::handle:vertical:pressed {{\n        background-color: #bfbfbf;\n    }}\n\n    QScrollBar::sub-line:vertical {{\n        image: url({scroll_bar_top});\n        background-color: #f0f0f0;\n        height: 15px;\n        border-top-left-radius: 7px;\n        border-top-right-radius: 7px;\n        subcontrol-position: top;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-line:vertical {{\n        image: url({scroll_bar_bottom});\n        background-color: #f0f0f0;\n        height: 15px;\n        border-bottom-left-radius: 7px;\n        border-bottom-right-radius: 7px;\n        subcontrol-position: bottom;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {{\n        background: none;\n    }}\n\n    QScrollBar:horizontal {{\n        background-color: #f0f0f0;\n        height: 15px;\n        margin: 0 15px 0 15px;\n    }}\n\n    QScrollBar::handle:horizontal {{\n        background-color: #cccccc;\n        min-width: 20px;\n        border-radius: 3px;\n        margin: 4px 0 4px 0;\n    }}\n\n    QScrollBar::handle:horizontal:hover {{\n        background-color: #d6d6d6;\n    }}\n\n    QScrollBar::handle:horizontal:pressed {{\n        background-color: #bfbfbf;\n    }}\n\n    QScrollBar::sub-line:horizontal {{\n        image: url({scroll_bar_left});\n        background-color: #f0f0f0;\n        width: 15px;\n        border-top-left-radius: 7px;\n        border-bottom-left-radius: 7px;\n        subcontrol-position: left;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-line:horizontal {{\n        image: url({scroll_bar_right});\n        background-color: #f0f0f0;\n        width: 15px;\n        border-top-right-radius: 7px;\n        border-bottom-right-radius: 7px;\n        subcontrol-position: right;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {{\n        background: none;\n    }}\n\n    QTabWidget::pane {{\n        border-top: 2px solid #cccccc;\n    }}\n\n    QTabBar::tab {{\n        background-color: #f9f9f9;\n        color: #000000;\n        padding: 10px;\n        border-radius: 3px;\n    }}\n\n    QTabBar::tab:hover {{\n        background-color: #f2f2f2;\n    }}\n\n    QTabBar::tab:selected {{\n        background-color: #e6e6e6;\n        color: #000000;\n        font-weight: bold;\n        border-bottom: 2px solid #0057b7;\n    }}\n\n    QProgressBar {{\n        border: 1px solid #dddddd;\n        border-radius: 3px;\n        background-color: #f9f9f9;\n        text-align: center;\n        color: #000000;\n    }}\n\n    QProgressBar::chunk {{\n        background-color: #0057b7;\n        width: 1px; \n    }}\n\"\"\"\n\nblack = \"\"\"\n    QMainWindow {{\n        background-color: #1c1c1c;\n    }}\n\n    QStatusBar::item {{\n        border: none;\n    }}\n\n    QMenuBar {{\n        background-color: #2e2e2e;\n    }}\n\n    QMenuBar::item {{\n        background-color: #2e2e2e;\n        color: #FFFFFF;\n        padding: 5px;\n    }}\n\n    QMenuBar::item:selected {{\n        background-color: #484848;\n    }}\n\n    QMenu {{\n        background-color: #1c1c1c;\n        border: 2px solid #ffffff;\n        border-radius: 5px;\n    }}\n\n    QMenu::item {{\n        background-color: #1c1c1c;\n        color: #FFFFFF;\n    }}\n\n    QMenu::item:selected {{\n        background-color: #484848;\n    }}\n\n    QStatusBar {{\n        color: white;\n    }}\n\n    QCheckBox {{\n        color: white;\n    }}\n\n    QCheckBox::indicator {{\n        width: 16px;\n        height: 16px;\n        border-radius: 5px;\n    }}\n\n    QCheckBox::indicator:unchecked {{\n        background-color: #2a2a2a;\n        border: 1px solid #5e5e5e;\n    }}\n\n    QCheckBox::indicator:checked {{\n        background-color: #0080e3;\n        border: 1px solid #a6a6a6;\n        image: url({check_mark});\n    }}\n\n    QPushButton {{\n        padding: 7px;\n        border-radius: 3px;\n        border: 1px solid #555555;\n        background-color: #2a2a2a;\n        color: #FFFFFF;\n        outline: none;\n    }}\n\n    QPushButton:hover {{\n        background-color: #2f2f2f;\n    }}\n\n    QPushButton:pressed {{\n        background-color: #232323;\n    }}\n\n    QComboBox {{\n        padding: 7px;\n        border-radius: 3px;\n        border: 1px solid #555555;\n        background-color: #2a2a2a;\n        color: #FFFFFF;\n    }}\n\n    QComboBox::drop-down {{\n        border: 0px;\n        padding-right: 10px;\n    }}\n\n    QComboBox::down-arrow {{\n        image: url({drop_down_arrow});\n        width: 10px;\n    }}\n\n    QComboBox QAbstractItemView {{\n        background-color: #2a2a2a;\n        color: #FFFFFF;\n        border: 1px solid #555555;\n    }}\n\n    QDialog {{\n        background-color: #1c1c1c;\n    }}\n\n    QLabel {{\n        color: #FFFFFF;\n    }}\n\n    QTextEdit {{\n        background-color: #2a2a2a;\n        color: #FFFFFF;\n        border: 1px solid #555555;\n        border-radius: 3px;\n        padding: 6px;\n    }}\n\n    QTextEdit:focus {{\n        border-bottom: 2px solid #007ad9;\n    }}\n\n    QLineEdit {{\n        background-color: #2a2a2a;\n        color: #FFFFFF;\n        border: 1px solid #555555;\n        border-radius: 3px;\n        padding: 6px;\n    }}\n\n    QLineEdit:focus {{\n        border-bottom: 2px solid #007ad9;\n    }}\n\n    QListWidget {{\n        border: 1px solid #a8a8a8;\n        border-radius: 3px;\n        background-color: #2a2a2a;\n        color: #ffffff;\n        outline: none;\n    }}\n\n    QListWidget::item {{\n        border-left: 3px solid transparent;\n    }}\n\n    QListWidget::item:hover {{\n        background-color: #2f2f2f;\n    }}\n\n    QListWidget::item:selected {{\n        color: #ffffff;\n        background-color: #3a3a3a;\n        border-left: 3px solid #0080e3;\n    }}\n\n    QScrollBar:vertical {{\n        background-color: #2f2f2f;\n        width: 15px;\n        margin: 15px 0 15px 0;\n    }}\n\n    QScrollBar::handle:vertical {{\n        background-color: #636363;\n        min-height: 20px;\n        border-radius: 3px;\n        margin: 0 4px 0 4px;\n    }}\n\n    QScrollBar::handle:vertical:hover {{\n        background-color: #6f6f6f;\n    }}\n\n    QScrollBar::handle:vertical:pressed {{\n        background-color: #5c5c5c;\n    }}\n\n    QScrollBar::sub-line:vertical {{\n        image: url({scroll_bar_top});\n        background-color: #2f2f2f;\n        height: 15px;\n        border-top-left-radius: 7px;\n        border-top-right-radius: 7px;\n        subcontrol-position: top;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-line:vertical {{\n        image: url({scroll_bar_bottom});\n        background-color: #2f2f2f;\n        height: 15px;\n        border-bottom-left-radius: 7px;\n        border-bottom-right-radius: 7px;\n        subcontrol-position: bottom;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {{\n        background: none;\n    }}\n\n    QScrollBar:horizontal {{\n        background-color: #2f2f2f;\n        height: 15px;\n        margin: 0 15px 0 15px;\n    }}\n\n    QScrollBar::handle:horizontal {{\n        background-color: #636363;\n        min-width: 20px;\n        border-radius: 3px;\n        margin: 4px 0 4px 0;\n    }}\n\n    QScrollBar::handle:horizontal:hover {{\n        background-color: #6f6f6f;\n    }}\n\n    QScrollBar::handle:horizontal:pressed {{\n        background-color: #5c5c5c;\n    }}\n\n    QScrollBar::sub-line:horizontal {{\n        image: url({scroll_bar_left});\n        background-color: #2f2f2f;\n        width: 15px;\n        border-top-left-radius: 7px;\n        border-bottom-left-radius: 7px;\n        subcontrol-position: left;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-line:horizontal {{\n        image: url({scroll_bar_right});\n        background-color: #2f2f2f;\n        width: 15px;\n        border-top-right-radius: 7px;\n        border-bottom-right-radius: 7px;\n        subcontrol-position: right;\n        subcontrol-origin: margin;\n    }}\n\n    QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {{\n        background: none;\n    }}\n\n    QTabWidget::pane {{\n        border-top: 2px solid #2e2e2e;\n    }}\n\n    QTabBar::tab {{\n        background-color: #2a2a2a;\n        color: #FFFFFF;\n        padding: 10px;\n        border-radius: 3px;\n    }}\n\n    QTabBar::tab:hover {{\n        background-color: #3a3a3a;\n    }}\n\n    QTabBar::tab:selected {{\n        background-color: #4a4a4a;\n        color: #FFFFFF;\n        font-weight: bold;\n        border-bottom: 2px solid #0080e3;\n    }}\n\n    QProgressBar {{\n        border: 1px solid #555555;\n        border-radius: 3px;\n        background-color: #2a2a2a;\n        text-align: center;\n        color: #FFFFFF;\n    }}\n\n    QProgressBar::chunk {{\n        background-color: #0080e3;\n        width: 1px; \n    }}\n\"\"\"\n"
  },
  {
    "path": "src/scripts/threads/download_base_thread.py",
    "content": "import json\nimport os\nimport re\nimport string\nfrom urllib.parse import urlparse, unquote\nimport uuid\nimport warnings\n\nimport cloudscraper\nfrom fuzzywuzzy import process\nfrom PyQt6.QtCore import QThread, pyqtSignal\nimport requests\nfrom urllib3.exceptions import InsecureRequestWarning\nimport zhon\n\nfrom config import *\n\nwarnings.simplefilter(\"ignore\", InsecureRequestWarning)\n\n\nclass DownloadBaseThread(QThread):\n    message = pyqtSignal(str, str)\n    messageBox = pyqtSignal(str, str, str)\n    progress = pyqtSignal(int, int)\n    finished = pyqtSignal(int)\n\n    trainer_urls = []  # [{\"game_name\": str, \"trainer_name\": str, \"origin\": str, \"author\": str, \"custom_name\": str, \"url\": download url, \"version\": YYYY.MM.DD},]\n    headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36\",\n        \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\n    }\n\n    def __init__(self, parent=None):\n        super().__init__(parent)\n        self.html_content = \"\"\n        self.downloaded_file_path = \"\"\n\n    def get_webpage_content(self, url, verify=True, use_cloudScraper=False):\n        if not self.is_internet_connected():\n            return \"\"\n\n        try:\n            if use_cloudScraper:\n                scraper = cloudscraper.create_scraper()\n                req = scraper.get(url, headers=self.headers, verify=verify)\n                req.raise_for_status()\n            else:\n                req = requests.get(url, headers=self.headers, verify=verify)\n                req.raise_for_status()\n        except Exception as e:\n            print(f\"Error requesting {url}: {str(e)}\")\n            return \"\"\n\n        self.html_content = req.text\n\n        return self.html_content\n\n    def request_download(self, url, download_path, verify=True, use_cloudScraper=False):\n        try:\n            if use_cloudScraper:\n                scraper = cloudscraper.create_scraper()\n                req = scraper.get(url, headers=self.headers, verify=verify, stream=True, timeout=30)\n                req.raise_for_status()\n            else:\n                req = requests.get(url, headers=self.headers, verify=verify, stream=True, timeout=30)\n                req.raise_for_status()\n        except Exception as e:\n            print(f\"Error requesting {url}: {str(e)}\")\n            return \"\"\n\n        file_path = os.path.join(download_path, self.find_download_fname(req))\n        total_size = int(req.headers.get('content-length', 0))\n        downloaded = 0\n        try:\n            with open(file_path, \"wb\") as f:\n                for chunk in req.iter_content(chunk_size=8192):\n                    if chunk:\n                        f.write(chunk)\n                        downloaded += len(chunk)\n                        self.progress.emit(downloaded, total_size)\n        except Exception as e:\n            print(f\"Error during download stream: {str(e)}\")\n            if os.path.exists(file_path):\n                os.remove(file_path)\n            return \"\"\n        self.downloaded_file_path = file_path\n\n        return self.downloaded_file_path\n\n    @staticmethod\n    def find_download_fname(response):\n        content_disposition = response.headers.get('content-disposition')\n        if content_disposition:\n            if \"filename*=\" in content_disposition:\n                filename_encoded = content_disposition.split(\"filename*=\")[-1].strip('\";')\n                if filename_encoded.startswith(\"UTF-8''\"):\n                    filename_encoded = filename_encoded[len(\"UTF-8''\"):]\n                filename = unquote(filename_encoded)\n                return filename\n\n            if \"filename=\" in content_disposition:\n                filename = content_disposition.split(\"filename=\")[-1].strip('\";')\n                return filename\n\n        return urlparse(response.url).path.split(\"/\")[-1]\n\n    @staticmethod\n    def get_signed_download_url(file_path_on_s3):\n        if not SIGNED_URL_DOWNLOAD_ENDPOINT or not CLIENT_API_KEY:\n            print(\"Error: API endpoint or Client API Key is not configured.\")\n            return None\n\n        headers = {\n            'x-api-key': CLIENT_API_KEY\n        }\n        params = {\n            'filePath': file_path_on_s3\n        }\n\n        try:\n            response = requests.get(SIGNED_URL_DOWNLOAD_ENDPOINT, headers=headers, params=params, timeout=15)\n            response.raise_for_status()\n\n            data = response.json()\n            signed_url = data.get('signedUrl')\n            if signed_url:\n                return signed_url\n            else:\n                print(f\"Error: 'signedUrl' not found in response. Response: {data}\")\n                return None\n\n        except Exception as e:\n            print(f\"Error retrieving signed URL: {str(e)}\")\n        return None\n\n    @staticmethod\n    def get_signed_upload_url(file_path_on_s3, metadata_json):\n        if not SIGNED_URL_UPLOAD_ENDPOINT or not CLIENT_API_KEY:\n            print(\"Error: API endpoint or Client API Key is not configured.\")\n            return None\n\n        # add uniqueness to file\n        file_path, file_ext = os.path.splitext(file_path_on_s3)\n        file_path_on_s3 = os.path.join(\"trainers\", f\"{os.path.basename(file_path)}_{uuid.uuid4().hex}{file_ext}\").replace(\"\\\\\", \"/\")\n\n        headers = {\n            'x-api-key': CLIENT_API_KEY\n        }\n        params = {\n            'filePath': file_path_on_s3,\n            'metadata': metadata_json\n        }\n\n        try:\n            response = requests.get(SIGNED_URL_UPLOAD_ENDPOINT, headers=headers, params=params, timeout=15)\n            response.raise_for_status()\n            return response.json()\n\n        except Exception as e:\n            print(f\"Error retrieving signed URL: {str(e)}\")\n        return None\n\n    @staticmethod\n    def is_internet_connected(urls=None, timeout=5):\n        if urls is None:\n            urls = [\n                \"https://www.bing.com/\",\n                \"https://www.baidu.com/\",\n                \"http://www.google.com/\",\n                \"https://www.apple.com/\",\n                \"https://www.wechat.com/\"\n            ]\n\n        for url in urls:\n            try:\n                response = requests.head(url, timeout=timeout)\n                response.raise_for_status()\n                return True\n            except requests.RequestException:\n                continue\n        return False\n\n    @staticmethod\n    def arabic_to_roman(num):\n        if num == 0:\n            return '0'\n\n        numeral_map = [\n            (1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'),\n            (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'),\n            (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')\n        ]\n        roman = ''\n\n        while num > 0:\n            for i, r in numeral_map:\n                while num >= i:\n                    roman += r\n                    num -= i\n\n        return roman\n\n    def sanitize(self, text):\n        text = re.sub(r'\\d+', lambda x: self.arabic_to_roman(int(x.group())), text)\n        all_punctuation = string.punctuation + zhon.hanzi.punctuation\n        return ''.join(char for char in text if char not in all_punctuation and not char.isspace()).lower()\n\n    @staticmethod\n    def symbol_replacement(text):\n        return text.replace(': ', ' - ').replace(':', '-').replace(\"/\", \"_\").replace(\"?\", \"\")\n\n    def find_best_trainer_match(self, target_name, target_language, threshold=85):\n        trainer_details = self.load_json_content(\"translations.json\")\n        if not trainer_details:\n            raise ValueError(\"translations.json doesn't exist in the database path.\")\n\n        # Ignore cases where input trainer name and target language are the same\n        if is_chinese(target_name) and target_language == 'zh':\n            return None\n        elif not is_chinese(target_name) and target_language == 'en':\n            return None\n\n        # Handle cases where input trainer name and target language are different\n        sanitized_to_original_en = {}  # Key: sanitized English, Value: Chinese\n        sanitized_to_original_zh = {}  # Key: sanitized Chinese, Value: English\n        for trainer in trainer_details:\n            if 'en_US' in trainer and 'zh_CN' in trainer:\n                sanitized_en = self.sanitize(trainer['en_US'])\n                sanitized_zh = self.sanitize(trainer['zh_CN'])\n                sanitized_to_original_en[sanitized_en] = trainer['zh_CN']\n                sanitized_to_original_zh[sanitized_zh] = trainer['en_US']\n\n        # Determine the mapping and target based on the desired language\n        sanitized_target = self.sanitize(target_name)\n        if target_language == \"zh\":\n            sanitized_to_original = sanitized_to_original_en\n        elif target_language == \"en\":\n            sanitized_to_original = sanitized_to_original_zh\n\n        best_match, score = process.extractOne(sanitized_target, sanitized_to_original.keys())\n        if score >= threshold:\n            return sanitized_to_original[best_match]\n\n        return None\n\n    def translate_trainer(self, trainer):\n        \"\"\"\n        Dynamically builds the trainer name based on author, origin, and custom names.\n        Expects a dictionary: {\"game_name\": ..., \"origin\": ..., \"author\": ..., \"custom_name\": ..., \"custom_name_en\": ..., \"custom_name_zh\": ...}\n        \"\"\"\n        PREFIX_MAP = {\n            \"zh\": {\n                \"fling_main\": \"风灵\",\n                \"fling_archive\": \"风灵\",\n                \"xiaoxing\": \"小幸\",\n                \"the_cheat_script\": \"CT\",\n                \"ct_other\": \"CT\",\n                \"gcm\": \"GCM\",\n                \"other\": \"其他\"\n            },\n            \"en\": {\n                \"fling_main\": \"FL\",\n                \"fling_archive\": \"FL\",\n                \"xiaoxing\": \"XX\",\n                \"the_cheat_script\": \"CT\",\n                \"ct_other\": \"CT\",\n                \"gcm\": \"GCM\",\n                \"other\": \"OT\"\n            }\n        }\n\n        try:\n            game_name = trainer.get(\"game_name\", \"\")\n            origin = trainer.get(\"origin\", \"other\")\n            author = trainer.get(\"author\", \"\")\n            custom_name = trainer.get(\"custom_name\", \"\")\n            custom_name_en = trainer.get(\"custom_name_en\", \"\")\n            custom_name_zh = trainer.get(\"custom_name_zh\", \"\")\n\n            # 1. Determine Target Language\n            if settings[\"language\"] in [\"zh_CN\", \"zh_TW\"] and not settings[\"enSearchResults\"]:\n                lang_key = \"zh\"\n            else:\n                lang_key = \"en\"\n\n            # 2. Determine Prefix (Author > Built-in Origin Map)\n            if author:\n                prefix = f\"[{author}]\"\n            else:\n                source_str = PREFIX_MAP[lang_key].get(origin, PREFIX_MAP[lang_key][\"other\"])\n                prefix = f\"[{source_str}]\" if source_str else \"\"\n\n            # 3. Translate Game Name\n            best_match = self.find_best_trainer_match(game_name, lang_key)\n            translated_game_name = best_match or game_name\n\n            # 4. Construct Final Name\n            if lang_key == \"zh\":\n                # Prioritize Chinese custom name, fallback to generic custom name, finally generic modifier\n                suffix = custom_name_zh or custom_name or \"修改器\"\n                trainerName = f\"{prefix}《{translated_game_name}》{suffix}\"\n            else:\n                # Prioritize English custom name, fallback to generic custom name, finally generic modifier\n                suffix = custom_name_en or custom_name or \"Trainer\"\n                trainerName = f\"{prefix} {translated_game_name} {suffix}\".strip()\n\n        except Exception as e:\n            print(f\"An error occurred while translating trainer name: {str(e)}\")\n            return None\n\n        return trainerName\n\n    @staticmethod\n    def save_html_content(content, file_name, overwrite=True):\n        html_file = os.path.join(DATABASE_PATH, file_name)\n        mode = 'w' if overwrite else 'a'\n        with open(html_file, mode, encoding='utf-8') as file:\n            file.write(content)\n\n    @staticmethod\n    def load_html_content(file_name):\n        html_file = os.path.join(DATABASE_PATH, file_name)\n        if os.path.exists(html_file):\n            try:\n                with open(html_file, 'r', encoding='utf-8') as file:\n                    return file.read()\n            except Exception as e:\n                print(f\"Error loading HTML content from {html_file}: {str(e)}\")\n                return \"\"\n        return \"\"\n\n    @staticmethod\n    def load_json_content(file_name, from_database=True):\n        json_file = os.path.join(DATABASE_PATH, file_name) if from_database else file_name\n        if os.path.exists(json_file):\n            try:\n                with open(json_file, 'r', encoding='utf-8') as file:\n                    return json.load(file)\n            except Exception as e:\n                print(f\"Error loading JSON content from {json_file}: {str(e)}\")\n                return \"\"\n        return \"\"\n"
  },
  {
    "path": "src/scripts/threads/download_display_thread.py",
    "content": "import concurrent.futures\nimport re\nimport time\nfrom urllib.parse import urljoin\n\nfrom bs4 import BeautifulSoup\nfrom fuzzywuzzy import fuzz\n\nfrom config import *\nfrom threads.download_base_thread import DownloadBaseThread\n\n\nclass DownloadDisplayThread(DownloadBaseThread):\n    def __init__(self, keyword, parent=None):\n        super().__init__(parent)\n        self.keyword = keyword\n        self.status_pause_time = 0.2\n\n    def run(self):\n        DownloadBaseThread.trainer_urls = []\n        keywordList = self.translate_keyword(self.keyword)\n        if not keywordList:\n            self.message.emit(tr(\"Failed to translate, please update translation data.\"), \"failure\")\n            self.finished.emit(1)\n            return\n        self.message.emit(tr(\"Searching...\"), None)\n\n        # ======================================================\n        # Fling\n        status = self.search_from_fling_archive(keywordList)\n        if not status:\n            self.finished.emit(1)\n            return\n        status = self.search_from_fling_main(keywordList)\n        if not status:\n            self.finished.emit(1)\n            return\n\n        # Filter and prioritize trainers from the main site\n        filtered_trainer_urls = {}\n        for trainer in DownloadBaseThread.trainer_urls:\n            norm_name = self.sanitize(trainer[\"game_name\"])\n\n            # Add trainer if not already present or replace only if from fling_main and current is from fling_archive\n            if norm_name not in filtered_trainer_urls:\n                filtered_trainer_urls[norm_name] = trainer\n            elif trainer[\"origin\"] == \"fling_main\" and filtered_trainer_urls[norm_name][\"origin\"] == \"fling_archive\":\n                filtered_trainer_urls[norm_name] = trainer\n\n        # Update trainer_urls with filtered and deduplicated results\n        DownloadBaseThread.trainer_urls = list(filtered_trainer_urls.values())\n\n        # ======================================================\n        # XiaoXing\n        if settings[\"enableXiaoXing\"]:\n            status = self.search_from_xiaoxing(keywordList)\n            if not status:\n                self.finished.emit(1)\n                return\n\n        # ======================================================\n        # CT\n        if settings[\"enableCT\"]:\n            status = self.search_from_ct(keywordList)\n            if not status:\n                self.finished.emit(1)\n                return\n\n        # ======================================================\n        # GCM\n        if settings[\"enableGCM\"]:\n            status = self.search_from_gcm(keywordList)\n            if not status:\n                self.finished.emit(1)\n                return\n\n        # ======================================================\n        # Finalize\n        self.message.emit(tr(\"Translating search results...\"), None)\n        with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:\n            futures = {\n                executor.submit(self.translate_trainer, trainer): trainer\n                for trainer in DownloadBaseThread.trainer_urls\n            }\n\n        # Update the translated names\n        for future in concurrent.futures.as_completed(futures):\n            trainer = futures[future]\n            if not future.result():\n                self.message.emit(tr(\"Failed to translate, please update translation data.\"), \"failure\")\n                self.finished.emit(1)\n                return\n            trainer[\"trainer_name\"] = future.result()\n\n        if not DownloadBaseThread.trainer_urls:\n            self.message.emit(tr(\"No search results found.\"), \"failure\")\n            self.finished.emit(1)\n            return\n\n        # Sort based on translated names\n        sort_key_func = sort_trainers_key if settings[\"sortByOrigin\"] else sort_trainers_key_ignore_prefix\n        DownloadBaseThread.trainer_urls.sort(key=lambda trainer: sort_key_func(trainer[\"trainer_name\"]))\n\n        self.message.emit(\"\", \"clear\")\n        for count, trainer in enumerate(DownloadBaseThread.trainer_urls, start=1):\n            self.message.emit(f\"{count}. {trainer['trainer_name']}\", \"result\")\n            print(f\"{count}. {trainer['game_name']} | {trainer['trainer_name']} | {trainer['url']}\")\n\n        self.finished.emit(0)\n\n    def translate_keyword(self, keyword):\n        translations = [keyword]\n        self.message.emit(tr(\"Translating keywords...\"), None)\n\n        # Load trainer translations from the JSON database\n        trainer_details = self.load_json_content(\"translations.json\")\n        if trainer_details:\n            for trainer in trainer_details:\n                sanitized_keyword = self.sanitize(keyword)\n                if is_chinese(keyword):\n                    if sanitized_keyword in self.sanitize(trainer.get(\"zh_CN\", \"\")):\n                        translations.append(trainer.get(\"en_US\", \"\"))\n                else:\n                    if sanitized_keyword in self.sanitize(trainer.get(\"en_US\", \"\")):\n                        translations.append(trainer.get(\"zh_CN\", \"\"))\n        else:\n            return []\n\n        translations = list(filter(None, set(translations)))\n        print(\"\\nKeyword translations:\", translations, \"\\n\")\n        return translations\n\n    def keyword_match(self, keywordList, targetString):\n        def is_match(sanitized_keyword, sanitized_targetString):\n            similarity_threshold = 80\n            similarity = fuzz.partial_ratio(sanitized_keyword, sanitized_targetString)\n            return similarity >= similarity_threshold\n\n        sanitized_targetString = self.sanitize(targetString)\n\n        return any(is_match(self.sanitize(kw), sanitized_targetString) for kw in keywordList if len(kw) >= 2 and len(sanitized_targetString) >= 2)\n\n    def search_from_fling_archive(self, keywordList):\n        if settings[\"flingDownloadServer\"] == \"official\":\n            page_content = self.load_html_content(\"fling_archive.html\")\n            archiveData = BeautifulSoup(page_content, 'html.parser') if page_content else None\n        elif settings[\"flingDownloadServer\"] == \"gcm\":\n            archiveData = self.load_json_content(\"fling_archive.json\")\n\n        if not archiveData:\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        try:\n            if settings[\"flingDownloadServer\"] == \"official\":\n                for link in archiveData.find_all(target=\"_self\"):\n                    # parse trainer name\n                    rawTrainerName = link.get_text()\n                    parsedTrainerName = re.sub(r' v[\\d.]+.*|\\.\\bv.*| \\d+\\.\\d+\\.\\d+.*| Plus\\s\\d+.*|Build\\s\\d+.*|(\\d+\\.\\d+-Update.*)|Update\\s\\d+.*|\\(Update\\s.*| Early Access .*|\\.Early.Access.*', '', rawTrainerName).replace(\"_\", \": \")\n                    gameName = parsedTrainerName.strip()\n                    ignored_trainers = {\n                        \"Dying Light The Following Enhanced Edition\",\n                        \"Monster Hunter World\",\n                        \"Street Fighter V\",\n                        \"World War Z\"\n                    }\n                    if gameName == \"Bright.Memory.Episode.1\":\n                        gameName = \"Bright Memory: Episode 1\"\n                    if gameName in ignored_trainers:\n                        continue\n                    url = urljoin(\"https://archive.flingtrainer.com/\", link.get(\"href\"))\n\n                    if self.keyword_match(keywordList, gameName):\n                        DownloadBaseThread.trainer_urls.append({\n                            \"game_name\": gameName,\n                            \"trainer_name\": None,\n                            \"origin\": \"fling_archive\",\n                            \"author\": \"\",\n                            \"custom_name\": \"\",\n                            \"custom_name_en\": \"\",\n                            \"custom_name_zh\": \"\",\n                            \"url\": url,\n                            \"version\": \"\",\n                            \"extension\": \"\"\n                        })\n\n            elif settings[\"flingDownloadServer\"] == \"gcm\":\n                for trainer in archiveData:\n                    gameName = trainer.get('game_name')\n                    url = trainer.get('gcm_url')\n\n                    if gameName and self.keyword_match(keywordList, gameName):\n                        DownloadBaseThread.trainer_urls.append({\n                            \"game_name\": gameName,\n                            \"trainer_name\": None,\n                            \"origin\": \"fling_archive\",\n                            \"author\": \"\",\n                            \"custom_name\": \"\",\n                            \"custom_name_en\": \"\",\n                            \"custom_name_zh\": \"\",\n                            \"url\": url,\n                            \"version\": \"\",\n                            \"extension\": \"\"\n                        })\n\n        except Exception as e:\n            print(f\"Error processing FLiNG archive data: {e}\")\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        self.message.emit(tr(\"Search from FLiNG success!\") + \" 1/2\", \"success\")\n        time.sleep(self.status_pause_time)\n\n        return True\n\n    def search_from_fling_main(self, keywordList):\n        # Search for results from fling main site, prioritized, will replace same trainer from archive\n        if settings[\"flingDownloadServer\"] == \"official\":\n            page_content = self.load_html_content(\"fling_main.html\")\n            mainSiteData = BeautifulSoup(page_content, 'html.parser') if page_content else None\n        elif settings[\"flingDownloadServer\"] == \"gcm\":\n            mainSiteData = self.load_json_content(\"fling_main.json\")\n\n        if not mainSiteData:\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        try:\n            if settings[\"flingDownloadServer\"] == \"official\":\n                for letter_section in mainSiteData.find_all(class_='letter-section'):\n                    for ul in letter_section.find_all('ul'):\n                        for li in ul.find_all('li'):\n                            for link in li.find_all('a'):\n                                rawTrainerName = link.get_text().strip()\n                                gameName = rawTrainerName.rsplit(\" Trainer\", 1)[0]\n                                url = link.get(\"href\")\n\n                                if gameName and self.keyword_match(keywordList, gameName):\n                                    DownloadBaseThread.trainer_urls.append({\n                                        \"game_name\": gameName,\n                                        \"trainer_name\": None,\n                                        \"origin\": \"fling_main\",\n                                        \"author\": \"\",\n                                        \"custom_name\": \"\",\n                                        \"custom_name_en\": \"\",\n                                        \"custom_name_zh\": \"\",\n                                        \"url\": url,\n                                        \"version\": \"\",\n                                        \"extension\": \"\"\n                                    })\n\n            elif settings[\"flingDownloadServer\"] == \"gcm\":\n                for trainer in mainSiteData:\n                    gameName = trainer.get('game_name')\n                    url = trainer.get('gcm_url')\n                    version = trainer.get('version', '')\n\n                    if gameName and self.keyword_match(keywordList, gameName):\n                        DownloadBaseThread.trainer_urls.append({\n                            \"game_name\": gameName,\n                            \"trainer_name\": None,\n                            \"origin\": \"fling_main\",\n                            \"author\": \"\",\n                            \"custom_name\": \"\",\n                            \"custom_name_en\": \"\",\n                            \"custom_name_zh\": \"\",\n                            \"url\": url,\n                            \"version\": version,\n                            \"extension\": \"\"\n                        })\n\n        except Exception as e:\n            print(f\"Error processing FLiNG main site data: {e}\")\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        self.message.emit(tr(\"Search from FLiNG success!\") + \" 2/2\", \"success\")\n        time.sleep(self.status_pause_time)\n\n        return True\n\n    def search_from_xiaoxing(self, keywordList):\n        xiaoXingData = self.load_json_content(\"xiaoxing.json\")\n\n        if not xiaoXingData:\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        try:\n            for trainer in xiaoXingData:\n                gameName = trainer.get('game_name')\n                url = trainer.get('gcm_url')\n                version = trainer.get('version', '')\n\n                if gameName and self.keyword_match(keywordList, gameName):\n                    DownloadBaseThread.trainer_urls.append({\n                        \"game_name\": gameName,\n                        \"trainer_name\": None,\n                        \"origin\": \"xiaoxing\",\n                        \"author\": \"\",\n                        \"custom_name\": \"\",\n                        \"custom_name_en\": \"\",\n                        \"custom_name_zh\": \"\",\n                        \"url\": url,\n                        \"version\": version,\n                        \"extension\": \"\"\n                    })\n\n        except Exception as e:\n            print(f\"Error processing XiaoXing data: {e}\")\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        self.message.emit(tr(\"Search from XiaoXing success!\"), \"success\")\n        time.sleep(self.status_pause_time)\n\n        return True\n\n    def search_from_ct(self, keywordList):\n        CTData = self.load_json_content(\"cheat_table.json\")\n\n        if not CTData:\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        try:\n            for trainer in CTData:\n                gameName = trainer.get('game_name')\n                url = trainer.get('gcm_url')\n                version = trainer.get('version', '')\n                author = trainer.get('author', '')\n                custom_name = trainer.get('custom_name', '')\n                custom_name_en = trainer.get('custom_name_en', '')\n                custom_name_zh = trainer.get('custom_name_zh', '')\n\n                if gameName and self.keyword_match(keywordList, gameName):\n                    DownloadBaseThread.trainer_urls.append({\n                        \"game_name\": gameName,\n                        \"trainer_name\": None,\n                        \"origin\": \"the_cheat_script\",\n                        \"author\": author,\n                        \"custom_name\": custom_name,\n                        \"custom_name_en\": custom_name_en,\n                        \"custom_name_zh\": custom_name_zh,\n                        \"url\": url,\n                        \"version\": version,\n                        \"extension\": \"\"\n                    })\n\n        except Exception as e:\n            print(f\"Error processing CT data: {e}\")\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        self.message.emit(tr(\"Search from CT success!\"), \"success\")\n        time.sleep(self.status_pause_time)\n\n        return True\n\n    def search_from_gcm(self, keywordList):\n        GCMData = self.load_json_content(\"gcm_trainers.json\")\n\n        if not GCMData:\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        try:\n            for trainer in GCMData:\n                gameName = trainer.get('game_name')\n                url = trainer.get('gcm_url')\n                version = trainer.get('version', '')\n                origin = trainer.get('origin')\n                author = trainer.get('author', '')\n                custom_name = trainer.get('custom_name', '')\n                custom_name_en = trainer.get('custom_name_en', '')\n                custom_name_zh = trainer.get('custom_name_zh', '')\n                extension = trainer.get('extension', '')\n\n                if gameName and self.keyword_match(keywordList, gameName):\n                    DownloadBaseThread.trainer_urls.append({\n                        \"game_name\": gameName,\n                        \"trainer_name\": None,\n                        \"origin\": origin,  # could be \"gcm\", \"other\", or \"ct_other\"\n                        \"author\": author,\n                        \"custom_name\": custom_name,\n                        \"custom_name_en\": custom_name_en,\n                        \"custom_name_zh\": custom_name_zh,\n                        \"url\": url,\n                        \"version\": version,\n                        \"extension\": extension\n                    })\n\n        except Exception as e:\n            print(f\"Error processing GCM data: {e}\")\n            self.message.emit(tr(\"Search failed, please update trainer search data.\"), \"failure\")\n            return False\n\n        self.message.emit(tr(\"Search from GCM success!\"), \"success\")\n        time.sleep(self.status_pause_time)\n\n        return True\n"
  },
  {
    "path": "src/scripts/threads/download_trainers_thread.py",
    "content": "import os\nimport re\nimport shutil\nimport stat\nimport subprocess\nimport time\n\nfrom bs4 import BeautifulSoup\n\nfrom config import *\nfrom threads.download_base_thread import DownloadBaseThread\n\n\nclass DownloadTrainersThread(DownloadBaseThread):\n    def __init__(self, index, trainers, trainerDownloadPath, update_entry, parent=None):\n        super().__init__(parent)\n        self.index = index\n        self.trainers = trainers\n        self.trainerDownloadPath = trainerDownloadPath\n        self.update_entry = update_entry\n        self.download_finish_delay = 0.5\n        self.update_error_delay = 3\n\n    def run(self):\n        self.message.emit(tr(\"Checking for internet connection...\"), None)\n        if not self.is_internet_connected():\n            self.message.emit(tr(\"No internet connection, download failed.\"), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return\n\n        if os.path.exists(DOWNLOAD_TEMP_DIR):\n            shutil.rmtree(DOWNLOAD_TEMP_DIR)\n        os.makedirs(DOWNLOAD_TEMP_DIR, exist_ok=True)\n\n        self.src_dst = []  # List content: { \"src\": source_path, \"dst\": destination_path, \"version\": YYYY.MM.DD }\n        self.instructionDst = \"\"\n        selected_trainer = None\n        if not self.update_entry:\n            selected_trainer = DownloadBaseThread.trainer_urls[self.index]\n        else:\n            selected_trainer = self.update_entry\n        origin = selected_trainer[\"origin\"]\n\n        result = True\n        if origin == \"fling_main\" or origin == \"fling_archive\":\n            result = self.download_fling(selected_trainer)\n        elif origin == \"xiaoxing\":\n            result = self.download_xiaoxing(selected_trainer)\n        elif origin in [\"the_cheat_script\", \"ct_other\", \"gcm\", \"other\"]:\n            result = self.download_default(selected_trainer)\n\n        try:\n            for item in self.src_dst:\n                if os.path.exists(item[\"dst\"]):\n                    os.chmod(item[\"dst\"], stat.S_IWRITE)\n                if os.path.isfile(item['src']):\n                    dst_dir = os.path.dirname(item[\"dst\"])\n                    os.makedirs(dst_dir, exist_ok=True)\n                else:\n                    dst_dir = item[\"dst\"]\n                shutil.move(item[\"src\"], item[\"dst\"])\n\n                if dst_dir != self.instructionDst:\n                    info_dict = {\n                        \"game_name\": selected_trainer[\"game_name\"],\n                        \"origin\": selected_trainer[\"origin\"]\n                    }\n                    if selected_trainer.get(\"version\"):\n                        info_dict[\"version\"] = selected_trainer[\"version\"]\n                    if selected_trainer[\"origin\"] in [\"other\", \"ct_other\"]:\n                        info_dict[\"gcm_url\"] = selected_trainer[\"url\"]\n                    if selected_trainer.get(\"extension\"):\n                        info_dict[\"extension\"] = selected_trainer[\"extension\"]\n\n                    with open(os.path.join(dst_dir, \"gcm_info.json\"), \"w\", encoding=\"utf-8\") as info_file:\n                        json.dump(info_dict, info_file, ensure_ascii=False, indent=4)\n\n            rhLog = os.path.join(DOWNLOAD_TEMP_DIR, \"rh.log\")\n            if os.path.exists(rhLog):\n                os.remove(rhLog)\n\n            if self.instructionDst and not self.update_entry:\n                self.messageBox.emit(\"info\", tr(\"Attention\"), tr(\"This trainer requires additional setup before use. Please check the opened folder for instructions.\\nThe instructions are always stored in the 'gcm-instructions' folder.\"))\n                os.startfile(self.instructionDst)\n\n        except PermissionError as e:\n            self.message.emit(tr(\"Trainer is currently in use, please close any programs using the file and try again.\"), \"failure\")\n            time.sleep(self.update_error_delay)\n            self.finished.emit(1)\n            return\n        except Exception as e:\n            self.message.emit(tr(\"An error occurred when moving trainer: \") + str(e), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return\n\n        if result:\n            self.message.emit(tr(\"Download success!\"), \"success\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(0)\n\n    def modify_fling_settings(self, removeBgMusic):\n        # replace bg music in Documents folder\n        username = os.getlogin()\n        flingSettings_path = f\"C:/Users/{username}/Documents/FLiNGTrainer\"\n        bgMusic_path = os.path.join(flingSettings_path, \"TrainerBGM.mid\")\n        if os.path.exists(bgMusic_path):\n            if settings[\"removeFlingBgMusic\"]:\n                shutil.copyfile(emptyMidi_path, bgMusic_path)\n            else:\n                os.remove(bgMusic_path)\n\n        # change fling settings to disable startup music\n        settingFiles = [\n            os.path.join(flingSettings_path, \"FLiNGTSettings.ini\"),\n            os.path.join(flingSettings_path, \"TrainerSettings.ini\")\n        ]\n\n        for settingFile in settingFiles:\n            if not os.path.exists(settingFile):\n                continue\n            with open(settingFile, 'r', encoding='utf-8') as file:\n                lines = file.readlines()\n\n            # Update the OnLoadMusic setting\n            with open(settingFile, 'w', encoding='utf-8') as file:\n                for line in lines:\n                    if line.strip().startswith('OnLoadMusic'):\n                        if os.path.basename(settingFile) == \"FLiNGTSettings.ini\":\n                            if removeBgMusic:\n                                file.write('OnLoadMusic = False\\n')\n                            else:\n                                file.write('OnLoadMusic = True\\n')\n                        elif os.path.basename(settingFile) == \"TrainerSettings.ini\":\n                            if removeBgMusic:\n                                file.write('OnLoadMusic=False\\n')\n                            else:\n                                file.write('OnLoadMusic=True\\n')\n                    else:\n                        file.write(line)\n\n    def remove_bgMusic(self, source_exe, resource_type_list):\n        # Base case\n        if not resource_type_list:\n            return\n\n        resource_type = resource_type_list.pop(0)\n\n        # Define paths and files\n        tempLog = os.path.join(DOWNLOAD_TEMP_DIR, \"rh.log\")\n\n        # Remove background music from executable\n        command = [resourceHacker_path, \"-open\", source_exe, \"-save\", source_exe,\n                   \"-action\", \"delete\", \"-mask\", f\"{resource_type},,\", \"-log\", tempLog]\n        subprocess.run(command, creationflags=subprocess.CREATE_NO_WINDOW)\n\n        # Read the log file\n        with open(tempLog, 'r', encoding='utf-16-le') as file:\n            log_content = file.read()\n\n        # Check for deleted resource in log\n        pattern = r\"Deleted:\\s*(\\w+),(\\d+),(\\d+)\"\n        match = re.search(pattern, log_content)\n\n        if match:\n            # Resource was deleted; prepare to add the empty midi\n            resource_id = match.group(2)\n            locale_id = match.group(3)\n            resource = \",\".join([resource_type, resource_id, locale_id])\n            command = [resourceHacker_path, \"-open\", source_exe, \"-save\", source_exe,\n                       \"-action\", \"addoverwrite\", \"-res\", emptyMidi_path, \"-mask\", resource]\n            subprocess.run(command, creationflags=subprocess.CREATE_NO_WINDOW)\n        else:\n            # Try the next resource type if any remain\n            self.remove_bgMusic(source_exe, resource_type_list)\n\n    def download_fling(self, selected_trainer):\n        if self.update_entry:\n            trainerName_display = selected_trainer[\"trainer_name\"]\n            self.message.emit(tr(\"Updating \") + trainerName_display + \"...\", None)\n        else:\n            trainerName_display = self.symbol_replacement(selected_trainer[\"trainer_name\"])\n            # Trainer duplication check\n            for trainerPath in self.trainers.keys():\n                if trainerName_display == os.path.splitext(os.path.basename(trainerPath))[0]:\n                    self.message.emit(tr(\"Trainer already exists, aborted download.\"), \"failure\")\n                    time.sleep(self.download_finish_delay)\n                    self.finished.emit(1)\n                    return False\n\n        # Download trainer\n        self.message.emit(tr(\"Downloading...\"), \"download\")\n        try:\n            targetUrl = selected_trainer[\"url\"]\n\n            # Additional trainer file extraction for trainers from main site\n            if settings[\"flingDownloadServer\"] == \"official\" and not self.update_entry:\n                if selected_trainer['origin'] == \"fling_main\":\n                    page_content = self.get_webpage_content(targetUrl)\n                    trainerPage = BeautifulSoup(page_content, 'html.parser')\n                    targetObj = trainerPage.find(lambda tag: tag.get('target') == '_self' and 'flingtrainer.com' in tag.get('href'))\n                    if not targetObj:\n                        raise Exception(tr(\"Failed to find trainer download link.\"))\n                    targetUrl = targetObj.get(\"href\")\n                    div_entry = trainerPage.find('div', class_='entry')\n                    if div_entry:\n                        pattern = r'options.*game\\s*version.*last\\s*updated:\\s*(\\d{4}\\.[0-1]?\\d\\.[0-3]?\\d)'\n                        match = re.search(pattern, div_entry.get_text(separator=' ', strip=True), re.IGNORECASE)\n                        if match:\n                            version = match.group(1)\n                    if not version:\n                        raise Exception(tr(\"Failed to find trainer version.\"))\n                    selected_trainer[\"version\"] = version\n\n            # Download trainers from gcm server\n            elif settings[\"flingDownloadServer\"] == \"gcm\" or self.update_entry:\n                targetUrl = self.get_signed_download_url(targetUrl)\n\n            trainerTemp = self.request_download(targetUrl, DOWNLOAD_TEMP_DIR)\n            if not trainerTemp:\n                raise Exception(tr(\"Internet request failed.\"))\n\n        except Exception as e:\n            self.message.emit(tr(\"An error occurred while downloading trainer: \") + str(e), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return False\n\n        # Extract compressed file and rename\n        if os.path.splitext(trainerTemp)[1] in [\".zip\", \".rar\"]:\n            self.message.emit(tr(\"Decompressing...\"), None)\n            try:\n                command = [unzip_path, \"x\", \"-y\", trainerTemp, f\"-o{DOWNLOAD_TEMP_DIR}\"]\n                subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n\n            except Exception as e:\n                self.message.emit(tr(\"An error occurred while extracting downloaded trainer: \") + str(e), \"failure\")\n                time.sleep(self.download_finish_delay)\n                self.finished.emit(1)\n                return False\n\n        # Locate extracted .exe file\n        cnt = 0\n        extractedTrainerNames = []\n        extractedAntiCheatNames = []\n        for filename in os.listdir(DOWNLOAD_TEMP_DIR):\n            if \"trainer\" in filename.lower() and filename.endswith(\".exe\"):\n                extractedTrainerNames.append(filename)\n            # Count anti-cheat files\n            elif (\"trainer\" not in filename.lower() and filename != os.path.basename(trainerTemp)) and filename.lower() != \"info.txt\":\n                extractedAntiCheatNames.append(filename)\n                cnt += 1\n\n        # Warn user if anti-cheat files found\n        if cnt > 0:\n            self.instructionDst = os.path.join(self.trainerDownloadPath, trainerName_display, \"gcm-instructions\")\n            for antiCheatFile in extractedAntiCheatNames:\n                self.src_dst.append({\"src\": os.path.join(DOWNLOAD_TEMP_DIR, antiCheatFile), \"dst\": os.path.join(self.instructionDst, antiCheatFile)})\n\n        # Check if extracted trainer name is None\n        if not extractedTrainerNames:\n            self.message.emit(tr(\"Could not find the downloaded trainer file, please try turning your antivirus software off.\"), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return False\n\n        # Construct destination trainer name dict (may have multiple versions of a same game)\n        os.makedirs(self.trainerDownloadPath, exist_ok=True)\n        if len(extractedTrainerNames) > 1:\n            if self.update_entry:\n                trainerName_trans = self.translate_trainer(selected_trainer)\n                if not trainerName_trans:\n                    self.message.emit(tr(\"Failed to translate, please update translation data.\"), \"failure\")\n                    self.finished.emit(1)\n                    return\n                trainerName_display = self.symbol_replacement(trainerName_trans)\n\n            for extractedTrainerName in extractedTrainerNames:\n                trainer_details = \"\"\n                if selected_trainer['origin'] == \"fling_main\":\n                    pattern = r'trainer(.*)\\.exe'\n                    match = re.search(pattern, extractedTrainerName, re.IGNORECASE)\n                    if match:\n                        trainer_details = match.group(1)\n                else:\n                    pattern = r\"\\s+Update.*|\\s+v\\d+.*\"\n                    match = re.search(pattern, extractedTrainerName)\n                    if match:\n                        trainer_details = match.group().replace(\" Trainer\", \"\").rstrip(\".exe\")\n\n                trainer_name = f\"{trainerName_display}{trainer_details}\"\n\n                source_file = os.path.join(DOWNLOAD_TEMP_DIR, extractedTrainerName)\n                destination_file = os.path.join(self.trainerDownloadPath, trainer_name, extractedTrainerName)\n                self.src_dst.insert(0, {\"src\": source_file, \"dst\": destination_file})\n\n        else:\n            source_file = os.path.join(DOWNLOAD_TEMP_DIR, extractedTrainerNames[0])\n            destination_file = os.path.join(self.trainerDownloadPath, trainerName_display, extractedTrainerNames[0])\n            self.src_dst.insert(0, {\"src\": source_file, \"dst\": destination_file})\n\n        # remove fling trainer bg music\n        if settings[\"removeFlingBgMusic\"]:\n            self.message.emit(tr(\"Removing trainer background music...\"), None)\n            self.modify_fling_settings(True)\n            for item in self.src_dst:\n                if item[\"src\"].lower().endswith(\".exe\"):\n                    self.remove_bgMusic(item[\"src\"], [\"MID\", \"MIDI\"])\n        else:\n            self.modify_fling_settings(False)\n\n        # Delete original trainer file (could not preserve original file name due to multiple versions when updating)\n        if self.update_entry:\n            shutil.rmtree(selected_trainer['trainer_dir'])\n\n        if os.path.exists(trainerTemp) and os.path.basename(trainerTemp) not in extractedTrainerNames:\n            os.remove(trainerTemp)\n\n        return True\n\n    def download_xiaoxing(self, selected_trainer):\n        if self.update_entry:\n            trainerName_display = selected_trainer[\"trainer_name\"]\n            self.message.emit(tr(\"Updating \") + trainerName_display + \"...\", None)\n        else:\n            trainerName_display = self.symbol_replacement(selected_trainer[\"trainer_name\"])\n            # Trainer duplication check\n            for trainerPath in self.trainers.keys():\n                if self.symbol_replacement(selected_trainer[\"trainer_name\"]) == os.path.splitext(os.path.basename(trainerPath))[0]:\n                    self.message.emit(tr(\"Trainer already exists, aborted download.\"), \"failure\")\n                    time.sleep(self.download_finish_delay)\n                    self.finished.emit(1)\n                    return False\n\n        self.message.emit(tr(\"Downloading...\"), \"download\")\n        extractedContentPath = os.path.join(DOWNLOAD_TEMP_DIR, \"extracted\")\n        try:\n            signed_url = self.get_signed_download_url(selected_trainer['url'])\n            trainerTemp = self.request_download(signed_url, DOWNLOAD_TEMP_DIR)\n            if not trainerTemp:\n                raise Exception(tr(\"Internet request failed.\"))\n\n        except Exception as e:\n            self.message.emit(tr(\"An error occurred while downloading trainer: \") + str(e), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return False\n\n        # Extract compressed file\n        self.message.emit(tr(\"Decompressing...\"), None)\n        try:\n            command = [unzip_path, \"x\", \"-y\", trainerTemp, f\"-o{extractedContentPath}\"]\n            subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n\n        except Exception as e:\n            self.message.emit(tr(\"An error occurred while extracting downloaded trainer: \") + str(e), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return False\n\n        os.remove(trainerTemp)\n        if self.update_entry:\n            shutil.rmtree(selected_trainer['trainer_dir'])\n\n        if not self.handle_xiaoxing_special_cases(selected_trainer, extractedContentPath):\n            destination_path = os.path.join(self.trainerDownloadPath, trainerName_display)\n            self.src_dst.append({\"src\": extractedContentPath, \"dst\": destination_path})\n\n        if settings[\"unlockXiaoXing\"]:\n            self.unlock_xiaoxing(selected_trainer)\n\n        return True\n\n    def handle_xiaoxing_special_cases(self, selected_trainer, extractedContentPath):\n        # Multiple version case (check if there are only folders and no `.exe` files)\n        # Cases: ['Baldur's Gate 3']\n        temp_contents = os.listdir(extractedContentPath)\n        has_exe = any(file.lower().endswith(\".exe\") for file in temp_contents if os.path.isfile(os.path.join(extractedContentPath, file)))\n        only_folders = all(os.path.isdir(os.path.join(extractedContentPath, item)) for item in temp_contents)\n\n        if not has_exe and only_folders:\n            for folder_name in temp_contents:\n                source_path = os.path.join(extractedContentPath, folder_name)\n                destination_path = os.path.join(self.trainerDownloadPath, self.symbol_replacement(f\"{selected_trainer['trainer_name']} {folder_name}\"))\n                self.src_dst.append({\"src\": source_path, \"dst\": destination_path})\n            return True\n\n        # Double extraction case (check if there is no `.exe` and a `.rar` file exists)\n        # Cases: ['Sword and Fairy 6']\n        rar_file = next(\n            (file for file in temp_contents if file.lower().endswith(\".rar\") and os.path.isfile(os.path.join(extractedContentPath, file))),\n            None\n        )\n\n        if not has_exe and rar_file:\n            destination_path = os.path.join(self.trainerDownloadPath, self.symbol_replacement(selected_trainer[\"trainer_name\"]))\n            file_path = os.path.join(extractedContentPath, rar_file)\n            try:\n                command = [unzip_path, \"x\", \"-y\", f\"-p123\", file_path, f\"-o{extractedContentPath}\"]\n                subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n                os.remove(file_path)\n                self.src_dst.append({\"src\": extractedContentPath, \"dst\": destination_path})\n            except Exception as e:\n                self.message.emit(tr(\"An error occurred while extracting downloaded trainer: \") + str(e), \"failure\")\n                time.sleep(self.download_finish_delay)\n                self.finished.emit(1)\n            return True\n\n        return False\n\n    def handle_multi_version_archive(self, extractedContentPath, trainerName_display):\n        temp_contents = os.listdir(extractedContentPath)\n\n        # Check if there are any executables (.exe, .ct, .cetrainer, .png) in the root folder\n        has_executable_in_root = any(\n            file.lower().endswith((\".exe\", \".ct\", \".cetrainer\", \".png\"))\n            for file in temp_contents\n            if os.path.isfile(os.path.join(extractedContentPath, file))\n        )\n\n        folders = [item for item in temp_contents if os.path.isdir(os.path.join(extractedContentPath, item)) and item != \"gcm-instructions\"]\n\n        # If gcm-instructions exists at root, this is a single trainer package, not multi-version\n        if os.path.isdir(os.path.join(extractedContentPath, \"gcm-instructions\")):\n            return False\n\n        if not has_executable_in_root and len(folders) > 0:\n            for folder_name in folders:\n                source_path = os.path.join(extractedContentPath, folder_name)\n                # Add folder name as suffix\n                safe_folder_name = self.symbol_replacement(folder_name.strip())\n                destination_path = os.path.join(self.trainerDownloadPath, f\"{trainerName_display} {safe_folder_name}\")\n                self.src_dst.append({\"src\": source_path, \"dst\": destination_path})\n            return True\n\n        return False\n\n    def process_pattern_to_hex_and_mask(self, pattern_str):\n        hex_bytes = []\n        mask_bytes = []\n        for i in range(0, len(pattern_str), 2):\n            byte = pattern_str[i:i+2]\n            if byte == '??':\n                hex_bytes.append('00')\n                mask_bytes.append('00')\n            else:\n                hex_bytes.append(byte)\n                mask_bytes.append('ff')\n        return \" \".join(hex_bytes), \" \".join(mask_bytes)\n\n    def unlock_xiaoxing(self, selected_trainer):\n        exe_exclusions = [\"flashplayer_22.0.0.210_ax_debug.exe\"]\n        game_name = selected_trainer['game_name']\n        patches_to_apply = []\n\n        if game_name in [\"Cyberpunk 2077\"]:\n            patches_to_apply = [\n                {'search': \"833D????????000F84????????833D????????000F84????????\", 'replace': \"833D????????00909090909090833D????????00909090909090\"},\n                {'search': \"833D????????000F84????????BA2E\", 'replace': \"833D????????00909090909090BA2E\"},\n                {'search': \"833D????????000F85????????48C705\", 'replace': \"833D????????00E9F70300009048C705\"},\n                {'search': \"833D????????00740D833D????????000F85????????BAAC\", 'replace': \"833D????????009090833D????????00E9C700000090BAAC\"},\n                {'search': \"833D????????00740D833D????????000F85????????488D\", 'replace': \"833D????????009090833D????????00E90601000090488D\"}\n            ]\n        elif game_name in [\"Final Fantasy XV\", \"Ho Tu Lo Shu The Books of Dragon\", \"Xuan-Yuan Sword VII\"]:\n            patches_to_apply = [\n                {'search': \"E8????????833D????????000F84????????BA2E040000\", 'replace': \"??????????90909090909090909090909090??????????\"},\n                {'search': \"8D4A??E8????????833D????????000F84????????\", 'replace': \"????????????????90909090909090909090909090\"}\n            ]\n        elif game_name in [\"GuLong\", \"Palworld\", \"Baldur's Gate 3\", \"Starfield\", \"Hogwarts Legacy\", \"Sword and Fairy 7\", \"Path Of Wuxia\", \"Elden Ring\",\n                           \"Fate Seeker II\", \"Final Fantasy VII Remake Intergrade\", \"GuJian3\"]:\n            patches_to_apply = [\n                {'search': \"8B??E8??????00833D??????00000F84????0000\", 'replace': \"8B??E8??????00833D??????0000909090909090\"},\n                {'search': \"833D??????00000F84????????833D????????000F84????????\", 'replace': \"833D??????0000909090909090833D????????00909090909090\"}\n            ]\n        else:\n            return\n\n        self.message.emit(tr(\"Patching...\"), None)\n        for item in self.src_dst:\n            source_dir = item[\"src\"]\n            temp_contents = os.listdir(source_dir)\n\n            exe_file = next((file for file in temp_contents if os.path.isfile(os.path.join(source_dir, file)) and file.lower().endswith(\".exe\") and file not in exe_exclusions), None)\n\n            if exe_file:\n                original_file = os.path.join(source_dir, exe_file)\n                input_file = f\"{original_file}.patch_in\"\n                output_file = f\"{original_file}.patch_out\"\n                backup_file = f\"{original_file}.bak\"\n\n                shutil.copyfile(original_file, backup_file)\n                shutil.copyfile(original_file, input_file)\n\n                patch_success = True\n                for i, patch in enumerate(patches_to_apply):\n                    print(f\"Applying patch {i + 1}/{len(patches_to_apply)} for: {game_name}\")\n\n                    search_hex, search_mask = self.process_pattern_to_hex_and_mask(patch['search'])\n                    replace_hex, replace_mask = self.process_pattern_to_hex_and_mask(patch['replace'])\n\n                    try:\n                        command = [binmay_path, '-i', input_file, '-o', output_file, '-s', search_hex, '-S', search_mask, '-r', replace_hex, '-R', replace_mask]\n                        subprocess.run(command, check=True, capture_output=True, text=True, creationflags=subprocess.CREATE_NO_WINDOW)\n\n                        # The output of this patch becomes the input for the next\n                        os.remove(input_file)\n                        os.rename(output_file, input_file)\n\n                    except Exception as e:\n                        print(f\"An error occurred during XiaoXing patching: {e}\")\n                        shutil.copyfile(backup_file, original_file)\n                        patch_success = False\n                        break\n\n                # Cleanup temporary files\n                if os.path.exists(input_file):\n                    if patch_success:\n                        os.remove(original_file)\n                        os.rename(input_file, original_file)\n                        print(f\"Successfully applied all patches to: {exe_file}\\n\")\n                    else:\n                        os.remove(input_file)\n\n    def download_default(self, selected_trainer):\n        if self.update_entry:\n            trainerName_display = selected_trainer[\"trainer_name\"]\n            self.message.emit(tr(\"Updating \") + trainerName_display + \"...\", None)\n        else:\n            trainerName_display = self.symbol_replacement(selected_trainer[\"trainer_name\"])\n            # Trainer duplication check\n            for trainerPath in self.trainers.keys():\n                if self.symbol_replacement(selected_trainer[\"trainer_name\"]) == os.path.splitext(os.path.basename(trainerPath))[0]:\n                    self.message.emit(tr(\"Trainer already exists, aborted download.\"), \"failure\")\n                    time.sleep(self.download_finish_delay)\n                    self.finished.emit(1)\n                    return False\n\n        self.message.emit(tr(\"Downloading...\"), \"download\")\n        extractedContentPath = os.path.join(DOWNLOAD_TEMP_DIR, \"extracted\")\n        try:\n            signed_url = self.get_signed_download_url(selected_trainer['url'])\n            trainerTemp = self.request_download(signed_url, DOWNLOAD_TEMP_DIR)\n            if not trainerTemp:\n                raise Exception(tr(\"Internet request failed.\"))\n\n        except Exception as e:\n            self.message.emit(tr(\"An error occurred while downloading trainer: \") + str(e), \"failure\")\n            time.sleep(self.download_finish_delay)\n            self.finished.emit(1)\n            return False\n\n        # Extract compressed file if not single exe\n        extracted = False\n        if os.path.splitext(trainerTemp)[1] in [\".zip\", \".rar\"]:\n            extracted = True\n            self.message.emit(tr(\"Decompressing...\"), None)\n            try:\n                command = [unzip_path, \"x\", \"-y\", trainerTemp, f\"-o{extractedContentPath}\"]\n                subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n\n            except Exception as e:\n                self.message.emit(tr(\"An error occurred while extracting downloaded trainer: \") + str(e), \"failure\")\n                time.sleep(self.download_finish_delay)\n                self.finished.emit(1)\n                return False\n\n            os.remove(trainerTemp)\n\n        if self.update_entry:\n            shutil.rmtree(selected_trainer['trainer_dir'])\n\n        if extracted:\n            # Set instruction destination if gcm-instructions folder present at root\n            instructionsFolder = os.path.join(extractedContentPath, \"gcm-instructions\")\n            if os.path.isdir(instructionsFolder):\n                self.instructionDst = os.path.join(self.trainerDownloadPath, trainerName_display, \"gcm-instructions\")\n\n            # If the archive contains multiple version folders, split them up into multiple dest folders\n            if not self.handle_multi_version_archive(extractedContentPath, trainerName_display):\n                destination_path = os.path.join(self.trainerDownloadPath, trainerName_display)\n                self.src_dst.append({\"src\": extractedContentPath, \"dst\": destination_path})\n        else:\n            destination_path = os.path.join(self.trainerDownloadPath, trainerName_display)\n            self.src_dst.append({\"src\": trainerTemp, \"dst\": os.path.join(destination_path, os.path.basename(trainerTemp))})\n\n        return True\n"
  },
  {
    "path": "src/scripts/threads/other_threads.py",
    "content": "import os\nimport psutil\nimport re\nimport shutil\nimport stat\nimport subprocess\nimport time\n\nfrom PyQt6.QtCore import QThread, pyqtSignal\nimport requests\n\nfrom config import *\nfrom threads.download_base_thread import DownloadBaseThread\n\n\nclass AnnouncementFetchWorker(QThread):\n    announcementFetched = pyqtSignal(dict)\n    fetchFailed = pyqtSignal()\n\n    def run(self):\n        try:\n            signed_url = DownloadBaseThread.get_signed_download_url(\"GCM/Data/announcement.json\")\n            if not signed_url:\n                print(\"Error: Failed to get signed URL for announcement.json\")\n                self.fetchFailed.emit()\n                return\n\n            response = requests.get(signed_url, timeout=10)\n            response.raise_for_status()\n            data = response.json()\n\n            announcements = data.get(\"announcements\", [])\n            if not announcements:\n                return\n\n            # Find the newest announcement (last in the list)\n            newest = announcements[-1]\n            announcement_id = newest.get(\"id\")\n\n            if announcement_id and announcement_id != settings.get(\"lastSeenAnnouncementId\"):\n                self.announcementFetched.emit(newest)\n\n        except Exception as e:\n            print(f\"Error fetching announcement: {e}\")\n            self.fetchFailed.emit()\n\n\nclass VersionFetchWorker(QThread):\n    versionFetched = pyqtSignal(str)\n    fetchFailed = pyqtSignal()\n\n    def __init__(self, app_name, parent=None):\n        super().__init__(parent)\n        self.app_name = app_name\n\n    def run(self):\n        if not VERSION_CHECKER_ENDPOINT or not CLIENT_API_KEY:\n            print(\"Error: API endpoint or Client API Key is not configured.\")\n            self.fetchFailed.emit()\n            return\n\n        headers = {\n            'x-api-key': CLIENT_API_KEY\n        }\n        params = {\n            'appName': self.app_name\n        }\n\n        try:\n            response = requests.get(VERSION_CHECKER_ENDPOINT, headers=headers, params=params, timeout=15)\n            response.raise_for_status()\n\n            data = response.json()\n            latest_version = data.get('latest_version')\n            if latest_version:\n                self.versionFetched.emit(latest_version)\n            else:\n                print(f\"Error: 'latest_version' not found in response. Response: {data}\")\n                self.fetchFailed.emit()\n\n        except Exception as e:\n            print(f\"Error retrieving latest version: {str(e)}\")\n            self.fetchFailed.emit()\n\n\nclass PathChangeThread(QThread):\n    finished = pyqtSignal(str)\n    error = pyqtSignal(str)\n\n    def __init__(self, source_path, destination_path, parent=None):\n        super().__init__(parent)\n        self.source_path = source_path\n        self.destination_path = destination_path\n\n    def run(self):\n        try:\n            if not os.path.exists(self.destination_path):\n                os.makedirs(self.destination_path)\n\n            for filename in os.listdir(self.source_path):\n                src_file = os.path.join(self.source_path, filename)\n                dst_file = os.path.join(self.destination_path, filename)\n                os.chmod(src_file, stat.S_IWRITE)\n                if os.path.exists(dst_file):\n                    os.chmod(self.destination_path, stat.S_IWRITE)\n                shutil.move(src_file, dst_file)\n            shutil.rmtree(self.source_path)\n\n            self.finished.emit(self.destination_path)\n        except Exception as e:\n            self.error.emit(str(e))\n\n\nclass FetchGCMSite(DownloadBaseThread):\n    message = pyqtSignal(str, str)\n    update = pyqtSignal(str, str, str)\n    finished = pyqtSignal(str)\n\n    def __init__(self, parent=None):\n        super().__init__(parent)\n\n    def run(self):\n        statusWidgetName = \"gcm\"\n        update_message = tr(\"Updating data from GCM\")\n        update_failed = tr(\"Update from GCM failed\")\n\n        self.message.emit(statusWidgetName, update_message)\n        url = \"GCM/Data/gcm_trainers.json\"\n        signed_url = self.get_signed_download_url(url)\n        file_path = signed_url and self.request_download(signed_url, DATABASE_PATH)\n        if not file_path:\n            self.update.emit(statusWidgetName, update_failed, \"error\")\n            time.sleep(2)\n\n        self.finished.emit(statusWidgetName)\n\n\nclass FetchFlingSite(DownloadBaseThread):\n    message = pyqtSignal(str, str)\n    update = pyqtSignal(str, str, str)\n    finished = pyqtSignal(str)\n\n    def __init__(self, parent=None):\n        super().__init__(parent)\n\n    def run(self):\n        statusWidgetName = \"fling\"\n        update_message1 = tr(\"Updating data from FLiNG\") + \" (1/2)\"\n        update_failed1 = tr(\"Update from FLiGN failed\") + \" (1/2)\"\n        update_message2 = tr(\"Updating data from FLiNG\") + \" (2/2)\"\n        update_failed2 = tr(\"Update from FLiGN failed\") + \" (2/2)\"\n\n        # Fling archive\n        self.message.emit(statusWidgetName, update_message1)\n        if settings['flingDownloadServer'] == \"official\":\n            url = \"https://archive.flingtrainer.com/\"\n            content = self.get_webpage_content(url)\n            if not content:\n                self.update.emit(statusWidgetName, update_failed1, \"error\")\n                time.sleep(2)\n            else:\n                self.save_html_content(content, \"fling_archive.html\")\n\n        elif settings['flingDownloadServer'] == \"gcm\":\n            url = \"GCM/Data/fling_archive.json\"\n            signed_url = self.get_signed_download_url(url)\n            file_path = signed_url and self.request_download(signed_url, DATABASE_PATH)\n            if not file_path:\n                self.update.emit(statusWidgetName, update_failed1, \"error\")\n                time.sleep(2)\n\n        # Fling main\n        self.update.emit(statusWidgetName, update_message2, \"load\")\n        if settings['flingDownloadServer'] == \"official\":\n            url = \"https://flingtrainer.com/all-trainers-a-z/\"\n            content = self.get_webpage_content(url)\n            if not content:\n                self.update.emit(statusWidgetName, update_failed2, \"error\")\n                time.sleep(2)\n            else:\n                self.save_html_content(content, \"fling_main.html\")\n\n        elif settings['flingDownloadServer'] == \"gcm\":\n            url = \"GCM/Data/fling_main.json\"\n            signed_url = self.get_signed_download_url(url)\n            file_path = signed_url and self.request_download(signed_url, DATABASE_PATH)\n            if not file_path:\n                self.update.emit(statusWidgetName, update_failed2, \"error\")\n                time.sleep(2)\n\n        self.finished.emit(statusWidgetName)\n\n\nclass FetchXiaoXingSite(DownloadBaseThread):\n    message = pyqtSignal(str, str)\n    update = pyqtSignal(str, str, str)\n    finished = pyqtSignal(str)\n\n    def __init__(self, parent=None):\n        super().__init__(parent)\n\n    def run(self):\n        statusWidgetName = \"xiaoxing\"\n        update_message = tr(\"Updating data from XiaoXing\")\n        update_failed = tr(\"Update from XiaoXing failed\")\n\n        self.message.emit(statusWidgetName, update_message)\n        url = \"GCM/Data/xiaoxing.json\"\n        signed_url = self.get_signed_download_url(url)\n        file_path = signed_url and self.request_download(signed_url, DATABASE_PATH)\n        if not file_path:\n            self.update.emit(statusWidgetName, update_failed, \"error\")\n            time.sleep(2)\n\n        self.finished.emit(statusWidgetName)\n\n\nclass FetchCTSite(DownloadBaseThread):\n    message = pyqtSignal(str, str)\n    update = pyqtSignal(str, str, str)\n    finished = pyqtSignal(str)\n\n    def __init__(self, parent=None):\n        super().__init__(parent)\n\n    def run(self):\n        statusWidgetName = \"ct\"\n        update_message = tr(\"Updating data from CT\")\n        update_failed = tr(\"Update from CT failed\")\n\n        self.message.emit(statusWidgetName, update_message)\n        url = \"GCM/Data/cheat_table.json\"\n        signed_url = self.get_signed_download_url(url)\n        file_path = signed_url and self.request_download(signed_url, DATABASE_PATH)\n        if not file_path:\n            self.update.emit(statusWidgetName, update_failed, \"error\")\n            time.sleep(2)\n\n        self.finished.emit(statusWidgetName)\n\n\nclass FetchTrainerTranslations(DownloadBaseThread):\n    message = pyqtSignal(str, str)\n    update = pyqtSignal(str, str, str)\n    finished = pyqtSignal(str)\n\n    def __init__(self, parent=None):\n        super().__init__(parent)\n\n    def run(self):\n        statusWidgetName = \"translations\"\n        fetch_message = tr(\"Fetching trainer translations\")\n        fetch_error = tr(\"Fetch trainer translations failed\")\n\n        self.message.emit(statusWidgetName, fetch_message)\n        url = \"GCM/Data/translations.json\"\n        signed_url = self.get_signed_download_url(url)\n        file_path = signed_url and self.request_download(signed_url, DATABASE_PATH)\n        if not file_path:\n            self.update.emit(statusWidgetName, fetch_error, \"error\")\n            time.sleep(2)\n\n        self.finished.emit(statusWidgetName)\n\n\nclass TrainerUploadWorker(QThread):\n    finished = pyqtSignal(bool, str)\n    progress = pyqtSignal(int)\n\n    def __init__(self, file_path, trainer_name, contact_info, trainer_source, notes):\n        super().__init__()\n        self.file_path = file_path\n        self.trainer_name = trainer_name\n        self.contact_info = contact_info\n        self.trainer_source = trainer_source\n        self.notes = notes\n        self._is_cancelled = False\n\n    def stop(self):\n        self._is_cancelled = True\n\n    def run(self):\n        meta_dict = {\n            'uploader-contact': self.contact_info,\n            'trainer-name': self.trainer_name,\n            'trainer-source': self.trainer_source,\n            'notes': self.notes\n        }\n        meta_json = json.dumps(meta_dict)\n\n        upload_data = DownloadBaseThread.get_signed_upload_url(self.file_path, meta_json)\n        if not upload_data:\n            self.finished.emit(False, tr(\"Failed to retrieve upload authorization.\"))\n            return\n\n        if self._is_cancelled:\n            return\n        upload_url = upload_data.get('uploadUrl')\n        required_headers = upload_data.get('requiredHeaders', {})\n        if not upload_url:\n            self.finished.emit(False, tr(\"Failed to retrieve upload url.\"))\n            return\n\n        try:\n            class ProgressFileObject:\n                def __init__(self, filepath, callback, cancel_check):\n                    self.file = open(filepath, 'rb')\n                    self.len = os.path.getsize(filepath)\n                    self.read_so_far = 0\n                    self.callback = callback\n                    self.cancel_check = cancel_check\n\n                def read(self, size=-1):\n                    # Periodically check for cancellation\n                    if self.cancel_check():\n                        raise Exception(\"Upload cancelled by user.\")\n\n                    data = self.file.read(size)\n                    self.read_so_far += len(data)\n                    if self.len > 0:\n                        percent = int(self.read_so_far * 100 / self.len)\n                        self.callback(percent)\n                    return data\n\n                def close(self):\n                    self.file.close()\n\n                def __len__(self):\n                    return self.len\n\n            wrapped_file = ProgressFileObject(self.file_path, self.progress.emit, lambda: self._is_cancelled)\n\n            # Send the PUT request\n            response = requests.put(upload_url, data=wrapped_file, headers=required_headers, timeout=300)\n            wrapped_file.close()\n            response.raise_for_status()\n            self.finished.emit(True, tr(\"Upload successful! Thank you for your contribution.\\nYour trainer will be available for download after passing a manual review.\"))\n\n        except Exception as e:\n            if not self._is_cancelled:\n                self.finished.emit(False, tr(\"Upload failed: \") + str(e))\n\n\nclass WeModCustomization(QThread):\n    # Latest WeMod download: https://api.wemod.com/client/download\n    # Custom WeMod version download: https://storage-cdn.wemod.com/app/releases/stable/WeMod-11.6.0.exe\n    # Custom Wand version download: https://storage-cdn.wemod.com/app/releases/stable/Wand-12.0.3.exe\n    message = pyqtSignal(str, str)\n    finished = pyqtSignal()\n\n    def __init__(self, weModVersions, weModInstallPath, selectedWeModVersion, patchMethod, parent=None):\n        super().__init__(parent)\n        self.weModVersions = weModVersions\n        self.weModInstallPath = weModInstallPath\n        self.selectedWeModVersion = selectedWeModVersion\n        self.selectedWeModPath = os.path.join(weModInstallPath, f\"app-{selectedWeModVersion}\")\n        self.patchMethod = patchMethod\n\n    def run(self):\n        asar = os.path.join(self.selectedWeModPath, \"resources\", \"app.asar\")\n        asar_copy = os.path.join(WEMOD_TEMP_DIR, \"app.asar\")\n        asar_bak = os.path.join(self.selectedWeModPath, \"resources\", \"app.asar.bak\")\n\n        weModExe_WeMod = os.path.join(self.selectedWeModPath, \"WeMod.exe\")  # ->  WeMod.exe latest is 11.6.0\n        weModExe_Wand = os.path.join(self.selectedWeModPath, \"Wand.exe\")  # ->  Wand.exe newest is 12.0.3\n        if os.path.exists(weModExe_Wand):\n            weModExeName = \"Wand.exe\"\n            weModExe = weModExe_Wand\n        else:\n            weModExeName = \"WeMod.exe\"\n            weModExe = weModExe_WeMod\n        weModExe_bak = os.path.join(self.selectedWeModPath, f\"{weModExeName}.bak\")\n\n        # Terminate if WeMod is running\n        if self.is_program_running(weModExeName):\n            self.message.emit(tr(\"Wand is currently running,\\nplease close the application first\"), \"error\")\n            self.finished.emit()\n            return\n\n        # ===========================================================================\n        # Unlock WeMod Pro\n        if self.parent().weModProCheckbox.isChecked():\n            patch_success = True\n\n            try:\n                # 1. Remove asar integrity check\n                shutil.copyfile(weModExe, weModExe_bak)\n                self.replace_hex_in_file(weModExe_bak, weModExe, '00001101', '00000101')\n                os.remove(weModExe_bak)\n\n                # 2. Patch app.asar\n                os.makedirs(WEMOD_TEMP_DIR, exist_ok=True)\n                if os.path.exists(asar_bak):\n                    if os.path.exists(asar):\n                        os.remove(asar)\n                    os.rename(asar_bak, asar)\n                shutil.copyfile(asar, asar_copy)\n            except Exception as e:\n                self.message.emit(tr(\"Failed to patch file:\") + f\"{str(e)}\", \"error\")\n                self.finished.emit()\n                return\n\n            # Extract app.asar file\n            try:\n                command = [unzip_path, 'e', '-y', asar_copy, \"app*bundle.js\", \"index.js\", f\"-o{WEMOD_TEMP_DIR}\"]\n                subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n            except Exception as e:\n                self.message.emit(tr(\"Failed to extract file:\") + f\"\\n{asar_copy}\", \"error\")\n                patch_success = False\n\n            # Patching logic\n            patch_success = self.patch()\n\n            # pack patched js files back to app.asar\n            try:\n                shutil.copyfile(asar, asar_bak)\n                command = [unzip_path, 'a', '-y', asar_copy, os.path.join(WEMOD_TEMP_DIR, '*.js')]\n                subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n                shutil.move(asar_copy, asar)\n            except Exception as e:\n                self.message.emit(tr(\"Failed to patch file:\") + f\"\\n{asar}\", \"error\")\n                patch_success = False\n\n            # Clean up\n            shutil.rmtree(WEMOD_TEMP_DIR)\n            if patch_success:\n                self.message.emit(tr(\"Wand Pro activated\"), \"success\")\n            else:\n                self.message.emit(tr(\"Failed to activate Wand Pro\"), \"error\")\n\n        else:\n            if os.path.exists(asar_bak):\n                if os.path.exists(asar):\n                    os.remove(asar)\n                os.rename(asar_bak, asar)\n\n            self.message.emit(tr(\"Wand Pro disabled\"), \"success\")\n\n        # ===========================================================================\n        # Disable auto update\n        updateExe = os.path.join(self.weModInstallPath, \"Update.exe\")\n        updateExe_backup = os.path.join(self.weModInstallPath, \"Update.exe.bak\")\n        try:\n            if self.parent().disableUpdateCheckbox.isChecked():\n                if os.path.exists(updateExe):\n                    os.rename(updateExe, updateExe_backup)\n                    self.message.emit(tr(\"Wand auto update disabled\"), \"success\")\n            else:\n                if os.path.exists(updateExe_backup):\n                    os.rename(updateExe_backup, updateExe)\n                    self.message.emit(tr(\"Wand auto update enabled\"), \"success\")\n                elif not os.path.exists(updateExe):\n                    self.message.emit(tr(\"Failed to enable Wand auto update,\\nplease try reinstalling Wand\"), \"error\")\n        except Exception as e:\n            self.message.emit(tr(\"Failed to process Wand update file:\") + f\"\\n{str(e)}\", \"error\")\n\n        # ===========================================================================\n        # Delete other version folders\n        if self.parent().delOtherVersionsCheckbox.isChecked():\n            for version in self.weModVersions:\n                if version != self.selectedWeModVersion:\n                    folder_path = os.path.join(self.weModInstallPath, f\"app-{version}\")\n                    try:\n                        shutil.rmtree(folder_path)\n                        self.message.emit(tr(\"Deleted Wand version: \") + version, \"success\")\n                    except Exception as e:\n                        self.message.emit(tr(\"Failed to delete Wand version: \") + version, \"error\")\n\n        self.finished.emit()\n\n    def is_program_running(self, program_name):\n        for proc in psutil.process_iter():\n            try:\n                if program_name == proc.name():\n                    return True\n            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):\n                pass\n        return False\n\n    def apply_patch(self, file_path, pattern, replacement):\n        try:\n            with open(file_path, 'r+', encoding='utf-8') as file:\n                content = file.read()\n                modified_content = re.sub(pattern, replacement, content)\n                file.seek(0)\n                file.write(modified_content)\n                file.truncate()\n        except Exception as e:\n            self.message.emit(tr(\"Failed to patch file:\") + f\"\\n{file_path}\", \"error\")\n\n    def replace_hex_in_file(self, input_file, output_file, search_hex, replace_hex):\n        try:\n            command = [binmay_path, '-i', input_file, '-o', output_file, '-s', f\"t:{search_hex}\", '-r', f\"t:{replace_hex}\"]\n            subprocess.run(command, check=True, creationflags=subprocess.CREATE_NO_WINDOW)\n        except Exception as e:\n            self.message.emit(tr(\"Failed to patch file:\") + f\"\\n{input_file}\", \"error\")\n\n    def patch(self, enable_dev=False):\n        if not PATCH_PATTERNS_ENDPOINT or not CLIENT_API_KEY:\n            print(\"Error: API endpoint or Client API Key is not configured.\")\n            return False\n\n        headers = {\n            'x-api-key': CLIENT_API_KEY\n        }\n        params = {\n            'patchMethod': self.patchMethod,\n            'enableDev': 'true' if enable_dev else 'false'\n        }\n\n        response = None\n        try:\n            response = requests.get(PATCH_PATTERNS_ENDPOINT, headers=headers, params=params, timeout=15)\n            response.raise_for_status()\n            patterns = response.json()\n            if not patterns:\n                response.status_code = -2\n                raise Exception(\"No patterns found in response\")\n\n        except Exception as e:\n            print(f\"Error fetching patch patterns: {str(e)}\")\n            status_code = response.status_code if response else -1\n            self.message.emit(tr(\"Internet request failed.\") + f\" {status_code}\", \"error\")\n            return False\n\n        # Mapping of patterns to files where they were found: {pattern key: file path}\n        lines = {key: None for key in patterns}\n\n        try:\n            # Check files for matching patterns\n            for pattern in patterns:\n                for filename in os.listdir(WEMOD_TEMP_DIR):\n                    if filename.endswith('.js'):\n                        file_path = os.path.join(WEMOD_TEMP_DIR, filename)\n                        try:\n                            with open(file_path, 'r', encoding='utf-8') as file:\n                                content = file.read()\n                                if re.search(pattern, content):\n                                    print(f\"Pattern {pattern} found in file {file_path}\")\n                                    lines[pattern] = file_path\n                                    break\n                        except UnicodeDecodeError:\n                            continue\n\n            # Process each file with matched patterns\n            if all(lines.values()):\n                print(f\"js files patched using {self.patchMethod} method\")\n                for pattern, file_path in lines.items():\n                    self.apply_patch(file_path, pattern, patterns[pattern])\n            else:\n                not_found = [pattern for pattern, file_path in lines.items() if file_path is None]\n                print(f\"Patterns not found: {not_found}\")\n                return False\n\n        except Exception as e:\n            print(f\"Error during {self.patchMethod} patching: {str(e)}\")\n            return False\n\n        return True\n"
  },
  {
    "path": "src/scripts/threads/update_trainers_thread.py",
    "content": "import concurrent.futures\nimport os\nimport shutil\nimport time\n\nfrom PyQt6.QtCore import pyqtSignal\n\nfrom config import *\nfrom threads.download_base_thread import DownloadBaseThread\n\n\nclass UpdateTrainers(DownloadBaseThread):\n    message = pyqtSignal(str, str)\n    update = pyqtSignal(str, str, str)\n    updateTrainer = pyqtSignal(dict)\n    finished = pyqtSignal(str)\n\n    def __init__(self, trainers, auto_check, parent=None):\n        super().__init__(parent)\n        self.trainers = trainers\n        self.auto_check = auto_check\n\n    def check_trainer_update(self, trainer_path):\n        \"\"\"Check if a trainer needs an update and return update info if needed.\"\"\"\n        try:\n            if os.path.isdir(trainer_path):\n                trainer_dir = trainer_path\n            else:\n                trainer_dir = os.path.dirname(trainer_path)\n            trainer_name = os.path.basename(trainer_dir)\n            info_path = os.path.join(trainer_dir, \"gcm_info.json\")\n            if not os.path.exists(info_path):\n                return None\n            info = self.load_json_content(info_path, False)\n            game_name = info['game_name']\n            origin = info['origin']\n            current_version = info.get('version')\n            if not current_version:\n                return None\n\n            origin_to_file = {\n                \"gcm\": \"gcm_trainers.json\" if (self.auto_check and settings[\"autoUpdateGCMTrainers\"]) or not self.auto_check else None,\n                \"other\": \"gcm_trainers.json\" if (self.auto_check and settings[\"autoUpdateGCMTrainers\"]) or not self.auto_check else None,\n                \"ct_other\": \"gcm_trainers.json\" if (self.auto_check and settings[\"autoUpdateGCMTrainers\"]) or not self.auto_check else None,\n                \"fling_main\": \"fling_main.json\" if (self.auto_check and settings[\"autoUpdateFlingTrainers\"]) or not self.auto_check else None,\n                \"xiaoxing\": \"xiaoxing.json\" if (self.auto_check and settings[\"autoUpdateXiaoXingTrainers\"]) or not self.auto_check else None,\n                \"the_cheat_script\": \"cheat_table.json\" if (self.auto_check and settings[\"autoUpdateCTTrainers\"]) or not self.auto_check else None\n            }\n            origin_database = origin_to_file.get(origin)\n            if not origin_database:\n                return None\n            database = self.load_json_content(origin_database)\n\n            # For other/ct_other origins, match by gcm_url to handle multiple trainers for the same game\n            stored_gcm_url = info.get('gcm_url')\n\n            for entry in database:\n                if entry['game_name'] == game_name:\n                    if origin in [\"other\", \"ct_other\"]:\n                        if not stored_gcm_url or entry.get('gcm_url') != stored_gcm_url:\n                            continue\n\n                    new_version = entry['version']\n                    gcm_url = entry['gcm_url']\n                    if current_version and new_version != current_version:\n                        return {\n                            \"game_name\": game_name,\n                            \"trainer_name\": trainer_name,\n                            \"trainer_dir\": trainer_dir,\n                            \"origin\": origin,\n                            \"url\": gcm_url,\n                            \"version\": new_version\n                        }\n                    return None\n            return None\n\n        except Exception as e:\n            print(f\"Error checking update for {trainer_name}: {str(e)}\")\n            return None\n\n    def run(self):\n        statusWidgetName = \"trainerUpdate\"\n        self.message.emit(statusWidgetName, tr(\"Checking for trainer updates\"))\n\n        try:\n            if os.path.exists(VERSION_TEMP_DIR):\n                shutil.rmtree(VERSION_TEMP_DIR)\n\n            futures = []\n            with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:\n                for _, trainer_path in self.trainers.items():\n                    future = executor.submit(self.check_trainer_update, trainer_path)\n                    futures.append(future)\n\n                for future in concurrent.futures.as_completed(futures):\n                    result = future.result()\n                    if result:\n                        self.updateTrainer.emit(result)\n\n        except Exception as e:\n            print(f\"Error during trainer update check: {str(e)}\")\n            self.update.emit(statusWidgetName, tr(\"Check trainer updates failed\"), \"error\")\n            time.sleep(2)\n\n        time.sleep(0.5)\n        self.finished.emit(statusWidgetName)\n"
  },
  {
    "path": "src/scripts/widgets/custom_dialogs.py",
    "content": "import os\nimport sys\nimport winreg as reg\n\nfrom PyQt6.QtCore import Qt\nfrom PyQt6.QtGui import QIcon, QPixmap\nfrom PyQt6.QtWidgets import QCheckBox, QComboBox, QDialog, QFileDialog, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QProgressBar, QSizePolicy, QTextEdit, QVBoxLayout\n\nfrom config import *\nfrom widgets.custom_widgets import CustomButton\nfrom threads.other_threads import VersionFetchWorker, TrainerUploadWorker\n\n\nclass AnnouncementDialog(QDialog):\n    def __init__(self, announcement_data, parent=None):\n        super().__init__(parent)\n        self.announcement_id = announcement_data.get(\"id\", \"\")\n\n        self.setWindowTitle(tr(\"Announcement\"))\n        self.setWindowIcon(QIcon(resource_path(\"assets/logo.ico\")))\n        self.setMinimumWidth(850)\n\n        layout = QVBoxLayout()\n        layout.setSpacing(15)\n        layout.setContentsMargins(25, 20, 25, 20)\n        self.setLayout(layout)\n\n        # Determine display language\n        lang = settings.get(\"language\")\n        if lang in [\"zh_CN\", \"zh_TW\"]:\n            title = announcement_data.get(\"title_zh\", announcement_data.get(\"title_en\", \"\"))\n            message = announcement_data.get(\"message_zh\", announcement_data.get(\"message_en\", \"\"))\n        else:\n            title = announcement_data.get(\"title_en\", announcement_data.get(\"title_zh\", \"\"))\n            message = announcement_data.get(\"message_en\", announcement_data.get(\"message_zh\", \"\"))\n\n        # Title\n        titleLabel = QLabel(title)\n        titleFont = self.font()\n        titleFont.setPointSize(18)\n        titleFont.setBold(True)\n        titleLabel.setFont(titleFont)\n        titleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        layout.addWidget(titleLabel)\n\n        # Message body\n        messageLabel = QLabel(message)\n        messageLabel.setWordWrap(True)\n        messageLabel.setTextFormat(Qt.TextFormat.RichText)\n        messageLabel.setOpenExternalLinks(True)\n        messageFont = self.font()\n        messageFont.setPointSize(11)\n        messageLabel.setFont(messageFont)\n        layout.addWidget(messageLabel)\n\n        # OK button\n        okButton = CustomButton(\"OK\")\n        okButton.clicked.connect(self.accept)\n        buttonLayout = QHBoxLayout()\n        buttonLayout.addStretch(1)\n        buttonLayout.addWidget(okButton)\n        buttonLayout.addStretch(1)\n        layout.addLayout(buttonLayout)\n\n        self.setFixedSize(self.sizeHint())\n\n    def _mark_seen(self):\n        settings[\"lastSeenAnnouncementId\"] = self.announcement_id\n        apply_settings(settings)\n\n    def accept(self):\n        self._mark_seen()\n        super().accept()\n\n    def closeEvent(self, event):\n        self._mark_seen()\n        super().closeEvent(event)\n\n\nclass CopyRightWarning(QDialog):\n    def __init__(self, parent=None):\n        super().__init__(parent)\n        self.setWindowTitle(tr(\"Warning\"))\n        self.setWindowIcon(QIcon(resource_path(\"assets/logo.ico\")))\n        layout = QVBoxLayout()\n        layout.setSpacing(30)\n        layout.setContentsMargins(20, 30, 20, 20)\n        self.setLayout(layout)\n\n        warningLayout = QHBoxLayout()\n        layout.addLayout(warningLayout)\n\n        WarningPixmap = QPixmap(resource_path(\"assets/warning.png\"))\n        scaledWarningPixmap = WarningPixmap.scaled(120, 120, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        warningSign = QLabel()\n        warningSign.setPixmap(scaledWarningPixmap)\n        warningLayout.addWidget(warningSign)\n\n        warningFont = self.font()\n        warningFont.setPointSize(11)\n        warningText = QLabel(tr(\"This software is open source and provided free of charge.\\nResale is strictly prohibited, and developers reserve the right to pursue legal responsibility against the violators.\\nIf you have paid for this software unofficially, please report the seller immediately.\\nBelow are official links.\"))\n        warningText.setFont(warningFont)\n        warningText.setStyleSheet(\"color: red;\")\n        warningLayout.addWidget(warningText)\n\n        linksLayout = QVBoxLayout()\n        linksLayout.setSpacing(10)\n        layout.addLayout(linksLayout)\n\n        websiteUrl = self.parent().websiteLink\n        websiteText = tr('Official Website:')\n        websiteText = f'{websiteText} <a href=\"{websiteUrl}\" style=\"text-decoration: none; color: #305CDE;\">{websiteUrl}</a>'\n        websiteLabel = QLabel(websiteText)\n        websiteLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        websiteLabel.setTextFormat(Qt.TextFormat.RichText)\n        websiteLabel.setOpenExternalLinks(True)\n        linksLayout.addWidget(websiteLabel)\n\n        githubUrl = self.parent().githubLink\n        githubText = f'GitHub: <a href=\"{githubUrl}\" style=\"text-decoration: none; color: #305CDE;\">{githubUrl}</a>'\n        githubLabel = QLabel(githubText)\n        githubLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        githubLabel.setTextFormat(Qt.TextFormat.RichText)\n        githubLabel.setOpenExternalLinks(True)\n        linksLayout.addWidget(githubLabel)\n\n        bilibiliUrl = self.parent().bilibiliLink\n        text = tr(\"Bilibili:\")\n        bilibiliText = f'{text} <a href=\"{bilibiliUrl}\" style=\"text-decoration: none; color: #305CDE;\">{bilibiliUrl}</a>'\n        bilibiliLabel = QLabel(bilibiliText)\n        bilibiliLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        bilibiliLabel.setTextFormat(Qt.TextFormat.RichText)\n        bilibiliLabel.setOpenExternalLinks(True)\n        linksLayout.addWidget(bilibiliLabel)\n\n        dontShowLayout = QHBoxLayout()\n        dontShowLayout.setAlignment(Qt.AlignmentFlag.AlignRight)\n        self.dontShowCheckbox = QCheckBox(tr(\"Don't show again\"))\n        dontShowLayout.addWidget(self.dontShowCheckbox)\n        layout.addLayout(dontShowLayout)\n\n        self.setFixedSize(self.sizeHint())\n\n    def closeEvent(self, event):\n        if self.dontShowCheckbox.isChecked():\n            settings[\"showWarning\"] = False\n            apply_settings(settings)\n        super().closeEvent(event)\n\n\nclass SettingsDialog(QDialog):\n    def __init__(self, parent=None):\n        super().__init__(parent)\n        self.setWindowTitle(tr(\"Settings\"))\n        self.setWindowIcon(QIcon(resource_path(\"assets/setting.ico\")))\n        settingsLayout = QVBoxLayout()\n        settingsLayout.setSpacing(15)\n        self.setLayout(settingsLayout)\n        self.setMinimumWidth(400)\n\n        settingsWidgetsLayout = QVBoxLayout()\n        settingsWidgetsLayout.setContentsMargins(50, 30, 50, 20)\n        settingsLayout.addLayout(settingsWidgetsLayout)\n\n        # Theme selection\n        themeLayout = QVBoxLayout()\n        themeLayout.setSpacing(2)\n        settingsWidgetsLayout.addLayout(themeLayout)\n        themeLabel = QLabel(tr(\"Theme:\"))\n        themeLabel.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)\n        themeLayout.addWidget(themeLabel)\n        self.themeCombo = QComboBox()\n        self.themeCombo.addItems(theme_options.keys())\n        self.themeCombo.setCurrentText(self.find_settings_key(settings[\"theme\"], theme_options))\n        themeLayout.addWidget(self.themeCombo)\n\n        # Language selection\n        languageLayout = QVBoxLayout()\n        languageLayout.setSpacing(2)\n        settingsWidgetsLayout.addLayout(languageLayout)\n        languageLabel = QLabel(tr(\"Language:\"))\n        languageLabel.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)\n        languageLayout.addWidget(languageLabel)\n        self.languageCombo = QComboBox()\n        self.languageCombo.addItems(language_options.keys())\n        self.languageCombo.setCurrentText(self.find_settings_key(settings[\"language\"], language_options))\n        languageLayout.addWidget(self.languageCombo)\n\n        # Launch app on startup\n        self.launchAppOnStarupCheckbox = QCheckBox(tr(\"Launch app on system startup\"))\n        self.launchAppOnStarupCheckbox.setChecked(settings[\"launchAppOnStartup\"])\n        settingsWidgetsLayout.addWidget(self.launchAppOnStarupCheckbox)\n\n        # Check software update at startup\n        self.checkAppUpdateCheckbox = QCheckBox(tr(\"Check for software update at startup\"))\n        self.checkAppUpdateCheckbox.setChecked(settings[\"checkAppUpdate\"])\n        settingsWidgetsLayout.addWidget(self.checkAppUpdateCheckbox)\n\n        # Legacy compatibility mode (Safe ASCII Launch)\n        self.safePathCheckbox = QCheckBox(tr(\"Use safe launch path (may fix trainers unable to launch)\"))\n        self.safePathCheckbox.setChecked(settings[\"safePath\"])\n        settingsWidgetsLayout.addWidget(self.safePathCheckbox)\n\n        # Always show english\n        self.alwaysEnCheckbox = QCheckBox(tr(\"Always show search results in English\"))\n        self.alwaysEnCheckbox.setChecked(settings[\"enSearchResults\"])\n        settingsWidgetsLayout.addWidget(self.alwaysEnCheckbox)\n\n        # Sort by origin\n        self.sortByOriginCheckbox = QCheckBox(tr(\"Sort search results by origin\"))\n        self.sortByOriginCheckbox.setChecked(settings[\"sortByOrigin\"])\n        settingsWidgetsLayout.addWidget(self.sortByOriginCheckbox)\n\n        # Auto update translation json\n        self.autoUpdateTranslationsCheckbox = QCheckBox(tr(\"Update trainer translations automatically\"))\n        self.autoUpdateTranslationsCheckbox.setChecked(settings[\"autoUpdateTranslations\"])\n        settingsWidgetsLayout.addWidget(self.autoUpdateTranslationsCheckbox)\n\n        # Apply button\n        applyButtonLayout = QHBoxLayout()\n        applyButtonLayout.setContentsMargins(0, 0, 10, 10)\n        applyButtonLayout.addStretch(1)\n        settingsLayout.addLayout(applyButtonLayout)\n        self.applyButton = CustomButton(tr(\"Apply\"))\n        self.applyButton.setFixedWidth(100)\n        self.applyButton.clicked.connect(self.apply_settings_page)\n        applyButtonLayout.addWidget(self.applyButton)\n\n    @staticmethod\n    def find_settings_key(value, dict):\n        return next(key for key, val in dict.items() if val == value)\n\n    @staticmethod\n    def add_or_remove_startup(app_name, path_to_exe, add=True):\n        key = reg.HKEY_CURRENT_USER\n        key_path = \"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\"\n        try:\n            registry_key = reg.OpenKey(key, key_path, 0, reg.KEY_WRITE)\n            if add:\n                reg.SetValueEx(registry_key, app_name, 0, reg.REG_SZ, path_to_exe)\n            else:\n                reg.DeleteValue(registry_key, app_name)\n            reg.CloseKey(registry_key)\n        except WindowsError as e:\n            print(f\"Registry modification failed: {str(e)}\")\n\n    def apply_settings_page(self):\n        original_theme = settings[\"theme\"]\n        original_language = settings[\"language\"]\n        original_sortByOrigin = settings[\"sortByOrigin\"]\n\n        settings[\"theme\"] = theme_options[self.themeCombo.currentText()]\n        settings[\"language\"] = language_options[self.languageCombo.currentText()]\n        settings[\"safePath\"] = self.safePathCheckbox.isChecked()\n        settings[\"enSearchResults\"] = self.alwaysEnCheckbox.isChecked()\n        settings[\"sortByOrigin\"] = self.sortByOriginCheckbox.isChecked()\n        settings[\"checkAppUpdate\"] = self.checkAppUpdateCheckbox.isChecked()\n        settings[\"launchAppOnStartup\"] = self.launchAppOnStarupCheckbox.isChecked()\n        settings[\"autoUpdateTranslations\"] = self.autoUpdateTranslationsCheckbox.isChecked()\n        apply_settings(settings)\n\n        if sys.argv[0].endswith('.exe'):\n            app_name = \"Game Cheats Manager\"\n            app_path = sys.argv[0]\n            if self.launchAppOnStarupCheckbox.isChecked():\n                self.add_or_remove_startup(app_name, app_path, True)\n            else:\n                self.add_or_remove_startup(app_name, app_path, False)\n\n        if original_sortByOrigin != settings[\"sortByOrigin\"]:\n            self.parent().show_cheats()\n\n        if original_theme != settings[\"theme\"] or original_language != settings[\"language\"]:\n            msg_box = QMessageBox(\n                QMessageBox.Icon.Question,\n                tr(\"Attention\"),\n                tr(\"Do you want to restart the application now to apply theme or language settings?\"),\n                QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,\n                self\n            )\n\n            yes_button = msg_box.button(QMessageBox.StandardButton.Yes)\n            yes_button.setText(tr(\"Yes\"))\n            no_button = msg_box.button(QMessageBox.StandardButton.No)\n            no_button.setText(tr(\"No\"))\n            reply = msg_box.exec()\n\n            if reply == QMessageBox.StandardButton.Yes:\n                os.execl(sys.argv[0], sys.argv[0])\n\n        else:\n            QMessageBox.information(self, tr(\"Success\"), tr(\"Settings saved.\"))\n\n\nclass AboutDialog(QDialog):\n    def __init__(self, parent=None):\n        super().__init__(parent)\n        self.setWindowTitle(tr(\"About\"))\n        self.setWindowIcon(QIcon(resource_path(\"assets/logo.ico\")))\n        aboutLayout = QVBoxLayout()\n        aboutLayout.setSpacing(30)\n        aboutLayout.setContentsMargins(40, 20, 40, 30)\n        self.setLayout(aboutLayout)\n\n        appLayout = QHBoxLayout()\n        appLayout.setSpacing(20)\n        aboutLayout.addLayout(appLayout)\n\n        # App logo\n        logoPixmap = QPixmap(resource_path(\"assets/logo.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(120, 120, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        if settings[\"theme\"] == \"light\":\n            logoLabel.setStyleSheet(\"\"\"\n                border: 2px solid black;\n                border-radius: 20px;\n                padding: -2px;\n            \"\"\")\n        appLayout.addWidget(logoLabel)\n\n        # App name\n        appNameFont = self.font()\n        appNameFont.setPointSize(18)\n        appInfoLayout = QVBoxLayout()\n        appInfoLayout.setAlignment(Qt.AlignmentFlag.AlignVCenter)\n        appLayout.addLayout(appInfoLayout)\n\n        appNameLabel = QLabel(\"Game Cheats Manager\")\n        appNameLabel.setFont(appNameFont)\n        appNameLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        appInfoLayout.addWidget(appNameLabel)\n\n        # App version and update button\n        versionLayout = QHBoxLayout()\n        versionLayout.setSpacing(20)\n        versionLayout.addStretch(1)\n        appInfoLayout.addLayout(versionLayout)\n\n        versionNumberLayout = QVBoxLayout()\n        versionNumberLayout.setSpacing(2)\n        versionLayout.addLayout(versionNumberLayout)\n\n        currentVersionTextLabel = QLabel(tr(\"Current version: \"))\n        self.currentVersionNumberLabel = QLabel(self.parent().appVersion)\n        currentVersionLayout = QHBoxLayout()\n        currentVersionLayout.setSpacing(3)\n        currentVersionLayout.addWidget(currentVersionTextLabel)\n        currentVersionLayout.addWidget(self.currentVersionNumberLabel)\n        versionNumberLayout.addLayout(currentVersionLayout)\n\n        newestVersionTextLabel = QLabel(tr(\"Newest version: \"))\n        self.newestVersionNumberLabel = QLabel(tr(\"Loading...\"))\n        newestVersionLayout = QHBoxLayout()\n        newestVersionLayout.setSpacing(3)\n        newestVersionLayout.addWidget(newestVersionTextLabel)\n        newestVersionLayout.addWidget(self.newestVersionNumberLabel)\n        versionNumberLayout.addLayout(newestVersionLayout)\n\n        self.updateButton = CustomButton(tr(\"Update Now\"))\n        self.updateButton.setStyleSheet(\"padding: 5;\")\n        self.updateButton.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)\n        self.updateButton.setVisible(0)\n        self.updateButton.clicked.connect(lambda: self.parent().start_update(self.newestVersionNumberLabel.text()))\n        font = self.updateButton.font()\n        font.setPointSize(8)\n        versionLayout.addWidget(self.updateButton)\n        versionLayout.addStretch(1)\n\n        # Links\n        linksLayout = QVBoxLayout()\n        linksLayout.setSpacing(10)\n        aboutLayout.addLayout(linksLayout)\n\n        websiteUrl = self.parent().websiteLink\n        websiteText = tr('Official Website:')\n        websiteText = f'{websiteText} <a href=\"{websiteUrl}\" style=\"text-decoration: none; color: #305CDE;\">{websiteUrl}</a>'\n        websiteLabel = QLabel(websiteText)\n        websiteLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        websiteLabel.setTextFormat(Qt.TextFormat.RichText)\n        websiteLabel.setOpenExternalLinks(True)\n        linksLayout.addWidget(websiteLabel)\n\n        githubUrl = self.parent().githubLink\n        githubText = f'GitHub: <a href=\"{githubUrl}\" style=\"text-decoration: none; color: #305CDE;\">{githubUrl}</a>'\n        githubLabel = QLabel(githubText)\n        githubLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        githubLabel.setTextFormat(Qt.TextFormat.RichText)\n        githubLabel.setOpenExternalLinks(True)\n        linksLayout.addWidget(githubLabel)\n\n        bilibiliUrl = self.parent().bilibiliLink\n        text = tr(\"Bilibili:\")\n        bilibiliText = f'{text} <a href=\"{bilibiliUrl}\" style=\"text-decoration: none; color: #305CDE;\">{bilibiliUrl}</a>'\n        bilibiliLabel = QLabel(bilibiliText)\n        bilibiliLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        bilibiliLabel.setTextFormat(Qt.TextFormat.RichText)\n        bilibiliLabel.setOpenExternalLinks(True)\n        linksLayout.addWidget(bilibiliLabel)\n\n        self.setFixedSize(self.sizeHint())\n        self.start_version_fetch()\n\n    def start_version_fetch(self):\n        self.worker = VersionFetchWorker('GCM')\n        self.worker.versionFetched.connect(self.update_version_labels)\n        self.worker.fetchFailed.connect(self.handle_version_load_failure)\n        self.worker.start()\n\n    def update_version_labels(self, latest_version):\n        current_version = self.parent().appVersion\n\n        if latest_version > current_version:\n            self.currentVersionNumberLabel.setStyleSheet(\"color: red;\")\n            self.newestVersionNumberLabel.setStyleSheet(\"color: green;\")\n            self.updateButton.setVisible(1)\n\n        self.newestVersionNumberLabel.setText(latest_version)\n        self.worker.quit()\n\n    def handle_version_load_failure(self):\n        self.newestVersionNumberLabel.setText(tr(\"Failed to load\"))\n        self.newestVersionNumberLabel.setStyleSheet(\"color: red;\")\n        self.worker.quit()\n\n\nclass TrainerUploadDialog(QDialog):\n    def __init__(self, parent=None):\n        super().__init__(parent)\n        self.worker = None\n        self.setWindowTitle(tr(\"Upload Trainer\"))\n        self.setWindowIcon(QIcon(resource_path(\"assets/logo.ico\")))\n        self.setMinimumWidth(500)\n\n        layout = QVBoxLayout()\n        layout.setSpacing(20)\n        layout.setContentsMargins(30, 30, 30, 30)\n        self.setLayout(layout)\n\n        # Contact Info\n        contactLayout = QVBoxLayout()\n        contactLayout.setSpacing(5)\n        contactLayout.addWidget(QLabel(tr(\"Contact Info (Optional):\")))\n        self.contactEdit = QLineEdit()\n        self.contactEdit.setPlaceholderText(tr(\"Email\"))\n        contactLayout.addWidget(self.contactEdit)\n\n        contact_info_label = QLabel(tr(\"If you provide your Game-Zone Labs account email and your trainer is approved, a badge will be added to your account\"))\n        contact_info_font = contact_info_label.font()\n        contact_info_font.setPointSize(9)\n        contact_info_label.setFont(contact_info_font)\n        contact_info_label.setStyleSheet(\"color: gray;\")\n        contact_info_label.setWordWrap(True)\n        contactLayout.addWidget(contact_info_label)\n        layout.addLayout(contactLayout)\n\n        # Trainer Name\n        nameLayout = QVBoxLayout()\n        nameLayout.setSpacing(5)\n        nameLayout.addWidget(QLabel(tr(\"Trainer Name:\")))\n        self.nameEdit = QLineEdit()\n        self.nameEdit.setPlaceholderText(tr(\"What game does it work for\"))\n        nameLayout.addWidget(self.nameEdit)\n        layout.addLayout(nameLayout)\n\n        # Trainer Source\n        sourceLayout = QVBoxLayout()\n        sourceLayout.setSpacing(5)\n        sourceLayout.addWidget(QLabel(tr(\"Trainer Source (Optional):\")))\n        self.sourceEdit = QLineEdit()\n        self.sourceEdit.setPlaceholderText(tr(\"Original URL or author\"))\n        sourceLayout.addWidget(self.sourceEdit)\n\n        source_info_label = QLabel(tr(\"If you made the trainer, please provide your author name\"))\n        source_info_font = source_info_label.font()\n        source_info_font.setPointSize(9)\n        source_info_label.setFont(source_info_font)\n        source_info_label.setStyleSheet(\"color: gray;\")\n        source_info_label.setWordWrap(True)\n        sourceLayout.addWidget(source_info_label)\n        layout.addLayout(sourceLayout)\n\n        # Trainer File Selection\n        fileLabelLayout = QVBoxLayout()\n        fileLabelLayout.setSpacing(5)\n        fileLabelLayout.addWidget(QLabel(tr(\"Trainer File:\")))\n\n        fileSelectLayout = QHBoxLayout()\n        self.fileEdit = QLineEdit()\n        self.fileEdit.setReadOnly(True)\n        self.fileEdit.setPlaceholderText(tr(\"Select a trainer file\") + \"...\")\n\n        self.browseButton = CustomButton(\"...\")\n        self.browseButton.clicked.connect(self.browse_file)\n\n        fileSelectLayout.addWidget(self.fileEdit)\n        fileSelectLayout.addWidget(self.browseButton)\n        fileLabelLayout.addLayout(fileSelectLayout)\n\n        info_label = QLabel(tr(\"If the trainer consists of multiple files, please compress them into a single archive (zip/rar/7z) before uploading\"))\n        info_font = info_label.font()\n        info_font.setPointSize(9)\n        info_label.setFont(info_font)\n        info_label.setStyleSheet(\"color: gray;\")\n        info_label.setWordWrap(True)\n        fileLabelLayout.addWidget(info_label)\n        layout.addLayout(fileLabelLayout)\n\n        # Notes\n        notesLayout = QVBoxLayout()\n        notesLayout.setSpacing(5)\n        notesLayout.addWidget(QLabel(tr(\"Additional Notes:\")))\n        self.notesEdit = QTextEdit()\n        self.notesEdit.setPlaceholderText(tr(\"Anything else to add...\"))\n        self.notesEdit.setMaximumHeight(100)\n        self.notesEdit.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)\n        notesLayout.addWidget(self.notesEdit)\n\n        notes_info_label = QLabel(\n            tr(\"Please make sure the trainer you are about to upload is tested to be safe and functional.\") + \"\\n\" +\n            tr(\"For more info about trainer uploading, please join the QQ group to discuss: 186859946.\")\n        )\n        notes_info_font = notes_info_label.font()\n        notes_info_font.setPointSize(9)\n        notes_info_label.setFont(notes_info_font)\n        notes_info_label.setStyleSheet(\"color: gray;\")\n        notes_info_label.setWordWrap(True)\n        notesLayout.addWidget(notes_info_label)\n        layout.addLayout(notesLayout)\n\n        # Progress Bar\n        self.progressBar = QProgressBar()\n        self.progressBar.setRange(0, 100)\n        self.progressBar.setValue(0)\n        self.progressBar.setVisible(False)\n        layout.addWidget(self.progressBar)\n\n        layout.addStretch()\n\n        # Buttons\n        buttonLayout = QHBoxLayout()\n        buttonLayout.addStretch()\n\n        self.uploadButton = CustomButton(tr(\"Upload\"))\n        self.uploadButton.setFixedWidth(100)\n        self.uploadButton.clicked.connect(self.start_upload)\n\n        buttonLayout.addWidget(self.uploadButton)\n        layout.addLayout(buttonLayout)\n\n    def browse_file(self):\n        default_dir = settings.get(\"downloadPath\", \"\")\n        file_path, _ = QFileDialog.getOpenFileName(\n            self,\n            tr(\"Select a trainer file\"),\n            default_dir,\n            tr(\"All Files (*)\")\n        )\n        if file_path:\n            self.fileEdit.setText(file_path)\n            if not self.nameEdit.text():\n                self.nameEdit.setText(os.path.basename(file_path))\n\n    def start_upload(self):\n        file_path = self.fileEdit.text()\n        name = self.nameEdit.text()\n\n        if not file_path or not os.path.exists(file_path):\n            QMessageBox.warning(self, tr(\"Error\"), tr(\"Please select a valid file.\"))\n            return\n\n        if not name:\n            QMessageBox.warning(self, tr(\"Error\"), tr(\"Please provide a trainer name.\"))\n            return\n\n        # Prepare UI for upload\n        self.set_ui_locked(True)\n        self.progressBar.setValue(0)\n        self.progressBar.setVisible(True)\n\n        self.worker = TrainerUploadWorker(\n            file_path,\n            name,\n            self.contactEdit.text(),\n            self.sourceEdit.text(),\n            self.notesEdit.toPlainText()\n        )\n        self.worker.progress.connect(self.update_progress)\n        self.worker.finished.connect(self.handle_upload_finished)\n        self.worker.start()\n\n    def update_progress(self, percent):\n        self.progressBar.setValue(percent)\n\n    def handle_upload_finished(self, success, message):\n        self.progressBar.setVisible(False)\n        self.set_ui_locked(False)\n\n        if success:\n            QMessageBox.information(self, tr(\"Success\"), message)\n            self.accept()\n        else:\n            QMessageBox.critical(self, tr(\"Error\"), message)\n\n    def closeEvent(self, event):\n        if self.worker and self.worker.isRunning():\n            self.worker.stop()\n            self.worker.wait()\n        super().closeEvent(event)\n\n    def set_ui_locked(self, locked):\n        self.contactEdit.setDisabled(locked)\n        self.nameEdit.setDisabled(locked)\n        self.sourceEdit.setDisabled(locked)\n        self.notesEdit.setDisabled(locked)\n        self.browseButton.setDisabled(locked)\n        self.uploadButton.setDisabled(locked)\n"
  },
  {
    "path": "src/scripts/widgets/custom_widgets.py",
    "content": "from PyQt6.QtCore import QEasingCurve, QPropertyAnimation, QRect, Qt, QTimer, pyqtSignal\nfrom PyQt6.QtGui import QColor, QFont, QFontDatabase, QPainter, QPixmap\nfrom PyQt6.QtWidgets import QApplication, QFrame, QGraphicsDropShadowEffect, QHBoxLayout, QLabel, QListWidget, QListWidgetItem, QProxyStyle, QPushButton, QStyle, QVBoxLayout, QWidget\nfrom zhon.cedict import simp, trad\n\nfrom config import *\n\n\nclass LargerActionIconStyle(QProxyStyle):\n    def pixelMetric(self, metric, option=None, widget=None):\n        if metric == QStyle.PixelMetric.PM_SmallIconSize:\n            return 20\n        return super().pixelMetric(metric, option, widget)\n\n\nclass ToastNotification(QWidget):\n    action_accepted = pyqtSignal()\n\n    def __init__(self, title, message, notification_type=\"info\"):\n        super().__init__()\n        theme = settings.get(\"theme\", \"dark\")\n        header_logo_path = resource_path(\"assets/logo.ico\")\n        body_logo_path = resource_path(\"assets/logo.png\")\n\n        self.setWindowFlags(\n            Qt.WindowType.FramelessWindowHint |\n            Qt.WindowType.WindowStaysOnTopHint |\n            Qt.WindowType.Tool\n        )\n        self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)\n        self.setFixedWidth(400)\n\n        # Main Layout (Padding for the drop shadow)\n        layout = QVBoxLayout(self)\n        layout.setContentsMargins(15, 15, 15, 15)\n\n        # Background Frame\n        self.frame = QFrame(self)\n        self.frame.setObjectName(\"ToastFrame\")\n        frame_layout = QVBoxLayout(self.frame)\n        frame_layout.setContentsMargins(16, 14, 16, 16)\n        frame_layout.setSpacing(12)\n\n        # Apply Drop Shadow\n        shadow = QGraphicsDropShadowEffect(self)\n        shadow.setBlurRadius(15)\n        shadow.setXOffset(0)\n        shadow.setYOffset(4)\n        shadow_color = QColor(0, 0, 0, 100) if theme == \"dark\" else QColor(0, 0, 0, 50)\n        shadow.setColor(shadow_color)\n        self.frame.setGraphicsEffect(shadow)\n\n        app_font = QApplication.font()\n\n        # --- HEADER ROW ---\n        header_layout = QHBoxLayout()\n        header_layout.setSpacing(8)\n\n        self.lbl_logo = QLabel()\n        pixmap = QPixmap(header_logo_path).scaled(16, 16, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        self.lbl_logo.setPixmap(pixmap)\n\n        self.lbl_app_name = QLabel(\"Game Cheats Manager\")\n        self.lbl_app_name.setObjectName(\"AppNameText\")\n        self.lbl_app_name.setFont(app_font)\n\n        header_layout.addWidget(self.lbl_logo)\n        header_layout.addWidget(self.lbl_app_name)\n        header_layout.addStretch()\n        frame_layout.addLayout(header_layout)\n\n        # --- BODY ROW ---\n        body_layout = QHBoxLayout()\n        body_layout.setSpacing(12)\n\n        # Body Logo (Left)\n        self.lbl_body_logo = QLabel()\n        self.lbl_body_logo.setFixedSize(64, 64)\n        body_pixmap = QPixmap(body_logo_path).scaled(64, 64, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        self.lbl_body_logo.setPixmap(body_pixmap)\n        self.lbl_body_logo.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        body_layout.addWidget(self.lbl_body_logo, alignment=Qt.AlignmentFlag.AlignVCenter)\n\n        # Text Vertical Layout (Right)\n        text_layout = QVBoxLayout()\n        text_layout.setSpacing(4)\n\n        # Title\n        title_font = QFont(app_font)\n        title_font.setPointSize(app_font.pointSize() + 3)\n\n        self.lbl_title = QLabel(title)\n        self.lbl_title.setObjectName(\"TitleText\")\n        self.lbl_title.setFont(title_font)\n        self.lbl_title.setWordWrap(True)\n\n        # Message\n        msg_font = QFont(app_font)\n        msg_font.setPointSize(app_font.pointSize() + 1)\n\n        self.lbl_message = QLabel(message)\n        self.lbl_message.setObjectName(\"MessageText\")\n        self.lbl_message.setFont(msg_font)\n        self.lbl_message.setWordWrap(True)\n\n        text_layout.addWidget(self.lbl_title)\n        text_layout.addWidget(self.lbl_message)\n\n        body_layout.addLayout(text_layout)\n        frame_layout.addLayout(body_layout)\n\n        # --- FOOTER ROW (Buttons) ---\n        btn_layout = QHBoxLayout()\n        btn_layout.setContentsMargins(0, 6, 0, 0)\n        btn_layout.addStretch()\n\n        if notification_type == \"update\":\n            self.btn_yes = QPushButton(tr(\"Yes\"))\n            self.btn_yes.setObjectName(\"PrimaryButton\")\n            self.btn_yes.setCursor(Qt.CursorShape.PointingHandCursor)\n            self.btn_yes.clicked.connect(self.on_accept)\n\n            self.btn_no = QPushButton(tr(\"No\"))\n            self.btn_no.setCursor(Qt.CursorShape.PointingHandCursor)\n            self.btn_no.clicked.connect(self.close)\n\n            btn_layout.addWidget(self.btn_yes)\n            btn_layout.addWidget(self.btn_no)\n        else:\n            self.btn_ok = QPushButton(tr(\"Close\"))\n            self.btn_ok.setCursor(Qt.CursorShape.PointingHandCursor)\n            self.btn_ok.clicked.connect(self.close)\n            btn_layout.addWidget(self.btn_ok)\n\n        frame_layout.addLayout(btn_layout)\n        layout.addWidget(self.frame)\n\n        self.apply_theme(theme)\n\n        # Show for exactly 7 seconds\n        self.timer = QTimer(self)\n        self.timer.timeout.connect(self.close)\n        self.timer.start(7000)\n\n    def apply_theme(self, theme):\n        if theme == \"dark\":\n            style = \"\"\"\n                QFrame#ToastFrame {\n                    background-color: #202020;\n                    border: 1px solid #333333;\n                    border-radius: 8px;\n                }\n                QLabel#AppNameText { color: #aaaaaa; }\n                QLabel#TitleText { color: #ffffff; }\n                QLabel#MessageText { color: #cccccc; }\n                QPushButton {\n                    padding: 8px 20px;\n                    border-radius: 4px;\n                    border: 1px solid #444444;\n                    background-color: #2d2d2d;\n                    color: #ffffff;\n                }\n                QPushButton:hover { background-color: #383838; }\n                QPushButton:pressed { background-color: #1a1a1a; }\n                QPushButton#PrimaryButton {\n                    background-color: #0080e3;\n                    border: 1px solid #0080e3;\n                }\n                QPushButton#PrimaryButton:hover { background-color: #1a90e8; border: 1px solid #1a90e8; }\n            \"\"\"\n        else:\n            style = \"\"\"\n                QFrame#ToastFrame {\n                    background-color: #f3f3f3;\n                    border: 1px solid #e5e5e5;\n                    border-radius: 8px;\n                }\n                QLabel#AppNameText { color: #666666; }\n                QLabel#TitleText { color: #000000; }\n                QLabel#MessageText { color: #333333; }\n                QPushButton {\n                    padding: 8px 20px;\n                    border-radius: 4px;\n                    border: 1px solid #cccccc;\n                    background-color: #ffffff;\n                    color: #000000;\n                }\n                QPushButton:hover { background-color: #f0f0f0; }\n                QPushButton:pressed { background-color: #e0e0e0; }\n                QPushButton#PrimaryButton {\n                    background-color: #0057b7;\n                    color: #ffffff;\n                    border: 1px solid #0057b7;\n                }\n                QPushButton#PrimaryButton:hover { background-color: #0065d1; border: 1px solid #0065d1; }\n            \"\"\"\n        self.setStyleSheet(style)\n\n    def show_notification(self):\n        self.adjustSize()\n        screen_geo = QApplication.primaryScreen().availableGeometry()\n        offset = 20\n\n        # Target resting position\n        end_x = screen_geo.width() - self.width() - offset\n        end_y = screen_geo.height() - self.height() - offset\n\n        # Start completely off-screen to the right\n        start_x = screen_geo.width()\n        start_y = end_y\n\n        self.setGeometry(start_x, start_y, self.width(), self.height())\n        self.show()\n\n        # Smooth slide-in animation\n        self.animation = QPropertyAnimation(self, b\"geometry\")\n        self.animation.setDuration(450)\n        self.animation.setEasingCurve(QEasingCurve.Type.OutCubic)\n        self.animation.setStartValue(QRect(start_x, start_y, self.width(), self.height()))\n        self.animation.setEndValue(QRect(end_x, end_y, self.width(), self.height()))\n        self.animation.start()\n\n    def on_accept(self):\n        self.action_accepted.emit()\n        self.close()\n\n\nclass CustomButton(QPushButton):\n    def __init__(self, text, parent=None):\n        super(CustomButton, self).__init__(text, parent)\n        self.setCursor(Qt.CursorShape.PointingHandCursor)\n        self._cursor_overridden = False\n\n    def setEnabled(self, enabled):\n        super().setEnabled(enabled)\n        if enabled:\n            self.setCursor(Qt.CursorShape.PointingHandCursor)\n        else:\n            self.setCursor(Qt.CursorShape.ForbiddenCursor)\n\n        if self.underMouse():\n            QApplication.restoreOverrideCursor()\n            QApplication.setOverrideCursor(self.cursor().shape())\n\n    def setDisabled(self, disabled):\n        super().setDisabled(disabled)\n        if disabled:\n            self.setCursor(Qt.CursorShape.ForbiddenCursor)\n        else:\n            self.setCursor(Qt.CursorShape.PointingHandCursor)\n\n        if self.underMouse():\n            QApplication.restoreOverrideCursor()\n            QApplication.setOverrideCursor(self.cursor().shape())\n\n    def enterEvent(self, event):\n        super().enterEvent(event)\n        QApplication.restoreOverrideCursor()\n        QApplication.setOverrideCursor(self.cursor().shape())\n        self._cursor_overridden = True\n\n    def leaveEvent(self, event):\n        super().leaveEvent(event)\n        QApplication.restoreOverrideCursor()\n        self._cursor_overridden = False\n\n    def hideEvent(self, event):\n        if self._cursor_overridden:\n            QApplication.restoreOverrideCursor()\n            self._cursor_overridden = False\n        super().hideEvent(event)\n\n\nclass StatusMessageWidget(QWidget):\n    def __init__(self, widgetName, message):\n        super().__init__()\n        self.setObjectName(widgetName)\n\n        self.layout = QHBoxLayout()\n        self.layout.setSpacing(3)\n        self.setLayout(self.layout)\n\n        self.messageLabel = QLabel(message)\n        self.layout.addWidget(self.messageLabel)\n\n        self.loadingLabel = QLabel(\".\")\n        self.loadingLabel.setFixedWidth(20)\n        self.layout.addWidget(self.loadingLabel)\n\n        self.timer = QTimer(self)\n        self.timer.timeout.connect(self.update_loading_animation)\n        self.timer.start(500)\n\n    def update_loading_animation(self):\n        current_text = self.loadingLabel.text()\n        new_text = '.' * ((len(current_text) % 3) + 1)\n        self.loadingLabel.setText(new_text)\n\n    def update_message(self, newMessage, state=\"load\"):\n        self.messageLabel.setText(newMessage)\n        if state == \"load\":\n            if not self.loadingLabel.isVisible():\n                self.loadingLabel.show()\n            if not self.timer.isActive():\n                self.timer.start(500)\n            self.messageLabel.setStyleSheet(\"\")\n        elif state == \"error\":\n            self.timer.stop()\n            self.loadingLabel.hide()\n            self.messageLabel.setStyleSheet(\"QLabel { color: red; }\")\n\n\nclass MultilingualListWidget(QListWidget):\n    def __init__(self):\n        super().__init__()\n        self.english_font = QFont(QFontDatabase.applicationFontFamilies(QFontDatabase.addApplicationFont(font_config['en_US']))[0], 10)\n        self.chinese_simplified_font = QFont(QFontDatabase.applicationFontFamilies(QFontDatabase.addApplicationFont(font_config['zh_CN']))[0], 10)\n        self.chinese_traditional_font = QFont(QFontDatabase.applicationFontFamilies(QFontDatabase.addApplicationFont(font_config['zh_TW']))[0], 10)\n\n    def addItem(self, item):\n        if isinstance(item, str):\n            item = QListWidgetItem(item)\n\n        text = item.text()\n        if self.is_chinese_simplified(text):\n            item.setFont(self.chinese_simplified_font)\n        elif self.is_chinese_traditional(text):\n            item.setFont(self.chinese_traditional_font)\n        else:\n            item.setFont(self.english_font)\n\n        super().addItem(item)\n\n    @staticmethod\n    def is_chinese_simplified(text):\n        return any(char in simp for char in text)\n\n    @staticmethod\n    def is_chinese_traditional(text):\n        return any(char in trad for char in text)\n\n\nclass AlertWidget(QWidget):\n    def __init__(self, parent, message, alert_type):\n        super().__init__(parent)\n        self.message = message\n        self.alert_type = alert_type\n        self.margin = 10\n        self.auto_close_timer = None\n        self.colors = {\n            \"info\": \"#3498db\",     # Blue\n            \"success\": \"#007110\",  # Green\n            \"warning\": \"#f1c40f\",  # Yellow\n            \"error\": \"#e74c3c\",    # Red\n        }\n        self.init_ui()\n\n    def init_ui(self):\n        self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.Tool)\n        self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)\n\n        self.label = QLabel(self.message, self)\n        self.label.setStyleSheet(\"\"\"\n            color: white;\n            padding: 10px;\n            font-weight: bold;\n        \"\"\")\n        self.label.adjustSize()\n\n        # Adjust the size of the custom widget\n        alert_width = self.label.width()\n        alert_height = self.label.height()\n        self.setFixedSize(alert_width, alert_height)\n        self.label.move(0, 0)\n\n        # Add to the parent window's active alerts list\n        if hasattr(self.parent(), \"active_alerts\"):\n            self.parent().active_alerts.append(self)\n            self.enforce_alert_limit()\n            self.move_to_top_right()\n\n    def enforce_alert_limit(self):\n        \"\"\"Ensure the total height of alerts doesn't exceed the parent window height.\"\"\"\n        if self.parent():\n            max_alerts = (self.parent().height() - self.margin) // (self.height() + self.margin)\n            while len(self.parent().active_alerts) > max_alerts:\n                self.parent().active_alerts[0].close()\n\n    def move_to_top_right(self):\n        \"\"\"Position the alert at the top-right corner below the previous alerts.\"\"\"\n        if self.parent():\n            dialog_rect = self.parent().geometry()\n            for index, alert in enumerate(self.parent().active_alerts):\n                alert_x = dialog_rect.topRight().x() - alert.width() - self.margin\n                alert_y = dialog_rect.topRight().y() + self.margin + index * (alert.height() + self.margin)\n                alert.move(alert_x, alert_y)\n\n    def close(self):\n        \"\"\"Override close to remove the alert from the parent's active list and cancel auto-close timer.\"\"\"\n        # Cancel any pending auto-close timer\n        if self.auto_close_timer is not None:\n            self.auto_close_timer.stop()\n            self.auto_close_timer = None\n\n        # Remove from parent's active alerts list\n        if hasattr(self.parent(), \"active_alerts\") and self in self.parent().active_alerts:\n            self.parent().active_alerts.remove(self)\n            self.move_to_top_right()\n        super().close()\n\n    def paintEvent(self, event):\n        \"\"\"Draw the rounded rectangle background.\"\"\"\n        painter = QPainter(self)\n        painter.setBrush(QColor(self.colors[self.alert_type]))\n        painter.setPen(Qt.PenStyle.NoPen)\n        painter.drawRoundedRect(self.rect(), 5, 5)\n"
  },
  {
    "path": "src/scripts/widgets/trainer_management.py",
    "content": "from packaging import version\nimport subprocess\nimport re\n\nfrom PyQt6.QtWidgets import QCheckBox, QComboBox, QDialog, QFileDialog, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QSizePolicy, QTabWidget, QVBoxLayout, QWidget\nfrom PyQt6.QtGui import QIcon, QPixmap\nfrom PyQt6.QtCore import Qt, QTimer\n\nfrom config import *\nfrom widgets.custom_widgets import AlertWidget, CustomButton\nfrom threads.other_threads import WeModCustomization\n\n\nclass TrainerManagementDialog(QDialog):\n    def __init__(self, parent=None):\n        super().__init__(parent)\n        self.setWindowTitle(tr(\"Trainer Management\"))\n        self.setWindowIcon(QIcon(resource_path(\"assets/logo.ico\")))\n        self.setMinimumWidth(650)\n        self.active_alerts = []\n\n        # Main layout\n        mainLayout = QVBoxLayout()\n        mainLayout.setSpacing(15)\n        self.setLayout(mainLayout)\n\n        # Tab widget\n        self.tabWidget = QTabWidget(self)\n        self.tabWidget.setTabPosition(QTabWidget.TabPosition.North)\n        mainLayout.addWidget(self.tabWidget)\n\n        # Add tabs\n        self.tabWidget.addTab(self.createGCMTab(), \"GCM\")\n        self.tabWidget.addTab(self.createFlingTab(), tr(\"FLiNG\"))\n        self.tabWidget.addTab(self.createXiaoXingTab(), tr(\"XiaoXing\"))\n        self.tabWidget.addTab(self.createCETab(), \"Cheat Engine\")\n        self.tabWidget.addTab(self.createWemodTab(), \"Wand\")\n        self.tabWidget.addTab(self.createCevoTab(), \"Cheat Evolution\")\n\n    def closeEvent(self, event):\n        super().closeEvent(event)\n\n        while self.active_alerts:\n            self.active_alerts[0].close()\n\n        oldFlingServer = settings[\"flingDownloadServer\"]\n        newFlingServer = server_options[self.serverCombo.currentText()]\n        if oldFlingServer != newFlingServer:\n            self.parent().fetch_fling_data()\n        oldEnableXiaoXing = settings[\"enableXiaoXing\"]\n        newEnableXiaoXing = self.enableXiaoXingCheckbox.isChecked()\n        if not oldEnableXiaoXing and newEnableXiaoXing:\n            self.parent().fetch_xiaoxing_data()\n\n        settings[\"enableGCM\"] = self.enableGCMCheckbox.isChecked()\n        settings[\"autoUpdateGCMData\"] = self.autoUpdateGCMDataCheckbox.isChecked()\n        settings[\"autoUpdateGCMTrainers\"] = self.autoUpdateGCMTrainersCheckbox.isChecked()\n        settings[\"flingDownloadServer\"] = newFlingServer\n        settings[\"removeFlingBgMusic\"] = self.removeFlingBgMusicCheckbox.isChecked()\n        settings[\"autoUpdateFlingData\"] = self.autoUpdateFlingDataCheckbox.isChecked()\n        settings[\"autoUpdateFlingTrainers\"] = self.autoUpdateFlingTrainersCheckbox.isChecked()\n        settings[\"enableXiaoXing\"] = self.enableXiaoXingCheckbox.isChecked()\n        settings[\"unlockXiaoXing\"] = self.unlockXiaoXingCheckbox.isChecked()\n        settings[\"autoUpdateXiaoXingData\"] = self.autoUpdateXiaoXingDataCheckbox.isChecked()\n        settings[\"autoUpdateXiaoXingTrainers\"] = self.autoUpdateXiaoXingTrainersCheckbox.isChecked()\n        settings[\"enableCT\"] = self.enableCTCheckbox.isChecked()\n        settings[\"autoUpdateCTData\"] = self.autoUpdateCTDataCheckbox.isChecked()\n        settings[\"autoUpdateCTTrainers\"] = self.autoUpdateCTTrainersCheckbox.isChecked()\n        apply_settings(settings)\n\n    @staticmethod\n    def find_settings_key(value, dict):\n        try:\n            return next(key for key, val in dict.items() if val == value)\n        except StopIteration:\n            return next(iter(dict.values()))\n\n    def show_alert(self, message, alert_type):\n        alert = AlertWidget(self, message, alert_type)\n        alert.show()\n        alert.auto_close_timer = QTimer()\n        alert.auto_close_timer.setSingleShot(True)\n        alert.auto_close_timer.timeout.connect(alert.close)\n        alert.auto_close_timer.start(5000)\n\n    def moveEvent(self, event):\n        super().moveEvent(event)\n        for alert in self.active_alerts:\n            alert.move_to_top_right()\n\n    def createGCMTab(self):\n        gcmTab = QWidget()\n        layout = QVBoxLayout()\n        layout.setContentsMargins(0, 15, 0, 0)\n        gcmTab.setLayout(layout)\n\n        columns = QHBoxLayout()\n        columns.setContentsMargins(30, 20, 30, 20)\n        columns.setSpacing(40)\n        layout.addLayout(columns)\n\n        column1 = QVBoxLayout()\n        columns.addLayout(column1, stretch=2)\n\n        logoPixmap = QPixmap(resource_path(\"assets/logo_trainer.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(130, 130, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        column1.addWidget(logoLabel)\n\n        column2 = QVBoxLayout()\n        column2.setSpacing(15)\n        column2.addStretch(1)\n        columns.addLayout(column2, stretch=3)\n        columns.setAlignment(column2, Qt.AlignmentFlag.AlignHCenter)\n\n        # Enable GCM and Other trainer\n        self.enableGCMCheckbox = QCheckBox(tr(\"Enable search for GCM and Other trainers\"))\n        self.enableGCMCheckbox.setChecked(settings[\"enableGCM\"])\n        column2.addWidget(self.enableGCMCheckbox)\n\n        # Auto update GCM data\n        self.autoUpdateGCMDataCheckbox = QCheckBox(tr(\"Update GCM data automatically\"))\n        self.autoUpdateGCMDataCheckbox.setChecked(settings[\"autoUpdateGCMData\"])\n        column2.addWidget(self.autoUpdateGCMDataCheckbox)\n\n        # Auto update GCM trainers\n        self.autoUpdateGCMTrainersCheckbox = QCheckBox(tr(\"Update GCM and Other trainers automatically\"))\n        self.autoUpdateGCMTrainersCheckbox.setChecked(settings[\"autoUpdateGCMTrainers\"])\n        column2.addWidget(self.autoUpdateGCMTrainersCheckbox)\n\n        column2.addStretch(1)\n        return gcmTab\n\n    def createFlingTab(self):\n        flingTab = QWidget()\n        layout = QVBoxLayout()\n        layout.setContentsMargins(0, 15, 0, 0)\n        flingTab.setLayout(layout)\n        officialLink = QLabel(tr(\"Official Website: \") + '<a href=\"https://flingtrainer.com\" style=\"text-decoration: none; color: #0078D4;\">https://flingtrainer.com</a>')\n        officialLink.setOpenExternalLinks(True)\n        layout.addWidget(officialLink)\n\n        columns = QHBoxLayout()\n        columns.setContentsMargins(30, 20, 30, 20)\n        columns.setSpacing(40)\n        layout.addLayout(columns)\n\n        column1 = QVBoxLayout()\n        columns.addLayout(column1, stretch=2)\n\n        logoPixmap = QPixmap(resource_path(\"assets/fling.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(130, 130, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        column1.addWidget(logoLabel)\n\n        column2 = QVBoxLayout()\n        column2.setSpacing(15)\n        column2.addStretch(1)\n        columns.addLayout(column2, stretch=3)\n        columns.setAlignment(column2, Qt.AlignmentFlag.AlignHCenter)\n\n        # Fling server selection\n        serverLayout = QVBoxLayout()\n        serverLayout.setSpacing(2)\n        column2.addLayout(serverLayout)\n        serverLayout.addWidget(QLabel(tr(\"Download Server:\")))\n        self.serverCombo = QComboBox()\n        self.serverCombo.addItems(server_options.keys())\n        self.serverCombo.setCurrentText(self.find_settings_key(settings[\"flingDownloadServer\"], server_options))\n        self.serverCombo.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)\n        serverLayout.addWidget(self.serverCombo, stretch=1)\n\n        # Remove Fling trainer background music when downloading\n        self.removeFlingBgMusicCheckbox = QCheckBox(tr(\"Remove trainer background music\"))\n        self.removeFlingBgMusicCheckbox.setChecked(settings[\"removeFlingBgMusic\"])\n        column2.addWidget(self.removeFlingBgMusicCheckbox)\n\n        # Auto update Fling data\n        self.autoUpdateFlingDataCheckbox = QCheckBox(tr(\"Update FLiNG data automatically\"))\n        self.autoUpdateFlingDataCheckbox.setChecked(settings[\"autoUpdateFlingData\"])\n        column2.addWidget(self.autoUpdateFlingDataCheckbox)\n\n        # Auto update Fling trainers\n        self.autoUpdateFlingTrainersCheckbox = QCheckBox(tr(\"Update FLiNG trainers automatically\"))\n        self.autoUpdateFlingTrainersCheckbox.setChecked(settings[\"autoUpdateFlingTrainers\"])\n        column2.addWidget(self.autoUpdateFlingTrainersCheckbox)\n\n        column2.addStretch(1)\n        return flingTab\n\n    def createXiaoXingTab(self):\n        xiaoXingTab = QWidget()\n        layout = QVBoxLayout()\n        layout.setContentsMargins(0, 15, 0, 0)\n        xiaoXingTab.setLayout(layout)\n        officialLink = QLabel(tr(\"Official Website: \") + '<a href=\"https://www.xiaoxingjie.com\" style=\"text-decoration: none; color: #0078D4;\">https://www.xiaoxingjie.com</a>')\n        officialLink.setOpenExternalLinks(True)\n        layout.addWidget(officialLink)\n\n        columns = QHBoxLayout()\n        columns.setContentsMargins(30, 20, 30, 20)\n        columns.setSpacing(40)\n        layout.addLayout(columns)\n\n        column1 = QVBoxLayout()\n        columns.addLayout(column1, stretch=2)\n\n        logoPixmap = QPixmap(resource_path(\"assets/xiaoxing.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(130, 130, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        column1.addWidget(logoLabel)\n\n        column2 = QVBoxLayout()\n        column2.setSpacing(15)\n        column2.addStretch(1)\n        columns.addLayout(column2, stretch=3)\n        columns.setAlignment(column2, Qt.AlignmentFlag.AlignHCenter)\n\n        # Enable XiaoXing trainer\n        self.enableXiaoXingCheckbox = QCheckBox(tr(\"Enable search for XiaoXing trainers\"))\n        self.enableXiaoXingCheckbox.setChecked(settings[\"enableXiaoXing\"])\n        column2.addWidget(self.enableXiaoXingCheckbox)\n\n        # Unlock paid functions\n        self.unlockXiaoXingCheckbox = QCheckBox(tr(\"Unlock all functions\"))\n        self.unlockXiaoXingCheckbox.setChecked(settings[\"unlockXiaoXing\"])\n        column2.addWidget(self.unlockXiaoXingCheckbox)\n\n        # Auto update XiaoXing data\n        self.autoUpdateXiaoXingDataCheckbox = QCheckBox(tr(\"Update XiaoXing data automatically\"))\n        self.autoUpdateXiaoXingDataCheckbox.setChecked(settings[\"autoUpdateXiaoXingData\"])\n        column2.addWidget(self.autoUpdateXiaoXingDataCheckbox)\n\n        # Auto update XiaoXing trainers\n        self.autoUpdateXiaoXingTrainersCheckbox = QCheckBox(tr(\"Update XiaoXing trainers automatically\"))\n        self.autoUpdateXiaoXingTrainersCheckbox.setChecked(settings[\"autoUpdateXiaoXingTrainers\"])\n        column2.addWidget(self.autoUpdateXiaoXingTrainersCheckbox)\n\n        column2.addStretch(1)\n        return xiaoXingTab\n\n    def createCETab(self):\n        ceTab = QWidget()\n        layout = QVBoxLayout()\n        layout.setContentsMargins(0, 15, 0, 0)\n        ceTab.setLayout(layout)\n        officialLink = QLabel(tr(\"Official Website: \") + '<a href=\"https://www.cheatengine.org\" style=\"text-decoration: none; color: #0078D4;\">https://www.cheatengine.org</a>')\n        officialLink.setOpenExternalLinks(True)\n        layout.addWidget(officialLink)\n        ctLink = QLabel(tr(\"Cheat Table Sources: \") + '<a href=\"https://www.thecheatscript.com\" style=\"text-decoration: none; color: #0078D4;\">https://www.thecheatscript.com</a>')\n        ctLink.setOpenExternalLinks(True)\n        layout.addWidget(ctLink)\n\n        columns = QHBoxLayout()\n        columns.setContentsMargins(30, 20, 30, 20)\n        columns.setSpacing(40)\n        layout.addLayout(columns)\n\n        column1 = QVBoxLayout()\n        columns.addLayout(column1, stretch=2)\n\n        logoPixmap = QPixmap(resource_path(\"assets/ce.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(130, 130, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        column1.addWidget(logoLabel)\n\n        column2 = QVBoxLayout()\n        column2.setSpacing(15)\n        column2.addStretch(1)\n        columns.addLayout(column2, stretch=3)\n        columns.setAlignment(column2, Qt.AlignmentFlag.AlignHCenter)\n\n        # CE installation status\n        self.installStatus = QLabel()\n        column2.addWidget(self.installStatus)\n\n        # CE installation path\n        installLayout = QVBoxLayout()\n        installLayout.setSpacing(2)\n        column2.addLayout(installLayout)\n\n        installLabelLayout = QHBoxLayout()\n        installLabelLayout.setSpacing(3)\n        installLayout.addLayout(installLabelLayout)\n        installLabelLayout.addWidget(QLabel(tr(\"Cheat Engine installation path:\")))\n        self.ceResetButton = CustomButton(tr('Reset to default'))\n        self.ceResetButton.setStyleSheet(\"padding: 3;\")\n        font = self.ceResetButton.font()\n        font.setPointSize(8)\n        self.ceResetButton.setFont(font)\n        self.ceResetButton.clicked.connect(self.resetCEPath)\n        installLabelLayout.addWidget(self.ceResetButton)\n        installLabelLayout.addStretch(1)\n\n        installPathLayout = QHBoxLayout()\n        installPathLayout.setSpacing(5)\n        installLayout.addLayout(installPathLayout)\n        self.ceInstallLineEdit = QLineEdit()\n        self.ceInstallLineEdit.setReadOnly(True)\n        installPathLayout.addWidget(self.ceInstallLineEdit)\n        installPathButton = CustomButton(\"...\")\n        installPathButton.clicked.connect(self.selectCEPath)\n        installPathLayout.addWidget(installPathButton)\n\n        # Add simplified chinese\n        self.addzhCNCheckbox = QCheckBox(tr(\"Add Simplified Chinese\"))\n        column2.addWidget(self.addzhCNCheckbox)\n\n        # add a dashed line\n        line = QLabel()\n        line.setFixedHeight(1)\n        line.setStyleSheet(\"background-color: #C0C0C0;\")\n        column2.addWidget(line)\n\n        # Enable CT\n        self.enableCTCheckbox = QCheckBox(tr(\"Enable Search for Cheat Tables\"))\n        self.enableCTCheckbox.setChecked(settings[\"enableCT\"])\n        column2.addWidget(self.enableCTCheckbox)\n\n        # Auto update CT data\n        self.autoUpdateCTDataCheckbox = QCheckBox(tr(\"Update Cheat Table data automatically\"))\n        self.autoUpdateCTDataCheckbox.setChecked(settings[\"autoUpdateCTData\"])\n        column2.addWidget(self.autoUpdateCTDataCheckbox)\n\n        # Auto update CT trainers\n        self.autoUpdateCTTrainersCheckbox = QCheckBox(tr(\"Update Cheat Tables automatically\"))\n        self.autoUpdateCTTrainersCheckbox.setChecked(settings[\"autoUpdateCTTrainers\"])\n        column2.addWidget(self.autoUpdateCTTrainersCheckbox)\n\n        # Apply button\n        applyButtonLayout = QHBoxLayout()\n        applyButtonLayout.setContentsMargins(0, 0, 10, 10)\n        applyButtonLayout.addStretch(1)\n        layout.addLayout(applyButtonLayout)\n        self.ceApplyButton = CustomButton(tr(\"Apply\"))\n        self.ceApplyButton.setFixedWidth(100)\n        self.ceApplyButton.clicked.connect(self.applyCheatEngineCustomization)\n        applyButtonLayout.addWidget(self.ceApplyButton)\n\n        self.ceInstallLineEdit.setText(settings[\"cePath\"])\n        self.checkCEInstallStatus()\n\n        column2.addStretch(1)\n        return ceTab\n\n    def createWemodTab(self):\n        wemodTab = QWidget()\n        layout = QVBoxLayout()\n        layout.setContentsMargins(0, 15, 0, 0)\n        wemodTab.setLayout(layout)\n        officialLink = QLabel(tr(\"Official Website: \") + '<a href=\"https://wand.com\" style=\"text-decoration: none; color: #0078D4;\">https://wand.com</a>')\n        officialLink.setOpenExternalLinks(True)\n        layout.addWidget(officialLink)\n\n        columns = QHBoxLayout()\n        columns.setContentsMargins(30, 20, 30, 20)\n        columns.setSpacing(40)\n        layout.addLayout(columns)\n\n        column1 = QVBoxLayout()\n        columns.addLayout(column1, stretch=2)\n\n        logoPixmap = QPixmap(resource_path(\"assets/wand.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(130, 130, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        column1.addWidget(logoLabel)\n\n        column2 = QVBoxLayout()\n        column2.setSpacing(15)\n        column2.addStretch(1)\n        columns.addLayout(column2, stretch=3)\n        columns.setAlignment(column2, Qt.AlignmentFlag.AlignHCenter)\n\n        # WeMod installation path\n        installLayout = QVBoxLayout()\n        installLayout.setSpacing(2)\n        column2.addLayout(installLayout)\n\n        installLabelLayout = QHBoxLayout()\n        installLabelLayout.setSpacing(3)\n        installLayout.addLayout(installLabelLayout)\n        installLabelLayout.addWidget(QLabel(tr(\"Wand installation path:\")))\n        self.weModResetButton = CustomButton(tr('Reset to default'))\n        self.weModResetButton.setStyleSheet(\"padding: 3;\")\n        font = self.weModResetButton.font()\n        font.setPointSize(8)\n        self.weModResetButton.setFont(font)\n        self.weModResetButton.clicked.connect(self.resetWemodPath)\n        installLabelLayout.addWidget(self.weModResetButton)\n        installLabelLayout.addStretch(1)\n\n        installPathLayout = QHBoxLayout()\n        installPathLayout.setSpacing(5)\n        installLayout.addLayout(installPathLayout)\n        self.weModInstallLineEdit = QLineEdit()\n        self.weModInstallLineEdit.setReadOnly(True)\n        installPathLayout.addWidget(self.weModInstallLineEdit)\n        installPathButton = CustomButton(\"...\")\n        installPathButton.clicked.connect(self.selectWeModPath)\n        installPathLayout.addWidget(installPathButton)\n\n        # Version selection\n        versionLayout = QVBoxLayout()\n        versionLayout.setSpacing(2)\n        column2.addLayout(versionLayout)\n        versionLayout.addWidget(QLabel(tr(\"Installed Wand Versions:\")))\n        self.versionCombo = QComboBox()\n        versionLayout.addWidget(self.versionCombo)\n\n        # Patch method selection\n        patchLayout = QVBoxLayout()\n        patchLayout.setSpacing(2)\n        column2.addLayout(patchLayout)\n        patchLayout.addWidget(QLabel(tr(\"Patch Method:\")))\n        self.patchCombo = QComboBox()\n        self.patchCombo.addItems(patch_methods.keys())\n        self.patchCombo.setCurrentText(list(patch_methods.keys())[0])\n        patchLayout.addWidget(self.patchCombo)\n\n        # Unlock WeMod pro\n        self.weModProCheckbox = QCheckBox(tr(\"Activate Wand Pro\"))\n        column2.addWidget(self.weModProCheckbox)\n\n        # Disable auto update\n        self.disableUpdateCheckbox = QCheckBox(tr(\"Disable Wand Auto Update\"))\n        column2.addWidget(self.disableUpdateCheckbox)\n\n        # Delete all other WeMod versions\n        self.delOtherVersionsCheckbox = QCheckBox(tr(\"Delete All Other Wand Versions\"))\n        column2.addWidget(self.delOtherVersionsCheckbox)\n\n        # Apply button\n        applyButtonLayout = QHBoxLayout()\n        applyButtonLayout.setContentsMargins(0, 0, 10, 10)\n        applyButtonLayout.addStretch(1)\n        layout.addLayout(applyButtonLayout)\n        self.weModApplyButton = CustomButton(tr(\"Apply\"))\n        self.weModApplyButton.setFixedWidth(100)\n        self.weModApplyButton.clicked.connect(self.applyWeModCustomization)\n        applyButtonLayout.addWidget(self.weModApplyButton)\n\n        self.weModInstallLineEdit.setText(settings[\"weModPath\"])\n        self.findWeModVersions(settings[\"weModPath\"])\n\n        column2.addStretch(1)\n        return wemodTab\n\n    def createCevoTab(self):\n        cevoTab = QWidget()\n        layout = QVBoxLayout()\n        layout.setContentsMargins(0, 15, 0, 0)\n        cevoTab.setLayout(layout)\n        officialLink = QLabel(tr(\"Official Website: \") + '<a href=\"https://cheatevolution.com\" style=\"text-decoration: none; color: #0078D4;\">https://cheatevolution.com</a>')\n        officialLink.setOpenExternalLinks(True)\n        layout.addWidget(officialLink)\n\n        columns = QHBoxLayout()\n        columns.setContentsMargins(30, 20, 30, 20)\n        columns.setSpacing(40)\n        layout.addLayout(columns)\n\n        column1 = QVBoxLayout()\n        columns.addLayout(column1, stretch=2)\n\n        logoPixmap = QPixmap(resource_path(\"assets/cevo.png\"))\n        scaledLogoPixmap = logoPixmap.scaled(130, 130, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)\n        logoLabel = QLabel()\n        logoLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)\n        logoLabel.setPixmap(scaledLogoPixmap)\n        column1.addWidget(logoLabel)\n\n        column2 = QVBoxLayout()\n        column2.setSpacing(15)\n        column2.addStretch(1)\n        columns.addLayout(column2, stretch=3)\n        columns.setAlignment(column2, Qt.AlignmentFlag.AlignHCenter)\n\n        # Cheat Evolution installation status\n        self.cevoInstallStatus = QLabel()\n        column2.addWidget(self.cevoInstallStatus)\n\n        # Cheat Evolution installation path\n        installLayout = QVBoxLayout()\n        installLayout.setSpacing(2)\n        column2.addLayout(installLayout)\n\n        installLabelLayout = QHBoxLayout()\n        installLabelLayout.setSpacing(3)\n        installLayout.addLayout(installLabelLayout)\n        installLabelLayout.addWidget(QLabel(tr(\"Cheat Evolution installation path:\")))\n        installLabelLayout.addStretch(1)\n\n        installPathLayout = QHBoxLayout()\n        installPathLayout.setSpacing(5)\n        installLayout.addLayout(installPathLayout)\n        self.cevoInstallLineEdit = QLineEdit()\n        self.cevoInstallLineEdit.setReadOnly(True)\n        installPathLayout.addWidget(self.cevoInstallLineEdit)\n        cevoInstallPathButton = CustomButton(\"...\")\n        cevoInstallPathButton.clicked.connect(self.selectCevoPath)\n        installPathLayout.addWidget(cevoInstallPathButton)\n\n        # Activate PRO\n        self.cevoProCheckbox = QCheckBox(tr(\"Activate PRO\"))\n        column2.addWidget(self.cevoProCheckbox)\n\n        # Apply button\n        applyButtonLayout = QHBoxLayout()\n        applyButtonLayout.setContentsMargins(0, 0, 10, 10)\n        applyButtonLayout.addStretch(1)\n        layout.addLayout(applyButtonLayout)\n        self.cevoApplyButton = CustomButton(tr(\"Apply\"))\n        self.cevoApplyButton.setFixedWidth(100)\n        self.cevoApplyButton.clicked.connect(self.applyCevoCustomization)\n        applyButtonLayout.addWidget(self.cevoApplyButton)\n\n        self.cevoInstallLineEdit.setText(settings.get(\"cevoPath\", \"\"))\n        self.checkCevoInstallStatus()\n\n        column2.addStretch(1)\n        return cevoTab\n\n    # ===========================================================================\n    # Tab functions\n    # ===========================================================================\n    def selectWeModPath(self):\n        initialPath = self.weModInstallLineEdit.text() or os.path.expanduser(\"~\")\n        directory = QFileDialog.getExistingDirectory(self, tr(\"Please select Wand installation path\"), initialPath)\n        if directory:\n            settings[\"weModPath\"] = os.path.normpath(directory)\n            self.weModInstallLineEdit.setText(settings[\"weModPath\"])\n            apply_settings(settings)\n            self.findWeModVersions(settings[\"weModPath\"])\n\n    def resetWemodPath(self):\n        self.weModInstallLineEdit.setText(wemod_install_path)\n        settings[\"weModPath\"] = os.path.normpath(wemod_install_path)\n        apply_settings(settings)\n        self.findWeModVersions(settings[\"weModPath\"])\n\n    def selectCEPath(self):\n        initialPath = self.ceInstallLineEdit.text() or os.path.expanduser(\"~\")\n        directory = QFileDialog.getExistingDirectory(self, tr(\"Please select Cheat Engine installation path\"), initialPath)\n        if directory:\n            settings[\"cePath\"] = os.path.normpath(directory)\n            self.ceInstallLineEdit.setText(settings[\"cePath\"])\n            apply_settings(settings)\n            self.checkCEInstallStatus()\n\n    def resetCEPath(self):\n        self.ceInstallLineEdit.setText(ce_install_path)\n        settings[\"cePath\"] = os.path.normpath(ce_install_path)\n        apply_settings(settings)\n        self.checkCEInstallStatus()\n\n    def checkCEInstallStatus(self):\n        cePath = os.path.join(self.ceInstallLineEdit.text(), 'Cheat Engine.exe')\n        if os.path.exists(cePath):\n            self.installStatus.setText(tr(\"Cheat Engine is installed\"))\n            self.installStatus.setStyleSheet(\"color: green;\")\n            self.ceApplyButton.setEnabled(True)\n        else:\n            self.installStatus.setText(tr(\"Please select Cheat Engine installation path\"))\n            self.installStatus.setStyleSheet(\"color: red;\")\n            self.ceApplyButton.setDisabled(True)\n\n    def findWeModVersions(self, weModPath):\n        self.weModVersions = []\n        if not os.path.exists(weModPath):\n            self.versionCombo.clear()\n            self.versionCombo.addItem(tr(\"Wand not installed\"))\n            self.weModApplyButton.setDisabled(True)\n            return\n\n        for item in os.listdir(weModPath):\n            if os.path.isdir(os.path.join(weModPath, item)):\n                match = re.match(r'app-(\\d+\\.\\d+\\.\\d+.*)', item)\n                if match:\n                    version_info = match.group(1)  # for instance: 9.3.0, 11.5.0-beta00\n                    self.weModVersions.append(version_info)\n\n        if not self.weModVersions:\n            self.versionCombo.clear()\n            self.versionCombo.addItem(tr(\"Wand not installed\"))\n            self.weModApplyButton.setDisabled(True)\n            return\n\n        self.weModVersions.sort(key=version.parse, reverse=True)\n        self.versionCombo.clear()\n        self.versionCombo.addItems(self.weModVersions)\n        self.weModApplyButton.setEnabled(True)\n\n    def on_finished(self):\n        self.weModApplyButton.setEnabled(True)\n        self.weModResetButton.setEnabled(True)\n        self.findWeModVersions(settings[\"weModPath\"])\n\n    def applyWeModCustomization(self):\n        weModInstallPath = self.weModInstallLineEdit.text()\n        selectedWeModVersion = self.versionCombo.currentText()\n        patchMethod = patch_methods[self.patchCombo.currentText()]\n        self.weModApplyButton.setDisabled(True)\n        self.weModResetButton.setDisabled(True)\n\n        self.apply_thread = WeModCustomization(self.weModVersions, weModInstallPath, selectedWeModVersion, patchMethod, self)\n        self.apply_thread.message.connect(self.show_alert, Qt.ConnectionType.BlockingQueuedConnection)\n        self.apply_thread.finished.connect(self.on_finished)\n        self.apply_thread.start()\n\n    def applyCheatEngineCustomization(self):\n        self.ceApplyButton.setDisabled(True)\n        self.ceResetButton.setDisabled(True)\n\n        if self.addzhCNCheckbox.isChecked():\n            msg_box = QMessageBox(\n                QMessageBox.Icon.Question,\n                tr(\"Administrator Access Required\"),\n                tr(\"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\") +\n                \"\\n\\n\" + tr(\"Would you like to continue?\"),\n                QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,\n                self\n            )\n\n            yes_button = msg_box.button(QMessageBox.StandardButton.Yes)\n            yes_button.setText(tr(\"Yes\"))\n            no_button = msg_box.button(QMessageBox.StandardButton.No)\n            no_button.setText(tr(\"No\"))\n            reply = msg_box.exec()\n\n            if reply == QMessageBox.StandardButton.Yes:\n                source_path = resource_path(\"dependency/CE Translations/zh_CN\")\n                destination_path = os.path.join(self.ceInstallLineEdit.text(), \"languages\", \"zh_CN\")\n\n                try:\n                    subprocess.run([elevator_path, 'copy', source_path, destination_path], check=True, shell=True)\n                    self.show_alert(tr(\"Successfully added translation files\"), 'success')\n                except subprocess.CalledProcessError:\n                    self.show_alert(tr(\"Failed to add translation files\"), 'error')\n\n        self.ceApplyButton.setEnabled(True)\n        self.ceResetButton.setEnabled(True)\n\n    def selectCevoPath(self):\n        initialPath = self.cevoInstallLineEdit.text() or os.path.expanduser(\"~\")\n        directory = QFileDialog.getExistingDirectory(self, tr(\"Please select Cheat Evolution installation path\"), initialPath)\n        if directory:\n            settings[\"cevoPath\"] = os.path.normpath(directory)\n            self.cevoInstallLineEdit.setText(settings[\"cevoPath\"])\n            apply_settings(settings)\n            self.checkCevoInstallStatus()\n\n    def checkCevoInstallStatus(self):\n        cevoPatchPath = os.path.join(self.cevoInstallLineEdit.text(), 'CheatEvolution_patched.exe')\n        cevoPath = os.path.join(self.cevoInstallLineEdit.text(), 'CheatEvolution.exe')\n        if os.path.exists(cevoPatchPath):\n            self.cevoInstallStatus.setText(tr(\"Please launch Cheat Evolution using CheatEvolution_patched.exe\"))\n            self.cevoInstallStatus.setStyleSheet(\"color: green;\")\n            self.cevoApplyButton.setEnabled(True)\n        elif not os.path.exists(cevoPath):\n            self.cevoInstallStatus.setText(tr(\"Invalid Cheat Evolution installation path\"))\n            self.cevoInstallStatus.setStyleSheet(\"color: red;\")\n            self.cevoApplyButton.setDisabled(True)\n        else:\n            self.cevoInstallStatus.setText(tr(\"Cheat Evolution is installed and ready to patch\"))\n            self.cevoInstallStatus.setStyleSheet(\"color: yellow;\")\n            self.cevoApplyButton.setEnabled(True)\n\n    def applyCevoCustomization(self):\n        self.cevoApplyButton.setDisabled(True)\n\n        if self.cevoProCheckbox.isChecked():\n            msg_box = QMessageBox(\n                QMessageBox.Icon.Question,\n                tr(\"Administrator Access Required\"),\n                tr(\"To proceed with adding translation files, administrator rights are needed. A User Account Control (UAC) prompt will appear for permission.\") +\n                \"\\n\\n\" + tr(\"Would you like to continue?\"),\n                QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,\n                self\n            )\n\n            yes_button = msg_box.button(QMessageBox.StandardButton.Yes)\n            yes_button.setText(tr(\"Yes\"))\n            no_button = msg_box.button(QMessageBox.StandardButton.No)\n            no_button.setText(tr(\"No\"))\n            reply = msg_box.exec()\n\n            if reply == QMessageBox.StandardButton.Yes:\n                source_path = resource_path(\"dependency/CheatEvolution_patched.exe\")\n                destination_path = os.path.join(self.cevoInstallLineEdit.text(), \"CheatEvolution_patched.exe\")\n\n                try:\n                    subprocess.run([elevator_path, 'copy', source_path, destination_path], check=True, shell=True)\n                    self.show_alert(tr(\"Patch successful\"), 'success')\n                except subprocess.CalledProcessError:\n                    self.show_alert(tr(\"Failed to patch\"), 'error')\n\n        self.cevoApplyButton.setEnabled(True)\n        self.checkCevoInstallStatus()\n"
  }
]