Full Code of venera-app/venera for AI

master a741e36e29a8 cached
256 files
3.5 MB
930.6k tokens
2475 symbols
1 requests
Download .txt
Showing preview only (3,718K chars total). Download the full file or copy to clipboard to get everything.
Repository: venera-app/venera
Branch: master
Commit: a741e36e29a8
Files: 256
Total size: 3.5 MB

Directory structure:
gitextract_1fwolk4v/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yaml
│   │   ├── config.yml
│   │   └── enhancement.yaml
│   └── workflows/
│       ├── analyze.yml
│       ├── delete_old_workflows.yml
│       ├── fastlane.yml
│       ├── issue_check.yml
│       ├── main.yml
│       └── update_alt_store.yml
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── alt_store.json
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── debug/
│   │       │   └── AndroidManifest.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── com/
│   │       │   │       └── github/
│   │       │   │           └── wgh136/
│   │       │   │               └── venera/
│   │       │   │                   └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   └── ic_launcher.xml
│   │       │       ├── values/
│   │       │       │   ├── strings.xml
│   │       │       │   └── styles.xml
│   │       │       ├── values-night/
│   │       │       │   └── styles.xml
│   │       │       ├── values-zh/
│   │       │       │   └── strings.xml
│   │       │       └── values-zh-rCN/
│   │       │           └── strings.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle
├── assets/
│   ├── init.js
│   ├── opencc.txt
│   ├── tags.json
│   ├── tags_tw.json
│   └── translation.json
├── debian/
│   ├── build.py
│   ├── debian.yaml
│   └── gui/
│       └── venera.desktop
├── doc/
│   ├── comic_source.md
│   ├── headless_doc.md
│   ├── import_comic.md
│   └── js_api.md
├── fastlane/
│   └── metadata/
│       └── android/
│           └── en-US/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       ├── Contents.json
│   │   │       └── README.md
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── DirectoryPicker.swift
│   │   ├── Info.plist
│   │   └── Runner-Bridging-Header.h
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── RunnerTests/
│       └── RunnerTests.swift
├── lib/
│   ├── components/
│   │   ├── appbar.dart
│   │   ├── button.dart
│   │   ├── code.dart
│   │   ├── comic.dart
│   │   ├── components.dart
│   │   ├── consts.dart
│   │   ├── custom_slider.dart
│   │   ├── effects.dart
│   │   ├── flyout.dart
│   │   ├── gesture.dart
│   │   ├── image.dart
│   │   ├── js_ui.dart
│   │   ├── layout.dart
│   │   ├── loading.dart
│   │   ├── menu.dart
│   │   ├── message.dart
│   │   ├── navigation_bar.dart
│   │   ├── pop_up_widget.dart
│   │   ├── rich_comment_content.dart
│   │   ├── scroll.dart
│   │   ├── select.dart
│   │   ├── side_bar.dart
│   │   └── window_frame.dart
│   ├── foundation/
│   │   ├── app.dart
│   │   ├── app_page_route.dart
│   │   ├── appdata.dart
│   │   ├── cache_manager.dart
│   │   ├── comic_source/
│   │   │   ├── category.dart
│   │   │   ├── comic_source.dart
│   │   │   ├── favorites.dart
│   │   │   ├── models.dart
│   │   │   ├── parser.dart
│   │   │   └── types.dart
│   │   ├── comic_type.dart
│   │   ├── consts.dart
│   │   ├── context.dart
│   │   ├── favorites.dart
│   │   ├── follow_updates.dart
│   │   ├── global_state.dart
│   │   ├── history.dart
│   │   ├── image_favorites.dart
│   │   ├── image_provider/
│   │   │   ├── base_image_provider.dart
│   │   │   ├── cached_image.dart
│   │   │   ├── history_image_provider.dart
│   │   │   ├── image_favorites_provider.dart
│   │   │   ├── local_comic_image.dart
│   │   │   ├── local_favorite_image.dart
│   │   │   └── reader_image.dart
│   │   ├── js_engine.dart
│   │   ├── js_pool.dart
│   │   ├── local.dart
│   │   ├── log.dart
│   │   ├── res.dart
│   │   └── widget_utils.dart
│   ├── headless.dart
│   ├── init.dart
│   ├── main.dart
│   ├── network/
│   │   ├── app_dio.dart
│   │   ├── cache.dart
│   │   ├── cloudflare.dart
│   │   ├── cookie_jar.dart
│   │   ├── download.dart
│   │   ├── file_downloader.dart
│   │   ├── images.dart
│   │   └── proxy.dart
│   ├── pages/
│   │   ├── aggregated_search_page.dart
│   │   ├── auth_page.dart
│   │   ├── categories_page.dart
│   │   ├── category_comics_page.dart
│   │   ├── comic_details_page/
│   │   │   ├── actions.dart
│   │   │   ├── chapters.dart
│   │   │   ├── comic_page.dart
│   │   │   ├── comments_page.dart
│   │   │   ├── comments_preview.dart
│   │   │   ├── cover_viewer.dart
│   │   │   ├── favorite.dart
│   │   │   └── thumbnails.dart
│   │   ├── comic_source_page.dart
│   │   ├── downloading_page.dart
│   │   ├── explore_page.dart
│   │   ├── favorites/
│   │   │   ├── favorite_actions.dart
│   │   │   ├── favorites_page.dart
│   │   │   ├── local_favorites_page.dart
│   │   │   ├── network_favorites_page.dart
│   │   │   └── side_bar.dart
│   │   ├── follow_updates_page.dart
│   │   ├── history_page.dart
│   │   ├── home_page.dart
│   │   ├── image_favorites_page/
│   │   │   ├── image_favorites_item.dart
│   │   │   ├── image_favorites_page.dart
│   │   │   ├── image_favorites_photo_view.dart
│   │   │   └── type.dart
│   │   ├── local_comics_page.dart
│   │   ├── main_page.dart
│   │   ├── ranking_page.dart
│   │   ├── reader/
│   │   │   ├── chapter_comments.dart
│   │   │   ├── chapters.dart
│   │   │   ├── comic_image.dart
│   │   │   ├── gesture.dart
│   │   │   ├── images.dart
│   │   │   ├── loading.dart
│   │   │   ├── reader.dart
│   │   │   └── scaffold.dart
│   │   ├── search_page.dart
│   │   ├── search_result_page.dart
│   │   ├── settings/
│   │   │   ├── about.dart
│   │   │   ├── app.dart
│   │   │   ├── appearance.dart
│   │   │   ├── debug.dart
│   │   │   ├── explore_settings.dart
│   │   │   ├── local_favorites.dart
│   │   │   ├── network.dart
│   │   │   ├── reader.dart
│   │   │   ├── setting_components.dart
│   │   │   └── settings_page.dart
│   │   └── webview.dart
│   └── utils/
│       ├── app_links.dart
│       ├── cbz.dart
│       ├── channel.dart
│       ├── clipboard_image.dart
│       ├── data.dart
│       ├── data_sync.dart
│       ├── epub.dart
│       ├── ext.dart
│       ├── file_type.dart
│       ├── handle_text_share.dart
│       ├── image.dart
│       ├── import_comic.dart
│       ├── init.dart
│       ├── io.dart
│       ├── opencc.dart
│       ├── pdf.dart
│       ├── tags_translation.dart
│       ├── translations.dart
│       └── volume.dart
├── linux/
│   ├── .gitignore
│   ├── CMakeLists.txt
│   ├── flutter/
│   │   └── CMakeLists.txt
│   ├── main.cc
│   ├── my_application.cc
│   └── my_application.h
├── macos/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── Flutter-Debug.xcconfig
│   │   └── Flutter-Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Configs/
│   │   │   ├── AppInfo.xcconfig
│   │   │   ├── Debug.xcconfig
│   │   │   ├── Release.xcconfig
│   │   │   └── Warnings.xcconfig
│   │   ├── DebugProfile.entitlements
│   │   ├── Info.plist
│   │   ├── MainFlutterWindow.swift
│   │   └── Release.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── IDEWorkspaceChecks.plist
│   └── RunnerTests/
│       └── RunnerTests.swift
├── patch/
│   └── font.dart
├── pubspec.yaml
├── rust-toolchain.toml
├── test/
│   └── channel_test.dart
├── update_alt_store.py
└── windows/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── build.iss
    ├── build.py
    ├── build_arm64.iss
    ├── build_arm64.py
    ├── flutter/
    │   └── CMakeLists.txt
    └── runner/
        ├── CMakeLists.txt
        ├── Runner.rc
        ├── flutter_window.cpp
        ├── flutter_window.h
        ├── main.cpp
        ├── resource.h
        ├── runner.exe.manifest
        ├── utils.cpp
        ├── utils.h
        ├── win32_window.cpp
        └── win32_window.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug.yaml
================================================
name: Report a bug
description: Reporting problems with the APP
title: "[Bug]: "
labels: ["bug🐞"]
body:
  - type: markdown
    attributes:
      value: |
        Thank you for reporting a problem, please complete the title and fill in the following information.
        
        感谢您的反馈,请填写完整标题并填写以下信息。
        
        **Please do not report any issues related to config files.**
        
        **请不要报告与配置文件相关的任何问题。**
        
        This project is a comic reader that allows users write their own config files. And there is no built-in comic source.
        
        本项目是一个漫画阅读器,允许用户编写自己的配置文件,并且没有内置漫画源。
  - type: dropdown
    id: bugType
    attributes:
      label: Bug type
      description: What type of bug are you reporting?
      options:
        - Crash
        - UI
        - Performance
        - Security
        - Reader
        - JS Engine
        - Comic Source
        - Other
    validations:
      required: true
  - type: textarea
    id: what-happened
    attributes:
      label: Description
      description: Describe the problem
    validations:
      required: true
  - type: input
    id: version
    attributes:
      label: Version
      description: | 
        App version.
        
        Please try to update if it is not the latest version
    validations:
      required: true
  - type: dropdown
    id: platform
    attributes:
      label: Operating system
      multiple: true
      options:
        - Android
        - iOS
        - Windows
        - macOS
        - linux
        - other
    validations:
      required: true
  - type: textarea
    id: logs
    attributes:
      label: logs
  - type: textarea
    id: screenshotOrVideo
    attributes:
      label: Screenshot or video
      description: Upload relevant screenshots or videos here

================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/enhancement.yaml
================================================
name: Feature Request
description: Suggest improvements to the APP
title: "[Enhancement]: "
labels: ["enhancement🚀"]
body:
  - type: markdown
    attributes:
      value: |
        Welcome to make a feature request, please fill in the following information after completing the title.
        
        欢迎提出功能建议,请填写完整标题后填写以下信息。
        
        **Please do not report any issues related to config files.**

        **请不要报告与配置文件相关的任何问题。**

        This project is a comic reader that allows users write their own config files. And there is no built-in comic source.

        本项目是一个漫画阅读器,允许用户编写自己的配置文件,并且没有内置漫画源。
  - type: textarea
    id: what-happened
    attributes:
      label: Description
      description: Describe your suggestion.
    validations:
      required: true
  - type: dropdown
    id: platform
    attributes:
      label: Operating System
      description: If the feature is for a particular platform, please select here
      multiple: true
      options:
        - Android
        - iOS
        - Windows
        - macOS
        - linux
        - other
    validations:
      required: false
  - type: textarea
    id: screenshotOrVideo
    attributes:
      label: picture
      description: If you need to use a picture, please upload it here.

================================================
FILE: .github/workflows/analyze.yml
================================================
name: "analyze"
on:
  pull_request:
  push:
    branches:
      - master

jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version-file: pubspec.yaml
          architecture: x64
      - run: flutter pub get
      - uses: invertase/github-action-dart-analyzer@v1


================================================
FILE: .github/workflows/delete_old_workflows.yml
================================================
name: Delete old workflow runs
on:
  workflow_dispatch:
    inputs:
      days:
        description: 'Days-worth of runs to keep for each workflow'
        required: true
        default: '30'
      minimum_runs:
        description: 'Minimum runs to keep for each workflow'
        required: true
        default: '6'
      delete_workflow_pattern:
        description: 'Name or filename of the workflow (if not set, all workflows are targeted)'
        required: false
      delete_workflow_by_state_pattern:
        description: 'Filter workflows by state: active, deleted, disabled_fork, disabled_inactivity, disabled_manually'
        required: true
        default: "ALL"
        type: choice
        options:
          - "ALL"
          - active
          - deleted
          - disabled_inactivity
          - disabled_manually
      delete_run_by_conclusion_pattern:
        description: 'Remove runs based on conclusion: action_required, cancelled, failure, skipped, success'
        required: true
        default: "ALL"
        type: choice
        options:
          - "ALL"
          - "Unsuccessful: action_required,cancelled,failure,skipped"
          - action_required
          - cancelled
          - failure
          - skipped
          - success
      dry_run:
        description: 'Logs simulated changes, no deletions are performed'
        required: false

jobs:
  del_runs:
    runs-on: ubuntu-latest
    permissions:
      actions: write
      contents: read
    steps:
      - name: Delete workflow runs
        uses: Mattraks/delete-workflow-runs@v2
        with:
          token: ${{ github.token }}
          repository: ${{ github.repository }}
          retain_days: ${{ github.event.inputs.days }}
          keep_minimum_runs: ${{ github.event.inputs.minimum_runs }}
          delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }}
          delete_workflow_by_state_pattern: ${{ github.event.inputs.delete_workflow_by_state_pattern }}
          delete_run_by_conclusion_pattern: >-
            ${{
              startsWith(github.event.inputs.delete_run_by_conclusion_pattern, 'Unsuccessful:')
              && 'action_required,cancelled,failure,skipped'
              || github.event.inputs.delete_run_by_conclusion_pattern
            }}
          dry_run: ${{ github.event.inputs.dry_run }}

================================================
FILE: .github/workflows/fastlane.yml
================================================
name: Validate Fastlane metadata

on:
  workflow_dispatch:
  push:
      branches: [ "master" ]
      paths:
        - 'fastlane/**'
  pull_request:
      branches: [ "master" ]
      paths:
        - 'fastlane/**'

jobs:
  go:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Validate Fastlane Supply Metadata
        uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2.1.0


================================================
FILE: .github/workflows/issue_check.yml
================================================
name: Check Issue

on:
  issues:
    types: [opened]

permissions:
  contents: read
  issues: write

jobs:
  check:
    name: Check Issue
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v4

      - name: Check Issue
        id: check
        uses: wgh136/gpt_issue_checker@v1.0.2
        with:
          api-url: ${{ secrets.API_URL }} 
          api-key: ${{ secrets.API_KEY }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
          prompt: "You are a repository issue checker. The project is a comic app that supports view local or network comics using config files. To view a comic source, user must add a config file. User should not report any issue related to config file to the project repository because there is another repository for managing config files. You are given an issue content and you need to decide whether to close the issue. If you decide to close the issue, you should also provide a comment explaining why you are closing the issue. If you decide not to close the issue, you should provide a comment which is a summary of the issue. You should response with a JSON object with the following keys: should_close, should_comment, comment."
          model: "gpt-4o"


================================================
FILE: .github/workflows/main.yml
================================================
name: Build ALL
run-name: Build ALL
on:
  workflow_dispatch: {}
  release:
    types: [published]

jobs:
  Build_MacOS:
    runs-on: macos-15
    steps:
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version-file: pubspec.yaml
          architecture: x64
      - run: sudo xcode-select --switch /Applications/Xcode_16.4.app
      - run: flutter pub get
        # Step 1: Decode and install the certificate
      - name: Decode and install certificate
        env:
          CERTIFICATE: ${{ secrets.CERTIFICATE }}
          CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }}
        run: |
          echo "$CERTIFICATE" | base64 --decode > signing_certificate.p12
          security import signing_certificate.p12 -k ~/Library/Keychains/login.keychain -P "$CERTIFICATE_PASSWORD" -T /usr/bin/codesign

      - name: Check rust-toolchain.toml
        run: rustup show

      # Step 2: Build the Flutter macOS app
      - name: Build Flutter macOS App
        run: flutter build macos --release

      # Step 3: Create the DMG file
      - name: Create DMG
        run: |
          mkdir -p dist
          mkdir -p dist/dmg_contents
          cp -R build/macos/Build/Products/Release/venera.app dist/dmg_contents/
          ln -s /Applications dist/dmg_contents/Applications
          hdiutil create -volname "venera" -srcfolder dist/dmg_contents -ov -format UDZO "dist/venera.dmg"

      - name: Add version to filename
        run: |
          APP_VERSION=$(grep "version:" pubspec.yaml | cut -d':' -f2 | tr -d ' ')
          mkdir -p result
          mv dist/venera.dmg result/venera-$APP_VERSION.dmg

      # Step 4: Attach and upload artifacts (optional)
      - name: Upload DMG
        uses: actions/upload-artifact@v4
        with:
          name: macos_build
          path: result/
  Build_IOS:
    runs-on: macos-15
    steps:
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version-file: pubspec.yaml
          architecture: x64
      - run: sudo xcode-select --switch /Applications/Xcode_16.4.app
      - run: flutter pub get
      - run: flutter build ios --release --no-codesign
      - run: |
          mkdir -p /Users/runner/work/venera/venera/build/ios/iphoneos/Payload
          mv /Users/runner/work/venera/venera/build/ios/iphoneos/Runner.app /Users/runner/work/venera/venera/build/ios/iphoneos/Payload
          cd /Users/runner/work/venera/venera/build/ios/iphoneos/
          zip -r venera-ios.ipa Payload
      - name: Add version to filename
        run: |
          APP_VERSION=$(grep "version:" pubspec.yaml | cut -d':' -f2 | tr -d ' ')
          mkdir -p result
          mv build/ios/iphoneos/venera-ios.ipa result/venera-ios-$APP_VERSION.ipa
      - uses: actions/upload-artifact@v4
        with:
          name: ios_build
          path: result/
  Build_Android:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - run: rm -rf /opt/hostedtoolcache
      - uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version-file: pubspec.yaml
          architecture: x64
      - name: Decode and install certificate
        env:
          STORE_FILE: ${{ secrets.ANDROID_KEYSTORE }}
          PROPERTY_FILE: ${{ secrets.ANDROID_KEY_PROPERTIES }}
        run: |
            echo "$STORE_FILE" | base64 --decode > android/keystore.jks
            echo "$PROPERTY_FILE" > android/key.properties
      - uses: actions/setup-java@v4
        with:
          distribution: 'oracle'
          java-version: '17'
      - name: Check rust-toolchain.toml
        run: rustup show
      - run: flutter pub get
      - run: flutter build apk --release
      - uses: actions/upload-artifact@v4
        with:
          name: apks
          path: build/app/outputs/apk/release
  Build_Windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v3
      - name: install dependencies
        run: | 
          choco install yq -y
          pip install httpx
      - name: Install Inno Setup
        run: choco install innosetup --no-progress
      - uses: subosito/flutter-action@v2
        with:
          channel: "stable"
          flutter-version-file: pubspec.yaml
          architecture: x64
      - name: build
        run: |
          flutter pub get
          python windows/build.py
      - uses: actions/upload-artifact@v4
        with:
          name: windows_build
          path: build/windows/Venera-*
  Build_Linux:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
          flutter-version-file: pubspec.yaml
          architecture: x64
      - run: |
          sudo apt-get update -y
          sudo apt-get install -y ninja-build libgtk-3-dev webkit2gtk-4.1
          dart pub global activate -s git https://github.com/venera-app/flutter_to_debian.git
      - run: python3 debian/build.py x64
      - run: dart run flutter_to_arch
      - run: |
          sudo rm -rf build/linux/arch/app.tar.gz
          sudo rm -rf build/linux/arch/pkg
          sudo rm -rf build/linux/arch/src
          sudo rm -rf build/linux/arch/PKGBUILD
      - uses: actions/upload-artifact@v4
        with:
          name: deb_build
          path: build/linux/x64/release/debian
      - uses: actions/upload-artifact@v4
        with:
          name: arch_build
          path: build/linux/arch/
  Build_Linux_ARM64:
    runs-on: ubuntu-22.04-arm
    steps:
      - uses: actions/checkout@v4
      - uses: subosito/flutter-action@v2
        with:
          channel: 'master'
          flutter-version-file: pubspec.yaml
      - run: |
          flutter pub get
          sudo apt-get update -y
          sudo apt-get install -y ninja-build libgtk-3-dev webkit2gtk-4.1
          dart pub global activate -s git https://github.com/venera-app/flutter_to_debian.git
      - name: "Patch font"
        run: |
          dart run patch/font.dart
      - run: python3 debian/build.py arm64
      - uses: actions/upload-artifact@v4
        with:
          name: deb_arm64_build
          path: build/linux/x64/release/debian # This is a bug related to flutter_to_debian, but it's not a big deal.

  Release:
    runs-on: ubuntu-22.04
    needs: [Build_MacOS, Build_IOS, Build_Android, Build_Windows, Build_Linux, Build_Linux_ARM64]
    if: github.event_name == 'release'  # 仅在 push 事件时执行
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: macos_build
          path: outputs
      - uses: actions/download-artifact@v4
        with:
          name: ios_build
          path: outputs
      - uses: actions/download-artifact@v4
        with:
          name: apks
          path: outputs
      - uses: actions/download-artifact@v4
        with:
          name: windows_build
          path: outputs
      - uses: actions/download-artifact@v4
        with:
          name: deb_build
          path: outputs
      - uses: actions/download-artifact@v4
        with:
          name: arch_build
          path: outputs
      - uses: actions/download-artifact@v4
        with:
          name: deb_arm64_build
          path: outputs
      - uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ github.ref_name }}
          files: |
            outputs/*.ipa
            outputs/*.dmg
            outputs/*.apk
            outputs/*.zip
            outputs/*.exe
            outputs/*.deb
            outputs/*.zst
            outputs/*.AppImage
        env:
          GITHUB_TOKEN: ${{ secrets.ACTION_GITHUB_TOKEN }}


================================================
FILE: .github/workflows/update_alt_store.yml
================================================
name: Update AltStore Source

on:
  workflow_run:
    workflows: ["Build ALL"]
    types: [completed]
  workflow_dispatch:

jobs:
  update-source:
    runs-on: ubuntu-latest
    if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.x'

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install requests

    - name: Record job start time
      id: job_start_time
      run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT

    - name: Update AltStore source
      id: update_source
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        python update_alt_store.py
        git config --global user.name 'GitHub Action'
        git config --global user.email 'action@github.com'
        git add alt_store.json
        if git diff --staged --quiet; then
          echo "changes=false" >> $GITHUB_OUTPUT
        else
          # Create a new branch for the PR
          branch_name="update-altstore-$(date +%Y%m%d-%H%M%S)"
          git checkout -b "$branch_name"
          git commit -m "Updated source with latest release"
          git push -u origin "$branch_name"
          
          # Create PR using GitHub CLI
          gh pr create \
          --title "Update AltStore source with latest release" \
          --body "This PR updates the alt_store.json file with the latest release information." \
          --head "$branch_name" \
          --base master
          
          echo "changes=true" >> $GITHUB_OUTPUT
        fi

    - name: Calculate job duration
      id: duration
      if: always()
      run: |
        end_time=$(date +%s)
        duration=$((end_time - ${{ steps.job_start_time.outputs.start_time }}))
        echo "duration=$duration seconds" >> $GITHUB_OUTPUT

    - name: Create job summary
      run: |
        if [[ "${{ steps.update_source.outputs.changes }}" == "true" ]]; then
          echo "## Update Altstore Source Summary 🚀" >> $GITHUB_STEP_SUMMARY
          echo "✅ Changes Detected and Applied" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "The alt_store.json file has been updated with the latest release information." >> $GITHUB_STEP_SUMMARY
        else
          echo "## Update Altstore Source Summary 🚀" >> $GITHUB_STEP_SUMMARY
          echo "🔍 No Changes Detected" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "The alt_store.json file is up to date. No changes were necessary." >> $GITHUB_STEP_SUMMARY
        fi
        echo "" >> $GITHUB_STEP_SUMMARY
        echo "🕐 Execution Time" >> $GITHUB_STEP_SUMMARY
        echo "" >> $GITHUB_STEP_SUMMARY
        echo "This job took ${{ steps.duration.outputs.duration }} to complete." >> $GITHUB_STEP_SUMMARY
        echo "" >> $GITHUB_STEP_SUMMARY
        echo "📆 Next Scheduled Run" >> $GITHUB_STEP_SUMMARY
        echo "" >> $GITHUB_STEP_SUMMARY
        echo "The next scheduled run will be tomorrow at midnight UTC." >> $GITHUB_STEP_SUMMARY


================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
.vscode/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

add_translation.py

*/*/generated_*
*/*/Generated*

================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: "b0850beeb25f6d5b10426284f506557f66181b36"
  channel: "stable"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
  platforms:
    - platform: root
      create_revision: b0850beeb25f6d5b10426284f506557f66181b36
      base_revision: b0850beeb25f6d5b10426284f506557f66181b36
    - platform: android
      create_revision: b0850beeb25f6d5b10426284f506557f66181b36
      base_revision: b0850beeb25f6d5b10426284f506557f66181b36
    - platform: ios
      create_revision: b0850beeb25f6d5b10426284f506557f66181b36
      base_revision: b0850beeb25f6d5b10426284f506557f66181b36
    - platform: linux
      create_revision: b0850beeb25f6d5b10426284f506557f66181b36
      base_revision: b0850beeb25f6d5b10426284f506557f66181b36
    - platform: macos
      create_revision: b0850beeb25f6d5b10426284f506557f66181b36
      base_revision: b0850beeb25f6d5b10426284f506557f66181b36
    - platform: windows
      create_revision: b0850beeb25f6d5b10426284f506557f66181b36
      base_revision: b0850beeb25f6d5b10426284f506557f66181b36

  # User provided section

  # List of Local paths (relative to this file) that should be
  # ignored by the migrate tool.
  #
  # Files that are not part of the templates will be ignored by default.
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
# venera
[![flutter](https://img.shields.io/badge/flutter-3.41.4-blue)](https://flutter.dev/)
[![License](https://img.shields.io/github/license/venera-app/venera)](https://github.com/venera-app/venera/blob/master/LICENSE)
[![stars](https://img.shields.io/github/stars/venera-app/venera?style=flat)](https://github.com/venera-app/venera/stargazers)

[![Download](https://img.shields.io/github/v/release/venera-app/venera)](https://github.com/venera-app/venera/releases)
[![AUR Version](https://img.shields.io/aur/version/venera-bin)](https://aur.archlinux.org/packages/venera-bin)
[![F-Droid Version](https://img.shields.io/f-droid/v/com.github.wgh136.venera)](https://f-droid.org/packages/com.github.wgh136.venera/)

A comic reader that support reading local and network comics.

## Features
- Read local comics
- Use javascript to create comic sources
- Read comics from network sources
- Manage favorite comics
- Download comics
- View comments, tags, and other information of comics if the source supports
- Login to comment, rate, and other operations if the source supports

## Build from source
1. Clone the repository
2. Install flutter, see [flutter.dev](https://flutter.dev/docs/get-started/install)
3. Install rust, see [rustup.rs](https://rustup.rs/)
4. Build for your platform: e.g. `flutter build apk`

## Create a new comic source
See [Comic Source](doc/comic_source.md)

## Thanks

### Tags Translation
[EhTagTranslation](https://github.com/EhTagTranslation/Database)

The Chinese translation of the manga tags is from this project.

## Headless Mode
See [Headless Doc](doc/headless_doc.md)



================================================
FILE: alt_store.json
================================================
{
  "name": "Venera",
  "identifier": "com.github.wgh136.venera.source",
  "website": "https://github.com/venera-app/venera",
  "subtitle": "Venera official AltStore Source.",
  "description": "This is the official AltStore Source for Venera.\n\n A comic reader that supports reading local and network comics",
  "tintColor": "#0784FC",
  "iconURL": "https://raw.githubusercontent.com/venera-app/venera/master/assets/app_icon.png",
  "apps": [
    {
      "beta": false,
      "name": "Venera",
      "bundleIdentifier": "com.github.wgh136.venera",
      "developerName": "wgh136",
      "subtitle": "A comic reader that supports reading local and network comics",
      "version": "1.6.3",
      "versionDate": "2026-03-08",
      "versionDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/736\r\n* deps: flutter 3.41.4 and upgrade dependencies by @ynyxx in https://github.com/venera-app/venera/pull/809\r\n* Add downloaded comic restore in import comic by @bustesoul in https://github.com/venera-app/venera/pull/765\r\n* chore: update Android Gradle plugin to version 8.12.3 and upgrade Gra\u2026 by @ynyxx in https://github.com/venera-app/venera/pull/810\r\n* Fix customImageProcessing not triggering due to async keyword mismatch by @UCPr251 in https://github.com/venera-app/venera/pull/763\r\n* Add device-specific settings by @Arkalin in https://github.com/venera-app/venera/pull/808\r\n* Fix: reader swipe gesture causing  back navigation when image is loading by @boa-z in https://github.com/venera-app/venera/pull/764\r\n* Enhance image resizing logic. Close 800 by @ynyxx in https://github.com/venera-app/venera/pull/812\r \nNew Contributors\r\n* @UCPr251 made their first contribution in https://github.com/venera-app/venera/pull/763\r\n* @Arkalin made their first contribution in https://github.com/venera-app/venera/pull/808\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.6.2...v1.6.3",
      "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.3/venera-ios-1.6.3%2B163.ipa",
      "localizedDescription": "A comic reader that supports reading local and network comics",
      "iconURL": "https://raw.githubusercontent.com/venera-app/venera/master/assets/app_icon.png",
      "tintColor": "#0784FC",
      "category": "utilities",
      "size": 15489327,
      "appPermissions": {
        "entitlements": [
          "application-identifier",
          "com.apple.security.application-groups",
          "get-task-allow",
          "keychain-access-groups",
          "com.apple.developer.kernel.extended-virtual-addressing",
          "com.apple.developer.kernel.increased-memory-limit",
          "com.apple.developer.healthkit.background-delivery"
        ],
        "privacy": {
          "NSFaceIDUsageDescription": "Face ID or Touch ID is used to protect your privacy when opening the app, ensuring secure access to your reading content.",
          "NSPhotoLibraryAddUsageDescription": "Used to save comic images you've favorited or downloaded to your photo library for easy access and sharing.",
          "NSPhotoLibraryUsageDescription": "Used to select images from your photo library when needed, and to save comic images you've collected to your device."
        }
      },
      "versions": [
        {
          "version": "1.6.3",
          "date": "2026-03-08",
          "localizedDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/736\r\n* deps: flutter 3.41.4 and upgrade dependencies by @ynyxx in https://github.com/venera-app/venera/pull/809\r\n* Add downloaded comic restore in import comic by @bustesoul in https://github.com/venera-app/venera/pull/765\r\n* chore: update Android Gradle plugin to version 8.12.3 and upgrade Gra\u2026 by @ynyxx in https://github.com/venera-app/venera/pull/810\r\n* Fix customImageProcessing not triggering due to async keyword mismatch by @UCPr251 in https://github.com/venera-app/venera/pull/763\r\n* Add device-specific settings by @Arkalin in https://github.com/venera-app/venera/pull/808\r\n* Fix: reader swipe gesture causing  back navigation when image is loading by @boa-z in https://github.com/venera-app/venera/pull/764\r\n* Enhance image resizing logic. Close 800 by @ynyxx in https://github.com/venera-app/venera/pull/812\r \nNew Contributors\r\n* @UCPr251 made their first contribution in https://github.com/venera-app/venera/pull/763\r\n* @Arkalin made their first contribution in https://github.com/venera-app/venera/pull/808\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.6.2...v1.6.3",
          "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.3/venera-ios-1.6.3%2B163.ipa",
          "size": 15489327
        },
        {
          "version": "1.6.2",
          "date": "2026-01-01",
          "localizedDescription": "What's Changed\r\n* Set status bar transparent when startup. by @lings03 in https://github.com/venera-app/venera/pull/664\r\n* Jump to last page when continuously flipping to previous chapter.  by @lings03 in https://github.com/venera-app/venera/pull/665\r\n* Show chapter comments at end of chapter. by @lings03 in https://github.com/venera-app/venera/pull/666\r\n* Save file name: {comic}_EP{chapter}_P{page}.{ext} to avoid conflict. by @lings03 in https://github.com/venera-app/venera/pull/669\r\n* Enable to refresh history info. by @lings03 in https://github.com/venera-app/venera/pull/722\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/651\r\n* Update comic source URL to use jsdelivr CDN for improved reliability by @wgh136 in https://github.com/venera-app/venera/pull/734\r\n* Improve layout of buttons in reader by @wgh136 in https://github.com/venera-app/venera/pull/735\r \n\r\nFull Changelog: https://github.com/venera-app/venera/compare/v1.6.1...v1.6.2",
          "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.2/venera-ios-1.6.2%2B162.ipa",
          "size": 15209455
        },
        {
          "version": "1.6.1",
          "date": "2025-11-29",
          "localizedDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/602\r\n* Add encryptAes for js_engine by @liulifox233 in https://github.com/venera-app/venera/pull/645\r\n* Optimize iOS full-screen back gesture implementation by @liulifox233 in https://github.com/venera-app/venera/pull/643\r\n* Fix landscape reader layout and wrap long settings labels by @boa-z in https://github.com/venera-app/venera/pull/640\r\n* Enhance Cloudflare challenge detection logic by @Y-Ymeow in https://github.com/venera-app/venera/pull/619\r\n* interceptor: mask log by @Pacalini in https://github.com/venera-app/venera/pull/618\r\n* feat: skip sync setting by @Pacalini in https://github.com/venera-app/venera/pull/563\r\n* flutter 3.38.3 by @wgh136 in https://github.com/venera-app/venera/pull/648\r\n* fix: enable multi-select actions in local comics search mode by @wgh136 in https://github.com/venera-app/venera/pull/650\r\n* feat: add comment keyword blocking functionality by @wgh136 in https://github.com/venera-app/venera/pull/649\r \nNew Contributors\r\n* @Y-Ymeow made their first contribution in https://github.com/venera-app/venera/pull/619\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.6.0...v1.6.1",
          "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.1/venera-ios-1.6.1%2B161.ipa",
          "size": 15202312
        },
        {
          "version": "1.6.0",
          "date": "2025-11-01",
          "localizedDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/559\r\n* \u8c03\u6574\u591a\u6536\u85cf\u5939\u6f2b\u753b\u6e90\u7684\u6536\u85cf\u72b6\u6001\u663e\u793a\u903b\u8f91 by @Ftbom in https://github.com/venera-app/venera/pull/571\r\n* Enhance onResponse to support Future and validate result type by @wgh136 in https://github.com/venera-app/venera/pull/574\r\n* [iOS] Enable full screen swipe back gesture by @liulifox233 in https://github.com/venera-app/venera/pull/575\r\n* [linux] Fix linux nhentai cover image by @4b1tQu4ntN3k0 in https://github.com/venera-app/venera/pull/578\r\n* feat: \u652f\u6301\u8fc7\u6ee4\u9605\u8bfb\u5b8c\u6210\u60c5\u51b5 by @luckyray-fan in https://github.com/venera-app/venera/pull/582\r\n* Fix chinese character issue when compressing files. Close 565 by @ynyx631 in https://github.com/venera-app/venera/pull/583\r\n* Add support for ArrayBuffer to showInputDialog. by @wgh136 in https://github.com/venera-app/venera/pull/585\r\n* Added support for localstorage when logging in via webview. by @wgh136 in https://github.com/venera-app/venera/pull/586\r\n* Fix the issue of the comic list loading infinitely. Close 584 by @ynyx631 in https://github.com/venera-app/venera/pull/588\r\n* Save data when mark all as read by @lings03 in https://github.com/venera-app/venera/pull/592\r\n* Chapter comments. by @lings03 in https://github.com/venera-app/venera/pull/593\r\n* Optimize favorite page and home page. by @lings03 in https://github.com/venera-app/venera/pull/594\r\n* Update version code by @wgh136 in https://github.com/venera-app/venera/pull/596\r\n* Fix missing depends in deb package. Close 587 by @wgh136 in https://github.com/venera-app/venera/pull/597\r\n* feat: \u672c\u5730\u6536\u85cf\u641c\u7d22\u652f\u6301\u8f6c\u5c0f\u5199\u5339\u914d by @luckyray-fan in https://github.com/venera-app/venera/pull/598\r\n* Fix editor page gesture confict by @liulifox233 in https://github.com/venera-app/venera/pull/600\r \nNew Contributors\r\n* @github-actions[bot] made their first contribution in https://github.com/venera-app/venera/pull/559\r\n* @Ftbom made their first contribution in https://github.com/venera-app/venera/pull/571\r\n* @liulifox233 made their first contribution in https://github.com/venera-app/venera/pull/575\r\n* @4b1tQu4ntN3k0 made their first contribution in https://github.com/venera-app/venera/pull/578\r\n* @ynyx631 made their first contribution in https://github.com/venera-app/venera/pull/583\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.5.3...v1.6.0",
          "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.0/venera-ios-1.6.0%2B160.ipa",
          "size": 15064741
        },
        {
          "version": "1.5.3",
          "date": "2025-10-13",
          "localizedDescription": "1. Fix an issue where the app freezes after swiping back on Android. 544\r\n2. Enable minification when building for Android. 547\r\n3. Prevent the app from creating an archive download task when the archive URL is an empty string.",
          "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.5.3/venera-ios-1.5.3%2B153.ipa",
          "size": 15047841
        },
        {
          "version": "1.4.5",
          "date": "2025-06-18",
          "localizedDescription": "1. Fixed an abnormal single image height issue when \"imagesPerPage > 1\". 379  \r\n2. Fixed an invalid page calculation issue when \"showSingleImageOnFirstPage\" is enabled.  \r\n3. Fixed an issue with incorrect reading history when displaying a single image on the first page.  \r\n4. Fixed abnormal history recording when pages are not flipped. 392  \r\n5. Fixed an issue where the download task would stop after exiting the reader. 387  \r\n6. Fixed a \"RangeError\" when translating tags. 356  \r\n7. Reset the current folder to null on the favorites page if the folder is invalid. 389  \r\n8. Fixed various issues when using a custom download path on Android. 400  \r\n9. Set the initial chapter to the first downloaded chapter if no history exists when starting to read a local comic. 405  \r\n10. Removed the config file repository URL from the app.",
          "downloadURL": "https://github.com/venera-app/venera/releases/download/v1.4.5/venera-ios-1.4.5%2B145.ipa",
          "size": 14960268
        }
      ]
    }
  ],
  "news": [
    {
      "appID": "com.github.wgh136.venera",
      "caption": "Update of Venera just got released!",
      "date": "2025-06-18T09:02:01Z",
      "identifier": "release-v1.4.5",
      "notify": true,
      "tintColor": "#0784FC",
      "title": "v1.4.5 - Venera  18/06/25",
      "url": "https://github.com/venera-app/venera/releases/tag/v1.4.5"
    },
    {
      "appID": "com.github.wgh136.venera",
      "caption": "Update of Venera just got released!",
      "date": "2025-10-13T12:47:27Z",
      "identifier": "release-v1.5.3",
      "notify": true,
      "tintColor": "#0784FC",
      "title": "v1.5.3 - Venera  13/10/25",
      "url": "https://github.com/venera-app/venera/releases/tag/v1.5.3"
    },
    {
      "appID": "com.github.wgh136.venera",
      "caption": "Update of Venera just got released!",
      "date": "2025-11-01T07:31:38Z",
      "identifier": "release-v1.6.0",
      "notify": true,
      "tintColor": "#0784FC",
      "title": "v1.6.0 - Venera  01/11/25",
      "url": "https://github.com/venera-app/venera/releases/tag/v1.6.0"
    },
    {
      "appID": "com.github.wgh136.venera",
      "caption": "Update of Venera just got released!",
      "date": "2025-11-29T08:51:14Z",
      "identifier": "release-v1.6.1",
      "notify": true,
      "tintColor": "#0784FC",
      "title": "v1.6.1 - Venera  29/11/25",
      "url": "https://github.com/venera-app/venera/releases/tag/v1.6.1"
    },
    {
      "appID": "com.github.wgh136.venera",
      "caption": "Update of Venera just got released!",
      "date": "2026-01-01T08:31:16Z",
      "identifier": "release-v1.6.2",
      "notify": true,
      "tintColor": "#0784FC",
      "title": "v1.6.2 - Venera  01/01/26",
      "url": "https://github.com/venera-app/venera/releases/tag/v1.6.2"
    },
    {
      "appID": "com.github.wgh136.venera",
      "caption": "Update of Venera just got released!",
      "date": "2026-03-08T09:49:52Z",
      "identifier": "release-v1.6.3",
      "notify": true,
      "tintColor": "#0784FC",
      "title": "v1.6.3 - Venera  08/03/26",
      "url": "https://github.com/venera-app/venera/releases/tag/v1.6.3"
    }
  ]
}

================================================
FILE: analysis_options.yaml
================================================
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml

linter:
  # The lint rules applied to this project can be customized in the
  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  # included above or to enable additional rules. A list of all available lints
  # and their documentation is published at https://dart.dev/lints.
  #
  # Instead of disabling a lint rule for the entire project in the
  # section below, it can also be suppressed for a single line of code
  # or a specific dart file by using the `// ignore: name_of_lint` and
  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  # producing the lint.
  rules:
    collection_methods_unrelated_type: false
    use_build_context_synchronously: false
    avoid_print: false
    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options


================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java

# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
/app/.cxx/


================================================
FILE: android/app/build.gradle
================================================
plugins {
    id "com.android.application"
    id "kotlin-android"
    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
    id "dev.flutter.flutter-gradle-plugin"
}

ext.abiCodes = ["armeabi-v7a": 1, "arm64-v8a": 2, "x86_64": 3]

def localProperties = new Properties()
def localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader("UTF-8") { reader ->
        localProperties.load(reader)
    }
}

def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
    flutterVersionCode = "1"
}

def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
    flutterVersionName = "1.0"
}

def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    namespace = "com.github.wgh136.venera"
    compileSdk = flutter.compileSdkVersion
    ndkVersion "28.0.13004108"

    packaging {
        jniLibs {
            useLegacyPackaging true
        }
    }

    splits{
        abi {
            reset()
            include 'armeabi-v7a', 'arm64-v8a', 'x86_64'
            enable true
            universalApk true
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions{
        jvmTarget = JavaVersion.VERSION_17
    }

    signingConfigs {
        debug {
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
        }
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    defaultConfig {
        applicationId = "com.github.wgh136.venera"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdk = flutter.minSdkVersion
        targetSdk = flutter.targetSdkVersion
        versionCode = flutterVersionCode.toInteger()
        versionName = flutterVersionName
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            ndk {
                abiFilters "armeabi-v7a", "arm64-v8a", "x86_64"
            }
            signingConfig signingConfigs.release
        }
        debug {
            ndk {
                abiFilters "armeabi-v7a", "arm64-v8a", "x86_64"
            }
            signingConfig signingConfigs.debug
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def abi = output.getFilter(com.android.build.OutputFile.ABI)
            if (variant.buildType.name == "release") {
                if (abi != null) {
                    outputFileName = "venera-${variant.versionName}-${abi}.apk"
                    def abiVersionCode = project.ext.abiCodes.get(abi)
                    if (abiVersionCode != null) {
                        versionCodeOverride = variant.versionCode * 10 + abiVersionCode
                    }
                } else {
                    outputFileName = "venera-${variant.versionName}.apk"
                    versionCodeOverride = variant.versionCode * 10
                }
            } else if (variant.buildType.name == "debug") {
                versionCodeOverride = variant.versionCode * 10 + 4
            }
        }
    }

    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

flutter {
    source = "../.."
}

dependencies {
    implementation "androidx.activity:activity-ktx:1.10.1"
    implementation 'androidx.documentfile:documentfile:1.0.1'
}


================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- The INTERNET permission is required for development. Specifically,
         the Flutter tool needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.USE_BIOMETRIC"/>
    <application
        android:label="venera"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:taskAffinity=""
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:enableOnBackInvokedCallback="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https" android:host="nhentai.net" android:pathPrefix="/g" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https" android:host="e-hentai.org" android:pathPrefix="/g" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https" android:host="exhentai.org" android:pathPrefix="/g" />
            </intent-filter>
            <intent-filter android:label="@string/share_text">
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
    <!-- Required to query activities that can process text, see:
         https://developer.android.com/training/package-visibility and
         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
</manifest>


================================================
FILE: android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt
================================================
package com.github.wgh136.venera

import android.Manifest
import android.app.Activity
import android.content.ContentResolver
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.Settings
import android.util.Log
import android.view.KeyEvent
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import dev.flutter.packages.file_selector_android.FileUtils
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import java.io.File
import java.io.FileOutputStream
import java.util.concurrent.atomic.AtomicInteger

class MainActivity : FlutterFragmentActivity() {
    var volumeListen = VolumeListen()
    var listening = false

    private val storageRequestCode = 0x10
    private var storagePermissionRequest: ((Boolean) -> Unit)? = null

    private val nextLocalRequestCode = AtomicInteger()

    private val sharedTexts = ArrayList<String>()

    private var textShareHandler: ((String) -> Unit)? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (intent?.action == Intent.ACTION_SEND) {
            if (intent.type == "text/plain") {
                val text = intent.getStringExtra(Intent.EXTRA_TEXT)
                if (text != null)
                    handleSharedText(text)
            }
        }
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        if (intent.action == Intent.ACTION_SEND) {
            if (intent.type == "text/plain") {
                val text = intent.getStringExtra(Intent.EXTRA_TEXT)
                if (text != null)
                    handleSharedText(text)
            }
        }
    }

    private fun handleSharedText(text: String) {
        if (textShareHandler != null) {
            textShareHandler?.invoke(text)
        } else {
            sharedTexts.add(text)
        }
    }

    private fun <I, O> startContractForResult(
        contract: ActivityResultContract<I, O>,
        input: I,
        callback: ActivityResultCallback<O>
    ) {
        val key = "activity_rq_for_result#${nextLocalRequestCode.getAndIncrement()}"
        val registry = activityResultRegistry
        var launcher: ActivityResultLauncher<I>? = null
        val observer = object : LifecycleEventObserver {
            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
                if (Lifecycle.Event.ON_DESTROY == event) {
                    launcher?.unregister()
                    lifecycle.removeObserver(this)
                }
            }
        }
        lifecycle.addObserver(observer)
        val newCallback = ActivityResultCallback<O> {
            launcher?.unregister()
            lifecycle.removeObserver(observer)
            callback.onActivityResult(it)
        }
        launcher = registry.register(key, contract, newCallback)
        launcher.launch(input)
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannel(
            flutterEngine.dartExecutor.binaryMessenger,
            "venera/method_channel"
        ).setMethodCallHandler { call, res ->
            when (call.method) {
                "getProxy" -> res.success(getProxy())
                "setScreenOn" -> {
                    val set = call.argument<Boolean>("set") ?: false
                    if (set) {
                        window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
                    } else {
                        window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
                    }
                    res.success(null)
                }

                "getDirectoryPath" -> {
                    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
                    startContractForResult(ActivityResultContracts.StartActivityForResult(), intent) { activityResult ->
                        if (activityResult.resultCode != Activity.RESULT_OK) {
                            res.success(null)
                            return@startContractForResult
                        }
                        val pickedDirectoryUri = activityResult.data?.data
                        if (pickedDirectoryUri == null)
                            res.success(null)
                        else
                            onPickedDirectory(pickedDirectoryUri, res)
                    }
                }

                else -> res.notImplemented()
            }
        }

        val channel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, "venera/volume")
        channel.setStreamHandler(
            object : EventChannel.StreamHandler {
                override fun onListen(arguments: Any?, events: EventChannel.EventSink) {
                    listening = true
                    volumeListen.onUp = {
                        events.success(1)
                    }
                    volumeListen.onDown = {
                        events.success(2)
                    }
                }

                override fun onCancel(arguments: Any?) {
                    listening = false
                }
            })

        val storageChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "venera/storage")
        storageChannel.setMethodCallHandler { _, res ->
            requestStoragePermission { result ->
                res.success(result)
            }
        }

        val selectFileChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "venera/select_file")
        selectFileChannel.setMethodCallHandler { req, res ->
            val mimeType = req.arguments<String>()
            openFile(res, mimeType!!)
        }

        val shareTextChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, "venera/text_share")
        shareTextChannel.setStreamHandler(
            object : EventChannel.StreamHandler {
                override fun onListen(arguments: Any?, events: EventChannel.EventSink) {
                    textShareHandler = {text ->
                        events.success(text)
                    }
                    if (sharedTexts.isNotEmpty()) {
                        for (text in sharedTexts) {
                            events.success(text)
                        }
                        sharedTexts.clear()
                    }
                }

                override fun onCancel(arguments: Any?) {
                    textShareHandler = null
                }
            })
    }

    private fun getProxy(): String {
        val host = System.getProperty("http.proxyHost")
        val port = System.getProperty("http.proxyPort")
        return if (host != null && port != null) {
            "$host:$port"
        } else {
            "No Proxy"
        }
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (listening) {
            when (keyCode) {
                KeyEvent.KEYCODE_VOLUME_DOWN -> {
                    volumeListen.down()
                    return true
                }

                KeyEvent.KEYCODE_VOLUME_UP -> {
                    volumeListen.up()
                    return true
                }
            }
        }
        return super.onKeyDown(keyCode, event)
    }

    /// Ensure that the directory is accessible by dart:io
    private fun onPickedDirectory(uri: Uri, result: MethodChannel.Result) {
        if (hasStoragePermission()) {
            var plain = uri.toString()
            if(plain.contains("%3A")) {
                plain = Uri.decode(plain)
            }
            val externalStoragePrefix = "content://com.android.externalstorage.documents/tree/primary:";
            if(plain.startsWith(externalStoragePrefix)) {
                val path = plain.substring(externalStoragePrefix.length)
                result.success(Environment.getExternalStorageDirectory().absolutePath + "/" + path)
            }
            // The uri cannot be parsed to plain path, use copy method
        }
        // dart:io cannot access the directory without permission.
        // so we need to copy the directory to cache directory
        val contentResolver = contentResolver
        var tmp = cacheDir
        var dirName = DocumentFile.fromTreeUri(this, uri)?.name
        tmp = File(tmp, dirName!!)
        if(tmp.exists()) {
            tmp.deleteRecursively()
        }
        tmp.mkdir()
        Thread {
            try {
                copyDirectory(contentResolver, uri, tmp)
                result.success(tmp.absolutePath)
            }
            catch (e: Exception) {
                result.error("copy error", e.message, null)
            }
        }.start()

    }

    private fun copyDirectory(resolver: ContentResolver, srcUri: Uri, destDir: File) {
        val src = DocumentFile.fromTreeUri(this, srcUri) ?: return
        for (file in src.listFiles()) {
            if (file.isDirectory) {
                val newDir = File(destDir, file.name!!)
                newDir.mkdir()
                copyDirectory(resolver, file.uri, newDir)
            } else {
                val newFile = File(destDir, file.name!!)
                resolver.openInputStream(file.uri)?.use { input ->
                    FileOutputStream(newFile).use { output ->
                        input.copyTo(output, bufferSize = DEFAULT_BUFFER_SIZE)
                        output.flush()
                    }
                }
            }
        }
    }

    private fun hasStoragePermission(): Boolean {
        return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.READ_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED
        } else {
            Environment.isExternalStorageManager()
        }
    }

    private fun requestStoragePermission(result: (Boolean) -> Unit) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            val readPermission = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.READ_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED

            val writePermission = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED

            if (!readPermission || !writePermission) {
                storagePermissionRequest = result
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE
                    ),
                    storageRequestCode
                )
            } else {
                result(true)
            }
        } else {
            if (!Environment.isExternalStorageManager()) {
                try {
                    val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
                    intent.addCategory("android.intent.category.DEFAULT")
                    intent.data = Uri.parse("package:$packageName")
                    startContractForResult(ActivityResultContracts.StartActivityForResult(), intent){ _ ->
                        result(Environment.isExternalStorageManager())
                    }
                } catch (e: Exception) {
                    result(false)
                }
            } else {
                result(true)
            }
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == storageRequestCode) {
            storagePermissionRequest?.invoke(grantResults.all {
                it == PackageManager.PERMISSION_GRANTED
            })
            storagePermissionRequest = null
        }
    }

    private fun openFile(result: MethodChannel.Result, mimeType: String) {
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
        intent.addCategory(Intent.CATEGORY_OPENABLE)
        intent.type = mimeType
        startContractForResult(ActivityResultContracts.StartActivityForResult(), intent){ activityResult ->
            if (activityResult.resultCode != Activity.RESULT_OK) {
                result.success(null)
                return@startContractForResult
            }
            val uri = activityResult.data?.data
            if (uri == null) {
                result.success(null)
                return@startContractForResult
            }
            val contentResolver = contentResolver
            val file = DocumentFile.fromSingleUri(this, uri)
            if (file == null) {
                result.success(null)
                return@startContractForResult
            }
            val fileName = file.name
            if (fileName == null) {
                result.success(null)
                return@startContractForResult
            }
            if(hasStoragePermission()) {
                try {
                    val filePath = FileUtils.getPathFromUri(this, uri)
                    result.success(filePath)
                    return@startContractForResult
                }
                catch (e: Exception) {
                    // ignore
                }
            }
            // use copy method
            val tmp = File(cacheDir, fileName)
            if(tmp.exists()) {
                tmp.delete()
            }
            Log.i("Venera", "copy file (${fileName}) to ${tmp.absolutePath}")
            Thread {
                try {
                    contentResolver.openInputStream(uri)?.use { input ->
                        FileOutputStream(tmp).use { output ->
                            input.copyTo(output, bufferSize = DEFAULT_BUFFER_SIZE)
                            output.flush()
                        }
                    }
                    result.success(tmp.absolutePath)
                }
                catch (e: Exception) {
                    result.error("copy error", e.message, null)
                }
            }.start()
        }
    }
}

class VolumeListen {
    var onUp = fun() {}
    var onDown = fun() {}
    fun up() {
        onUp()
    }

    fun down() {
        onDown()
    }
}



================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?android:colorBackground" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  <background android:drawable="@mipmap/ic_launcher_background"/>
  <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
  <monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
</adaptive-icon>

================================================
FILE: android/app/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="share_text">Search</string>
</resources>

================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             the Flutter engine draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.

         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
        <item name="android:navigationBarColor">@android:color/transparent</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             the Flutter engine draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.

         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
        <item name="android:navigationBarColor">@android:color/transparent</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/values-zh/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="share_text">搜尋</string>
</resources>

================================================
FILE: android/app/src/main/res/values-zh-rCN/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="share_text">搜索</string>
</resources>

================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- The INTERNET permission is required for development. Specifically,
         the Flutter tool needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: android/build.gradle
================================================
allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.buildDir = "../build"
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(":app")
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}


================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip


================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false

================================================
FILE: android/settings.gradle
================================================
pluginManagement {
    def flutterSdkPath = {
        def properties = new Properties()
        file("local.properties").withInputStream { properties.load(it) }
        def flutterSdkPath = properties.getProperty("flutter.sdk")
        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
        return flutterSdkPath
    }()

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
    id "com.android.application" version '8.12.3' apply false
    id "org.jetbrains.kotlin.android" version "2.1.0" apply false
}

include ":app"


================================================
FILE: assets/init.js
================================================
/*
Venera JavaScript Library

This library provides a set of APIs for interacting with the Venera app.
*/

/**
 * @function sendMessage
 * @global
 * @param {Object} message
 * @returns {any}
 */

/**
 * Set a timeout to execute a callback function after a specified delay.
 * @param callback {Function}
 * @param delay {number} - delay in milliseconds
 */
function setTimeout(callback, delay) {
    sendMessage({
        method: 'delay',
        time: delay,
    }).then(callback);
}

/// encode, decode, hash, decrypt
let Convert = {
    /**
     * @param str {string}
     * @returns {ArrayBuffer}
     */
    encodeUtf8: (str) => {
        return sendMessage({
            method: "convert",
            type: "utf8",
            value: str,
            isEncode: true
        });
    },

    /**
     * @param value {ArrayBuffer}
     * @returns {string}
     */
    decodeUtf8: (value) => {
        return sendMessage({
            method: "convert",
            type: "utf8",
            value: value,
            isEncode: false
        });
    },

    /**
     * @param str {string}
     * @returns {ArrayBuffer}
     */
    encodeGbk: (str) => {
        return sendMessage({
            method: "convert",
            type: "gbk",
            value: str,
            isEncode: true
        });
    },

    /**
     * @param value {ArrayBuffer}
     * @returns {string}
     */
    decodeGbk: (value) => {
        return sendMessage({
            method: "convert",
            type: "gbk",
            value: value,
            isEncode: false
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @returns {string}
     */
    encodeBase64: (value) => {
        return sendMessage({
            method: "convert",
            type: "base64",
            value: value,
            isEncode: true
        });
    },

    /**
     * @param {string} value
     * @returns {ArrayBuffer}
     */
    decodeBase64: (value) => {
        return sendMessage({
            method: "convert",
            type: "base64",
            value: value,
            isEncode: false
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @returns {ArrayBuffer}
     */
    md5: (value) => {
        return sendMessage({
            method: "convert",
            type: "md5",
            value: value,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @returns {ArrayBuffer}
     */
    sha1: (value) => {
        return sendMessage({
            method: "convert",
            type: "sha1",
            value: value,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @returns {ArrayBuffer}
     */
    sha256: (value) => {
        return sendMessage({
            method: "convert",
            type: "sha256",
            value: value,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @returns {ArrayBuffer}
     */
    sha512: (value) => {
        return sendMessage({
            method: "convert",
            type: "sha512",
            value: value,
            isEncode: true
        });
    },

    /**
     * @param key {ArrayBuffer}
     * @param value {ArrayBuffer}
     * @param hash {string} - md5, sha1, sha256, sha512
     * @returns {ArrayBuffer}
     */
    hmac: (key, value, hash) => {
        return sendMessage({
            method: "convert",
            type: "hmac",
            value: value,
            key: key,
            hash: hash,
            isEncode: true
        });
    },

    /**
     * @param key {ArrayBuffer}
     * @param value {ArrayBuffer}
     * @param hash {string} - md5, sha1, sha256, sha512
     * @returns {string} - hex string
     */
    hmacString: (key, value, hash) => {
        return sendMessage({
            method: "convert",
            type: "hmac",
            value: value,
            key: key,
            hash: hash,
            isEncode: true,
            isString: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @returns {ArrayBuffer}
     */
    encryptAesEcb: (value, key) => {
        return sendMessage({
            method: "convert",
            type: "aes-ecb",
            value: value,
            key: key,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @returns {ArrayBuffer}
     */
    decryptAesEcb: (value, key) => {
        return sendMessage({
            method: "convert",
            type: "aes-ecb",
            value: value,
            key: key,
            isEncode: false
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @param {ArrayBuffer} iv
     * @returns {ArrayBuffer}
     */
    encryptAesCbc: (value, key, iv) => {
        return sendMessage({
            method: "convert",
            type: "aes-cbc",
            value: value,
            key: key,
            iv: iv,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @param {ArrayBuffer} iv
     * @returns {ArrayBuffer}
     */
    decryptAesCbc: (value, key, iv) => {
        return sendMessage({
            method: "convert",
            type: "aes-cbc",
            value: value,
            key: key,
            iv: iv,
            isEncode: false
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @param {ArrayBuffer} iv
     * @param {number} blockSize
     * @returns {ArrayBuffer}
     */
    encryptAesCfb: (value, key, iv, blockSize) => {
        return sendMessage({
            method: "convert",
            type: "aes-cfb",
            value: value,
            key: key,
            iv: iv,
            blockSize: blockSize,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @param {ArrayBuffer} iv
     * @param {number} blockSize
     * @returns {ArrayBuffer}
     */
    decryptAesCfb: (value, key, iv, blockSize) => {
        return sendMessage({
            method: "convert",
            type: "aes-cfb",
            value: value,
            key: key,
            iv: iv,
            blockSize: blockSize,
            isEncode: false
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @param {number} blockSize
     * @returns {ArrayBuffer}
     */
    encryptAesOfb: (value, key, blockSize) => {
        return sendMessage({
            method: "convert",
            type: "aes-ofb",
            value: value,
            key: key,
            blockSize: blockSize,
            isEncode: true
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @param {number} blockSize
     * @returns {ArrayBuffer}
     */
    decryptAesOfb: (value, key, blockSize) => {
        return sendMessage({
            method: "convert",
            type: "aes-ofb",
            value: value,
            key: key,
            blockSize: blockSize,
            isEncode: false
        });
    },

    /**
     * @param {ArrayBuffer} value
     * @param {ArrayBuffer} key
     * @returns {ArrayBuffer}
     */
    decryptRsa: (value, key) => {
        return sendMessage({
            method: "convert",
            type: "rsa",
            value: value,
            key: key,
            isEncode: false
        });
    },
    /** Encode bytes to hex string
     * @param bytes {ArrayBuffer}
     * @return {string}
     */
    hexEncode: (bytes) => {
        const hexDigits = '0123456789abcdef';
        const view = new Uint8Array(bytes);
        let charCodes = new Uint8Array(view.length * 2);
        let j = 0;

        for (let i = 0; i < view.length; i++) {
            let byte = view[i];
            charCodes[j++] = hexDigits.charCodeAt((byte >> 4) & 0xF);
            charCodes[j++] = hexDigits.charCodeAt(byte & 0xF);
        }

        return String.fromCharCode(...charCodes);
    },
}

/**
 * create a time-based uuid
 *
 * Note: the engine will generate a new uuid every time it is called
 *
 * To get the same uuid, please save it to the local storage
 *
 * @returns {string}
 */
function createUuid() {
    return sendMessage({
        method: "uuid"
    });
}

/**
 * Generate a random integer between min and max
 * @param min {number}
 * @param max {number}
 * @returns {number}
 */
function randomInt(min, max) {
    return sendMessage({
        method: 'random',
        type: 'int',
        min: min,
        max: max
    });
}

/**
 * Generate a random double between min and max
 * @param min {number}
 * @param max {number}
 * @returns {number}
 */
function randomDouble(min, max) {
    return sendMessage({
        method: 'random',
        type: 'double',
        min: min,
        max: max
    });
}

class _Timer {
    delay = 0;

    callback = () => { };

    status = false;

    constructor(delay, callback) {
        this.delay = delay;
        this.callback = callback;
    }

    run() {
        this.status = true;
        this._interval();
    }

    _interval() {
        if (!this.status) {
            return;
        }
        this.callback();
        setTimeout(this._interval.bind(this), this.delay);
    }

    cancel() {
        this.status = false;
    }
}

function setInterval(callback, delay) {
    let timer = new _Timer(delay, callback);
    timer.run();
    return timer;
}

/**
 * Create a cookie object.
 * @param name {string}
 * @param value {string}
 * @param domain {string}
 * @constructor
 */
function Cookie({name, value, domain}) {
    this.name = name;
    this.value = value;
    this.domain = domain;
}

/**
 * Network object for sending HTTP requests and managing cookies.
 * @namespace Network
 */
let Network = {
    /**
     * Sends an HTTP request.
     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param data - The data to send with the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: ArrayBuffer}>} The response from the request.
     */
    async fetchBytes(method, url, headers, data, extra) {
        let result = await sendMessage({
            method: 'http',
            http_method: method,
            bytes: true,
            url: url,
            headers: headers,
            data: data,
            extra: extra,
        });

        if (result.error) {
            throw result.error;
        }

        return result;
    },

    /**
     * Sends an HTTP request.
     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param data - The data to send with the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.
     */
    async sendRequest(method, url, headers, data, extra) {
        let result = await sendMessage({
            method: 'http',
            http_method: method,
            url: url,
            headers: headers,
            data: data,
            extra: extra,
        });

        if (result.error) {
            throw result.error;
        }

        return result;
    },

    /**
     * Sends an HTTP GET request.
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.
     */
    async get(url, headers, extra) {
        return this.sendRequest('GET', url, headers, extra);
    },

    /**
     * Sends an HTTP POST request.
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param data - The data to send with the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.
     */
    async post(url, headers, data, extra) {
        return this.sendRequest('POST', url, headers, data, extra);
    },

    /**
     * Sends an HTTP PUT request.
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param data - The data to send with the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.
     */
    async put(url, headers, data, extra) {
        return this.sendRequest('PUT', url, headers, data, extra);
    },

    /**
     * Sends an HTTP PATCH request.
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param data - The data to send with the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.
     */
    async patch(url, headers, data, extra) {
        return this.sendRequest('PATCH', url, headers, data, extra);
    },

    /**
     * Sends an HTTP DELETE request.
     * @param {string} url - The URL to send the request to.
     * @param {Object} headers - The headers to include in the request.
     * @param {Object} extra - Extra options to pass to the interceptor.
     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.
     */
    async delete(url, headers, extra) {
        return this.sendRequest('DELETE', url, headers, extra);
    },

    /**
     * Sets cookies for a specific URL.
     * @param {string} url - The URL to set the cookies for.
     * @param {Cookie[]} cookies - The cookies to set.
     */
    setCookies(url, cookies) {
        sendMessage({
            method: 'cookie',
            function: 'set',
            url: url,
            cookies: cookies,
        });
    },

    /**
     * Retrieves cookies for a specific URL.
     * @param {string} url - The URL to get the cookies from.
     * @returns {Promise<Cookie[]>} The cookies for the given URL.
     */
    getCookies(url) {
        return sendMessage({
            method: 'cookie',
            function: 'get',
            url: url,
        });
    },

    /**
     * Deletes cookies for a specific URL.
     * @param {string} url - The URL to delete the cookies from.
     */
    deleteCookies(url) {
        sendMessage({
            method: 'cookie',
            function: 'delete',
            url: url,
        });
    },
};

/**
 * [fetch] function for sending HTTP requests. Same api as the browser fetch.
 * @param url {string}
 * @param [options] {{method?: string, headers?: Object, body?: any}}
 * @returns {Promise<{ok: boolean, status: number, statusText: string, headers: {}, arrayBuffer: (function(): Promise<ArrayBuffer>), text: (function(): Promise<string>), json: (function(): Promise<any>)}>}
 * @since 1.2.0
 */
async function fetch(url, options) {
    let method = 'GET';
    let headers = {};
    let data = null;

    if (options) {
        method = options.method || method;
        headers = options.headers || headers;
        data = options.body || data;
    }

    let result = await Network.fetchBytes(method, url, headers, data);

    return {
        ok: result.status >= 200 && result.status < 300,
        status: result.status,
        statusText: '',
        headers: result.headers,
        arrayBuffer: async () => result.body,
        text: async () => Convert.decodeUtf8(result.body),
        json: async () => JSON.parse(Convert.decodeUtf8(result.body)),
    }
}

/**
 * HtmlDocument class for parsing HTML and querying elements.
 */
class HtmlDocument {
    static _key = 0;

    key = 0;

    /**
     * Constructor for HtmlDocument.
     * @param {string} html - The HTML string to parse.
     */
    constructor(html) {
        this.key = HtmlDocument._key;
        HtmlDocument._key++;
        sendMessage({
            method: "html",
            function: "parse",
            key: this.key,
            data: html
        })
    }

    /**
     * Query a single element from the HTML document.
     * @param {string} query - The query string.
     * @returns {HtmlElement | null} The first matching element.
     */
    querySelector(query) {
        let k = sendMessage({
            method: "html",
            function: "querySelector",
            key: this.key,
            query: query
        })
        if(k == null) return null;
        return new HtmlElement(k, this.key);
    }

    /**
     * Query all matching elements from the HTML document.
     * @param {string} query - The query string.
     * @returns {HtmlElement[]} An array of matching elements.
     */
    querySelectorAll(query) {
        let ks = sendMessage({
            method: "html",
            function: "querySelectorAll",
            key: this.key,
            query: query
        })
        return ks.map(k => new HtmlElement(k, this.key));
    }

    /**
     * Dispose the HTML document.
     * This should be called when the document is no longer needed.
     */
    dispose() {
        sendMessage({
            method: "html",
            function: "dispose",
            key: this.key
        })
    }

    /**
     * Get the element by its id.
     * @param id {string}
     * @returns {HtmlElement|null}
     */
    getElementById(id) {
        let k = sendMessage({
            method: "html",
            function: "getElementById",
            key: this.key,
            id: id
        })
        if(k == null) return null;
        return new HtmlElement(k, this.key);
    }
}

/**
 * HtmlDom class for interacting with HTML elements.
 */
class HtmlElement {
    key = 0;

    doc = 0;

    /**
     * Constructor for HtmlDom.
     * @param {number} k - The key of the element.
     * @param {number} doc - The key of the document.
     */
    constructor(k, doc) {
        this.key = k;
        this.doc = doc;
    }

    /**
     * Get the text content of the element.
     * @returns {string} The text content.
     */
    get text() {
        return sendMessage({
            method: "html",
            function: "getText",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Get the attributes of the element.
     * @returns {Object} The attributes.
     */
    get attributes() {
        return sendMessage({
            method: "html",
            function: "getAttributes",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Query a single element from the current element.
     * @param {string} query - The query string.
     * @returns {HtmlElement} The first matching element.
     */
    querySelector(query) {
        let k = sendMessage({
            method: "html",
            function: "dom_querySelector",
            key: this.key,
            query: query,
            doc: this.doc,
        })
        if(k == null) return null;
        return new HtmlElement(k, this.doc);
    }

    /**
     * Query all matching elements from the current element.
     * @param {string} query - The query string.
     * @returns {HtmlElement[]} An array of matching elements.
     */
    querySelectorAll(query) {
        let ks = sendMessage({
            method: "html",
            function: "dom_querySelectorAll",
            key: this.key,
            query: query,
            doc: this.doc,
        })
        return ks.map(k => new HtmlElement(k, this.doc));
    }

    /**
     * Get the children of the current element.
     * @returns {HtmlElement[]} An array of child elements.
     */
    get children() {
        let ks = sendMessage({
            method: "html",
            function: "getChildren",
            key: this.key,
            doc: this.doc,
        })
        return ks.map(k => new HtmlElement(k, this.doc));
    }

    /**
     * Get the nodes of the current element.
     * @returns {HtmlNode[]} An array of nodes.
     */
    get nodes() {
        let ks = sendMessage({
            method: "html",
            function: "getNodes",
            key: this.key,
            doc: this.doc,
        })
        return ks.map(k => new HtmlNode(k, this.doc));
    }

    /**
     * Get inner HTML of the element.
     * @returns {string} The inner HTML.
     */
    get innerHTML() {
        return sendMessage({
            method: "html",
            function: "getInnerHTML",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Get parent element of the element. If the element has no parent, return null.
     * @returns {HtmlElement|null}
     */
    get parent() {
        let k = sendMessage({
            method: "html",
            function: "getParent",
            key: this.key,
            doc: this.doc,
        })
        if(k == null) return null;
        return new HtmlElement(k, this.doc);
    }

    /**
     * Get class names of the element.
     * @returns {string[]} An array of class names.
     */
    get classNames() {
        return sendMessage({
            method: "html",
            function: "getClassNames",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Get id of the element.
     * @returns {string | null} The id of the element.
     */
    get id() {
        return sendMessage({
            method: "html",
            function: "getId",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Get local name of the element.
     * @returns {string} The tag name of the element.
     */
    get localName() {
        return sendMessage({
            method: "html",
            function: "getLocalName",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Get the previous sibling element of the element. If the element has no previous sibling, return null.
     * @returns {HtmlElement|null}
     */
    get previousElementSibling() {
        let k = sendMessage({
            method: "html",
            function: "getPreviousSibling",
            key: this.key,
            doc: this.doc,
        })
        if(k == null) return null;
        return new HtmlElement(k, this.doc);
    }

    /**
     * Get the next sibling element of the element. If the element has no next sibling, return null.
     * @returns {HtmlElement|null}
     */
    get nextElementSibling() {
        let k = sendMessage({
            method: "html",
            function: "getNextSibling",
            key: this.key,
            doc: this.doc,
        })
        if (k == null) return null;
        return new HtmlElement(k, this.doc);
    }
}

class HtmlNode {
    key = 0;

    doc = 0;

    constructor(k, doc) {
        this.key = k;
        this.doc = doc;
    }

    /**
     * Get the text content of the node.
     * @returns {string} The text content.
     */
    get text() {
        return sendMessage({
            method: "html",
            function: "node_text",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Get the type of the node.
     * @returns {string} The type of the node. ("text", "element", "comment", "document", "unknown")
     */
    get type() {
        return sendMessage({
            method: "html",
            function: "node_type",
            key: this.key,
            doc: this.doc,
        })
    }

    /**
     * Convert the node to an HtmlElement. If the node is not an element, return null.
     * @returns {HtmlElement|null}
     */
    toElement() {
        let k = sendMessage({
            method: "html",
            function: "node_toElement",
            key: this.key,
            doc: this.doc,
        })
        if(k == null) return null;
        return new HtmlElement(k, this.doc);
    }
}

function log(level, title, content) {
    sendMessage({
        method: 'log',
        level: level,
        title: title,
        content: content,
    })
}

let console = {
    log: (content) => {
        log('info', 'JS Console', content)
    },
    warn: (content) => {
        log('warning', 'JS Console', content)
    },
    error: (content) => {
        log('error', 'JS Console', content)
    },
};

/**
 * Create a comic object
 * @param id {string}
 * @param title {string}
 * @param subtitle {string}
 * @param subTitle {string} - equal to subtitle
 * @param cover {string}
 * @param tags {string[]}
 * @param description {string}
 * @param maxPage {number?}
 * @param language {string?}
 * @param favoriteId {string?} - Only set this field if the comic is from favorites page
 * @param stars {number?} - 0-5, double
 * @constructor
 */
function Comic({id, title, subtitle, subTitle, cover, tags, description, maxPage, language, favoriteId, stars}) {
    this.id = id;
    this.title = title;
    this.subtitle = subtitle;
    this.subTitle = subTitle;
    this.cover = cover;
    this.tags = tags;
    this.description = description;
    this.maxPage = maxPage;
    this.language = language;
    this.favoriteId = favoriteId;
    this.stars = stars;
}

/**
 * Create a comic details object
 * @param title {string}
 * @param subtitle {string}
 * @param subTitle {string} - equal to subtitle
 * @param cover {string}
 * @param description {string?}
 * @param tags {Map<string, string[]> | {} | null | undefined}
 * @param chapters {Map<string, string> | {} | null | undefined} - key: chapter id, value: chapter title
 * @param isFavorite {boolean | null | undefined} - favorite status.
 * @param subId {string?} - a param which is passed to comments api
 * @param thumbnails {string[]?} - for multiple page thumbnails, set this to null, and use `loadThumbnails` api to load thumbnails
 * @param recommend {Comic[]?} - related comics
 * @param commentCount {number?}
 * @param likesCount {number?}
 * @param isLiked {boolean?}
 * @param uploader {string?}
 * @param updateTime {string?}
 * @param uploadTime {string?}
 * @param url {string?}
 * @param stars {number?} - 0-5, double
 * @param maxPage {number?}
 * @param comments {Comment[]?}- `since 1.0.7` App will display comments in the details page.
 * @constructor
 */
function ComicDetails({title, subtitle, subTitle, cover, description, tags, chapters, isFavorite, subId, thumbnails, recommend, commentCount, likesCount, isLiked, uploader, updateTime, uploadTime, url, stars, maxPage, comments}) {
    this.title = title;
    this.subtitle = subtitle ?? subTitle;
    this.cover = cover;
    this.description = description;
    this.tags = tags;
    this.chapters = chapters;
    this.isFavorite = isFavorite;
    this.subId = subId;
    this.thumbnails = thumbnails;
    this.recommend = recommend;
    this.commentCount = commentCount;
    this.likesCount = likesCount;
    this.isLiked = isLiked;
    this.uploader = uploader;
    this.updateTime = updateTime;
    this.uploadTime = uploadTime;
    this.url = url;
    this.stars = stars;
    this.maxPage = maxPage;
    this.comments = comments;
}

/**
 * Create a comment object
 * @param userName {string}
 * @param avatar {string?}
 * @param content {string}
 * @param time {string?}
 * @param replyCount {number?}
 * @param id {string?}
 * @param isLiked {boolean?}
 * @param score {number?}
 * @param voteStatus {number?} - 1: upvote, -1: downvote, 0: none
 * @constructor
 */
function Comment({userName, avatar, content, time, replyCount, id, isLiked, score, voteStatus}) {
    this.userName = userName;
    this.avatar = avatar;
    this.content = content;
    this.time = time;
    this.replyCount = replyCount;
    this.id = id;
    this.isLiked = isLiked;
    this.score = score;
    this.voteStatus = voteStatus;
}

/**
 * Create image loading config
 * @param url {string?}
 * @param method {string?} - http method, uppercase
 * @param data {any} - request data, may be null
 * @param headers {Object?} - request headers
 * @param onResponse {((ArrayBuffer) => ArrayBuffer)?} - modify response data
 * @param modifyImage {string?}
 *  A js script string.
 *  The script will be executed in a new Isolate.
 *  A function named `modifyImage` should be defined in the script, which receives an [Image] as the only argument, and returns an [Image]..
 * @param onLoadFailed {(() => ImageLoadingConfig)?} - called when the image loading failed
 * @constructor
 * @since 1.0.5
 *
 * To keep the compatibility with the old version, do not use the constructor. Consider creating a new object with the properties directly.
 */
function ImageLoadingConfig({url, method, data, headers, onResponse, modifyImage, onLoadFailed}) {
    this.url = url;
    this.method = method;
    this.data = data;
    this.headers = headers;
    this.onResponse = onResponse;
    this.modifyImage = modifyImage;
    this.onLoadFailed = onLoadFailed;
}

class ComicSource {
    name = ""

    key = ""

    version = ""

    minAppVersion = ""

    url = ""

    /**
     * load data with its key
     * @param {string} dataKey
     * @returns {any}
     */
    loadData(dataKey) {
        return sendMessage({
            method: 'load_data',
            key: this.key,
            data_key: dataKey
        })
    }

    /**
     * load a setting with its key
     * @param key {string}
     * @returns {any}
     */
    loadSetting(key) {
        return sendMessage({
            method: 'load_setting',
            key: this.key,
            setting_key: key
        })
    }

    /**
     * save data
     * @param {string} dataKey
     * @param data
     */
    saveData(dataKey, data) {
        return sendMessage({
            method: 'save_data',
            key: this.key,
            data_key: dataKey,
            data: data
        })
    }

    /**
     * delete data
     * @param {string} dataKey
     */
    deleteData(dataKey) {
        return sendMessage({
            method: 'delete_data',
            key: this.key,
            data_key: dataKey,
        })
    }

    /**
     *
     * @returns {boolean}
     */
    get isLogged() {
        return sendMessage({
            method: 'isLogged',
            key: this.key,
        });
    }

    translation = {}

    /**
     * Translate given string with the current locale using the translation object.
     * @param key {string}
     * @returns {string}
     * @since 1.2.5
     */
    translate(key) {
        let locale = APP.locale;
        return this.translation[locale]?.[key] ?? key;
    }

    init() { }

    static sources = {}
}

/// A reference to dart object.
/// The api can only be used in the comic.onImageLoad.modifyImage function
class Image {
    key = 0;

    constructor(key) {
        this.key = key;
    }

    /**
     * Copy the specified range of the image
     * @param x
     * @param y
     * @param width
     * @param height
     * @returns {Image|null}
     */
    copyRange(x, y, width, height) {
        let key = sendMessage({
            method: "image",
            function: "copyRange",
            key: this.key,
            x: x,
            y: y,
            width: width,
            height: height
        })
        if(key == null) return null;
        return new Image(key);
    }

    /**
     * Copy the image and rotate 90 degrees
     * @returns {Image|null}
     */
    copyAndRotate90() {
        let key = sendMessage({
            method: "image",
            function: "copyAndRotate90",
            key: this.key
        })
        if(key == null) return null;
        return new Image(key);
    }

    /**
     * fill [image] to this image at (x, y)
     * @param x
     * @param y
     * @param image
     */
    fillImageAt(x, y, image) {
        sendMessage({
            method: "image",
            function: "fillImageAt",
            key: this.key,
            x: x,
            y: y,
            image: image.key
        })
    }

    /**
     * fill [image] with range(srcX, srcY, width, height) to this image at (x, y)
     * @param x
     * @param y
     * @param image
     * @param srcX
     * @param srcY
     * @param width
     * @param height
     */
    fillImageRangeAt(x, y, image, srcX, srcY, width, height) {
        sendMessage({
            method: "image",
            function: "fillImageRangeAt",
            key: this.key,
            x: x,
            y: y,
            image: image.key,
            srcX: srcX,
            srcY: srcY,
            width: width,
            height: height
        })
    }

    get width() {
        return sendMessage({
            method: "image",
            function: "getWidth",
            key: this.key
        })
    }

    get height() {
        return sendMessage({
            method: "image",
            function: "getHeight",
            key: this.key
        })
    }

    static empty(width, height) {
        let key = sendMessage({
            method: "image",
            function: "emptyImage",
            width: width,
            height: height
        })
        return new Image(key);
    }
}

/**
 * UI related apis
 * @since 1.2.0
 */
let UI = {
    /**
     * Show a message
     * @param message {string}
     */
    showMessage: (message) => {
        sendMessage({
            method: 'UI',
            function: 'showMessage',
            message: message,
        })
    },

    /**
     * Show a dialog. Any action will close the dialog.
     * @param title {string}
     * @param content {string}
     * @param actions {{text:string, callback: () => void | Promise<void>, style: "text"|"filled"|"danger"}[]} - If callback returns a promise, the button will show a loading indicator until the promise is resolved.
     * @returns {Promise<void>} - Resolved when the dialog is closed.
     * @since 1.2.1
     */
    showDialog: (title, content, actions) => {
        sendMessage({
            method: 'UI',
            function: 'showDialog',
            title: title,
            content: content,
            actions: actions,
        })
    },

    /**
     * Open [url] in external browser
     * @param url {string}
     */
    launchUrl: (url) => {
        sendMessage({
            method: 'UI',
            function: 'launchUrl',
            url: url,
        })
    },

    /**
     * Show a loading dialog.
     * @param onCancel {() => void | null | undefined} - Called when the loading dialog is canceled. If [onCancel] is null, the dialog cannot be canceled by the user.
     * @returns {number} - A number that can be used to cancel the loading dialog.
     * @since 1.2.1
     */
    showLoading: (onCancel) => {
        return sendMessage({
            method: 'UI',
            function: 'showLoading',
            onCancel: onCancel
        })
    },

    /**
     * Cancel a loading dialog.
     * @param id {number} - returned by [showLoading]
     * @since 1.2.1
     */
    cancelLoading: (id) => {
        sendMessage({
            method: 'UI',
            function: 'cancelLoading',
            id: id
        })
    },

    /**
     * Show an input dialog
     * @param title {string}
     * @param validator {(string) => string | null | undefined} - A function that validates the input. If the function returns a string, the dialog will show the error message.
     * @param image {string | ArrayBuffer | null | undefined} - Since 1.4.6, you can pass an image url to show an image in the dialog. Since 1.5.3, you can also pass an ArrayBuffer to show a custom image.
     * @returns {Promise<string | null>} - The input value. If the dialog is canceled, return null.
     */
    showInputDialog: (title, validator, image) => {
        return sendMessage({
            method: 'UI',
            function: 'showInputDialog',
            title: title,
            image: image,
            validator: validator
        })
    },

    /**
     * Show a select dialog
     * @param title {string}
     * @param options {string[]}
     * @param initialIndex {number?}
     * @returns {Promise<number | null>} - The selected index. If the dialog is canceled, return null.
     */
    showSelectDialog: (title, options, initialIndex) => {
        return sendMessage({
            method: 'UI',
            function: 'showSelectDialog',
            title: title,
            options: options,
            initialIndex: initialIndex
        })
    }
}

/**
 * App related apis
 * @since 1.2.1
 */
let APP = {
    /**
     * Get the app version
     * @returns {string} - The app version
     */
    get version() {
        return appVersion // defined in the engine
    },

    /**
     * Get current app locale
     * @returns {string} - The app locale, in the format of [languageCode]_[countryCode]
     */
    get locale() {
        return sendMessage({
            method: 'getLocale'
        })
    },

    /**
     * Get current running platform
     * @returns {string} - The platform name, "android", "ios", "windows", "macos", "linux"
     */
    get platform() {
        return sendMessage({
            method: 'getPlatform'
        })
    }
}

/**
 * Set clipboard text
 * @param text {string}
 * @returns {Promise<void>}
 * 
 * @since 1.3.4
 */
function setClipboard(text) {
    return sendMessage({
        method: 'setClipboard',
        text: text
    })
}

/**
 * Get clipboard text
 * @returns {Promise<string>}
 * 
 * @since 1.3.4
 */
function getClipboard() {
    return sendMessage({
        method: 'getClipboard'
    })
}

/**
 * Compute a function with arguments. The function will be executed in the engine pool which is not in the main thread.
 * @param func {string} - A js code string which can be evaluated to a function. The function will receive the args as its only argument.
 * @param args {any[]} - The arguments to pass to the function.
 * @returns {Promise<any>} - The result of the function.
 * @since 1.5.0
 */
function compute(func, ...args) {
    return sendMessage({
        method: 'compute',
        function: func,
        args: args
    })
}

================================================
FILE: assets/opencc.txt
================================================
# OpenCC Simplified Chinese to Traditional Chinese conversion table
# Original source: https://github.com/BYVoid/OpenCC
㐷傌
㐹㑶
㐽偑
㑇㑳
㑈倲
㑔㑯
㑩儸
㓆𠗣
㓥劏
㓰劃
㔉劚
㖊噚
㖞喎
㘎㘚
㚯㜄
㛀媰
㛟𡞵
㛠𡢃
㛣㜏
㛤孋
㛿𡠹
㟆㠏
㟜𡾱
㟥嵾
㡎幓
㤘㥮
㤽懤
㥪慺
㧏掆
㧐㩳
㧑撝
㧟擓
㧰擽
㨫㩜
㭎棡
㭏椲
㭣𣙎
㭤樢
㭴樫
㱩殰
㱮殨
㲿瀇
㳔濧
㳕灡
㳠澾
㳡濄
㳢𣾷
㳽瀰
㴋潚
㶉鸂
㶶燶
㶽煱
㺍獱
㻅璯
㻏𤫩
㻘𤪺
䀥䁻
䁖瞜
䂵碽
䃅磾
䅉稏
䅟穇
䅪𥢢
䇲筴
䉤籔
䌶䊷
䌷紬
䌸縳
䌹絅
䌺䋙
䌻䋚
䌼綐
䌽綵
䌾䋻
䌿䋹
䍀繿
䍁繸
䍠䍦
䎬䎱
䏝膞
䑽𦪙
䓓薵
䓕薳
䓖藭
䓨罃
䗖螮
䘛𧝞
䘞𧜗
䙊𧜵
䙌䙡
䙓襬
䜣訢
䜤鿁
䜥𧩙
䜧䜀
䜩讌
䝙貙
䞌𧵳
䞍䝼
䞎𧶧
䞐賰
䟢躎
䢀𨊰
䢁𨊸
䢂𨋢
䥺釾
䥽鏺
䥾䥱
䥿𨯅
䦀𨦫
䦁𨧜
䦂䥇
䦃鐯
䦅鐥
䦆钁
䦶䦛
䦷䦟
䩄靦
䭪𩞯
䯃𩣑
䯄騧
䯅䯀
䲝䱽
䲞𩶘
䲟鮣
䲠鰆
䲡鰌
䲢鰧
䲣䱷
䴓鳾
䴔鵁
䴕鴷
䴖鶄
䴗鶪
䴘鷉
䴙鸊
䶮龑
万萬
与與
丑醜
专專
业業
丛叢
东東
丝絲
丢丟
两兩
严嚴
丧喪
个個
丰豐
临臨
为爲
丽麗
举舉
么麼
义義
乌烏
乐樂
乔喬
习習
乡鄉
书書
买買
乱亂
了了
争爭
于於
亏虧
云雲
亘亙
亚亞
产產
亩畝
亲親
亵褻
亸嚲
亿億
仅僅
仆僕
仇仇
从從
仑侖
仓倉
仪儀
们們
价價
仿仿
众衆
优優
伙夥
会會
伛傴
伞傘
伟偉
传傳
伡俥
伣俔
伤傷
伥倀
伦倫
伧傖
伪僞
伫佇
体體
余餘
佛佛
佣傭
佥僉
侠俠
侣侶
侥僥
侦偵
侧側
侨僑
侩儈
侪儕
侬儂
侭儘
俊俊
俣俁
俦儔
俨儼
俩倆
俪儷
俫倈
俭儉
修修
借借
债債
倾傾
偬傯
偻僂
偾僨
偿償
傤儎
傥儻
傧儐
储儲
傩儺
僵僵
儿兒
克克
兑兌
兖兗
党黨
兰蘭
关關
兴興
兹茲
养養
兽獸
冁囅
内內
冈岡
册冊
写寫
军軍
农農
冬冬
冯馮
冲衝
决決
况況
冻凍
净淨
凄悽
准準
凉涼
凌凌
减減
凑湊
凛凜
几幾
凤鳳
凫鳧
凭憑
凯凱
凶兇
出出
击擊
凿鑿
刍芻
划劃
刘劉
则則
刚剛
创創
删刪
别別
刬剗
刭剄
刮刮
制制
刹剎
刽劊
刾㓨
刿劌
剀剴
剂劑
剐剮
剑劍
剥剝
剧劇
劝勸
办辦
务務
劢勱
动動
励勵
劲勁
劳勞
势勢
勋勳
勚勩
匀勻
匦匭
匮匱
区區
医醫
千千
升升
华華
协協
单單
卖賣
卜卜
占佔
卢盧
卤滷
卧臥
卫衛
却卻
卷卷
卺巹
厂廠
厅廳
历歷
厉厲
压壓
厌厭
厍厙
厐龎
厕廁
厘釐
厢廂
厣厴
厦廈
厨廚
厩廄
厮廝
县縣
叁叄
参參
叆靉
叇靆
双雙
发發
变變
叙敘
叠疊
只只
台臺
叶葉
号號
叹嘆
叽嘰
吁籲
吃喫
合合
吊吊
同同
后後
向向
吓嚇
吕呂
吗嗎
吨噸
听聽
启啓
吴吳
呐吶
呒嘸
呓囈
呕嘔
呖嚦
呗唄
员員
呙咼
呛嗆
呜嗚
周周
咏詠
咙嚨
咛嚀
咝噝
咤吒
咨諮
咸鹹
咽咽
哄哄
响響
哑啞
哒噠
哓嘵
哔嗶
哕噦
哗譁
哙噲
哜嚌
哝噥
哟喲
唇脣
唛嘜
唝嗊
唠嘮
唡啢
唢嗩
唤喚
啧嘖
啬嗇
啭囀
啮齧
啯嘓
啰囉
啴嘽
啸嘯
喂喂
喷噴
喽嘍
喾嚳
嗫囁
嗳噯
嘘噓
嘤嚶
嘱囑
噜嚕
噪噪
嚣囂
回回
团團
园園
困困
囱囪
围圍
囵圇
国國
图圖
圆圓
圣聖
圹壙
场場
坏壞
块塊
坚堅
坛壇
坜壢
坝壩
坞塢
坟墳
坠墜
垄壟
垅壠
垆壚
垒壘
垦墾
垩堊
垫墊
垭埡
垯墶
垱壋
垲塏
垴堖
埘塒
埙壎
埚堝
堑塹
堕墮
塆壪
墙牆
壮壯
声聲
壳殼
壶壺
壸壼
处處
备備
复復
够夠
夫夫
头頭
夸誇
夹夾
夺奪
奁奩
奂奐
奋奮
奖獎
奥奧
奸奸
妆妝
妇婦
妈媽
妩嫵
妪嫗
妫嬀
姗姍
姜姜
姹奼
娄婁
娅婭
娆嬈
娇嬌
娈孌
娘娘
娱娛
娲媧
娴嫺
婳嫿
婴嬰
婵嬋
婶嬸
媪媼
媭嬃
嫒嬡
嫔嬪
嫱嬙
嬷嬤
孙孫
学學
孪孿
宁寧
它它
宝寶
实實
宠寵
审審
宪憲
宫宮
家家
宽寬
宾賓
寝寢
对對
寻尋
导導
寿壽
将將
尔爾
尘塵
尝嘗
尧堯
尴尷
尸屍
尽盡
局局
层層
屃屓
屉屜
届屆
属屬
屡屢
屦屨
屿嶼
岁歲
岂豈
岖嶇
岗崗
岘峴
岚嵐
岛島
岩巖
岭嶺
岳嶽
岽崬
岿巋
峃嶨
峄嶧
峡峽
峣嶢
峤嶠
峥崢
峦巒
峰峯
崂嶗
崃崍
崄嶮
崭嶄
嵘嶸
嵚嶔
嵝嶁
巅巔
巨巨
巩鞏
巯巰
币幣
布布
帅帥
师師
帏幃
帐帳
帘簾
帜幟
带帶
帧幀
席席
帮幫
帱幬
帻幘
帼幗
幂冪
干幹
并並
幸幸
广廣
庄莊
庆慶
床牀
庐廬
庑廡
库庫
应應
庙廟
庞龐
废廢
庵庵
庼廎
廪廩
开開
异異
弃棄
弑弒
张張
弥彌
弦弦
弪弳
弯彎
弹彈
强強
归歸
当當
录錄
彟彠
彦彥
彨彲
彩彩
彻徹
征徵
径徑
徕徠
御御
忆憶
忏懺
志志
忧憂
念念
忾愾
怀懷
态態
怂慫
怃憮
怄慪
怅悵
怆愴
怜憐
总總
怼懟
怿懌
恋戀
恒恆
恤恤
恳懇
恶惡
恸慟
恹懨
恺愷
恻惻
恼惱
恽惲
悦悅
悫愨
悬懸
悭慳
悮悞
悯憫
惊驚
惧懼
惨慘
惩懲
惫憊
惬愜
惭慚
惮憚
惯慣
愈愈
愠慍
愤憤
愦憒
愿願
慑懾
慭憖
懑懣
懒懶
懔懍
戆戇
戋戔
戏戲
戗戧
战戰
戚戚
戬戩
戯戱
户戶
才才
扎扎
扑撲
托託
扣扣
执執
扩擴
扪捫
扫掃
扬揚
扰擾
折折
抚撫
抛拋
抟摶
抠摳
抡掄
抢搶
护護
报報
抵抵
担擔
拐拐
拟擬
拢攏
拣揀
拥擁
拦攔
拧擰
拨撥
择擇
挂掛
挚摯
挛攣
挜掗
挝撾
挞撻
挟挾
挠撓
挡擋
挢撟
挣掙
挤擠
挥揮
挦撏
挨挨
挽挽
捝挩
捞撈
损損
捡撿
换換
捣搗
据據
掳擄
掴摑
掷擲
掸撣
掺摻
掼摜
揽攬
揾搵
揿撳
搀攙
搁擱
搂摟
搄揯
搅攪
搜搜
携攜
摄攝
摅攄
摆擺
摇搖
摈擯
摊攤
撄攖
撑撐
撵攆
撷擷
撸擼
撺攛
擜㩵
擞擻
攒攢
敌敵
敚敓
敛斂
敩斆
数數
斋齋
斓斕
斗鬥
斩斬
断斷
旋旋
无無
旧舊
时時
旷曠
旸暘
昆昆
昙曇
昵暱
昼晝
昽曨
显顯
晋晉
晒曬
晓曉
晔曄
晕暈
晖暉
暂暫
暅𣈶
暗暗
暧曖
曲曲
术術
朱朱
朴樸
机機
杀殺
杂雜
权權
杆杆
杠槓
条條
来來
杨楊
杩榪
杯杯
杰傑
松松
板板
极極
构構
枞樅
枢樞
枣棗
枥櫪
枧梘
枨棖
枪槍
枫楓
枭梟
柜櫃
柠檸
柽檉
栀梔
栅柵
标標
栈棧
栉櫛
栊櫳
栋棟
栌櫨
栎櫟
栏欄
树樹
栖棲
栗栗
样樣
核核
栾欒
桠椏
桡橈
桢楨
档檔
桤榿
桥橋
桦樺
桧檜
桨槳
桩樁
桪樳
梁梁
梦夢
梼檮
梾棶
梿槤
检檢
棁梲
棂欞
椁槨
椝槼
椟櫝
椠槧
椢槶
椤欏
椫樿
椭橢
椮槮
楼樓
榄欖
榅榲
榇櫬
榈櫚
榉櫸
榝樧
槚檟
槛檻
槟檳
槠櫧
横橫
樯檣
樱櫻
橥櫫
橱櫥
橹櫓
橼櫞
檩檁
欢歡
欤歟
欧歐
欲欲
歼殲
殁歿
殇殤
残殘
殒殞
殓殮
殚殫
殡殯
殴毆
毁毀
毂轂
毕畢
毙斃
毡氈
毵毿
毶𣯶
氇氌
气氣
氢氫
氩氬
氲氳
汇匯
汉漢
汤湯
汹洶
沄澐
沈沈
沟溝
没沒
沣灃
沤漚
沥瀝
沦淪
沧滄
沨渢
沩潙
沪滬
沾沾
泛泛
泞濘
注注
泪淚
泶澩
泷瀧
泸瀘
泺濼
泻瀉
泼潑
泽澤
泾涇
洁潔
洒灑
洼窪
浃浹
浅淺
浆漿
浇澆
浈湞
浉溮
浊濁
测測
浍澮
济濟
浏瀏
浐滻
浑渾
浒滸
浓濃
浔潯
浕濜
涂塗
涌湧
涚涗
涛濤
涝澇
涞淶
涟漣
涠潿
涡渦
涢溳
涣渙
涤滌
润潤
涧澗
涨漲
涩澀
淀澱
渊淵
渌淥
渍漬
渎瀆
渐漸
渑澠
渔漁
渖瀋
渗滲
温溫
游遊
湾灣
湿溼
溁濚
溃潰
溅濺
溆漵
溇漊
滗潷
滚滾
滞滯
滟灩
滠灄
满滿
滢瀅
滤濾
滥濫
滦灤
滨濱
滩灘
滪澦
漓漓
潆瀠
潇瀟
潋瀲
潍濰
潜潛
潴瀦
澛瀂
澜瀾
濑瀨
濒瀕
灏灝
灭滅
灯燈
灵靈
灶竈
灾災
灿燦
炀煬
炉爐
炖燉
炜煒
炝熗
点點
炼煉
炽熾
烁爍
烂爛
烃烴
烛燭
烟煙
烦煩
烧燒
烨燁
烩燴
烫燙
烬燼
热熱
焕煥
焖燜
焘燾
煴熅
熏燻
爱愛
爷爺
牍牘
牦犛
牵牽
牺犧
犊犢
状狀
犷獷
犸獁
犹猶
狈狽
狝獮
狞獰
独獨
狭狹
狮獅
狯獪
狰猙
狱獄
狲猻
猃獫
猎獵
猕獼
猡玀
猪豬
猫貓
猬蝟
献獻
獭獺
玑璣
玙璵
玚瑒
玛瑪
玩玩
玮瑋
环環
现現
玱瑲
玺璽
珐琺
珑瓏
珰璫
珲琿
琎璡
琏璉
琐瑣
琼瓊
瑶瑤
瑷璦
瑸璸
璇璇
璎瓔
瓒瓚
瓮甕
瓯甌
电電
画畫
畅暢
畴疇
疖癤
疗療
疟瘧
疠癘
疡瘍
疬癧
疭瘲
疮瘡
疯瘋
疱皰
疴痾
症症
痈癰
痉痙
痒癢
痖瘂
痨癆
痪瘓
痫癇
痴癡
瘅癉
瘆瘮
瘗瘞
瘘瘻
瘪癟
瘫癱
瘾癮
瘿癭
癞癩
癣癬
癫癲
皂皁
皑皚
皱皺
皲皸
盏盞
盐鹽
监監
盖蓋
盗盜
盘盤
眍瞘
眦眥
眬矓
睁睜
睐睞
睑瞼
瞆瞶
瞒瞞
瞩矚
矩矩
矫矯
矶磯
矾礬
矿礦
砀碭
码碼
砖磚
砗硨
砚硯
砜碸
砺礪
砻礱
砾礫
础礎
硁硜
硕碩
硖硤
硗磽
硙磑
硚礄
确確
硵磠
硷礆
碍礙
碛磧
碜磣
碱鹼
礼禮
祃禡
祎禕
祢禰
祯禎
祷禱
祸禍
禀稟
禄祿
禅禪
离離
私私
秃禿
秆稈
秋秋
种種
秘祕
积積
称稱
秽穢
秾穠
稆穭
税稅
稣穌
稳穩
穑穡
穞穭
穷窮
窃竊
窍竅
窎窵
窑窯
窜竄
窝窩
窥窺
窦竇
窭窶
竖豎
竞競
笃篤
笋筍
笔筆
笕筧
笺箋
笼籠
笾籩
筑築
筚篳
筛篩
筜簹
筝箏
筹籌
筼篔
签籤
筿篠
简簡
箓籙
箦簀
箧篋
箨籜
箩籮
箪簞
箫簫
篑簣
篓簍
篮籃
篯籛
篱籬
簖籪
籁籟
籴糴
类類
籼秈
粜糶
粝糲
粤粵
粪糞
粮糧
粽糉
糁糝
糇餱
糍餈
系系
紧緊
絷縶
緼縕
縆緪
纟糹
纠糾
纡紆
红紅
纣紂
纤纖
纥紇
约約
级級
纨紈
纩纊
纪紀
纫紉
纬緯
纭紜
纮紘
纯純
纰紕
纱紗
纲綱
纳納
纴紝
纵縱
纶綸
纷紛
纸紙
纹紋
纺紡
纻紵
纼紖
纽紐
纾紓
线線
绀紺
绁紲
绂紱
练練
组組
绅紳
细細
织織
终終
绉縐
绊絆
绋紼
绌絀
绍紹
绎繹
经經
绐紿
绑綁
绒絨
结結
绔絝
绕繞
绖絰
绗絎
绘繪
给給
绚絢
绛絳
络絡
绝絕
绞絞
统統
绠綆
绡綃
绢絹
绣繡
绤綌
绥綏
绦絛
继繼
绨綈
绩績
绪緒
绫綾
绬緓
续續
绮綺
绯緋
绰綽
绱鞝
绲緄
绳繩
维維
绵綿
绶綬
绷繃
绸綢
绹綯
绺綹
绻綣
综綜
绽綻
绾綰
绿綠
缀綴
缁緇
缂緙
缃緗
缄緘
缅緬
缆纜
缇緹
缈緲
缉緝
缊縕
缋繢
缌緦
缍綞
缎緞
缏緶
缐線
缑緱
缒縋
缓緩
缔締
缕縷
编編
缗緡
缘緣
缙縉
缚縛
缛縟
缜縝
缝縫
缞縗
缟縞
缠纏
缡縭
缢縊
缣縑
缤繽
缥縹
缦縵
缧縲
缨纓
缩縮
缪繆
缫繅
缬纈
缭繚
缮繕
缯繒
缰繮
缱繾
缲繰
缳繯
缴繳
缵纘
罂罌
网網
罗羅
罚罰
罢罷
罴羆
羁羈
羟羥
羡羨
群羣
翘翹
翙翽
翚翬
耢耮
耧耬
耸聳
耻恥
聂聶
聋聾
职職
聍聹
联聯
聩聵
聪聰
肃肅
肠腸
肤膚
肮骯
肴餚
肾腎
肿腫
胀脹
胁脅
胄胄
胆膽
背背
胜勝
胡胡
胧朧
胨腖
胪臚
胫脛
胶膠
脉脈
脍膾
脏髒
脐臍
脑腦
脓膿
脔臠
脚腳
脱脫
脶腡
脸臉
腊臘
腌醃
腘膕
腭齶
腻膩
腼靦
腽膃
腾騰
膑臏
膻羶
臜臢
致致
舆輿
舍舍
舣艤
舰艦
舱艙
舻艫
艰艱
艳豔
艺藝
节節
芈羋
芗薌
芜蕪
芦蘆
芸芸
苁蓯
苇葦
苈藶
苋莧
苌萇
苍蒼
苎苧
苏蘇
苔苔
苧薴
苹蘋
范範
茎莖
茏蘢
茑蔦
茔塋
茕煢
茧繭
荆荊
荐薦
荙薘
荚莢
荛蕘
荜蓽
荝萴
荞蕎
荟薈
荠薺
荡蕩
荣榮
荤葷
荥滎
荦犖
荧熒
荨蕁
荩藎
荪蓀
荫蔭
荬蕒
荭葒
荮葤
药藥
莅蒞
莱萊
莲蓮
莳蒔
莴萵
莶薟
获獲
莸蕕
莹瑩
莺鶯
莼蓴
萚蘀
萝蘿
萤螢
营營
萦縈
萧蕭
萨薩
葱蔥
蒀蒕
蒇蕆
蒉蕢
蒋蔣
蒌蔞
蒏醟
蒙蒙
蓝藍
蓟薊
蓠蘺
蓣蕷
蓥鎣
蓦驀
蔂虆
蔑蔑
蔷薔
蔹蘞
蔺藺
蔼藹
蕰薀
蕲蘄
蕴蘊
薮藪
藓蘚
藴蘊
蘖櫱
虏虜
虑慮
虚虛
虫蟲
虬虯
虮蟣
虱蝨
虽雖
虾蝦
虿蠆
蚀蝕
蚁蟻
蚂螞
蚃蠁
蚕蠶
蚝蠔
蚬蜆
蛊蠱
蛎蠣
蛏蟶
蛮蠻
蛰蟄
蛱蛺
蛲蟯
蛳螄
蛴蠐
蜕蛻
蜗蝸
蜡蠟
蝇蠅
蝈蟈
蝉蟬
蝎蠍
蝼螻
蝾蠑
螀螿
螨蟎
蟏蠨
衅釁
衔銜
补補
表表
衬襯
衮袞
袄襖
袅嫋
袆褘
袜襪
袭襲
袯襏
装裝
裆襠
裈褌
裢褳
裣襝
裤褲
裥襉
褛褸
褴襤
襕襴
见見
观觀
觃覎
规規
觅覓
视視
觇覘
览覽
觉覺
觊覬
觋覡
觌覿
觍覥
觎覦
觏覯
觐覲
觑覷
觞觴
触觸
觯觶
訚誾
詟讋
誉譽
誊謄
讠訁
计計
订訂
讣訃
认認
讥譏
讦訐
讧訌
讨討
让讓
讪訕
讫訖
讬託
训訓
议議
讯訊
记記
讱訒
讲講
讳諱
讴謳
讵詎
讶訝
讷訥
许許
讹訛
论論
讻訩
讼訟
讽諷
设設
访訪
诀訣
证證
诂詁
诃訶
评評
诅詛
识識
诇詗
诈詐
诉訴
诊診
诋詆
诌謅
词詞
诎詘
诏詔
诐詖
译譯
诒詒
诓誆
诔誄
试試
诖詿
诗詩
诘詰
诙詼
诚誠
诛誅
诜詵
话話
诞誕
诟詬
诠詮
诡詭
询詢
诣詣
诤諍
该該
详詳
诧詫
诨諢
诩詡
诪譸
诫誡
诬誣
语語
诮誚
误誤
诰誥
诱誘
诲誨
诳誑
说說
诵誦
诶誒
请請
诸諸
诹諏
诺諾
读讀
诼諑
诽誹
课課
诿諉
谀諛
谁誰
谂諗
调調
谄諂
谅諒
谆諄
谇誶
谈談
谉讅
谊誼
谋謀
谌諶
谍諜
谎謊
谏諫
谐諧
谑謔
谒謁
谓謂
谔諤
谕諭
谖諼
谗讒
谘諮
谙諳
谚諺
谛諦
谜謎
谝諞
谞諝
谟謨
谠讜
谡謖
谢謝
谣謠
谤謗
谥諡
谦謙
谧謐
谨謹
谩謾
谪謫
谫譾
谬謬
谭譚
谮譖
谯譙
谰讕
谱譜
谲譎
谳讞
谴譴
谵譫
谶讖
谷谷
豮豶
贝貝
贞貞
负負
贠貟
贡貢
财財
责責
贤賢
败敗
账賬
货貨
质質
贩販
贪貪
贫貧
贬貶
购購
贮貯
贯貫
贰貳
贱賤
贲賁
贳貰
贴貼
贵貴
贶貺
贷貸
贸貿
费費
贺賀
贻貽
贼賊
贽贄
贾賈
贿賄
赀貲
赁賃
赂賂
赃贓
资資
赅賅
赆贐
赇賕
赈賑
赉賚
赊賒
赋賦
赌賭
赍齎
赎贖
赏賞
赐賜
赑贔
赒賙
赓賡
赔賠
赕賧
赖賴
赗賵
赘贅
赙賻
赚賺
赛賽
赜賾
赝贗
赞贊
赟贇
赠贈
赡贍
赢贏
赣贛
赪赬
赵趙
赶趕
趋趨
趱趲
趸躉
跃躍
跄蹌
跖蹠
跞躒
践踐
跶躂
跷蹺
跸蹕
跹躚
跻躋
踌躊
踪蹤
踬躓
踯躑
蹑躡
蹒蹣
蹰躕
蹿躥
躏躪
躜躦
躯軀
輼轀
车車
轧軋
轨軌
轩軒
轪軑
轫軔
转轉
轭軛
轮輪
软軟
轰轟
轱軲
轲軻
轳轤
轴軸
轵軹
轶軼
轷軤
轸軫
轹轢
轺軺
轻輕
轼軾
载載
轾輊
轿轎
辀輈
辁輇
辂輅
较較
辄輒
辅輔
辆輛
辇輦
辈輩
辉輝
辊輥
辋輞
辌輬
辍輟
辎輜
辏輳
辐輻
辑輯
辒轀
输輸
辔轡
辕轅
辖轄
辗輾
辘轆
辙轍
辚轔
辞辭
辟闢
辩辯
辫辮
边邊
辽遼
达達
迁遷
过過
迈邁
运運
还還
这這
进進
远遠
违違
连連
迟遲
迩邇
迳逕
迹跡
适適
选選
逊遜
递遞
逦邐
逻邏
遗遺
遥遙
邓鄧
邝鄺
邬鄔
邮郵
邹鄒
邺鄴
邻鄰
郁鬱
郏郟
郐鄶
郑鄭
郓鄆
郦酈
郧鄖
郸鄲
酂酇
酝醞
酦醱
酱醬
酸酸
酽釅
酾釃
酿釀
醖醞
采採
释釋
里裏
鉴鑑
銮鑾
錾鏨
钅釒
钆釓
钇釔
针針
钉釘
钊釗
钋釙
钌釕
钍釷
钎釺
钏釧
钐釤
钑鈒
钒釩
钓釣
钔鍆
钕釹
钖鍚
钗釵
钘鈃
钙鈣
钚鈈
钛鈦
钜鉅
钝鈍
钞鈔
钟鍾
钠鈉
钡鋇
钢鋼
钣鈑
钤鈐
钥鑰
钦欽
钧鈞
钨鎢
钩鉤
钪鈧
钫鈁
钬鈥
钭鈄
钮鈕
钯鈀
钰鈺
钱錢
钲鉦
钳鉗
钴鈷
钵鉢
钶鈳
钷鉕
钸鈽
钹鈸
钺鉞
钻鑽
钼鉬
钽鉭
钾鉀
钿鈿
铀鈾
铁鐵
铂鉑
铃鈴
铄鑠
铅鉛
铆鉚
铇鉋
铈鈰
铉鉉
铊鉈
铋鉍
铌鈮
铍鈹
铎鐸
铏鉶
铐銬
铑銠
铒鉺
铓鋩
铔錏
铕銪
铖鋮
铗鋏
铘鋣
铙鐃
铚銍
铛鐺
铜銅
铝鋁
铞銱
铟銦
铠鎧
铡鍘
铢銖
铣銑
铤鋌
铥銩
铦銛
铧鏵
铨銓
铩鎩
铪鉿
铫銚
铬鉻
铭銘
铮錚
铯銫
铰鉸
铱銥
铲鏟
铳銃
铴鐋
铵銨
银銀
铷銣
铸鑄
铹鐒
铺鋪
铻鋙
铼錸
铽鋱
链鏈
铿鏗
销銷
锁鎖
锂鋰
锃鋥
锄鋤
锅鍋
锆鋯
锇鋨
锈鏽
锉銼
锊鋝
锋鋒
锌鋅
锍鋶
锎鐦
锏鐧
锐銳
锑銻
锒鋃
锓鋟
锔鋦
锕錒
锖錆
锗鍺
锘鍩
错錯
锚錨
锛錛
锜錡
锝鍀
锞錁
锟錕
锠錩
锡錫
锢錮
锣鑼
锤錘
锥錐
锦錦
锧鑕
锨鍁
锩錈
锪鍃
锫錇
锬錟
锭錠
键鍵
锯鋸
锰錳
锱錙
锲鍥
锳鍈
锴鍇
锵鏘
锶鍶
锷鍔
锸鍤
锹鍬
锺鍾
锻鍛
锼鎪
锽鍠
锾鍰
锿鎄
镀鍍
镁鎂
镂鏤
镃鎡
镄鐨
镅鎇
镆鏌
镇鎮
镈鎛
镉鎘
镊鑷
镋钂
镌鐫
镍鎳
镎鎿
镏鎦
镐鎬
镑鎊
镒鎰
镓鎵
镔鑌
镕鎔
镖鏢
镗鏜
镘鏝
镙鏍
镚鏰
镛鏞
镜鏡
镝鏑
镞鏃
镟鏇
镠鏐
镡鐔
镢钁
镣鐐
镤鏷
镥鑥
镦鐓
镧鑭
镨鐠
镩鑹
镪鏹
镫鐙
镬鑊
镭鐳
镮鐶
镯鐲
镰鐮
镱鐿
镲鑔
镳鑣
镴鑞
镵鑱
镶鑲
长長
门門
闩閂
闪閃
闫閆
闬閈
闭閉
问問
闯闖
闰閏
闱闈
闲閒
闳閎
间間
闵閔
闶閌
闷悶
闸閘
闹鬧
闺閨
闻聞
闼闥
闽閩
闾閭
闿闓
阀閥
阁閣
阂閡
阃閫
阄鬮
阅閱
阆閬
阇闍
阈閾
阉閹
阊閶
阋鬩
阌閿
阍閽
阎閻
阏閼
阐闡
阑闌
阒闃
阓闠
阔闊
阕闋
阖闔
阗闐
阘闒
阙闕
阚闞
阛闤
队隊
阳陽
阴陰
阵陣
阶階
际際
陆陸
陇隴
陈陳
陉陘
陕陝
陦隯
陧隉
陨隕
险險
随隨
隐隱
隶隸
隽雋
难難
雇僱
雏雛
雕雕
雠讎
雳靂
雾霧
霁霽
霉黴
霡霢
霭靄
靓靚
靔靝
静靜
面面
靥靨
鞑韃
鞒鞽
鞯韉
鞲韝
韦韋
韧韌
韨韍
韩韓
韪韙
韫韞
韬韜
韵韻
页頁
顶頂
顷頃
顸頇
项項
顺順
须須
顼頊
顽頑
顾顧
顿頓
颀頎
颁頒
颂頌
颃頏
预預
颅顱
领領
颇頗
颈頸
颉頡
颊頰
颋頲
颌頜
颍潁
颎熲
颏頦
颐頤
频頻
颒頮
颓頹
颔頷
颕頴
颖穎
颗顆
题題
颙顒
颚顎
颛顓
颜顏
额額
颞顳
颟顢
颠顛
颡顙
颢顥
颣纇
颤顫
颥顬
颦顰
颧顴
风風
飏颺
飐颭
飑颮
飒颯
飓颶
飔颸
飕颼
飖颻
飗飀
飘飄
飙飆
飚飈
飞飛
飨饗
餍饜
饣飠
饤飣
饥飢
饦飥
饧餳
饨飩
饩餼
饪飪
饫飫
饬飭
饭飯
饮飲
饯餞
饰飾
饱飽
饲飼
饳飿
饴飴
饵餌
饶饒
饷餉
饸餄
饹餎
饺餃
饻餏
饼餅
饽餑
饾餖
饿餓
馀餘
馁餒
馂餕
馃餜
馄餛
馅餡
馆館
馇餷
馈饋
馉餶
馊餿
馋饞
馌饁
馍饃
馎餺
馏餾
馐饈
馑饉
馒饅
馓饊
馔饌
馕饢
马馬
驭馭
驮馱
驯馴
驰馳
驱驅
驲馹
驳駁
驴驢
驵駔
驶駛
驷駟
驸駙
驹駒
驺騶
驻駐
驼駝
驽駑
驾駕
驿驛
骀駘
骁驍
骂罵
骃駰
骄驕
骅驊
骆駱
骇駭
骈駢
骉驫
骊驪
骋騁
验驗
骍騂
骎駸
骏駿
骐騏
骑騎
骒騍
骓騅
骔騌
骕驌
骖驂
骗騙
骘騭
骙騤
骚騷
骛騖
骜驁
骝騮
骞騫
骟騸
骠驃
骡騾
骢驄
骣驏
骤驟
骥驥
骦驦
骧驤
髅髏
髋髖
髌髕
鬓鬢
鬶鬹
魇魘
魉魎
鱼魚
鱽魛
鱾魢
鱿魷
鲀魨
鲁魯
鲂魴
鲃䰾
鲄魺
鲅鮁
鲆鮃
鲇鮎
鲈鱸
鲉鮋
鲊鮓
鲋鮒
鲌鮊
鲍鮑
鲎鱟
鲏鮍
鲐鮐
鲑鮭
鲒鮚
鲓鮳
鲔鮪
鲕鮞
鲖鮦
鲗鰂
鲘鮜
鲙鱠
鲚鱭
鲛鮫
鲜鮮
鲝鮺
鲞鯗
鲟鱘
鲠鯁
鲡鱺
鲢鰱
鲣鰹
鲤鯉
鲥鰣
鲦鰷
鲧鯀
鲨鯊
鲩鯇
鲪鮶
鲫鯽
鲬鯒
鲭鯖
鲮鯪
鲯鯕
鲰鯫
鲱鯡
鲲鯤
鲳鯧
鲴鯝
鲵鯢
鲶鯰
鲷鯛
鲸鯨
鲹鰺
鲺鯴
鲻鯔
鲼鱝
鲽鰈
鲾鰏
鲿鱨
鳀鯷
鳁鰮
鳂鰃
鳃鰓
鳄鱷
鳅鰍
鳆鰒
鳇鰉
鳈鰁
鳉鱂
鳊鯿
鳋鰠
鳌鰲
鳍鰭
鳎鰨
鳏鰥
鳐鰩
鳑鰟
鳒鰜
鳓鰳
鳔鰾
鳕鱈
鳖鱉
鳗鰻
鳘鰵
鳙鱅
鳚䲁
鳛鰼
鳜鱖
鳝鱔
鳞鱗
鳟鱒
鳠鱯
鳡鱤
鳢鱧
鳣鱣
鳤䲘
鸟鳥
鸠鳩
鸡雞
鸢鳶
鸣鳴
鸤鳲
鸥鷗
鸦鴉
鸧鶬
鸨鴇
鸩鴆
鸪鴣
鸫鶇
鸬鸕
鸭鴨
鸮鴞
鸯鴦
鸰鴒
鸱鴟
鸲鴝
鸳鴛
鸴鷽
鸵鴕
鸶鷥
鸷鷙
鸸鴯
鸹鴰
鸺鵂
鸻鴴
鸼鵃
鸽鴿
鸾鸞
鸿鴻
鹀鵐
鹁鵓
鹂鸝
鹃鵑
鹄鵠
鹅鵝
鹆鵒
鹇鷳
鹈鵜
鹉鵡
鹊鵲
鹋鶓
鹌鵪
鹍鵾
鹎鵯
鹏鵬
鹐鵮
鹑鶉
鹒鶊
鹓鵷
鹔鷫
鹕鶘
鹖鶡
鹗鶚
鹘鶻
鹙鶖
鹚鷀
鹛鶥
鹜鶩
鹝鷊
鹞鷂
鹟鶲
鹠鶹
鹡鶺
鹢鷁
鹣鶼
鹤鶴
鹥鷖
鹦鸚
鹧鷓
鹨鷚
鹩鷯
鹪鷦
鹫鷲
鹬鷸
鹭鷺
鹮䴉
鹯鸇
鹰鷹
鹱鸌
鹲鸏
鹳鸛
鹴鸘
鹾鹺
麦麥
麸麩
麹麴
麺麪
麽麼
黄黃
黉黌
黡黶
黩黷
黪黲
黾黽
鼋黿
鼌鼂
鼍鼉
鼹鼴
齐齊
齑齏
齿齒
龀齔
龁齕
龂齗
龃齟
龄齡
龅齙
龆齠
龇齜
龈齦
龉齬
龊齪
龋齲
龌齷
龙龍
龚龔
龛龕
龟龜
鿎䃮
鿏䥑
鿒鿓
鿔鎶
𠀾𠁞
𠆲儣
𠆿𠌥
𠇹俓
𠉂㒓
𠉗𠏢
𠋆儭
𠚳𠠎
𠛅剾
𠛆𠞆
𠛾𪟖
𠡠勑
𠮶嗰
𠯟哯
𠯠噅
𠰱㘉
𠰷嚧
𠱞囃
𠲥𡅏
𠴛𡃕
𠴢𡄔
𠵸𡄣
𠵾㗲
𡋀𡓾
𡋗𡑭
𡋤壗
𡍣𡔖
𡒄壈
𡝠㜷
𡞋㜗
𡞱㜢
𡠟孎
𡥧孻
𡭜𡮉
𡭬𡮣
𡳃𡳳
𡳒𦘧
𡶴嵼
𡸃𡽗
𡺃嶈
𡺄嶘
𢋈㢝
𢗓㦛
𢘙𢤱
𢘝𢣚
𢘞𢣭
𢙏愻
𢙐憹
𢙑𢠼
𢙒憢
𢙓懀
𢛯㦎
𢠁懎
𢢐𤢻
𢧐戰
𢫊𢷮
𢫞𢶫
𢫬摋
𢬍擫
𢬦𢹿
𢭏擣
𢽾斅
𣃁斸
𣆐曥
𣈣𣋋
𣍨𦢈
𣍯腪
𣍰脥
𣎑臗
𣏢槫
𣐕桱
𣐤欍
𣑶𣠲
𣒌楇
𣓿橯
𣔌樤
𣗊樠
𣗋欓
𣗙㰙
𣘐㯤
𣘓𣞻
𣘴檭
𣘷𣝕
𣚚欘
𣞎𣠩
𣨼殢
𣭤𣯴
𣯣𣯩
𣱝氭
𣲗湋
𣲘潕
𣳆㵗
𣶩澅
𣶫𣿉
𣶭𪷓
𣷷𤅶
𣸣濆
𣺼灙
𣺽𤁣
𣽷瀃
𤆡熓
𤆢㷍
𤇃爄
𤇄熌
𤇭爖
𤇹熚
𤈶熉
𤈷㷿
𤊀𤒎
𤊰𤓩
𤋏熡
𤎺𤓎
𤎻𤑳
𤙯𤛮
𤝢𤢟
𤞃獩
𤞤玁
𤠋㺏
𤦀瓕
𤩽瓛
𤳄𤳸
𤶊癐
𤶧𤸫
𤻊㿗
𤽯㿧
𤾀皟
𤿲麬
𥁢䀉
𥅘𥌃
𥅴䀹
𥅿𥊝
𥆧瞤
𥇢䁪
𥎝䂎
𥐟礒
𥐯𥖅
𥐰𥕥
𥐻碙
𥞦𥞵
𥧂𥨐
𥩟竚
𥩺𥪂
𥫣籅
𥬀䉙
𥬞籋
𥬠篘
𥭉𥵊
𥮋𥸠
𥮜䉲
𥮾篸
𥱔𥵃
𥹥𥼽
𥺅䊭
𥺇𥽖
𦈈𥿊
𦈉緷
𦈋綇
𦈌綀
𦈎繟
𦈏緍
𦈐縺
𦈑緸
𦈒𦂅
𦈓䋿
𦈔縎
𦈕緰
𦈖䌈
𦈗𦃄
𦈘䌋
𦈙䌰
𦈚縬
𦈛繓
𦈜䌖
𦈝繏
𦈞䌟
𦈟䌝
𦈠䌥
𦈡繻
𦍠䍽
𦛨朥
𦝼膢
𦟗𦣎
𦨩𦪽
𦰏蓧
𦰴䕳
𦶟爇
𦶻𦾟
𦻕蘟
𧉐𧕟
𧉞䗿
𧌥𧎈
𧏖蠙
𧏗蠀
𧑏蠾
𧒭𧔥
𧜭䙱
𧝝襰
𧝧𧟀
𧮪詀
𧳕𧳟
𧹑䞈
𧹒買
𧹓𧶔
𧹔賬
𧹕䝻
𧹖賟
𧹗贃
𧿈𨇁
𨀁躘
𨀱𨄣
𨁴𨅍
𨂺𨈊
𨄄𨈌
𨅛䠱
𨅫𨇞
𨅬躝
𨉗軉
𨐅軗
𨐆𨊻
𨐇𨏠
𨐈輄
𨐉𨎮
𨐊𨏥
𨑹䢨
𨟳𨣞
𨠨𨣧
𨡙𨢿
𨡺𨣈
𨤰𨤻
𨰾鎷
𨰿釳
𨱀𨥛
𨱁鈠
𨱂鈋
𨱃鈲
𨱄鈯
𨱅鉁
𨱆龯
𨱇銶
𨱈鋉
𨱉鍄
𨱊𨧱
𨱋錂
𨱌鏆
𨱍鎯
𨱎鍮
𨱏鎝
𨱐𨫒
𨱑鐄
𨱒鏉
𨱓鐎
𨱔鐏
𨱕𨮂
𨱖䥩
𨷿䦳
𨸀𨳕
𨸁𨳑
𨸂閍
𨸃閐
𨸄䦘
𨸅𨴗
𨸆𨵩
𨸇𨵸
𨸉𨶀
𨸊𨶏
𨸋𨶲
𨸌𨶮
𨸎𨷲
𨸘𨽏
𨸟䧢
𩏼䪏
𩏽𩏪
𩏾𩎢
𩏿䪘
𩐀䪗
𩓋顂
𩖕𩓣
𩖖顃
𩖗䫴
𩙥颰
𩙦𩗀
𩙧䬞
𩙨𩘹
𩙩𩘀
𩙪颷
𩙫颾
𩙬𩘺
𩙭𩘝
𩙮䬘
𩙯䬝
𩙰𩙈
𩟿𩚛
𩠀𩚥
𩠁𩚵
𩠂𩛆
𩠃𩛩
𩠅𩟐
𩠆𩜦
𩠇䭀
𩠈䭃
𩠉𩜇
𩠊𩜵
𩠋𩝔
𩠌餸
𩠎𩞄
𩠏𩞦
𩠠𩠴
𩡖𩡣
𩧦𩡺
𩧨駎
𩧩𩤊
𩧪䮾
𩧫駚
𩧬𩢡
𩧭䭿
𩧮𩢾
𩧯驋
𩧰䮝
𩧱𩥉
𩧲駧
𩧳𩢸
𩧴駩
𩧵𩢴
𩧶𩣏
𩧸𩣫
𩧺駶
𩧻𩣵
𩧼𩣺
𩧿䮠
𩨀騔
𩨁䮞
𩨂驄
𩨃騝
𩨄騪
𩨅𩤸
𩨆𩤙
𩨇䮫
𩨈騟
𩨉𩤲
𩨊騚
𩨋𩥄
𩨌𩥑
𩨍𩥇
𩨎龭
𩨏䮳
𩨐𩧆
𩩈䯤
𩬣𩭙
𩬤𩰀
𩭹鬖
𩯒𩯳
𩰰𩰹
𩲒𩳤
𩴌𩴵
𩽹魥
𩽺𩵩
𩽻𩵹
𩽼鯶
𩽽𩶱
𩽾鮟
𩽿𩶰
𩾁鯄
𩾂䲖
𩾃鮸
𩾄𩷰
𩾅𩸃
𩾆𩸦
𩾇鯱
𩾈䱙
𩾊䱬
𩾋䱰
𩾌鱇
𩾎𩽇
𪉂䲰
𪉃鳼
𪉄𩿪
𪉅𪀦
𪉆鴲
𪉈鴜
𪉉𪁈
𪉊鷨
𪉋𪀾
𪉌𪁖
𪉍鵚
𪉎𪂆
𪉏𪃏
𪉐𪃍
𪉑鷔
𪉒𪄕
𪉔𪄆
𪉕𪇳
𪎈䴬
𪎉麲
𪎊麨
𪎋䴴
𪎌麳
𪑅䵳
𪔭𪔵
𪚏𪘀
𪚐𪘯
𪜎𠿕
𪞝凙
𪟎㔋
𪟝勣
𪠀𧷎
𪠟㓄
𪠡𠬙
𪠳唓
𪠵㖮
𪠸嚛
𪠺𠽃
𪠽噹
𪡀嘺
𪡃嘪
𪡋噞
𪡏嗹
𪡛㗿
𪡞嘳
𪡺𡃄
𪢌㘓
𪢐𡃤
𪢒𡂡
𪢕嚽
𪢖𡅯
𪢠囒
𪢮圞
𪢸墲
𪣆埬
𪣒堚
𪣻塿
𪤄𡓁
𪤚壣
𪥠𧹈
𪥫孇
𪥰嬣
𪥿嬻
𪧀孾
𪧘寠
𪨊㞞
𪨗屩
𪨧崙
𪨩𡸗
𪨶輋
𪨷巗
𪨹𡹬
𪩇㟺
𪩎巊
𪩘巘
𪩛𡿖
𪩷幝
𪩸幩
𪪏廬
𪪑㢗
𪪞廧
𪪴𢍰
𪪼彃
𪫌徿
𪫡𢤩
𪫷㦞
𪫺憸
𪬚𢣐
𪬯𢤿
𪭝𢯷
𪭢摐
𪭧擟
𪭯𢶒
𪭵掚
𪭾撊
𪮃㨻
𪮋㩋
𪮖撧
𪮳𢺳
𪮶攋
𪯋㪎
𪰶曊
𪱥膹
𪱷梖
𪲎櫅
𪲔欐
𪲛檵
𪲮櫠
𪳍欇
𪳗𣜬
𪴙欑
𪵑毊
𪵣霼
𪵱濿
𪶄溡
𪶒𤄷
𪶮𣽏
𪷍㵾
𪷽灒
𪸕熂
𪸩煇
𪹀𤑹
𪹠𤓌
𪹳爥
𪹹𤒻
𪺣𤘀
𪺪𤜆
𪺭犞
𪺷獊
𪺸𤠮
𪺻㺜
𪺽猌
𪻐瑽
𪻨瓄
𪻲瑻
𪻺璝
𪼋㻶
𪼴𤬅
𪽈畼
𪽝𤳷
𪽪痮
𪽭𤷃
𪽮㿖
𪽴𤺔
𪽷瘱
𪾔盨
𪾢睍
𪾣眝
𪾦矑
𪾸矉
𪿊𥏝
𪿞𥖲
𪿫礮
𪿵𥗇
𫀌𥜰
𫀓𥜐
𫀨䅐
𫀬䅳
𫀮𥢷
𫁂䆉
𫁟竱
𫁡鴗
𫁱𥶽
𫁲䉑
𫁳𥯤
𫁷䉶
𫁺𥴼
𫂃簢
𫂆簂
𫂈䉬
𫂖𥴨
𫂿𥻦
𫃗𩏷
𫄙糺
𫄚䊺
𫄛紟
𫄜䋃
𫄝𥾯
𫄞䋔
𫄟絁
𫄠絙
𫄡絧
𫄢絥
𫄣繷
𫄤繨
𫄥纚
𫄦𦀖
𫄧綖
𫄨絺
𫄩䋦
𫄪𦅇
𫄫綟
𫄬緤
𫄭緮
𫄮䋼
𫄯𦃩
𫄰縍
𫄱繬
𫄲縸
𫄳縰
𫄴繂
𫄵𦅈
𫄶繈
𫄷繶
𫄸纁
𫄹纗
𫅅䍤
𫅗羵
𫅥𦒀
𫅭䎙
𫅼𦔖
𫆏聻
𫆝𦟼
𫆫𦡝
𫇘𦧺
𫇛艣
𫇪𦱌
𫇭蔿
𫇴蒭
𫇽蕽
𫈉蕳
𫈎葝
𫈟蔯
𫈵蕝
𫉁薆
𫉄藷
𫊪䗅
𫊮蠦
𫊸蟜
𫊹𧒯
𫊻蟳
𫋇蟂
𫋌蟘
𫋲䙔
𫋷襗
𫋹襓
𫋻襘
𫌀襀
𫌇襵
𫌋𧞫
𫌨覼
𫌪覛
𫌫𧡴
𫌬𧢄
𫌭覹
𫌯䚩
𫍐𧭹
𫍙訑
𫍚訞
𫍛訜
𫍜詓
𫍝諫
𫍞𧦝
𫍟𧦧
𫍠䛄
𫍡詑
𫍢譊
𫍣詷
𫍤譑
𫍥誂
𫍦譨
𫍧誺
𫍨誫
𫍩諣
𫍪誋
𫍫䛳
𫍬誷
𫍭𧩕
𫍮誳
𫍯諴
𫍰諰
𫍱諯
𫍲謏
𫍳諥
𫍴謱
𫍵謸
𫍶𧩼
𫍷謉
𫍸謆
𫍹謯
𫍺𧫝
𫍻譆
𫍼𧬤
𫍽譞
𫍾𧭈
𫍿譾
𫎆豵
𫎌貗
𫎦贚
𫎧䝭
𫎨𧸘
𫎩賝
𫎪䞋
𫎫贉
𫎬贑
𫎭䞓
𫎱䟐
𫎳䟆
𫎸𧽯
𫎺䟃
𫏃䠆
𫏆蹳
𫏋蹻
𫏌𨂐
𫏐蹔
𫏑𨇽
𫏕𨆪
𫏞𨇰
𫏨𨇤
𫐄軏
𫐅軕
𫐆轣
𫐇軜
𫐈軷
𫐉軨
𫐊軬
𫐋𨎌
𫐌軿
𫐍𨌈
𫐎輢
𫐏輖
𫐐輗
𫐑輨
𫐒輷
𫐓輮
𫐔𨍰
𫐕轊
𫐖轇
𫐗轐
𫐘轗
𫐙轠
𫐷遱
𫑘鄟
𫑡鄳
𫑷醶
𫓥釟
𫓦釨
𫓧鈇
𫓨鈛
𫓩鏦
𫓪鈆
𫓫𨥟
𫓬鉔
𫓭鉠
𫓮𨪕
𫓯銈
𫓰銊
𫓱鐈
𫓲銁
𫓳𨰋
𫓴鉾
𫓵鋠
𫓶鋗
𫓷𫒡
𫓸錽
𫓹錤
𫓺鐪
𫓻錜
𫓼𨨛
𫓽錝
𫓾錥
𫓿𨨢
𫔀鍊
𫔁鐼
𫔂鍉
𫔃𨰲
𫔄鍒
𫔅鎍
𫔆䥯
𫔇鎞
𫔈鎙
𫔉𨰃
𫔊鏥
𫔋䥗
𫔌鏾
𫔍鐇
𫔎鐍
𫔏𨬖
𫔐𨭸
𫔑𨭖
𫔒𨮳
𫔓𨯟
𫔔鑴
𫔕𨰥
𫔖𨲳
𫔭開
𫔮閒
𫔯閗
𫔰閞
𫔲𨴹
𫔴閵
𫔵䦯
𫔶闑
𫔽𨼳
𫕚𩀨
𫕥霣
𫕨𩅙
𫖃靧
𫖅䪊
𫖇鞾
𫖑𩎖
𫖒韠
𫖓𩏂
𫖔韛
𫖕韝
𫖖𩏠
𫖪𩑔
𫖫䪴
𫖬䪾
𫖭𩒎
𫖮顗
𫖯頫
𫖰䫂
𫖱䫀
𫖲䫟
𫖳頵
𫖴𩔳
𫖵𩓥
𫖶顅
𫖷𩔑
𫖸願
𫖹顣
𫖺䫶
𫗇䫻
𫗈𩗓
𫗉𩗴
𫗊䬓
𫗋飋
𫗚𩟗
𫗞飦
𫗟䬧
𫗠餦
𫗡𩚩
𫗢飵
𫗣飶
𫗤𩛌
𫗥餫
𫗦餔
𫗧餗
𫗨𩛡
𫗩饠
𫗪餧
𫗫餬
𫗬餪
𫗭餵
𫗮餭
𫗯餱
𫗰䭔
𫗱䭑
𫗳𩝽
𫗴饘
𫗵饟
𫘛馯
𫘜馼
𫘝駃
𫘞駞
𫘟駊
𫘠駤
𫘡駫
𫘣駻
𫘤騃
𫘥騉
𫘦騊
𫘧騄
𫘨騠
𫘩騜
𫘪騵
𫘫騴
𫘬騱
𫘭騻
𫘮䮰
𫘯驓
𫘰驙
𫘱驨
𫘽鬠
𫙂𩯁
𫚈鱮
𫚉魟
𫚊鰑
𫚋鱄
𫚌魦
𫚍魵
𫚎𩶁
𫚏䱁
𫚐䱀
𫚑鮅
𫚒鮄
𫚓鮤
𫚔鮰
𫚕鰤
𫚖鮆
𫚗鮯
𫚘𩻮
𫚙鯆
𫚚鮿
𫚛鮵
𫚜䲅
𫚝𩸄
𫚞鯬
𫚟𩸡
𫚠䱧
𫚡鯞
𫚢鰋
𫚣鯾
𫚤鰦
𫚥鰕
𫚦鰫
𫚧鰽
𫚨𩻗
𫚩𩻬
𫚪鱊
𫚫鱢
𫚬𩼶
𫚭鱲
𫛚鳽
𫛛鳷
𫛜鴀
𫛝鴅
𫛞鴃
𫛟鸗
𫛠𩿤
𫛡鴔
𫛢鸋
𫛣鴥
𫛤鴐
𫛥鵊
𫛦鴮
𫛧𪀖
𫛨鵧
𫛩鴳
𫛪鴽
𫛫鶰
𫛬䳜
𫛭鵟
𫛮䳤
𫛯鶭
𫛰䳢
𫛱鵫
𫛲鵰
𫛳鵩
𫛴鷤
𫛵鶌
𫛶鶒
𫛷鶦
𫛸鶗
𫛹𪃧
𫛺䳧
𫛻𪃒
𫛼䳫
𫛽鷅
𫛾𪆷
𫜀鷐
𫜁鷩
𫜂𪅂
𫜃鷣
𫜄鷷
𫜅䴋
𫜊𪉸
𫜑麷
𫜒䴱
𫜓𪌭
𫜔䴽
𫜕𪍠
𫜙䵴
𫜟𪓰
𫜨䶕
𫜩齧
𫜪齩
𫜫𫜦
𫜬齰
𫜭齭
𫜮齴
𫜯𪙏
𫜰齾
𫜲龓
𫜳䶲
𫝈㑮
𫝋𠐊
𫝦㛝
𫝧㜐
𫝨媈
𫝩嬦
𫝪𡟫
𫝫婡
𫝬嬇
𫝭孆
𫝮孄
𫝵嶹
𫞅𦠅
𫞗潣
𫞚澬
𫞛㶆
𫞝灍
𫞠爧
𫞡爃
𫞢𤛱
𫞣㹽
𫞥珼
𫞦璾
𫞧𤩂
𫞨璼
𫞩璊
𫞷𥢶
𫟃絍
𫟄綋
𫟅綡
𫟆緟
𫟇𦆲
𫟑䖅
𫟕䕤
𫟞訨
𫟟詊
𫟠譂
𫟡誴
𫟢䜖
𫟤䡐
𫟥䡩
𫟦䡵
𫟫𨞺
𫟬𨟊
𫟲釚
𫟳釲
𫟴鈖
𫟵鈗
𫟶銏
𫟷鉝
𫟸鉽
𫟹鉷
𫟺䤤
𫟻銂
𫟼鐽
𫟽𨧰
𫟾𨩰
𫟿鎈
𫠀䥄
𫠁鑉
𫠂閝
𫠅韚
𫠆頍
𫠇𩖰
𫠈䫾
𫠊䮄
𫠋騼
𫠌𩦠
𫠏𩵦
𫠐魽
𫠑䱸
𫠒鱆
𫠖𩿅
𫠜齯
𫢸僤
𫧃𣍐
𫧮𪋿
𫫇噁
𫬐㘔
𫭟塸
𫭢埨
𫭼𡑍
𫮃墠
𫰛娙
𫵷㠣
𫶇嵽
𫷷廞
𫸩彄
𬀩暐
𬀪晛
𬂩梜
𬃊櫍
𬇕澫
𬇙浿
𬇹漍
𬉼熰
𬊈燖
𬊤燀
𬍛瓅
𬍡璗
𬍤璕
𬒈礐
𬒗𥗽
𬕂篢
𬘓紃
𬘘紞
𬘡絪
𬘩綎
𬘫綄
𬘬綪
𬘭綝
𬘯綧
𬙂縯
𬙊纆
𬙋纕
𬜬蔄
𬜯䓣
𬞟蘋
𬟁虉
𬟽蝀
𬣙訏
𬣞詝
𬣡諓
𬣳詪
𬤇諲
𬤊諟
𬤝譓
𬨂軝
𬨎輶
𬩽鄩
𬪩醲
𬬩釴
𬬭錀
𬬮鋹
𬬱釿
𬬸鉥
𬬹鉮
𬬻鑪
𬬿鉊
𬭁鉧
𬭊𨧀
𬭎鋐
𬭚錞
𬭛𨨏
𬭤鍭
𬭩鎓
𬭬鏏
𬭭鏚
𬭯䥕
𬭳𨭎
𬭶𨭆
𬭸鏻
𬭼鐩
𬮱闉
𬮿隑
𬯀隮
𬯎隤
𬱖頔
𬱟頠
𬳵駓
𬳶駉
𬳽駪
𬳿駼
𬴂騑
𬴃騞
𬴊驎
𬶋鮈
𬶍鮀
𬶏鮠
𬶐鮡
𬶟鯻
𬶠鰊
𬶨鱀
𬶭鰶
𬶮鱚
𬷕鵏
𬸘鶠
𬸚鸑
𬸣鶱
𬸦鷟
𬸪鷭
𬸯鷿
𬹼齘
𬺈齮
𬺓齼
𰬸繐
𰰨菕
𰶎譅
𰾄鋂
𰾭鑀
𱊜𪈼

================================================
FILE: assets/tags.json
================================================
{"rows":{"female":"女性","male":"男性","mixed":"混合","language":"语言","other":"其他","group":"团队","artist":"艺术家","cosplayer":"Coser","parody":"原作","character":"角色","reclass":"重新分类","temp":"临时"},"reclass":{"doujinshi":"同人志","manga":"漫画","artistcg":"画师CG","gamecg":"游戏CG","non-h":"无H","imageset":"图集","western":"西方","cosplay":"Cosplay","misc":"杂项","asianporn":"亚洲色情","private":"私有"},"language":{"afrikaans":"南非语","albanian":"阿尔巴尼亚语","arabic":"阿拉伯语","aramaic":"阿拉姆语","armenian":"亚美尼亚语","bengali":"孟加拉语","bosnian":"波斯尼亚语","bulgarian":"保加利亚语","burmese":"缅甸语","catalan":"加泰罗尼亚语","cebuano":"宿务语","chinese":"汉语","cree":"克里语","creole":"克里奥尔语","croatian":"克罗地亚语","czech":"捷克语","danish":"丹麦语","dutch":"荷兰语","english":"英语","esperanto":"世界语","estonian":"爱沙尼亚语","finnish":"芬兰语","french":"法语","georgian":"格鲁吉亚语","german":"德语","greek":"希腊语","gujarati":"古吉拉特语","hebrew":"希伯来语","hindi":"印地语","hmong":"苗语","hungarian":"匈牙利语","icelandic":"冰岛语","indonesian":"印尼语","irish":"爱尔兰语","italian":"意大利语","japanese":"日语","javanese":"爪哇語","kannada":"卡纳达语","kazakh":"哈萨克语","khmer":"高棉语","korean":"韩语","kurdish":"库尔德语","ladino":"犹太西班牙语","lao":"老挝语","latin":"拉丁语","latvian":"拉脱维亚语","marathi":"马拉地语","mongolian":"蒙古语","ndebele":"恩德贝莱语","nepali":"尼泊尔语","norwegian":"挪威语","oromo":"奥罗莫语","papiamento":"帕皮阿门托语","pashto":"普什图语","persian":"波斯语","polish":"波兰语","portuguese":"葡萄牙语","punjabi":"旁遮普语","romanian":"罗马尼亚语","russian":"俄语","sango":"桑戈语","sanskrit":"梵语","serbian":"塞尔维亚语","shona":"绍纳语","slovak":"斯洛伐克语","slovenian":"斯洛文尼亚语","somali":"索马里语","spanish":"西班牙语","swahili":"斯瓦希里语","swedish":"瑞典语","tagalog":"他加禄语","tamil":"泰米尔语","telugu":"泰卢固语","thai":"泰语","tibetan":"藏语","tigrinya":"提格雷尼亚语","turkish":"土耳其语","ukrainian":"乌克兰语","urdu":"乌尔都语","vietnamese":"越南语","welsh":"威尔士语","yiddish":"意第绪语","zulu":"祖鲁语","speechless":"无言","text cleaned":"文字清除","translated":"翻译","rewrite":"改写"},"parody":{"86":"86 -不存在的战区-","300":"300","original":"原创","touhou project":"东方Project","moetan":"萌单✏️","kanon":"Kanon❄","air":"AIR🕊","clannad":"CLANNAD👪","angel beats":"Angel Beats!❤","charlotte":"Charlotte🌠","little busters":"Little Busters!⚾🐈","rewrite":"Rewrite","ore no imouto ga konna ni kawaii wake ga nai":"我的妹妹不可能那么可爱","kantai collection":"舰队Collection","pokemon":"精灵宝可梦","higurashi no naku koro ni":"寒蝉鸣泣之时🔪","saki":"天才麻将少女🀄️","puella magi madoka magica":"魔法少女小圆","puella magi madoka magica side story magia record":"魔法纪录 魔法少女小圆外传","toradora":"龙与虎","lotte no omocha":"露蒂的玩具","sword art online":"刀剑神域","sword art online alternative gun gale online":"刀剑神域外传Gun Gale Online","to love-ru":"出包王女","ro-kyu-bu":"萝球社🏀","tantei opera milky holmes":"侦探歌剧 少女福尔摩斯🔎","hyperdimension neptunia":"超次元游戏:海王星🎮","love live":"LoveLive! School idol project","love live sunshine":"Love Live! Sunshine!!","love live nijigasaki high school idol club":"LoveLive!虹咲学园学园偶像同好会","sora no otoshimono":"天降之物","boku wa tomodachi ga sukunai":"我的朋友很少","vocaloid":"VOCALOID","voiceroid":"VOICEROID","date a live":"约会大作战","the idolmaster":"偶像大师","my little pony friendship is magic":"小马宝莉:友谊就是魔法🐎","himouto umaru-chan":"干物妹!小埋","bakemonogatari":"化物语","yahari ore no seishun love come wa machigatteiru":"我的青春恋爱物语果然有问题","tengen toppa gurren lagann":"天元突破","cardcaptor sakura":"魔卡少女樱","mayoi neko overrun":"迷途猫OverRun","outbreak company":"萌萌侵略者","kyoukai no kanata":"境界的彼方","hataraku maou-sama":"打工吧!魔王大人","haiyore nyaruko-san":"潜行吧!奈亚子","hentai ouji to warawanai neko":"变态王子与不笑猫","nagi no asukara":"来自风平浪静的明天","sekai seifuku bouryaku no zvezda":"世界征服~谋略之星~","no game no life":"游戏人生","barakamon":"元气囝仔","divine gate":"神圣之门","sayonara zetsubou sensei":"再见!绝望先生","highschool of the dead":"学园默示录","gakkou gurashi":"学园孤岛","a channel":"A频道","granblue fantasy":"碧蓝幻想","gundam":"高达","gundam age":"机动战士高达AGE","gundam 00":"机动战士高达00","gundam 0080":"机动战士高达0080 口袋里的战争","gundam 0083":"机动战士高达0083 星尘回忆录","gundam unicorn":"机动战士高达UC","gundam f91":"机动战士高达F91","gundam seed":"机动战士高达SEED","gundam seed destiny":"机动战士高达SEED DESTINY","gundam zz":"机动战士高达ZZ","mobile suit gundam":"机动战士高达","mobile suit gundam lost war chronicles":"机动战士高达战记 Lost War Chronicles","mobile suit gundam tekketsu no orphans":"机动战士高达 铁血的孤儿","gundam wing":"新机动战记高达W","gundam build fighters":"高达创战者","gundam build fighters try":"高达创战者TRY","gundam build divers":"高达创形者","gundam g no reconguista":"高达G之复国运动","gundam x":"机动新世纪高达X","victory gundam":"机动战士V高达","zeta gundam":"机动战士Z高达","g gundam":"机动武斗传G高达","turn a gundam":"∀高达","kiniro mosaic":"黄金拼图","gochuumon wa usagi desu ka":"请问您今天要来点兔子吗?","non non biyori":"悠哉日常大王","oda nobuna no yabou":"织田信奈的野望","tamako market":"玉子市场","yama no susume":"向山进发","pripara":"美妙天堂","sora no method":"天体的秩序","accel world":"加速世界","dungeon ni deai o motomeru no wa machigatteiru darou ka":"在地下城寻求邂逅是否搞错了什么","c cube":"C³-魔方少女-","shingeki no kyojin":"进击的巨人","onidere":"鬼骄","infinite stratos":"无限斯特拉托斯","disgaea":"魔界战记","chuunibyou demo koi ga shitai":"中二病也要谈恋爱!","ano hi mita hana no namae wo bokutachi wa mada shiranai":"我们仍未知道那天所看见的花的名字。","amagi brilliant park":"甘城光辉游乐园","hidan no aria":"绯弹的亚莉亚🔫","steinsgate":"命运石之门","lucky star":"幸运☆星","zero no tsukaima":"零之使魔","shakugan no shana":"灼眼的夏娜","the melancholy of haruhi suzumiya":"凉宫春日的忧郁","kannagi":"神薙","kashimashi":"女生爱女生","to heart":"ToHeart","toheart2":"ToHeart2","k-on":"轻音少女","he is my master":"我的主人","code geass":"叛逆的鲁鲁修","naruto":"火影忍者","school rumble":"校园迷糊大王","mahou sensei negima":"魔法老师","uq holder":"悠久持有者!","neon genesis evangelion":"新世纪福音战士","hidamari sketch":"向阳素描","mahou shoujo lyrical nanoha":"魔法少女奈叶","rosario vampire":"十字架与吸血鬼","pretty cure":"光之美少女","futari wa pretty cure":"光之美少女","futari wa precure splash star":"光之美少女 Splash Star","yes precure 5":"Yes! 光之美少女5","fresh precure":"光之美少女:幸福精灵","heartcatch precure":"光之美少女:甜蜜天使!","suite precure":"光之美少女:美乐天使","smile precure":"Smile 光之美少女!","dokidoki precure":"心跳!光之美少女","happinesscharge precure":"幸福爆发 光之美少女!","go princess precure":"Go! 公主 光之美少女","maho girls precure":"魔法使 光之美少女!","kirakira precure a la mode":"光之美少女:食尚甜心","hugtto precure":"拥抱!光之美少女","star twinkle precure":"星光闪亮☆光之美少女","jojos bizarre adventure":"JOJO的奇妙冒险","pangya":"魔法飞球","shokugeki no soma":"食戟之灵","working":"迷糊餐厅🍴","kono subarashii sekai ni syukufuku o":"为美好的世界献上祝福!","ore no kanojo to osananajimi ga shuraba sugiru":"我女友与青梅竹马的惨烈修罗场","ore no nounai sentakushi ga gakuen love comedy wo zenryoku de jama shiteiru":"我的脑内恋碍选项","overwatch":"守望先锋","halo":"光环","mass effect":"质量效应","half-life":"半衰期","portal":"传送门","the witcher":"巫师","the elder scrolls":"上古卷轴","defense of the ancients":"刀塔","re zero kara hajimeru isekai seikatsu":"Re:从零开始的异世界生活","saenai heroine no sodatekata":"路人女主的养成方法","koihime musou":"恋姬†无双","senran kagura":"闪乱神乐","kobayashi-san-chi no maid dragon":"小林家的龙女仆","new game":"NEW GAME!","shirobako":"白箱","girlish number":"少女编号","gabriel dropout":"珈百璃的堕落","chobits":"人形电脑天使心","dead or alive":"死或生","eromanga sensei":"埃罗芒阿老师","dorei to no seikatsu":"与奴隶的生活 -Teaching Feeling-","girls und panzer":"少女与战车","seto no hanayome":"濑户的花嫁","brave witches":"无畏魔女","strike witches":"强袭魔女","kemono friends":"兽娘动物园","league of legends":"英雄联盟","kill la kill":"斩服少女","dagashi kashi":"粗点心战争","street fighter":"街头霸王","fate grand order":"Fate/Grand Order","fate stay night":"Fate/stay night","fate apocrypha":"Fate/Apocrypha","fate zero":"Fate/Zero","fate hollow ataraxia":"Fate/hollow ataraxia","fate extra":"Fate/EXTRA","fate kaleid liner prisma illya":"Fate/kaleid liner 魔法少女☆伊莉雅","mahou tsukai no yoru":"魔法使之夜","kara no kyoukai":"空之境界","canaan":"迦南","tsukihime":"月姬","kimi no na wa.":"你的名字。","mashiro iro symphony":"纯白交响曲","dragon quest":"勇者斗恶龙","dragon quest i":"勇者斗恶龙I","dragon quest ii":"勇者斗恶龙II 恶灵的众神","dragon quest iii":"勇者斗恶龙III 传说的开始","dragon quest iv":"勇者斗恶龙IV 被引导的人们","dragon quest v":"勇者斗恶龙V 天空的新娘","dragon quest vi":"勇者斗恶龙VI 幻之大地","dragon quest vii":"勇者斗恶龙VII 伊甸的战士们","dragon quest viii":"勇者斗恶龙VIII 天空、碧海、大地与被诅咒的公主","dragon quest ix":"勇者斗恶龙IX 星空的守护者","dragon quest x":"勇者斗恶龙X 觉醒的五种族 Online","dragon quest xi":"勇者斗恶龙XI 追寻逝去的时光","dragon quest dai no daibouken":"勇者斗恶龙 达尔大冒险","dragon quest monsters":"勇者斗恶龙怪兽篇","dragon quest yuusha abel densetsu":"勇者斗恶龙 勇者阿贝尔传说","dragon quest heroes":"勇者斗恶龙 英雄","left 4 dead":"求生之路","bloodrayne":"吸血莱恩","star wars":"星球大战","shin megami tensei":"真·女神转生","shin megami tensei devil children":"真·女神转生 恶魔之子","devil survivor":"女神异闻录 恶魔幸存者","persona":"女神异闻录","persona 2":"女神异闻录2","persona 3":"女神异闻录3","persona 4":"女神异闻录4","persona 5":"女神异闻录5","monsters inc.":"怪兽电力公司","hai to gensou no grimgar":"灰与幻想的格林姆迦尔","pretty rhythm":"美妙旋律","mamono musume zukan":"魔物娘图鉴","getsuyoubi no tawawa":"星期一的丰满","phantasy star":"梦幻之星","phantasy star 2":"梦幻之星II 不归的终点","phantasy star online":"梦幻之星Online","phantasy star online 2":"梦幻之星Online 2","phantasy star portable 2":"梦幻之星:携带版2","phantasy star universe":"梦幻之星 宇宙","phantasy star zero":"梦幻之星ZERO","arms":"ARMS","astro boy":"铁臂阿童木","detective conan":"名侦探柯南","ore twintail ni narimasu.":"我,要成为双马尾","kiss x sis":"亲吻姐姐","kimikiss":"君吻","super sonico":"超级索尼子","final fantasy":"最终幻想","final fantasy ii":"最终幻想II","final fantasy iii":"最终幻想III","final fantasy iv":"最终幻想IV","final fantasy v":"最终幻想V","final fantasy vi":"最终幻想VI","final fantasy vii":"最终幻想VII","final fantasy viii":"最终幻想VIII","final fantasy ix":"最终幻想IX","final fantasy x":"最终幻想X","final fantasy x-2":"最终幻想X-2","final fantasy xi":"最终幻想XI","final fantasy xii":"最终幻想XII","final fantasy xiii":"最终幻想XIII","final fantasy xiv":"最终幻想XIV","final fantasy xv":"最终幻想XV","final fantasy crystal chronicles":"最终幻想水晶编年史","final fantasy tactics":"最终幻想战略版","final fantasy tactics advance":"最终幻想战略版Advance","dissidia final fantasy":"最终幻想大乱斗","final fantasy unlimited":"最终幻想:无限","final fantasy type-0":"最终幻想 零式","kill me baby":"爱杀宝贝","shinryaku ika musume":"侵略!乌贼娘","one piece":"海贼王","dragon ball":"龙珠","dragon ball z":"龙珠Z","dragon ball gt":"龙珠GT","dragon ball super":"龙珠超","sakurasou no pet na kanojo":"樱花庄的宠物女孩","myriad colors phantom world":"无彩限的怪灵世界","soul eater":"噬魂师","urara meirochou":"Urara迷路帖","ranma 12":"乱马½","yosuga no sora":"缘之空","gintama":"银魂","panty and stocking with garterbelt":"吊带袜天使","fire emblem fates":"火焰之纹章 if","fire emblem":"火焰之纹章","fire emblem awakening":"火焰之纹章 觉醒","fire emblem gaiden":"火焰之纹章外传","fire emblem genealogy of the holy war":"火焰之纹章 圣战之系谱","fire emblem thracia 776":"火焰之纹章 多拉基亚776","fire emblem the binding blade":"火焰之纹章 封印之剑","fire emblem the blazing blade":"火焰之纹章 烈火之剑","fire emblem the sacred stones":"火焰之纹章 圣魔之光石","fire emblem path of radiance":"火焰之纹章 苍炎之轨迹","fire emblem radiant dawn":"火焰之纹章 晓之女神","fire emblem mystery of the emblem":"火焰之纹章 纹章之谜","fire emblem heroes":"火焰之纹章 英雄","fire emblem three houses":"火焰之纹章 风花雪月","fire emblem engage":"火焰之纹章 结合","kamen rider":"假面骑士","kamen rider decade":"假面骑士Decade","kamen rider amazon":"假面骑士亚马逊","kamen rider wizard":"假面骑士Wizard","kamen rider drive":"假面骑士Drive","kamen rider ex-aid":"假面骑士EX-AID","kamen rider w":"假面骑士W","kamen rider hibiki":"假面骑士响鬼","kamen rider kabuto":"假面骑士Kabuto","kamen rider den-o":"假面骑士电王","kamen rider fourze":"假面骑士Fourze","kamen rider ooo":"假面骑士OOO","kaiji":"赌博默示录","my hero academia":"我的英雄学院","shinmai maou no testament":"新妹魔王的契约者","youjo senki":"幼女战记","touken ranbu":"刀剑乱舞","teen titans":"少年泰坦","undertale":"传说之下","five nights at freddys":"在弗雷迪的五个夜晚","one punch man":"一拳超人","black rock shooter":"黑岩射手","dragons crown":"龙之皇冠","noir":"黑街二人组","guilty crown":"罪恶王冠","nana":"娜娜","nier":"尼尔","nier automata":"尼尔:机械纪元","psycho-pass":"心理测量者","ben 10":"Ben 10","hey arnold":"嘿,阿诺德!","bungou stray dogs":"文豪Stray Dogs","gugure kokkuri-san":"银仙","zootopia":"疯狂动物城","umineko no naku koro ni":"海猫鸣泣之时","ah my goddess":"我的女神","denpa onna to seishun otoko":"电波女与青春男","mirai nikki":"未来日记","oshiete galko-chan":"告诉我!辣妹子酱","eureka 7":"交响诗篇","darkstalkers":"恶魔战士","x-men":"X战警","x-men evolution":"X战警:进化","ichigo 100":"草莓100%","tonari no kaibutsu-kun":"邻座的怪同学","danganronpa":"弹丸论破","koutetsujou no kabaneri":"甲铁城的卡巴内利","yu-gi-oh":"游戏王","yu-gi-oh 5ds":"游戏王5D's","yu-gi-oh zexal":"游戏王ZEXAL","yu-gi-oh arc-v":"游戏王ARC-V","yu-gi-oh gx":"游戏王-怪兽之决斗GX","yu-gi-oh vrains":"游戏王VRAINS","kimi ni todoke":"好想告诉你","akatsuki no yona":"晨曦公主","onii-chan dakedo ai sae areba kankeinai yo ne":"就算是哥哥,有爱就没问题了,对吧","oniichan no koto nanka zenzen suki janain dakara ne":"腹黑妹妹控兄记!!","sora no woto":"空之音","occult academy":"世纪末超自然学院","gatchaman crowds":"科学小飞侠Crowds","saya no uta":"沙耶之歌","vividred operation":"绯色战姬","kodomo no jikan":"萝莉的时间","shuffle":"Shuffle!","power rangers":"超能战士","rune soldier":"魔法战士李维","kirby":"星之卡比","sakura quest":"樱花任务","aldnoah.zero":"ALDNOAH.ZERO","maoyuu maou yuusha":"魔王勇者","splatoon":"喷射战士","prunus girl":"樱桃少女","king of fighters":"拳皇","love plus":"爱相随","love hina":"纯情房东俏房客","akagami no shirayukihime":"赤发的白雪姬","minami-ke":"南家三姐妹","queens blade":"女王之刃","sekirei":"鹡鸰女神","yuuki yuuna wa yuusha de aru":"结城友奈是勇者","blazblue":"苍翼默示录","frame arms girl":"机甲少女","busou shinki":"武装神姬","bayonetta":"猎天使魔女","devil may cry":"鬼泣","tekken":"铁拳","super mario brothers":"超级马力欧兄弟","spider-man":"蜘蛛侠","gunsmith cats":"猫眼女枪手","puzzle and dragons":"智龙迷城","senki zesshou symphogear":"战姬绝唱Symphogear","shaman king":"通灵王","gegege no kitarou":"怪怪怪的鬼太郎","marmalade boy":"橘子酱男孩","esper mami":"超能力魔美","fushigi no umi no nadia":"蓝宝石之谜","martian successor nadesico":"机动战舰抚子","kino no tabi":"奇诺之旅","infinite ryvius":"无限的未知","machine robo":"天威勇士","rage of bahamut":"巴哈姆特之怒","kono naka ni hitori imouto ga iru":"其中1个是妹妹","sailor moon":"美少女战士","dog days":"犬勇者物语","onegai teacher":"拜托了☆老师","onegai twins":"拜托了☆双子星","rinne no lagrange":"轮回的拉格朗日","monster musume no iru nichijou":"魔物娘的相伴日常","black lagoon":"黑礁","steven universe":"史帝芬宇宙","the legend of zelda":"塞尔达传说","totally spies":"少女特工组","the legend of korra":"科拉传奇","kangoku senkan":"监狱战舰","prison school":"监狱学园","macross":"超时空要塞","the super dimension fortress macross":"超时空要塞Macross","macross 7":"超时空要塞7","macross frontier":"超时空要塞F","macross plus":"超时空要塞Plus","macross delta":"超时空要塞Δ","macross vf-x":"超时空要塞VF-X","little red riding hood":"小红帽","gekkan shoujo nozaki-kun":"月刊少女野崎君","girl friend beta":"临时女友","bakuman":"食梦者","nisekoi":"伪恋","blade and soul":"剑灵","inu x boku ss":"妖狐×仆SS","guilty gear":"罪恶装备","nanatsu no taizai":"七大罪","starcraft":"星际争霸","alice in wonderland":"爱丽丝梦游仙境","ikkitousen":"一骑当千","g.i. joe":"特种部队","metroid":"银河战士","metal gear solid":"合金装备","tomb raider":"古墓丽影","xena warrior princess":"战士公主西娜","the fifth element":"第五元素","terminator":"终结者","yurikuma arashi":"百合熊风暴","adventure time":"探险活宝","strike the blood":"噬血狂袭","valkyrie drive":"女武神驱动","saber marionette":"机械女神","dance with devils":"与魔共舞","samurai 7":"七武士","samurai jack":"杰克武士","samurai deeper kyo":"鬼眼狂刀","samurai pizza cats":"功夫猫党","samurai spirits":"侍魂","hyakka ryouran samurai girls":"百花缭乱 武士少女","samurai champloo":"混沌武士","afro samurai":"爆炸头武士","samurai sentai shinkenger":"侍战队真剑者","samurai flamenco":"武士弗拉明戈","onechambara bikini samurai squad":"忌血的继承者","samurai warriors":"战国无双","dynasty warriors":"真·三国无双","demons souls":"恶魔之魂","seiken densetsu":"圣剑传说","seiken densetsu 3":"圣剑传说3","kore wa zombie desu ka":"这个是僵尸吗?","ojamajo doremi":"小魔女DoReMi","terra formars":"火星异种","spirited away":"千与千寻","el hazard":"神秘的世界","langrisser":"梦幻模拟战","slayers":"秀逗魔导士","grendizer":"UFO机器人 古连泰沙","keroro gunsou":"Keroro军曹","sakura taisen":"樱花大战","saint seiya":"圣斗士星矢","agent aika":"海底娇娃蓝华","city hunter":"城市猎人","super robot wars":"超级机器人大战","super robot wars w":"超级机器人大战W","super robot wars k":"超级机器人大战K","super robot wars z 2nd":"第2次超级机器人大战Z","endless frontier":"无限边界:超级机器人大战OG传说","hellsing":"地狱之歌","super black jack":"兔女郎的诱惑","hell teacher nube":"地狱老师","hitsugi no chaika":"棺姬嘉依卡","kishin douji zenki":"鬼神童子","muv-luv":"Muv-Luv","muv-luv alternative total eclipse":"Muv-Luv Alternative Total eclipse","dangaioh":"破邪大星弹劾皇","3x3 eyes":"三只眼","bakuretsu hunters":"爆走猎人","vampire princess miyu":"吸血姬美夕","reco love":"真爱记录","spice and wolf":"狼与香辛料","youkai watch":"妖怪手表","battle programmer shirase":"战争程序员白濑","kung fu panda":"功夫熊猫","star vs. the forces of evil":"星蝶公主","the amazing world of gumball":"阿甘妙世界","wakfu":"沃土","wander over yonder":"宇宙小奇兵","batman":"蝙蝠侠","resident evil":"生化危机","kim possible":"麻辣女孩","jinrui wa suitai shimashita":"人类衰退之后","miss machiko":"真知子老师","gaogaigar":"勇者王","hibike euphonium":"吹响!上低音号","ragnarok online":"仙境传说","no more heroes":"英雄不再","akuma no riddle":"恶魔之谜","overlord":"不死者之王","full ani":"Fullani","full metal panic":"全金属狂潮","fullmetal alchemist":"钢之炼金术师","full moon o sagashite":"寻找满月","full metal daemon muramasa":"装甲恶鬼村正","futsuu no joshikousei ga locodol yattemita.":"普通女高中生要做当地偶像","fallout":"辐射","fancy lala":"梦幻拉拉","final fight":"快打旋风","beauty and the beast":"美女与野兽","baka to test to shoukanjuu":"笨蛋测验召唤兽","arcana heart":"圣灵之心","heroman":"HEROMAN","anyamaru tantei kiruminzoo":"动物侦探奇鲁米","kyoukai senjou no horizon":"境界线上的地平线","rwby":"RWBY","lupin iii":"鲁邦三世","ensemble stars":"偶像梦幻祭","ajin":"亚人","kingdom hearts":"王国之心","tobaku haouden zero":"赌博霸王传 零","kannazuki no miko":"神无月的巫女","haikyuu":"排球少年!!","free":"Free! 男子游泳部","itsuka tenma no kuro usagi":"曾几何时天魔的黑兔","magic knight rayearth":"魔法骑士雷亚斯","kochikame":"乌龙派出所","bakusou kyoudai lets and go":"四驱兄弟","the powerpuff girls":"飞天小女警","powerpuff girls z":"飞天小女警Z","omoikkiri kagaku adventure sou nanda":"充满干劲十足的科学冒险—神秘智慧石","wedding peach":"爱天使传说 婚纱桃子","fushigiboshi no futagohime":"不可思议星球的☆双胞胎公主","aquarion":"创圣的亚库艾里翁","aquarion logos":"创圣的亚库艾里翁LOGOS","aquarion evol":"创圣的亚库艾里翁EVOL","welcome to the n.h.k.":"欢迎加入NHK!","sakurako-san no ashimoto ni wa shitai ga umatteiru":"樱子小姐的脚下埋着尸体","shimoneta to iu gainen ga sonzai shinai taikutsu na sekai":"下流梗不存在的灰暗世界","kyonyuu fantasy":"巨乳幻想","puyo puyo":"噗哟噗哟","kaku-san-sei million arthur":"扩散性百万亚瑟王","genji tsuushin agedama":"电脑小奇侠","dennou coil":"电脑线圈","god eater":"噬神者","demi-chan wa kataritai":"亚人酱有话要说","akazukin chacha":"小红帽恰恰","idol janshi suchie-pai":"美少女雀士","twin angels":"淫兽圣战","shadow lady":"月光淑女","oboro muramasa":"胧村正","zettai bouei leviathan":"绝对防卫利维坦","tokimeki memorial":"心跳回忆","future card buddyfight":"未来卡 搭档对战","fun fun pharmacy":"不可思议魔法药店","aiura":"校园日记 AIURA","gokujou seitokai":"极上学生会","show by rock":"Show By Rock!!","star fox":"星际火狐","white album":"白色相簿❄","tenchi muyo":"天地无用!","variable geo":"格斗女神","ashita no nadja":"明日的娜嘉","goldfish warning":"魔力小金鱼","mazinger z":"魔神Z","magi the labyrinth of magic":"魔笛MAGI","ultraman":"奥特曼","we bare bears":"咱们裸熊","gravity falls":"怪诞小镇","karakai jouzu no takagi-san":"擅长捉弄人的高木同学","goshogun":"战国魔神豪将军","plawres sanshiro":"无敌三四郎","hime-chans ribbon":"缎带魔法少女","taimanin asagi":"对魔忍阿莎姬","makai kishi ingrid":"魔界骑士英格丽德","taimanin yukikaze":"对魔忍雪风","kick-ass":"海扁王","gad guard":"钢铁守护者","tears to tiara":"提亚拉之泪","tenshi no inai 12-gatsu":"天使不在的12月","comic party":"漫画同人会","kizuato":"痕","sentimental graffiti":"青涩宝贝","bleach":"死神","hayate no gotoku":"旋风管家","yoake mae yori ruriiro na":"更胜黎明前的琉璃色","fortune arterial":"FORTUNE ARTERIAL","princess holiday":"公主假日 ~回转苹果亭的一千零一夜~","tsuki wa higashi ni hi wa nishi ni":"东月西阳","daitoshokan no hitsujikai":"大图书馆的牧羊人","aiyoku no eustia":"秽翼的尤斯蒂娅","rokka no yuusha":"六花的勇者","seiren":"清恋","oniisama e...":"亲亲天使心","long riders":"长骑美眉","flower knight girl":"美少女花骑士","mitsudomoe":"超元气三姐妹","no-rin":"农林","space battleship yamato":"宇宙战舰大和号","utawarerumono":"传颂之物","utawarerumono itsuwari no kamen":"传颂之物 虚伪的假面","highschool dxd":"恶魔高校D×D","the world god only knows":"只有神知道的世界","mabinogi":"洛奇","m.u.g.e.n":"MUGEN","summon night":"召唤之夜","mai-hime":"舞-HiME","mai-otome":"舞-乙HiME","hyouka":"冰菓","ookami-san to shichinin no nakama-tachi":"大神与七位伙伴","machine-doll wa kizutsukanai":"机巧少女不会受伤","its not my fault that im not popular":"我不受欢迎,怎么想都是你们的错!","mouretsu pirates":"迷你裙宇宙海贼","gantz":"杀戮都市","angry birds":"愤怒的小鸟","zero kara hajimeru mahou no sho":"从零开始的魔法书","knights of sidonia":"希德尼娅的骑士","sket dance":"学园救援团","summer wars":"夏日大作战","flcl":"特别的她","the girl who leapt through time":"穿越时空的少女","inazuma eleven":"闪电十一人","battle royale":"大逃杀","archaic sealed heat":"远古封印之炎","fruits basket":"水果篮子","tari tari":"TARI TARI","the legend of heroes":"英雄传说","the legend of the legendary heroes":"传说中勇者的传说","the last of us":"最后生还者","wall-e":"机器人总动员","alpha teens on machines":"A.T.O.M.","tera":"神谕之战","digimon":"数码宝贝","digimon adventure":"数码宝贝大冒险","digimon tamers":"数码宝贝03驯兽师之王","digimon frontier":"数码宝贝04无限地带","digimon savers":"数码宝贝05拯救者","digimon xros wars":"数码宝贝06合体战争","digimon universe appli monsters":"数码宝贝宇宙-应用怪兽","snow white and the seven dwarfs":"白雪公主和七个小矮人","shadowverse":"影之诗","eyeshield 21":"光速跑者21号","skullgirls":"骷髅女孩","the ring":"午夜凶铃","the lord of the rings":"指环王","the matrix":"黑客帝国","evil dead":"鬼玩人","from dusk till dawn":"杀出个黎明","the sims":"模拟人生","the big o":"魅影巨神","the lion king":"狮子王","frozen":"冰雪奇缘","mortal kombat":"格斗之王","aladdin":"阿拉丁","the little mermaid":"小美人鱼","atlantis the lost empire":"亚特兰蒂斯:失落的帝国","sengoku otome":"战国少女~桃色异传~","monster hunter":"怪物猎人","sennen sensou aigis":"千年战争Aigis","star ocean 3":"星之海洋3","kokoro connect":"心灵链环","robopon":"机甲宝贝","upotte":"枪械少女!!","tokyo mew mew":"东京喵喵","mahoromatic":"魔力女管家","sister princess":"妹妹公主","ace attorney":"逆转裁判","tiger and bunny":"老虎和兔子","ghost in the shell":"攻壳机动队","hunter x hunter":"全职猎人","howls moving castle":"哈尔的移动城堡","kikis delivery service":"魔女宅急便","ace combat":"皇牌空战","mermaid melody pichi pichi pitch":"人鱼的旋律","attack no. 1":"女排No.1","devilman":"恶魔人","la seine no hoshi":"月光女侠","winx club":"魔法俏佳人","cats eye":"猫眼三姐妹","transformers":"变形金刚","high school fleet":"高校舰队","shinmai fukei kiruko-san":"新人女警斩子小姐","how to train your dragon":"驯龙高手","hacka doll":"骇客娃娃","kaiju girls":"怪兽娘","shinrabansho":"神罗万象","azumanga daioh":"阿滋漫画大王","galaxy fight":"银河快打","youkai hyakkitan":"妖怪百姬谭","papa no iu koto wo kikinasai":"要听爸爸的话!","himegoto":"搞姬日常","nogizaka haruka no himitsu":"乃木坂春香的秘密","south park":"南方公园","soushin shoujo matoi":"装神少女小缠","kindaichi shounen no jikenbo":"金田一少年事件簿","kekkai sensen":"血界战线","tokyo afterschool summoners":"东京放课后召唤师","saga frontier":"沙加开拓者","twelve kingdoms":"十二国记","atelier series":"炼金工作室","atelier marie":"玛莉的工作室","atelier elie":"艾莉的工作室","atelier lilie":"莉莉的工作室","atelier judie":"尤蒂的工作室","atelier iris":"伊莉斯的工作室","mana khemia":"玛娜传奇","atelier rorona":"罗罗娜的工作室","atelier totori":"托托莉的工作室","atelier meruru":"梅露露的工作室","atelier ayesha":"爱夏的工作室","atelier escha and logy":"艾斯卡与罗吉的工作室","atelier shallie":"夏莉的工作室","atelier sophie":"索菲的工作室","atelier firis":"菲莉丝的工作室","atelier lulua":"露露亚的工作室","atelier ryza":"莱莎的工作室","atelier lina":"莉娜的工作室","my neighbor totoro":"龙猫","professor layton":"雷顿教授","bubblegum crisis":"泡泡糖危机","kamikaze kaitou jeanne":"神风怪盗贞德","boruto":"博人传","kuromukuro":"黑骸","minecraft":"我的世界","world masterpiece theater":"世界名作剧场","the adventures of tom sawyer":"汤姆·索亚历险记","les miserables shoujo cosette":"悲惨世界 少女珂赛特","lucy of the southern rainbow":"南方彩虹的露西","tico of the seven seas":"七海的堤可","space adventure cobra":"哥布拉传奇","cutey honey":"甜心战士","megazone 23":"无限地带23","ganbare robocon":"加油啊!!小露宝","moero robocon":"燃烧吧!!小露宝","rainbow sentai robin":"彩虹战队罗宾","remi nobodys girl":"无家可归的孩子蕾米","revolutionary girl utena":"少女革命","corrector yui":"Cyber守护星","steel angel kurumi":"钢铁天使胡桃","zoids":"ZOIDS","world of warcraft":"魔兽世界","diablo":"暗黑破坏神","star trek":"星际迷航","binan koukou chikyuu bouei-bu love":"美男高校地球防卫部LOVE!","asobi ni iku yo":"玩伴猫耳娘","assassins creed":"刺客信条","peter pan":"小飞侠","romeos blue skies":"罗密欧的蓝天","3000 leagues in search of mother":"三千里寻母记","alps no shoujo heidi":"阿尔卑斯山的少女","anne of green gables":"绿山墙的安妮","futari no lotte":"我与我 两个绿蒂","katri girl of the meadows":"牧场上的少女卡特莉","the bush baby":"大草原上的小天使 灌丛婴猴","the story of perrine":"佩琳物语","dr. slump":"阿拉蕾","zettai muteki raijin-oh":"绝对无敌","dirty pair":"搞怪拍档","ai no wakakusa monogatari":"爱的小妇人物语","the story of pollyanna":"爱少女波丽安娜物语","princess sarah":"小公主莎拉","tobe isami":"伊沙米大冒险","doraemon":"哆啦A梦","pretty sammy":"魔法少女砂沙美","ochame na futago":"青葱岁月","miracle girl limit-chan":"奇迹少女理美","mahou no yousei persia":"魔法妖精贝露莎","minky momo":"魔法公主明琪桃子","majokko megu-chan":"魔女Megu","creamy mami":"我是小甜甜","magical angel sweet mint":"欢欢仙子","sally the witch":"魔法使莎莉","mahou shoujo lalabel":"魔法少女拉拉贝尔","hana no ko lunlun":"花仙子","magical emi":"魔法之星爱美","floral magician mary bell":"俏皮小花仙","mahou tsukai chappy":"魔法使恰比","marvelous melmo":"神奇糖","pastel yumi":"魔法偶像神笔由美","laputa castle in the sky":"天空之城","appleseed":"苹果核战记","himitsu no akko-chan":"亚子的秘密","yawara":"以柔克刚","cyborg 009":"人造人009","future boy conan":"未来少年柯南","muka muka paradise":"为食龙少爷","the goose that laid the golden eggs":"下金蛋的鹅","andersen monogatari":"安徒生童话","cinderella":"灰姑娘","k.o. beast":"KO世纪三兽士","trapp family story":"崔普一家物语","wakakusa monogatari nan to jo-sensei":"小妇人物语 南与乔老师","watashi no ashinaga ojisan":"长腿叔叔","nurse angel ririka sos":"守护天使莉莉佳","youre under arrest":"逮捕令","phantom quest corp":"幽幻怪社","urusei yatsura":"福星小子","attacker you":"胜利女排","giant gorg":"巨神GORG","gunslinger girl":"神枪少女","yu yu hakusho":"幽游白书","stella no mahou":"斯特拉的魔法","hinako note":"雏子的笔记","hoozuki no reitetsu":"鬼灯的冷彻","daiya no ace":"钻石王牌","durarara":"无头骑士异闻录 DuRaRaRa!!","supernatural":"邪恶力量","koi to senkyo to chocolate":"恋爱与选举与巧克力","goblin slayer":"哥布林杀手","dungeon meshi":"迷宫饭","kanokon":"我的狐仙女友","ladies versus butlers":"大小姐×执事!","arpeggio of blue steel":"苍蓝钢铁的琶音","maken-ki":"魔剑姬!","expelled from paradise":"乐园追放 -Expelled from Paradise-","glasslip":"玻璃之唇","hanasaku iroha":"花开伊吕波","akaneiro ni somaru saka":"茜色染红的街道","hoshizora e kakaru hashi":"架向星空之桥","gj-bu":"GJ部","kaze no yojimbo":"旋风之用心棒","kishin taisen gigantic formula":"机神大战-巨型方程式",".hack":".hack",".hacksign":".hack//SIGN",".hackg.u.":".hack//G.U.",".hackroots":".hack//Roots",".hacklegend of the twilight":".hack//黄昏的腕轮传说","log horizon":"记录的地平线","kamisama minarai himitsu no cocotama":"见习神明 秘密的COCOTAMA","phantom of inferno":"幻灵镇魂曲","dramatical murder":"戏剧性谋杀","robotics notes":"机器人笔记","rampo kitan game of laplace":"乱步奇谭 拉普拉斯的游戏","gravity rush":"重力眩晕","cowboy bebop":"星际牛仔","wii fit":"Wii Fit","uta no prince-sama":"歌之王子殿下","hime chen otogi chikku idol lilpri":"变身!公主偶像","ib":"Ib","ichigo mashimaro":"草莓棉花糖","yuusha ni narenakatta ore wa shibushibu shuushoku wo ketsui shimashita.":"当不成勇者的我,只好认真找工作了。","chrono crusade":"圣枪修女","lost universe":"宇宙刑警","amanchu":"蓝海少女!","mangaka-san to assistant-san to":"漫画家与助手","sisters natsu no saigo no hi":"SISTERS~夏最后之日~","tokyo 7th sisters":"东京 7th Sisters","7th dragon":"第七龙神","project blue earth sos":"蓝色计划-地球SOS","sakura hime":"樱姬华传","the 3rd birthday":"第三次生日","asuka 120":"飞鸟120% 燃烧的学园祭","jumping rabbit":"小兔飞飞","the fairly oddparents":"反斗家族","amagami":"圣诞之吻","fosters home for imaginary friends":"亲亲麻吉","futurama":"飞出个未来","kimi ga yobu megiddo no oka de":"你在米吉多之丘的呼唤","kuroko no basuke":"黑子的篮球","boku to maou":"魔王与我","cerberus":"刻耳柏洛斯","robot girls z":"机器人少女Z","akibas trip":"秋叶原之旅","bravely default":"勇气默示录","madan no ou to vanadis":"魔弹之王与战姬","star driver":"STAR DRIVER 闪亮的塔科特","tales of":"传说","tales of phantasia":"幻想传说","tales of destiny":"宿命传说","tales of eternia":"永恒传说","tales of symphonia":"仙乐传说","tales of rebirth":"重生传说","tales of legendia":"遗迹传说","tales of the abyss":"深渊传说","tales of innocence":"圣洁传说","tales of vesperia":"薄暮传说","tales of hearts":"心灵传说","tales of graces":"圣恩传说","tales of xillia":"无尽传说","tales of zestiria":"情热传说","tales of berseria":"狂战传说","tales of asteria":"星彩传说","little witch academia":"小魔女学园","rokudenashi majutsu koushi to akashic records":"不正经的魔术讲师与禁忌教典","martial champion":"武术冠军","virtua fighter":"VR战士","muscle bomber":"摔跤霸王","aria":"水星领航员","rozen maiden":"蔷薇少女","soulcalibur":"魂之系列","empowered":"Empowered","parasite eve":"寄生前夜","predator":"铁血战士","underworld":"黑夜传说","danny phantom":"幻影丹尼","the loud house":"喧闹一家亲","nodame cantabile":"交响情人梦","another":"Another","valkyria chronicles":"战场女武神","princess lover":"公主恋人","witchblade":"魔女之刃","warship girls":"战舰少女","sexfriend":"SEXFRIEND","school days":"日在校园","walkure romanze":"少女骑士物语","majin bone":"魔神之骨","starry sky":"Starry☆Sky","amano megumi ha sukidarake":"天野惠浑身是破绽!","yowamushi pedal":"飚速宅男","black cat":"黑猫","superjail":"超级监狱","superman":"超人","iron man":"钢铁侠","iron man armored adventures":"钢铁侠:装甲冒险","jackie chan adventures":"成龙历险记","avengers":"复仇者联盟","monster":"怪物","jungle wa itsumo hare nochi guu":"热带雨林的爆笑生活","w.i.t.c.h.":"魔力W.i.t.c.h.","ninja gaiden":"忍者外传","otome wa boku ni koishiteru":"少女爱上姐姐","fairy tail":"妖精的尾巴","oni chichi":"鬼父","clamp gakuen tanteidan":"CLAMP学园侦探团","soredemo machi wa mawatteiru":"女仆咖啡厅","happy tree friends":"欢乐树的朋友们","kare kano":"他和她的事情","spongebob squarepants":"海绵宝宝","wizard of oz":"绿野仙踪","cream lemon":"乳霜柠檬","dream c club":"梦幻俱乐部","katekyo hitman reborn":"家庭教师HITMAN REBORN!","tsugumomo":"怪怪守护神","the simpsons":"辛普森一家","ano natsu de matteru":"在盛夏等待","net ghost pipopa":"网络精灵PIPOPA","dominion tank police":"特搜战车队","ruin explorers":"秘境探险","streets of rage":"怒之铁拳","yume no crayon oukoku":"梦之蜡笔王国","megaman":"洛克人","megaman zero":"洛克人ZERO","megaman zx":"洛克人ZX","mega man x":"洛克人X","megaman battle network":"洛克人EXE","mega man legends":"洛克人DASH","mega man star force":"流星洛克人","konjiki no gash":"金色的卡修","super doll licca-chan":"丽佳公主","kasumin":"妙妙魔法屋","di gi charat":"铃铛猫娘","lamento":"挽歌","dexters laboratory":"德克斯特的实验室","mahoujin guru guru":"咕噜咕噜魔法阵","mon colle knights":"六门天外","is":"I\"s","beast wars":"百变金刚","wonder project j2":"J计划2","nights into dreams...":"梦精灵","waku waku 7":"火热火热7","okusan":"新手人妻","gakkou no kaidan":"学校怪谈","gear fighter dendoh":"GEAR战士电童","hand maid may":"袖珍女侍小梅","vandread":"银河冒险战记","mahou shoujo ai":"魔法少女爱","ys":"伊苏","yumeria":"梦物语","re creators":"Re:CREATORS","gasaraki":"饿沙罗鬼","yuyushiki":"悠悠式","sonic the hedgehog":"刺猬索尼克","beat blades haruka":"超昂闪忍遥","hikaru no go":"棋魂","rosenkreuzstilette":"蔷薇十字小剑","kuon no kizuna":"久远之绊","viper gts":"蝰蛇GTS","dragon age":"龙腾世纪","nyan koi":"猫愿三角恋","another lady innocent":"Front Innocent","historys strongest disciple kenichi":"史上最强弟子兼一","growlanser":"梦幻骑士","kono bijutsubu ni wa mondai ga aru":"这个美术社大有问题!","seikon no qwaser":"圣痕炼金士","high school kimengumi":"高校奇面组","onmyou taisenki":"阴阳大战记","ao no kanata no four rhythm":"苍之彼方的四重奏","captain commando":"名将","voltage fighter gowcaizer":"超人学园钢帝王","legend of lemnear":"极黑之翼","duel masters":"决斗大师","battle spirits":"战斗之魂","galaxy express 999":"银河铁道999","gaiking":"新大空魔龙","girls frontline":"少女前线","zettai karen children":"绝对可怜CHILDREN","selector infected wixoss":"选择感染者WIXOSS","chain chronicle":"锁链战记","the vision of escaflowne":"圣天空战记","kodomo no omocha":"玩偶游戏","quiz nanairo dreams":"七彩梦","rival schools":"私立正义学园","medabots":"徽章战士","zettai junpaku mahou shoujo":"绝对纯白魔法少女","namiuchigiwa no muromi-san":"人鱼又上钩","kuttsukiboshi":"紧扣的星星","maria-sama ga miteru":"圣母在上","youkoso jitsuryoku shijou shugi no kyoushitsu e":"欢迎来到实力至上主义的教室","kakegurui":"狂赌之渊","hajimete no gal":"第一次的辣妹","medaka box":"最强会长黑神","suisei no gargantia":"翠星之加尔刚蒂亚","mayo chiki":"迷茫管家与懦弱的我","rance":"兰斯","brave police j-decker":"勇者警察","witch craft works":"魔女的使命","heavy object":"重装武器","baby princess":"宝贝公主","bioshock":"生化奇兵","bioshock infinite":"生化奇兵:无限","akame ga kill":"斩·赤红之瞳!","harry potter":"哈利波特","tom and jerry":"猫和老鼠","mahouka koukou no rettousei":"魔法科高中的劣等生","euphoria":"euphoria","tangled":"长发公主","inside out":"头脑特工队","danball senki":"纸箱战机","hyper police":"猫狐警探","cosmic baton girl comet-san":"彗星公主","zone of the enders":"终极地带","photo kano":"写真女友","the kabocha wine":"南瓜酒","joshi shougakusei hajimemashita":"今天开始当女子小学生","cardfight vanguard":"卡片战斗先导者","the onechanbara":"THE 御姐玫瑰","gosick":"GOSICK","beyblade":"战斗陀螺","big hero 6":"超能陆战队","yuragisou no yuuna-san":"汤摇庄的幽奈同学","teekyuu":"女高网球部","jinsei":"人生","rail wars":"RAIL WARS! -日本国有铁道公安队-","rokujouma no shinryakusha":"三坪房间的侵略者!?","sabagebu":"生存游戏社","occultic nine":"超自然9人组","fist of the north star":"北斗神拳","monster girl quest":"勇者大战魔物娘","ghost sweeper mikami":"GS美神 极乐大作战!!","battle athletes":"大运动会","knights of ramune":"柠檬汽水骑士","saint tail":"怪盗圣少女","kyouran kazoku nikki":"狂乱家族日记","2x2 shinobuden":"酷伊忍者传","marriage royale":"皇家新娘","choukou tenshi escalayer":"超昂天使 Escalayer","mahou senshi sweet knights":"魔法战士 Sweet Knights","read or die":"R.O.D","uchuu no stellvia":"宇宙星路","ore monogatari":"俺物语!!","yuruyuri":"摇曳百合","death note":"死亡笔记","cooking papa":"妙厨老爹","rumble roses":"火爆玫瑰","genshiken":"现视研","pia carrot e youkoso":"欢迎来到Pia Carrot!!","pia carrot e youkoso 2":"欢迎来到Pia Carrot!!2","pia carrot e youkoso 3":"欢迎来到Pia Carrot!!3","bokutachi wa benkyou ga dekinai":"我们真的学不来","netoge no yome wa onnanoko ja nai to omotta":"线上游戏的老婆不可能是女生?","schoolgirl strikers":"学园少女突袭者","danna ga nani o itteiru ka wakaranai ken":"关于完全听不懂老公在说什么的事","golden sun":"黄金太阳","the grim adventures of billy and mandy":"爱酷一族","inspector gadget":"神探加杰特","the life and times of juniper lee":"魔法少女Juniper Lee","sousei no onmyouji":"双星之阴阳师","sengoku collection":"战国Collection","doctor strange":"奇异博士","knights and magic":"骑士&魔法","mahou shoujo ikusei keikaku":"魔法少女育成计划","arslan senki":"亚尔斯兰战记","chousoku henkei gyrozetter":"超速变形螺旋杰特","kengan ashura":"拳愿阿修罗","tonari no miko-san wa minna warau":"邻家的巫女在微笑","aikatsu":"偶活学园!","aho-girl":"笨女孩","azur lane":"碧蓝航线","isekai shokudou":"异世界食堂","baccano":"永生之酒","berserk":"剑风传奇","isekai wa smartphone to tomo ni.":"带着智能手机闯荡异世界。","atelier tanaka":"田中是年龄=没女朋友的魔法师","servant x service":"跟班×服务","bakuon":"爆音少女!!","inou-battle wa nichijou-kei no naka de":"日常系的异能战斗","denkigai no honya-san":"电器街的漫画店","bladedance of elementalers":"精灵使的剑舞","da capo":"初音岛","da capo ii":"初音岛II","da capo iii":"初音岛III","tejina senpai":"魔术前辈","valkyrie no bouken":"女武士大冒险","mugen senshi valis":"梦幻战士","dream hunter rem":"梦猎人丽梦","made in abyss":"来自深渊","wonder momo":"神奇桃子","hero bank":"英雄银行","monsuno":"兽旋战斗","tengai makyou":"天外魔境","wingman":"银翼超人","fight ippatsu juuden-chan":"魔力充电娘","needless":"超能力大战","the sacred blacksmith":"圣剑锻造师","kampfer":"肯普法","onmyoji":"阴阳师","brynhildr in the darkness":"极黑的布伦希尔特","super real mahjong":"超真实麻将","journey to the west":"西游记","busou renkin":"武装炼金","jigoku shoujo":"地狱少女","midori no hibi":"美鸟的日记","seirei no moribito":"精灵守护者","air gear":"飞轮少年","bamboo blade":"竹刀少女","dance in the vampire bund":"吸血鬼同盟","freezing":"零度战姬","omamori himari":"守护猫娘绯鞠","shinkyoku soukai polyphonica":"神曲奏界Polyphonica","tenjou tenge":"天上天下","unbalance x unbalance":"萌道鲜师","ange vierge":"圣洁天使","blend s":"调教咖啡厅","command and conquer":"命令与征服","uninhabited planet survive":"星球流浪记","fatal fury":"饿狼传说","princess crown":"公主王冠","burst angel":"爆裂天使","k":"K","prince of tennis":"网球王子","lord of lords ryu knight":"霸王大系龙骑士","tonde buurin":"飞天少女猪","nano core":"纳米核心","elsword":"艾尔之光","betterman":"进化战记","tenshi ni narumon":"天使不设防!","kamen no maid guy":"假面男仆","etrian odyssey":"世界树的迷宫","in search of the lost future":"寻找失去的未来","art of fighting":"龙虎之拳","burning force":"燃烧战队","golden axe":"战斧","popful mail":"啵咕物语","the wing of madoola":"玛多拉之翼","gakusen toshi asterisk":"学战都市Asterisk","tokyo ghoul":"东京食尸鬼","doki doki literature club":"心动文学俱乐部!","regalia the three sacred stars":"雷加利亚三圣星","kaze no densetsu xanadu":"风之传说XANADU","tower of druaga":"迷宫塔","valkyrie profile":"北欧女神","serial experiments lain":"玲音","ansatsu kyoushitsu":"暗杀教室","mirrors edge":"镜之边缘","galilei donna":"伽利略少女","teenage mutant ninja turtles":"忍者神龟","all purpose cultural cat girl nuku nuku":"万能文化猫娘","absolute duo":"绝对双刃","avatar":"阿凡达","avatar the last airbender":"降世神通:最后的气宗","coppelion":"核爆末世录","maison ikkoku":"相聚一刻","mikakunin de shinkoukei":"未确认进行式","tasogare otome x amnesia":"黄昏少女×失忆","guild wars":"激战","battle girl high school":"战斗女子高校","nausicaa of the valley of the wind":"风之谷","porco rosso":"红猪","princess mononoke":"幽灵公主","the secret world of arrietty":"借东西的小人阿莉埃蒂","mimi wo sumaseba":"侧耳倾听","space patrol luluco":"宇宙巡警露露子","shakunetsu no takkyuu musume":"灼热的乒乓球娘","silver spoon":"银之匙","imouto sae ireba ii.":"如果有妹妹就好了。","bang dream":"BanG Dream!","fantasy earth zero":"幻想大陆","fantastic four":"神奇四侠","wonder woman":"神奇女侠","family guy":"恶搞之家","galaxy angel":"银河天使","nurse witch komugi":"魔法护士小麦","popotan":"蒲公英之恋","xenoblade":"异度之刃","xenoblade x":"异度之刃X","xenoblade chronicles 2":"异度之刃2","xenogears":"异度装甲","xenosaga":"异度传说","shining sword romance":"剑芒罗曼史","shining in the darkness":"光明与黑暗","shining force":"光明力量","shining force exa":"光明力量EXA","shining force feather":"光明力量 羽翼","shining soul":"光明之魂","shining tears":"光明之泪","shining wind":"光明之风","shining hearts":"光明之心","shining blade":"光明之刃","shining ark":"光明之舟","shining resonance":"光明之响","lunar silver star story":"露娜 银河之星物语","lunar eternal blue":"露娜 永恒之蓝","maria holic":"玛莉亚狂热","boku no pico":"我的Pico","azure striker gunvolt":"苍蓝雷霆:刚巴尔特","narutaru":"星星公主","bokusatsu tenshi dokuro-chan":"扑杀天使朵库萝","rick and morty":"瑞克和莫蒂","slow start":"Slow Start","princess principal":"Princess Principal","sangokushi taisen":"三国志大战","sengoku taisen":"战国大战","chinpui":"大耳鼠","pani poni dash":"不可思议的教室","suigetsu":"水月","mizuiro":"水色","dragonaut":"龙鸣","under night in-birth":"夜下降生","world trigger":"境界触发者","mouse":"MØUSE","atashinchi":"我们这一家","crayon shin-chan":"蜡笔小新","looney tunes":"乐一通","yuru camp":"摇曳露营△","saiki kusuo no psi nan":"齐木楠雄的灾难","monster strike":"怪物弹珠","noragami":"野良神","z slash x":"Z/X","shin angyo onshi":"新暗行御史","kouchuu ouja mushiking":"甲虫王者","darling in the franxx":"DARLING in the FRANXX","fairy fencer f":"妖精剑士f","honkai gakuen":"崩坏学园","quiz magic academy":"问答魔法学院","houseki no kuni":"宝石之国","atlach-nacha":"ATLACH=NACHA","princess maker":"美少女梦工场","grisaia no kajitsu":"灰色的果实","sakura trick":"樱Trick","pop team epic":"pop子和pipi美的日常","lollipop chainsaw":"电锯甜心","alternative girls":"妃十三学园 Alternative Girls","deadpool":"死侍","mitsuboshi colors":"三颗星彩色冒险","nekopara":"猫娘乐园","keijo":"竞女!!!!!!!!","the emoji movie":"表情奇幻冒险","animal crossing":"动物之森","black clover":"黑色五叶草","blues clues":"蓝色斑点狗","cooking mama":"料理妈妈","dragons lair":"龙穴历险记","romance of the three kingdoms":"三国演义","death march kara hajimaru isekai kyousoukyoku":"爆肝工程师的异世界狂想曲","shironeko project":"白猫计划","toji no miko":"刀使之巫女","major":"棒球大联盟","sora yori mo tooi basho":"比宇宙更远的地方","border break":"边境保卫战","last period":"最终休止符 -无止境的螺旋物语-","stella glow":"星光幻歌","ryuuou no oshigoto":"龙王的工作!","uma musume pretty derby":"赛马娘Pretty Derby🐎","os-tan":"OS娘","sunohara-sou no kanrinin-san":"春原庄的管理员小姐","yotsubato":"四叶妹妹!","dragon nest":"龙之谷","kuroinu kedakaki seijo wa hakudaku ni somaru":"黑兽~被白浊沾污的高傲圣女~","initial d":"头文字D","final romance":"对战偶像麻雀:最终罗曼史","violet evergarden":"紫罗兰永恒花园","sokkou seitokai":"速攻学生会","shantae":"桑塔","nekojishi":"家有大猫","tomo-chan wa onnanoko":"小智是女孩啦!","strawberry panic":"惊爆草莓","isekai izakaya nobu":"异世界居酒屋「阿信」","alias carnival":"ALIA's CARNIVAL!","tesagure bukatsu-mono":"摸索吧!部活剧","dna2":"DNA²","guardians of the galaxy":"银河护卫队","legendz":"龙王传说","cross ange":"天使与龙的轮舞","dungeon fighter online":"地下城与勇士","warhammer":"战锤","rakudai kishi no cavalry":"落第骑士英雄谭","xxxholic":"×××HOLiC","beatless":"BEATLESS","ao no exorcist":"青之驱魔师","gate - jieitai kano chi nite kaku tatakaeri":"GATE奇幻自卫队","playerunknowns battlegrounds":"绝地求生","masamune-kun no revenge":"政宗君的复仇","hataraku saibou":"工作细胞","binbougami ga":"穷神来了","princess connect":"公主连结Re:Dive","kuzu no honkai":"人渣的本愿","elfen lied":"妖精的旋律","katanagatari":"刀语","plastic memories":"可塑性记忆","ijiranaide nagatoro-san":"不要欺负我,长瀞同学","bijin onna joushi takizawa-san":"美女上司泷泽小姐","bible black":"黑暗圣经","uzaki-chan wa asobitai":"宇崎酱想要玩耍!","one kagayaku kisetsu e":"ONE~光辉的季节~","guardian heroes":"守护英雄","the incredibles":"超人总动员","yakitate japan":"日式面包王","planetarian":"星之梦","cave story":"洞窟物语","btooom":"BTOOOM!惊爆游戏","nichijou":"日常","isekai maou to shoukan shoujo no dorei majutsu":"异界少女召唤术","winnie the pooh":"小熊维尼","bravest warriors":"无惧勇士","candy candy":"小甜甜","moana":"海洋奇缘","scooby-doo":"史酷比","miraculous ladybug":"瓢虫少女","inazuma eleven go":"闪电十一人GO","mushibugyo":"虫奉行","kid icarus":"光神话 帕尔提娜之镜","legend of queen opala":"奥帕拉女王传奇","shoujo kageki revue starlight":"少女歌剧Revue Starlight","deathsmiles":"死亡微笑","kaitou joker":"怪盗Joker","qualidea code":"Qualidea Code","shuumatsu no izetta":"终末的伊泽塔","donkey kong":"大金刚","whistle":"哨声响起","ore ga suki nano wa imouto dakedo imouto ja nai":"我喜欢的是小说里的你","seishun buta yarou wa bunny girl senpai no yume o minai":"青春猪头少年不会梦到兔女郎学姐","ssss.gridman":"SSSS.GRIDMAN","barbie":"芭比娃娃","hellboy":"地狱男爵","akebi no mi":"山姬之实","stardew valley":"星露谷物语","tensei shitara slime datta ken":"关于我转生变成史莱姆这档事","quiz rpg mahoutsukai to kuroneko no wiz":"黑猫维兹","boku no dorei shoukan":"我的奴隶妓院","silent mobius":"魔法阵都市","sora wo kakeru shoujo":"穿越宇宙的少女","cevio":"CeVIO","gotoubun no hanayome":"五等分的新娘","pan de peace":"面包带来和平","borderlands":"无主之地","usagi-chan de cue":"天生兔女郎","ueno-san wa bukiyou":"笨拙之极的上野","wake up girls":"Wake Up, Girls!","golden kamuy":"黄金神威","komi-san wa komyushou desu.":"古见同学有交流障碍症","kaguya-sama wa kokurasetai":"辉夜大小姐想让我告白","watashi ni tenshi ga maiorita":"天使降临到我身边!","darkest dungeon":"暗黑地牢","idol wars z":"IDOL WARS Z","sewayaki kitsune no senko-san":"贤惠幼妻仙狐小姐","shomin sample":"我被绑架到贵族女校当“庶民样本”","arknights":"明日方舟",
Download .txt
gitextract_1fwolk4v/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.yaml
│   │   ├── config.yml
│   │   └── enhancement.yaml
│   └── workflows/
│       ├── analyze.yml
│       ├── delete_old_workflows.yml
│       ├── fastlane.yml
│       ├── issue_check.yml
│       ├── main.yml
│       └── update_alt_store.yml
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── alt_store.json
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── debug/
│   │       │   └── AndroidManifest.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── com/
│   │       │   │       └── github/
│   │       │   │           └── wgh136/
│   │       │   │               └── venera/
│   │       │   │                   └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   └── ic_launcher.xml
│   │       │       ├── values/
│   │       │       │   ├── strings.xml
│   │       │       │   └── styles.xml
│   │       │       ├── values-night/
│   │       │       │   └── styles.xml
│   │       │       ├── values-zh/
│   │       │       │   └── strings.xml
│   │       │       └── values-zh-rCN/
│   │       │           └── strings.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle
├── assets/
│   ├── init.js
│   ├── opencc.txt
│   ├── tags.json
│   ├── tags_tw.json
│   └── translation.json
├── debian/
│   ├── build.py
│   ├── debian.yaml
│   └── gui/
│       └── venera.desktop
├── doc/
│   ├── comic_source.md
│   ├── headless_doc.md
│   ├── import_comic.md
│   └── js_api.md
├── fastlane/
│   └── metadata/
│       └── android/
│           └── en-US/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       ├── Contents.json
│   │   │       └── README.md
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── DirectoryPicker.swift
│   │   ├── Info.plist
│   │   └── Runner-Bridging-Header.h
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── RunnerTests/
│       └── RunnerTests.swift
├── lib/
│   ├── components/
│   │   ├── appbar.dart
│   │   ├── button.dart
│   │   ├── code.dart
│   │   ├── comic.dart
│   │   ├── components.dart
│   │   ├── consts.dart
│   │   ├── custom_slider.dart
│   │   ├── effects.dart
│   │   ├── flyout.dart
│   │   ├── gesture.dart
│   │   ├── image.dart
│   │   ├── js_ui.dart
│   │   ├── layout.dart
│   │   ├── loading.dart
│   │   ├── menu.dart
│   │   ├── message.dart
│   │   ├── navigation_bar.dart
│   │   ├── pop_up_widget.dart
│   │   ├── rich_comment_content.dart
│   │   ├── scroll.dart
│   │   ├── select.dart
│   │   ├── side_bar.dart
│   │   └── window_frame.dart
│   ├── foundation/
│   │   ├── app.dart
│   │   ├── app_page_route.dart
│   │   ├── appdata.dart
│   │   ├── cache_manager.dart
│   │   ├── comic_source/
│   │   │   ├── category.dart
│   │   │   ├── comic_source.dart
│   │   │   ├── favorites.dart
│   │   │   ├── models.dart
│   │   │   ├── parser.dart
│   │   │   └── types.dart
│   │   ├── comic_type.dart
│   │   ├── consts.dart
│   │   ├── context.dart
│   │   ├── favorites.dart
│   │   ├── follow_updates.dart
│   │   ├── global_state.dart
│   │   ├── history.dart
│   │   ├── image_favorites.dart
│   │   ├── image_provider/
│   │   │   ├── base_image_provider.dart
│   │   │   ├── cached_image.dart
│   │   │   ├── history_image_provider.dart
│   │   │   ├── image_favorites_provider.dart
│   │   │   ├── local_comic_image.dart
│   │   │   ├── local_favorite_image.dart
│   │   │   └── reader_image.dart
│   │   ├── js_engine.dart
│   │   ├── js_pool.dart
│   │   ├── local.dart
│   │   ├── log.dart
│   │   ├── res.dart
│   │   └── widget_utils.dart
│   ├── headless.dart
│   ├── init.dart
│   ├── main.dart
│   ├── network/
│   │   ├── app_dio.dart
│   │   ├── cache.dart
│   │   ├── cloudflare.dart
│   │   ├── cookie_jar.dart
│   │   ├── download.dart
│   │   ├── file_downloader.dart
│   │   ├── images.dart
│   │   └── proxy.dart
│   ├── pages/
│   │   ├── aggregated_search_page.dart
│   │   ├── auth_page.dart
│   │   ├── categories_page.dart
│   │   ├── category_comics_page.dart
│   │   ├── comic_details_page/
│   │   │   ├── actions.dart
│   │   │   ├── chapters.dart
│   │   │   ├── comic_page.dart
│   │   │   ├── comments_page.dart
│   │   │   ├── comments_preview.dart
│   │   │   ├── cover_viewer.dart
│   │   │   ├── favorite.dart
│   │   │   └── thumbnails.dart
│   │   ├── comic_source_page.dart
│   │   ├── downloading_page.dart
│   │   ├── explore_page.dart
│   │   ├── favorites/
│   │   │   ├── favorite_actions.dart
│   │   │   ├── favorites_page.dart
│   │   │   ├── local_favorites_page.dart
│   │   │   ├── network_favorites_page.dart
│   │   │   └── side_bar.dart
│   │   ├── follow_updates_page.dart
│   │   ├── history_page.dart
│   │   ├── home_page.dart
│   │   ├── image_favorites_page/
│   │   │   ├── image_favorites_item.dart
│   │   │   ├── image_favorites_page.dart
│   │   │   ├── image_favorites_photo_view.dart
│   │   │   └── type.dart
│   │   ├── local_comics_page.dart
│   │   ├── main_page.dart
│   │   ├── ranking_page.dart
│   │   ├── reader/
│   │   │   ├── chapter_comments.dart
│   │   │   ├── chapters.dart
│   │   │   ├── comic_image.dart
│   │   │   ├── gesture.dart
│   │   │   ├── images.dart
│   │   │   ├── loading.dart
│   │   │   ├── reader.dart
│   │   │   └── scaffold.dart
│   │   ├── search_page.dart
│   │   ├── search_result_page.dart
│   │   ├── settings/
│   │   │   ├── about.dart
│   │   │   ├── app.dart
│   │   │   ├── appearance.dart
│   │   │   ├── debug.dart
│   │   │   ├── explore_settings.dart
│   │   │   ├── local_favorites.dart
│   │   │   ├── network.dart
│   │   │   ├── reader.dart
│   │   │   ├── setting_components.dart
│   │   │   └── settings_page.dart
│   │   └── webview.dart
│   └── utils/
│       ├── app_links.dart
│       ├── cbz.dart
│       ├── channel.dart
│       ├── clipboard_image.dart
│       ├── data.dart
│       ├── data_sync.dart
│       ├── epub.dart
│       ├── ext.dart
│       ├── file_type.dart
│       ├── handle_text_share.dart
│       ├── image.dart
│       ├── import_comic.dart
│       ├── init.dart
│       ├── io.dart
│       ├── opencc.dart
│       ├── pdf.dart
│       ├── tags_translation.dart
│       ├── translations.dart
│       └── volume.dart
├── linux/
│   ├── .gitignore
│   ├── CMakeLists.txt
│   ├── flutter/
│   │   └── CMakeLists.txt
│   ├── main.cc
│   ├── my_application.cc
│   └── my_application.h
├── macos/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── Flutter-Debug.xcconfig
│   │   └── Flutter-Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   └── AppIcon.appiconset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── MainMenu.xib
│   │   ├── Configs/
│   │   │   ├── AppInfo.xcconfig
│   │   │   ├── Debug.xcconfig
│   │   │   ├── Release.xcconfig
│   │   │   └── Warnings.xcconfig
│   │   ├── DebugProfile.entitlements
│   │   ├── Info.plist
│   │   ├── MainFlutterWindow.swift
│   │   └── Release.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── IDEWorkspaceChecks.plist
│   └── RunnerTests/
│       └── RunnerTests.swift
├── patch/
│   └── font.dart
├── pubspec.yaml
├── rust-toolchain.toml
├── test/
│   └── channel_test.dart
├── update_alt_store.py
└── windows/
    ├── .gitignore
    ├── CMakeLists.txt
    ├── build.iss
    ├── build.py
    ├── build_arm64.iss
    ├── build_arm64.py
    ├── flutter/
    │   └── CMakeLists.txt
    └── runner/
        ├── CMakeLists.txt
        ├── Runner.rc
        ├── flutter_window.cpp
        ├── flutter_window.h
        ├── main.cpp
        ├── resource.h
        ├── runner.exe.manifest
        ├── utils.cpp
        ├── utils.h
        ├── win32_window.cpp
        └── win32_window.h
Download .txt
SYMBOL INDEX (2475 symbols across 144 files)

FILE: assets/init.js
  function setTimeout (line 19) | function setTimeout(callback, delay) {
  function createUuid (line 372) | function createUuid() {
  function randomInt (line 384) | function randomInt(min, max) {
  function randomDouble (line 399) | function randomDouble(min, max) {
  class _Timer (line 408) | class _Timer {
    method constructor (line 415) | constructor(delay, callback) {
    method run (line 420) | run() {
    method _interval (line 425) | _interval() {
    method cancel (line 433) | cancel() {
  function setInterval (line 438) | function setInterval(callback, delay) {
  function Cookie (line 451) | function Cookie({name, value, domain}) {
  method fetchBytes (line 471) | async fetchBytes(method, url, headers, data, extra) {
  method sendRequest (line 498) | async sendRequest(method, url, headers, data, extra) {
  method get (line 522) | async get(url, headers, extra) {
  method post (line 534) | async post(url, headers, data, extra) {
  method put (line 546) | async put(url, headers, data, extra) {
  method patch (line 558) | async patch(url, headers, data, extra) {
  method delete (line 569) | async delete(url, headers, extra) {
  method setCookies (line 578) | setCookies(url, cookies) {
  method getCookies (line 592) | getCookies(url) {
  method deleteCookies (line 604) | deleteCookies(url) {
  function fetch (line 620) | async function fetch(url, options) {
  class HtmlDocument (line 647) | class HtmlDocument {
    method constructor (line 656) | constructor(html) {
    method querySelector (line 672) | querySelector(query) {
    method querySelectorAll (line 688) | querySelectorAll(query) {
    method dispose (line 702) | dispose() {
    method getElementById (line 715) | getElementById(id) {
  class HtmlElement (line 730) | class HtmlElement {
    method constructor (line 740) | constructor(k, doc) {
    method text (line 749) | get text() {
    method attributes (line 762) | get attributes() {
    method querySelector (line 776) | querySelector(query) {
    method querySelectorAll (line 793) | querySelectorAll(query) {
    method children (line 808) | get children() {
    method nodes (line 822) | get nodes() {
    method innerHTML (line 836) | get innerHTML() {
    method parent (line 849) | get parent() {
    method classNames (line 864) | get classNames() {
    method id (line 877) | get id() {
    method localName (line 890) | get localName() {
    method previousElementSibling (line 903) | get previousElementSibling() {
    method nextElementSibling (line 918) | get nextElementSibling() {
  class HtmlNode (line 930) | class HtmlNode {
    method constructor (line 935) | constructor(k, doc) {
    method text (line 944) | get text() {
    method type (line 957) | get type() {
    method toElement (line 970) | toElement() {
  function log (line 982) | function log(level, title, content) {
  function Comic (line 1018) | function Comic({id, title, subtitle, subTitle, cover, tags, description,...
  function ComicDetails (line 1057) | function ComicDetails({title, subtitle, subTitle, cover, description, ta...
  function Comment (line 1093) | function Comment({userName, avatar, content, time, replyCount, id, isLik...
  function ImageLoadingConfig (line 1122) | function ImageLoadingConfig({url, method, data, headers, onResponse, mod...
  class ComicSource (line 1132) | class ComicSource {
    method loadData (line 1148) | loadData(dataKey) {
    method loadSetting (line 1161) | loadSetting(key) {
    method saveData (line 1174) | saveData(dataKey, data) {
    method deleteData (line 1187) | deleteData(dataKey) {
    method isLogged (line 1199) | get isLogged() {
    method translate (line 1214) | translate(key) {
    method init (line 1219) | init() { }
  class Image (line 1226) | class Image {
    method constructor (line 1229) | constructor(key) {
    method copyRange (line 1241) | copyRange(x, y, width, height) {
    method copyAndRotate90 (line 1259) | copyAndRotate90() {
    method fillImageAt (line 1275) | fillImageAt(x, y, image) {
    method fillImageRangeAt (line 1296) | fillImageRangeAt(x, y, image, srcX, srcY, width, height) {
    method width (line 1311) | get width() {
    method height (line 1319) | get height() {
    method empty (line 1327) | static empty(width, height) {
  constant APP (line 1451) | let APP = {
  method version (line 1456) | get version() {
  method locale (line 1464) | get locale() {
  method platform (line 1474) | get platform() {
  function setClipboard (line 1488) | function setClipboard(text) {
  function getClipboard (line 1501) | function getClipboard() {
  function compute (line 1514) | function compute(func, ...args) {

FILE: lib/components/appbar.dart
  class Appbar (line 3) | class Appbar extends StatefulWidget implements PreferredSizeWidget {
    method createState (line 24) | State<Appbar> createState()
  class _AppbarState (line 30) | class _AppbarState extends State<Appbar> {
    method didChangeDependencies (line 35) | void didChangeDependencies()
    method dispose (line 43) | void dispose()
    method _handleScrollNotification (line 51) | void _handleScrollNotification(ScrollNotification notification)
    method build (line 79) | Widget build(BuildContext context)
  type AppbarStyle (line 130) | enum AppbarStyle {
  class SliverAppbar (line 135) | class SliverAppbar extends StatelessWidget {
    method build (line 156) | Widget build(BuildContext context)
  class _MySliverAppBarDelegate (line 173) | class _MySliverAppBarDelegate extends SliverPersistentHeaderDelegate {
    method build (line 196) | Widget build(
    method shouldRebuild (line 260) | bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate)
  class AppTabBar (line 271) | class AppTabBar extends StatefulWidget {
    method createState (line 289) | State<AppTabBar> createState()
  class _AppTabBarState (line 292) | class _AppTabBarState extends State<AppTabBar> {
    method initState (line 312) | void initState()
    method dispose (line 318) | void dispose()
    method didChangeDependencies (line 325) | void didChangeDependencies()
    method didUpdateWidget (line 340) | void didUpdateWidget(covariant AppTabBar oldWidget)
    method initPainter (line 349) | void initPainter()
    method build (line 363) | Widget build(BuildContext context)
    method _tabLayoutCallback (line 370) | void _tabLayoutCallback(List<double> offsets, double itemHeight)
    method buildTabBar (line 375) | Widget buildTabBar(BuildContext context, Widget? _)
    method onTabChanged (line 418) | void onTabChanged()
    method updateScrollOffset (line 428) | void updateScrollOffset(int i)
    method onTabClicked (line 452) | void onTabClicked(int i)
    method buildTab (line 456) | Widget buildTab(int i)
  type _TabRenderCallback (line 479) | typedef _TabRenderCallback = void Function(
  class _TabRow (line 484) | class _TabRow extends Row {
    method createRenderObject (line 490) | RenderFlex createRenderObject(BuildContext context)
    method updateRenderObject (line 502) | void updateRenderObject(BuildContext context, _RenderTabFlex renderObj...
  class _RenderTabFlex (line 508) | class _RenderTabFlex extends RenderFlex {
    method performLayout (line 522) | void performLayout()
  class _IndicatorPainter (line 538) | class _IndicatorPainter extends CustomPainter {
    method update (line 555) | void update(List<double> offsets, double itemHeight)
    method indicatorRect (line 562) | Rect indicatorRect(Size tabBarSize, int tabIndex)
    method paint (line 582) | void paint(Canvas canvas, Size size)
    method shouldRepaint (line 601) | bool shouldRepaint(covariant CustomPainter oldDelegate)
  class TabViewBody (line 606) | class TabViewBody extends StatefulWidget {
    method createState (line 615) | State<TabViewBody> createState()
  class _TabViewBodyState (line 618) | class _TabViewBodyState extends State<TabViewBody> {
    method updateIndex (line 623) | void updateIndex()
    method didChangeDependencies (line 632) | void didChangeDependencies()
    method dispose (line 640) | void dispose()
    method build (line 646) | Widget build(BuildContext context)
  class SearchBarController (line 651) | class SearchBarController {
    method setText (line 658) | void setText(String text)
  class _SearchBarMixin (line 671) | abstract mixin class _SearchBarMixin {
    method setText (line 672) | void setText(String text)
    method getText (line 674) | String getText()
  class SliverSearchBar (line 677) | class SliverSearchBar extends StatefulWidget {
    method createState (line 695) | State<SliverSearchBar> createState()
  class _SliverSearchBarState (line 698) | class _SliverSearchBarState extends State<SliverSearchBar>
    method initState (line 705) | void initState()
    method setText (line 713) | void setText(String text)
    method getText (line 718) | String getText()
    method build (line 723) | Widget build(BuildContext context)
  class _SliverSearchBarDelegate (line 738) | class _SliverSearchBarDelegate extends SliverPersistentHeaderDelegate {
    method build (line 763) | Widget build(
    method shouldRebuild (line 827) | bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate)
  class AppSearchBar (line 835) | class AppSearchBar extends StatefulWidget {
    method createState (line 843) | State<AppSearchBar> createState()
  class _SearchBarState (line 846) | class _SearchBarState extends State<AppSearchBar> with _SearchBarMixin {
    method setText (line 852) | void setText(String text)
    method getText (line 857) | String getText()
    method initState (line 862) | void initState()
    method build (line 870) | Widget build(BuildContext context)
  class TabActionButton (line 924) | class TabActionButton extends StatelessWidget {
    method build (line 941) | Widget build(BuildContext context)

FILE: lib/components/button.dart
  class HoverBox (line 3) | class HoverBox extends StatefulWidget {
    method createState (line 12) | State<HoverBox> createState()
  class _HoverBoxState (line 15) | class _HoverBoxState extends State<HoverBox> {
    method build (line 19) | Widget build(BuildContext context)
  type ButtonType (line 37) | enum ButtonType { filled, outlined, text, normal }
  class Button (line 39) | class Button extends StatefulWidget {
    method icon (line 100) | Widget icon(
    method createState (line 140) | State<Button> createState()
  class _ButtonState (line 143) | class _ButtonState extends State<Button> {
    method didUpdateWidget (line 149) | void didUpdateWidget(covariant Button oldWidget)
    method build (line 157) | Widget build(BuildContext context)
  class _IconButton (line 282) | class _IconButton extends StatefulWidget {
    method createState (line 309) | State<_IconButton> createState()
  class _IconButtonState (line 312) | class _IconButtonState extends State<_IconButton> {
    method build (line 316) | Widget build(BuildContext context)
  class MenuButton (line 361) | class MenuButton extends StatefulWidget {
    method createState (line 367) | State<MenuButton> createState()
  class _MenuButtonState (line 370) | class _MenuButtonState extends State<MenuButton> {
    method build (line 372) | Widget build(BuildContext context)

FILE: lib/components/code.dart
  class CodeEditor (line 3) | class CodeEditor extends StatefulWidget {
    method createState (line 11) | State<CodeEditor> createState()
  class _CodeEditorState (line 14) | class _CodeEditorState extends State<CodeEditor> {
    method initState (line 22) | void initState()
    method didChangeDependencies (line 39) | void didChangeDependencies()
    method handleTab (line 44) | void handleTab()
    method calculateLineCount (line 52) | int calculateLineCount(String text)
    method buildLineNumbers (line 56) | Widget buildLineNumbers()
    method build (line 85) | Widget build(BuildContext context)
  class _CustomScrollBehavior (line 157) | class _CustomScrollBehavior extends MaterialScrollBehavior {
    method buildScrollbar (line 160) | Widget buildScrollbar(
  class _CodeTextEditingController (line 166) | class _CodeTextEditingController extends TextEditingController {
    method init (line 171) | Future<void> init(Brightness brightness)
    method buildTextSpan (line 177) | TextSpan buildTextSpan(
    method mergeTextStyle (line 196) | TextSpan mergeTextStyle(TextSpan span, TextStyle style)

FILE: lib/components/comic.dart
  function _findImageProvider (line 3) | ImageProvider? _findImageProvider(Comic comic)
  class ComicTile (line 26) | class ComicTile extends StatelessWidget {
    method _onTap (line 52) | void _onTap()
    method _onLongPressed (line 68) | void _onLongPressed(context)
    method onLongPress (line 76) | void onLongPress(BuildContext context)
    method onSecondaryTap (line 85) | void onSecondaryTap(TapDownDetails details, BuildContext context)
    method showMenu (line 89) | void showMenu(Offset location, BuildContext context)
    method build (line 134) | Widget build(BuildContext context)
    method buildImage (line 202) | Widget buildImage(BuildContext context)
    method _buildDetailedMode (line 215) | Widget _buildDetailedMode(BuildContext context)
    method _buildBriefMode (line 280) | Widget _buildBriefMode(BuildContext context)
    method _splitText (line 399) | List<String> _splitText(String text)
    method block (line 447) | void block(BuildContext comicTileContext)
  class _ComicDescription (line 513) | class _ComicDescription extends StatelessWidget {
    method build (line 535) | Widget build(BuildContext context)
  class _ReadingHistoryPainter (line 660) | class _ReadingHistoryPainter extends CustomPainter {
    method paint (line 667) | void paint(Canvas canvas, Size size)
    method shouldRepaint (line 728) | bool shouldRepaint(covariant CustomPainter oldDelegate)
  class SliverGridComics (line 735) | class SliverGridComics extends StatefulWidget {
    method createState (line 761) | State<SliverGridComics> createState()
  class _SliverGridComicsState (line 764) | class _SliverGridComicsState extends State<SliverGridComics> {
    method generateHeroID (line 770) | void generateHeroID()
    method didUpdateWidget (line 778) | void didUpdateWidget(covariant SliverGridComics oldWidget)
    method initState (line 792) | void initState()
    method dispose (line 804) | void dispose()
    method update (line 809) | void update()
    method build (line 821) | Widget build(BuildContext context)
  class _SliverGridComics (line 835) | class _SliverGridComics extends StatelessWidget {
    method build (line 864) | Widget build(BuildContext context)
  function isBlocked (line 910) | String? isBlocked(Comic item)
  class ComicList (line 936) | class ComicList extends StatefulWidget {
    method createState (line 969) | State<ComicList> createState()
  class ComicListState (line 972) | class ComicListState extends State<ComicList> {
    method restoreState (line 996) | void restoreState(Map<String, dynamic>? state)
    method storeState (line 1010) | void storeState()
    method refresh (line 1016) | void refresh()
    method didChangeDependencies (line 1028) | void didChangeDependencies()
    method remove (line 1034) | void remove(Comic c)
    method _buildPageSelector (line 1045) | Widget _buildPageSelector()
    method _buildSliverPageSelector (line 1136) | Widget _buildSliverPageSelector()
    method _loadPage (line 1142) | Future<void> _loadPage(int page)
    method _fetchNext (line 1198) | Future<void> _fetchNext()
    method build (line 1209) | Widget build(BuildContext context)
    method buildPagingMode (line 1214) | Widget buildPagingMode()
    method buildContinuousMode (line 1264) | Widget buildContinuousMode()
  class StarRating (line 1344) | class StarRating extends StatelessWidget {
    method build (line 1359) | Widget build(BuildContext context)
  class _Star (line 1387) | class _Star extends StatelessWidget {
    method build (line 1395) | Widget build(BuildContext context)
  class _StarClipper (line 1420) | class _StarClipper extends CustomClipper<Rect> {
    method getClip (line 1426) | Rect getClip(Size size)
    method shouldReclip (line 1431) | bool shouldReclip(covariant CustomClipper<Rect> oldClipper)
  class RatingWidget (line 1436) | class RatingWidget extends StatefulWidget {
    method createState (line 1469) | State<RatingWidget> createState()
  class _RatingWidgetState (line 1472) | class _RatingWidgetState extends State<RatingWidget> {
    method build (line 1476) | Widget build(BuildContext context)
    method fullStars (line 1531) | int fullStars()
    method star (line 1535) | double star()
    method buildRow (line 1543) | List<Widget> buildRow()
    method buildNormalRow (line 1574) | List<Widget> buildNormalRow()
    method buildRowRating (line 1591) | Widget buildRowRating()
    method initState (line 1605) | void initState()
  class _SMClipper (line 1611) | class _SMClipper extends CustomClipper<Rect> {
    method getClip (line 1617) | Rect getClip(Size size)
    method shouldReclip (line 1622) | bool shouldReclip(_SMClipper oldClipper)
  class SimpleComicTile (line 1627) | class SimpleComicTile extends StatelessWidget {
    method build (line 1640) | Widget build(BuildContext context)

FILE: lib/components/custom_slider.dart
  class _SliderDefaultsM3 (line 5) | class _SliderDefaultsM3 extends SliderThemeData {
  class CustomSlider (line 72) | class CustomSlider extends StatefulWidget {
    method createState (line 90) | State<CustomSlider> createState()
  class _CustomSliderState (line 93) | class _CustomSliderState extends State<CustomSlider> {
    method initState (line 97) | void initState()
    method didUpdateWidget (line 103) | void didUpdateWidget(CustomSlider oldWidget)
    method build (line 113) | Widget build(BuildContext context)

FILE: lib/components/effects.dart
  class BlurEffect (line 3) | class BlurEffect extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: lib/components/flyout.dart
  class FlyoutController (line 6) | class FlyoutController {
    method show (line 9) | void show()
  class Flyout (line 17) | class Flyout extends StatefulWidget {
    method createState (line 53) | State<Flyout> createState()
    method of (line 55) | FlyoutState of(BuildContext context)
  class FlyoutState (line 60) | class FlyoutState extends State<Flyout> {
    method initState (line 62) | void initState()
    method didChangeDependencies (line 70) | void didChangeDependencies()
    method build (line 78) | Widget build(BuildContext context)
    method show (line 98) | void show()
    method transition (line 123) | Widget transition(BuildContext context, Animation<double> animation,
  class FlyoutContent (line 170) | class FlyoutContent extends StatelessWidget {
    method build (line 181) | Widget build(BuildContext context)

FILE: lib/components/gesture.dart
  class MouseBackDetector (line 3) | class MouseBackDetector extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)
  class AnimatedTapRegion (line 25) | class AnimatedTapRegion extends StatefulWidget {
    method createState (line 40) | State<AnimatedTapRegion> createState()
  class _AnimatedTapRegionState (line 43) | class _AnimatedTapRegionState extends State<AnimatedTapRegion> {
    method build (line 47) | Widget build(BuildContext context)

FILE: lib/components/image.dart
  class AnimatedImage (line 3) | class AnimatedImage extends StatefulWidget {
    method clear (line 69) | void clear()
    method createState (line 72) | State<AnimatedImage> createState()
  class _AnimatedImageState (line 75) | class _AnimatedImageState extends State<AnimatedImage>
    method clear (line 90) | clear()
    method initState (line 93) | void initState()
    method dispose (line 100) | void dispose()
    method didChangeDependencies (line 111) | void didChangeDependencies()
    method didUpdateWidget (line 125) | void didUpdateWidget(AnimatedImage oldWidget)
    method didChangeAccessibilityFeatures (line 133) | void didChangeAccessibilityFeatures()
    method reassemble (line 141) | void reassemble()
    method _updateInvertColors (line 146) | void _updateInvertColors()
    method _resolveImage (line 151) | void _resolveImage()
    method _getListener (line 168) | ImageStreamListener _getListener({bool recreateListener = false})
    method _handleImageFrame (line 186) | void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall)
    method _handleImageChunk (line 196) | void _handleImageChunk(ImageChunkEvent event)
    method _replaceImage (line 203) | void _replaceImage({required ImageInfo? info})
    method _updateSourceStream (line 213) | void _updateSourceStream(ImageStream newStream)
    method _listenToStream (line 240) | void _listenToStream()
    method _stopListeningToStream (line 259) | void _stopListeningToStream({bool keepStreamAlive = false})
    method build (line 275) | Widget build(BuildContext context)
    method debugFillProperties (line 337) | void debugFillProperties(DiagnosticPropertiesBuilder description)
  class ImagePart (line 349) | class ImagePart {
  class ImagePainter (line 363) | class ImagePainter extends CustomPainter {
    method paint (line 378) | void paint(Canvas canvas, Size size)
    method shouldRepaint (line 392) | bool shouldRepaint(covariant CustomPainter oldDelegate)

FILE: lib/components/js_ui.dart
  class JsUiApi (line 11) | mixin class JsUiApi {
    method handleUIMessage (line 14) | dynamic handleUIMessage(Map<String, dynamic> message)
    method _showDialog (line 61) | Future<void> _showDialog(Map<String, dynamic> message)
    method _showLoading (line 105) | int _showLoading(JSInvokable? onCancel)
    method _cancelLoading (line 125) | void _cancelLoading(int id)
    method _showInputDialog (line 130) | Future<String?> _showInputDialog(String title, JSInvokable? validator,...
    method _showSelectDialog (line 166) | Future<int?> _showSelectDialog(
  class _JSCallbackButton (line 186) | class _JSCallbackButton extends StatefulWidget {
    method createState (line 203) | State<_JSCallbackButton> createState()
  class _JSCallbackButtonState (line 206) | class _JSCallbackButtonState extends State<_JSCallbackButton> {
    method onClick (line 209) | void onClick()
    method build (line 227) | Widget build(BuildContext context)

FILE: lib/components/layout.dart
  class SliverGridViewWithFixedItemHeight (line 3) | class SliverGridViewWithFixedItemHeight extends StatelessWidget {
    method build (line 17) | Widget build(BuildContext context)
    method calcChildAspectRatio (line 29) | double calcChildAspectRatio(double width)
  class SliverGridDelegateWithFixedHeight (line 39) | class SliverGridDelegateWithFixedHeight extends SliverGridDelegate {
    method getLayout (line 50) | SliverGridLayout getLayout(SliverConstraints constraints)
    method shouldRelayout (line 66) | bool shouldRelayout(covariant SliverGridDelegate oldDelegate)
  class SliverGridDelegateWithComics (line 76) | class SliverGridDelegateWithComics extends SliverGridDelegate {
    method getLayout (line 84) | SliverGridLayout getLayout(SliverConstraints constraints)
    method getDetailedModeLayout (line 98) | SliverGridLayout getDetailedModeLayout(
    method getBriefModeLayout (line 114) | SliverGridLayout getBriefModeLayout(
    method shouldRelayout (line 142) | bool shouldRelayout(covariant SliverGridDelegate oldDelegate)
  class SliverLazyToBoxAdapter (line 152) | class SliverLazyToBoxAdapter extends StatelessWidget {
    method build (line 159) | Widget build(BuildContext context)
  class SliverAnimatedVisibility (line 167) | class SliverAnimatedVisibility extends StatelessWidget {
    method build (line 179) | Widget build(BuildContext context)

FILE: lib/components/loading.dart
  class NetworkError (line 3) | class NetworkError extends StatelessWidget {
    method build (line 24) | Widget build(BuildContext context)
  class ListLoadingIndicator (line 99) | class ListLoadingIndicator extends StatelessWidget {
    method build (line 103) | Widget build(BuildContext context)
  class SliverListLoadingIndicator (line 112) | class SliverListLoadingIndicator extends StatelessWidget {
    method build (line 116) | Widget build(BuildContext context)
  class LoadingState (line 125) | abstract class LoadingState<T extends StatefulWidget, S extends Object>
    method loadData (line 133) | Future<Res<S>> loadData()
    method loadDataWithRetry (line 135) | Future<Res<S>> loadDataWithRetry()
    method onDataLoaded (line 152) | FutureOr<void> onDataLoaded()
    method buildContent (line 154) | Widget buildContent(BuildContext context, S data)
    method buildFrame (line 156) | Widget? buildFrame(BuildContext context, Widget child)
    method buildLoading (line 158) | Widget buildLoading()
    method retry (line 166) | void retry()
    method buildError (line 187) | Widget buildError()
    method initState (line 193) | void initState()
    method build (line 216) | Widget build(BuildContext context)
  class MultiPageLoadingState (line 231) | abstract class MultiPageLoadingState<T extends StatefulWidget, S extends...
    method loadData (line 245) | Future<Res<List<S>>> loadData(int page)
    method buildFrame (line 247) | Widget? buildFrame(BuildContext context, Widget child)
    method buildContent (line 249) | Widget buildContent(BuildContext context, List<S> data)
    method nextPage (line 257) | void nextPage()
    method reset (line 283) | void reset()
    method firstLoad (line 294) | void firstLoad()
    method initState (line 318) | void initState()
    method buildLoading (line 323) | Widget buildLoading(BuildContext context)
    method buildError (line 329) | Widget buildError(BuildContext context, String error)
    method build (line 334) | Widget build(BuildContext context)
  class FiveDotLoadingAnimation (line 358) | class FiveDotLoadingAnimation extends StatefulWidget {
    method createState (line 362) | State<FiveDotLoadingAnimation> createState()
  class _FiveDotLoadingAnimationState (line 366) | class _FiveDotLoadingAnimationState extends State<FiveDotLoadingAnimation>
    method initState (line 371) | void initState()
    method dispose (line 381) | void dispose()
    method build (line 401) | Widget build(BuildContext context)
    method buildDot (line 414) | Widget buildDot(int index)

FILE: lib/components/menu.dart
  function showMenuX (line 3) | void showMenuX(BuildContext context, Offset location, List<MenuEntry> en...
  class _MenuRoute (line 7) | class _MenuRoute<T> extends PopupRoute<T> {
    method buildPage (line 26) | Widget buildPage(BuildContext context, Animation<double> animation,
    method buildEntry (line 84) | Widget buildEntry(MenuEntry entry, BuildContext context)
    method buildTransitions (line 119) | Widget buildTransitions(BuildContext context, Animation<double> animat...
  class MenuEntry (line 129) | class MenuEntry {

FILE: lib/components/message.dart
  function showToast (line 3) | void showToast({
  class _ToastOverlay (line 24) | class _ToastOverlay extends StatelessWidget {
    method build (line 34) | Widget build(BuildContext context)
  class OverlayWidget (line 82) | class OverlayWidget extends StatefulWidget {
    method createState (line 88) | State<OverlayWidget> createState()
  class OverlayWidgetState (line 91) | class OverlayWidgetState extends State<OverlayWidget> {
    method addOverlay (line 96) | void addOverlay(OverlayEntry entry)
    method remove (line 103) | void remove(OverlayEntry entry)
    method removeAll (line 109) | void removeAll()
    method build (line 117) | Widget build(BuildContext context)
  function showDialogMessage (line 125) | void showDialogMessage(BuildContext context, String title, String message)
  function showConfirmDialog (line 141) | Future<void> showConfirmDialog({
  class LoadingDialogController (line 170) | class LoadingDialogController {
    method close (line 183) | void close()
    method setProgress (line 195) | void setProgress(double? value)
    method setMessage (line 202) | void setMessage(String message)
  function showLoadingDialog (line 210) | LoadingDialogController showLoadingDialog(
  class ContentDialog (line 274) | class ContentDialog extends StatelessWidget {
    method build (line 292) | Widget build(BuildContext context)
  function showInputDialog (line 353) | Future<void> showInputDialog({
  function showInfoDialog (line 432) | void showInfoDialog({
  function showSelectDialog (line 455) | Future<int?> showSelectDialog({

FILE: lib/components/navigation_bar.dart
  class PaneItemEntry (line 3) | class PaneItemEntry {
  class PaneActionEntry (line 17) | class PaneActionEntry {
  class NaviPane (line 31) | class NaviPane extends StatefulWidget {
    method createState (line 58) | State<NaviPane> createState()
    method of (line 60) | NaviPaneState of(BuildContext context)
  type NaviItemTapListener (line 65) | typedef NaviItemTapListener = void Function(int);
  class NaviPaneState (line 67) | class NaviPaneState extends State<NaviPane>
    method addNaviItemTapListener (line 85) | void addNaviItemTapListener(NaviItemTapListener listener)
    method removeNaviItemTapListener (line 89) | void removeNaviItemTapListener(NaviItemTapListener listener)
    method onNavigatorStateChange (line 104) | void onNavigatorStateChange()
    method updatePage (line 108) | void updatePage(int index)
    method initState (line 125) | void initState()
    method dispose (line 137) | void dispose()
    method targetFormContext (line 143) | double targetFormContext(BuildContext context)
    method onRebuild (line 157) | void onRebuild(BuildContext context)
    method build (line 173) | Widget build(BuildContext context)
    method buildMainView (line 227) | Widget buildMainView()
    method buildMainViewContent (line 248) | Widget buildMainViewContent()
    method buildTop (line 252) | Widget buildTop()
    method buildBottom (line 279) | Widget buildBottom()
    method buildLeft (line 311) | Widget buildLeft()
  class _SideNaviWidget (line 362) | class _SideNaviWidget extends StatelessWidget {
    method build (line 380) | Widget build(BuildContext context)
  class _PaneActionWidget (line 404) | class _PaneActionWidget extends StatelessWidget {
    method build (line 416) | Widget build(BuildContext context)
  class _SingleBottomNaviWidget (line 435) | class _SingleBottomNaviWidget extends StatefulWidget {
    method createState (line 450) | State<_SingleBottomNaviWidget> createState()
  class _SingleBottomNaviWidgetState (line 454) | class _SingleBottomNaviWidgetState extends State<_SingleBottomNaviWidget>
    method dispose (line 461) | void dispose()
    method didUpdateWidget (line 467) | void didUpdateWidget(covariant _SingleBottomNaviWidget oldWidget)
    method initState (line 479) | void initState()
    method build (line 489) | Widget build(BuildContext context)
    method buildContent (line 507) | Widget buildContent()
  class NaviObserver (line 539) | class NaviObserver extends NavigatorObserver implements Listenable {
    method didPop (line 553) | void didPop(Route route, Route? previousRoute)
    method didPush (line 559) | void didPush(Route route, Route? previousRoute)
    method didRemove (line 565) | void didRemove(Route route, Route? previousRoute)
    method didReplace (line 571) | void didReplace({Route? newRoute, Route? oldRoute})
    method addListener (line 582) | void addListener(VoidCallback listener)
    method removeListener (line 587) | void removeListener(VoidCallback listener)
    method notifyListeners (line 591) | void notifyListeners()
  class _NaviPopScope (line 598) | class _NaviPopScope extends StatelessWidget {
    method build (line 612) | Widget build(BuildContext context)
  class _NaviMainView (line 637) | class _NaviMainView extends StatefulWidget {
    method createState (line 643) | State<_NaviMainView> createState()
  class _NaviMainViewState (line 646) | class _NaviMainViewState extends State<_NaviMainView> {
    method initState (line 650) | void initState()
    method build (line 658) | Widget build(BuildContext context)

FILE: lib/components/pop_up_widget.dart
  class PopUpWidget (line 3) | class PopUpWidget<T> extends PopupRoute<T> {
    method buildPage (line 18) | Widget buildPage(BuildContext context, Animation<double> animation,
    method buildTransitions (line 73) | Widget buildTransitions(BuildContext context, Animation<double> animat...
  class PopupIndicatorWidget (line 84) | class PopupIndicatorWidget extends InheritedWidget {
    method updateShouldNotify (line 88) | bool updateShouldNotify(covariant InheritedWidget oldWidget)
    method maybeOf (line 90) | PopupIndicatorWidget? maybeOf(BuildContext context)
  function showPopUpWidget (line 95) | Future<T> showPopUpWidget<T>(BuildContext context, Widget widget)
  class PopUpWidgetScaffold (line 100) | class PopUpWidgetScaffold extends StatefulWidget {
    method createState (line 109) | State<PopUpWidgetScaffold> createState()
  class _PopUpWidgetScaffoldState (line 112) | class _PopUpWidgetScaffoldState extends State<PopUpWidgetScaffold> {
    method build (line 116) | Widget build(BuildContext context)

FILE: lib/components/rich_comment_content.dart
  class CommentContent (line 15) | class CommentContent extends StatelessWidget {
    method build (line 21) | Widget build(BuildContext context)
  class _Tag (line 30) | class _Tag {
    method merge (line 36) | TextSpan merge(TextSpan s, BuildContext context)
    method handleLink (line 104) | void handleLink(String link)
  class _CommentImage (line 115) | class _CommentImage {
  class RichCommentContent (line 122) | class RichCommentContent extends StatefulWidget {
    method createState (line 134) | State<RichCommentContent> createState()
  class _RichCommentContentState (line 137) | class _RichCommentContentState extends State<RichCommentContent> {
    method didChangeDependencies (line 143) | void didChangeDependencies()
    method isValidUrlChar (line 151) | bool isValidUrlChar(String char)
    method render (line 155) | void render()
    method writeBuffer (line 164) | void writeBuffer()
    method build (line 281) | Widget build(BuildContext context)

FILE: lib/components/scroll.dart
  class SmoothCustomScrollView (line 3) | class SmoothCustomScrollView extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)
  class SmoothScrollProvider (line 33) | class SmoothScrollProvider extends StatefulWidget {
    method createState (line 44) | State<SmoothScrollProvider> createState()
  class _SmoothScrollProviderState (line 47) | class _SmoothScrollProviderState extends State<SmoothScrollProvider> {
    method initState (line 63) | void initState()
    method didChangeDependencies (line 71) | void didChangeDependencies()
    method dispose (line 77) | void dispose()
    method build (line 83) | Widget build(BuildContext context)
  class ScrollState (line 183) | class ScrollState extends InheritedWidget {
    method of (line 197) | ScrollState of(BuildContext context)
    method maybeOf (line 203) | ScrollState? maybeOf(BuildContext context)
    method updateShouldNotify (line 208) | bool updateShouldNotify(ScrollState oldWidget)
  class AppScrollBar (line 213) | class AppScrollBar extends StatefulWidget {
    method createState (line 228) | State<AppScrollBar> createState()
  class _AppScrollBarState (line 231) | class _AppScrollBarState extends State<AppScrollBar> {
    method initState (line 249) | void initState()
    method dispose (line 265) | void dispose()
    method _showScrollbar (line 272) | void _showScrollbar()
    method _scheduleHide (line 281) | void _scheduleHide()
    method onUpdate (line 292) | void onUpdate(DragUpdateDetails details)
    method onChanged (line 307) | void onChanged()
    method build (line 332) | Widget build(BuildContext context)
  class _ScrollIndicatorPainter (line 392) | class _ScrollIndicatorPainter extends CustomPainter {
    method paint (line 403) | void paint(Canvas canvas, Size size)
    method shouldRepaint (line 426) | bool shouldRepaint(covariant CustomPainter oldDelegate)

FILE: lib/components/select.dart
  class Select (line 3) | class Select extends StatelessWidget {
    method build (line 21) | Widget build(BuildContext context)
  class FilterChipFixedWidth (line 80) | class FilterChipFixedWidth extends StatefulWidget {
    method createState (line 94) | State<FilterChipFixedWidth> createState()
  class _FilterChipFixedWidthState (line 97) | class _FilterChipFixedWidthState extends State<FilterChipFixedWidth> {
    method initState (line 107) | void initState()
    method measureSize (line 112) | void measureSize()
    method build (line 121) | Widget build(BuildContext context)
    method firstBuild (line 143) | Widget firstBuild()
    method buildContent (line 152) | Widget buildContent()
  class AnimatedCheckWidget (line 179) | class AnimatedCheckWidget extends AnimatedWidget {
    method build (line 189) | Widget build(BuildContext context)
  class AnimatedCheckIcon (line 212) | class AnimatedCheckIcon extends StatefulWidget {
    method createState (line 218) | State<AnimatedCheckIcon> createState()
  class _AnimatedCheckIconState (line 221) | class _AnimatedCheckIconState extends State<AnimatedCheckIcon>
    method initState (line 227) | void initState()
    method dispose (line 241) | void dispose()
    method build (line 247) | Widget build(BuildContext context)
  class OptionChip (line 255) | class OptionChip extends StatelessWidget {
    method build (line 269) | Widget build(BuildContext context)

FILE: lib/components/side_bar.dart
  class SideBarRoute (line 3) | class SideBarRoute<T> extends PopupRoute<T> {
    method didPush (line 38) | TickerFuture didPush()
    method buildModalBarrier (line 44) | Widget buildModalBarrier()
    method buildPage (line 73) | Widget buildPage(BuildContext context, Animation<double> animation,
    method buildTransitions (line 152) | Widget buildTransitions(BuildContext context, Animation<double> animat...
  function showSideBar (line 166) | Future<void> showSideBar(BuildContext context, Widget widget,

FILE: lib/components/window_frame.dart
  class WindowFrameController (line 13) | class WindowFrameController extends InheritedWidget {
    method updateShouldNotify (line 36) | bool updateShouldNotify(covariant InheritedWidget oldWidget)
  class WindowFrame (line 41) | class WindowFrame extends StatefulWidget {
    method createState (line 47) | State<WindowFrame> createState()
    method of (line 49) | WindowFrameController of(BuildContext context)
  type WindowCloseListener (line 54) | typedef WindowCloseListener = bool Function();
  class _WindowFrameState (line 56) | class _WindowFrameState extends State<WindowFrame> {
    method setWindowFrame (line 62) | void setWindowFrame(bool show)
    method addCloseListener (line 70) | void addCloseListener(WindowCloseListener listener)
    method removeCloseListener (line 75) | void removeCloseListener(WindowCloseListener listener)
    method _onClose (line 79) | void _onClose()
    method build (line 89) | Widget build(BuildContext context)
  class _WindowButtons (line 178) | class _WindowButtons extends StatefulWidget {
    method createState (line 184) | State<_WindowButtons> createState()
  class _WindowButtonsState (line 187) | class _WindowButtonsState extends State<_WindowButtons> with WindowListe...
    method initState (line 191) | void initState()
    method dispose (line 204) | void dispose()
    method onWindowMaximize (line 210) | void onWindowMaximize()
    method onWindowUnmaximize (line 218) | void onWindowUnmaximize()
    method build (line 226) | Widget build(BuildContext context)
  class WindowButton (line 284) | class WindowButton extends StatefulWidget {
    method createState (line 301) | State<WindowButton> createState()
  class _WindowButtonState (line 304) | class _WindowButtonState extends State<WindowButton> {
    method build (line 308) | Widget build(BuildContext context)
  class CloseIcon (line 331) | class CloseIcon extends StatelessWidget {
    method build (line 337) | Widget build(BuildContext context)
  class _ClosePainter (line 340) | class _ClosePainter extends _IconPainter {
    method paint (line 344) | void paint(Canvas canvas, Size size)
  class MaximizeIcon (line 352) | class MaximizeIcon extends StatelessWidget {
    method build (line 358) | Widget build(BuildContext context)
  class _MaximizePainter (line 361) | class _MaximizePainter extends _IconPainter {
    method paint (line 365) | void paint(Canvas canvas, Size size)
  class RestoreIcon (line 372) | class RestoreIcon extends StatelessWidget {
    method build (line 381) | Widget build(BuildContext context)
  class _RestorePainter (line 384) | class _RestorePainter extends _IconPainter {
    method paint (line 388) | void paint(Canvas canvas, Size size)
  class MinimizeIcon (line 401) | class MinimizeIcon extends StatelessWidget {
    method build (line 407) | Widget build(BuildContext context)
  class _MinimizePainter (line 410) | class _MinimizePainter extends _IconPainter {
    method paint (line 414) | void paint(Canvas canvas, Size size)
  class _IconPainter (line 422) | abstract class _IconPainter extends CustomPainter {
    method shouldRepaint (line 428) | bool shouldRepaint(covariant CustomPainter oldDelegate)
  class _AlignedPaint (line 431) | class _AlignedPaint extends StatelessWidget {
    method build (line 437) | Widget build(BuildContext context)
  function getPaint (line 444) | Paint getPaint(Color color, [bool isAntiAlias = false])
  class WindowPlacement (line 450) | class WindowPlacement {
    method applyToWindow (line 457) | Future<void> applyToWindow()
    method writeToFile (line 469) | Future<void> writeToFile()
    method loadFromFile (line 480) | Future<WindowPlacement> loadFromFile()
    method loop (line 515) | void loop()
    method validate (line 526) | bool validate(Rect rect)
  class VirtualWindowFrame (line 531) | class VirtualWindowFrame extends StatefulWidget {
    method createState (line 541) | State<StatefulWidget> createState()
  class _VirtualWindowFrameState (line 544) | class _VirtualWindowFrameState extends State<VirtualWindowFrame>
    method initState (line 551) | void initState()
    method dispose (line 557) | void dispose()
    method _buildVirtualWindowFrame (line 562) | Widget _buildVirtualWindowFrame(BuildContext context)
    method build (line 580) | Widget build(BuildContext context)
    method onWindowFocus (line 591) | void onWindowFocus()
    method onWindowBlur (line 598) | void onWindowBlur()
    method onWindowMaximize (line 605) | void onWindowMaximize()
    method onWindowUnmaximize (line 612) | void onWindowUnmaximize()
    method onWindowEnterFullScreen (line 619) | void onWindowEnterFullScreen()
    method onWindowLeaveFullScreen (line 626) | void onWindowLeaveFullScreen()
  function VirtualWindowFrameInit (line 634) | TransitionBuilder VirtualWindowFrameInit()
  function debug (line 642) | void debug()

FILE: lib/foundation/app.dart
  class _App (line 15) | class _App {
    method rootPop (line 70) | void rootPop()
    method pop (line 74) | void pop()
    method init (line 82) | Future<void> init()
    method initComponents (line 91) | Future<void> initComponents()
    method registerForceRebuild (line 102) | void registerForceRebuild(Function handler)
    method forceRebuild (line 106) | void forceRebuild()

FILE: lib/foundation/app_page_route.dart
  class AppPageRoute (line 13) | class AppPageRoute<T> extends PageRoute<T> with _AppRouteTransitionMixin{
    method buildContent (line 37) | Widget buildContent(BuildContext context)
  function buildContent (line 59) | Widget buildContent(BuildContext context)
  function canTransitionTo (line 71) | bool canTransitionTo(TransitionRoute<dynamic> nextRoute)
  function buildPage (line 83) | Widget buildPage(
  function _isPopGestureEnabled (line 103) | bool _isPopGestureEnabled<T>(PageRoute<T> route)
  function buildTransitions (line 119) | Widget buildTransitions(BuildContext context, Animation<double> animatio...
  function _startPopGesture (line 142) | IOSBackGestureController _startPopGesture(PageRoute<T> route)
  class IOSBackGestureController (line 147) | class IOSBackGestureController {
    method dragEnd (line 156) | void dragEnd(double velocity)
    method dragUpdate (line 200) | void dragUpdate(double delta)
  class IOSBackGestureDetector (line 205) | class IOSBackGestureDetector extends StatefulWidget {
    method createState (line 220) | State<IOSBackGestureDetector> createState()
  class _IOSBackGestureDetectorState (line 223) | class _IOSBackGestureDetectorState extends State<IOSBackGestureDetector> {
    method initState (line 229) | void initState()
    method dispose (line 243) | void dispose()
    method build (line 249) | Widget build(BuildContext context)
    method _isPointerInHorizontalScrollable (line 264) | bool _isPointerInHorizontalScrollable(Offset globalPosition)
    method _handleDragStart (line 300) | void _handleDragStart(DragStartDetails details)
    method _handleDragUpdate (line 307) | void _handleDragUpdate(DragUpdateDetails details)
    method _handleDragEnd (line 314) | void _handleDragEnd(DragEndDetails details)
    method _handleDragCancel (line 322) | void _handleDragCancel()
    method _convertToLogical (line 329) | double _convertToLogical(double value)
  class _BackSwipeRecognizer (line 337) | class _BackSwipeRecognizer extends OneSequenceGestureRecognizer {
    method addPointer (line 365) | void addPointer(PointerDownEvent event)
    method handleEvent (line 378) | void handleEvent(PointerEvent event)
    method _reset (line 437) | void _reset()
    method didStopTrackingLastPointer (line 450) | void didStopTrackingLastPointer(int pointer)
  class SlidePageTransitionBuilder (line 453) | class SlidePageTransitionBuilder extends PageTransitionsBuilder {
    method buildTransitions (line 455) | Widget buildTransitions<T>(

FILE: lib/foundation/appdata.dart
  class Appdata (line 12) | class Appdata with Init {
    method saveData (line 21) | Future<void> saveData([bool sync = true])
    method addSearchHistory (line 54) | void addSearchHistory(String keyword)
    method removeSearchHistory (line 65) | void removeSearchHistory(String keyword)
    method clearSearchHistory (line 70) | void clearSearchHistory()
    method toJson (line 75) | Map<String, dynamic> toJson()
    method splitField (line 79) | List<String> splitField(String merged)
    method syncData (line 98) | void syncData(Map<String, dynamic> data)
    method writeImplicitData (line 118) | void writeImplicitData()
    method doInit (line 132) | Future<void> doInit()
  class Settings (line 171) | class Settings with ChangeNotifier {
    method setEnabledComicSpecificSettings (line 253) | void setEnabledComicSpecificSettings(
    method isComicSpecificSettingsEnabled (line 261) | bool isComicSpecificSettingsEnabled(String? comicId, String? sourceKey)
    method getReaderSetting (line 269) | dynamic getReaderSetting(String comicId, String sourceKey, String key)
    method setReaderSetting (line 280) | void setReaderSetting(
    method resetComicReaderSettings (line 293) | void resetComicReaderSettings(String key)
    method setEnabledDeviceSpecificSettings (line 298) | void setEnabledDeviceSpecificSettings(bool enabled)
    method isDeviceSpecificSettingsEnabled (line 302) | bool isDeviceSpecificSettingsEnabled()
    method getDeviceReaderSetting (line 310) | dynamic getDeviceReaderSetting(String key)
    method setDeviceReaderSetting (line 318) | void setDeviceReaderSetting(String key, dynamic value)
    method resetDeviceReaderSettings (line 327) | void resetDeviceReaderSettings()
    method _getOrCreateDeviceId (line 336) | String _getOrCreateDeviceId()
    method toString (line 347) | String toString()

FILE: lib/foundation/cache_manager.dart
  class CacheManager (line 10) | class CacheManager {
    method _scanDir (line 26) | Future<int> _scanDir(Pointer<void> dbP, String dir)
    method setLimitSize (line 93) | void setLimitSize(int size)
    method writeCache (line 98) | Future<void> writeCache(String key, List<int> data,
    method findCache (line 122) | Future<File?> findCache(String key)
    method checkCacheIfRequired (line 169) | void checkCacheIfRequired()
    method checkCache (line 178) | Future<void> checkCache()
    method delete (line 245) | Future<void> delete(String key)
    method clear (line 272) | Future<void> clear()

FILE: lib/foundation/comic_source/category.dart
  class CategoryData (line 3) | class CategoryData {
  class CategoryButtonData (line 26) | class CategoryButtonData {
  class CategoryItem (line 37) | class CategoryItem {
  class BaseCategoryPart (line 45) | abstract class BaseCategoryPart {
  class FixedCategoryPart (line 56) | class FixedCategoryPart extends BaseCategoryPart {
  class RandomCategoryPart (line 70) | class RandomCategoryPart extends BaseCategoryPart {
    method _categories (line 81) | List<CategoryItem> _categories()
  class DynamicCategoryPart (line 100) | class DynamicCategoryPart extends BaseCategoryPart {
  function getCategoryDataWithKey (line 136) | CategoryData getCategoryDataWithKey(String key)

FILE: lib/foundation/comic_source/comic_source.dart
  class ComicSourceManager (line 35) | class ComicSourceManager with ChangeNotifier, Init {
    method all (line 44) | List<ComicSource> all()
    method find (line 46) | ComicSource? find(String key)
    method fromIntKey (line 49) | ComicSource? fromIntKey(int key)
    method doInit (line 54) | Future<void> doInit()
    method reload (line 76) | Future reload()
    method add (line 83) | void add(ComicSource source)
    method remove (line 88) | void remove(String key)
    method updateAvailableUpdates (line 98) | void updateAvailableUpdates(Map<String, String> updates)
    method notifyStateChange (line 105) | void notifyStateChange()
  class ComicSource (line 110) | class ComicSource {
    method all (line 111) | List<ComicSource> all()
    method find (line 113) | ComicSource? find(String key)
    method fromIntKey (line 115) | ComicSource? fromIntKey(int key)
    method loadData (line 206) | Future<void> loadData()
    method saveData (line 216) | Future<void> saveData()
    method reLogin (line 233) | Future<bool> reLogin()
  class AccountConfig (line 282) | class AccountConfig {
  class AccountInfoItem (line 313) | class AccountInfoItem {
  class LoadImageRequest (line 322) | class LoadImageRequest {
  class ExplorePageData (line 330) | class ExplorePageData {
  class ExplorePagePart (line 354) | class ExplorePagePart {
  type ExplorePageType (line 371) | enum ExplorePageType {
  type SearchFunction (line 378) | typedef SearchFunction =
  type SearchNextFunction (line 385) | typedef SearchNextFunction =
  class SearchPageData (line 392) | class SearchPageData {
  class SearchOptions (line 403) | class SearchOptions {
  type CategoryComicsLoader (line 417) | typedef CategoryComicsLoader =
  type CategoryOptionsLoader (line 425) | typedef CategoryOptionsLoader =
  class CategoryComicsData (line 431) | class CategoryComicsData {
  class RankingData (line 454) | class RankingData {
  class CategoryComicsOptions (line 465) | class CategoryComicsOptions {
  class LinkHandler (line 487) | class LinkHandler {
  class ArchiveDownloader (line 495) | class ArchiveDownloader {

FILE: lib/foundation/comic_source/favorites.dart
  type AddOrDelFavFunc (line 3) | typedef AddOrDelFavFunc = Future<Res<bool>> Function(
  class FavoriteData (line 6) | class FavoriteData {
  function getFavoriteData (line 58) | FavoriteData getFavoriteData(String key)
  function getFavoriteDataOrNull (line 63) | FavoriteData? getFavoriteDataOrNull(String key)

FILE: lib/foundation/comic_source/models.dart
  class Comment (line 3) | class Comment {
    method parseTime (line 14) | String? parseTime(dynamic value)
  class Comic (line 42) | class Comic {
    method toJson (line 79) | Map<String, dynamic> toJson()
  class ComicID (line 119) | class ComicID {
    method toString (line 136) | String toString()
  class ComicDetails (line 139) | class ComicDetails with HistoryMixin {
    method _generateMap (line 189) | Map<String, List<String>> _generateMap(Map<dynamic, dynamic> map)
    method toJson (line 227) | Map<String, dynamic> toJson()
    method findAuthor (line 269) | String? findAuthor()
    method _validateUpdateTime (line 287) | String? _validateUpdateTime(String time)
    method findUpdateTime (line 301) | String? findUpdateTime()
  class ArchiveInfo (line 323) | class ArchiveInfo {
  class ComicChapters (line 334) | class ComicChapters {
    method fromJsonOrNull (line 372) | fromJsonOrNull(dynamic json)
    method toJson (line 377) | Map<String, dynamic> toJson()
    method getGroup (line 403) | Map<String, String> getGroup(String group)
    method getGroupByIndex (line 408) | Map<String, String> getGroupByIndex(int index)
  class PageJumpTarget (line 456) | class PageJumpTarget {
    method parse (line 465) | PageJumpTarget parse(String sourceKey, dynamic value)
    method jump (line 537) | void jump(BuildContext context)

FILE: lib/foundation/comic_source/parser.dart
  function compareSemVer (line 4) | bool compareSemVer(String ver1, String ver2)
  class ComicSourceParseException (line 42) | class ComicSourceParseException implements Exception {
    method toString (line 48) | String toString()
  class ComicSourceParser (line 53) | class ComicSourceParser {
    method createAndParse (line 59) | Future<ComicSource> createAndParse(String js, String fileName)
    method parse (line 86) | Future<ComicSource> parse(String js, String filePath)
    method _checkExists (line 188) | bool _checkExists(String index)
    method _getValue (line 195) | dynamic _getValue(String index)
    method _loadAccountConfig (line 199) | AccountConfig? _loadAccountConfig()
    method logout (line 224) | void logout()
    method _loadExploreData (line 277) | List<ExplorePageData> _loadExploreData()
    method _loadCategoryData (line 430) | CategoryData? _loadCategoryData()
    method _loadCategoryComicsData (line 525) | CategoryComicsData? _loadCategoryComicsData()
    method _loadSearchData (line 695) | SearchPageData? _loadSearchData()
    method _parseLoadComicFunc (line 766) | LoadComicFunc? _parseLoadComicFunc()
    method _parseLoadComicPagesFunc (line 783) | LoadComicPagesFunc? _parseLoadComicPagesFunc()
    method _loadFavoriteData (line 797) | FavoriteData? _loadFavoriteData()
    method retryZone (line 806) | Future<Res<T>> retryZone<T>(Future<Res<T>> Function() func)
    method addOrDelFavFunc (line 822) | Future<Res<bool>> addOrDelFavFunc(
    method func (line 828) | func()
    method func (line 850) | Future<Res<List<Comic>>> func()
    method func (line 875) | Future<Res<List<Comic>>> func()
    method func (line 906) | Future<Res<Map<String, String>>> func()
    method _parseCommentsLoader (line 967) | CommentsLoader? _parseCommentsLoader()
    method _parseSendCommentFunc (line 986) | SendCommentFunc? _parseSendCommentFunc()
    method func (line 989) | Future<Res<bool>> func()
    method _parseChapterCommentsLoader (line 1015) | ChapterCommentsLoader? _parseChapterCommentsLoader()
    method _parseSendChapterCommentFunc (line 1034) | SendChapterCommentFunc? _parseSendChapterCommentFunc()
    method func (line 1037) | Future<Res<bool>> func()
    method _parseImageLoadingConfigFunc (line 1063) | GetImageLoadingConfigFunc? _parseImageLoadingConfigFunc()
    method _parseThumbnailLoadingConfigFunc (line 1079) | GetThumbnailLoadingConfigFunc? _parseThumbnailLoadingConfigFunc()
    method _parseThumbnailLoader (line 1095) | ComicThumbnailLoader? _parseThumbnailLoader()
    method _parseLikeFunc (line 1112) | LikeOrUnlikeComicFunc? _parseLikeFunc()
    method _parseVoteCommentFunc (line 1129) | VoteCommentFunc? _parseVoteCommentFunc()
    method _parseLikeCommentFunc (line 1146) | LikeCommentFunc? _parseLikeCommentFunc()
    method _parseSettings (line 1163) | Map<String, Map<String, dynamic>> _parseSettings()
    method _parseIdMatch (line 1189) | RegExp? _parseIdMatch()
    method _parseTranslation (line 1196) | Map<String, Map<String, String>>? _parseTranslation()
    method _parseClickTagEvent (line 1208) | HandleClickTagEvent? _parseClickTagEvent()
    method _parseTagSuggestionSelectFunc (line 1225) | TagSuggestionSelectFunc? _parseTagSuggestionSelectFunc()
    method _parseLinkHandler (line 1238) | LinkHandler? _parseLinkHandler()
    method linkToId (line 1243) | linkToId(String link)
    method _parseStarRatingFunc (line 1253) | StarRatingFunc? _parseStarRatingFunc()
    method _parseArchiveDownloader (line 1270) | ArchiveDownloader? _parseArchiveDownloader()

FILE: lib/foundation/comic_source/types.dart
  type ComicListBuilder (line 4) | typedef ComicListBuilder = Future<Res<List<Comic>>> Function(int page);
  type ComicListBuilderWithNext (line 7) | typedef ComicListBuilderWithNext =
  type LoginFunction (line 10) | typedef LoginFunction = Future<Res<bool>> Function(String, String);
  type LoadComicFunc (line 12) | typedef LoadComicFunc = Future<Res<ComicDetails>> Function(String id);
  type LoadComicPagesFunc (line 14) | typedef LoadComicPagesFunc =
  type CommentsLoader (line 17) | typedef CommentsLoader =
  type ChapterCommentsLoader (line 25) | typedef ChapterCommentsLoader =
  type SendCommentFunc (line 33) | typedef SendCommentFunc =
  type SendChapterCommentFunc (line 41) | typedef SendChapterCommentFunc =
  type GetImageLoadingConfigFunc (line 49) | typedef GetImageLoadingConfigFunc =
  type GetThumbnailLoadingConfigFunc (line 55) | typedef GetThumbnailLoadingConfigFunc =
  type ComicThumbnailLoader (line 58) | typedef ComicThumbnailLoader =
  type LikeOrUnlikeComicFunc (line 61) | typedef LikeOrUnlikeComicFunc =
  type LikeCommentFunc (line 66) | typedef LikeCommentFunc =
  type VoteCommentFunc (line 76) | typedef VoteCommentFunc =
  type HandleClickTagEvent (line 85) | typedef HandleClickTagEvent =
  type TagSuggestionSelectFunc (line 90) | typedef TagSuggestionSelectFunc = String Function(String namespace, Stri...
  type StarRatingFunc (line 93) | typedef StarRatingFunc = Future<Res<bool>> Function(String comicId, int ...

FILE: lib/foundation/comic_type.dart
  class ComicType (line 3) | class ComicType {

FILE: lib/foundation/context.dart
  function pop (line 7) | void pop<T>([T? result])
  function canPop (line 13) | bool canPop()
  function to (line 17) | Future<T?> to<T>(Widget Function() builder,)
  function toReplacement (line 22) | Future<void> toReplacement<T>(Widget Function() builder)
  function showMessage (line 41) | void showMessage({required String message})
  function useBackgroundColor (line 45) | Color useBackgroundColor(MaterialColor color)
  function useTextColor (line 49) | Color useTextColor(MaterialColor color)

FILE: lib/foundation/favorites.dart
  function _getTimeString (line 20) | String _getTimeString(DateTime time)
  class FavoriteItem (line 24) | class FavoriteItem implements Comic {
    method toString (line 67) | String toString()
    method toJson (line 110) | Map<String, dynamic> toJson()
    method fromJson (line 121) | FavoriteItem fromJson(Map<String, dynamic> json)
  class FavoriteItemWithFolderInfo (line 147) | class FavoriteItemWithFolderInfo extends FavoriteItem {
  class FavoriteItemWithUpdateInfo (line 161) | class FavoriteItemWithUpdateInfo extends FavoriteItem {
  class LocalFavoritesManager (line 205) | class LocalFavoritesManager with ChangeNotifier {
    method folderComics (line 223) | int folderComics(String folder)
    method init (line 227) | Future<void> init()
    method initCounts (line 278) | void initCounts()
    method refreshHashedIds (line 288) | void refreshHashedIds()
    method reduceHashedId (line 295) | void reduceHashedId(String id, int type)
    method _initHashedIds (line 306) | Future<Map<int, int>> _initHashedIds(
    method find (line 326) | List<String> find(String id, ComicType type)
    method findWithModel (line 340) | Future<List<String>> findWithModel(FavoriteItem item)
    method _getTablesWithDB (line 354) | List<String> _getTablesWithDB()
    method _getFolderNamesWithDB (line 362) | List<String> _getFolderNamesWithDB()
    method updateOrder (line 384) | void updateOrder(List<String> folders)
    method count (line 394) | int count(String folderName)
    method maxValue (line 403) | int maxValue(String folder)
    method minValue (line 410) | int minValue(String folder)
    method getFolderComics (line 417) | List<FavoriteItem> getFolderComics(String folder)
    method _getFolderComicsAsync (line 425) | Future<List<FavoriteItem>> _getFolderComicsAsync(
    method getFolderComicsAsync (line 438) | Future<List<FavoriteItem>> getFolderComicsAsync(String folder)
    method getAllComics (line 442) | List<FavoriteItem> getAllComics()
    method _getAllComicsAsync (line 453) | Future<List<FavoriteItem>> _getAllComicsAsync(
    method getAllComicsAsync (line 469) | Future<List<FavoriteItem>> getAllComicsAsync()
    method addTagTo (line 473) | void addTagTo(String folder, String id, String tag)
    method allComics (line 482) | List<FavoriteItemWithFolderInfo> allComics()
    method existsFolder (line 494) | bool existsFolder(String name)
    method createFolder (line 499) | String createFolder(String name, [bool renameWhenInvalidName = false])
    method linkFolderToNetwork (line 542) | void linkFolderToNetwork(String folder, String source, String networkF...
    method isLinkedToNetworkFolder (line 549) | bool isLinkedToNetworkFolder(
    method findLinked (line 558) | (String?, String?) findLinked(String folder)
    method comicExists (line 569) | bool comicExists(String folder, String id, ComicType type)
    method getComic (line 577) | FavoriteItem getComic(String folder, String id, ComicType type)
    method _translateTags (line 588) | String _translateTags(List<String> tags)
    method addComic (line 601) | bool addComic(String folder, FavoriteItem comic,
    method moveFavorite (line 663) | void moveFavorite(
    method batchMoveFavorites (line 696) | void batchMoveFavorites(
    method batchCopyFavorites (line 739) | void batchCopyFavorites(
    method deleteFolder (line 778) | void deleteFolder(String name)
    method deleteComicWithId (line 791) | void deleteComicWithId(String folder, String id, ComicType type)
    method batchDeleteComics (line 806) | void batchDeleteComics(String folder, List<FavoriteItem> comics)
    method batchDeleteComicsInAllFolders (line 833) | void batchDeleteComicsInAllFolders(List<ComicID> comics)
    method removeInvalid (line 860) | Future<int> removeInvalid()
    method clearAll (line 877) | Future<void> clearAll()
    method reorder (line 883) | void reorder(List<FavoriteItem> newFolder, String folder)
    method rename (line 910) | void rename(String before, String after)
    method onRead (line 936) | void onRead(String id, ComicType type)
    method searchInFolder (line 982) | List<FavoriteItem> searchInFolder(String folder, String keyword)
    method test (line 991) | bool test(FavoriteItem comic, String keyword)
    method search (line 1009) | List<FavoriteItem> search(String keyword)
    method test (line 1027) | bool test(FavoriteItem comic, String keyword)
    method editTags (line 1052) | void editTags(String id, String folder, List<String> tags)
    method isExist (line 1061) | bool isExist(String id, ComicType type)
    method updateInfo (line 1066) | void updateInfo(String folder, FavoriteItem comic, [bool notify = true])
    method folderToJson (line 1084) | String folderToJson(String folder)
    method fromJson (line 1095) | void fromJson(String json)
    method prepareTableForFollowUpdates (line 1118) | void prepareTableForFollowUpdates(String table, [bool clearData = true])
    method updateUpdateTime (line 1149) | void updateUpdateTime(
    method updateCheckTime (line 1173) | void updateCheckTime(
    method countUpdates (line 1185) | int countUpdates(String folder)
    method getUpdates (line 1192) | List<FavoriteItemWithUpdateInfo> getUpdates(String folder)
    method getComicsWithUpdatesInfo (line 1212) | List<FavoriteItemWithUpdateInfo> getComicsWithUpdatesInfo(String folder)
    method markAsRead (line 1231) | void markAsRead(String id, ComicType type)
    method close (line 1243) | void close()
    method notifyChanges (line 1247) | void notifyChanges()

FILE: lib/foundation/follow_updates.dart
  class ComicUpdateResult (line 7) | class ComicUpdateResult {
  function updateComic (line 14) | Future<ComicUpdateResult> updateComic(
  class UpdateProgress (line 75) | class UpdateProgress {
  function updateFolderBase (line 87) | void updateFolderBase(
  function updateFolder (line 172) | Stream<UpdateProgress> updateFolder(String folder, bool ignoreCheckTime)
  function getUpdatedComicsAsJson (line 178) | Future<String> getUpdatedComicsAsJson(String folder)

FILE: lib/foundation/global_state.dart
  class GlobalState (line 3) | abstract class GlobalState {
    method register (line 6) | void register(State state, [Object? key])
    method find (line 10) | T find<T extends State>([Object? key])
    method findOrNull (line 19) | T? findOrNull<T extends State>([Object? key])
    method unregister (line 28) | void unregister(State state, [Object? key])
  class Pair (line 34) | class Pair<K, V> {
  class AutomaticGlobalState (line 41) | abstract class AutomaticGlobalState<T extends StatefulWidget>
    method initState (line 45) | void initState()
    method dispose (line 52) | void dispose()
    method update (line 59) | void update()
    method refresh (line 63) | void refresh()

FILE: lib/foundation/history.dart
  type HistoryType (line 25) | typedef HistoryType = ComicType;
  class HistoryMixin (line 27) | abstract mixin class HistoryMixin {
  class History (line 41) | class History implements Comic {
    method toString (line 107) | String toString()
    method toJson (line 176) | Map<String, dynamic> toJson()
  class HistoryManager (line 181) | class HistoryManager with ChangeNotifier {
    method init (line 201) | Future<void> init()
    method _addHistoryAsync (line 238) | Future<void> _addHistoryAsync(int dbAddr, History newItem)
    method addHistoryAsync (line 260) | Future<void> addHistoryAsync(History newItem)
    method addHistory (line 283) | void addHistory(History newItem)
    method clearHistory (line 309) | void clearHistory()
    method clearUnfavoritedHistory (line 315) | void clearUnfavoritedHistory()
    method remove (line 340) | void remove(String id, ComicType type)
    method updateCache (line 349) | void updateCache()
    method find (line 364) | History? find(String id, ComicType type)
    method getAll (line 385) | List<History> getAll()
    method getRecent (line 394) | List<History> getRecent()
    method count (line 404) | int count()
    method close (line 411) | void close()
    method batchDeleteHistories (line 416) | void batchDeleteHistories(List<ComicID> histories)
    method refreshHistoryInfo (line 438) | Future<bool> refreshHistoryInfo(History history)
    method _refreshSingleHistory (line 449) | Future<bool> _refreshSingleHistory(History history)
    method refreshAllHistoriesStream (line 500) | Stream<RefreshProgress> refreshAllHistoriesStream()
    method _refreshAllHistoriesBase (line 506) | void _refreshAllHistoriesBase(
  class RefreshProgress (line 581) | class RefreshProgress {

FILE: lib/foundation/image_favorites.dart
  class ImageFavorite (line 3) | class ImageFavorite {
    method toJson (line 24) | Map<String, dynamic> toJson()
    method copyWith (line 47) | ImageFavorite copyWith({
  class ImageFavoritesEp (line 83) | class ImageFavoritesEp {
    method toJson (line 104) | Map<String, dynamic> toJson()
  class ImageFavoritesComic (line 115) | class ImageFavoritesComic {
  class ImageFavoriteManager (line 215) | class ImageFavoriteManager with ChangeNotifier {
    method init (line 227) | void init()
    method addOrUpdateOrDelete (line 245) | void addOrUpdateOrDelete(ImageFavoritesComic favorite, [bool notify = ...
    method has (line 314) | bool has(String id, String sourceKey, String eid, int page, int ep)
    method getAll (line 326) | List<ImageFavoritesComic> getAll([String? keyword])
    method deleteImageFavorite (line 351) | void deleteImageFavorite(Iterable<ImageFavorite> imageFavoriteList)
    method search (line 388) | List<ImageFavoritesComic> search(String keyword)
    method computeImageFavorites (line 395) | Future<ImageFavoritesComputed> computeImageFavorites()
    method _computeImageFavorites (line 412) | ImageFavoritesComputed _computeImageFavorites()
    method validateTag (line 475) | validateTag(String tag)
    method find (line 501) | ImageFavoritesComic? find(String id, String sourceKey)
  class TextWithCount (line 513) | class TextWithCount {
  class ImageFavoritesComputed (line 520) | class ImageFavoritesComputed {

FILE: lib/foundation/image_provider/base_image_provider.dart
  class BaseImageProvider (line 11) | abstract class BaseImageProvider<T extends BaseImageProvider<T>>
    method _getTargetSize (line 17) | TargetImageSize _getTargetSize(int width, int height)
    method loadImage (line 36) | ImageStreamCompleter loadImage(T key, ImageDecoderCallback decode)
    method _loadBufferAsync (line 52) | Future<ui.Codec> _loadBufferAsync(
    method load (line 138) | Future<Uint8List> load(
    method toString (line 154) | String toString()
  type FileDecoderCallback (line 161) | typedef FileDecoderCallback = Future<ui.Codec> Function(Uint8List);
  class _ImageLoadingStopException (line 163) | class _ImageLoadingStopException implements Exception {

FILE: lib/foundation/image_provider/cached_image.dart
  class CachedImageProvider (line 11) | class CachedImageProvider
    method load (line 39) | Future<Uint8List> load(chunkEvents, checkStop)
    method obtainKey (line 86) | Future<CachedImageProvider> obtainKey(ImageConfiguration configuration)

FILE: lib/foundation/image_provider/history_image_provider.dart
  class HistoryImageProvider (line 10) | class HistoryImageProvider
    method load (line 20) | Future<Uint8List> load(chunkEvents, checkStop)
    method obtainKey (line 53) | Future<HistoryImageProvider> obtainKey(ImageConfiguration configuration)

FILE: lib/foundation/image_provider/image_favorites_provider.dart
  class ImageFavoritesProvider (line 15) | class ImageFavoritesProvider
    method load (line 31) | Future<Uint8List> load(
    method writeToCache (line 67) | Future<void> writeToCache(Uint8List image)
    method readFromCache (line 76) | Future<Uint8List?> readFromCache()
    method deleteFromCache (line 86) | Future<void> deleteFromCache(ImageFavorite imageFavorite)
    method getImageFromLocal (line 94) | Future<Uint8List?> getImageFromLocal()
    method getImageFromNetwork (line 113) | Future<Uint8List> getImageFromNetwork(
    method getImageKey (line 134) | Future<String> getImageKey()
    method obtainKey (line 148) | Future<ImageFavoritesProvider> obtainKey(ImageConfiguration configurat...

FILE: lib/foundation/image_provider/local_comic_image.dart
  class LocalComicImageProvider (line 9) | class LocalComicImageProvider
    method load (line 19) | Future<Uint8List> load(chunkEvents, checkStop)
    method obtainKey (line 61) | Future<LocalComicImageProvider> obtainKey(ImageConfiguration configura...

FILE: lib/foundation/image_provider/local_favorite_image.dart
  class LocalFavoriteImageProvider (line 11) | class LocalFavoriteImageProvider
    method delete (line 22) | void delete(String id, int intKey)
    method load (line 31) | Future<Uint8List> load(chunkEvents, checkStop)
    method obtainKey (line 57) | Future<LocalFavoriteImageProvider> obtainKey(

FILE: lib/foundation/image_provider/reader_image.dart
  class ReaderImageProvider (line 12) | class ReaderImageProvider
    method load (line 31) | Future<Uint8List> load(chunkEvents, checkStop)
    method obtainKey (line 120) | Future<ReaderImageProvider> obtainKey(ImageConfiguration configuration)

FILE: lib/foundation/js_engine.dart
  class JavaScriptRuntimeException (line 37) | class JavaScriptRuntimeException implements Exception {
    method toString (line 43) | String toString()
  class JsEngine (line 48) | class JsEngine with _JSEngineApi, JsUiApi, Init {
    method reset (line 61) | void reset()
    method resetDio (line 67) | void resetDio()
    method cacheJsInit (line 74) | void cacheJsInit(Uint8List jsInit)
    method doInit (line 80) | Future<void> doInit()
    method _messageReceiver (line 112) | Object? _messageReceiver(dynamic message)
    method _http (line 214) | Future<Map<String, dynamic>> _http(Map<String, dynamic> req)
    method runCode (line 274) | dynamic runCode(String js, [String? name])
    method dispose (line 278) | void dispose()
  class _JSEngineApi (line 286) | mixin class _JSEngineApi {
    method handleHtmlCallback (line 291) | Object? handleHtmlCallback(Map<String, dynamic> data)
    method handleCookieCallback (line 360) | dynamic handleCookieCallback(Map<String, dynamic> data)
    method clearCookies (line 394) | void clearCookies(List<String> domains)
    method _convert (line 402) | Object? _convert(Map<String, dynamic> data)
    method _parsePrivateKey (line 527) | RSAPrivateKey _parsePrivateKey(String privateKeyString)
    method _processInBlocks (line 545) | Uint8List _processInBlocks(AsymmetricBlockCipher engine, Uint8List input)
    method _random (line 569) | num _random(num min, num max, String type)
  class DocumentWrapper (line 577) | class DocumentWrapper {
    method querySelector (line 586) | int? querySelector(String query)
    method querySelectorAll (line 593) | List<int> querySelectorAll(String query)
    method elementGetText (line 603) | String? elementGetText(int key)
    method elementGetAttributes (line 607) | Map<String, String> elementGetAttributes(int key)
    method elementGetInnerHTML (line 616) | String? elementGetInnerHTML(int key)
    method elementGetParent (line 620) | int? elementGetParent(int key)
    method elementQuerySelector (line 627) | int? elementQuerySelector(int key, String query)
    method elementQuerySelectorAll (line 634) | List<int> elementQuerySelectorAll(int key, String query)
    method elementGetChildren (line 644) | List<int> elementGetChildren(int key)
    method elementGetNodes (line 654) | List<int> elementGetNodes(int key)
    method nodeGetText (line 664) | String? nodeGetText(int key)
    method nodeType (line 668) | String nodeType(int key)
    method nodeToElement (line 678) | int? nodeToElement(int key)
    method getClassNames (line 686) | List<String> getClassNames(int key)
    method getId (line 690) | String? getId(int key)
    method getLocalName (line 694) | String? getLocalName(int key)
    method getElementById (line 698) | int? getElementById(String id)
    method getPreviousSibling (line 705) | int? getPreviousSibling(int key)
    method getNextSibling (line 712) | int? getNextSibling(int key)
  class JSAutoFreeFunction (line 720) | class JSAutoFreeFunction {
    method call (line 729) | dynamic call(List<dynamic> args)

FILE: lib/foundation/js_pool.dart
  class JSPool (line 8) | class JSPool {
    method init (line 19) | Future<void> init()
    method execute (line 30) | Future<dynamic> execute(String jsFunction, List<dynamic> args)
  class _IsolateJsEngineInitParam (line 42) | class _IsolateJsEngineInitParam {
  class IsolateJsEngine (line 50) | class IsolateJsEngine {
    method _onMessage (line 69) | void _onMessage(dynamic message)
    method _run (line 91) | void _run(_IsolateJsEngineInitParam params)
    method execute (line 121) | Future<dynamic> execute(String jsFunction, List<dynamic> args)
    method close (line 136) | void close()
  class Task (line 149) | class Task {
  class TaskResult (line 157) | class TaskResult {

FILE: lib/foundation/local.dart
  class LocalComic (line 19) | class LocalComic with HistoryMixin implements Comic {
    method toJson (line 94) | Map<String, dynamic> toJson()
    method read (line 110) | void read()
  class LocalManager (line 176) | class LocalManager with ChangeNotifier {
    method _checkNoMedia (line 192) | void _checkNoMedia()
    method setNewPath (line 202) | Future<String?> setNewPath(String newPath)
    method findDefaultPath (line 227) | Future<String> findDefaultPath()
    method _checkPathValidation (line 249) | Future<void> _checkPathValidation()
    method init (line 261) | Future<void> init()
    method findValidId (line 301) | String findValidId(ComicType type)
    method add (line 316) | Future<void> add(LocalComic comic, [String? id])
    method remove (line 340) | void remove(String id, ComicType comicType)
    method removeComic (line 348) | void removeComic(LocalComic comic)
    method getComics (line 353) | List<LocalComic> getComics(LocalSortType sortType)
    method find (line 364) | LocalComic? find(String id, ComicType comicType)
    method dispose (line 376) | void dispose()
    method getRecent (line 381) | List<LocalComic> getRecent()
    method findByName (line 397) | LocalComic? findByName(String name)
    method search (line 408) | List<LocalComic> search(String keyword)
    method getImages (line 417) | Future<List<String>> getImages(String id, ComicType type, Object ep)
    method isDownloaded (line 455) | bool isDownloaded(String id, ComicType type,
    method isDownloading (line 483) | bool isDownloading(String id, ComicType type)
    method findValidDirectory (line 488) | Future<Directory> findValidDirectory(
    method completeTask (line 502) | void completeTask(DownloadTask task)
    method removeTask (line 510) | void removeTask(DownloadTask task)
    method moveToFirst (line 516) | void moveToFirst(DownloadTask task)
    method saveCurrentDownloadingTasks (line 530) | Future<void> saveCurrentDownloadingTasks()
    method restoreDownloadingTasks (line 536) | void restoreDownloadingTasks()
    method addTask (line 554) | void addTask(DownloadTask task)
    method deleteComic (line 561) | void deleteComic(LocalComic c, [bool removeFileOnDisk = true])
    method deleteComicChapters (line 580) | void deleteComicChapters(LocalComic c, List<String> chapters)
    method batchDeleteComics (line 618) | void batchDeleteComics(List<LocalComic> comics, [bool removeFileOnDisk...
    method _deleteDirectories (line 661) | void _deleteDirectories(List<Directory> directories)
    method getChapterDirectoryName (line 676) | String getChapterDirectoryName(String name)
  type LocalSortType (line 692) | enum LocalSortType {

FILE: lib/foundation/log.dart
  class LogItem (line 6) | class LogItem {
  type LogLevel (line 18) | enum LogLevel { error, warning, info }
  class Log (line 20) | class Log {
    method printWarning (line 33) | void printWarning(String text)
    method printError (line 37) | void printError(String text)
    method addLog (line 43) | void addLog(LogLevel level, String title, String content)
    method info (line 90) | info(String title, String content)
    method warning (line 94) | warning(String title, String content)
    method error (line 98) | error(String title, Object content, [Object? stackTrace])
    method clear (line 106) | void clear()
    method toString (line 109) | String toString()

FILE: lib/foundation/res.dart
  class Res (line 1) | class Res<T> {
    method toString (line 23) | String toString()

FILE: lib/foundation/widget_utils.dart
  function padding (line 4) | Widget padding(EdgeInsetsGeometry padding)
  function paddingLeft (line 8) | Widget paddingLeft(double padding)
  function paddingRight (line 12) | Widget paddingRight(double padding)
  function paddingTop (line 16) | Widget paddingTop(double padding)
  function paddingBottom (line 20) | Widget paddingBottom(double padding)
  function paddingVertical (line 24) | Widget paddingVertical(double padding)
  function paddingHorizontal (line 28) | Widget paddingHorizontal(double padding)
  function paddingAll (line 32) | Widget paddingAll(double padding)
  function toCenter (line 36) | Widget toCenter()
  function toAlign (line 40) | Widget toAlign(AlignmentGeometry alignment)
  function sliverPadding (line 44) | Widget sliverPadding(EdgeInsetsGeometry padding)
  function sliverPaddingAll (line 48) | Widget sliverPaddingAll(double padding)
  function sliverPaddingVertical (line 52) | Widget sliverPaddingVertical(double padding)
  function sliverPaddingHorizontal (line 56) | Widget sliverPaddingHorizontal(double padding)
  function fixWidth (line 60) | Widget fixWidth(double width)
  function fixHeight (line 64) | Widget fixHeight(double height)
  function toSliver (line 68) | Widget toSliver()
  function withColor (line 113) | TextStyle withColor(Color? color)
  function toOpacity (line 117) | Color toOpacity(double opacity)

FILE: lib/headless.dart
  function cliPrint (line 13) | void cliPrint(Map<String, dynamic> data)
  function runHeadlessMode (line 17) | Future<void> runHeadlessMode(List<String> args)

FILE: lib/init.dart
  function wait (line 28) | Future<void> wait()
  function init (line 37) | Future<void> init()
  function _checkOldConfigs (line 79) | void _checkOldConfigs()
  function _checkAppUpdates (line 106) | Future<void> _checkAppUpdates()
  function checkUpdates (line 120) | void checkUpdates()

FILE: lib/main.dart
  function main (line 20) | void main(List<String> args)
  class MyApp (line 60) | class MyApp extends StatefulWidget {
    method createState (line 64) | State<MyApp> createState()
  class _MyAppState (line 67) | class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
    method initState (line 69) | void initState()
    method didChangeAppLifecycleState (line 82) | void didChangeAppLifecycleState(AppLifecycleState state)
    method forceRebuild (line 120) | void forceRebuild()
    method rebuild (line 121) | void rebuild(Element el)
    method translateColorSetting (line 130) | Color translateColorSetting()
    method getTheme (line 144) | ThemeData getTheme(
    method build (line 179) | Widget build(BuildContext context)
  class _SystemUiProvider (line 293) | class _SystemUiProvider extends StatelessWidget {
    method build (line 299) | Widget build(BuildContext context)

FILE: lib/network/app_dio.dart
  class MyLogInterceptor (line 18) | class MyLogInterceptor implements Interceptor {
    method onError (line 20) | void onError(DioException err, ErrorInterceptorHandler handler)
    method _getStatusCodeInfo (line 62) | String _getStatusCodeInfo(int? statusCode)
    method onResponse (line 72) | void onResponse(
    method onRequest (line 98) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
  class AppDio (line 128) | class AppDio with DioMixin {
    method request (line 143) | Future<Response<T>> request<T>(
  class RHttpAdapter (line 177) | class RHttpAdapter implements HttpClientAdapter {
    method _getOverrides (line 200) | Map<String, List<String>> _getOverrides()
    method close (line 217) | void close({bool force = false})
    method fetch (line 220) | Future<ResponseBody> fetch(
    method _getStatusMessage (line 262) | String _getStatusMessage(int statusCode)

FILE: lib/network/cache.dart
  class NetworkCache (line 4) | class NetworkCache {
  class NetworkCacheManager (line 27) | class NetworkCacheManager implements Interceptor {
    method getCache (line 38) | NetworkCache? getCache(Uri uri)
    method setCache (line 44) | void setCache(NetworkCache cache)
    method removeCache (line 56) | void removeCache(Uri uri)
    method clear (line 64) | void clear()
    method onError (line 70) | void onError(DioException err, ErrorInterceptorHandler handler)
    method onRequest (line 78) | void onRequest(
    method compareHeaders (line 137) | bool compareHeaders(Map<String, dynamic> a, Map<String, dynamic> b)
    method onResponse (line 183) | void onResponse(
    method _calculateSize (line 206) | int? _calculateSize(Object? data)

FILE: lib/network/cloudflare.dart
  class CloudflareException (line 14) | class CloudflareException implements DioException {
    method toString (line 20) | String toString()
    method fromString (line 24) | CloudflareException? fromString(String message)
    method copyWith (line 31) | DioException copyWith(
  class CloudflareInterceptor (line 63) | class CloudflareInterceptor extends Interceptor {
    method onRequest (line 65) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
    method onError (line 73) | void onError(DioException err, ErrorInterceptorHandler handler)
    method onResponse (line 82) | void onResponse(Response response, ResponseInterceptorHandler handler)
    method _check (line 93) | CloudflareException? _check(Response response)
  function passCloudflare (line 101) | void passCloudflare(CloudflareException e, void Function() onFinished)
  function saveCookies (line 105) | void saveCookies(Map<String, String> cookies)
  function check (line 164) | void check(InAppWebViewController controller)

FILE: lib/network/cookie_jar.dart
  class CookieJarSql (line 9) | class CookieJarSql {
    method init (line 18) | void init()
    method saveFromResponse (line 34) | void saveFromResponse(Uri uri, List<Cookie> cookies)
    method _loadWithDomain (line 58) | List<Cookie> _loadWithDomain(String domain)
    method _getAcceptedDomains (line 80) | List<String> _getAcceptedDomains(String host)
    method loadForRequest (line 89) | List<Cookie> loadForRequest(Uri uri)
    method _checkPathMatch (line 114) | bool _checkPathMatch(Uri uri, String? cookiePath)
    method saveFromResponseCookieHeader (line 134) | void saveFromResponseCookieHeader(Uri uri, List<String> cookieHeader)
    method loadForRequestCookieHeader (line 149) | String loadForRequestCookieHeader(Uri uri)
    method delete (line 166) | void delete(Uri uri, String name)
    method deleteUri (line 176) | void deleteUri(Uri uri)
    method deleteAll (line 186) | void deleteAll()
    method dispose (line 192) | void dispose()
  class SingleInstanceCookieJar (line 197) | class SingleInstanceCookieJar extends CookieJarSql {
    method createInstance (line 205) | Future<SingleInstanceCookieJar> createInstance()
  class CookieManagerSql (line 215) | class CookieManagerSql extends Interceptor {
    method onRequest (line 221) | void onRequest(RequestOptions options, RequestInterceptorHandler handler)
    method onResponse (line 233) | void onResponse(Response response, ResponseInterceptorHandler handler)
    method onError (line 240) | void onError(DioException err, ErrorInterceptorHandler handler)

FILE: lib/network/download.dart
  class DownloadTask (line 21) | abstract class DownloadTask with ChangeNotifier {
    method cancel (line 32) | void cancel()
    method pause (line 34) | void pause()
    method resume (line 36) | void resume()
    method toJson (line 48) | Map<String, dynamic> toJson()
    method toLocalComic (line 50) | LocalComic toLocalComic()
    method fromJson (line 56) | DownloadTask? fromJson(Map<String, dynamic> json)
  class ImagesDownloadTask (line 76) | class ImagesDownloadTask extends DownloadTask with _TransferSpeedMixin {
    method cancel (line 104) | void cancel()
    method pause (line 143) | void pause()
    method _scheduleTasks (line 195) | void _scheduleTasks()
    method resume (line 242) | void resume()
    method onNextSecond (line 416) | void onNextSecond(Timer t)
    method _setError (line 421) | void _setError(String message)
    method toJson (line 436) | Map<String, dynamic> toJson()
    method fromJson (line 453) | ImagesDownloadTask? fromJson(Map<String, dynamic> json)
    method toLocalComic (line 489) | LocalComic toLocalComic()
  function _runWithRetry (line 518) | Future<Res<T>> _runWithRetry<T>(Future<T> Function() task,
  class _ImageDownloadWrapper (line 533) | class _ImageDownloadWrapper {
    method cancel (line 560) | void cancel()
    method start (line 568) | void start()
    method wait (line 608) | Future<_ImageDownloadWrapper> wait()
  class _TransferSpeedMixin (line 618) | abstract mixin class _TransferSpeedMixin {
    method onData (line 627) | void onData(int length)
    method onNextSecond (line 635) | void onNextSecond(Timer t)
    method runRecorder (line 640) | void runRecorder()
    method stopRecorder (line 648) | void stopRecorder()
  class ArchiveDownloadTask (line 656) | class ArchiveDownloadTask extends DownloadTask {
    method _setError (line 678) | void _setError(String message)
    method cancel (line 687) | void cancel()
    method pause (line 722) | void pause()
    method resume (line 734) | void resume()
    method _extractArchive (line 805) | Future<void> _extractArchive(String archive, String outDir)
    method toJson (line 830) | Map<String, dynamic> toJson()
    method fromJson (line 839) | ArchiveDownloadTask? fromJson(Map<String, dynamic> json)
    method _findCover (line 849) | String _findCover()
    method toLocalComic (line 863) | LocalComic toLocalComic()

FILE: lib/network/file_downloader.dart
  class FileDownloader (line 9) | class FileDownloader {
    method _writeStatus (line 34) | Future<void> _writeStatus()
    method _readStatus (line 39) | Future<void> _readStatus()
    method _prepareFile (line 50) | Future<void> _prepareFile()
    method _createTasks (line 67) | Future<void> _createTasks()
    method start (line 97) | Stream<DownloadingStatus> start()
    method _reportStatus (line 103) | void _reportStatus(StreamController<DownloadingStatus> stream)
    method _download (line 107) | void _download(StreamController<DownloadingStatus> resultStream)
    method _scheduleDownload (line 171) | Future<void> _scheduleDownload()
    method _fetchBlock (line 195) | Future<void> _fetchBlock(_DownloadBlock block)
    method stop (line 251) | Future<void> stop()
  class DownloadingStatus (line 258) | class DownloadingStatus {
    method toString (line 276) | String toString()
  class _DownloadBlock (line 281) | class _DownloadBlock {
    method toString (line 290) | String toString()

FILE: lib/network/images.dart
  class ImageDownloader (line 12) | abstract class ImageDownloader {
    method loadThumbnail (line 13) | Stream<ImageDownloadProgress> loadThumbnail(
    method cancelAllLoadingImages (line 94) | void cancelAllLoadingImages()
    method loadComicImage (line 103) | Stream<ImageDownloadProgress> loadComicImage(
    method loadComicImageUnwrapped (line 119) | Stream<ImageDownloadProgress> loadComicImageUnwrapped(
    method _loadComicImage (line 124) | Stream<ImageDownloadProgress> _loadComicImage(
  class _StreamWrapper (line 246) | class _StreamWrapper<T> {
    method _listen (line 259) | void _listen()
    method cancel (line 303) | void cancel()
  class ImageDownloadProgress (line 312) | class ImageDownloadProgress {

FILE: lib/network/proxy.dart
  function getProxy (line 10) | Future<String?> getProxy()
  function _getProxy (line 21) | Future<String?> _getProxy()

FILE: lib/pages/aggregated_search_page.dart
  class AggregatedSearchPage (line 10) | class AggregatedSearchPage extends StatefulWidget {
    method createState (line 16) | State<AggregatedSearchPage> createState()
  class _AggregatedSearchPageState (line 19) | class _AggregatedSearchPageState extends State<AggregatedSearchPage> {
    method initState (line 27) | void initState()
    method build (line 53) | Widget build(BuildContext context)
  class _SliverSearchResult (line 74) | class _SliverSearchResult extends StatefulWidget {
    method createState (line 86) | State<_SliverSearchResult> createState()
  class _SliverSearchResultState (line 89) | class _SliverSearchResultState extends State<_SliverSearchResult>
    method load (line 103) | void load()
    method initState (line 137) | void initState()
    method buildPlaceHolder (line 142) | Widget buildPlaceHolder()
    method buildComic (line 154) | Widget buildComic(Comic c)
    method build (line 161) | Widget build(BuildContext context)

FILE: lib/pages/auth_page.dart
  class AuthPage (line 7) | class AuthPage extends StatefulWidget {
    method createState (line 13) | State<AuthPage> createState()
  class _AuthPageState (line 16) | class _AuthPageState extends State<AuthPage> {
    method initState (line 19) | void initState()
    method build (line 29) | Widget build(BuildContext context)
    method auth (line 57) | void auth()

FILE: lib/pages/categories_page.dart
  class CategoriesPage (line 13) | class CategoriesPage extends StatefulWidget {
    method createState (line 17) | State<CategoriesPage> createState()
  class _CategoriesPageState (line 20) | class _CategoriesPageState extends State<CategoriesPage>
    method onSettingsChanged (line 28) | void onSettingsChanged()
    method initState (line 49) | void initState()
    method addPage (line 66) | void addPage()
    method dispose (line 71) | void dispose()
    method buildEmpty (line 77) | Widget buildEmpty()
    method build (line 99) | Widget build(BuildContext context)
  type ClickTagCallback (line 141) | typedef ClickTagCallback = void Function(String, String?);
  class _CategoryPage (line 143) | class _CategoryPage extends StatelessWidget {
    method findComicSourceKey (line 150) | String findComicSourceKey()
    method build (line 160) | Widget build(BuildContext context)
    method buildTitle (line 210) | Widget buildTitle(String title)
    method buildTitleWithRefresh (line 220) | Widget buildTitleWithRefresh(String title, void Function() onRefresh)
    method buildTags (line 236) | Widget buildTags(List<CategoryItem> categories)
    method buildCategory (line 248) | Widget buildCategory(CategoryItem c)
    method buildTag (line 255) | Widget buildTag(String label, VoidCallback onClick)

FILE: lib/pages/category_comics_page.dart
  class CategoryComicsPage (line 7) | class CategoryComicsPage extends StatefulWidget {
    method createState (line 25) | State<CategoryComicsPage> createState()
  class _CategoryComicsPageState (line 28) | class _CategoryComicsPageState extends State<CategoryComicsPage> {
    method findData (line 36) | void findData()
    method resetOptionsValue (line 67) | void resetOptionsValue()
    method loadOptions (line 82) | void loadOptions()
    method initState (line 98) | void initState()
    method build (line 109) | Widget build(BuildContext context)
    method buildOptionItem (line 143) | Widget buildOptionItem(
    method buildOptions (line 161) | Widget buildOptions()

FILE: lib/pages/comic_details_page/actions.dart
  class _ComicPageActions (line 3) | abstract mixin class _ComicPageActions {
    method update (line 4) | void update()
    method likeOrUnlike (line 16) | void likeOrUnlike()
    method _toFavoriteItem (line 36) | FavoriteItem _toFavoriteItem()
    method openFavPanel (line 51) | void openFavPanel()
    method quickFavorite (line 73) | void quickFavorite()
    method share (line 89) | void share()
    method read (line 104) | void read([int? ep, int? page, int? group])
    method continueRead (line 125) | void continueRead()
    method onReadEnd (line 132) | void onReadEnd()
    method download (line 134) | void download()
    method onTapTag (line 298) | void onTapTag(String tag, String namespace)
    method showMoreActions (line 304) | void showMoreActions()
    method showComments (line 349) | void showComments()
    method starRating (line 359) | void starRating()

FILE: lib/pages/comic_details_page/chapters.dart
  class _ComicChapters (line 3) | class _ComicChapters extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)
  class _NormalComicChapters (line 18) | class _NormalComicChapters extends StatefulWidget {
    method createState (line 24) | State<_NormalComicChapters> createState()
  class _NormalComicChaptersState (line 27) | class _NormalComicChaptersState extends State<_NormalComicChapters> {
    method initState (line 39) | void initState()
    method didChangeDependencies (line 46) | void didChangeDependencies()
    method didUpdateWidget (line 53) | void didUpdateWidget(covariant _NormalComicChapters oldWidget)
    method build (line 61) | Widget build(BuildContext context)
  class _GroupedComicChapters (line 167) | class _GroupedComicChapters extends StatefulWidget {
    method createState (line 173) | State<_GroupedComicChapters> createState()
  class _GroupedComicChaptersState (line 176) | class _GroupedComicChaptersState extends State<_GroupedComicChapters>
    method initState (line 193) | void initState()
    method didChangeDependencies (line 205) | void didChangeDependencies()
    method onTabChange (line 217) | void onTabChange()
    method didUpdateWidget (line 226) | void didUpdateWidget(covariant _GroupedComicChapters oldWidget)
    method build (line 234) | Widget build(BuildContext context)

FILE: lib/pages/comic_details_page/comic_page.dart
  class ComicPage (line 45) | class ComicPage extends StatefulWidget {
    method createState (line 66) | State<ComicPage> createState()
  class _ComicPageState (line 69) | class _ComicPageState extends LoadingState<ComicPage, ComicDetails>
    method onReadEnd (line 83) | void onReadEnd()
    method buildLoading (line 92) | Widget buildLoading()
    method buildError (line 103) | Widget buildError()
    method initState (line 129) | void initState()
    method dispose (line 135) | void dispose()
    method update (line 141) | void update()
    method onScroll (line 148) | void onScroll()
    method buildContent (line 176) | Widget buildContent(BuildContext context, ComicDetails data)
    method loadData (line 212) | Future<Res<ComicDetails>> loadData()
    method onDataLoaded (line 260) | Future<void> onDataLoaded()
    method buildTitle (line 280) | Iterable<Widget> buildTitle()
    method buildActions (line 357) | Widget buildActions()
    method buildDescription (line 505) | Widget buildDescription()
    method buildInfo (line 524) | Widget buildInfo()
    method buildTag (line 535) | Widget buildTag({
    method formatTime (line 602) | String formatTime(String time)
    method buildWrap (line 622) | Widget buildWrap({required List<Widget> children})
    method buildChapters (line 698) | Widget buildChapters()
    method buildThumbnails (line 708) | Widget buildThumbnails()
    method buildRecommend (line 715) | Widget buildRecommend()
    method buildComments (line 727) | Widget buildComments()
    method _viewCover (line 734) | void _viewCover(BuildContext context)
    method _saveCover (line 750) | void _saveCover(BuildContext context)
  class _ActionButton (line 783) | class _ActionButton extends StatelessWidget {
    method build (line 812) | Widget build(BuildContext context)
  class _SelectDownloadChapter (line 853) | class _SelectDownloadChapter extends StatefulWidget {
    method createState (line 861) | State<_SelectDownloadChapter> createState()
  class _SelectDownloadChapterState (line 864) | class _SelectDownloadChapterState extends State<_SelectDownloadChapter> {
    method build (line 868) | Widget build(BuildContext context)
  class _ComicPageLoadingPlaceHolder (line 949) | class _ComicPageLoadingPlaceHolder extends StatelessWidget {
    method build (line 969) | Widget build(BuildContext context)
    method buildContainer (line 970) | Widget buildContainer(
    method buildImage (line 1034) | Widget buildImage(BuildContext context)

FILE: lib/pages/comic_details_page/comments_page.dart
  function _shouldBlockComment (line 3) | bool _shouldBlockComment(Comment comment)
  class CommentsPage (line 16) | class CommentsPage extends StatefulWidget {
    method createState (line 31) | State<CommentsPage> createState()
  class _CommentsPageState (line 34) | class _CommentsPageState extends State<CommentsPage> {
    method firstLoad (line 43) | void firstLoad()
    method loadMore (line 61) | void loadMore()
    method build (line 83) | Widget build(BuildContext context)
    method buildBody (line 94) | Widget buildBody(BuildContext context)
    method buildBottom (line 190) | Widget buildBottom(BuildContext context)
  class _CommentTile (line 276) | class _CommentTile extends StatefulWidget {
    method createState (line 296) | State<_CommentTile> createState()
  class _CommentTileState (line 299) | class _CommentTileState extends State<_CommentTile> {
    method initState (line 301) | void initState()
    method build (line 309) | Widget build(BuildContext context)
    method buildActions (line 353) | Widget buildActions()
    method buildReply (line 377) | Widget buildReply()
    method buildLike (line 418) | Widget buildLike()
    method vote (line 482) | void vote(bool isUp)
    method buildVote (line 520) | Widget buildVote()
  class _CommentContent (line 565) | class _CommentContent extends StatelessWidget {
    method build (line 571) | Widget build(BuildContext context)

FILE: lib/pages/comic_details_page/comments_preview.dart
  class _CommentsPart (line 3) | class _CommentsPart extends StatefulWidget {
    method createState (line 14) | State<_CommentsPart> createState()
  class _CommentsPartState (line 17) | class _CommentsPartState extends State<_CommentsPart> {
    method initState (line 23) | void initState()
    method build (line 29) | Widget build(BuildContext context)
  class _CommentWidget (line 100) | class _CommentWidget extends StatelessWidget {
    method build (line 106) | Widget build(BuildContext context)

FILE: lib/pages/comic_details_page/cover_viewer.dart
  class _CoverViewer (line 3) | class _CoverViewer extends StatefulWidget {
    method createState (line 15) | State<_CoverViewer> createState()
  class _CoverViewerState (line 18) | class _CoverViewerState extends State<_CoverViewer> {
    method build (line 22) | Widget build(BuildContext context)
    method _buildAppBar (line 70) | Widget _buildAppBar()
    method _saveCover (line 113) | void _saveCover()

FILE: lib/pages/comic_details_page/favorite.dart
  class _FavoritePanel (line 3) | class _FavoritePanel extends StatefulWidget {
    method createState (line 29) | State<_FavoritePanel> createState()
  class _FavoritePanelState (line 32) | class _FavoritePanelState extends State<_FavoritePanel>
    method initState (line 43) | void initState()
    method build (line 52) | Widget build(BuildContext context)
  class _FavoriteList (line 71) | class _FavoriteList extends StatefulWidget {
    method createState (line 97) | State<_FavoriteList> createState()
  class _FavoriteListState (line 100) | class _FavoriteListState extends State<_FavoriteList> {
    method build (line 102) | Widget build(BuildContext context)
  class _NetworkSection (line 150) | class _NetworkSection extends StatefulWidget {
    method createState (line 164) | State<_NetworkSection> createState()
  class _NetworkSectionState (line 167) | class _NetworkSectionState extends State<_NetworkSection> {
    method initState (line 177) | void initState()
    method loadFolders (line 188) | void loadFolders()
    method _buildLoadingSkeleton (line 216) | Widget _buildLoadingSkeleton()
    method build (line 266) | Widget build(BuildContext context)
    method _buildSingleFolder (line 280) | Widget _buildSingleFolder()
    method _buildMultiFolder (line 355) | Widget _buildMultiFolder()
  class _LocalSection (line 447) | class _LocalSection extends StatefulWidget {
    method createState (line 467) | State<_LocalSection> createState()
  class _LocalSectionState (line 470) | class _LocalSectionState extends State<_LocalSection> {
    method initState (line 475) | void initState()
    method build (line 482) | Widget build(BuildContext context)
  class _HoverButton (line 573) | class _HoverButton extends StatefulWidget {
    method createState (line 585) | State<_HoverButton> createState()
  class _HoverButtonState (line 588) | class _HoverButtonState extends State<_HoverButton> {
    method build (line 592) | Widget build(BuildContext context)

FILE: lib/pages/comic_details_page/thumbnails.dart
  class _ComicThumbnails (line 3) | class _ComicThumbnails extends StatefulWidget {
    method createState (line 7) | State<_ComicThumbnails> createState()
  class _ComicThumbnailsState (line 10) | class _ComicThumbnailsState extends State<_ComicThumbnails> {
    method didChangeDependencies (line 24) | void didChangeDependencies()
    method loadNext (line 31) | void loadNext()
    method build (line 58) | Widget build(BuildContext context)

FILE: lib/pages/comic_source_page.dart
  class ComicSourcePage (line 18) | class ComicSourcePage extends StatelessWidget {
    method update (line 21) | Future<void> update(
    method checkComicSourceUpdate (line 72) | Future<int> checkComicSourceUpdate()
    method build (line 104) | Widget build(BuildContext context)
  class _Body (line 109) | class _Body extends StatefulWidget {
    method createState (line 113) | State<_Body> createState()
  class _BodyState (line 116) | class _BodyState extends State<_Body> {
    method updateUI (line 119) | void updateUI()
    method initState (line 124) | void initState()
    method dispose (line 130) | void dispose()
    method build (line 136) | Widget build(BuildContext context)
    method delete (line 154) | void delete(ComicSource source)
    method edit (line 170) | void edit(ComicSource source)
    method update (line 206) | void update(ComicSource source, [bool showLoading = true])
    method buildCard (line 210) | Widget buildCard(BuildContext context)
    method _selectFile (line 271) | void _selectFile()
    method help (line 285) | void help()
    method handleAddSource (line 291) | Future<void> handleAddSource(String url)
    method addSource (line 322) | Future<void> addSource(String js, String fileName)
  class _ComicSourceList (line 331) | class _ComicSourceList extends StatefulWidget {
    method createState (line 337) | State<_ComicSourceList> createState()
  class _ComicSourceListState (line 340) | class _ComicSourceListState extends State<_ComicSourceList> {
    method load (line 345) | void load()
    method initState (line 379) | void initState()
    method dispose (line 386) | void dispose()
    method build (line 395) | Widget build(BuildContext context)
    method buildBody (line 399) | Widget buildBody()
  function _validatePages (line 516) | void _validatePages()
  function _addAllPagesWithComicSource (line 559) | void _addAllPagesWithComicSource(ComicSource source)
  class _EditFilePage (line 592) | class _EditFilePage extends StatefulWidget {
    method createState (line 600) | State<_EditFilePage> createState()
  class __EditFilePageState (line 603) | class __EditFilePageState extends State<_EditFilePage> {
    method initState (line 607) | void initState()
    method dispose (line 613) | void dispose()
    method build (line 620) | Widget build(BuildContext context)
  class _CheckUpdatesButton (line 638) | class _CheckUpdatesButton extends StatefulWidget {
    method createState (line 642) | State<_CheckUpdatesButton> createState()
  class _CheckUpdatesButtonState (line 645) | class _CheckUpdatesButtonState extends State<_CheckUpdatesButton> {
    method check (line 648) | void check()
    method showUpdateDialog (line 665) | void showUpdateDialog()
    method build (line 714) | Widget build(BuildContext context)
  class _CallbackSetting (line 729) | class _CallbackSetting extends StatefulWidget {
    method createState (line 737) | State<_CallbackSetting> createState()
  class _CallbackSettingState (line 740) | class _CallbackSettingState extends State<_CallbackSetting> {
    method onClick (line 749) | Future<void> onClick()
    method build (line 767) | Widget build(BuildContext context)
  class _SliverComicSource (line 779) | class _SliverComicSource extends StatefulWidget {
    method createState (line 795) | State<_SliverComicSource> createState()
  class _SliverComicSourceState (line 798) | class _SliverComicSourceState extends State<_SliverComicSource> {
    method build (line 802) | Widget build(BuildContext context)
    method buildSourceSettings (line 899) | Iterable<Widget> buildSourceSettings()
    method _buildAccount (line 997) | Iterable<Widget> _buildAccount()
  class _LoginPage (line 1072) | class _LoginPage extends StatefulWidget {
    method createState (line 1080) | State<_LoginPage> createState()
  class _LoginPageState (line 1083) | class _LoginPageState extends State<_LoginPage> {
    method build (line 1091) | Widget build(BuildContext context)
    method login (line 1192) | void login()
    method loginWithWebview (line 1239) | void loginWithWebview()
    method validate (line 1244) | void validate(InAppWebViewController c)
    method loginWithWebview2 (line 1289) | void loginWithWebview2()
    method onClose (line 1298) | void onClose()
    method validate (line 1306) | void validate(DesktopWebview webview)

FILE: lib/pages/downloading_page.dart
  class DownloadingPage (line 10) | class DownloadingPage extends StatefulWidget {
    method createState (line 14) | State<DownloadingPage> createState()
  class _DownloadingPageState (line 17) | class _DownloadingPageState extends State<DownloadingPage> {
    method didChangeDependencies (line 21) | void didChangeDependencies()
    method initState (line 28) | void initState()
    method dispose (line 34) | void dispose()
    method update (line 40) | void update()
    method build (line 53) | Widget build(BuildContext context)
    method buildTop (line 73) | Widget buildTop()
  class _DownloadTaskTile (line 139) | class _DownloadTaskTile extends StatefulWidget {
    method createState (line 145) | State<_DownloadTaskTile> createState()
  class _DownloadTaskTileState (line 148) | class _DownloadTaskTileState extends State<_DownloadTaskTile> {
    method initState (line 152) | void initState()
    method dispose (line 159) | void dispose()
    method didUpdateWidget (line 165) | void didUpdateWidget(covariant _DownloadTaskTile oldWidget)
    method update (line 174) | void update()
    method build (line 179) | Widget build(BuildContext context)

FILE: lib/pages/explore_page.dart
  class ExplorePage (line 13) | class ExplorePage extends StatefulWidget {
    method createState (line 17) | State<ExplorePage> createState()
  class _ExplorePageState (line 20) | class _ExplorePageState extends State<ExplorePage>
    method onSettingsChanged (line 30) | void onSettingsChanged()
    method onNaviItemTapped (line 48) | void onNaviItemTapped(int index)
    method addPage (line 56) | void addPage()
    method initState (line 63) | void initState()
    method didChangeDependencies (line 80) | void didChangeDependencies()
    method dispose (line 86) | void dispose()
    method refresh (line 93) | void refresh()
    method buildFAB (line 99) | Widget buildFAB()
    method buildTab (line 108) | Tab buildTab(String i)
    method buildBody (line 114) | Widget buildBody(String i)
    method buildEmpty (line 118) | Widget buildEmpty()
    method build (line 140) | Widget build(BuildContext context)
  class _SingleExplorePage (line 233) | class _SingleExplorePage extends StatefulWidget {
    method createState (line 239) | State<_SingleExplorePage> createState()
  class _SingleExplorePageState (line 242) | class _SingleExplorePageState extends AutomaticGlobalState<_SingleExplor...
    method onSettingsChanged (line 254) | void onSettingsChanged()
    method initState (line 263) | void initState()
    method dispose (line 279) | void dispose()
    method build (line 285) | Widget build(BuildContext context)
    method refresh (line 329) | void refresh()
    method toTop (line 336) | void toTop()
  class _MixedExplorePage (line 347) | class _MixedExplorePage extends StatefulWidget {
    method createState (line 360) | State<_MixedExplorePage> createState()
  class _MixedExplorePageState (line 363) | class _MixedExplorePageState
    method didChangeDependencies (line 366) | void didChangeDependencies()
    method refresh (line 371) | void refresh()
    method buildSlivers (line 375) | Iterable<Widget> buildSlivers(BuildContext context, List<Object> data)
    method buildContent (line 400) | Widget buildContent(BuildContext context, List<Object> data)
    method loadData (line 411) | Future<Res<List<Object>>> loadData(int page)
  function _buildExplorePagePart (line 425) | Iterable<Widget> _buildExplorePagePart(
  function buildTitle (line 427) | Widget buildTitle(ExplorePagePart part)
  function buildComics (line 456) | Widget buildComics(ExplorePagePart part)
  class _MultiPartExplorePage (line 464) | class _MultiPartExplorePage extends StatefulWidget {
    method createState (line 482) | State<_MultiPartExplorePage> createState()
  class _MultiPartExplorePageState (line 485) | class _MultiPartExplorePageState extends State<_MultiPartExplorePage> {
    method restoreState (line 500) | void restoreState(dynamic state)
    method storeState (line 507) | void storeState()
    method refresh (line 511) | void refresh()
    method initState (line 521) | void initState()
    method didChangeDependencies (line 527) | void didChangeDependencies()
    method load (line 533) | void load()
    method build (line 549) | Widget build(BuildContext context)
    method buildPage (line 571) | Widget buildPage()
    method _buildPage (line 579) | Iterable<Widget> _buildPage()

FILE: lib/pages/favorites/favorite_actions.dart
  function newFolder (line 4) | Future<void> newFolder()
  function validateFolderName (line 68) | String? validateFolderName(String newFolderName)
  function addFavorite (line 80) | void addFavorite(List<Comic> comics)
  function updateComicsInfo (line 135) | Future<List<FavoriteItem>> updateComicsInfo(String folder)
  function updateSingleComic (line 138) | Future<void> updateSingleComic(int index)
  function sortFolders (line 258) | Future<void> sortFolders()
  function importNetworkFolder (line 306) | Future<void> importNetworkFolder(
  function fetchNext (line 349) | Future<void> fetchNext()
  function isErrored (line 427) | bool isErrored()

FILE: lib/pages/favorites/favorites_page.dart
  class FavoritesPage (line 38) | class FavoritesPage extends StatefulWidget {
    method createState (line 42) | State<FavoritesPage> createState()
  class _FavoritesPageState (line 45) | class _FavoritesPageState extends State<FavoritesPage> {
    method setFolder (line 52) | void setFolder(bool isNetwork, String? folder)
    method initState (line 66) | void initState()
    method build (line 81) | Widget build(BuildContext context)
    method showFolderSelector (line 105) | void showFolderSelector()
    method buildBody (line 142) | Widget buildBody()
  class FolderList (line 183) | abstract interface class FolderList {
    method update (line 184) | void update()
    method updateFolders (line 186) | void updateFolders()

FILE: lib/pages/favorites/local_favorites_page.dart
  class _LocalFavoritesPage (line 9) | class _LocalFavoritesPage extends StatefulWidget {
    method createState (line 15) | State<_LocalFavoritesPage> createState()
  class _LocalFavoritesPageState (line 18) | class _LocalFavoritesPageState extends State<_LocalFavoritesPage> {
    method updateSearchResult (line 51) | void updateSearchResult()
    method updateComics (line 68) | void updateComics()
    method filterComics (line 110) | List<FavoriteItem> filterComics(List<FavoriteItem> curComics)
    method matchKeyword (line 123) | bool matchKeyword(String keyword, FavoriteItem comic)
    method checkKeyWordMatch (line 151) | bool checkKeyWordMatch(String keyword, String compare, bool needEqual)
    method matchKeywordT (line 163) | bool matchKeywordT(String keyword, FavoriteItem comic)
    method matchKeywordS (line 172) | bool matchKeywordS(String keyword, FavoriteItem comic)
    method initState (line 180) | void initState()
    method dispose (line 199) | void dispose()
    method selectAll (line 204) | void selectAll()
    method invertSelection (line 214) | void invertSelection()
    method downloadComic (line 236) | bool downloadComic(FavoriteItem c)
    method downloadSelected (line 256) | void downloadSelected()
    method build (line 273) | Widget build(BuildContext context)
    method favoriteOption (line 790) | void favoriteOption(String option)
    method _checkExitSelectMode (line 921) | void _checkExitSelectMode()
    method _cancel (line 929) | void _cancel()
    method _deleteComicWithId (line 936) | void _deleteComicWithId()
  class _ReorderComicsPage (line 943) | class _ReorderComicsPage extends StatefulWidget {
    method createState (line 951) | State<_ReorderComicsPage> createState()
  class _ReorderComicsPageState (line 954) | class _ReorderComicsPageState extends State<_ReorderComicsPage> {
    method _floatToInt8 (line 961) | int _floatToInt8(double x)
    method lightenColor (line 965) | Color lightenColor(Color color, double lightenValue)
    method dispose (line 977) | void dispose()
    method build (line 988) | Widget build(BuildContext context)
  class _SelectUpdatePageNum (line 1078) | class _SelectUpdatePageNum extends StatefulWidget {
    method createState (line 1089) | State<_SelectUpdatePageNum> createState()
  class _SelectUpdatePageNumState (line 1092) | class _SelectUpdatePageNumState extends State<_SelectUpdatePageNum> {
    method initState (line 1101) | void initState()
    method build (line 1108) | Widget build(BuildContext context)
  class _LocalFavoritesFilterDialog (line 1151) | class _LocalFavoritesFilterDialog extends StatefulWidget {
    method createState (line 1161) | State<_LocalFavoritesFilterDialog> createState()
  class _LocalFavoritesFilterDialogState (line 1167) | class _LocalFavoritesFilterDialogState
    method build (line 1172) | Widget build(BuildContext context)

FILE: lib/pages/favorites/network_favorites_page.dart
  function _deleteComic (line 3) | Future<bool> _deleteComic(
  class NetworkFavoritePage (line 62) | class NetworkFavoritePage extends StatelessWidget {
    method build (line 68) | Widget build(BuildContext context)
  class _NormalFavoritePage (line 75) | class _NormalFavoritePage extends StatefulWidget {
    method createState (line 81) | State<_NormalFavoritePage> createState()
  class _NormalFavoritePageState (line 84) | class _NormalFavoritePageState extends State<_NormalFavoritePage> {
    method showFolders (line 87) | void showFolders()
    method build (line 94) | Widget build(BuildContext context)
  class _MultiFolderFavoritesPage (line 185) | class _MultiFolderFavoritesPage extends StatefulWidget {
    method createState (line 191) | State<_MultiFolderFavoritesPage> createState()
  class _MultiFolderFavoritesPageState (line 195) | class _MultiFolderFavoritesPageState extends State<_MultiFolderFavorites...
    method showFolders (line 202) | void showFolders()
    method loadPage (line 208) | void loadPage()
    method openFolder (line 222) | void openFolder(String key, String title)
    method build (line 227) | Widget build(BuildContext context)
  class _FolderTile (line 380) | class _FolderTile extends StatelessWidget {
    method build (line 396) | Widget build(BuildContext context)
    method onDeleteFolder (line 436) | void onDeleteFolder(BuildContext context)
  class _CreateFolderDialog (line 475) | class _CreateFolderDialog extends StatefulWidget {
    method createState (line 483) | State<_CreateFolderDialog> createState()
  class _CreateFolderDialogState (line 486) | class _CreateFolderDialogState extends State<_CreateFolderDialog> {
    method build (line 491) | Widget build(BuildContext context)
  class _FavoriteFolder (line 538) | class _FavoriteFolder extends StatelessWidget {
    method build (line 550) | Widget build(BuildContext context)

FILE: lib/pages/favorites/side_bar.dart
  class _LeftBar (line 3) | class _LeftBar extends StatefulWidget {
    method createState (line 13) | State<_LeftBar> createState()
  class _LeftBarState (line 16) | class _LeftBarState extends State<_LeftBar> implements FolderList {
    method findNetworkFolders (line 23) | void findNetworkFolders()
    method initState (line 38) | void initState()
    method dispose (line 50) | void dispose()
    method build (line 57) | Widget build(BuildContext context)
    method buildLocalTitle (line 118) | Widget buildLocalTitle()
    method buildNetworkTitle (line 161) | Widget buildNetworkTitle()
    method buildLocalFolder (line 196) | Widget buildLocalFolder(String name)
    method buildNetworkFolder (line 254) | Widget buildNetworkFolder(String key)
    method update (line 290) | void update()
    method updateFolders (line 296) | void updateFolders()

FILE: lib/pages/follow_updates_page.dart
  class FollowUpdatesWidget (line 13) | class FollowUpdatesWidget extends StatefulWidget {
    method createState (line 17) | State<FollowUpdatesWidget> createState()
  class _FollowUpdatesWidgetState (line 20) | class _FollowUpdatesWidgetState
    method getCount (line 26) | void getCount()
    method updateCount (line 42) | void updateCount()
    method initState (line 49) | void initState()
    method build (line 55) | Widget build(BuildContext context)
  class FollowUpdatesPage (line 114) | class FollowUpdatesPage extends StatefulWidget {
    method createState (line 118) | State<FollowUpdatesPage> createState()
  class _FollowUpdatesPageState (line 121) | class _FollowUpdatesPageState extends AutomaticGlobalState<FollowUpdates...
    method sortComics (line 128) | void sortComics()
    method initState (line 153) | void initState()
    method build (line 163) | Widget build(BuildContext context)
    method buildNotConfigured (line 180) | Widget buildNotConfigured(BuildContext context)
    method buildConfigured (line 214) | Widget buildConfigured(BuildContext context)
    method buildUpdatedComics (line 262) | Widget buildUpdatedComics()
    method buildAllComics (line 351) | Widget buildAllComics()
    method showSelector (line 383) | void showSelector()
    method disable (line 438) | void disable()
    method setFolder (line 444) | void setFolder(String folder)
    method onCancel (line 452) | void onCancel()
    method checkNow (line 483) | void checkNow()
    method onCancel (line 487) | void onCancel()
    method updateComics (line 517) | void updateComics()
  class FollowUpdatesService (line 537) | abstract class FollowUpdatesService {
    method _check (line 544) | void _check()
    method initChecker (line 581) | void initChecker()
  function updateFollowUpdatesUI (line 594) | void updateFollowUpdatesUI()

FILE: lib/pages/history_page.dart
  class HistoryPage (line 9) | class HistoryPage extends StatefulWidget {
    method createState (line 13) | State<HistoryPage> createState()
  class _HistoryPageState (line 16) | class _HistoryPageState extends State<HistoryPage> {
    method initState (line 18) | void initState()
    method dispose (line 24) | void dispose()
    method onUpdate (line 29) | void onUpdate()
    method selectAll (line 47) | void selectAll()
    method deSelect (line 53) | void deSelect()
    method invertSelection (line 59) | void invertSelection()
    method _removeHistory (line 68) | void _removeHistory(History comic)
    method _refreshHistory (line 87) | void _refreshHistory(History comic)
    method _refreshAllHistories (line 100) | void _refreshAllHistories()
    method onCancel (line 102) | void onCancel()
    method build (line 147) | Widget build(BuildContext context)
    method getDescription (line 320) | String getDescription(History h)

FILE: lib/pages/home_page.dart
  class HomePage (line 26) | class HomePage extends StatelessWidget {
    method build (line 30) | Widget build(BuildContext context)
  class _SearchBar (line 48) | class _SearchBar extends StatelessWidget {
    method build (line 52) | Widget build(BuildContext context)
  class _SyncDataWidget (line 82) | class _SyncDataWidget extends StatefulWidget {
    method createState (line 86) | State<_SyncDataWidget> createState()
  class _SyncDataWidgetState (line 89) | class _SyncDataWidgetState extends State<_SyncDataWidget>
    method initState (line 92) | void initState()
    method update (line 99) | void update()
    method dispose (line 106) | void dispose()
    method didChangeAppLifecycleState (line 115) | void didChangeAppLifecycleState(AppLifecycleState state)
    method build (line 126) | Widget build(BuildContext context)
  class _History (line 222) | class _History extends StatefulWidget {
    method createState (line 226) | State<_History> createState()
  class _HistoryState (line 229) | class _HistoryState extends State<_History> {
    method onHistoryChange (line 233) | void onHistoryChange()
    method initState (line 243) | void initState()
    method dispose (line 251) | void dispose()
    method build (line 257) | Widget build(BuildContext context)
  class _Local (line 332) | class _Local extends StatefulWidget {
    method createState (line 336) | State<_Local> createState()
  class _LocalState (line 339) | class _LocalState extends State<_Local> {
    method onLocalComicsChange (line 343) | void onLocalComicsChange()
    method initState (line 351) | void initState()
    method dispose (line 359) | void dispose()
    method build (line 365) | Widget build(BuildContext context)
    method import (line 468) | void import()
  class _ImportComicsWidget (line 479) | class _ImportComicsWidget extends StatefulWidget {
    method createState (line 483) | State<_ImportComicsWidget> createState()
  class _ImportComicsWidgetState (line 486) | class _ImportComicsWidgetState extends State<_ImportComicsWidget> {
    method dispose (line 504) | void dispose()
    method build (line 510) | Widget build(BuildContext context)
    method selectAndImport (line 620) | void selectAndImport()
  class _ComicSourceWidget (line 647) | class _ComicSourceWidget extends StatefulWidget {
    method createState (line 651) | State<_ComicSourceWidget> createState()
  class _ComicSourceWidgetState (line 654) | class _ComicSourceWidgetState extends State<_ComicSourceWidget> {
    method onComicSourceChange (line 657) | void onComicSourceChange()
    method initState (line 664) | void initState()
    method dispose (line 671) | void dispose()
    method build (line 690) | Widget build(BuildContext context)
  class _AnimatedDownloadingIcon (line 794) | class _AnimatedDownloadingIcon extends StatefulWidget {
    method createState (line 798) | State<_AnimatedDownloadingIcon> createState()
  class __AnimatedDownloadingIconState (line 802) | class __AnimatedDownloadingIconState extends State<_AnimatedDownloadingI...
    method initState (line 807) | void initState()
    method dispose (line 817) | void dispose()
    method build (line 823) | Widget build(BuildContext context)
  class ImageFavorites (line 853) | class ImageFavorites extends StatefulWidget {
    method createState (line 857) | State<ImageFavorites> createState()
  class _ImageFavoritesState (line 860) | class _ImageFavoritesState extends State<ImageFavorites> {
    method refreshImageFavorites (line 865) | void refreshImageFavorites()
    method initState (line 878) | void initState()
    method dispose (line 885) | void dispose()
    method build (line 891) | Widget build(BuildContext context)
    method buildTypeButton (line 970) | Widget buildTypeButton(int type, String text)
    method buildChart (line 1009) | Widget buildChart(List<TextWithCount> data)
  class _ChartLine (line 1040) | class _ChartLine extends StatefulWidget {
    method createState (line 1060) | State<_ChartLine> createState()
  class __ChartLineState (line 1063) | class __ChartLineState extends State<_ChartLine>
    method initState (line 1068) | void initState()
    method dispose (line 1078) | void dispose()
    method build (line 1084) | Widget build(BuildContext context)

FILE: lib/pages/image_favorites_page/image_favorites_item.dart
  class _ImageFavoritesItem (line 3) | class _ImageFavoritesItem extends StatefulWidget {
    method createState (line 19) | State<_ImageFavoritesItem> createState()
  class _ImageFavoritesItemState (line 22) | class _ImageFavoritesItemState extends State<_ImageFavoritesItem> {
    method goComicInfo (line 25) | void goComicInfo(ImageFavoritesComic comic)
    method goReaderPage (line 32) | void goReaderPage(ImageFavoritesComic comic, int ep, int page)
    method goPhotoView (line 43) | void goPhotoView(ImageFavorite imageFavorite)
    method copyTitle (line 51) | void copyTitle()
    method onLongPress (line 56) | void onLongPress()
    method onSecondaryTap (line 65) | void onSecondaryTap(TapDownDetails details)
    method showMenu (line 69) | void showMenu(Offset location, BuildContext context)
    method build (line 109) | Widget build(BuildContext context)
    method buildItem (line 152) | Widget buildItem(BuildContext context, int index)
    method buildTop (line 215) | Widget buildTop()
    method buildBottom (line 244) | Widget buildBottom()

FILE: lib/pages/image_favorites_page/image_favorites_page.dart
  class ImageFavoritesPage (line 27) | class ImageFavoritesPage extends StatefulWidget {
    method createState (line 33) | State<ImageFavoritesPage> createState()
  class _ImageFavoritesPageState (line 36) | class _ImageFavoritesPageState extends State<ImageFavoritesPage> {
    method update (line 57) | void update()
    method updateImageFavorites (line 63) | void updateImageFavorites()
    method sortImageFavorites (line 71) | void sortImageFavorites()
    method initState (line 107) | void initState()
    method dispose (line 124) | void dispose()
    method buildMultiSelectMenu (line 130) | Widget buildMultiSelectMenu()
    method selectAll (line 149) | void selectAll()
    method deSelect (line 158) | void deSelect()
    method addSelected (line 164) | void addSelected(ImageFavorite i)
    method build (line 179) | Widget build(BuildContext context)
    method sort (line 326) | void sort()
  class _ImageFavoritesDialog (line 348) | class _ImageFavoritesDialog extends StatefulWidget {
    method createState (line 362) | State<_ImageFavoritesDialog> createState()
  class _ImageFavoritesDialogState (line 365) | class _ImageFavoritesDialogState extends State<_ImageFavoritesDialog> {
    method initState (line 374) | void initState()
    method build (line 391) | Widget build(BuildContext context)

FILE: lib/pages/image_favorites_page/image_favorites_photo_view.dart
  class ImageFavoritesPhotoView (line 3) | class ImageFavoritesPhotoView extends StatefulWidget {
    method createState (line 14) | State<ImageFavoritesPhotoView> createState()
  class _ImageFavoritesPhotoViewState (line 18) | class _ImageFavoritesPhotoViewState extends State<ImageFavoritesPhotoVie...
    method initState (line 29) | void initState()
    method onPop (line 44) | void onPop()
    method _buildItem (line 57) | PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index)
    method build (line 77) | Widget build(BuildContext context)
    method buildPageInfo (line 147) | Widget buildPageInfo()
    method buildAppBar (line 174) | Widget buildAppBar()
    method showMenu (line 216) | void showMenu()

FILE: lib/pages/image_favorites_page/type.dart
  type ImageFavoriteSortType (line 3) | enum ImageFavoriteSortType {
  class TimeRange (line 17) | class TimeRange {
    method toString (line 39) | String toString()
    method contains (line 60) | bool contains(DateTime time)
  type TimeRangeType (line 90) | enum TimeRangeType {

FILE: lib/pages/local_comics_page.dart
  class LocalComicsPage (line 19) | class LocalComicsPage extends StatefulWidget {
    method createState (line 23) | State<LocalComicsPage> createState()
  class _LocalComicsPageState (line 26) | class _LocalComicsPageState extends State<LocalComicsPage> {
    method update (line 39) | void update()
    method initState (line 52) | void initState()
    method dispose (line 61) | void dispose()
    method sort (line 66) | void sort()
    method buildMultiSelectMenu (line 114) | Widget buildMultiSelectMenu()
    method selectAll (line 161) | void selectAll()
    method deSelect (line 167) | void deSelect()
    method invertSelection (line 173) | void invertSelection()
    method build (line 183) | Widget build(BuildContext context)
    method deleteComics (line 377) | Future<bool> deleteComics(List<LocalComic> comics)
    method exportActions (line 438) | List<MenuEntry> exportActions(List<LocalComic> comics)
    method exportComics (line 465) | void exportComics(
  type ExportComicFunc (line 538) | typedef ExportComicFunc = Future<File> Function(
  function openComicFolder (line 542) | Future<void> openComicFolder(LocalComic comic)
  function showDeleteChaptersPopWindow (line 584) | void showDeleteChaptersPopWindow(BuildContext context, LocalComic comic)

FILE: lib/pages/main_page.dart
  class MainPage (line 14) | class MainPage extends StatefulWidget {
    method createState (line 18) | State<MainPage> createState()
  class _MainPageState (line 21) | class _MainPageState extends State<MainPage> {
    method to (line 26) | void to(Widget Function() widget, {bool preventDuplicate = false})
    method back (line 34) | void back()
    method initState (line 39) | void initState()
    method build (line 63) | Widget build(BuildContext context)

FILE: lib/pages/ranking_page.dart
  class RankingPage (line 7) | class RankingPage extends StatefulWidget {
    method createState (line 13) | State<RankingPage> createState()
  class _RankingPageState (line 16) | class _RankingPageState extends State<RankingPage> {
    method findData (line 21) | void findData()
    method initState (line 34) | void initState()
    method build (line 40) | Widget build(BuildContext context)
    method buildOptionItem (line 62) | Widget buildOptionItem(String text, String value, BuildContext context)
    method buildOptions (line 75) | Widget buildOptions()

FILE: lib/pages/reader/chapter_comments.dart
  function _shouldBlockComment (line 3) | bool _shouldBlockComment(Comment comment)
  class ChapterCommentsPage (line 16) | class ChapterCommentsPage extends StatefulWidget {
    method createState (line 35) | State<ChapterCommentsPage> createState()
  class _ChapterCommentsPageState (line 38) | class _ChapterCommentsPageState extends State<ChapterCommentsPage> {
    method firstLoad (line 47) | void firstLoad()
    method loadMore (line 69) | void loadMore()
    method build (line 91) | Widget build(BuildContext context)
    method buildBody (line 109) | Widget buildBody(BuildContext context)
    method buildBottom (line 202) | Widget buildBottom(BuildContext context)
  class _ChapterCommentTile (line 286) | class _ChapterCommentTile extends StatefulWidget {
    method createState (line 304) | State<_ChapterCommentTile> createState()
  class _ChapterCommentTileState (line 307) | class _ChapterCommentTileState extends State<_ChapterCommentTile> {
    method initState (line 309) | void initState()
    method build (line 317) | Widget build(BuildContext context)
    method buildActions (line 359) | Widget buildActions()
    method buildReply (line 385) | Widget buildReply()
    method buildLike (line 429) | Widget buildLike()
    method vote (line 491) | void vote(bool isUp)
    method buildVote (line 529) | Widget buildVote()
  class _CommentContent (line 574) | class _CommentContent extends StatelessWidget {
    method build (line 580) | Widget build(BuildContext context)
  class _EmbeddedChapterCommentsPage (line 590) | class _EmbeddedChapterCommentsPage extends StatefulWidget {
    method createState (line 606) | State<_EmbeddedChapterCommentsPage> createState()
  class _EmbeddedChapterCommentsPageState (line 610) | class _EmbeddedChapterCommentsPageState
    method dispose (line 621) | void dispose()
    method firstLoad (line 626) | void firstLoad()
    method loadMore (line 651) | void loadMore()
    method build (line 676) | Widget build(BuildContext context)
    method _buildHeader (line 693) | Widget _buildHeader()
    method _buildBody (line 731) | Widget _buildBody()
    method _buildCommentsList (line 756) | Widget _buildCommentsList(bool showAvatar)
    method _buildBottom (line 793) | Widget _buildBottom()

FILE: lib/pages/reader/chapters.dart
  class _ChaptersView (line 3) | class _ChaptersView extends StatefulWidget {
    method createState (line 9) | State<_ChaptersView> createState()
  class _ChaptersViewState (line 12) | class _ChaptersViewState extends State<_ChaptersView> {
    method initState (line 20) | void initState()
    method build (line 33) | Widget build(BuildContext context)
  class _GroupedChaptersView (line 88) | class _GroupedChaptersView extends StatefulWidget {
    method createState (line 94) | State<_GroupedChaptersView> createState()
  class _GroupedChaptersViewState (line 97) | class _GroupedChaptersViewState extends State<_GroupedChaptersView>
    method initState (line 110) | void initState()
    method build (line 138) | Widget build(BuildContext context)
    method buildGroup (line 156) | Widget buildGroup(String groupName)
  class _ChapterListTile (line 191) | class _ChapterListTile extends StatelessWidget {
    method build (line 208) | Widget build(BuildContext context)

FILE: lib/pages/reader/comic_image.dart
  class ComicImage (line 3) | class ComicImage extends StatefulWidget {
    method clear (line 69) | void clear()
    method createState (line 72) | State<ComicImage> createState()
  class _ComicImageState (line 75) | class _ComicImageState extends State<ComicImage> with WidgetsBindingObse...
    method clear (line 89) | clear()
    method initState (line 92) | void initState()
    method dispose (line 100) | void dispose()
    method didChangeDependencies (line 112) | void didChangeDependencies()
    method didUpdateWidget (line 126) | void didUpdateWidget(ComicImage oldWidget)
    method didChangeAccessibilityFeatures (line 134) | void didChangeAccessibilityFeatures()
    method reassemble (line 142) | void reassemble()
    method containsPoint (line 147) | bool containsPoint(Offset point)
    method _updateInvertColors (line 156) | void _updateInvertColors()
    method _resolveImage (line 161) | void _resolveImage()
    method _getListener (line 178) | ImageStreamListener _getListener({bool recreateListener = false})
    method _handleImageFrame (line 194) | void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall)
    method _handleImageChunk (line 204) | void _handleImageChunk(ImageChunkEvent event)
    method _replaceImage (line 211) | void _replaceImage({required ImageInfo? info})
    method _updateSourceStream (line 221) | void _updateSourceStream(ImageStream newStream)
    method _listenToStream (line 248) | void _listenToStream()
    method _stopListeningToStream (line 267) | void _stopListeningToStream({bool keepStreamAlive = false})
    method build (line 283) | Widget build(BuildContext context)
    method debugFillProperties (line 435) | void debugFillProperties(DiagnosticPropertiesBuilder description)

FILE: lib/pages/reader/gesture.dart
  class _ReaderGestureDetector (line 3) | class _ReaderGestureDetector extends StatefulWidget {
    method createState (line 9) | State<_ReaderGestureDetector> createState()
  class _ReaderGestureDetectorState (line 12) | class _ReaderGestureDetectorState extends AutomaticGlobalState<_ReaderGe...
    method ignoreNextTap (line 31) | void ignoreNextTap()
    method clearIgnoreNextTap (line 35) | void clearIgnoreNextTap()
    method initState (line 40) | void initState()
    method build (line 52) | Widget build(BuildContext context)
    method onMouseWheel (line 136) | void onMouseWheel(bool forward)
    method onTapUp (line 166) | void onTapUp(TapUpDetails event)
    method onTap (line 201) | void onTap(Offset location)
    method onDoubleTap (line 273) | void onDoubleTap(Offset location)
    method onSecondaryTapUp (line 277) | void onSecondaryTapUp(Offset location)
    method onLongPressedUp (line 326) | void onLongPressedUp(Offset location)
    method onLongPressedDown (line 330) | void onLongPressedDown(Offset location)
    method addDragListener (line 334) | void addDragListener(_DragListener listener)
    method removeDragListener (line 338) | void removeDragListener(_DragListener listener)
    method copyImage (line 345) | void copyImage(Offset location)
    method saveImage (line 355) | void saveImage(Offset location)
  class _DragListener (line 367) | class _DragListener {

FILE: lib/pages/reader/images.dart
  class _ReaderImages (line 3) | class _ReaderImages extends StatefulWidget {
    method createState (line 7) | State<_ReaderImages> createState()
  class _ReaderImagesState (line 10) | class _ReaderImagesState extends State<_ReaderImages> {
    method initState (line 18) | void initState()
    method dispose (line 25) | void dispose()
    method _handleJumpToLastPage (line 31) | void _handleJumpToLastPage()
    method load (line 38) | void load()
    method build (line 98) | Widget build(BuildContext context)
  class _GalleryMode (line 147) | class _GalleryMode extends StatefulWidget {
    method createState (line 151) | State<_GalleryMode> createState()
  class _GalleryModeState (line 154) | class _GalleryModeState extends State<_GalleryMode>
    method isChapterCommentsPage (line 194) | bool isChapterCommentsPage(int pageIndex)
    method initState (line 205) | void initState()
    method getPageImagesRange (line 216) | (int start, int end) getPageImagesRange(int page)
    method getCurrentPageImageRange (line 241) | (int, int)? getCurrentPageImageRange()
    method cache (line 249) | void cache(int startPage)
    method _cachePage (line 261) | void _cachePage(int page, bool shouldPreCache)
    method _buildChapterCommentsPage (line 271) | Widget _buildChapterCommentsPage()
    method build (line 286) | Widget build(BuildContext context)
    method buildPageImages (line 412) | Widget buildPageImages(List<String> images, int startIndex)
    method animateToPage (line 486) | Future<void> animateToPage(int page)
    method toPage (line 498) | void toPage(int page)
    method handleDoubleTap (line 503) | void handleDoubleTap(Offset location)
    method handleLongPressDown (line 513) | void handleLongPressDown(Offset location)
    method handleLongPressUp (line 534) | void handleLongPressUp(Offset location)
    method handleKeyEvent (line 547) | void handleKeyEvent(KeyEvent event)
    method handleOnTap (line 603) | bool handleOnTap(Offset location)
    method getImageByOffset (line 608) | Future<Uint8List?> getImageByOffset(Offset offset)
    method getImageKeyByOffset (line 621) | String? getImageKeyByOffset(Offset offset)
  class _ContinuousMode (line 657) | class _ContinuousMode extends StatefulWidget {
    method createState (line 661) | State<_ContinuousMode> createState()
  class _ContinuousModeState (line 664) | class _ContinuousModeState extends State<_ContinuousMode>
    method delayedSetIsScrolling (line 691) | void delayedSetIsScrolling(bool value)
    method initState (line 707) | void initState()
    method dispose (line 720) | void dispose()
    method onPositionChanged (line 725) | void onPositionChanged()
    method smoothTo (line 740) | void smoothTo(double offset)
    method onPointerSignal (line 782) | void onPointerSignal(PointerSignalEvent event)
    method cacheImages (line 796) | void cacheImages(int current)
    method onScroll (line 805) | void onScroll()
    method onScaleUpdate (line 819) | bool onScaleUpdate([double? scale])
    method build (line 837) | Widget build(BuildContext context)
    method buildBackground (line 1045) | Widget buildBackground(BuildContext context)
    method animateToPage (line 1066) | Future<void> animateToPage(int page)
    method handleDoubleTap (line 1075) | void handleDoubleTap(Offset location)
    method handleLongPressDown (line 1096) | void handleLongPressDown(Offset location)
    method handleLongPressUp (line 1117) | void handleLongPressUp(Offset location)
    method toPage (line 1128) | void toPage(int page)
    method handleKeyEvent (line 1134) | void handleKeyEvent(KeyEvent event)
    method handleOnTap (line 1184) | bool handleOnTap(Offset location)
    method getImageByOffset (line 1192) | Future<Uint8List?> getImageByOffset(Offset offset)
    method getImageKeyByOffset (line 1205) | String? getImageKeyByOffset(Offset offset)
  function _createImageProviderFromKey (line 1216) | ImageProvider _createImageProviderFromKey(
  function _createImageProvider (line 1232) | ImageProvider _createImageProvider(int page, BuildContext context)
  function _precacheImage (line 1241) | void _precacheImage(int page, BuildContext context)
  function _preDownloadImage (line 1250) | void _preDownloadImage(int page, BuildContext context)
  class _SwipeChangeChapterProgress (line 1265) | class _SwipeChangeChapterProgress extends StatefulWidget {
    method createState (line 1273) | State<_SwipeChangeChapterProgress> createState()
  class _SwipeChangeChapterProgressState (line 1277) | class _SwipeChangeChapterProgressState
    method initState (line 1286) | void initState()
    method didUpdateWidget (line 1295) | void didUpdateWidget(covariant _SwipeChangeChapterProgress oldWidget)
    method dispose (line 1310) | void dispose()
    method onScroll (line 1315) | void onScroll()
    method build (line 1330) | Widget build(BuildContext context)
  class _ProgressPainter (line 1357) | class _ProgressPainter extends CustomPainter {
    method paint (line 1371) | void paint(Canvas canvas, Size size)
    method shouldRepaint (line 1394) | bool shouldRepaint(covariant CustomPainter oldDelegate)

FILE: lib/pages/reader/loading.dart
  class ReaderWithLoading (line 3) | class ReaderWithLoading extends StatefulWidget {
    method createState (line 21) | State<ReaderWithLoading> createState()
  class _ReaderWithLoadingState (line 24) | class _ReaderWithLoadingState
    method buildContent (line 27) | Widget buildContent(BuildContext context, ReaderProps data)
    method loadData (line 43) | Future<Res<ReaderProps>> loadData()
  class ReaderProps (line 98) | class ReaderProps {

FILE: lib/pages/reader/reader.dart
  class Reader (line 69) | class Reader extends StatefulWidget {
    method createState (line 108) | State<Reader> createState()
  class _ReaderState (line 111) | class _ReaderState extends State<Reader>
    method update (line 114) | void update()
    method initState (line 190) | void initState()
    method didChangeDependencies (line 239) | void didChangeDependencies()
    method setImageCacheSize (line 251) | void setImageCacheSize()
    method dispose (line 272) | void dispose()
    method build (line 289) | Widget build(BuildContext context)
    method onKeyEvent (line 311) | void onKeyEvent(KeyEvent event)
    method onPageChanged (line 322) | void onPageChanged()
    method updateHistory (line 330) | void updateHistory()
  class _ImagePerPageHandler (line 414) | abstract mixin class _ImagePerPageHandler {
    method initImagesPerPage (line 443) | void initImagesPerPage(int initialPage)
    method showSingleImageOnFirstPage (line 456) | bool showSingleImageOnFirstPage()
    method _calcMaxPage (line 483) | int _calcMaxPage(int imagesPerPageValue)
    method _checkImagesPerPageChange (line 491) | void _checkImagesPerPageChange()
    method _adjustPageForImagesPerPageChange (line 512) | void _adjustPageForImagesPerPageChange(
  class _VolumeListener (line 550) | abstract mixin class _VolumeListener {
    method toNextPage (line 551) | bool toNextPage()
    method toPrevPage (line 553) | bool toPrevPage()
    method toNextChapter (line 555) | bool toNextChapter()
    method toPrevChapter (line 557) | bool toPrevChapter({bool toLastPage = false})
    method onDown (line 561) | void onDown()
    method onUp (line 567) | void onUp()
    method handleVolumeEvent (line 573) | void handleVolumeEvent()
    method stopVolumeEvent (line 584) | void stopVolumeEvent()
  class _ReaderLocation (line 592) | abstract mixin class _ReaderLocation {
    method update (line 621) | void update()
    method enablePageAnimation (line 623) | bool enablePageAnimation(String cid, ComicType type)
    method onPageChanged (line 628) | void onPageChanged()
    method setPage (line 630) | void setPage(int page)
    method _validatePage (line 638) | bool _validatePage(int page)
    method toNextPage (line 643) | bool toNextPage()
    method toPrevPage (line 648) | bool toPrevPage()
    method toPage (line 654) | bool toPage(int page)
    method _validateChapter (line 683) | bool _validateChapter(int chapter)
    method toNextChapter (line 688) | bool toNextChapter()
    method toPrevChapter (line 694) | bool toPrevChapter({bool toLastPage = false})
    method toChapter (line 698) | bool toChapter(int c, {bool toLastPage = false})
    method autoPageTurning (line 711) | void autoPageTurning(String cid, ComicType type)
  class _ReaderWindow (line 731) | mixin class _ReaderWindow {
    method initReaderWindow (line 738) | void initReaderWindow()
    method fullscreen (line 745) | void fullscreen()
    method onWindowClose (line 754) | bool onWindowClose()
    method disposeReaderWindow (line 763) | void disposeReaderWindow()
  type ReaderMode (line 769) | enum ReaderMode {
  class _ImageViewController (line 795) | abstract interface class _ImageViewController {
    method toPage (line 796) | void toPage(int page)
    method animateToPage (line 798) | Future<void> animateToPage(int page)
    method handleDoubleTap (line 800) | void handleDoubleTap(Offset location)
    method handleLongPressDown (line 802) | void handleLongPressDown(Offset location)
    method handleLongPressUp (line 804) | void handleLongPressUp(Offset location)
    method handleKeyEvent (line 806) | void handleKeyEvent(KeyEvent event)
    method handleOnTap (line 809) | bool handleOnTap(Offset location)
    method getImageByOffset (line 811) | Future<Uint8List?> getImageByOffset(Offset offset)
    method getImageKeyByOffset (line 813) | String? getImageKeyByOffset(Offset offset)

FILE: lib/pages/reader/scaffold.dart
  class _ReaderScaffold (line 3) | class _ReaderScaffold extends StatefulWidget {
    method createState (line 9) | State<_ReaderScaffold> createState()
  class _ReaderScaffoldState (line 12) | class _ReaderScaffoldState extends State<_ReaderScaffold> {
    method setFloatingButton (line 31) | void setFloatingButton(int value)
    method addDragListener (line 50) | void addDragListener()
    method initState (line 86) | void initState()
    method dispose (line 101) | void dispose()
    method openOrClose (line 106) | void openOrClose()
    method update (line 123) | void update()
    method build (line 128) | Widget build(BuildContext context)
    method buildTop (line 169) | Widget buildTop()
    method isLiked (line 246) | bool isLiked()
    method addImageFavorite (line 256) | void addImageFavorite()
    method buildBottom (line 391) | Widget buildBottom()
    method buildSlider (line 582) | Widget buildSlider()
    method buildPageInfoText (line 600) | Widget buildPageInfoText()
    method buildStatusInfo (line 635) | Widget buildStatusInfo()
    method openChapterDrawer (line 653) | void openChapterDrawer()
    method saveCurrentImage (line 662) | void saveCurrentImage()
    method share (line 676) | void share()
    method openSetting (line 688) | void openSetting()
    method _openSideBar (line 727) | void _openSideBar(Widget widget, {double width = 400})
    method shouldShowChapterComments (line 742) | bool shouldShowChapterComments()
    method openChapterComments (line 761) | void openChapterComments()
    method buildEpChangeButton (line 784) | Widget buildEpChangeButton()
    method _getArrowIcon (line 841) | IconData _getArrowIcon(bool reversed, int value)
    method selectImage (line 855) | Future<int?> selectImage()
    method selectImageToData (line 896) | Future<(int, Uint8List)?> selectImageToData()
    method _showSelectImageOverlay (line 913) | Future<Offset?> _showSelectImageOverlay()
  class _BatteryWidget (line 945) | class _BatteryWidget extends StatefulWidget {
    method createState (line 947) | _BatteryWidgetState createState()
  class _BatteryWidgetState (line 950) | class _BatteryWidgetState extends State<_BatteryWidget> {
    method initState (line 958) | void initState()
    method _checkBatteryAvailability (line 964) | void _checkBatteryAvailability()
    method build (line 988) | Widget build(BuildContext context)
    method dispose (line 996) | void dispose()
    method _batteryInfo (line 1001) | Widget _batteryInfo(int batteryLevel)
  class _ClockWidget (line 1067) | class _ClockWidget extends StatefulWidget {
    method createState (line 1069) | _ClockWidgetState createState()
  class _ClockWidgetState (line 1072) | class _ClockWidgetState extends State<_ClockWidget> {
    method initState (line 1077) | void initState()
    method _getCurrentTime (line 1090) | String _getCurrentTime()
    method dispose (line 1096) | void dispose()
    method build (line 1102) | Widget build(BuildContext context)
  class _SelectImageOverlayContent (line 1121) | class _SelectImageOverlayContent extends StatefulWidget {
    method createState (line 1132) | State<_SelectImageOverlayContent> createState()
  class _SelectImageOverlayContentState (line 1136) | class _SelectImageOverlayContentState
    method dispose (line 1139) | void dispose()
    method build (line 1145) | Widget build(BuildContext context)

FILE: lib/pages/search_page.dart
  class SearchPage (line 22) | class SearchPage extends StatefulWidget {
    method createState (line 26) | State<SearchPage> createState()
  class _SearchPageState (line 29) | class _SearchPageState extends State<SearchPage> {
    method update (line 45) | void update()
    method search (line 49) | void search([String? text])
    method canHandleUrl (line 71) | bool canHandleUrl(String text)
    method findSuggestions (line 84) | void findSuggestions()
    method check (line 110) | bool check(String text, String key, String value)
    method find (line 125) | void find(Map<String, String> map, TranslationType type)
    method initState (line 150) | void initState()
    method dispose (line 167) | void dispose()
    method findSearchSources (line 173) | void findSearchSources()
    method updateSearchSourcesIfNeeded (line 191) | void updateSearchSourcesIfNeeded()
    method manageSearchSources (line 200) | void manageSearchSources()
    method buildEmpty (line 204) | Widget buildEmpty()
    method build (line 226) | Widget build(BuildContext context)
    method buildSlivers (line 237) | Iterable<Widget> buildSlivers()
    method buildSearchTarget (line 257) | Widget buildSearchTarget()
    method useDefaultOptions (line 310) | void useDefaultOptions()
    method buildSearchOptions (line 315) | Widget buildSearchOptions()
    method buildSuggestions (line 354) | Widget buildSuggestions(BuildContext context)
    method check (line 355) | bool check(String text, String key, String value)
    method onSelected (line 370) | void onSelected(String text, TranslationType? type)
    method buildItem (line 398) | Widget buildItem(Pair<String, TranslationType> value)
  class SearchOptionWidget (line 507) | class SearchOptionWidget extends StatelessWidget {
    method build (line 525) | Widget build(BuildContext context)
  class _SearchHistory (line 581) | class _SearchHistory extends StatefulWidget {
    method createState (line 587) | State<_SearchHistory> createState()
  class _SearchHistoryState (line 590) | class _SearchHistoryState extends State<_SearchHistory> {
    method build (line 592) | Widget build(BuildContext context)
    method buildItem (line 647) | Widget buildItem(int index)
    method showMenu (line 648) | void showMenu(Offset offset)

FILE: lib/pages/search_result_page.dart
  class SearchResultPage (line 12) | class SearchResultPage extends StatefulWidget {
    method createState (line 27) | State<SearchResultPage> createState()
  class _SearchResultPageState (line 30) | class _SearchResultPageState extends State<SearchResultPage> {
    method search (line 43) | void search([String? text])
    method onChanged (line 57) | void onChanged(String s)
    method dispose (line 89) | void dispose()
    method checkAutoLanguage (line 96) | String checkAutoLanguage(String text)
    method initState (line 117) | void initState()
    method validateOptions (line 131) | void validateOptions()
    method build (line 146) | Widget build(BuildContext context)
    method buildAction (line 180) | Widget buildAction()
  class _SuggestionsController (line 211) | class _SuggestionsController {
    method updateWidget (line 220) | void updateWidget()
    method remove (line 224) | void remove()
    method findSuggestions (line 231) | void findSuggestions()
    method check (line 237) | bool check(String text, String key, String value)
    method find (line 252) | void find(Map<String, String> map, TranslationType type)
  class _Suggestions (line 278) | class _Suggestions extends StatefulWidget {
    method createState (line 284) | State<_Suggestions> createState()
  class _SuggestionsState (line 287) | class _SuggestionsState extends State<_Suggestions> {
    method update (line 288) | void update()
    method initState (line 293) | void initState()
    method didUpdateWidget (line 299) | void didUpdateWidget(covariant _Suggestions oldWidget)
    method build (line 308) | Widget build(BuildContext context)
    method buildSuggestions (line 312) | Widget buildSuggestions(BuildContext context)
    method buildItem (line 316) | Widget buildItem(Pair<String, TranslationType> value)
    method check (line 378) | bool check(String text, String key, String value)
    method onSelected (line 393) | void onSelected(String text, TranslationType? type)
  class _SearchSettingsDialog (line 420) | class _SearchSettingsDialog extends StatefulWidget {
    method createState (line 426) | State<_SearchSettingsDialog> createState()
  class _SearchSettingsDialogState (line 429) | class _SearchSettingsDialogState extends State<_SearchSettingsDialog> {
    method initState (line 435) | void initState()
    method onChanged (line 441) | void onChanged()
    method build (line 447) | Widget build(BuildContext context)
    method buildSearchOptions (line 496) | Widget buildSearchOptions()

FILE: lib/pages/settings/about.dart
  class AboutSettings (line 3) | class AboutSettings extends StatefulWidget {
    method createState (line 7) | State<AboutSettings> createState()
  class _AboutSettingsState (line 10) | class _AboutSettingsState extends State<AboutSettings> {
    method build (line 14) | Widget build(BuildContext context)
  function checkUpdate (line 87) | Future<bool> checkUpdate()
  function checkUpdateUi (line 99) | Future<void> checkUpdateUi([bool showMessageIfNoUpdate = true, bool dela...
  function _compareVersion (line 136) | bool _compareVersion(String version1, String version2)

FILE: lib/pages/settings/app.dart
  class AppSettings (line 3) | class AppSettings extends StatefulWidget {
    method createState (line 7) | State<AppSettings> createState()
  class _AppSettingsState (line 10) | class _AppSettingsState extends State<AppSettings> {
    method build (line 12) | Widget build(BuildContext context)
  class LogsPage (line 188) | class LogsPage extends StatefulWidget {
    method createState (line 192) | State<LogsPage> createState()
  class _LogsPageState (line 195) | class _LogsPageState extends State<LogsPage> {
    method build (line 199) | Widget build(BuildContext context)
    method saveLog (line 340) | void saveLog(String log)
  class _WebdavSetting (line 345) | class _WebdavSetting extends StatefulWidget {
    method createState (line 349) | State<_WebdavSetting> createState()
  class _WebdavSettingState (line 352) | class _WebdavSettingState extends State<_WebdavSetting> {
    method initState (line 364) | void initState()
    method onAutoSyncChanged (line 382) | void onAutoSyncChanged(bool value)
    method build (line 391) | Widget build(BuildContext context)

FILE: lib/pages/settings/appearance.dart
  class AppearanceSettings (line 3) | class AppearanceSettings extends StatefulWidget {
    method createState (line 7) | State<AppearanceSettings> createState()
  class _AppearanceSettingsState (line 10) | class _AppearanceSettingsState extends State<AppearanceSettings> {
    method build (line 12) | Widget build(BuildContext context)

FILE: lib/pages/settings/debug.dart
  class DebugPage (line 3) | class DebugPage extends StatefulWidget {
    method createState (line 7) | State<DebugPage> createState()
  class DebugPageState (line 10) | class DebugPageState extends State<DebugPage> {
    method build (line 16) | Widget build(BuildContext context)

FILE: lib/pages/settings/explore_settings.dart
  class ExploreSettings (line 3) | class ExploreSettings extends StatefulWidget {
    method createState (line 7) | State<ExploreSettings> createState()
  class _ExploreSettingsState (line 10) | class _ExploreSettingsState extends State<ExploreSettings> {
    method build (line 12) | Widget build(BuildContext context)
  class _ManageBlockingWordView (line 114) | class _ManageBlockingWordView extends StatefulWidget {
    method createState (line 118) | State<_ManageBlockingWordView> createState()
  class _ManageBlockingWordViewState (line 122) | class _ManageBlockingWordViewState extends State<_ManageBlockingWordView> {
    method build (line 124) | Widget build(BuildContext context)
    method add (line 154) | void add()
  function setExplorePagesWidget (line 203) | Widget setExplorePagesWidget()
  function setCategoryPagesWidget (line 217) | Widget setCategoryPagesWidget()
  function setFavoritesPagesWidget (line 231) | Widget setFavoritesPagesWidget()
  function setSearchSourcesWidget (line 245) | Widget setSearchSourcesWidget()
  class _ManageBlockingCommentWordView (line 259) | class _ManageBlockingCommentWordView extends StatefulWidget {
    method createState (line 263) | State<_ManageBlockingCommentWordView> createState()
  class _ManageBlockingCommentWordViewState (line 267) | class _ManageBlockingCommentWordViewState extends State<_ManageBlockingC...
    method build (line 269) | Widget build(BuildContext context)
    method add (line 299) | void add()

FILE: lib/pages/settings/local_favorites.dart
  class LocalFavoritesSettings (line 3) | class LocalFavoritesSettings extends StatefulWidget {
    method createState (line 7) | State<LocalFavoritesSettings> createState()
  class _LocalFavoritesSettingsState (line 10) | class _LocalFavoritesSettingsState extends State<LocalFavoritesSettings> {
    method build (line 12) | Widget build(BuildContext context)

FILE: lib/pages/settings/network.dart
  class NetworkSettings (line 3) | class NetworkSettings extends StatefulWidget {
    method createState (line 7) | State<NetworkSettings> createState()
  class _NetworkSettingsState (line 10) | class _NetworkSettingsState extends State<NetworkSettings> {
    method build (line 12) | Widget build(BuildContext context)
  class _ProxySettingView (line 36) | class _ProxySettingView extends StatefulWidget {
    method createState (line 40) | State<_ProxySettingView> createState()
  class _ProxySettingViewState (line 43) | class _ProxySettingViewState extends State<_ProxySettingView> {
    method toProxyStr (line 51) | String toProxyStr()
    method parseProxyString (line 72) | void parseProxyString(String proxy)
    method initState (line 103) | void initState()
    method build (line 110) | Widget build(BuildContext context)
    method buildManualProxy (line 149) | Widget buildManualProxy()
  class _DNSOverrides (line 235) | class _DNSOverrides extends StatefulWidget {
    method createState (line 239) | State<_DNSOverrides> createState()
  class __DNSOverridesState (line 242) | class __DNSOverridesState extends State<_DNSOverrides> {
    method initState (line 246) | void initState()
    method dispose (line 259) | void dispose()
    method build (line 271) | Widget build(BuildContext context)
    method buildOverride (line 309) | Widget buildOverride(int index)

FILE: lib/pages/settings/reader.dart
  class ReaderSettings (line 3) | class ReaderSettings extends StatefulWidget {
    method createState (line 16) | State<ReaderSettings> createState()
  class _ReaderSettingsState (line 19) | class _ReaderSettingsState extends State<ReaderSettings> {
    method _isChapterCommentsAtEndSupported (line 20) | bool _isChapterCommentsAtEndSupported()
    method _onShowChapterCommentsChanged (line 52) | void _onShowChapterCommentsChanged()
    method build (line 87) | Widget build(BuildContext context)
  class _CustomImageProcessing (line 450) | class _CustomImageProcessing extends StatefulWidget {
    method createState (line 454) | State<_CustomImageProcessing> createState()
  class __CustomImageProcessingState (line 457) | class __CustomImageProcessingState extends State<_CustomImageProcessing> {
    method initState (line 461) | void initState()
    method dispose (line 467) | void dispose()
    method build (line 476) | Widget build(BuildContext context)

FILE: lib/pages/settings/setting_components.dart
  class _SwitchSetting (line 3) | class _SwitchSetting extends StatefulWidget {
    method createState (line 29) | State<_SwitchSetting> createState()
  class _SwitchSettingState (line 32) | class _SwitchSettingState extends State<_SwitchSetting> {
    method build (line 34) | Widget build(BuildContext context)
  class SelectSetting (line 76) | class SelectSetting extends StatelessWidget {
    method build (line 106) | Widget build(BuildContext context)
  class _DoubleLineSelectSettings (line 140) | class _DoubleLineSelectSettings extends StatefulWidget {
    method createState (line 169) | State<_DoubleLineSelectSettings> createState()
  class _DoubleLineSelectSettingsState (line 173) | class _DoubleLineSelectSettingsState extends State<_DoubleLineSelectSett...
    method build (line 175) | Widget build(BuildContext context)
  class _EndSelectorSelectSetting (line 271) | class _EndSelectorSelectSetting extends StatefulWidget {
    method createState (line 300) | State<_EndSelectorSelectSetting> createState()
  class _EndSelectorSelectSettingState (line 304) | class _EndSelectorSelectSettingState extends State<_EndSelectorSelectSet...
    method build (line 306) | Widget build(BuildContext context)
  class _SliderSetting (line 376) | class _SliderSetting extends StatefulWidget {
    method createState (line 408) | State<_SliderSetting> createState()
  class _SliderSettingState (line 411) | class _SliderSettingState extends State<_SliderSetting> {
    method build (line 413) | Widget build(BuildContext context)
  class _PopupWindowSetting (line 480) | class _PopupWindowSetting extends StatelessWidget {
    method build (line 488) | Widget build(BuildContext context)
  class _MultiPagesFilter (line 499) | class _MultiPagesFilter extends StatefulWidget {
    method createState (line 514) | State<_MultiPagesFilter> createState()
  class _MultiPagesFilterState (line 517) | class _MultiPagesFilterState extends State<_MultiPagesFilter> {
    method initState (line 521) | void initState()
    method dispose (line 528) | void dispose()
    method build (line 540) | Widget build(BuildContext context)
    method buildItem (line 593) | Widget buildItem(String key)
    method showAddDialog (line 616) | void showAddDialog()
    method updateSetting (line 691) | void updateSetting()
  class _CallbackSetting (line 697) | class _CallbackSetting extends StatelessWidget {
    method build (line 714) | Widget build(BuildContext context)
  class _SettingPartTitle (line 727) | class _SettingPartTitle extends StatelessWidget {
    method build (line 735) | Widget build(BuildContext context)

FILE: lib/pages/settings/settings_page.dart
  class SettingsPage (line 33) | class SettingsPage extends StatefulWidget {
    method createState (line 39) | State<SettingsPage> createState()
  class _SettingsPageState (line 42) | class _SettingsPageState extends State<SettingsPage> {
    method initState (line 72) | void initState()
    method build (line 78) | Widget build(BuildContext context)
    method buildBody (line 84) | Widget buildBody()
    method buildLeft (line 144) | Widget buildLeft()
    method buildCategories (line 184) | Widget buildCategories()
    method buildItem (line 185) | Widget buildItem(String name, int id)
    method buildRight (line 239) | Widget buildRight()
    method _buildSettingsContent (line 255) | Widget _buildSettingsContent(int pageIndex)
  class _SettingsDetailPage (line 271) | class _SettingsDetailPage extends StatelessWidget {
    method build (line 277) | Widget build(BuildContext context)
    method _buildPage (line 283) | Widget _buildPage()

FILE: lib/pages/webview.dart
  function getCookies (line 21) | Future<List<io.Cookie>?> getCookies(String url)
  function getUA (line 44) | Future<String?> getUA()
  class AppWebview (line 55) | class AppWebview extends StatefulWidget {
    method createState (line 82) | State<AppWebview> createState()
  class _AppWebviewState (line 85) | class _AppWebviewState extends State<AppWebview> {
    method _createWebviewEnvironment (line 94) | Future<bool> _createWebviewEnvironment()
    method build (line 125) | Widget build(BuildContext context)
    method createWebviewWithEnvironment (line 196) | Widget createWebviewWithEnvironment(WebViewEnvironment? e)
  class DesktopWebview (line 239) | class DesktopWebview {
    method isAvailable (line 240) | Future<bool> isAvailable()
    method onMessage (line 265) | void onMessage(String message)
    method _runTimer (line 280) | void _runTimer()
    method open (line 305) | void open()
    method evaluateJavascript (line 331) | Future<String?> evaluateJavascript(String source)
    method getCookies (line 335) | Future<Map<String, String>> getCookies(String url)
    method _removeCode0 (line 346) | String _removeCode0(String s)
    method _cookieMatch (line 352) | bool _cookieMatch(String url, String domain)
    method _getAcceptedDomains (line 359) | List<String> _getAcceptedDomains(String host)
    method close (line 368) | void close()

FILE: lib/utils/app_links.dart
  function handleLinks (line 6) | void handleLinks()
  function handleAppLink (line 13) | Future<bool> handleAppLink(Uri uri)

FILE: lib/utils/cbz.dart
  class ComicMetaData (line 12) | class ComicMetaData {
    method toJson (line 21) | Map<String, dynamic> toJson()
  class ComicChapter (line 45) | class ComicChapter {
    method toJson (line 52) | Map<String, dynamic> toJson()
  class CBZ (line 63) | abstract class CBZ {
    method checkType (line 64) | Future<FileType> checkType(File file)
    method extractArchive (line 73) | Future<void> extractArchive(File file, Directory out)
    method import (line 84) | Future<LocalComic> import(File file)
    method export (line 188) | Future<File> export(LocalComic comic, String outFilePath)
    method _buildComicInfoXml (line 256) | String _buildComicInfoXml(ComicMetaData data)
    method _escapeXml (line 293) | String _escapeXml(String text)
    method _compress (line 302) | _compress(String src, String dst)

FILE: lib/utils/channel.dart
  class Channel (line 4) | class Channel<T> {
    method push (line 19) | Future<void> push(T item)
    method pop (line 36) | Future<T?> pop()
    method close (line 53) | void close()

FILE: lib/utils/clipboard_image.dart
  function writeImageToClipboard (line 6) | Future<void> writeImageToClipboard(Uint8List imageBytes)

FILE: lib/utils/data.dart
  function exportAppData (line 18) | Future<File> exportAppData([bool sync = true])
  function importAppData (line 47) | Future<void> importAppData(File file, [bool checkVersion = false])
  function importPicaData (line 115) | Future<void> importPicaData(File file)

FILE: lib/utils/data_sync.dart
  class DataSync (line 18) | class DataSync with ChangeNotifier {
    method onDataChanged (line 33) | void onDataChanged()
    method _handleWindowClose (line 39) | bool _handleWindowClose()
    method _showWindowCloseDialog (line 47) | void _showWindowCloseDialog()
    method _validateConfig (line 85) | List<String>? _validateConfig()
    method uploadData (line 99) | Future<Res<bool>> uploadData()
    method downloadData (line 167) | Future<Res<bool>> downloadData()

FILE: lib/utils/epub.dart
  class EpubData (line 10) | class EpubData {
  function createEpubComic (line 27) | Future<File> createEpubComic(
  function createEpubWithLocalComic (line 181) | Future<File> createEpubWithLocalComic(

FILE: lib/utils/ext.dart
  function getNoBlankList (line 3) | List<T> getNoBlankList()
  function firstWhereOrNull (line 13) | T? firstWhereOrNull(bool Function(T element) test)
  function addIfNotNull (line 22) | void addIfNotNull(T? value)
  function isEqualTo (line 30) | bool isEqualTo(List<T> list)
  function toList (line 48) | List<String> toList()
  function _nums (line 50) | String _nums()
  function setValueAt (line 60) | String setValueAt(String value, int index)
  function subStringOrNull (line 64) | String? subStringOrNull(int start, [int? end])
  function replaceLast (line 71) | String replaceLast(String from, String to)
  function _isURL (line 86) | bool _isURL()
  class ListOrNull (line 100) | abstract class ListOrNull{
    method from (line 101) | List<T>? from<T>(Iterable<dynamic>? i)
  class MapOrNull (line 106) | abstract class MapOrNull{
    method from (line 107) | Map<K, V>? from<K, V>(Map<dynamic, dynamic>? i)
  function minTime (line 114) | Future<T> minTime(Duration duration)

FILE: lib/utils/file_type.dart
  class FileType (line 3) | class FileType {
    method fromExtension (line 9) | FileType fromExtension(String ext)
  function detectFileType (line 35) | FileType detectFileType(List<int> data)

FILE: lib/utils/handle_text_share.dart
  function handleTextShare (line 9) | void handleTextShare()

FILE: lib/utils/image.dart
  class Image (line 9) | class Image {
    method decodeImage (line 25) | Future<Image> decodeImage(Uint8List data)
    method getPixelAtIndex (line 42) | Color getPixelAtIndex(int index)
    method copyRange (line 50) | Image copyRange(int x, int y, int width, int height)
    method fillImageAt (line 74) | void fillImageAt(int x, int y, Image image)
    method fillImageRangeAt (line 96) | void fillImageRangeAt(
    method copyAndRotate90 (line 134) | Image copyAndRotate90()
    method getPixel (line 144) | Color getPixel(int x, int y)
    method setPixel (line 156) | void setPixel(int x, int y, Color color)
    method encodePng (line 168) | Uint8List encodePng()
  class Color (line 179) | class Color {
  class JsEngine (line 196) | class JsEngine {
    method runCode (line 212) | dynamic runCode(String js, [String? name])
    method setImage (line 220) | int setImage(Image image)
    method _messageReceiver (line 226) | Object? _messageReceiver(dynamic message)
  function modifyImageWithScript (line 296) | Future<Uint8List> modifyImageWithScript(Uint8List data, String script)

FILE: lib/utils/import_comic.dart
  class ImportComic (line 17) | class ImportComic {
    method cbz (line 23) | Future<bool> cbz()
    method multipleCbz (line 41) | Future<bool> multipleCbz()
    method ehViewer (line 69) | Future<bool> ehViewer()
    method validateComics (line 86) | Future<List<LocalComic>> validateComics(List<sql.Row> comics)
    method directory (line 168) | Future<bool> directory(bool single)
    method localDownloads (line 201) | Future<bool> localDownloads()
    method _checkSingleComic (line 243) | Future<LocalComic?> _checkSingleComic(Directory directory,
    method _copyDirectories (line 319) | Future<Map<String, String>> _copyDirectories(
    method _copyComicsToLocalDir (line 344) | Future<Map<String?, List<LocalComic>>> _copyComicsToLocalDir(
    method registerComics (line 391) | Future<bool> registerComics(

FILE: lib/utils/init.dart
  class Init (line 6) | abstract mixin class Init {
    method ensureInit (line 12) | Future<void> ensureInit()
    method _markInit (line 21) | Future<void> _markInit()
    method doInit (line 30) | Future<void> doInit()
    method init (line 33) | Future<void> init()

FILE: lib/utils/io.dart
  class IO (line 17) | class IO {
  class FilePath (line 27) | class FilePath {
    method join (line 30) | String join(String path1, String path2,
  function deleteIgnoreError (line 43) | Future<void> deleteIgnoreError({bool recursive = false})
  function deleteIfExists (line 52) | Future<void> deleteIfExists({bool recursive = false})
  function deleteIfExistsSync (line 59) | void deleteIfExistsSync({bool recursive = false})
  function copyMem (line 73) | Future<void> copyMem(String newPath)
  function renameX (line 99) | Directory renameX(String newName)
  function joinFile (line 104) | File joinFile(String name)
  function deleteContentsSync (line 109) | void deleteContentsSync({recursive = true})
  function deleteContents (line 117) | Future<void> deleteContents({recursive = true})
  function forceCreateSync (line 125) | void forceCreateSync()
  function sanitizeFileName (line 134) | String sanitizeFileName(String fileName, {String? dir, int? maxLength})
  function copyDirectory (line 161) | Future<void> copyDirectory(Directory source, Directory destination)
  function copyDirectoryIsolate (line 181) | Future<void> copyDirectoryIsolate(
  function findValidDirectoryName (line 186) | String findValidDirectoryName(String path, String directory)
  class DirectoryPicker (line 198) | class DirectoryPicker {
    method pickDirectory (line 215) | Future<Directory?> pickDirectory({bool directAccess = false})
  class IOSDirectoryPicker (line 249) | class IOSDirectoryPicker {
    method selectDirectory (line 253) | Future<String?> selectDirectory()
  function selectFile (line 269) | Future<FileSelectResult?> selectFile({required List<String> ext})
  function selectDirectory (line 314) | Future<String?> selectDirectory()
  function selectDirectoryIOS (line 327) | Future<String?> selectDirectoryIOS()
  function saveFile (line 331) | Future<void> saveFile(
  class _IOOverrides (line 365) | final class _IOOverrides extends IOOverrides {
    method createDirectory (line 367) | Directory createDirectory(String path)
    method createFile (line 380) | File createFile(String path)
  function overrideIO (line 396) | T overrideIO<T>(T Function() f)
  class Share (line 403) | class Share {
    method shareFile (line 404) | void shareFile({
    method shareText (line 422) | void shareText(String text)
  function bytesToReadableString (line 427) | String bytesToReadableString(int bytes)
  class FileSelectResult (line 439) | class FileSelectResult {
    method saveTo (line 452) | Future<void> saveTo(String path)
    method readAsBytes (line 456) | Future<Uint8List> readAsBytes()

FILE: lib/utils/opencc.dart
  class OpenCC (line 5) | abstract class OpenCC {
    method init (line 9) | Future<void> init()
    method hasChineseSimplified (line 23) | bool hasChineseSimplified(String text)
    method hasChineseTraditional (line 35) | bool hasChineseTraditional(String text)
    method simplifiedToTraditional (line 44) | String simplifiedToTraditional(String text)
    method traditionalToSimplified (line 56) | String traditionalToSimplified(String text)

FILE: lib/utils/pdf.dart
  type DecodeImage (line 11) | typedef DecodeImage = Future<Image> Function(Uint8List data);
  function _createPdfFromComic (line 13) | Future<void> _createPdfFromComic({
  function reorderFiles (line 30) | void reorderFiles(List<FileSystemEntity> files)
  function _runIsolate (line 72) | Future<Isolate> _runIsolate(
  function decodeImage (line 86) | Future<Image> decodeImage(Uint8List data)
  function createPdfFromComicIsolate (line 119) | Future<File> createPdfFromComicIsolate(LocalComic comic, String savePath)
  class PdfGenerator (line 142) | class PdfGenerator {
    method generate (line 166) | Future<void> generate()
    method write (line 172) | void write(String str)
    method writeData (line 178) | void writeData(Uint8List data)
    method getCurrentLength (line 183) | int getCurrentLength()
    method _codeUnitForDigit (line 324) | int _codeUnitForDigit(int digit)
    method _toPdfString (line 327) | Uint8List _toPdfString(String str)
    method _encodeUtf16be (line 342) | List<int> _encodeUtf16be(String str)
    method add (line 358) | void add(int unit)
    method _formatDateTime (line 380) | String _formatDateTime(DateTime dt)
    method _getImage (line 391) | Future<({int width, int height, Uint8List data})> _getImage(

FILE: lib/utils/tags_translation.dart
  function readData (line 17) | Future<void> readData()
  function _haveNamespace (line 31) | bool _haveNamespace(String key)
  function _translateTags (line 36) | String _translateTags(String tag)
  function translateTag (line 66) | String translateTag(String tag)
  function translationTagWithNamespace (line 75) | String translationTagWithNamespace(String text, String namespace)
  function _categoryTextDynamic (line 96) | String _categoryTextDynamic(String c)
  type TranslationType (line 191) | enum TranslationType{
  class MultipleMap (line 196) | class MultipleMap<S, T>{

FILE: lib/utils/translations.dart
  function _translate (line 8) | String _translate()
  function tlParams (line 21) | String tlParams(Map<String, Object> values)
  function init (line 31) | Future<void> init()
  function ts (line 40) | String ts(String sourceKey)
  function _translate (line 56) | List<String> _translate()

FILE: lib/utils/volume.dart
  class VolumeListener (line 5) | class VolumeListener {
    method listen (line 16) | void listen()
    method onEvent (line 20) | void onEvent(event)
    method cancel (line 28) | void cancel()

FILE: linux/main.cc
  function main (line 3) | int main(int argc, char** argv) {

FILE: linux/my_application.cc
  type _MyApplication (line 12) | struct _MyApplication {
  function handle_clipboard_call (line 20) | static void handle_clipboard_call(FlMethodChannel* channel, FlMethodCall...
  function my_application_activate (line 48) | static void my_application_activate(GApplication* application) {
  function gboolean (line 112) | static gboolean my_application_local_command_line(GApplication* applicat...
  function my_application_startup (line 131) | static void my_application_startup(GApplication* application) {
  function my_application_shutdown (line 140) | static void my_application_shutdown(GApplication* application) {
  function my_application_dispose (line 149) | static void my_application_dispose(GObject* object) {
  function my_application_class_init (line 156) | static void my_application_class_init(MyApplicationClass* klass) {
  function my_application_init (line 164) | static void my_application_init(MyApplication* self) {}
  function MyApplication (line 166) | MyApplication* my_application_new() {

FILE: patch/font.dart
  function main (line 6) | void main()

FILE: test/channel_test.dart
  function main (line 4) | void main()

FILE: update_alt_store.py
  function prepare_description (line 8) | def prepare_description(text):
  function fetch_latest_release (line 17) | def fetch_latest_release(repo_url):
  function get_file_size (line 31) | def get_file_size(url):
  function update_json_file_release (line 40) | def update_json_file_release(json_file, latest_release):
  function main (line 137) | def main():

FILE: windows/runner/flutter_window.cpp
  function monitorUIThread (line 53) | void monitorUIThread() {
  function mouse_side_button_listener (line 206) | void mouse_side_button_listener(unsigned int input)
  function LRESULT (line 214) | LRESULT

FILE: windows/runner/flutter_window.h
  function class (line 12) | class FlutterWindow : public Win32Window {

FILE: windows/runner/main.cpp
  function wWinMain (line 8) | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,

FILE: windows/runner/utils.cpp
  function CreateAndAttachConsole (line 10) | void CreateAndAttachConsole() {
  function GetCommandLineArguments (line 24) | std::vector<std::string> GetCommandLineArguments() {
  function Utf8FromUtf16 (line 44) | std::string Utf8FromUtf16(const wchar_t* utf16_string) {

FILE: windows/runner/win32_window.cpp
  function Scale (line 36) | int Scale(int source, double scale_factor) {
  function EnableFullDpiSupportIfAvailable (line 42) | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
  class WindowClassRegistrar (line 59) | class WindowClassRegistrar {
    method WindowClassRegistrar (line 64) | static WindowClassRegistrar* GetInstance() {
    method WindowClassRegistrar (line 80) | WindowClassRegistrar() = default;
  function wchar_t (line 89) | const wchar_t* WindowClassRegistrar::GetWindowClass() {
  function LRESULT (line 177) | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
  function LRESULT (line 196) | LRESULT
  function Win32Window (line 256) | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
  function RECT (line 272) | RECT Win32Window::GetClientArea() {
  function HWND (line 278) | HWND Win32Window::GetHandle() {

FILE: windows/runner/win32_window.h
  type Size (line 21) | struct Size {
Condensed preview — 256 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,082K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yaml",
    "chars": 1791,
    "preview": "name: Report a bug\ndescription: Reporting problems with the APP\ntitle: \"[Bug]: \"\nlabels: [\"bug🐞\"]\nbody:\n  - type: markdo"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.yaml",
    "chars": 1266,
    "preview": "name: Feature Request\ndescription: Suggest improvements to the APP\ntitle: \"[Enhancement]: \"\nlabels: [\"enhancement🚀\"]\nbod"
  },
  {
    "path": ".github/workflows/analyze.yml",
    "chars": 403,
    "preview": "name: \"analyze\"\non:\n  pull_request:\n  push:\n    branches:\n      - master\n\njobs:\n  analyze:\n    runs-on: ubuntu-latest\n  "
  },
  {
    "path": ".github/workflows/delete_old_workflows.yml",
    "chars": 2348,
    "preview": "name: Delete old workflow runs\non:\n  workflow_dispatch:\n    inputs:\n      days:\n        description: 'Days-worth of runs"
  },
  {
    "path": ".github/workflows/fastlane.yml",
    "chars": 417,
    "preview": "name: Validate Fastlane metadata\n\non:\n  workflow_dispatch:\n  push:\n      branches: [ \"master\" ]\n      paths:\n        - '"
  },
  {
    "path": ".github/workflows/issue_check.yml",
    "chars": 1262,
    "preview": "name: Check Issue\n\non:\n  issues:\n    types: [opened]\n\npermissions:\n  contents: read\n  issues: write\n\njobs:\n  check:\n    "
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 7727,
    "preview": "name: Build ALL\nrun-name: Build ALL\non:\n  workflow_dispatch: {}\n  release:\n    types: [published]\n\njobs:\n  Build_MacOS:\n"
  },
  {
    "path": ".github/workflows/update_alt_store.yml",
    "chars": 3210,
    "preview": "name: Update AltStore Source\n\non:\n  workflow_run:\n    workflows: [\"Build ALL\"]\n    types: [completed]\n  workflow_dispatc"
  },
  {
    "path": ".gitignore",
    "chars": 751,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ re"
  },
  {
    "path": ".metadata",
    "chars": 1560,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 1607,
    "preview": "# venera\n[![flutter](https://img.shields.io/badge/flutter-3.41.4-blue)](https://flutter.dev/)\n[![License](https://img.sh"
  },
  {
    "path": "alt_store.json",
    "chars": 14405,
    "preview": "{\n  \"name\": \"Venera\",\n  \"identifier\": \"com.github.wgh136.venera.source\",\n  \"website\": \"https://github.com/venera-app/ven"
  },
  {
    "path": "analysis_options.yaml",
    "chars": 1459,
    "preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
  },
  {
    "path": "android/.gitignore",
    "chars": 296,
    "preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
  },
  {
    "path": "android/app/build.gradle",
    "chars": 4296,
    "preview": "plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    // The Flutter Gradle Plugin must be applied afte"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "chars": 378,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for d"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "chars": 4057,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permiss"
  },
  {
    "path": "android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt",
    "chars": 15602,
    "preview": "package com.github.wgh136.venera\n\nimport android.Manifest\nimport android.app.Activity\nimport android.content.ContentReso"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "chars": 434,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "chars": 438,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 328,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <bac"
  },
  {
    "path": "android/app/src/main/res/values/strings.xml",
    "chars": 109,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"share_text\">Search</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "chars": 1308,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "chars": 1307,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-zh/strings.xml",
    "chars": 105,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"share_text\">搜尋</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values-zh-rCN/strings.xml",
    "chars": 105,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"share_text\">搜索</string>\n</resources>"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "chars": 378,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for d"
  },
  {
    "path": "android/build.gradle",
    "chars": 322,
    "preview": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.buildDir = \"../build\"\nsubp"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 201,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
  },
  {
    "path": "android/gradle.properties",
    "chars": 221,
    "preview": "org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError\nandroid.useAndroidX=true\nandroid.enableJetifier=true\nandroid.d"
  },
  {
    "path": "android/settings.gradle",
    "chars": 727,
    "preview": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\")"
  },
  {
    "path": "assets/init.js",
    "chars": 38512,
    "preview": "/*\nVenera JavaScript Library\n\nThis library provides a set of APIs for interacting with the Venera app.\n*/\n\n/**\n * @funct"
  },
  {
    "path": "assets/opencc.txt",
    "chars": 12059,
    "preview": "# OpenCC Simplified Chinese to Traditional Chinese conversion table\n# Original source: https://github.com/BYVoid/OpenCC\n"
  },
  {
    "path": "assets/tags.json",
    "chars": 775722,
    "preview": "{\"rows\":{\"female\":\"女性\",\"male\":\"男性\",\"mixed\":\"混合\",\"language\":\"语言\",\"other\":\"其他\",\"group\":\"团队\",\"artist\":\"艺术家\",\"cosplayer\":\"Co"
  },
  {
    "path": "assets/tags_tw.json",
    "chars": 1086558,
    "preview": "{\n    \"rows\": {\n        \"female\": \"女性\",\n        \"male\": \"男性\",\n        \"mixed\": \"混合\",\n        \"language\": \"語言\",\n        \""
  },
  {
    "path": "assets/translation.json",
    "chars": 30928,
    "preview": "{\n  \"zh_CN\": {\n    \"Home\": \"主页\",\n    \"Favorites\": \"收藏\",\n    \"Explore\": \"发现\",\n    \"Categories\": \"分类\",\n    \"Settings\": \"设置"
  },
  {
    "path": "debian/build.py",
    "chars": 1145,
    "preview": "import subprocess\nimport sys\n\narch = sys.argv[1]\ndebianContent = ''\ndesktopContent = ''\nversion = ''\n\nwith open('debian/"
  },
  {
    "path": "debian/debian.yaml",
    "chars": 331,
    "preview": "flutter_app: \n  command: venera\n  arch: {{Arch}}\n  parent: /usr/local/lib\n  nonInteractive: true\n\ncontrol:\n  Package: ve"
  },
  {
    "path": "debian/gui/venera.desktop",
    "chars": 155,
    "preview": "[Desktop Entry]\nName=Venera\nGenericName=Venera\nComment=venera\nTerminal=false\nType=Application\nCategories=Utility\nKeyword"
  },
  {
    "path": "doc/comic_source.md",
    "chars": 23433,
    "preview": "# Comic Source\n\n## Introduction\n\nVenera is a comic reader that can read comics from various sources. \n\nAll comic sources"
  },
  {
    "path": "doc/headless_doc.md",
    "chars": 4204,
    "preview": "# Venera Headless Mode\n\nVenera's headless mode allows you to run key features from the command line, making it easy to a"
  },
  {
    "path": "doc/import_comic.md",
    "chars": 1918,
    "preview": "# Import Comic\n\n## Introduction\n\nVenera supports importing comics from local files.\nHowever, the comic files must be in "
  },
  {
    "path": "doc/js_api.md",
    "chars": 13391,
    "preview": "# Javascript API\n\n## Overview\n\nThe Javascript API is a set of functions that used to interact application.\n\nThere are fo"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "chars": 652,
    "preview": "<p>A comic reader that support reading local and network comics.</p>\n<h3>Features</h3>\n<ul>\n<li>Read local comics</li>\n<"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "chars": 62,
    "preview": "A comic reader that support reading local and network comics.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "chars": 7,
    "preview": "venera\n"
  },
  {
    "path": "ios/.gitignore",
    "chars": 569,
    "preview": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/De"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "chars": 774,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "chars": 107,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "chars": 109,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "chars": 1415,
    "preview": "# Uncomment this line to define a global platform for your project\nplatform :ios, '13.0'\n\n# CocoaPods analytics sends ne"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "chars": 3244,
    "preview": "import Flutter\nimport UIKit\nimport UniformTypeIdentifiers\nimport Foundation // 添加此行\n\n@main\n@objc class AppDelegate: Flut"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2630,
    "preview": "{\n  \"images\": [\n    {\n      \"filename\": \"AppIcon@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"6"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "chars": 391,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "chars": 336,
    "preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "chars": 2377,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "chars": 1605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "ios/Runner/DirectoryPicker.swift",
    "chars": 1078,
    "preview": "import UIKit\nimport Flutter\n\nclass DirectoryPicker: NSObject, UIDocumentPickerDelegate {\n    private var result: Flutter"
  },
  {
    "path": "ios/Runner/Info.plist",
    "chars": 2021,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "chars": 38,
    "preview": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "chars": 27836,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "chars": 3647,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "chars": 224,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodepr"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/RunnerTests/RunnerTests.swift",
    "chars": 285,
    "preview": "import Flutter\nimport UIKit\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n  func testExample() {\n    // If you add cod"
  },
  {
    "path": "lib/components/appbar.dart",
    "chars": 25122,
    "preview": "part of 'components.dart';\n\nclass Appbar extends StatefulWidget implements PreferredSizeWidget {\n  const Appbar({\n    re"
  },
  {
    "path": "lib/components/button.dart",
    "chars": 9886,
    "preview": "part of 'components.dart';\n\nclass HoverBox extends StatefulWidget {\n  const HoverBox(\n      {super.key, required this.ch"
  },
  {
    "path": "lib/components/code.dart",
    "chars": 10270,
    "preview": "part of 'components.dart';\n\nclass CodeEditor extends StatefulWidget {\n  const CodeEditor({super.key, this.initialValue, "
  },
  {
    "path": "lib/components/comic.dart",
    "chars": 47360,
    "preview": "part of 'components.dart';\n\nImageProvider? _findImageProvider(Comic comic) {\n  ImageProvider image;\n  if (comic is Local"
  },
  {
    "path": "lib/components/components.dart",
    "chars": 1890,
    "preview": "import 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:math' as math;\nimport 'dart:ui' as ui"
  },
  {
    "path": "lib/components/consts.dart",
    "chars": 87,
    "preview": "part of 'components.dart';\n\nconst _fastAnimationDuration = Duration(milliseconds: 160);"
  },
  {
    "path": "lib/components/custom_slider.dart",
    "chars": 7892,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/foundation/app.dart';\n\n/// patched slider.dart with RtL s"
  },
  {
    "path": "lib/components/effects.dart",
    "chars": 598,
    "preview": "part of 'components.dart';\n\nclass BlurEffect extends StatelessWidget {\n  final Widget child;\n\n  final double blur;\n\n  fi"
  },
  {
    "path": "lib/components/flyout.dart",
    "chars": 6385,
    "preview": "part of \"components.dart\";\n\nconst minFlyoutWidth = 256.0;\nconst minFlyoutHeight = 128.0;\n\nclass FlyoutController {\n  Fun"
  },
  {
    "path": "lib/components/gesture.dart",
    "chars": 1612,
    "preview": "part of 'components.dart';\n\nclass MouseBackDetector extends StatelessWidget {\n  const MouseBackDetector(\n      {super.ke"
  },
  {
    "path": "lib/components/image.dart",
    "chars": 10522,
    "preview": "part of 'components.dart';\n\nclass AnimatedImage extends StatefulWidget {\n  /// show animation when loading is complete.\n"
  },
  {
    "path": "lib/components/js_ui.dart",
    "chars": 6955,
    "preview": "import 'dart:typed_data';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport"
  },
  {
    "path": "lib/components/layout.dart",
    "chars": 5620,
    "preview": "part of 'components.dart';\n\nclass SliverGridViewWithFixedItemHeight extends StatelessWidget {\n  const SliverGridViewWith"
  },
  {
    "path": "lib/components/loading.dart",
    "chars": 10113,
    "preview": "part of 'components.dart';\n\nclass NetworkError extends StatelessWidget {\n  const NetworkError({\n    super.key,\n    requi"
  },
  {
    "path": "lib/components/menu.dart",
    "chars": 3880,
    "preview": "part of \"components.dart\";\n\nvoid showMenuX(BuildContext context, Offset location, List<MenuEntry> entries) {\n  Navigator"
  },
  {
    "path": "lib/components/message.dart",
    "chars": 13345,
    "preview": "part of \"components.dart\";\n\nvoid showToast({\n  required String message,\n  required BuildContext context,\n  Widget? icon,"
  },
  {
    "path": "lib/components/navigation_bar.dart",
    "chars": 17004,
    "preview": "part of 'components.dart';\n\nclass PaneItemEntry {\n  String label;\n\n  IconData icon;\n\n  IconData activeIcon;\n\n  PaneItemE"
  },
  {
    "path": "lib/components/pop_up_widget.dart",
    "chars": 5848,
    "preview": "part of 'components.dart';\n\nclass PopUpWidget<T> extends PopupRoute<T> {\n  PopUpWidget(this.widget);\n\n  final Widget wid"
  },
  {
    "path": "lib/components/rich_comment_content.dart",
    "chars": 9177,
    "preview": "import 'dart:collection';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'packa"
  },
  {
    "path": "lib/components/scroll.dart",
    "chars": 11517,
    "preview": "part of 'components.dart';\n\nclass SmoothCustomScrollView extends StatelessWidget {\n  const SmoothCustomScrollView(\n     "
  },
  {
    "path": "lib/components/select.dart",
    "chars": 7630,
    "preview": "part of 'components.dart';\n\nclass Select extends StatelessWidget {\n  const Select({\n    super.key,\n    required this.cur"
  },
  {
    "path": "lib/components/side_bar.dart",
    "chars": 4796,
    "preview": "part of 'components.dart';\n\nclass SideBarRoute<T> extends PopupRoute<T> {\n  SideBarRoute(this.widget,\n      {this.showBa"
  },
  {
    "path": "lib/components/window_frame.dart",
    "chars": 16338,
    "preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package"
  },
  {
    "path": "lib/foundation/app.dart",
    "chars": 2758,
    "preview": "import 'dart:io';\nimport 'dart:ui';\n\nimport 'package:flutter/material.dart';\nimport 'package:path_provider/path_provider"
  },
  {
    "path": "lib/foundation/app_page_route.dart",
    "chars": 13690,
    "preview": "import 'dart:math';\nimport 'dart:ui';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nim"
  },
  {
    "path": "lib/foundation/appdata.dart",
    "chars": 11134,
    "preview": "import 'dart:convert';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:path_provider/path_provider.dart';\nimp"
  },
  {
    "path": "lib/foundation/cache_manager.dart",
    "chars": 7748,
    "preview": "import 'dart:ffi';\nimport 'dart:isolate';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:sqlite3/sqlite3.dart';\ni"
  },
  {
    "path": "lib/foundation/comic_source/category.dart",
    "chars": 3129,
    "preview": "part of 'comic_source.dart';\n\nclass CategoryData {\n  /// The title is displayed in the tab bar.\n  final String title;\n\n "
  },
  {
    "path": "lib/foundation/comic_source/comic_source.dart",
    "chars": 12109,
    "preview": "library;\n\nimport 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:math' as math;\n\nimport 'pac"
  },
  {
    "path": "lib/foundation/comic_source/favorites.dart",
    "chars": 1740,
    "preview": "part of 'comic_source.dart';\n\ntypedef AddOrDelFavFunc = Future<Res<bool>> Function(\n    String comicId, String folderId,"
  },
  {
    "path": "lib/foundation/comic_source/models.dart",
    "chars": 13898,
    "preview": "part of 'comic_source.dart';\n\nclass Comment {\n  final String userName;\n  final String? avatar;\n  final String content;\n "
  },
  {
    "path": "lib/foundation/comic_source/parser.dart",
    "chars": 40175,
    "preview": "part of 'comic_source.dart';\n\n/// return true if ver1 > ver2\nbool compareSemVer(String ver1, String ver2) {\n  ver1 = ver"
  },
  {
    "path": "lib/foundation/comic_source/types.dart",
    "chars": 2663,
    "preview": "part of 'comic_source.dart';\n\n/// build comic list, [Res.subData] should be maxPage or null if there is no limit.\ntypede"
  },
  {
    "path": "lib/foundation/comic_type.dart",
    "chars": 739,
    "preview": "import 'package:venera/foundation/comic_source/comic_source.dart';\n\nclass ComicType {\n  final int value;\n\n  const ComicT"
  },
  {
    "path": "lib/foundation/consts.dart",
    "chars": 598,
    "preview": "/// If window width is less than this value, it is considered as mobile.\nconst changePoint = 600;\n\n/// If window width i"
  },
  {
    "path": "lib/foundation/context.dart",
    "chars": 1384,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\n\nimport 'app_page_route.dart"
  },
  {
    "path": "lib/foundation/favorites.dart",
    "chars": 33872,
    "preview": "import 'dart:collection';\nimport 'dart:convert';\nimport 'dart:ffi';\nimport 'dart:isolate';\n\nimport 'package:flutter/foun"
  },
  {
    "path": "lib/foundation/follow_updates.dart",
    "chars": 5015,
    "preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/fo"
  },
  {
    "path": "lib/foundation/global_state.dart",
    "chars": 1326,
    "preview": "import 'package:flutter/widgets.dart';\n\nabstract class GlobalState {\n  static final _state = <Pair<Object?, State>>[];\n\n"
  },
  {
    "path": "lib/foundation/history.dart",
    "chars": 15144,
    "preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:isolate';\nimport 'dart:math';\nimport 'dart:ffi' as ffi;\n\nimport"
  },
  {
    "path": "lib/foundation/image_favorites.dart",
    "chars": 14116,
    "preview": "part of \"history.dart\";\n\nclass ImageFavorite {\n  final String eid;\n  final String id; // 漫画id\n  final int ep;\n  final St"
  },
  {
    "path": "lib/foundation/image_provider/base_image_provider.dart",
    "chars": 4531,
    "preview": "import 'dart:async' show Future, StreamController, scheduleMicrotask;\nimport 'dart:convert';\nimport 'dart:math';\nimport "
  },
  {
    "path": "lib/foundation/image_provider/cached_image.dart",
    "chars": 2512,
    "preview": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimpor"
  },
  {
    "path": "lib/foundation/image_provider/history_image_provider.dart",
    "chars": 1833,
    "preview": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimpor"
  },
  {
    "path": "lib/foundation/image_provider/image_favorites_provider.dart",
    "chars": 4738,
    "preview": "import 'dart:async' show Future, StreamController;\nimport 'package:crypto/crypto.dart';\nimport 'package:flutter/foundati"
  },
  {
    "path": "lib/foundation/image_provider/local_comic_image.dart",
    "chars": 1972,
    "preview": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimpor"
  },
  {
    "path": "lib/foundation/image_provider/local_favorite_image.dart",
    "chars": 1979,
    "preview": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimpor"
  },
  {
    "path": "lib/foundation/image_provider/reader_image.dart",
    "chars": 3829,
    "preview": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimpor"
  },
  {
    "path": "lib/foundation/js_engine.dart",
    "chars": 22747,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:math' as math;\nimport 'package:crypto/crypto.dart';\nimport 'packag"
  },
  {
    "path": "lib/foundation/js_pool.dart",
    "chars": 4363,
    "preview": "import 'dart:async';\nimport 'dart:isolate';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_qjs/flutter_"
  },
  {
    "path": "lib/foundation/local.dart",
    "chars": 19571,
    "preview": "import 'dart:convert';\nimport 'dart:isolate';\n\nimport 'package:flutter/widgets.dart' show ChangeNotifier;\nimport 'packag"
  },
  {
    "path": "lib/foundation/log.dart",
    "chars": 2681,
    "preview": "import 'package:flutter/foundation.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/utils/ext."
  },
  {
    "path": "lib/foundation/res.dart",
    "chars": 743,
    "preview": "class Res<T> {\n  /// error info\n  final String? errorMessage;\n\n  /// data\n  final T? _data;\n\n  /// is there an error\n  b"
  },
  {
    "path": "lib/foundation/widget_utils.dart",
    "chars": 3249,
    "preview": "import 'package:flutter/widgets.dart';\n\nextension WidgetExtension on Widget{\n  Widget padding(EdgeInsetsGeometry padding"
  },
  {
    "path": "lib/headless.dart",
    "chars": 8078,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:flutter/widgets.dart';\nimport 'package:venera/utils/data_sync.d"
  },
  {
    "path": "lib/init.dart",
    "chars": 3930,
    "preview": "import 'dart:async';\n\nimport 'package:display_mode/display_mode.dart';\nimport 'package:flutter/foundation.dart';\nimport "
  },
  {
    "path": "lib/main.dart",
    "chars": 9547,
    "preview": "import 'dart:async';\nimport 'package:desktop_webview_window/desktop_webview_window.dart';\nimport 'package:dynamic_color/"
  },
  {
    "path": "lib/network/app_dio.dart",
    "chars": 9206,
    "preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:dio/dio.dart';\nimport 'package:flutter/services.dart';\nimpo"
  },
  {
    "path": "lib/network/cache.dart",
    "chars": 5766,
    "preview": "import 'dart:typed_data';\nimport 'package:venera/network/app_dio.dart';\n\nclass NetworkCache {\n  final Uri uri;\n\n  final "
  },
  {
    "path": "lib/network/cloudflare.dart",
    "chars": 6643,
    "preview": "import 'dart:io' as io;\n\nimport 'package:dio/dio.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';"
  },
  {
    "path": "lib/network/cookie_jar.dart",
    "chars": 6729,
    "preview": "import 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:sql"
  },
  {
    "path": "lib/network/download.dart",
    "chars": 20872,
    "preview": "import 'dart:async';\nimport 'dart:isolate';\n\nimport 'package:flutter/widgets.dart' show ChangeNotifier;\nimport 'package:"
  },
  {
    "path": "lib/network/file_downloader.dart",
    "chars": 7884,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:dio/io.dart';\nimport 'package:venera/network/app_dio.dart';\nimpo"
  },
  {
    "path": "lib/network/images.dart",
    "chars": 9228,
    "preview": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:venera/fo"
  },
  {
    "path": "lib/network/proxy.dart",
    "chars": 1426,
    "preview": "import 'package:flutter/services.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/a"
  },
  {
    "path": "lib/pages/aggregated_search_page.dart",
    "chars": 6752,
    "preview": "import \"package:flutter/material.dart\";\nimport 'package:shimmer_animation/shimmer_animation.dart';\nimport \"package:vener"
  },
  {
    "path": "lib/pages/auth_page.dart",
    "chars": 1880,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';"
  },
  {
    "path": "lib/pages/categories_page.dart",
    "chars": 7696,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/found"
  },
  {
    "path": "lib/pages/category_comics_page.dart",
    "chars": 5856,
    "preview": "import \"package:flutter/material.dart\";\nimport \"package:venera/components/components.dart\";\nimport \"package:venera/found"
  },
  {
    "path": "lib/pages/comic_details_page/actions.dart",
    "chars": 12780,
    "preview": "part of 'comic_page.dart';\n\nabstract mixin class _ComicPageActions {\n  void update();\n\n  ComicDetails get comic;\n\n  Comi"
  },
  {
    "path": "lib/pages/comic_details_page/chapters.dart",
    "chars": 11364,
    "preview": "part of 'comic_page.dart';\n\nclass _ComicChapters extends StatelessWidget {\n  const _ComicChapters({this.history, require"
  },
  {
    "path": "lib/pages/comic_details_page/comic_page.dart",
    "chars": 32286,
    "preview": "import 'dart:async';\nimport 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\ni"
  },
  {
    "path": "lib/pages/comic_details_page/comments_page.dart",
    "chars": 16364,
    "preview": "part of 'comic_page.dart';\n\nbool _shouldBlockComment(Comment comment) {\n  var blockedWords = appdata.settings[\"blockedCo"
  },
  {
    "path": "lib/pages/comic_details_page/comments_preview.dart",
    "chars": 4634,
    "preview": "part of 'comic_page.dart';\n\nclass _CommentsPart extends StatefulWidget {\n  const _CommentsPart({\n    required this.comme"
  },
  {
    "path": "lib/pages/comic_details_page/cover_viewer.dart",
    "chars": 4134,
    "preview": "part of 'comic_page.dart';\n\nclass _CoverViewer extends StatefulWidget {\n  const _CoverViewer({\n    required this.imagePr"
  },
  {
    "path": "lib/pages/comic_details_page/favorite.dart",
    "chars": 19107,
    "preview": "part of 'comic_page.dart';\n\nclass _FavoritePanel extends StatefulWidget {\n  const _FavoritePanel({\n    required this.cid"
  },
  {
    "path": "lib/pages/comic_details_page/thumbnails.dart",
    "chars": 5269,
    "preview": "part of 'comic_page.dart';\n\nclass _ComicThumbnails extends StatefulWidget {\n  const _ComicThumbnails();\n\n  @override\n  S"
  },
  {
    "path": "lib/pages/comic_source_page.dart",
    "chars": 40643,
    "preview": "import 'dart:convert';\nimport 'dart:io' as io;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_inappwebv"
  },
  {
    "path": "lib/pages/downloading_page.dart",
    "chars": 7019,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/found"
  },
  {
    "path": "lib/pages/explore_page.dart",
    "chars": 15196,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/found"
  },
  {
    "path": "lib/pages/favorites/favorite_actions.dart",
    "chars": 14892,
    "preview": "part of 'favorites_page.dart';\n\n/// Open a dialog to create a new favorite folder.\nFuture<void> newFolder() async {\n  re"
  },
  {
    "path": "lib/pages/favorites/favorites_page.dart",
    "chars": 5458,
    "preview": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dar"
  },
  {
    "path": "lib/pages/favorites/local_favorites_page.dart",
    "chars": 40631,
    "preview": "part of 'favorites_page.dart';\n\nconst _localAllFolderLabel = '^_^[%local_all%]^_^';\n\n/// If the number of comics in a fo"
  },
  {
    "path": "lib/pages/favorites/network_favorites_page.dart",
    "chars": 16712,
    "preview": "part of 'favorites_page.dart';\n\nFuture<bool> _deleteComic(\n  String cid,\n  String? fid,\n  String sourceKey,\n  String? fa"
  },
  {
    "path": "lib/pages/favorites/side_bar.dart",
    "chars": 8241,
    "preview": "part of 'favorites_page.dart';\n\nclass _LeftBar extends StatefulWidget {\n  const _LeftBar({this.favPage, this.onSelected,"
  },
  {
    "path": "lib/pages/follow_updates_page.dart",
    "chars": 17050,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport"
  },
  {
    "path": "lib/pages/history_page.dart",
    "chars": 9256,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/found"
  },
  {
    "path": "lib/pages/home_page.dart",
    "chars": 35311,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:sliver_tools/sliver_tools.dart';\nimport 'package:url_launcher/ur"
  },
  {
    "path": "lib/pages/image_favorites_page/image_favorites_item.dart",
    "chars": 8421,
    "preview": "part of 'image_favorites_page.dart';\n\nclass _ImageFavoritesItem extends StatefulWidget {\n  const _ImageFavoritesItem({\n "
  },
  {
    "path": "lib/pages/image_favorites_page/image_favorites_page.dart",
    "chars": 17572,
    "preview": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n"
  },
  {
    "path": "lib/pages/image_favorites_page/image_favorites_photo_view.dart",
    "chars": 7224,
    "preview": "part of 'image_favorites_page.dart';\n\nclass ImageFavoritesPhotoView extends StatefulWidget {\n  const ImageFavoritesPhoto"
  },
  {
    "path": "lib/pages/image_favorites_page/type.dart",
    "chars": 2552,
    "preview": "import 'package:venera/utils/ext.dart';\n\nenum ImageFavoriteSortType {\n  title(\"Title\"),\n  timeAsc(\"Time Asc\"),\n  timeDes"
  },
  {
    "path": "lib/pages/local_comics_page.dart",
    "chars": 19309,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/found"
  },
  {
    "path": "lib/pages/main_page.dart",
    "chars": 2995,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/pages/ca"
  },
  {
    "path": "lib/pages/ranking_page.dart",
    "chars": 2574,
    "preview": "import \"package:flutter/material.dart\";\nimport \"package:venera/components/components.dart\";\nimport \"package:venera/found"
  },
  {
    "path": "lib/pages/reader/chapter_comments.dart",
    "chars": 25326,
    "preview": "part of 'reader.dart';\n\nbool _shouldBlockComment(Comment comment) {\n  var blockedWords = appdata.settings[\"blockedCommen"
  },
  {
    "path": "lib/pages/reader/chapters.dart",
    "chars": 6649,
    "preview": "part of 'reader.dart';\n\nclass _ChaptersView extends StatefulWidget {\n  const _ChaptersView(this.reader);\n\n  final _Reade"
  },
  {
    "path": "lib/pages/reader/comic_image.dart",
    "chars": 12743,
    "preview": "part of 'reader.dart';\n\nclass ComicImage extends StatefulWidget {\n  /// Modified from flutter Image\n  ComicImage({\n    r"
  },
  {
    "path": "lib/pages/reader/gesture.dart",
    "chars": 10458,
    "preview": "part of 'reader.dart';\n\nclass _ReaderGestureDetector extends StatefulWidget {\n  const _ReaderGestureDetector({required t"
  },
  {
    "path": "lib/pages/reader/images.dart",
    "chars": 41662,
    "preview": "part of 'reader.dart';\n\nclass _ReaderImages extends StatefulWidget {\n  const _ReaderImages({super.key});\n\n  @override\n  "
  },
  {
    "path": "lib/pages/reader/loading.dart",
    "chars": 2876,
    "preview": "part of 'reader.dart';\n\nclass ReaderWithLoading extends StatefulWidget {\n  const ReaderWithLoading({\n    super.key,\n    "
  },
  {
    "path": "lib/pages/reader/reader.dart",
    "chars": 21204,
    "preview": "library;\n\nimport 'dart:async';\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:fl"
  },
  {
    "path": "lib/pages/reader/scaffold.dart",
    "chars": 34543,
    "preview": "part of 'reader.dart';\n\nclass _ReaderScaffold extends StatefulWidget {\n  const _ReaderScaffold({required this.child});\n\n"
  },
  {
    "path": "lib/pages/search_page.dart",
    "chars": 20482,
    "preview": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:"
  },
  {
    "path": "lib/pages/search_result_page.dart",
    "chars": 14953,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/found"
  },
  {
    "path": "lib/pages/settings/about.dart",
    "chars": 4361,
    "preview": "part of 'settings_page.dart';\n\nclass AboutSettings extends StatefulWidget {\n  const AboutSettings({super.key});\n\n  @over"
  },
  {
    "path": "lib/pages/settings/app.dart",
    "chars": 21582,
    "preview": "part of 'settings_page.dart';\n\nclass AppSettings extends StatefulWidget {\n  const AppSettings({super.key});\n\n  @override"
  },
  {
    "path": "lib/pages/settings/appearance.dart",
    "chars": 1281,
    "preview": "part of 'settings_page.dart';\n\nclass AppearanceSettings extends StatefulWidget {\n  const AppearanceSettings({super.key})"
  },
  {
    "path": "lib/pages/settings/debug.dart",
    "chars": 3189,
    "preview": "part of 'settings_page.dart';\n\nclass DebugPage extends StatefulWidget {\n  const DebugPage({super.key});\n\n  @override\n  S"
  },
  {
    "path": "lib/pages/settings/explore_settings.dart",
    "chars": 10083,
    "preview": "part of 'settings_page.dart';\n\nclass ExploreSettings extends StatefulWidget {\n  const ExploreSettings({super.key});\n\n  @"
  },
  {
    "path": "lib/pages/settings/local_favorites.dart",
    "chars": 2381,
    "preview": "part of 'settings_page.dart';\n\nclass LocalFavoritesSettings extends StatefulWidget {\n  const LocalFavoritesSettings({sup"
  },
  {
    "path": "lib/pages/settings/network.dart",
    "chars": 9742,
    "preview": "part of 'settings_page.dart';\n\nclass NetworkSettings extends StatefulWidget {\n  const NetworkSettings({super.key});\n\n  @"
  },
  {
    "path": "lib/pages/settings/reader.dart",
    "chars": 19370,
    "preview": "part of 'settings_page.dart';\n\nclass ReaderSettings extends StatefulWidget {\n  const ReaderSettings({\n    super.key,\n   "
  },
  {
    "path": "lib/pages/settings/setting_components.dart",
    "chars": 20185,
    "preview": "part of 'settings_page.dart';\n\nclass _SwitchSetting extends StatefulWidget {\n  const _SwitchSetting({\n    required this."
  },
  {
    "path": "lib/pages/settings/settings_page.dart",
    "chars": 7933,
    "preview": "import 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:f"
  },
  {
    "path": "lib/pages/webview.dart",
    "chars": 10088,
    "preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:desktop_webview_window/desktop_webview_window.dart';\nimport"
  },
  {
    "path": "lib/utils/app_links.dart",
    "chars": 963,
    "preview": "import 'package:app_links/app_links.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundatio"
  },
  {
    "path": "lib/utils/cbz.dart",
    "chars": 9967,
    "preview": "import 'dart:convert';\nimport 'package:flutter_7zip/flutter_7zip.dart';\nimport 'package:venera/foundation/app.dart';\nimp"
  },
  {
    "path": "lib/utils/channel.dart",
    "chars": 1166,
    "preview": "import 'dart:async';\nimport 'dart:collection';\n\nclass Channel<T> {\n  final Queue<T> _queue;\n\n  final int size;\n\n  Channe"
  },
  {
    "path": "lib/utils/clipboard_image.dart",
    "chars": 846,
    "preview": "import 'dart:io';\nimport 'dart:ui';\n\nimport 'package:flutter/services.dart';\n\nFuture<void> writeImageToClipboard(Uint8Li"
  },
  {
    "path": "lib/utils/data.dart",
    "chars": 10340,
    "preview": "import 'dart:convert';\nimport 'dart:isolate';\n\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/foundation/"
  },
  {
    "path": "lib/utils/data_sync.dart",
    "chars": 6847,
    "preview": "import 'package:flutter/foundation.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/com"
  },
  {
    "path": "lib/utils/epub.dart",
    "chars": 6531,
    "preview": "import 'dart:isolate';\n\nimport 'package:uuid/uuid.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:ve"
  },
  {
    "path": "lib/utils/ext.dart",
    "chars": 2742,
    "preview": "extension ListExt<T> on List<T>{\n  /// Remove all blank value and return the list.\n  List<T> getNoBlankList(){\n    List<"
  },
  {
    "path": "lib/utils/file_type.dart",
    "chars": 1244,
    "preview": "import 'package:mime/mime.dart';\n\nclass FileType {\n  final String ext;\n  final String mime;\n\n  const FileType(this.ext, "
  },
  {
    "path": "lib/utils/handle_text_share.dart",
    "chars": 694,
    "preview": "import 'package:flutter/services.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/pages/aggreg"
  },
  {
    "path": "lib/utils/image.dart",
    "chars": 9739,
    "preview": "import 'dart:ffi';\nimport 'dart:isolate';\nimport 'dart:typed_data';\nimport 'dart:ui' as ui;\nimport 'package:flutter/serv"
  },
  {
    "path": "lib/utils/import_comic.dart",
    "chars": 14173,
    "preview": "import 'dart:math';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:venera/components/components.dart';\nimpor"
  },
  {
    "path": "lib/utils/init.dart",
    "chars": 811,
    "preview": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\n\n/// A mixin class that provides a way to ensure the cla"
  }
]

// ... and 56 more files (download for full content)

About this extraction

This page contains the full source code of the venera-app/venera GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 256 files (3.5 MB), approximately 930.6k tokens, and a symbol index with 2475 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!