[
  {
    "path": ".github/workflows/switchScript.yaml",
    "content": "name: switchScript\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - 'README.md'\n      - 'switchScript.sh'\n  schedule:\n    - cron: 0 8 * * *\n\nenv:\n  SCRIPT_SH: switchScript.sh\n  TZ: Asia/Shanghai\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v6\n      with:\n        ref: main\n\n    - name: Initialization environment\n      env:\n        DEBIAN_FRONTEND: noninteractive\n      run: |\n        sudo -E apt install -y jq\n\n    - name: \"Build & Release\"\n      run: |\n        echo \"DATE=$(date \"+%Y-%m-%d %H:%M:%S\")\" >> $GITHUB_ENV\n        echo \"tag_name=$(date +%Y%m%d)\" >> $GITHUB_ENV\n        chmod +x $SCRIPT_SH\n        ./$SCRIPT_SH\n        zip -rq SwitchSD.zip SwitchSD\n\n    - name: Read description.txt\n      id: description\n      uses: juliangruber/read-file-action@v1\n      with:\n        path: ./description.txt\n\n    - name: Create release\n      uses: ncipollo/release-action@v1\n      with:\n        name: ${{ env.DATE }} ❤️ | 大气层个人整合包\n        allowUpdates: true\n        tag: ${{ env.tag_name }}\n        commit: main\n        token: ${{ secrets.actions_release }}\n        body: \"${{ steps.description.outputs.content }}\"\n        artifacts: \"SwitchSD.zip\"\n\n    - name: Remove old Releases\n      uses: dev-drprasad/delete-older-releases@v0.3.4\n      with:\n        keep_latest: 5\n        delete_tags: true\n      env:\n        GITHUB_TOKEN: ${{ secrets.actions_release }}\n\n    - name: Delete workflow runs for current repo\n      uses: Mattraks/delete-workflow-runs@v2.1.0\n      with:\n        token: ${{ secrets.actions_release }}\n        repository: ${{ github.repository }}\n        retain_days: 7\n        keep_minimum_runs: 6"
  },
  {
    "path": "README.md",
    "content": "# 大气层个人整合包生成脚本\n\n## 功能如下：\n\n- 下载最新：\n  - 大气层三件套\n    - [x] `Atmosphere + Fusee` [From Here](https://github.com/Atmosphere-NX/Atmosphere/releases/latest)\n    - [x] `Hekate + Nyx 简体中文` [From Here](https://github.com/easyworld/hekate/releases/latest)\n    - [x] `Sigpatches` [From Here](https://gbatemp.net/threads/sigpatches-for-atmosphere-hekate-fss0-fusee-package3.571543/page-275#post-10692213)\n  - Payload插件\n    - [x] 主机系统的密钥提取工具 `Lockpick_RCM` [From Here](https://github.com/zdm65477730/Lockpick_RCMDecScots/releases/latest)\n    - [x] Hekate下的文件管理工具 `TegraExplorer` [From Here](https://github.com/zdm65477730/TegraExplorer/releases/latest)\n    - [x] Hekate下删除主题和关闭插件自动启动 `CommonProblemResolver` [From Here](https://github.com/zdm65477730/CommonProblemResolver/releases/latest)\n  - Nro插件\n    - [x] 联网检测是否屏蔽任天堂服务器 `Switch_90DNS_tester` [From Here](https://github.com/meganukebmp/Switch_90DNS_tester/releases/latest)\n    - [x] 游戏安装，存档管理和文件传输工具 `DBI` [From Here](https://github.com/gzk47/DBIPatcher/releases/latest)\n    - [x] 游戏安装和文件传输工具 `Awoo Installer` [From Here](https://github.com/Huntereb/Awoo-Installer/releases/latest)\n    - [x] 深海工具箱 `Hekate-toolbox` [From Here](https://github.com/WerWolv/Hekate-Toolbox/releases/latest)\n    - [x] 游戏游玩时间记录工具 `NX-Activity-Log` [From Here](https://github.com/zdm65477730/NX-Activity-Log/releases/latest)\n    - [x] 主题安装工具 `NXThemesInstaller` [From Here](https://github.com/exelix11/SwitchThemeInjector/releases/latest)\n    - [x] 游戏存档管理工具 `JKSV` [From Here](https://github.com/J-D-K/JKSV/releases/latest)\n    - [x] 系统切换工具 `tencent-switcher-gui` [From Here](https://github.com/CaiMiao/Tencent-switcher-GUI/releases/latest)\n    - [x] 多工具合一任天堂Switch更新器 `aio-switch-updater` [From Here](https://github.com/HamletDuFromage/aio-switch-updater/releases/latest)\n    - [x] 第三方B站客户端 `wiliwili` [From Here](https://github.com/xfangfang/wiliwili/releases/latest)\n    - [x] Mod下载器 `SimpleModDownloader` [From Here](https://github.com/PoloNX/SimpleModDownloader/releases/latest)\n    - [x] Jellyfin客户端 `Switchfin` [From Here](https://github.com/dragonflylee/switchfin/releases/latest)\n    - [x] 串流工具 `Moonlight` [From Here](https://github.com/XITRIX/Moonlight-Switch/releases/latest)\n    - [x] 文件管理 `NX-Shell` [From Here](https://github.com/zdm65477730/NX-Shell/releases/latest)\n    - [x] Homebrew 启动器 `Sphaira` [From Here](https://github.com/ITotalJustice/sphaira/releases/latest)\n    - [x] 黑商店 `hb-appstore`  [From Here](https://github.com/fortheusers/hb-appstore/releases/latest)\n    - [x] 系统升级工具 `daybreak`  [From Here](https://www.tekqart.com/thread-258184-1-1.html)\n\n  - 补丁\n    - [x] 主题破解 `theme-patches` [From Here](https://github.com/exelix11/theme-patches)\n  - Ultrahand\n    - [x] 加载器 `nx-ovlloader` [From Here](https://github.com/zdm65477730/nx-ovlloader/releases/latest)\n    - [x] 菜单 `Ultrahand-Overlay` [From Here](https://github.com/zdm65477730/Ultrahand-Overlay/releases/latest)\n  - Ovl插件\n    - [x] 金手指工具 `EdiZon` [From Here](https://github.com/zdm65477730/EdiZon-Overlay/releases/latest)\n    - [x] 系统模块 `ovl-sysmodules` [From Here](https://github.com/zdm65477730/ovl-sysmodules/releases/latest)\n    - [x] 系统监视 `StatusMonitor` [From Here](https://github.com/zdm65477730/Status-Monitor-Overlay/releases/latest)\n    - [x] 掌机底座模式切换 `ReverseNX-RT` [From Here](https://github.com/zdm65477730/ReverseNX-RT/releases/latest)\n    - [x] 局域网联机 `ldn_mitm` [From Here](https://github.com/zdm65477730/ldn_mitm/releases/latest)\n    - [x] 虚拟Amiibo `emuiibo` [From Here](https://github.com/zdm65477730/emuiibo/releases/latest)\n    - [x] 时间同步 `QuickNTP` [From Here](https://github.com/zdm65477730/QuickNTP/releases/latest)\n    - [x] 色彩调整 `Fizeau` [From Here](https://github.com/zdm65477730/Fizeau/releases/latest)\n    - [x] 系统补丁 `sys-patch` [From Here](https://github.com/zdm65477730/sys-patch/releases/latest)\n    - [x] 超频插件 `sys-clk` [From Here](https://github.com/zdm65477730/sys-clk/releases/latest)\n    - [x] 调频插件 `OC Toolkit` [From Here](https://github.com/halop/OC_Toolkit_SC_EOS/releases/latest)\n\n  - 其他\n    - [x] 蓝牙手柄插件 `MissionControl` [From Here](https://github.com/ndeadly/MissionControl/releases/latest)\n\n- 文件操作：\n    - [x] 移动 `fusee.bin` 至 `bootloader/payloads` 文件夹\n    - [x] 将 `hekate_ctcaer_*.bin` 重命名为 `payload.bin`\n    - [x] 在 `bootloader` 文件夹中创建 `hekate_ipl.ini`\n    - [x] 在根目录中创建 `exosphere.ini`\n    - [x] 在 `atmosphere/hosts` 文件夹中创建 `emummc.txt` 和 `sysmmc.txt`\n    - [x] 在根目录中创建 `boot.ini`\n    - [x] 在 `atmosphere/config` 文件夹中创建 `override_config.ini`\n    - [x] 在 `atmosphere/config` 文件夹中创建 `system_settings.ini`\n    - [x] 删除 `switch` 文件夹中 `haze.nro`\n    - [x] 删除 `switch` 文件夹中 `daybreak.nro`\n    - [x] 删除 `switch` 文件夹中 `reboot_to_payload.nro`\n\n## 使用说明（仅适用于 `Linux` ，科学上网环境）:\n  - 安装 `jq` 工具\n  - 运行脚本（switchScript.sh）\n\n## 更新日志\n- 2026-04-18 添加 `Sphaira` 启动器\n- 2026-03-01 精简优化 `switchScript.sh`\n- 2025-12-28 去除 `Zing` 和 `sys-tune`，更新 `DBI` 、 `Awoo Installer` 及 `emuiibo` 仓库地址\n- 2025-10-06 更新 `system_settings.ini`\n- 2025-05-27 精简代码，修正由于 `API` 限制而造成的运行错误\n- 2025-05-23 批量更新插件地址\n- 2025-05-12 更新 `Lockpick_RCM` 仓库地址\n- 2025-05-11 更新 `hekate_ipl.ini`\n- 2024-12-11 更新 `Lockpick_RCM` 仓库地址，降级 `DBI` 至版本658\n- 2024-10-29 更新脚本，修正 `sys-patch` 文件更新造成的运行错误\n- 2024-10-11 更新脚本，修正 `Lockpick_RCM` 仓库失效造成的运行错误\n- 2024-08-26 更新脚本，修正 `OC Toolkit` 更新造成的运行错误\n- 2024-07-21 添加 `sys-clk`、`OC Toolkit`\n- 2024-07-16 更新脚本，替换 `Tesla-Menu` 为 `Ultrahand-Overlay`，去除 `sys-clk`\n- 2024-07-06 更新 `daybreak` 为汉化版\n- 2024-06-29 添加 `hb-appstore`\n- 2024-06-22 添加 `SigPatches`、`MissionControl`\n- 2024-06-20 更新 `hekate_ipl.ini` 修正启动时 `nosigchk` 报错；集成 `NX-Shell`\n- 2024-06-16 更新 `Hekate + Nyx`、`sys-patch` 仓库链接，去除 `SigPatches`\n- 2024-05-25 更新 `sys-patch`，集成`Moonlight`\n- 2024-05-15 更新 `SigPatches`，修正部分游戏运行错误的情况\n- 2024-04-12 更新脚本，修正插件源更新造成的运行错误，增强脚本的稳定性\n- 2024-01-30 添加 `Switchfin` 插件\n- 2024-01-27 添加 `Hekate` 汉化，删除4个 `Nro` 插件\n- 2024-01-25 更新 `Tesla` 仓库链接\n- 2024-01-24 添加 `sys-tune` 插件\n- 2024-01-19 添加 `aio-switch-updater`、`wiliwili`、`SimpleModDownloader` 插件\n- 2024-01-09 更新 `Tesla` 仓库链接\n- 2023-12-15 更新 `Lockpick_RCM` 仓库链接\n- 2023-12-04 删除 `Safe_Reboot_Shutdown.nro` 插件，添加3个 `Ovl` 插件\n- 2023-12-03 添加 `Atmosphere-OC-Suite` 插件\n- 2023-11-25 添加 `SwitchTime` 插件\n- 2023-11-09 更新 `Lockpick_RCM` 仓库链接\n- 2023-10-13 更新脚本，修正 `SigPatches` 链接更新造成的运行错误；新增2个 `Nro` 插件\n- 2023-05-11 更新脚本，修正 `Lockpick_RCM` 仓库失效造成的运行错误；每天16点定时生成整合包\n- 2023-05-04 更新脚本\n- 2023-04-28 更新脚本，自动生成 Release 内容\n- 2023-04-27 添加 Github Action 自动打包代码\n\n## 截图\n![](https://raw.githubusercontent.com/huangqian8/SwitchPlugins/main/screenshot/screenshot.png)\n"
  },
  {
    "path": "switchScript.sh",
    "content": "#!/bin/bash\nset -euo pipefail\nset -E\n\nif [ \"${DEBUG:-0}\" = \"1\" ]; then\n    set -x\n    PS4='[${LINENO}] '\nfi\n\ntrap 'rc=$?; echo \"[ERROR] line=${LINENO} cmd=${BASH_COMMAND}\" >&2; exit $rc' ERR\n\n### Credit to the Authors at https://rentry.org/CFWGuides\n### Script created by Fraxalotl\n### Mod by huangqian8\n### Optimized version\n\n# -------------------------------------------\n\n# Configuration\nreadonly SCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nreadonly SWITCHSD_DIR=\"${SCRIPT_DIR}/SwitchSD\"\nreadonly DESCRIPTION_FILE=\"${SCRIPT_DIR}/description.txt\"\n\n# Colors for output\nreadonly RED='\\033[31m'\nreadonly GREEN='\\033[32m'\nreadonly YELLOW='\\033[33m'\nreadonly NC='\\033[0m' # No Color\n\n# Logging functions\nlog_success() { echo -e \"${1} ${GREEN}success${NC}.\"; }\nlog_error() { echo -e \"${1} ${RED}failed${NC}.\"; }\nlog_info() { echo -e \"${YELLOW}[INFO]${NC} ${1}\"; }\n\n# Description lines (name + version)\ndeclare -a DESCRIPTION_LINES=()\ndeclare -a FAILED_ITEMS=()\ndeclare -a REQUIRED_ITEMS=(\"Atmosphere\" \"Fusee\" \"Hekate + Nyx CHS\")\ndeclare -A ITEM_STATUS=()\ndeclare -A FAILED_STATUS=()\ndeclare -A RELEASE_CACHE=()\ndeclare -a DOWNLOAD_QUEUE_PIDS=()\ndeclare -A DOWNLOAD_PID_TO_KEY=()\ndeclare -A DOWNLOAD_KEY_STATUS=()\ndeclare -A DOWNLOAD_KEY_DESC=()\ndeclare -A ENABLED_GROUPS=()\n\nMAX_PARALLEL_DOWNLOADS=\"${MAX_PARALLEL_DOWNLOADS:-5}\"\nDRY_RUN=0\nONLY_MODE=0\n\nrecord_item() {\n    local name=\"$1\"\n    local version=\"${2:-unknown}\"\n    DESCRIPTION_LINES+=(\"${name} (${version})\")\n    ITEM_STATUS[\"$name\"]=1\n}\n\nrecord_failure() {\n    local name=\"$1\"\n    if [ \"${FAILED_STATUS[\"$name\"]+set}\" = \"set\" ]; then\n        return 0\n    fi\n    FAILED_STATUS[\"$name\"]=1\n    FAILED_ITEMS+=(\"$name\")\n}\n\nwrite_description_file() {\n    : > \"$DESCRIPTION_FILE\"\n    printf \"%s\\n\" \"${DESCRIPTION_LINES[@]}\" >> \"$DESCRIPTION_FILE\"\n}\n\nvalidate_required_items() {\n    local missing=0\n    local item\n\n    for item in \"${REQUIRED_ITEMS[@]}\"; do\n        if [ \"${ITEM_STATUS[\"$item\"]+set}\" != \"set\" ]; then\n            log_error \"Missing required component: $item\"\n            record_failure \"$item\"\n            missing=1\n        fi\n    done\n\n    if [ \"$missing\" -ne 0 ]; then\n        echo \"Required components are missing. Aborting.\" >&2\n        exit 1\n    fi\n}\n\nprint_failure_summary() {\n    local item\n    if [ \"${#FAILED_ITEMS[@]}\" -eq 0 ]; then\n        log_info \"All downloads completed without recorded failures.\"\n        return 0\n    fi\n\n    log_info \"Some downloads failed (${#FAILED_ITEMS[@]}):\"\n    for item in \"${FAILED_ITEMS[@]}\"; do\n        echo \" - $item\"\n    done\n}\n\nprint_usage() {\n    cat << 'EOF'\nUsage: switchScript.sh [options]\n\nOptions:\n  --dry-run                Print selected plan and exit (no download/write)\n  --only <groups>          Run only selected groups (comma-separated)\n                           Groups: core,payload,homebrew,special,system,configs,finalize\n  -h, --help               Show this help\nEOF\n}\n\ngroup_enabled() {\n    local group=\"$1\"\n    if [ \"$ONLY_MODE\" -eq 0 ]; then\n        return 0\n    fi\n    [ \"${ENABLED_GROUPS[\"$group\"]+set}\" = \"set\" ]\n}\n\nparse_args() {\n    local groups_arg group\n    local -a _groups=()\n    while [ \"$#\" -gt 0 ]; do\n        case \"$1\" in\n            --dry-run)\n                DRY_RUN=1\n                ;;\n            --only)\n                shift\n                [ \"$#\" -gt 0 ] || {\n                    echo \"Missing value for --only\" >&2\n                    print_usage\n                    exit 1\n                }\n                groups_arg=\"$1\"\n                ONLY_MODE=1\n                IFS=',' read -r -a _groups <<< \"$groups_arg\"\n                for group in \"${_groups[@]}\"; do\n                    case \"$group\" in\n                        core|payload|homebrew|special|system|configs|finalize)\n                            ENABLED_GROUPS[\"$group\"]=1\n                            ;;\n                        all)\n                            ONLY_MODE=0\n                            ENABLED_GROUPS=()\n                            ;;\n                        *)\n                            echo \"Unknown group for --only: $group\" >&2\n                            print_usage\n                            exit 1\n                            ;;\n                    esac\n                done\n                ;;\n            -h|--help)\n                print_usage\n                exit 0\n                ;;\n            *)\n                echo \"Unknown option: $1\" >&2\n                print_usage\n                exit 1\n                ;;\n        esac\n        shift\n    done\n}\n\nvalidate_runtime_options() {\n    if ! [[ \"$MAX_PARALLEL_DOWNLOADS\" =~ ^[1-9][0-9]*$ ]]; then\n        echo \"Invalid MAX_PARALLEL_DOWNLOADS: $MAX_PARALLEL_DOWNLOADS\" >&2\n        exit 1\n    fi\n}\n\n# Cleanup and create directories\ncleanup_and_setup() {\n    log_info \"Setting up directories...\"\n    [ -d \"$SWITCHSD_DIR\" ] && rm -rf \"$SWITCHSD_DIR\"\n    [ -e \"$DESCRIPTION_FILE\" ] && rm -f \"$DESCRIPTION_FILE\"\n    \n    # Create directory structure in batch\n    mkdir -p \"$SWITCHSD_DIR\"/{atmosphere/{config,hosts,contents/{420000000007E51Anx-ovlloader,0000000000534C56ReverseNX-RT,4200000000000010ldn_mitm,0100000000000352emuiibo,0100000000000F12Fizeau,4200000000000000sys-tune,420000000000000Bsys-patch,010000000000bd00MissionControl,00FF0000636C6BFFsys-clk},kips},bootloader/payloads,config/ultrahand/lang,switch/{Switch_90DNS_tester,DBI,NX-Shell,HB-App-Store,HekateToolbox,JKSV,Moonlight,NXThemesInstaller,SimpleModDownloader,Switchfin,tencent-switcher-gui,wiliwili,NX-Activity-Log,Sphaira,.overlays,.packages}}\n}\n# Download function with retry logic\ndownload_file() {\n    local url=\"$1\"\n    local output=\"$2\"\n    local description=\"$3\"\n    local max_retries=3\n    local retry_count=0\n    \n    while [ $retry_count -lt $max_retries ]; do\n        if curl -fsSL --connect-timeout 30 --max-time 300 \"$url\" -o \"$output\"; then\n            log_success \"$description download\"\n            return 0\n        else\n            retry_count=$((retry_count + 1))\n            if [ $retry_count -lt $max_retries ]; then\n                log_info \"Retrying $description download (attempt $((retry_count + 1))/$max_retries)...\"\n                sleep 2\n            fi\n        fi\n    done\n    \n    log_error \"$description download\"\n    record_failure \"$description\"\n    return 1\n}\n\nreset_download_queue() {\n    DOWNLOAD_QUEUE_PIDS=()\n    DOWNLOAD_PID_TO_KEY=()\n    DOWNLOAD_KEY_STATUS=()\n    DOWNLOAD_KEY_DESC=()\n}\n\nreap_download_queue() {\n    local -a running=()\n    local pid key\n\n    for pid in \"${DOWNLOAD_QUEUE_PIDS[@]}\"; do\n        if kill -0 \"$pid\" 2>/dev/null; then\n            running+=(\"$pid\")\n            continue\n        fi\n\n        key=\"${DOWNLOAD_PID_TO_KEY[\"$pid\"]:-}\"\n        if [ -z \"$key\" ]; then\n            continue\n        fi\n\n        if wait \"$pid\"; then\n            DOWNLOAD_KEY_STATUS[\"$key\"]=\"ok\"\n        else\n            DOWNLOAD_KEY_STATUS[\"$key\"]=\"fail\"\n            record_failure \"${DOWNLOAD_KEY_DESC[\"$key\"]:-$key}\"\n        fi\n\n        unset \"DOWNLOAD_PID_TO_KEY[$pid]\"\n    done\n\n    DOWNLOAD_QUEUE_PIDS=(\"${running[@]}\")\n}\n\nwait_for_download_slot() {\n    while [ \"${#DOWNLOAD_QUEUE_PIDS[@]}\" -ge \"$MAX_PARALLEL_DOWNLOADS\" ]; do\n        reap_download_queue\n        sleep 0.1\n    done\n}\n\nqueue_download_job() {\n    local key=\"$1\"\n    local url=\"$2\"\n    local output=\"$3\"\n    local description=\"$4\"\n    local pid\n\n    wait_for_download_slot\n    DOWNLOAD_KEY_STATUS[\"$key\"]=\"pending\"\n    DOWNLOAD_KEY_DESC[\"$key\"]=\"$description\"\n\n    (\n        download_file \"$url\" \"$output\" \"$description\"\n    ) &\n    pid=$!\n\n    DOWNLOAD_QUEUE_PIDS+=(\"$pid\")\n    DOWNLOAD_PID_TO_KEY[\"$pid\"]=\"$key\"\n}\n\nwait_for_all_downloads() {\n    while [ \"${#DOWNLOAD_QUEUE_PIDS[@]}\" -gt 0 ]; do\n        reap_download_queue\n        sleep 0.1\n    done\n}\n\ndownload_job_succeeded() {\n    local key=\"$1\"\n    [ \"${DOWNLOAD_KEY_STATUS[\"$key\"]:-}\" = \"ok\" ]\n}\n\n# Extract function\nextract_and_cleanup() {\n    local archive=\"$1\"\n    local description=\"$2\"\n    local extract_dir=\"${3:-.}\"\n    \n    if [ -f \"$archive\" ]; then\n        case \"$archive\" in\n            *.zip) unzip -oq \"$archive\" -d \"$extract_dir\" ;;\n            *.7z)\n                if ! command -v 7z >/dev/null 2>&1; then\n                    log_error \"$description extraction (missing dependency: 7z)\"\n                    return 1\n                fi\n                7z x \"$archive\" -o\"$extract_dir\" -y >/dev/null\n                ;;\n            *) log_error \"Unknown archive format: $archive\"; return 1 ;;\n        esac\n        rm -f \"$archive\"\n        log_success \"$description extraction\"\n    else\n        log_error \"$description extraction (file not found)\"\n        return 1\n    fi\n}\n\n# Ensure required dependencies exist\ncheck_dependencies() {\n    local missing=0\n    for bin in curl jq unzip git; do\n        if ! command -v \"$bin\" >/dev/null 2>&1; then\n            log_error \"Missing dependency: $bin\"\n            missing=1\n        fi\n    done\n\n    [ \"$missing\" -eq 0 ] || {\n        echo \"Please install required dependencies first.\" >&2\n        exit 1\n    }\n}\n\n# Get release JSON with per-repo cache\nget_release_json() {\n    local repo=\"$1\"\n    local api=\"https://api.github.com/repos/$repo/releases/latest\"\n    local release_json\n\n    if [ \"${RELEASE_CACHE[\"$repo\"]+set}\" = \"set\" ]; then\n        printf '%s' \"${RELEASE_CACHE[\"$repo\"]}\"\n        return 0\n    fi\n\n    release_json=$(github_api_get \"$api\") || return 1\n    RELEASE_CACHE[\"$repo\"]=\"$release_json\"\n    printf '%s' \"$release_json\"\n}\n\n# Get latest release asset URL + tag: prints \"url|tag\"\nget_latest_release_asset() {\n    local repo=\"$1\"\n    local pattern=\"$2\"\n    local release_json url tag\n\n    release_json=$(get_release_json \"$repo\") || return 1\n    tag=$(jq -r '.tag_name // \"unknown\"' <<< \"$release_json\")\n    url=$(jq -r --arg re \"$pattern\" '.assets[]?.browser_download_url | select(test($re))' <<< \"$release_json\" | head -n1)\n\n    if [ -n \"$url\" ] && [ \"$url\" != \"null\" ]; then\n        echo \"${url}|${tag}\"\n        return 0\n    fi\n\n    echo \"[DEBUG] latest release asset not found repo=$repo pattern=$pattern tag=$tag\" >&2\n    return 1\n}\n\ngithub_api_get() {\n    local url=\"$1\"\n    local -a args=( -fsSL -H \"Accept: application/vnd.github+json\" )\n    if [ -n \"${GITHUB_TOKEN:-}\" ]; then\n        args+=( -H \"Authorization: Bearer ${GITHUB_TOKEN}\" )\n    fi\n    curl \"${args[@]}\" \"$url\"\n}\n\n# Main download and setup function\nmain() {\n    parse_args \"$@\"\n    validate_runtime_options\n    check_dependencies\n\n    if [ \"$DRY_RUN\" -eq 1 ]; then\n        log_info \"Dry-run mode enabled. No download or filesystem changes will be made.\"\n        if [ \"$ONLY_MODE\" -eq 0 ]; then\n            log_info \"Selected groups: all\"\n        else\n            log_info \"Selected groups:\"\n            group_enabled core && echo \" - core\"\n            group_enabled payload && echo \" - payload\"\n            group_enabled homebrew && echo \" - homebrew\"\n            group_enabled special && echo \" - special\"\n            group_enabled system && echo \" - system\"\n            group_enabled configs && echo \" - configs\"\n            group_enabled finalize && echo \" - finalize\"\n        fi\n        return 0\n    fi\n\n    cleanup_and_setup\n    cd \"$SWITCHSD_DIR\"\n    \n    log_info \"Starting downloads...\"\n\n    # Core system downloads\n    if group_enabled core; then\n        log_info \"Downloading core system files...\"\n        \n        # Atmosphere\n        local atmosphere_url atmosphere_tag\n        IFS='|' read -r atmosphere_url atmosphere_tag < <(get_latest_release_asset \"Atmosphere-NX/Atmosphere\" \"atmosphere.*\\\\.zip\") || true\n\n        local fusee_url\n        IFS='|' read -r fusee_url _ < <(get_latest_release_asset \"Atmosphere-NX/Atmosphere\" \"fusee\\\\.bin\") || true\n\n        if [ -n \"$atmosphere_url\" ] && download_file \"$atmosphere_url\" \"atmosphere.zip\" \"Atmosphere\"; then\n            extract_and_cleanup \"atmosphere.zip\" \"Atmosphere\"\n            record_item \"Atmosphere\" \"$atmosphere_tag\"\n        else\n            record_failure \"Atmosphere\"\n        fi\n\n        if [ -n \"$fusee_url\" ] && download_file \"$fusee_url\" \"fusee.bin\" \"Fusee\"; then\n            mv fusee.bin ./bootloader/payloads/\n            record_item \"Fusee\" \"$atmosphere_tag\"\n        else\n            record_failure \"Fusee\"\n        fi\n\n        # Hekate\n        local hekate_url hekate_tag\n        IFS='|' read -r hekate_url hekate_tag < <(get_latest_release_asset \"easyworld/hekate\" \"hekate_ctcaer.*_sc\\\\.zip\") || true\n        if [ -n \"$hekate_url\" ] && download_file \"$hekate_url\" \"hekate.zip\" \"Hekate + Nyx CHS\"; then\n            extract_and_cleanup \"hekate.zip\" \"Hekate + Nyx CHS\"\n            record_item \"Hekate + Nyx CHS\" \"$hekate_tag\"\n        else\n            record_failure \"Hekate + Nyx CHS\"\n        fi\n        \n        # Sigpatches and logo\n        if download_file \"https://raw.githubusercontent.com/huangqian8/SwitchPlugins/main/plugins/sigpatches.zip\" \"sigpatches.zip\" \"Sigpatches\"; then\n            extract_and_cleanup \"sigpatches.zip\" \"Sigpatches\"\n            record_item \"Sigpatches\" \"raw-main\"\n        fi\n\n        if download_file \"https://raw.githubusercontent.com/huangqian8/SwitchPlugins/main/theme/logo.zip\" \"logo.zip\" \"Logo\"; then\n            extract_and_cleanup \"logo.zip\" \"Logo\"\n            record_item \"Logo\" \"raw-main\"\n        fi\n    fi\n\n    # Payload downloads\n    if group_enabled payload; then\n        log_info \"Downloading payloads...\"\n        \n        declare -A payloads=(\n            [\"zdm65477730/Lockpick_RCMDecScots\"]=\"Lockpick_RCM\\.bin:Lockpick_RCM\"\n            [\"zdm65477730/TegraExplorer\"]=\"TegraExplorer\\.bin:TegraExplorer\"\n            [\"zdm65477730/CommonProblemResolver\"]=\"CommonProblemResolver\\.bin:CommonProblemResolver\"\n        )\n        declare -A payload_key_name=()\n        declare -A payload_key_tag=()\n        local -a payload_keys=()\n        \n        local -a payload_repos=()\n        mapfile -t payload_repos < <(printf '%s\\n' \"${!payloads[@]}\" | sort)\n\n        reset_download_queue\n        local payload_idx=0\n        for repo_pattern in \"${payload_repos[@]}\"; do\n            IFS=':' read -r pattern name <<< \"${payloads[$repo_pattern]}\"\n            local url tag key\n            IFS='|' read -r url tag < <(get_latest_release_asset \"$repo_pattern\" \"$pattern\") || true\n            if [ -z \"$url\" ]; then\n                record_failure \"$name\"\n                continue\n            fi\n\n            key=\"payload_${payload_idx}\"\n            payload_idx=$((payload_idx + 1))\n            payload_keys+=(\"$key\")\n            payload_key_name[\"$key\"]=\"$name\"\n            payload_key_tag[\"$key\"]=\"$tag\"\n            queue_download_job \"$key\" \"$url\" \"${name}.bin\" \"$name\"\n        done\n        wait_for_all_downloads\n\n        local key\n        for key in \"${payload_keys[@]}\"; do\n            local name tag\n            name=\"${payload_key_name[\"$key\"]}\"\n            tag=\"${payload_key_tag[\"$key\"]}\"\n            if download_job_succeeded \"$key\"; then\n                mv \"${name}.bin\" ./bootloader/payloads/\n                record_item \"$name\" \"$tag\"\n            fi\n        done\n    fi\n\n    # Homebrew applications\n    if group_enabled homebrew; then\n        log_info \"Downloading homebrew applications...\"\n        \n        declare -A homebrew_apps=(\n            [\"meganukebmp/Switch_90DNS_tester\"]=\"Switch_90DNS_tester\\.nro:switch/Switch_90DNS_tester/Switch_90DNS_tester.nro:Switch_90DNS_tester\"\n            [\"gzk47/DBIPatcher\"]=\"DBI.*\\.zhcn\\.nro:switch/DBI/DBI.nro:DBI\"\n            [\"WerWolv/Hekate-Toolbox\"]=\"HekateToolbox\\.nro:switch/HekateToolbox/HekateToolbox.nro:HekateToolbox\"\n            [\"zdm65477730/NX-Activity-Log\"]=\"NX-Activity-Log\\.nro:switch/NX-Activity-Log/NX-Activity-Log.nro:NX-Activity-Log\"\n            [\"exelix11/SwitchThemeInjector\"]=\"NXThemesInstaller\\.nro:switch/NXThemesInstaller/NXThemesInstaller.nro:NXThemesInstaller\"\n            [\"J-D-K/JKSV\"]=\"JKSV\\.nro:switch/JKSV/JKSV.nro:JKSV\"\n            [\"CaiMiao/Tencent-switcher-GUI\"]=\"tencent-switcher-gui\\.nro:switch/tencent-switcher-gui/tencent-switcher-gui.nro:Tencent-switcher-GUI\"\n            [\"PoloNX/SimpleModDownloader\"]=\"SimpleModDownloader\\.nro:switch/SimpleModDownloader/SimpleModDownloader.nro:SimpleModDownloader\"\n            [\"dragonflylee/switchfin\"]=\"Switchfin\\.nro:switch/Switchfin/Switchfin.nro:Switchfin\"\n            [\"XITRIX/Moonlight-Switch\"]=\"Moonlight-Switch\\.nro:switch/Moonlight/Moonlight-Switch.nro:Moonlight\"\n            [\"zdm65477730/NX-Shell\"]=\"NX-Shell\\.nro:switch/NX-Shell/NX-Shell.nro:NX-Shell\"\n            [\"fortheusers/hb-appstore\"]=\"appstore\\.nro:switch/HB-App-Store/appstore.nro:hb-appstore\"\n        )\n        declare -A homebrew_key_name=()\n        declare -A homebrew_key_tag=()\n        declare -A homebrew_key_target=()\n        declare -A homebrew_key_file=()\n        local -a homebrew_keys=()\n        \n        local -a homebrew_repos=()\n        mapfile -t homebrew_repos < <(printf '%s\\n' \"${!homebrew_apps[@]}\" | sort)\n\n        reset_download_queue\n        local homebrew_idx=0\n        for repo_info in \"${homebrew_repos[@]}\"; do\n            IFS=':' read -r pattern target_path name <<< \"${homebrew_apps[$repo_info]}\"\n            local url tag key temp_file\n            IFS='|' read -r url tag < <(get_latest_release_asset \"$repo_info\" \"$pattern\") || true\n            if [ -z \"$url\" ]; then\n                record_failure \"$name\"\n                continue\n            fi\n\n            key=\"homebrew_${homebrew_idx}\"\n            homebrew_idx=$((homebrew_idx + 1))\n            temp_file=\".download_${key}_$(basename \"$target_path\")\"\n\n            homebrew_keys+=(\"$key\")\n            homebrew_key_name[\"$key\"]=\"$name\"\n            homebrew_key_tag[\"$key\"]=\"$tag\"\n            homebrew_key_target[\"$key\"]=\"$target_path\"\n            homebrew_key_file[\"$key\"]=\"$temp_file\"\n            queue_download_job \"$key\" \"$url\" \"$temp_file\" \"$name\"\n        done\n        wait_for_all_downloads\n\n        local key\n        for key in \"${homebrew_keys[@]}\"; do\n            local name tag target_path temp_file\n            name=\"${homebrew_key_name[\"$key\"]}\"\n            tag=\"${homebrew_key_tag[\"$key\"]}\"\n            target_path=\"${homebrew_key_target[\"$key\"]}\"\n            temp_file=\"${homebrew_key_file[\"$key\"]}\"\n            if download_job_succeeded \"$key\"; then\n                mkdir -p \"$(dirname \"$target_path\")\"\n                mv \"$temp_file\" \"$target_path\"\n                record_item \"$name\" \"$tag\"\n            fi\n        done\n    fi\n\n    # Special downloads with custom handling\n    if group_enabled special; then\n        log_info \"Downloading special packages...\"\n        \n        # Awoo Installer\n        local awoo_url awoo_tag\n        IFS='|' read -r awoo_url awoo_tag < <(get_latest_release_asset \"Huntereb/Awoo-Installer\" \"Awoo-Installer\\\\.zip\") || true\n        if [ -n \"$awoo_url\" ] && download_file \"$awoo_url\" \"Awoo-Installer.zip\" \"Awoo Installer\"; then\n            extract_and_cleanup \"Awoo-Installer.zip\" \"Awoo Installer\"\n            record_item \"Awoo Installer\" \"$awoo_tag\"\n        fi\n\n        # Sphaira - homebrew menu\n        local sphaira_url sphaira_tag\n        IFS='|' read -r sphaira_url sphaira_tag < <(get_latest_release_asset \"ITotalJustice/sphaira\" \"sphaira\\\\.zip\") || true\n        if [ -n \"$sphaira_url\" ] && download_file \"$sphaira_url\" \"sphaira.zip\" \"Sphaira\"; then\n            extract_and_cleanup \"sphaira.zip\" \"Sphaira\"\n            record_item \"Sphaira\" \"$sphaira_tag\"\n        fi\n\n        # AIO Switch Updater\n        local aio_url aio_tag\n        IFS='|' read -r aio_url aio_tag < <(get_latest_release_asset \"HamletDuFromage/aio-switch-updater\" \"aio-switch-updater\\\\.zip\") || true\n        if [ -n \"$aio_url\" ] && download_file \"$aio_url\" \"aio-switch-updater.zip\" \"aio-switch-updater\"; then\n            extract_and_cleanup \"aio-switch-updater.zip\" \"aio-switch-updater\"\n            record_item \"aio-switch-updater\" \"$aio_tag\"\n        fi\n\n        # Wiliwili\n        local wiliwili_url wiliwili_tag\n        IFS='|' read -r wiliwili_url wiliwili_tag < <(get_latest_release_asset \"xfangfang/wiliwili\" \"wiliwili-NintendoSwitch\\\\.zip\") || true\n        if [ -n \"$wiliwili_url\" ] && download_file \"$wiliwili_url\" \"wiliwili-NintendoSwitch.zip\" \"wiliwili\"; then\n            extract_and_cleanup \"wiliwili-NintendoSwitch.zip\" \"wiliwili\"\n            [ -d wiliwili ] && mv wiliwili/wiliwili.nro ./switch/wiliwili/ && rm -rf wiliwili\n            record_item \"wiliwili\" \"$wiliwili_tag\"\n        fi\n\n        # Daybreak\n        if download_file \"https://raw.githubusercontent.com/huangqian8/SwitchPlugins/main/plugins/daybreak_x.zip\" \"daybreak_x.zip\" \"daybreak\"; then\n            extract_and_cleanup \"daybreak_x.zip\" \"daybreak\"\n            record_item \"daybreak\" \"raw-main\"\n        fi\n        \n        # Theme patches\n        if git clone --depth 1 https://github.com/exelix11/theme-patches 2>/dev/null; then\n            log_success \"theme-patches download\"\n            local theme_patch_version\n            theme_patch_version=$(git -C theme-patches rev-parse --short HEAD 2>/dev/null || echo \"unknown\")\n            mkdir -p themes\n            [ -d theme-patches/systemPatches ] && mv theme-patches/systemPatches ./themes/\n            rm -rf theme-patches\n            record_item \"theme-patches\" \"$theme_patch_version\"\n        else\n            log_error \"theme-patches download\"\n            record_failure \"theme-patches\"\n        fi\n    fi\n\n    # System modules and overlays\n    if group_enabled system; then\n        log_info \"Downloading system modules and overlays...\"\n        \n        declare -A system_modules=(\n            [\"zdm65477730/nx-ovlloader\"]=\"nx-ovlloader\\.zip:nx-ovlloader\"\n            [\"zdm65477730/Ultrahand-Overlay\"]=\"Ultrahand\\.zip:Ultrahand-Overlay\"\n            [\"zdm65477730/EdiZon-Overlay\"]=\"EdiZon\\.zip:EdiZon\"\n            [\"zdm65477730/ovl-sysmodules\"]=\"ovl-sysmodules\\.zip:ovl-sysmodules\"\n            [\"zdm65477730/Status-Monitor-Overlay\"]=\"StatusMonitor\\.zip:StatusMonitor\"\n            [\"zdm65477730/ReverseNX-RT\"]=\"ReverseNX-RT\\.zip:ReverseNX-RT\"\n            [\"zdm65477730/ldn_mitm\"]=\"ldn_mitm\\.zip:ldn_mitm\"\n            [\"zdm65477730/QuickNTP\"]=\"QuickNTP\\.zip:QuickNTP\"\n            [\"zdm65477730/Fizeau\"]=\"Fizeau\\.zip:Fizeau\"\n            [\"zdm65477730/sys-patch\"]=\"sys-patch\\.zip:sys-patch\"\n            [\"zdm65477730/sys-clk\"]=\"sys-clk.*\\.zip:sys-clk\"\n            [\"ndeadly/MissionControl\"]=\"MissionControl.*\\.zip:MissionControl\"\n        )\n        declare -A system_key_name=()\n        declare -A system_key_tag=()\n        local -a system_keys=()\n        \n        local -a system_repos=()\n        mapfile -t system_repos < <(printf '%s\\n' \"${!system_modules[@]}\" | sort)\n\n        reset_download_queue\n        local system_idx=0\n        for repo_pattern in \"${system_repos[@]}\"; do\n            IFS=':' read -r pattern name <<< \"${system_modules[$repo_pattern]}\"\n            local url tag key\n            IFS='|' read -r url tag < <(get_latest_release_asset \"$repo_pattern\" \"$pattern\") || true\n            if [ -z \"$url\" ]; then\n                record_failure \"$name\"\n                continue\n            fi\n\n            key=\"system_${system_idx}\"\n            system_idx=$((system_idx + 1))\n            system_keys+=(\"$key\")\n            system_key_name[\"$key\"]=\"$name\"\n            system_key_tag[\"$key\"]=\"$tag\"\n            queue_download_job \"$key\" \"$url\" \"${name}.zip\" \"$name\"\n        done\n        wait_for_all_downloads\n\n        local key\n        for key in \"${system_keys[@]}\"; do\n            local name tag\n            name=\"${system_key_name[\"$key\"]}\"\n            tag=\"${system_key_tag[\"$key\"]}\"\n            if download_job_succeeded \"$key\"; then\n                extract_and_cleanup \"${name}.zip\" \"$name\"\n                record_item \"$name\" \"$tag\"\n            fi\n        done\n        \n        # Emuiibo (special handling)\n        local emuiibo_url emuiibo_tag\n        IFS='|' read -r emuiibo_url emuiibo_tag < <(get_latest_release_asset \"XorTroll/emuiibo\" \"emuiibo\\\\.zip\") || true\n        if [ -n \"$emuiibo_url\" ] && download_file \"$emuiibo_url\" \"emuiibo.zip\" \"emuiibo\"; then\n            extract_and_cleanup \"emuiibo.zip\" \"emuiibo\"\n            [ -d SdOut ] && cp -rf SdOut/* ./ && rm -rf SdOut\n            record_item \"emuiibo\" \"$emuiibo_tag\"\n        fi\n    fi\n    \n    # OC Toolkit (dual download)\n    if group_enabled special; then\n        local oc_info oc_tag kip_url toolkit_url\n        oc_info=$(get_release_json \"halop/OC_Toolkit_SC_EOS\") || true\n        if [ -n \"$oc_info\" ]; then\n            oc_tag=$(jq -r '.tag_name // \"unknown\"' <<< \"$oc_info\")\n            kip_url=$(jq -r '.assets[]?.browser_download_url | select(test(\"kip\\\\.zip\"))' <<< \"$oc_info\" | head -n1)\n            toolkit_url=$(jq -r '.assets[]?.browser_download_url | select(test(\"OC\\\\.Toolkit\\\\.u\\\\.zip\"))' <<< \"$oc_info\" | head -n1)\n        else\n            oc_tag=\"\"\n            kip_url=\"\"\n            toolkit_url=\"\"\n        fi\n\n        if [ -n \"$kip_url\" ] && [ -n \"$toolkit_url\" ] && download_file \"$kip_url\" \"kip.zip\" \"OC Toolkit KIP\" && download_file \"$toolkit_url\" \"OC.Toolkit.u.zip\" \"OC Toolkit\"; then\n            log_success \"OC_Toolkit_SC_EOS download\"\n            extract_and_cleanup \"kip.zip\" \"OC Toolkit KIP\" \"./atmosphere/kips/\"\n            extract_and_cleanup \"OC.Toolkit.u.zip\" \"OC Toolkit\" \"./switch/.packages/\"\n            record_item \"OC_Toolkit_SC_EOS\" \"$oc_tag\"\n        else\n            log_error \"OC_Toolkit_SC_EOS download\"\n            record_failure \"OC_Toolkit_SC_EOS\"\n        fi\n    fi\n\n    if group_enabled core; then\n        validate_required_items\n    fi\n    print_failure_summary\n\n    # Write runtime description (with versions)\n    if group_enabled core || group_enabled payload || group_enabled homebrew || group_enabled special || group_enabled system; then\n        write_description_file\n    fi\n\n    # Generate configuration files\n    if group_enabled configs; then\n        generate_configs\n    fi\n    \n    # Cleanup and finalization\n    if group_enabled finalize; then\n        finalize_setup\n    fi\n    \n    log_info \"Setup completed successfully!\"\n    echo -e \"\\n${GREEN}Your Switch SD card is prepared!${NC}\"\n}\n\n# Configuration generation functions\ngenerate_configs() {\n    log_info \"Generating configuration files...\"\n    \n    # description.txt is generated dynamically in main() via write_description_file()\n\n    # Generate hekate_ipl.ini\n    cat > ./bootloader/hekate_ipl.ini << 'EOF'\n[config]\nautoboot=0\nautoboot_list=0\nbootwait=3\nbacklight=100\nnoticker=0\nautohosoff=1\nautonogc=1\nupdater2p=0\nbootprotect=0\n\n[CFW (emuMMC)]\nemummcforce=1\nfss0=atmosphere/package3\nkip1patch=nosigchk\natmosphere=1\nicon=bootloader/res/icon_Atmosphere_emunand.bmp\nid=cfw-emu\n\n[CFW (sysMMC)]\nemummc_force_disable=1\nfss0=atmosphere/package3\nkip1patch=nosigchk\natmosphere=1\nicon=bootloader/res/icon_Atmosphere_sysnand.bmp\nid=cfw-sys\n\n[Stock SysNAND]\nemummc_force_disable=1\nfss0=atmosphere/package3\nicon=bootloader/res/icon_stock.bmp\nstock=1\nid=ofw-sys\nEOF\n    \n    # Generate exosphere.ini\n    cat > ./exosphere.ini << 'EOF'\n[exosphere]\ndebugmode=1\ndebugmode_user=0\ndisable_user_exception_handlers=0\nenable_user_pmu_access=0\n; 控制真实系统启用隐身模式。\nblank_prodinfo_sysmmc=1\n; 控制虚拟系统启用隐身模式。\nblank_prodinfo_emummc=1\nallow_writing_to_cal_sysmmc=0\nlog_port=0\nlog_baud_rate=115200\nlog_inverted=0\nEOF\n    \n    # Generate DNS blocking files\n    local dns_content='# 屏蔽任天堂服务器\n127.0.0.1 *nintendo.*\n127.0.0.1 *nintendo-europe.com\n127.0.0.1 *nintendoswitch.*\n127.0.0.1 ads.doubleclick.net\n127.0.0.1 s.ytimg.com\n127.0.0.1 ad.youtube.com\n127.0.0.1 ads.youtube.com\n127.0.0.1 clients1.google.com\n207.246.121.77 *conntest.nintendowifi.net\n207.246.121.77 *ctest.cdn.nintendo.net\n69.25.139.140 *ctest.cdn.n.nintendoswitch.cn\n95.216.149.205 *conntest.nintendowifi.net\n95.216.149.205 *ctest.cdn.nintendo.net\n95.216.149.205 *90dns.test'\n    \n    echo \"$dns_content\" > ./atmosphere/hosts/emummc.txt\n    echo \"$dns_content\" > ./atmosphere/hosts/sysmmc.txt\n    \n    # Generate boot.ini\n    cat > ./boot.ini << 'EOF'\n[payload]\nfile=payload.bin\nEOF\n    \n    # Generate override_config.ini\n    cat > ./atmosphere/config/override_config.ini << 'EOF'\n[hbl_config]\nprogram_id_0=010000000000100D\noverride_address_space=39_bit\n; 按住R键点击相册进入HBL自制软件界面。\noverride_key_0=R\nEOF\n    \n    # Generate system_settings.ini\n    cat > ./atmosphere/config/system_settings.ini << 'EOF'\n; =============================================\n; Atmosphere 防封禁核心配置文件\n; =============================================\n\n[eupld]\n; 禁用错误报告上传\nupload_enabled = u8!0x0\n\n[ro]\n; 放宽NRO验证限制，便于自制软件运行\nease_nro_restriction = u8!0x1\n\n[atmosphere]\n; 金手指默认关闭，按需开启更安全\ndmnt_cheats_enabled_by_default = u8!0x0\n; 崩溃10秒后自动重启 (10000毫秒)\nfatal_auto_reboot_interval = u64!0x2710\n; 启用DNS屏蔽，阻止连接任天堂服务器\nenable_dns_mitm = u8!0x1\nadd_defaults_to_dns_hosts = u8!0x1\n; 虚拟系统使用外部蓝牙配对\nenable_external_bluetooth_db = u8!0x1\n\n[usb]\n; 强制开启USB 3.0\nusb30_force_enabled = u8!0x1\n\n[tc]\n; 温控设置 - 保持默认即可\nsleep_enabled = u8!0x0\n\n; =============================================\n; 🛡 防封禁核心配置 - 禁用所有任天堂服务\n; =============================================\n\n[bgtc]\n; 禁用所有后台任务\nenable_halfawake = u32!0x0\nminimum_interval_normal = u32!0x7FFFFFFF\nminimum_interval_save = u32!0x7FFFFFFF\n\n[npns]\n; 禁用新闻推送服务\nbackground_processing = u8!0x0\nsleep_periodic_interval = u32!0x7FFFFFFF\n\n[ns.notification]\n; 完全禁用系统更新检查和服务通信\nenable_download_task_list = u8!0x0\nenable_network_update = u8!0x0\nenable_request_on_cold_boot = u8!0x0\nretry_interval_min = u32!0x7FFFFFFF\n\n[account]\n; 禁用账户验证和许可证检查\nna_required_for_network_service = u8!0x0\nna_license_verification_enabled = u8!0x0\n\n[capsrv]\n; 禁用截图和录像验证\nenable_album_screenshot_filedata_verification = u8!0x0\nenable_album_movie_filehash_verification = u8!0x0\n\n[friends]\n; 禁用好友后台服务\nbackground_processing = u8!0x0\n\n[prepo]\n; 禁用数据统计上报\ntransmission_interval_min = u32!0x7FFFFFFF\nsave_system_report = u8!0x0\n\n[olsc]\n; 禁用云存档服务\ndefault_auto_upload_global_setting = u8!0x0\ndefault_auto_download_global_setting = u8!0x0\n\n[ns.rights]\n; 跳过账户验证（重要权限检查）\nskip_account_validation_on_rights_check = u8!0x1\n\n; =============================================\n; ⚡ 性能优化配置\n; =============================================\n\n[account.daemon]\n; 延长账户服务间隔\nbackground_awaking_periodicity = u32!0x7FFFFFFF\n\n[notification.presenter]\n; 禁用通知重试\nconnection_retry_count = u32!0x0\n\n[systemupdate]\n; 禁用系统更新重试\nbgnup_retry_seconds = u32!0x7FFFFFFF\n\n[pctl]\n; 延长家长控制检查间隔\nintermittent_task_interval_seconds = u32!0x7FFFFFFF\nEOF\n    \n    log_success \"Configuration files generation\"\n}\n\nfinalize_setup() {\n    log_info \"Finalizing setup...\"\n    local removed_boot2_flags=0\n    \n    # Rename hekate payload\n    find . -name \"*hekate_ctcaer*\" -exec mv {} payload.bin \\; 2>/dev/null && \\\n        log_success \"Rename hekate_ctcaer_*.bin to payload.bin\" || \\\n        log_error \"Rename hekate_ctcaer_*.bin to payload.bin\"\n    \n    # Remove unneeded files\n    rm -f switch/haze.nro switch/reboot_to_payload.nro switch/daybreak.nro\n\n    if [ -d atmosphere/contents ]; then\n        removed_boot2_flags=$(find atmosphere/contents -type f -name \"boot2.flag\" -print | wc -l | tr -d ' ')\n        find atmosphere/contents -type f -name \"boot2.flag\" -delete\n    fi\n    log_info \"Removed ${removed_boot2_flags} boot2.flag file(s) from atmosphere/contents\"\n    \n    log_success \"Setup finalization\"\n}\n\n# Run main function\nmain \"$@\"\n"
  }
]