[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yaml",
    "content": "name: Report a bug\ndescription: Reporting problems with the APP\ntitle: \"[Bug]: \"\nlabels: [\"bug🐞\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thank you for reporting a problem, please complete the title and fill in the following information.\n        \n        感谢您的反馈，请填写完整标题并填写以下信息。\n        \n        **Please do not report any issues related to config files.**\n        \n        **请不要报告与配置文件相关的任何问题。**\n        \n        This project is a comic reader that allows users write their own config files. And there is no built-in comic source.\n        \n        本项目是一个漫画阅读器，允许用户编写自己的配置文件，并且没有内置漫画源。\n  - type: dropdown\n    id: bugType\n    attributes:\n      label: Bug type\n      description: What type of bug are you reporting?\n      options:\n        - Crash\n        - UI\n        - Performance\n        - Security\n        - Reader\n        - JS Engine\n        - Comic Source\n        - Other\n    validations:\n      required: true\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: Description\n      description: Describe the problem\n    validations:\n      required: true\n  - type: input\n    id: version\n    attributes:\n      label: Version\n      description: | \n        App version.\n        \n        Please try to update if it is not the latest version\n    validations:\n      required: true\n  - type: dropdown\n    id: platform\n    attributes:\n      label: Operating system\n      multiple: true\n      options:\n        - Android\n        - iOS\n        - Windows\n        - macOS\n        - linux\n        - other\n    validations:\n      required: true\n  - type: textarea\n    id: logs\n    attributes:\n      label: logs\n  - type: textarea\n    id: screenshotOrVideo\n    attributes:\n      label: Screenshot or video\n      description: Upload relevant screenshots or videos here"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.yaml",
    "content": "name: Feature Request\ndescription: Suggest improvements to the APP\ntitle: \"[Enhancement]: \"\nlabels: [\"enhancement🚀\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Welcome to make a feature request, please fill in the following information after completing the title.\n        \n        欢迎提出功能建议，请填写完整标题后填写以下信息。\n        \n        **Please do not report any issues related to config files.**\n\n        **请不要报告与配置文件相关的任何问题。**\n\n        This project is a comic reader that allows users write their own config files. And there is no built-in comic source.\n\n        本项目是一个漫画阅读器，允许用户编写自己的配置文件，并且没有内置漫画源。\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: Description\n      description: Describe your suggestion.\n    validations:\n      required: true\n  - type: dropdown\n    id: platform\n    attributes:\n      label: Operating System\n      description: If the feature is for a particular platform, please select here\n      multiple: true\n      options:\n        - Android\n        - iOS\n        - Windows\n        - macOS\n        - linux\n        - other\n    validations:\n      required: false\n  - type: textarea\n    id: screenshotOrVideo\n    attributes:\n      label: picture\n      description: If you need to use a picture, please upload it here."
  },
  {
    "path": ".github/workflows/analyze.yml",
    "content": "name: \"analyze\"\non:\n  pull_request:\n  push:\n    branches:\n      - master\n\njobs:\n  analyze:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: \"stable\"\n          flutter-version-file: pubspec.yaml\n          architecture: x64\n      - run: flutter pub get\n      - uses: invertase/github-action-dart-analyzer@v1\n"
  },
  {
    "path": ".github/workflows/delete_old_workflows.yml",
    "content": "name: Delete old workflow runs\non:\n  workflow_dispatch:\n    inputs:\n      days:\n        description: 'Days-worth of runs to keep for each workflow'\n        required: true\n        default: '30'\n      minimum_runs:\n        description: 'Minimum runs to keep for each workflow'\n        required: true\n        default: '6'\n      delete_workflow_pattern:\n        description: 'Name or filename of the workflow (if not set, all workflows are targeted)'\n        required: false\n      delete_workflow_by_state_pattern:\n        description: 'Filter workflows by state: active, deleted, disabled_fork, disabled_inactivity, disabled_manually'\n        required: true\n        default: \"ALL\"\n        type: choice\n        options:\n          - \"ALL\"\n          - active\n          - deleted\n          - disabled_inactivity\n          - disabled_manually\n      delete_run_by_conclusion_pattern:\n        description: 'Remove runs based on conclusion: action_required, cancelled, failure, skipped, success'\n        required: true\n        default: \"ALL\"\n        type: choice\n        options:\n          - \"ALL\"\n          - \"Unsuccessful: action_required,cancelled,failure,skipped\"\n          - action_required\n          - cancelled\n          - failure\n          - skipped\n          - success\n      dry_run:\n        description: 'Logs simulated changes, no deletions are performed'\n        required: false\n\njobs:\n  del_runs:\n    runs-on: ubuntu-latest\n    permissions:\n      actions: write\n      contents: read\n    steps:\n      - name: Delete workflow runs\n        uses: Mattraks/delete-workflow-runs@v2\n        with:\n          token: ${{ github.token }}\n          repository: ${{ github.repository }}\n          retain_days: ${{ github.event.inputs.days }}\n          keep_minimum_runs: ${{ github.event.inputs.minimum_runs }}\n          delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }}\n          delete_workflow_by_state_pattern: ${{ github.event.inputs.delete_workflow_by_state_pattern }}\n          delete_run_by_conclusion_pattern: >-\n            ${{\n              startsWith(github.event.inputs.delete_run_by_conclusion_pattern, 'Unsuccessful:')\n              && 'action_required,cancelled,failure,skipped'\n              || github.event.inputs.delete_run_by_conclusion_pattern\n            }}\n          dry_run: ${{ github.event.inputs.dry_run }}"
  },
  {
    "path": ".github/workflows/fastlane.yml",
    "content": "name: Validate Fastlane metadata\n\non:\n  workflow_dispatch:\n  push:\n      branches: [ \"master\" ]\n      paths:\n        - 'fastlane/**'\n  pull_request:\n      branches: [ \"master\" ]\n      paths:\n        - 'fastlane/**'\n\njobs:\n  go:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - name: Validate Fastlane Supply Metadata\n        uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2.1.0\n"
  },
  {
    "path": ".github/workflows/issue_check.yml",
    "content": "name: Check Issue\n\non:\n  issues:\n    types: [opened]\n\npermissions:\n  contents: read\n  issues: write\n\njobs:\n  check:\n    name: Check Issue\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        id: checkout\n        uses: actions/checkout@v4\n\n      - name: Check Issue\n        id: check\n        uses: wgh136/gpt_issue_checker@v1.0.2\n        with:\n          api-url: ${{ secrets.API_URL }} \n          api-key: ${{ secrets.API_KEY }}\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          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.\"\n          model: \"gpt-4o\"\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Build ALL\nrun-name: Build ALL\non:\n  workflow_dispatch: {}\n  release:\n    types: [published]\n\njobs:\n  Build_MacOS:\n    runs-on: macos-15\n    steps:\n      - uses: actions/checkout@v3\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: \"stable\"\n          flutter-version-file: pubspec.yaml\n          architecture: x64\n      - run: sudo xcode-select --switch /Applications/Xcode_16.4.app\n      - run: flutter pub get\n        # Step 1: Decode and install the certificate\n      - name: Decode and install certificate\n        env:\n          CERTIFICATE: ${{ secrets.CERTIFICATE }}\n          CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }}\n        run: |\n          echo \"$CERTIFICATE\" | base64 --decode > signing_certificate.p12\n          security import signing_certificate.p12 -k ~/Library/Keychains/login.keychain -P \"$CERTIFICATE_PASSWORD\" -T /usr/bin/codesign\n\n      - name: Check rust-toolchain.toml\n        run: rustup show\n\n      # Step 2: Build the Flutter macOS app\n      - name: Build Flutter macOS App\n        run: flutter build macos --release\n\n      # Step 3: Create the DMG file\n      - name: Create DMG\n        run: |\n          mkdir -p dist\n          mkdir -p dist/dmg_contents\n          cp -R build/macos/Build/Products/Release/venera.app dist/dmg_contents/\n          ln -s /Applications dist/dmg_contents/Applications\n          hdiutil create -volname \"venera\" -srcfolder dist/dmg_contents -ov -format UDZO \"dist/venera.dmg\"\n\n      - name: Add version to filename\n        run: |\n          APP_VERSION=$(grep \"version:\" pubspec.yaml | cut -d':' -f2 | tr -d ' ')\n          mkdir -p result\n          mv dist/venera.dmg result/venera-$APP_VERSION.dmg\n\n      # Step 4: Attach and upload artifacts (optional)\n      - name: Upload DMG\n        uses: actions/upload-artifact@v4\n        with:\n          name: macos_build\n          path: result/\n  Build_IOS:\n    runs-on: macos-15\n    steps:\n      - uses: actions/checkout@v3\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: \"stable\"\n          flutter-version-file: pubspec.yaml\n          architecture: x64\n      - run: sudo xcode-select --switch /Applications/Xcode_16.4.app\n      - run: flutter pub get\n      - run: flutter build ios --release --no-codesign\n      - run: |\n          mkdir -p /Users/runner/work/venera/venera/build/ios/iphoneos/Payload\n          mv /Users/runner/work/venera/venera/build/ios/iphoneos/Runner.app /Users/runner/work/venera/venera/build/ios/iphoneos/Payload\n          cd /Users/runner/work/venera/venera/build/ios/iphoneos/\n          zip -r venera-ios.ipa Payload\n      - name: Add version to filename\n        run: |\n          APP_VERSION=$(grep \"version:\" pubspec.yaml | cut -d':' -f2 | tr -d ' ')\n          mkdir -p result\n          mv build/ios/iphoneos/venera-ios.ipa result/venera-ios-$APP_VERSION.ipa\n      - uses: actions/upload-artifact@v4\n        with:\n          name: ios_build\n          path: result/\n  Build_Android:\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v3\n      - run: rm -rf /opt/hostedtoolcache\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: \"stable\"\n          flutter-version-file: pubspec.yaml\n          architecture: x64\n      - name: Decode and install certificate\n        env:\n          STORE_FILE: ${{ secrets.ANDROID_KEYSTORE }}\n          PROPERTY_FILE: ${{ secrets.ANDROID_KEY_PROPERTIES }}\n        run: |\n            echo \"$STORE_FILE\" | base64 --decode > android/keystore.jks\n            echo \"$PROPERTY_FILE\" > android/key.properties\n      - uses: actions/setup-java@v4\n        with:\n          distribution: 'oracle'\n          java-version: '17'\n      - name: Check rust-toolchain.toml\n        run: rustup show\n      - run: flutter pub get\n      - run: flutter build apk --release\n      - uses: actions/upload-artifact@v4\n        with:\n          name: apks\n          path: build/app/outputs/apk/release\n  Build_Windows:\n    runs-on: windows-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: install dependencies\n        run: | \n          choco install yq -y\n          pip install httpx\n      - name: Install Inno Setup\n        run: choco install innosetup --no-progress\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: \"stable\"\n          flutter-version-file: pubspec.yaml\n          architecture: x64\n      - name: build\n        run: |\n          flutter pub get\n          python windows/build.py\n      - uses: actions/upload-artifact@v4\n        with:\n          name: windows_build\n          path: build/windows/Venera-*\n  Build_Linux:\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v4\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: 'stable'\n          flutter-version-file: pubspec.yaml\n          architecture: x64\n      - run: |\n          sudo apt-get update -y\n          sudo apt-get install -y ninja-build libgtk-3-dev webkit2gtk-4.1\n          dart pub global activate -s git https://github.com/venera-app/flutter_to_debian.git\n      - run: python3 debian/build.py x64\n      - run: dart run flutter_to_arch\n      - run: |\n          sudo rm -rf build/linux/arch/app.tar.gz\n          sudo rm -rf build/linux/arch/pkg\n          sudo rm -rf build/linux/arch/src\n          sudo rm -rf build/linux/arch/PKGBUILD\n      - uses: actions/upload-artifact@v4\n        with:\n          name: deb_build\n          path: build/linux/x64/release/debian\n      - uses: actions/upload-artifact@v4\n        with:\n          name: arch_build\n          path: build/linux/arch/\n  Build_Linux_ARM64:\n    runs-on: ubuntu-22.04-arm\n    steps:\n      - uses: actions/checkout@v4\n      - uses: subosito/flutter-action@v2\n        with:\n          channel: 'master'\n          flutter-version-file: pubspec.yaml\n      - run: |\n          flutter pub get\n          sudo apt-get update -y\n          sudo apt-get install -y ninja-build libgtk-3-dev webkit2gtk-4.1\n          dart pub global activate -s git https://github.com/venera-app/flutter_to_debian.git\n      - name: \"Patch font\"\n        run: |\n          dart run patch/font.dart\n      - run: python3 debian/build.py arm64\n      - uses: actions/upload-artifact@v4\n        with:\n          name: deb_arm64_build\n          path: build/linux/x64/release/debian # This is a bug related to flutter_to_debian, but it's not a big deal.\n\n  Release:\n    runs-on: ubuntu-22.04\n    needs: [Build_MacOS, Build_IOS, Build_Android, Build_Windows, Build_Linux, Build_Linux_ARM64]\n    if: github.event_name == 'release'  # 仅在 push 事件时执行\n    steps:\n      - uses: actions/download-artifact@v4\n        with:\n          name: macos_build\n          path: outputs\n      - uses: actions/download-artifact@v4\n        with:\n          name: ios_build\n          path: outputs\n      - uses: actions/download-artifact@v4\n        with:\n          name: apks\n          path: outputs\n      - uses: actions/download-artifact@v4\n        with:\n          name: windows_build\n          path: outputs\n      - uses: actions/download-artifact@v4\n        with:\n          name: deb_build\n          path: outputs\n      - uses: actions/download-artifact@v4\n        with:\n          name: arch_build\n          path: outputs\n      - uses: actions/download-artifact@v4\n        with:\n          name: deb_arm64_build\n          path: outputs\n      - uses: softprops/action-gh-release@v2\n        with:\n          tag_name: ${{ github.ref_name }}\n          files: |\n            outputs/*.ipa\n            outputs/*.dmg\n            outputs/*.apk\n            outputs/*.zip\n            outputs/*.exe\n            outputs/*.deb\n            outputs/*.zst\n            outputs/*.AppImage\n        env:\n          GITHUB_TOKEN: ${{ secrets.ACTION_GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/update_alt_store.yml",
    "content": "name: Update AltStore Source\n\non:\n  workflow_run:\n    workflows: [\"Build ALL\"]\n    types: [completed]\n  workflow_dispatch:\n\njobs:\n  update-source:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v3\n\n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: '3.x'\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install requests\n\n    - name: Record job start time\n      id: job_start_time\n      run: echo \"start_time=$(date +%s)\" >> $GITHUB_OUTPUT\n\n    - name: Update AltStore source\n      id: update_source\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n        python update_alt_store.py\n        git config --global user.name 'GitHub Action'\n        git config --global user.email 'action@github.com'\n        git add alt_store.json\n        if git diff --staged --quiet; then\n          echo \"changes=false\" >> $GITHUB_OUTPUT\n        else\n          # Create a new branch for the PR\n          branch_name=\"update-altstore-$(date +%Y%m%d-%H%M%S)\"\n          git checkout -b \"$branch_name\"\n          git commit -m \"Updated source with latest release\"\n          git push -u origin \"$branch_name\"\n          \n          # Create PR using GitHub CLI\n          gh pr create \\\n          --title \"Update AltStore source with latest release\" \\\n          --body \"This PR updates the alt_store.json file with the latest release information.\" \\\n          --head \"$branch_name\" \\\n          --base master\n          \n          echo \"changes=true\" >> $GITHUB_OUTPUT\n        fi\n\n    - name: Calculate job duration\n      id: duration\n      if: always()\n      run: |\n        end_time=$(date +%s)\n        duration=$((end_time - ${{ steps.job_start_time.outputs.start_time }}))\n        echo \"duration=$duration seconds\" >> $GITHUB_OUTPUT\n\n    - name: Create job summary\n      run: |\n        if [[ \"${{ steps.update_source.outputs.changes }}\" == \"true\" ]]; then\n          echo \"## Update Altstore Source Summary 🚀\" >> $GITHUB_STEP_SUMMARY\n          echo \"✅ Changes Detected and Applied\" >> $GITHUB_STEP_SUMMARY\n          echo \"\" >> $GITHUB_STEP_SUMMARY\n          echo \"The alt_store.json file has been updated with the latest release information.\" >> $GITHUB_STEP_SUMMARY\n        else\n          echo \"## Update Altstore Source Summary 🚀\" >> $GITHUB_STEP_SUMMARY\n          echo \"🔍 No Changes Detected\" >> $GITHUB_STEP_SUMMARY\n          echo \"\" >> $GITHUB_STEP_SUMMARY\n          echo \"The alt_store.json file is up to date. No changes were necessary.\" >> $GITHUB_STEP_SUMMARY\n        fi\n        echo \"\" >> $GITHUB_STEP_SUMMARY\n        echo \"🕐 Execution Time\" >> $GITHUB_STEP_SUMMARY\n        echo \"\" >> $GITHUB_STEP_SUMMARY\n        echo \"This job took ${{ steps.duration.outputs.duration }} to complete.\" >> $GITHUB_STEP_SUMMARY\n        echo \"\" >> $GITHUB_STEP_SUMMARY\n        echo \"📆 Next Scheduled Run\" >> $GITHUB_STEP_SUMMARY\n        echo \"\" >> $GITHUB_STEP_SUMMARY\n        echo \"The next scheduled run will be tomorrow at midnight UTC.\" >> $GITHUB_STEP_SUMMARY\n"
  },
  {
    "path": ".gitignore",
    "content": "# 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 related\n*.iml\n*.ipr\n*.iws\n.idea/\n.vscode/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.pub-cache/\n.pub/\n/build/\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n\nadd_translation.py\n\n*/*/generated_*\n*/*/Generated*"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: \"b0850beeb25f6d5b10426284f506557f66181b36\"\n  channel: \"stable\"\n\nproject_type: app\n\n# Tracks metadata for the flutter migrate command\nmigration:\n  platforms:\n    - platform: root\n      create_revision: b0850beeb25f6d5b10426284f506557f66181b36\n      base_revision: b0850beeb25f6d5b10426284f506557f66181b36\n    - platform: android\n      create_revision: b0850beeb25f6d5b10426284f506557f66181b36\n      base_revision: b0850beeb25f6d5b10426284f506557f66181b36\n    - platform: ios\n      create_revision: b0850beeb25f6d5b10426284f506557f66181b36\n      base_revision: b0850beeb25f6d5b10426284f506557f66181b36\n    - platform: linux\n      create_revision: b0850beeb25f6d5b10426284f506557f66181b36\n      base_revision: b0850beeb25f6d5b10426284f506557f66181b36\n    - platform: macos\n      create_revision: b0850beeb25f6d5b10426284f506557f66181b36\n      base_revision: b0850beeb25f6d5b10426284f506557f66181b36\n    - platform: windows\n      create_revision: b0850beeb25f6d5b10426284f506557f66181b36\n      base_revision: b0850beeb25f6d5b10426284f506557f66181b36\n\n  # User provided section\n\n  # List of Local paths (relative to this file) that should be\n  # ignored by the migrate tool.\n  #\n  # Files that are not part of the templates will be ignored by default.\n  unmanaged_files:\n    - 'lib/main.dart'\n    - 'ios/Runner.xcodeproj/project.pbxproj'\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# venera\n[![flutter](https://img.shields.io/badge/flutter-3.41.4-blue)](https://flutter.dev/)\n[![License](https://img.shields.io/github/license/venera-app/venera)](https://github.com/venera-app/venera/blob/master/LICENSE)\n[![stars](https://img.shields.io/github/stars/venera-app/venera?style=flat)](https://github.com/venera-app/venera/stargazers)\n\n[![Download](https://img.shields.io/github/v/release/venera-app/venera)](https://github.com/venera-app/venera/releases)\n[![AUR Version](https://img.shields.io/aur/version/venera-bin)](https://aur.archlinux.org/packages/venera-bin)\n[![F-Droid Version](https://img.shields.io/f-droid/v/com.github.wgh136.venera)](https://f-droid.org/packages/com.github.wgh136.venera/)\n\nA comic reader that support reading local and network comics.\n\n## Features\n- Read local comics\n- Use javascript to create comic sources\n- Read comics from network sources\n- Manage favorite comics\n- Download comics\n- View comments, tags, and other information of comics if the source supports\n- Login to comment, rate, and other operations if the source supports\n\n## Build from source\n1. Clone the repository\n2. Install flutter, see [flutter.dev](https://flutter.dev/docs/get-started/install)\n3. Install rust, see [rustup.rs](https://rustup.rs/)\n4. Build for your platform: e.g. `flutter build apk`\n\n## Create a new comic source\nSee [Comic Source](doc/comic_source.md)\n\n## Thanks\n\n### Tags Translation\n[EhTagTranslation](https://github.com/EhTagTranslation/Database)\n\nThe Chinese translation of the manga tags is from this project.\n\n## Headless Mode\nSee [Headless Doc](doc/headless_doc.md)\n\n"
  },
  {
    "path": "alt_store.json",
    "content": "{\n  \"name\": \"Venera\",\n  \"identifier\": \"com.github.wgh136.venera.source\",\n  \"website\": \"https://github.com/venera-app/venera\",\n  \"subtitle\": \"Venera official AltStore Source.\",\n  \"description\": \"This is the official AltStore Source for Venera.\\n\\n A comic reader that supports reading local and network comics\",\n  \"tintColor\": \"#0784FC\",\n  \"iconURL\": \"https://raw.githubusercontent.com/venera-app/venera/master/assets/app_icon.png\",\n  \"apps\": [\n    {\n      \"beta\": false,\n      \"name\": \"Venera\",\n      \"bundleIdentifier\": \"com.github.wgh136.venera\",\n      \"developerName\": \"wgh136\",\n      \"subtitle\": \"A comic reader that supports reading local and network comics\",\n      \"version\": \"1.6.3\",\n      \"versionDate\": \"2026-03-08\",\n      \"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\",\n      \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.6.3/venera-ios-1.6.3%2B163.ipa\",\n      \"localizedDescription\": \"A comic reader that supports reading local and network comics\",\n      \"iconURL\": \"https://raw.githubusercontent.com/venera-app/venera/master/assets/app_icon.png\",\n      \"tintColor\": \"#0784FC\",\n      \"category\": \"utilities\",\n      \"size\": 15489327,\n      \"appPermissions\": {\n        \"entitlements\": [\n          \"application-identifier\",\n          \"com.apple.security.application-groups\",\n          \"get-task-allow\",\n          \"keychain-access-groups\",\n          \"com.apple.developer.kernel.extended-virtual-addressing\",\n          \"com.apple.developer.kernel.increased-memory-limit\",\n          \"com.apple.developer.healthkit.background-delivery\"\n        ],\n        \"privacy\": {\n          \"NSFaceIDUsageDescription\": \"Face ID or Touch ID is used to protect your privacy when opening the app, ensuring secure access to your reading content.\",\n          \"NSPhotoLibraryAddUsageDescription\": \"Used to save comic images you've favorited or downloaded to your photo library for easy access and sharing.\",\n          \"NSPhotoLibraryUsageDescription\": \"Used to select images from your photo library when needed, and to save comic images you've collected to your device.\"\n        }\n      },\n      \"versions\": [\n        {\n          \"version\": \"1.6.3\",\n          \"date\": \"2026-03-08\",\n          \"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\",\n          \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.6.3/venera-ios-1.6.3%2B163.ipa\",\n          \"size\": 15489327\n        },\n        {\n          \"version\": \"1.6.2\",\n          \"date\": \"2026-01-01\",\n          \"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\",\n          \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.6.2/venera-ios-1.6.2%2B162.ipa\",\n          \"size\": 15209455\n        },\n        {\n          \"version\": \"1.6.1\",\n          \"date\": \"2025-11-29\",\n          \"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\",\n          \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.6.1/venera-ios-1.6.1%2B161.ipa\",\n          \"size\": 15202312\n        },\n        {\n          \"version\": \"1.6.0\",\n          \"date\": \"2025-11-01\",\n          \"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\",\n          \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.6.0/venera-ios-1.6.0%2B160.ipa\",\n          \"size\": 15064741\n        },\n        {\n          \"version\": \"1.5.3\",\n          \"date\": \"2025-10-13\",\n          \"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.\",\n          \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.5.3/venera-ios-1.5.3%2B153.ipa\",\n          \"size\": 15047841\n        },\n        {\n          \"version\": \"1.4.5\",\n          \"date\": \"2025-06-18\",\n          \"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.\",\n          \"downloadURL\": \"https://github.com/venera-app/venera/releases/download/v1.4.5/venera-ios-1.4.5%2B145.ipa\",\n          \"size\": 14960268\n        }\n      ]\n    }\n  ],\n  \"news\": [\n    {\n      \"appID\": \"com.github.wgh136.venera\",\n      \"caption\": \"Update of Venera just got released!\",\n      \"date\": \"2025-06-18T09:02:01Z\",\n      \"identifier\": \"release-v1.4.5\",\n      \"notify\": true,\n      \"tintColor\": \"#0784FC\",\n      \"title\": \"v1.4.5 - Venera  18/06/25\",\n      \"url\": \"https://github.com/venera-app/venera/releases/tag/v1.4.5\"\n    },\n    {\n      \"appID\": \"com.github.wgh136.venera\",\n      \"caption\": \"Update of Venera just got released!\",\n      \"date\": \"2025-10-13T12:47:27Z\",\n      \"identifier\": \"release-v1.5.3\",\n      \"notify\": true,\n      \"tintColor\": \"#0784FC\",\n      \"title\": \"v1.5.3 - Venera  13/10/25\",\n      \"url\": \"https://github.com/venera-app/venera/releases/tag/v1.5.3\"\n    },\n    {\n      \"appID\": \"com.github.wgh136.venera\",\n      \"caption\": \"Update of Venera just got released!\",\n      \"date\": \"2025-11-01T07:31:38Z\",\n      \"identifier\": \"release-v1.6.0\",\n      \"notify\": true,\n      \"tintColor\": \"#0784FC\",\n      \"title\": \"v1.6.0 - Venera  01/11/25\",\n      \"url\": \"https://github.com/venera-app/venera/releases/tag/v1.6.0\"\n    },\n    {\n      \"appID\": \"com.github.wgh136.venera\",\n      \"caption\": \"Update of Venera just got released!\",\n      \"date\": \"2025-11-29T08:51:14Z\",\n      \"identifier\": \"release-v1.6.1\",\n      \"notify\": true,\n      \"tintColor\": \"#0784FC\",\n      \"title\": \"v1.6.1 - Venera  29/11/25\",\n      \"url\": \"https://github.com/venera-app/venera/releases/tag/v1.6.1\"\n    },\n    {\n      \"appID\": \"com.github.wgh136.venera\",\n      \"caption\": \"Update of Venera just got released!\",\n      \"date\": \"2026-01-01T08:31:16Z\",\n      \"identifier\": \"release-v1.6.2\",\n      \"notify\": true,\n      \"tintColor\": \"#0784FC\",\n      \"title\": \"v1.6.2 - Venera  01/01/26\",\n      \"url\": \"https://github.com/venera-app/venera/releases/tag/v1.6.2\"\n    },\n    {\n      \"appID\": \"com.github.wgh136.venera\",\n      \"caption\": \"Update of Venera just got released!\",\n      \"date\": \"2026-03-08T09:49:52Z\",\n      \"identifier\": \"release-v1.6.3\",\n      \"notify\": true,\n      \"tintColor\": \"#0784FC\",\n      \"title\": \"v1.6.3 - Venera  08/03/26\",\n      \"url\": \"https://github.com/venera-app/venera/releases/tag/v1.6.3\"\n    }\n  ]\n}"
  },
  {
    "path": "analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at https://dart.dev/lints.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    collection_methods_unrelated_type: false\n    use_build_context_synchronously: false\n    avoid_print: false\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\n**/*.keystore\n**/*.jks\n/app/.cxx/\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n\next.abiCodes = [\"armeabi-v7a\": 1, \"arm64-v8a\": 2, \"x86_64\": 3]\n\ndef localProperties = new Properties()\ndef localPropertiesFile = rootProject.file(\"local.properties\")\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader(\"UTF-8\") { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterVersionCode = localProperties.getProperty(\"flutter.versionCode\")\nif (flutterVersionCode == null) {\n    flutterVersionCode = \"1\"\n}\n\ndef flutterVersionName = localProperties.getProperty(\"flutter.versionName\")\nif (flutterVersionName == null) {\n    flutterVersionName = \"1.0\"\n}\n\ndef keystorePropertiesFile = rootProject.file(\"key.properties\")\ndef keystoreProperties = new Properties()\nkeystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n\nandroid {\n    namespace = \"com.github.wgh136.venera\"\n    compileSdk = flutter.compileSdkVersion\n    ndkVersion \"28.0.13004108\"\n\n    packaging {\n        jniLibs {\n            useLegacyPackaging true\n        }\n    }\n\n    splits{\n        abi {\n            reset()\n            include 'armeabi-v7a', 'arm64-v8a', 'x86_64'\n            enable true\n            universalApk true\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_17\n        targetCompatibility = JavaVersion.VERSION_17\n    }\n    kotlinOptions{\n        jvmTarget = JavaVersion.VERSION_17\n    }\n\n    signingConfigs {\n        debug {\n            storeFile file(keystoreProperties['storeFile'])\n            storePassword keystoreProperties['storePassword']\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n        }\n        release {\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n            storeFile file(keystoreProperties['storeFile'])\n            storePassword keystoreProperties['storePassword']\n        }\n    }\n\n    defaultConfig {\n        applicationId = \"com.github.wgh136.venera\"\n        // You can update the following values to match your application needs.\n        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.\n        minSdk = flutter.minSdkVersion\n        targetSdk = flutter.targetSdkVersion\n        versionCode = flutterVersionCode.toInteger()\n        versionName = flutterVersionName\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled true\n            shrinkResources true\n            ndk {\n                abiFilters \"armeabi-v7a\", \"arm64-v8a\", \"x86_64\"\n            }\n            signingConfig signingConfigs.release\n        }\n        debug {\n            ndk {\n                abiFilters \"armeabi-v7a\", \"arm64-v8a\", \"x86_64\"\n            }\n            signingConfig signingConfigs.debug\n        }\n    }\n\n    applicationVariants.all { variant ->\n        variant.outputs.all { output ->\n            def abi = output.getFilter(com.android.build.OutputFile.ABI)\n            if (variant.buildType.name == \"release\") {\n                if (abi != null) {\n                    outputFileName = \"venera-${variant.versionName}-${abi}.apk\"\n                    def abiVersionCode = project.ext.abiCodes.get(abi)\n                    if (abiVersionCode != null) {\n                        versionCodeOverride = variant.versionCode * 10 + abiVersionCode\n                    }\n                } else {\n                    outputFileName = \"venera-${variant.versionName}.apk\"\n                    versionCodeOverride = variant.versionCode * 10\n                }\n            } else if (variant.buildType.name == \"debug\") {\n                versionCodeOverride = variant.versionCode * 10 + 4\n            }\n        }\n    }\n\n    dependenciesInfo {\n        // Disables dependency metadata when building APKs.\n        includeInApk = false\n        // Disables dependency metadata when building Android App Bundles.\n        includeInBundle = false\n    }\n}\n\nflutter {\n    source = \"../..\"\n}\n\ndependencies {\n    implementation \"androidx.activity:activity-ktx:1.10.1\"\n    implementation 'androidx.documentfile:documentfile:1.0.1'\n}\n"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.USE_BIOMETRIC\"/>\n    <application\n        android:label=\"venera\"\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\"\n            android:taskAffinity=\"\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:enableOnBackInvokedCallback=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- Specifies an Android theme to apply to this Activity as soon as\n                 the Android process has started. This theme is visible to the user\n                 while the Flutter UI initializes. After that, this theme continues\n                 to determine the Window background behind the Flutter UI. -->\n            <meta-data\n              android:name=\"io.flutter.embedding.android.NormalTheme\"\n              android:resource=\"@style/NormalTheme\"\n              />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <data android:scheme=\"https\" android:host=\"nhentai.net\" android:pathPrefix=\"/g\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <data android:scheme=\"https\" android:host=\"e-hentai.org\" android:pathPrefix=\"/g\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <data android:scheme=\"https\" android:host=\"exhentai.org\" android:pathPrefix=\"/g\" />\n            </intent-filter>\n            <intent-filter android:label=\"@string/share_text\">\n                <action android:name=\"android.intent.action.SEND\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <data android:mimeType=\"text/plain\" />\n            </intent-filter>\n        </activity>\n        <!-- Don't delete the meta-data below.\n             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n    </application>\n    <!-- Required to query activities that can process text, see:\n         https://developer.android.com/training/package-visibility and\n         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.\n\n         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->\n    <queries>\n        <intent>\n            <action android:name=\"android.intent.action.PROCESS_TEXT\"/>\n            <data android:mimeType=\"text/plain\"/>\n        </intent>\n    </queries>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt",
    "content": "package com.github.wgh136.venera\n\nimport android.Manifest\nimport android.app.Activity\nimport android.content.ContentResolver\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Environment\nimport android.provider.Settings\nimport android.util.Log\nimport android.view.KeyEvent\nimport androidx.activity.result.ActivityResultCallback\nimport androidx.activity.result.ActivityResultLauncher\nimport androidx.activity.result.contract.ActivityResultContract\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport androidx.documentfile.provider.DocumentFile\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleEventObserver\nimport androidx.lifecycle.LifecycleOwner\nimport dev.flutter.packages.file_selector_android.FileUtils\nimport io.flutter.embedding.android.FlutterFragmentActivity\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.plugin.common.EventChannel\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugins.GeneratedPluginRegistrant\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.util.concurrent.atomic.AtomicInteger\n\nclass MainActivity : FlutterFragmentActivity() {\n    var volumeListen = VolumeListen()\n    var listening = false\n\n    private val storageRequestCode = 0x10\n    private var storagePermissionRequest: ((Boolean) -> Unit)? = null\n\n    private val nextLocalRequestCode = AtomicInteger()\n\n    private val sharedTexts = ArrayList<String>()\n\n    private var textShareHandler: ((String) -> Unit)? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (intent?.action == Intent.ACTION_SEND) {\n            if (intent.type == \"text/plain\") {\n                val text = intent.getStringExtra(Intent.EXTRA_TEXT)\n                if (text != null)\n                    handleSharedText(text)\n            }\n        }\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        if (intent.action == Intent.ACTION_SEND) {\n            if (intent.type == \"text/plain\") {\n                val text = intent.getStringExtra(Intent.EXTRA_TEXT)\n                if (text != null)\n                    handleSharedText(text)\n            }\n        }\n    }\n\n    private fun handleSharedText(text: String) {\n        if (textShareHandler != null) {\n            textShareHandler?.invoke(text)\n        } else {\n            sharedTexts.add(text)\n        }\n    }\n\n    private fun <I, O> startContractForResult(\n        contract: ActivityResultContract<I, O>,\n        input: I,\n        callback: ActivityResultCallback<O>\n    ) {\n        val key = \"activity_rq_for_result#${nextLocalRequestCode.getAndIncrement()}\"\n        val registry = activityResultRegistry\n        var launcher: ActivityResultLauncher<I>? = null\n        val observer = object : LifecycleEventObserver {\n            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {\n                if (Lifecycle.Event.ON_DESTROY == event) {\n                    launcher?.unregister()\n                    lifecycle.removeObserver(this)\n                }\n            }\n        }\n        lifecycle.addObserver(observer)\n        val newCallback = ActivityResultCallback<O> {\n            launcher?.unregister()\n            lifecycle.removeObserver(observer)\n            callback.onActivityResult(it)\n        }\n        launcher = registry.register(key, contract, newCallback)\n        launcher.launch(input)\n    }\n\n    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {\n        GeneratedPluginRegistrant.registerWith(flutterEngine)\n        MethodChannel(\n            flutterEngine.dartExecutor.binaryMessenger,\n            \"venera/method_channel\"\n        ).setMethodCallHandler { call, res ->\n            when (call.method) {\n                \"getProxy\" -> res.success(getProxy())\n                \"setScreenOn\" -> {\n                    val set = call.argument<Boolean>(\"set\") ?: false\n                    if (set) {\n                        window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n                    } else {\n                        window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n                    }\n                    res.success(null)\n                }\n\n                \"getDirectoryPath\" -> {\n                    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)\n                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)\n                    startContractForResult(ActivityResultContracts.StartActivityForResult(), intent) { activityResult ->\n                        if (activityResult.resultCode != Activity.RESULT_OK) {\n                            res.success(null)\n                            return@startContractForResult\n                        }\n                        val pickedDirectoryUri = activityResult.data?.data\n                        if (pickedDirectoryUri == null)\n                            res.success(null)\n                        else\n                            onPickedDirectory(pickedDirectoryUri, res)\n                    }\n                }\n\n                else -> res.notImplemented()\n            }\n        }\n\n        val channel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, \"venera/volume\")\n        channel.setStreamHandler(\n            object : EventChannel.StreamHandler {\n                override fun onListen(arguments: Any?, events: EventChannel.EventSink) {\n                    listening = true\n                    volumeListen.onUp = {\n                        events.success(1)\n                    }\n                    volumeListen.onDown = {\n                        events.success(2)\n                    }\n                }\n\n                override fun onCancel(arguments: Any?) {\n                    listening = false\n                }\n            })\n\n        val storageChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, \"venera/storage\")\n        storageChannel.setMethodCallHandler { _, res ->\n            requestStoragePermission { result ->\n                res.success(result)\n            }\n        }\n\n        val selectFileChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, \"venera/select_file\")\n        selectFileChannel.setMethodCallHandler { req, res ->\n            val mimeType = req.arguments<String>()\n            openFile(res, mimeType!!)\n        }\n\n        val shareTextChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, \"venera/text_share\")\n        shareTextChannel.setStreamHandler(\n            object : EventChannel.StreamHandler {\n                override fun onListen(arguments: Any?, events: EventChannel.EventSink) {\n                    textShareHandler = {text ->\n                        events.success(text)\n                    }\n                    if (sharedTexts.isNotEmpty()) {\n                        for (text in sharedTexts) {\n                            events.success(text)\n                        }\n                        sharedTexts.clear()\n                    }\n                }\n\n                override fun onCancel(arguments: Any?) {\n                    textShareHandler = null\n                }\n            })\n    }\n\n    private fun getProxy(): String {\n        val host = System.getProperty(\"http.proxyHost\")\n        val port = System.getProperty(\"http.proxyPort\")\n        return if (host != null && port != null) {\n            \"$host:$port\"\n        } else {\n            \"No Proxy\"\n        }\n    }\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {\n        if (listening) {\n            when (keyCode) {\n                KeyEvent.KEYCODE_VOLUME_DOWN -> {\n                    volumeListen.down()\n                    return true\n                }\n\n                KeyEvent.KEYCODE_VOLUME_UP -> {\n                    volumeListen.up()\n                    return true\n                }\n            }\n        }\n        return super.onKeyDown(keyCode, event)\n    }\n\n    /// Ensure that the directory is accessible by dart:io\n    private fun onPickedDirectory(uri: Uri, result: MethodChannel.Result) {\n        if (hasStoragePermission()) {\n            var plain = uri.toString()\n            if(plain.contains(\"%3A\")) {\n                plain = Uri.decode(plain)\n            }\n            val externalStoragePrefix = \"content://com.android.externalstorage.documents/tree/primary:\";\n            if(plain.startsWith(externalStoragePrefix)) {\n                val path = plain.substring(externalStoragePrefix.length)\n                result.success(Environment.getExternalStorageDirectory().absolutePath + \"/\" + path)\n            }\n            // The uri cannot be parsed to plain path, use copy method\n        }\n        // dart:io cannot access the directory without permission.\n        // so we need to copy the directory to cache directory\n        val contentResolver = contentResolver\n        var tmp = cacheDir\n        var dirName = DocumentFile.fromTreeUri(this, uri)?.name\n        tmp = File(tmp, dirName!!)\n        if(tmp.exists()) {\n            tmp.deleteRecursively()\n        }\n        tmp.mkdir()\n        Thread {\n            try {\n                copyDirectory(contentResolver, uri, tmp)\n                result.success(tmp.absolutePath)\n            }\n            catch (e: Exception) {\n                result.error(\"copy error\", e.message, null)\n            }\n        }.start()\n\n    }\n\n    private fun copyDirectory(resolver: ContentResolver, srcUri: Uri, destDir: File) {\n        val src = DocumentFile.fromTreeUri(this, srcUri) ?: return\n        for (file in src.listFiles()) {\n            if (file.isDirectory) {\n                val newDir = File(destDir, file.name!!)\n                newDir.mkdir()\n                copyDirectory(resolver, file.uri, newDir)\n            } else {\n                val newFile = File(destDir, file.name!!)\n                resolver.openInputStream(file.uri)?.use { input ->\n                    FileOutputStream(newFile).use { output ->\n                        input.copyTo(output, bufferSize = DEFAULT_BUFFER_SIZE)\n                        output.flush()\n                    }\n                }\n            }\n        }\n    }\n\n    private fun hasStoragePermission(): Boolean {\n        return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {\n            ContextCompat.checkSelfPermission(\n                this,\n                Manifest.permission.READ_EXTERNAL_STORAGE\n            ) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(\n                this,\n                Manifest.permission.WRITE_EXTERNAL_STORAGE\n            ) == PackageManager.PERMISSION_GRANTED\n        } else {\n            Environment.isExternalStorageManager()\n        }\n    }\n\n    private fun requestStoragePermission(result: (Boolean) -> Unit) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {\n            val readPermission = ContextCompat.checkSelfPermission(\n                this,\n                Manifest.permission.READ_EXTERNAL_STORAGE\n            ) == PackageManager.PERMISSION_GRANTED\n\n            val writePermission = ContextCompat.checkSelfPermission(\n                this,\n                Manifest.permission.WRITE_EXTERNAL_STORAGE\n            ) == PackageManager.PERMISSION_GRANTED\n\n            if (!readPermission || !writePermission) {\n                storagePermissionRequest = result\n                ActivityCompat.requestPermissions(\n                    this,\n                    arrayOf(\n                        Manifest.permission.READ_EXTERNAL_STORAGE,\n                        Manifest.permission.WRITE_EXTERNAL_STORAGE\n                    ),\n                    storageRequestCode\n                )\n            } else {\n                result(true)\n            }\n        } else {\n            if (!Environment.isExternalStorageManager()) {\n                try {\n                    val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)\n                    intent.addCategory(\"android.intent.category.DEFAULT\")\n                    intent.data = Uri.parse(\"package:$packageName\")\n                    startContractForResult(ActivityResultContracts.StartActivityForResult(), intent){ _ ->\n                        result(Environment.isExternalStorageManager())\n                    }\n                } catch (e: Exception) {\n                    result(false)\n                }\n            } else {\n                result(true)\n            }\n        }\n    }\n\n    override fun onRequestPermissionsResult(\n        requestCode: Int,\n        permissions: Array<out String>,\n        grantResults: IntArray\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == storageRequestCode) {\n            storagePermissionRequest?.invoke(grantResults.all {\n                it == PackageManager.PERMISSION_GRANTED\n            })\n            storagePermissionRequest = null\n        }\n    }\n\n    private fun openFile(result: MethodChannel.Result, mimeType: String) {\n        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)\n        intent.addCategory(Intent.CATEGORY_OPENABLE)\n        intent.type = mimeType\n        startContractForResult(ActivityResultContracts.StartActivityForResult(), intent){ activityResult ->\n            if (activityResult.resultCode != Activity.RESULT_OK) {\n                result.success(null)\n                return@startContractForResult\n            }\n            val uri = activityResult.data?.data\n            if (uri == null) {\n                result.success(null)\n                return@startContractForResult\n            }\n            val contentResolver = contentResolver\n            val file = DocumentFile.fromSingleUri(this, uri)\n            if (file == null) {\n                result.success(null)\n                return@startContractForResult\n            }\n            val fileName = file.name\n            if (fileName == null) {\n                result.success(null)\n                return@startContractForResult\n            }\n            if(hasStoragePermission()) {\n                try {\n                    val filePath = FileUtils.getPathFromUri(this, uri)\n                    result.success(filePath)\n                    return@startContractForResult\n                }\n                catch (e: Exception) {\n                    // ignore\n                }\n            }\n            // use copy method\n            val tmp = File(cacheDir, fileName)\n            if(tmp.exists()) {\n                tmp.delete()\n            }\n            Log.i(\"Venera\", \"copy file (${fileName}) to ${tmp.absolutePath}\")\n            Thread {\n                try {\n                    contentResolver.openInputStream(uri)?.use { input ->\n                        FileOutputStream(tmp).use { output ->\n                            input.copyTo(output, bufferSize = DEFAULT_BUFFER_SIZE)\n                            output.flush()\n                        }\n                    }\n                    result.success(tmp.absolutePath)\n                }\n                catch (e: Exception) {\n                    result.error(\"copy error\", e.message, null)\n                }\n            }.start()\n        }\n    }\n}\n\nclass VolumeListen {\n    var onUp = fun() {}\n    var onDown = fun() {}\n    fun up() {\n        onUp()\n    }\n\n    fun down() {\n        onDown()\n    }\n}\n\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"?android:colorBackground\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <background android:drawable=\"@mipmap/ic_launcher_background\"/>\n  <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n  <monochrome android:drawable=\"@mipmap/ic_launcher_monochrome\"/>\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/values/strings.xml",
    "content": "<?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",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">true</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Light.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             the Flutter engine draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">true</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n    <!-- Theme applied to the Android Window as soon as the process has started.\n         This theme determines the color of the Android Window while your\n         Flutter UI initializes, as well as behind your Flutter UI while its\n         running.\n\n         This Theme is only used starting with V2 of Flutter's Android embedding. -->\n    <style name=\"NormalTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">?android:colorBackground</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values-zh/strings.xml",
    "content": "<?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",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"share_text\">搜索</string>\n</resources>"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- The INTERNET permission is required for development. Specifically,\n         the Flutter tool needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.buildDir = \"../build\"\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(\":app\")\n}\n\ntasks.register(\"clean\", Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.13-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError\nandroid.useAndroidX=true\nandroid.enableJetifier=true\nandroid.defaults.buildfeatures.buildconfig=true\nandroid.nonTransitiveRClass=false\nandroid.nonFinalResIds=false"
  },
  {
    "path": "android/settings.gradle",
    "content": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\").withInputStream { properties.load(it) }\n        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n        return flutterSdkPath\n    }()\n\n    includeBuild(\"$flutterSdkPath/packages/flutter_tools/gradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n    id \"com.android.application\" version '8.12.3' apply false\n    id \"org.jetbrains.kotlin.android\" version \"2.1.0\" apply false\n}\n\ninclude \":app\"\n"
  },
  {
    "path": "assets/init.js",
    "content": "/*\nVenera JavaScript Library\n\nThis library provides a set of APIs for interacting with the Venera app.\n*/\n\n/**\n * @function sendMessage\n * @global\n * @param {Object} message\n * @returns {any}\n */\n\n/**\n * Set a timeout to execute a callback function after a specified delay.\n * @param callback {Function}\n * @param delay {number} - delay in milliseconds\n */\nfunction setTimeout(callback, delay) {\n    sendMessage({\n        method: 'delay',\n        time: delay,\n    }).then(callback);\n}\n\n/// encode, decode, hash, decrypt\nlet Convert = {\n    /**\n     * @param str {string}\n     * @returns {ArrayBuffer}\n     */\n    encodeUtf8: (str) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"utf8\",\n            value: str,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param value {ArrayBuffer}\n     * @returns {string}\n     */\n    decodeUtf8: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"utf8\",\n            value: value,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param str {string}\n     * @returns {ArrayBuffer}\n     */\n    encodeGbk: (str) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"gbk\",\n            value: str,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param value {ArrayBuffer}\n     * @returns {string}\n     */\n    decodeGbk: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"gbk\",\n            value: value,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {string}\n     */\n    encodeBase64: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"base64\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {string} value\n     * @returns {ArrayBuffer}\n     */\n    decodeBase64: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"base64\",\n            value: value,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    md5: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"md5\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha1: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"sha1\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha256: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"sha256\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @returns {ArrayBuffer}\n     */\n    sha512: (value) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"sha512\",\n            value: value,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param key {ArrayBuffer}\n     * @param value {ArrayBuffer}\n     * @param hash {string} - md5, sha1, sha256, sha512\n     * @returns {ArrayBuffer}\n     */\n    hmac: (key, value, hash) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"hmac\",\n            value: value,\n            key: key,\n            hash: hash,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param key {ArrayBuffer}\n     * @param value {ArrayBuffer}\n     * @param hash {string} - md5, sha1, sha256, sha512\n     * @returns {string} - hex string\n     */\n    hmacString: (key, value, hash) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"hmac\",\n            value: value,\n            key: key,\n            hash: hash,\n            isEncode: true,\n            isString: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    encryptAesEcb: (value, key) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ecb\",\n            value: value,\n            key: key,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    decryptAesEcb: (value, key) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ecb\",\n            value: value,\n            key: key,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {ArrayBuffer} iv\n     * @returns {ArrayBuffer}\n     */\n    encryptAesCbc: (value, key, iv) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-cbc\",\n            value: value,\n            key: key,\n            iv: iv,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {ArrayBuffer} iv\n     * @returns {ArrayBuffer}\n     */\n    decryptAesCbc: (value, key, iv) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-cbc\",\n            value: value,\n            key: key,\n            iv: iv,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {ArrayBuffer} iv\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    encryptAesCfb: (value, key, iv, blockSize) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-cfb\",\n            value: value,\n            key: key,\n            iv: iv,\n            blockSize: blockSize,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {ArrayBuffer} iv\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    decryptAesCfb: (value, key, iv, blockSize) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-cfb\",\n            value: value,\n            key: key,\n            iv: iv,\n            blockSize: blockSize,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    encryptAesOfb: (value, key, blockSize) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ofb\",\n            value: value,\n            key: key,\n            blockSize: blockSize,\n            isEncode: true\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @param {number} blockSize\n     * @returns {ArrayBuffer}\n     */\n    decryptAesOfb: (value, key, blockSize) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"aes-ofb\",\n            value: value,\n            key: key,\n            blockSize: blockSize,\n            isEncode: false\n        });\n    },\n\n    /**\n     * @param {ArrayBuffer} value\n     * @param {ArrayBuffer} key\n     * @returns {ArrayBuffer}\n     */\n    decryptRsa: (value, key) => {\n        return sendMessage({\n            method: \"convert\",\n            type: \"rsa\",\n            value: value,\n            key: key,\n            isEncode: false\n        });\n    },\n    /** Encode bytes to hex string\n     * @param bytes {ArrayBuffer}\n     * @return {string}\n     */\n    hexEncode: (bytes) => {\n        const hexDigits = '0123456789abcdef';\n        const view = new Uint8Array(bytes);\n        let charCodes = new Uint8Array(view.length * 2);\n        let j = 0;\n\n        for (let i = 0; i < view.length; i++) {\n            let byte = view[i];\n            charCodes[j++] = hexDigits.charCodeAt((byte >> 4) & 0xF);\n            charCodes[j++] = hexDigits.charCodeAt(byte & 0xF);\n        }\n\n        return String.fromCharCode(...charCodes);\n    },\n}\n\n/**\n * create a time-based uuid\n *\n * Note: the engine will generate a new uuid every time it is called\n *\n * To get the same uuid, please save it to the local storage\n *\n * @returns {string}\n */\nfunction createUuid() {\n    return sendMessage({\n        method: \"uuid\"\n    });\n}\n\n/**\n * Generate a random integer between min and max\n * @param min {number}\n * @param max {number}\n * @returns {number}\n */\nfunction randomInt(min, max) {\n    return sendMessage({\n        method: 'random',\n        type: 'int',\n        min: min,\n        max: max\n    });\n}\n\n/**\n * Generate a random double between min and max\n * @param min {number}\n * @param max {number}\n * @returns {number}\n */\nfunction randomDouble(min, max) {\n    return sendMessage({\n        method: 'random',\n        type: 'double',\n        min: min,\n        max: max\n    });\n}\n\nclass _Timer {\n    delay = 0;\n\n    callback = () => { };\n\n    status = false;\n\n    constructor(delay, callback) {\n        this.delay = delay;\n        this.callback = callback;\n    }\n\n    run() {\n        this.status = true;\n        this._interval();\n    }\n\n    _interval() {\n        if (!this.status) {\n            return;\n        }\n        this.callback();\n        setTimeout(this._interval.bind(this), this.delay);\n    }\n\n    cancel() {\n        this.status = false;\n    }\n}\n\nfunction setInterval(callback, delay) {\n    let timer = new _Timer(delay, callback);\n    timer.run();\n    return timer;\n}\n\n/**\n * Create a cookie object.\n * @param name {string}\n * @param value {string}\n * @param domain {string}\n * @constructor\n */\nfunction Cookie({name, value, domain}) {\n    this.name = name;\n    this.value = value;\n    this.domain = domain;\n}\n\n/**\n * Network object for sending HTTP requests and managing cookies.\n * @namespace Network\n */\nlet Network = {\n    /**\n     * Sends an HTTP request.\n     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: ArrayBuffer}>} The response from the request.\n     */\n    async fetchBytes(method, url, headers, data, extra) {\n        let result = await sendMessage({\n            method: 'http',\n            http_method: method,\n            bytes: true,\n            url: url,\n            headers: headers,\n            data: data,\n            extra: extra,\n        });\n\n        if (result.error) {\n            throw result.error;\n        }\n\n        return result;\n    },\n\n    /**\n     * Sends an HTTP request.\n     * @param {string} method - The HTTP method (e.g., GET, POST, PUT, PATCH, DELETE).\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.\n     */\n    async sendRequest(method, url, headers, data, extra) {\n        let result = await sendMessage({\n            method: 'http',\n            http_method: method,\n            url: url,\n            headers: headers,\n            data: data,\n            extra: extra,\n        });\n\n        if (result.error) {\n            throw result.error;\n        }\n\n        return result;\n    },\n\n    /**\n     * Sends an HTTP GET request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.\n     */\n    async get(url, headers, extra) {\n        return this.sendRequest('GET', url, headers, extra);\n    },\n\n    /**\n     * Sends an HTTP POST request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.\n     */\n    async post(url, headers, data, extra) {\n        return this.sendRequest('POST', url, headers, data, extra);\n    },\n\n    /**\n     * Sends an HTTP PUT request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.\n     */\n    async put(url, headers, data, extra) {\n        return this.sendRequest('PUT', url, headers, data, extra);\n    },\n\n    /**\n     * Sends an HTTP PATCH request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param data - The data to send with the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.\n     */\n    async patch(url, headers, data, extra) {\n        return this.sendRequest('PATCH', url, headers, data, extra);\n    },\n\n    /**\n     * Sends an HTTP DELETE request.\n     * @param {string} url - The URL to send the request to.\n     * @param {Object} headers - The headers to include in the request.\n     * @param {Object} extra - Extra options to pass to the interceptor.\n     * @returns {Promise<{status: number, headers: {}, body: string}>} The response from the request.\n     */\n    async delete(url, headers, extra) {\n        return this.sendRequest('DELETE', url, headers, extra);\n    },\n\n    /**\n     * Sets cookies for a specific URL.\n     * @param {string} url - The URL to set the cookies for.\n     * @param {Cookie[]} cookies - The cookies to set.\n     */\n    setCookies(url, cookies) {\n        sendMessage({\n            method: 'cookie',\n            function: 'set',\n            url: url,\n            cookies: cookies,\n        });\n    },\n\n    /**\n     * Retrieves cookies for a specific URL.\n     * @param {string} url - The URL to get the cookies from.\n     * @returns {Promise<Cookie[]>} The cookies for the given URL.\n     */\n    getCookies(url) {\n        return sendMessage({\n            method: 'cookie',\n            function: 'get',\n            url: url,\n        });\n    },\n\n    /**\n     * Deletes cookies for a specific URL.\n     * @param {string} url - The URL to delete the cookies from.\n     */\n    deleteCookies(url) {\n        sendMessage({\n            method: 'cookie',\n            function: 'delete',\n            url: url,\n        });\n    },\n};\n\n/**\n * [fetch] function for sending HTTP requests. Same api as the browser fetch.\n * @param url {string}\n * @param [options] {{method?: string, headers?: Object, body?: any}}\n * @returns {Promise<{ok: boolean, status: number, statusText: string, headers: {}, arrayBuffer: (function(): Promise<ArrayBuffer>), text: (function(): Promise<string>), json: (function(): Promise<any>)}>}\n * @since 1.2.0\n */\nasync function fetch(url, options) {\n    let method = 'GET';\n    let headers = {};\n    let data = null;\n\n    if (options) {\n        method = options.method || method;\n        headers = options.headers || headers;\n        data = options.body || data;\n    }\n\n    let result = await Network.fetchBytes(method, url, headers, data);\n\n    return {\n        ok: result.status >= 200 && result.status < 300,\n        status: result.status,\n        statusText: '',\n        headers: result.headers,\n        arrayBuffer: async () => result.body,\n        text: async () => Convert.decodeUtf8(result.body),\n        json: async () => JSON.parse(Convert.decodeUtf8(result.body)),\n    }\n}\n\n/**\n * HtmlDocument class for parsing HTML and querying elements.\n */\nclass HtmlDocument {\n    static _key = 0;\n\n    key = 0;\n\n    /**\n     * Constructor for HtmlDocument.\n     * @param {string} html - The HTML string to parse.\n     */\n    constructor(html) {\n        this.key = HtmlDocument._key;\n        HtmlDocument._key++;\n        sendMessage({\n            method: \"html\",\n            function: \"parse\",\n            key: this.key,\n            data: html\n        })\n    }\n\n    /**\n     * Query a single element from the HTML document.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement | null} The first matching element.\n     */\n    querySelector(query) {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"querySelector\",\n            key: this.key,\n            query: query\n        })\n        if(k == null) return null;\n        return new HtmlElement(k, this.key);\n    }\n\n    /**\n     * Query all matching elements from the HTML document.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement[]} An array of matching elements.\n     */\n    querySelectorAll(query) {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"querySelectorAll\",\n            key: this.key,\n            query: query\n        })\n        return ks.map(k => new HtmlElement(k, this.key));\n    }\n\n    /**\n     * Dispose the HTML document.\n     * This should be called when the document is no longer needed.\n     */\n    dispose() {\n        sendMessage({\n            method: \"html\",\n            function: \"dispose\",\n            key: this.key\n        })\n    }\n\n    /**\n     * Get the element by its id.\n     * @param id {string}\n     * @returns {HtmlElement|null}\n     */\n    getElementById(id) {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"getElementById\",\n            key: this.key,\n            id: id\n        })\n        if(k == null) return null;\n        return new HtmlElement(k, this.key);\n    }\n}\n\n/**\n * HtmlDom class for interacting with HTML elements.\n */\nclass HtmlElement {\n    key = 0;\n\n    doc = 0;\n\n    /**\n     * Constructor for HtmlDom.\n     * @param {number} k - The key of the element.\n     * @param {number} doc - The key of the document.\n     */\n    constructor(k, doc) {\n        this.key = k;\n        this.doc = doc;\n    }\n\n    /**\n     * Get the text content of the element.\n     * @returns {string} The text content.\n     */\n    get text() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getText\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Get the attributes of the element.\n     * @returns {Object} The attributes.\n     */\n    get attributes() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getAttributes\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Query a single element from the current element.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement} The first matching element.\n     */\n    querySelector(query) {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"dom_querySelector\",\n            key: this.key,\n            query: query,\n            doc: this.doc,\n        })\n        if(k == null) return null;\n        return new HtmlElement(k, this.doc);\n    }\n\n    /**\n     * Query all matching elements from the current element.\n     * @param {string} query - The query string.\n     * @returns {HtmlElement[]} An array of matching elements.\n     */\n    querySelectorAll(query) {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"dom_querySelectorAll\",\n            key: this.key,\n            query: query,\n            doc: this.doc,\n        })\n        return ks.map(k => new HtmlElement(k, this.doc));\n    }\n\n    /**\n     * Get the children of the current element.\n     * @returns {HtmlElement[]} An array of child elements.\n     */\n    get children() {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"getChildren\",\n            key: this.key,\n            doc: this.doc,\n        })\n        return ks.map(k => new HtmlElement(k, this.doc));\n    }\n\n    /**\n     * Get the nodes of the current element.\n     * @returns {HtmlNode[]} An array of nodes.\n     */\n    get nodes() {\n        let ks = sendMessage({\n            method: \"html\",\n            function: \"getNodes\",\n            key: this.key,\n            doc: this.doc,\n        })\n        return ks.map(k => new HtmlNode(k, this.doc));\n    }\n\n    /**\n     * Get inner HTML of the element.\n     * @returns {string} The inner HTML.\n     */\n    get innerHTML() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getInnerHTML\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Get parent element of the element. If the element has no parent, return null.\n     * @returns {HtmlElement|null}\n     */\n    get parent() {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"getParent\",\n            key: this.key,\n            doc: this.doc,\n        })\n        if(k == null) return null;\n        return new HtmlElement(k, this.doc);\n    }\n\n    /**\n     * Get class names of the element.\n     * @returns {string[]} An array of class names.\n     */\n    get classNames() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getClassNames\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Get id of the element.\n     * @returns {string | null} The id of the element.\n     */\n    get id() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getId\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Get local name of the element.\n     * @returns {string} The tag name of the element.\n     */\n    get localName() {\n        return sendMessage({\n            method: \"html\",\n            function: \"getLocalName\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Get the previous sibling element of the element. If the element has no previous sibling, return null.\n     * @returns {HtmlElement|null}\n     */\n    get previousElementSibling() {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"getPreviousSibling\",\n            key: this.key,\n            doc: this.doc,\n        })\n        if(k == null) return null;\n        return new HtmlElement(k, this.doc);\n    }\n\n    /**\n     * Get the next sibling element of the element. If the element has no next sibling, return null.\n     * @returns {HtmlElement|null}\n     */\n    get nextElementSibling() {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"getNextSibling\",\n            key: this.key,\n            doc: this.doc,\n        })\n        if (k == null) return null;\n        return new HtmlElement(k, this.doc);\n    }\n}\n\nclass HtmlNode {\n    key = 0;\n\n    doc = 0;\n\n    constructor(k, doc) {\n        this.key = k;\n        this.doc = doc;\n    }\n\n    /**\n     * Get the text content of the node.\n     * @returns {string} The text content.\n     */\n    get text() {\n        return sendMessage({\n            method: \"html\",\n            function: \"node_text\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Get the type of the node.\n     * @returns {string} The type of the node. (\"text\", \"element\", \"comment\", \"document\", \"unknown\")\n     */\n    get type() {\n        return sendMessage({\n            method: \"html\",\n            function: \"node_type\",\n            key: this.key,\n            doc: this.doc,\n        })\n    }\n\n    /**\n     * Convert the node to an HtmlElement. If the node is not an element, return null.\n     * @returns {HtmlElement|null}\n     */\n    toElement() {\n        let k = sendMessage({\n            method: \"html\",\n            function: \"node_toElement\",\n            key: this.key,\n            doc: this.doc,\n        })\n        if(k == null) return null;\n        return new HtmlElement(k, this.doc);\n    }\n}\n\nfunction log(level, title, content) {\n    sendMessage({\n        method: 'log',\n        level: level,\n        title: title,\n        content: content,\n    })\n}\n\nlet console = {\n    log: (content) => {\n        log('info', 'JS Console', content)\n    },\n    warn: (content) => {\n        log('warning', 'JS Console', content)\n    },\n    error: (content) => {\n        log('error', 'JS Console', content)\n    },\n};\n\n/**\n * Create a comic object\n * @param id {string}\n * @param title {string}\n * @param subtitle {string}\n * @param subTitle {string} - equal to subtitle\n * @param cover {string}\n * @param tags {string[]}\n * @param description {string}\n * @param maxPage {number?}\n * @param language {string?}\n * @param favoriteId {string?} - Only set this field if the comic is from favorites page\n * @param stars {number?} - 0-5, double\n * @constructor\n */\nfunction Comic({id, title, subtitle, subTitle, cover, tags, description, maxPage, language, favoriteId, stars}) {\n    this.id = id;\n    this.title = title;\n    this.subtitle = subtitle;\n    this.subTitle = subTitle;\n    this.cover = cover;\n    this.tags = tags;\n    this.description = description;\n    this.maxPage = maxPage;\n    this.language = language;\n    this.favoriteId = favoriteId;\n    this.stars = stars;\n}\n\n/**\n * Create a comic details object\n * @param title {string}\n * @param subtitle {string}\n * @param subTitle {string} - equal to subtitle\n * @param cover {string}\n * @param description {string?}\n * @param tags {Map<string, string[]> | {} | null | undefined}\n * @param chapters {Map<string, string> | {} | null | undefined} - key: chapter id, value: chapter title\n * @param isFavorite {boolean | null | undefined} - favorite status.\n * @param subId {string?} - a param which is passed to comments api\n * @param thumbnails {string[]?} - for multiple page thumbnails, set this to null, and use `loadThumbnails` api to load thumbnails\n * @param recommend {Comic[]?} - related comics\n * @param commentCount {number?}\n * @param likesCount {number?}\n * @param isLiked {boolean?}\n * @param uploader {string?}\n * @param updateTime {string?}\n * @param uploadTime {string?}\n * @param url {string?}\n * @param stars {number?} - 0-5, double\n * @param maxPage {number?}\n * @param comments {Comment[]?}- `since 1.0.7` App will display comments in the details page.\n * @constructor\n */\nfunction ComicDetails({title, subtitle, subTitle, cover, description, tags, chapters, isFavorite, subId, thumbnails, recommend, commentCount, likesCount, isLiked, uploader, updateTime, uploadTime, url, stars, maxPage, comments}) {\n    this.title = title;\n    this.subtitle = subtitle ?? subTitle;\n    this.cover = cover;\n    this.description = description;\n    this.tags = tags;\n    this.chapters = chapters;\n    this.isFavorite = isFavorite;\n    this.subId = subId;\n    this.thumbnails = thumbnails;\n    this.recommend = recommend;\n    this.commentCount = commentCount;\n    this.likesCount = likesCount;\n    this.isLiked = isLiked;\n    this.uploader = uploader;\n    this.updateTime = updateTime;\n    this.uploadTime = uploadTime;\n    this.url = url;\n    this.stars = stars;\n    this.maxPage = maxPage;\n    this.comments = comments;\n}\n\n/**\n * Create a comment object\n * @param userName {string}\n * @param avatar {string?}\n * @param content {string}\n * @param time {string?}\n * @param replyCount {number?}\n * @param id {string?}\n * @param isLiked {boolean?}\n * @param score {number?}\n * @param voteStatus {number?} - 1: upvote, -1: downvote, 0: none\n * @constructor\n */\nfunction Comment({userName, avatar, content, time, replyCount, id, isLiked, score, voteStatus}) {\n    this.userName = userName;\n    this.avatar = avatar;\n    this.content = content;\n    this.time = time;\n    this.replyCount = replyCount;\n    this.id = id;\n    this.isLiked = isLiked;\n    this.score = score;\n    this.voteStatus = voteStatus;\n}\n\n/**\n * Create image loading config\n * @param url {string?}\n * @param method {string?} - http method, uppercase\n * @param data {any} - request data, may be null\n * @param headers {Object?} - request headers\n * @param onResponse {((ArrayBuffer) => ArrayBuffer)?} - modify response data\n * @param modifyImage {string?}\n *  A js script string.\n *  The script will be executed in a new Isolate.\n *  A function named `modifyImage` should be defined in the script, which receives an [Image] as the only argument, and returns an [Image]..\n * @param onLoadFailed {(() => ImageLoadingConfig)?} - called when the image loading failed\n * @constructor\n * @since 1.0.5\n *\n * To keep the compatibility with the old version, do not use the constructor. Consider creating a new object with the properties directly.\n */\nfunction ImageLoadingConfig({url, method, data, headers, onResponse, modifyImage, onLoadFailed}) {\n    this.url = url;\n    this.method = method;\n    this.data = data;\n    this.headers = headers;\n    this.onResponse = onResponse;\n    this.modifyImage = modifyImage;\n    this.onLoadFailed = onLoadFailed;\n}\n\nclass ComicSource {\n    name = \"\"\n\n    key = \"\"\n\n    version = \"\"\n\n    minAppVersion = \"\"\n\n    url = \"\"\n\n    /**\n     * load data with its key\n     * @param {string} dataKey\n     * @returns {any}\n     */\n    loadData(dataKey) {\n        return sendMessage({\n            method: 'load_data',\n            key: this.key,\n            data_key: dataKey\n        })\n    }\n\n    /**\n     * load a setting with its key\n     * @param key {string}\n     * @returns {any}\n     */\n    loadSetting(key) {\n        return sendMessage({\n            method: 'load_setting',\n            key: this.key,\n            setting_key: key\n        })\n    }\n\n    /**\n     * save data\n     * @param {string} dataKey\n     * @param data\n     */\n    saveData(dataKey, data) {\n        return sendMessage({\n            method: 'save_data',\n            key: this.key,\n            data_key: dataKey,\n            data: data\n        })\n    }\n\n    /**\n     * delete data\n     * @param {string} dataKey\n     */\n    deleteData(dataKey) {\n        return sendMessage({\n            method: 'delete_data',\n            key: this.key,\n            data_key: dataKey,\n        })\n    }\n\n    /**\n     *\n     * @returns {boolean}\n     */\n    get isLogged() {\n        return sendMessage({\n            method: 'isLogged',\n            key: this.key,\n        });\n    }\n\n    translation = {}\n\n    /**\n     * Translate given string with the current locale using the translation object.\n     * @param key {string}\n     * @returns {string}\n     * @since 1.2.5\n     */\n    translate(key) {\n        let locale = APP.locale;\n        return this.translation[locale]?.[key] ?? key;\n    }\n\n    init() { }\n\n    static sources = {}\n}\n\n/// A reference to dart object.\n/// The api can only be used in the comic.onImageLoad.modifyImage function\nclass Image {\n    key = 0;\n\n    constructor(key) {\n        this.key = key;\n    }\n\n    /**\n     * Copy the specified range of the image\n     * @param x\n     * @param y\n     * @param width\n     * @param height\n     * @returns {Image|null}\n     */\n    copyRange(x, y, width, height) {\n        let key = sendMessage({\n            method: \"image\",\n            function: \"copyRange\",\n            key: this.key,\n            x: x,\n            y: y,\n            width: width,\n            height: height\n        })\n        if(key == null) return null;\n        return new Image(key);\n    }\n\n    /**\n     * Copy the image and rotate 90 degrees\n     * @returns {Image|null}\n     */\n    copyAndRotate90() {\n        let key = sendMessage({\n            method: \"image\",\n            function: \"copyAndRotate90\",\n            key: this.key\n        })\n        if(key == null) return null;\n        return new Image(key);\n    }\n\n    /**\n     * fill [image] to this image at (x, y)\n     * @param x\n     * @param y\n     * @param image\n     */\n    fillImageAt(x, y, image) {\n        sendMessage({\n            method: \"image\",\n            function: \"fillImageAt\",\n            key: this.key,\n            x: x,\n            y: y,\n            image: image.key\n        })\n    }\n\n    /**\n     * fill [image] with range(srcX, srcY, width, height) to this image at (x, y)\n     * @param x\n     * @param y\n     * @param image\n     * @param srcX\n     * @param srcY\n     * @param width\n     * @param height\n     */\n    fillImageRangeAt(x, y, image, srcX, srcY, width, height) {\n        sendMessage({\n            method: \"image\",\n            function: \"fillImageRangeAt\",\n            key: this.key,\n            x: x,\n            y: y,\n            image: image.key,\n            srcX: srcX,\n            srcY: srcY,\n            width: width,\n            height: height\n        })\n    }\n\n    get width() {\n        return sendMessage({\n            method: \"image\",\n            function: \"getWidth\",\n            key: this.key\n        })\n    }\n\n    get height() {\n        return sendMessage({\n            method: \"image\",\n            function: \"getHeight\",\n            key: this.key\n        })\n    }\n\n    static empty(width, height) {\n        let key = sendMessage({\n            method: \"image\",\n            function: \"emptyImage\",\n            width: width,\n            height: height\n        })\n        return new Image(key);\n    }\n}\n\n/**\n * UI related apis\n * @since 1.2.0\n */\nlet UI = {\n    /**\n     * Show a message\n     * @param message {string}\n     */\n    showMessage: (message) => {\n        sendMessage({\n            method: 'UI',\n            function: 'showMessage',\n            message: message,\n        })\n    },\n\n    /**\n     * Show a dialog. Any action will close the dialog.\n     * @param title {string}\n     * @param content {string}\n     * @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.\n     * @returns {Promise<void>} - Resolved when the dialog is closed.\n     * @since 1.2.1\n     */\n    showDialog: (title, content, actions) => {\n        sendMessage({\n            method: 'UI',\n            function: 'showDialog',\n            title: title,\n            content: content,\n            actions: actions,\n        })\n    },\n\n    /**\n     * Open [url] in external browser\n     * @param url {string}\n     */\n    launchUrl: (url) => {\n        sendMessage({\n            method: 'UI',\n            function: 'launchUrl',\n            url: url,\n        })\n    },\n\n    /**\n     * Show a loading dialog.\n     * @param onCancel {() => void | null | undefined} - Called when the loading dialog is canceled. If [onCancel] is null, the dialog cannot be canceled by the user.\n     * @returns {number} - A number that can be used to cancel the loading dialog.\n     * @since 1.2.1\n     */\n    showLoading: (onCancel) => {\n        return sendMessage({\n            method: 'UI',\n            function: 'showLoading',\n            onCancel: onCancel\n        })\n    },\n\n    /**\n     * Cancel a loading dialog.\n     * @param id {number} - returned by [showLoading]\n     * @since 1.2.1\n     */\n    cancelLoading: (id) => {\n        sendMessage({\n            method: 'UI',\n            function: 'cancelLoading',\n            id: id\n        })\n    },\n\n    /**\n     * Show an input dialog\n     * @param title {string}\n     * @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.\n     * @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.\n     * @returns {Promise<string | null>} - The input value. If the dialog is canceled, return null.\n     */\n    showInputDialog: (title, validator, image) => {\n        return sendMessage({\n            method: 'UI',\n            function: 'showInputDialog',\n            title: title,\n            image: image,\n            validator: validator\n        })\n    },\n\n    /**\n     * Show a select dialog\n     * @param title {string}\n     * @param options {string[]}\n     * @param initialIndex {number?}\n     * @returns {Promise<number | null>} - The selected index. If the dialog is canceled, return null.\n     */\n    showSelectDialog: (title, options, initialIndex) => {\n        return sendMessage({\n            method: 'UI',\n            function: 'showSelectDialog',\n            title: title,\n            options: options,\n            initialIndex: initialIndex\n        })\n    }\n}\n\n/**\n * App related apis\n * @since 1.2.1\n */\nlet APP = {\n    /**\n     * Get the app version\n     * @returns {string} - The app version\n     */\n    get version() {\n        return appVersion // defined in the engine\n    },\n\n    /**\n     * Get current app locale\n     * @returns {string} - The app locale, in the format of [languageCode]_[countryCode]\n     */\n    get locale() {\n        return sendMessage({\n            method: 'getLocale'\n        })\n    },\n\n    /**\n     * Get current running platform\n     * @returns {string} - The platform name, \"android\", \"ios\", \"windows\", \"macos\", \"linux\"\n     */\n    get platform() {\n        return sendMessage({\n            method: 'getPlatform'\n        })\n    }\n}\n\n/**\n * Set clipboard text\n * @param text {string}\n * @returns {Promise<void>}\n * \n * @since 1.3.4\n */\nfunction setClipboard(text) {\n    return sendMessage({\n        method: 'setClipboard',\n        text: text\n    })\n}\n\n/**\n * Get clipboard text\n * @returns {Promise<string>}\n * \n * @since 1.3.4\n */\nfunction getClipboard() {\n    return sendMessage({\n        method: 'getClipboard'\n    })\n}\n\n/**\n * Compute a function with arguments. The function will be executed in the engine pool which is not in the main thread.\n * @param func {string} - A js code string which can be evaluated to a function. The function will receive the args as its only argument.\n * @param args {any[]} - The arguments to pass to the function.\n * @returns {Promise<any>} - The result of the function.\n * @since 1.5.0\n */\nfunction compute(func, ...args) {\n    return sendMessage({\n        method: 'compute',\n        function: func,\n        args: args\n    })\n}"
  },
  {
    "path": "assets/opencc.txt",
    "content": "# OpenCC Simplified Chinese to Traditional Chinese conversion table\n# Original source: https://github.com/BYVoid/OpenCC\n㐷傌\n㐹㑶\n㐽偑\n㑇㑳\n㑈倲\n㑔㑯\n㑩儸\n㓆𠗣\n㓥劏\n㓰劃\n㔉劚\n㖊噚\n㖞喎\n㘎㘚\n㚯㜄\n㛀媰\n㛟𡞵\n㛠𡢃\n㛣㜏\n㛤孋\n㛿𡠹\n㟆㠏\n㟜𡾱\n㟥嵾\n㡎幓\n㤘㥮\n㤽懤\n㥪慺\n㧏掆\n㧐㩳\n㧑撝\n㧟擓\n㧰擽\n㨫㩜\n㭎棡\n㭏椲\n㭣𣙎\n㭤樢\n㭴樫\n㱩殰\n㱮殨\n㲿瀇\n㳔濧\n㳕灡\n㳠澾\n㳡濄\n㳢𣾷\n㳽瀰\n㴋潚\n㶉鸂\n㶶燶\n㶽煱\n㺍獱\n㻅璯\n㻏𤫩\n㻘𤪺\n䀥䁻\n䁖瞜\n䂵碽\n䃅磾\n䅉稏\n䅟穇\n䅪𥢢\n䇲筴\n䉤籔\n䌶䊷\n䌷紬\n䌸縳\n䌹絅\n䌺䋙\n䌻䋚\n䌼綐\n䌽綵\n䌾䋻\n䌿䋹\n䍀繿\n䍁繸\n䍠䍦\n䎬䎱\n䏝膞\n䑽𦪙\n䓓薵\n䓕薳\n䓖藭\n䓨罃\n䗖螮\n䘛𧝞\n䘞𧜗\n䙊𧜵\n䙌䙡\n䙓襬\n䜣訢\n䜤鿁\n䜥𧩙\n䜧䜀\n䜩讌\n䝙貙\n䞌𧵳\n䞍䝼\n䞎𧶧\n䞐賰\n䟢躎\n䢀𨊰\n䢁𨊸\n䢂𨋢\n䥺釾\n䥽鏺\n䥾䥱\n䥿𨯅\n䦀𨦫\n䦁𨧜\n䦂䥇\n䦃鐯\n䦅鐥\n䦆钁\n䦶䦛\n䦷䦟\n䩄靦\n䭪𩞯\n䯃𩣑\n䯄騧\n䯅䯀\n䲝䱽\n䲞𩶘\n䲟鮣\n䲠鰆\n䲡鰌\n䲢鰧\n䲣䱷\n䴓鳾\n䴔鵁\n䴕鴷\n䴖鶄\n䴗鶪\n䴘鷉\n䴙鸊\n䶮龑\n万萬\n与與\n丑醜\n专專\n业業\n丛叢\n东東\n丝絲\n丢丟\n两兩\n严嚴\n丧喪\n个個\n丰豐\n临臨\n为爲\n丽麗\n举舉\n么麼\n义義\n乌烏\n乐樂\n乔喬\n习習\n乡鄉\n书書\n买買\n乱亂\n了了\n争爭\n于於\n亏虧\n云雲\n亘亙\n亚亞\n产產\n亩畝\n亲親\n亵褻\n亸嚲\n亿億\n仅僅\n仆僕\n仇仇\n从從\n仑侖\n仓倉\n仪儀\n们們\n价價\n仿仿\n众衆\n优優\n伙夥\n会會\n伛傴\n伞傘\n伟偉\n传傳\n伡俥\n伣俔\n伤傷\n伥倀\n伦倫\n伧傖\n伪僞\n伫佇\n体體\n余餘\n佛佛\n佣傭\n佥僉\n侠俠\n侣侶\n侥僥\n侦偵\n侧側\n侨僑\n侩儈\n侪儕\n侬儂\n侭儘\n俊俊\n俣俁\n俦儔\n俨儼\n俩倆\n俪儷\n俫倈\n俭儉\n修修\n借借\n债債\n倾傾\n偬傯\n偻僂\n偾僨\n偿償\n傤儎\n傥儻\n傧儐\n储儲\n傩儺\n僵僵\n儿兒\n克克\n兑兌\n兖兗\n党黨\n兰蘭\n关關\n兴興\n兹茲\n养養\n兽獸\n冁囅\n内內\n冈岡\n册冊\n写寫\n军軍\n农農\n冬冬\n冯馮\n冲衝\n决決\n况況\n冻凍\n净淨\n凄悽\n准準\n凉涼\n凌凌\n减減\n凑湊\n凛凜\n几幾\n凤鳳\n凫鳧\n凭憑\n凯凱\n凶兇\n出出\n击擊\n凿鑿\n刍芻\n划劃\n刘劉\n则則\n刚剛\n创創\n删刪\n别別\n刬剗\n刭剄\n刮刮\n制制\n刹剎\n刽劊\n刾㓨\n刿劌\n剀剴\n剂劑\n剐剮\n剑劍\n剥剝\n剧劇\n劝勸\n办辦\n务務\n劢勱\n动動\n励勵\n劲勁\n劳勞\n势勢\n勋勳\n勚勩\n匀勻\n匦匭\n匮匱\n区區\n医醫\n千千\n升升\n华華\n协協\n单單\n卖賣\n卜卜\n占佔\n卢盧\n卤滷\n卧臥\n卫衛\n却卻\n卷卷\n卺巹\n厂廠\n厅廳\n历歷\n厉厲\n压壓\n厌厭\n厍厙\n厐龎\n厕廁\n厘釐\n厢廂\n厣厴\n厦廈\n厨廚\n厩廄\n厮廝\n县縣\n叁叄\n参參\n叆靉\n叇靆\n双雙\n发發\n变變\n叙敘\n叠疊\n只只\n台臺\n叶葉\n号號\n叹嘆\n叽嘰\n吁籲\n吃喫\n合合\n吊吊\n同同\n后後\n向向\n吓嚇\n吕呂\n吗嗎\n吨噸\n听聽\n启啓\n吴吳\n呐吶\n呒嘸\n呓囈\n呕嘔\n呖嚦\n呗唄\n员員\n呙咼\n呛嗆\n呜嗚\n周周\n咏詠\n咙嚨\n咛嚀\n咝噝\n咤吒\n咨諮\n咸鹹\n咽咽\n哄哄\n响響\n哑啞\n哒噠\n哓嘵\n哔嗶\n哕噦\n哗譁\n哙噲\n哜嚌\n哝噥\n哟喲\n唇脣\n唛嘜\n唝嗊\n唠嘮\n唡啢\n唢嗩\n唤喚\n啧嘖\n啬嗇\n啭囀\n啮齧\n啯嘓\n啰囉\n啴嘽\n啸嘯\n喂喂\n喷噴\n喽嘍\n喾嚳\n嗫囁\n嗳噯\n嘘噓\n嘤嚶\n嘱囑\n噜嚕\n噪噪\n嚣囂\n回回\n团團\n园園\n困困\n囱囪\n围圍\n囵圇\n国國\n图圖\n圆圓\n圣聖\n圹壙\n场場\n坏壞\n块塊\n坚堅\n坛壇\n坜壢\n坝壩\n坞塢\n坟墳\n坠墜\n垄壟\n垅壠\n垆壚\n垒壘\n垦墾\n垩堊\n垫墊\n垭埡\n垯墶\n垱壋\n垲塏\n垴堖\n埘塒\n埙壎\n埚堝\n堑塹\n堕墮\n塆壪\n墙牆\n壮壯\n声聲\n壳殼\n壶壺\n壸壼\n处處\n备備\n复復\n够夠\n夫夫\n头頭\n夸誇\n夹夾\n夺奪\n奁奩\n奂奐\n奋奮\n奖獎\n奥奧\n奸奸\n妆妝\n妇婦\n妈媽\n妩嫵\n妪嫗\n妫嬀\n姗姍\n姜姜\n姹奼\n娄婁\n娅婭\n娆嬈\n娇嬌\n娈孌\n娘娘\n娱娛\n娲媧\n娴嫺\n婳嫿\n婴嬰\n婵嬋\n婶嬸\n媪媼\n媭嬃\n嫒嬡\n嫔嬪\n嫱嬙\n嬷嬤\n孙孫\n学學\n孪孿\n宁寧\n它它\n宝寶\n实實\n宠寵\n审審\n宪憲\n宫宮\n家家\n宽寬\n宾賓\n寝寢\n对對\n寻尋\n导導\n寿壽\n将將\n尔爾\n尘塵\n尝嘗\n尧堯\n尴尷\n尸屍\n尽盡\n局局\n层層\n屃屓\n屉屜\n届屆\n属屬\n屡屢\n屦屨\n屿嶼\n岁歲\n岂豈\n岖嶇\n岗崗\n岘峴\n岚嵐\n岛島\n岩巖\n岭嶺\n岳嶽\n岽崬\n岿巋\n峃嶨\n峄嶧\n峡峽\n峣嶢\n峤嶠\n峥崢\n峦巒\n峰峯\n崂嶗\n崃崍\n崄嶮\n崭嶄\n嵘嶸\n嵚嶔\n嵝嶁\n巅巔\n巨巨\n巩鞏\n巯巰\n币幣\n布布\n帅帥\n师師\n帏幃\n帐帳\n帘簾\n帜幟\n带帶\n帧幀\n席席\n帮幫\n帱幬\n帻幘\n帼幗\n幂冪\n干幹\n并並\n幸幸\n广廣\n庄莊\n庆慶\n床牀\n庐廬\n庑廡\n库庫\n应應\n庙廟\n庞龐\n废廢\n庵庵\n庼廎\n廪廩\n开開\n异異\n弃棄\n弑弒\n张張\n弥彌\n弦弦\n弪弳\n弯彎\n弹彈\n强強\n归歸\n当當\n录錄\n彟彠\n彦彥\n彨彲\n彩彩\n彻徹\n征徵\n径徑\n徕徠\n御御\n忆憶\n忏懺\n志志\n忧憂\n念念\n忾愾\n怀懷\n态態\n怂慫\n怃憮\n怄慪\n怅悵\n怆愴\n怜憐\n总總\n怼懟\n怿懌\n恋戀\n恒恆\n恤恤\n恳懇\n恶惡\n恸慟\n恹懨\n恺愷\n恻惻\n恼惱\n恽惲\n悦悅\n悫愨\n悬懸\n悭慳\n悮悞\n悯憫\n惊驚\n惧懼\n惨慘\n惩懲\n惫憊\n惬愜\n惭慚\n惮憚\n惯慣\n愈愈\n愠慍\n愤憤\n愦憒\n愿願\n慑懾\n慭憖\n懑懣\n懒懶\n懔懍\n戆戇\n戋戔\n戏戲\n戗戧\n战戰\n戚戚\n戬戩\n戯戱\n户戶\n才才\n扎扎\n扑撲\n托託\n扣扣\n执執\n扩擴\n扪捫\n扫掃\n扬揚\n扰擾\n折折\n抚撫\n抛拋\n抟摶\n抠摳\n抡掄\n抢搶\n护護\n报報\n抵抵\n担擔\n拐拐\n拟擬\n拢攏\n拣揀\n拥擁\n拦攔\n拧擰\n拨撥\n择擇\n挂掛\n挚摯\n挛攣\n挜掗\n挝撾\n挞撻\n挟挾\n挠撓\n挡擋\n挢撟\n挣掙\n挤擠\n挥揮\n挦撏\n挨挨\n挽挽\n捝挩\n捞撈\n损損\n捡撿\n换換\n捣搗\n据據\n掳擄\n掴摑\n掷擲\n掸撣\n掺摻\n掼摜\n揽攬\n揾搵\n揿撳\n搀攙\n搁擱\n搂摟\n搄揯\n搅攪\n搜搜\n携攜\n摄攝\n摅攄\n摆擺\n摇搖\n摈擯\n摊攤\n撄攖\n撑撐\n撵攆\n撷擷\n撸擼\n撺攛\n擜㩵\n擞擻\n攒攢\n敌敵\n敚敓\n敛斂\n敩斆\n数數\n斋齋\n斓斕\n斗鬥\n斩斬\n断斷\n旋旋\n无無\n旧舊\n时時\n旷曠\n旸暘\n昆昆\n昙曇\n昵暱\n昼晝\n昽曨\n显顯\n晋晉\n晒曬\n晓曉\n晔曄\n晕暈\n晖暉\n暂暫\n暅𣈶\n暗暗\n暧曖\n曲曲\n术術\n朱朱\n朴樸\n机機\n杀殺\n杂雜\n权權\n杆杆\n杠槓\n条條\n来來\n杨楊\n杩榪\n杯杯\n杰傑\n松松\n板板\n极極\n构構\n枞樅\n枢樞\n枣棗\n枥櫪\n枧梘\n枨棖\n枪槍\n枫楓\n枭梟\n柜櫃\n柠檸\n柽檉\n栀梔\n栅柵\n标標\n栈棧\n栉櫛\n栊櫳\n栋棟\n栌櫨\n栎櫟\n栏欄\n树樹\n栖棲\n栗栗\n样樣\n核核\n栾欒\n桠椏\n桡橈\n桢楨\n档檔\n桤榿\n桥橋\n桦樺\n桧檜\n桨槳\n桩樁\n桪樳\n梁梁\n梦夢\n梼檮\n梾棶\n梿槤\n检檢\n棁梲\n棂欞\n椁槨\n椝槼\n椟櫝\n椠槧\n椢槶\n椤欏\n椫樿\n椭橢\n椮槮\n楼樓\n榄欖\n榅榲\n榇櫬\n榈櫚\n榉櫸\n榝樧\n槚檟\n槛檻\n槟檳\n槠櫧\n横橫\n樯檣\n樱櫻\n橥櫫\n橱櫥\n橹櫓\n橼櫞\n檩檁\n欢歡\n欤歟\n欧歐\n欲欲\n歼殲\n殁歿\n殇殤\n残殘\n殒殞\n殓殮\n殚殫\n殡殯\n殴毆\n毁毀\n毂轂\n毕畢\n毙斃\n毡氈\n毵毿\n毶𣯶\n氇氌\n气氣\n氢氫\n氩氬\n氲氳\n汇匯\n汉漢\n汤湯\n汹洶\n沄澐\n沈沈\n沟溝\n没沒\n沣灃\n沤漚\n沥瀝\n沦淪\n沧滄\n沨渢\n沩潙\n沪滬\n沾沾\n泛泛\n泞濘\n注注\n泪淚\n泶澩\n泷瀧\n泸瀘\n泺濼\n泻瀉\n泼潑\n泽澤\n泾涇\n洁潔\n洒灑\n洼窪\n浃浹\n浅淺\n浆漿\n浇澆\n浈湞\n浉溮\n浊濁\n测測\n浍澮\n济濟\n浏瀏\n浐滻\n浑渾\n浒滸\n浓濃\n浔潯\n浕濜\n涂塗\n涌湧\n涚涗\n涛濤\n涝澇\n涞淶\n涟漣\n涠潿\n涡渦\n涢溳\n涣渙\n涤滌\n润潤\n涧澗\n涨漲\n涩澀\n淀澱\n渊淵\n渌淥\n渍漬\n渎瀆\n渐漸\n渑澠\n渔漁\n渖瀋\n渗滲\n温溫\n游遊\n湾灣\n湿溼\n溁濚\n溃潰\n溅濺\n溆漵\n溇漊\n滗潷\n滚滾\n滞滯\n滟灩\n滠灄\n满滿\n滢瀅\n滤濾\n滥濫\n滦灤\n滨濱\n滩灘\n滪澦\n漓漓\n潆瀠\n潇瀟\n潋瀲\n潍濰\n潜潛\n潴瀦\n澛瀂\n澜瀾\n濑瀨\n濒瀕\n灏灝\n灭滅\n灯燈\n灵靈\n灶竈\n灾災\n灿燦\n炀煬\n炉爐\n炖燉\n炜煒\n炝熗\n点點\n炼煉\n炽熾\n烁爍\n烂爛\n烃烴\n烛燭\n烟煙\n烦煩\n烧燒\n烨燁\n烩燴\n烫燙\n烬燼\n热熱\n焕煥\n焖燜\n焘燾\n煴熅\n熏燻\n爱愛\n爷爺\n牍牘\n牦犛\n牵牽\n牺犧\n犊犢\n状狀\n犷獷\n犸獁\n犹猶\n狈狽\n狝獮\n狞獰\n独獨\n狭狹\n狮獅\n狯獪\n狰猙\n狱獄\n狲猻\n猃獫\n猎獵\n猕獼\n猡玀\n猪豬\n猫貓\n猬蝟\n献獻\n獭獺\n玑璣\n玙璵\n玚瑒\n玛瑪\n玩玩\n玮瑋\n环環\n现現\n玱瑲\n玺璽\n珐琺\n珑瓏\n珰璫\n珲琿\n琎璡\n琏璉\n琐瑣\n琼瓊\n瑶瑤\n瑷璦\n瑸璸\n璇璇\n璎瓔\n瓒瓚\n瓮甕\n瓯甌\n电電\n画畫\n畅暢\n畴疇\n疖癤\n疗療\n疟瘧\n疠癘\n疡瘍\n疬癧\n疭瘲\n疮瘡\n疯瘋\n疱皰\n疴痾\n症症\n痈癰\n痉痙\n痒癢\n痖瘂\n痨癆\n痪瘓\n痫癇\n痴癡\n瘅癉\n瘆瘮\n瘗瘞\n瘘瘻\n瘪癟\n瘫癱\n瘾癮\n瘿癭\n癞癩\n癣癬\n癫癲\n皂皁\n皑皚\n皱皺\n皲皸\n盏盞\n盐鹽\n监監\n盖蓋\n盗盜\n盘盤\n眍瞘\n眦眥\n眬矓\n睁睜\n睐睞\n睑瞼\n瞆瞶\n瞒瞞\n瞩矚\n矩矩\n矫矯\n矶磯\n矾礬\n矿礦\n砀碭\n码碼\n砖磚\n砗硨\n砚硯\n砜碸\n砺礪\n砻礱\n砾礫\n础礎\n硁硜\n硕碩\n硖硤\n硗磽\n硙磑\n硚礄\n确確\n硵磠\n硷礆\n碍礙\n碛磧\n碜磣\n碱鹼\n礼禮\n祃禡\n祎禕\n祢禰\n祯禎\n祷禱\n祸禍\n禀稟\n禄祿\n禅禪\n离離\n私私\n秃禿\n秆稈\n秋秋\n种種\n秘祕\n积積\n称稱\n秽穢\n秾穠\n稆穭\n税稅\n稣穌\n稳穩\n穑穡\n穞穭\n穷窮\n窃竊\n窍竅\n窎窵\n窑窯\n窜竄\n窝窩\n窥窺\n窦竇\n窭窶\n竖豎\n竞競\n笃篤\n笋筍\n笔筆\n笕筧\n笺箋\n笼籠\n笾籩\n筑築\n筚篳\n筛篩\n筜簹\n筝箏\n筹籌\n筼篔\n签籤\n筿篠\n简簡\n箓籙\n箦簀\n箧篋\n箨籜\n箩籮\n箪簞\n箫簫\n篑簣\n篓簍\n篮籃\n篯籛\n篱籬\n簖籪\n籁籟\n籴糴\n类類\n籼秈\n粜糶\n粝糲\n粤粵\n粪糞\n粮糧\n粽糉\n糁糝\n糇餱\n糍餈\n系系\n紧緊\n絷縶\n緼縕\n縆緪\n纟糹\n纠糾\n纡紆\n红紅\n纣紂\n纤纖\n纥紇\n约約\n级級\n纨紈\n纩纊\n纪紀\n纫紉\n纬緯\n纭紜\n纮紘\n纯純\n纰紕\n纱紗\n纲綱\n纳納\n纴紝\n纵縱\n纶綸\n纷紛\n纸紙\n纹紋\n纺紡\n纻紵\n纼紖\n纽紐\n纾紓\n线線\n绀紺\n绁紲\n绂紱\n练練\n组組\n绅紳\n细細\n织織\n终終\n绉縐\n绊絆\n绋紼\n绌絀\n绍紹\n绎繹\n经經\n绐紿\n绑綁\n绒絨\n结結\n绔絝\n绕繞\n绖絰\n绗絎\n绘繪\n给給\n绚絢\n绛絳\n络絡\n绝絕\n绞絞\n统統\n绠綆\n绡綃\n绢絹\n绣繡\n绤綌\n绥綏\n绦絛\n继繼\n绨綈\n绩績\n绪緒\n绫綾\n绬緓\n续續\n绮綺\n绯緋\n绰綽\n绱鞝\n绲緄\n绳繩\n维維\n绵綿\n绶綬\n绷繃\n绸綢\n绹綯\n绺綹\n绻綣\n综綜\n绽綻\n绾綰\n绿綠\n缀綴\n缁緇\n缂緙\n缃緗\n缄緘\n缅緬\n缆纜\n缇緹\n缈緲\n缉緝\n缊縕\n缋繢\n缌緦\n缍綞\n缎緞\n缏緶\n缐線\n缑緱\n缒縋\n缓緩\n缔締\n缕縷\n编編\n缗緡\n缘緣\n缙縉\n缚縛\n缛縟\n缜縝\n缝縫\n缞縗\n缟縞\n缠纏\n缡縭\n缢縊\n缣縑\n缤繽\n缥縹\n缦縵\n缧縲\n缨纓\n缩縮\n缪繆\n缫繅\n缬纈\n缭繚\n缮繕\n缯繒\n缰繮\n缱繾\n缲繰\n缳繯\n缴繳\n缵纘\n罂罌\n网網\n罗羅\n罚罰\n罢罷\n罴羆\n羁羈\n羟羥\n羡羨\n群羣\n翘翹\n翙翽\n翚翬\n耢耮\n耧耬\n耸聳\n耻恥\n聂聶\n聋聾\n职職\n聍聹\n联聯\n聩聵\n聪聰\n肃肅\n肠腸\n肤膚\n肮骯\n肴餚\n肾腎\n肿腫\n胀脹\n胁脅\n胄胄\n胆膽\n背背\n胜勝\n胡胡\n胧朧\n胨腖\n胪臚\n胫脛\n胶膠\n脉脈\n脍膾\n脏髒\n脐臍\n脑腦\n脓膿\n脔臠\n脚腳\n脱脫\n脶腡\n脸臉\n腊臘\n腌醃\n腘膕\n腭齶\n腻膩\n腼靦\n腽膃\n腾騰\n膑臏\n膻羶\n臜臢\n致致\n舆輿\n舍舍\n舣艤\n舰艦\n舱艙\n舻艫\n艰艱\n艳豔\n艺藝\n节節\n芈羋\n芗薌\n芜蕪\n芦蘆\n芸芸\n苁蓯\n苇葦\n苈藶\n苋莧\n苌萇\n苍蒼\n苎苧\n苏蘇\n苔苔\n苧薴\n苹蘋\n范範\n茎莖\n茏蘢\n茑蔦\n茔塋\n茕煢\n茧繭\n荆荊\n荐薦\n荙薘\n荚莢\n荛蕘\n荜蓽\n荝萴\n荞蕎\n荟薈\n荠薺\n荡蕩\n荣榮\n荤葷\n荥滎\n荦犖\n荧熒\n荨蕁\n荩藎\n荪蓀\n荫蔭\n荬蕒\n荭葒\n荮葤\n药藥\n莅蒞\n莱萊\n莲蓮\n莳蒔\n莴萵\n莶薟\n获獲\n莸蕕\n莹瑩\n莺鶯\n莼蓴\n萚蘀\n萝蘿\n萤螢\n营營\n萦縈\n萧蕭\n萨薩\n葱蔥\n蒀蒕\n蒇蕆\n蒉蕢\n蒋蔣\n蒌蔞\n蒏醟\n蒙蒙\n蓝藍\n蓟薊\n蓠蘺\n蓣蕷\n蓥鎣\n蓦驀\n蔂虆\n蔑蔑\n蔷薔\n蔹蘞\n蔺藺\n蔼藹\n蕰薀\n蕲蘄\n蕴蘊\n薮藪\n藓蘚\n藴蘊\n蘖櫱\n虏虜\n虑慮\n虚虛\n虫蟲\n虬虯\n虮蟣\n虱蝨\n虽雖\n虾蝦\n虿蠆\n蚀蝕\n蚁蟻\n蚂螞\n蚃蠁\n蚕蠶\n蚝蠔\n蚬蜆\n蛊蠱\n蛎蠣\n蛏蟶\n蛮蠻\n蛰蟄\n蛱蛺\n蛲蟯\n蛳螄\n蛴蠐\n蜕蛻\n蜗蝸\n蜡蠟\n蝇蠅\n蝈蟈\n蝉蟬\n蝎蠍\n蝼螻\n蝾蠑\n螀螿\n螨蟎\n蟏蠨\n衅釁\n衔銜\n补補\n表表\n衬襯\n衮袞\n袄襖\n袅嫋\n袆褘\n袜襪\n袭襲\n袯襏\n装裝\n裆襠\n裈褌\n裢褳\n裣襝\n裤褲\n裥襉\n褛褸\n褴襤\n襕襴\n见見\n观觀\n觃覎\n规規\n觅覓\n视視\n觇覘\n览覽\n觉覺\n觊覬\n觋覡\n觌覿\n觍覥\n觎覦\n觏覯\n觐覲\n觑覷\n觞觴\n触觸\n觯觶\n訚誾\n詟讋\n誉譽\n誊謄\n讠訁\n计計\n订訂\n讣訃\n认認\n讥譏\n讦訐\n讧訌\n讨討\n让讓\n讪訕\n讫訖\n讬託\n训訓\n议議\n讯訊\n记記\n讱訒\n讲講\n讳諱\n讴謳\n讵詎\n讶訝\n讷訥\n许許\n讹訛\n论論\n讻訩\n讼訟\n讽諷\n设設\n访訪\n诀訣\n证證\n诂詁\n诃訶\n评評\n诅詛\n识識\n诇詗\n诈詐\n诉訴\n诊診\n诋詆\n诌謅\n词詞\n诎詘\n诏詔\n诐詖\n译譯\n诒詒\n诓誆\n诔誄\n试試\n诖詿\n诗詩\n诘詰\n诙詼\n诚誠\n诛誅\n诜詵\n话話\n诞誕\n诟詬\n诠詮\n诡詭\n询詢\n诣詣\n诤諍\n该該\n详詳\n诧詫\n诨諢\n诩詡\n诪譸\n诫誡\n诬誣\n语語\n诮誚\n误誤\n诰誥\n诱誘\n诲誨\n诳誑\n说說\n诵誦\n诶誒\n请請\n诸諸\n诹諏\n诺諾\n读讀\n诼諑\n诽誹\n课課\n诿諉\n谀諛\n谁誰\n谂諗\n调調\n谄諂\n谅諒\n谆諄\n谇誶\n谈談\n谉讅\n谊誼\n谋謀\n谌諶\n谍諜\n谎謊\n谏諫\n谐諧\n谑謔\n谒謁\n谓謂\n谔諤\n谕諭\n谖諼\n谗讒\n谘諮\n谙諳\n谚諺\n谛諦\n谜謎\n谝諞\n谞諝\n谟謨\n谠讜\n谡謖\n谢謝\n谣謠\n谤謗\n谥諡\n谦謙\n谧謐\n谨謹\n谩謾\n谪謫\n谫譾\n谬謬\n谭譚\n谮譖\n谯譙\n谰讕\n谱譜\n谲譎\n谳讞\n谴譴\n谵譫\n谶讖\n谷谷\n豮豶\n贝貝\n贞貞\n负負\n贠貟\n贡貢\n财財\n责責\n贤賢\n败敗\n账賬\n货貨\n质質\n贩販\n贪貪\n贫貧\n贬貶\n购購\n贮貯\n贯貫\n贰貳\n贱賤\n贲賁\n贳貰\n贴貼\n贵貴\n贶貺\n贷貸\n贸貿\n费費\n贺賀\n贻貽\n贼賊\n贽贄\n贾賈\n贿賄\n赀貲\n赁賃\n赂賂\n赃贓\n资資\n赅賅\n赆贐\n赇賕\n赈賑\n赉賚\n赊賒\n赋賦\n赌賭\n赍齎\n赎贖\n赏賞\n赐賜\n赑贔\n赒賙\n赓賡\n赔賠\n赕賧\n赖賴\n赗賵\n赘贅\n赙賻\n赚賺\n赛賽\n赜賾\n赝贗\n赞贊\n赟贇\n赠贈\n赡贍\n赢贏\n赣贛\n赪赬\n赵趙\n赶趕\n趋趨\n趱趲\n趸躉\n跃躍\n跄蹌\n跖蹠\n跞躒\n践踐\n跶躂\n跷蹺\n跸蹕\n跹躚\n跻躋\n踌躊\n踪蹤\n踬躓\n踯躑\n蹑躡\n蹒蹣\n蹰躕\n蹿躥\n躏躪\n躜躦\n躯軀\n輼轀\n车車\n轧軋\n轨軌\n轩軒\n轪軑\n轫軔\n转轉\n轭軛\n轮輪\n软軟\n轰轟\n轱軲\n轲軻\n轳轤\n轴軸\n轵軹\n轶軼\n轷軤\n轸軫\n轹轢\n轺軺\n轻輕\n轼軾\n载載\n轾輊\n轿轎\n辀輈\n辁輇\n辂輅\n较較\n辄輒\n辅輔\n辆輛\n辇輦\n辈輩\n辉輝\n辊輥\n辋輞\n辌輬\n辍輟\n辎輜\n辏輳\n辐輻\n辑輯\n辒轀\n输輸\n辔轡\n辕轅\n辖轄\n辗輾\n辘轆\n辙轍\n辚轔\n辞辭\n辟闢\n辩辯\n辫辮\n边邊\n辽遼\n达達\n迁遷\n过過\n迈邁\n运運\n还還\n这這\n进進\n远遠\n违違\n连連\n迟遲\n迩邇\n迳逕\n迹跡\n适適\n选選\n逊遜\n递遞\n逦邐\n逻邏\n遗遺\n遥遙\n邓鄧\n邝鄺\n邬鄔\n邮郵\n邹鄒\n邺鄴\n邻鄰\n郁鬱\n郏郟\n郐鄶\n郑鄭\n郓鄆\n郦酈\n郧鄖\n郸鄲\n酂酇\n酝醞\n酦醱\n酱醬\n酸酸\n酽釅\n酾釃\n酿釀\n醖醞\n采採\n释釋\n里裏\n鉴鑑\n銮鑾\n錾鏨\n钅釒\n钆釓\n钇釔\n针針\n钉釘\n钊釗\n钋釙\n钌釕\n钍釷\n钎釺\n钏釧\n钐釤\n钑鈒\n钒釩\n钓釣\n钔鍆\n钕釹\n钖鍚\n钗釵\n钘鈃\n钙鈣\n钚鈈\n钛鈦\n钜鉅\n钝鈍\n钞鈔\n钟鍾\n钠鈉\n钡鋇\n钢鋼\n钣鈑\n钤鈐\n钥鑰\n钦欽\n钧鈞\n钨鎢\n钩鉤\n钪鈧\n钫鈁\n钬鈥\n钭鈄\n钮鈕\n钯鈀\n钰鈺\n钱錢\n钲鉦\n钳鉗\n钴鈷\n钵鉢\n钶鈳\n钷鉕\n钸鈽\n钹鈸\n钺鉞\n钻鑽\n钼鉬\n钽鉭\n钾鉀\n钿鈿\n铀鈾\n铁鐵\n铂鉑\n铃鈴\n铄鑠\n铅鉛\n铆鉚\n铇鉋\n铈鈰\n铉鉉\n铊鉈\n铋鉍\n铌鈮\n铍鈹\n铎鐸\n铏鉶\n铐銬\n铑銠\n铒鉺\n铓鋩\n铔錏\n铕銪\n铖鋮\n铗鋏\n铘鋣\n铙鐃\n铚銍\n铛鐺\n铜銅\n铝鋁\n铞銱\n铟銦\n铠鎧\n铡鍘\n铢銖\n铣銑\n铤鋌\n铥銩\n铦銛\n铧鏵\n铨銓\n铩鎩\n铪鉿\n铫銚\n铬鉻\n铭銘\n铮錚\n铯銫\n铰鉸\n铱銥\n铲鏟\n铳銃\n铴鐋\n铵銨\n银銀\n铷銣\n铸鑄\n铹鐒\n铺鋪\n铻鋙\n铼錸\n铽鋱\n链鏈\n铿鏗\n销銷\n锁鎖\n锂鋰\n锃鋥\n锄鋤\n锅鍋\n锆鋯\n锇鋨\n锈鏽\n锉銼\n锊鋝\n锋鋒\n锌鋅\n锍鋶\n锎鐦\n锏鐧\n锐銳\n锑銻\n锒鋃\n锓鋟\n锔鋦\n锕錒\n锖錆\n锗鍺\n锘鍩\n错錯\n锚錨\n锛錛\n锜錡\n锝鍀\n锞錁\n锟錕\n锠錩\n锡錫\n锢錮\n锣鑼\n锤錘\n锥錐\n锦錦\n锧鑕\n锨鍁\n锩錈\n锪鍃\n锫錇\n锬錟\n锭錠\n键鍵\n锯鋸\n锰錳\n锱錙\n锲鍥\n锳鍈\n锴鍇\n锵鏘\n锶鍶\n锷鍔\n锸鍤\n锹鍬\n锺鍾\n锻鍛\n锼鎪\n锽鍠\n锾鍰\n锿鎄\n镀鍍\n镁鎂\n镂鏤\n镃鎡\n镄鐨\n镅鎇\n镆鏌\n镇鎮\n镈鎛\n镉鎘\n镊鑷\n镋钂\n镌鐫\n镍鎳\n镎鎿\n镏鎦\n镐鎬\n镑鎊\n镒鎰\n镓鎵\n镔鑌\n镕鎔\n镖鏢\n镗鏜\n镘鏝\n镙鏍\n镚鏰\n镛鏞\n镜鏡\n镝鏑\n镞鏃\n镟鏇\n镠鏐\n镡鐔\n镢钁\n镣鐐\n镤鏷\n镥鑥\n镦鐓\n镧鑭\n镨鐠\n镩鑹\n镪鏹\n镫鐙\n镬鑊\n镭鐳\n镮鐶\n镯鐲\n镰鐮\n镱鐿\n镲鑔\n镳鑣\n镴鑞\n镵鑱\n镶鑲\n长長\n门門\n闩閂\n闪閃\n闫閆\n闬閈\n闭閉\n问問\n闯闖\n闰閏\n闱闈\n闲閒\n闳閎\n间間\n闵閔\n闶閌\n闷悶\n闸閘\n闹鬧\n闺閨\n闻聞\n闼闥\n闽閩\n闾閭\n闿闓\n阀閥\n阁閣\n阂閡\n阃閫\n阄鬮\n阅閱\n阆閬\n阇闍\n阈閾\n阉閹\n阊閶\n阋鬩\n阌閿\n阍閽\n阎閻\n阏閼\n阐闡\n阑闌\n阒闃\n阓闠\n阔闊\n阕闋\n阖闔\n阗闐\n阘闒\n阙闕\n阚闞\n阛闤\n队隊\n阳陽\n阴陰\n阵陣\n阶階\n际際\n陆陸\n陇隴\n陈陳\n陉陘\n陕陝\n陦隯\n陧隉\n陨隕\n险險\n随隨\n隐隱\n隶隸\n隽雋\n难難\n雇僱\n雏雛\n雕雕\n雠讎\n雳靂\n雾霧\n霁霽\n霉黴\n霡霢\n霭靄\n靓靚\n靔靝\n静靜\n面面\n靥靨\n鞑韃\n鞒鞽\n鞯韉\n鞲韝\n韦韋\n韧韌\n韨韍\n韩韓\n韪韙\n韫韞\n韬韜\n韵韻\n页頁\n顶頂\n顷頃\n顸頇\n项項\n顺順\n须須\n顼頊\n顽頑\n顾顧\n顿頓\n颀頎\n颁頒\n颂頌\n颃頏\n预預\n颅顱\n领領\n颇頗\n颈頸\n颉頡\n颊頰\n颋頲\n颌頜\n颍潁\n颎熲\n颏頦\n颐頤\n频頻\n颒頮\n颓頹\n颔頷\n颕頴\n颖穎\n颗顆\n题題\n颙顒\n颚顎\n颛顓\n颜顏\n额額\n颞顳\n颟顢\n颠顛\n颡顙\n颢顥\n颣纇\n颤顫\n颥顬\n颦顰\n颧顴\n风風\n飏颺\n飐颭\n飑颮\n飒颯\n飓颶\n飔颸\n飕颼\n飖颻\n飗飀\n飘飄\n飙飆\n飚飈\n飞飛\n飨饗\n餍饜\n饣飠\n饤飣\n饥飢\n饦飥\n饧餳\n饨飩\n饩餼\n饪飪\n饫飫\n饬飭\n饭飯\n饮飲\n饯餞\n饰飾\n饱飽\n饲飼\n饳飿\n饴飴\n饵餌\n饶饒\n饷餉\n饸餄\n饹餎\n饺餃\n饻餏\n饼餅\n饽餑\n饾餖\n饿餓\n馀餘\n馁餒\n馂餕\n馃餜\n馄餛\n馅餡\n馆館\n馇餷\n馈饋\n馉餶\n馊餿\n馋饞\n馌饁\n馍饃\n馎餺\n馏餾\n馐饈\n馑饉\n馒饅\n馓饊\n馔饌\n馕饢\n马馬\n驭馭\n驮馱\n驯馴\n驰馳\n驱驅\n驲馹\n驳駁\n驴驢\n驵駔\n驶駛\n驷駟\n驸駙\n驹駒\n驺騶\n驻駐\n驼駝\n驽駑\n驾駕\n驿驛\n骀駘\n骁驍\n骂罵\n骃駰\n骄驕\n骅驊\n骆駱\n骇駭\n骈駢\n骉驫\n骊驪\n骋騁\n验驗\n骍騂\n骎駸\n骏駿\n骐騏\n骑騎\n骒騍\n骓騅\n骔騌\n骕驌\n骖驂\n骗騙\n骘騭\n骙騤\n骚騷\n骛騖\n骜驁\n骝騮\n骞騫\n骟騸\n骠驃\n骡騾\n骢驄\n骣驏\n骤驟\n骥驥\n骦驦\n骧驤\n髅髏\n髋髖\n髌髕\n鬓鬢\n鬶鬹\n魇魘\n魉魎\n鱼魚\n鱽魛\n鱾魢\n鱿魷\n鲀魨\n鲁魯\n鲂魴\n鲃䰾\n鲄魺\n鲅鮁\n鲆鮃\n鲇鮎\n鲈鱸\n鲉鮋\n鲊鮓\n鲋鮒\n鲌鮊\n鲍鮑\n鲎鱟\n鲏鮍\n鲐鮐\n鲑鮭\n鲒鮚\n鲓鮳\n鲔鮪\n鲕鮞\n鲖鮦\n鲗鰂\n鲘鮜\n鲙鱠\n鲚鱭\n鲛鮫\n鲜鮮\n鲝鮺\n鲞鯗\n鲟鱘\n鲠鯁\n鲡鱺\n鲢鰱\n鲣鰹\n鲤鯉\n鲥鰣\n鲦鰷\n鲧鯀\n鲨鯊\n鲩鯇\n鲪鮶\n鲫鯽\n鲬鯒\n鲭鯖\n鲮鯪\n鲯鯕\n鲰鯫\n鲱鯡\n鲲鯤\n鲳鯧\n鲴鯝\n鲵鯢\n鲶鯰\n鲷鯛\n鲸鯨\n鲹鰺\n鲺鯴\n鲻鯔\n鲼鱝\n鲽鰈\n鲾鰏\n鲿鱨\n鳀鯷\n鳁鰮\n鳂鰃\n鳃鰓\n鳄鱷\n鳅鰍\n鳆鰒\n鳇鰉\n鳈鰁\n鳉鱂\n鳊鯿\n鳋鰠\n鳌鰲\n鳍鰭\n鳎鰨\n鳏鰥\n鳐鰩\n鳑鰟\n鳒鰜\n鳓鰳\n鳔鰾\n鳕鱈\n鳖鱉\n鳗鰻\n鳘鰵\n鳙鱅\n鳚䲁\n鳛鰼\n鳜鱖\n鳝鱔\n鳞鱗\n鳟鱒\n鳠鱯\n鳡鱤\n鳢鱧\n鳣鱣\n鳤䲘\n鸟鳥\n鸠鳩\n鸡雞\n鸢鳶\n鸣鳴\n鸤鳲\n鸥鷗\n鸦鴉\n鸧鶬\n鸨鴇\n鸩鴆\n鸪鴣\n鸫鶇\n鸬鸕\n鸭鴨\n鸮鴞\n鸯鴦\n鸰鴒\n鸱鴟\n鸲鴝\n鸳鴛\n鸴鷽\n鸵鴕\n鸶鷥\n鸷鷙\n鸸鴯\n鸹鴰\n鸺鵂\n鸻鴴\n鸼鵃\n鸽鴿\n鸾鸞\n鸿鴻\n鹀鵐\n鹁鵓\n鹂鸝\n鹃鵑\n鹄鵠\n鹅鵝\n鹆鵒\n鹇鷳\n鹈鵜\n鹉鵡\n鹊鵲\n鹋鶓\n鹌鵪\n鹍鵾\n鹎鵯\n鹏鵬\n鹐鵮\n鹑鶉\n鹒鶊\n鹓鵷\n鹔鷫\n鹕鶘\n鹖鶡\n鹗鶚\n鹘鶻\n鹙鶖\n鹚鷀\n鹛鶥\n鹜鶩\n鹝鷊\n鹞鷂\n鹟鶲\n鹠鶹\n鹡鶺\n鹢鷁\n鹣鶼\n鹤鶴\n鹥鷖\n鹦鸚\n鹧鷓\n鹨鷚\n鹩鷯\n鹪鷦\n鹫鷲\n鹬鷸\n鹭鷺\n鹮䴉\n鹯鸇\n鹰鷹\n鹱鸌\n鹲鸏\n鹳鸛\n鹴鸘\n鹾鹺\n麦麥\n麸麩\n麹麴\n麺麪\n麽麼\n黄黃\n黉黌\n黡黶\n黩黷\n黪黲\n黾黽\n鼋黿\n鼌鼂\n鼍鼉\n鼹鼴\n齐齊\n齑齏\n齿齒\n龀齔\n龁齕\n龂齗\n龃齟\n龄齡\n龅齙\n龆齠\n龇齜\n龈齦\n龉齬\n龊齪\n龋齲\n龌齷\n龙龍\n龚龔\n龛龕\n龟龜\n鿎䃮\n鿏䥑\n鿒鿓\n鿔鎶\n𠀾𠁞\n𠆲儣\n𠆿𠌥\n𠇹俓\n𠉂㒓\n𠉗𠏢\n𠋆儭\n𠚳𠠎\n𠛅剾\n𠛆𠞆\n𠛾𪟖\n𠡠勑\n𠮶嗰\n𠯟哯\n𠯠噅\n𠰱㘉\n𠰷嚧\n𠱞囃\n𠲥𡅏\n𠴛𡃕\n𠴢𡄔\n𠵸𡄣\n𠵾㗲\n𡋀𡓾\n𡋗𡑭\n𡋤壗\n𡍣𡔖\n𡒄壈\n𡝠㜷\n𡞋㜗\n𡞱㜢\n𡠟孎\n𡥧孻\n𡭜𡮉\n𡭬𡮣\n𡳃𡳳\n𡳒𦘧\n𡶴嵼\n𡸃𡽗\n𡺃嶈\n𡺄嶘\n𢋈㢝\n𢗓㦛\n𢘙𢤱\n𢘝𢣚\n𢘞𢣭\n𢙏愻\n𢙐憹\n𢙑𢠼\n𢙒憢\n𢙓懀\n𢛯㦎\n𢠁懎\n𢢐𤢻\n𢧐戰\n𢫊𢷮\n𢫞𢶫\n𢫬摋\n𢬍擫\n𢬦𢹿\n𢭏擣\n𢽾斅\n𣃁斸\n𣆐曥\n𣈣𣋋\n𣍨𦢈\n𣍯腪\n𣍰脥\n𣎑臗\n𣏢槫\n𣐕桱\n𣐤欍\n𣑶𣠲\n𣒌楇\n𣓿橯\n𣔌樤\n𣗊樠\n𣗋欓\n𣗙㰙\n𣘐㯤\n𣘓𣞻\n𣘴檭\n𣘷𣝕\n𣚚欘\n𣞎𣠩\n𣨼殢\n𣭤𣯴\n𣯣𣯩\n𣱝氭\n𣲗湋\n𣲘潕\n𣳆㵗\n𣶩澅\n𣶫𣿉\n𣶭𪷓\n𣷷𤅶\n𣸣濆\n𣺼灙\n𣺽𤁣\n𣽷瀃\n𤆡熓\n𤆢㷍\n𤇃爄\n𤇄熌\n𤇭爖\n𤇹熚\n𤈶熉\n𤈷㷿\n𤊀𤒎\n𤊰𤓩\n𤋏熡\n𤎺𤓎\n𤎻𤑳\n𤙯𤛮\n𤝢𤢟\n𤞃獩\n𤞤玁\n𤠋㺏\n𤦀瓕\n𤩽瓛\n𤳄𤳸\n𤶊癐\n𤶧𤸫\n𤻊㿗\n𤽯㿧\n𤾀皟\n𤿲麬\n𥁢䀉\n𥅘𥌃\n𥅴䀹\n𥅿𥊝\n𥆧瞤\n𥇢䁪\n𥎝䂎\n𥐟礒\n𥐯𥖅\n𥐰𥕥\n𥐻碙\n𥞦𥞵\n𥧂𥨐\n𥩟竚\n𥩺𥪂\n𥫣籅\n𥬀䉙\n𥬞籋\n𥬠篘\n𥭉𥵊\n𥮋𥸠\n𥮜䉲\n𥮾篸\n𥱔𥵃\n𥹥𥼽\n𥺅䊭\n𥺇𥽖\n𦈈𥿊\n𦈉緷\n𦈋綇\n𦈌綀\n𦈎繟\n𦈏緍\n𦈐縺\n𦈑緸\n𦈒𦂅\n𦈓䋿\n𦈔縎\n𦈕緰\n𦈖䌈\n𦈗𦃄\n𦈘䌋\n𦈙䌰\n𦈚縬\n𦈛繓\n𦈜䌖\n𦈝繏\n𦈞䌟\n𦈟䌝\n𦈠䌥\n𦈡繻\n𦍠䍽\n𦛨朥\n𦝼膢\n𦟗𦣎\n𦨩𦪽\n𦰏蓧\n𦰴䕳\n𦶟爇\n𦶻𦾟\n𦻕蘟\n𧉐𧕟\n𧉞䗿\n𧌥𧎈\n𧏖蠙\n𧏗蠀\n𧑏蠾\n𧒭𧔥\n𧜭䙱\n𧝝襰\n𧝧𧟀\n𧮪詀\n𧳕𧳟\n𧹑䞈\n𧹒買\n𧹓𧶔\n𧹔賬\n𧹕䝻\n𧹖賟\n𧹗贃\n𧿈𨇁\n𨀁躘\n𨀱𨄣\n𨁴𨅍\n𨂺𨈊\n𨄄𨈌\n𨅛䠱\n𨅫𨇞\n𨅬躝\n𨉗軉\n𨐅軗\n𨐆𨊻\n𨐇𨏠\n𨐈輄\n𨐉𨎮\n𨐊𨏥\n𨑹䢨\n𨟳𨣞\n𨠨𨣧\n𨡙𨢿\n𨡺𨣈\n𨤰𨤻\n𨰾鎷\n𨰿釳\n𨱀𨥛\n𨱁鈠\n𨱂鈋\n𨱃鈲\n𨱄鈯\n𨱅鉁\n𨱆龯\n𨱇銶\n𨱈鋉\n𨱉鍄\n𨱊𨧱\n𨱋錂\n𨱌鏆\n𨱍鎯\n𨱎鍮\n𨱏鎝\n𨱐𨫒\n𨱑鐄\n𨱒鏉\n𨱓鐎\n𨱔鐏\n𨱕𨮂\n𨱖䥩\n𨷿䦳\n𨸀𨳕\n𨸁𨳑\n𨸂閍\n𨸃閐\n𨸄䦘\n𨸅𨴗\n𨸆𨵩\n𨸇𨵸\n𨸉𨶀\n𨸊𨶏\n𨸋𨶲\n𨸌𨶮\n𨸎𨷲\n𨸘𨽏\n𨸟䧢\n𩏼䪏\n𩏽𩏪\n𩏾𩎢\n𩏿䪘\n𩐀䪗\n𩓋顂\n𩖕𩓣\n𩖖顃\n𩖗䫴\n𩙥颰\n𩙦𩗀\n𩙧䬞\n𩙨𩘹\n𩙩𩘀\n𩙪颷\n𩙫颾\n𩙬𩘺\n𩙭𩘝\n𩙮䬘\n𩙯䬝\n𩙰𩙈\n𩟿𩚛\n𩠀𩚥\n𩠁𩚵\n𩠂𩛆\n𩠃𩛩\n𩠅𩟐\n𩠆𩜦\n𩠇䭀\n𩠈䭃\n𩠉𩜇\n𩠊𩜵\n𩠋𩝔\n𩠌餸\n𩠎𩞄\n𩠏𩞦\n𩠠𩠴\n𩡖𩡣\n𩧦𩡺\n𩧨駎\n𩧩𩤊\n𩧪䮾\n𩧫駚\n𩧬𩢡\n𩧭䭿\n𩧮𩢾\n𩧯驋\n𩧰䮝\n𩧱𩥉\n𩧲駧\n𩧳𩢸\n𩧴駩\n𩧵𩢴\n𩧶𩣏\n𩧸𩣫\n𩧺駶\n𩧻𩣵\n𩧼𩣺\n𩧿䮠\n𩨀騔\n𩨁䮞\n𩨂驄\n𩨃騝\n𩨄騪\n𩨅𩤸\n𩨆𩤙\n𩨇䮫\n𩨈騟\n𩨉𩤲\n𩨊騚\n𩨋𩥄\n𩨌𩥑\n𩨍𩥇\n𩨎龭\n𩨏䮳\n𩨐𩧆\n𩩈䯤\n𩬣𩭙\n𩬤𩰀\n𩭹鬖\n𩯒𩯳\n𩰰𩰹\n𩲒𩳤\n𩴌𩴵\n𩽹魥\n𩽺𩵩\n𩽻𩵹\n𩽼鯶\n𩽽𩶱\n𩽾鮟\n𩽿𩶰\n𩾁鯄\n𩾂䲖\n𩾃鮸\n𩾄𩷰\n𩾅𩸃\n𩾆𩸦\n𩾇鯱\n𩾈䱙\n𩾊䱬\n𩾋䱰\n𩾌鱇\n𩾎𩽇\n𪉂䲰\n𪉃鳼\n𪉄𩿪\n𪉅𪀦\n𪉆鴲\n𪉈鴜\n𪉉𪁈\n𪉊鷨\n𪉋𪀾\n𪉌𪁖\n𪉍鵚\n𪉎𪂆\n𪉏𪃏\n𪉐𪃍\n𪉑鷔\n𪉒𪄕\n𪉔𪄆\n𪉕𪇳\n𪎈䴬\n𪎉麲\n𪎊麨\n𪎋䴴\n𪎌麳\n𪑅䵳\n𪔭𪔵\n𪚏𪘀\n𪚐𪘯\n𪜎𠿕\n𪞝凙\n𪟎㔋\n𪟝勣\n𪠀𧷎\n𪠟㓄\n𪠡𠬙\n𪠳唓\n𪠵㖮\n𪠸嚛\n𪠺𠽃\n𪠽噹\n𪡀嘺\n𪡃嘪\n𪡋噞\n𪡏嗹\n𪡛㗿\n𪡞嘳\n𪡺𡃄\n𪢌㘓\n𪢐𡃤\n𪢒𡂡\n𪢕嚽\n𪢖𡅯\n𪢠囒\n𪢮圞\n𪢸墲\n𪣆埬\n𪣒堚\n𪣻塿\n𪤄𡓁\n𪤚壣\n𪥠𧹈\n𪥫孇\n𪥰嬣\n𪥿嬻\n𪧀孾\n𪧘寠\n𪨊㞞\n𪨗屩\n𪨧崙\n𪨩𡸗\n𪨶輋\n𪨷巗\n𪨹𡹬\n𪩇㟺\n𪩎巊\n𪩘巘\n𪩛𡿖\n𪩷幝\n𪩸幩\n𪪏廬\n𪪑㢗\n𪪞廧\n𪪴𢍰\n𪪼彃\n𪫌徿\n𪫡𢤩\n𪫷㦞\n𪫺憸\n𪬚𢣐\n𪬯𢤿\n𪭝𢯷\n𪭢摐\n𪭧擟\n𪭯𢶒\n𪭵掚\n𪭾撊\n𪮃㨻\n𪮋㩋\n𪮖撧\n𪮳𢺳\n𪮶攋\n𪯋㪎\n𪰶曊\n𪱥膹\n𪱷梖\n𪲎櫅\n𪲔欐\n𪲛檵\n𪲮櫠\n𪳍欇\n𪳗𣜬\n𪴙欑\n𪵑毊\n𪵣霼\n𪵱濿\n𪶄溡\n𪶒𤄷\n𪶮𣽏\n𪷍㵾\n𪷽灒\n𪸕熂\n𪸩煇\n𪹀𤑹\n𪹠𤓌\n𪹳爥\n𪹹𤒻\n𪺣𤘀\n𪺪𤜆\n𪺭犞\n𪺷獊\n𪺸𤠮\n𪺻㺜\n𪺽猌\n𪻐瑽\n𪻨瓄\n𪻲瑻\n𪻺璝\n𪼋㻶\n𪼴𤬅\n𪽈畼\n𪽝𤳷\n𪽪痮\n𪽭𤷃\n𪽮㿖\n𪽴𤺔\n𪽷瘱\n𪾔盨\n𪾢睍\n𪾣眝\n𪾦矑\n𪾸矉\n𪿊𥏝\n𪿞𥖲\n𪿫礮\n𪿵𥗇\n𫀌𥜰\n𫀓𥜐\n𫀨䅐\n𫀬䅳\n𫀮𥢷\n𫁂䆉\n𫁟竱\n𫁡鴗\n𫁱𥶽\n𫁲䉑\n𫁳𥯤\n𫁷䉶\n𫁺𥴼\n𫂃簢\n𫂆簂\n𫂈䉬\n𫂖𥴨\n𫂿𥻦\n𫃗𩏷\n𫄙糺\n𫄚䊺\n𫄛紟\n𫄜䋃\n𫄝𥾯\n𫄞䋔\n𫄟絁\n𫄠絙\n𫄡絧\n𫄢絥\n𫄣繷\n𫄤繨\n𫄥纚\n𫄦𦀖\n𫄧綖\n𫄨絺\n𫄩䋦\n𫄪𦅇\n𫄫綟\n𫄬緤\n𫄭緮\n𫄮䋼\n𫄯𦃩\n𫄰縍\n𫄱繬\n𫄲縸\n𫄳縰\n𫄴繂\n𫄵𦅈\n𫄶繈\n𫄷繶\n𫄸纁\n𫄹纗\n𫅅䍤\n𫅗羵\n𫅥𦒀\n𫅭䎙\n𫅼𦔖\n𫆏聻\n𫆝𦟼\n𫆫𦡝\n𫇘𦧺\n𫇛艣\n𫇪𦱌\n𫇭蔿\n𫇴蒭\n𫇽蕽\n𫈉蕳\n𫈎葝\n𫈟蔯\n𫈵蕝\n𫉁薆\n𫉄藷\n𫊪䗅\n𫊮蠦\n𫊸蟜\n𫊹𧒯\n𫊻蟳\n𫋇蟂\n𫋌蟘\n𫋲䙔\n𫋷襗\n𫋹襓\n𫋻襘\n𫌀襀\n𫌇襵\n𫌋𧞫\n𫌨覼\n𫌪覛\n𫌫𧡴\n𫌬𧢄\n𫌭覹\n𫌯䚩\n𫍐𧭹\n𫍙訑\n𫍚訞\n𫍛訜\n𫍜詓\n𫍝諫\n𫍞𧦝\n𫍟𧦧\n𫍠䛄\n𫍡詑\n𫍢譊\n𫍣詷\n𫍤譑\n𫍥誂\n𫍦譨\n𫍧誺\n𫍨誫\n𫍩諣\n𫍪誋\n𫍫䛳\n𫍬誷\n𫍭𧩕\n𫍮誳\n𫍯諴\n𫍰諰\n𫍱諯\n𫍲謏\n𫍳諥\n𫍴謱\n𫍵謸\n𫍶𧩼\n𫍷謉\n𫍸謆\n𫍹謯\n𫍺𧫝\n𫍻譆\n𫍼𧬤\n𫍽譞\n𫍾𧭈\n𫍿譾\n𫎆豵\n𫎌貗\n𫎦贚\n𫎧䝭\n𫎨𧸘\n𫎩賝\n𫎪䞋\n𫎫贉\n𫎬贑\n𫎭䞓\n𫎱䟐\n𫎳䟆\n𫎸𧽯\n𫎺䟃\n𫏃䠆\n𫏆蹳\n𫏋蹻\n𫏌𨂐\n𫏐蹔\n𫏑𨇽\n𫏕𨆪\n𫏞𨇰\n𫏨𨇤\n𫐄軏\n𫐅軕\n𫐆轣\n𫐇軜\n𫐈軷\n𫐉軨\n𫐊軬\n𫐋𨎌\n𫐌軿\n𫐍𨌈\n𫐎輢\n𫐏輖\n𫐐輗\n𫐑輨\n𫐒輷\n𫐓輮\n𫐔𨍰\n𫐕轊\n𫐖轇\n𫐗轐\n𫐘轗\n𫐙轠\n𫐷遱\n𫑘鄟\n𫑡鄳\n𫑷醶\n𫓥釟\n𫓦釨\n𫓧鈇\n𫓨鈛\n𫓩鏦\n𫓪鈆\n𫓫𨥟\n𫓬鉔\n𫓭鉠\n𫓮𨪕\n𫓯銈\n𫓰銊\n𫓱鐈\n𫓲銁\n𫓳𨰋\n𫓴鉾\n𫓵鋠\n𫓶鋗\n𫓷𫒡\n𫓸錽\n𫓹錤\n𫓺鐪\n𫓻錜\n𫓼𨨛\n𫓽錝\n𫓾錥\n𫓿𨨢\n𫔀鍊\n𫔁鐼\n𫔂鍉\n𫔃𨰲\n𫔄鍒\n𫔅鎍\n𫔆䥯\n𫔇鎞\n𫔈鎙\n𫔉𨰃\n𫔊鏥\n𫔋䥗\n𫔌鏾\n𫔍鐇\n𫔎鐍\n𫔏𨬖\n𫔐𨭸\n𫔑𨭖\n𫔒𨮳\n𫔓𨯟\n𫔔鑴\n𫔕𨰥\n𫔖𨲳\n𫔭開\n𫔮閒\n𫔯閗\n𫔰閞\n𫔲𨴹\n𫔴閵\n𫔵䦯\n𫔶闑\n𫔽𨼳\n𫕚𩀨\n𫕥霣\n𫕨𩅙\n𫖃靧\n𫖅䪊\n𫖇鞾\n𫖑𩎖\n𫖒韠\n𫖓𩏂\n𫖔韛\n𫖕韝\n𫖖𩏠\n𫖪𩑔\n𫖫䪴\n𫖬䪾\n𫖭𩒎\n𫖮顗\n𫖯頫\n𫖰䫂\n𫖱䫀\n𫖲䫟\n𫖳頵\n𫖴𩔳\n𫖵𩓥\n𫖶顅\n𫖷𩔑\n𫖸願\n𫖹顣\n𫖺䫶\n𫗇䫻\n𫗈𩗓\n𫗉𩗴\n𫗊䬓\n𫗋飋\n𫗚𩟗\n𫗞飦\n𫗟䬧\n𫗠餦\n𫗡𩚩\n𫗢飵\n𫗣飶\n𫗤𩛌\n𫗥餫\n𫗦餔\n𫗧餗\n𫗨𩛡\n𫗩饠\n𫗪餧\n𫗫餬\n𫗬餪\n𫗭餵\n𫗮餭\n𫗯餱\n𫗰䭔\n𫗱䭑\n𫗳𩝽\n𫗴饘\n𫗵饟\n𫘛馯\n𫘜馼\n𫘝駃\n𫘞駞\n𫘟駊\n𫘠駤\n𫘡駫\n𫘣駻\n𫘤騃\n𫘥騉\n𫘦騊\n𫘧騄\n𫘨騠\n𫘩騜\n𫘪騵\n𫘫騴\n𫘬騱\n𫘭騻\n𫘮䮰\n𫘯驓\n𫘰驙\n𫘱驨\n𫘽鬠\n𫙂𩯁\n𫚈鱮\n𫚉魟\n𫚊鰑\n𫚋鱄\n𫚌魦\n𫚍魵\n𫚎𩶁\n𫚏䱁\n𫚐䱀\n𫚑鮅\n𫚒鮄\n𫚓鮤\n𫚔鮰\n𫚕鰤\n𫚖鮆\n𫚗鮯\n𫚘𩻮\n𫚙鯆\n𫚚鮿\n𫚛鮵\n𫚜䲅\n𫚝𩸄\n𫚞鯬\n𫚟𩸡\n𫚠䱧\n𫚡鯞\n𫚢鰋\n𫚣鯾\n𫚤鰦\n𫚥鰕\n𫚦鰫\n𫚧鰽\n𫚨𩻗\n𫚩𩻬\n𫚪鱊\n𫚫鱢\n𫚬𩼶\n𫚭鱲\n𫛚鳽\n𫛛鳷\n𫛜鴀\n𫛝鴅\n𫛞鴃\n𫛟鸗\n𫛠𩿤\n𫛡鴔\n𫛢鸋\n𫛣鴥\n𫛤鴐\n𫛥鵊\n𫛦鴮\n𫛧𪀖\n𫛨鵧\n𫛩鴳\n𫛪鴽\n𫛫鶰\n𫛬䳜\n𫛭鵟\n𫛮䳤\n𫛯鶭\n𫛰䳢\n𫛱鵫\n𫛲鵰\n𫛳鵩\n𫛴鷤\n𫛵鶌\n𫛶鶒\n𫛷鶦\n𫛸鶗\n𫛹𪃧\n𫛺䳧\n𫛻𪃒\n𫛼䳫\n𫛽鷅\n𫛾𪆷\n𫜀鷐\n𫜁鷩\n𫜂𪅂\n𫜃鷣\n𫜄鷷\n𫜅䴋\n𫜊𪉸\n𫜑麷\n𫜒䴱\n𫜓𪌭\n𫜔䴽\n𫜕𪍠\n𫜙䵴\n𫜟𪓰\n𫜨䶕\n𫜩齧\n𫜪齩\n𫜫𫜦\n𫜬齰\n𫜭齭\n𫜮齴\n𫜯𪙏\n𫜰齾\n𫜲龓\n𫜳䶲\n𫝈㑮\n𫝋𠐊\n𫝦㛝\n𫝧㜐\n𫝨媈\n𫝩嬦\n𫝪𡟫\n𫝫婡\n𫝬嬇\n𫝭孆\n𫝮孄\n𫝵嶹\n𫞅𦠅\n𫞗潣\n𫞚澬\n𫞛㶆\n𫞝灍\n𫞠爧\n𫞡爃\n𫞢𤛱\n𫞣㹽\n𫞥珼\n𫞦璾\n𫞧𤩂\n𫞨璼\n𫞩璊\n𫞷𥢶\n𫟃絍\n𫟄綋\n𫟅綡\n𫟆緟\n𫟇𦆲\n𫟑䖅\n𫟕䕤\n𫟞訨\n𫟟詊\n𫟠譂\n𫟡誴\n𫟢䜖\n𫟤䡐\n𫟥䡩\n𫟦䡵\n𫟫𨞺\n𫟬𨟊\n𫟲釚\n𫟳釲\n𫟴鈖\n𫟵鈗\n𫟶銏\n𫟷鉝\n𫟸鉽\n𫟹鉷\n𫟺䤤\n𫟻銂\n𫟼鐽\n𫟽𨧰\n𫟾𨩰\n𫟿鎈\n𫠀䥄\n𫠁鑉\n𫠂閝\n𫠅韚\n𫠆頍\n𫠇𩖰\n𫠈䫾\n𫠊䮄\n𫠋騼\n𫠌𩦠\n𫠏𩵦\n𫠐魽\n𫠑䱸\n𫠒鱆\n𫠖𩿅\n𫠜齯\n𫢸僤\n𫧃𣍐\n𫧮𪋿\n𫫇噁\n𫬐㘔\n𫭟塸\n𫭢埨\n𫭼𡑍\n𫮃墠\n𫰛娙\n𫵷㠣\n𫶇嵽\n𫷷廞\n𫸩彄\n𬀩暐\n𬀪晛\n𬂩梜\n𬃊櫍\n𬇕澫\n𬇙浿\n𬇹漍\n𬉼熰\n𬊈燖\n𬊤燀\n𬍛瓅\n𬍡璗\n𬍤璕\n𬒈礐\n𬒗𥗽\n𬕂篢\n𬘓紃\n𬘘紞\n𬘡絪\n𬘩綎\n𬘫綄\n𬘬綪\n𬘭綝\n𬘯綧\n𬙂縯\n𬙊纆\n𬙋纕\n𬜬蔄\n𬜯䓣\n𬞟蘋\n𬟁虉\n𬟽蝀\n𬣙訏\n𬣞詝\n𬣡諓\n𬣳詪\n𬤇諲\n𬤊諟\n𬤝譓\n𬨂軝\n𬨎輶\n𬩽鄩\n𬪩醲\n𬬩釴\n𬬭錀\n𬬮鋹\n𬬱釿\n𬬸鉥\n𬬹鉮\n𬬻鑪\n𬬿鉊\n𬭁鉧\n𬭊𨧀\n𬭎鋐\n𬭚錞\n𬭛𨨏\n𬭤鍭\n𬭩鎓\n𬭬鏏\n𬭭鏚\n𬭯䥕\n𬭳𨭎\n𬭶𨭆\n𬭸鏻\n𬭼鐩\n𬮱闉\n𬮿隑\n𬯀隮\n𬯎隤\n𬱖頔\n𬱟頠\n𬳵駓\n𬳶駉\n𬳽駪\n𬳿駼\n𬴂騑\n𬴃騞\n𬴊驎\n𬶋鮈\n𬶍鮀\n𬶏鮠\n𬶐鮡\n𬶟鯻\n𬶠鰊\n𬶨鱀\n𬶭鰶\n𬶮鱚\n𬷕鵏\n𬸘鶠\n𬸚鸑\n𬸣鶱\n𬸦鷟\n𬸪鷭\n𬸯鷿\n𬹼齘\n𬺈齮\n𬺓齼\n𰬸繐\n𰰨菕\n𰶎譅\n𰾄鋂\n𰾭鑀\n𱊜𪈼"
  },
  {
    "path": "assets/tags.json",
    "content": "{\"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\":\"明日方舟\",\"kimetsu no yaiba\":\"鬼灭之刃\",\"tenki no ko\":\"天气之子\",\"arifureta shokugyou de sekai saikyou\":\"平凡职业造就世界最强\",\"asobi asobase\":\"游戏3人娘\",\"zombie land saga\":\"佐贺偶像是传奇\",\"nazo no kanojo x\":\"谜样女友X\",\"shoujo shuumatsu ryokou\":\"少女终末旅行\",\"dumbbell nan kilo moteru\":\"流汗吧!健身少女\",\"thumbelina\":\"拇指姑娘\",\"masou gakuen hxh\":\"魔装学园H×H\",\"hundred\":\"百武装战记\",\"dr. stone\":\"石纪元\",\"uchi no ko no tame naraba ore wa moshikashitara maou mo taoseru kamo shirenai\":\"为了女儿，我说不定连魔王都能干掉。\",\"tsujou kougeki ga zentai kougeki de 2-kai kougeki no okaasan wa suki desu ka\":\"普通攻击是全体二连击，这样的妈妈你喜欢吗？\",\"wagaya no oinari-sama\":\"我家有个狐仙大人\",\"enen no shouboutai\":\"炎炎消防队\",\"lord el-melloi ii sei no jikenbo\":\"君主·埃尔梅罗二世事件簿\",\"inuyasha\":\"犬夜叉\",\"jashin-chan dropkick\":\"邪神与厨二病少女\",\"ishuzoku reviewers\":\"异种族风俗娘评鉴指南\",\"d-frag\":\"属性同好会\",\"heavens memo pad\":\"神的记事本\",\"houkago play\":\"放课后play\",\"ookiku furikabutte\":\"王牌投手 振臂高挥\",\"black bullet\":\"漆黑的子弹\",\"mawaru penguindrum\":\"回转企鹅罐\",\"ben-to\":\"便·当\",\"one week friends\":\"一周的朋友\",\"sanoba witch\":\"魔女的夜宴\",\"tonari no seki-kun\":\"上课小动作\",\"high score girl\":\"高分少女\",\"claymore\":\"大剑\",\"sinoalice\":\"死亡爱丽丝\",\"machikado mazoku\":\"街角魔族\",\"the hunchback of notre dame\":\"钟楼怪人\",\"kodoku no gourmet\":\"孤独的美食家\",\"kishuku gakkou no juliet\":\"寄宿学校的朱丽叶\",\"kemurikusa\":\"烟草\",\"tate no yuusha no nariagari\":\"盾之勇者成名录\",\"watashi nouryoku wa heikinchi de tte itta yo ne\":\"我，不是说了能力要平均值么！\",\"itai no wa iya nano de bougyoryoku ni kyokufuri shitai to omoimasu.\":\"因为太怕痛就全点防御力了\",\"rurouni kenshin\":\"浪客剑心\",\"gankutsuou\":\"岩窟王\",\"kiddy grade\":\"天使特警\",\"yat space travel agency\":\"星际漫游YAYAYA\",\"teisou gyakuten sekai\":\"贞操逆转世界\",\"mondaiji-tachi ga isekai kara kuru sou desu yo\":\"问题儿童都来自异世界？\",\"alice gear aegis\":\"机战少女Alice\",\"houkago no pleiades\":\"放学后的昴星团\",\"senren banka\":\"千恋＊万花\",\"kiratto pri chan\":\"美妙☆频道\",\"cafe stella to shinigami no chou\":\"星光咖啡馆与死神之蝶\",\"riddle joker\":\"RIDDLE JOKER\",\"grand theft auto\":\"侠盗猎车手\",\"hitori bocchi no marumaru seikatsu\":\"一个人的OO小日子\",\"asteroid in love\":\"恋爱小行星\",\"koi wa ameagari no you ni\":\"恋如雨止\",\"kanojo okarishimasu\":\"租借女友\",\"15 bishoujo hyouryuuki\":\"15美少女漂流记\",\"ore no natsuyasumi\":\"我的暑假\",\"shinchou yuusha kono yuusha ga ore tueee kuse ni shinchou sugiru\":\"这个勇者明明超强却过分慎重\",\"helltaker\":\"Helltaker\",\"cyborg kuro-chan\":\"超级酷乐猫\",\"oretachi ni tsubasa wa nai\":\"我们没有翅膀\",\"blade of the immortal\":\"无限之住人\",\"nande koko ni sensei ga\":\"为什么老师会在这里！？\",\"what happens in vegas\":\"情迷拉斯维加斯\",\"ore o suki nano wa omae dake kayo\":\"喜欢本大爷的竟然就你一个？\",\"tricolour lovestory\":\"三色△绘恋\",\"mahjong soul\":\"雀魂麻将\",\"genshin impact\":\"原神\",\"mobile suit gundam the 08th ms team\":\"机动战士高达 第08MS小队\",\"hoshizora no memoria\":\"星空的记忆\",\"bocchi kaibutsu to moumoku shoujo\":\"孤独怪物与盲少女\",\"choujin koukousei-tachi wa isekai demo yoyuu de ikinuku you desu\":\"超人高中生们即便在异世界也能从容生存！\",\"maou-sama retry\":\"重来吧，魔王大人！\",\"maitetsu\":\"爱上火车\",\"houkago teibou nisshi\":\"放学后海堤日记\",\"ochikobore fruit tart\":\"满溢的水果挞\",\"comic girls\":\"Comic Girls\",\"endro\":\"Endro!\",\"harukana receive\":\"遥的接球\",\"majo no tabitabi\":\"魔女之旅\",\"chainsaw man\":\"电锯人\",\"josou sanmyaku\":\"女装山脉\",\"penguin highway\":\"企鹅公路\",\"irotoridori no sekai\":\"五彩斑斓的世界\",\"tokyo xanadu\":\"东京迷城\",\"terra battle\":\"地球战争\",\"summer pockets\":\"Summer Pockets\",\"the tatami galaxy\":\"四叠半神话大系\",\"glitch techs\":\"电玩先锋\",\"the owl house\":\"猫头鹰魔法社\",\"maoujou de oyasumi\":\"在魔王城说晚安\",\"dungeons and dragons\":\"龙与地下城\",\"lilo and stitch\":\"星际宝贝\",\"my life as a teenage robot\":\"我的青少年机器人时代\",\"milo murphys law\":\"迈罗·墨菲定律\",\"phineas and ferb\":\"飞哥与小佛\",\"cthulhu mythos\":\"克苏鲁神话\",\"kipo and the age of wonderbeasts\":\"奇波和神奇动物的时代\",\"amphibia\":\"奇幻沼泽\",\"american dragon jake long\":\"美国龙：杰克龙\",\"hazbin hotel\":\"地狱客栈\",\"hotel transylvania\":\"精灵旅社\",\"hilda\":\"希尔达\",\"the dragon prince\":\"龙太子\",\"code lyoko\":\"虚幻勇士\",\"the smurfs\":\"蓝精灵\",\"young justice\":\"少年正义联盟\",\"justice league\":\"正义联盟\",\"avalon code\":\"创世法典\",\"doctor who\":\"神秘博士\",\"rune factory\":\"符文工房\",\"coraline\":\"鬼妈妈\",\"dororo\":\"多罗罗\",\"sekiro shadows die twice\":\"只狼：影逝二度\",\"kamihime project\":\"神姬Project\",\"merc storia\":\"梅露可物语\",\"twelve forever\":\"永远12岁\",\"warriors orochi\":\"无双大蛇\",\"little nightmares\":\"小小噩梦\",\"healin good precure\":\"元气魔法♡光之美少女\",\"uchi no maid ga uzasugiru\":\"我家的女仆有够烦！\",\"flying witch\":\"飞翔的魔女\",\"mushoku tensei\":\"无职转生\",\"tanaka-kun wa itsumo kedaruge\":\"田中君总是如此慵懒\",\"yakusoku no neverland\":\"约定的梦幻岛\",\"iya na kao sare nagara opantsu misete moraitai\":\"很想被人用一脸嫌弃的眼神把胖次给我看\",\"wrestle angels\":\"摔角天使\",\"nijisanji\":\"彩虹社\",\"blue archive\":\"蔚蓝档案\",\"the legend of luo xiaohei\":\"罗小黑战记\",\"sk8 the infinity\":\"SK8 无限滑板\",\"beatmania\":\"狂热节拍\",\"honzuki no gekokujou\":\"小书痴的下克上\",\"oide yo mizuryuu kei land\":\"欢迎光临！水龙敬乐园\",\"shuriken sentai ninninger\":\"手里剑战队忍忍者\",\"hajimete no hitozuma\":\"第一次的人妻体验\",\"sdorica\":\"Sdorica\",\"kaifuku jutsushi no yarinaoshi\":\"回复术士的重启人生\",\"sd gundam sangokuden\":\"SD高达三国传\",\"promare\":\"普罗米亚\",\"ssss.dynazenon\":\"SSSS.电光机王\",\"yagate kimi ni naru\":\"终将成为你\",\"maji de watashi ni koi shinasai\":\"请认真的和我恋爱\",\"lodoss-tou senki\":\"罗德岛战记\",\"tantei wa mou shindeiru.\":\"侦探已死\",\"the secret of kells\":\"凯尔经的秘密\",\"anarchy reigns\":\"极度混乱\",\"tropical-rouge precure\":\"热情闪耀！光之美少女\",\"jujutsu kaisen\":\"咒术回战\",\"shugo chara\":\"守护甜心\",\"manatsu no yo no inmu\":\"仲夏夜之淫梦 | Cookie☆\",\"mujaki no rakuen\":\"无邪气乐园\",\"hololive\":\"Hololive\",\"hinamatsuri\":\"超能力女儿\",\"citrus\":\"citrus～柑橘味香气～\",\"tsubasa reservoir chronicle\":\"翼·年代记\",\"yamada-kun to 7-nin no majo\":\"山田君与7人魔女\",\"aki sora\":\"秋日天空\",\"beelzebub\":\"魔王奶爸\",\"kaichou wa maid-sama\":\"会长是女仆大人\",\"el shaddai\":\"全能之神：梅塔特隆的升天\",\"plants vs. zombies\":\"植物大战僵尸\",\"madou king granzort\":\"魔动王\",\"sono hanabira ni kuchizuke o\":\"亲吻那片花瓣🌸\",\"jormungand\":\"军火女王\",\"the wolf and the seven young kids\":\"狼和七只小山羊\",\"the ugly duckling\":\"丑小鸭\",\"the little match girl\":\"卖火柴的小女孩\",\"hansel and gretel\":\"糖果屋\",\"slime taoshite 300-nen shiranai uchi ni level max ni nattemashita\":\"打了300年的史莱姆，不知不觉就练到了满级\",\"shinsekai yori\":\"来自新世界\",\"tonikaku kawaii\":\"总之就是非常可爱\",\"danshi koukousei no nichijou\":\"男子高中生的日常\",\"seitokai yakuindomo\":\"妄想学生会\",\"parasyte\":\"寄生兽\",\"mairimashita iruma-kun\":\"入间同学入魔了\",\"yubisaki milk tea\":\"指尖奶茶\",\"kyoukai no rinne\":\"境界之轮回\",\"shuumatsu no harem\":\"终末的后宫\",\"bishoujo mangekyou\":\"美少女万华镜\",\"koe de oshigoto\":\"声优初体验！\",\"id invaded\":\"异度侵入 ID:INVADED\",\"hataage kemono michi\":\"萌兽宠物店\",\"valkyria chronicles 2\":\"战场女武神2\",\"valkyria chronicles 3\":\"战场女武神3\",\"kumo desu ga nani ka\":\"转生成蜘蛛又怎样！\",\"kuma kuma kuma bear\":\"熊熊勇闯异世界\",\"marco to ginga ryuu\":\"丸子与银河龙\",\"moyashimon\":\"萌菌物语\",\"wonder egg priority\":\"奇蛋物语\",\"love live superstar\":\"Love Live! Superstar!!\",\"tales of arise\":\"破晓传说\",\"osananajimi ga zettai ni makenai love comedy\":\"青梅竹马绝对不会输的恋爱喜剧\",\"buried stars\":\"深埋之星\",\"gunbuster\":\"飞跃巅峰\",\"13 sentinels aegis rim\":\"十三机兵防卫圈\",\"infinite space\":\"无限航路\",\"tonari no kyuuketsuki-san\":\"邻家索菲\",\"rabi ribi\":\"Rabi-Ribi\",\"little witch nobeta\":\"小魔女诺贝塔\",\"mieruko-chan\":\"看得见的女孩\",\"shigatsu wa kimi no uso\":\"四月是你的谎言\",\"axis powers hetalia\":\"黑塔利亚 Axis Powers\",\"disney twisted-wonderland\":\"迪士尼扭曲仙境\",\"sono bisque doll wa koi o suru\":\"更衣人偶坠入爱河\",\"hypnosis mic\":\"催眠麦克风\",\"project sekai\":\"世界计划\",\"needy streamer overload\":\"主播女孩重度依赖\",\"elden ring\":\"艾尔登法环\",\"otome game no hametsu flag shika nai akuyaku reijou ni tensei shiteshimatta...\":\"转生成为了只有乙女游戏破灭Flag的邪恶大小姐\",\"osomatsu-san\":\"阿松\",\"arena of valor\":\"传说对决\",\"douluo continent\":\"斗罗大陆\",\"grand blue\":\"碧蓝之海\",\"blue submarine no. 6\":\"青之6号\",\"jaku-chara tomozaki-kun\":\"弱势角色友崎君\",\"aikatsu friends\":\"偶活学园Friends！\",\"jahy-sama wa kujikenai\":\"贾希大人不气馁\",\"ling long incarnation\":\"灵笼:INCARNATION\",\"kouyoku senki exs-tia\":\"光翼战姬EXS-TIA\",\"assault lily\":\"突击莉莉\",\"harem tengoku da to omottara yandere jigoku datta.\":\"原本以为是后宫天国谁知道竟是病娇地狱\",\"akebi-chan no sailor fuku\":\"明日同学的水手服\",\"mahou shoujo celesphonia\":\"魔法少女天穹法妮雅\",\"noel\":\"NOeL: NOT DiGITAL\",\"tsumamigui\":\"妻中蜜\",\"senpai ga uzai kouhai no hanashi\":\"关于前辈很烦人的事\",\"neko no otera no chion-san\":\"猫之寺的知恩姐\",\"spy x family\":\"间谍过家家\",\"kawaikereba hentai demo suki ni natte kuremasu ka\":\"只要长得可爱，即使是变态你也喜欢吗?\",\"dorohedoro\":\"异兽魔都\",\"bokura wa minna kawaisou\":\"我们大家的河合庄\",\"game of thrones\":\"权力的游戏\",\"red pride of eden\":\"伊甸园的骄傲\",\"nana to kaoru\":\"奈奈与薰的SM日记\",\"kawaii dake ja nai shikimori-san\":\"式守同学不只可爱而已\",\"toaru project\":\"魔法禁书系列\",\"tenka hyakken\":\"天华百剑\",\"oshiro project\":\"御城少女Project\",\"amaama to inazuma\":\"天真与闪电\",\"kin-iro loveriche\":\"金辉恋曲四重奏\",\"ganbare douki-chan\":\"加油吧同期酱\",\"drakengard\":\"龙背上的骑兵\",\"bobobo-bo bo-bobo\":\"鼻毛真拳\",\"majuu senshi luna varga\":\"魔兽战士\",\"saijaku muhai no bahamut\":\"最弱无败神装机龙\",\"trinity seven\":\"七人魔法使\",\"venus eleven vivid\":\"Venus Eleven Vivid！\",\"emil chronicle online\":\"艾米尔编年史\",\"megido 72\":\"恶魔72\",\"umihara kawase\":\"海腹川背\",\"owari no seraph\":\"终结的炽天使\",\"starless\":\"STARLESS\",\"smite\":\"神之浩劫\",\"takopii no genzai\":\"章鱼噼的原罪\",\"super cub\":\"本田小狼与我\",\"kekkaishi\":\"结界师\",\"senyoku no sigrdrifa\":\"战翼的希格德莉法\",\"densetsu no yuusha da garn\":\"勇者传说\",\"video girl ai\":\"电影少女\",\"last origin\":\"Last Origin\",\"seven mortal sins\":\"sin 七大罪\",\"jibaku shounen hanako-kun\":\"地缚少年花子君\",\"shinkansen henkei robo shinkalion\":\"新干线战士\",\"07-ghost\":\"07-GHOST\",\"10 carat torte\":\"天降托蒂！\",\"11eyes\":\"11eyes -罪与罚与赎的少女-\",\"12-sai.\":\"12岁。\",\"13 reasons why\":\"十三个理由\",\"21 emon\":\"21卫门\",\"nanabun no nijyuuni\":\"22/7\",\"3-gatsu no lion\":\"3月的狮子\",\"81diver\":\"81diver\",\"91 days\":\"91Days\",\"a dog of flanders\":\"弗兰德斯的狗\",\"a little snow fairy sugar\":\"小小雪精灵\",\"a nightmare on elm street\":\"猛鬼街\",\"kimi no iru machi\":\"有你的小镇\",\"a.d.police\":\"A.D.POLICE\",\"abenobashi mahou shoutengai\":\"阿倍野桥魔法商店街\",\"acca 13-ku kansatsu-ka\":\"ACCA13区监察课\",\"acchi kocchi\":\"一起一起这里那里\",\"adachi to shimamura\":\"安达与岛村\",\"adventures of the gummi bears\":\"妙妙熊历险记\",\"agarest senki\":\"亚迦雷斯特战记\",\"ai no senshi rainbowman\":\"彩虹化身侠\",\"ai shimai\":\"爱姐妹\",\"ai yori aoshi\":\"青出于蓝\",\"aim for the ace\":\"网球甜心\",\"air master\":\"Air Master\",\"akatsuki blitzkampf\":\"葬晓电光战记\",\"akira\":\"阿基拉\",\"aku no onna kanbu\":\"恶之女干部\",\"akuyaku reijou nanode last boss o kattemimashita\":\"作为恶役大小姐就该养魔王\",\"alice tantei kyoku\":\"爱丽丝侦探局\",\"alien 9\":\"校园外星人\",\"alien vs predator\":\"异形大战铁血战士\",\"allison to lillia\":\"艾莉森与莉莉亚\",\"a.i. ga tomaranai\":\"电脑情人梦\",\"akihabara dennou gumi\":\"秋叶原电脑组\",\"alpen rose\":\"阿尔卑斯杜鹃\",\"alvin and the chipmunks\":\"鼠来宝\",\"am driver\":\"滑板战士\",\"amaenaideyo\":\"极乐天师\",\"amazing nurse nanako\":\"菜菜子解体诊书\",\"american dad\":\"特工老爹\",\"american mcgees alice\":\"爱丽丝梦游魔境\",\"amnesia\":\"失忆症\",\"an american tail\":\"美国鼠谭\",\"ane doki\":\"御姐百分百\",\"ane haramix\":\"姐姐☆懷孕\",\"angel blade\":\"Angel Blade\",\"animal yokochou\":\"动物横町\",\"animaniacs\":\"狂欢三宝\",\"anna millers\":\"安娜·米勒\",\"anne happy\":\"Anne Happy♪\",\"anpanman\":\"面包超人\",\"ao no flag\":\"青旗\",\"aoharu x kikanjuu\":\"青春×机关枪\",\"aoi shiro\":\"青城\",\"aoi umi no tristia\":\"发明工坊\",\"ape escape\":\"捉猴啦\",\"ar nosurge\":\"Ar nosurge ～献给诞生之星的祈祷诗～\",\"ciel nosurge\":\"静籁之空 ～献给失落之星的诗～\",\"ar tonelico\":\"魔塔大陆\",\"ar tonelico qoga\":\"魔塔大陆3\",\"araiguma rascal\":\"小浣熊\",\"arcana famiglia\":\"魔力家族\",\"area no kishi\":\"足球骑士\",\"ares no tsubasa\":\"传奇之翼\",\"arete hime\":\"阿莱蒂公主\",\"armored trooper votoms\":\"装甲骑兵波德姆兹\",\"arrow emblem hawk of the grand prix\":\"神威赛车手\",\"asa made jugyou chu\":\"授课到天亮Chu!\",\"ashita e free kick\":\"踢向明天\",\"ashita no joe\":\"明日之丈\",\"ask dr. rin\":\"恋爱占卜师\",\"asoko de hataraku musubu-san\":\"在那里工作的结小姐\",\"astro fighter sunred\":\"天体战士桑雷德\",\"astro plan\":\"太空历险记\",\"asura cryin\":\"魔神相克者\",\"atsumare fushigi kenkyuubu\":\"集合！不可思议研究社\",\"aura battler dunbine\":\"圣战士丹拜因\",\"ayashi no ceres\":\"梦幻妖子\",\"azfareo no sobayounin\":\"苍龙的仆人\",\"azuki-chan\":\"小红豆\",\"b gata h kei\":\"B型H系\",\"b-daman\":\"B传说！战斗弹珠人\",\"back to the future\":\"回到未来\",\"bagi the monster of mighty nature\":\"大自然的魔兽巴奇\",\"bakuen campus guardress\":\"爆炎学院\",\"bakugan\":\"爆丸\",\"bakunyuu maid kari\":\"爆乳女仆狩猎\",\"bakutou sengen daigunder\":\"爆斗宣言大钢弹\",\"baldr force\":\"BALDR FORCE\",\"ballroom e youkoso\":\"舞动青春\",\"band yarouze\":\"来组乐队吧!\",\"banished from the heros party i decided to live a quiet life in the countryside\":\"因为不是真正的伙伴而被逐出勇者队伍，流落到边境展开慢活人生\",\"banjo-kazooie\":\"班卓熊大冒险\",\"banner of the stars\":\"星界的战旗\",\"baribari densetsu\":\"极速狂飙\",\"battery\":\"野球少年\",\"battle angel alita\":\"铳梦\",\"battle arena toshinden\":\"斗神传\",\"battle royal high school\":\"真魔神传\",\"beck\":\"BECK\",\"beelzebub-jou no okinimesu mama.\":\"只要贝尔哲布布大小姐喜欢就好\",\"beet the vandel buster\":\"冒险王比特\",\"beetlejuice\":\"阴间大法师\",\"bemubemu hunter kotengu tenmaru\":\"伏魔小旋风\",\"bernard-jou iwaku.\":\"伯纳德小姐说\",\"beyond oasis\":\"托尔的传说\",\"big wars\":\"Big Wars\",\"binchou-tan\":\"备长炭\",\"binzume yousei\":\"瓶诘妖精\",\"birdy the mighty\":\"铁腕女警\",\"bishounen tanteidan\":\"美少年侦探团\",\"black butler\":\"黑执事\",\"black desert online\":\"黑色沙漠\",\"black jack\":\"怪医黑杰克\",\"black magic m-66\":\"黑魔术玛丽奥M-66\",\"blade runner\":\"银翼杀手\",\"blast of tempest\":\"绝园的暴风雨\",\"blood plus\":\"血战\",\"blood royale\":\"BLOOD ROYAL\",\"blood-c\":\"BLOOD-C\",\"bloodstained\":\"血污\",\"bloody roar\":\"血腥咆哮\",\"blue dragon\":\"蓝龙\",\"blue spring ride\":\"青春之旅\",\"bna brand new animal\":\"动物新世代 BNA\",\"boku dake ga inai machi\":\"只有我不存在的城市\",\"boku no kanojo ga majimesugiru shobitch na ken\":\"关于我女友是个一本正经的碧池这件事\",\"boku to misaki-sensei\":\"我和美咲老师\",\"boku to roboko\":\"我与机器子\",\"bokura no taiyou\":\"我们的太阳\",\"bokutachi no remake\":\"我们的重制人生\",\"bomberman jetters\":\"轰炸超人\",\"boogiepop\":\"不吉波普\",\"bounen no xamdou\":\"亡念之扎姆德\",\"braceface\":\"Braceface\",\"brandy and mr. whiskers\":\"小布与伟仔\",\"bratz\":\"Bratz\",\"brave 10\":\"BRAVE10\",\"brave express might gaine\":\"勇者特急队\",\"brave fencer musashi\":\"勇敢的剑士 武藏传\",\"brave nine\":\"Brave Nine\",\"brave story\":\"勇者物语\",\"bravestarr\":\"布雷斯塔警长\",\"breakers\":\"BREAKERS\",\"breath of fire\":\"龙息之焰\",\"breath of fire ii\":\"龙息之焰II\",\"breath of fire iii\":\"龙息之焰III\",\"breath of fire iv\":\"龙息之焰IV\",\"breath of fire v\":\"龙息之焰V\",\"breath of fire 6\":\"龙息之焰6\",\"broken blade\":\"破刃之剑\",\"bubuki buranki\":\"舞武器·舞乱伎\",\"bucky ohare\":\"Bucky O'Hare\",\"buffy the vampire slayer\":\"吸血鬼猎人巴菲\",\"bully\":\"恶霸鲁尼\",\"bungou to alchemist\":\"文豪与炼金术师\",\"burn up\":\"杀人科\",\"burn up w\":\"杀人科 W\",\"burn up scramble\":\"杀人科 SCRAMBLE\",\"busou shoujo machiavellianism\":\"武装少女Machiavellianism\",\"buzz lightyear of star command\":\"巴斯光年的星际使命\",\"c the money of soul and possibility control\":\"C钱‧未来式\",\"cage of eden\":\"逃离伊甸园\",\"caligula\":\"卡里古拉\",\"call me by your name\":\"请以你的名字呼唤我\",\"call of duty\":\"使命召唤\",\"can can bunny\":\"Can Can Bunny\",\"carole and tuesday\":\"卡罗尔与星期二\",\"casshan\":\"再造人卡辛\",\"casshern sins\":\"卡辛~罪~\",\"fantasy bishoujo juniku ojisan to\":\"与变成了异世界美少女的大叔一起冒险\",\"trauma center\":\"超执刀\",\"alchemy stars\":\"白夜极光\",\"genkai tokki monster monpiece\":\"限界凸骑 Monster Monpiece\",\"castlevania\":\"恶魔城\",\"casual romance club\":\"放学后恋爱俱乐部\",\"chalkzone\":\"粉笔世界\",\"chaos breaker\":\"混沌斩断\",\"chaos child\":\"混沌之子\",\"chaos head\":\"混沌之脑\",\"cheer danshi\":\"男子啦啦队！！\",\"chibi maruko-chan\":\"樱桃小丸子\",\"chibi vampire\":\"增血鬼果林\",\"chichi chichi\":\"乳乳乳乳\",\"chikyu misaki\":\"地球美纱树\",\"childs play\":\"鬼娃回魂\",\"chio-chan no tsuugakuro\":\"千绪的通学路\",\"chip n dale rescue rangers\":\"救援突击队\",\"cho aniki\":\"超兄贵\",\"chogattai majutsu robot ginguiser\":\"超合体魔术机器人\",\"chokotto sister\":\"我的裘可妹妹\",\"chou dokyuu shoujo 4946\":\"超弩级少女4946\",\"chou kuse ni narisou\":\"城市小飞女\",\"choudenshi bioman\":\"超电子生化人\",\"chouja raideen\":\"超者雷登\",\"choujikuu kidan southern cross\":\"超时空骑团\",\"choujuu kishin dancougar\":\"超兽机神\",\"choukou shinki ixseal\":\"超昂神骑爱克希尔\",\"chrono cross\":\"穿越时空\",\"chrono trigger\":\"时空之轮\",\"chu-bra\":\"青春CUP\",\"chuuka ichiban\":\"中华一番！\",\"class of heroes\":\"剑与魔法与学园\",\"clock tower\":\"钟楼惊魂\",\"clover point\":\"Clover Point\",\"cocoro restarter\":\"心灵重启！\",\"code realize sousei no himegimi\":\"Code:Realize ～创世的姬君～\",\"codename kids next door\":\"小孩大联盟\",\"combat mecha xabungle\":\"战斗装甲Xabungle\",\"combattler v\":\"超力电磁侠 孔巴特拉V\",\"conan the barbarian\":\"蛮王柯南\",\"concon-collector\":\"Concon-Collector\",\"conker\":\"松鼠库克倒霉的一天\",\"cooking idol ai mai main\":\"料理偶像\",\"corruption of champions\":\"英雄的堕落\",\"crash b-daman\":\"爆球Hit！轰烈弹珠人\",\"crash bandicoot\":\"古惑狼\",\"cross game\":\"幸运四叶草\",\"crush gear nitro\":\"新超激力战斗车\",\"crypt killer\":\"妖霸天下\",\"cyberbots\":\"装甲战士\",\"cyberpunk\":\"赛博朋克\",\"d.gray-man\":\"驱魔少年\",\"d.n.angel\":\"天使怪盗\",\"d.p.s.\":\"D.P.S.\",\"daa daa daa\":\"Da!Da!Da!\",\"daiakuji\":\"大恶司\",\"daibanchou -big bang age-\":\"大番长 -Big Bang Age-\",\"daicon\":\"DAICON\",\"daisenryaku\":\"大战略\",\"daphne in the brilliant blue\":\"光与水的女神\",\"dark chronicle\":\"暗云编年史\",\"dark water\":\"Dark Water\",\"darker than black\":\"DARKER THAN BLACK\",\"darkwing duck\":\"狡猾飞天德\",\"dave the barbarian\":\"野蛮人戴夫\",\"day break illusion\":\"穿透幻影的太阳\",\"dead end\":\"Dead End\",\"dead rising\":\"丧尸围城\",\"deadman wonderland\":\"死囚乐园\",\"deception\":\"刻命馆\",\"defense devil\":\"防御魔鬼\",\"demento\":\"狂城丽影\",\"demonbane\":\"斩魔大圣DEMONBANE\",\"dennou boukenki webdiver\":\"电脑冒险记\",\"makai tenshi jibril\":\"魔界天使吉普莉露\",\"dennou tenshi djibril\":\"电脑天使吉普莉露\",\"denpa teki na kanojo\":\"电波系彼女\",\"detective school q\":\"侦探学园Q\",\"the idolmaster sidem\":\"偶像大師SideM\",\"ryuugajou nanana no maizoukin\":\"龙娘七七七埋藏的宝藏\",\"grandia\":\"冒險奇譚\",\"grappler baki\":\"刃牙\",\"mayonaka no tantei nightwalker\":\"真夜中的侦探\",\"boku no kokoro no yabai yatsu\":\"我内心的糟糕念头\",\"inaka ni kaeru to yakeni natsuita kasshoku ponytail shota ga iru\":\"单马尾表弟 (暂译)\",\"paripi koumei\":\"派对浪客诸葛孔明\",\"sore ga seiyuu\":\"那就是声优！\",\"advance of zeta\":\"ADVANCE OF Ζ 提坦斯的旗下\",\"summertime render\":\"夏日重现\",\"kiteretsu daihyakka\":\"奇天烈大百科\",\"perman\":\"飞人\",\"danshi koukousei de urekko light novel sakka o shiteiru keredo\":\"身为男高中生兼当红轻小说作家的我，正被年纪比我小且从事声优工作的女同学掐住脖子\",\"destiny child\":\"命运之子\",\"ousama ranking\":\"国王排名\",\"regular show\":\"天兵公园\",\"talespin\":\"航空小英雄\",\"tiny toons\":\"迷你乐一通\",\"recess\":\"下课后\",\"garfield\":\"加菲猫\",\"ok k.o. lets be heroes\":\"OK K.O.!英雄赞\",\"ratchet and clank\":\"瑞奇与叮当\",\"kangokutou mary skelter\":\"神狱塔：断罪玛丽\",\"hourou musuko\":\"放浪男孩\",\"moshidora\":\"如果杜拉\",\"yumekui merry\":\"食梦者玛莉\",\"ikoku meiro no croisee\":\"异国迷宫的十字路口\",\"corpse party\":\"尸体派对\",\"jewelpet tinkle\":\"宝石宠物Twinkle☆\",\"dragon crisis\":\"龙之界点\",\"who framed roger rabbit\":\"谁陷害了兔子罗杰\",\"the bad guys\":\"坏蛋联盟\",\"hige o soru. soshite joshikousei o hirou.\":\"剃须。然后捡到女高中生。\",\"horimiya\":\"堀桑与宫村君\",\"ef a tale of memories\":\"悠久之翼\",\"gaikotsu kishi-sama tadaima isekai e odekakechuu\":\"骸骨骑士大人异世界冒险中\",\"kou-1 desu ga isekai de joushu hajimemashita\":\"虽然才高一却在异世界当起城主\",\"kansen x shoujo\":\"感染×少女\",\"digimon story cyber sleuth\":\"数码宝贝物语 网络侦探\",\"among us\":\"Among Us\",\"landstalker\":\"秘境魔宝\",\"wizardry\":\"巫术系列\",\"cotton\":\"棉花小魔女系列\",\"waccha primagi\":\"绫镜魔法\",\"sonic soldier borgman\":\"超音战士\",\"brave girl ravens\":\"Brave Girl Ravens\",\"tsukuyomi moon phase\":\"月咏\",\"punishing gray raven\":\"战双帕弥什\",\"guardian tales\":\"坎公骑冠剑\",\"otome game sekai wa mob ni kibishii sekai desu\":\"乙女游戏世界对路人角色很不友好\",\"kenja no mago\":\"贤者之孙\",\"lycoris recoil\":\"莉可丽丝\",\"tachibana-san-chi no dansei jijou\":\"橘家男性事情\",\"dig delight direct drive dj\":\"D4DJ\",\"seirei gensouki\":\"精灵幻想记\",\"soredemo ayumu wa yosetekuru\":\"即使如此依旧步步进逼\",\"nikujo no susume\":\"肉女的推荐\",\"eiyuu senki\":\"英雄战姬\",\"shoujo mahou gaku little witch romanesque\":\"少女魔法学\",\"words worth\":\"光与影的传说\",\"drifters\":\"漂流武士\",\"counter side\":\"Counter:Side\",\"kunoichi tsubaki no mune no uchi\":\"女忍者椿的心事\",\"kanojo mo kanojo\":\"女友成双\",\"ero trap dungeon\":\"色情迷宫\",\"yofukashi no uta\":\"彻夜之歌\",\"zannen onna kanbu black general-san\":\"遗憾女干部黑暗将军小姐\",\"digimon ghost game\":\"数码宝贝幽灵游戏\",\"yuusha to maou\":\"魔王勇者\",\"onegai my melody\":\"我爱美乐蒂\",\"bikkuriman\":\"仙魔大战\",\"munou na nana\":\"无能力者娜娜\",\"nurarihyon no mago\":\"滑头鬼之孙\",\"bomber girl\":\"轰炸女孩\",\"burn the witch\":\"龙与魔女（BURN THE WITCH）\",\"hataraku onii-san\":\"打工小哥\",\"tomica kizuna gattai earth granner\":\"极速牵绊 地球先锋队\",\"netojuu no susume\":\"网络胜利组\",\"camp buddy\":\"Camp Buddy\",\"eto rangers\":\"十二生肖守护神\",\"mob psycho 100\":\"灵能百分百\",\"space pirate captain harlock\":\"宇宙海贼哈洛克船长\",\"devil survivor 2\":\"恶魔幸存者2\",\"henshin\":\"变身-emergence-\",\"magika no kenshi to basileus\":\"魔技科的剑士与召唤魔王\",\"aragami\":\"荒神\",\"owari no chronicle\":\"终焉的年代记\",\"les miserables\":\"悲惨世界\",\"isekai ojisan\":\"异世界舅舅\",\"star ocean\":\"星之海洋\",\"kami no rhapsody\":\"神之狂想曲\",\"nintama rantarou\":\"落第忍者乱太郎\",\"mahoutsukai no yome\":\"魔法使的新娘\",\"subarashiki hibi\":\"美好的每一天～不连续的存在～\",\"tron\":\"创：战纪\",\"tokyo revengers\":\"东京复仇者\",\"mobile suit gundam the witch from mercury\":\"机动战士高达 水星的魔女\",\"shijou saikyou no daimaou murabito a ni tensei suru\":\"史上最强大魔王转生为村民A\",\"genjitsu shugi yuusha no oukoku saikenki\":\"现实主义勇者的王国重建记\",\"zenless zone zero\":\"绝区零\",\"mato seihei no slave\":\"魔都精兵的奴隶\",\"bocchi the rock\":\"孤独摇滚！\",\"scp foundation\":\"SCP基金会\",\"kinnikuman\":\"金肉人\",\"ever 17\":\"Ever17（时空轮回）\",\"memories off\":\"告别回忆\",\"shiei no sona-nyl -what a beautiful memories-\":\"紫影的索纳尼尔 ～何等美好的记忆～\",\"katawa shoujo\":\"片轮少女\",\"sound horizon\":\"泡沫の恋\",\"honor of kings\":\"王者荣耀\",\"naraka bladepoint\":\"永劫无间\",\"teletubbies\":\"天线宝宝\",\"goddess of victory nikke\":\"胜利女神：妮姬\",\"identity v\":\"第五人格\",\"morenatsu\":\"漏夏\",\"mad rat dead\":\"疯老鼠之死\",\"enjou genmu tan\":\"艳娘幻梦谭\",\"from argonavis\":\"from ARGONAVIS\",\"god of war\":\"战神\",\"the world ends with you\":\"美妙世界\",\"scarlet nexus\":\"绯红结系\",\"dragalia lost\":\"Dragalia Lost ～失落的龙约～\",\"kimi ga nozomu eien\":\"你所期望的永远\",\"matantei loki ragnarok\":\"魔侦探洛基\",\"washio sumi wa yuusha de aru\":\"鹫尾须美是勇者\",\"kono healer mendokusai\":\"这个僧侣有够烦\",\"super dimension century orguss\":\"超时空世纪\",\"ouchi ni kaeru made ga mashimaro desu\":\"回家之前的棉花糖\",\"karakuri circus\":\"傀儡马戏团\",\"waka okami wa shougakusei\":\"温泉屋的小老板娘\",\"kamen rider kuuga\":\"假面骑士空我\",\"raramagi honyarara magic\":\"不确定魔法\",\"space battleship yamato 2199\":\"宇宙战舰大和号2199\",\"power pro kun pocket\":\"口袋力量棒球\",\"anothereidos of dragon vein r\":\"龙脉·另一种姿态\",\"the saga of darren shan\":\"向达伦大冒险\",\"delicious party precure\":\"美味派对♡光之美少女\",\"ai the somnium files\":\"AI：梦境档案\",\"ku-neru maruta\":\"吃吃睡睡的玛璐塔\",\"school shock\":\"雏蜂\",\"shinigami bocchan to kuro maid\":\"死神少爷与黑女仆\",\"2.43 seiin high school boys volleyball team\":\"2.43 清阴高中男子排球社\",\"elf-san wa yaserarenai.\":\"精灵小姐瘦不下来\",\"pretty face\":\"漂亮脸蛋\",\"yi lian\":\"忆恋\",\"meili xinshijie i\":\"美丽新世界i\",\"kage no jitsuryokusha ni naritakute\":\"我想成为影之强者！\",\"okane ga nai\":\"欠金情人\",\"valvrave the liberator\":\"革命机\",\"dodge danpei\":\"斗球儿弹平\",\"sinbad legend of the seven seas\":\"辛巴达七海传奇\",\"tenshin ranman\":\"天神乱漫\",\"hajimete no orusuban\":\"第一次看家\",\"nanami to konomi no oshiete a-b-c\":\"ななみとこのみのおしえてA・B・C\",\"hajimete no oishasan\":\"はじめてのおいしゃさん\",\"hajimete no otetsudai\":\"はじめてのおてつだい\",\"otonari no tenshi-sama ni itsunomanika dame ningen ni sareteita ken\":\"关于我在无意间被隔壁的天使变成废柴这件事\",\"onii-chan wa oshimai\":\"别当欧尼酱了！\",\"shiki\":\"尸鬼\",\"shikabane hime\":\"尸姬\",\"ayakashi triangle\":\"妖幻三重奏\",\"tensei oujo to tensai reijou no mahou kakumei\":\"转生公主与天才千金的魔法革命\",\"summer camp island\":\"幽灵与莫莉·麦琪\",\"luca\":\"夏日友晴天\",\"spy kyoushitsu\":\"间谍教室\",\"galaxy cyclone braiger\":\"银河旋风\",\"mahou shoujo nante mouiidesukara.\":\"魔法少女什么的已经够了啦。\",\"tom clancys rainbow six\":\"彩虹六号\",\"sangoku rensenki\":\"三国恋战记~少女的兵法\",\"epic seven\":\"第七史诗\",\"godzilla\":\"哥斯拉\",\"cloud meadow\":\"云端牧场\",\"ookami kodomo no ame to yuki\":\"狼的孩子雨和雪\",\"akiba maid sensou\":\"秋叶原冥途战争\",\"kyuuketsuki sugu shinu\":\"吸血鬼马上死\",\"devil summoner soul hackers\":\"恶魔召唤师\",\"saikin yatotta maid ga ayashii\":\"最近雇的女仆有点怪\",\"benriya saitou-san isekai ni iku\":\"万事屋斋藤先生转生异世界\",\"mar\":\"MÄR魔兵传奇\",\"kinsou no vermeil\":\"金装的维尔梅\",\"ganbare goemon\":\"大盗五右卫门\",\"jikkyou powerful pro yakyuu\":\"实况力量棒球系列\",\"dolphin wave\":\"洶湧海豚\",\"suzume no tojimari\":\"铃芽之旅\",\"warframe\":\"星际战甲\",\"brok the investigator\":\"鳄鱼侦探布罗格\",\"horizon zero dawn\":\"地平线 零之曙光\",\"un-go\":\"UN-GO\",\"inma kourin devil carnival\":\"淫魔降临Devil Carnival\",\"ryu ga gotoku\":\"如龙\",\"atomic heart\":\"原子之心\",\"yomawari\":\"夜廻\",\"the addams family\":\"亚当斯一家\",\"thundercats\":\"霹雳猫\",\"gargoyles\":\"夜行神龙\",\"dora the explorer\":\"爱探险的朵拉\",\"gremlins\":\"小魔怪\",\"lazytown\":\"懒人小镇\",\"deltarune\":\"三角符文\",\"vampire knight\":\"吸血鬼骑士\",\"blue reflection\":\"蔚蓝反射（幻舞少女之剑）\",\"fumikiri jikan\":\"平交道时间\",\"all out\":\"ALL OUT!!\",\"kuma miko\":\"熊巫女\",\"tsuki ni yorisou otome no sahou\":\"近月少女的礼仪\",\"witchs weapon\":\"魔女兵器\",\"dead by daylight\":\"黎明杀机\",\"sakuna of rice and ruin\":\"天穗之咲稻姬\",\"oshi no ko\":\"我推的孩子\",\"tensei shitara ken deshita\":\"转生就是剑\",\"juuou mujin no fafnir\":\"铳皇无尽的法夫纳\",\"soukyuu no fafner\":\"苍穹之法芙娜\",\"heaven burns red\":\"炽焰天穹\",\"watashi no yuri wa oshigoto desu\":\"我的百合乃工作是也！\",\"sekai saikou no ansatsusha isekai kizoku ni tensei suru\":\"世界顶尖的暗杀者转生为异世界贵族\",\"sengoku bushouki muramasa\":\"战国武将姬\",\"idola phantasy star saga\":\"梦幻之星·伊多拉传说\",\"golden time\":\"青春纪行\",\"honkai star rail\":\"崩坏：星穹铁道\",\"tongari boushi no atelier\":\"尖帽子的魔法工坊\",\"sankarea\":\"散华礼弥\",\"princess resurrection\":\"怪物王女\",\"world flipper\":\"世界弹射物语\",\"kikai sentai zenkaiger\":\"机界战队全开者\",\"ng knight lamune and 40\":\"VS骑士\",\"midnight girls\":\"Midnight Girls R\",\"xenoblade chronicles 3\":\"异度神剑3\",\"hollow knight\":\"空洞骑士\",\"koutetsu no majo annerose\":\"钢铁魔女安妮罗杰\",\"wuqi mitu\":\"无期迷途\",\"jigokuraku\":\"地狱乐\",\"tokyo mirage sessions fe\":\"幻影异闻录♯FE\",\"odin sphere\":\"奥丁领域\",\"ga geijutsuka art design class\":\"GA 艺术科美术设计班\",\"tower of fantasy\":\"幻塔\",\"ase to sekken\":\"汗皂交香\",\"idoly pride\":\"偶像荣耀\",\"nu carnival\":\"新世界狂欢\",\"siren\":\"死魂曲\",\"lapis relights\":\"宝石幻想 光芒重现\",\"franken fran\":\"疯狂怪医芙兰\",\"kaminaki sekai no kamisama katsudou\":\"无神世界中的神明活动\",\"shoukan yuusha to f-kei kareshi\":\"召唤勇者与F系男友\",\"megami device\":\"女神装置\",\"skip to loafer\":\"跳跃和乐福鞋\",\"astral chain\":\"异界锁链\",\"taiyou no kiba dougram\":\"太阳之牙\",\"natsuiro kiseki\":\"夏色奇迹\",\"slam dunk\":\"灌篮高手\",\"tenshi souzou re-boot\":\"天使☆嚣嚣 RE-BOOT!\",\"2.5-jigen no yuuwaku\":\"2.5次元的诱惑\",\"golden boy\":\"黄金小子\",\"valorant\":\"无畏契约\",\"zom 100 zombie ni naru made ni shitai 100 no koto\":\"僵尸百分百\",\"hirogaru sky precure\":\"开阔天空！光之美少女\",\"dororon enma-kun\":\"咚隆隆炎魔君\",\"kekko kamen\":\"穴光假面\",\"tamagotchi\":\"电子宠物蛋\",\"sousou no frieren\":\"葬送的芙莉莲\",\"maou gakuin no futekigousha\":\"魔王学院的不适任者\",\"jewelpet\":\"宝石宠物\",\"jewelpet sunshine\":\"宝石宠物 Sunshine\",\"eve burst error\":\"EVE burst error\",\"mahou shoujo tokushusen asuka\":\"魔法少女特殊战明日香\",\"ponyo\":\"崖上的波妞\",\"lv1 maou to one room yuusha\":\"LV1魔王与独居废勇者\",\"love live hasunosora jogakuin school idol club\":\"莲之空女学院学园偶像俱乐部\",\"little lord fauntleroy\":\"小公子西迪\",\"tensai ouji no akaji kokka saisei jutsu\":\"天才王子的赤字国家振兴术\",\"mardock scramble\":\"壳中少女\",\"grimoire shiritsu grimoire mahou gakuen\":\"私立格里莫瓦魔法学园\",\"futoku no guild\":\"不道德公会\",\"kemono jihen\":\"怪物事变\",\"oounabara to wadanohara\":\"大海原与大海原\",\"zero escape\":\"极限脱出\",\"araburu kisetsu no otome-domo yo\":\"骚动时节的少女们啊\",\"yuusha party o tsuihou sareta beast tamer saikyoushu no nekomimi shoujo to deau\":\"被开除出勇者队伍的驯兽使，邂逅了最强种猫耳少女\",\"doukyuusei\":\"同级生\",\"dohna dohna issho ni warui koto o shiyou\":\"多娜多娜一起干坏事吧\",\"chizuru-chan kaihatsu nikki\":\"千鹤酱的开发日志\",\"arc the lad\":\"妖精战士\",\"haiiro teien\":\"灰色庭园\",\"shuumatsu nani shitemasu ka isogashii desu ka sukutte moratte ii desu ka\":\"末日时在做什么？有没有空？可以来拯救吗？\",\"flint the time detective\":\"时空侦探\",\"fumetsu no anata e\":\"致不灭的你\",\"shiro seijo to kuro bokushi\":\"白圣女与黑牧师\",\"slow loop\":\"SLOW LOOP\",\"taimadou gakuen 35 shiken shoutai\":\"对魔导学园35试验小队\",\"ongeki\":\"音击Ongeki\",\"yamada-kun to lv999 no koi o suru\":\"和山田进行LV.999的恋爱\",\"yu-gi-oh sevens\":\"游戏王SEVENS\",\"ore no shikabane wo koeteyuke\":\"跨越我的尸体\",\"puss in boots the last wish\":\"穿靴子的猫:最后的愿望\",\"fatal frame\":\"零系列\",\"arknights endfield\":\"明日方舟：终末地\",\"calabiyau\":\"卡拉彼丘\",\"soltyrei\":\"曙光少女\",\"meikyuu black company\":\"异世界迷宫黑心企业\",\"kimi no koto ga daidaidaidaidaisuki na 100-nin no kanojo\":\"超超超超超喜欢你的100个女朋友\",\"kimagure orange road\":\"橙路\",\"mahoutsukai no yakusoku\":\"魔法使的约定\",\"genesis climber mospeada\":\"机甲创世记\",\"tottemo luckyman\":\"幸运超人\",\"super radical gag family\":\"浦安铁筋家族\",\"edomae elf\":\"江户前精灵\",\"eizouken ni wa te wo dasu na\":\"别对映像研出手！\",\"rikei ga koi ni ochita no de shuomei shite mita.\":\"理科生坠入情网，故尝试证明。\",\"yu-gi-oh go rush\":\"游戏王GO RUSH\",\"tearmoon teikoku monogatari\":\"堤亚穆帝国物语～从断头台开始，公主重生后的逆转人生～\",\"invincible\":\"无敌少侠\",\"urotsukidoji\":\"超神传说\",\"shutsudou minisuka police\":\"出动！迷你裙警察\",\"engage kiss\":\"契约之吻\",\"seitokai no ichizon\":\"学生会的一己之见\",\"tsuritama\":\"钓球\",\"mahou shoujo ni akogarete\":\"憧憬成为魔法少女\",\"myo-chan sensei wa kaku katariki\":\"小美代老师如是说\",\"kusuriya no hitorigoto\":\"药师少女的独语\",\"equestria girls\":\"小马宝莉：魔法公主\",\"palworld\":\"幻兽帕普\",\"limbus company\":\"边狱公司\",\"trigun\":\"枪神\",\"saimin seishidou\":\"催眠性指导\",\"tekkaman blade\":\"宇宙骑士BLADE\",\"koikatsu\":\"恋活！\",\"debby the corsifa wa makezugirai\":\"Debby·the·Corsifa不愿败北\",\"101 dalmatians\":\"101忠狗\",\"helluva boss\":\"极恶老大\",\"power pack\":\"超能小队\",\"the amazing digital circus\":\"神奇数字马戏团\",\"night shift nurses\":\"夜勤病栋\",\"library of ruina\":\"废墟图书馆\",\"dark gathering\":\"黑暗集会\",\"reverse 1999\":\"重返未来：1999\",\"peanuts\":\"花生\",\"fortnite\":\"堡垒之夜\",\"doom\":\"毁灭战士\",\"snowbreak containment zone\":\"尘白禁区\",\"wuthering waves\":\"鸣潮\",\"baldurs gate\":\"博德之门\",\"tenshi no 3p\":\"天使的3P\",\"apex legends\":\"Apex英雄\",\"brawl stars\":\"荒野乱斗\",\"yoru no kurage wa oyogenai\":\"夜晚的水母不会游泳\",\"battlefield\":\"战地风云\",\"girls band cry\":\"少女哭泣乐队\",\"helldivers\":\"绝地潜兵\",\"cross core\":\"交错战线\",\"seitokai ni mo ana wa aru\":\"脑洞学生会\",\"wan sheng jie\":\"万圣街\",\"make heroine ga oosugiru\":\"败犬女主太多了！\",\"tokidoki bosotto russia-go de dereru tonari no alya-san\":\"不时轻声地以俄语遮羞的邻座艾莉同学\",\"doupo cangqiong\":\"斗破苍穹\",\"nige jouzu no wakagimi\":\"擅长逃跑的殿下\",\"the flash\":\"闪电侠\",\"wonderful precure\":\"美妙宠物 光之美少女\",\"katsute mahou shoujo to aku wa tekitai shite ita.\":\"魔法少女与邪恶曾经敌对。\",\"maplestory\":\"冒险岛\",\"tengoku daimakyou\":\"天国大魔境\",\"black myth wukong\":\"黑神话：悟空\",\"h2o footprints in the sand\":\"H2O 沙中足迹\",\"shikanoko nokonoko koshitantan\":\"鹿乃子乃子虎视眈眈\",\"tensei shitara dainana ouji datta node kimama ni majutsu o kiwamemasu\":\"转生七王子的魔法全解\",\"dandadan\":\"当哒当\",\"the coffin of andy and leyley\":\"安迪和莱利的棺材\",\"kanpani girls\":\"企业少女\",\"tenkafuma\":\"天下布魔\",\"kaitou tenshi twin angel\":\"快盗天使双胞胎\"},\"character\":{\"alice\":\"爱丽丝\",\"akane hino\":\"日野茜\",\"ibuki\":\"伊吹\",\"yui\":\"由依 | 结衣\",\"hisui\":\"翡翠 | 飞彗\",\"rider\":\"Rider | 龙女\",\"maya\":\"摩耶\",\"jeanne darc\":\"圣女贞德\",\"katsuragi\":\"葛城\",\"kasumi\":\"霞\",\"leo\":\"丽王 | 利昂\",\"haruna\":\"榛名 | 春奈\",\"chitose\":\"千岁\",\"murakumo\":\"丛 | 丛云\",\"nachi\":\"那智\",\"kagura\":\"神乐\",\"ram\":\"拉姆\",\"ink nijihara\":\"虹原茵可\",\"pastel ink\":\"闪亮茵可\",\"sumi kuroi\":\"黑威澄\",\"alice shiratori\":\"白鸟爱丽丝\",\"reimu hakurei\":\"博丽灵梦\",\"marisa kirisame\":\"雾雨魔理沙\",\"mima\":\"魅魔\",\"sariel\":\"萨丽爱尔\",\"chiyuri kitashirakawa\":\"北白河千百合\",\"yumemi okazaki\":\"冈崎梦美\",\"elly\":\"艾丽\",\"gengetsu\":\"幻月\",\"mugetsu\":\"梦月\",\"kurumi\":\"胡桃\",\"yumeko\":\"梦子\",\"shinki\":\"神绮\",\"rumia\":\"露米娅\",\"daiyousei\":\"大妖精\",\"cirno\":\"琪露诺\",\"hong meiling\":\"红美铃\",\"koakuma\":\"小恶魔\",\"patchouli knowledge\":\"帕秋莉·诺蕾姬\",\"sakuya izayoi\":\"十六夜咲夜\",\"remilia scarlet\":\"蕾米莉亚·斯卡雷特\",\"flandre scarlet\":\"芙兰朵露·斯卡雷特\",\"letty whiterock\":\"蕾迪·霍瓦特罗克\",\"chen\":\"橙\",\"alice margatroid\":\"爱丽丝·玛格特洛依德\",\"shanghai\":\"上海人偶\",\"hourai\":\"蓬莱人偶\",\"lily white\":\"莉莉霍瓦特\",\"lily black\":\"莉莉黑\",\"lunasa prismriver\":\"露娜萨·普莉兹姆利巴\",\"merlin prismriver\":\"梅露兰·普莉兹姆利巴\",\"lyrica prismriver\":\"莉莉卡·普莉兹姆利巴\",\"youmu konpaku\":\"魂魄妖梦\",\"yuyuko saigyouji\":\"西行寺幽幽子\",\"ran yakumo\":\"八云蓝\",\"yukari yakumo\":\"八云紫\",\"suika ibuki\":\"伊吹萃香\",\"wriggle nightbug\":\"莉格露·奈特巴格\",\"mystia lorelei\":\"米斯蒂娅·萝蕾拉\",\"keine kamishirasawa\":\"上白泽慧音\",\"tewi inaba\":\"因幡帝\",\"reisen udongein inaba\":\"铃仙·优昙华院·因幡\",\"eirin yagokoro\":\"八意永琳\",\"kaguya houraisan\":\"蓬莱山辉夜\",\"fujiwara no mokou\":\"藤原妹红\",\"aya shameimaru\":\"射命丸文\",\"medicine melancholy\":\"梅蒂欣·梅兰可莉\",\"yuuka kazami\":\"风见幽香\",\"komachi onozuka\":\"小野塚小町\",\"eiki shiki\":\"四季映姬·亚玛萨那度\",\"shizuha aki\":\"秋静叶\",\"minoriko aki\":\"秋穰子\",\"hina kagiyama\":\"键山雏\",\"nitori kawashiro\":\"河城荷取\",\"momiji inubashiri\":\"犬走椛\",\"sanae kochiya\":\"东风谷早苗\",\"kanako yasaka\":\"八坂神奈子\",\"suwako moriya\":\"洩矢诹访子\",\"iku nagae\":\"永江衣玖\",\"tenshi hinanai\":\"比那名居天子\",\"kisume\":\"琪斯美\",\"yamame kurodani\":\"黑谷山女\",\"parsee mizuhashi\":\"水桥帕露西\",\"yuugi hoshiguma\":\"星熊勇仪\",\"satori komeiji\":\"古明地觉\",\"rin kaenbyou\":\"火焰猫燐\",\"utsuho reiuji\":\"灵乌路空\",\"koishi komeiji\":\"古明地恋\",\"nazrin\":\"纳兹琳\",\"kogasa tatara\":\"多多良小伞\",\"ichirin kumoi\":\"云居一轮\",\"unzan\":\"云山\",\"minamitsu murasa\":\"村纱水蜜\",\"shou toramaru\":\"寅丸星\",\"byakuren hijiri\":\"圣白莲\",\"nue houjuu\":\"封兽鵺\",\"hatate himekaidou\":\"姬海棠果\",\"kyouko kasodani\":\"幽谷响子\",\"yoshika miyako\":\"宫古芳香\",\"seiga kaku\":\"霍青娥\",\"soga no tojiko\":\"苏我屠自古\",\"mononobe no futo\":\"物部布都\",\"toyosatomimi no miko\":\"丰聪耳神子\",\"mamizou futatsuiwa\":\"二岩猯藏\",\"hata no kokoro\":\"秦心\",\"wakasagihime\":\"若鹭姬\",\"sekibanki\":\"赤蛮奇\",\"kagerou imaizumi\":\"今泉影狼\",\"benben tsukumo\":\"九十九弁弁\",\"yatsuhashi tsukumo\":\"九十九八桥\",\"seija kijin\":\"鬼人正邪\",\"shinmyoumaru sukuna\":\"少名针妙丸\",\"raiko horikawa\":\"堀川雷鼓\",\"sumireko usami\":\"宇佐见堇子\",\"seiran\":\"清兰\",\"ringo\":\"铃瑚\",\"doremy sweet\":\"哆来咪·苏伊特\",\"sagume kishin\":\"稀神探女\",\"clownpiece\":\"克劳恩皮丝\",\"junko\":\"纯狐\",\"hecatia lapislazuli\":\"赫卡提亚·拉碧斯拉祖利\",\"joon yorigami\":\"依神女苑\",\"shion yorigami\":\"依神紫苑\",\"eternity larva\":\"爱塔妮缇拉尔瓦\",\"nemuno sakata\":\"坂田合欢乃\",\"aunn komano\":\"高丽野阿吽\",\"narumi yatadera\":\"矢田寺成美\",\"satono nishida\":\"尔子田里乃\",\"mai teireida\":\"丁礼田舞\",\"okina matara\":\"摩多罗隐岐奈\",\"eika ebisu\":\"戎璎花\",\"urumi ushizaki\":\"牛崎润美\",\"kutaka niwatari\":\"庭渡久侘歌\",\"yachie kicchou\":\"吉吊八千慧\",\"mayumi joutouguu\":\"杖刀偶磨弓\",\"keiki haniyasushin\":\"埴安神袿姬\",\"saki kurokoma\":\"骊驹早鬼\",\"mike goutokuji\":\"豪德寺三花\",\"takane yamashiro\":\"山城高岭\",\"sannyo komakusa\":\"驹草山如\",\"misumaru tamatsukuri\":\"玉造魅须丸\",\"tsukasa kudamaki\":\"菅牧典\",\"megumu iizunamaru\":\"饭纲丸龙\",\"chimata tenkyuu\":\"天弓千亦\",\"momoyo himemushi\":\"姬虫百百世\",\"tokiko\":\"朱鹭子\",\"rinnosuke morichika\":\"森近霖之助\",\"sunny milk\":\"桑尼米尔克\",\"luna child\":\"露娜切露德\",\"star sapphire\":\"斯塔萨菲雅\",\"watatsuki no toyohime\":\"绵月丰姬\",\"watatsuki no yorihime\":\"绵月依姬\",\"hieda no akyuu\":\"稗田阿求\",\"kasen ibara\":\"茨木华扇\",\"kosuzu motoori\":\"本居小铃\",\"miyoi okunoda\":\"奥野田美宵\",\"renko usami\":\"宇佐见莲子\",\"maribel han\":\"玛艾露贝莉·赫恩\",\"hakurei miko\":\"先代巫女\",\"honoka kosaka\":\"高坂穗乃果\",\"yukiho kosaka\":\"高坂雪穗\",\"eli ayase\":\"绚濑绘里\",\"arisa ayase\":\"绚濑亚里沙\",\"kotori minami\":\"南小鸟\",\"umi sonoda\":\"园田海未\",\"rin hoshizora\":\"星空凛\",\"maki nishikino\":\"西木野真姬\",\"nozomi tojo\":\"东条希\",\"hanayo koizumi\":\"小泉花阳\",\"nico yazawa\":\"矢泽妮可\",\"tsubasa kira\":\"绮罗翼\",\"erena toudou\":\"统堂英玲奈\",\"anju yuuki\":\"优木杏树\",\"chika takami\":\"高海千歌\",\"riko sakurauchi\":\"樱内梨子\",\"kanan matsuura\":\"松浦果南\",\"dia kurosawa\":\"黑泽黛雅\",\"you watanabe\":\"渡边曜\",\"tsuki watanabe\":\"渡边月\",\"yoshiko tsushima\":\"津岛善子\",\"hanamaru kunikida\":\"国木田花丸\",\"mari ohara\":\"小原鞠莉\",\"ruby kurosawa\":\"黑泽露比\",\"seira kazuno\":\"鹿角圣良\",\"ria kazuno\":\"鹿角理亚\",\"ayumu uehara\":\"上原步梦\",\"kasumi nakasu\":\"中须霞\",\"shizuku osaka\":\"樱坂雫\",\"karin asaka\":\"朝香果林\",\"ai miyashita\":\"宫下爱\",\"kanata konoe\":\"近江彼方\",\"haruka konoe\":\"近江遥\",\"setsuna yuki\":\"优木雪菜\",\"emma verde\":\"艾玛·维尔德\",\"rina tennoji\":\"天王寺璃奈\",\"rensouhou-chan\":\"连装炮酱\",\"chiyoda\":\"千代田\",\"akebono\":\"曙\",\"ushio\":\"潮\",\"ikazuchi\":\"雷\",\"kamoi\":\"神威\",\"maruyu\":\"丸输\",\"z3\":\"Z3\",\"italia\":\"意大利\",\"luigi torelli\":\"路易吉·托雷利\",\"iona\":\"伊欧娜\",\"mamiya\":\"间宫\",\"shikikan\":\"指挥官\",\"ka-class\":\"潜艇KA级\",\"so-class\":\"潜艇SO级\",\"ri-class\":\"重巡RI级\",\"re-class\":\"战舰RE级\",\"ta-class\":\"战舰TA级\",\"wo-class\":\"空母WO级\",\"teitoku\":\"提督\",\"nagato\":\"长门\",\"mutsu\":\"陆奥\",\"ise\":\"伊势\",\"hyuuga\":\"日向\",\"yukikaze\":\"雪风\",\"akagi\":\"赤城\",\"kaga\":\"加贺\",\"souryuu\":\"苍龙\",\"hiryuu\":\"飞龙\",\"shimakaze\":\"岛风\",\"fubuki\":\"吹雪\",\"shirayuki\":\"白雪\",\"hatsuyuki\":\"初雪\",\"miyuki\":\"深雪\",\"isonami\":\"矶波\",\"ayanami\":\"绫波\",\"shikinami\":\"敷波\",\"ooi\":\"大井\",\"kitakami\":\"北上\",\"kongou\":\"金刚\",\"hiei\":\"比睿\",\"kirishima\":\"雾岛\",\"houshou\":\"凤翔\",\"fusou\":\"扶桑\",\"yamashiro\":\"山城\",\"tenryuu\":\"天龙\",\"tatsuta\":\"龙田\",\"ryuujou\":\"龙骧\",\"mutsuki\":\"睦月\",\"kisaragi\":\"如月\",\"satsuki\":\"皋月\",\"fumizuki\":\"文月\",\"nagatsuki\":\"长月\",\"kikuzuki\":\"菊月\",\"mikazuki\":\"三日月\",\"mochizuki\":\"望月\",\"kuma\":\"球磨\",\"tama\":\"多摩\",\"kiso\":\"木曾\",\"nagara\":\"长良\",\"isuzu\":\"五十铃\",\"natori\":\"名取\",\"yura\":\"由良\",\"sendai\":\"川内\",\"jintsuu\":\"神通\",\"naka\":\"那珂\",\"mogami\":\"最上\",\"furutaka\":\"古鹰\",\"kako\":\"加古\",\"aoba\":\"青叶\",\"myoukou\":\"妙高\",\"ashigara\":\"足柄\",\"haguro\":\"羽黑\",\"takao\":\"高雄\",\"atago\":\"爱宕\",\"choukai\":\"鸟海\",\"tone\":\"利根\",\"chikuma\":\"筑摩\",\"hiyou\":\"飞鹰\",\"junyou\":\"隼鹰\",\"oboro\":\"胧\",\"sazanami\":\"涟\",\"akatsuki\":\"晓\",\"hibiki\":\"响\",\"inazuma\":\"电\",\"hatsuharu\":\"初春\",\"nenohi\":\"子日\",\"wakaba\":\"若叶\",\"hatsushimo\":\"初霜\",\"shiratsuyu\":\"白露\",\"shigure\":\"时雨\",\"murasame\":\"村雨\",\"yuudachi\":\"夕立\",\"samidare\":\"五月雨\",\"suzukaze\":\"凉风\",\"asashio\":\"朝潮\",\"ooshio\":\"大潮\",\"michishio\":\"满潮\",\"arashio\":\"荒潮\",\"arare\":\"霰\",\"kagerou\":\"阳炎\",\"shiranui\":\"不知火\",\"kuroshio\":\"黑潮\",\"shouhou\":\"祥凤\",\"shoukaku\":\"翔鹤\",\"zuikaku\":\"瑞鹤\",\"kinu\":\"鬼怒\",\"abukuma\":\"阿武隈\",\"yuubari\":\"夕张\",\"zuihou\":\"瑞凤\",\"mikuma\":\"三隈\",\"hatsukaze\":\"初风\",\"maikaze\":\"舞风\",\"kinugasa\":\"衣笠\",\"i-19\":\"伊19\",\"suzuya\":\"铃谷\",\"kumano\":\"熊野\",\"i-168\":\"伊168\",\"i-58\":\"伊58\",\"i-8\":\"伊8\",\"yamato\":\"大和\",\"akigumo\":\"秋云\",\"yuugumo\":\"夕云\",\"makigumo\":\"卷云\",\"naganami\":\"长波\",\"agano\":\"阿贺野\",\"noshiro\":\"能代\",\"yahagi\":\"矢矧\",\"sakawa\":\"酒匂\",\"musashi\":\"武藏\",\"taihou\":\"大凤\",\"katori\":\"香取\",\"i-401\":\"伊401\",\"akitsu maru\":\"秋津丸\",\"yayoi\":\"弥生\",\"uzuki\":\"卯月\",\"isokaze\":\"矶风\",\"urakaze\":\"浦风\",\"tanikaze\":\"谷风\",\"hamakaze\":\"滨风\",\"bismarck\":\"俾斯麦\",\"z1\":\"Z1\",\"prinz eugen\":\"欧根亲王\",\"amatsukaze\":\"天津风\",\"akashi\":\"明石\",\"ooyodo\":\"大淀\",\"taigei\":\"大鲸\",\"ryuuhou\":\"龙凤\",\"tokitsukaze\":\"时津风\",\"unryuu\":\"云龙\",\"amagi\":\"天城\",\"harusame\":\"春雨\",\"hayashimo\":\"早霜\",\"kiyoshimo\":\"清霜\",\"asagumo\":\"朝云\",\"yamagumo\":\"山云\",\"nowaki\":\"野分\",\"akizuki\":\"秋月\",\"teruzuki\":\"照月\",\"hatsuzuki\":\"初月\",\"takanami\":\"高波\",\"asashimo\":\"朝霜\",\"u-511\":\"U-511\",\"graf zeppelin\":\"齐柏林伯爵\",\"saratoga\":\"萨拉托加\",\"ro-500\":\"吕500\",\"warspite\":\"厌战\",\"iowa\":\"衣阿华\",\"littorio\":\"利托里奥\",\"roma\":\"罗马\",\"libeccio\":\"西南风\",\"aquila\":\"天鹰\",\"akitsushima\":\"秋津洲\",\"zara\":\"扎拉\",\"pola\":\"波拉\",\"mizuho\":\"瑞穗\",\"okinami\":\"冲波\",\"kazagumo\":\"风云\",\"arashi\":\"岚\",\"hagikaze\":\"萩风\",\"oyashio\":\"亲潮\",\"yamakaze\":\"山风\",\"umikaze\":\"海风\",\"kawakaze\":\"江风\",\"hayasui\":\"速吸\",\"kashima\":\"鹿岛\",\"kamikaze\":\"神风\",\"asakaze\":\"朝风\",\"harukaze\":\"春风\",\"matsukaze\":\"松风\",\"hatakaze\":\"旗风\",\"amagiri\":\"天雾\",\"sagiri\":\"狭雾\",\"minazuki\":\"水无月\",\"i-26\":\"伊26\",\"hamanami\":\"滨波\",\"fujinami\":\"藤波\",\"uranami\":\"浦波\",\"commandant teste\":\"特斯特长官\",\"richelieu\":\"黎塞留\",\"i-400\":\"伊400\",\"i-13\":\"伊13\",\"i-14\":\"伊14\",\"gangut\":\"甘古特\",\"tashkent\":\"塔什干\",\"ark royal\":\"皇家方舟\",\"shimushu\":\"占守\",\"kunashiri\":\"国后\",\"jervis\":\"贾维斯 | 杰维斯\",\"suzutsuki\":\"凉月\",\"etorofu\":\"择捉\",\"matsuwa\":\"松轮\",\"sado\":\"佐渡\",\"tsushima\":\"对马\",\"gambier bay\":\"甘比尔湾\",\"intrepid\":\"无畏\",\"johnston\":\"约翰斯顿\",\"maestrale\":\"西北风\",\"fletcher\":\"弗莱彻\",\"unicorn\":\"独角兽\",\"belfast\":\"贝尔法斯特\",\"illustrious\":\"光辉\",\"terror\":\"恐怖\",\"vampire\":\"吸血鬼\",\"laffey\":\"拉菲\",\"eldridge\":\"埃尔德里奇\",\"prince of wales\":\"威尔士亲王\",\"sheffield\":\"谢菲尔德\",\"ping hai\":\"平海\",\"ning hai\":\"宁海\",\"formidable\":\"可畏\",\"admiral hipper\":\"希佩尔海军上将\",\"portland\":\"波特兰\",\"cygnet\":\"小天鹅\",\"kent\":\"肯特\",\"hammann\":\"哈曼\",\"mikasa\":\"三笠\",\"st. louis\":\"圣路易斯\",\"san diego\":\"圣地亚哥\",\"long island\":\"长岛\",\"javelin\":\"标枪\",\"nelson\":\"纳尔逊\",\"rodney\":\"罗德尼\",\"enterprise\":\"企业\",\"queen elizabeth\":\"伊丽莎白女王\",\"victorious\":\"胜利\",\"ajax\":\"阿贾克斯\",\"cleveland\":\"克利夫兰\",\"honolulu\":\"火奴鲁鲁\",\"z46\":\"Z46\",\"z23\":\"Z23\",\"tirpitz\":\"提尔比茨\",\"duke of york\":\"约克公爵\",\"bache\":\"贝奇\",\"sirius\":\"天狼星\",\"sims\":\"西姆斯\",\"colorado\":\"科罗拉多\",\"kuubo seiki\":\"空母栖姬\",\"kuubo suiki\":\"空母水鬼\",\"soukou kuuboki\":\"装甲空母姬\",\"senkan seiki\":\"战舰栖姬\",\"hoppou seiki\":\"北方栖姬\",\"nanpou seiki\":\"南方栖鬼\",\"shuusekichi seiki\":\"集积地栖姬\",\"ritou seiki\":\"离岛栖姬\",\"kouwan seiki\":\"港湾栖姬\",\"chuukan seiki\":\"中间栖姬\",\"hikoujouki\":\"飞行场姬\",\"lion\":\"狮\",\"kagero\":\"阳炎\",\"el condor pasa\":\"神鹰\",\"perth\":\"珀斯\",\"renown\":\"声望\",\"chang chun\":\"长春\",\"gotland\":\"哥特兰\",\"grecale\":\"东北风\",\"bremerton\":\"布莱默顿\",\"roon\":\"罗恩\",\"dido\":\"黛朵\",\"baltimore\":\"巴尔的摩\",\"producer\":\"制作人\",\"haruka amami\":\"天海春香\",\"chihaya kisaragi\":\"如月千早\",\"yukiho hagiwara\":\"萩原雪步\",\"yayoi takatsuki\":\"高槻弥生\",\"kasumi takatsuki\":\"高槻霞\",\"ritsuko akizuki\":\"秋月律子\",\"azusa miura\":\"三浦梓\",\"iori minase\":\"水濑伊织\",\"makoto kikuchi\":\"菊地真\",\"ami futami\":\"双海亚美\",\"mami futami\":\"双海真美\",\"miki hoshii\":\"星井美希\",\"hibiki ganaha\":\"我那霸响\",\"takane shijou\":\"四条贵音\",\"kotori otonashi\":\"音无小鸟\",\"ai hidaka\":\"日高爱\",\"mai hidaka\":\"日高舞\",\"eri mizutani\":\"水谷绘理\",\"ryo akizuki\":\"秋月凉\",\"uzuki shimamura\":\"岛村卯月\",\"yukari mizumoto\":\"水本紫\",\"mai fukuyama\":\"福山舞\",\"kanako mimura\":\"三村加奈子\",\"miho kohinata\":\"小日向美穗\",\"chieri ogata\":\"绪方智绘里\",\"kyoko igarashi\":\"五十岚响子\",\"momoka sakurai\":\"樱井桃华\",\"yumeko sakurai\":\"樱井梦子\",\"hasumi nagatomi\":\"长富莲实\",\"chika yokoyama\":\"横山千佳\",\"miku maekawa\":\"前川未来\",\"saya matsubara\":\"松原早耶\",\"yukino aihara\":\"相原雪乃\",\"frederica miyamoto\":\"宫本芙蕾德莉卡\",\"sae kobayakawa\":\"小早川纱枝\",\"kotoka saionji\":\"西园寺琴歌\",\"anzu futaba\":\"双叶杏\",\"satomi sakakibara\":\"榊原里美\",\"sachiko koshimizu\":\"舆水幸子\",\"yuriko ohnishi\":\"大西由里子\",\"nana abe\":\"安部菜菜\",\"nene kurihara\":\"栗原宁宁\",\"koharu koga\":\"古贺小春\",\"akiha ikebukuro\":\"池袋晶叶\",\"yuu ohta\":\"太田优\",\"mayu sakuma\":\"佐久间麻由\",\"mirei hayasaka\":\"早坂美玲\",\"rina fujimoto\":\"藤本里奈\",\"michiru ohara\":\"大原满\",\"hotaru shiragiku\":\"白菊萤\",\"kozue yusa\":\"游佐梢\",\"kurumi ohnuma\":\"大沼胡桃\",\"shiki ichinose\":\"一之濑志希\",\"yuuki otokura\":\"乙仓悠贵\",\"rin shibuya\":\"涩谷凛\",\"sarina matsumoto\":\"松本沙理奈\",\"mizuki kawashima\":\"川岛瑞树\",\"nao kamiya\":\"神谷奈绪\",\"haruna kamijou\":\"上条春菜\",\"hina araki\":\"荒木比奈\",\"ai togo\":\"东乡爱\",\"riina tada\":\"多田李衣菜\",\"seira mizuki\":\"水木圣来\",\"chie sasaki\":\"佐佐木千枝\",\"miyu mifune\":\"三船美优\",\"manami kiba\":\"木场真奈美\",\"hajime fujiwara\":\"藤原肇\",\"helen\":\"海伦\",\"noa takamine\":\"高峰诺亚\",\"kaede takagaki\":\"高垣枫\",\"ranko kanzaki\":\"神崎兰子\",\"karen hojo\":\"北条加莲\",\"honoka ayase\":\"绫濑穗乃香\",\"yukimi sajo\":\"佐城雪美\",\"rumi wakui\":\"和久井留美\",\"kako takafuji\":\"鹰富士茄子\",\"koume shirasaka\":\"白坂小梅\",\"mutsumi ujiie\":\"氏家睦\",\"yume narumiya\":\"成宫由爱\",\"syuko shiomi\":\"盐见周子\",\"minami nitta\":\"新田美波\",\"kanade hayami\":\"速水奏\",\"izumi ohishi\":\"大石泉\",\"chizuru matsuo\":\"松尾千鹤\",\"arisu tachibana\":\"橘爱丽丝\",\"nono morikubo\":\"森久保乃乃\",\"anastasia\":\"安娜斯塔西娅\",\"aki yamato\":\"大和亚季\",\"haru yuuki\":\"结城晴\",\"fumika sagisawa\":\"鹭泽文香\",\"layla\":\"莱拉 | 莱依拉\",\"asuka ninomiya\":\"二宫飞鸟\",\"nanami asari\":\"浅利七海\",\"mio honda\":\"本田未央\",\"aiko takamori\":\"高森蓝子\",\"kaoru ryuzaki\":\"龙崎薰\",\"natsuki kimura\":\"木村夏树\",\"miria akagi\":\"赤城米莉亚\",\"yui ohtsuki\":\"大槻唯\",\"yuki himekawa\":\"姬川友纪\",\"yuzu kitami\":\"喜多见柚\",\"naho ebihara\":\"海老原菜帆\",\"shizuku oikawa\":\"及川雫\",\"reina koseki\":\"小关丽奈\",\"yumi aiba\":\"相叶夕美\",\"tomoka wakabayashi\":\"若林智香\",\"mika jougasaki\":\"城崎美嘉\",\"rika jougasaki\":\"城崎莉嘉\",\"kirari moroboshi\":\"诸星琪拉莉\",\"airi totoki\":\"十时爱梨\",\"natalia\":\"娜塔莉亚\",\"takumi mukai\":\"向井拓海\",\"eve santaclaus\":\"伊芙·珊德克罗丝\",\"nina ichihara\":\"市原仁奈\",\"hinako kita\":\"喜多日菜子\",\"mary cochran\":\"玛丽·柯克兰\",\"ayame hamaguchi\":\"滨口菖蒲\",\"syoko hoshi\":\"星辉子\",\"ako tsuchiya\":\"土屋亚子\",\"sanae katagiri\":\"片桐早苗\",\"yuko hori\":\"堀裕子\",\"kai nishijima\":\"西岛櫂\",\"risa matoba\":\"的场梨沙\",\"tokiko zaizen\":\"财前时子\",\"shin sato\":\"佐藤心\",\"yoshino yorita\":\"依田芳乃\",\"chihiro senkawa\":\"千川千寻\",\"mirai kasuga\":\"春日未来\",\"hinata kinoshita\":\"木下日向\",\"julia\":\"茱莉亚\",\"sayoko takayama\":\"高山纱代子\",\"kotoha tanaka\":\"田中琴叶\",\"tomoka tenkubashi\":\"天空桥朋花\",\"serika hakozaki\":\"箱崎星梨花\",\"arisa matsuda\":\"松田亚利沙\",\"shizuka mogami\":\"最上静香\",\"anna mochizuki\":\"望月杏奈\",\"emily stewart\":\"艾米莉·司徒亚特\",\"tamaki ogami\":\"大神环\",\"reika kitakami\":\"北上丽花\",\"umi kousaka\":\"高坂海美\",\"minako satake\":\"佐竹美奈子\",\"elena shimabara\":\"岛原埃琳娜\",\"subaru nagayoshi\":\"永吉昴\",\"konomi baba\":\"马场木实\",\"noriko fukuda\":\"福田法子\",\"mizuki makabe\":\"真壁瑞希\",\"rio momose\":\"百濑莉绪\",\"nao yokoyama\":\"横山奈绪\",\"tsubasa ibuki\":\"伊吹翼\",\"shiho kitazawa\":\"北泽志保\",\"karen shinomiya\":\"篠宫可怜\",\"momoko suou\":\"周防桃子\",\"matsuri tokugawa\":\"德川茉莉\",\"megumi tokoro\":\"所惠美\",\"iku nakatani\":\"中谷育\",\"yuriko nanao\":\"七尾百合子\",\"chizuru nikaido\":\"二阶堂千鹤\",\"miya miyao\":\"宫尾美也\",\"roco handa\":\"伴田路子\",\"kaori sakuramori\":\"樱守歌织\",\"tsumugi shiraishi\":\"白石䌷\",\"mishiro\":\"美城常务\",\"touma amagase\":\"天濑冬马\",\"teru tendo\":\"天道辉\",\"minori watanabe\":\"渡边实\",\"shiki iseya\":\"伊濑谷四季\",\"hayato akiyama\":\"秋山隼人\",\"saki mizushima\":\"水岛咲\",\"shiro tachibana\":\"橘志狼\",\"hokuto ijuuin\":\"伊集院北斗\",\"kaoru sakuraba\":\"樱庭薫\",\"rei kagura\":\"神乐丽\",\"kyoji takajo\":\"鹰城恭二\",\"kyosuke aoi\":\"苍井享介\",\"jun fuyumi\":\"冬美旬\",\"natsuki sakaki\":\"榊夏来\",\"nao okamura\":\"冈村直央\",\"shouta mitarai\":\"御手洗翔太\",\"tsubasa kashiwagi\":\"柏木翼\",\"kei tsuzuki\":\"都筑圭\",\"pierre\":\"皮埃尔\",\"yusuke aoi\":\"苍井悠介\",\"haruna wakazato\":\"若里春名\",\"makio uzuki\":\"卯月卷绪\",\"kanon himeno\":\"姬野花音\",\"mano sakuragi\":\"樱木真乃\",\"hiori kazano\":\"风野灯织\",\"meguru hachimiya\":\"八宫缭\",\"mamimi tanaka\":\"田中摩美美\",\"kiriko yukoku\":\"幽谷雾子\",\"kogane tsukioka\":\"月冈恋钟\",\"yuika mitsumine\":\"三峰结华\",\"sakuya shirase\":\"白濑咲耶\",\"amana osaki\":\"大崎甘奈\",\"chiyuki kuwayama\":\"桑山千雪\",\"tenka osaki\":\"大崎甜花\",\"kaho komiya\":\"小宫果穂\",\"chiyoko sonoda\":\"园田智代子\",\"juri saijo\":\"西城树里\",\"rinze morino\":\"杜野凛世\",\"natsuha arisugawa\":\"有栖川夏叶\",\"hazuki nanakusa\":\"七草叶月\",\"nichika nanakusa\":\"七草日花\",\"arisa mochida\":\"持田亚里沙\",\"fuyuko mayuzumi\":\"黛冬优子\",\"mei izumi\":\"和泉爱依\",\"asahi serizawa\":\"芹泽朝阳\",\"akira sunazuka\":\"砂冢明\",\"riamu yumemi\":\"梦见璃亚梦\",\"madoka higuchi\":\"樋口圆香\",\"koito fukumaru\":\"福丸小糸\",\"toru asakura\":\"浅仓透\",\"hinana ichikawa\":\"市川雏菜\",\"rookie trainer\":\"新手训练员\",\"veteran trainer\":\"高手训练员\",\"mario\":\"马里奥\",\"luigi\":\"路易吉\",\"yoshi\":\"耀西\",\"wario\":\"瓦里奥\",\"waluigi\":\"瓦路易吉\",\"bowser\":\"库巴\",\"wendy o. koopa\":\"温蒂库巴\",\"super crown bowser\":\"库巴姬\",\"princess peach\":\"碧奇公主\",\"princess daisy\":\"黛西公主\",\"rosalina\":\"罗塞塔\",\"pauline\":\"波琳\",\"boo\":\"布布\",\"super crown boo\":\"幽灵姬\",\"toad\":\"奇诺比奥\",\"toadette\":\"奇诺比珂\",\"donkey kong\":\"森喜刚\",\"diddy kong\":\"狄狄刚\",\"dixie kong\":\"狄可西刚\",\"applejack\":\"苹果杰克\",\"fluttershy\":\"小蝶\",\"pinkie pie\":\"萍琪派\",\"rainbow dash\":\"云宝黛茜\",\"rarity\":\"瑞瑞\",\"twilight sparkle\":\"暮光闪闪\",\"princess celestia\":\"塞拉斯蒂娅公主\",\"princess luna\":\"露娜公主\",\"princess cadance\":\"韵律公主\",\"shining armor\":\"银甲闪闪\",\"starlight glimmer\":\"星光熠熠\",\"sunset shimmer\":\"余晖烁烁\",\"apple bloom\":\"小萍花\",\"scootaloo\":\"飞板璐\",\"sweetie belle\":\"甜贝儿\",\"big macintosh\":\"大麦哥\",\"marble pie\":\"玉琪派\",\"trixie\":\"崔克西\",\"spitfire\":\"飞火\",\"octavia\":\"奥塔维雅\",\"vinyl scratch\":\"DJ3号\",\"derpy hooves\":\"小呆\",\"discord\":\"无序\",\"diamond tiara\":\"珠玉冠冠\",\"silver spoon\":\"白银勺勺\",\"princess ember\":\"余焰公主\",\"queen chrysalis\":\"邪茧女王\",\"sonata dusk\":\"索娜塔\",\"aqua\":\"阿库娅\",\"megumin\":\"惠惠\",\"kazuma satou\":\"佐藤和真\",\"darkness\":\"达克妮丝\",\"yunyun\":\"悠悠\",\"wiz\":\"维兹\",\"chris\":\"克莉丝\",\"kokoa hoto\":\"保登心爱\",\"chino kafuu\":\"香风智乃\",\"rize tedeza\":\"天天座理世\",\"chiya ujimatsu\":\"宇治松千夜\",\"sharo kirima\":\"桐间纱路\",\"maya jouga\":\"条河麻耶\",\"megumi natsu\":\"奈津惠\",\"mocha hoto\":\"保登摩卡\",\"midori aoyama\":\"青山翠\",\"kanade amakusa\":\"甘草奏\",\"chocolat\":\"裘可拉\",\"ayame reikadou\":\"丽华堂绚女\",\"oka yuoji\":\"游王子讴歌\",\"furano yukihira\":\"雪平富良野\",\"chiwa harusaki\":\"春咲千和\",\"eita kidou\":\"季堂锐太\",\"masuzu natsukawa\":\"夏川真凉\",\"himeka akishino\":\"秋篠姬香\",\"ai fuyuumi\":\"冬海爱衣\",\"kyousuke kousaka\":\"高坂京介\",\"kirino kousaka\":\"高坂桐乃\",\"ruri gokou\":\"五更琉璃（黑猫）\",\"ayase aragaki\":\"新垣绫濑\",\"saori makishima\":\"槙岛沙织（沙织·巴吉纳）\",\"kanako kurusu\":\"来栖加奈子\",\"bridget evans\":\"布莉姬·伊凡斯\",\"sena akagi\":\"赤城濑菜\",\"kouhei akagi\":\"赤城浩平\",\"manami tamura\":\"田村麻奈实\",\"daisuke kousaka\":\"高坂大介\",\"tamaki gokou\":\"五更珠希\",\"hinata gokou\":\"五更日向\",\"ria hagry\":\"莉亚·哈格丽\",\"azusa nakano\":\"中野梓\",\"jun suzuki\":\"铃木纯\",\"mio akiyama\":\"秋山澪\",\"ritsu tainaka\":\"田井中律\",\"sawako yamanaka\":\"山中佐和子\",\"tsumugi kotobuki\":\"琴吹䌷\",\"ui hirasawa\":\"平泽忧\",\"yui hirasawa\":\"平泽唯\",\"nodoka manabe\":\"真锅和\",\"satoshi tainaka\":\"田井中聪\",\"sumire saitou\":\"齐藤堇\",\"megumi sokabe\":\"曾我部惠\",\"luste teuber\":\"露斯特·特依巴\",\"spiritia rosenberg\":\"斯匹莉缇娅·罗森伯格\",\"yui yuigahama\":\"由比滨结衣\",\"hachiman hikigaya\":\"比企谷八幡\",\"komachi hikigaya\":\"比企谷小町\",\"saki kawasaki\":\"川崎沙希\",\"keika kawasaki\":\"川崎桂花\",\"yoshiteru zaimokuza\":\"材木座义辉\",\"yukino yukinoshita\":\"雪之下雪乃\",\"iroha isshiki\":\"一色彩羽\",\"hayato hayama\":\"叶山隼人\",\"saika totsuka\":\"户冢彩加\",\"haruno yukinoshita\":\"雪之下阳乃\",\"shizuka hiratsuka\":\"平冢静\",\"yuuta togashi\":\"富㭴勇太\",\"yumeha togashi\":\"富㭴梦叶\",\"rikka takanashi\":\"小鸟游六花\",\"kumin tsuyuri\":\"五月七日茴香\",\"shinka nibutani\":\"丹生谷森夏\",\"sanae dekomori\":\"凸守早苗\",\"satone shichimiya\":\"七宫智音\",\"touka takanashi\":\"小鸟游十花\",\"mercy\":\"天使\",\"tracer\":\"猎空\",\"widowmaker\":\"黑百合\",\"mei\":\"美\",\"d.va\":\"D.VA\",\"zarya\":\"查莉娅\",\"genjii\":\"源氏\",\"junkrat\":\"狂鼠\",\"roadhog\":\"路霸\",\"pharah\":\"法老之鹰\",\"soldier 76\":\"士兵：76\",\"symmetra\":\"秩序之光\",\"winston\":\"温斯顿\",\"sombra\":\"黑影\",\"ana\":\"安娜\",\"ashe\":\"艾什\",\"cortana\":\"科塔娜\",\"gordon freeman\":\"戈登·弗里曼\",\"alyx vance\":\"爱丽克斯·凡斯\",\"chell\":\"雪儿\",\"emilia\":\"爱蜜莉雅\",\"rem\":\"雷姆\",\"subaru natsuki\":\"菜月昴\",\"beatrice\":\"碧翠丝\",\"felix argyle\":\"菲利克斯·阿盖尔\",\"felt\":\"菲鲁特\",\"roswaal l. mathers\":\"罗兹瓦尔·L·梅札斯\",\"otto suewen\":\"奥托·苏文\",\"julius euclius\":\"由里乌斯·尤克历乌斯\",\"elsa granhiert\":\"艾尔莎·葛兰西尔特\",\"tomoya aki\":\"安艺伦也\",\"megumi kato\":\"加藤惠\",\"utaha kasumigaoka\":\"霞之丘诗羽\",\"michiru hyodo\":\"冰堂美智留\",\"eriri spencer sawamura\":\"泽村·斯宾塞·英梨梨\",\"izumi hashima\":\"波岛出海\",\"kobato hasegawa\":\"羽濑川小鸠\",\"kodaka hasegawa\":\"羽濑川小鹰\",\"rika shiguma\":\"志熊理科\",\"sena kashiwazaki\":\"柏崎星奈\",\"yozora mikazuki\":\"三日月夜空\",\"yukimura kusunoki\":\"楠幸村\",\"maria takayama\":\"高山玛利亚\",\"ageha\":\"扬羽\",\"aimu\":\"蓝梦\",\"aria\":\"亚璃亚\",\"ashiya\":\"芦屋\",\"asuka\":\"飞鸟\",\"ayame\":\"菖蒲\",\"bashou\":\"芭蕉\",\"chihaya\":\"千早\",\"chiyo\":\"千代\",\"daidouji\":\"大道寺前辈\",\"fuga\":\"风雅\",\"fuma\":\"风魔\",\"ginrei\":\"银岭\",\"haruka\":\"春花\",\"hibari\":\"云雀\",\"hijikata\":\"土方\",\"hikage\":\"日影\",\"homura\":\"焰\",\"ikaruga\":\"斑鸠\",\"imu\":\"忌梦\",\"josui\":\"如水\",\"kaede\":\"枫\",\"kagari\":\"篝\",\"kanon\":\"花音\",\"kanzaki\":\"神咲\",\"kochou\":\"胡蝶\",\"kumi\":\"九魅\",\"kuroudo\":\"藏人\",\"mai\":\"舞\",\"meimei\":\"美莓\",\"minori\":\"美野里\",\"mirai\":\"未来\",\"misato\":\"深里\",\"miyabi\":\"雅绯\",\"motochika\":\"元亲\",\"muramasa\":\"村正\",\"murasaki\":\"紫\",\"naraku\":\"奈乐\",\"ryoubi\":\"两备\",\"ryouna\":\"两奈\",\"sakyou\":\"左京\",\"seimei\":\"清明\",\"siki\":\"四季\",\"shiki\":\"四季\",\"souji\":\"总司\",\"suzune\":\"铃音（凛）\",\"syuri\":\"朱璃\",\"ukyou\":\"右京\",\"ushimaru\":\"牛丸\",\"yagyuu\":\"柳生\",\"yomi\":\"咏\",\"yoshimitsu\":\"吉光\",\"yozakura\":\"夜樱\",\"yugiri\":\"夕雾\",\"yumi\":\"雪泉\",\"yuyaki\":\"夕烧\",\"tohru\":\"托尔\",\"kanna kamui\":\"康娜卡姆依\",\"quetzalcoatl\":\"魁札尔科亚特尔\",\"kobayashi-san\":\"小林\",\"shouta magatsuchi\":\"真土翔太\",\"riko saikawa\":\"才川莉子\",\"elma\":\"艾尔玛\",\"ai-chan\":\"小爱\",\"kouhai-chan\":\"后辈\",\"azusa azuki\":\"小豆梓\",\"youto yokodera\":\"横寺阳人\",\"tsukiko tsutsukakushi\":\"筒隐月子\",\"tsukushi tsutsukakushi\":\"筒隐筑紫\",\"mai maimaki\":\"舞牧麻衣\",\"emanuella porlallora\":\"艾米（艾玛努艾勒·波鲁勒劳拉）\",\"tomoya okazaki\":\"冈崎朋也\",\"fuko ibuki\":\"伊吹风子\",\"kotomi ichinose\":\"一之濑琴美\",\"ryou fujibayashi\":\"藤林椋\",\"kyou fujibayashi\":\"藤林杏\",\"nagisa furukawa\":\"古河渚\",\"tomoyo sakagami\":\"坂上智代\",\"yukine miyazawa\":\"宫泽有纪宁\",\"mei sunohara\":\"春原芽衣\",\"youhei sunohara\":\"春原阳平\",\"misae sagara\":\"相乐美佐枝\",\"sanae furukawa\":\"古河早苗\",\"meiko honma\":\"本间芽衣子\",\"naruko anjou\":\"安城鸣子\",\"chiriko tsurumi\":\"鹤见知利子\",\"jinta yadomi\":\"宿海仁太\",\"atsumu matsuyuki\":\"松雪集\",\"hotaru shidare\":\"枝垂萤\",\"kokonotsu shikada\":\"鹿田九\",\"saya endou\":\"远藤彩\",\"hajime owari\":\"尾张一\",\"aoba suzukaze\":\"凉风青叶\",\"hifumi takimoto\":\"泷本日富美\",\"kou yagami\":\"八神光\",\"rin tooyama\":\"远山伦\",\"hajime shinoda\":\"篠田初\",\"yun iijima\":\"饭岛结音\",\"shizuku hazuki\":\"叶月雫\",\"momiji mochizuki\":\"望月红叶\",\"nene sakura\":\"樱宁宁\",\"umiko ahagon\":\"阿波根海子\",\"yamato christina wako\":\"大和·克莉丝汀·和子\",\"aoi miyamori\":\"宫森葵\",\"ema yasuhara\":\"安原绘麻\",\"midori imai\":\"今井绿\",\"shizuka sakaki\":\"坂木静香\",\"misa toudou\":\"藤堂美沙\",\"misato segawa\":\"濑川美里\",\"erika yano\":\"矢野艾莉卡\",\"rinko ogasawara\":\"小笠原纶子\",\"yuka okitsu\":\"兴津由佳\",\"shun watanabe\":\"渡边隼\",\"ai kunogi\":\"久乃木爱\",\"yumi iguchi\":\"井口祐未\",\"chitose karasuma\":\"乌丸千岁\",\"momoka sono\":\"苑生百花\",\"yae kugayama\":\"久我山八重\",\"alice cartelet\":\"爱丽丝·卡塔雷特\",\"aya komichi\":\"小路绫\",\"karen kujou\":\"九条可怜\",\"shinobu omiya\":\"大宫忍\",\"youko inokuma\":\"猪熊阳子\",\"sakura karasuma\":\"乌丸樱\",\"akari kuzehashi\":\"久世桥朱里\",\"honoka matsubara\":\"松原穗乃花\",\"gabriel tenma white\":\"天真·珈百璃·怀特\",\"vignette tsukinose april\":\"月乃濑·薇奈特·艾普利尔\",\"satanichia kurumizawa mcdowell\":\"胡桃泽·萨塔妮娅·麦克道威尔\",\"raphiel shiraha ainsworth\":\"白羽·菈菲尔·恩兹沃斯\",\"chii\":\"小叽（爱露达）\",\"yumi omura\":\"大村裕美\",\"sumomo\":\"丝茉茉\",\"chitose hibiya\":\"日比谷千岁\",\"hideki motosuwa\":\"本须和秀树\",\"yuzuki\":\"柚姬\",\"minoru kokubunji\":\"国分寺稔\",\"takako shimizu\":\"清水多香子\",\"sylvie\":\"希尔薇\",\"rito yuuki\":\"结城梨斗\",\"ryouko mikado\":\"御门凉子\",\"lala satalin deviluke\":\"菈菈·萨塔琳·戴比路克\",\"haruna sairenji\":\"西连寺春菜\",\"golden darkness\":\"金色暗影\",\"yui kotegawa\":\"古手川唯\",\"mikan yuuki\":\"结城美柑\",\"nemesis\":\"涅墨西斯\",\"saki tenjouin\":\"天条院沙姬\",\"aya fujisaki\":\"藤崎绫\",\"rin kujou\":\"九条凛\",\"mea kurosaki\":\"黑咲芽亚\",\"nana asta deviluke\":\"娜娜·阿斯塔·戴比路克\",\"momo velia deviluke\":\"梦梦·贝莉雅·戴比路克\",\"riko yuusaki\":\"夕崎梨子\",\"sephie michaela deviluke\":\"赛菲·米卡埃拉·戴比路克\",\"tearju lunatique\":\"提亚悠·鲁娜提克\",\"run elsie jewelria\":\"伦·艾尔西·裘利亚\",\"risa momioka\":\"籾冈里纱\",\"mio sawada\":\"泽田未央\",\"oshizu murasame\":\"村雨静\",\"kyouko kirisaki\":\"雾崎恭子\",\"kenichi saruyama\":\"猿山健一\",\"shizu murasame\":\"村雨静\",\"erina nakiri\":\"薙切绘理奈\",\"alice nakiri\":\"薙切爱丽丝\",\"azami nakiri\":\"薙切蓟\",\"ikumi mito\":\"水户郁魅\",\"megumi tadokoro\":\"田所惠\",\"fuyumi mizuhara\":\"水原冬美\",\"souma yukihira\":\"幸平创真\",\"takumi aldini\":\"巧·阿尔迪尼\",\"isami aldini\":\"勇·阿尔迪尼\",\"hisako arato\":\"新户绯沙子\",\"ryou kurokiba\":\"黑木场凉\",\"satoshi isshiki\":\"一色慧\",\"ryouko sakaki\":\"榊凉子\",\"rindou kobayashi\":\"小林龙胆\",\"sagiri izumi\":\"和泉纱雾\",\"elf yamada\":\"山田妖精（艾蜜莉·格兰杰）\",\"masamune izumi\":\"和泉正宗\",\"megumi jinno\":\"神野惠\",\"muramasa senju\":\"千寿村征（梅园花）\",\"tomoe takasago\":\"高砂智惠\",\"super sonico\":\"超级索尼子\",\"super pochaco\":\"超级帕恰子\",\"super taruco\":\"超级桶桶子\",\"ako suminoe\":\"住之江亚香\",\"riko suminoe\":\"住之江理香\",\"keita suminoe\":\"住之江圭太\",\"miharu mikuni\":\"三国美春\",\"agiri goshiki\":\"吴织亚切\",\"sonya\":\"索妮娅\",\"yasuna oribe\":\"折部安奈\",\"kyara botsu\":\"无名子\",\"ika musume\":\"乌贼娘\",\"ayumi tokita\":\"常田鲇美\",\"chizuru aizawa\":\"相泽千鹤\",\"cindy campbell\":\"辛迪·坎贝尔\",\"eiko aizawa\":\"相泽荣子\",\"sanae nagatsuki\":\"长月早苗\",\"takeru aizawa\":\"相泽武\",\"kiyomi sakura\":\"纱仓清美\",\"nagisa saitou\":\"齐藤渚\",\"miku hatsune\":\"初音未来\",\"luka megurine\":\"巡音流歌\",\"len kagamine\":\"镜音连\",\"rin kagamine\":\"镜音铃\",\"haku yowane\":\"弱音白\",\"gumi\":\"GUMI\",\"akari kizuna\":\"绁星灯\",\"yukari yuzuki\":\"结月缘\",\"maki tsurumaki\":\"弦卷真纪\",\"akane kotonoha\":\"琴叶茜\",\"aoi kotonoha\":\"琴叶葵\",\"zunko tohoku\":\"东北俊子\",\"tsudumi suzuki\":\"铃木梓梓弥\",\"sorata kanda\":\"神田空太\",\"mashiro shiina\":\"椎名真白\",\"nanami aoyama\":\"青山七海\",\"misaki kamiigusa\":\"上井草美咲\",\"chihiro sengoku\":\"千石千寻\",\"ryuuji takasu\":\"高须龙儿\",\"taiga aisaka\":\"逢坂大河\",\"minori kushieda\":\"栉枝实乃梨\",\"ami kawashima\":\"川岛亚美\",\"yasuko takasu\":\"高须泰子\",\"maya kihara\":\"木原麻耶\",\"nanako kashii\":\"香椎奈奈子\",\"yuri koigakubo\":\"恋洼百合\",\"yuusaku kitamura\":\"北村佑作\",\"sakura kanou\":\"狩野樱\",\"sumire kanou\":\"狩野堇\",\"akito himenokouji\":\"姬小路秋人\",\"akiko himenokouji\":\"姬小路秋子\",\"anastasia nasuhara\":\"那须原安娜史塔希亚\",\"ginbei haruomi sawatari\":\"猿渡银兵卫春臣\",\"arashi nikaidou\":\"二阶堂岚\",\"arisa takanomiya\":\"鹰乃宫亚里沙\",\"origami tobiichi\":\"鸢一折纸\",\"kurumi tokisaki\":\"时崎狂三\",\"yoshino himekawa\":\"冰芽川四糸乃\",\"kotori itsuka\":\"五河琴里\",\"kaguya yamai\":\"八舞耶俱矢\",\"yuzuru yamai\":\"八舞夕弦\",\"miku izayoi\":\"诱宵美九\",\"tohka yatogami\":\"夜刀神十香\",\"shido itsuka\":\"五河士道\",\"reine murasame\":\"村雨令音\",\"mayuka kondou\":\"近藤茧佳\",\"nao takanashi\":\"高梨奈绪\",\"iroha tsuchiura\":\"土浦彩叶\",\"nyaruko\":\"奈亚子\",\"cthugha\":\"克图格亚\",\"mahiro yasaka\":\"八坂真寻\",\"hastur\":\"哈斯太\",\"konoe tsuruma\":\"鹤真心乃枝\",\"miyabi kannagi\":\"神凪雅\",\"himeko inaba\":\"稻叶姬子\",\"iori nagase\":\"永濑伊织\",\"taichi yaegashi\":\"八重㭴太一\",\"yui kiriyama\":\"桐山唯\",\"yoshifumi aoki\":\"青木义文\",\"raku ichijou\":\"一条乐\",\"kosaki onodera\":\"小野寺小咲\",\"haru onodera\":\"小野寺春\",\"yui kanakura\":\"奏仓羽\",\"marika tachibana\":\"橘万里花\",\"chitoge kirisaki\":\"桐崎千棘\",\"seishirou tsugumi\":\"鸫诚士郎\",\"ruri miyamoto\":\"宫本琉璃\",\"fumino serizawa\":\"芹泽文乃\",\"nozomi kiriya\":\"雾谷希\",\"chise umenomori\":\"梅之森千世\",\"otome tsuzuki\":\"都筑乙女\",\"touma kamijou\":\"上条当麻\",\"mikoto misaka\":\"御坂美琴\",\"misuzu misaka\":\"御坂美铃\",\"aisa himegami\":\"姬神秋沙\",\"mii konori\":\"固法美伟\",\"seiri fukiyose\":\"吹寄制理\",\"kaori kanzaki\":\"神裂火织\",\"komoe tsukuyomi\":\"月咏小萌\",\"misaka-imouto\":\"御坂妹妹\",\"last order\":\"最后之作\",\"index librorum prohibitorum\":\"茵蒂克丝\",\"kuroko shirai\":\"白井黑子\",\"misaki shokuhou\":\"食蜂操祈\",\"mitsuko kongou\":\"婚后光子\",\"kinuho wannai\":\"湾内绢保\",\"maaya awatsuki\":\"泡浮万彬\",\"aiho yomikawa\":\"黄泉川爱穗\",\"tsuzuri tessou\":\"铁装缀里\",\"maika tsuchimikado\":\"土御门舞夏\",\"erii haruue\":\"春上衿衣\",\"ruiko saten\":\"佐天泪子\",\"kazari uiharu\":\"初春饰利\",\"accelerator\":\"一方通行\",\"oriana thomson\":\"欧莉安娜·汤姆森\",\"shizuri mugino\":\"麦野沉利\",\"rikou takitsubo\":\"泷壶理后\",\"saiai kinuhata\":\"绢旗最爱\",\"frenda seivelun\":\"芙兰达·塞维伦\",\"shiage hamazura\":\"滨面仕上\",\"hyouka kazakiri\":\"风斩冰华\",\"harumi kiyama\":\"木山春生\",\"motoharu tsuchimikado\":\"土御门元春\",\"itsuwa\":\"五和\",\"lucia\":\"露琪亚\",\"agnese sanctis\":\"雅妮丝·桑提斯\",\"angelene\":\"安洁莉娜\",\"eiga kanmi\":\"甘味荣华\",\"febrie\":\"菲布理\",\"janie\":\"珍妮\",\"shinobu nunotaba\":\"布束砥信\",\"yumi kusakabe\":\"草壁优美\",\"eru chitanda\":\"千反田爱瑠\",\"houtarou oreki\":\"折木奉太郎\",\"mayaka ibara\":\"伊原摩耶花\",\"fuyumi irisu\":\"入须冬实\",\"satoshi fukube\":\"福部里志\",\"ayako kouchi\":\"河内亚也子\",\"mitsuha miyamizu\":\"宫水三叶\",\"yotsuha miyamizu\":\"宫水四叶\",\"miki okudera\":\"奥寺美纪\",\"taki tachibana\":\"立花泷\",\"akihisa yoshii\":\"吉井明久\",\"akira yoshii\":\"吉井玲\",\"hideyoshi kinoshita\":\"木下秀吉\",\"yuuko kinoshita\":\"木下优子\",\"mizuki himeji\":\"姬路瑞希\",\"minami shimada\":\"岛田美波\",\"hazuki shimada\":\"岛田叶月\",\"yuuji sakamoto\":\"坂本雄二\",\"shouko kirishima\":\"雾岛翔子\",\"aiko kudou\":\"工藤爱子\",\"miharu shimizu\":\"清水美春\",\"judy hopps\":\"兔朱迪\",\"nick wilde\":\"狐尼克\",\"jack savage\":\"野蛮杰克\",\"chief bogo\":\"蛮牛局长\",\"bonnie hopps\":\"兔邦妮\",\"nagi\":\"薙\",\"zange\":\"忏悔\",\"jin mikuriya\":\"御厨仁\",\"tsugumi aoba\":\"青叶鸫\",\"shino ookouchi\":\"大河内紫乃\",\"takako kimura\":\"木村贵子\",\"kochou yoshida\":\"良田胡蝶\",\"minori nakazawa\":\"中泽农\",\"ringo kinoshita\":\"木下林檎\",\"natsumi bekki\":\"户次菜摘\",\"sora takanashi\":\"小鸟游空\",\"miu takanashi\":\"小鸟游美羽\",\"hina takanashi\":\"小鸟游雏\",\"yuuta segawa\":\"濑川佑太\",\"raika oda\":\"织田莱香\",\"miia\":\"米亚\",\"centorea shianus\":\"珊卓蕾亚·夏努斯\",\"papi\":\"帕皮\",\"suu\":\"丝\",\"lala\":\"拉拉\",\"rachnera arachnera\":\"拉克涅拉·阿拉克涅拉\",\"manako\":\"真奈子\",\"meroune lorelei\":\"美洛努·罗雷莱\",\"tionishia\":\"提欧尼西亚\",\"cathyl\":\"卡特尔\",\"kimihito kurusu\":\"来留主公人\",\"yuuki oojima\":\"大岛裕树\",\"satsuki shinonome\":\"东云皋月\",\"miho nishizumi\":\"西住美穗\",\"saori takebe\":\"武部沙织\",\"hana isuzu\":\"五十铃华\",\"yukari akiyama\":\"秋山优花里\",\"mako reizei\":\"冷泉麻子\",\"anzu kadotani\":\"角谷杏\",\"yuzu koyama\":\"小山柚子\",\"momo kawashima\":\"河岛桃\",\"noriko isobe\":\"矶边典子\",\"taeko kondou\":\"近藤妙子\",\"shinobu kawanishi\":\"河西忍\",\"akebi sasaki\":\"佐佐木明日\",\"azusa sawa\":\"泽梓\",\"yuuki utsugi\":\"宇津木优季\",\"saki maruyama\":\"丸山纱希\",\"midoriko sono\":\"园绿子\",\"darjeeling\":\"大吉岭\",\"assam\":\"阿萨姆\",\"orange pekoe\":\"橙黄白毫\",\"rosehip\":\"蔷薇果\",\"rukuriri\":\"鲁克莉莉\",\"kay\":\"凯伊\",\"chiyomi anzai\":\"安斋千代美\",\"carpaccio\":\"卡尔帕乔\",\"pepperoni\":\"佩帕罗妮\",\"katyusha\":\"喀秋莎\",\"nonna\":\"农娜\",\"maho nishizumi\":\"西住真穗\",\"erika itsumi\":\"逸见艾丽卡\",\"mika\":\"米卡\",\"aki\":\"阿基\",\"mikko\":\"米科\",\"kinuyo nishi\":\"西绢代\",\"arisu shimada\":\"岛田爱里寿\",\"azumi\":\"杏美\",\"ami chouno\":\"蝶野亚美\",\"rena andou\":\"安藤丽奈\",\"ruka oshida\":\"押田流歌\",\"murakami\":\"村上\",\"yuri isuzu\":\"五十铃百合\",\"shiho nishizumi\":\"西住志穗\",\"yoshiko akiyama\":\"秋山好子\",\"chiyo shimada\":\"岛田千代\",\"a2\":\"A型二号\",\"2b\":\"二号B型\",\"9s\":\"九号S型\",\"megumi noda\":\"野田惠\",\"shinichi chiaki\":\"千秋真一\",\"saki miyanaga\":\"宫永咲\",\"nodoka haramura\":\"原村和\",\"yuuki kataoka\":\"片冈优希\",\"mako someya\":\"染谷真子\",\"hisa takei\":\"竹井久\",\"kyoutarou suga\":\"须贺京太郎\",\"touka ryuumonbuchi\":\"龙门渊透华\",\"hajime kunihiro\":\"国广一\",\"koromo amae\":\"天江衣\",\"mihoko fukuji\":\"福路美穗子\",\"kana ikeda\":\"池田华菜\",\"miharu yoshitome\":\"吉留未春\",\"sumiyo fukabori\":\"深堀纯代\",\"yumi kajiki\":\"加治木由美\",\"momoko touyoko\":\"东横桃子\",\"satomi kanbara\":\"蒲原智美\",\"shizuno takakamo\":\"高鸭稳乃\",\"ako atarashi\":\"新子憧\",\"kuro matsumi\":\"松实玄\",\"yuu matsumi\":\"松实宥\",\"arata sagimori\":\"鹭森灼\",\"harue akado\":\"赤土晴绘\",\"teru miyanaga\":\"宫永照\",\"sumire hirose\":\"弘世堇\",\"awai oohoshi\":\"大星淡\",\"yuuko mase\":\"真濑由子\",\"hiroe atago\":\"爱宕洋榎\",\"kinue atago\":\"爱宕绢惠\",\"kyouko suehara\":\"末原恭子\",\"toki onjouji\":\"园城寺怜\",\"ryuuka shimizudani\":\"清水谷龙华\",\"sera eguchi\":\"江口夕\",\"hiroko funakubo\":\"船久保浩子\",\"izumi nijou\":\"二条泉\",\"komaki jindai\":\"神代小莳\",\"tomoe karijuku\":\"狩宿巴\",\"haru takimi\":\"泷见春\",\"hatsumi usuzumi\":\"薄墨初美\",\"kasumi iwato\":\"石户霞\",\"shiromi kosegawa\":\"小濑川白望\",\"aislinn wishart\":\"爱丝琳·威夏尔特\",\"sae usuzawa\":\"臼泽塞\",\"mairu shirouzu\":\"白水哩\",\"himeko tsuruta\":\"鹤田姬子\",\"yukiko maya\":\"真屋由晖子\",\"yoshiko kainou\":\"戒能良子\",\"kaban\":\"背包\",\"serval\":\"薮猫\",\"common raccoon\":\"浣熊\",\"fennec\":\"耳廓狐\",\"ezo red fox\":\"北狐\",\"silver fox\":\"银狐\",\"moose\":\"驼鹿\",\"shoebill\":\"鲸头鹳\",\"alpaca suri\":\"苏利羊驼\",\"humboldt penguin\":\"汉波德企鹅\",\"emperor penguin\":\"帝企鹅\",\"royal penguin\":\"皇家企鹅\",\"margay\":\"长尾虎猫\",\"black leopard\":\"黑豹\",\"leopard\":\"豹\",\"south african giraffe\":\"南非长颈鹿\",\"sabre tiger\":\"剑齿虎\",\"japanese crested ibis\":\"朱鹮\",\"sora kasugano\":\"春日野穹\",\"haruka kasugano\":\"春日野悠\",\"juliet starling\":\"朱丽叶·斯塔林\",\"shinichi kudo\":\"工藤新一\",\"ran mouri\":\"毛利兰\",\"conan edogawa\":\"江户川柯南\",\"ai haibara\":\"灰原哀\",\"ayumi yoshida\":\"吉田步美\",\"kazuha toyama\":\"远山和叶\",\"heiji hattori\":\"服部平次\",\"kaito kuroba\":\"黑羽快斗\",\"kogoro mouri\":\"毛利小五郎\",\"rei furuya\":\"降谷零\",\"shuuichi akai\":\"赤井秀一\",\"sonoko suzuki\":\"铃木园子\",\"eri kisaki\":\"妃英理\",\"jodie starling\":\"茱蒂·斯泰琳\",\"miwako sato\":\"佐藤美和子\",\"masumi sera\":\"世良真纯\",\"yamcha\":\"雅木茶\",\"bulma briefs\":\"布尔玛\",\"chi chi\":\"琪琪\",\"son gohan\":\"孙悟饭\",\"son goten\":\"孙悟天\",\"android 16\":\"人造人16号\",\"android 18\":\"人造人18号\",\"android 21\":\"人造人21号\",\"videl\":\"比迪丽\",\"son goku\":\"孙悟空\",\"spopovich\":\"斯波比奇\",\"vegeta\":\"贝吉塔\",\"trunks briefs\":\"特兰克斯\",\"piccolo\":\"比克\",\"goku black\":\"黑悟空\",\"broly\":\"布罗利\",\"erasa\":\"伊蕾莎\",\"majin buu\":\"魔人布欧\",\"master roshi\":\"武天老师\",\"oolong\":\"乌龙\",\"ranfan\":\"兰芳\",\"lunch\":\"兰琪\",\"panchy brief\":\"布里夫太太\",\"kuro kagami\":\"镜黑\",\"mimi usa\":\"宇佐美美\",\"rin kokonoe\":\"九重凛\",\"daisuke aoki\":\"青木大介\",\"hestia\":\"赫斯缇雅\",\"bell cranel\":\"贝尔·克朗尼\",\"tiona hiryute\":\"蒂奥娜·席吕特\",\"tione hiryute\":\"蒂奥涅·席吕特\",\"aiz wallenstein\":\"艾丝·华伦斯坦\",\"eina tulle\":\"埃伊娜·祖尔\",\"freya\":\"芙蕾雅\",\"hephaistos\":\"赫菲斯托丝\",\"liliruca arde\":\"莉莉露卡·厄德\",\"ryuu lion\":\"琉·璃昂\",\"loki\":\"洛基\",\"syr flova\":\"希儿·福罗瓦\",\"homura akemi\":\"晓美焰\",\"madoka kaname\":\"鹿目圆\",\"mami tomoe\":\"巴麻美\",\"sayaka miki\":\"美树沙耶香\",\"kyouko sakura\":\"佐仓杏子\",\"nagisa momoe\":\"百江渚\",\"kaede akino\":\"秋野枫\",\"rena minami\":\"水波玲奈\",\"yachiyo nanami\":\"七海八千代\",\"iroha tamaki\":\"环彩羽\",\"kyubey\":\"丘比\",\"kyousuke kamijou\":\"上条恭介\",\"danua\":\"达奴娅\",\"djeeta\":\"姬塔\",\"eugen\":\"欧根\",\"gran\":\"格兰\",\"io\":\"伊欧\",\"lyria\":\"露莉亚\",\"katalina aryze\":\"卡塔莉娜·亚利洁\",\"narmaya\":\"娜尔梅亚\",\"rosetta\":\"萝赛塔\",\"sturm\":\"斯特姆\",\"vira\":\"维拉\",\"vampy\":\"斑比\",\"sakura kinomoto\":\"木之本樱\",\"touya kinomoto\":\"木之本桃矢\",\"yukito tsukishiro\":\"月城雪兔\",\"tomoyo daidouji\":\"大道寺知世\",\"sonomi daidouji\":\"大道寺园美\",\"syaoran li\":\"李小狼\",\"meiling li\":\"李苺铃\",\"rika sasaki\":\"佐佐木利佳\",\"chiharu mihara\":\"三原千春\",\"naoko yanagisawa\":\"柳泽奈绪子\",\"ruby rose\":\"露比·罗丝\",\"weiss schnee\":\"魏丝·雪倪\",\"blake belladonna\":\"布蕾克·贝拉多娜\",\"yang xiao long\":\"阳小龙\",\"erika chiba\":\"千叶艾莉卡\",\"haruka ono\":\"小野遥\",\"honoka mitsui\":\"光井穗香\",\"mari watanabe\":\"渡边摩利\",\"mayumi saegusa\":\"七草真由美\",\"miyuki shiba\":\"司波深雪\",\"mizuki shibata\":\"柴田美月\",\"sayaka mibu\":\"壬生纱耶香\",\"shizuku kitayama\":\"北山雫\",\"suzune ichihara\":\"市原铃音\",\"tatsuya shiba\":\"司波达也\",\"saber\":\"Saber\",\"archer\":\"Archer\",\"lancer\":\"Lancer\",\"caster\":\"Caster\",\"berserker\":\"Berserker\",\"assassin\":\"Assassin\",\"shirou emiya\":\"卫宫士郎\",\"rin tosaka\":\"远坂凛\",\"kirei kotomine\":\"言峰绮礼\",\"sakura matou\":\"间桐樱\",\"shinji matou\":\"间桐慎二\",\"illyasviel von einzbern\":\"伊莉雅丝菲尔·冯·爱因兹贝伦\",\"saber alter\":\"Saber Alter\",\"taiga fujimura\":\"藤村大河\",\"gilgamesh\":\"吉尔伽美什\",\"diarmuid ua duibhne\":\"迪尔姆德·奥迪那\",\"iskandar\":\"伊斯坎达尔\",\"gilles de rais\":\"吉尔·德·莱斯\",\"lancelot\":\"兰斯洛特\",\"kiritsugu emiya\":\"卫宫切嗣\",\"tokiomi tohsaka\":\"远坂时臣\",\"waver velvet\":\"韦伯·维尔维特\",\"ryuunosuke uryuu\":\"雨生龙之介\",\"kariya matou\":\"间桐雁夜\",\"irisviel von einzbern\":\"爱丽丝菲尔·冯·爱因兹贝伦\",\"caren ortensia\":\"卡莲·奥尔黛西亚\",\"bazett fraga mcremitz\":\"巴洁特·法迦·克米兹\",\"sitonai\":\"志度内\",\"ishtar\":\"伊什塔尔\",\"tamamo no mae\":\"玉藻前\",\"shielder\":\"玛修·基列莱特\",\"saber lily\":\"Saber Lily\",\"artoria pendragon\":\"阿尔托莉雅·潘德拉贡（Lancer）\",\"artoria pendragon alter\":\"阿尔托莉雅·潘德拉贡〔Alter〕（Lancer）\",\"souji okita\":\"冲田总司\",\"red saber\":\"尼禄·克劳狄乌斯\",\"ayako mitsuzuri\":\"美缀绫子\",\"kane himuro\":\"冰室钟\",\"kaede makidera\":\"莳寺枫\",\"gudao\":\"藤丸立香(咕哒男)\",\"gudako\":\"咕哒子\",\"kiyohime\":\"清姬\",\"alexander\":\"亚历山大\",\"scathach\":\"斯卡哈\",\"asterios\":\"阿斯忒里俄斯\",\"orion\":\"俄里翁\",\"artemis\":\"阿耳忒弥斯\",\"altera\":\"阿蒂拉\",\"boudica\":\"布狄卡\",\"mysterious heroine x\":\"谜之女主角X\",\"mysterious heroine x alter\":\"谜之女主角X Alter\",\"olga marie animusphere\":\"奥尔加玛丽·阿尼姆斯菲亚\",\"paul bunyan\":\"保罗·班扬\",\"kiara sessyoin\":\"杀生院祈荒\",\"astolfo\":\"阿斯托尔福（阿福）\",\"protagonist\":\"主人公\",\"minamoto no raikou\":\"源赖光\",\"meltryllis\":\"梅尔特莉莉丝\",\"passionlip\":\"帕森莉普\",\"ushiwakamaru\":\"牛若丸\",\"jack the ripper\":\"开膛手杰克\",\"jeanne alter\":\"贞德〔Alter〕\",\"nitocris\":\"尼托克丽丝\",\"alice kuonji\":\"久远寺有珠\",\"aoko aozaki\":\"苍崎青子\",\"touko aozaki\":\"苍崎橙子\",\"leysritt\":\"莉洁莉特\",\"chevalier deon\":\"迪昂·德·鲍蒙\",\"nightingale\":\"南丁格尔 | 夜莺\",\"cornelius alba\":\"科尼利厄斯·阿鲁巴\",\"arcueid brunestud\":\"爱尔奎特·布伦史塔德\",\"ciel\":\"希耶尔\",\"circe\":\"喀耳刻\",\"satsuki yumizuka\":\"弓冢五月\",\"shiki tohno\":\"远野志贵\",\"akiha tohno\":\"远野秋叶\",\"kohaku\":\"琥珀\",\"sion eltnam atlasia\":\"紫苑·艾尔特纳姆·阿特拉西亚\",\"dracula\":\"德古拉\",\"francis drake\":\"弗朗西斯·德雷克\",\"elizabeth bathory\":\"伊丽莎白·巴托里\",\"hakuno kishinami\":\"岸波白野（扎比）\",\"hassan of serenity\":\"静谧之哈桑\",\"medb\":\"梅芙\",\"len\":\"莲\",\"celenike icecolle yggdmillennia\":\"赛蕾妮可·艾斯科·千界树\",\"fiore forvedge yggdmillennia\":\"菲奥蕾·弗尔维吉·千界树\",\"chiron\":\"喀戎\",\"achilles\":\"阿喀琉斯\",\"atalanta\":\"阿塔兰忒\",\"kairi sisigou\":\"狮子劫界离\",\"miyako arima\":\"有间都古\",\"chloe von einzbern\":\"克洛伊·冯·爱因兹贝伦（小黑）\",\"luviagelita edelfelt\":\"露维亚瑟琳塔·艾德费尔特\",\"miyu edelfelt\":\"美游·艾德费尔特\",\"sella\":\"塞拉\",\"euryale\":\"尤瑞艾莉（二姐）\",\"shiki ryougi\":\"两仪式\",\"stheno\":\"斯忒诺\",\"mordred pendragon\":\"莫德雷德·潘德拉贡\",\"queen of sheba\":\"示巴女王\",\"wu zetian\":\"武则天\",\"abigail williams\":\"阿比盖尔·威廉姆斯\",\"hans christian andersen\":\"汉斯·克里斯蒂安·安徒生\",\"hector\":\"赫克特\",\"mochizuki chiyome\":\"望月千代女\",\"osakabehime\":\"刑部姬\",\"sakata kintoki\":\"坂田金时\",\"scheherazade\":\"山鲁佐德\",\"suzuka gozen\":\"铃鹿御前\",\"tomoe gozen\":\"巴御前\",\"xuanzang\":\"玄奘\",\"fujino asagami\":\"浅上藤乃\",\"mikiya kokutou\":\"黑桐干也\",\"azaka kokutou\":\"黑桐鲜花\",\"ibaraki douji\":\"茨木童子\",\"anne bonny\":\"安妮·伯妮\",\"mary read\":\"玛莉·瑞德\",\"brynhildr\":\"布伦希尔德\",\"cleopatra\":\"克里奥帕特拉（艳后）\",\"ereshkigal\":\"埃列什基伽勒（艾蕾）\",\"helena blavatsky\":\"海伦娜·布拉瓦茨基\",\"leonardo da vinci\":\"莱昂纳多·达·芬奇\",\"marie antoinette\":\"玛丽·安托瓦内特（蛋糕）\",\"mata hari\":\"玛塔哈丽（舞娘）\",\"medusa\":\"美杜莎\",\"musashi miyamoto\":\"宫本武藏\",\"nobunaga oda\":\"织田信长\",\"penthesilea\":\"彭忒西勒亚\",\"semiramis\":\"赛米拉米斯\",\"shuten douji\":\"酒吞童子\",\"tiamat\":\"提亚马特\",\"bb\":\"BB\",\"bradamante\":\"布拉达曼特\",\"nero claudius bride\":\"尼禄·克劳狄乌斯〔新娘〕\",\"chacha\":\"恰恰 | 茶茶\",\"lavinia whateley\":\"拉薇妮亚·沃特雷\",\"artoria pendragon rider alter\":\"阿尔托莉雅·潘德拉贡〔Alter〕（Rider）\",\"katsushika hokusai\":\"葛饰北斋（阿荣）\",\"saint martha\":\"玛尔达\",\"murasaki shikibu\":\"紫式部\",\"kazuto kirigaya\":\"桐谷和人（桐人）\",\"asuna yuuki\":\"结城明日奈（亚丝娜）\",\"sachi\":\"幸\",\"keiko ayano\":\"绫野珪子（西莉卡）\",\"rika shinozaki\":\"筱崎里香（莉兹贝特）\",\"rosalia\":\"罗莎莉雅\",\"sasha\":\"纱夏\",\"yolko\":\"夜子\",\"suguha kirigaya\":\"桐谷直叶\",\"lyfa\":\"莉法\",\"shino asada\":\"朝田诗乃（诗乃）\",\"yuuki konno\":\"绀野木棉季（有纪）\",\"nagata shinichi\":\"长田伸一（雷根）\",\"alicia rue\":\"亚丽莎·露\",\"sakuya\":\"朔夜\",\"kuroyukihime\":\"黑雪姬\",\"haruyuki arita\":\"有田春雪\",\"yuniko kouzuki\":\"上月由仁子\",\"chiyuri kurashima\":\"仓岛千百合\",\"akira himi\":\"冰见晶\",\"fuuko kurasaki\":\"仓崎枫子\",\"takumu mayuzumi\":\"黛拓武\",\"nanoha takamachi\":\"高町奈叶\",\"fate testarossa\":\"菲特·泰斯特罗莎\",\"einhart stratos\":\"艾茵哈特·斯崔特斯\",\"rinne berlinetta\":\"凛音·贝利内塔\",\"vivio takamachi\":\"高町薇薇欧\",\"yuuno scrya\":\"尤诺·斯克莱亚\",\"amy limietta\":\"艾蜜·莉米艾特\",\"erio mondial\":\"艾力奥·曼迪尔\",\"hayate yagami\":\"八神疾风\",\"shamal\":\"莎玛尔\",\"signum\":\"希格纳姆\",\"vita\":\"维塔\",\"reinforce\":\"琳芙斯\",\"fuka reventon\":\"风香·雷文顿\",\"corona timil\":\"珂罗娜·缇米尔\",\"aruf\":\"艾尔芙\",\"zafira\":\"扎斐拉\",\"alisa bannings\":\"爱丽莎·巴尼斯\",\"kyrie florian\":\"琦莉耶·弗洛利安\",\"amitie florian\":\"阿米蒂埃·弗洛利安\",\"precia testarossa\":\"普蕾茜亚·泰斯特罗莎\",\"alicia testarossa\":\"阿丽西亚·泰斯塔罗莎\",\"lindy harlaown\":\"琳蒂·哈拉温\",\"chrono harlaown\":\"克洛诺·哈洛温\",\"caro ru lushe\":\"凯珞·露·露茜\",\"ginga nakajima\":\"银河·中岛\",\"subaru nakajima\":\"昴·中岛\",\"suzuka tsukimura\":\"月村铃鹿\",\"teana lanster\":\"蒂安娜·兰斯达\",\"lutecia alpine\":\"璐缇希雅·阿尔菲诺\",\"uno\":\"乌诺\",\"due\":\"都艾\",\"cinque\":\"琴柯\",\"sein\":\"萨依\",\"sette\":\"塞缇\",\"nove\":\"诺威\",\"dieci\":\"迪艾琦\",\"wendi\":\"温蒂\",\"deed\":\"蒂多\",\"kazuma asougi\":\"亚双义一真\",\"ryuunosuke naruhodou\":\"成步堂龙之介\",\"phoenix wright\":\"成步堂龙一\",\"trucy wright\":\"成步堂美贯\",\"apollo justice\":\"王泥喜法介\",\"maya fey\":\"绫里真宵\",\"mia fey\":\"绫里千寻\",\"pearl fey\":\"绫里春美\",\"athena cykes\":\"希月心音\",\"dick gumshoe\":\"糸锯圭介\",\"ema skye\":\"宝月茜\",\"franziska von karma\":\"狩魔冥\",\"miles edgeworth\":\"御剑怜侍\",\"kristoph gavin\":\"牙琉雾人\",\"klavier gavin\":\"牙琉响也\",\"adrian andrews\":\"华宫雾绪\",\"kay faraday\":\"一条美云\",\"sherlock holmes\":\"夏洛克·福尔摩斯\",\"haruhi suzumiya\":\"凉宫春日\",\"kyon\":\"阿虚\",\"kyon no imouto\":\"虚妹\",\"emiri kimidori\":\"喜绿江美里\",\"mikuru asahina\":\"朝比奈实玖瑠\",\"ryoko asakura\":\"朝仓凉子\",\"tsuruya\":\"鹤屋\",\"yuki nagato\":\"长门有希\",\"itsuki koizumi\":\"古泉一树\",\"kunikida\":\"国木田\",\"taniguchi\":\"谷口\",\"akira yukino\":\"雪乃玲\",\"manaka takane\":\"高岭爱花\",\"nene anegasaki\":\"姐崎宁宁\",\"rinko kobayakawa\":\"小早川凛子\",\"mariana prinsilla\":\"玛莉安娜·普林希拉\",\"miu sagara\":\"相良美宇\",\"kanade tachibana\":\"立华奏\",\"yuri nakamura\":\"仲村由理\",\"yuzuru otonashi\":\"音无结弦\",\"hideki hinata\":\"日向秀树\",\"shiina\":\"椎名\",\"hisako\":\"久子\",\"masami iwasawa\":\"岩泽雅美\",\"miyuki irie\":\"入江美雪\",\"shiori sekine\":\"关根诗织\",\"umaru doma\":\"土间埋\",\"taihei doma\":\"土间大平\",\"kirie motoba\":\"本场切绘\",\"nana ebina\":\"海老名菜菜\",\"sylphynford tachibana\":\"橘·希尔芬福特\",\"takeshi motoba\":\"本场猛（崩巴）\",\"asagi igawa\":\"井河阿莎姬\",\"sakura igawa\":\"井河樱\",\"rinko akiyama\":\"秋山凜子\",\"yukikaze mizuki\":\"水城雪风\",\"shiranui mizuki\":\"水城不知火\",\"lucy ... yamagami\":\"山神露西【以下略】\",\"yutaka hasebe\":\"长谷部丰\",\"tomoki sakurai\":\"樱井智树\",\"ikaros\":\"伊卡洛斯\",\"nymph\":\"妮姆芙\",\"astraea\":\"阿斯特蕾亚\",\"chaos\":\"卡奥斯\",\"sohara mitsuki\":\"见月楚原\",\"hiyori kazane\":\"风音日和\",\"mikako satsukitane\":\"五月田根美香子\",\"blossom\":\"花花\",\"bubbles\":\"泡泡\",\"buttercup\":\"毛毛\",\"cure black\":\"黑天使\",\"cure white\":\"白天使\",\"shiny luminous\":\"夏妮露米纳丝\",\"cure bloom\":\"花天使\",\"cure egret\":\"舞天使\",\"michiru kiryuu\":\"雾生满\",\"kaoru kiryuu\":\"雾生薰\",\"cure dream\":\"梦天使\",\"cure rouge\":\"火天使\",\"cure lemonade\":\"柠檬天使\",\"cure mint\":\"薄荷天使\",\"cure aqua\":\"水天使\",\"milky rose\":\"妙奇露丝\",\"cure peach\":\"桃天使\",\"cure berry\":\"莓天使\",\"cure pine\":\"凤梨天使\",\"eas\":\"伊丝\",\"cure passion\":\"百香果天使\",\"cure blossom\":\"花蕾天使\",\"cure marine\":\"海洋天使\",\"cure sunshine\":\"阳光天使\",\"cure moonlight\":\"月光天使\",\"cure flower\":\"花朵天使\",\"cure ange\":\"圣洁天使\",\"cure amour\":\"爱神天使\",\"cure etoile\":\"星辰天使\",\"cure macherie\":\"挚爱天使\",\"kotori nono\":\"野乃小鸟\",\"cure yell\":\"喝采天使\",\"dark precure\":\"暗之美少女\",\"mizuki hanasaki\":\"花咲美月\",\"momoka kurumi\":\"来海桃香\",\"sakura kurumi\":\"来海樱\",\"tsubaki myoudouin\":\"明堂院椿\",\"cure melody\":\"旋律天使\",\"cure rhythm\":\"节奏天使\",\"siren\":\"赛莲\",\"cure beat\":\"节拍天使\",\"cure muse\":\"缪斯天使\",\"maria houjou\":\"北条真理亚\",\"misora minamino\":\"南野美空\",\"cure happy\":\"快乐天使\",\"cure sunny\":\"晴朗天使\",\"cure peace\":\"和平天使\",\"cure march\":\"旋风天使\",\"cure beauty\":\"美丽天使\",\"ikuyo hoshizora\":\"星空育代\",\"masako hino\":\"日野正子\",\"chiharu kise\":\"黄濑千春\",\"tomoko midorikawa\":\"绿川伦子\",\"shizuko aoki\":\"青木静子\",\"wolfrun\":\"狼伦\",\"akaooni\":\"赤鬼\",\"bad end happy\":\"悲剧快乐天使\",\"bad end sunny\":\"悲剧晴朗天使\",\"bad end peace\":\"悲剧和平天使\",\"bad end march\":\"悲剧旋风天使\",\"bad end beauty\":\"悲剧美丽天使\",\"cure heart\":\"爱心天使\",\"cure diamond\":\"钻石天使\",\"cure rosetta\":\"幸运草天使\",\"cure sword\":\"圣剑天使\",\"cure ace\":\"王牌天使\",\"regina\":\"蕾吉娜\",\"ryoko hishikawa\":\"菱川亮子\",\"cure lovely\":\"可爱天使\",\"cure princess\":\"公主天使\",\"cure honey\":\"蜂蜜天使\",\"cure fortune\":\"命运天使\",\"maria hikawa\":\"冰川麻理亚\",\"cure flora\":\"花神天使\",\"cure mermaid\":\"人鱼天使\",\"cure twinkle\":\"闪亮天使\",\"cure scarlet\":\"赤红天使\",\"cure miracle\":\"奇迹天使\",\"cure magical\":\"魔法天使\",\"cure felice\":\"幸福天使\",\"cure whip\":\"奶油天使\",\"cure custard\":\"奶黄天使\",\"cure gelato\":\"冰淇淋天使\",\"cure macaron\":\"马卡龙天使\",\"cure chocolat\":\"巧克力天使\",\"cure parfait\":\"芭菲天使\",\"nobue itou\":\"伊藤伸惠\",\"chika itou\":\"伊藤千佳\",\"miu matsuoka\":\"松冈美羽\",\"matsuri sakuragi\":\"樱木茉莉\",\"ana coppola\":\"安娜·柯普拉\",\"izetta\":\"伊泽塔\",\"ortfine fredericka von eylstadt\":\"奥特菲涅·弗雷德里克·冯·埃尔施塔特\",\"bianca\":\"毕安卡\",\"lotte\":\"萝特\",\"koyomi araragi\":\"阿良良木历\",\"karen araragi\":\"阿良良木火怜\",\"tsukihi araragi\":\"阿良良木月火\",\"kiss-shot acerola-orion heart-under-blade\":\"姬丝秀忒·雅赛劳拉莉昂·刃下心\",\"shinobu oshino\":\"忍野忍\",\"ougi oshino\":\"忍野扇\",\"meme oshino\":\"忍野咩咩\",\"nadeko sengoku\":\"千石抚子\",\"hitagi senjougahara\":\"战场原黑仪\",\"tsubasa hanekawa\":\"羽川翼\",\"suruga kanbaru\":\"神原骏河\",\"mayoi hachikuji\":\"八九寺真宵\",\"deishuu kaiki\":\"贝木泥舟\",\"yotsugi ononoki\":\"斧乃木余接\",\"seiya kanie\":\"可儿江西也\",\"isuzu sento\":\"千斗五十铃\",\"latifa fleuranza\":\"拉媞珐·芙尔兰札\",\"salama\":\"萨拉玛\",\"sylphy\":\"西尔菲\",\"muse\":\"缪斯\",\"kobory\":\"柯波莉\",\"eiko adachi\":\"安达映子\",\"soujirou izumi\":\"泉宗次郎\",\"kanata izumi\":\"泉彼方\",\"konata izumi\":\"泉此方\",\"miki hiiragi\":\"柊美纪\",\"kagami hiiragi\":\"柊镜\",\"tsukasa hiiragi\":\"柊司\",\"miyuki takara\":\"高良美幸\",\"misao kusakabe\":\"日下部美纱绪\",\"ayano minegishi\":\"峰岸绫乃\",\"yutaka kobayakawa\":\"小早川优\",\"minami iwasaki\":\"岩崎南\",\"hiyori tamura\":\"田村日和\",\"patricia martin\":\"帕特莉西亚‧马汀\",\"izumi wakase\":\"若濑和泉\",\"hikaru sakuraba\":\"樱庭光\",\"fuyuki amahara\":\"天原冬纪\",\"yukari takara\":\"高良由香里\",\"subaru hasegawa\":\"长谷川昴\",\"tomoka minato\":\"凑智花\",\"maho misawa\":\"三泽真帆\",\"saki nagatsuka\":\"永冢纱季\",\"hinata hakamada\":\"袴田日向\",\"airi kashii\":\"香椎爱莉\",\"mimi balguerie\":\"米米·巴尔格里\",\"kagetsu hakamada\":\"袴田花月\",\"tsubaki takenaka\":\"竹中椿\",\"hiiragi takenaka\":\"竹中柊\",\"aoi ogiyama\":\"荻山葵\",\"masami fujii\":\"藤井雅美\",\"natsuhi takenaka\":\"竹中夏阳\",\"mihoshi takamura\":\"篁美星\",\"hijiri kuina\":\"久井奈圣\",\"kaori minato\":\"凑花织\",\"nayu hasegawa\":\"长谷川七夕\",\"kamui\":\"卡姆依\",\"takumi\":\"拓海\",\"charlotte\":\"夏洛特 | 夏洛蒂\",\"ryoma\":\"龙马\",\"orochi\":\"远吕智\",\"elise\":\"爱丽丝\",\"flannel\":\"弗拉内尔\",\"camilla\":\"卡米拉\",\"felicia\":\"菲莉西亚\",\"effie\":\"艾尔菲\",\"flora\":\"芙洛拉\",\"hinoka\":\"日乃香\",\"tharja\":\"萨利娅\",\"sakura\":\"樱\",\"joker\":\"小丑\",\"rinkah\":\"燐火\",\"tiki\":\"芝琪\",\"caeda\":\"希妲\",\"catria\":\"卡秋娅\",\"cordelia\":\"缇亚莫\",\"lyndis\":\"琳蒂斯\",\"nowi\":\"诺诺\",\"tuxedo mask\":\"大礼服假面\",\"sailor moon\":\"水手月亮\",\"sailor chibi moon\":\"水手小月亮\",\"sailor mercury\":\"水手水星\",\"sailor mars\":\"水手火星\",\"sailor jupiter\":\"水手木星\",\"sailor venus\":\"水手金星\",\"sailor saturn\":\"水手土星\",\"sailor neptune\":\"水手海王星\",\"sailor uranus\":\"水手天王星\",\"sailor pluto\":\"水手冥王星\",\"kenji tsukino\":\"月野谦之\",\"ikuko tsukino\":\"月野育子\",\"shingo tsukino\":\"月野进悟\",\"naru osaka\":\"大阪奈留\",\"gurio umino\":\"海野栗雄\",\"motoki furuhata\":\"古幡元基\",\"yuuichirou kumada\":\"熊田雄一郎\",\"cammy white\":\"嘉米·怀特\",\"chun-li\":\"春丽\",\"rainbow mika\":\"七川美华\",\"juri han\":\"韩蛛俐\",\"karin kanzuki\":\"神月卡琳\",\"menat\":\"米纳特\",\"kolin\":\"科琳\",\"sakura kasugano\":\"春日野樱\",\"nanase mizugami\":\"水神七濑\",\"zangief\":\"桑吉尔夫\",\"balrog\":\"巴洛克\",\"akuma\":\"豪鬼\",\"blanka\":\"布兰卡\",\"edmond honda\":\"埃德蒙·本田\",\"guile\":\"古烈\",\"ken masters\":\"肯·马斯达斯\",\"ryu\":\"隆\",\"sagat\":\"沙盖特\",\"urien\":\"尤里安\",\"vega\":\"维加\",\"m. bison\":\"拜森\",\"ingrid\":\"英格丽德\",\"laura matsuda\":\"萝拉·松田\",\"sean matsuda\":\"肖恩·松田\",\"popuko\":\"POP子\",\"pipimi\":\"PIPI美\",\"haruka takayama\":\"高山春香\",\"yuu sonoda\":\"园田优\",\"mitsuki sonoda\":\"园田美月\",\"kotone noda\":\"野田琴音\",\"kasumi toyama\":\"户山香澄\",\"tae hanazono\":\"花园多惠\",\"rimi ushigome\":\"牛込里美\",\"saaya yamabuki\":\"山吹沙绫\",\"arisa ichigaya\":\"市谷有咲\",\"yukina minato\":\"凑友希那\",\"sayo hikawa\":\"冰川纱夜\",\"lisa imai\":\"今井莉莎\",\"ako udagawa\":\"宇田川亚子\",\"rinko shirokane\":\"白金燐子\",\"ran mitake\":\"美竹兰\",\"moca aoba\":\"青叶摩卡\",\"himari uehara\":\"上原绯玛丽\",\"tomoe udagawa\":\"宇田川巴\",\"tsugumi hazawa\":\"羽泽鸫\",\"aya maruyama\":\"丸山彩\",\"hina hikawa\":\"冰川日菜\",\"chisato shirasagi\":\"白鹭千圣\",\"maya yamato\":\"大和麻弥\",\"eve wakamiya\":\"若宫伊芙\",\"kokoro tsurumaki\":\"弦卷心\",\"kaoru seta\":\"濑田薰\",\"kanon matsubara\":\"松原花音\",\"misaki okusawa\":\"奥泽美咲\",\"rei wakana\":\"和奏瑞依（LAYER）\",\"rokka asahi\":\"朝日六花（LOCK）\",\"masuki satou\":\"佐藤益木（MASKING）\",\"reona nyubara\":\"鳰原令王那（PAREO）\",\"chiyu tamade\":\"珠手知由（CHU²）\",\"mashiro kurata\":\"仓田真白\",\"nanami hiromachi\":\"广町七深\",\"tsukushi futaba\":\"二叶筑紫\",\"marina tsukishima\":\"月岛麻里奈\",\"kokomi shiina\":\"椎名心实\",\"akane sakurai\":\"樱井明音\",\"fumio murakami\":\"村上文绪\",\"chloe lemaire\":\"克洛伊·勒梅尔\",\"momoko asahina\":\"朝比奈桃子\",\"haruka kazemachi\":\"风町阳歌\",\"mutsumi shigino\":\"鴫野睦\",\"erena mochizuki\":\"望月艾蕾娜\",\"aika tenkuubashi\":\"天空桥爱佳\",\"hakua shiodome\":\"汐留白亚\",\"reiko arisugawa\":\"有栖川丽子\",\"akane segawa\":\"濑川茜\",\"ako tamaki\":\"玉置亚子\",\"hideki nishimura\":\"西村英骑\",\"nanako akiyama\":\"秋山奈奈子\",\"yui saitou\":\"齐藤结衣\",\"nozomi kaminashi\":\"神无希\",\"sayaka miyata\":\"宫田纱耶香\",\"non toyoguchi\":\"丰口浓\",\"fourth raikage\":\"四代目雷影\",\"sakura haruno\":\"春野樱\",\"sasuke uchiha\":\"宇智波佐助\",\"tsunade\":\"纲手\",\"anko mitarashi\":\"御手洗红豆\",\"ino yamanaka\":\"山中井野\",\"kurotsuchi\":\"黑土\",\"sarada uchiha\":\"宇智波佐良娜\",\"tayuya\":\"多由也\",\"temari\":\"手鞠\",\"naruto uzumaki\":\"漩涡鸣人\",\"minato namikaze\":\"波风水门\",\"hinata hyuga\":\"日向雏田\",\"kushina uzumaki\":\"漩涡玖辛奈\",\"kakashi hatake\":\"旗木卡卡西\",\"shikamaru nara\":\"奈良鹿丸\",\"hashirama senju\":\"千手柱间\",\"madara uchiha\":\"宇智波斑\",\"itachi uchiha\":\"宇智波鼬\",\"boruto uzumaki\":\"漩涡博人\",\"himawari uzumaki\":\"漩涡向日葵\",\"cinque izumi\":\"真红·和泉\",\"millhiore firianno biscotti\":\"米希奥蕾·菲利安诺·比斯科迪\",\"leonmitchelli galette des rois\":\"蕾昂米修莉·加雷特·德·罗瓦\",\"gaul galette des rois\":\"高尔·迦雷特·德·罗瓦\",\"yukikaze panettone\":\"雪风·帕尼托尼\",\"rebecca anderson\":\"蕾蓓卡·安德森\",\"noir vinocacao\":\"诺瓦鲁·可可酒\",\"eclair martinozzi\":\"艾克蕾尔·马尔迪诺基\",\"ricotta elmar\":\"利歌塔·埃玛\",\"nanami takatsuki\":\"高槻七海\",\"brioche darquien\":\"布丽奥修·达尔基昂\",\"couvert eschenbach pastillage\":\"库贝尔·艾申巴赫·帕斯提亚修\",\"percy gaudi\":\"帕西·高迪\",\"vert farbreton\":\"贝尔·法布林塔\",\"violle amaretto\":\"毕欧蕾·亚玛雷特\",\"jaune clafouti\":\"乔奴·克拉芙缇\",\"adelaide grand marnier\":\"阿德莱德·格兰玛尼亚\",\"sharu\":\"夏露\",\"kanata\":\"彼方\",\"eika\":\"艾卡\",\"kizuna ai\":\"绊爱\",\"kaguya luna\":\"辉夜月\",\"mirai akari\":\"Mirai Akari\",\"nojaoji\":\"Mikoko\",\"kira yamato\":\"基拉·大和\",\"miriallia haw\":\"米丽雅莉亚·哈乌\",\"natarle badgiruel\":\"娜塔尔·巴基露露\",\"murrue ramius\":\"玛琉·拉米亚斯\",\"stella loussier\":\"史黛拉·露西耶\",\"meer campbell\":\"米娅·坎贝尔\",\"meyrin hawke\":\"美玲·霍克\",\"lunamaria hawke\":\"露娜玛丽亚·霍克\",\"flay allster\":\"芙蕾·阿尔斯塔\",\"cagalli yula athha\":\"卡嘉莉·尤拉·阿斯哈\",\"lacus clyne\":\"拉克丝·克莱茵\",\"haruhiko ichijou\":\"一条晴彦\",\"mai kawakami\":\"川神舞\",\"reina izumi\":\"和泉玲奈\",\"koito minase\":\"水无濑小糸\",\"doraemon\":\"哆啦A梦\",\"nobita nobi\":\"野比大雄\",\"shizuka minamoto\":\"源静香\",\"suneo honekawa\":\"骨川小夫\",\"takeshi gouda\":\"刚田武（胖虎）\",\"tamako nobi\":\"野比玉子\",\"dorami\":\"哆啦美\",\"hidetoshi dekisugi\":\"出木杉英才\",\"daiwa scarlet\":\"大和赤骥\",\"gold ship\":\"黄金船\",\"hishi amazon\":\"菱亚马逊\",\"mejiro mcqueen\":\"目白麦昆\",\"silence suzuka\":\"无声铃鹿\",\"special week\":\"特别周\",\"tokai teio\":\"东海帝王\",\"taiki shuttle\":\"大树快车\",\"neptune\":\"涅普迪努\",\"noire\":\"诺瓦尔\",\"blanc\":\"布兰\",\"vert\":\"贝露\",\"peashy\":\"皮榭\",\"plutia\":\"普露露特\",\"uzume\":\"天王星涡芽\",\"nepgear\":\"涅普姬雅\",\"uni\":\"优尼\",\"rom\":\"萝姆\",\"purple heart\":\"绀紫之心\",\"black heart\":\"圣黑之心\",\"white heart\":\"纯白之心\",\"green heart\":\"翠绿之心\",\"compa\":\"康帕\",\"cave\":\"Cave\",\"histoire\":\"伊丝特瓦尔\",\"yuu otosaka\":\"乙坂有宇\",\"nao tomori\":\"友利奈绪\",\"misa kurobane\":\"西森柚咲\",\"ayumi otosaka\":\"乙坂步未\",\"ichika nakano\":\"中野一花\",\"nino nakano\":\"中野二乃\",\"miku nakano\":\"中野三玖\",\"yotsuba nakano\":\"中野四叶\",\"itsuki nakano\":\"中野五月\",\"tokino sora\":\"时乃空\",\"roboco\":\"萝卜子\",\"sakura miko\":\"樱巫女\",\"hoshimachi suisei\":\"星街彗星\",\"yozora mel\":\"夜空梅露\",\"aki rosenthal\":\"亚绮·罗森塔尔\",\"akai haato\":\"赤井心\",\"shirakami fubuki\":\"白上吹雪\",\"natsuiro matsuri\":\"夏色祭\",\"minato aqua\":\"凑阿库娅\",\"murasaki shion\":\"紫咲诗音\",\"nakiri ayame\":\"百鬼绫目\",\"yuzuki choco\":\"癒月巧可\",\"oozora subaru\":\"大空昴\",\"ookami mio\":\"大神澪\",\"inugami korone\":\"戌神沁音\",\"nekomata okayu\":\"猫又小粥\",\"usada pekora\":\"兔田佩克拉\",\"uruha rushia\":\"润羽露西娅\",\"shiranui flare\":\"不知火芙蕾雅\",\"shirogane noel\":\"白银诺艾尔\",\"houshou marine\":\"宝钟玛琳\",\"amane kanata\":\"天音彼方\",\"kiryu coco\":\"桐生可可\",\"tsunomaki watame\":\"角卷绵芽\",\"tokoyami towa\":\"常暗永远\",\"himemori luna\":\"姬森璐娜\",\"mumei\":\"无名\",\"ayane\":\"绫音\",\"mai shiranui\":\"不知火舞\",\"naotora ii\":\"井伊直虎\",\"lu lingqi\":\"吕玲绮\",\"zhurong\":\"祝融\",\"sun shang xiang\":\"孙尚香\",\"nene\":\"宁宁\",\"inahime\":\"稻姬\",\"sima yi\":\"司马懿\",\"wang yuanji\":\"王元姬\",\"yue ying\":\"黄月英\",\"zhang chunhua\":\"张春华\",\"zhuge liang\":\"诸葛亮\",\"ranma saotome\":\"早乙女乱马\",\"angela\":\"安吉拉\",\"riesz\":\"莉斯\",\"eucliwood hellscythe\":\"优克莉伍德·海尔赛兹\",\"hinako shijou\":\"四条雏子\",\"yuri sakazaki\":\"坂崎百合\",\"michelle k. davis\":\"米歇尔·K·戴维斯\",\"chihiro ogino\":\"荻野千寻\",\"tessie\":\"泰茜\",\"leia rolando\":\"蕾娅·罗兰德\",\"nami\":\"娜美\",\"tashigi\":\"达斯琪\",\"wang liu mei\":\"王留美\",\"sage\":\"贤者\",\"merchant\":\"商人\",\"hero\":\"勇者\",\"wizard\":\"魔法师\",\"cleric\":\"僧侣\",\"warrior\":\"战士\",\"asuka langley soryu\":\"惣流·明日香·兰格雷\",\"lucina\":\"露琪娜\",\"cynthia\":\"竹兰 | 辛西娅\",\"hikari horaki\":\"洞木光\",\"rei ayanami\":\"绫波丽\",\"milly\":\"米蕾尤\",\"kusuha mizuha\":\"水羽楠叶\",\"seolla schweizer\":\"塞奥拉·修拜亚\",\"fujiko mine\":\"峰不二子\",\"mirai andou\":\"安藤美雷\",\"himea saito\":\"赛托希梅亚\",\"fuu hououji\":\"凤凰寺风\",\"hikaru shindo\":\"进藤光 | 狮堂光\",\"umi ryuuzaki\":\"龙崎海\",\"ai asato\":\"麻里爱\",\"reiko katherine akimoto\":\"秋本丽子\",\"hina\":\"日奈 | 雏\",\"matoi giboshi\":\"拟宝珠缠\",\"lemon giboshi\":\"拟宝珠柠檬\",\"iroha\":\"伊吕波\",\"arle nadja\":\"阿露露\",\"tifa lockhart\":\"蒂法·洛克哈特\",\"aerith gainsborough\":\"艾瑞丝·盖恩斯巴勒\",\"yuffie kisaragi\":\"尤菲·如月\",\"fumie hashimoto\":\"桥本文惠\",\"yuuko amasawa\":\"天泽勇子\",\"yuuko okonogi\":\"小此木京子\",\"elphelt valentine\":\"艾露菲鲁特·华伦泰\",\"jam kuradoberi\":\"藏土缘纱梦\",\"ramlethal valentine\":\"拉姆蕾萨尔·华伦泰\",\"alisa ilinichina amiella\":\"亚莉莎·伊莉妮提娜·阿米耶拉\",\"lara croft\":\"劳拉·克罗夫特\",\"naoto shirogane\":\"白钟直斗\",\"hajime ichinose\":\"一之濑初\",\"rabi en rose\":\"拉比安露斯\",\"lei fang\":\"雷芳\",\"menace\":\"美纳斯\",\"tina armstrong\":\"蒂娜·阿姆斯特朗\",\"anri misugi\":\"美杉杏莉\",\"makoto hozumi\":\"穗积真琴\",\"misao shinohara\":\"筱原美纱绪\",\"sasami iwakura\":\"岩仓砂沙美\",\"maam\":\"玛姆\",\"momo yaoyorozu\":\"八百万百\",\"ochako uraraka\":\"丽日御茶子\",\"tsuyu asui\":\"蛙吹梅雨\",\"izana shinatose\":\"科户濑伊札那\",\"nagate tanikaze\":\"谷风长道\",\"elpeo ple\":\"艾露比·普露\",\"haman karn\":\"哈曼·卡恩\",\"leina ashta\":\"莉娜·亚西塔\",\"ple two\":\"普露兹\",\"kurisu makise\":\"牧濑红莉栖\",\"maribel\":\"玛丽贝尔\",\"precia zan zenosakis\":\"普蕾茜娅·泽诺萨奇斯\",\"ruka urushibara\":\"漆原琉华\",\"yui takamura\":\"篁唯依\",\"nico robin\":\"妮可·罗宾\",\"saint shalulia\":\"夏露莉雅宫\",\"snow white\":\"白雪公主\",\"little red riding hood\":\"小红帽\",\"saaya agata\":\"安形纱绫\",\"mamori anezaki\":\"姊崎真守\",\"sena kobayakawa\":\"小早川濑那\",\"latooni suvota\":\"拉托妮·苏波塔\",\"shine hausen\":\"夏茵·豪森\",\"stella bremer\":\"史黛拉·布瑞梅尔\",\"bianca whitaker\":\"碧安卡·惠特克\",\"crea dolosera\":\"克蕾雅·多萝赛娅\",\"mikono suzushiro\":\"御子乃·铃白\",\"suomi konepi\":\"须绪美·科妮皮\",\"shinji ikari\":\"碇真嗣\",\"reika shimohira\":\"下平玲花\",\"katina tarask\":\"卡琪娜·塔拉斯克\",\"leona garstein\":\"雷欧娜·嘉施泰因\",\"poison\":\"毒药\",\"jessica albert\":\"杰西卡·阿尔芭\",\"jigoku no fubuki\":\"地狱的吹雪\",\"senritsu no tatsumaki\":\"战栗的龙卷\",\"tights brief\":\"塔依丝\",\"hugo\":\"雨果\",\"nel zelpher\":\"奈露\",\"sadi-chan\":\"小萨蒂\",\"mina ashido\":\"芦户三奈\",\"rebecca\":\"蕾贝卡\",\"amazon\":\"亚马逊\",\"sorceress\":\"女巫\",\"serena\":\"莎莉娜 | 瑟妮娅 | 塞瑞娜\",\"shauna\":\"莎娜\",\"kiruko otonashi\":\"音无斩子\",\"boa hancock\":\"波雅·汉库克\",\"monkey d. luffy\":\"蒙奇·D·路飞\",\"elf\":\"精灵\",\"neko musume\":\"猫娘\",\"kaoru matsubara\":\"松原薰\",\"miyako gotokuji\":\"豪得寺美弥子\",\"momoko akatsutsumi\":\"赤提和美子\",\"kougyoku ren\":\"练红玉\",\"masrur\":\"马斯鲁尔\",\"morgiana\":\"摩尔迦娜\",\"sharrkan\":\"迦尔鲁卡\",\"sinbad\":\"辛巴德\",\"yamuraiha\":\"雅姆莱哈\",\"kurumi kumamakura\":\"熊枕久瑠美\",\"priscilla barielle\":\"普莉希拉·跋利耶尔\",\"roomi\":\"萝米\",\"martial artist\":\"武斗家\",\"thief\":\"盗贼\",\"nera briscoletti\":\"芙萝菈\",\"crimson viper\":\"深红毒蛇\",\"blue mary\":\"布鲁玛丽\",\"king\":\"琼\",\"dark magician girl\":\"黑魔术少女\",\"silent magician\":\"沉默魔术师\",\"marcille donato\":\"玛露西尔\",\"fumina hoshino\":\"星野文奈\",\"angela balzac\":\"安吉拉·巴尔扎克\",\"yanagi takayama\":\"高山柳\",\"nako oshimizu\":\"押水菜子\",\"sawa okita\":\"冲田纱羽\",\"bloodberry\":\"红莓\",\"cherry\":\"樱桃\",\"sakuya tachibana\":\"橘咲夜\",\"kimi aoi\":\"葵·喜美\",\"tori aoi\":\"葵·托利\",\"akira yamamoto\":\"山本玲\",\"kaoru niimi\":\"新见熏\",\"makoto harada\":\"原田真琴\",\"mikage kiryuu\":\"桐生美影\",\"melda deitz\":\"梅尔达·狄兹\",\"yuki mori\":\"森雪\",\"ainz ooal gown\":\"安兹·乌尔·恭\",\"albedo\":\"雅儿贝德 | 阿贝多\",\"aura bella fiora\":\"亚乌菈·贝拉·菲欧拉\",\"clementine\":\"克莱门汀\",\"mare bello fiore\":\"马雷·贝罗·菲欧雷\",\"shalltear bloodfallen\":\"夏提雅·布拉德弗伦\",\"ai\":\"爱\",\"ai kagano\":\"加贺野爱\",\"mayu\":\"美格\",\"rin\":\"凛\",\"farrah\":\"法拉\",\"zooey\":\"佐伊\",\"natsu dragneel\":\"纳兹·多拉格尼尔\",\"kirara\":\"绮良良\",\"tamaki kousaka\":\"向坂环\",\"sellma\":\"罗克珊努\",\"ruida\":\"莉卡\",\"mar\":\"梅亚\",\"vice\":\"薇思\",\"misato katsuragi\":\"葛城美里\",\"mari illustrious makinami\":\"真希波·真理·伊拉丝多莉亚斯\",\"angewomon\":\"天女兽\",\"kazemon\":\"彩虹兽\",\"ladydevimon\":\"妖女兽\",\"lilamon\":\"丁香兽\",\"lilymon\":\"百合兽\",\"renamon\":\"妖狐兽\",\"sakuyamon\":\"沙古牙兽\",\"zephyrmon\":\"风神兽\",\"martina\":\"玛尔缇娜\",\"sancho\":\"桑丘\",\"barron trump\":\"巴伦·特朗普\",\"donald trump\":\"唐纳德·特朗普\",\"bill clinton\":\"比尔·克林顿\",\"hillary clinton\":\"希拉里·克林顿\",\"vladimir putin\":\"弗拉基米尔·普京\",\"barack obama\":\"巴拉克·奥巴马\",\"taro aso\":\"麻生太郎\",\"abraham lincoln\":\"亚伯拉罕·林肯\",\"george w. bush\":\"乔治·沃克·布什\",\"osama bin laden\":\"奥萨马·本·拉登\",\"adolf hitler\":\"阿道夫·希特勒\",\"anne frank\":\"安妮·弗兰克\",\"lusamine\":\"露莎米奈\",\"angelise ikaruga misurugi\":\"安琪丽莎·斑鸠·米斯尔奇\",\"lelouch vi britannia\":\"鲁路修·vi·布里塔尼亚\",\"c.c.\":\"C.C.\",\"charlotte dunois\":\"夏洛特·德诺阿\",\"nena trinity\":\"妮娜·崔尼帝\",\"louise francoise le blanc de la valliere\":\"露易丝\",\"saito hiraga\":\"平贺才人\",\"shana\":\"夏娜\",\"zero two\":\"02\",\"ichigo\":\"莓\",\"strelizia\":\"鹤望兰号\",\"hiro\":\"广\",\"alice liddell\":\"爱丽丝·李道尔\",\"cinderella\":\"辛德瑞拉\",\"noa himesaka\":\"姬坂乃爱\",\"miyako hoshino\":\"星野宫子\",\"hana shirosaki\":\"白咲花\",\"hinata hoshino\":\"星野日向\",\"may\":\"小遥\",\"dawn\":\"小光\",\"kyaru\":\"凯露\",\"mai sakurajima\":\"樱岛麻衣\",\"ai mizuno\":\"水野爱\",\"yuuma kuga\":\"空闲游真\",\"kokkoro\":\"可可萝\",\"holo\":\"赫萝\",\"marie rose\":\"玛丽·萝丝\",\"helena douglas\":\"海莲娜\",\"sylvanas windrunner\":\"希尔瓦娜斯·风行者\",\"nessa\":\"露璃娜\",\"sonia\":\"索妮亚\",\"mallow\":\"玛奥\",\"melony\":\"美蓉\",\"kama\":\"迦摩\",\"yu mei-ren\":\"虞美人\",\"beni-enma\":\"红阎魔\",\"carmilla\":\"卡米拉\",\"valkyrie\":\"瓦尔基里\",\"chiyo shirayuki\":\"白雪千夜\",\"chitose kurosaki\":\"黑埼千岁\",\"kiyomi saejima\":\"冴岛清美\",\"cure milky\":\"羽衣拉拉\",\"rinko iori\":\"伊织凛子\",\"sei iori\":\"伊织诚\",\"bea\":\"彩豆\",\"kudryavka noumi\":\"能美·库特莉亚芙卡\",\"yuuko shionji\":\"紫苑寺有子\",\"narumi fujishima\":\"藤岛鸣海\",\"sister claire\":\"修女克蕾雅\",\"momo chiyoda\":\"千代田桃\",\"yuko yoshida\":\"吉田优子\",\"reines el-melloi archisorte\":\"莱妮丝·埃尔梅罗·阿奇佐尔缇\",\"rindou mikoto\":\"龙胆尊\",\"hotaru ichijou\":\"一条萤\",\"komari koshigaya\":\"越谷小鞠\",\"maria balthasar\":\"玛利亚·巴尔塔札尔\",\"emeralda kasim\":\"艾美拉达·卡西姆\",\"ai hinatsuru\":\"雏鹤爱\",\"ginko sora\":\"空银子\",\"chariot\":\"战轮妖精\",\"strength\":\"力量\",\"kirika akatsuki\":\"晓切歌\",\"asuha chigusa\":\"千种明日叶\",\"kasumi chigusa\":\"千种霞\",\"ange katrina\":\"安洁·卡特莉娜\",\"cagliostro\":\"卡莉奥斯特萝\",\"kyouka hikawa\":\"冰川镜华\",\"retoree\":\"莱托莉\",\"cyan hijirikawa\":\"希安（圣川诗杏）\",\"saren sasaki\":\"佐佐木咲恋\",\"niyon\":\"妮欧\",\"yuel\":\"尤艾尔\",\"societte\":\"苏丝雅\",\"kanau kongou\":\"金刚叶\",\"yuuko aioi\":\"相生祐子\",\"mio naganohara\":\"长野原美绪\",\"mai minakami\":\"水上麻衣\",\"nano shinonome\":\"东云名乃\",\"hakase shinonome\":\"东云博士\",\"kobayashi\":\"小林\",\"ririchiyo shirakiin\":\"白鬼院凛凛蝶\",\"sana inui\":\"乾纱凪\",\"nanachi\":\"娜娜奇\",\"nursery rhyme\":\"童谣\",\"hasuki komai\":\"狛井莲季\",\"juliet persia\":\"朱丽叶·佩尔西亚\",\"romio inuzuka\":\"犬冢露壬雄\",\"himawari furutani\":\"古谷向日葵\",\"sakurako ohmuro\":\"大室樱子\",\"raphtalia\":\"拉芙塔莉雅\",\"filo\":\"菲洛\",\"altina orion\":\"亚尔缇娜·奥莱恩\",\"amiya\":\"阿米娅\",\"regu\":\"雷古\",\"riko\":\"莉可\",\"six\":\"希斯\",\"maple\":\"梅普露 | 枫\",\"nezuko kamado\":\"灶门祢豆子\",\"reina kousaka\":\"高坂丽奈\",\"kumiko oumae\":\"黄前久美子\",\"ririka kenzaki\":\"剑崎梨梨花\",\"kanade hisaishi\":\"久石奏\",\"mizore yoroizuka\":\"铠冢霙\",\"nozomi kasaki\":\"伞木希美\",\"yuuko yoshikawa\":\"吉川优子\",\"natsuki nakagawa\":\"中川夏纪\",\"sapphire kawashima\":\"川岛绿辉\",\"kaori nakaseko\":\"中世古香织\",\"hazuki katou\":\"加藤叶月\",\"haruka ogasawara\":\"小笠原晴香\",\"asuka tanaka\":\"田中明日香\",\"raina kitamura\":\"喜多村来南\",\"mikino oka\":\"冈美贵乃\",\"izumi akazawa\":\"赤泽泉美\",\"noboru taki\":\"泷升\",\"masahiro hashimoto\":\"桥本真博\",\"riko nagase\":\"长濑梨子\",\"takuya gotou\":\"后藤卓也\",\"shuuichi tsukamoto\":\"塚本秀一\",\"akiko yoshizawa\":\"吉泽明子\",\"satomi niiyama\":\"新山聪美\",\"fuutarou uesugi\":\"上杉风太郎\",\"kanao tsuyuri\":\"栗花落香奈乎\",\"shinobu kochou\":\"蝴蝶忍\",\"giyuu tomioka\":\"富冈义勇\",\"mitsuri kanroji\":\"甘露寺蜜璃\",\"zenitsu agatsuma\":\"我妻善逸\",\"tanjirou kamado\":\"灶门炭治郎\",\"kyojuro rengoku\":\"炼狱杏寿郎\",\"obanai iguro\":\"伊黑小芭内\",\"aoi kanzaki\":\"神崎葵\",\"sabito\":\"锖兔\",\"tengen uzui\":\"宇髄天元\",\"hodaka morishima\":\"森岛帆高\",\"chiaki minami\":\"南千秋\",\"haruka minami\":\"南夏奈\",\"kana minami\":\"南春香\",\"mako\":\"真\",\"yuka uchida\":\"内田由加\",\"kaede azusagawa\":\"梓川枫\",\"rio futaba\":\"双叶理央\",\"sakuta azusagawa\":\"梓川咲太\",\"tomoe koga\":\"古贺朋绘\",\"coquelicot\":\"蔻库莉可\",\"erica fontaine\":\"艾莉卡·芳汀\",\"glycine bleumer\":\"库莉西奴·布鲁马\",\"hanabi kitaoji\":\"北大路花火\",\"ichiro ogami\":\"大神一郎\",\"lobelia carlini\":\"罗贝莉娅·卡尔里尼\",\"nodoka toyohama\":\"丰滨和香\",\"shouko makinohara\":\"牧之原翔子\",\"iris chateaubriand\":\"伊莉斯·夏特布里安\",\"sakura shinguji\":\"真宫寺樱\",\"kohran li\":\"李红兰\",\"sumire kanzaki\":\"神崎堇\",\"ci caprice\":\"茜·卡普利斯\",\"mell raison\":\"梅尔·雷森\",\"orihime soletta\":\"索蕾塔·织姬\",\"reni milchstrasse\":\"雷尼·米尔西修特拉瑟\",\"maria tachibana\":\"玛丽亚·橘\",\"kanna kirishima\":\"桐岛神奈\",\"tsubaki takamura\":\"高村椿\",\"ayame fujieda\":\"藤枝菖蒲\",\"cloud strife\":\"克劳德·史特莱夫\",\"kaede fujieda\":\"藤枝枫\",\"diana caprice\":\"黛安娜·卡普利斯\",\"ratchet altair\":\"拉琪特·奥泰尔\",\"shinjiro taiga\":\"大河新次郎\",\"subaru kujou\":\"九条昴\",\"wakana shinguji\":\"真宫寺若菜\",\"carino soletta\":\"卡莉诺·素蕾塔\",\"margueritte chateaubriand\":\"玛格丽特·夏特布里安\",\"yuri sakakibara\":\"榊原由里\",\"gemini sunrise\":\"洁蜜妮·桑莱兹\",\"anthy himemiya\":\"姬宫安茜\",\"utena tenjou\":\"天上欧蒂娜\",\"ai hayasaka\":\"早坂爱\",\"kaguya shinomiya\":\"四宫辉夜\",\"miyuki shirogane\":\"白银御行\",\"chika fujiwara\":\"藤原千花\",\"soushi miketsukami\":\"御狐神双炽\",\"maya tendo\":\"天堂真矢\",\"seto miyako\":\"濑户美夜子\",\"pecorine\":\"佩可莉姆\",\"harumi fujiyoshi\":\"藤吉晴美\",\"chiri kitsu\":\"木津千里\",\"kaere kimura\":\"木村卡愛拉\",\"nozomu itoshiki\":\"糸色望\",\"veight\":\"斑特\",\"wicke\":\"碧珂\",\"astarotte ygvar\":\"亚斯塔萝黛·尤各瓦尔\",\"asuha touhara\":\"塔原明日叶\",\"isadora finnsdottir\":\"伊莎朵拉·方斯德托\",\"ingrid sorveig sorgrims\":\"伊格丽德·索维克·索尔格利吾斯\",\"yumiko miura\":\"三浦优美子\",\"chiyo sakura\":\"佐仓千代\",\"umetarou nozaki\":\"野崎梅太郎\",\"akari kazemiya\":\"风宫茜里\",\"ilya ornstein\":\"伊莉雅·奥恩斯坦\",\"miyako izumo\":\"出云宫子\",\"shinobu kamiki\":\"上喜忍\",\"vikala\":\"碧卡拉\",\"hayate hisakawa\":\"久川飒\",\"nagi hisakawa\":\"久川凪\",\"shika kuroi\":\"黑井诗花\",\"nadeshiko kagamihara\":\"各务原抚子\",\"rin shima\":\"志摩凛\",\"chiaki oogaki\":\"大垣千明\",\"aoi inuyama\":\"犬山葵\",\"ena saitou\":\"齐藤惠那\",\"sugumi kanagata\":\"金潟すぐみ\",\"yasuri araime\":\"新居目安里\",\"raiya kaeruzaka\":\"蛙坂来弥\",\"rita henschel\":\"リタ・ヘンシェル\",\"serina niiya\":\"新谷芹菜\",\"shirley oakley\":\"シャーリー・オークレイ\",\"shitara kaneshiya\":\"兼志谷シタラ\",\"rin himukai\":\"日向リン\",\"giorno giovanna\":\"乔鲁诺·乔巴拿\",\"belzerg stylish sword iris\":\"贝尔泽古·斯黛莉休·索德·爱丽丝\",\"hibiki tsukahara\":\"冢原响\",\"junichi tachibana\":\"橘纯一\",\"mafuyu kirisu\":\"桐须真冬\",\"nariyuki yuiga\":\"唯我成幸\",\"alice zuberg\":\"爱丽丝·滋贝鲁库\",\"selka zuberg\":\"赛鲁卡·滋贝鲁库\",\"haruhiro\":\"哈尔希洛\",\"yume\":\"梦儿\",\"shihoru\":\"席赫露\",\"ranta\":\"蓝德\",\"moguzo\":\"莫古索\",\"merry\":\"梅莉\",\"tamamo cat\":\"玉藻猫\",\"kiritan tohoku\":\"东北切蒲英\",\"rikka takarada\":\"宝多六花\",\"anastasia nikolaevna romanova\":\"阿纳斯塔西娅·尼古拉耶芙娜·罗曼诺娃\",\"miko iino\":\"伊井野弥子\",\"yuu ishigami\":\"石上优\",\"sasaki saku\":\"笹木咲\",\"arulumaya\":\"阿露露梅娅\",\"cain\":\"该隐\",\"mahira\":\"玛琪拉\",\"melissabelle\":\"梅丽莎贝尔\",\"pholia\":\"芙莉亚\",\"sandalphon\":\"圣德芬\",\"akari tsujino\":\"辻野朱里\",\"aru honshou\":\"本庄阿鲁\",\"junko konno\":\"绀野纯子\",\"saki nikaidou\":\"二阶堂咲\",\"yuugiri\":\"夕雾\",\"lily hoshikawa\":\"星川莉莉\",\"koutarou tatsumi\":\"巽幸太郎\",\"sakura minamoto\":\"源樱\",\"tae yamada\":\"山田多惠\",\"ayano sugiura\":\"杉浦绫乃\",\"akari akaza\":\"赤座灯里\",\"kyouko toshinou\":\"岁纳京子\",\"reisalin stout\":\"莱莎琳·斯托特\",\"kudou chitose\":\"久远千岁\",\"higuchi kaede\":\"樋口枫\",\"tsukino mito\":\"月之美兔\",\"yui kusano\":\"草野优衣\",\"kanon daiba\":\"台场夏音\",\"marnie\":\"玛俐\",\"taokaka\":\"桃卡卡\",\"medusa lily\":\"美杜莎（Lancer）\",\"salome\":\"莎乐美\",\"zeta\":\"泽塔\",\"beatrix\":\"贝阿朵丽丝\",\"hoshikawa sara\":\"星川莎拉\",\"honma himawari\":\"本间向日葵🌻\",\"kakyoin chieri\":\"花京院樱桃\",\"lize helesta\":\"莉泽·赫露艾斯塔\",\"saionji mary\":\"西园寺メアリ\",\"suou patra\":\"周防帕特拉\",\"shiina yuika\":\"椎名唯华\",\"shizuka rin\":\"静凛\",\"natori sana\":\"名取纱那\",\"yuzuki roa\":\"梦月萝娅\",\"warabeda meiji\":\"童田明治\",\"souya ichika\":\"宗谷Ichika\",\"raihan\":\"奇巴纳\",\"victor\":\"小胜\",\"hop\":\"赫普\",\"gloria\":\"小优\",\"allister\":\"欧尼奥\",\"klara\":\"克拉拉\",\"dola\":\"多拉\",\"moon\":\"美月\",\"rosa\":\"鸣依\",\"ars almal\":\"阿露丝·阿尔玛\",\"elesa\":\"小菊儿\",\"selene\":\"美月\",\"lillie\":\"莉莉艾\",\"honoka\":\"穗香\",\"hex maniac\":\"灵异迷\",\"hypno\":\"引梦貘人\",\"lana\":\"水莲\",\"lanas mom\":\"水莲的妈妈\",\"kiawe\":\"卡奇\",\"elio\":\"朗日\",\"pikachu\":\"皮卡丘\",\"slowpoke\":\"呆呆兽\",\"izuna hatsuse\":\"初濑伊纲\",\"shiro\":\"白\",\"stephanie\":\"史蒂芬妮\",\"stephanie dola\":\"史蒂芬妮·多拉\",\"jibril\":\"吉普莉尔\",\"sora\":\"空\",\"chizuru ichinose\":\"一之濑千鹤\",\"kazuya kinoshita\":\"木之下和也\",\"sukoya kana\":\"健屋花那\",\"makaino ririmu\":\"魔界之莉莉姆\",\"emma august\":\"艾玛★奥加斯特\",\"hakase fuyuki\":\"叶加濑冬雪\",\"izumo kasumi\":\"出云霞\",\"ushimi ichigo\":\"宇志海莓\",\"yuhi riri\":\"夕阳莉莉\",\"suzuka utako\":\"铃鹿诗子\",\"mononobe alice\":\"物述有栖\",\"moira\":\"摩伊拉\",\"ienaga mugi\":\"家长麦\",\"aki suzuya\":\"铃谷秋\",\"yashiro kizuku\":\"社筑\",\"uduki kou\":\"卯月光\",\"todoroki kyoko\":\"轰京子\",\"suzuki masaru\":\"铃木胜\",\"ryushen\":\"绿仙\",\"morinaka kazaki\":\"森中花咲\",\"kuzuha\":\"葛叶\",\"kenmochi toya\":\"剑持刀也\",\"hanabatake chaika\":\"花畑嘉依卡\",\"fumino tamaki\":\"文野环\",\"elu\":\"艾露\",\"akabane youko\":\"赤羽叶子\",\"aduchi momo\":\"安土桃\",\"yamiyono moruru\":\"暗夜乃莫露露\",\"fuyuki hinata\":\"日向冬树\",\"natsumi hinata\":\"日向夏美\",\"aki hinata\":\"日向秋\",\"cheshire\":\"柴郡\",\"savage\":\"暴行\",\"type 95\":\"95式 | 黛烟\",\"aki shiina\":\"椎名亚树\",\"nana sunohara\":\"春原菜菜\",\"ayaka sunohara\":\"春原彩花\",\"yang guifei\":\"杨贵妃\",\"akane shinjou\":\"新条茜\",\"mirai kuriyama\":\"栗山未来\",\"akihito kanbara\":\"神原秋人\",\"ichika orimura\":\"织斑一夏\",\"chifuyu orimura\":\"织斑千冬\",\"gray\":\"格蕾\",\"koyanskaya\":\"高扬斯卡娅\",\"mineva lao zabi\":\"密涅瓦·劳·扎比（汤小美）\",\"marida cruz\":\"玛莉妲·库鲁斯\",\"jeanne alter lily\":\"贞德·Alter·Santa·Lily\",\"mizuki usami\":\"宇佐美瑞希\",\"subaru uchimaki\":\"内卷昴\",\"sayla mass\":\"塞拉·玛斯\",\"daisy mo\":\"墨小菊\",\"violet wen\":\"文芷\",\"sunny chih\":\"迟菓\",\"sarah kerrigan\":\"莎拉·凯瑞甘\",\"ozymandias\":\"奥斯曼狄斯\",\"paimon\":\"派蒙\",\"hilbert\":\"斗也\",\"hilda\":\"希尔达 | 斗子\",\"skyla\":\"风露\",\"elisa\":\"秋子\",\"misty\":\"小霞\",\"alena\":\"安莉娜\",\"reimi saionji\":\"蕾米\",\"maika sakuranomiya\":\"樱之宫莓香\",\"kaho hinata\":\"日向夏帆\",\"mafuyu hoshikawa\":\"星川麻冬\",\"miu amano\":\"天野美雨\",\"hideri kanzaki\":\"神崎日照\",\"claudine saijo\":\"西条克洛迪娜\",\"deutschland\":\"德意志\",\"admiral graf spee\":\"斯佩伯爵海军上将\",\"dunkerque\":\"敦刻尔克\",\"shirayuki tomoe\":\"白雪巴\",\"yui akamatsu\":\"赤松结衣\",\"sat-chan\":\"小幸\",\"kotoha\":\"青山琴叶\",\"ringo oohoshi\":\"大星林檎\",\"shinobu sarutobi\":\"猿飞忍\",\"keine kanzaki\":\"神崎桂音\",\"aoi ichijou\":\"一条葵\",\"lyrule\":\"莉露露\",\"naofumi iwatani\":\"岩谷尚文（盾之勇者）\",\"melty q melromarc\":\"梅蒂·Q·梅洛马格\",\"mirellia q melromarc\":\"米蕾莉亚·Q·梅洛马格\",\"malty melromarc\":\"麦蒂·S·梅洛玛格\",\"motoyasu kitamura\":\"北村元康（枪之勇者）\",\"hana uzaki\":\"宇崎花\",\"tsuki uzaki\":\"宇崎月\",\"shinichi sakurai\":\"樱井真一\",\"ryoko yoshida\":\"吉田良子\",\"sieg\":\"齐格\",\"hajime nagumo\":\"南云始\",\"yue\":\"月\",\"shea haulia\":\"希娅·哈乌利亚\",\"kaori shirasaki\":\"白崎香织\",\"hanako honda\":\"本田华子\",\"olivia\":\"奥莉薇\",\"kasumi nomura\":\"野村香纯\",\"merribit stapleton\":\"梅莉毕德･斯泰普尔顿\",\"tanya von degurechaff\":\"谭雅·提古雷查夫\",\"viktoriya ivanovna serebryakov\":\"维夏\",\"takamiya rion\":\"鹰宫莉音\",\"ruka sarashina\":\"更科瑠夏\",\"sumi sakurasawa\":\"樱泽墨\",\"mami nanami\":\"七海麻美\",\"frankenstein\":\"弗兰肯斯坦（肯娘）\",\"nina maehara\":\"前原仁菜\",\"uruka takemoto\":\"武元润香\",\"fumino furuhashi\":\"古桥文乃\",\"rizu ogata\":\"绪方理珠\",\"asumi kominami\":\"小美浪爱澄\",\"echidna\":\"艾姬多娜\",\"haruka oozora\":\"大空遥\",\"kanata higa\":\"比嘉彼方\",\"narumi tooi\":\"远井成美\",\"ayasa tachibana\":\"立花彩纱\",\"leaf\":\"叶子\",\"diablo\":\"迪亚布罗（坂本拓真）\",\"rem galleu\":\"蕾姆·嘉蕾邬\",\"shera l. greenwood\":\"雪拉·L·古林伍德\",\"alicia crystella\":\"艾莉西亚·库里斯特拉\",\"edelgard\":\"艾德尔卡特\",\"krebskulm\":\"库尔姆\",\"chocola\":\"巧克力\",\"cinnamon\":\"桂\",\"coconut\":\"椰子\",\"vanilla\":\"香草\",\"shinku nikaidou\":\"二阶堂真红\",\"shiori kashiwazaki\":\"柏崎栞\",\"link\":\"林克\",\"wonder woman\":\"神奇女侠\",\"she-ra\":\"希瑞\",\"rapunzel\":\"长发公主\",\"hulk\":\"浩克\",\"star girl\":\"逐星女\",\"harley quinn\":\"哈莉·奎茵\",\"zatanna zatara\":\"扎塔娜·扎塔拉\",\"starfire\":\"星火\",\"supergirl\":\"超级少女\",\"superwoman\":\"超级女侠\",\"batwoman\":\"蝙蝠女侠\",\"batgirl\":\"蝙蝠少女\",\"barbara gordon\":\"芭芭拉·戈登\",\"blackfire\":\"黑火\",\"bruce wayne\":\"布鲁斯·韦恩\",\"jinx\":\"金克斯\",\"lex luthor\":\"莱克斯·卢瑟\",\"poison ivy\":\"毒藤女\",\"raven\":\"渡鸦\",\"terra\":\"泰拉\",\"black canary\":\"黑金丝雀\",\"cheetah\":\"豹女\",\"giganta\":\"巨化女\",\"lois lane\":\"露易丝·莱恩\",\"miss martian\":\"火星少女\",\"power girl\":\"神力女孩\",\"talia al ghul\":\"塔利亚·艾尔·古尔\",\"vixen\":\"雌狐\",\"le malin\":\"恶毒\",\"suzuki hina\":\"铃木雏\",\"tanaka hime\":\"田中姬\",\"nobukatsu oda\":\"织田信胜\",\"okita souji alter\":\"冲田总司Alter\",\"frostnova\":\"霜星\",\"achikita chinami\":\"うさぎ工房\",\"athena asamiya\":\"麻宫雅典娜\",\"da ji\":\"妲己\",\"da qiao\":\"大乔\",\"dong zhuo\":\"董卓\",\"sun ce\":\"孙策\",\"xiao qiao\":\"小乔\",\"zhao yun\":\"赵云\",\"dakki\":\"妲己\",\"oichi\":\"阿市\",\"itou life\":\"伊东life\",\"rangiku matsumoto\":\"松本乱菊\",\"shining\":\"闪灵\",\"jill valentine\":\"吉尔·瓦伦蒂安\",\"exusiai\":\"能天使\",\"kaworu nagisa\":\"渚薰\",\"hatsune kashiwazaki\":\"柏崎初音\",\"mdr\":\"MDR | 卡萝\",\"keqing\":\"刻晴\",\"atsuko kagari\":\"篝敦子\",\"diana cavendish\":\"戴安娜·卡文迪什\",\"eriko kuraishi\":\"仓石惠理子\",\"monkshood\":\"乌头\",\"makoto kowata\":\"木幡真琴\",\"elaina\":\"伊蕾娜\",\"ganyu\":\"甘雨\",\"jean gunnhildr\":\"琴·古恩希尔德\",\"jean\":\"琴\",\"midori fuse\":\"布施翠\",\"roxy migurdia\":\"洛琪希·米格路迪亚\",\"ghislaine dedoldia\":\"基列奴·泰德路迪亚\",\"eris boreas greyrat\":\"艾莉丝·伯雷亚斯·格雷拉特\",\"aya fujisawa\":\"菖蒲（藤泽彩）\",\"musse egret\":\"妙婕·伊格瑞特\",\"alisa reinford\":\"亚莉莎·莱恩福尔特\",\"fie claussell\":\"菲·克劳赛尔\",\"alfin reise arnor\":\"艾尔芬·莱泽·亚诺尔\",\"chen hui-chieh\":\"陈晖洁\",\"hermione granger\":\"赫敏·格兰杰\",\"shizuru hoshino\":\"星野静流\",\"mifuyu ogami\":\"大神美冬\",\"tamaki miyasaka\":\"宫坂珠希\",\"yuuki\":\"佑树\",\"yaya\":\"夜夜\",\"parvati\":\"帕尔瓦蒂\",\"okada izou\":\"冈田以藏\",\"scathach skadi\":\"斯卡哈·斯卡蒂\",\"caenis\":\"凯妮斯\",\"artoria caster\":\"阿尔托莉雅·卡斯特\",\"atlanta\":\"亚特兰大\",\"kadoc zemlupus\":\"卡多克·泽姆露普斯\",\"qin liangyu\":\"秦良玉\",\"swire\":\"诗怀雅\",\"hayase nagatoro\":\"长瀞早濑\",\"texas\":\"德克萨斯\",\"yuuta hibiki\":\"响裕太\",\"emma\":\"艾玛\",\"norman\":\"诺曼\",\"ray\":\"莱伊\",\"gilda\":\"吉尔达\",\"nat\":\"奈特\",\"anna\":\"安娜\",\"thoma\":\"托马\",\"phil\":\"菲尔\",\"isabella\":\"伊莎贝拉\",\"mujika\":\"穆希卡\",\"sonju\":\"宋杰\",\"lucas\":\"卢卡斯\",\"yugo\":\"尤格\",\"cecily cambell\":\"瑟希莉·坎贝尔\",\"skadi\":\"斯卡蒂\",\"suzuhara lulu\":\"铃原露露\",\"otogibara era\":\"御伽原江良\",\"yorumi rena\":\"夜见蕾娜\",\"yamagami karuta\":\"山神歌流多\",\"asuka hina\":\"飞鸟雏\",\"hina sorasaki\":\"空崎日奈\",\"rimuru tempest\":\"利姆鲁·特恩佩斯特\",\"milim nava\":\"米莉姆·纳瓦\",\"kotoko iwanaga\":\"岩永琴子\",\"meme touwa\":\"藤和女女\",\"makoto niwa\":\"丹羽真\",\"erio touwa\":\"藤和艾莉欧\",\"langa hasegawa\":\"驰河兰加\",\"reki kyan\":\"喜屋武历\",\"myne\":\"梅茵\",\"ferdinand\":\"斐迪南\",\"misato aikawa\":\"爱川美里\",\"mitama yakumo\":\"八云御魂\",\"momoko togame\":\"十咎桃子\",\"aurelia le guin\":\"奥蕾莉亚·勒瑰恩\",\"celine millstein\":\"瑟蕾奴·米尔斯汀\",\"elie macdowell\":\"艾莉·麦克道尔\",\"kea bannings\":\"琪雅·班宁斯\",\"lapis rosenberg\":\"拉碧丝·罗赞贝尔克\",\"nadia rayne\":\"娜狄雅·莱恩\",\"noel seeker\":\"诺艾尔·希卡\",\"rixia mao\":\"莉夏·毛\",\"tio plato\":\"缇欧·普拉托\",\"vita clotilde\":\"薇塔·克洛提德\",\"duvalie\":\"杜巴莉\",\"elise schwarzer\":\"爱丽榭·舒华泽\",\"juna crawford\":\"悠娜·克劳弗德\",\"renne bright\":\"玲·布莱特\",\"emma millstein\":\"艾玛·米尔斯汀\",\"laura s. arseid\":\"劳拉·S·亚尔赛德\",\"shirley orlando\":\"谢莉·奥兰多\",\"tita russel\":\"提妲·拉赛尔\",\"towa herschel\":\"托娃·赫歇尔\",\"claire rieveldt\":\"克蕾雅·利维特\",\"sara valestein\":\"莎拉·巴雷斯坦\",\"estelle bright\":\"艾丝蒂尔·布莱特\",\"klose rinz\":\"科洛丝·琳希\",\"chika misumi\":\"三角千歌\",\"tsumugi mayumiya\":\"茧宫纺希\",\"nozomi sakurai\":\"樱井望\",\"zhongli\":\"钟离\",\"ningguang\":\"凝光\",\"lappland\":\"拉普兰德\",\"amber\":\"安柏\",\"beidou\":\"北斗\",\"hilichurl\":\"丘丘人\",\"lumine\":\"荧\",\"hu tao\":\"胡桃\",\"kallen stadtfeld\":\"卡莲·休坦菲尔特\",\"suzaku kururugi\":\"枢木朱雀\",\"nunnally vi britannia\":\"娜娜莉·vi·布里塔尼亚\",\"kou\":\"蔻\",\"yu takasaki\":\"高咲侑\",\"shioriko mifune\":\"三船栞子\",\"olga discordia\":\"奥利卡·迪斯克伦蒂亚\",\"mamako oosuki\":\"大好真真子\",\"masato oosuki\":\"大好真人\",\"flare arlgrande jioral\":\"芙列雅·艾尔格兰帝·吉欧拉尔\",\"andira\":\"安琪拉\",\"hacka doll no.3\":\"骇客娃娃3号\",\"hacka doll no.1\":\"骇客娃娃1号\",\"hacka doll no.2\":\"骇客娃娃2号\",\"hacka doll no.4\":\"骇客娃娃4号\",\"shinshuu maru\":\"神州丸\",\"akira amatsume\":\"天女目瑛\",\"nao yorihime\":\"依媛奈绪\",\"batman\":\"蝙蝠侠\",\"galo thymos\":\"加洛·提莫斯\",\"lio fotia\":\"里奥·福蒂亚\",\"qiqi\":\"七七\",\"mujina\":\"貉\",\"yume minami\":\"南梦芽\",\"yomogi asanaka\":\"麻中蓬\",\"anne takamaki\":\"高卷杏\",\"hathaway noa\":\"哈撒韦·诺亚\",\"amuro ray\":\"阿姆罗·雷\",\"char aznable\":\"夏亚·阿兹纳布\",\"quess paraya\":\"葵司\",\"alcina dimitrescu\":\"阿契娜·蒂米特雷斯库\",\"akali\":\"阿卡丽\",\"misae nohara\":\"野原美伢\",\"shinnosuke nohara\":\"野原新之助\",\"hiroshi nohara\":\"野原广志\",\"musae koyama\":\"小山梦冴\",\"mineko kazama\":\"风间峰子\",\"south dakota\":\"南达科他\",\"mona megistus\":\"莫娜·梅姬斯图斯\",\"aether\":\"空\",\"fischl\":\"菲谢尔\",\"eula lawrence\":\"优菈·劳伦斯\",\"barbara pegg\":\"芭芭拉\",\"chongyun\":\"重云\",\"xingqiu\":\"行秋\",\"lisa minci\":\"丽莎·敏兹\",\"noelle\":\"诺艾尔\",\"sucrose\":\"砂糖\",\"diona\":\"迪奥娜\",\"rosaria\":\"罗莎莉亚\",\"klee\":\"可莉\",\"xinyan\":\"辛焱\",\"venti\":\"温迪\",\"xiao\":\"魈\",\"razor\":\"雷泽\",\"suzuran\":\"铃兰\",\"hana midorikawa\":\"绿川花\",\"meiko shiraki\":\"白木芽衣子\",\"luz noceda\":\"露丝·诺西达\",\"toph bei fong\":\"北方·托芙\",\"robin\":\"罗宾 | 知更鸟\",\"eugeo\":\"尤吉欧\",\"quinella\":\"葵妮拉\",\"makima\":\"玛奇玛\",\"denji\":\"电次\",\"angel devil\":\"天使恶魔\",\"yanfei\":\"烟绯\",\"gawr gura\":\"噶呜·古拉\",\"enoch\":\"伊诺库\",\"veronica\":\"维罗妮卡\",\"murasaki yatsu\":\"八津紫\",\"lucifer\":\"路西法\",\"miyu yamano\":\"共月庭\",\"watashi\":\"我\",\"hina amano\":\"天野阳菜\",\"enderman\":\"末影人\",\"creeper\":\"苦力怕\",\"piglin\":\"猪灵\",\"misa amane\":\"弥海砂\",\"l lawliet\":\"艾尔·罗莱特（L）\",\"light yagami\":\"夜神月\",\"akira toya\":\"塔矢亮\",\"akari fujisaki\":\"藤崎明\",\"tetsuo kaga\":\"加贺铁男\",\"asumi nase\":\"奈濑明日美\",\"mitsuko shindo\":\"进藤美津子\",\"yuki mitani\":\"三谷祐辉\",\"kimihiro tsutsui\":\"筒井公宏\",\"yoko ritona\":\"优子\",\"nia teppelin\":\"尼娅\",\"simon\":\"西蒙\",\"kamina\":\"卡米那\",\"merlin\":\"梅林\",\"akira kogami\":\"小神晶\",\"minoru shiraishi\":\"白石稔\",\"ilulu\":\"伊露露\",\"perseus\":\"英仙座\",\"kitasan black\":\"北部玄驹\",\"haru urara\":\"春丽（春乌拉拉）\",\"mayano top gun\":\"摩耶重炮\",\"rice shower\":\"米浴\",\"satono diamond\":\"里见光钻\",\"fuji kiseki\":\"富士奇迹\",\"maruzensky\":\"丸善斯基\",\"mihono bourbon\":\"美浦波旁\",\"mejiro ardan\":\"目白阿尔丹\",\"gold city\":\"黄金城市\",\"meisho doto\":\"名将怒涛\",\"king halo\":\"圣王光环\",\"nice nature\":\"优秀素质\",\"narita taishin\":\"成田大进\",\"tazuna hayakawa\":\"骏川手纲\",\"agnes tachyon\":\"爱丽速子\",\"manhattan cafe\":\"曼城茶座\",\"grass wonder\":\"草上飞\",\"himiko toga\":\"渡我被身子\",\"black rock shooter\":\"黑岩射手\",\"mio kisaki\":\"希咲美樱\",\"lisa eostre\":\"丽莎·埃奥斯托雷\",\"bertille althusser\":\"贝尔缇优·阿鲁奇赛尔\",\"takahiro mizuno\":\"水野贵弘\",\"shinonome\":\"东云\",\"noel marres ascot\":\"诺埃尔·穆利斯·阿斯科特\",\"celia cumani aintree\":\"苏利亚·库玛尼·安特里\",\"ayako hiiragi\":\"柊木绫子\",\"kayneth archibald el-melloi\":\"肯尼斯·埃尔梅罗·阿奇博尔德\",\"romani archaman\":\"罗玛尼·阿其曼\",\"sadako yamamura\":\"山村贞子\",\"ryuuko matoi\":\"缠流子\",\"satsuki kiryuuin\":\"鬼龙院皋月\",\"mako mankanshoku\":\"满舰饰真子\",\"nonon jakuzure\":\"蛇崩乃音\",\"uzu sanageyama\":\"猿投山涡\",\"ragyo kiryuuin\":\"鬼龙院罗晓\",\"nui harime\":\"针目缝\",\"ira gamagoori\":\"蟆郡苛\",\"houka inumuta\":\"犬牟田宝火\",\"aikuro mikisugi\":\"美木杉爱九郎\",\"tsumugu kinagase\":\"黄长濑䌷\",\"kiki\":\"琪琪\",\"saki watanabe\":\"渡边早季\",\"yui funami\":\"船见结衣\",\"chitose ikeda\":\"池田千岁\",\"chinatsu yoshikawa\":\"吉川千夏\",\"nasa yuzaki\":\"由崎星空\",\"tsukasa yuzaki\":\"由崎司（月读司）\",\"ringo-chan\":\"小苹果\",\"yassan\":\"文学少女\",\"yuno gasai\":\"我妻由乃\",\"reisuke houjou\":\"丰穰礼佑\",\"tsubaki kasugano\":\"春日野椿\",\"minene uryuu\":\"雨流美弥弥\",\"yukiteru amano\":\"天野雪辉\",\"motoko kusanagi\":\"草薙素子\",\"mayuri shiina\":\"椎名真由理\",\"rintarou okabe\":\"冈部伦太郎\",\"suzuha amane\":\"阿万音铃羽\",\"moeka kiryuu\":\"桐生萌郁\",\"faris nyannyan\":\"菲利斯·喵喵\",\"anzu\":\"杏子\",\"hitomi mishima\":\"三岛瞳\",\"komekko\":\"米米\",\"airi akizuki\":\"秋月爱莉\",\"kouzou akizuki\":\"秋月孝三\",\"marina akizuki\":\"秋月真理奈\",\"sana kuranaka\":\"仓中纱奈\",\"airi akitsuki\":\"秋月爱莉\",\"amu hinamori\":\"日奈森亚梦\",\"utau hoshina\":\"月咏歌呗\",\"rima mashiro\":\"真城璃茉\",\"ikuto tsukiyomi\":\"月咏几斗\",\"nadeshiko fujisaki\":\"藤咲抚子\",\"akane tsunemori\":\"常守朱\",\"shino amakusa\":\"天草篠\",\"aria shichijou\":\"七条天空\",\"suzu hagimura\":\"萩村铃\",\"uomi\":\"鱼见千寻\",\"takatoshi tsuda\":\"津田隆利\",\"renge miyauchi\":\"宫内莲华\",\"natsumi koshigaya\":\"越谷夏海\",\"yaichi kuzuryuu\":\"九头龙八一\",\"ai yashajin\":\"夜叉神天衣\",\"inuyama tamaki\":\"犬山玉姬\",\"aliza\":\"阿莉莎\",\"sarasa\":\"萨拉萨\",\"hallessena\":\"哈蕾泽娜\",\"izmir\":\"伊休米尔\",\"razia\":\"拉丝缇娜\",\"magisa\":\"玛姬莎\",\"anna hiiragi\":\"柊杏奈\",\"shirley fenette\":\"夏莉·菲内特\",\"milly ashford\":\"米蕾·阿什弗德\",\"anya alstreim\":\"阿妮亚·阿鲁斯特莱依姆\",\"kaguya sumeragi\":\"皇神乐耶\",\"krillin\":\"克林\",\"rudeus greyrat\":\"鲁迪乌斯·格雷拉特\",\"sylphiette\":\"希露菲叶特\",\"zamasu\":\"扎马斯\",\"kokoro\":\"心\",\"christie\":\"克丽丝蒂\",\"mila\":\"米拉\",\"hitomi\":\"瞳\",\"raiden shogun\":\"雷电将军\",\"musubi\":\"结\",\"shut\":\"夏特\",\"princess jasmine\":\"茉莉公主\",\"aladdin\":\"阿拉丁\",\"ariel\":\"爱丽儿\",\"platelet\":\"血小板\",\"ayaka kamisato\":\"神里绫华\",\"shounagon sei\":\"清少纳言\",\"ritsuko akagi\":\"赤木律子\",\"yui ikari\":\"碇唯\",\"gendo ikari\":\"碇源堂\",\"kensou sie\":\"椎拳崇\",\"andy bogard\":\"安迪·博加德\",\"azuma\":\"吾妻\",\"gorgon\":\"戈尔贡\",\"repulse\":\"反击\",\"north carolina\":\"北卡罗来纳\",\"washington\":\"华盛顿\",\"essex\":\"埃塞克斯\",\"indianapolis\":\"印第安纳波利斯\",\"albacore\":\"大青花鱼\",\"new jersey\":\"新泽西\",\"jean bart\":\"让·巴尔\",\"kokomi sangonomiya\":\"珊瑚宫心海\",\"kashino\":\"樫野\",\"chapayev\":\"恰巴耶夫\",\"saint louis\":\"路易九世\",\"yume nijino\":\"虹野梦\",\"laura sakuraba\":\"樱庭劳拉\",\"mahiru kasumi\":\"香澄真昼\",\"koharu nanakura\":\"七仓小春\",\"ako saotome\":\"早乙女亚子\",\"misogi hodaka\":\"穗高未奏希\",\"yuni shingyouji\":\"真行寺由仁（优妮）\",\"takagi\":\"高木同学\",\"stella unibell\":\"史黛拉·尤尼贝尔\",\"hotaru futaba\":\"双叶萤\",\"keke tang\":\"唐可可\",\"kasumi yoshizawa\":\"芳泽霞\",\"sae niijima\":\"新岛冴\",\"akira kurusu\":\"来栖晓\",\"futaba sakura\":\"佐仓双叶\",\"haru okumura\":\"奥村春\",\"makoto niijima\":\"新岛真\",\"sadayo kawakami\":\"川上贞代\",\"tae takemi\":\"武见妙\",\"chihaya mifune\":\"御船千早\",\"hifumi togo\":\"东乡一二三\",\"yae miko\":\"八重神子\",\"yoimiya naganohara\":\"宵宫\",\"kei yuuki\":\"结城萤\",\"tadayasu sawaki\":\"泽木直保\",\"sortiliena serlut\":\"索尔狄丽娜·赛路尔特\",\"ronye arabel\":\"罗妮耶·亚拉贝尔\",\"tamami wakiyama\":\"胁山珠美\",\"mimi akane\":\"茜美美\",\"ashley graham\":\"阿什莉·格拉汉姆\",\"mutsuki asagi\":\"浅黄睦月\",\"ryo matsunaga\":\"松永凉\",\"xiangling\":\"香菱\",\"tomimi\":\"特米米\",\"eunectes\":\"森蚺\",\"shouko komi\":\"古见硝子\",\"hitohito tadano\":\"只野仁人\",\"itto arataki\":\"荒泷一斗\",\"princess zelda\":\"塞尔达公主\",\"ren hazuki\":\"叶月恋\",\"sumire heanna\":\"平安名堇\",\"lanzhu zhong\":\"钟岚珠\",\"kanon shibuya\":\"涩谷香音\",\"chisato arashi\":\"岚千砂都\",\"mia taylor\":\"米娅·泰勒\",\"kiana kaslana\":\"琪亚娜·卡斯兰娜\",\"sakura yae\":\"八重樱\",\"hornet\":\"大黄蜂\",\"sara kujou\":\"九条裟罗\",\"smart falcon\":\"醒目飞鹰\",\"asuna ichinose\":\"一之濑明日奈\",\"akane murokasa\":\"室笠茜\",\"karin kakudate\":\"角楯花凛\",\"gray wolf\":\"灰狼\",\"brown bear\":\"棕熊\",\"golden snub-nosed monkey\":\"金丝猴\",\"african wild dog\":\"非洲野犬\",\"kusunoki sio\":\"楠栞桜\",\"sara\":\"莎拉\",\"metera\":\"美黛拉\",\"sutera\":\"斯黛拉\",\"chieru kazama\":\"风间千爱瑠\",\"hanako kuroe\":\"黑江花子（克罗依）\",\"kasumi kirihara\":\"雾原霞\",\"makoto aki\":\"安艺真琴\",\"christina morgan\":\"克莉丝提娜·摩根\",\"mythra\":\"光\",\"pyra\":\"焰\",\"cucouroux\":\"库库鲁\",\"jessica\":\"杰西卡\",\"jasmine\":\"茉莉\",\"karva\":\"卡鲁巴\",\"korwa\":\"可露瓦\",\"noriko takaya\":\"高屋法子\",\"kazumi amano\":\"天野和美\",\"jung freud\":\"荣格·佛洛依德\",\"aru rikuhachima\":\"陆八魔亚瑠\",\"hifumi ajitani\":\"阿慈谷日富美\",\"azusa shirasu\":\"白洲梓\",\"hanako urawa\":\"浦和花子\",\"koharu shimoe\":\"下江小春\",\"sheffy\":\"雪菲\",\"miko yotsuya\":\"四谷见子\",\"hana yurikawa\":\"百合川华\",\"yuria niguredou\":\"二暮堂尤利娅\",\"shenhe\":\"申鹤\",\"futaba marui\":\"丸井双叶\",\"mitsuba marui\":\"丸井三叶\",\"hitoha marui\":\"丸井一叶\",\"kanna akizuki\":\"明月栞那\",\"natsume shiki\":\"四季夏目\",\"nozomi sumizome\":\"墨染希\",\"mei hiuchidani\":\"火打谷爱衣\",\"suzune shioyama\":\"汐山凉音\",\"wakana gojou\":\"五条新菜\",\"marin kitagawa\":\"喜多川海梦\",\"akeno himejima\":\"姬岛朱乃\",\"asia argento\":\"爱莎·阿尔杰特\",\"koneko toujou\":\"塔城小猫\",\"rias gremory\":\"莉雅丝·吉蒙里\",\"amamiya kokoro\":\"天宫心\",\"signora\":\"「女士」罗莎琳\",\"trish una\":\"特里休·乌纳\",\"kei shirogane\":\"白银圭\",\"suigintou\":\"水银灯\",\"kirakishou\":\"雪华绮晶\",\"kanaria\":\"金丝雀\",\"suiseiseki\":\"翠星石\",\"shinku\":\"真红\",\"hina ichigo\":\"雏莓\",\"souseiseki\":\"苍星石\",\"hood\":\"胡德\",\"mrs. yuigahama\":\"由比滨妈妈\",\"mudrock\":\"泥岩\",\"nian\":\"年\",\"soraka\":\"索拉卡\",\"doctor\":\"博士\",\"dusk\":\"夕\",\"sabrina\":\"娜姿\",\"nagao kagetora\":\"长尾景虎\",\"shirabe tsukuyomi\":\"月读调\",\"chris yukine\":\"雪音克莉丝\",\"hibiki tachibana\":\"立花响\",\"miku kohinata\":\"小日向未来\",\"gardevoir\":\"沙奈朵\",\"celestine lucullus\":\"塞蕾斯汀·卢库勒斯\",\"lucario\":\"路卡利欧\",\"eren jaeger\":\"艾伦·耶格尔\",\"mikasa ackerman\":\"三笠·阿克曼\",\"armin arlert\":\"阿明·阿诺德\",\"clarisse\":\"克拉莉丝\",\"hilda boreas greyrat\":\"希尔达·伯雷亚斯·格雷拉特\",\"zenith greyrat\":\"塞妮丝·格雷拉特\",\"lilia greyrat\":\"莉莉雅·格雷拉特\",\"hakunon\":\"白野（扎比子）\",\"yoshikage kira\":\"吉良吉影\",\"fuka toyokawa\":\"丰川风花\",\"kana yabuki\":\"矢吹可奈\",\"ayumu maihama\":\"舞浜歩\",\"sekai kamiki\":\"神木世海\",\"kaoruko sazaki\":\"佐崎薰子\",\"izuku midoriya\":\"绿谷出久\",\"mitsuki bakugou\":\"爆豪光己\",\"prushka\":\"普鲁修卡\",\"hakui koyori\":\"博衣小夜璃\",\"satoko houjou\":\"北条沙都子\",\"siesta\":\"谢丝塔\",\"rebecca bluegarden\":\"蕾贝卡·布鲁加甸\",\"aria von reiji asuna\":\"岭司\",\"asuka koukawa\":\"甲河明日香\",\"mutio\":\"妙迪奥\",\"yotsuba koiwai\":\"小岩井四叶\",\"torako\":\"虎子\",\"naruko yokoshima\":\"横岛鸣子\",\"aoi hinami\":\"日南葵\",\"feena fam earthlight\":\"菲娜·法姆·阿修莱特\",\"akiko minase\":\"水濑秋子\",\"yuuichi aizawa\":\"水濑名雪\",\"itako tohoku\":\"东北伊达子\",\"una otomachi\":\"音街鳗\",\"kokona aoba\":\"青羽心夏\",\"sayu\":\"早柚\",\"takanashi kiara\":\"小鸟游琪亚拉\",\"yumeko jabami\":\"蛇喰梦子\",\"reed\":\"苇草\",\"ui kozeki\":\"古关忧\",\"battler ushiromiya\":\"右代宫战人\",\"sideroca\":\"铸铁\",\"utage\":\"宴\",\"siege\":\"推进之王\",\"barghest\":\"巴格斯特\",\"yellow heart\":\"黄色之心\",\"orange heart\":\"橙色之心\",\"kotonoha katsura\":\"桂言叶\",\"kokoro katsura\":\"桂心\",\"sekai saionji\":\"西园寺世界\",\"makoto itou\":\"伊藤诚\",\"violet evergarden\":\"薇尔莉特·伊芙加登\",\"lelei la lelena\":\"蕾莱·拉·列娜\",\"youji itami\":\"伊丹耀司\",\"pina co lada\":\"平娜·戈·兰达\",\"rory mercury\":\"萝莉·麦丘利\",\"yao haa dushi\":\"姚·汉·蒂修\",\"tuka luna marceau\":\"杜嘉·露娜·马尔席\",\"jeanne\":\"贞德\",\"bayonetta\":\"贝优妮塔\",\"elinalise dragonroad\":\"艾莉娜丽洁·杜拉冈罗德\",\"neneko\":\"鈴樹ねね\",\"mona\":\"莫娜\",\"komichi akebi\":\"明日小路\",\"alisa southerncross\":\"爱莉莎·南十字星\",\"shishiro botan\":\"狮白牡丹\",\"bennett\":\"班尼特\",\"ruri hoshino\":\"星野·琉璃\",\"lanling wang\":\"兰陵王\",\"andrew gilbert mills\":\"安德鲁·基尔巴特·米尔斯\",\"shizuku kuroe\":\"黑江雫\",\"ellen baker\":\"艾伦·贝可\",\"shizune\":\"静音\",\"kurenai yuhi\":\"夕日红\",\"mei terumi\":\"照美冥\",\"ai ohto\":\"大户爱\",\"kurumi ebisuzawa\":\"惠飞须泽胡桃\",\"rita rossweisse\":\"丽塔·洛丝薇瑟\",\"yor forger\":\"约尔·福杰\",\"misaki tobisawa\":\"鸢泽美咲\",\"morgan le fay\":\"摩根·勒·菲\",\"nishizono chigusa\":\"西园千草\",\"sherry birkin\":\"雪莉·柏金\",\"ratna petit\":\"拉特娜·葡蒂\",\"shigure ui\":\"时雨羽衣\",\"suo sango\":\"周央珊瑚\",\"lakshmibai\":\"拉克什米·芭伊\",\"inui toko\":\"戌亥とこ\",\"krul tepes\":\"克鲁鲁·采佩西\",\"mutsumi otohime\":\"乙姬睦美\",\"shinobu maehara\":\"前原忍\",\"naru narusegawa\":\"成濑川奈留\",\"meidri\":\"梅朵莉\",\"crimvael\":\"克莉姆\",\"samus aran\":\"萨姆斯·亚兰\",\"otome saotome\":\"早乙女乙女\",\"melusine\":\"美露莘\",\"baobhan sith\":\"芭万·希\",\"suomi\":\"索米\",\"guilmon\":\"基尔兽\",\"impmon\":\"小妖兽\",\"nonomi izayoi\":\"十六夜野宫\",\"yuuma toutetsu\":\"饕餮尤魔\",\"miyuki kobayakawa\":\"小早川美幸\",\"natsumi tsujimoto\":\"辻本夏实\",\"yoriko nikaido\":\"二阶堂赖子\",\"kyousuke natsume\":\"枣恭介\",\"rin natsume\":\"枣铃\",\"kobeni yonomori\":\"夜之森小红\",\"sheryl nome\":\"雪露·诺姆\",\"iori shiromi\":\"银镜伊织\",\"barbara\":\"芭芭菈\",\"enji todoroki\":\"轰炎司\",\"nagisa minase\":\"水濑渚\",\"lum\":\"拉姆\",\"raiden\":\"雷电\",\"tien shinhan\":\"天津饭\",\"theresa apocalypse\":\"德丽莎·阿波卡利斯\",\"rozaliya olenyeva\":\"萝莎莉娅·阿琳\",\"liliya olenyeva\":\"莉莉娅·阿琳\",\"torte\":\"托蒂\",\"nausicaa\":\"娜乌西卡\",\"belle\":\"贝儿 | 铃\",\"shun sunohara\":\"春原瞬\",\"surtr\":\"史尔特尔\",\"mostima\":\"莫斯提马\",\"tensai ikkyuu\":\"一级天灾\",\"daruku hoshino\":\"星野达鲁克\",\"nanana ryuugajou\":\"龙娘七七七\",\"nanami arihara\":\"在原七海\",\"mai kawasumi\":\"川澄舞\",\"yelan\":\"夜兰\",\"baki hanma\":\"范马刃牙\",\"mana inuyama\":\"犬山真名\",\"megumi\":\"惠美\",\"rumi\":\"留美\",\"mare s. ephemeral\":\"梅娅·S·艾菲梅拉尔\",\"loid forger\":\"劳埃德·福杰\",\"anna yamada\":\"山田杏奈\",\"kyoutarou ichikawa\":\"市川京太郎\",\"pramanix\":\"初雪\",\"medaka kurokami\":\"黑神目泷\",\"miss crane\":\"鹤小姐\",\"mordred\":\"莫德雷德\",\"mikaela hyakuya\":\"百夜米迦尔\",\"laplus darknesss\":\"拉普拉斯·达克尼斯\",\"mori calliope\":\"森美声\",\"ninomae inanis\":\"一伊那尔栖\",\"sakamata chloe\":\"沙花叉库洛艾\",\"kazama iroha\":\"风真伊吕波\",\"weedy\":\"温蒂\",\"makino yagami\":\"八神牧野\",\"lu bu\":\"吕布\",\"namiko\":\"奈美子\",\"hass\":\"莲\",\"kazuha kaedehara\":\"枫原万叶\",\"scaramouche\":\"「散兵」（国崩）\",\"himiko\":\"卑弥呼\",\"zenobia\":\"芝诺比阿\",\"paris\":\"帕里斯\",\"captain nemo\":\"尼莫船长\",\"sukuna\":\"两面宿傩\",\"yuuji itadori\":\"虎杖悠仁\",\"megumi fushiguro\":\"伏黑惠\",\"caitlyn\":\"凯特琳\",\"nikaido\":\"二阶堂\",\"reno\":\"里诺\",\"aegir\":\"埃吉尔\",\"shinano\":\"信浓\",\"foxhound\":\"狐提\",\"pamiat merkuria\":\"水星纪念\",\"nurnberg\":\"纽伦堡\",\"nicholas\":\"尼古拉斯\",\"icarus\":\"伊卡洛斯\",\"palutena\":\"帕露蒂娜\",\"pit\":\"皮特\",\"bozes co palesti\":\"波赛斯·戈·芭蕾丝蒂\",\"noi\":\"能井\",\"scirocco\":\"东南风\",\"miyuki kujou\":\"九条美雪\",\"specter\":\"幽灵鲨\",\"aether foundation employee\":\"以太基金会员工\",\"hiling\":\"希琳\",\"yoshino kousaka\":\"高坂佳乃\",\"kuzuha togashi\":\"富㭴樟叶\",\"ichigo hoshimiya\":\"星宫莓\",\"aoi kiriya\":\"雾矢葵\",\"yurika toudou\":\"藤堂百合香\",\"kirara hanazono\":\"花园绮罗\",\"orihime mitsuishi\":\"光石织姬\",\"noeru otoshiro\":\"音城诺艾儿\",\"raki kiseki\":\"姬石来希\",\"ringo hoshimiya\":\"星宫苹果\",\"tsubasa kisaragi\":\"如月翼\",\"seira otoshiro\":\"音城塞拉\",\"alicia charlotte\":\"艾丽西亚·夏洛特\",\"aine yuuki\":\"友希爱音\",\"asahi kasumi\":\"香澄朝阳\",\"yozora kasumi\":\"香澄夜空\",\"sumire hikami\":\"冰上堇\",\"akari oozora\":\"大空明\",\"risa shirakaba\":\"白桦丽莎\",\"nono daichi\":\"大地乃野\",\"sora kazesawa\":\"风泽空\",\"kii saegusa\":\"冴草纪伊\",\"mio minato\":\"凑美绪\",\"rin kurosawa\":\"黑泽凛\",\"ran shibuki\":\"紫吹兰\",\"juri kurebayashi\":\"红林珠璃\",\"hinaki shinjou\":\"新条雏姬\",\"madoka amahane\":\"天羽圆香\",\"hime shiratori\":\"白鸟姬\",\"sussurro\":\"苏苏洛\",\"alice tendou\":\"天童爱丽丝\",\"hanabi hyuga\":\"日向花火\",\"chisato hasegawa\":\"长谷川千里\",\"anko kitashirakawa\":\"北白川馅子\",\"seraphine\":\"萨勒芬妮\",\"erich von rerugen\":\"埃里希·冯·雷鲁根\",\"luciela r. sourcream\":\"露西艾拉·R·索克莉姆\",\"eris\":\"厄里斯\",\"luna\":\"露娜\",\"yamato no kami yasusada\":\"大和守安定\",\"takane lui\":\"鹰岭露依\",\"charlotte e. yeager\":\"夏洛特·E·叶格\",\"erica hartmann\":\"艾莉卡·哈特曼\",\"gertrud barkhorn\":\"歌尔特露特·巴克霍隆\",\"lynette bishop\":\"莉涅特·毕晓普\",\"minna-dietlinde wilcke\":\"明娜·迪特林德·威尔克\",\"sanya v. litvyak\":\"萨妮娅·V·利特维亚克\",\"yoshika miyafuji\":\"宫藤芳佳\",\"yoruichi shihoin\":\"四枫院夜一\",\"tia halibel\":\"蒂雅·赫丽贝尔\",\"muzan kibutsuji\":\"鬼舞辻无惨\",\"karna\":\"迦尔纳\",\"victorique de blois\":\"维多利加\",\"kazuya kujou\":\"久城一弥\",\"matsurika shinouji\":\"汐王寺茉莉花\",\"sayu ogiwara\":\"荻原沙优\",\"airi gotou\":\"后藤爱依梨\",\"dark elven forest ranger\":\"dark elven forest ranger\",\"kie kamado\":\"灶门葵枝\",\"watson amelia\":\"阿米莉亚·华生\",\"edmond dantes\":\"爱德蒙·唐泰斯（岩窟王）\",\"ariane glenys maple\":\"阿里安\",\"yukihana lamy\":\"雪花菈米\",\"scarlet witch\":\"绯红女巫\",\"wanda maximoff\":\"旺达\",\"camie utsushimi\":\"现见凯米\",\"tsubame koyasu\":\"子安燕\",\"akari acura\":\"阿卡莉·亚裘拉\",\"chaika trabant\":\"嘉依卡·托勒庞特\",\"david\":\"大卫\",\"toru acura\":\"托鲁·亚裘拉\",\"chaika bogdan\":\"嘉依卡·布芙丹\",\"hyakumantenbara salome\":\"壹百满天原莎乐美\",\"miruki amauri\":\"甘瓜牛奶\",\"ouro kronii\":\"奥罗·克洛尼\",\"katsuki bakugou\":\"爆豪胜己\",\"kyouko takizawa\":\"泷泽京子\",\"black prince\":\"黑太子\",\"tomoko kuroki\":\"黑木智子\",\"yukari miyako\":\"都由香里\",\"clare\":\"克蕾雅\",\"raki\":\"拉基\",\"teresa\":\"泰蕾莎\",\"samira\":\"莎弥拉\",\"katarina du couteau\":\"卡特琳娜·杜·克卡奥\",\"kaltsit\":\"凯尔希\",\"maho hiyajo\":\"比屋定真帆\",\"venom\":\"毒液\",\"katarina claes\":\"卡塔莉娜·库莱耶思\",\"maria campbell\":\"玛丽亚·坎贝尔\",\"diluc ragnvindr\":\"迪卢克·莱艮芬德\",\"kaeya alberich\":\"凯亚·亚尔伯里奇\",\"anya forger\":\"阿尼亚·福杰\",\"morrigan aensland\":\"莫莉卡·安斯兰特\",\"becky blackbell\":\"贝琪·布莱克贝尔\",\"warfarin\":\"华法琳\",\"platinum\":\"白金\",\"rise kujikawa\":\"久慈川理世\",\"yuu narukami\":\"鸣上悠\",\"itaru hashida\":\"桥田至\",\"tenten\":\"天天\",\"hoshiguma\":\"星熊\",\"flamebringer\":\"炎客\",\"matterhorn\":\"角峰\",\"silverash\":\"银灰\",\"ptilopsis\":\"白面鸮\",\"blemishine\":\"瑕光\",\"whislash\":\"鞭刃\",\"dobermann\":\"杜宾\",\"nearl\":\"临光\",\"blue poison\":\"蓝毒\",\"skyfire\":\"天火\",\"bison\":\"拜松\",\"croissant\":\"可颂\",\"arcanine\":\"风速狗\",\"akari\":\"小照\",\"irida\":\"珠贝\",\"palina\":\"瓜娜\",\"ambriel\":\"安比尔\",\"feater\":\"食铁兽\",\"closure\":\"可露希尔\",\"melantha\":\"玫兰莎\",\"perfumer\":\"调香师\",\"grani\":\"格拉尼\",\"angelina ajimu\":\"安心院安洁莉娜\",\"ceobe\":\"刻俄柏\",\"franka\":\"芙兰卡\",\"liskarm\":\"雷蛇\",\"blaze\":\"煌\",\"shamare\":\"巫恋\",\"popukar\":\"泡普卡\",\"schwarz\":\"黑\",\"rosmontis\":\"迷迭香\",\"eyjafjalla\":\"艾雅法拉\",\"deepcolor\":\"深海色\",\"ayerscarpe\":\"断崖\",\"leonhardt\":\"莱恩哈特\",\"asbestos\":\"石棉\",\"magallan\":\"麦哲伦\",\"podenco\":\"波登可\",\"kroos\":\"克洛丝\",\"gavial\":\"嘉维尔\",\"vigna\":\"红豆\",\"glaucus\":\"格劳克斯\",\"vermeil\":\"红云 | 维尔梅\",\"ansel\":\"安赛尔\",\"ceylon\":\"锡兰\",\"sicily von claude\":\"西希莉·冯·克洛德\",\"beeswax\":\"蜜蜡\",\"youtouhime\":\"妖刀姬\",\"ivy valentine\":\"艾薇\",\"taki\":\"多喜\",\"yuzu hanaoka\":\"花冈柚子\",\"iroha natsume\":\"枣伊吕波\",\"sasara kusugawa\":\"久寿川莎莎菈\",\"maako asagiri\":\"朝雾麻亚子\",\"amane\":\"亚麻音\",\"setsu\":\"雪\",\"mian\":\"魅杏\",\"yuuka hayase\":\"早濑优香\",\"azusa hanai\":\"花井梓\",\"maria momoe\":\"百枝麻里亚\",\"kraft lawrence\":\"克拉福·罗伦斯\",\"orihime inoue\":\"井上织姬\",\"elysia\":\"爱莉希雅\",\"kayoko onikata\":\"鬼方佳世子\",\"aoi tosaka\":\"远坂葵\",\"sothis\":\"苏谛斯\",\"shamir nevrand\":\"萨米亚·涅芙兰特\",\"edelgard von hresvelg\":\"艾黛尔贾特·冯·弗雷斯贝尔古\",\"rhea\":\"蕾雅\",\"byleth eisner\":\"贝雷丝·艾斯纳\",\"hoshino takanashi\":\"小鸟游星野\",\"miyu kasumizawa\":\"霞泽美游\",\"midori saiba\":\"才羽绿\",\"momoi saiba\":\"才羽桃井\",\"kaede isami\":\"勇美枫\",\"mari iochi\":\"伊落玛丽\",\"izuna kuda\":\"久田泉奈\",\"fuuka aikiyo\":\"爱清枫香\",\"haruna kurodate\":\"黑馆羽留奈\",\"chinatsu hinomiya\":\"火宫千夏\",\"shiroko sunaookami\":\"砂狼白子\",\"neru mikamo\":\"美甘妮露\",\"tsubaki kasuga\":\"春日椿\",\"mika misono\":\"圣园未花\",\"ako amau\":\"天雨亚子\",\"natsu yutori\":\"柚鸟夏\",\"kagome higurashi\":\"日暮戈薇\",\"inuyasha\":\"犬夜叉\",\"hitomi shizuki\":\"志筑仁美\",\"nakoruru\":\"娜可露露\",\"tomo yamanobe\":\"山边灯\",\"calamity jane\":\"灾星简\",\"charlotte corday\":\"夏洛特·科黛\",\"ibuki douji\":\"伊吹童子\",\"ranpha\":\"兰法\",\"geo stelar\":\"星河昴\",\"luna platz\":\"白金露娜\",\"yugito nii\":\"二位柚木门\",\"kanade yoisaki\":\"宵崎奏\",\"mafuyu asahina\":\"朝比奈真冬\",\"kanu unchou\":\"关羽云长\",\"housen ryofu\":\"吕布奉先\",\"shimei ryomou\":\"吕蒙子明\",\"hakufu sonsaku\":\"孙策伯符\",\"gentoku ryuubi\":\"刘备玄德\",\"ekitoku chouhi\":\"张飞益德\",\"myousai kakouen\":\"夏侯渊妙才\",\"yojo bashoku\":\"马谡幼常\",\"shiryuu chouun\":\"赵云子龙\",\"chuukou kyocho\":\"许诸仲康\",\"hakugen rikuson\":\"陆逊伯言\",\"chuutatsu shibai\":\"司马懿仲达\",\"shikou soujin\":\"曹仁子孝\",\"mouyuu\":\"孟优\",\"takezou shinmen\":\"新免武藏\",\"chousen\":\"貂蝉\",\"benkei musashibo\":\"武藏坊弁庆\",\"genpou saji\":\"左慈元放\",\"bunwa kaku\":\"贾诩文和\",\"ukitsu\":\"于吉\",\"shifu choushou\":\"张昭子布\",\"koshaji\":\"胡车儿\",\"moukaku\":\"孟获\",\"kotetsu\":\"虎彻\",\"arezu\":\"火夏\",\"phineas flynn\":\"飞哥·福林\",\"ferb fletcher\":\"小佛‧富雷察\",\"miko kurokawa\":\"黒川みこ\",\"rimururu\":\"莉姆露露\",\"yoichi nasu no suketaka\":\"那须与一\",\"bridget\":\"布里奇特\",\"princess marie ange\":\"マリー・アンジュ 王女\",\"sakura kagamihara\":\"各务原樱\",\"frederica irving\":\"フレドリカ・アーヴィング\",\"junko enoshima\":\"江之岛盾子\",\"chisato nishikigi\":\"锦木千束\",\"takina inoue\":\"井之上泷奈\",\"rihoko amaha\":\"天羽梨穂子\",\"masane amaha\":\"天羽雅音\",\"ayaka tachikawa\":\"立川绚香\",\"aomi yanagisako\":\"柳迫碧美\",\"airi\":\"爱莉\",\"melona\":\"美萝娜\",\"merlin prototype\":\"梅林〔Prototype〕\",\"shuna\":\"朱菜\",\"lenalee lee\":\"利娜莉·李\",\"natsuru senou\":\"濑能名津流\",\"shizuku sangou\":\"三乡雫\",\"akane mishima\":\"美岛红音\",\"minoru mineta\":\"峰田实\",\"natalia luzu kimlasca-lanvaldear\":\"娜塔莉亚·卢慈·基姆拉斯卡·兰帕尔迪亚\",\"eleonora viltaria\":\"艾蕾欧诺拉·维尔塔利亚\",\"limalisha\":\"莉姆亚莉夏\",\"ludmila lourie\":\"琉德米拉·露利叶\",\"sofya obertas\":\"苏菲亚·欧贝达斯\",\"tigrevurmud vorn\":\"堤格尔维尔穆德·冯伦\",\"kobeni higashiyama\":\"东山小红\",\"hildegarde\":\"希尔迪嘉露塔\",\"aoi kunieda\":\"邦枝葵\",\"sajuna inui\":\"乾纱寿叶\",\"toushirou hitsugaya\":\"日番谷冬狮郎\",\"soi fon\":\"碎蜂\",\"guan yinping\":\"关银屏\",\"xing cai\":\"张星彩\",\"zhen ji\":\"甄姬\",\"moriko morioka\":\"盛冈森子\",\"yuuta sakurai\":\"樱井优太\",\"lily\":\"莉莉\",\"hinata kuraue\":\"仓上日向\",\"aoi yukimura\":\"雪村葵\",\"furen e lustario\":\"芙莲·E·露丝塔莉欧\",\"nui sociere\":\"纽伊·索西艾瑞\",\"yachiru kusajishi\":\"草鹿八千流\",\"kagura nana\":\"神乐七奈\",\"arlecchino\":\"「仆人」阿蕾奇诺\",\"platinum the trinity\":\"白金·崔妮蒂\",\"marta lualdi\":\"玛尔塔·路亚蒂\",\"asuka katou\":\"加藤明日香\",\"august von parseval\":\"奥古斯特·冯·帕塞瓦尔\",\"shinn asuka\":\"真·飞鸟\",\"yuzuki seo\":\"濑尾结月\",\"saki yoshida\":\"吉田咲\",\"nahida\":\"纳西妲\",\"mitsuru kirijo\":\"桐条美鹤\",\"kaguya otonashi\":\"音无辉夜\",\"kaoru tanamachi\":\"棚町薰\",\"nilou\":\"妮露\",\"princess elsa\":\"艾莎公主\",\"kristoff bjorgman\":\"克斯托夫\",\"athrun zala\":\"阿斯兰·萨拉\",\"rey za burrel\":\"雷·札·巴雷尔\",\"mako hitachi\":\"常陆茉子\",\"yoshino tomotake\":\"朝武芳乃\",\"lena liechtenauer\":\"蕾娜·列支敦瑙尔\",\"tamaki tamada\":\"玉田环\",\"shizuko hosomi\":\"细见静子\",\"yagen toushirou\":\"药研藤四郎\",\"shinano toushirou\":\"信浓藤四郎\",\"gotou toushirou\":\"后藤藤四郎\",\"atsushi toushirou\":\"厚藤四郎\",\"saniwa\":\"审神者\",\"houchou toushirou\":\"包丁藤四郎\",\"shokudaikiri mitsutada\":\"烛台切光忠\",\"horikawa kunihiro\":\"堀川国广\",\"vajra\":\"瓦姬拉\",\"tighnari\":\"提纳里\",\"hinata wakaba\":\"若葉日向\",\"chihiro kagami\":\"各务千寻\",\"perrine h. clostermann\":\"佩琳·H·克洛斯特曼\",\"bronya zaychik\":\"布洛妮娅·扎伊切克\",\"danzou katou\":\"加藤段藏\",\"fubuki nemugaki\":\"合欢垣吹雪\",\"serika kuromi\":\"黑见芹香\",\"ayane okusora\":\"奥空绫音\",\"mikan hinatsuki\":\"阳夏木蜜柑\",\"sword maiden\":\"剑之圣女\",\"chigusa kisaragi\":\"如月千种\",\"dobrynya nikitich\":\"多布雷尼亚·尼基季奇\",\"aratsuka ogami\":\"荒塚オガミ\",\"nishikata\":\"西片\",\"nezha\":\"哪吒\",\"carol malus dienheim\":\"卡萝·马尔斯·狄恩海姆\",\"dori\":\"多莉\",\"rikka morizono\":\"森园立夏\",\"aponia\":\"阿波尼亚\",\"carole pepper\":\"卡萝尔·佩珀\",\"rean schwarzer\":\"黎恩·舒华泽\",\"millium orion\":\"米莉亚姆·奥莱恩\",\"candace\":\"坎蒂丝\",\"mei raiden\":\"雷电芽衣\",\"durandal\":\"幽兰黛尔\",\"himeko murata\":\"无量塔姬子\",\"seele vollerei\":\"希儿·芙乐艾\",\"cecilia schariac\":\"塞西莉亚·沙尼亚特\",\"shinobu kuki\":\"久岐忍\",\"springfield\":\"春田\",\"natasha cioara\":\"娜塔莎·希奥拉（渡鸦）\",\"fu hua\":\"符华\",\"timido cute\":\"缇米朵·丘忒\",\"mobius\":\"梅比乌斯\",\"heizou shikanoin\":\"鹿野院平藏\",\"columbina\":\"「少女」哥伦比娅\",\"tartaglia\":\"「公子」达达利亚\",\"gorou\":\"五郎\",\"kallen kaslana\":\"卡莲·卡斯兰娜\",\"yun jin\":\"云堇\",\"kloe rinz\":\"科洛丝·琳希\",\"anelace elfead\":\"亚妮拉丝·艾尔菲德\",\"scherazard harvey\":\"雪拉扎德·哈维\",\"shizuna rem misurugi\":\"静名·雷姆·御折木\",\"ragna the bloodedge\":\"拉格纳·布莱德艾奇\",\"noel vermillion\":\"诺爱儿·梵蜜莉欧\",\"es\":\"Es\",\"kajun faycott\":\"花隼·法伊科特\",\"mai natsume\":\"麻衣·枣\",\"makoto nanaya\":\"诚·七夜\",\"ayato kamisato\":\"神里绫人\",\"tsubaki yayoi\":\"椿·弥生\",\"lambda-11\":\"Λ-No.11-\",\"mu-12\":\"μ-No.12-\",\"nu-13\":\"ν-No.13-\",\"jin kisaragi\":\"琴恩·如月\",\"erice utsumi\":\"宇津见绘里濑\",\"emiya alter\":\"卫宫〔Alter〕\",\"shinoa hiiragi\":\"柊筱娅\",\"fatui electro cicin mage\":\"雷萤术士\",\"fatui cryo cicin mage\":\"冰萤术士\",\"mirror maiden\":\"藏镜仕女\",\"sirin\":\"西琳\",\"dehya\":\"迪希雅\",\"noa ushio\":\"生盐诺亚\",\"kokona sunohara\":\"春原心菜\",\"hasumi hanekawa\":\"羽川莲见\",\"hibiki nekozuka\":\"猫冢响\",\"arona\":\"阿罗娜\",\"saki sorai\":\"空井咲\",\"collei\":\"柯莱\",\"lavenza\":\"拉雯妲\",\"von lycaon\":\"冯·莱卡恩\",\"cyborg\":\"赛博格\",\"april\":\"四月\",\"eevee\":\"伊布\",\"sylveon\":\"仙子伊布\",\"vaporeon\":\"水伊布\",\"jolteon\":\"雷伊布\",\"flareon\":\"火伊布\",\"espeon\":\"太阳伊布\",\"umbreon\":\"月亮伊布\",\"leafeon\":\"叶伊布\",\"glaceon\":\"冰伊布\",\"piplup\":\"波加曼\",\"turtwig\":\"草苗龟\",\"meowth\":\"喵喵\",\"cinderace\":\"闪焰王牌\",\"lopunny\":\"长耳兔\",\"absol\":\"阿勃梭鲁\",\"banette\":\"诅咒娃娃\",\"braixen\":\"长尾火狐\",\"bulbasaur\":\"妙蛙种子\",\"delphox\":\"妖火红狐\",\"ditto\":\"百变怪\",\"greninja\":\"甲贺忍蛙\",\"kirlia\":\"奇鲁莉安\",\"lugia\":\"洛奇亚\",\"mawile\":\"大嘴娃\",\"nidoqueen\":\"尼多后\",\"primarina\":\"西狮海壬\",\"reshiram\":\"莱希拉姆\",\"salazzle\":\"焰后蜥\",\"samurott\":\"大剑鬼\",\"scorbunny\":\"炎兔儿\",\"zekrom\":\"捷克罗姆\",\"zeraora\":\"捷拉奥拉\",\"iono\":\"奇树\",\"maho himemiya\":\"姬宫真步\",\"ahri\":\"阿狸\",\"lillia\":\"莉莉娅\",\"thresh\":\"锤石\",\"sophia nishikinomiya\":\"苏菲亚·锦之宫\",\"anna nishikinomiya\":\"安娜·锦之宫\",\"moona hoshinova\":\"Moona Hoshinova\",\"miya chinen\":\"知念实也\",\"koushi sugawara\":\"菅原孝支\",\"shoyo hinata\":\"日向翔阳\",\"taiga kagami\":\"火神大我\",\"tetsuya kuroko\":\"黑子哲也\",\"daiki aomine\":\"青峰大辉\",\"haruka nanase\":\"七濑遥\",\"rin matsuoka\":\"松冈凛\",\"yuki\":\"雪\",\"louise\":\"露易兹\",\"ellen\":\"爱莲\",\"kana anaberal\":\"卡娜·安娜贝拉尔\",\"misaki kagome\":\"笼目深沙希\",\"momo hinamori\":\"雏森桃\",\"chen hai\":\"镇海\",\"leeloo minai lekatariba-lamina-tchai ekbat de sebat\":\"Leeloo\",\"hasshaku-sama\":\"八尺大人\",\"ushio kofune\":\"小舟潮\",\"moe kazekura\":\"风仓萌绘\",\"eiko tsukimi\":\"月见英子\",\"hitori gotou\":\"后藤一里\",\"tsukuyo oono\":\"大野筑夜\",\"mikoto aketa\":\"緋田美琴\",\"nazuna nanakusa\":\"七草荠\",\"revy\":\"莱薇\",\"natsumi kurobe\":\"黑部夏美\",\"assaultron\":\"突袭者机器人\",\"satoru gojo\":\"五条悟\",\"aki hayakawa\":\"早川秋\",\"annie leonhart\":\"阿尼·利昂纳德\",\"nekomiya hinata\":\"猫宫日向\",\"himeno ayanokoji\":\"绫小路姫乃\",\"seia yurizono\":\"百合园圣娅\",\"hanae asagao\":\"朝颜花绘\",\"saori joumae\":\"锭前纱织\",\"nijika ijichi\":\"伊地知虹夏\",\"ryou yamada\":\"山田凉\",\"ikuyo kita\":\"喜多郁代\",\"mewtwo\":\"超梦\",\"shion\":\"紫苑\",\"nemu manaka\":\"真中合欢\",\"rinne byakuya\":\"白夜凛音\",\"hanabi yasuraoka\":\"安乐冈花火\",\"nayuta kani\":\"可儿那由多\",\"maou\":\"魔王（红玉之瞳）\",\"tabitha helene orleans de gallia\":\"塔巴萨\",\"suguru geto\":\"夏油杰\",\"selvaria bles\":\"塞贝莉雅·布雷斯\",\"arisa eloise beau-regard\":\"亚里砂·艾洛伊丝·博勒加德\",\"wakamo kosaka\":\"狐坂若藻\",\"high elf archer\":\"妖精弓手\",\"big bad wolf\":\"大灰狼\",\"nemona\":\"妮莫\",\"little red riding hoods grandmother\":\"小红帽的外婆\",\"alhaitham\":\"艾尔海森\",\"layla prismriver\":\"蕾拉·普莉兹姆利巴\",\"chise waraku\":\"和乐千世\",\"kaho kuwakami\":\"桑上果穗\",\"ume\":\"梅\",\"chisaki mibu\":\"壬生千咲\",\"mayu shikibe\":\"式部茉优\",\"maria marta cunhel guloso\":\"玛璐塔小姐\",\"jenny wakeman\":\"XJ9\",\"aria holmes kanzaki\":\"神崎·H·亚里亚\",\"akari mamiya\":\"间宫明里\",\"kaname tohyama\":\"远山金女\",\"kinji tohyama\":\"远山金次\",\"riko mine\":\"峰理子\",\"shirayuki hotogi\":\"星伽白雪\",\"the woodsman\":\"小红帽中的猎人\",\"henrietta de tristain\":\"安丽埃塔\",\"princess devilotte de deathsatan ix\":\"戴比萝特·德·迪斯撒旦九世\",\"fianna ray ordesia\":\"菲雅娜·雷·奥地西亚\",\"lady labrynth of the silver castle\":\"白银城的迷宫主·拉比丽斯\",\"suletta mercury\":\"斯莱塔·墨丘利\",\"miorine rembran\":\"米奥莉奈·伦布兰\",\"nana daiba\":\"大场奈奈\",\"minegumo\":\"峰云\",\"princess star butterfly\":\"星蝶公主\",\"kazusa kyouyama\":\"杏山和纱\",\"mahiru shiina\":\"椎名真昼\",\"margot knight\":\"玛戈特·奈特\",\"malga naruze\":\"玛伽·成濑\",\"evangeline a.k. mcdowell\":\"依文洁琳·安塔娜西亚·凯蒂·麦道威尔\",\"momosuzu nene\":\"桃铃音音\",\"omaru polka\":\"尾丸波尔卡\",\"karnatia seri anabald\":\"大岛叶多\",\"wang yi\":\"王异\",\"hachiroku\":\"八六\",\"yggdrasil\":\"尤格多拉希尔\",\"otome arisugawa\":\"有栖川乙女\",\"luo tianyi\":\"洛天依\",\"sensei\":\"老师\",\"azuma seren\":\"东雪莲\",\"yaoyao\":\"瑶瑶\",\"monika\":\"莫妮卡\",\"tania\":\"塔妮雅\",\"barret wallace\":\"巴雷特·华莱士\",\"ameth\":\"爱梅斯\",\"aoi futaba\":\"双叶碧\",\"roselia\":\"绯之罗赛莉亚\",\"goldenglow\":\"澄闪\",\"sara valestin\":\"莎拉·巴雷斯坦\",\"cure cosmo\":\"尤妮（宇宙天使）\",\"cure selene\":\"香久矢圆香（月神天使）\",\"demeter\":\"狄蜜特\",\"haruka yuzuhara\":\"柚原春夏\",\"matsuri kazamaki\":\"风卷祭里\",\"suzu kanade\":\"花奏铃\",\"mahiro oyama\":\"绪山真寻\",\"seiun sky\":\"青云天空\",\"curren chan\":\"真机伶\",\"symboli rudolf\":\"鲁道夫象征\",\"admire vega\":\"爱慕织姬\",\"yorha commander\":\"寄葉指揮官\",\"cidala\":\"辛妲拉\",\"super creek\":\"超级溪流\",\"cecilia alcott\":\"塞西莉娅·奥尔卡特\",\"ling yin huang\":\"凰铃音\",\"laura bodewig\":\"拉芙拉·布迪威伊\",\"yuu koito\":\"小糸侑\",\"touko nanami\":\"七海灯子\",\"houki shinonono\":\"篠之之帚\",\"mizuki nakahara\":\"中原瑞希\",\"senji muramasa\":\"千子村正\",\"hinagiku katsura\":\"桂雏菊\",\"isumi saginomiya\":\"鹭之宫伊澄\",\"nagi sanzenin\":\"三千院凪\",\"marie\":\"玛丽\",\"fuyutsuki\":\"冬月\",\"tsukasa ayatsuji\":\"绚辻词\",\"ai nanasaki\":\"七咲逢\",\"haruka morishima\":\"森岛遥\",\"miya tachibana\":\"橘美也\",\"sae nakata\":\"中多纱江\",\"rihoko sakurai\":\"樱井梨穗子\",\"yukiko amagi\":\"天城雪子\",\"hatsumi sega\":\"濑贺初美\",\"fujisaki yua\":\"藤崎由爱\",\"dante\":\"但丁\",\"vergil\":\"维吉尔\",\"hanbei takenaka\":\"竹中半兵卫\",\"kanae kochou\":\"胡蝶香奈惠\",\"sanemi shinazugawa\":\"不死川实弥\",\"mashiro shizuyama\":\"静山真白\",\"tsurugi kensaki\":\"剑先鹤城\",\"acerola\":\"阿塞萝拉\",\"kou minamoto\":\"源光\",\"damian desmond\":\"达米安·德斯蒙\",\"cat noir\":\"黑猫诺儿\",\"killua zoldyck\":\"奇犽·揍敌客\",\"mirai kamiki\":\"神木未来\",\"megumi amatsuka\":\"天使惠\",\"mao amatsuka\":\"天使真央\",\"akane isshiki\":\"一色茜\",\"lyza\":\"莱萨\",\"ozen\":\"奥森\",\"marulk\":\"马璐璐库\",\"mother spider demon\":\"蜘蛛鬼·母亲\",\"kanako urashima\":\"浦岛可奈子\",\"mihari oyama\":\"绪山美波里\",\"white len\":\"白莲\",\"momiji hozuki\":\"穗月椛\",\"kaede hozuki\":\"穗月枫\",\"kafka\":\"卡芙卡 | 卡夫卡\",\"ookanehira\":\"大包平\",\"uguisumaru\":\"莺丸\",\"sovetskaya rossiya\":\"苏维埃罗西亚\",\"faruzan\":\"珐露珊\",\"plana\":\"普拉娜\",\"rio tsukatsuki\":\"调月莉音\",\"kikuri hiroi\":\"广井菊里\",\"gintoki sakata\":\"坂田银时\",\"toshiro hijikata\":\"土方十四郎\",\"kazamori sasa\":\"佐佐风守\",\"kozuki momonosuke\":\"光月桃之助\",\"kanna ogata\":\"尾刃康娜\",\"nero\":\"尼禄\",\"deadpool\":\"死侍\",\"lady\":\"蕾蒂\",\"trish\":\"翠西\",\"alexis rhodes\":\"天上院明日香\",\"cyno\":\"赛诺\",\"alexia midgar\":\"阿莱克西亚·米德嘉尔\",\"wednesday addams\":\"星期三·亚当斯\",\"miyako shikimori\":\"式守都\",\"fuuka yamagishi\":\"山岸风花\",\"yukari takeba\":\"岳羽由加莉\",\"aigis\":\"埃癸斯\",\"celia claire\":\"瑟莉亚·库列尔\",\"hinata tachibana\":\"橘日向\",\"conte di cavour\":\"加富尔伯爵\",\"dhole\":\"豺\",\"senjuro rengoku\":\"炼狱千寿郎\",\"female protagonist\":\"汐见琴音\",\"makoto yuuki\":\"结城理\",\"asuka kurashina\":\"仓科明日香\",\"ulrich von hutten\":\"乌尔里希·冯·胡滕\",\"joey\":\"乔伊\",\"feng min\":\"凤敏\",\"friedrich der grosse\":\"腓特烈大帝\",\"mio naruse\":\"成濑澪\",\"maria naruse\":\"成濑万理亚\",\"frederica baumann\":\"法兰黛莉卡·鲍曼\",\"ai hoshino\":\"星野爱\",\"toki asuma\":\"飞鸟马时\",\"carol olston\":\"卡洛儿·奥尔斯顿\",\"shiroko terror\":\"白子*恐怖\",\"dia viekone\":\"蒂雅·维科尼\",\"ezio auditore\":\"艾吉奥·奥迪托雷\",\"sofia sartor\":\"索菲亚·萨尔托\",\"tang wutong\":\"唐舞桐\",\"maryland\":\"马里兰\",\"shinyou\":\"神鹰\",\"yawata maru\":\"八幡丸 | 云鹰\",\"kishinami\":\"岸波\",\"jingei\":\"迅鲸\",\"chougei\":\"长鲸\",\"cyllene\":\"星月\",\"queen draco\":\"妖妃德拉科\",\"march 7th\":\"三月七\",\"himari akeboshi\":\"明星日鞠\",\"asta\":\"艾丝妲 | 亚斯塔\",\"garou\":\"饿狼\",\"himeko\":\"姬子\",\"herta\":\"黑塔\",\"stelle\":\"星\",\"clara\":\"克拉拉\",\"nene ayachi\":\"绫地宁宁\",\"neeko\":\"妮蔻\",\"nidalee\":\"奈德丽\",\"vex\":\"薇古丝\",\"yuu nishinoya\":\"西谷夕\",\"asahi azumane\":\"东峰旭\",\"zoe\":\"佐伊\",\"annie\":\"安妮\",\"yanagi uzaki\":\"宇崎柳\",\"baiken\":\"梅喧\",\"asuka kazama\":\"风间飞鸟\",\"lili rochefort\":\"莉莉·罗舍福尔\",\"shizuko kawawa\":\"河和静子\",\"akira kiyosumi\":\"清澄晶\",\"kanji sasahara\":\"笹原完士\",\"chika ogiue\":\"荻上千佳\",\"saki kasukabe\":\"春日部咲\",\"kanako ohno\":\"大野加奈子\",\"makoto kousaka\":\"高坂真琴\",\"kenjirou hato\":\"波户贤二郎\",\"rika yoshitake\":\"吉武莉华\",\"harunobu madarame\":\"斑目晴信\",\"rea sanka\":\"散华礼弥\",\"mero furuya\":\"降谷萌路\",\"judge\":\"法官\",\"himawari shinomiya\":\"四宫向日葵\",\"wakaba saegusa\":\"三枝若叶\",\"rei kuroki\":\"黑骑蕾\",\"tomoko hoshina\":\"保科智子\",\"lemmy miyauchi\":\"宫内蕾咪\",\"serika kurusugawa\":\"来栖川芹香\",\"akari kamigishi\":\"神岸明\",\"ayaka kurusugawa\":\"来栖川绫香\",\"shiho nagaoka\":\"长冈志保\",\"hiroyuki fujita\":\"藤田浩之\",\"aoi matsubara\":\"松原葵\",\"koyomi mizuhara\":\"水原历\",\"osaka\":\"大阪\",\"sakaki\":\"榊\",\"tomo takino\":\"泷野智\",\"chiyo mihama\":\"美滨千代\",\"riza wildman\":\"丽莎·瓦德曼\",\"hiro hiyorimi\":\"日和见日郎\",\"lillianne von phoenix\":\"莉莉安奴·冯·菲尼克斯\",\"sylvia von phoenix\":\"茜维亚·冯·菲尼克斯\",\"reiri kamura\":\"嘉村令里\",\"taeko minazuki\":\"水无月妙子\",\"amemiya nazuna\":\"飴宮なずな\",\"winter schnee\":\"温特·雪倪\",\"ruby hoshino\":\"露比（星野瑠美衣）\",\"roka maniwa\":\"马庭芦花\",\"lysithea von cordelia\":\"莉丝缇亚·冯·科迪利亚\",\"tamako kitashirakawa\":\"北白川玉子\",\"ui tamaki\":\"环羽衣\",\"shigure mayoi\":\"间宵时雨\",\"inori ichinose\":\"一之濑祈梨\",\"natsumi hodaka\":\"帆高夏海\",\"hina tsurugi\":\"鹤木阳渚\",\"gwen stacy\":\"格温·斯黛西\",\"reisa uzawa\":\"宇泽玲纱\",\"power\":\"帕瓦\",\"hirofumi yoshida\":\"吉田宽文\",\"silver wolf\":\"银狼\",\"moka akashiya\":\"赤夜萌香\",\"kurumu kurono\":\"黑乃胡梦\",\"mizore shirayuki\":\"白雪霙\",\"nagisa kirifuji\":\"桐藤渚\",\"fu xuan\":\"符玄\",\"qingque\":\"青雀\",\"sin mal\":\"杏·玛尔\",\"bailu\":\"白露\",\"tingyun\":\"停云\",\"bronya rand\":\"布洛妮娅·兰德\",\"shuuko komi\":\"古见秀子\",\"kana arima\":\"有马加奈\",\"mina majikina\":\"真镜名美奈\",\"nyotengu\":\"女天狗\",\"yuzuriha\":\"杠\",\"velvet\":\"薇尔贝特\",\"lucyna kushinada\":\"露西\",\"w\":\"W\",\"senko\":\"仙狐\",\"johnny silverhand\":\"强尼·银手\",\"david martinez\":\"大卫·马丁内斯\",\"gwendolyn\":\"关德琳\",\"oswald\":\"奥兹华德\",\"mabel rayveil\":\"梅贝露·蕾贝露\",\"akane kurokawa\":\"黑川茜\",\"perona\":\"佩罗娜\",\"suzume iwato\":\"岩户铃芽\",\"souta munakata\":\"宗像草太\",\"tsundere elf\":\"翠\",\"sumika fujimiya\":\"藤宫澄夏\",\"yousuke shibazaki\":\"岛㟢阳介\",\"alicia edelsia\":\"艾丽西亚·伊德露西亚\",\"purah\":\"普尔亚\",\"touko fukawa\":\"腐川冬子\",\"haru\":\"春\",\"rio kastle\":\"神代璃绪\",\"elizabeth liones\":\"伊丽莎白·里昂妮丝\",\"yanqing\":\"彦卿\",\"seika ijichi\":\"伊地知星歌\",\"rika furude\":\"古手梨花\",\"junko akashi\":\"赤司淳子\",\"black widow\":\"黑寡妇\",\"midna\":\"米多娜\",\"arisu sakayanagi\":\"坂柳有栖\",\"griseo\":\"格蕾修\",\"melina\":\"梅琳娜\",\"hinoa\":\"火芽\",\"implacable\":\"怨仇\",\"asuma sarutobi\":\"猿飞阿斯玛\",\"mizuki akiyama\":\"晓山瑞希\",\"ena shinonome\":\"东云绘名\",\"airi momoi\":\"桃井爱莉\",\"akito shinonome\":\"东云彰人\",\"an shiraishi\":\"白石杏\",\"emu otori\":\"凤笑梦\",\"haruka kiritani\":\"桐谷遥\",\"honami mochizuki\":\"望月穗波\",\"ichika hoshino\":\"星乃一歌\",\"kohane azusawa\":\"小豆泽心羽\",\"minori hanasato\":\"花里实乃理\",\"nene kusanagi\":\"草薙宁宁\",\"rui kamishiro\":\"神代类\",\"saki tenma\":\"天马咲希\",\"shiho hinomori\":\"日野森志步\",\"shizuku hinomori\":\"日野森雫\",\"toya aoyagi\":\"青柳冬弥\",\"tsukasa tenma\":\"天马司\",\"kouta oyamada\":\"小山田耕太\",\"chizuru minamoto\":\"源千鹤\",\"nozomu ezomori\":\"犹守望\",\"anisphia wynn palettia\":\"艾妮丝菲亚·温·帕雷提亚\",\"euphyllia magenta\":\"尤菲莉亚·玛赞塔\",\"gobuta\":\"哥布塔\",\"hakos baelz\":\"哈珂斯·贝尔丝\",\"saitama\":\"琦玉\",\"rukia kuchiki\":\"朽木露琪亚\",\"dori sangemah bay\":\"多莉·桑歌玛哈巴依\",\"baizhu\":\"白术\",\"lewis\":\"刘易斯\",\"kagura mea\":\"神乐Mea\",\"gabriel\":\"加百列\",\"europa\":\"欧罗巴\",\"neneka utsushimi\":\"现士实似似花\",\"penny\":\"牡丹\",\"arslan\":\"亚尔斯兰\",\"tobio kageyama\":\"影山飞雄\",\"kirari momobami\":\"桃喰绮罗莉\",\"twin turbo\":\"双涡轮\",\"kishirika kishirisu\":\"奇希莉卡·奇希里斯\",\"urushi yaotome\":\"八乙女漆\",\"anne\":\"安\",\"grea\":\"古蕾雅\",\"sakurako utazumi\":\"歌住樱子\",\"miyako tsukiyuki\":\"月雪宫子\",\"koyuki kurosaki\":\"黑崎小雪\",\"atsuko hakari\":\"秤亚津子\",\"saya yakushi\":\"药子纱绫\",\"kaya shiranui\":\"不知火花耶\",\"mine aomori\":\"苍森美弥\",\"mina konoe\":\"近卫弥奈\",\"marina ikekura\":\"池仓玛丽娜\",\"eimi izumimoto\":\"和泉元艾米\",\"megu shimokura\":\"下仓惠\",\"serina sumi\":\"鹫见芹娜\",\"ayumu iwabitsu\":\"岩柜步梦\",\"rin nanagami\":\"七神凛\",\"aoi oki\":\"扇喜葵\",\"rumi akeshiro\":\"朱城瑠美\",\"michiru chidori\":\"千鸟满\",\"reijo kayama\":\"鹿山丽情\",\"maki konuri\":\"小涂真纪\",\"misaki imashino\":\"戒野美咲\",\"mimori mizuha\":\"水羽三森\",\"haruka igusa\":\"伊草遥香\",\"kirino nakatsukasa\":\"中务桐乃\",\"yoshimi ibaragi\":\"伊原木好美\",\"hiyori tsuchinaga\":\"槌永日和\",\"cherino renkawa\":\"连河切里诺\",\"kei tsukishima\":\"月岛萤\",\"izzy izumi\":\"泉光子郎\",\"tai kamiya\":\"八神太一\",\"agumon\":\"亚古兽\",\"hatoba tsugu\":\"鸠羽伦\",\"autumn blaze\":\"秋烨\",\"lyra heartstrings\":\"天琴心弦\",\"lopiniatre\":\"倔强\",\"luca ikaruga\":\"斑鸠路加\",\"hare omagari\":\"小钩晴\",\"karen aijo\":\"爱城华恋\",\"sawako kuronuma\":\"黑沼爽子\",\"izumi shishidou\":\"狮子堂泉\",\"lynette\":\"琳妮特\",\"focalors\":\"芙宁娜\",\"mizuki\":\"水月\",\"ayame kajou\":\"华城绫女\",\"kirche augusta frederica von anhalt zerbst\":\"丘鲁克·奥古斯都·菲列特利加·封·安哈尔特·泽鲁普斯特\",\"london\":\"伦敦\",\"enlilta reesehyde bertrand\":\"贝尔托兰\",\"momiji akiizumi\":\"秋泉红叶\",\"howe\":\"豪\",\"aki shino\":\"志野亚贵\",\"kotama otose\":\"音濑小玉\",\"minoto\":\"水芸\",\"matikanefukukitaru\":\"待兼福来\",\"hiyori harusaki\":\"春咲日和莉\",\"rei shijo\":\"士条怜\",\"tomo aizawa\":\"相泽智\",\"junichirou kubota\":\"久保田淳一郎\",\"misuzu gundou\":\"群堂美铃\",\"minato senkawa\":\"千川凑\",\"yuuta sakurada\":\"樱田悠太\",\"saria\":\"塞雷娅\",\"saga\":\"嵯峨\",\"bagpipe\":\"风笛\",\"hoolheyak\":\"霍尔海雅\",\"dorothy\":\"多萝西\",\"daki\":\"堕姬\",\"professor juniper\":\"红豆杉博士\",\"hirato\":\"平户\",\"dancer of the boreal valley\":\"冷冽谷的舞娘\",\"ayumi momozono\":\"桃园步美\",\"shirayuki mishiro\":\"白雪深白\",\"killer bee\":\"奇拉比\",\"jiraiya\":\"自来也\",\"ares\":\"阿瑞斯\",\"hippolyta\":\"希波吕忒\",\"ms. marvel\":\"惊奇女士\",\"io hasekura\":\"支仓伊绪\",\"tuscaloosa\":\"塔斯卡卢萨\",\"heywood l.e.\":\"海伍德·L·E\",\"ranger\":\"突击者\",\"janus\":\"雅努斯\",\"ornn\":\"奥恩\",\"chong yue\":\"重岳\",\"ethan\":\"伊桑\",\"ren yamashiro\":\"山城恋\",\"sena himuro\":\"冰室濑名\",\"amane tanikaze\":\"谷风天音\",\"sairi mikuni\":\"三国彩里\",\"kaede kinoshita\":\"木下枫\",\"chika shiraishi\":\"白石千花\",\"tomoya mashiro\":\"真白友也\",\"constanze amalie von braunschbank-albrechtsberger\":\"康斯坦策·阿玛莉·冯·布朗施班克·阿尔布雷希茨贝格\",\"kaori kyan\":\"喜屋武香织\",\"janna\":\"迦娜\",\"fuyu fuiba\":\"风衣叶冬优\",\"jia ran\":\"嘉然\",\"navia\":\"娜维娅\",\"clorinde\":\"克洛琳德\",\"neuvillette\":\"那维莱特\",\"lyney\":\"林尼\",\"yukiko kudo\":\"工藤有希子\",\"myrtle\":\"桃金娘\",\"ganondorf\":\"加侬多夫\",\"maidena ange\":\"梅蒂娜·安洁\",\"noma rune\":\"诺玛·卢恩\",\"toxico dannar\":\"毒毒子·达纳\",\"enome north\":\"艾诺梅·诺斯\",\"marina katsuragi\":\"葛城真理奈\",\"executioner\":\"行裁者\",\"scarecrow\":\"稻草人\",\"hk416\":\"HK416 | 可露凯\",\"dsr-50\":\"DSR-50\",\"ots-14\":\"OTs-14 | 闪电\",\"p90\":\"P90\",\"wa2000\":\"WA2000 | 玛绮朵\",\"pa-15\":\"PA-15 | 芙洛伦\",\"agent\":\"代理人\",\"welrod mkii\":\"维尔德MkⅡ\",\"ak-12\":\"AK-12\",\"an-94\":\"AN-94\",\"kalina\":\"格琳娜\",\"ump45\":\"UMP45 | 莱娅\",\"vsk-94\":\"VSK-94\",\"g11\":\"G11 | 米什缇\",\"desert eagle\":\"沙漠之鹰\",\"ump9\":\"UMP9 | 莱娜\",\"tar-21\":\"TAR-21\",\"aa-12\":\"AA-12\",\"mk23\":\"Mk23\",\"ouroboros\":\"衔尾蛇\",\"intruder\":\"干扰者\",\"gager\":\"计量官\",\"architect\":\"建筑师\",\"alchemist\":\"炼金术士\",\"hunter\":\"猎手\",\"dreamer\":\"梦想家\",\"destroyer\":\"破坏者\",\"beak\":\"喙\",\"k2\":\"K2\",\"g3\":\"G3\",\"g36\":\"G36 | 桑朵莱希\",\"g36c\":\"G36C\",\"eliza\":\"伊莱莎\",\"m1911\":\"M1911\",\"m99\":\"M99\",\"m950a\":\"M950A\",\"p38\":\"P38\",\"ppk\":\"PPK\",\"p08\":\"P08\",\"mauser c96\":\"C96\",\"m37\":\"M37\",\"mac-10\":\"MAC-10\",\"ppsh-41\":\"PPSh-41 | 波波沙\",\"pps-43\":\"PPS-43\",\"pp-90\":\"PP-90 | 乌琪\",\"thunder\":\"雷电\",\"negev\":\"内格夫\",\"st ar-15\":\"ST AR-15\",\"m4a1\":\"M4A1\",\"m4 sopmod ii\":\"M4 SOPMODII\",\"m16a1\":\"M16A1\",\"ak-15\":\"AK-15\",\"rpk-16\":\"RPK-16\",\"nagant revolver\":\"纳甘左轮 | 纳甘\",\"colt revolver\":\"柯尔特左轮\",\"super-shorty\":\"超级肖蒂\",\"python\":\"蟒蛇\",\"m9\":\"M9\",\"tokarev\":\"托卡列夫\",\"stechkin\":\"斯捷奇金 | 科谢尼娅\",\"makarov\":\"马卡洛夫\",\"type 92\":\"92式\",\"glock 17\":\"格洛克17\",\"thompson\":\"汤姆森\",\"m3\":\"M3\",\"kriss vector\":\"维克托\",\"vector\":\"维克托\",\"mp40\":\"MP40\",\"mp5\":\"MP5\",\"ro635\":\"RO635\",\"skorpion\":\"蝎式\",\"mp7\":\"MP7 | 奇塔\",\"sten mkii\":\"司登MkⅡ\",\"beretta model 38\":\"伯莱塔38型\",\"micro uzi\":\"微型乌兹\",\"m45\":\"m45\",\"m1 garand\":\"M1加兰德\",\"9a-91\":\"9A-91\",\"ameli\":\"阿梅利\",\"m200\":\"M200\",\"kar98k\":\"Kar98k\",\"ots-12\":\"OTs-12\",\"tmp\":\"TMP | 哈卜茜\",\"fn five-seven\":\"FN-57\",\"sr-3mp\":\"SR-3MP\",\"k5\":\"K5\",\"rfb\":\"RFB\",\"art556\":\"ART556\",\"florence\":\"芙洛伦 | 芙罗伦斯\",\"webley\":\"韦伯利\",\"ifrit\":\"伊芙利特\",\"kabane kusaka\":\"日下夏羽\",\"sigewinne\":\"希格雯\",\"mitsuki nase\":\"名瀬美月\",\"izumi nase\":\"名濑泉\",\"kaito kirishima\":\"雾岛海人\",\"ichika takatsuki\":\"贵月一花\",\"magdeburg\":\"马格德堡\",\"kaveh\":\"卡维\",\"tea gardner\":\"真崎杏子\",\"laphicet\":\"莱菲瑟特\",\"eleanor hume\":\"艾蕾诺亚·修姆\",\"magillanica lou mayvin\":\"玛琪露\",\"topaz\":\"托帕\",\"jingliu\":\"镜流\",\"dan heng\":\"丹恒\",\"caelus\":\"穹\",\"pozemka\":\"鸿雪\",\"kotori toyomi\":\"丰见亚都梨\",\"frieren\":\"芙莉莲\",\"joshua bright\":\"约修亚·布莱特\",\"courier\":\"讯使\",\"thorns\":\"棘刺\",\"issei hyoudou\":\"兵藤一诚\",\"chizuru shiina\":\"椎名千鹤\",\"miss fortune\":\"厄运小姐\",\"riven\":\"锐雯\",\"zac\":\"扎克\",\"xenovia quarta\":\"洁诺薇亚·夸塔\",\"crow armbrust\":\"克洛·安布斯特\",\"yshtola rhul\":\"雅·修特拉·路尔\",\"fine motion\":\"美妙姿势\",\"air groove\":\"气槽\",\"matikane tannhauser\":\"待兼诗歌剧\",\"ash ketchum\":\"小智\",\"jirachi\":\"基拉祈\",\"mew\":\"梦幻\",\"billy the kid\":\"比利·奇德\",\"lloyd bannings\":\"罗伊德·班宁斯\",\"agnes claudel\":\"亚妮艾丝·克劳蒂尔\",\"lorelei\":\"科拿\",\"fern\":\"菲伦\",\"cure sky\":\"索拉・哈雷瓦塔尔\",\"chiyari tenkajin\":\"天火人血枪\",\"ai sugimoto\":\"杉本爱\",\"nobara kugisaki\":\"钉崎野蔷薇\",\"maki zenin\":\"禅院真希\",\"usagi saionji\":\"西园寺兔\",\"principal minami\":\"南日和子\",\"sumi takane\":\"高岭珠深\",\"illumi zoldyck\":\"伊路米·揍敌客\",\"charybdis\":\"卡律布狄斯\",\"elbe\":\"易北\",\"anchorage\":\"安克雷奇\",\"jade\":\"亚德\",\"scylla\":\"斯库拉\",\"algerie\":\"阿尔及利亚\",\"erika\":\"莉佳\",\"juliana\":\"小青\",\"ishizu ishtar\":\"伊西丝·伊修达尔\",\"mai valentine\":\"孔雀舞\",\"serenity wheeler\":\"川井静香\",\"aki izayoi\":\"十六夜秋\",\"aoi zaizen\":\"财前葵\",\"emma bessho\":\"别所惠麻\",\"kotori mizuki\":\"观月小鸟\",\"anna kouzuki\":\"神月安奈\",\"sherry leblanc\":\"雪莉·卢布朗\",\"mina simington\":\"狭雾深影\",\"romin kirishima\":\"雾岛露明\",\"yuzu hiiragi\":\"柊柚子\",\"sera\":\"塞拉\",\"chloe\":\"小春\",\"stella vermillion\":\"史黛菈·法米利昂\",\"ikki kurogane\":\"黑铁一辉\",\"bort\":\"圆粒金刚石\",\"cinnabar\":\"辰砂\",\"phosphophyllite\":\"磷叶石\",\"euclase\":\"蓝柱石\",\"asana mutsuba\":\"六叶麻奈\",\"yuuka gouha\":\"哥哈游佳\",\"haruka kamijo\":\"上城大华／泰格\",\"tatsuhisa kamijo\":\"上城龙久\",\"yuga ohdo\":\"王道游我\",\"rossweisse\":\"罗丝薇瑟\",\"villetta nu\":\"维蕾塔·努\",\"kaname ohgi\":\"扇要\",\"ruri\":\"黑咲琉璃\",\"cornelia li britannia\":\"柯内莉亚·li·布里塔尼亚\",\"monica kruszewski\":\"莫妮卡·库鲁席夫斯基\",\"jessie rasberry\":\"杰西\",\"tamaki\":\"环\",\"nagisa\":\"凪咲\",\"nanami\":\"娜娜米\",\"misaki\":\"海咲\",\"sayuri\":\"小百合\",\"helena\":\"海伦娜\",\"momiji\":\"红叶\",\"nico\":\"NiCO\",\"monica\":\"莫妮卡\",\"fiona\":\"菲欧娜\",\"cai wenji\":\"蔡文姬\",\"diao chan\":\"貂蝉\",\"lian shi\":\"步练师\",\"aciddrop\":\"酸糖\",\"claudia\":\"Claudia\",\"kozue otomune\":\"乙宗梢\",\"tsuzuri yugiri\":\"夕雾缀理\",\"futari gotou\":\"后藤二里\",\"frostleaf\":\"霜叶\",\"highmore\":\"海沫\",\"mei misaki\":\"见崎鸣\",\"kenma kozume\":\"孤爪研磨\",\"tadashi yamaguchi\":\"山口忠\",\"leon s. kennedy\":\"里昂·斯科特·肯尼迪\",\"sayaka igarashi\":\"五十岚清华\",\"kiba inuzuka\":\"犬冢牙\",\"aang\":\"安昂\",\"kyouko kirigiri\":\"雾切响子\",\"astral\":\"星光体\",\"yuma tsukumo\":\"九十九游马\",\"kite tenjo\":\"天城快斗\",\"droite\":\"德鲁瓦（右臂）\",\"mizar\":\"米扎艾尔\",\"dumon\":\"德鲁贝\",\"ariados\":\"阿利多斯\",\"latias\":\"拉帝亚斯\",\"endministrator\":\"管理员\",\"perlica\":\"佩丽卡\",\"absinthe\":\"苦艾\",\"misha necron\":\"米夏·涅库罗\",\"sentouki - roze\":\"闪刀姬-露世\",\"kooh\":\"酷儿\",\"aaya saitou\":\"齐藤亚绫\",\"kiiko kawakami\":\"川上纪衣子\",\"princess gradriel de valendia\":\"海拉加德的公主\",\"olivier mira armstrong\":\"奥利维亚·米拉·阿姆斯特朗\",\"aqua hoshino\":\"星野爱久爱海（阿库亚）\",\"miyako saitou\":\"齐藤京子\",\"airi kurimura\":\"栗村爱莉\",\"rentarou aijou\":\"爱城恋太郎\",\"karane inda\":\"院田唐音\",\"hakari hanazono\":\"花园羽香里\",\"mayling shen\":\"沈美玲\",\"akari wanibuchi\":\"鳄渊亚伽里\",\"kikyou kiryuu\":\"桐生桔梗\",\"fuwawa abyssgard\":\"软软·阿比斯加德\",\"mococo abyssgard\":\"茸茸·阿比斯加德\",\"hijiri mochizuki\":\"望月圣\",\"eila ilmatar juutilainen\":\"艾拉·伊尔玛塔尔·尤蒂莱南\",\"yuuhi oudou\":\"王道游飞\",\"tell kawai\":\"合羽井英\",\"kouko kaga\":\"加贺香子\",\"lisanna strauss\":\"丽莎娜·斯特劳斯\",\"mia luna tearmoon\":\"米雅·卢娜·堤亚穆\",\"ruan mei\":\"阮·梅\",\"li sushang\":\"李素裳 | 素裳\",\"prometheus\":\"普罗米修斯\",\"lisesharte atismata\":\"莉姿夏尔蒂·亚提司玛特\",\"dantoudai no aura\":\"阿乌拉\",\"ayano yuugiri\":\"夕桐绫乃\",\"rose oriana\":\"萝丝·奥里亚纳\",\"vladilena milize\":\"芙拉蒂蕾娜·米利杰\",\"sharon\":\"莎郎 | 莎朗·荷莉格蕾尔\",\"warlock\":\"术士\",\"tamaki kotatsu\":\"环古达\",\"brigitte lindholm\":\"布丽吉塔\",\"tatsuya kaname\":\"鹿目达也\",\"kamille bidan\":\"卡缪·比丹\",\"delta\":\"德尔塔\",\"kyouko yuuki\":\"结城京子\",\"maomao\":\"猫猫\",\"chris redfield\":\"克里斯·雷德菲尔德\",\"kazuma ikezawa\":\"池泽佳主马\",\"kenji koiso\":\"小矶健二\",\"yuki sanada\":\"真田雪\",\"natsuki usami\":\"宇佐美夏树\",\"galleon\":\"伽莱翁\",\"asa mitaka\":\"三鹰朝\",\"sayaka murano\":\"村野沙耶香\",\"kaho hinoshita\":\"日野下花帆\",\"gravel\":\"砾\",\"ant-man\":\"蚁人\",\"utena hiiragi\":\"柊舞缇娜\",\"chevreuse\":\"夏沃蕾\",\"huohuo\":\"藿藿\",\"lynx landau\":\"玲可\",\"pelageya sergeyevna\":\"佩拉格娅·谢尔盖耶夫娜\",\"hook\":\"虎克\",\"yukong\":\"驭空\",\"guinaifen\":\"桂乃芬\",\"rumi usagiyama\":\"兔山留美\",\"ryuko tatsuma\":\"龙间龙子\",\"itsuka kendou\":\"拳藤一佳\",\"nejire hado\":\"波动螺卷\",\"setsuna tokage\":\"取荫切奈\",\"lady nagant\":\"筒美火伊那\",\"kyoka jiro\":\"耳郎响香\",\"tooru hagakure\":\"叶隐透\",\"ibara shiozaki\":\"塩崎茨\",\"kinoko komori\":\"小森希乃子\",\"pony tsunotori\":\"角取波尼\",\"reiko yanagi\":\"柳玲子\",\"yui kodai\":\"小大唯\",\"mount lady\":\"岳山优\",\"moe kamiji\":\"上路萌\",\"mei hatsume\":\"发目明\",\"mashirao ojiro\":\"尾白猿夫\",\"nemuri kayama\":\"香山睡\",\"chiori\":\"千织\",\"shuro yabuki\":\"箭吹棕榈\",\"blade\":\"刃\",\"astesia\":\"星极\",\"ichika nakamasa\":\"仲正一花\",\"nodoka amami\":\"天见和香\",\"shadow the hedgehog\":\"夏特\",\"iris\":\"艾莉丝\",\"momoka yuragi\":\"由良木桃香\",\"yukari kadenokouji\":\"勘解由小路紫\",\"yakumo aramaki\":\"荒牧八云\",\"kasumi kinugawa\":\"鬼怒川霞\",\"niya amachi\":\"天地妮娅\",\"fiammetta\":\"菲亚梅塔\",\"shu\":\"黍\",\"hahari hanazono\":\"花园羽羽里\",\"naoto hachiouji\":\"八王子直人\",\"xianyun\":\"闲云（留云借风真君）\",\"aizawa ema\":\"蓝泽艾玛\",\"kurumi noah\":\"胡桃诺娅\",\"atsushi murasakibara\":\"紫原敦\",\"junna hoshimi\":\"星见纯那\",\"hikari kagura\":\"神乐光\",\"futaba isurugi\":\"石动双叶\",\"kaoruko hanayagi\":\"花柳香子\",\"mahiru tsuyuzaki\":\"露崎真昼\",\"shizuka yoshimoto\":\"好本静\",\"anastasia hoshin\":\"安娜塔西亚·合辛\",\"stark\":\"休塔尔克\",\"aiba uiha\":\"相羽初叶\",\"sherlock shellingford\":\"夏洛克·雪莉福德\",\"sodachi oikura\":\"老仓育\",\"smolder\":\"斯莫得\",\"touka satomi\":\"里见灯花\",\"firefly\":\"流萤\",\"black swan\":\"黑天鹅\",\"gaming yip\":\"嘉明\",\"dunyarzad homayani\":\"迪娜泽黛\",\"sparkle\":\"花火\",\"senadina\":\"希娜狄雅\",\"satoshi mizukami\":\"水上敏志\",\"secelia dote\":\"塞西莉亚·多特\",\"gon freecss\":\"杰·富力士\",\"meteion\":\"梅蒂恩\",\"emil sinclair\":\"辛克莱\",\"yi sang\":\"李箱\",\"gary oak\":\"小茂\",\"red\":\"赤红\",\"coralie 6626 planck\":\"科拉莉·6626·普朗克\",\"ami nonomura\":\"野野村亚美\",\"indomitable\":\"不挠\",\"kurumi tsuchimikado\":\"土御门胡桃\",\"ada wong\":\"艾达·王\",\"yamato takeru\":\"日本武尊\",\"wriothesley\":\"莱欧斯利\",\"rin uehara\":\"上原燐\",\"himeno\":\"姬野\",\"tomori takamatsu\":\"高松灯\",\"anon chihaya\":\"千早爱音\",\"soyo nagasaki\":\"长崎爽世\",\"taki shiina\":\"椎名立希\",\"penance\":\"斥罪\",\"kisaki ryuuge\":\"龙华妃咲\",\"takane miyoshi\":\"三善贵音\",\"kiriko kamori\":\"家守雾子\",\"genji\":\"源氏\",\"ichigo kurosaki\":\"黑崎一护\",\"retsu unohana\":\"卯之花烈\",\"rui yashio\":\"八潮瑠唯\",\"miles morales\":\"迈尔斯·莫拉雷斯\",\"stella\":\"星\",\"asahi ohka\":\"樱花朝日\",\"miyo murosaki\":\"室崎美夜\",\"konan\":\"小南\",\"shadowo tto shark\":\"夏朵\",\"sonic the hedgehog\":\"刺猬索尼克\",\"megumi fujishima\":\"藤岛慈\",\"rurino osawa\":\"大泽瑠璃乃\",\"giselle gewelle\":\"吉赛尔·茱艾尔\",\"jun sazanami\":\"涟纯\",\"ben tennyson\":\"田小班\",\"gwen tennyson\":\"田小玟\",\"virtuosa\":\"塑心（阿尔图罗）\",\"viviana droste\":\"薇薇安娜·德罗斯特\",\"meowscarada\":\"魔幻假面喵\",\"incineroar\":\"炽焰咆哮虎\",\"blaziken\":\"火焰鸡\",\"raboot\":\"腾蹴小将\",\"kaisa\":\"卡莎\",\"wukong\":\"孙悟空\",\"deathclaw\":\"死亡爪\",\"night stalker\":\"夜枭\",\"stolas\":\"斯托拉斯\",\"blitzo\":\"比利兹\",\"loona\":\"露娜\",\"moxxie\":\"摩西\",\"millie\":\"米莉\",\"diane foxington\":\"黛安·狐辛顿\",\"mr. mason wolf\":\"狼先生\",\"shion karanomori\":\"唐之杜志恩\",\"sagiri yamada asaemon\":\"山田浅卫门佐切\",\"garan no gabimaru\":\"画眉丸\",\"azki\":\"AZKi\",\"jade chan\":\"小玉\",\"alex power\":\"亚历山大·鲍尔\",\"jack power\":\"杰克·鲍尔\",\"katie power\":\"凯瑟琳·鲍尔\",\"julie power\":\"朱莉·鲍尔\",\"yukina himeragi\":\"姬柊雪菜\",\"muimi sonoue\":\"园上矛依未\",\"minori yasumori\":\"安守实梨\",\"kikyou kushida\":\"栉田桔梗\",\"rouge the bat\":\"露姬\",\"amy rose\":\"艾咪·罗斯\",\"miles tails prower\":\"塔尔斯\",\"hikari tachibana\":\"橘光明\",\"nozomi tachibana\":\"橘希望\",\"mary saotome\":\"早乙女芽亚里\",\"ririka momobami\":\"桃喰莉莉香\",\"midari ikishima\":\"生志摩妄\",\"leonora nakiri\":\"薙切蕾欧诺拉\",\"ibuki tanga\":\"丹花伊吹\",\"shinobu kudo\":\"工藤忍\",\"gwen\":\"格温\",\"princess bubblegum\":\"泡泡糖公主\",\"plume\":\"翎羽\",\"catapult\":\"空爆\",\"makoto tachibana\":\"橘真琴\",\"lisa simpson\":\"莉萨·辛普森\",\"marge simpson\":\"玛琦·辛普森\",\"homer simpson\":\"霍默·辛普森\",\"moe szyslak\":\"莫·希斯拉克\",\"bart simpson\":\"巴特·辛普森\",\"sideshow bob\":\"杂耍家鲍伯\",\"cookie kwan\":\"曲奇·关\",\"maggie simpson\":\"玛吉·辛普森\",\"edna krabappel\":\"埃德娜·克拉巴佩尔\",\"patty bouvier\":\"帕蒂·布维尔\",\"selma bouvier\":\"塞尔玛·布维尔\",\"natsumi onitsuka\":\"鬼塚夏美\",\"wien margarete\":\"维恩·玛格丽特\",\"shellin burgundy\":\"谢林·勃艮第\",\"levi ackerman\":\"利威尔·阿克曼\",\"belldandy\":\"贝露丹蒂\",\"karamatsu matsuno\":\"松野空松\",\"onpu segawa\":\"濑川音符\",\"doremi harukaze\":\"春风DoReMi\",\"ichimatsu matsuno\":\"松野一松\",\"ubel\":\"尤贝尔\",\"takeru taiga\":\"大河武\",\"ikoma\":\"生驹\",\"juufuutei raden\":\"儒乌风亭螺钿\",\"chitose kisaragi\":\"如月千岁\",\"erik\":\"卡缪\",\"mika schmidt\":\"米卡·施密特\",\"van gogh\":\"梵高\",\"shousetsu yui\":\"由井正雪\",\"xu fu\":\"徐福\",\"okuni\":\"出云阿国\",\"do-s\":\"弩S\",\"fiona frost\":\"菲奥娜·弗洛斯特\",\"spike\":\"斯派克\",\"adagio dazzle\":\"阿达吉奥·达佐\",\"aria blaze\":\"阿里亚·布雷兹\",\"cheerilee\":\"车厘子\",\"king sombra\":\"黑晶王\",\"stellar flare\":\"星辰闪耀\",\"tempest shadow\":\"狂风暗影\",\"zecora\":\"泽科拉\",\"coco pommel\":\"可可·帕梅\",\"flurry heart\":\"凝心雪儿\",\"limestone pie\":\"石青派\",\"maud pie\":\"石灰派\",\"nurse redheart\":\"红心护士\",\"pear butter\":\"金梨果酱\",\"toriel\":\"托丽尔\",\"frisk\":\"福\",\"lana loud\":\"拉娜·劳德\",\"leni loud\":\"兰妮·劳德\",\"lincoln loud\":\"林肯·劳德\",\"lisa loud\":\"莉萨·劳德\",\"lola loud\":\"萝拉·劳德\",\"luan loud\":\"卢安·劳德\",\"luna loud\":\"露娜·劳德\",\"lynn loud\":\"琳恩·劳德\",\"rita loud\":\"丽塔·劳德\",\"clyde mcbride\":\"克莱德·麦克布莱德\",\"lori loud\":\"罗丽·劳德\",\"lily loud\":\"莉莉·劳德\",\"lucy loud\":\"露西·劳德\",\"lynn loud sr.\":\"老林恩·劳德\",\"claire redfield\":\"克莱尔·雷德菲尔德\",\"albert wesker\":\"阿尔伯特·威斯克\",\"kukulkan\":\"库库尔坎\",\"iori miyamoto\":\"宫本伊织\",\"kirara yozakura\":\"夜樱绮罗罗\",\"britomart\":\"布里托玛特\",\"rex\":\"莱克斯\",\"shizuka mikazuki\":\"三日月闲\",\"la pluma\":\"羽毛笔\",\"if\":\"爱耶芙\",\"luo xiaohei\":\"罗小黑\",\"wuxian\":\"无限\",\"shinsaku takasugi\":\"高杉晋作\",\"nagayoshi mori\":\"森长可\",\"locusta\":\"洛库斯塔\",\"wandjina\":\"旺吉娜\",\"tlaloc\":\"特拉洛克\",\"black cat\":\"费莉西亚‧哈代（黑猫）\",\"spider-man\":\"蜘蛛侠\",\"mary jane watson\":\"玛丽•简•沃森\",\"aesc the savior\":\"救世主梣\",\"morgan\":\"摩根\",\"aphrodite\":\"阿佛洛狄忒\",\"kotarou fuuma\":\"风魔小太郎\",\"boggart\":\"博格特\",\"tezcatlipoca\":\"特斯卡特利波卡\",\"arjuna\":\"阿周那\",\"ashwatthama\":\"马嘶\",\"shirou amakusa\":\"天草四郎\",\"oberon\":\"奥伯龙\",\"ashiya douman\":\"芦屋道满\",\"robin hood\":\"罗宾汉\",\"ryouma sakamoto\":\"坂本龙马\",\"kojiro sasaki\":\"佐佐木小次郎\",\"james moriarty\":\"詹姆斯·莫里亚蒂\",\"hajime saitou\":\"斋藤一\",\"goredolf musik\":\"戈尔德鲁夫·穆吉克\",\"edward teach\":\"爱德华·蒂奇\",\"habetrot\":\"哈贝特洛特\",\"velma dinkley\":\"维尔玛·丁克利\",\"daphne blake\":\"达芙妮·布雷克\",\"brock\":\"小刚\",\"vulpix\":\"六尾\",\"zoroark\":\"索罗亚克\",\"yveltal\":\"伊裴尔塔尔\",\"groudon\":\"固拉多\",\"charizard\":\"喷火龙\",\"korra\":\"科拉\",\"snoopy\":\"史努比\",\"charlie brown\":\"查理·布朗\",\"sally brown\":\"莎莉·布朗\",\"linus van pelt\":\"莱纳斯·潘贝鲁特\",\"lucy van pelt\":\"露西·潘贝鲁特\",\"patricia reichardt\":\"薄荷·派蒂\",\"marcie\":\"玛西\",\"franky franklin\":\"弗兰克·富兰克林\",\"cheryl\":\"芽米\",\"yangyang\":\"秧秧\",\"pachirisu\":\"帕奇利兹\",\"guitar meimei\":\"吉他妹妹\",\"kaede fuyou\":\"芙蓉枫\",\"charlemagne\":\"查理曼\",\"mandricardo\":\"曼迪卡尔多\",\"roland\":\"罗兰\",\"ace taffy\":\"永雏塔菲\",\"kim possible\":\"帕金姆\",\"ron stoppable\":\"冲不停\",\"shego\":\"席果\",\"bonnie rockwaller\":\"邦妮罗克威\",\"dr. drakken\":\"怪博士杜肯\",\"ann possible\":\"帕医生\",\"monique\":\"莫妮卡\",\"jim possible\":\"帕吉姆\",\"tim possible\":\"帕提姆\",\"joss possible\":\"帕乔丝\",\"rufus\":\"拉夫斯\",\"catwoman\":\"猫女\",\"tom\":\"汤姆\",\"jerry\":\"杰瑞\",\"ultrawoman\":\"女奥特曼\",\"king george v\":\"英王乔治五世\",\"golden hind\":\"金鹿号\",\"regensburg\":\"雷根斯堡\",\"trieste\":\"的里雅斯特\",\"gascogne\":\"加斯科涅\",\"downes\":\"唐斯\",\"volga\":\"伏尔加\",\"yorktown\":\"约克城\",\"drake\":\"德雷克\",\"sandy cheeks\":\"珊迪·奇克斯\",\"ishmael\":\"以实玛利\",\"gloucester\":\"格罗斯特\",\"bishamonten\":\"毘沙门天\",\"jessica rabbit\":\"兔子杰茜卡\",\"roger rabbit\":\"兔子罗杰\",\"betty boop\":\"贝蒂娃娃\",\"ankha\":\"尼罗\",\"isabelle\":\"西施惠\",\"cream the rabbit\":\"可利姆\",\"vanilla the rabbit\":\"瓦妮菈\",\"blaze the cat\":\"布蕾姿\",\"duca degli abruzzi\":\"阿布鲁齐公爵号轻巡洋舰\",\"lunacub\":\"子月\",\"dagda\":\"达哥达\",\"harmonie\":\"和弦\",\"beanstalk\":\"豆苗\",\"nicole demara\":\"妮可·德玛拉\",\"ranmaru mori\":\"森兰丸（谜之兰丸X）\",\"taisui xingjun\":\"太岁星君\",\"nemo marine\":\"尼莫水兵\",\"jun gotou\":\"五岛润\",\"typhon\":\"提丰\",\"yurine hanazono\":\"花园百合铃\",\"yinlin\":\"吟霖\",\"jinshi\":\"壬氏\",\"jinhsi\":\"今汐\",\"aversa\":\"茵巴丝\",\"ethan winters\":\"伊森·温特斯\",\"avenger\":\"安哥拉曼纽\",\"jtf mob\":\"正义实现委员会杂鱼酱\",\"mana nekomiya\":\"猫宫又奈\",\"verina\":\"维里奈\",\"agnes digital\":\"爱丽数码\",\"hishi miracle\":\"菱钻奇宝\",\"akeno misaki\":\"岬明乃\",\"kaoru mashiko\":\"益子薰\",\"sana futaba\":\"燕结芽\",\"talulah\":\"塔露拉\",\"hajime hinata\":\"日向创\",\"nagito komaeda\":\"狛枝凪斗\",\"wise\":\"哲 | 华兹\",\"ellen joe\":\"艾莲·乔\",\"ben bigger\":\"本·比格\",\"corin wickes\":\"可琳·威克斯\",\"grace howard\":\"格莉丝·霍华德\",\"anby demara\":\"安比·德玛拉\",\"encore\":\"安可\",\"nayuki minase\":\"水濑名雪\",\"taira no kagekiyo\":\"平景清\",\"misora nagare\":\"流美空\",\"akino toudou\":\"藤堂秋乃\",\"kuuka tomi\":\"远见空花\",\"yori kazemiya\":\"风宫依里\",\"hindenburg\":\"兴登堡\",\"renge fuwa\":\"不破莲华\",\"dio brando\":\"迪奥·布兰度\",\"jotaro kujo\":\"空条承太郎\",\"jolyne kujo\":\"空条徐伦\",\"noriaki kakyoin\":\"花京院典明\",\"josuke higashikata\":\"东方仗助\",\"okuyasu nijimura\":\"虹村亿泰\",\"aoi sakurai\":\"樱井葵\",\"orochimaru\":\"大蛇丸\",\"haruka hanabishi\":\"花菱春香\",\"hiro shinosawa\":\"筱泽广\",\"yan qing\":\"燕青\",\"kaede akamatsu\":\"赤松枫\",\"chiaki nanami\":\"七海千秋\",\"briar\":\"贝蕾亚 | 白蕾雅\",\"soda\":\"索达\",\"zhu yuan\":\"朱鸢\",\"inori yuzuriha\":\"楪祈\",\"kotone fujita\":\"藤田琴音\",\"acheron\":\"黄泉\",\"asanagi\":\"朝凪\",\"toji fushiguro\":\"伏黑甚尔\",\"curtana\":\"卡提那\",\"alisa mikhailovna kujou\":\"艾莉莎·米哈伊罗夫纳·九条\",\"lingyang\":\"凌阳\",\"atalanta alter\":\"阿塔兰忒〔Alter〕\",\"surcouf\":\"絮库夫\",\"yunli\":\"云璃\",\"saint cecilia\":\"塞西莉亚\",\"sona buvelle\":\"娑娜·布维尔\",\"dokibird\":\"Dokibird\",\"navia caspar\":\"娜维娅·卡萨帕\",\"shizuru kousaka\":\"高坂静流\",\"krystal\":\"克莉斯塔尔\",\"fox mccloud\":\"火狐·麦克劳德\",\"wolf odonnell\":\"沃尔夫·欧唐纳\",\"falco lombardi\":\"法尔科·兰巴帝\",\"panther caroso\":\"巴萨·卡尔罗兹\",\"peppy hare\":\"派比·海尔\",\"slippy toad\":\"史利比·陶德\",\"laios thorden\":\"莱欧斯\",\"chilchuck tims\":\"齐尔查克\",\"senshi\":\"森西\",\"jing yuan\":\"景元\",\"hwah jah\":\"华甲\",\"kento nanami\":\"七海建人\",\"nagusa goryou\":\"御稜名草\",\"utaha shiraishi\":\"白石咏叶\",\"namari\":\"娜玛莉\",\"sumika shiun\":\"紫云清夏\",\"zhou yu\":\"周瑜\",\"zheng chenggong\":\"郑成功\",\"qingyi\":\"青衣\",\"kinako\":\"黄豆粉\",\"chika komari\":\"小鞠知花\",\"kazuhiko nukumizu\":\"温水和彦\",\"fumiya tomozaki\":\"友崎文也\",\"minami nanami\":\"七海深奈实\",\"anna yanami\":\"八奈见杏菜\",\"lemon yakishio\":\"烧盐柠檬\",\"kayo hinazuki\":\"雏月加代\",\"changli\":\"长离\",\"ayano kimishima\":\"君岛绫乃\",\"chisaki sarashina\":\"更科茅咲\",\"mariya mikhailovna kujou\":\"玛利亚·米哈伊罗夫纳·九条\",\"yuki suou\":\"周防有希\",\"ayase mitsukasa\":\"三司绫濑\",\"kachina\":\"卡齐娜\",\"niyaniya kyouju\":\"笑面教授\",\"kojiro nezu\":\"根津弧次郎\",\"tokiyuki hojo\":\"北条时行\",\"yorishige suwa\":\"诹访赖重\",\"shizuku\":\"雫\",\"the flash\":\"闪电侠\",\"gentildonna\":\"贵妇人\",\"yamanin zephyr\":\"也文摄辉\",\"vivlos\":\"强击\",\"oguri cap\":\"小栗帽\",\"kindred\":\"千珏\",\"jane doe\":\"简·杜\",\"finana ryugu\":\"龍宮Finana\",\"poplar taneshima\":\"種島白楊\",\"saki hanami\":\"花海咲季\",\"umika satohama\":\"里浜海香\",\"spas-12\":\"SPAS-12 | 塞布丽娜\",\"ak-alfa\":\"AK-阿尔法(alfa) | 托洛洛\",\"type 97\":\"97式 | 绛雨\",\"ksvk\":\"KSVK | 杜莎妮\",\"mosin-nagant\":\"莫辛-纳甘 | 莫辛纳甘\",\"persicaria\":\"帕斯卡莉亚 | 帕斯卡\",\"g28\":\"G28 | 比悠卡\",\"makoto hanuma\":\"羽沼真琴\",\"falcon\":\"隼 | 莎克拉戈\",\"mg36\":\"MG36 | 莉丝\",\"idw\":\"IDW | 贝蒂\",\"m500\":\"M500 | 阿比盖尔\",\"m1897\":\"M1897 | 洁西\",\"lwmmg\":\"LWMMG | 拉姆\",\"qbu-88\":\"QBU-88 | 缠枝\",\"type 64\":\"64式 | 薮春\",\"howa type 64\":\"64式自\",\"fnc\":\"FNC | 巧可\",\"zb-26\":\"ZB26\",\"zas m21\":\"Zas M21\",\"xm8\":\"XM8\",\"xm3\":\"XM3\",\"x95\":\"X95\",\"vhs\":\"VHS\",\"sier\":\"希尔\",\"thelema nutriscu\":\"瑟莉姆\",\"songque\":\"松雀\",\"mei ling\":\"mei ling\",\"vepley\":\"维普蕾\",\"general liu\":\"刘氏步枪\",\"angelica\":\"安洁莉娅 | 安琪莉珂\",\"helianthus\":\"赫丽安图丝\",\"anna viktorovna tsoi\":\"安娜·维克多洛夫纳·崔\",\"ballista\":\"芭莉斯塔\",\"berezovich kryuger\":\"伯鲁泽维奇·克鲁格\",\"bren ten\":\"布伦·坦\",\"carcano m9138\":\"卡尔卡诺M91/38\",\"carcano m1891\":\"卡尔卡诺M1891\",\"contender\":\"竞争者\",\"dandelion\":\"丹德莱\",\"type 100\":\"樱花\",\"gentiane\":\"简缇娅\",\"ribeyrolles\":\"利贝罗勒\",\"cx4 storm\":\"Cx4 风暴\",\"px4 storm\":\"Px4 风暴\",\"nyto white\":\"白捏托\",\"nyto black\":\"黑捏托\",\"nimogen\":\"妮莫金\",\"mercurows\":\"墨丘萝丝\",\"lee-enfield\":\"李-恩菲尔德\",\"kolibri\":\"蜂鸟\",\"jericho\":\"杰里科\",\"isomer white\":\"失格异构体\",\"howa type 89\":\"89式自\",\"honey badger\":\"蜜獾\",\"grizzly mkv\":\"灰熊Mk V\",\"gepard m1\":\"猎豹M1\",\"galil\":\"加利尔\",\"bren\":\"布伦\",\"aug para\":\"AUG SMG\",\"raora panthera\":\"拉欧拉·潘特拉\",\"niyah\":\"尼娅\",\"ichijou ririka\":\"一条莉莉华\",\"crow\":\"克拉乌\",\"rapi\":\"拉毗\",\"anis\":\"阿妮斯\",\"helm\":\"海伦\",\"scarlet\":\"红莲\",\"crown\":\"皇冠\",\"red hood\":\"小红帽\",\"viper\":\"毒蛇\",\"neon\":\"尼恩\",\"rupee\":\"露菲\",\"noise\":\"诺伊斯\",\"elegg\":\"伊莱格\",\"d killer wife\":\"D:杀手妻子\",\"kanon konomori\":\"小之森夏音\",\"kinako nanobana\":\"菜花黄名子\",\"lulu\":\"仙灵女巫 (璐璐)\",\"koyori tanemura\":\"种村小依\",\"tsukuyo inaba\":\"因幡月夜\",\"eunhwa\":\"银华\",\"mary\":\"梅里\",\"guilty\":\"吉尔提\",\"mihara\":\"米哈拉\",\"bay\":\"贝伊\",\"brid\":\"布丽德\",\"tia\":\"蒂亚\",\"ludmilla\":\"鲁德米拉\",\"noir\":\"诺亚尔\",\"privaty\":\"普丽瓦蒂\",\"naga\":\"娜嘉\",\"exia\":\"艾可希雅\",\"marian\":\"玛丽安\",\"yuni\":\"尤妮\",\"marciana\":\"玛律恰那\",\"diesel\":\"迪塞尔\",\"cocoa\":\"可可\",\"volume\":\"沃纶姆\",\"sin\":\"森\",\"yulha\":\"尤尔夏\",\"jackal\":\"豺狼\",\"laplace\":\"拉普拉斯\",\"modernia\":\"神罚\",\"china kuramoto\":\"仓本千奈\",\"daitou\":\"大东\",\"ukuru\":\"鹈来\",\"shounan\":\"昭南\",\"inagi\":\"稻木\",\"hiburi\":\"日振\",\"lycanroc\":\"鬃岩狼人\",\"angol moa\":\"安格尔·摩亚\",\"temari tsukimura\":\"月村手毬\",\"futaba igarashi\":\"五十岚双叶\",\"wanderer\":\"流浪者\",\"horn\":\"号角\",\"whisperain\":\"絮雨\",\"andreana\":\"安哲拉\",\"degenbrecher\":\"锏\",\"saileach\":\"琴柳\",\"pekoras mother\":\"佩克拉妈妈\",\"unzen\":\"云仙\",\"pp90\":\"PP90 | 乌琪\",\"mualani\":\"玛拉妮\",\"shiori fujisaki\":\"藤崎诗织\",\"kiwi araga\":\"阿良河基维\",\"ririsa amano\":\"天乃莉莉紗\",\"lloyd de saloum\":\"罗伊德·迪·萨卢姆\",\"reina aharen\":\"阿波连玲奈\",\"suzune horikita\":\"堀北铃音\",\"fauna\":\"塞莱希·法娜\",\"momo ayase\":\"綾瀬桃\",\"andrew graves\":\"安德鲁·格雷夫斯\",\"mrs. graves\":\"格雷夫斯太太\",\"ashley graves\":\"阿什利·格雷夫斯\",\"greythroat\":\"灰喉\",\"pepe\":\"佩佩\",\"proviso\":\"但书\",\"ines\":\"伊内丝\",\"qiubai\":\"仇白\",\"gundo mirei\":\"郡道美玲\",\"catura\":\"夏托拉\",\"korisu morino\":\"杜乃可莉丝\",\"heian maru\":\"平安丸\",\"reinforce zwei\":\"琳芙斯II\",\"seiko yoshida\":\"吉田清子\",\"arthur pendragon\":\"亚瑟·潘德拉贡\",\"inutade\":\"犬蓼\",\"nina iseri\":\"井芹仁菜\",\"subaru awa\":\"安和昴\",\"momoka kawaragi\":\"河原木桃香\",\"rupa\":\"RUPA\",\"tomo ebizuka\":\"海老冢智\",\"yukari ayase\":\"绫濑由加莉\",\"hiromi seki\":\"关裕美\",\"swiftsure\":\"确捷\",\"ume hanami\":\"花海佑芽\",\"yusei fudo\":\"不动游星\",\"tsubasa kazanari\":\"风鸣翼\",\"elon musk\":\"埃隆·马斯克\",\"kearsarge\":\"奇尔沙治\",\"feixiao\":\"飞霄\",\"caesar king\":\"凯撒·金\",\"burnice white\":\"柏妮思·怀特\",\"miyabi hoshimi\":\"星见雅\",\"camellya\":\"椿\",\"koseki bijou\":\"古石ビジュ―\",\"luciana auxesis theodoro de montefio\":\"露西\",\"tomoki kuroki\":\"黑木智贵\",\"muelsyse\":\"缪尔赛思\",\"manticore\":\"狮蝎\",\"mogador\":\"莫加多尔\"},\"group\":{\"1\":\"1\",\"13\":\"13\",\"27\":\"27\",\"38\":\"38\",\"86\":\"86\",\"110\":\"110\",\"183\":\"183\",\"203\":\"ニイマルサン\",\"333\":\"333\",\"471\":\"四七一\",\"530\":\"530\",\"560\":\"560\",\"1122\":\"1122\",\"1787\":\"1787\",\"2961\":\"2961\",\"2990\":\"2990\",\"4040\":\"4040\",\"8716\":\"8716\",\"1000000000\":\"1000000000\",\"clockup\":\"CLOCKUP\",\"guilty\":\"Guilty\",\"guilty plus\":\"Guilty+\",\"guilty ex\":\"Guilty eX\",\"nanawind\":\"NanaWind\",\"orc soft\":\"ORCSOFT\",\"praline\":\"Praline\",\"sakuragame\":\"SakuraGame\",\"frill\":\"Frill\",\"triangle\":\"Triangle\",\"mana\":\"mana\",\"sprite\":\"sprite\",\"fairys\":\"fairys\",\"escude\":\"エスクード\",\"campus\":\"Campus\",\"interheart\":\"INTERHEART\",\"darknesspot\":\"DarknessPot\",\"nihon bussan\":\"日本物产\",\"sphinx\":\"SPHINX\",\"bishop\":\"BISHOP\",\"tanuki soft\":\"たぬきそふと\",\"baseson\":\"BaseSon\",\"miel\":\"Miel\",\"may-be soft\":\"May-Be SOFT\",\"squeez\":\"SQUEEZ\",\"milk factory\":\"みるふぁく\",\"alicesoft\":\"ALICESOFT\",\"omega star\":\"ωstar\",\"norn\":\"Norn\",\"aries\":\"Aries\",\"ensemble\":\"ensemble\",\"ensemble sweet\":\"ensemble SWEET\",\"caramel box\":\"CARAMEL-BOX\",\"rootnuko\":\"√nuko\",\"c drive\":\"C:drive.\",\"d drive\":\"D:drive.\",\"grand cross\":\"GRAND†CROSS\",\"skyfish\":\"SkyFish\",\"skyfish poco\":\"SkyFish poco\",\"chelseasoft\":\"Chelseasoft\",\"sphere\":\"Sphere\",\"hook\":\"HOOKSOFT\",\"smee\":\"SMEE\",\"asa project\":\"ASa Project\",\"rosebleu\":\"Rosebleu\",\"clochette\":\"Clochette\",\"honey soft\":\"HONEY SOFT\",\"appetite\":\"アパタイト\",\"pakopako soft\":\"ぱこぱこそふと\",\"neko neko soft\":\"猫猫软件\",\"abhar\":\"ABHAR\",\"abhar tronc\":\"ABHAR Tronc\",\"incarose\":\"インカローズ\",\"nutaku\":\"Nutaku\",\"etude\":\"etude\",\"eufonie\":\"eufonie\",\"eushully\":\"Eushully\",\"waffle\":\"Waffle\",\"navel\":\"Navel\",\"tryset\":\"TRYSET\",\"seal-tutu\":\"seal-tutu\",\"softhouse chara\":\"Softhouse Chara\",\"softhouse-seal\":\"softhouse-seal\",\"devil-seal\":\"Devil-seal\",\"softhouse-seal grandee\":\"softhouse-seal GRANDEE\",\"reverse\":\"Re:verse\",\"samoyed smile\":\"SAMOYED SMILE\",\"moonstone\":\"MOONSTONE\",\"moonstone cherry\":\"MOONSTONE Cherry\",\"moonstone honey\":\"MOONSTONE Honey\",\"yuzu soft\":\"柚子社\",\"lump of sugar\":\"Lump of Sugar\",\"quince soft\":\"QUINCE SOFT\",\"aquaplus\":\"AQUAPLUS\",\"leaf\":\"Leaf🍃\",\"key\":\"🔑Key\",\"alcot\":\"ALcot\",\"alcot honey comb\":\"ALcot Honey Comb\",\"august\":\"AUGUST\",\"feng\":\"feng\",\"frontwing\":\"FrontWing\",\"atelier d\":\"Atelier D\",\"atelier kaguya\":\"Atelier KAGUYA\",\"atelier kaguya honky-tonk pumpkin\":\"Atelier KAGUYA Honky-Tonk Pumpkin\",\"atelier kaguya team gassa-q\":\"Atelier KAGUYA TEAM Gassa-Q\",\"atelier kaguya team heartbeat\":\"Atelier KAGUYA TEAM HEARTBEAT\",\"atelier kaguya berkshire yorkshire\":\"Atelier KAGUYA Berkshire Yorkshire\",\"atelier sakura roshutsu yuugi\":\"樱花工作室 露出＊游戏\",\"atelier sakura konmai studio\":\"樱花工作室 こんまいすたじお\",\"atelier sakura darkness\":\"樱花工作室 DARKNESS\",\"atelier sakura team.ntr\":\"樱花工作室 Team.NTR\",\"atelier sakura mount position\":\"樱花工作室 Mount Position\",\"atelier sakura extra\":\"樱花工作室 eXtra\",\"abel software\":\"AbelSoftware\",\"type-moon\":\"🌙TYPE-MOON\",\"nitroplus\":\"Nitro+\",\"5pb\":\"5pb.\",\"aniseed\":\"AniSeed\",\"candysoft\":\"Candy Soft\",\"ricotta\":\"Ricotta\",\"whirlpool\":\"Whirlpool\",\"giga\":\"戏画\",\"milksoft\":\"牛奶软件\",\"cygames\":\"Cygames\",\"keroq\":\"ケロQ\",\"akatsuki works hibiki\":\"hibiki works\",\"fairytale\":\"fairytale\",\"falcom\":\"Falcom\",\"softstar\":\"大宇资讯\",\"dmm.com\":\"DMM.com\",\"kadokawa\":\"KADOKAWA\",\"winged cloud\":\"Winged Cloud\",\"tech gian\":\"TECH GIAN\",\"electromagneticwave\":\"ElectromagneticWave\",\"usotsukiya\":\"嘘つき屋\",\"archetype\":\"ARCHETYPE\",\"afterschool of the 5th year\":\"5年目の放课后\",\"tsf no f\":\"TSF的F\",\"number2\":\"Number2\",\"plant\":\"PLANT\",\"opaque\":\"Opaque\",\"shiroganeya\":\"しろがね屋\",\"horizontal world\":\"Horizontal World\",\"mousou deguchi\":\"妄想出口\",\"venom\":\"VENOM\",\"tsuchinoko kyoukai\":\"ツシノコ協会\",\"sekine\":\"咳寝\",\"ippongui\":\"一本杭\",\"aomidoro\":\"アオミドロ\",\"otukimi koubo\":\"おつきみ工房\",\"monsieur\":\"MonsieuR\",\"orange peels\":\"オレンジピールズ\",\"wata 120 percent\":\"120%棉\",\"watsukiya\":\"わつき屋\",\"sotikoti\":\"ソチコチ\",\"320bpm\":\"320BPM\",\"intoku.info\":\"いんとくいんふぉ\",\"47sp\":\"47sp.\",\"shibayukiya\":\"芝雪屋\",\"news\":\"NEWS\",\"shimajiya\":\"しまじや\",\"canvas garden\":\"CANVAS+GARDEN\",\"mc\":\"MC\",\"animachine\":\"アニマルマシーン\",\"ailail\":\"あいるあいる\",\"moe hime rengou\":\"萌姬连合\",\"digital lover\":\"Digital Lover\",\"mone keshi gum\":\"MONEけしごむ\",\"nama cream biyori\":\"生クリームびより\",\"clesta\":\"クレスタ\",\"onasuga 99-yen\":\"おナスが99円\",\"karomix\":\"KAROMIX\",\"shoot the moon\":\"シュート・ザ・ムーン\",\"kansai gyogyou kyoudou kumiai\":\"关西渔业协同组合\",\"rainwaterserver\":\"RainWaterServer\",\"lily lily rose\":\"Lily Lily Rose\",\"himura nyuugyou\":\"比村乳业\",\"raijinkai\":\"雷神会\",\"miyamaya\":\"深山屋\",\"onna kishi no shiro\":\"女騎士の城\",\"yonsai books\":\"四才ブックス\",\"pastel wing\":\"PASTEL WING\",\"ajisaidenden\":\"アジサイデンデン\",\"attendance number 26\":\"出席番号26\",\"yu-yu-tei\":\"悠々亭\",\"circle ohigetan\":\"サークル尾髭丹\",\"mahou rikigaku\":\"魔法力学\",\"minimum game koubou\":\"ミニマムゲーム工房\",\"santa star festa\":\"Santa☆Festa!\",\"byousatsu tanukidan\":\"秒杀狸团\",\"seven days holiday\":\"セブンデイズホリディ\",\"uchuu bunko\":\"宇宙文库\",\"nakayohi mogudan\":\"なかよひモグダン\",\"suteuka no koya\":\"すてうかの小屋\",\"at ism\":\"@ism\",\"twinbox\":\"TwinBox\",\"ame nochi yuki\":\"あめ のち ゆき\",\"mataro\":\"魔太郎\",\"otonano do-wa\":\"大人の寓話\",\"tsukuru no mori kabushikigaisha\":\"ツクルノモリ株式会社\",\"asanoya\":\"浅野屋\",\"neko works\":\"NEKO WORKs\",\"goshujinsama no omochabako\":\"御主人様の玩具箱\",\"rairaku jinja\":\"磊落神社\",\"mani mania\":\"マニまにあ\",\"kongari tokei\":\"こんがり時計\",\"circle kame\":\"さーくる亀\",\"sugiura-ke\":\"杉浦家\",\"atelier-g\":\"Atelier-G\",\"atelier tiv\":\"Atelier Tiv\",\"atelier lunette\":\"Atelier Lunette\",\"atelier gh\":\"Atelier G/H\",\"atelier botan\":\"あとりえ牡丹\",\"atelier kinta\":\"あとりえKINTA\",\"atelier miyabi\":\"あとりえ雅\",\"atelier knee stroke\":\"あとりえ にーすとろーく\",\"atelier pachira\":\"アトリエパキラ\",\"atelier pinpoint\":\"アトリエ ピン・ポイント\",\"atelier hachifukuan\":\"アトリエ八福庵\",\"atelier gons\":\"アトリエ GONS\",\"atelier maruwa\":\"アトリエ丸和\",\"atelier ms\":\"Atelier Ms\",\"kinokonabe-hinanjo\":\"きのこなべ避難所\",\"s-size\":\"Sサイズ\",\"mugen at works\":\"むげん@WORKS\",\"hyogetsu\":\"冰月\",\"garakuta shoujo\":\"がらくた少女\",\"mosquito man\":\"モスキートマン\",\"metal\":\"METAL\",\"watanabe tou\":\"渡边党\",\"suzuna jct\":\"SUZUNA JCT\",\"amagami dou\":\"あまがみ堂\",\"bitch bokujou\":\"Bitch牧场\",\"antyuumosaku\":\"暗中模索\",\"kurumaya\":\"車ヤ\",\"shiitake en\":\"しいたけ園\",\"makutsutei\":\"魔窟亭\",\"studio pal\":\"STUDIO PAL\",\"frac\":\"FRAC\",\"karaageyasan\":\"からあげ屋さん\",\"meltdown comet\":\"MeltdoWN COmet\",\"karakishi youhei-dan\":\"からきし傭兵団 真雅\",\"blusterlight\":\"BlusterLight\",\"24 page\":\"24ぺーじ\",\"holy water club\":\"ほーりーうぉーたー倶楽部\",\"black currant\":\"ブラックカラント\",\"ankoku soshiki\":\"暗黑组织\",\"sweet heart\":\"Sweet HEART\",\"zenmai kourogi\":\"ぜんまいこうろぎ\",\"tsuki no hikari keikaku\":\"月ノヒカリ計画\",\"aozora\":\"青尾空\",\"shoujo kishidan\":\"少女骑士团\",\"shimoyakedou\":\"しもやけ堂\",\"jun and yuri\":\"Jun&Yuri\",\"haiiro koubou\":\"灰色工房\",\"chocolate latte\":\"ショコラテ\",\"chi-ra-rhyzhm\":\"ちらりずむ\",\"osamuya\":\"オサム屋\",\"sleeve\":\"SLeeVe\",\"paranoia cat\":\"PARANOIA CAT\",\"kobuta no yakata\":\"子豚の館\",\"crazy9\":\"Crazy9\",\"essentia\":\"ESSENTIA\",\"redrop\":\"ReDrop\",\"shirando\":\"炽鸾堂\",\"special star week\":\"Special☆Week\",\"n and r\":\"N&R\",\"8chomeno-ohanayasan\":\"8丁目のお花屋さん\",\"kabu fujisawa minato shinsenkan\":\"㈱藤沢みなと新鮮館\",\"uran-factory\":\"URAN-FACTORY\",\"hiyoko no gekijoh\":\"ひよこの劇場\",\"yakiyama line\":\"YAKIYAMA LINE\",\"gallop dyna\":\"ぎゃろっぷだいな\",\"trick and treat\":\"TRICK&TREAT\",\"shirokumaya\":\"しろくま屋\",\"nanairo no neribukuro\":\"七色のねりぶくろ\",\"ucyunekogundan\":\"宇宙猫军团\",\"mokoke\":\"もこ家\",\"p-kan\":\"p-馆\",\"inst\":\"Inst\",\"plum\":\"PLUM\",\"kaze no gotoku\":\"風のごとく!\",\"haitoku sensei\":\"はいとく先生\",\"angyadow\":\"行脚堂\",\"noraneko-no-tama\":\"ノラネコノタマ\",\"hizadati zekkouchou\":\"ひざだち絶好調\",\"sakananekobeya\":\"鱼猫部屋\",\"white drop\":\"ホワイトドロップ\",\"dieselmine\":\"ディーゼルマイン\",\"ojou no yokushitsu\":\"お嬢の浴室\",\"nagiyamasugi\":\"ナギヤマスギ\",\"awatake\":\"あわたけ\",\"gasobook\":\"GASOBooK!!\",\"shiohama workshop\":\"SHIOHAMA WORKSHOP\",\"irotenya\":\"色点屋\",\"watakubi\":\"わたくび\",\"kirikiri\":\"きりきり\",\"kohagura.\":\"こはぐら。\",\"gambler club\":\"ギャンブラー倶楽部\",\"usagi no oyatsu\":\"ぅさぎのぉゃっ\",\"hakke deneijyo\":\"八卦电影城\",\"kuma aji tounyuu.\":\"くま味豆乳。\",\"tamaranchi\":\"たまらんち\",\"lucky chance\":\"Lucky Chance!\",\"chicken chicken machine\":\"チキチキ☆マシーン\",\"ice coffin\":\"ICE COFFIN\",\"teriyaki nikuman\":\"てりやきにくまん\",\"chijoku an\":\"耻辱庵\",\"otajai\":\"オタじゃい\",\"hades\":\"ハーデス\",\"kurawanya\":\"くろわん屋\",\"54burger\":\"54BURGER\",\"yadokugaeru\":\"ヤドクガエル\",\"butagoya\":\"ぶた小屋\",\"momo ego\":\"ももエゴ\",\"wada mountain\":\"和田マウンテン\",\"area14\":\"エリア14\",\"komorikiri.\":\"こもりきり。\",\"circle eden\":\"Circle Eden\",\"fukutsuu okosu\":\"腹痛起こす\",\"aodouhu\":\"青豆腐\",\"team lucky\":\"チーム☆ラッキー\",\"deep rising\":\"DEEP RISING\",\"past gadget\":\"Past Gadget\",\"gekidoku shoujo\":\"剧毒少女\",\"chinjao girl.\":\"チンジャオ娘。\",\"kawaraya honpo\":\"瓦屋本舗\",\"float shippu\":\"フロート湿布\",\"yusaritsukata\":\"ゆうさりつかた\",\"tamago no kara\":\"タマゴノカラ\",\"drow4\":\"Drow4\",\"deastim\":\"であすちーむ\",\"optworks\":\"OPTWORKS\",\"nikujirushi\":\"にくじるし\",\"great canyon\":\"グレートキャニオン\",\"amp\":\"AMP\",\"peanutsland\":\"ピーナッツランド\",\"black fly\":\"BLACK FLY\",\"acid club\":\"ACID CLUB\",\"syunkan saidaihusoku\":\"瞬间最大风速\",\"sakurairo\":\"さくらいろ\",\"yan-yam\":\"Yan-Yam\",\"zuzuzu\":\"ズズズ\",\"pictokun\":\"Pictokun\",\"yo-metdo\":\"妖灭堂\",\"red crown\":\"RED CROWN\",\"f.a\":\"F・A\",\"reverse noise\":\"Reverse Noise\",\"pink\":\"PINK\",\"lemonmaiden\":\"LemonMaiden\",\"manjudou\":\"曼珠堂\",\"asshuku koubou\":\"压缩工房\",\"moreriikusu\":\"モレリークス\",\"magono-tei\":\"まごの亭\",\"pumpernickel\":\"PUMPERNICKEL\",\"rosetta stone\":\"ろぜったすとーん\",\"pigafetta\":\"ぴがふぇった\",\"f taku\":\"F宅\",\"ezokuroten\":\"エゾクロテン\",\"itou life\":\"伊東ライフ\",\"spiral brain\":\"スパイラルブレーン\",\"tuzi laoda\":\"兔子老大\",\"iriomote\":\"IRIOMOTE\",\"kamogawaya\":\"鸭川屋\",\"23.4do\":\"23.4ド\",\"doza village\":\"DOZA Village\",\"p.d.creations\":\"P.D.creations\",\"tear drop\":\"Tear Drop\",\"434notfound\":\"434 Not Found\",\"hikiwari nattou\":\"ひきわり納豆\",\"hirahira\":\"ひらひら\",\"yasakaninomagatama\":\"八坂琼曲玉\",\"kansen shoujo\":\"甘泉少女\",\"yuzuponz\":\"ゆずぽん酢\",\"hamurabi-dou\":\"いちお屋\",\"wasabi\":\"WASABI\",\"abura batake bokujyo.\":\"あぶら畑牧場。\",\"poetto\":\"POETTO\",\"infinity drive\":\"INFINITY DRIVE\",\"warabimochi\":\"ワラビモチー\",\"fusionz\":\"Fusionz\",\"munchengraph\":\"MünchenGraph\",\"okashi tai\":\"おかし隊\",\"morigotatsu\":\"モリゴタツ\",\"funi funi lab\":\"フニフニラボ\",\"nantara kantara\":\"ナンタラカンタラ\",\"juuryoku shiki youheki\":\"重力式拥壁\",\"cannabis\":\"カンナビス\",\"archives\":\"アーカイブ\",\"notone\":\"NOTONE\",\"small marron\":\"Small Marron\",\"palepink\":\"PalePink!\",\"kokatsubatake\":\"こかつ畑\",\"nise-jyuusyofutei\":\"伪住所不定\",\"rpg company 2\":\"RPGカンパニー2\",\"royal bitch\":\"ろいやるびっち\",\"einsatz\":\"Einsatz\",\"majimeya\":\"真面目屋\",\"almarosso\":\"アルマロッソ\",\"jitaku vacation\":\"自宅vacation\",\"avalanche\":\"あばらんち\",\"suzu no oka\":\"鈴の丘\",\"gegera standard\":\"GEGERA STANDARD\",\"studio mizuyokan\":\"スタジオみずよーかん\",\"a ashgrey mix\":\"A AshGrey Mix\",\"m.o seisakujo\":\"M.O制作所\",\"orange bullet\":\"ORANGE BULLET\",\"circle taihei-tengoku\":\"サーカル太平天国\",\"kankituteien\":\"柑橘庭园\",\"orukaniumu haigou a-jou\":\"おるかにうむ配合A錠\",\"star-dreamer tei\":\"星梦亭\",\"hexivision\":\"HEXIVISION\",\"naruho-dou\":\"NARUHO堂\",\"index410\":\"INDEX:410\",\"mzfist\":\"MZの拳\",\"twilight dusk\":\"TWILIGHT DUSK\",\"kamikadou\":\"かみか堂\",\"oboro and tempo gensui dou\":\"胧&天蓬元帅堂\",\"kanden shoujo chuuihou\":\"感电少女注意报\",\"niku ringo\":\"肉りんご\",\"wareme\":\"割れ目\",\"hakuginmokusei\":\"白銀木犀\",\"meshikutteneru.\":\"飯食って寝る。\",\"little hamlet\":\"りとる☆はむれっと\",\"tarehamu\":\"たれハム\",\"black dog\":\"BLACK DOG\",\"shimesaba\":\"しめさば\",\"forestrest\":\"ForestRest\",\"norioikeru\":\"のりおいける!\",\"himawari no tane\":\"ひまわりのたね\",\"jieitai\":\"JIEITAI\",\"honey qp\":\"Honey QP\",\"ayuest\":\"AYUEST\",\"inbou no teikoku\":\"阴谋的帝国\",\"gate of xiii\":\"Gate of XIII\",\"neko masshigura\":\"ねこまっしぐら\",\"rorie-do\":\"ろり絵堂\",\"inumiso\":\"イヌミソ\",\"natsutama\":\"なつたま\",\"wakuwaku doubutsuen\":\"わくわく動物園\",\"shikishima guntool\":\"敷岛赝具\",\"kaname\":\"要\",\"studio vanguard\":\"STUDIO VANGUARD\",\"gerupin\":\"ゲルピン\",\"knockout\":\"KNOCKOUT\",\"atamanurui mix-er\":\"アタマヌルイMIX-eR\",\"mecchori\":\"めっちょり\",\"titokara 2nd branch\":\"千岁乌山第2出张所\",\"fakestar\":\"FAKESTAR\",\"nikomi omurice\":\"煮込みオムライス\",\"inaka no yasaiya\":\"田舎の野菜屋\",\"nacchuushou\":\"夏中症\",\"applesauce\":\"Applesauce\",\"aquadrop\":\"アクアドロップ\",\"ttt\":\"TTT\",\"abyukyo koubou\":\"あびゅうきょ工房\",\"asatsuki dou\":\"朝月堂\",\"serizawa-room\":\"芹泽室\",\"suzuya\":\"凉屋\",\"cradle\":\"Cradle\",\"puffsleeve\":\"Puffsleeve\",\"nitro\":\"NITRO\",\"girls empire\":\"娘。帝國\",\"ameshoo\":\"あめしょー\",\"yumesaki annai kairanban\":\"夢先案内回覧版\",\"aihara hanten\":\"相原饭店\",\"full high kick\":\"ふるはいきっく\",\"punipuni doumei\":\"ぷにぷに同盟\",\"sokomono suisou\":\"底物水槽\",\"shiratamaco\":\"しらたまこ\",\"oreteki18kin\":\"俺的十八禁\",\"dl mate\":\"DLメイト\",\"kaminagi-tei\":\"神凪邸\",\"execio\":\"エクセシオ\",\"seza team\":\"せざちーむ\",\"shihachirou\":\"四八楼\",\"maccha aji\":\"抹茶味\",\"wireframe\":\"WIREFRAME\",\"maho-shinsengumi\":\"魔法新撰组\",\"caramel crunch\":\"CARAMEL CRUNCH!\",\"ncp\":\"NCP\",\"choujikuu yousai kachuusha\":\"超時空要塞カチューシャ\",\"nanmin festival\":\"難民ふぇすてぃばる\",\"ririo gatto\":\"りーりおがーと\",\"activemover\":\"ActiveMover\",\"mizuchirimen\":\"ミズチリメン\",\"happy water\":\"HAPPY WATER\",\"naragyogyo kumiai\":\"なら漁業組合\",\"shichiten battou\":\"七天罚讨\",\"drop dead\":\"DROP DEAD!!\",\"erect touch\":\"ERECT TOUCH\",\"melanchol\":\"メランコル\",\"meisho hanten\":\"めーしょー飯店\",\"rushe museum\":\"Rushe Museum\",\"ame usagi\":\"あめうさぎ\",\"sottilo nero\":\"ソッティーロネーロ\",\"hollowplus\":\"HOLLOWPLUS\",\"iminic\":\"IMINIC\",\"oshaban\":\"オシャバン\",\"diogenes club\":\"ディオゲネスクラブ\",\"puchi village\":\"ぷち★びれっじ\",\"mirrorworld\":\"MirrorWorld\",\"kenkokotsu\":\"KENKOKOTSU\",\"hakujira uminekodan\":\"はくじら海猫団\",\"missing paradise\":\"ミッシングパラダイス\",\"try and hougen futari shakai\":\"TRY&方言二人社会\",\"mute cafe\":\"MUTE Cafe\",\"taishou romanesque\":\"大正ロマネスク\",\"gangontou\":\"巌魂薹\",\"kaokuba\":\"家屋場\",\"yukikagerou\":\"雪陽炎\",\"akumenari\":\"アクメナリ!\",\"hot mikan\":\"ほっとみかん\",\"g-panda\":\"Gぱんだ\",\"high tech pen case\":\"ハイテクペンケース\",\"strawberry milk studio\":\"Strawberry Milk Studio\",\"lolita crusaders\":\"ロリータクルセイダーズ\",\"buaifamu\":\"ぶあいふぁむ\",\"takenoko gohan\":\"筍御饭\",\"shinenkan\":\"新炎馆\",\"studio himawari\":\"スタジオ☆ひまわり\",\"tohgoo\":\"冬宫\",\"makino jimusho\":\"マキノ事務所\",\"turtle.fish.paint\":\"龟鱼派\",\"bear hand\":\"熊掌社\",\"star f\":\"★F\",\"service heaven\":\"サービスヘブン\",\"spiritoso\":\"Spiritoso\",\"kurobinega\":\"クロビネガ\",\"nokishita no nekoya\":\"軒下の猫屋\",\"denmoe\":\"电萌\",\"mocomocodo\":\"もこモコ堂\",\"werk\":\"Werk\",\"nicutoka tabete mitanainaa\":\"肉とか食べてみたいなぁ・・・\",\"gamushara\":\"我武者ら!\",\"sandan\":\"SANDAN\",\"newton no ringo\":\"ニュートンの林檎\",\"kinako no yama\":\"きなこの山\",\"hanamo oukoku\":\"はなも王国\",\"gokiburi teishoku\":\"ゴキブリ定食\",\"yumeyoubi\":\"ゆめようび\",\"studio ren\":\"STUDIO REN\",\"koterabyte\":\"コテラバイト\",\"shiroi kuroi\":\"シロイクロイ\",\"maidoll\":\"MAIDOLL\",\"chromatic room\":\"CHROMATIC ROOM\",\"piyokorota\":\"ぴよころた\",\"d-raw 2\":\"Draw Two\",\"konnyaku nabe\":\"蒟蒻锅\",\"onkin yuugi\":\"音筋游戏\",\"radiostar\":\"RADIOSTAR\",\"jackpot 64\":\"ジャックポット64\",\"panzers\":\"パンツァーズ\",\"kanten jigenryuu\":\"寒天示現流\",\"nazunaya honpo\":\"荠屋本铺\",\"usubeniya\":\"うすべに屋\",\"akusei-shinseibutsu\":\"恶性真性物\",\"night fuckers\":\"夜★FUCKERS\",\"puppukupu\":\"ぷっぷくぷー\",\"sago-jou\":\"沙悟荘\",\"hi-per pinch\":\"ハイパーピンチ\",\"reis room\":\"REI's ROOM\",\"hasemi box\":\"Hasemi box\",\"kaki no tane\":\"夏季のタネ\",\"aruku denpatou no kai\":\"歩く電波塔の会\",\"lolitachannel\":\"LolitaChannel\",\"asakaze no shizuku\":\"朝風の雫\",\"youki m.k.c.\":\"优希M.K.C.\",\"poco natsu\":\"ぽこなつ\",\"hoppe shokudou\":\"ほっぺ食堂\",\"hinemosuan\":\"终日庵\",\"moon ruler\":\"むうんるうらあ\",\"shin hijiridou honpo\":\"真・圣堂☆本铺\",\"toyatei\":\"とやてい\",\"otona shuppan\":\"おとな出版\",\"atsuya kougyou\":\"笃屋工业\",\"bonjin\":\"梵人\",\"mimipull\":\"MIMIPULL\",\"rojiura manhole\":\"ロジウラマンホール\",\"uribatakebokujou\":\"うり畑牧場\",\"zenra yashiki\":\"全裸屋敷\",\"beniiro kaitenkikou\":\"红色回转机构\",\"gff\":\"GFF\",\"waffle doumeiken\":\"ワッフル同盟犬\",\"raid slash\":\"RAID SLASH\",\"colomonyu\":\"ころもにゅ\",\"umidori\":\"うみどり\",\"l-gauge sha\":\"Lゲージ社\",\"kodomo ginkou\":\"こどもぎんこう\",\"kowareta radio\":\"コワレ田ラジ男\",\"hatakewotagayasudake\":\"畑を耕すだけ\",\"kuro no omikuji\":\"黒ノ御神籤\",\"hakuchou no ouji\":\"白鳥の王子\",\"kinokotei\":\"きのこ亭\",\"kinokodomo\":\"きのこども\",\"kohakutei\":\"琥珀亭\",\"izanagi\":\"いざなぎ\",\"inuteikoku\":\"犬帝国\",\"yamamoto\":\"山本同人\",\"private garden\":\"Private Garden\",\"gs studio\":\"G's studio\",\"axz\":\"AXZ\",\"chagashi saiban\":\"茶菓子裁判\",\"chesha neko no yakata\":\"チェシャ猫の館\",\"shokuan\":\"触安\",\"aomizuan\":\"青水庵\",\"royal mountain\":\"ロイヤルマウンテン\",\"radical dream\":\"Radical Dream\",\"hellabunna\":\"へらぶな\",\"zakkin kougyou\":\"杂菌工业\",\"metaneko\":\"メタネコ\",\"midsummer madness\":\"MIDSUMMER MADNESS\",\"ebibinbintei\":\"えびびんびん亭\",\"katamari-ya\":\"かたまり屋\",\"amenosorashido\":\"あめのそらしど\",\"o-mars\":\"O-Mars\",\"moonphase\":\"MoonPhase\",\"open book\":\"OPEN BOOK\",\"kodomo beer\":\"こどもびーる\",\"dramatic sharp\":\"Dramatic#\",\"rtd\":\"RTD\",\"hacchake yarou a team\":\"はっちゃけ野郎Aチーム\",\"dieppe factory darkside\":\"DIEPPE FACTORY Darkside\",\"booblian\":\"Booblian\",\"korokoro udon\":\"コロコロうどん\",\"ende der welt\":\"Ende der Welt\",\"aeba no mori\":\"喘葉の森\",\"hakka ame\":\"薄荷饴\",\"kinengusa\":\"禁烟草\",\"shinkai kissa\":\"深海喫茶\",\"megane shoujo\":\"メガネ少女\",\"extended part\":\"拡張パーツ\",\"you you you\":\"YOU!YOU!YOU!\",\"yuubin basha\":\"邮便马车\",\"m.macabre\":\"M.MACABRE\",\"ohkura bekkan\":\"大藏别馆\",\"the dungeon in yarn\":\"The Dungeon In Yarn\",\"white datura\":\"White Datura\",\"hanekaze\":\"HANEKAZE\",\"stardust cradle\":\"すたーだすとくれいどる\",\"unagiyasan\":\"うなぎやさん\",\"hana zakuro\":\"花柘榴\",\"smith koumuten\":\"スミス工務店\",\"tiny feather\":\"Tiny Feather\",\"low thrust\":\"ロウスラスト\",\"yashiya\":\"やし屋\",\"enhance heart\":\"EnHANCE HEART\",\"slice slime\":\"slice slime\",\"fountains square\":\"Fountain's Square\",\"kodoku intelligence\":\"孤独intelligence\",\"comet\":\"かみっと\",\"bicolor\":\"Bicolor\",\"deans pro office\":\"帝恩PRO事务所\",\"mizutaniya\":\"水谷屋\",\"arysuivery\":\"ありぃすいべりぃ\",\"nekojarasare\":\"猫じゃらされ\",\"puchiota rakugaki\":\"ぷちオタ落描き\",\"activa\":\"ACTIVA\",\"atsuatsu muchimuchi\":\"アツアツムチムチ\",\"kuro lili no heya\":\"黒りりの部屋\",\"rip at lip\":\"Rip@Lip\",\"marinesapphire\":\"海苍玉\",\"liche\":\"Liche\",\"seven deadly sins\":\"Seven deadly sins\",\"mikan dou\":\"みかん堂\",\"kotonosha\":\"琴乃舎\",\"yume-zakura\":\"ゆめざくら\",\"micro house\":\"みくろハウス\",\"rapidrabbit\":\"RapidRabbit\",\"melt soft\":\"めるとソフト\",\"asahiage\":\"あさひあげ\",\"muchakai\":\"梦茶会\",\"gechunchi\":\"ゲッチュんち\",\"seventh heaven maxion\":\"セブンスヘブンMAXION\",\"caramel macchiato\":\"Caramel Macchiato\",\"dokudoku meron\":\"どくどくめろん\",\"buwu 26 celsius\":\"部屋26℃\",\"htsk\":\"HTSK\",\"eucalyptus house\":\"ユーカリハウス\",\"akiba maou\":\"秋叶魔王\",\"nagiya honpo\":\"なぎや本舗\",\"lu yan suo\":\"炉研所\",\"nippon h manga kyoukai\":\"日本H漫画协会\",\"urakata honpo\":\"里方本铺\",\"ando six gates\":\"Ando Six Gates\",\"tamagou\":\"多摩豪\",\"haruharutei\":\"春叶流亭\",\"nizyuugokuhiya\":\"二十极秘屋\",\"pokachutei\":\"ぽかちゅ亭\",\"w.label\":\"W.label\",\"mutekei-fire\":\"むてけいファイヤー\",\"qp flapper\":\"QP:flapper\",\"momo no tsubomi\":\"モモのつぼみ\",\"zenra restaurant\":\"全裸レストラン\",\"kabushikigaisha toranoana\":\"株式会社虎の穴\",\"lezmoe\":\"レズ萌え!\",\"yuriru-rarika\":\"ユリルラリカ\",\"kuroquis\":\"クロッキー!!\",\"tmzf no circle\":\"TMZFのサークル\",\"miniature magic\":\"みにちゅあまじっく\",\"tinker bell\":\"てぃんかーべる(白夜茶会)\",\"just-k\":\"JUST-K\",\"justice-flame\":\"JUSTICE-FLAME\",\"yakumi benishouga\":\"药味红生姜\",\"nekonokone\":\"ねこのこね\",\"hiroshikidou\":\"宏式堂\",\"shiftalton\":\"ShiftAltOn\",\"masamune kokichi\":\"マサムネコキチ\",\"redlight\":\"REDLIGHT\",\"komachiya\":\"小町屋\",\"cu-little2\":\"Cu-little2\",\"furaipan daimaou\":\"ふらいぱん大魔王\",\"wicked heart\":\"WICKED HEART\",\"peach candy\":\"Peach Candy\",\"live house\":\"LIVE HOUSE\",\"sujoyu and co.\":\"酢醤油&Co.\",\"dksha\":\"DKsha\",\"re barna\":\"re:barna\",\"furanokumarin\":\"ふらのくまりん\",\"rm-rf-\":\"RM-RF-*\",\"yakumi sarai\":\"薬味さらい\",\"assemblink\":\"アセンブリンク\",\"yorando\":\"洋兰堂\",\"fdsp\":\"FDSP\",\"nyankone\":\"にゃんこね\",\"handsome aniki\":\"ハンサム兄貴\",\"grenade\":\"ぐれねーど\",\"vivid thunder\":\"びびっどサンダー\",\"ryu-seki-do\":\"流石堂\",\"hiyotama goten\":\"ひよたま御殿\",\"seqmed\":\"SEQMED\",\"ichinichi sanjou\":\"一日三锭\",\"kesshoku mikan\":\"血色蜜柑\",\"kakkuu mogura\":\"滑空モグラ\",\"ties\":\"TIES\",\"public bath\":\"Public bath\",\"nagai hamu\":\"長井ハム\",\"maltese\":\"まるちぃず\",\"goromenz\":\"ゴロメンツ\",\"stemun\":\"すてむん\",\"rosapersica\":\"Rosapersica\",\"kudoki dancer\":\"くどきダンサー\",\"athome shuka\":\"アットホーム酒家\",\"111 touban\":\"111当番\",\"iro wa nioe do\":\"色は匂えど\",\"joudan janai yo\":\"冗談じゃないよっっ!\",\"poyopacho\":\"ぽよぱちょ\",\"guilty hearts\":\"GUILTY HEARTS\",\"ortensia\":\"おるてんしあ\",\"expot\":\"EXPOT\",\"shouchuu mac\":\"烧酎MAC\",\"golden zombie\":\"金珠狼\",\"melty pot\":\"Melty Pot\",\"airbox\":\"AIR BOX\",\"suwateria\":\"すわてりあ\",\"ichigosize\":\"いちごさいず\",\"bakutaso switch\":\"爆タソスイッチ\",\"miyuuhodoh\":\"美游穗堂\",\"7cm\":\"7センチ\",\"nisemididoronokai\":\"偽MIDI泥の会\",\"veronica no ha\":\"ヴェロニカの歯\",\"jet-black baselarde\":\"漆黒のバゼラード\",\"juicebox koujou\":\"ジュースボックス工場\",\"yukinohana\":\"ユキノハナ\",\"sa ku\":\"sa_ku\",\"rurunoya\":\"るるノ屋\",\"all delete\":\"ALL DELETE\",\"sigma-arts\":\"Σ-Arts\",\"fanatic fetish\":\"Fanatic Fetish\",\"count2.4\":\"Count2.4\",\"lily\":\"Lily\",\"studio empty\":\"Studio Empty\",\"fuurainin\":\"风来人\",\"dasshifunnyuu\":\"脱脂粉乳\",\"hidamari hwy\":\"ひだまりHWY\",\"insert\":\"INSERT\",\"mbl\":\"MBL\",\"french letter\":\"French letter\",\"sweettaboo\":\"SWEETTABOO\",\"mikezoutei\":\"三毛藏亭\",\"kochou no yume\":\"胡蝶夢\",\"hanekura ginma\":\"羽倉ぎんま\",\"suzunone strike\":\"スズノネストライク\",\"bloody okojo\":\"Bloody Okojo\",\"sunset beach\":\"サンセットビーチ\",\"alicecreation\":\"AliceCreation\",\"shirokurousa\":\"しろくろうさ\",\"rehabilitation\":\"リハビリテーション\",\"fools art gallery\":\"FOOL's ART GALLERY\",\"galaxist\":\"GALAXIST\",\"setoran\":\"せとらん\",\"global one\":\"グローバルワン\",\"sagittarius\":\"サジタリアス\",\"rolling star\":\"ローリングスター\",\"milk pudding\":\"MILK PUDDING\",\"circle are\":\"サークルARE\",\"kazan no you\":\"火山の楊\",\"hard chrome\":\"ハードクローム\",\"pochi-goya.\":\"ぽち小屋。\",\"hikawado\":\"火川堂\",\"mof-mof\":\"mof-mof\",\"aneko no techo\":\"あねこの手帖\",\"circle heron\":\"サークルヘロン\",\"youkai tamanokoshi\":\"ようかい玉の輿\",\"waffle sand\":\"わっふるさんど\",\"monotrust\":\"モノトラスト\",\"fuwamoko honpo\":\"ふわもこ本舗\",\"i-raf-you\":\"I-Raf-you\",\"urahyakkiyakou\":\"里百鬼夜行\",\"boundary of dream\":\"夢の境界\",\"innocent chapel\":\"INNOCENT CHAPEL\",\"studio fow\":\"Studio-FOW\",\"happouvijin\":\"八方微人\",\"squeeze\":\"SQUEEZE!!\",\"squeeze candy heaven\":\"squeezecandyheaven\",\"polinky hiroba\":\"ポリンキー広場\",\"v-slash\":\"V-SLASH\",\"tanima club\":\"谷间俱乐部\",\"paper hearts\":\"PAPER HEARTS\",\"gekikara koushinryou\":\"激辛香辛料\",\"pha-la-dogs\":\"ぱらどっくす。\",\"yojouhan shobou\":\"四叠半书房\",\"maron maron\":\"まろん☆まろん\",\"yukijirushi nyuugyou\":\"逝印乳业\",\"suimitsutou koubou\":\"水密桃工房\",\"netekuras\":\"ネテクラス\",\"hachimitsu syoujo\":\"蜂蜜少女\",\"miyako dokei\":\"みやこ時計\",\"air pocket\":\"Air Pocket\",\"teitetsu kishidan\":\"蹄铁骑士团\",\"yowamidori\":\"よわみどり\",\"koi tenshi doumei\":\"恋☆天使同盟\",\"ayamaji nuji\":\"誤じ脱ぢ\",\"p.d chump\":\"P.D Chump\",\"naya\":\"纳屋\",\"depression\":\"でぱれーしょん\",\"yanasegawabeya\":\"柳瀬川部屋\",\"ponkotsu works\":\"ぽんこつわーくす\",\"amezaiku\":\"雨细工\",\"niboshi\":\"煮干\",\"niboniboshi\":\"にぼ煮干\",\"daisuki beachkun\":\"大好き!!ビーチクン\",\"mirake\":\"MiraKE\",\"yodakapan\":\"ヨダカパン\",\"mimoneland\":\"ミモネランド\",\"doronko yuuyake\":\"どろんこ夕焼\",\"panic room\":\"パニックルーム!\",\"studio aruta\":\"スタジオあるた\",\"haruharudo\":\"はるはる堂\",\"tamanokoshi\":\"たまのこし\",\"minamihamaya\":\"南浜屋\",\"lolipop complete\":\"ロリポップ コンプリート\",\"studio wallaby\":\"スタジオ・ワラビー\",\"castlism\":\"Castlism\",\"mtsp\":\"MTSP\",\"bijutsubu\":\"美术部\",\"yowatari kouba\":\"よわたり工場\",\"staccato squirrel\":\"Staccato・Squirrel\",\"sakuradou\":\"樱堂\",\"candy club\":\"Candy Club\",\"apple amza\":\"APPLE Amza\",\"rorinoutage\":\"ロリの宴\",\"comex\":\"COMEX\",\"marimo-ya\":\"まりも屋\",\"moonglow\":\"MoonGlow\",\"aikanheiwa.\":\"愛館平和。\",\"yokoshimaya\":\"邪屋。\",\"seiryoukei inryousui\":\"清涼系飲料水\",\"mugenkidou a\":\"无限轨道A\",\"penetrate\":\"Penetrate\",\"astral\":\"Astral\",\"choki no kamisama\":\"チョキの神さま\",\"wanwandoh\":\"わんわん堂\",\"f slash t\":\"F/T\",\"kenja time\":\"けんじゃたいむ\",\"turuvege.\":\"つるべじ。\",\"seven colors drop\":\"なないろどろっぷ\",\"foundation slash 1\":\"Foundation／1\",\"happy birthday\":\"Happy Birthday\",\"initial-g\":\"イニシャルG\",\"j.o.n.g.\":\"ジョング\",\"hitomishiri\":\"ひとみしり\",\"mieow\":\"Mieow\",\"kariya\":\"刈屋\",\"kichiku koubou\":\"鬼畜工房\",\"zettai shoujo\":\"绝对少女\",\"circle roman hikou\":\"サークル浪漫飛行\",\"asstaro-san\":\"アスタローサン\",\"kurowasabi\":\"くろわさび\",\"kabayakiya\":\"蒲烧屋\",\"datenshi no ana\":\"墮天使の坑\",\"mix fry\":\"みっくすふらい\",\"kokonokaya\":\"九日屋\",\"orangemaru\":\"OrangeMaru\",\"ishikawa pro\":\"石川プロ\",\"neyukidou\":\"根雪堂\",\"o.n art works\":\"O.N Art Works\",\"an-arc\":\"アンアーク\",\"anmichu dou\":\"あんみちゅ堂\",\"melodeathweep\":\"めろですうぃーぷ\",\"absolute\":\"Absolute\",\"mizone doubutsuen\":\"みぞね動物園\",\"studio honeyblade\":\"STUDIO HONEYBLADE\",\"furukadou\":\"古ヶ堂\",\"dam koubou\":\"だむ工房\",\"heart of green\":\"はーとおぶぐりーん\",\"dogyear\":\"DOGYEAR\",\"kagiyama baking co ltd\":\"鍵山製パン株式会社\",\"shittoden\":\"嫉妬殿\",\"sea-s\":\"SEA-S\",\"stray hermit\":\"ストレイハーミット\",\"fox grave\":\"FOX GRAVE\",\"muoto lab\":\"むおとラボ\",\"momoiro kageboushi\":\"桜色影法師\",\"sennen teikoku\":\"千年帝国\",\"tataraba\":\"たたらば\",\"koniro club\":\"紺色くらぶ\",\"west one\":\"WEST ONE\",\"kotsu\":\"KOTSU\",\"suzume nest\":\"すずめねすと\",\"slash\":\"SLASH\",\"yukimi biyori\":\"雪见日和\",\"hinata to keidai to ennichi\":\"ひなたと境内と縁日\",\"matsuri gensou\":\"祭り幻想\",\"homuraya\":\"ほむら屋★プレアデス\",\"heavy bunny addiction\":\"H.B.A\",\"mata ashita.\":\"また明日。\",\"muses garden\":\"MUSES GARDEN\",\"nekomataya\":\"猫又屋\",\"oving\":\"OVing\",\"ditama kikaku\":\"ぢたま企画\",\"crespirit\":\"CreSpirit\",\"modae tei\":\"闷亭\",\"oyama dennou giken\":\"小山电脑技研\",\"lux soft\":\"ルクスソフト\",\"gunsryu\":\"GUNsRYU\",\"happy core\":\"HAPPY CORE\",\"dai-kotetsu dan\":\"ダイコテツ団\",\"tora machine\":\"虎マシーン\",\"z.a.p.\":\"Z.A.P.\",\"aozora shoujo\":\"青空少女\",\"morimi-ya\":\"森见屋\",\"upa24\":\"UPA24\",\"twilight road\":\"Twilight Road\",\"nine four air\":\"Nine Four Air\",\"yogurt prince\":\"ヨーグルトプリンス\",\"ukkaridou\":\"うっかり堂\",\"sawwei005\":\"Sawwei005\",\"fujiya honten\":\"藤屋本店\",\"nijigen shoujo\":\"虹元少女\",\"muskel bild\":\"Muskel☆Bild\",\"takebouzu\":\"竹坊主\",\"egyptsobaya\":\"エジプトそば屋\",\"dm-fc\":\"DM-FC\",\"awareness\":\"Awareness\",\"peromex\":\"ぺろめっくす\",\"jouji mujoh\":\"常时无常\",\"shinjugai\":\"真珠贝\",\"sui-sui-laboratory\":\"萃酔研究所\",\"ashita ganbaru.\":\"明日がんばる。\",\"kidoya\":\"きどや\",\"chimichanga\":\"ちみチャンガ\",\"fukinshin\":\"布巾心\",\"cleari tei\":\"くれり亭\",\"ash wing\":\"Ash Wing\",\"kousyoudou\":\"咬伤堂\",\"leimkissa\":\"LeimkissA\",\"paschara-mode\":\"ぱっきゃらもーど\",\"e61 geinou pro\":\"E61芸能プロ\",\"nijiiro zakura\":\"にじいろ桜\",\"tri-moon\":\"TRI-MOON!\",\"algolagnia\":\"アルゴラグニア\",\"arestica\":\"ARESTICA\",\"hapoi-dokoro\":\"はぽい処\",\"route1\":\"ROUTE1\",\"chural-an\":\"ちゅらる庵\",\"monaka udon\":\"もなかうどん\",\"kingyo origin\":\"金魚オリジン\",\"yudokuya\":\"友毒屋\",\"sandworks\":\"SANDWORKS\",\"sorairokibun\":\"空色気分\",\"stella\":\"Stella\",\"yuunagi gaibutai\":\"夕凪外部隊\",\"lionoil\":\"らいおんおいる\",\"arekusa thunder\":\"アレクササンダー\",\"seaside\":\"SEA SIDE\",\"sakyuya\":\"砂丘屋\",\"ph-bu\":\"PH部\",\"kyurettokyuretto\":\"^^\",\"panda cotta\":\"Panda Cotta\",\"tsujimo ga machi ni yattekita\":\"つじもが町に殺ってきた!!!\",\"bindume syojo.\":\"瓶诘少女。\",\"pinsize inc.\":\"PINSIZE Inc.\",\"hakka-ya\":\"薄荷屋\",\"akai shougeki\":\"緋い笑撃\",\"goma saba\":\"ごまさば\",\"binkan de nani ga warui\":\"びんかんでなにがわるい\",\"minagi zakura\":\"みなぎざくら\",\"root 12-hedron\":\"ルート十二面体\",\"gunjyou zensen\":\"群青前线\",\"yanagiba dai\":\"柳叶台\",\"wasanbon\":\"わさんぼん\",\"pk gristle\":\"PKグリッスル\",\"rintoneko\":\"りんとねこ\",\"seiitsukyou\":\"性一教\",\"canvas\":\"カンバス\",\"weee\":\"Weee\",\"ichigo pants\":\"いちごぱんつ\",\"uramonoya\":\"うらもの屋\",\"yukinkousagi\":\"ゆきんこうさぎ\",\"swat\":\"SwaT\",\"sandai yokkyuu\":\"さんだいよっきゅう\",\"ameya.\":\"饴屋。\",\"yumemiru shiro\":\"ゆめみる白\",\"peach garden\":\"桃【Peach Garden】园\",\"rubi-sama wo agameru kai\":\"るび様を崇める会\",\"akikaze asparagus\":\"秋風アスパラガス\",\"ranpakudou\":\"卵白堂\",\"decoppachi\":\"DECOッパチ\",\"z-vector\":\"Z-VECTOR\",\"himeshibori\":\"ヒメシボリ\",\"milkybox\":\"MilkyBox\",\"sushipuri\":\"スシプリ\",\"ruman-dou\":\"るまん堂\",\"kaientai\":\"絵援隊\",\"atugi de 5\":\"厚木で5時\",\"sol-fa-soft\":\"sol-fa-soft\",\"right away\":\"Right away\",\"pianiishimo\":\"ピアニッシモ\",\"ijimaya\":\"イジマヤ\",\"inariya\":\"稻荷屋\",\"triple head\":\"とりぷるへっど\",\"tamaya\":\"珠屋\",\"nigatsu umare\":\"二月生まれ\",\"ninja yashiki\":\"忍者屋敷\",\"nekoshin\":\"NEKOSHIN\",\"momo9\":\"ももきゅー\",\"hidebou house\":\"ヒデボウハウス\",\"kawazoko\":\"KAWAZOKO\",\"sexual khorosho\":\"セクシャルハラショー\",\"urayoroduya\":\"里万屋\",\"lost rarities\":\"LOST RARITIES\",\"gesshoku\":\"月蚀\",\"misuterutein\":\"みすてるていん\",\"namacyoko\":\"生チョコ\",\"payanikov\":\"ぱやニコフ\",\"3dt\":\"3DT\",\"extreme ponkotsu\":\"エクストリームポンコツ\",\"gorilla bouzu\":\"ゴリラ坊主\",\"mutant\":\"Mutant\",\"junginboshi\":\"纯银星\",\"h2o aquarium\":\"H2O Aquarium\",\"kurousagi project\":\"黒兎プロジェクト\",\"kekemotsu\":\"ケケモツ\",\"yom shoten\":\"よむ書店\",\"tsukemayuge\":\"つけまゆげ\",\"omochi\":\"おもち\",\"horsetail\":\"ほーすている\",\"nukesaku\":\"拔作\",\"ichi-kan\":\"いちかん。\",\"karashi mentaiko\":\"からしめんたい子\",\"nextpreview\":\"NextPreview\",\"saga planets\":\"Saga Planets\",\"banana koubou\":\"ばな奈工房\",\"mujitan\":\"むじたん\",\"aka no hana\":\"赤のハナ\",\"caustica\":\"コースティカ\",\"denen shoujo\":\"田园少女\",\"dressing plus party\":\"Dressing+Party\",\"butakoma 300g\":\"ぶたコマ300g\",\"white lily\":\"White Lily\",\"oeuvre bijutsukan\":\"ウーブル美術館\",\"kyoumen aquarium\":\"鏡面アクアリウム\",\"mamemaru shoten\":\"豆丸书店\",\"joibo no juunin\":\"ジョイボの住人\",\"metagraft\":\"MetaGraft\",\"festa.\":\"ふぇすた。\",\"slash yen\":\"/￥\",\"pastas estab\":\"PASTA'S ESTAB\",\"rinjuu circus\":\"临终马戏团\",\"ue ni aru mikan\":\"うえにあるみかん\",\"ruu kikaku\":\"龙企画\",\"hoshizora sutekki\":\"星空ステッキ\",\"come through\":\"Come Through\",\"wancho-ke\":\"わんちょ家\",\"kajishima onsen\":\"梶岛温泉\",\"kuroneko-kan\":\"クロネコ缶\",\"cook milk\":\"くっくみるく\",\"kudamono monogatari\":\"果物物语\",\"romance no neko ookami musume\":\"ろまんすの猫狼娘\",\"nanairo otogizoushi\":\"七色御伽草子\",\"buruman\":\"BURUMAN\",\"nyaito senyou\":\"にゃいと専用\",\"pinata party\":\"ぴにゃたぱ～てぃ\",\"hatena-box\":\"HATENA-BOX\",\"black smile\":\"BLACK SMILE\",\"ph\":\"PH\",\"aane\":\"あーね\",\"tsuki no uragawa\":\"ツキノウラガワ\",\"manekineko\":\"まねきねこ\",\"mayoriyo\":\"MayoRiyo\",\"moe shoujo ryouiki\":\"萌少女领域\",\"sakakiya\":\"榊屋\",\"unstoppable plus\":\"Unstoppable+\",\"the nation of head scissors\":\"The Nation of Head Scissors\",\"airy socks\":\"エアリーソックス\",\"sheepfold\":\"羊小屋\",\"aroma gaeru\":\"あろまガエル\",\"arion canvas\":\"Arion Canvas\",\"a color summoner\":\"アカラサマナ\",\"marimo\":\"MARIMO\",\"alem-gakan\":\"アレム画館\",\"re.lay\":\"莉零\",\"milk force\":\"ミルクフォース\",\"kuureishiki zunou\":\"空冷式头脑\",\"matsurija\":\"祭社\",\"asgo\":\"ASGO\",\"yobigakka\":\"预备学科\",\"locker room\":\"LockerRoom\",\"pettan doujou\":\"ペッタン道場\",\"art book chipika\":\"Art Book Chipika\",\"alemateorema\":\"アレマテオレマ\",\"otokojuku\":\"おとこじゅく\",\"kitsune-goya\":\"きつね小屋\",\"kuroni\":\"クロニ\",\"seventh engine\":\"せぶんすえんじん\",\"n-cyak-m-mu-\":\"んーちゃかむーむー\",\"purple salamander\":\"パープルサラマンダー\",\"yume yori suteki na\":\"夢よりすてきな\",\"alice no takarabako\":\"ありすの宝箱\",\"akumu no takuhaibin\":\"Nightmare Express-悪夢の宅配便-\",\"san se fang\":\"三色坊\",\"uninigumi\":\"うにに組\",\"otomekibun\":\"乙女気分\",\"gasshuukoku netamekoru\":\"合众国ネタメコル\",\"shallot coco\":\"シャルロット・ココ\",\"orange restaurant\":\"オレンジレストラン\",\"astro creep\":\"ASTRO CREEP\",\"gin no hoshitei\":\"銀の星亭\",\"yorokobi no kuni\":\"ヨロコビの国\",\"babel\":\"BABEL\",\"o-g-g\":\"O・G・G\",\"ikebukuro dpc\":\"池袋DPC\",\"ningyou gishou\":\"人形技厂\",\"saiga dou\":\"SAIGA堂\",\"k-drive\":\"K-Drive\",\"larchange\":\"L'ARCHANGE\",\"nyuu koubou\":\"にゅう工房\",\"freehand tamashii\":\"フリーハンド魂\",\"tabuchi-san chi\":\"たぶちさんち\",\"2d creative\":\"2Dクリエイティブ\",\"higuma-ya\":\"ひぐま屋\",\"clearmana plum\":\"クリアマナ・プラム\",\"hanjuku iriko dashi\":\"半熟いりこ出汁\",\"pururun estate\":\"プルルンエステ\",\"heatwave\":\"HEATWAVE\",\"nerco\":\"NERCO\",\"zensuu hakai kensa\":\"全数破坏检査\",\"ng010\":\"NG010\",\"silver meteor\":\"SILVER METEOR\",\"houmitsudou\":\"方密堂\",\"tennenseki\":\"天然石\",\"artienne\":\"アルティエーヌ\",\"under the honey shine\":\"Under The Honey Shine\",\"infinity-force\":\"INFINITY-FORCE\",\"akane makes revolution\":\"A・M・R\",\"gujira 4 gou\":\"ぐじら4号\",\"shimapan\":\"しまぱん\",\"candy paddle\":\"candy paddle\",\"daihonei\":\"大本营\",\"condiment moderately\":\"コンディメントは8分目\",\"digital accel works\":\"Digital Accel Works\",\"masaoyan\":\"まさお屋ン\",\"skirthike\":\"Skirthike\",\"mitarashi dango\":\"みたらし団GO\",\"cartagra\":\"骨牌仓\",\"fomalhaut\":\"FOMALHAUT\",\"ring castle\":\"Ring Castle\",\"takatakaya\":\"たか々屋\",\"unagigoya\":\"うなぎ小屋\",\"celtrance\":\"CELTRANCE\",\"amazoness\":\"アマゾネス\",\"hitotsukami\":\"ヒトツカミ\",\"kossorikakuredokoro\":\"こっそり隠れ処\",\"sweet milk shake\":\"すいーとみるくしぇいく\",\"jabarand\":\"ジャバランド\",\"kuromutu\":\"くろむつ\",\"hoyoyodou\":\"ほよよ堂\",\"wlho\":\"WLHO\",\"mamiretei\":\"まみれ亭\",\"osouzaiya-san\":\"お総菜屋さん\",\"gensuifu\":\"幻醉腐\",\"zooya\":\"ZOOYA!\",\"nanashi no rakugakijo\":\"名無しの落書き所\",\"m-ya\":\"M屋\",\"blue bean\":\"ぶるーびーん\",\"dr.vermilion\":\"Dr.VERMILION\",\"kinqhassin\":\"紧急发进\",\"yagisaki ginza\":\"八木崎银座\",\"p.l.t.works\":\"P.L.T.works\",\"galaxy monooki\":\"ギャラクシー物置\",\"arikawadou\":\"有川堂\",\"akatsuki souken\":\"晓创圈\",\"ikaring\":\"乌贼轮\",\"marvelous grace\":\"Marvelous Grace\",\"muchi muchi seven\":\"ムチムチ7\",\"yuruyuru gts\":\"ゆるゆるGTS\",\"dangerous thoughts\":\"DANGEROUS THOUGHTS\",\"itaba tatamiten\":\"板场叠店\",\"pinvise\":\"pinvise\",\"cobanzame\":\"こばんざめ\",\"p shoukai\":\"P商会\",\"indexacg\":\"IndexACG\",\"yuriai kojinshi kai\":\"悠理爱个人志会\",\"lachenalia\":\"Lachenalia\",\"apricot plus\":\"apricot+\",\"studio huan\":\"STUDIOふあん\",\"machi no onikuya-san\":\"まちのおにくやさん\",\"mnst\":\"MNST\",\"aohige kaizokudan\":\"青髯海贼团\",\"sanbyaku rokujuu do\":\"-三百六十度-\",\"armadillo\":\"Armadillo\",\"spec.c\":\"spec.C\",\"dragon kitchen\":\"Dragon Kitchen\",\"shirukke no ooi zakuro\":\"汁っけの多い柘榴\",\"chocolate cube\":\"CHOCOLATE CUBE\",\"furafura toxin\":\"ふらふらトキシン\",\"cat garden\":\"CAT GARDEN\",\"kuroneko smith\":\"黒猫スミス\",\"rukonosu\":\"龙虎乃巢\",\"samoyedest\":\"サモエデスト\",\"yuunabe shinkouchuu\":\"夕锅进行中\",\"royal milk\":\"Royalみるく\",\"nanohanatea\":\"なのはなtea*\",\"sound sticker\":\"サウンドステッカー\",\"gainamon\":\"がいなもん\",\"loflat\":\"LOFLAT\",\"chococornet\":\"チョココロネ\",\"wnb\":\"WNB\",\"custom size\":\"カスタムサイズ\",\"flicker10\":\"Flicker10\",\"arkhetelos\":\"あるけてろす\",\"juggernaut\":\"じゃがぁの～と\",\"aki no mikaku\":\"あきのみかく\",\"ukatsu de wa nai\":\"うかつではない\",\"ennui\":\"ENNUI\",\"orange channel\":\"ORANGE☆CHANNEL\",\"eternal land\":\"ETERNAL LAND\",\"timtim machine\":\"TIMTIMマシン\",\"artistic time\":\"Artistic Time\",\"niliu chahui\":\"逆流茶会\",\"seikei doujin\":\"正经同人\",\"b.b.t.t.\":\"B.B.T.T.\",\"kumak.com\":\"KUMAK.COM\",\"neruneru\":\"ねるねる\",\"bomb shelter\":\"核弹避难室\",\"shokakuya\":\"少年觉醒夜\",\"toadstool factory\":\"有害蕈类集会所\",\"elane workshop\":\"エルアネ工房\",\"fukuroutei\":\"福笼亭\",\"zvizva-dan\":\"ズビズバ団\",\"uruujima\":\"うるう島\",\"chilled house\":\"CHILLED HOUSE\",\"jack to nicholson\":\"ジャックとニコルソン\",\"shoujo kakei\":\"少女架刑\",\"looptheloop\":\"LOOPTHELOOP!\",\"tsukimi dango\":\"月见团子\",\"paradiddle\":\"パラディドル\",\"mousouzoku no soukutsu\":\"妄想族の巣窟\",\"fuji sengendou\":\"富士浅间堂\",\"negative gang\":\"ネガティブギャング\",\"aloe-nano\":\"Aloe-nano\",\"genshi bangou 47\":\"原子番号47\",\"milky been\":\"Milky Been!\",\"mebae anime\":\"めばえあにめ\",\"alison airlines\":\"ALISON航空\",\"boku to kimi to kakuu sekai to\":\"僕と君と架空世界と\",\"gantai critical\":\"眼帯クリティカル\",\"a-walks\":\"A-WALKs\",\"minuetworks\":\"MinuetWorks\",\"enokiya\":\"榎屋\",\"bindume no kairou\":\"ビン詰めの回廊\",\"mitsuroh\":\"MITSUROH\",\"milk protein\":\"ミルクプロテイン\",\"aokihoshi\":\"AOKIHOSHI\",\"brain dead\":\"ぶれいんでっど\",\"p.p\":\"P:P\",\"loverevo\":\"ラブレボ\",\"po buyuu\":\"PO武勇\",\"zensoku rider\":\"漸速ライダー\",\"windarteam\":\"风艺WindArTeam\",\"curl up\":\"CURL UP\",\"gensou stomach\":\"幻想ストマック\",\"88 gou\":\"88号\",\"ofuton de suyaa\":\"おふとんでスヤァ\",\"fatalpulse\":\"Fatalpulse\",\"oneone1\":\"ONEONE1\",\"marchen box\":\"メルヘンBOX\",\"pokopii\":\"ぽこぴー\",\"hikaru no kobeya\":\"ひかるの小部屋\",\"kiyokawa zaidan\":\"虚川财团\",\"aardvark\":\"Aardvark\",\"no osaka no life\":\"NO OSAKA NO LIFE\",\"peace maker\":\"PEACE MAKER\",\"solid line\":\"Solid Line\",\"makeinu\":\"負け犬\",\"lucky doggy\":\"LUCKY DOGGY\",\"daraku jiko chousa iinkai\":\"堕落事故调查委员会\",\"umi no sachi\":\"うみのさち\",\"yuunagiya\":\"夕凪屋\",\"aimaitei\":\"愛昧亭\",\"ohmiya tsukasa\":\"大宫司\",\"mikekodou\":\"みけこ堂\",\"hekichaen\":\"碧茶园\",\"amatoro bow\":\"甘とろ棒\",\"ruciedo\":\"るしえ堂\",\"jingai makyou\":\"ジンガイマキョウ\",\"steam d\":\"すち～む・D\",\"65535th avenue\":\"65535あべぬー。\",\"makuu gundan\":\"魔空军团\",\"kinokomushin\":\"きのこむ神\",\"ichibariki\":\"一马力\",\"okotan pekoe\":\"おこたんぺこ\",\"we are coming\":\"We are COMING!\",\"sanutei\":\"さぬ亭\",\"tanic ya\":\"タニシ屋\",\"wild flower\":\"WILD FLOWER\",\"brave heart petit\":\"BRAVE HEART petit\",\"chocolate synapse\":\"Chocolate Synapse\",\"boku wa maso desu\":\"僕はマゾです\",\"stanky\":\"STANKY\",\"wizs studio\":\"Wiz's Studio\",\"alkaloid\":\"アルカロイド\",\"d slash l\":\"D/L\",\"kirastar\":\"KiraStar\",\"kokyu no heya\":\"コキュの部屋\",\"askray\":\"AskRay\",\"burstbomb.t\":\"BurstBomb.T\",\"usa daioh\":\"ウサ大王\",\"kaitsushin\":\"海通信\",\"muramuramura\":\"村々村\",\"mumu\":\"夢々\",\"henreikai\":\"片励会\",\"super flat lolinitron\":\"超平板小娘电视台\",\"ashurame gajoh\":\"阿修罗女画帖\",\"kyokushou shoujo\":\"极少少女\",\"luft forst\":\"Luft Forst\",\"gesewa na hanashi\":\"下世話な話\",\"yatsufusa no kobeya\":\"八房の小部屋\",\"ponpharse\":\"ぽんふぁーず\",\"hihumiya\":\"一二三矢\",\"saragi\":\"蛇穴\",\"c2.inc\":\"C2.Inc\",\"km1chome\":\"健町一丁目\",\"atelier dr.heads\":\"アトリエDr.HEAD'S\",\"datsuryoku kenkyuukai\":\"脱力研究会\",\"mebius no wa\":\"Mebiusの環\",\"zenra qq\":\"全裸QQ\",\"ironimu\":\"イロニム\",\"ahobaka\":\"AHOBAKA\",\"corori\":\"CORORI\",\"berosuya\":\"べろす屋\",\"blank check\":\"ぶらんく☆ちぇっく\",\"tonkotsu\":\"とんこつ\",\"necocoya\":\"ねここや\",\"ss-brain\":\"SS-BRAIN\",\"fleur 9 pri\":\"ふるるきゅぷり\",\"jyujiro\":\"十字路\",\"oricomplex\":\"ORICOMPLEX\",\"ohtado\":\"おおた堂\",\"labomagi\":\"らぼまじ!\",\"natsu otome\":\"ナツオトメ\",\"nyanyahouse\":\"NyaNyaHouse\",\"elephant jelly\":\"エレファントゼリー\",\"shounen zoom\":\"少年ズーム\",\"nemuneko\":\"寝梦猫\",\"heart manju mania\":\"はぁと饅頭マニア\",\"dadada coffee\":\"だだだ珈琲\",\"sorairo inn\":\"空色イン\",\"ecchi na taikendan kokuhaku toukou otoko jyuku\":\"エッチな体験談告白投稿男塾\",\"kuramochi zukan\":\"仓持图鉴\",\"uran no yakata\":\"雨兰の馆\",\"tears39\":\"Tears39\",\"milkberry\":\"milkberry\",\"gyoniku\":\"鱼肉\",\"studio c-take\":\"Studio C-TAKE\",\"saru no koshikake\":\"サルノコシカケ\",\"jall boint\":\"ジョールボイント\",\"wadamemo\":\"wadamemo\",\"nanka no atama\":\"何かのあたま!\",\"scratch jikkou iinkai\":\"スクラッチ実行委員会\",\"gn\":\"GN\",\"anko ni gohan\":\"あんこに御飯\",\"hyappo hissatsu\":\"百步必杀\",\"ajiichi\":\"味市\",\"aozoramichi\":\"苍空道\",\"calm atmosphere\":\"カルムアトモスフィア\",\"hikakuteki simple na panty\":\"比較的シンプルなパンティ\",\"hachimitsu romance\":\"蜂蜜ロマンス\",\"trouble makers\":\"Trouble Makers\",\"p-collection\":\"P-Collection\",\"nekotoraya\":\"猫虎屋\",\"wulazula\":\"うらずら\",\"shotaian\":\"所带庵\",\"pirozhki teikoku\":\"ピロシキ帝国\",\"c.rs nest\":\"C.R's NEST\",\"cat expert\":\"きゃっといいえっくす\",\"soundz of bell\":\"Soundz of Bell\",\"achiki no megane\":\"あちきのめがね\",\"blackbox\":\"BlackBox\",\"basutei shower\":\"バス停シャワー\",\"hakueki shobou\":\"白液书房\",\"iromiiro\":\"いろみいろ\",\"uroboros\":\"UROBOROS\",\"marked-two\":\"Marked-two\",\"surume no oka\":\"するめの丘\",\"moezilla-gumi\":\"もえじら組\",\"hisagoya\":\"瓢屋\",\"yohsyuan\":\"杨州庵\",\"bundosuikou\":\"文土水口\",\"potato house\":\"POTATO HOUSE\",\"sabaku x syoujyo\":\"砂漠×少女\",\"hougakuya\":\"方角屋\",\"koro chan fan club\":\"コロちゃんファンクラブ\",\"4hands\":\"4HANDS\",\"takachihoscramble\":\"高千穂スクランブル\",\"doku tonkotsu niku dorei\":\"毒とんこつ肉ドレイ\",\"moon night kitten\":\"月夜のこねこ\",\"american kenpou\":\"アメリカン拳法\",\"erondon hearts\":\"ERONDON HEARTS\",\"shd\":\"SHD\",\"purin kai yoghurt\":\"プリン海ヨーグルト\",\"shouyu no sato\":\"醤油の里\",\"amatou\":\"あまとう | 甘党\",\"sennin no atelier\":\"仙人のアトリエ\",\"magicalflight\":\"MagicalFlight\",\"inucream\":\"いぬくりぃむ\",\"dangan minorz\":\"ダンガンマイナーズ\",\"wohana gokoro\":\"ヲ花心\",\"jack-pot\":\"JACK-POT\",\"gamu-syara\":\"饿武者罗\",\"jinsukeya\":\"甚助屋\",\"mushoku santaro\":\"无色三太郎\",\"team nekojishi\":\"Team Nekojishi\",\"angelbox\":\"ANGELBOX\",\"mokusei zaijuu\":\"木星在住\",\"nekonomizoshiru\":\"猫のみぞ汁\",\"da hootch\":\"DA HOOTCH\",\"hooliganism\":\"集团暴力\",\"eroquis\":\"EROQUIS!\",\"18master\":\"18マスター\",\"date in vitro\":\"Date in vitro\",\"yamanotesen\":\"山手线\",\"lovewn outpost\":\"Lovewn Outpost\",\"kitsune no shippo momitai\":\"狐の尻尾揉みたい\",\"othukimi\":\"オツキミ\",\"mesu gorilla.\":\"メスゴリラ。\",\"samurai ikka\":\"さむらい一家\",\"akutagawa toranosuke\":\"芥川虎之介\",\"seventh zest\":\"seventh zest\",\"niku drill\":\"肉ドリル\",\"mugu\":\"MUGU\",\"kaleido circus\":\"Kaleido Circus\",\"marimofu extension\":\"まりもふえくすてんしょん\",\"piripun\":\"ぴりぷん\",\"g-nose\":\"G-Nose\",\"hokyuun\":\"ほきゅーん\",\"studio boxer\":\"スタジオぼくさぁ\",\"chibikko kingdom\":\"CHIBIKKO KINGDOM\",\"granada sky\":\"グラナダの空\",\"baraneko yougashi-ten\":\"薔薇猫洋菓子店\",\"puu no puupuupuu\":\"ぷぅのぷぅぷぅぷぅ\",\"dokusai switch\":\"独裁スイッチ\",\"junshain inoue\":\"准社员井上\",\"mad order\":\"MAD ORDER\",\"ochikonium\":\"おちこにうむ\",\"arusenchioratatema\":\"アルセンチオラタテマ\",\"fonchau\":\"蜂巢\",\"abalone soft\":\"Abalone Soft\",\"randou house\":\"乱道ハウス\",\"chocolate chuudoku\":\"チョコレイト中毒\",\"blue section\":\"Blue Section\",\"aoin no junreibi\":\"アオインの巡礼日\",\"akutensoushin\":\"恶转奏进\",\"phylactery\":\"PHYLACTERY\",\"hassystant\":\"ハシスタント\",\"rabbit\":\"＊rabbit\",\"kakukonoka\":\"かくこのか\",\"arterial heart\":\"ARTERIALHEART\",\"moriq\":\"moriQ\",\"mofurentei\":\"もふれん亭\",\"sonna kanji de heiankyou\":\"そんな感じで平安京\",\"night springs\":\"ナイトスプリングス\",\"aki to haru no yume\":\"秋と春の夢\",\"tomatohouse-905s room\":\"tomatohouse-905's room\",\"dai 6 kichi\":\"第6基地\",\"movefromoneplacetoheaven\":\"MoveFromOnePlacetoHeaven\",\"workholic\":\"わーくほりっく\",\"astro qube.\":\"AstroQube.\",\"pikorin\":\"ぴこりん!\",\"ngmyu\":\"んみゅ\",\"gintou seika\":\"银糖制菓\",\"damage yuka r\":\"ダメージ床R\",\"ruibosucha\":\"るいぼす茶\",\"kuroisuisei\":\"黒い彗星\",\"se bone\":\"背・骨\",\"tugumix\":\"TUGUMIX\",\"tfc kikaku to yukaina nakamatachi\":\"TFC企画とゆかいな仲間たち\",\"yumemigachi campus\":\"夢想キャンパス\",\"a.o.i\":\"A・O・I\",\"yamanashi musume.\":\"やまなし娘。\",\"zetsubou shiromuji\":\"絶望しろむじ\",\"tottoko mtarou\":\"とっとこMたろう\",\"sad.co\":\"sad.co\",\"an an shokudou\":\"あん♪あん♪食堂\",\"hurupontei\":\"ふるぽん亭\",\"samidaregiri\":\"五月雨斬り\",\"harigane shinshi doumei\":\"针金绅士同盟\",\"dessert time\":\"Dessert Time\",\"fuka fuka\":\"不可不可\",\"suzuki dogezaemon\":\"铃木土下座卫门\",\"anrakugai\":\"安乐街\",\"nurumayu\":\"ぬるま湯\",\"urasekai 2\":\"里世界2\",\"yanyanyo\":\"やんやんよ\",\"fuzukikai\":\"文月会\",\"wanwan bakufu\":\"わんわん幕府\",\"yamitsuki honpo\":\"やみつき本舗\",\"studio kfc\":\"Studio KFC\",\"atelier maso\":\"アトリエマゾ\",\"hachigo\":\"ハチゴ\",\"miyakoochi partisan\":\"都落ちPartisan\",\"efuya\":\"エフ屋\",\"inbuland\":\"iNBULAND\",\"tsukikaze machi\":\"月风町\",\"kuro zuishou\":\"黑水晶\",\"shinyanchi\":\"シンヤんち\",\"gyuunyuu nomiba\":\"牛乳飲み場\",\"kurumi namiki\":\"くるみ並木\",\"kazemichiya\":\"风道屋\",\"su-mi-tan\":\"粟米汤\",\"amuai okashi seisakusho\":\"あむぁいおかし製作所\",\"mofmof\":\"もふもふ\",\"katsu tights\":\"カツタイツ\",\"ainomugen\":\"あいの無限\",\"nuko majin\":\"ぬこ魔神\",\"uni no tane\":\"うにの種\",\"gunjou robot\":\"群青ロボット\",\"hyper dropkick\":\"はいぱーどろっぷきっく\",\"shanghai hanten\":\"上海饭店\",\"hyakki yakou\":\"百鬼夜行\",\"ame ramune\":\"アメラムネ\",\"project kaguya\":\"PROJECT KAGUYA\",\"futayami koubou\":\"双暗工房\",\"mappa namatta\":\"マッパなまった\",\"yumeiro snowgazer\":\"夢色スノーゲイザー\",\"nijutteya\":\"弐十手屋\",\"maguro coffee\":\"まぐろ珈琲\",\"shoujo gesshoku\":\"少女月蝕\",\"kokuto koukuu\":\"黒兎航空\",\"manshin soui\":\"満身創痍\",\"soukousen\":\"創攻線\",\"neko gosho\":\"猫御所\",\"harunatsuakifuyu\":\"春夏秋冬\",\"yoshino\":\"吉野\",\"murakami suigun no yakata\":\"村上水軍の館\",\"takanaedoko\":\"高苗床\",\"ichijikushirabe shiki\":\"九調四季\",\"aoirokanata\":\"蒼色彼方\",\"kurokudo-ya\":\"黒クド屋\",\"iorigumi\":\"庵組\",\"kedama gyuunyuu\":\"毛玉牛乳\",\"gyuunyuuya-san\":\"牛乳屋さん\",\"senpenbankashiki\":\"千变万化式\",\"amakuchi syoujo\":\"あまくち少女\",\"akutoku doumei\":\"悪徳同盟\",\"andorogynous\":\"ANDOROGYNOUS\",\"kikurage-ya\":\"きくらげ屋\",\"shis\":\"SHIS\",\"tomoshibiya koubou\":\"灯夜工房\",\"kakuzato-ichi\":\"核座头市\",\"poppenheim\":\"ぽっぺんはいむ\",\"chitei no nikuya\":\"地底の肉屋\",\"manaita\":\"まないた\",\"mizore nabe\":\"みぞれ鍋\",\"onefes jikkou iinkai\":\"オネフェス実行委員会\",\"isuwie-ya\":\"イスィ屋\",\"yabitsutouge\":\"弥美津峠\",\"chotto dake aruyo.\":\"チョットだけアルヨ。\",\"shiro no ehonya-san\":\"しろの絵本屋さん\",\"neutron city\":\"Neutron city\",\"h-gabmenters\":\"H-gabmenters\",\"shichimen soka\":\"七面楚歌\",\"shin nanka tou\":\"新なんか党\",\"tefutefu.\":\"てふてふ。\",\"menkui\":\"めんくい\",\"amamineko cafe\":\"あまみねこカフェ\",\"maron koubou\":\"マロン工房\",\"nekomonido\":\"ネコモニ堂\",\"nikuniku italian\":\"にくにくイタリアン\",\"darkside room\":\"だーくさいどるーむ\",\"chimee house\":\"ちみはうす\",\"h at break\":\"H@BREAK\",\"saigado\":\"彩画堂\",\"yuuendou\":\"遊猿堂\",\"kouchaya\":\"红茶屋\",\"testa kitchen\":\"てすた厨房\",\"kireinabuta\":\"キレイナブタ\",\"saihate-kukan\":\"最果て空間\",\"seki sabato\":\"関サバト\",\"garyuuya\":\"我龍屋\",\"corona 314\":\"コロナ314\",\"yume to kyouki no chomolung oukoku\":\"夢と狂気のチョモラン王国\",\"lazy star lazy\":\"Lazy★Lazy\",\"70 nenshiki yuukyuu kikan\":\"70年式悠久機関\",\"amazake hatosyo-ten\":\"甘酒鳩商店\",\"batten kariba\":\"X仮歯\",\"mosquitone.\":\"もすきーと音。\",\"hachibusaki\":\"八分咲\",\"kouen tanpaku q\":\"交援蛋白Q\",\"egao de bouryoku\":\"笑顔で暴力\",\"beta houkai\":\"β崩壊\",\"chuuou bunritai\":\"中央分離隊\",\"neko wa manma ga utsukushii\":\"ねこはまんまがうつくしい\",\"nekomarudow.\":\"猫丸堂\",\"honoji\":\"Honoji\",\"watagashi\":\"わた菓子\",\"morphine\":\"モルピネ\",\"amahara teikoku\":\"天原帝国\",\"rocket chousashitsu\":\"ロケット調査室\",\"esora note\":\"エソラnote\",\"ozitan yasan\":\"おじたん屋さん\",\"nechorapoddo\":\"ねちょらぽっど\",\"luminocity\":\"ルミノシティ\",\"gakushokutei\":\"学食亭\",\"nagisa no yoko\":\"渚のヨーコ\",\"ruiketsuan\":\"泪穴庵\",\"ribi dou\":\"RIBI堂\",\"anmonkan\":\"暗梦馆\",\"dairoku kadan\":\"第六花坛\",\"salt choc\":\"塩ちょこ\",\"sawayaka tokunou milk\":\"爽やか特濃みるく\",\"armament calcium\":\"武装カルシウム\",\"sharaku-dou\":\"写楽堂\",\"shoujo renka\":\"少女恋歌\",\"yakiniku tabetai\":\"焼肉食べたい\",\"shiitake nouen\":\"しいたけ農園\",\"almond-nabe\":\"アーモンド鍋\",\"hizaue 5cm\":\"膝上5センチメートル\",\"ponponpain\":\"ぽんぽんぺいん\",\"grinp\":\"GRINP\",\"lost rage\":\"Lost Rage\",\"yahai\":\"矢ハイ\",\"mohumohu chaya\":\"もふもふ茶屋\",\"kirororo\":\"KirororO\",\"zinfandel\":\"ZINFANDEL\",\"fumituki\":\"踏月\",\"mimipuru\":\"みみぷる\",\"yc-tv\":\"YC－TV\",\"strangechameleon\":\"ストカメ\",\"eseneko tale\":\"えせねこてーる\",\"tensaizoku\":\"天災族\",\"zenoside\":\"ぜのさいど\",\"kata k-shiki\":\"型K式\",\"yume no shima\":\"ユメノシマ\",\"dot eito\":\"ドットエイト\",\"ao\":\"青\",\"w-18\":\"W-⑱\",\"poprication\":\"poprication\",\"seemu\":\"seemu。\",\"mix-edge\":\"MIX-EDGE\",\"muni koubou\":\"むに工房\",\"marota teikoku\":\"麻吕太帝国\",\"tenkirin\":\"天气轮\",\"gust\":\"GUST\",\"tsurikichi doumei\":\"釣りキチ同盟\",\"ran-ya\":\"蘭屋\",\"neko-bus tei\":\"ねこバス停\",\"loli ace\":\"ロリエース\",\"dynamo\":\"DYNAMO\",\"clash house\":\"くらっしゅハウス\",\"rainbow vanilla\":\"Rainbow Vanilla\",\"kuma no ana\":\"熊の穴\",\"flourish\":\"flourish\",\"cocoa holic\":\"ココアホリック\",\"retro\":\"RETRO\",\"tekomenchi\":\"てこめんち\",\"nattou misoshiru\":\"納豆味噌汁\",\"kurimomo\":\"くりもも\",\"garimpeiro\":\"Garimpeiro\",\"naturefour\":\"風林火山\",\"usagigo\":\"うさぎ号\",\"cube\":\"CUBE\",\"stella candy\":\"Stella Candy\",\"zip\":\"Zip\",\"moe moe cafe\":\"モエモエカフェ\",\"hitenkei\":\"HitenKei\",\"muzin syoujo\":\"無人少女\",\"hasuneya\":\"はすねや\",\"chilly polka\":\"Chilly polka\",\"morimiyakan\":\"森宫缶\",\"ninokoya\":\"にのこや\",\"mocha2popcorn\":\"mocha*2popcorn\",\"kuronisiki\":\"黒錦\",\"awayukitist\":\"あわ雪チスト\",\"ugc\":\"UGC\",\"akapenguin\":\"アカペンギン\",\"coin toss\":\"こいんとす\",\"haikibutsu\":\"廃棄物\",\"betemius\":\"BETEMIUS\",\"nihon kemomimi suishou iinkai\":\"日本ケモ耳推奨委員会\",\"ayakase-ke no neko\":\"綾枷家の猫\",\"mignon works\":\"MIGNON WORKS\",\"ichijiku yogurt\":\"いちじくよーぐると\",\"egoistic honey\":\"Egoistic Honey\",\"amamiya\":\"甘味屋\",\"curry berg dish\":\"カリーバーグディッシュ\",\"tamanegiya\":\"玉葱屋\",\"casis-kabosu\":\"カシスかぼす\",\"studio a\":\"studio A\",\"shougentei\":\"翔玄亭\",\"d.n.a.lab.\":\"D・N・A.Lab.\",\"kinokonomi\":\"きのこのみ\",\"pigpanpan\":\"PigPanPan\",\"yomairi sensei\":\"よまいり先生\",\"koniro kajitsu\":\"紺色果実\",\"pandora box\":\"ぱんどらぼっくす\",\"jekyll and hyde\":\"Jekyll and Hyde\",\"roentgen\":\"Roentgen\",\"puchimaple\":\"ぷちめいぷる\",\"aratoya\":\"あらと屋\",\"mapler\":\"MAPLER\",\"yuribatake bokujou\":\"百合畑牧場\",\"monyamonya\":\"モニャモニャ\",\"tatakai no kiseki\":\"戦いの軌跡\",\"arcadia\":\"ARCADIA\",\"sorairo nyannyan\":\"空色にゃんにゃん\",\"ichigo crown\":\"Ichigo Crown\",\"side effects\":\"SIDE EFFECTS\",\"t2 art works\":\"T2 ART WORKS\",\"yokkora pencil\":\"よっこらペンシル\",\"marumieya\":\"まる美絵屋\",\"indico lite\":\"Indico lite\",\"haraheridou\":\"はらヘリ堂\",\"hitsuji kikaku\":\"ヒツジ企画\",\"hiyashi yaki teishoku\":\"冷やし焼き定食\",\"burittohiroba\":\"burittohiroba\",\"pypyworks\":\"PYPYworks\",\"lilith lauda laboratory\":\"リリスラウダ研究所\",\"slime kikaku\":\"スライム企画\",\"mukousharan\":\"無口遮欄\",\"l5ex\":\"L5EX\",\"socha-ya\":\"そちゃ屋\",\"mermerry\":\"メルメリー\",\"doyagaobyo\":\"どや顔病\",\"studio hitoribocchi\":\"スタジオひとりぼっち\",\"kyokutou koumuten\":\"极东工务店\",\"takemasaya\":\"たけまさ屋\",\"novelize\":\"NOVELIZE\",\"konohanaku\":\"此花区\",\"hisyoku no tansansui\":\"緋色の炭酸水\",\"comoyoko\":\"コモヨコ\",\"witchs marionette\":\"witch's marionette\",\"key trash\":\"KEY TRASH\",\"alchemy\":\"あるけみい\",\"a.l.l\":\"A・L・L\",\"hiyakake gohan\":\"ひやかけごはん\",\"expander welder\":\"エキスパンダー溶接\",\"makarontaitei\":\"まかろん大帝\",\"hoshi to matango\":\"ほしとマタンゴ\",\"resort ukami\":\"リゾートうかみ\",\"hatishiro\":\"はちしろ\",\"yureru keikoutou\":\"揺れる蛍光灯\",\"rump\":\"RUMP\",\"soratomoe\":\"ソラトモエ\",\"death para\":\"ですぱら\",\"hachiouji kaipan totsugeki kiheitai\":\"八王子海パン突撃騎兵隊\",\"sand\":\"sand\",\"usagigoya.\":\"うさぎごや。\",\"genmaicha\":\"玄米茶\",\"skk\":\"SKK\",\"ins-mode\":\"INS-mode\",\"mellowmind\":\"めろうまいんど\",\"40denier\":\"40デニール\",\"utsura uraraka\":\"うつらうららか\",\"pannomimi\":\"ぱんのみみ\",\"sweet avenue\":\"Sweet Avenue\",\"atelier stars\":\"あとりえスターズ\",\"wildstyle\":\"wildstyle\",\"monofille\":\"モノフィーユ\",\"cassiopeia\":\"CASSIOPEIA\",\"keepon\":\"keepON\",\"yojigen kaidenpa\":\"四次元怪電波\",\"saikutsu kichi\":\"採掘基地\",\"7th semicolon mint\":\"7th;Mint\",\"hitsuji no gohan\":\"ひつじのごはん\",\"tokyoboogienight\":\"桃京武戯夜\",\"taco\":\"TACO\",\"pirokobo\":\"ピロコボ\",\"fujitsubo-machine\":\"富士壺機械\",\"kokusai tenjijou uramon\":\"国際展示場裏門\",\"daifuku\":\"大福\",\"misaki\":\"三崎\",\"umenomi gahou\":\"梅の実画報\",\"akari blast\":\"Akari blast!\",\"rokata aruki\":\"縁側珈琲\",\"idonchi\":\"いどんち\",\"sanbaizu\":\"三杯酢\",\"j.d.world\":\"J.D.World\",\"0000\":\"0000\",\"lovelyplace\":\"LOVELYPLACE\",\"studio hatake\":\"STUDIO畑\",\"seitokaishitsu\":\"生徒会室\",\"kuma no tooru michi\":\"くまのとおるみち\",\"kindou shoujo\":\"金瞳少女\",\"yukimi-fuumi\":\"ゆきみ風味\",\"cotesdenoix\":\"CotesDeNoix\",\"from nuts\":\"From nuts\",\"upagoya\":\"うぱ小屋\",\"muraimura\":\"村井村\",\"apple effect\":\"Apple Effect\",\"sukoburuyama\":\"すこぶるやま\",\"otabe dynamites\":\"おたべ★ダイナマイツ\",\"milk bar\":\"MILK BAR\",\"chikuwa no wakka\":\"ちくわのわっか\",\"nekoyashiki\":\"猫屋敷\",\"cheeseyeast\":\"チーズ酵母\",\"neko tanteidan peach\":\"ネコ☆探偵団\",\"water drop\":\"うぉーたーどろっぷ\",\"honey butter3g\":\"はちみつバター3g\",\"ichibocchi\":\"ゐちぼっち\",\"low temp\":\"low*temp\",\"against\":\"against\",\"jigizagi\":\"ジギザギ\",\"pochi\":\"POCHI\",\"dragon panda\":\"DRAGON PANDA\",\"trip spider\":\"TRIP SPIDER\",\"smile studio\":\"すまいるすたじお\",\"nimunoya\":\"にむの屋\",\"studio big-x\":\"スタジオBIG-X\",\"uzumaki hiyoko\":\"うずまき☆ひよこ\",\"shinshi kouryuuku\":\"紳士交流区\",\"yugen no suda\":\"有限の須田\",\"daidabi\":\"ダイダビ\",\"selvage fisheries\":\"セルビッチ水産\",\"take out\":\"Take Out\",\"necomicle\":\"necömicle\",\"omlet\":\"OMLET\",\"kohipotion\":\"KOHIPOTION\",\"allegro mistic\":\"Allegro Mistic\",\"aho-cross\":\"AHO-CROSS\",\"nekosu no sumika\":\"ねこすのすみか\",\"izumiya\":\"いずみ屋\",\"middly\":\"MIDDLY\",\"0846net\":\"オヤシロネット\",\"fuzichaku\":\"不時着\",\"studio snow man\":\"Studio Snow Man\",\"goldengoblins\":\"GoldenGoblins\",\"kitaku jikan\":\"归宅时间\",\"tanima ginkou\":\"谷间银行\",\"nagaredamaya\":\"流弹屋\",\"dschinghis khan no tamanegi wa ore no yome\":\"ジンギスカンの玉葱は俺の嫁\",\"usagi boss\":\"兔子老大\",\"popochichi\":\"ぽぽちち\",\"g.y.more.l\":\"G.Y.MORE.L\",\"nyoudou juunisei\":\"尿道十二世\",\"hobukuro\":\"ほおぶくろっ!\",\"yasai no kuni\":\"野菜の国\",\"ikkizuka\":\"いっきづか\",\"komadori nouen\":\"こまどり農園\",\"kuma-tan flash\":\"くまたんFlash!\",\"ryuu no kinyoubi\":\"龍の金曜日\",\"kuusoubune\":\"空想舟\",\"perorimeshi.\":\"ぺろり飯。\",\"coupe pain ginga\":\"こっぺぱん銀河\",\"kimi no tomodachi.\":\"君の友達。\",\"mugendai\":\"無限大\",\"sanshikisumire\":\"さんしきすみれ\",\"beruennea\":\"ベルエンネーア\",\"orange tile\":\"オレンジタイル\",\"laminaria\":\"LAMINARIA\",\"nanbou hitogakushiki\":\"南方ヒトガクシキ\",\"narumiya\":\"成宮\",\"circle-fiore\":\"サークルフィオレ\",\"popopo\":\"ぽぽぽ\",\"toushitu catapult\":\"糖質過多ぱると\",\"ojopie sentimental\":\"おじょぱいセンチメンタル\",\"dokutoku no m\":\"独特のM\",\"watari laboratory\":\"渡里laboratory\",\"wappururun\":\"わっぷるるん\",\"anzen chitai\":\"安全地带\",\"loli seiyouken\":\"萝莉西洋剑\",\"shimizuan\":\"清水庵\",\"sakusei kenkyuujo\":\"搾精研究所\",\"in the sky\":\"In The Sky\",\"happy aroma\":\"Happy Aroma\",\"molamola\":\"Molamola\",\"masochist high\":\"マゾヒスト・ハイ\",\"onsoku\":\"おんそく\",\"ringoen\":\"RINGOEN\",\"koibito wa kuroi neko\":\"コイビトハクロイネコ\",\"hz-box\":\"Hz-box\",\"waterfall\":\"Waterfall\",\"amamori weekly\":\"あまもりウィークリー\",\"signalmass\":\"SignalMass\",\"suoiretsym\":\"スアリテスミ\",\"rireba\":\"リレバ\",\"crerpsucre\":\"CrerpSucre\",\"indo no kyuuden\":\"いんどの宮殿!\",\"kacchuu musume\":\"甲冑娘\",\"110-groove\":\"110-GROOVE\",\"yuuki kagoubutsu\":\"有機化合物\",\"a gokuburi\":\"A極振り\",\"sendouya\":\"千堂屋\",\"kokusan jk\":\"国产JK\",\"istanbul high sox\":\"イスタンブール・ハイソックス\",\"chika 7cm\":\"地下7cm\",\"secret society m\":\"秘密结社M\",\"kawaraya-koubou\":\"瓦屋工房\",\"kamishiki\":\"かみしき\",\"popocket\":\"ぽぽケット\",\"tanu choco\":\"たぬチョコ\",\"taketate kakeya\":\"竹立掛屋\",\"rico-ba\":\"Rico-ba\",\"futotta obasan\":\"太ったおばさん\",\"mainichi kenkou seikatsu\":\"毎日健康生活\",\"noramani\":\"のらまに\",\"w no honnou\":\"Wの本能\",\"tokyo prominence tomato\":\"东京プロミネンストマト\",\"gainax\":\"GAINAX\",\"sister mytory\":\"Sister Mytory\",\"yubisaki studio\":\"ユビサキスタジオ\",\"wata punch\":\"WATA★PUNCH\",\"poyopoyosky\":\"ぽよぽよスカイ\",\"world of pure\":\"ワールドオブピュア\",\"hakusen\":\"はくせん\",\"pietoro\":\"ピエトロ\",\"doukyara doukoukai\":\"同キャラ同好会\",\"yosutebito na mangakaki\":\"世捨人な漫画描き\",\"bakunyu fullnerson\":\"爆乳フルネルソン\",\"kyockchokyock\":\"きょくちょ局\",\"satoh katoh\":\"砂糖加糖\",\"condaya\":\"今田屋\",\"tennen koubo pan koubou\":\"天然酵母パン工房\",\"hiyoko sabure\":\"ひよこサブレ\",\"ashitamooyasumi\":\"あしたもおやすみ!\",\"crown\":\"CROWN\",\"island of horizon\":\"Island of Horizon\",\"elriz\":\"ELRIZ\",\"yakiniku teikoku\":\"焼肉帝国\",\"gouache blue\":\"GOUACHE BLUE\",\"duralumin love\":\"ジュラルミンラブ\",\"ganryuu island\":\"巌流アイランド\",\"ryoushi koubou\":\"量子工房\",\"sprelidia\":\"sprelidia\",\"iaidou\":\"居合堂\",\"waterwheel\":\"waterwheel\",\"kitaguni moyashi seizousho\":\"北国もやし製造所\",\"god ryokutya\":\"GOD緑茶\",\"t.4.p\":\"T.4.P\",\"jagabata\":\"じゃがバター\",\"ryuuseidou honpo\":\"龍正堂本舗\",\"tonzura douchuu\":\"とんずら道中\",\"kuromahou kenkyuujo\":\"黒魔法研究所\",\"hotel negresco\":\"Hotel Negresco\",\"kuzunoha\":\"屑乃葉\",\"moni\":\"moni\",\"greennight\":\"GreeNNight\",\"unsympathetic\":\"疎ましいくらいな\",\"meisaiya\":\"meisaiya\",\"tegone spike\":\"てごねスパイク\",\"amasyrup\":\"amasyrup\",\"maybenavy\":\"MaybeNavy\",\"nounai kanojo\":\"脑内彼女\",\"jinsei yokosuberi.\":\"人生横滑り。\",\"sanshoku nattou meshi\":\"三食納豆飯\",\"shiguredoki\":\"しぐれどき\",\"hirusuta\":\"昼星\",\"shikaniku kohan\":\"しかにく湖畔\",\"ua daisakusen\":\"U・A大作戦\",\"white parabellum\":\"white parabellum\",\"pecora room\":\"pecora room\",\"lonely church\":\"Lonely Church\",\"nekotyabatake\":\"猫茶畑\",\"practice\":\"practice\",\"sakuranoiro\":\"サクラノイロ\",\"lunatic maiden\":\"Lunatic*Maiden\",\"freelance\":\"FREELANCE\",\"nekono oyashiro\":\"ねこのおやしろ\",\"croix crown\":\"croix crown\",\"chronolog\":\"CHRONOLOG\",\"fururi.\":\"ふるり。\",\"amamitu hakushi\":\"甘蜜博士\",\"masaru dot com\":\"マサルドットコム\",\"irodori\":\"IRODORI\",\"kamaboko koubou\":\"カマボコ工房\",\"shiki be careful\":\"四季注意\",\"yamakon-ya\":\"山绀屋\",\"botugo\":\"没后\",\"calm white\":\"カームホワイト\",\"curtaincall\":\"CurtainCαll\",\"rainboy\":\"RainBoy\",\"nekocat\":\"NekoCat\",\"dicebomb\":\"DiceBomb\",\"tetrapot\":\"TETRAPOT\",\"tabgraphics\":\"tabgraphics\",\"akari koubou\":\"灯工房\",\"kajou sesshu\":\"過剰摂取\",\"mousou bijutsubu\":\"妄想美術部\",\"yuruyakatou\":\"ゆるやか島\",\"p.a. works\":\"P.A.Works\",\"commamion\":\"狐狸恩\",\"gantai shoujo chudoku\":\"眼帯少女中毒\",\"alice syndrome\":\"アリスシンドローム\",\"pale light\":\"PALE LIGHT\",\"saboten saibaijo\":\"サボテン栽培所\",\"tsundere is love\":\"Tsundere is Love\",\"irodoriya\":\"彩屋\",\"kinakomochi\":\"木なこもち\",\"gelatin\":\"Gelatin*\",\"kusakabeworks\":\"KusakabeWorks\",\"maho-bin\":\"まほ～びん\",\"near harmonica\":\"ニアハモニカ\",\"kankitsu shoujo\":\"柑橘少女\",\"chickelata\":\"チキラータ\",\"shida bokujou\":\"羊歯牧場\",\"chiffonxx\":\"Chiffonxx\",\"floralia\":\"Floralia\",\"happy color festival\":\"HAPPY COLOR FESTIVAL!\",\"sembyokibu\":\"扇猫喜舞\",\"weapon container\":\"武器櫃\",\"shinsekai set\":\"シンセカイセット\",\"ruinon\":\"RUINON\",\"yamada shoukai\":\"山田商会\",\"takemoto seisaku iinkai\":\"竹本製作委員会\",\"umemoto seisaku iinkai\":\"梅本制作委員会\",\"kotei gainen\":\"固定概念\",\"akausagi\":\"赤兔\",\"haru koubou\":\"春工房\",\"rin yuu\":\"Rin☆Yuu\",\"citron no mori\":\"しとろんの杜\",\"mugen jirai\":\"无限地雷\",\"pion\":\"Pion\",\"kuragamo\":\"蔵鴨\",\"kaguya hime koubou\":\"火愚夜姫工房\",\"ikujinashi no fetishist\":\"いくじなしのフェティシスト\",\"fuzuii undou\":\"不随意運動\",\"circle tokomaya\":\"サークルとこまや\",\"barumishu\":\"ばーるみしゅ\",\"megami no flask\":\"女神のフラスコ\",\"hiiro no kenkyuushitsu\":\"灯色の研究室\",\"sukiyaki club\":\"すきやきクラブ\",\"kasoku edge\":\"かそくえっぢ\",\"doku denpa jushin-chuu\":\"毒電波受信中\",\"ebi manga teikoku\":\"えびまんが帝国\",\"180milli cannon\":\"180ミリキャノン\",\"zetsubou teisyoku\":\"ぜつぼう定食\",\"milk engine\":\"Milk Engine\",\"romantic sintai-kensa.\":\"ロマンティック身体検査\",\"white guardian\":\"White Guardian\",\"creayus\":\"CREAYUS\",\"chabashira chainsaw\":\"チャバシラチェーンソー\",\"renai mangaka\":\"恋爱漫画家\",\"hakuto-can\":\"白桃缶\",\"kemono ekaki no kousoku 2\":\"ケモノ絵描きの光速2\",\"niji no magellan\":\"にじのまぜらん\",\"nyanko batake\":\"猫畑\",\"tsukimi dojin\":\"月見道神\",\"sakanaya\":\"魚屋\",\"tonyu bokujo\":\"豆乳牧場\",\"kanai\":\"仮名居\",\"tateyoko issen\":\"縦横一線\",\"ohoshisamadou\":\"おほしさま堂\",\"pure plastic\":\"純情プラスチック\",\"otaku beam\":\"オタクビーム\",\"gin no ame\":\"銀のあめ\",\"mochipeach\":\"MochiPeach\",\"tokunocin\":\"tokunocin\",\"viking\":\"バイキング\",\"caslton\":\"キャッスルトン\",\"ntroom.\":\"NTroom.\",\"shiropro\":\"しろぷろ\",\"bizen dorobune koubou\":\"備前泥舟工房\",\"kitsune no yomeiri\":\"きつねのよめいり\",\"shinsei lolishota\":\"新生ロリショタ\",\"bakuretsu fusen\":\"爆裂风船\",\"natsume benkei\":\"夏目ベンケイ\",\"la-go-on\":\"LA-GO-ON\",\"takahashisan\":\"たかはしさん\",\"kiracnadays\":\"KiracnaDays\",\"nagomi\":\"和\",\"dekoboko hurricane\":\"凸凹ハリケーン\",\"amaineiro\":\"あまいねいろ\",\"gentsuki okiba\":\"ゲンツキオキバ\",\"mashira dou\":\"ましら堂\",\"nijitsuya kenkyuujo\":\"虹艶研究所\",\"samurai ninja greentea\":\"サムライ忍者GREENTEA\",\"alicesyndrome\":\"AliceSyndrome*\",\"uousaohkoku\":\"鱼ウサ王国\",\"konoshiro shinko\":\"コノシロしんこ\",\"kansai orange\":\"关西オレンジ\",\"imomuya honpo\":\"いもむや本舗\",\"ryuukakusan nodoame\":\"龙角散喉糖\",\"okadatei\":\"おかだ亭\",\"niramikko koujou\":\"にらみっ子工場\",\"kaeri no kai 2\":\"帰りの会2\",\"4h\":\"4H\",\"kaitoushinshidan\":\"怪盗绅士团\",\"pastyle\":\"pastyle\",\"chocolate sheep\":\"Chocolate Sheep\",\"hokkyoku tairiku\":\"北極大陸\",\"fuguriya\":\"ふぐり屋\",\"inran shounen\":\"淫乱少年\",\"rokumonsen\":\"ろくもんせん\",\"tenkaichi babys\":\"天下一Babys\",\"beniya\":\"红屋\",\"sashichigai-dan\":\"挿し違い団\",\"yasai batake\":\"諏訪やさい\",\"ichimi-zanmai\":\"一味三昧\",\"sugar berry syrup\":\"Sugar＊Berry＊Syrup\",\"kousei\":\"コウセイ\",\"sugarringo\":\"SUGARRINGO\",\"hajimeryu\":\"はじめりゅう\",\"neovertex\":\"NEOVERTEX\",\"mizuiro no bara\":\"水色のバラ\",\"trinket\":\"TrinkeT\",\"letra\":\"LETRA\",\"kitazawa sangyo\":\"北沢産業\",\"chocolate land\":\"ちょこれーとらんど\",\"zebrasmise\":\"zebrasmise\",\"kakurenbo\":\"かくれんぼ\",\"chericot rozel\":\"Chericot*Rozel\",\"pockyfactory\":\"PockyFactory\",\"pixel phantom\":\"Pixel Phantom\",\"afurokuma honten\":\"アフロくま本店\",\"sashimi necoya\":\"さしみねこ屋\",\"rurudot\":\"rurudot\",\"nanashimushi land\":\"ななし虫らんど\",\"chaos no genri\":\"カオスの原理\",\"black sousai studio\":\"BLACK SOUSAI STUDIO\",\"haechaimu\":\"ハエチャイム\",\"jagaimo kenkyuujo\":\"じゃがいも研究所\",\"madoromi andon\":\"まどろみ行灯\",\"hakoniwa-kairou\":\"はこにわかいろう\",\"akitake zensen\":\"秋茸前线\",\"octopus jelly\":\"Octopus Jelly\",\"kaden ryohanten seijin corner\":\"荷電量販店成人コーナー\",\"black note\":\"ブラックノート\",\"sentimentcolor\":\"SentimentColor\",\"komowa\":\"こも輪\",\"baby lop\":\"Baby Lop\",\"mersugar\":\"Mersugar\",\"nagatsuki\":\"NAGATSUKI\",\"tayanumaya\":\"田屋沼屋\",\"bottle ship bottler\":\"ボトルシップボトラー\",\"saz\":\"SAZ\",\"clowns\":\"Clowns'\",\"toumei dolce\":\"透明ドルチェ\",\"peroppoi tokoro\":\"ぺろっぽい処\",\"earrings bom factory\":\"イヤリング爆弾工場\",\"ororiya enpitsudo\":\"オロリヤ鉛筆堂\",\"l.g.c.\":\"L.G.C.\",\"midorineko\":\"みどりねこ\",\"q-model\":\"Q-MODEL\",\"cherish\":\"*Cherish*\",\"allows\":\"Allows\",\"pico martel\":\"Pico Martel\",\"osenbei no mori\":\"おせんべいの森\",\"sakura saku saku\":\"佐倉さくさく\",\"calorie and cholesterols\":\"カロリー&Cholesterols\",\"stapspats\":\"Stapspats\",\"letitia no ohirune\":\"レティーシャのお昼寝\",\"rokumarusou\":\"ろくまる荘\",\"yamo7\":\"ヤモセブン\",\"ginga-kei pride\":\"银河系PRIDE\",\"suiikazuchi\":\"スイイカズチ\",\"atelier hinata\":\"あとりえひなた\",\"tortoiseshell\":\"トーティシェル\",\"shinoya\":\"篠屋\",\"ink complex\":\"Ink Complex\",\"supe\":\"すぺ\",\"akaneiro\":\"紅音色\",\"hakukoukai\":\"白蛟会\",\"marshmallow balloon\":\"マシュマロ風船\",\"zombie to yukaina nakamatachi\":\"ぞんびと愉快な仲間たち\",\"anmitsuyomogitei\":\"あんみつよもぎ亭\",\"golden complex\":\"金色complex\",\"kannko bokujyo\":\"缶子牧場\",\"sencyairo\":\"sencyairo\",\"himeya\":\"姫屋\",\"doanobu\":\"どあのぶ\",\"bunka shinryaku\":\"文化☆侵略\",\"gokudou daigensui\":\"極道大元帥\",\"oojikake\":\"大仕掛け\",\"illumination.\":\"ゐるみねゐしょん。\",\"sumi kara sumi made\":\"スミカラスミマデ\",\"kankodori chaen\":\"閑古鳥茶園\",\"hell and heaven\":\"ヘルアンドヘブン\",\"kisarazu teikoku\":\"きさらづ帝国\",\"tiba-santi\":\"千葉産地\",\"yokoshoku ice\":\"洋紅色アイス\",\"nekomaru shouten\":\"猫マル商店\",\"pandagaippiki.\":\"パンダが一匹。\",\"tousen soudou\":\"冬扇草堂\",\"jukusei kakuzatou\":\"熟成角砂糖\",\"mikenekohanten\":\"三毛猫饭店\",\"kamikire basami\":\"紙切ればさみ\",\"undescribed\":\"アンディスクライブド\",\"koharu syojo\":\"小春少女\",\"hakai daiteikoku\":\"破坏大帝国\",\"gusha suumitsuin\":\"愚者枢密院\",\"kotsubuan\":\"こつぶあん\",\"gokusaishiki\":\"极彩色\",\"kirintei\":\"木铃亭\",\"kanyou shoujo\":\"观用少女\",\"ferallemma\":\"フィラレマ\",\"bakayaro\":\"ばかやろう\",\"nanimoshinai\":\"NANIMOSHINAI\",\"mokumokusei\":\"モクモクセイ\",\"junjou harinezumi\":\"純情ハリネズミ\",\"miniomlet ongakudan\":\"ミニオムレツ音楽団\",\"baiuzensen\":\"梅雨前線\",\"nagomiyasan\":\"なごみやさん\",\"kocc house\":\"koccハウス\",\"hito no fundoshi\":\"人の裈\",\"himitsukessya usagi\":\"秘密结社兔\",\"nekonecotton\":\"ねこねこっとん\",\"punipuni no hoppe\":\"ぷにぷにのほっぺ\",\"houkago inokorigumi\":\"放課後居残り組\",\"hokkyoku hotaru\":\"北極ホタル\",\"kikyakudou\":\"鬼脚堂\",\"ikameshi shokudou\":\"乌贼饭食堂\",\"tairikukan dandoudan dan\":\"大陆间弹道弹团\",\"shimobashira koubou\":\"しもばしら工房\",\"muriyari egao\":\"无理矢理笑颜\",\"southbamboo\":\"南方山竹笋\",\"permission\":\"ぱ～みっしょん\",\"tsuki usagi\":\"月うさぎ\",\"ameiro\":\"あめいろ\",\"alpharalpha alley\":\"アルファラルファ裏通り\",\"thirty saver street 2d shooting\":\"サーティセイバーストリート\",\"ruri ruri kikaku\":\"瑠璃瑠璃企画\",\"amanedou\":\"あまね堂\",\"esperanza\":\"真田成\",\"tamago no kimi\":\"卵の黄身\",\"shadan katsudoh\":\"遮断活動\",\"tougen shokken\":\"桃幻食研\",\"ciel-arc\":\"しえるあーく\",\"meshi shinja\":\"饭信者\",\"ishimuraya\":\"石村屋\",\"seika kairaku shoten\":\"圣华快乐书店\",\"ringo no naru ki\":\"林檎のなる木\",\"traya\":\"TraYA\",\"kuzuya\":\"屑屋\",\"momojiru teien\":\"桃汁庭园\",\"tamatamasanmyaku\":\"たまたま山脈\",\"harthnir\":\"HarthNir\",\"yoru no hitsuji\":\"夜のひつじ\",\"nawairo sonata\":\"縄色ソナタ\",\"momokamasu\":\"ももかます\",\"kumo no ito\":\"雲之糸\",\"tokachibare\":\"十勝晴レ\",\"bomubomuburin\":\"ボムボムブリン\",\"nisiarea\":\"にしえりあ\",\"mentsukidou\":\"眼ん月堂\",\"izumo gingatei\":\"出雲銀河亭\",\"gedoudan\":\"外道团\",\"garyuh-chitai\":\"我流痴带\",\"tsf mousou chikusekijo\":\"TSF妄想蓄积所\",\"ntype\":\"NtyPe\",\"h.b\":\"H・B\",\"star track\":\"★track\",\"o.s\":\"O.S\",\"wakame no oyatsu\":\"Wakame no Oyatsu\",\"pantyhose\":\"パンティーHOSE\",\"tomboy\":\"TomBoy\",\"... mou ii desu.\":\"…もういいです。\",\".7\":\".7\",\".miz\":\".miz\",\"0-parts\":\"0-PARTS\",\"0123456789\":\"0123456789\",\"02\":\"02\",\"03-3297\":\"03-3297\",\"04\":\"04\",\"04th heaven\":\"04th Heaven\",\"04u\":\"04U\",\"0725co\":\"0725co\",\"08base\":\"08BASE\",\"096\":\"096\",\"10-man bariki\":\"10マン馬力\",\"10.10mhz\":\"10.10MHz\",\"1000ap\":\"1000AP\",\"100acre\":\"100Acre\",\"100yenmofa\":\"100円外務省\",\"102 goushitsu\":\"102号室\",\"106gou\":\"106GOU\",\"106m\":\"106m\",\"10mile\":\"10mile\",\"10pasec no kanata\":\"拾八secの彼方\",\"10wadaxx\":\"10wadaxx\",\"10yen jondo\":\"10円ジョンドゥ\",\"110u\":\"いいお湯\",\"112k\":\"112K\",\"12-jigen\":\"12次元\",\"12cut\":\"12CUT\",\"12kaffeins\":\"12KAFFEINS\",\"13cm\":\"13cm\",\"148bpm\":\"148bpm\",\"14lolita\":\"14ロリータ\",\"152hertz\":\"152HERTZ\",\"16 sai\":\"16彩\",\"16000 all\":\"16000オール\",\"16kenme\":\"16軒目\",\"1756 studio\":\"1756スタジオ\",\"17in\":\"17in\",\"17w\":\"17W\",\"180r\":\"180R\",\"185 souko\":\"185倉庫\",\"1bit\":\"1bit\",\"1gaya\":\"1gaya\",\"1or8\":\"イチカバチカ\",\"2 carat\":\"2カラット\",\"2000kcal shake club\":\"2000kcalシェイク同好会\",\"209 goushitsu\":\"209号室\",\"20liquid\":\"20LIQUID\",\"20r0\":\"20R0\",\"20twenty\":\"20twenty\",\"231179rock\":\"231179=ROCK\",\"241 inc.\":\"241 Inc.\",\"273k\":\"273K\",\"2b\":\"2B\",\"2cv.ss\":\"2CV.SS\",\"2d-note\":\"2D-Note\",\"2h\":\"2H\",\"2jimusubi\":\"二次結び\",\"2m\":\"2m\",\"2nd\":\"2ND\",\"2nd life\":\"2nd Life\",\"2p-color\":\"2P-Color\",\"2stroke\":\"2ストローク\",\"2tailqueen\":\"2tail Queen\",\"2vs\":\"2vs\",\"2zigen\":\"2ZIGEN\",\"3 colors cat\":\"3 colors cat\",\"3 colors corona\":\"3色コロナ\",\"3 on 10\":\"3 on 10\",\"3-2 gagen\":\"3-2画源\",\"3-mega.ne\":\"3-MEGA.ne\",\"3.5tousin\":\"3.5等身\",\"300cm\":\"300cm\",\"301 goushitsu\":\"301号室\",\"30min-5000yen\":\"30分5000円ポッキリ\",\"321go\":\"321go\",\"360 degrees c\":\"360°C\",\"36k\":\"36K\",\"38shiki\":\"三十八式\",\"39dmp\":\"39dmp\",\"39xream\":\"ミックスリーム\",\"3egg\":\"3egg\",\"3jou\":\"3情\",\"3lbox\":\"3LBOX\",\"4.5space\":\"4.5space\",\"40010 1-go\":\"40010壱号\",\"4649 club\":\"4649苦愛\",\"4dip\":\"4DIP\",\"4or5 works\":\"よんかごわーくす\",\"4season\":\"4season\",\"4st injection\":\"4st Injection\",\"5 06\":\"ゴー!マルロク\",\"5 slash 4\":\"5/4\",\"50000s\":\"五萬S\",\"50on\":\"50on!\",\"50pointcaliper\":\"50PointCaliper\",\"5th library\":\"5th Library\",\"5up\":\"5UP\",\"64bit spectrum\":\"64bitスペクトル\",\"64kbit\":\"64Kbit\",\"66 no oka\":\"66の丘\",\"662kb\":\"662KB\",\"666-346\":\"666-346\",\"666protect\":\"666プロテクト\",\"69erotique\":\"69EROTIQUE\",\"69hb\":\"69HB\",\"6colors\":\"6COLORS\",\"6x8breads\":\"6x8breads\",\"7 colored led\":\"虹色発光ダイオード\",\"7-ban no okimono\":\"7番の置物\",\"707room\":\"707号室\",\"73feti\":\"73フェチ\",\"73gou koudou\":\"73号坑道\",\"774 house\":\"774ハウス\",\"7961shiki\":\"7961式\",\"7fleur\":\"7Fleur\",\"7menzippo\":\"7メンZippo\",\"7th ark\":\"7th_arK\",\"7th door\":\"7th Door\",\"7th utopia\":\"7th utopia\",\"8 no ji club\":\"8の字倶楽部\",\"8 slash 7\":\"8/7\",\"81dora\":\"81dora\",\"86 saver\":\"86 SAVER\",\"86cafe\":\"86珈琲店\",\"88scones\":\"88scones\",\"8cm\":\"8cm\",\"8graphica\":\"エイトグラフィカ\",\"8ji sugi\":\"8時すぎ\",\"93bangai\":\"93番街\",\"999 q-miz\":\"999 Q-miz\",\"99mg\":\"99mg\",\"9z\":\"9z\",\"a\":\"Circle A\",\"a 3103 hut\":\"a 3103 hut\",\"a after school of silence\":\"沈黙の放課後\",\"a cherry-blossom front\":\"A cherry-blossom front\",\"a face\":\"a face\",\"a hoimi\":\"a hoimi\",\"a pear tree\":\"a pear tree\",\"a taku studio takuno\":\"A TAKU STUDIO TAKUNO\",\"a yellow aurora\":\"A Yellow Aurora\",\"a-anima\":\"A-Anima\",\"a-arinco\":\"A-arinco\",\"a-hole\":\"A-HOLE\",\"a-lucky murashige no ran\":\"A-Lucky☆村重の乱\",\"a-mania9s\":\"A-mania9's\",\"a-mw.\":\"A-mw.\",\"a-office\":\"A-office\",\"a.boc70\":\"a.boc70\",\"a.c.g arts\":\"A.C.Gアーツ\",\"a.l.c\":\"A.L.C\",\"a.la.mode\":\"ア・ラ・モード\",\"a.p. retriever\":\"A.P.レトリバー\",\"a.p.yamamoh\":\"A.P.YAMAMOH\",\"a.s.g group\":\"A・S・Gグループ\",\"a.s.s\":\"A.S.S\",\"a.u.forest\":\"A.U.FOREST\",\"a.v. tokkoutai\":\"A.V.特攻隊\",\"a2 lampshade\":\"A2 LAMPSHADE\",\"a2-wing\":\"A2-WiNG\",\"a440\":\"a440\",\"aa aishiteru\":\"ああ愛してる\",\"aa doushiyou\":\"あぁどうしよう\",\"aa warera katou hayabusa sentoutai\":\"嗚呼、我等加藤隼戦斗隊\",\"aaru\":\"アアル\",\"ab normal\":\"あーびーのーまる\",\"ab10\":\"AB10\",\"abalone kiss\":\"ABALONE KISS\",\"abara ga itai\":\"あばらが痛い\",\"abarenbow tengu\":\"暴れん坊天狗\",\"abaretabi\":\"暴れ旅\",\"abbey load\":\"Abbey Load\",\"abdg encirclement formation\":\"ABDG包囲網\",\"abellcain\":\"アベルカイン\",\"aberyu\":\"悪部流\",\"abgrund\":\"abgrund\",\"abigor\":\"アビゴール\",\"abliss\":\"ABLISS\",\"abonriya\":\"あぼんり屋\",\"abradeli kami\":\"油照紙\",\"absolute fantasy\":\"ABSOLUTE FANTASY\",\"absorb\":\"アブそ～ぶ\",\"abstract limit\":\"抽象境界\",\"abunae koubou\":\"あぶな絵工房\",\"abunai zeiniku\":\"あぶないぜいにく\",\"aburasoba biyori\":\"あぶらそば日和\",\"abyssdragon.\":\"AbyssDragon.\",\"acchi no seikatsu\":\"あっちの生活\",\"accidentbitterchocolate\":\"AccidentBitterChocolate\",\"accolt\":\"accolt\",\"ace enterprise\":\"Ace Enterprise\",\"achromic\":\"Achromic\",\"achumuchi\":\"あちゅむち\",\"acid eaters\":\"ACID EATERS\",\"acid noel\":\"Acid Noel\",\"acidsea\":\"ACIDSEA\",\"acid-head\":\"ACID-HEAD\",\"acoram\":\"Acoram\",\"action mokei\":\"アクション模型\",\"active\":\"アクティブ\",\"active sunrise\":\"あくてぃぶサンライズ\",\"actively dawn\":\"ACTIVELY DAWN\",\"actress\":\"アクトレス\",\"actuator\":\"アクチュエーター\",\"acute\":\"あきゅ〜と\",\"ad-hoc\":\"Ad-Hoc\",\"adabana\":\"徒花\",\"adalt only\":\"成人向け\",\"ade no shin\":\"あでのしん\",\"adeyaka kunoichi-dan\":\"艶やかくノ一団\",\"adnis\":\"ADNiS\",\"adult house\":\"あだるとはうす\",\"advance\":\"ADVANCE\",\"advanced twinkle castle shinobi jou giga\":\"ADVANCEDトィンクル☆キャッスル+忍城GIGA\",\"advanced-ss\":\"Advanced-SS\",\"aeba fukashi\":\"饗庭淵\",\"aegistone\":\"aegistone\",\"aerial\":\"エアリアル\",\"aerial rave\":\"AERIAL RAVE\",\"aerial soul\":\"Aerial Soul\",\"aerodog\":\"AERODOG\",\"affidavit\":\"Affidavit\",\"affix\":\"Affix\",\"afj\":\"AFJ\",\"after party\":\"after party\",\"again.\":\"again.\",\"ageage\":\"アゲ揚げ\",\"ageku no hate no\":\"あげくの果ての\",\"ago\":\"アゴ\",\"agohimo yoika\":\"アゴヒモヨイカ\",\"agoitei\":\"AGOI亭\",\"ah.\":\"あー。\",\"ahaan\":\"AHAAN\",\"ahm\":\"AHM\",\"ahoge\":\"あほ毛\",\"ahou basha\":\"阿呆馬車\",\"ahriman\":\"アーリマン\",\"ahun\":\"アフン\",\"ai no inu koujou\":\"愛の犬工場\",\"ai no kura\":\"あいの倉\",\"ai no senshi mimikaki\":\"愛の戦士みみかき\",\"ai no sunatokei\":\"藍の砂時計\",\"ai urara\":\"あいうらら\",\"ai wa kurayami\":\"愛は暗闇\",\"ai-chan no ozashiki\":\"あいちゃんのお座敷\",\"aiai\":\"あいあい\",\"aiaigasa\":\"あいあい傘\",\"aida.\":\"間。\",\"aidon raiki\":\"合丼来来\",\"aienkien\":\"愛鉛奇縁\",\"aigamodou\":\"あいがも堂\",\"aigan shounen\":\"愛玩少年\",\"aihara otome\":\"相原乙女\",\"aiiro paradox\":\"藍色パラドックス\",\"aiirojikan\":\"藍色時間\",\"aiirosakura\":\"あいいろさくら\",\"aik sole\":\"アイクソール\",\"aikokusha\":\"愛国者\",\"aikotobako\":\"アイコトバコ\",\"aim\":\"AIM\",\"aim-zero\":\"Aim-ZERO\",\"aimaimemai\":\"あいまいめまい\",\"aimaimoko\":\"曖昧模糊\",\"aimasutei\":\"愛増庭\",\"aimy\":\"Aimy\",\"ainekokan\":\"愛猫缶\",\"aiokougadou\":\"アイオコウガドウ\",\"aion\":\"AION\",\"air hike\":\"Air Hike\",\"air plants\":\"Air Plants\",\"air praitre\":\"AirФPraitre\",\"air union\":\"AIR UNION\",\"airily steps\":\"Airily Steps\",\"airmusica\":\"AIRMUSICA\",\"airyu\":\"あいりゅ\",\"aitsu no tatebue\":\"あいつのたてぶえ\",\"aiuea\":\"あいうえあ\",\"aiviera\":\"アイヴィエラ\",\"aiyamatarei\":\"あいやまたれい\",\"aizou roman kikan\":\"愛憎浪漫機関\",\"ajala\":\"戯アジャラ\",\"ajapaa.\":\"あじゃぱー。\",\"aje\":\"AJE\",\"aji no hiraki\":\"あじのひらき\",\"aji star\":\"鯵スター\",\"aju ga mitsukarimasen\":\"あじゅが見つかりません\",\"ajinomoto\":\"あじのもと\",\"ajisaihuumitei\":\"紫陽花風味亭\",\"aka\":\"aka\",\"akaao\":\"あかあお\",\"akabei soft\":\"AKABEi SOFT\",\"akabei soft2\":\"あかべぇそふとつぅ\",\"akabei soft3\":\"あかべぇそふとすりぃ\",\"akachang time\":\"赤ちゃングタイム\",\"akachi\":\"あかち\",\"akacia\":\"AKACIA\",\"akadama-ya\":\"赤玉屋\",\"akadashi no misoshiru\":\"赤だしのみそ汁\",\"akaeboshi\":\"アカエボシ\",\"akagiridan\":\"あかぎり団\",\"akagisou\":\"赤木荘\",\"akagumotei\":\"朱雲亭\",\"akahira kirin\":\"あかひら麒麟\",\"akai chi to tetsu no roudousha tou\":\"赤い血と鉄の労働者党\",\"akai hitomi to aoi tsuki\":\"紅い瞳と蒼い月\",\"akai kitsune\":\"アカイキツネ\",\"akai marlboro\":\"赤いマルボロ\",\"akai muffler\":\"赤いマフラー\",\"akai syohousen\":\"赤い処方箋\",\"akai tsubasa\":\"赤い翼\",\"akaihoho\":\"akaihoho\",\"akairo mambo\":\"赤色まんぼー\",\"akaironomahou\":\"あかいろのまほう\",\"akamiru\":\"Akamiru\",\"akamuni.\":\"あかむに。\",\"akanagi\":\"あかなぎ\",\"akane shuuhei dou\":\"茜しゅうへい堂\",\"akaneko\":\"赤猫\",\"akanoiki\":\"赤の域\",\"akari wa honnori tomoreba ii\":\"明かりはほんのり灯ればいい\",\"akaringo-chan\":\"あかりんごちゃん\",\"akarui sm\":\"明るいSM\",\"a-ka-sa-works\":\"あかさ製作所\",\"akashitei\":\"あかし亭\",\"akatama\":\"アカタマ\",\"akatsuki akaza dou\":\"赤月赤座堂\",\"akatsuki katsuie no circle\":\"暁勝家ノサークル\",\"akatsuki works\":\"暁WORKS\",\"akatsuki doumei\":\"アカツキドウメイ\",\"aki no yonaga ni yoiyami ni\":\"秋の夜長に宵闇に\",\"aki6666\":\"AKI6666\",\"akifumi-chan\":\"あきふみちゃん\",\"akikan\":\"アキカン\",\"akino melpa\":\"アキノメルパ\",\"akisame moyashi\":\"あきさめ萌やし\",\"akisora\":\"秋空\",\"akitaka seinikuten\":\"あきたか贅肉店\",\"akitaku kikaku\":\"アキタク＊キカク\",\"akitarainu\":\"あきたらいぬ\",\"akitsuki\":\"秋月\",\"akiya\":\"空屋\",\"akiyama production\":\"アキヤマ興業\",\"akkan-bi project\":\"あっかんBi～\",\"akou kurou\":\"アコウクロウ\",\"akoyagai to aumale ebi\":\"あこや貝とオマールえび\",\"akuheki\":\"悪癖\",\"akuma no ehon hakushu dan\":\"悪魔の絵本拍手団\",\"akuma toshi keikaku\":\"悪魔都市計画\",\"akumara\":\"あくまら\",\"akumaster\":\"Akumaster\",\"akunaki hourou\":\"あくなき放浪\",\"akunomangakarenmei\":\"悪の漫画家連盟\",\"akuochisukii kyoushitsu\":\"アクオチスキー教室\",\"akuta space\":\"あくたスペース\",\"akuyukai\":\"悪遊怪\",\"akys honpo\":\"AKYS本舗\",\"al dente\":\"あるでんて\",\"albatross\":\"あるばとろす\",\"albercorp.\":\"あるばーCorp.\",\"albino no yuuhatsu\":\"アルビノの融発\",\"albireo 7\":\"あるびれお7\",\"alchemist works\":\"Alchemist works\",\"alfalfa\":\"alfalfa\",\"ali-san maku\":\"ALIさんマーク\",\"alibi\":\"アリバイ\",\"alice complex\":\"Alice Complex\",\"alice digital factory\":\"Alice Digital Factory\",\"alice-do\":\"ありす堂\",\"alice.blood\":\"Alice.Blood\",\"aliceflag\":\"AliceFlag\",\"alicegarden\":\"AliceGarden\",\"alicemiller\":\"alicemiller\",\"alicetale\":\"ありすている♪\",\"alikui v line\":\"ありくいVライン\",\"alisex\":\"alisex\",\"alkaloid no baketu\":\"アルカロイドノバケツ\",\"all over the place.\":\"all over the Place.\",\"all-time\":\"ALL-TiME\",\"allbyte\":\"AllByte\",\"allegro launcher\":\"アレグロランチャー\",\"allium tuberosum\":\"Allium tuberosum\",\"allo\":\"allo\",\"almanacco\":\"almanacco\",\"almism\":\"ALMISM\",\"almond republic\":\"あーもんど共和国\",\"almond to kyogyuunyuu\":\"アーモンドと巨牛乳\",\"aloha soft\":\"あろはそふと\",\"alpa\":\"ALPA\",\"alpaca unit\":\"ALPACA Unit\",\"alpha to yukaina nakamatachi\":\"有葉と愉快な仲間たち\",\"alpha-beta\":\"alpha-beta\",\"alps\":\"アルプス興業\",\"alsetro\":\"ALSeTRO\",\"alsiel\":\"Alsiel\",\"alt\":\"ALT\",\"alte notiz\":\"あるてのてぃつ\",\"alter maschine\":\"Alter Maschine\",\"altergott\":\"Altergott\",\"alto letzel\":\"あるとれっつぇる\",\"alto realize\":\"Alto realize\",\"altopia\":\"アルトピア\",\"altron\":\"アルトロン\",\"alumi soft\":\"あるみそふと\",\"alumican\":\"あるみかん\",\"am colon tiger\":\"AM:TIGER\",\"amaama-tei\":\"甘々亭\",\"amadeus no isan\":\"アマデウスの遺産\",\"amadoiza\":\"雨樋座\",\"amadoki\":\"雨時\",\"amagaeru to sprocket\":\"雨蛙とスプロケット\",\"amagasa touge\":\"雨傘峠\",\"amagashi\":\"甘菓子\",\"amagi an ironworks\":\"天城製鉄所\",\"amagoi koubou\":\"雨乞い工房\",\"amai wakusei\":\"あまい惑星\",\"amaichigo\":\"あまいちご\",\"amairo denshi koubou\":\"天色電子工房\",\"amakasas\":\"Amakasas\",\"amakashi\":\"アマカシ\",\"amakaya\":\"天香屋\",\"amakuchi\":\"あまくち\",\"amakura89gou ten\":\"天倉89号店\",\"amakuro okami\":\"あまくろ狼\",\"amakurodou\":\"甘黒堂\",\"amam\":\"AMAM\",\"amamin koubou\":\"あまみん工房\",\"amanatsu mix\":\"あまなつミックス\",\"amanatsu quality\":\"甘夏クオリテ\",\"amanatsuya\":\"天夏屋\",\"amanogawa tsuushin\":\"天の川通信\",\"amanojaku\":\"天ノ邪鬼\",\"amaon\":\"amaon\",\"amaoto rensa yohou\":\"雨音連鎖予報\",\"amapoteya\":\"あまぽて屋\",\"amarini senpaku\":\"あまりにセンパク!\",\"amatosui\":\"甘桃水\",\"amatou continue\":\"甘党こんてぃにゅー\",\"amatsu hanten opi\":\"天津反転OPi!\",\"amatsukami\":\"アマツカミ\",\"amayadori plus\":\"AMAYADORI+\",\"amazake resonance\":\"甘酒レゾナンス\",\"amazawa kingdom\":\"AMAZAWA KINGDOM\",\"amazingsweets\":\"Amazing Sweets\",\"ambience\":\"ambience\",\"ambivalence\":\"AMBIVALENCE\",\"ambivalent-e\":\"Ambivalent-E\",\"ambivalenz\":\"AmBiVaLenZ\",\"ame hotel\":\"AMEホテル\",\"ame no aji\":\"雨の味\",\"ame no murakumo\":\"アメノムラクモ\",\"ame no nikki\":\"雨のにっき\",\"amecir\":\"あめさー\",\"amedamazakura\":\"飴玉桜\",\"amefurasy\":\"amefurasy\",\"amefuri canvas\":\"雨ふりキャンバス\",\"ameiro biscuit\":\"飴色ビスケット\",\"amemizu\":\"あめみず\",\"ameno oukan\":\"雨の王冠\",\"amenyan-tai\":\"あめにゃん隊\",\"ameyama telegraph\":\"雨山電信社\",\"ami-dabutsu\":\"ami-だぶつ\",\"aminendo\":\"あみねんど\",\"ammolite\":\"アンモライト\",\"amorphous innocent fiction\":\"AMORPHOUS innocent fiction\",\"ampullaria\":\"あんぷらりあ\",\"amrita\":\"AMRITA\",\"amuamu tiger\":\"あむあむタイガー\",\"amulet\":\"あみゅれっと\",\"amuse craft erotica\":\"アミューズクラフトエロチカ\",\"ana\":\"ANA\",\"ana futatsu\":\"穴ふたつ\",\"anagura\":\"穴蔵\",\"anal crisis\":\"アナル☆クライシス\",\"analcime\":\"アナルシム\",\"analog e.c.\":\"アナログE.C.\",\"analog store\":\"あなろぐストア\",\"ananas dolce\":\"Ananas Dolce\",\"ananwanco\":\"あんあんわんこ\",\"anapom\":\"ANAPOM\",\"anarchy gangsta\":\"アナーキーギャングスタ\",\"anarcomix\":\"ANARCOMIX\",\"anchor\":\"ANCHOR\",\"andante\":\"あんだんて\",\"anegaoka sanchoume\":\"姉ヶ丘三丁目\",\"anemitsu\":\"あねみつ\",\"anemone\":\"Anemone\",\"aneurysm.\":\"あにゅうりずむ。\",\"anfini\":\"ANFINI\",\"ange\":\"アンジェ\",\"angel bless\":\"Angel Bless\",\"angel of blue sky\":\"Angel of Blue Sky\",\"angelic feather\":\"天使の羽\",\"angelphobia\":\"angelphobia\",\"angensou\":\"黯幻想\",\"anglachel\":\"アングラヘル\",\"angler soft\":\"アングラーソフト\",\"angora doll\":\"Angora doll\",\"ani ga saru\":\"兄が猿\",\"aniki otokodou\":\"兄貴漢堂\",\"anim\":\"Anim\",\"animal herb\":\"あにまるハーブ\",\"animal passion\":\"Animal Passion\",\"animal service\":\"アニマルサービス\",\"animalism\":\"あにまりずむ\",\"animankan\":\"アニマン館\",\"anime brothers\":\"アニメブラザーズ\",\"animeeru\":\"あにめーる\",\"ankake cha-han\":\"あんかけCha-haN\",\"ankake chameshi\":\"あんかけチャメシ\",\"ankanke\":\"安閑家\",\"ankimo factory\":\"あんきも工房\",\"anko koubou\":\"あんこ工房\",\"ankoku azumaya\":\"暗黒あずまや\",\"ankoku marimokan\":\"アンコクマリモカン\",\"ankoku-bousougumi\":\"暗黒暴走組\",\"ankoya\":\"アンコ屋\",\"anmin koutou benmukan jimusho\":\"安眠高等弁務官事務所\",\"anmitsuya\":\"あんみつや\",\"annee suplex\":\"あんねーすーぷれっくす\",\"annin\":\"杏仁\",\"annon club\":\"安穏倶楽部\",\"anons flood myth\":\"あのんの大洪水伝説\",\"anonymax\":\"あのにまっくす\",\"anoprimal\":\"アノプライマル\",\"anorak post\":\"Anorak Post\",\"another story\":\"Another Story\",\"another world\":\"Another World\",\"ant colony\":\"蟻の巣\",\"antares\":\"ANTARES\",\"antidying\":\"AntiDying\",\"antineed\":\"ANTINEED\",\"anxious delusionist\":\"アンキデ\",\"anya\":\"ANYa\",\"anysing world\":\"ANYSING WORLD\",\"anything\":\"anything\",\"anzen daiichi\":\"安全第一\",\"anzen ekisu\":\"安全えきす\",\"anzen na buffalo\":\"安全なバッファロー\",\"anzeri kai\":\"アンゼリ会\",\"anzu ame\":\"あんず飴\",\"ao hana\":\"青華\",\"ao niwashi\":\"青庭師\",\"ao no oto\":\"青ノ音\",\"aoaa\":\"AOAA\",\"aoba q madou\":\"青葉Q魔洞\",\"aoboshi\":\"青星\",\"aodiso kankou\":\"青ぢそ甘工\",\"aohibachi\":\"アオヒバチ\",\"aohimo familia\":\"アオヒモファミリア\",\"aoi\":\"AOI\",\"aoi dennou\":\"アオイ電脳\",\"aoi no ie\":\"葵の家\",\"aoi project\":\"AOI PROJECT\",\"aoikitoiki.\":\"青息吐息。\",\"aoiro hakkyou diode\":\"青色ハッキョウダイオード\",\"aoiro ichiza\":\"青色一座\",\"aoirobindume\":\"青色瓶詰\",\"aoirotone works\":\"Aoirotone works\",\"aoiten\":\"青い点\",\"aokumashii\":\"アオクマシー\",\"aomayu\":\"あおまゆ\",\"aomi dream maker\":\"あおみどりーむめーかー\",\"aomidori\":\"蒼見鳥\",\"aonatsusou\":\"蒼夏荘\",\"aotokage\":\"青蜥蜴\",\"aotsukitei\":\"蒼月亭\",\"aoyama seisaku\":\"青山制作所\",\"aozakura\":\"蒼桜\",\"aozora market\":\"蒼空市場\",\"aozora no mieru chikashitsu\":\"青空の見える地下室\",\"apadash\":\"アパダッシュ\",\"apatheia\":\"APATHEIA\",\"aperitif\":\"Aperitif\",\"aphrodite\":\"あふろでぃ～て\",\"aphrodite fan club\":\"アフロディーテファンクラブ\",\"apika\":\"apika\",\"aplysia-gumi\":\"Aplysia組\",\"apocolotte\":\"ApoCoLotte\",\"apocrine.\":\"あぽくりん。\",\"apokari\":\"あぽかり\",\"apollo\":\"APOLLO\",\"apple mint leaves\":\"あっぷるみんとのは\",\"apple pie\":\"アップルパイ\",\"apple rooftop\":\"あっぷる屋上\",\"apple water\":\"Apple Water\",\"applecat\":\"あっぷるきゃっと\",\"applesoft\":\"アップルソフト\",\"applique\":\"あっぷりけ\",\"apricot\":\"apricot\",\"apricot cherry\":\"Apricot Cherry\",\"apricot sirup\":\"あんずシロップ\",\"apricottea\":\"APRICOTTEA\",\"apsara project\":\"あぷさらproject\",\"apsis\":\"apsis\",\"apupop\":\"apupop\",\"apurikokko\":\"あぷりこっこ\",\"aq rotation\":\"AQローテーション\",\"aqua create\":\"AQUA CREATE\",\"aqua space\":\"AQUA SPACE\",\"aqua-baiser\":\"Aqua-baiser\",\"aquadriver\":\"アクアドライバー\",\"aquamarine\":\"あくあまりん\",\"aquapit\":\"あくあぴっと\",\"aquarium\":\"アクアリウム\",\"aquarius gate\":\"Aquarius Gate\",\"aquaver\":\"AQUA:VER\",\"aquilegia\":\"Aquilegia\",\"aquilno-zeroex\":\"あきるのぜろえっくす\",\"aqukan\":\"亜空間\",\"ar da coda\":\"あ～だこ～だ\",\"arachnomania\":\"あらくの☆まにあ\",\"arafuradou\":\"アラフラ胴\",\"arahabaki\":\"アラハバキ\",\"arakiya-san\":\"あらき屋さん\",\"arakureta monotachi\":\"あらくれた者たち\",\"araragi-1071-\":\"ARARAGI-1071-\",\"ararudaito\":\"あらるだいと\",\"arc\":\"ARC\",\"arc slash turbine\":\"ARC/TURBINE\",\"arcana club\":\"あるかな倶楽部\",\"arch\":\"ARCH\",\"archangel\":\"ARCHANGEL\",\"archea\":\"archea\",\"archf\":\"ARCHF\",\"arcon\":\"あるこん\",\"arcs\":\"ArcS\",\"arctangent\":\"ARCTANGENT\",\"arctic char\":\"Arctic Char\",\"arctic pan\":\"北極鍋\",\"are.\":\"あれ。\",\"area-048\":\"Area-048\",\"area-s\":\"Area-S\",\"area188\":\"エリア188\",\"area50\":\"Area50\",\"area7\":\"えりあ7\",\"arearee\":\"あれあれえ\",\"areya\":\"あれ屋\",\"argon\":\"アルゴン\",\"argonauts\":\"Argonauts\",\"argyle\":\"アーガイル\",\"argyle check\":\"Argyle◇check\",\"aria\":\"Aria\",\"aria corporation\":\"アリアコーポレーション\",\"arianrhod\":\"Arianrhod\",\"ariari no nashinashi\":\"ありありのなしなし\",\"arieroof\":\"Arieroof\",\"arigatou\":\"ありが党\",\"arikamatou\":\"ありかま糖\",\"arikui mcqueen\":\"アリクイマックィーン\",\"arimax\":\"アリマックス\",\"arinotowatari\":\"ありのとわたり\",\"arisan-antenna\":\"ありさんアンテナ\",\"ark emerald\":\"Ark Emerald\",\"arkadia\":\"ARKADIA\",\"arkizm\":\"arkizm*\",\"armanium\":\"あるまにうむ\",\"armeria\":\"Armeria\",\"armored ginkakuji\":\"アーマードギンカクジ\",\"armored namamono\":\"アーマードなまもの\",\"aroma terrace\":\"あろまてらす\",\"aromatic girl\":\"aromatic girl\",\"arpeggio\":\"あるぺじお\",\"arsenothelus\":\"アルセノテリス\",\"art en ciel.\":\"art en ciel.\",\"art equals theater\":\"ART=THEATER\",\"art jam\":\"Art Jam\",\"artichoke\":\"artichoke\",\"article 60 of criminal code\":\"刑法第60条\",\"artificial eden\":\"Artificial Eden\",\"arts graffiti\":\"アーツグラフィティ\",\"aru-run\":\"あるるん\",\"arubain\":\"あるばいん\",\"aruchisuto\":\"アルチスト\",\"aruheito\":\"あるへゐと\",\"aruk9\":\"アルK9\",\"arukaseya\":\"歩かせ屋\",\"arumi seigen b-chiku\":\"アルミ制限B地区\",\"arunekoki\":\"歩猫記\",\"arutana\":\"あるたな\",\"as known as\":\"as known as\",\"as mission imphal\":\"インパール作戦\",\"as-zadkiel\":\"As-Zadkiel\",\"asa club\":\"あさクラブ\",\"asabadou\":\"浅葉堂\",\"asadukuyo no utage\":\"朝月夜の宴\",\"asagayatei\":\"あさがや亭\",\"asagindo\":\"あさぎん堂\",\"asai kikaku\":\"あさい企画\",\"asairo milktea\":\"朝色みるくちー\",\"asaiumi\":\"浅い海\",\"asakawa hetero\":\"麻川ヘテロ\",\"asaki blog branch office\":\"朝木blog出張所\",\"asaki yumemishi\":\"あさきゆめみし\",\"asanebou crisis\":\"朝寝坊クライシス\",\"asanegi shouten\":\"麻根木商店\",\"asapi-keikaku.\":\"あさぴ計画。\",\"asatsukimint\":\"アサツキミント\",\"asg-project\":\"ASG-Project\",\"ashanti\":\"アシャンティ\",\"ashi zanmai\":\"あしざんまい\",\"ashibububu\":\"あしぶぶぶ\",\"ashima sandou\":\"芦間山道\",\"ashinoie\":\"あしの家\",\"ashiromance\":\"Ashiromance\",\"ashitakara-ganbaru\":\"あしたから頑張る\",\"ashiya\":\"脚屋\",\"ashly\":\"ashly\",\"ashtray\":\"ASHTRAY\",\"ashuradou\":\"阿修羅堂\",\"ashuraya\":\"阿修羅屋\",\"asianboy\":\"ASIANBOY\",\"asiangirl\":\"ASIANGIRL\",\"ask\":\"ASK\",\"askot\":\"askot\",\"asma\":\"ASMA\",\"asmodeus seiyaku\":\"アスモデウス製薬\",\"asnaronyoichi\":\"あすなろにょいち\",\"asonerikes\":\"アソネリケス\",\"aspara noujou\":\"アスパラ農場\",\"aspergillus\":\"Aspergillus\",\"assaultbeer\":\"アサルトビア\",\"assistreplaytime\":\"A.R.T\",\"asterism\":\"アステリズム\",\"astllatte\":\"アストラッテ\",\"astras\":\"ASTRA'S\",\"astrological sign\":\"Astrological Sign\",\"astronauts alya\":\"アストロノーツ・アリア\",\"astronauts comet\":\"アストロノーツ・コメット\",\"astronomy\":\"ASTRONOMY\",\"asuken\":\"明日軒\",\"asumo koubou\":\"あすも工房\",\"asunaro\":\"ASUNARO\",\"asunaro neat.\":\"Asunaro Neat.\",\"at kenkyuujo\":\"AT研究所\",\"at mousse\":\"あっとむーす\",\"at simapan\":\"@SIMAPAN+\",\"atarime jerky\":\"あたりめジャーキー\",\"atariya kyoushitsu\":\"アタりや教室\",\"atelier bord\":\"Atelier Bord\",\"atelier comet\":\"アトリエコメット\",\"atelier curlicue\":\"Atelier Curlicue\",\"atelier dew\":\"Atelier:Dew\",\"atelier honkijiru\":\"あとりえ本気汁\",\"atelier kaguya cheshirecat\":\"アトリエかぐや CheshireCat\",\"atelier kirara\":\"Atelier Kirara\",\"atelier lepus\":\"あとりえれーぷす\",\"atelier m\":\"アトリエM\",\"atelier sava\":\"アトリエサヴァ\",\"atelier tiv artworks\":\"atelier Tiv artworks\",\"atelier yang\":\"あとりえ・ヤン\",\"atelier-d\":\"atelier-D\",\"atelierkk\":\"あとりえKK\",\"ateliermarl\":\"AtelierMARL\",\"atemonai heya\":\"あてもない部屋\",\"atempo\":\"atempo\",\"aterut\":\"アテレート\",\"ather\":\"エーテル\",\"atkinson\":\"アトキンソン\",\"atmosphere\":\"アトモスフィア\",\"ato nana fun\":\"あと7分\",\"atolier tougenkyou\":\"アトリエ桃源郷\",\"atori akinao\":\"あとり秋尚\",\"atorie rinbou\":\"アトリエ リンボウ\",\"atrip\":\"atrip\",\"ats\":\"ATS\",\"atsd\":\"atSD\",\"atsuatsucook\":\"あつあつCOOK\",\"atsugari giyuugun\":\"あつがり義勇軍\",\"atsuki nettaiya\":\"アつき熱帯夜\",\"attamaro\":\"あったまろ。\",\"attic\":\"ATTIC\",\"attic work space\":\"ATTIC WORK SPACE\",\"au pied\":\"au pied\",\"aug18\":\"aug18\",\"aurelia\":\"オーレリア\",\"auroramix\":\"オーロラミックス\",\"auta moon\":\"あうたむーん\",\"authoring heaven\":\"オーサリングヘヴン\",\"autobahn\":\"Autobahn\",\"automa kikyuu\":\"オートマ気球\",\"autonoe\":\"Autonoe\",\"autoroo\":\"あうとろー\",\"av\":\"サークルAV\",\"avalon\":\"Avalon\",\"avantgarde\":\"AVANTGARDE\",\"avion village\":\"アビオン村\",\"avion village f\":\"アビオン村F\",\"awatsu retsudou\":\"粟津烈堂\",\"ax\":\"あっくす\",\"axis\":\"AXIS\",\"axl\":\"AXL\",\"axolotl\":\"アホロートル\",\"aya pon\":\"あやPON\",\"ayafujii private circle\":\"藤井あや個人サークル\",\"ayamegaoka\":\"文目ヶ丘\",\"ayashige dan\":\"あやしげ団\",\"ayashii ayakashi\":\"アヤシイアヤカシ\",\"ayashii bochi\":\"あやしい墓地\",\"ayashii thigh high ongakutai\":\"怪しいサイハイ音楽隊\",\"ayashii yatsura\":\"あやしいやつら\",\"ayasii hon-ya\":\"あやしい本屋\",\"ayatsuri-doom\":\"​文釣DOOM\",\"ayayabidou\":\"あややび堂\",\"azarashi waltz\":\"あざらしワルツ\",\"azarashisoft\":\"海豹社\",\"azasuke wind\":\"AZASUKE WIND\",\"azcat\":\"azcat\",\"azelye\":\"AzeLye\",\"azi dahaka\":\"アジダハーカ\",\"azksb\":\"あずきそーば。\",\"azmaya\":\"azmaya\",\"aztec theater\":\"Aztec Theater\",\"azuki land\":\"あづきらんど\",\"azuki monaka\":\"あずきもなか\",\"azuki shot\":\"AZUKI SHOT\",\"azuki yougashiten\":\"小豆洋菓子店\",\"azukimanma\":\"あずきまんま\",\"azul\":\"Azul\",\"azuma doujou\":\"東道場\",\"azumaya matsukaze\":\"あずまや松風\",\"azumaya shiten\":\"アズマ屋支店\",\"azure\":\"Azure\",\"azure bekkan\":\"あずれ別館\",\"azure lapis\":\"あずーるらぴす\",\"azurite\":\"Azurite\",\"b kaiman\":\"Bカイマン\",\"b side\":\"B:side\",\"b-bishop\":\"B-bishop\",\"b-crews\":\"Bクルーズ\",\"b-dash jump\":\"B-Dash Jump\",\"b-kyuu kasen\":\"B級河川\",\"b-kyuu site\":\"B級サイト\",\"b-led\":\"B-LED\",\"b-wa\":\"B-wa\",\"b.s.k\":\"B.S.K\",\"b3\":\"B3\",\"b5 doumei\":\"B5同盟\",\"bababalunch\":\"バババランチ\",\"baby replay\":\"ベイビーリプレイ\",\"babybed\":\"ベビーベッド\",\"babylook.net\":\"BabyLook\",\"babymaker\":\"べびーめいかー\",\"babypink\":\"ベイビーピンク\",\"bacchustab\":\"BacchusTAB\",\"backraze\":\"BACKRAZE\",\"backyourluck\":\"ばっくゆあらっく\",\"bad company\":\"ばっどかんぱにー\",\"bad end rst\":\"ばっどえんどRST\",\"bad friend\":\"BAD FRIEND\",\"bad mushrooms\":\"坏茸社\",\"badcore\":\"バッドコア\",\"badis badis\":\"バジスバジス\",\"baguri koubou\":\"馬栗工房\",\"baguri sangyou\":\"馬栗産業\",\"baidou tenpurya\":\"梅洞てんぷりゃー\",\"baka to hasa me\":\"バカトハサミ\",\"bakaitei\":\"馬隗亭\",\"bakemonogakari\":\"ばけものがかり\",\"bakuchi jinsei sp\":\"博打人生SP\",\"bakugeki monkeys\":\"爆撃モンキース\",\"bakuhatsu brs.\":\"ばくはつBRS.\",\"bakuhatsu market\":\"爆発まーけっと\",\"bakunyuu bitch sei\":\"爆乳ビッチ生\",\"bakuretsu shichouson\":\"爆裂市町村\",\"bakushiishi\":\"ばくしぃし\",\"balklash.\":\"バルクラッシュ\",\"banana king\":\"バナナキング\",\"banana no kawa\":\"ばななのかわ\",\"banana saruen\":\"ばななサル園\",\"banana trip\":\"BANANAとりっぷ\",\"bananajam\":\"ばななじゃむ\",\"bananatart\":\"ばななたると\",\"bananer milion\":\"ばななーみりおん\",\"bandit\":\"BANDIT\",\"bang\":\"banG\",\"bangeya\":\"BANGEYA\",\"bannoutumayoujiire\":\"バンノウツマヨウジイレ\",\"banny pop\":\"BANNYぽっぷ\",\"banri no syoujo\":\"万里の少女\",\"bansanchi\":\"ばんさんち\",\"bansankan\":\"バンサンカン\",\"bantendou shoten\":\"卍天堂書店\",\"banubeefriends\":\"BanubeeFriends\",\"banyu\":\"万有\",\"banyuu\":\"万有\",\"baobabu\":\"ばおばぶ\",\"bar modoshiyu\":\"BAR戻し湯\",\"barbaroi no sato\":\"バルバロイの里\",\"barista\":\"バリスタ\",\"barko\":\"Barko\",\"baroque\":\"baroQue\",\"baroqupid\":\"BAROQUPID\",\"bartholin sendan\":\"バルトリン船団\",\"barusan\":\"バルサン\",\"baseson light\":\"BaseSon Light\",\"bash-inc\":\"Bash-inc\",\"basic champions\":\"BASIC CHAMPIONS\",\"basilisk trapezohedron\":\"バジリスクトラペゾヘドロン\",\"baskindam kingdom\":\"バスキンダム王国\",\"batachiki\":\"バタチキ\",\"batchaya\":\"ばっちゃ屋\",\"batsu freak\":\"Batsu freak\",\"batsu jirushi\":\"ばつ印\",\"batten sketch\":\"ばってんスケッチ\",\"bb\":\"BB\",\"bbb\":\"BBB\",\"bbb-extra\":\"BBBえくすとら\",\"bbg\":\"BBG\",\"bbuttondash\":\"BBUTTONDASH\",\"bear tail\":\"べあている\",\"bear-bear\":\"BEAR-BEAR\",\"bears cave\":\"Bear's Cave\",\"beast trail\":\"Beast Trail\",\"beat-pop\":\"BEAT-POP\",\"beats beasts partners\":\"Beats Beasts Partners\",\"beautiful snow\":\"Beautiful Snow\",\"beberoncino sei\":\"ベベロンチーノ星\",\"bect\":\"BECT\",\"bee light\":\"BEe Light\",\"beelzebub\":\"ベルゼブブ\",\"beenyan\":\"び～にゃん\",\"beer bear\":\"BEER BEAR\",\"beer kuzu brothers\":\"ビールクズブラザーズ\",\"behind moon\":\"Behind Moon\",\"beicon\":\"ベイコン\",\"beigon\":\"ベイゴン\",\"bekkoame.\":\"べっこあめ。\",\"bell no su\":\"ベルの巣\",\"bell-da\":\"BELL-DA\",\"belphegor no 39\":\"ベルフェゴールの39\",\"beni\":\"紅-beni-\",\"beni jake soran\":\"紅鮭ソーラン\",\"benichigaya\":\"べにちが屋\",\"benikurage\":\"べにくらげ\",\"benisuzumedo\":\"紅雀堂\",\"beraidot\":\"ベライドット\",\"bergamot\":\"べるがもっと\",\"bergmund\":\"ベルクムント\",\"beropepe\":\"Beropepe\",\"berry 16\":\"Berry!16\",\"berry bagel\":\"BERRY BAGEL\",\"berry lollipop\":\"Berry Lollipop\",\"berserker\":\"バーサーカー\",\"besshun-tei\":\"べっしゅん亭\",\"bhm\":\"BHM\",\"bias factory\":\"バイアスファクトリー\",\"bibasuku\":\"BIBASUKU\",\"bible\":\"ばいぶる\",\"bicho bichodan\":\"びちょびちょ団\",\"bickle\":\"びっくる\",\"bicocattu\":\"Bicocattu\",\"big boss\":\"BIG・BOSS\",\"big gym\":\"BIG GYM\",\"big mama\":\"ビッグママ\",\"big mouse\":\"ビッグマウス\",\"bigfoot no mori\":\"ビッグフットの森\",\"bigwednesday\":\"BigWednesday\",\"bikkuri gyouten\":\"びっくり仰天\",\"bin1production\":\"Bin1production\",\"binatsu\":\"びなつ\",\"binbou noujou\":\"貧乏農場\",\"binbou yusuri\":\"びんぼうゆすり\",\"binbou yusuri express\":\"貧乏ゆすり超特急\",\"bindmix\":\"BindMix\",\"binmalo\":\"ビンマロ\",\"binz studio\":\"Binz Studio\",\"biophile\":\"Biophile\",\"bird forest\":\"Bird Forest\",\"bird joke\":\"バードジョーク\",\"birobon\":\"ビロボン\",\"biroon jr.\":\"びろーんJr.\",\"biroudo kairou\":\"びろうど廻廊\",\"biruban\":\"びるばん\",\"bishamon.\":\"びしゃもん。\",\"bishoujo labo\":\"美少女ラボ\",\"bishoujo netto\":\"美少女ネット\",\"bishoujo suishin iinkai\":\"美少女推進委員会\",\"bismarcho\":\"Bismarcho!\",\"bistro mountain\":\"ビストロマウンテン\",\"bitacos\":\"びっくりたこす\",\"bite\":\"BITE\",\"bitimaru\":\"びちまる\",\"bitmap\":\"ビットマップ\",\"bitmap power\":\"びとまぷぱわー\",\"bitter crown\":\"ビタークラウン\",\"bitter sweet\":\"BITTER SWEET\",\"bitto\":\"∞Bitto\",\"bizensiki roroppu\":\"備前式ロロップ\",\"black and white\":\"Black and White\",\"black angel\":\"ブラックエンゼル\",\"black base\":\"BLACK★BASE\",\"black box\":\"Black Box\",\"black crusher\":\"ブラック・クラッシャー\",\"black cyc\":\"ブラックサイク\",\"black doctor\":\"BLACK DOCTOR\",\"black factory\":\"Black Factory\",\"black force\":\"BLACK FORCE\",\"black light\":\"ブラックライト\",\"black list\":\"Black List\",\"black maria\":\"ブラックマリア\",\"black megane kenkyuujo\":\"ブラックメガネ研究所\",\"black moon\":\"ブラックムーン\",\"black package\":\"ブラックパッケージ\",\"black package try\":\"ブラックパッケージトライ\",\"black panda\":\"BLACK PANDA\",\"black pepper\":\"Black Pepper\",\"black russian\":\"ぶらっく☆ルシアン\",\"black sugar\":\"Black_Sugar(仮)\",\"black thunder\":\"Black thunder\",\"black vinegar\":\"ぶらっくびねがー\",\"blackglobe\":\"BLACKGLOBE\",\"blackrainbow\":\"BLACKRAINBOW\",\"blackwing\":\"ブラックウィング\",\"blade\":\"BLADE\",\"blaze\":\"BLAZE\",\"blazer one\":\"Blazer One\",\"blessing fall\":\"Blessing Fall\",\"blind alley\":\"Blind Alley\",\"blink\":\"blink\",\"blip\":\"BLIP\",\"blitzkrieg\":\"ブリッツクリーク\",\"blood plus blood\":\"ぶらっど+ぶらっど\",\"blood temple\":\"BLOOD TEMPLE\",\"bloodberry\":\"BloodBerry\",\"bloodtype-b\":\"Bloodtype-B\",\"bloody hawk\":\"ブラッディーホーク\",\"bloom factory\":\"BLOOM FACTORY\",\"blossom eight\":\"ブロッサムエイト\",\"blossom sphere\":\"Blossom Sphere\",\"blow\":\"BLOW\",\"blue banana\":\"Blue Banana\",\"blue blood\":\"ブルーブラッド\",\"blue bloods\":\"BLUE BLOOD'S\",\"blue blossom\":\"Blue Blossom\",\"blue catty\":\"BLUE CATTY\",\"blue colors nightmare\":\"ブルウカラアズナイトメア\",\"blue cosmos\":\"BLUE COSMOS\",\"blue crest\":\"Blue Crest\",\"blue devil\":\"Blue Devil\",\"blue drop\":\"Blue Drop\",\"blue frill\":\"ブルーフリル\",\"blue gale\":\"ブルーゲイル\",\"blue gale light\":\"ブルゲLIGHT\",\"blue garnet\":\"BLUE GARNET\",\"blue killer\":\"blue killer\",\"blue metal\":\"ブルーメタル\",\"blue moon\":\"ブルームーン\",\"blue percussion\":\"ブルー・パーカッション\",\"blue shachi\":\"ブルーシャッチー\",\"blue sheets\":\"ブルーシーツ\",\"blue signals\":\"BLUE SIGNALS\",\"blue soaproot\":\"Blue soaproot\",\"blue spark\":\"BLUE★SPARK\",\"blue stardust\":\"blue Stardust\",\"blue topaz\":\"ぶるぅとぱぁず\",\"blue trigger\":\"ブルートリガー\",\"blue wave\":\"BLUE WAVE\",\"blue wind\":\"blue wind\",\"blue-noise\":\"BLUE-NOISE\",\"blue24\":\"BLUE24\",\"bluebrand\":\"BlueBrand\",\"bluebullpen\":\"BlueBullPen\",\"bluelagos\":\"Bluelagos\",\"bluemage\":\"BlueMage\",\"bluemonday\":\"BlueMonday\",\"blueocean\":\"BlueOcean\",\"blueversusred\":\"BlueVersusRed\",\"blume\":\"BLUME\",\"blz maniax\":\"BLZ Maniax\",\"bm dan\":\"BM団\",\"bobcaters\":\"BOBCATERS\",\"bocchi island\":\"ぼっちアイランド\",\"bocchi koubou\":\"ぼっち工房\",\"bodley head\":\"BODLEY HEAD\",\"bofubofu mat\":\"ぼふぼふマット\",\"bohyadam\":\"ボヒャダム\",\"bojorebon\":\"ボジョレボン\",\"bokiya\":\"ぼき屋\",\"bokki oniisan\":\"ぼっきおにいさん\",\"boku\":\"撲\",\"boku-hitori.\":\"ぼくひとり。\",\"bokuhako\":\"BOKUHAKO\",\"bokujin\":\"ボクジン\",\"bokura\":\"ぼくら\",\"bokura gosai\":\"ぼくらごさい\",\"bokura no kajitsu\":\"ボクラノカジツ\",\"bolze.\":\"bolze.\",\"boma -born to be mild-\":\"ボマ！-Born to be Mild-\",\"bon\":\"梵\",\"bonanza\":\"ボナンザ\",\"bonelessham\":\"ボンレスハム\",\"bongaichinyon\":\"ぼんがいちにょん\",\"bonnou honpo\":\"煩悩本舗\",\"bonnou strategy\":\"煩悩ストラテジ\",\"bonnou stream\":\"煩悩ストリーム\",\"bonnoudou\":\"凡悩堂\",\"bonsketch\":\"Bonsketch\",\"boobookid\":\"ブーブーキッド\",\"booch\":\"ぶーち\",\"books takada\":\"BOOKSたかだ\",\"boribiya\":\"ボリビ屋\",\"boroboroya\":\"ぼろぼろ屋\",\"boruboru\":\"ボルボる\",\"borushiti teisyoku\":\"ぼるしち定食\",\"bose no doujin manga kenkyuujo\":\"boseの同人漫画研究所\",\"boshi soukan\":\"母子相姦\",\"boston tea party\":\"ボストン茶会\",\"botamochi no utage\":\"ぼたもちの宴\",\"botanzakura\":\"牡丹桜\",\"botibotiikoka\":\"ぼちぼちいこか\",\"botsuraku kizoku\":\"没落貴族\",\"bottle syrup\":\"ボトルシロップ\",\"bottomress pit\":\"Bottomress Pit\",\"bourgeois ice cream\":\"ブルジョワアイスクリーム\",\"bousou fuhatsudan\":\"暴走！！不発団\",\"bouzen meiden r\":\"呆然乙女R\",\"box\":\"■BOX■\",\"box doll\":\"BOX DOLL\",\"boxbear\":\"BoxBear\",\"boyari.\":\"ぼやり。\",\"boyishsuky\":\"BOYISHSUKY\",\"boys be gakuen\":\"ぼーいずびぃ学園\",\"boys musume.\":\"ボーイズ娘。\",\"bp88\":\"BP88\",\"bpm12\":\"bpm12\",\"bq\":\"BQ\",\"brabustersystem\":\"BraBusterSystem\",\"brand new way\":\"Brand New Way\",\"brand nyu\":\"brand nyu\",\"brave chicken\":\"ぶれいぶちきん\",\"bread and cake\":\"パンとケーキ\",\"bread bread\":\"Bread Bread\",\"breath2\":\"BREATH2\",\"breeze\":\"BREEZE\",\"brief case\":\"Brief case\",\"briest\":\"BRIEST\",\"brilliant thunder\":\"brilliant thunder\",\"bringles\":\"ブリんぐるズ\",\"brio\":\"BRIO\",\"britanian\":\"ぶりたにあん\",\"broad smile\":\"Broad smile\",\"broken world\":\"Broken World\",\"bronco hitoritabi\":\"ブロンコ一人旅\",\"bronze age\":\"BRONZE AGE\",\"brown bunny\":\"BROWNBUNNY\",\"brown sugar\":\"Brown sugar\",\"brownie\":\"ブラウニー\",\"brownstone\":\"brownstone\",\"bubble company\":\"バブルカンパニー\",\"bubble fruit\":\"バブルフルーツ\",\"budou bekkan\":\"ブドウ別館\",\"budou nouen\":\"ぶどう農園\",\"buggeman factory\":\"ブギーマンファクトリー\",\"build-tetsu\":\"ビルドテツ\",\"buji kore ameba\":\"無事これアメーバ\",\"buki to bougu no mise\":\"ぶきとぼうぐのみせ\",\"bullet ballet\":\"Bullet Ballet\",\"bumsign\":\"BUMSIGN\",\"bunbonian\":\"ぶんぼにあん\",\"bunbukudou\":\"ぶんぶく堂\",\"bunchindoh\":\"ぶんちん堂\",\"bungalow\":\"バンガロゥ\",\"bunmei kaika\":\"文明快化\",\"buppa studio\":\"ブッパスタジオ\",\"burakuradou\":\"ブラクラ堂\",\"buranko shinshi\":\"ブランコ紳士\",\"buri daikon\":\"ぶり大根\",\"buriburi nyanya\":\"ぶりぶりにゃにゃ\",\"buriki daiou\":\"武力大王\",\"burikichoco\":\"ブリキチョコ\",\"burisuta\":\"ブリスタ\",\"burning hammer\":\"バーニングハンマー\",\"burning sisters\":\"バーニング姉妹\",\"burning soul\":\"バーニンソウル\",\"bushi\":\"節\",\"bushiteki tamashii\":\"武士的魂\",\"busou megami\":\"武装女神\",\"busou yousei\":\"武装妖精\",\"bust emperor\":\"バストエンペラル\",\"buta no bucket\":\"豚のバケツ\",\"buta no hidume\":\"ぶたのひづめ\",\"butagoya dot com\":\"豚小屋.com\",\"butano\":\"ぶたの\",\"butazuraya seinikuten\":\"豚面屋精肉店\",\"butsuri hansha club\":\"物理反射倶楽部\",\"butter cookie\":\"ばたあくっきい\",\"butterfly dream\":\"Butterfly Dream\",\"buttyakedo\":\"ぶっちゃけ堂\",\"buzzer\":\"BUZZER\",\"bv31.5\":\"BV31.5\",\"bye-be\":\"Bye-Be\",\"byougatei\":\"猫画亭\",\"byunbyunhouse\":\"びゅんびゅんはうす\",\"c equal\":\"C=equal\",\"c-arts\":\"C-ARTS\",\"c-company\":\"C-COMPANY\",\"c-line\":\"C-線上\",\"c-rex\":\"C-Rex\",\"c-type\":\"C-type\",\"c.\":\"C.\",\"c.a.t\":\"C・A・T\",\"c.cpu\":\"C.CPU\",\"c.h.a.r.i.o.t\":\"C.H.A.R.I.O.T\",\"c.m.\":\"C.M.\",\"c.n.p\":\"C.N.P\",\"c.o.2\":\"C.O.2\",\"c.r.c\":\"C・R・C\",\"c.s.\":\"C.S.\",\"c.www\":\"C.www\",\"c.y.room\":\"C.Y.roOm\",\"c3h8o3\":\"C3H8O3\",\"c8\":\"C8\",\"c9sou\":\"c9sou\",\"ca.d.d\":\"C：／／A.D.D／\",\"cabbage box\":\"キャベツBOX\",\"cabbage soft\":\"きゃべつそふと\",\"cabbit\":\"Cabbit\",\"caburibbon\":\"caburibbon\",\"cacao\":\"カカオ\",\"cactus\":\"Cactus\",\"cafe atagawa\":\"カフェあたがわ\",\"cafe unlimited\":\"カフェ・アンリミテッド\",\"cafe-hotcocoa.\":\"cafe-hotcocoa.\",\"cafeteria watermelon\":\"カフェテリアWATERMELON\",\"caffeine\":\"Caffeine\",\"cage\":\"CAGE\",\"cahlacahla\":\"CAHLACAHLA\",\"caipirinha\":\"caipirinha\",\"cake maker\":\"cake maker\",\"cake-hitokire\":\"ケーキひと切れ\",\"caligula\":\"カリギュラ\",\"calmblue\":\"CalmBlue\",\"calmboy.com\":\"カームボーイドットコム\",\"calme\":\"calme\",\"calorie off\":\"カロリーオフ\",\"calpara-shed\":\"calpara-shed\",\"calpis koubou\":\"カルピス工房\",\"cambropachycope\":\"カンブロパキコーペ\",\"camp.\":\"カンプ。\",\"campanula\":\"campanula\",\"campers\":\"きゃんぱーず\",\"camrism\":\"カムリズム\",\"can do now\":\"キャンドゥーなう!\",\"canaria\":\"canaria\",\"canary to tsubame\":\"カナリアとつばめ\",\"candy pop\":\"Candy Pop\",\"candy-ya\":\"キャンディー屋\",\"candyman\":\"Candyman\",\"canopus\":\"Canopus\",\"canzume quality\":\"かんづめクオリティ\",\"cao\":\"CaO\",\"capital one\":\"きゃぴたるわん\",\"caplet0.5\":\"caplet0.5\",\"captain santa\":\"Captain SANTA\",\"caramel colors\":\"カラメルシキソ\",\"caramel mamire\":\"カラメルマミレ\",\"caramel soft\":\"キャラメルソフト\",\"caramel yarou\":\"キャラメル野郎\",\"carbonate\":\"carbonate\",\"carburetor\":\"キャブレター\",\"carnage engine\":\"カルネージエンジン\",\"carnelian\":\"CARNELIAN\",\"carnevale9\":\"CARNEVALE9\",\"carol works\":\"Carol Works\",\"carpaccio\":\"カルパッチョ\",\"carrot\":\"きゃろっと\",\"carrot academy\":\"キャロットアカデミー\",\"carrot caramel batake\":\"きゃろっときゃらめる畑\",\"carrot works\":\"きゃろっとワークス\",\"caryo\":\"CARYO\",\"cascade\":\"CASCADE\",\"casket\":\"Casket\",\"casmania\":\"CASMANIA\",\"cassis\":\"CassiS\",\"castella tamago\":\"カステラたまご\",\"castle.m\":\"castle.m\",\"cat and me\":\"Cat&me\",\"cat food\":\"Cat FooD\",\"cat run\":\"Cat Run\",\"cat scratch\":\"CAT scratch\",\"cat tower\":\"きゃっと★たわぁー\",\"catastrophe.\":\"catastrophe.\",\"catcher in the rye\":\"Catcher in the Rye\",\"catchers mitt of silver\":\"銀のキャッチャーミット\",\"catjellyfish\":\"CatJellyFish\",\"catmask\":\"catmask\",\"cats-box\":\"cats-box\",\"cattleya\":\"CATTLEYA\",\"catwalknero\":\"catwalkNERO\",\"cauldron\":\"Cauldron\",\"causciant\":\"かうすしあん\",\"caution\":\"かうじょん\",\"caza mayor\":\"CAZA MAYOR\",\"cc\":\"cc\",\"ccb-elo\":\"ccb-ELO\",\"cdd\":\"CDD\",\"cdpa\":\"CDPA\",\"cecile fan club\":\"セシールファン倶楽部\",\"celeste69\":\"チェレステロック\",\"celica\":\"CELICA\",\"celluloid brothers\":\"セルロイド・ブラザーズ\",\"celluloid-acme\":\"CELLULOID-ACME\",\"celsius\":\"Celsius\",\"cemetery\":\"CEMETERY\",\"censored\":\"censored\",\"cent millibar\":\"¢mb\",\"centaurea cyanus\":\"Centaurea cyanus\",\"center of universe\":\"Center Of Universe\",\"center.village\":\"CENTER.VILLAGE\",\"ceramic heart\":\"セラミックハート\",\"ceremonica\":\"ceremonica\",\"cesalion\":\"シザリオン\",\"cesium-p\":\"セシウムP\",\"cha cha cha brothers\":\"ちゃちゃちゃぶらざーず\",\"chabanchabancha\":\"茶番茶番茶\",\"chabane ninja\":\"ちゃばねにんじゃ\",\"chacha batake.\":\"茶々畑。\",\"chahan\":\"ちゃーはん\",\"chaihazuki\":\"チャイハヅキ\",\"chain reaction\":\"チェーン リアクション\",\"chaingang\":\"CHAINGANG\",\"chakku hankai\":\"チャック半開\",\"chakui\":\"着衣\",\"champagnegold\":\"シャンパンゴールド\",\"champloo\":\"ちゃんぷるー\",\"chandora\":\"ちゃんどら\",\"chanko nabe\":\"ちゃんこ鍋\",\"channel ubai\":\"チャンネル奪\",\"chanpurux\":\"チャンプルX\",\"chantilly\":\"chantilly\",\"chaoizum\":\"ちゃおいずむ\",\"chaos shoujo no mise\":\"カオス少女の店\",\"chaos-graphixxx\":\"chaos-graphixxx\",\"chaos-l\":\"CHAOS-L\",\"chaotic otome studio\":\"カオティック乙女工房\",\"chaotic wolf\":\"Chaotic Wolf\",\"chapedizo\":\"ちゃぺでぃぞ\",\"chaps\":\"チャップス\",\"charan poran\":\"CHARAN PORAN\",\"charinko fox\":\"チャリンコ狐\",\"charis\":\"CHARIS\",\"charisma serve\":\"カリスマサーブ\",\"charme\":\"Charme\",\"charveltiger\":\"シャーベルタイガー\",\"chateau dassault\":\"シャトーダッソー\",\"cheapseek\":\"cheapseek\",\"check mate\":\"Check Mate!\",\"cheese company\":\"チーズカンパニー\",\"cheese takoyaki\":\"チーズたこ焼き\",\"chelsea lip\":\"Chelsea lip\",\"chemi-story\":\"Chemi-Story\",\"chemical itoh\":\"ケミカル伊藤\",\"chemical janky\":\"Chemical Janky\",\"cherokee\":\"CHEROKEE\",\"cherry baron\":\"cherry baron\",\"cherry blossom\":\"チェリーブロッサム\",\"cherry bomb g\":\"チェリーボムG\",\"cherry milk\":\"cherry milk\",\"cherry moon\":\"チェリームーン\",\"cherry pepper\":\"cherry*pepper\",\"cherry snow\":\"ちぇり☆すの\",\"cherry soft\":\"ちぇりーそふと\",\"chest box\":\"ちぇすとぼっくす\",\"chested\":\"chested\",\"chestnut tree\":\"chestnut tree\",\"chibineco honpo\":\"ちびねこ本舗\",\"chicchi bokujou\":\"チッチ牧場\",\"chichai mono club\":\"ちっちゃい物クラブ\",\"chichi mafia\":\"乳マフィア\",\"chichikemo\":\"ちちけも\",\"chick tack bon\":\"ちくたくぼん\",\"chicken nugget gyuuniku aji\":\"チキンナゲット牛肉味\",\"chicken union\":\"ちきんゆにおん\",\"chicken zombies\":\"chicken zombies\",\"chicropokke\":\"チクロポッケ\",\"chideji\":\"チデヂ\",\"chidoriashi\":\"千鳥足\",\"chiduru grind\":\"チヅルグラインド\",\"chie no genseki\":\"知恵の原石\",\"chien\":\"シアン\",\"chiffon\":\"Chiffon\",\"chigen torino\":\"違んTORINO\",\"chigiri-ke\":\"ちぎり家\",\"chigo dou\":\"チーゴ堂\",\"chigoku no icchoume\":\"痴獄の一丁目\",\"chiguraya\":\"ちぐら屋\",\"chigusaya\":\"千草屋\",\"chihagura\":\"ちはぐら\",\"chihiro lanting\":\"千仞蘭庭\",\"chii sanchi\":\"ちい産地\",\"chiisana kagi\":\"小さな鍵\",\"chika kenkyuujo\":\"地下研究所\",\"chikadoh\":\"地下堂\",\"chikashitsu\":\"地下室\",\"chikirazu\":\"チキラーズ\",\"chikiuya\":\"ちきう屋\",\"chiko goya\":\"Limited\",\"chikoku doumei\":\"遅刻同盟\",\"chikoku penpen\":\"遅刻ペンペン\",\"chikomayoya\":\"ちこまよや\",\"chikotsu mania\":\"恥骨マニア\",\"chikutakudoh\":\"ちくたく堂\",\"chikuwa\":\"ちくわ\",\"chikuwa drop\":\"ちくわドロップ\",\"chikuwanko\":\"ちくわんこ\",\"chikuwano kimochi\":\"ちくわの気持ち\",\"childwife\":\"childwife\",\"chill-out\":\"Chill-Out\",\"chilukuni\":\"散る国\",\"chimamire yashiki\":\"血まみれ屋敷\",\"chimatsuriya honpo\":\"血祭屋本舗\",\"chime\":\"ちゃいむ\",\"chimeishou\":\"致命傷\",\"chimere marie\":\"chimere/marie\",\"chimple hotters\":\"チンプルホッターズ\",\"chimple island\":\"チンプル愛☆ランド\",\"chimuya\":\"ちむ屋\",\"chin soudou\":\"珍騒動\",\"chin-up\":\"CHIN-UP\",\"chinasanchi\":\"ちゃいなさんち\",\"chinchintei\":\"ちんちん亭\",\"chinjuu mufy\":\"珍獣ムフィ\",\"chinpudo\":\"珍譜堂\",\"chinshieden\":\"靜雪殿\",\"chinzuri bop\":\"Chinzuri Bop\",\"chips\":\"CHIPS\",\"chiriakuta\":\"塵芥\",\"chirigami goya\":\"ちり紙小屋\",\"chirimen studio\":\"ちりめんすたじお\",\"chirimenjako\":\"ちり綿じゃこ\",\"chirimozuku cha\":\"チリモズク茶\",\"chidorinu\":\"チドリヌ\",\"chirorura\":\"ちろるら\",\"chise\":\"千世\",\"chiukorone\":\"ちうころね\",\"chizakiya\":\"ちざき屋\",\"chloroplast\":\"くろろぷらすと\",\"cho-jin hakaba\":\"超人墓場\",\"choco biscuits\":\"ちょこ★びすけっつ\",\"choco box\":\"choco BOX\",\"choco croissant\":\"チョコクロワッサン\",\"choco zakura\":\"ちょこざくら\",\"choco-banana\":\"ちょこばなな。\",\"chocobits\":\"Chocobits\",\"chococroissants\":\"チョコクロワッサン\",\"chocoholic\":\"chocoholic\",\"chocolat\":\"しょこら～と!\",\"chocolate addiction\":\"Chocolate Addiction\",\"chocolate banana ou lait\":\"ちょこれーとバナナ・オレ\",\"chocolate jam\":\"ちょこれぃとじゃむ\",\"chocolate lily\":\"ちょこりり\",\"chocolate lv.5\":\"chocolate Lv.5\",\"chocolate macaron\":\"チョコレートマカロン\",\"chocolate pepper.\":\"Chocolate Pepper.\",\"chocolate shop\":\"チョコレート・ショップ\",\"chocomoka\":\"ちょこもか\",\"chocotan mogumogu\":\"チョコタンもぐもぐ\",\"chokie\":\"chokie\",\"chokomonetto\":\"ちょこもねっと\",\"chokudoukan\":\"直道館\",\"chokusen ikki\":\"直線一気\",\"chonmage teikoku\":\"丁髷帝国\",\"chori\":\"chori\",\"chotto dake yanke\":\"ちょっとだけやんけ\",\"chotto h gallery\":\"ちょっとHギャラリー\",\"chou a la creme\":\"chou à la crème\",\"chou chemical gakuen z\":\"超ケミカル学園Z\",\"chou mm bekkan\":\"超MM別館\",\"chou project\":\"超プロジェクト\",\"chou the taizenkutsu\":\"超THE体前屈\",\"chou yutori kyouiku\":\"超ゆとり教育\",\"choukyori dandou keisan\":\"长距离弹道计算\",\"choushizen kenkyuujo\":\"超自然研究所\",\"christmas\":\"クリスマス\",\"chroma of wall\":\"壁の彩度\",\"chromaticclip\":\"ChromaticClip\",\"chronicle\":\"くろにくる\",\"chrono mail\":\"クロノ・メール\",\"chrronix\":\"Chrronix\",\"chukara coffee\":\"中辛珈琲\",\"chunhaikan\":\"中海館\",\"chupa chupa ya\":\"ちゅぱちゅぱ屋\",\"chuu ni no kaori\":\"中二のかおり\",\"chuugakukan\":\"中学館\",\"chuuka hanten\":\"ちゅうか飯店\",\"chuuka mantou\":\"中華饅頭\",\"chuuni byoutou\":\"厨二病棟\",\"chuusei mafuman\":\"中性まふまん♀\",\"chuutohanpa man\":\"中途半端マン\",\"ciaociao\":\"ciaociao\",\"cicada\":\"CICADA\",\"ciel\":\"Ciel\",\"cinderella complex\":\"Cinderella Complex\",\"cinnamon cigar\":\"Cinnamon Cigar\",\"cior\":\"Cior\",\"cipher\":\"裁羽\",\"circle 1 gou\":\"サークル1号\",\"circle a\":\"Circle A\",\"anastasia\":\"Anastasia\",\"circle anco\":\"サークルアンコ\",\"circle b.c.a.\":\"サークルB.C.A.\",\"circle baku\":\"サークル獏\",\"circle bob\":\"サークルボブ\",\"circle credit\":\"サークルくれじっと\",\"circle daiinma\":\"サークル大淫魔\",\"circle damesimai\":\"サークル駄目姉妹\",\"circle dare\":\"サークル誰?\",\"circle energy\":\"サークルENERGY\",\"circle enzin\":\"サークルENZIN\",\"circle fairy flower\":\"サークル☆フェアリーフラワー\",\"circle foundation\":\"CIRCLE FOUNDATION\",\"circle ggm\":\"サークルGGM\",\"circle hcm\":\"サークルHCM\",\"circle hitori\":\"サークルひとり\",\"circle huxian\":\"サークル狐仙\",\"circle itaku\":\"サークルイタク\",\"circle itomagoi\":\"サークル暇乞い\",\"circle iwaodou\":\"サークル岩尾堂\",\"circle kgb\":\"サークルKGB\",\"circle king\":\"サークルきんぐ\",\"circle kotatubuton\":\"サークルこたつぶとん\",\"circle meimitei\":\"サークル冥魅亭\",\"circle msm\":\"サークルMSM\",\"circle nekome\":\"サークルねこめ\",\"circle nnn\":\"サークルN･N･N\",\"circle nuruma-ya\":\"サークルぬるま屋\",\"circle of kenkyo\":\"サークルオブ謙虚\",\"circle op\":\"circle OP\",\"circle outerworld\":\"サークルOUTER WORLD\",\"circle plum\":\"サークルぷらむ\",\"circle rachigai\":\"サークル埒外\",\"circle rindou\":\"さーくるりんどー\",\"circle shakunetsu\":\"サークル灼熱\",\"circle sigma\":\"Circle Σ\",\"circle six\":\"circle six\",\"slave\":\"SLAVE\",\"circle spice\":\"さーくるスパイス\",\"circle streak\":\"CIRCLE STREAK\",\"tintin\":\"TinTin\",\"circle trident\":\"Circle Trident\",\"circle yaranaika\":\"サークルやらないか\",\"circle yubokumin\":\"サークル遊牧民\",\"circle yuki\":\"サークルゆき\",\"circle den\":\"田\",\"circled 1\":\"①\",\"circus\":\"サーカス\",\"circus fetish\":\"サーカス・フェティッシュ\",\"citron\":\"CITRON\",\"citron love\":\"CITRON LOVE\",\"citron tree\":\"citron tree\",\"citrus\":\"Citrus\",\"city forest\":\"City Forest\",\"ciz\":\"CIZ!!\",\"cla cla clala\":\"Cla Cla Clala\",\"clammbon\":\"クラムボン\",\"clara soap\":\"クララソープ\",\"classic orange\":\"Classic Orange\",\"cle2700\":\"cle2700\",\"clean up\":\"CLEAN UP\",\"cleanliness.\":\"cleanliness\",\"clear glass\":\"Clear Glass\",\"clearbook\":\"ClearBook\",\"clione house\":\"くりおねハウス\",\"clip\":\"くりっぷ\",\"clipline\":\"クリップライン\",\"clipper\":\"CLiPPER\",\"clock\":\"CLOCK\",\"clodia\":\"CLODIA\",\"close heart\":\"CLOSE HEART\",\"cloud nine\":\"雲9\",\"cloud noise\":\"クラウドノイズ\",\"cloud palette\":\"Cloud Palette\",\"cloudair\":\"cloudair\",\"cloudy\":\"くらうでぃ\",\"clover\":\"CLOVER\",\"clover kai\":\"くろーヴァー会\",\"clownculture\":\"ClownCulture\",\"club bacteria\":\"クラブ・バクテリア\",\"club dark-shadow\":\"CLUB Dark-Shadow\",\"club-z\":\"CLUB-Z\",\"club54\":\"club54\",\"clubmatt\":\"clubmatt\",\"cluster\":\"くらすたぁ\",\"clutch shot king\":\"CLUTCH SHOT KING\",\"clymenia\":\"クリメニア\",\"cnc\":\"CNC\",\"cobrano\":\"こぶらの\",\"coburamenman\":\"コブラーメンマン\",\"cocca\":\"cocca\",\"coccinelle\":\"coccinelle\",\"cock-a-doodle-doo\":\"Cock-a-Doodle-Doo\",\"cocktail soft\":\"カクテル・ソフト\",\"coco\":\"COCO\",\"cocoa break\":\"COCOA BREAK\",\"cocoloco note\":\"CoCoLoCo☆Note\",\"cocon\":\"cocon!\",\"coconutbless\":\"ココナッツブレス\",\"cocoon\":\"cocoon\",\"cocotto\":\"cocotto\",\"cocytusgarden\":\"CocytusGarden\",\"codeine girl\":\"コデインガール\",\"coffee chazuke\":\"珈琲茶漬け\",\"coffee curry\":\"コーヒーカレー\",\"coffee maker\":\"こーひーめーかー\",\"cokot\":\"cokot\",\"cola bolt\":\"コーラーボルト\",\"colette\":\"Colette\",\"coli-chu\":\"coli厨\",\"colobocs\":\"CoLoBoCs\",\"color art\":\"Color art\",\"color hiyoko dousoukai\":\"カラーひよこ同窓会\",\"color-staining\":\"COLOR-STAINING\",\"colosseum\":\"コロセウム\",\"colour and shape\":\"からーあんどしぇいぷ\",\"colt\":\"Colt\",\"colt-run\":\"こるとらん\",\"combat mon-mon\":\"コンバットモンモン\",\"comic empire\":\"コミックエンパイア\",\"comic kingdom\":\"コミックキングダム\",\"command plus z\":\"Command+Z\",\"commanding eagle\":\"Commanding Eagle\",\"commando\":\"コマンドー\",\"commelina\":\"Commelina\",\"comomo\":\"COMOMO\",\"compact software\":\"Compact Software\",\"complete box\":\"コンプリートボックス\",\"complets\":\"コンプリーツ\",\"complex\":\"COMPLEX\",\"concerto\":\"コンチェルト\",\"concrete river\":\"CONCRETE RIVER\",\"coneco house\":\"こねこはうすー\",\"confiture soft\":\"コンフィチュールソフト\",\"consava\":\"こんさば\",\"contamination\":\"こんたみねーしょん\",\"convallo-stick\":\"Convallo-stick\",\"cool brain\":\"COOL BRAIN\",\"cool kyou dai san shibu\":\"クール教第三支部\",\"cool palace\":\"Cool Palace\",\"cool sister\":\"く～るシスター\",\"coolheadwarmheart\":\"CoolHeadWarmHeart\",\"coonelius\":\"くーねりあす\",\"coopy\":\"coopy\",\"copen\":\"こぺん\",\"copin\":\"Copin\",\"copo deluxe\":\"こぽDELUXE\",\"coral reef\":\"コーラルリーフ\",\"corkbox\":\"コルクBOX\",\"coronach\":\"カラナック\",\"cosmic cute\":\"COSMIC CUTE\",\"cothurnus\":\"Cothurnus\",\"cotojikan\":\"琴慈館\",\"cottage\":\"cottage\",\"cotton candy\":\"Cotton Candy\",\"cotton color\":\"コットンカラー\",\"cotton house\":\"こっとん堂\",\"cotton pop\":\"Cotton Pop\",\"cottontail\":\"cottontail\",\"countack\":\"カウンタック\",\"counter attack\":\"COUNTER ATTACK\",\"counter-censorship\":\"COUNTER-CENSORSHIP\",\"counterparts\":\"COUNTERPARTS\",\"countryside\":\"countryside\",\"courmet-nyankichi\":\"くるめにゃん吉\",\"courreges accel\":\"クレージュアクセル\",\"covare\":\"covare\",\"cow lipid\":\"Cow Lipid\",\"cozybowl\":\"cozybowl\",\"cpi\":\"cpi\",\"craft\":\"CRAFT\",\"craft-gear\":\"CRAFT-GEAR\",\"craftworks\":\"CraftWorks\",\"crank.in\":\"クランク・イン\",\"crash tv\":\"CRASH TV\",\"crayon arts\":\"くれよんあーつ\",\"crayon48\":\"くれよん48\",\"crazy alicetale\":\"Crazy Alicetale\",\"crazy clover club\":\"CRAZY CLOVER CLUB\",\"crazy comedian\":\"クレイジーコメディアン\",\"crazyregion\":\"crazyregion\",\"crea-holic\":\"Crea-Holic\",\"cream cider\":\"くりぃむサイダー\",\"cream gallon\":\"くりーむがろん\",\"cream zenzai\":\"くりいむぜんざい\",\"creamy cafe\":\"Creamy Cafe\",\"crear mint\":\"CREAR★MINT\",\"crepe\":\"Crepe\",\"crimson\":\"クリムゾン\",\"crimson crown\":\"Crimson CROWN\",\"crimson ground\":\"CRIMSON GROUND\",\"crimson kantai\":\"クリムゾン艦隊\",\"crips\":\"Crips\",\"critical hit\":\"くりてぃかるひぅと\",\"crocodile-ave.\":\"CROCODILE-Ave.\",\"cronus\":\"Cronus\",\"crooked navel\":\"Crooked Navel\",\"cross down\":\"CROSS DOWN\",\"cross fire\":\"CROSS FIRE\",\"cross hearts\":\"CROSS HEARTS\",\"cross place\":\"CROSS PLACE\",\"cross talk\":\"Cross Talk\",\"cross-do\":\"黒酢堂\",\"crossco switch\":\"くろすこスイッチ\",\"crossnet\":\"クロスネット\",\"crossover\":\"CROSSOVER\",\"crossray\":\"crossray\",\"crotch\":\"Crotch\",\"crowclock\":\"crowclock\",\"crown brigade\":\"CROWN BRIGADE\",\"crowview\":\"CrowView\",\"cryptid\":\"cryptid\",\"crystal capricorn\":\"Crystal Capricorn\",\"crystal shoujo\":\"クリスタル少女\",\"crystal strawberry\":\"硝子の苺\",\"crystal tower\":\"クリスタルタワー\",\"crystalia\":\"CRYSTALiA\",\"cshouse\":\"しーずはうす\",\"ctn\":\"クリスチーネ\",\"cube sugar\":\"Cube Sugar\",\"cubic\":\"Cubic\",\"cuffs\":\"Cuffs\",\"cuniculus\":\"CUNICULUS\",\"cupi\":\"キュピ\",\"cupid ice\":\"キューピッドアイス\",\"curefull base\":\"Curefull Base\",\"curiocity\":\"Curiocity\",\"current storage\":\"Current Storage\",\"cursor\":\"カーソル\",\"curtain wall no ie\":\"カーテンウォールの家\",\"custardragon\":\"Custardragon\",\"custom\":\"くすとむ\",\"cut a dash\":\"CUT A DASH!!\",\"cut works publishing\":\"Cut Works Publishing\",\"cute\":\"Cute\",\"cute bilibili\":\"キュートビリビリ\",\"cvl launching pad\":\"CVL発射台\",\"cyanos\":\"CYANOS\",\"cyber ark\":\"CYBER ARK\",\"cyber f\":\"Cyber F\",\"cyber manga doujou\":\"サイバー☆マンガ道場\",\"cyber sakura\":\"サイバー桜\",\"cyberangel\":\"CYBERANGEL\",\"cyborg hum\":\"サイボーグハム\",\"cyc\":\"Cyc\",\"cyc no-nos\":\"サイクノノス\",\"cyclet\":\"CYCLET\",\"cyclo-\":\"Cyclo-\",\"cyclone\":\"サイクロン\",\"cyduster\":\"CYDUSTER\",\"cykranosh\":\"さいくらの〜しゅ\",\"cynthia\":\"Cynthia\",\"cytokine\":\"CYTOKINE\",\"cz\":\"CZ\",\"d-baird\":\"D-Baird\",\"d-dkd\":\"D-DKD\",\"d-heaven\":\"D-heaven\",\"d-ivision\":\"D-ivision\",\"d-lovers\":\"D-LOVERS\",\"d-march\":\"D-MARCH\",\"d-point\":\"D-Point!\",\"d-ten\":\"D-TEN\",\"d.a.p\":\"d.a.p\",\"d.h\":\"D.H\",\"d.o.\":\"ディーオー\",\"d2 algorithm\":\"D2 Algorithm\",\"dadachamame\":\"だだちゃまめ\",\"daddymulk\":\"DADDYMULK\",\"dagashiya\":\"駄菓子屋\",\"dai 13 kantai\":\"第13艦隊\",\"dai 3 no shippo\":\"だい③のしっぽ\",\"dai 46 kishidan\":\"第46騎士団\",\"dai n honpo\":\"第N本舗\",\"dai ninja teikoku\":\"大忍者帝国\",\"dai nippon kodomo shuppan\":\"大日本子供出版\",\"dai-l studio\":\"第Lスタジオ\",\"daidai koubou\":\"大々工房\",\"daidaido\":\"橙堂\",\"daidaros\":\"ダイだろす\",\"daidenjin koubou\":\"大電人工房\",\"daiginjou masshigura\":\"大吟醸まっしぐら\",\"daiichi denshi\":\"第一電子\",\"daiichi yutakasou\":\"第壱ユタカ荘\",\"daiji na koto wa nikai mo iwanai\":\"大事なことは二回も言わない\",\"daijobi kenkyuujo\":\"ダイジョビ研究所\",\"daikichi-ya\":\"だいきち屋\",\"daikonya sanchoume\":\"大根屋三丁目\",\"daini hokenshitsu\":\"ダイニホケンシツ\",\"dainichakai\":\"第二茶会\",\"dainyu dougumo\":\"代入道雲\",\"dairiseki\":\"大理石\",\"daisaku no iru circle\":\"大作のいるサークル\",\"daisan shinsekai\":\"第三新世界\",\"daisy chain\":\"デイジーチェイン\",\"daitokei\":\"大刀契\",\"daitoutaku\":\"大董卓\",\"daiznosusume\":\"だいずのススメ\",\"daizu azuki\":\"大豆小豆\",\"daizuya\":\"だいず屋\",\"dakashiya oroshi\":\"堕菓子屋卸\",\"daken nanban\":\"駄犬南蛮\",\"dakuhan\":\"だくはん\",\"dall\":\"DALL\",\"dam labo\":\"だむlabo\",\"damage honpo\":\"ダメージ本舗\",\"damaguro\":\"だまぐろ\",\"dame project\":\"DAMe project\",\"damedungeon\":\"DameDungeon\",\"damn bomb\":\"だむぼむ\",\"danball man\":\"ダンボールまん\",\"danball mansion\":\"ダンボールマンション\",\"dancing cat\":\"ダンシングキャット\",\"dandan chinjufu\":\"弾々鎮守府\",\"dandandadan\":\"段々打団\",\"dandelion\":\"だんでらいおん\",\"dandy lonely cherry\":\"Dandy Lonely Cherry\",\"dandy skip\":\"だんでぃすきっぷ\",\"danekoya gunekodou\":\"駄猫屋愚猫堂\",\"dangan densetsu\":\"弾丸伝説\",\"dangan honey\":\"弾丸ハニィ\",\"dange\":\"談華\",\"danger equals zone\":\"DANGER=ZONE\",\"dangerous charms\":\"デンジャラス・チャームス\",\"dangoya\":\"DANGOYA\",\"danikuya-san\":\"駄肉家さん\",\"dankon no sato\":\"男根の里\",\"danna\":\"ダンナ\",\"dannoura\":\"壇ノ浦\",\"dansei clear gadget\":\"弾性クリアガジェット\",\"danshaku ryou\":\"男爵領\",\"dantyo neko\":\"だんちょねこ\",\"danzi engine\":\"ダンジエンジン\",\"darabuchidou\":\"だらぶち堂\",\"daradara no kiheitai\":\"だらだらの騎兵隊\",\"dark battery\":\"Dark battery\",\"dark buta gorilla\":\"ダーク・ブタゴリラ\",\"dark cherish\":\"Dark Cherish\",\"dark crimson\":\"Dark Crimson\",\"dark force\":\"suzuki shinobu\",\"dark roseex-s\":\"Dark RoseEX-S\",\"dark side\":\"ダークサイド\",\"dark spirit\":\"だーくすぴりっと\",\"dark water\":\"Dark Water\",\"dark zone\":\"ダーク・ゾーン\",\"darmax\":\"DARMAX\",\"darumasan koronda\":\"達磨さん転んだ\",\"dashigara 100\":\"ダシガラ100%\",\"dashimakitamago\":\"DASHIMAKITAMAGO\",\"dashinoko\":\"だしの粉\",\"dashiotto\":\"だしおっと\",\"dass\":\"DASS\",\"date wa gorgeous ni\":\"デートはゴージャスに\",\"dateline\":\"デートライン\",\"datendou\":\"堕天堂\",\"daylight\":\"デイライト\",\"db-soft\":\"デービーソフト\",\"dbh\":\"DBH\",\"ddal84\":\"DDAL84\",\"ddt\":\"DDT\",\"dead angle\":\"デッドアングル\",\"dead ranker\":\"Dead Ranker\",\"deadnoodles\":\"Deadnoodles\",\"dear\":\"Dear\",\"dear durandal\":\"Dear Durandal\",\"dear life\":\"DEAR LIFE\",\"deardeer\":\"でぃあでぃあ\",\"dearmyfriends\":\"DearMyFriends\",\"death dolls\":\"Death Dolls\",\"death presso\":\"デスプレッソ\",\"deathgaze-system\":\"deathgaze-system\",\"debagame daisoujou\":\"出歯亀大僧正\",\"debodebodan\":\"でボでボ団\",\"debonosu works\":\"でぼの巣製作所\",\"december-girl\":\"December-Girl\",\"dedepoppo\":\"ででぽっぽ\",\"deed\":\"DEED\",\"deeeepforest\":\"DeeeePforest\",\"def cats\":\"DEF CATS\",\"def999\":\"DEF999\",\"degicat\":\"デジキャット\",\"deisui oukoku\":\"泥酔桜国\",\"dejavu\":\"Dejavu\",\"dejikago\":\"でじかご\",\"dekiai shinkou\":\"溺愛信仰\",\"dekoboko furniture\":\"凸凹ファニチャー\",\"dekoponzu\":\"でこぽんず\",\"dekosenn titai\":\"デコ戦地帯\",\"delayder\":\"でぃれ～だー\",\"delica\":\"Delica\",\"delta\":\"DELTA\",\"delta blade\":\"デルタブレード\",\"delta box\":\"DELTA BOX\",\"deltaforce\":\"DELTAFORCE\",\"delusion\":\"でるしおん\",\"dende\":\"でんで\",\"denden\":\"電電\",\"denden-dou\":\"電伝導\",\"dengenoff\":\"電源OFF\",\"denji yuudou\":\"電磁誘導\",\"denjin\":\"電神\",\"denki biribiri\":\"電気びりびり\",\"denki orange\":\"電気おれんじ\",\"denkishiki\":\"電気式\",\"dennou chocolate\":\"電脳ちょこれーと\",\"dennou denpa hatsureisho\":\"電脳電波発令所\",\"dennou fuyu mikan\":\"電脳冬蜜柑\",\"dennou yamasakigumi\":\"電脳山咲組\",\"dennougiwa\":\"電脳戯話\",\"denpa anshitsu\":\"電波暗室\",\"denpa tsuushin\":\"デンパツーシン\",\"denpa yunyun\":\"電波ゆんゆん\",\"denpaesidan\":\"電派絵師団\",\"derashine can\":\"でらしね缶\",\"derashobokai\":\"でらしょぼ会\",\"deresuke syuppan\":\"でれすけ出版\",\"derlanger\":\"D'ERLANGER\",\"derolian\":\"デロリアン\",\"desafinado\":\"desafinado\",\"desart.\":\"desart.\",\"desire\":\"デザイアー\",\"desire gadget\":\"Desire Gadget\",\"desk drawer\":\"Desk Drawer\",\"desorden\":\"DESORDEN\",\"death purin\":\"デスプリン\",\"destron shoukai\":\"デストロン商会\",\"desuroguma\":\"デスロ熊\",\"detergent\":\"detergent\",\"detox-girls\":\"Detox-Girls\",\"developers\":\"デベロッパーズ\",\"devri channel\":\"デヴリチャンネル\",\"dewdrop\":\"DewDrop\",\"dex plus\":\"DEX+\",\"dg\":\"D☆G\",\"dg project\":\"DG Project\",\"dhr-ken\":\"dHR研\",\"diablo\":\"Diablo\",\"diamond dust\":\"ダイヤモンドダスト\",\"diamond guardian\":\"ダイヤモンドガーディアン\",\"diamond tiara\":\"Diamond tiara\",\"dicca\":\"dicca\",\"dice b\":\"ダイスB\",\"dickpital\":\"ディクピタル\",\"dieppe factory\":\"DIEPPE FACTORY\",\"diethyl ether\":\"ジエチルエーテル\",\"dig dug\":\"Dig Dug\",\"digi-ai\":\"DiGi-Ai\",\"digianko\":\"デジアンコ\",\"digiel\":\"DiGiEL\",\"digital cute\":\"Digital Cute\",\"digital flyer\":\"Digital Flyer\",\"digital g power\":\"デジタルGパワー\",\"digital graffiti\":\"Digital Graffiti\",\"digital onahole\":\"でじたるおなほ～る\",\"digital symphony\":\"DIGITAL SYMPHONY\",\"digital tambourine\":\"でじたるたんばりん\",\"digix\":\"digiX\",\"dildo rotor\":\"ディルドローター\",\"diletta\":\"diletta\",\"dilettante\":\"ディレッタント\",\"dimension empire\":\"dimension empire\",\"dimension25\":\"2.5次元\",\"dinosaur house\":\"だいなそ～ハウス\",\"dip switch\":\"ディップ・スイッチ\",\"dipper magic\":\"Dipper Magic\",\"dirty\":\"DIRTY\",\"dirty69star\":\"Dirty69star★\",\"discovery\":\"ディスカバリー\",\"discovery mars\":\"ディスカバリー・マーズ\",\"dish up\":\"Dish up\",\"divine fountain\":\"神聖ファウンテン\",\"dix-sept\":\"dix-sept\",\"dixie\":\"ディクシー\",\"dixieland\":\"迪西蘭\",\"dkjmn\":\"dkjmn\",\"dmcontrast\":\"DMコントラスト\",\"dmmc\":\"DMMC\",\"do well\":\"Do well !!!\",\"do you die\":\"DO YOU DIE?\",\"dobakin.\":\"どばきん。\",\"dobu no hotori.\":\"どぶのほとり。\",\"doc.\":\"doc.\",\"dodo fuguri\":\"百々ふぐり\",\"dodomeiro teishoku\":\"どどめ色定食\",\"dog house\":\"ドッグハウス\",\"dogear\":\"Dogear\",\"doggie style\":\"doggie★style\",\"dogstyle\":\"DogStyle\",\"dogtag\":\"DOGTAG\",\"dogu-sensya storm\":\"土偶戦車ストーム\",\"dohatsu shouten\":\"怒髪商店\",\"dojin otome\":\"ドージンオトメ\",\"dojinchi\":\"どじんち\",\"dokomademo aoi sora ni ukabu niku\":\"何処までも蒼い空に浮かぶ肉。\",\"doku alice\":\"どくアリス\",\"doku ringo\":\"毒リンゴ\",\"doku sasori\":\"毒蠍\",\"doku69\":\"毒69\",\"dokudami\":\"ドクダミ\",\"dokudenpa jushintei\":\"毒電波受信亭\",\"dokudenpa kenkyuusho\":\"毒電波研究所\",\"dokudenpa tsuushin\":\"毒電波通信\",\"dokudoku melon\":\"どくどくめろん\",\"dokudoku ryouki garou\":\"毒どく猟奇画廊\",\"dokumushi shokeitai\":\"毒虫処刑隊\",\"dokunuma\":\"どくぬま\",\"dokupan koubou\":\"毒パン工房\",\"dokuritsu gurentai\":\"独立愚連隊\",\"dolce\":\"DOLCE\",\"dolce einsatz\":\"Dolce Einsatz\",\"dolcecanto\":\"DolceCanto\",\"dolkavtahn\":\"Dolkavtahn\",\"doll play\":\"DOLL PLAY\",\"dom joshidan\":\"ドM女史団\",\"dom kishidan\":\"ドM騎士団\",\"domestic animals\":\"Domestic animals\",\"donkin darnuts\":\"どんきんだぁなっつ\",\"dontokodon\":\"どんとこどん\",\"dontokoi oo\":\"ドンと来い!○○!\",\"donut ike\":\"ど～なつ池\",\"donzoko kashiwa meshi\":\"どん底かしわめし\",\"donzoko tengoku\":\"ドン底天国\",\"donzoko.\":\"どんぞこ。\",\"doomcomic\":\"ドゥームコミック\",\"doppelgesicht\":\"DOPPELGESICHT\",\"dorepooru\":\"ドレポール\",\"dorgel\":\"dorgel\",\"dorichin koubou\":\"ドリチン工房\",\"doronuma kyoudai\":\"泥沼兄弟\",\"doropanda tours\":\"どろぱんだTOURS\",\"doroyume\":\"とろゆめ\",\"dosukoi\":\"どすこい!\",\"dosukoi jinja\":\"どす恋☆神社\",\"dot collector\":\"Dot Collector\",\"dotechin tengoku\":\"どてちん天国\",\"dotou no m kikaku\":\"怒涛のM企画!!\",\"dots and lines\":\"どっつ&らいんず\",\"dou-chikikure\":\"童チキクレ\",\"double branch\":\"だぶるぼらんち\",\"double deck seisakujo\":\"ダブルデック製作所\",\"double dice\":\"だぶるだいす\",\"double melon\":\"ダブルメロン\",\"double slash\":\"ダブルスラッシュ\",\"double typhoon\":\"ダブルタイフーン\",\"double volante\":\"だぶるぼらんち\",\"double-h\":\"DOUBLE-H\",\"doubleflower\":\"DoubleFlower\",\"doudantsutsujitomonokai\":\"満天星友乃会\",\"douganebuibui\":\"ドウガネブイブイ\",\"doujin kappa\":\"同人河童\",\"doujin mukashibanashi\":\"同人昔話\",\"doumou\":\"DOUMOU\",\"doushia\":\"ドーシア\",\"doushin chaya\":\"童心茶屋\",\"doutei shokudou\":\"童貞食堂\",\"douwa-kensetsu\":\"童話建設\",\"doux\":\"DOUX\",\"downbeat\":\"downbeat\",\"doyondo.\":\"どよんど。\",\"dozo-mae\":\"どーぞーまえ\",\"dragon edge\":\"龍泉\",\"dragon goya\":\"ドラゴン小屋\",\"dragon heart\":\"Dragon Heart\",\"dragon island\":\"ドラゴンアイランド\",\"dragonia\":\"どらごにあ\",\"dragonstorm\":\"ドラゴンストーム\",\"dragula\":\"DRAGULA\",\"drain\":\"drain\",\"drakle-nekota perpetual motion\":\"どらねこ永久機関\",\"draw go\":\"Draw Go\",\"drawpnir\":\"Drawpnir\",\"dream chaser\":\"Dream Chaser\",\"dream club\":\"ドリーム倶楽部\",\"dream dot\":\"ドリームドット\",\"dream halls\":\"Dream Halls!\",\"dream house\":\"DREAM HOUSE\",\"dream project\":\"ドリームプロジェクト\",\"dream rider\":\"DREAM RIDER\",\"dream-mist\":\"dream-mist\",\"drei\":\"Drei\",\"dress\":\"ドレス\",\"dressblackheulee\":\"dressblackheulee\",\"dressmash\":\"DRESSMASH\",\"drill biyori\":\"どりる日和\",\"drilln girl\":\"drill'n girl\",\"drink it\":\"Drink it!\",\"drivehome\":\"drivehome\",\"drizzly rain\":\"drizzly rain\",\"dro-ya\":\"泥屋\",\"drop\":\"DROP\",\"drops\":\"どろっぷす!\",\"drum-kan\":\"ドラム缶\",\"dryr\":\"DryR\",\"dsb style\":\"DSB Style\",\"dso\":\"でぃえすおー\",\"dssk\":\"DSSK\",\"dt koubou\":\"DT工房\",\"dual beat\":\"DUAL BEAT\",\"dual i fap\":\"Dual i fap\",\"dualtail\":\"dual tail\",\"dudedle studio\":\"デュードルスタジオ\",\"dummyrun\":\"DUMMY RUN\",\"dummyusagi\":\"DummyUsagi\",\"dvcommunications\":\"DVコミュニケイションズ\",\"dying kitchen z\":\"Dying Kitchen Z\",\"dynamic kanoke\":\"ダイナミック棺桶\",\"dynamite honey\":\"ダイナマイト☆ハニー\",\"e\":\"e\",\"e ali-al\":\"e☆ALI-aL!\",\"e factory\":\"E factory\",\"e ni kaita mochi\":\"絵にかいた餅\",\"e project\":\"E project\",\"e roman koubou\":\"江☆浪漫工房\",\"e-10 field\":\"E-10フィールド\",\"e-hentaicore\":\"E-Hentaicore\",\"e-lse\":\"E-lse\",\"e.b.\":\"E.B.\",\"e50\":\"絵50\",\"e649ne\":\"e649ne\",\"e73\":\"E73\",\"eapo-zu\":\"eapo-zu\",\"ear-pop\":\"EAR-POP\",\"earl lumines\":\"Earl LUMINES\",\"earth-goya\":\"アース小屋\",\"earthean\":\"アーシアン\",\"earthlight\":\"アースライト\",\"easy thrilling\":\"Easy Thrilling\",\"easygame\":\"EasyGame\",\"ebikino\":\"エビキノ\",\"ebimashi\":\"えびまし\",\"ebisen kikaku\":\"えびせん企画\",\"ebisuya\":\"えびすや\",\"ebisuyu\":\"ゑびす湯\",\"ebitendon\":\"えびてん丼\",\"ebysuya\":\"恵比寿屋\",\"ecarlate\":\"E'carlate\",\"eccentric girl\":\"エキセントリックガール\",\"echigo-ya kikaku\":\"越後屋企画\",\"echizen bugyousho\":\"越前奉行所\",\"echo\":\"ECHO\",\"echo view\":\"Echo View\",\"echo.\":\"echo.\",\"eclipse\":\"えくりぷす\",\"eco-filter\":\"えこふぃるたぁ\",\"ecolonun\":\"えころぬん\",\"ecp\":\"ECP\",\"ectoborn\":\"ectoborn\",\"edash\":\"EDASH\",\"edenmode\":\"EDENMODE\",\"edge\":\"edge\",\"edge diver\":\"Edge Driver\",\"edge worth\":\"えっじわーす\",\"edgeworthia\":\"Edgeworthia\",\"edit\":\"edit\",\"edo-ya\":\"EDO屋\",\"edogawa koubou\":\"江戸川工房\",\"ether\":\"エエテル\",\"ef-labo\":\"ef-labo\",\"effecter\":\"エフェクター\",\"effordom soft\":\"エフォルダムソフト\",\"egao ga ichiban\":\"笑顔が一番\",\"eggplant\":\"えっぐぷらんと\",\"ego\":\"イージーオー\",\"ego dance\":\"EGO DANCE\",\"egoism\":\"EGOISM\",\"egonokatamari\":\"エゴノカタマリ\",\"eichi jijou\":\"エイチジジョウ\",\"chikatetsu shokudou\":\"地下鉄食堂\",\"eien no 17-sai\":\"永遠の17歳\",\"eight beat\":\"エイトビート\",\"eight man\":\"eight man\",\"eight world\":\"エイト・ワールド\",\"eikyuu kikan\":\"永久機関\",\"einfach\":\"einfach\",\"einhorn\":\"あいんほるん\",\"eins\":\"あいんず\",\"einsatz gruppe\":\"EINSATZ GRUPPE\",\"einshotenin\":\"アインショテンイン\",\"eisaidou\":\"えーさい堂\",\"eisbahn\":\"アイスバーン\",\"eisei vegeta g\":\"衛星ベジータG\",\"eisenhower\":\"あいぜんはわぁ\",\"eiwa industries\":\"エイワインダストリーズ\",\"ejigen\":\"EJIGEN\",\"ek-shop\":\"eK-SHOP\",\"ekakigoya\":\"絵描き小屋\",\"ekakigoya notesystem\":\"絵描き小屋\",\"ekitai no tomosha\":\"液体の友社\",\"ekitica\":\"EKITICA\",\"ekurabe\":\"エクラベ\",\"el-ahrairah\":\"El-ahrairah\",\"electric rokugen\":\"エレクトリックロクゲン\",\"electrical\":\"エレクトリカル\",\"electricsheep\":\"ElectricSheep\",\"elephant.giraffe\":\"ELEPHANT.GIRAFFE\",\"elf\":\"エルフ\",\"elfin facies\":\"Elfin Facies\",\"elflite\":\"elflite\",\"elhearts\":\"ELHEART'S\",\"elilys lab.\":\"Elily's Lab.\",\"elithheart\":\"エリスハート\",\"elle-murakami\":\"elle-叢神\",\"ellese no yakata\":\"エリーゼの館\",\"elza\":\"ELZA\",\"emade.\":\"いーめいど。\",\"emakiya-sakyodo\":\"絵巻屋紗香堂\",\"empathy\":\"Empathy\",\"empty lounge\":\"Empty Lounge\",\"empty room\":\"Empty Room\",\"emu\":\"emu\",\"en\":\"袁\",\"en-sof\":\"En-Sof\",\"endless requiem\":\"Endless Requiem\",\"endorphin\":\"Endorphin\",\"energia\":\"えねるぎあ\",\"energya\":\"エネルギヤ出版所\",\"enfant terrible\":\"ENFANT TERRIBLE\",\"engetsuten\":\"遠月点\",\"england peach\":\"England Peach\",\"engoutenma\":\"炎業天魔\",\"enio\":\"Enio\",\"enishi soft\":\"えにしそふと\",\"enishing\":\"縁ing\",\"enji\":\"ENJI\",\"enjoy mix\":\"ENJOY MIX\",\"enka boots\":\"塩化ブーツ\",\"enkan\":\"円環\",\"enmaya\":\"えんま屋\",\"enmuhaze\":\"えんむへいず\",\"ennui akatako\":\"アンニュイ赤蛸\",\"ennui-tei\":\"アンニュイ亭\",\"enokippu\":\"えのきっぷ\",\"enokoro kurage\":\"えのころくらげ\",\"enoughmin\":\"イナフミン\",\"entelekheia\":\"エンテレケイア\",\"entro beast\":\"エントロビースト\",\"enueeru\":\"えぬえ～る\",\"enuemu\":\"enuemu\",\"enuma elish\":\"enuma elish\",\"enyakora hoisassa\":\"えんやこら☆ほいさっさ\",\"equivalence\":\"equivalence\",\"era feel\":\"era feel\",\"erare\":\"ERARE\",\"erdelied\":\"エルデライド\",\"erectlip\":\"エレクトリップ\",\"erimo\":\"えりも\",\"eringitoro salmon\":\"えりんぎとろサーモン\",\"ero ero time\":\"エロ×2TIME\",\"ero mangaka pikupikun\":\"えろ漫画家ピクピクン\",\"ero spirits\":\"エロスピリッツ\",\"erocawa tonya\":\"エロカワ問屋\",\"erocs\":\"erocs\",\"eroitto\":\"エロイット\",\"eroliya\":\"えろり屋\",\"eromafia\":\"エロマフィア\",\"eromazun\":\"エロマズン\",\"eronamin h\":\"エロナミンH\",\"erondo\":\"eRONDO\",\"eroro\":\"Eroro\",\"eros and entertainment\":\"Eros&Entertainment\",\"eroslium\":\"エロスリウム\",\"erostellus\":\"Erostellus\",\"erotic fantasy larvaturs\":\"らばた工房\",\"erotic honeymoon\":\"Erotic Honeymoon\",\"erotica black\":\"EROTICA BLACK\",\"erotica peach\":\"EROTICA PEACH\",\"erotis\":\"ErotIs\",\"erotomania\":\"EROTOMANIA\",\"error\":\"ERROR!\",\"error404\":\"ERROR404\",\"eruapo gundan\":\"エルアポ軍団\",\"escape club\":\"ESCAPE CLUB\",\"escapizma\":\"ESCAPIZMA\",\"escargot club\":\"えすかるご倶楽部\",\"esebateira\":\"エセバテイラ\",\"esecool\":\"エセクール\",\"esoragoto\":\"エソラゴト\",\"espresso\":\"espresso\",\"esto\":\"esto\",\"estrella\":\"estrella\",\"esuesu\":\"EsuEsu\",\"esuodan\":\"えすおだん\",\"esusaizu\":\"えすさいず\",\"etc x etc\":\"ETC×ETC\",\"etcycle\":\"etcycle\",\"eterna-radiare\":\"エテルナ-ラディアーレ\",\"eternal\":\"ETERNAL\",\"eternal song\":\"Eternal Song\",\"eternal world\":\"ETERNAL WORLD\",\"eternal-eclipse\":\"ETERNAL-ECLIPSE\",\"eterno\":\"Eterno\",\"etigoya\":\"えち後屋\",\"etoile zamurai\":\"エトワール待\",\"etsuran\":\"悦卵\",\"etwas\":\"etwas\",\"eunospress\":\"ゆ～のす通信\",\"eunox\":\"EUNOX\",\"eunoxline\":\"EUNOXLINE\",\"euphonia\":\"Euphonia\",\"euphony production\":\"Euphony Production\",\"euphoria\":\"euphoria\",\"euphoric\":\"EUPHORIC!\",\"eve\":\"Eve\",\"eve-sya\":\"EVE-舎\",\"eves garden box\":\"イヴの箱庭\",\"evidence.\":\"Evidence.\",\"evo.r.b\":\"宇行日和\",\"evoll\":\"evoLL\",\"evolution\":\"Evolution\",\"evork festa\":\"Evork Festa\",\"ewokakuman\":\"絵を描くマン\",\"ews at works\":\"EWS@Works\",\"ex production\":\"EXプロダクション\",\"ex-\":\"EX-\",\"ex-one\":\"EX-ONE\",\"ex35\":\"EX35\",\"excite\":\"絵喜祭人\",\"excite neko\":\"エキサイト猫\",\"excite rabbit\":\"えきらび\",\"executor\":\"EXECUTOR ～エグゼクター～\",\"exit nothing\":\"Exit Nothing\",\"exodus\":\"エクソダス\",\"explorer\":\"Explorer\",\"extage\":\"EXtage\",\"extern\":\"extern\",\"extry\":\"ExTry\",\"ezogoro\":\"エゾゴロウ\",\"f no heya\":\"Fの部屋\",\"f.w.zholic\":\"F.W.ZHolic\",\"f.workshop\":\"F.Workshop\",\"f4-company\":\"F4 COMPANY\",\"face to face\":\"face to face\",\"facehouse\":\"Facehouse\",\"fact on fiction\":\"Fact on Fiction\",\"faf\":\"FAF\",\"fairy key\":\"フェアリーキー\",\"fairy pink\":\"FAIRY PINK\",\"fairy tale house\":\"Fairy Tale House\",\"fake an\":\"FAKE庵\",\"fake69rose\":\"fake69rose\",\"fakepucco\":\"偽製pucco\",\"faker\":\"Faker\",\"fakereal\":\"FakeReal\",\"falchion\":\"ファルシオン\",\"fall-in-love\":\"Fall-in-Love\",\"falling spiral\":\"Falling Spiral\",\"fallinmoon\":\"FallinMoon\",\"family affair\":\"Family Affair\",\"family void\":\"ファミリーVOID\",\"fan-na\":\"ふぁんな\",\"fancy fantasia\":\"Fancy Fantasia\",\"fancy feeling\":\"Fancy Feeling\",\"fancy-polori\":\"空想ポロリ\",\"fangs\":\"FANGS\",\"fannel\":\"ファンネル\",\"fantasy of vermilion\":\"Fantasy of Vermilion\",\"fantasy wind\":\"FANTASY WIND\",\"fap seisakusho\":\"FAP製作所\",\"farthest land\":\"farthest land\",\"fastest lap\":\"FASTEST LAP\",\"fastrope\":\"FASTROPE\",\"fat\":\"FAT\",\"fatboy\":\"ふぁっとぼ～い\",\"fatima cigarette\":\"Fatima Cigarette\",\"favorite\":\"FAVORITE\",\"fclg\":\"フクラグ\",\"fechisupi\":\"ふぇちすぴ\",\"feeld hern halle\":\"FEELD HERN HALLE\",\"felicitan\":\"フェリシタン\",\"felina\":\"Felina\",\"felt-kobo\":\"ふぇると工房\",\"femidrop\":\"フェミドロップ\",\"femme enfant\":\"FEMME ♀ ENFANT\",\"festa\":\"ふぇすた。\",\"festival\":\"ふぇすてぃばる!\",\"fetch\":\"Fetch\",\"fetish\":\"ふぇてぃっしゅ\",\"fetish children\":\"フェティッシュ チルドレン\",\"fetism\":\"ふぇちずむ\",\"fever lactic acid bacteria deluxe\":\"フィーバー乳酸菌DX\",\"fhfhfh\":\"fhfhfh\",\"fiance tank\":\"フィアンセ戦車\",\"fiancee\":\"フィアンセ\",\"fiesole\":\"Fiesole\",\"fighting peroriina\":\"ファイティングペロリーナ\",\"figure ni naritai zoku\":\"フィギュアになりたい\",\"figure-hugging\":\"FIGURE-HUGGING\",\"fika\":\"FIKA\",\"film grain\":\"FILM GRAIN\",\"final frontier\":\"FINAL FRONTIER\",\"finecraft69\":\"Finecraft69\",\"finish doll\":\"フィニッシュドール\",\"fippenluck\":\"fippenluck\",\"fire\":\"FIRE\",\"firefly\":\"Firefly\",\"fireworks\":\"ファイヤーワークス\",\"first class\":\"1組\",\"first crash\":\"ファーストクラッシュ\",\"first mirage\":\"FIRST MIRAGE\",\"firstspear\":\"Firstspear\",\"fish\":\"FISH\",\"fish and chicken\":\"魚肉と鳥肉\",\"fishbone\":\"fish bone\",\"fishneak\":\"Fishneak\",\"five\":\"five\",\"fivecoa.\":\"Fivecoa.\",\"fiyorudou\":\"ふぃよる堂\",\"fizz\":\"Fizz\",\"fizzcode\":\"FIZZCODE\",\"fjnsoft\":\"FJNsoft\",\"flaming dragon\":\"フレイミングドラゴン\",\"flamme soft\":\"ふらむそふと\",\"flash point\":\"FLASH POINT\",\"flat\":\"FLAT\",\"flattwelve\":\"FLATTWELVE\",\"flatwoods\":\"Flatwoods\",\"flieger\":\"Flieger\",\"flip tail\":\"FLIP TAIL\",\"flock blue\":\"Flock Blue\",\"flower child\":\"フラワーチャイルド\",\"flowerblade\":\"FlowerBlade\",\"flowerchildueda\":\"flowerchild植田\",\"fluffy x fluffy\":\"fluffy×fluffy\",\"fluid liquid\":\"ふるいどりきっど\",\"fluorite\":\"ふろーらいと\",\"flying chicken\":\"フライングチキン\",\"flying panjandrum\":\"ふらいんぐパンジャンドラム\",\"flyingcat\":\"FlyingCat\",\"foliage fossil\":\"木葉化石\",\"folkro\":\"フォルクロ\",\"fonetrason\":\"FONETRASON\",\"foo10\":\"Foo10\",\"fool-in-love\":\"Fool-in-Love\",\"forbidden-lips\":\"Forbidden-Lips\",\"forest snow\":\"Forest Snow\",\"forever and ever...\":\"Forever and ever...\",\"fortress76\":\"七六要塞\",\"fortuna\":\"FORTUNA\",\"fortunequest\":\"FortuneQuest\",\"foryourprotection\":\"ForYourProtection\",\"foundation\":\"FOUNDATION\",\"four leaves clover\":\"Four Leaves Clover\",\"fourthcape\":\"fourthcape\",\"fox-club\":\"FOX-CLUB\",\"fp works\":\"FP WORKS\",\"fractalthink\":\"FractalThink\",\"fraeulein\":\"Fräulein\",\"fragile\":\"fragile\",\"fragrant olive\":\"Fragrant Olive\",\"frank banana\":\"Frank Banana\",\"frank factory\":\"Frank Factory\",\"frapowa\":\"ふらぽわ\",\"frapper spirits\":\"ふらすぴ\",\"freakilycharming\":\"FreakilyCharming\",\"freaks\":\"フリークス\",\"free color 814\":\"フリーカラー814\",\"free heaven\":\"FREE HEAVEN\",\"free style\":\"Free Style\",\"freedom\":\"FREEDOM\",\"freedom prophet\":\"フリーダムプロフェット\",\"freedom tomy r\":\"フリーダム☆トミーR\",\"freelife\":\"freelife\",\"freeze world\":\"フリーズワールド\",\"french cancan\":\"フレンチカンカン\",\"fresh fruit s\":\"Fresh Fruit S\",\"fresnel lens\":\"ふれぇねるれんず\",\"freud no inmu\":\"フロイトの淫夢\",\"fried kitchen.\":\"ふらいどきっちん。\",\"friendly sky\":\"Friendly Sky\",\"fringe flange\":\"フリンジフランジ\",\"from control\":\"from control\",\"from japan\":\"ふろむ・じゃぱん\",\"from nou kanja no kai\":\"フロム脳患者の会\",\"from scratch\":\"from SCRATCH\",\"frontline\":\"ふろんとらいん\",\"fruitsjam\":\"フルーツJAM\",\"fly dish\":\"ふらいでぃっしゅ\",\"fss\":\"FSS\",\"fuantei\":\"ふあん亭\",\"fudegaki soft\":\"筆柿そふと\",\"fudomae5\":\"フドウマエ5\",\"fuego\":\"FUEGO\",\"fuerzabruta\":\"Fuerzabruta\",\"fugu macaroni\":\"フグマカロニ\",\"fugudoku\":\"川豚毒\",\"fuguri\":\"ふぐり\",\"fuhatudan.\":\"不発団。\",\"fuji sangou koubou\":\"富士参號工房\",\"fuji yoshida sa\":\"藤吉田SA\",\"fujidan\":\"藤団\",\"fujikome-ya\":\"藤米屋\",\"fujiiro bomber\":\"ふじいろボンバー\",\"fujiiro sabou\":\"藤色茶房\",\"fujiko fujio fc kurosawa kei\":\"藤子不二雄FC黒沢系\",\"fujinomiya millenium\":\"藤ノ宮ミレニアム\",\"fujitomomo\":\"藤と桃\",\"fujiya\":\"ふじ家\",\"fujiyuu kenkyuu\":\"不自由研究\",\"fukafuka moufu\":\"ふかふか毛布\",\"fukafuka tenshoku\":\"ふかふか天職\",\"fukagawa\":\"深川\",\"fukahire\":\"フカヒレ\",\"fukakutei kuukan\":\"不確定空間\",\"fukame takame\":\"ふかめたかめ\",\"fukashigi\":\"不可思議\",\"fukasu-santaro\":\"深酢さんたろ\",\"fukazume kizoku\":\"深爪貴族\",\"fuketsudan\":\"不決断\",\"hukidamari\":\"吹溜\",\"fukucha koubou\":\"福茶工房\",\"fukuda sennen oukoku\":\"福田千年王国\",\"fukugou marjoram\":\"複合マジョラム\",\"fukumaden\":\"伏魔殿\",\"fukunoren\":\"福のれん\",\"fukupukutei\":\"福ぷく亭\",\"fukurou naru tori\":\"フクロウなる鳥\",\"fukurou no yuubinya san\":\"梟の郵便屋さん\",\"fukurou-ya\":\"梟屋\",\"fukuya\":\"福屋\",\"full accele\":\"フルアクセル\",\"full bottle\":\"フルボトル\",\"full flap\":\"フルフラップ\",\"fullauto firing\":\"fullauto firing\",\"fullbloom\":\"fullbloom\",\"fullbottom\":\"FULLBOTTOM\",\"fullmetal madness\":\"FULLMETAL MADNESS\",\"fullmoff\":\"ふるもっふ\",\"fullmoon and tangerine\":\"満月と蜜柑\",\"fulloro\":\"fulloro\",\"fullswing otome\":\"フルスイングオトメ\",\"fumichaya\":\"史茶屋\",\"fumifumi cat\":\"ふみふみ☆きゃっと\",\"fumikan.\":\"ふみかん。\",\"fumikirimae\":\"踏切前\",\"fumitsuke\":\"ふみつけ\",\"funa time\":\"ふなたいむ\",\"funanori house\":\"ふなのりはうす\",\"funiai-ice\":\"ふにあいあいす\",\"funi funi soft\":\"ふにふにソフト\",\"funikigumi\":\"雰囲気組\",\"funimani\":\"ふにまに\",\"funiya\":\"ふに屋\",\"funny devil\":\"Funny Devil\",\"funny rays\":\"ファニーレイズ\",\"funwari rice\":\"ふんわり☆らいす\",\"funyuhanyounyaran\":\"ふにゅはにょうにゃらん\",\"furafuradou\":\"ふらふら堂\",\"furansowa\":\"ふらんそわ\",\"furi furi paradise\":\"Furi Furi PARADISE\",\"furikake parapara\":\"ふりかけぱらぱら\",\"furitendou\":\"フリテン堂\",\"furrock\":\"ふぁーろっく\",\"furry fandom\":\"ふぁ～りぃ☆ふぁんだむ\",\"furscoblus\":\"Furscoblus\",\"furuhonya\":\"古本屋\",\"furuike\":\"furuike\",\"furuya\":\"ふる屋\",\"fushigi dou\":\"フシギ堂\",\"fushinsya guilty\":\"不審者罪\",\"fushizen doubutsu hogodantai\":\"不自然動物保護団体\",\"fusions\":\"Fusions\",\"fusuido\":\"封粋堂\",\"fusuma goten\":\"ふすま御殿\",\"futaba\":\"双葉\",\"futabasshu\":\"ふたばっしゅ\",\"futabatei\":\"ふたば亭\",\"futaburo\":\"ふたブロ\",\"futagotei\":\"双子亭\",\"futaket junbikai\":\"ふたけっと準備会\",\"futamura futon ten\":\"ふたむらふとん店\",\"futanarist zatsudan\":\"ふたなりすと雑談\",\"futanarun\":\"ふたなるん\",\"futanaya\":\"フタナ屋\",\"futatsu no hokuro\":\"ふたつのほくろ\",\"futeikei zenzai\":\"不定形ぜんざい\",\"futon mushi\":\"布団虫\",\"futonton\":\"布団団\",\"futoumei z\":\"不透明Z\",\"future\":\"future\",\"futurepack\":\"Futurepack\",\"fuuga\":\"風☆雅\",\"fuukyou kimiko\":\"風狂公子\",\"fuuma kekkai\":\"風舞結界\",\"huurai no dan\":\"風来の団\",\"fuurintei\":\"風鈴亭\",\"fuusa ryouiki\":\"封鎖領域\",\"fuusen club kuroshiki\":\"風船クラブ「黒式！」\",\"fuwa fuwa pinkchan\":\"ふわふわぴんくちゃん\",\"fuwatoro marinepolis\":\"ふわとろ★まりんぽりす\",\"fuwatto\":\"ふわっと\",\"fuyu wa samui\":\"冬は寒い\",\"fuyugomori\":\"FUYUGOMORI\",\"fuyunonchi\":\"冬のん家\",\"fuzainoyamada\":\"ふざいのやまだ\",\"fz5000\":\"FZ5000\",\"g equals kundow\":\"G=Kundow\",\"g-cage\":\"G-CAGE\",\"g-complex\":\"G-complex\",\"g-planet\":\"G-PLANET\",\"g-power\":\"G-Power!\",\"g-r\":\"G-R\",\"g-ring\":\"G-RING\",\"g-rough\":\"g-rough\",\"g-scan corp.\":\"G-SCAN CORP.\",\"g-spot\":\"じぃすぽっと\",\"g.b.f\":\"G.B.F\",\"g.entertainment\":\"G.Entertainment\",\"g.g.blue\":\"G.G.BLUE\",\"g.g.g.\":\"G.G.G.\",\"g.g.t.\":\"G.G.T.\",\"g.k.p.\":\"g.k.p.\",\"g500\":\"G500\",\"ga fake\":\"ガ・フェーク\",\"gaball screen\":\"GABALL SCREEN\",\"gabugabu\":\"GABUGABU\",\"gabunomi tororokonbu\":\"がぶ飲みとろろ昆布\",\"gacha\":\"画チャ\",\"gachapin mukku.\":\"がちゃぴんむっく。\",\"gachi drunkers\":\"ガチ★ドランカーズ\",\"gachinko shobou\":\"我チ○コ書房\",\"gadget\":\"ガジェット工房\",\"gadoujuku\":\"我道塾\",\"gagaga honpo\":\"ガガガ本舗\",\"gagaken\":\"画々研\",\"gaikotsu no spare rib\":\"骸骨のスペアリブ\",\"gaisei dou\":\"凱聖堂\",\"gakeppuchi koubou\":\"崖っぷち工房\",\"gakuen ketsumeichou\":\"學園血盟帖\",\"gakuen yuushabu\":\"学園勇者部\",\"gakugen\":\"楽玄\",\"gakupoppo\":\"牙九ぽっぽ\",\"galapagos\":\"ガラパゴス\",\"galaxy ginga\":\"ギャラクシー銀河\",\"galaxy style\":\"GALAXY STYLE\",\"galerie.\":\"Galerie.\",\"galette\":\"Galette\",\"gallery culter\":\"Gallery Culter\",\"gallery walhalla\":\"gallery walhalla\",\"gallerycraft\":\"ギャラリークラフト\",\"galley\":\"Galley\",\"gallop\":\"gallop\",\"gallphilia\":\"gallphilia\",\"galvas\":\"GALVAS\",\"gamanjiru-ni-chinpaipai\":\"我☆慢☆汁にチンパイパイ\",\"game dome\":\"GAME DOME\",\"game dome ariake\":\"GAME DOME 有明店\",\"game dome hamamatsuchouten\":\"GAME DOME 浜松町店\",\"game technopolis\":\"GAMEテクノポリス\",\"gamenhaji\":\"がめんはじ\",\"gamenhaji no yoru\":\"画面端の夜\",\"games express\":\"ゲーム・エクスプレス\",\"gamugumi\":\"ガムグミ\",\"gamute de kotei\":\"ガムテで固定\",\"ganbari machine\":\"ガンバリマシン\",\"gang koubou\":\"ぎゃんぐ工房\",\"ganmenki joe\":\"巌面鬼JOE\",\"ganmo-no-oyatsu\":\"がんものおやつ\",\"ganmou koubou\":\"がんもぅ工房\",\"ganso sonodaya\":\"元祖園田屋\",\"gaptax\":\"GapTax\",\"gara ayuri nisshi\":\"柄あゆり日誌\",\"garage-talk\":\"garage-talk\",\"garakuta ga oka\":\"ガラクタが丘\",\"garakuta teikoku\":\"がらくた帝國\",\"garakuta-ya\":\"我楽多屋\",\"garam\":\"ガラム\",\"garamumasara\":\"がらむまさら\",\"garandou\":\"がらんどう\",\"garbage\":\"がーべいじ\",\"garden in the air\":\"Garden in the Air\",\"gargoyle\":\"Gargoyle\",\"garigarigari\":\"がりがりがり\",\"garland\":\"Garland\",\"garou kissa hapido\":\"画廊喫茶はぴど\",\"gasayabu\":\"がさやぶ\",\"gashadokuro\":\"がしゃどくろ\",\"gasoku\":\"GASOKU\",\"gate two\":\"GATE TWO\",\"gateau scotch\":\"ガトースカッチ\",\"gaten\":\"画展\",\"gattomakia\":\"ガットマキア\",\"gauloises blue\":\"GAULOISES BluE\",\"gaus\":\"GAUS\",\"gawwow\":\"gawwow!\",\"gby\":\"GBY\",\"gc-dan\":\"GC団\",\"gdmd.\":\"gdmd.\",\"geafcart\":\"ギーフカート\",\"geboku shuppan\":\"下僕出版\",\"gedou shoukai\":\"外道商会\",\"gehlenite\":\"Gehlenite\",\"geiwamiwosukuu\":\"芸は身を救う!!\",\"gekidan asaroku\":\"劇団あさろく\",\"gekidan bunshichi\":\"劇団文七\",\"gekidan kinmirai\":\"劇團近未来\",\"gekidan onigashima\":\"劇団☆鬼ヶ島\",\"gekijou pierrot\":\"激情ピエロ\",\"gekikara\":\"GEKIKARA\",\"gekirou director\":\"激浪Director\",\"gekiteki gekidan l\":\"劇的劇団エル\",\"gekka bijin\":\"月下美刃\",\"gekka no neko\":\"月華の猫\",\"gekkan hitorizumou\":\"月刊一人相撲\",\"gekkan toshiue milk tank\":\"月刊年上ミルクタンク\",\"gekkou sanctuary\":\"月光サンクチュアリ\",\"gekkou tei\":\"月光亭\",\"gekkou touzoku\":\"月光盗賊\",\"gekkou-dou\":\"月咬洞\",\"gekkouya\":\"げっこうや\",\"gelatin utopia\":\"ゼラチンユートピア\",\"gem\":\"GEM\",\"gemasyafyu\":\"ゲマシャフュ\",\"gemou the cat\":\"ゲモウ the Cat\",\"gen sou dokoro\":\"幻創処\",\"genei teito\":\"幻影帝都\",\"geneihohjin\":\"幻影法人\",\"general tank\":\"じぇねらるたんく\",\"genetrix\":\"GENETRIX\",\"genkei yuugi\":\"幻繋遊戯\",\"genki honpo\":\"元気本舗\",\"genki no mizu no wakutokoro\":\"げんきのみずのわくところ\",\"genkotsu dan\":\"げんこつ団\",\"genmonrou\":\"幻門楼\",\"genocide\":\"GENOCIDE\",\"genocide niku shoujo\":\"ジェノサイド肉少女\",\"genocidou\":\"ジェノサイ堂\",\"genshoku sweets\":\"原色スイーツ\",\"genshoudou\":\"幻笙堂\",\"gensou eigakan\":\"幻創映画館\",\"gensou graphics\":\"幻想グラフィックス\",\"gensou hack\":\"幻想ハック\",\"gensou kuukan\":\"幻蒼空間\",\"gensou kyoukai\":\"幻想協会\",\"gensou mikan\":\"幻想美甘\",\"gensou pheles\":\"幻想フェレス\",\"gensou seimeitai\":\"幻想生命体\",\"gensyokuhakoniwa\":\"原色箱庭\",\"gentei mikan\":\"限定蜜柑\",\"gentleman trap\":\"紳士罠\",\"gentou matenrou\":\"幻灯摩天楼\",\"genussmittel\":\"ゲヌスミッテル\",\"genyukyo\":\"幻遊郷\",\"geosiphon\":\"Geosiphon\",\"geranium\":\"GERANIUM\",\"gerhard\":\"GERHARD\",\"german kartoffel\":\"じゃーまんかとっふぇる\",\"gerudochuu oukoku\":\"げるどちゅう王国\",\"gesellschaft\":\"ゲゼルシャフト\",\"gessen do\":\"月泉堂\",\"gessyu\":\"げっしゅ\",\"gesuko no heya\":\"ゲス子のへや\",\"getsusekai\":\"月世界\",\"getsuyoubi no brenda\":\"月曜日ノぶれんだ\",\"gettsu\":\"GETTSU\",\"gewalt\":\"Gewalt\",\"gh\":\"GH\",\"gh.k\":\"GH.K\",\"ghost\":\"Ghost\",\"gift\":\"Gift\",\"giftbell\":\"ぎふとべる\",\"giftkuchen\":\"GiftKuchen\",\"gigameka\":\"ギガメーカー\",\"giman no hakoniwa\":\"欺瞞の箱庭\",\"gimme logic\":\"Gimme Logic\",\"gimmix\":\"ギミックス\",\"gin no ringo\":\"銀の林檎\",\"gin penguin\":\"銀ぺんぎん\",\"ginchaya\":\"銀茶屋\",\"gindokei\":\"銀時計\",\"ginga toppuu\":\"銀河突風\",\"ginga-ryusei\":\"銀河流星\",\"ginger\":\"Ginger\",\"gingerblend\":\"Gingerblend\",\"ginhakushi\":\"銀白紙\",\"giniro noel\":\"銀色ノエル\",\"ginjou maggots\":\"吟醸マゴッツ\",\"ginshari.\":\"ぎんしゃり。\",\"ginsiba.\":\"ぎんしば。\",\"ginto\":\"銀兎\",\"gioncarnival\":\"擬音謝肉祭\",\"gipsy underground\":\"Gipsy underground\",\"girigiri nijiiro\":\"ギリギリ虹色\",\"girigiri works\":\"ギリギリWorks\",\"girin mahha\":\"ぎんりんまっは\",\"girlboy\":\"Girlboy\",\"girls kingdom\":\"少女の王国\",\"girls residence\":\"GIRLS RESIDENCE\",\"girls-potion\":\"Girls-Potion\",\"girls...now\":\"Girls...Now\",\"girlsport\":\"GirlSport\",\"giro chinko shoukai\":\"ギロ・チン子商会\",\"giroutei\":\"妓楼亭\",\"giuniuya\":\"ぎうにう屋\",\"gj-x\":\"GJ-X\",\"gkvoltage\":\"GKボルテージ\",\"glace\":\"GLace\",\"glamour works\":\"GLAMOUR WORKS\",\"glass no kabocha\":\"ガラスのカボチャ\",\"glass wall garden\":\"ぐらすうぉーるがーでん\",\"glassed concrete\":\"ガラストコンクリート\",\"glasses perser\":\"グラセスパーサー\",\"glassfiber\":\"グラスファイバー\",\"glaze\":\"glaze\",\"gleipnir\":\"Gleipnir\",\"globe\":\"GLOBE\",\"glutamic acid\":\"GLUTAMIC:ACID\",\"gmr\":\"牛MR\",\"go go heaven\":\"Go! Go! Heaven!!\",\"go-go-merry-go-round\":\"Go-Go-Merry-Go-Round\",\"goberazzo\":\"ごべらっつぉ\",\"god hand mar\":\"God Hand Mar\",\"godbirdlove\":\"ゴッドバードLOVE\",\"goddandies\":\"GodDandies\",\"godfinmew\":\"Godfinmew\",\"godone syndrome\":\"五度寝シンドローム\",\"gohanya\":\"ごはん屋\",\"gohyakuen chokinbako\":\"五百円貯金箱\",\"gokakukansuu\":\"五角関数\",\"gokigen takabisha\":\"ゴキゲン高飛車\",\"goku-raku\":\"GOKU-RAKU\",\"gokuaku shounin henshuubu\":\"極悪商人編集部\",\"gokufero\":\"極フェロ\",\"gokuraku-chou yon-choume\":\"獄楽町四丁目\",\"gokutsubushi\":\"穀潰し\",\"gold dust\":\"GOLD DUST\",\"gold koman sex\":\"GOLD KOMAN SEX\",\"gold leaf\":\"GOLD LEAF\",\"gold lip\":\"ゴールドリップ\",\"gold ninja\":\"黄金忍者\",\"gold rush\":\"GOLD RUSH\",\"golden bat\":\"GOLDEN BAT\",\"golden fever\":\"ゴールデンフィーバー\",\"golden tube\":\"ゴールデンチューブ\",\"goldendawn89\":\"GoldenDawn89\",\"golem inc.\":\"Golem Inc.\",\"goma brothers\":\"ごまブラザーズ\",\"goma hangetsu\":\"ごまはんげつ\",\"gomadoufu\":\"ごまどうふ\",\"gomafu toufudou\":\"ゴマフ豆腐堂\",\"gomaneko brief\":\"ごまねこブリーフ\",\"gomigomi seisaku iinkai\":\"ゴミゴミ制作委員会\",\"gomix\":\"GOMIX!\",\"gomiyashiki\":\"五三八式\",\"gomoku gohan\":\"五目ごはん\",\"gomuhachi\":\"ごむはち\",\"goo-paaa\":\"goo-paaa\",\"good bye life\":\"Good Bye Life\",\"goodluck\":\"Goodluck\",\"goodsleep\":\"GoodSleep!\",\"goosebumps\":\"goosebumps\",\"goraku hiroba\":\"娯楽広場\",\"gorgeous lunch\":\"ゴージャスランチ\",\"gorichu\":\"ゴリッチュ\",\"gorigorilland\":\"ゴリゴリランド\",\"gorilion\":\"ゴリライオン\",\"gorilla gang dan\":\"ゴリラギャング団\",\"gorilla squad\":\"ゴリラスクワッド\",\"gorilla typhoon\":\"ゴリラタイフーン\",\"gorinjuu\":\"ご臨終\",\"goro mask\":\"クチナシ館\",\"gorori no diy\":\"ゴロリのDIY\",\"gorotaishi\":\"五郎太石\",\"gos to vi\":\"gos to vi\",\"gosousha\":\"護送車\",\"gossipgothic\":\"ごしっぷごしっく\",\"gosuidou\":\"午睡堂\",\"gothical blade\":\"GOTHICAL BLADE\",\"gothya\":\"ゴス屋\",\"gotouroku-goku\":\"誤登録語句\",\"gouon\":\"轟音\",\"gouriki hyakkaten\":\"剛力百貨店\",\"gouten doujou\":\"轟天道場\",\"goutwollow\":\"GoutWolloW\",\"gozen shichiji no awase kagami\":\"午前七時の合わせカガミ\",\"gozenrokuji\":\"午前六時\",\"gpen\":\"じーぺん\",\"gpx\":\"GPX\",\"grace\":\"Grace\",\"grachegrache\":\"ぐらっちぇぐらっちぇ\",\"graf zeppelin\":\"Graf Zeppelin\",\"grafroller\":\"Grafroller\",\"granberry heaven\":\"グランベリーヘヴン\",\"grand cru\":\"Grand Cru\",\"grand-nauts\":\"grand-nauts\",\"grand-slum\":\"grand-slum\",\"graphicarossa\":\"GRAPHICAROSSA\",\"grary\":\"Grary\",\"grassturtle\":\"グラスタートル\",\"grauer hase\":\"グラウエルハーゼ\",\"gravidan\":\"ぐらヴィ団\",\"graygreed\":\"graygreed\",\"grazie\":\"grazie\",\"grease pencil\":\"グリースペンシル\",\"great acta\":\"GREAT芥\",\"great dadan\":\"ぐれいと・だだん\",\"greatest kyuutei\":\"グレイテスト宮廷\",\"green ketchup\":\"グリーンケチャップ\",\"green star\":\"GREEN STAR\",\"green tea lab\":\"Green tea Lab\",\"greenhouse\":\"ぐりいん野はうす\",\"greg soujou\":\"グレッグ僧正\",\"greone\":\"GREONE\",\"greyhound\":\"Greyhound\",\"group 601\":\"グループ601\",\"group hinoran\":\"ぐる～ぷひのらん\",\"group i.n\":\"グループI・N\",\"group neko\":\"グループNEKO\",\"grungeworks\":\"GRUNGE WORKS\",\"gt works\":\"GT Works\",\"gu no nai curry\":\"具のないカレー\",\"guchi wotabatake\":\"愚痴ヲタ畑\",\"gudon-no-uta\":\"ぐどんの歌\",\"guhan shounen\":\"虞犯少年\",\"guild plus\":\"Guild Plus\",\"guillotine mozzarella\":\"ぎろちんモッツァレラ\",\"gul-fuh\":\"Gul-Fuh\",\"gulf stream\":\"Gulf Stream\",\"gum base\":\"ガムベース\",\"gum junky\":\"ガムジャンキー\",\"gumi syrup\":\"グミシロップ\",\"guminchu\":\"ぐみんちゅ\",\"gummy-rise\":\"ガミ・ライズ\",\"gun modoki\":\"群モドキ\",\"gunjou kakumei\":\"群青革命\",\"gunjougoya\":\"群青小屋\",\"gunp\":\"GUNP\",\"guntank\":\"ガンタンク\",\"gurasan boots\":\"ぐらさんぶーつ\",\"guru guru honpo\":\"ぐるぐる本舗\",\"guruguru honpo\":\"ぐるぐる本舗\",\"guruguru taiyo\":\"ぐるぐる太陽\",\"gurumedou\":\"ぐるめ堂\",\"gurumepoppo\":\"ぐるめポッポ\",\"gururido\":\"ぐるり堂\",\"gusha\":\"グシャ!!\",\"gutari-ya\":\"ぐたり屋\",\"gutenberg no musume\":\"グーテンベルグの娘\",\"guts ichimotsu\":\"ガッツいちもつ\",\"guy-ya\":\"男屋\",\"guybase\":\"GUY基地\",\"gyara cter\":\"ギャラ☆クター\",\"gyarandoh\":\"逆乱堂\",\"gyarandou\":\"ぎゃらん堂\",\"gyf-107\":\"GYF-107\",\"gymno\":\"gymno\",\"gyogyou rengou\":\"漁業連合\",\"gyokotsu kouzou\":\"魚骨工造\",\"gyokumi\":\"漁組\",\"gyokusai club\":\"玉砕倶楽部\",\"gyokusaidan\":\"玉砕団\",\"gyokusaijima\":\"玉砕島\",\"gyomania\":\"ギョマニア\",\"gyotaku\":\"魚拓\",\"gyoubudou\":\"刑部堂\",\"gyoukousyu\":\"僥倖酒\",\"gyoutenriki\":\"仰天力\",\"gyunyu-gekijo\":\"牛乳劇場\",\"gyutto dakishimetai\":\"ギュっと抱きしめ隊\",\"gyuunyuuya\":\"牛乳屋\",\"gyuutou chikujinkai\":\"牛頭畜人会\",\"h and k\":\"H&K\",\"h na hon. ya san.\":\"Hなほん。やさん。\",\"h plus\":\"H+\",\"h senshokutai\":\"H染色体\",\"h-net\":\"H-net\",\"h-squad\":\"H-SQUAD\",\"h-sys.\":\"H-sYS.\",\"h.a.h.g.s\":\"H.A.H.G.S\",\"h.h\":\"H.H\",\"h.i.t. koubou\":\"H.I.T.工房\",\"h.p.c. meirei denpa\":\"H.P.C命令電波\",\"h.p.d.\":\"H.P.D.\",\"h.s.c.\":\"H.S.C.\",\"h3i\":\"H×3I\",\"haa haa works\":\"はぁはぁWORKS\",\"hacca candy\":\"薄荷キャンディー\",\"hacchakesou\":\"はっちゃけ荘\",\"hachi\":\"hachi\",\"hachibanchi no kaijin\":\"八番地の怪人\",\"hachigatsu futsuka\":\"八月二日\",\"hachijikan roudou\":\"はちじかんろーどー\",\"hachikoromura\":\"はちころ村\",\"hachimidosan\":\"八緑緑緑\",\"hachimin\":\"ハチミン\",\"hachimitsu himawari\":\"ハチミツヒマワリ\",\"hachimitsu pineapple\":\"はちみつパイナップル\",\"hachimitsu sand\":\"はちみつサンド\",\"hachimitsu soft\":\"はちみつそふと\",\"hachiwaredou\":\"ハチワレ堂\",\"hachiyou\":\"蜂様\",\"hadairo crayon\":\"はだいろクレヨン\",\"hadairo rooibos tea\":\"肌色ルイボスティー\",\"hadairozanmai\":\"肌色三昧\",\"hadantorque\":\"破断torque\",\"hadashi shoujo\":\"裸足少女\",\"haekake\":\"生えかけ\",\"haeya\":\"南風屋\",\"hagane koubou\":\"鋼工房\",\"hagane no naru ki\":\"羽鐘の鳴る木\",\"hagane no tsurugi\":\"はがねのつるぎ\",\"hagure maron\":\"はぐれまろん\",\"haguruma\":\"はぐるま\",\"haguruman\":\"はぐるまん\",\"hai-tai\":\"胚胎\",\"haiana gumentai\":\"肺穴愚麺隊\",\"haiboku kamen\":\"敗北仮面\",\"haidara\":\"haidara\",\"haigoku ryodan\":\"廃獄旅団\",\"haiiro jikuu\":\"灰色時空\",\"haiiro koubou betsumune\":\"灰色工房別棟\",\"haiiro ookami\":\"灰色狼\",\"haikara cafe\":\"ハイカラ喫茶\",\"haikibutsushorijou\":\"廃棄物処理場\",\"haikiro\":\"灰奇路\",\"haikuo-soft\":\"ハイクオソフト\",\"haim mint\":\"ハイムミント\",\"haine club\":\"灰猫倶楽部\",\"hairyo fusoku\":\"配慮不足\",\"haisui no jin\":\"ハイスイノ陣\",\"haitokukan\":\"背德漢\",\"hajimari to owari\":\"はじまりとおわり\",\"hakaba\":\"墓場\",\"hakidame no koganemushi\":\"掃き溜めのこがねむし\",\"hakka onsen\":\"ハッカ温泉\",\"hakkakyou\":\"八卦鏡\",\"hakkekkyuu sekkekkyuu\":\"白血球赤血球\",\"hakkindo\":\"白金堂\",\"hakobune\":\"箱舟\",\"hakkou kimuti\":\"発光きむち\",\"hakoniwa toshokan\":\"ハコニワトショカン\",\"hakonyan.\":\"はこにゃん。\",\"hakorimu\":\"はこりむ\",\"hakubajin\":\"はくばじん\",\"hakuchuu doudou\":\"白昼堂々\",\"hakuchuu shobou\":\"白昼書房\",\"hakudakukei\":\"白濁系\",\"hakuginkan\":\"白銀冠\",\"hakugyoku aquarea\":\"白玉アクエリア\",\"hakushu kassai\":\"拍手喝罪\",\"hakusuijuko\":\"白水重工\",\"hakusyoku miminagaten\":\"白触耳長店\",\"hakutoukai\":\"白糖会\",\"hakuzendo honpo\":\"白髯堂本舗\",\"halcyon\":\"Halcyon\",\"halcyon factory\":\"Halcyon Factory\",\"halcyon maker\":\"ハルシオンメーカー\",\"half mile\":\"はーふまいる\",\"hallenchi planet\":\"ハレンチプラネット\",\"hallucigenia\":\"ハルキゲニア\",\"halopack\":\"HALOぱっく\",\"haltype\":\"ハルタイプ\",\"halumonica\":\"Halumonica\",\"halvetica\":\"HALvetica\",\"halworks\":\"HALWORKS\",\"hamabeuo\":\"ハマベウオ\",\"hamachi tomosaku\":\"ハマチトモサク\",\"hamaiya\":\"はまい屋\",\"hamanan-doboku\":\"浜南土木\",\"hamanasu chaya\":\"はまなす茶屋\",\"hamasei\":\"浜せい\",\"hamehame service area\":\"はめはめサービスエリア\",\"hamham soft\":\"はむはむソフト\",\"hamiheya\":\"はみ部屋\",\"hammer head\":\"HAMMER_HEAD\",\"hamustar\":\"ハム星\",\"hamusuta-nonikomi\":\"ハムスターの煮込み\",\"hana tabako\":\"花煙草\",\"hana to ribon\":\"華とりぼん\",\"hana x hana\":\"花*はな\",\"hanada\":\"縹\",\"hanadorobou\":\"花泥棒\",\"hanafubuki gorilla\":\"花吹雪ゴリラ\",\"hanagara shirt\":\"花柄シャツ\",\"hanairogaeru\":\"花色蛙\",\"hanaji koubou\":\"鼻血工房\",\"hanakuchi mememe\":\"はなくちめめめ\",\"hanamachi horebore chou\":\"花町ホレボレ丁\",\"hanamachi shimaiten\":\"花街姉妹店\",\"hanami-ga saku\":\"花実ガ咲ク\",\"hanamiduki\":\"華みづき\",\"hanamuguri\":\"花潜\",\"hanao shouke\":\"花尾娼家\",\"hanasameyashiro\":\"花雨社\",\"hanaya\":\"華屋\",\"hanbyounin\":\"半病人\",\"hand-grip\":\"はんどぐりっぷ\",\"handful happiness\":\"Handful☆Happiness!\",\"hang on\":\"ハングオン\",\"hanger hansha\":\"ハンガー反射\",\"hanibi land\":\"hanibi land\",\"hanigura soft\":\"はにぐらそふと\",\"haniwa mania\":\"ハニワマニア\",\"haniya\":\"はに屋\",\"hanjuku kinokotei\":\"半熟茸亭\",\"hanjuku nora\":\"ハンジュクノラ\",\"hanjuku yude tamago\":\"半熟茹で卵\",\"hannama\":\"はんなま\",\"hanshi x hanshow\":\"半死半生\",\"hanya yashiki\":\"はにゃ屋敷\",\"hanyan\":\"覇娘。\",\"hanzai tengoku\":\"犯罪天国\",\"haochi\":\"haochi\",\"haoh\":\"覇王\",\"hapa\":\"ハーパー\",\"hapihapi\":\"hapihapi\",\"happaya\":\"葉っぱ屋\",\"happiness milk\":\"はぴねすみるく\",\"happo ryuu\":\"HAPPO流\",\"happy drive\":\"はっぴぃどらいぶっ!\",\"happy life\":\"Happy Life\",\"happy lime\":\"はっぴぃライム\",\"happy man\":\"Happy Man\",\"happy paranoia\":\"ハッピーパラノイア\",\"happy present\":\"はっぴーぷれぜんと\",\"happy strawberry\":\"はっぴーすとろべりー\",\"happy studio\":\"HAPPY STUDIO\",\"happy time\":\"ハッピータイム\",\"happy turn\":\"はっぴ〜た〜ん\",\"happy unbirthday\":\"HAPPY UNBIRTHDAY\",\"happydrop\":\"Happydrop\",\"happypink\":\"happypink\",\"hara-zoo\":\"HARA-ZOO\",\"haradaya\":\"原田屋\",\"haraguro tenshi\":\"腹黒天使\",\"haraise kaiwai\":\"ハライセカイワイ\",\"harakiri gozen\":\"ハラキリ御膳\",\"harakiri yakkyoku\":\"腹切薬局\",\"harako misshitsu\":\"はらこ密室\",\"haranabi shuppan\":\"はらなび出版\",\"harapecodonburi\":\"はらぺこどんぶり\",\"harapekkoken\":\"ハラペッコケン\",\"harapeko shucchoujo\":\"はらぺこ出張所\",\"harapeko teishoku\":\"はらぺこ定食\",\"harapekopon\":\"はらぺこぽん\",\"haratama\":\"ハラタマ\",\"hard days\":\"hard days\",\"hard hypno\":\"HARD HYPNO\",\"hard lucker\":\"Hard Lucker\",\"hard puncher maniax\":\"Hard Puncher Maniax\",\"hardcore 001\":\"ハードコア001\",\"hardcore zayaku souten\":\"ハードコアザヤクソウテン\",\"hardcore zutsuu\":\"ハードコア頭痛\",\"harem\":\"Harem\",\"harem heat\":\"ハーレムヒート\",\"haresaku\":\"ハレサク\",\"hari poteto\":\"はりぽてと\",\"hariko no tora\":\"はりこのとら\",\"harinezumi koubou\":\"はりねずみ工房\",\"hariwata\":\"hariwata\",\"harmorise\":\"Harmorise\",\"harness\":\"HARNESS\",\"harogen\":\"ハロゲン\",\"harshwordsworth\":\"harshwordsworth\",\"haru mochi\":\"はるもち\",\"haru youbi\":\"春曜日\",\"harugoya\":\"はるごや\",\"harugumo.\":\"はるぐも。\",\"haruiro fudepen\":\"はルいろ筆ペン\",\"haruiro no sora\":\"春色の空\",\"harukaze\":\"HARUKAZE\",\"harukomachikan.\":\"はるこまちかん。\",\"harumachi tsurara\":\"春待氷柱\",\"harumankai\":\"はるまん会\",\"harumichi\":\"ハルミチ\",\"harunoyu\":\"ハルノユ\",\"harureri\":\"はるれり\",\"harusame lunch b set\":\"はるさめランチBセット\",\"harusame-soup\":\"はるさめすぅぷ\",\"harvest\":\"HARVEST\",\"harvest home\":\"ハーベストホーム\",\"hashi to knife de niku wo kiru\":\"はしとナイフで肉を切る\",\"hashikure koubou\":\"はしくれ工房\",\"hasoyua\":\"ハソユア\",\"hasshaku-sama\":\"八尺様\",\"hastured cake\":\"ハスタードケーキ\",\"hasuya\":\"はす家\",\"hatahata factory\":\"ハタハタ工房\",\"hatake no oniku\":\"はたけのお肉\",\"hato suppressor\":\"ハトサプレッサー\",\"hatogoya\":\"鳩小屋\",\"hatomame\":\"ハトマメ\",\"hatomugi x genmai\":\"はとむぎげんまい\",\"hatosable\":\"ハトサブレ\",\"hatsuai roumanjou\":\"初愛浪漫帖\",\"hatsuen kikan\":\"発煙器官\",\"hatsushio\":\"ハツ塩\",\"hattari dou\":\"はったり堂\",\"havemoon\":\"はべむん\",\"hawk bit\":\"ホークビット\",\"hayaku byouin e itte kudasai\":\"早く病院へ行ってください\",\"hayashi puramoten\":\"はやしプラモ店\",\"hayo-cinema\":\"はよしねま\",\"hayonipo\":\"はよにぽ\",\"hazama\":\"狭間\",\"hazuki tsuitachi\":\"葉月一日\",\"hb\":\"HB\",\"hbo\":\"HBO\",\"hcg\":\"HCG\",\"hcom\":\"hcom\",\"header liner\":\"へっだらいなー\",\"headroom\":\"HEADROOM\",\"healthy prime\":\"HEALTHY PRIME\",\"heart ga hitotsu\":\"ハートがひとつ\",\"heart house\":\"HEART HOUSE\",\"heart of cool\":\"Heart of cooL\",\"heart some bread\":\"heart some bread\",\"heart tail\":\"ハートテイル\",\"heart work\":\"HEART WORK\",\"heartfolio\":\"Heartfolio\",\"heartless k\":\"ココロナシK\",\"hearts\":\"Hearts\",\"hearts and crusts\":\"HEARTS & CRUSTS\",\"hearts nest\":\"Heart's Nest\",\"heat-soft\":\"HEAT-SOFT\",\"heavenstar\":\"ヘヴンスター\",\"heavenly\":\"heavenLy\",\"heavens\":\"HEAVENS\",\"heavens gate\":\"Heaven's Gate\",\"heavens unit\":\"HEAVEN'S UNIT\",\"heavy syrup\":\"Heavy syrup\",\"hebereke black7\":\"へべれけBLACK7\",\"hebichang\":\"へびちゃんぐ\",\"hebitunagary\":\"ヘビツナガリ\",\"hechima koubou\":\"へちま工房\",\"hechima teishoku\":\"ヘチマ定食\",\"hechocho\":\"ヘ蝶々\",\"hegurimurayakuba\":\"へぐり村役場\",\"heiantei\":\"平安亭\",\"heika hp\":\"HEIKA HP\",\"heikoto\":\"へいこと\",\"heikoushihenkei\":\"平行四辺形\",\"heineken\":\"Heineken\",\"heinetsu 37 degrees celsius\":\"平熱37°C\",\"heinetsu 98.5 degrees v\":\"平熱98.5°V\",\"heisei chachamaru dou\":\"平成茶々丸堂\",\"heisei metal gakuen\":\"平成メタル学園\",\"heisen-dou\":\"へいせん堂\",\"heiwa seisakujo\":\"平和製作所\",\"heiyou kinki.\":\"ヘイヨウキンキ。\",\"hekiga ni nemuru\":\"壁画に眠る\",\"hekireki\":\"霹靂\",\"hekiten industrial complex\":\"碧天コンビナート\",\"hekohekoroid shidan\":\"へこへこロイド師団\",\"helicalrizing\":\"HelicaLRizinG\",\"hell-ion\":\"HELL-ION\",\"helldevice\":\"HellDevice\",\"hellenism\":\"へれニズム\",\"hellfragrance\":\"ヘルフレグランス\",\"hello girls\":\"Hello Girls!\",\"hellter skelter\":\"HELLTER SKELTER\",\"helmet ga naosemasen\":\"ヘルメットが直せません\",\"hemelopa\":\"HeMeLoPa\",\"henderson\":\"HENDERSON\",\"hending\":\"Hending\",\"hentai emblem\":\"へんたいゑむぶれむ\",\"hentai maker tomo no kai\":\"Hentai Maker 友の会\",\"hentai musume\":\"へんたい娘\",\"hentai ojisan\":\"ヘンタイオジサン\",\"hentai to hentai no hentai\":\"HENTAI to HENTAI no HENTAI\",\"hentaiworks\":\"hentaiworks\",\"henyottobird\":\"へにょっとばーど\",\"hep\":\"HEP\",\"heppoko housing\":\"へっぽこはうじんぐ\",\"heppoko youchien\":\"へっぽこ幼稚園\",\"heppokodou\":\"へっぽこ堂\",\"herencia\":\"HERENCIA\",\"hermes shobou\":\"ヘルメス書房\",\"hermit\":\"ハーミット\",\"hermit9\":\"ハーミット9\",\"heroes factory\":\"HEROES FACTORY\",\"herohero hospital\":\"へろへろHospital\",\"heroine engineering\":\"ヒロイン工学研究所\",\"heroineism\":\"Heroineism\",\"herunia tengoku\":\"ヘルニア天国\",\"heshi factory\":\"HESHI FACTORY\",\"hesogoma\":\"へそごま\",\"hesoten\":\"ヘソてん\",\"heta no yoko zuki\":\"ヘタの横好き\",\"hetalearts\":\"ヘタレアーツ\",\"hetaretch\":\"へたれっち\",\"hetchhog\":\"へっちほっぐ\",\"hews\":\"Hews\",\"hexaflange\":\"hexaflange\",\"hexagram point\":\"ヘキサグラムポイント\",\"hexenhaus\":\"ヘクセンハウス\",\"hey you\":\"hey you!\",\"heya no sumi.\":\"部屋の隅。\",\"hgh\":\"HGH\",\"hgt labo\":\"HGTラボ\",\"hhb\":\"hhb\",\"hht\":\"HHT\",\"hi-cal\":\"Hi-CAL\",\"hi-flier\":\"Hi-Flier\",\"hiatari ryoukou\":\"日当良好\",\"hibari\":\"★☆雲雀☆★\",\"hibi kirari production\":\"ひびきらりプロダクション\",\"hibi rakuraku\":\"日日楽楽\",\"hibiiro clutch\":\"ヒビイロクラッチ\",\"hibiki\":\"響輝\",\"hibinoutao\":\"ヒビノウタオ\",\"hibitoridori\":\"日々鳥々\",\"hibon\":\"非凡\",\"hidari kara shitsurei\":\"左から失礼\",\"hidarikiki\":\"HIDARIkiki\",\"hidden sideway\":\"ryuuta\",\"hiensou\":\"飛燕想\",\"hierarchy\":\"ヒエラルキー\",\"hiero\":\"ハイエロ\",\"higashi no penguine\":\"東のペンギン\",\"higasimikawa midoriiro doukoukai\":\"東三河みどり色同好会\",\"hige to deko\":\"Hige to deko\",\"higedaihuku\":\"ひげ大福\",\"higeudon\":\"ひげうどん\",\"high fly flow\":\"はいふらいふろう\",\"high risk revolution\":\"HIGH RISK REVOLUTION\",\"high star\":\"HIGH STAR\",\"high thrust\":\"ハイスラスト\",\"high-spirit\":\"High-Spirit\",\"highdrug\":\"HighDrug\",\"highend\":\"ハイエンド\",\"highleg peach\":\"ハイレグピーチ\",\"highrunning\":\"HighRunning\",\"highway\":\"highway\",\"highway61\":\"Highway61\",\"higouhou shoujo\":\"非合法少女\",\"hihiyama tsuyabon\":\"比比山艶本\",\"hijet\":\"ハイジェット\",\"hijiki-ya\":\"ひじき屋\",\"hijinzou\":\"非人造\",\"hijouguchi\":\"ひじょうぐち\",\"hikage mon\":\"日陰もん\",\"hikagemono\":\"ヒカゲモノ\",\"hikari club\":\"光クラブ\",\"hikari no ki\":\"光の樹\",\"hikari no tomoshibi\":\"光の燭\",\"hikarito mahou koubou\":\"光と魔法工房\",\"hikodge beya\":\"彦二部屋\",\"hikou dai 50 sentai\":\"飛行第50戦隊\",\"hikousensuitei\":\"飛行潜水亭\",\"hiland-studio\":\"ハイランド工房\",\"hima serval\":\"ひまサーバル\",\"himajinism\":\"ひまじにずむ\",\"himameshiki\":\"火豆式\",\"himawari endan\":\"ひまわり園団\",\"himawari seed\":\"ひまわりシード\",\"himawari-noren\":\"向日葵のれん\",\"himawarisou\":\"ひまわり荘\",\"hime club\":\"姫倶楽部\",\"himegami\":\"姫神\",\"himehajime.com\":\"himehajime.com\",\"himepuchitei\":\"ひめぷち亭\",\"himitsu doyoubi\":\"秘密土曜日\",\"himitsu kessha vanitas\":\"秘密結社ヴァニタス\",\"himitsu tetra\":\"ひみつテトラ\",\"hinaeron\":\"ひなえろん\",\"hinahara yashiki\":\"ひなはら屋敷\",\"hinahina box\":\"HINAHINA BOX\",\"hinakan\":\"ひなかん\",\"hinamaru chuujou\":\"ひな丸中将\",\"hinamaru soft\":\"ヒナマルソフト\",\"hinaprin\":\"ひなプリン\",\"hinatabokko\":\"ひなたぼっこ\",\"hinatabokko club\":\"ひなたぼっこ倶楽部\",\"hinauta\":\"ひなうた\",\"hinjyaku\":\"HINJYAKU\",\"hinoenma haken jimukyoku\":\"催眠すし屋\",\"hinoiti\":\"ヒノイティ\",\"hinokiburo\":\"檜風呂\",\"hinokist\":\"hinokist\",\"hinouhe family\":\"ひのうへファミリー\",\"hirani\":\"ヒラマニ\",\"hirame jichiku\":\"ひらめ自治区\",\"hirari\":\"ひらり\",\"hirataira\":\"平平\",\"hired girl\":\"ハイヤードガール\",\"hirekatsu\":\"ヒレカツ\",\"hiroi heya\":\"拾い部屋\",\"hirojuu renshuuchou\":\"広十練習帖\",\"hirokaworld\":\"ヒロカワールド\",\"hirumeshidoki\":\"昼飯時\",\"hirusagari no bijutsukan\":\"昼下がりの美術館\",\"hisoutan\":\"ひそうたん\",\"hispano-suiza\":\"Hispano-Suiza\",\"hissatsuwaza\":\"ひっさつわざ\",\"hisuitei\":\"翡翠亭\",\"hitobankoneko\":\"一晩仔猫\",\"hitodenashi\":\"ひとでなし\",\"hitoe\":\"一重\",\"hitokumi\":\"ひとくみ\",\"hitomaron\":\"ひとまろん\",\"hitonchi\":\"ひとんち\",\"hitori de dekirumon\":\"火鳥でできるもん！\",\"hitori kakumei\":\"一人革命\",\"hitori no daiyokujou\":\"一人の大浴場\",\"hitori online\":\"一人オンライン\",\"hitori tower bridge\":\"ヒトリタワーブリッジ\",\"hitoride dekirumon\":\"ひとりでできるもんっ\",\"hitoriyorihutari\":\"ヒトリヨリフタリ\",\"hitoriyou no pot\":\"ひとりようのポット\",\"hitotosensou\":\"一年戦争\",\"hitoya-r\":\"ヒトヤ-R\",\"hitoyasumi\":\"ひとやすみ\",\"hitstales\":\"ヒッツッツ\",\"hitsuji drill\":\"羊ドリル\",\"hitsuji no munko hiryou\":\"羊のむんこ肥料\",\"hitsuji to kitsune\":\"ひつじときつね\",\"hitsuji-1ban-shibori\":\"ヒツジ一番搾り\",\"hitsujimama\":\"ひつじまま\",\"hitsujin toko\":\"ひつじんトコ\",\"hitsujiniku\":\"ひつじにく\",\"hitujinoki\":\"ひつじの木\",\"hiwatari honpo\":\"樋渡本舗\",\"hiyashi asia\":\"ヒヤシアジア\",\"hiyashi chuuka hajimemashita\":\"冷し中華おわりました\",\"hiyashichuuka hajimemashita\":\"冷やし中華はじめました\",\"hiyocco\":\"HIYOCCO\",\"hiyoko box\":\"ひよこBOX\",\"hiyoko crown\":\"HIYOKO CROWN\",\"hiyoko soft\":\"ひよこソフト\",\"hiyori hamster\":\"ひよりハムスター\",\"hiyorimi no sora\":\"ひよりみのソラ\",\"hiyotamaya\":\"ひよたま屋\",\"hiyoubeya\":\"飛葉部屋\",\"hizadachi bunny\":\"膝立ちバニー\",\"hizamakura\":\"ひざまくら。\",\"hizatora\":\"ヒザトラ\",\"hj production\":\"HJプロダクション\",\"hjukism\":\"HJUKISM\",\"hk\":\"HK\",\"hkmnk\":\"hkmnk\",\"hl\":\"エイチェル\",\"hlz\":\"hlz\",\"hm\":\"HM\",\"hma\":\"HMA\",\"hn.03\":\"Hn.03\",\"hobby land soft\":\"Hobby Land Soft\",\"hochidonmai\":\"ほちどんまい\",\"hoepporoppo\":\"ほえっぽろっぽ\",\"hoge hoge club\":\"ほげほげCLUB\",\"hogege\":\"HOGEGE\",\"hogeplan\":\"HOGEPLAN\",\"hogero kikaku\":\"ほげろー企画\",\"hohhe dan\":\"ほっへ!!団\",\"hokanko\":\"ほかんこ\",\"hokentaiiku\":\"保健体育\",\"hokkahoka-mesotei\":\"ほっかほかめそ亭\",\"hokke\":\"ホッケ\",\"hokke o tabeyou\":\"ほっけを食べよう\",\"hokkebain\":\"ほっけばいん!\",\"hokkepen\":\"ほっけぺん\",\"hokuroza\":\"ホクロ座\",\"hokushintei\":\"北辰亭\",\"hole in one\":\"ほーるいん椀\",\"holiday note\":\"Holiday Note\",\"holiday school\":\"休日学校\",\"holy avenger\":\"ホーリーアベンジャー\",\"holymist\":\"HolyMist\",\"homadelic.\":\"homadelic.\",\"home wrecker\":\"ホームレッカー\",\"homerun chaya\":\"ホームラン茶屋\",\"homuhomu seisakujo\":\"ほむほむ製作所\",\"homunculus\":\"ホムンクルス\",\"honda koumuten\":\"本田工務店\",\"hone shaburi-tei\":\"骨しゃぶり亭\",\"honekawaya\":\"ホネカワ屋\",\"honey bomb\":\"ハニーボム\",\"honey bump\":\"ハニーバンプ\",\"honey bunny\":\"ハニーバニー\",\"honey crunch\":\"HONEY*CRUNCH\",\"honey dipped\":\"Honey Dipped\",\"honey knuckle\":\"Honey Knuckle\",\"honey lounge\":\"honey lounge\",\"honey pharmacy\":\"Honey Pharmacy\",\"honey rice\":\"はちみつごはん\",\"honey rider69\":\"Honey Rider69\",\"honeybee\":\"honeybee\",\"honeybee-tea\":\"蜜蜂紅茶\",\"honeycrown\":\"HoneyCrown\",\"honeysuckle\":\"Honeysuckle\",\"hongkong hanten\":\"香港飯店\",\"honjitsu no higawari lunch\":\"本日の日替わりランチ\",\"honmatsu tentou\":\"本末天道\",\"honnojihen\":\"ホンノーヂヘン\",\"honnori tei\":\"ほんのり亭\",\"honnou juushigata\":\"本能重視型\",\"honnou to yokubou no gyuutan\":\"本能と欲望の牛タン\",\"honohono\":\"HonoHono\",\"honoka na omochiya\":\"ほのかなおもち屋\",\"honomiya\":\"穂の実舎\",\"honoyurara\":\"HONOYURARA\",\"honpou kishitsu\":\"奔放気質\",\"hontoinu\":\"ほんトいぬ\",\"honya no hidari click\":\"ほにゃーの左クリック\",\"hoppe\":\"hoppe\",\"hopper island\":\"ホッパーアイランド\",\"hopuhopu team\":\"ほぷほぷチーム\",\"horic works\":\"HORIC WORKS\",\"horiishi horuto\":\"堀石掘人\",\"horimonya\":\"彫りモン屋\",\"horloger\":\"Horloger\",\"horohoro tei\":\"ホロホロ亭\",\"horonaminz\":\"ホロナミンZ\",\"horumon curry\":\"ほるもんカレー\",\"hoshizora kagekidan\":\"星空華劇団\",\"hoshi ni kaeru\":\"星に帰る!\",\"hoshi no kuzu\":\"星の屑\",\"hoshi no yume\":\"星の夢\",\"hoshiame\":\"星飴\",\"hoshidokei\":\"星時計\",\"hoshiedatei\":\"ほしえだ亭\",\"hoshikuzu comet\":\"星屑コメット\",\"hosikuz dolce\":\"星屑ドルチェ\",\"hoshimaki project\":\"ほしまきProject\",\"hoshimitai\":\"ほしみたい\",\"hoshinagi\":\"星凪\",\"hoshinatenpo\":\"保科店舗\",\"hoshiratta\":\"星らった\",\"hoshiyukicha\":\"干し雪茶\",\"hoshizono\":\"星園\",\"hoshizora tokou\":\"星空渡航\",\"hosi hutatu.\":\"ほしふたつ。\",\"hosinokuzu\":\"Hosinokuzu\",\"hosizora step\":\"星空ステップ\",\"hosokawaya\":\"細川屋\",\"hot kari\":\"H：O：T(仮)\",\"hot language\":\"ホットランゲージ\",\"hot pot\":\"Hot Pot\",\"hotateya\":\"ほたてや。\",\"hotel california\":\"加州大飯店\",\"hotoariboshi\":\"ほとおり星\",\"hotori bocchi\":\"ほとりぼっち\",\"houenken\":\"方円軒\",\"hougyoku densetsu\":\"宝玉伝説\",\"houjuan\":\"峯寿庵\",\"houkago paradise\":\"放課後パラダイス\",\"houkiboshi\":\"箒星\",\"hououya\":\"鳳凰屋\",\"houruri\":\"蓬瑠璃\",\"house game\":\"ハウスゲーム\",\"house of karsea\":\"ハウス オブ KARSEA\",\"house saibai mochi\":\"ハウス栽培もち\",\"houzuki\":\"ほう☆づき\",\"however\":\"However\",\"hozmi kan\":\"ほづみかん\",\"hozuriya\":\"ほづり屋\",\"hr\":\"HR\",\"hr-st\":\"HR-ST\",\"http\":\"http\",\"hukakuteiseigenri\":\"不確定性原理\",\"hulotte\":\"Hulotte\",\"human high-light film\":\"ヒューマン・ハイライト・フィルム\",\"hummel\":\"ヒュンメル\",\"huri-neko\":\"ふりかえればねこがいる\",\"hutoshi nyuugyou\":\"ふとし乳業\",\"huzinami koubou\":\"藤波工房\",\"hy-dou\":\"灰同\",\"hyakkarou no tanuki\":\"百華楼の狸\",\"hyakuen nikuniku\":\"百元肉々\",\"hyakuitishiki\":\"百壱式\",\"hyakumangoku\":\"百萬石\",\"hyakutake sakusen\":\"百武作戦\",\"hyakuyoubako\":\"百葉箱\",\"hyamolot bakurai\":\"ヒャモロット爆雷\",\"hybrid jimushitsu\":\"ハイブリッド事務室\",\"hydden world\":\"ひどぅんワールド\",\"hydroharbor\":\"HydroHarbor\",\"hyk42\":\"HYK42\",\"hyoco road\":\"ひょこ道\",\"hyouketsu mikan\":\"氷結蜜柑\",\"hyper houbokujou\":\"ハイパー放牧場\",\"hyper summer wars\":\"ハイパーサマーウォーズ\",\"hyperiyon\":\"はいぺりよん\",\"hypnotic angel\":\"Hypnotic Angel\",\"hypnotisms\":\"hypnotisms\",\"hyspaniplus\":\"HyspaniPlus\",\"hysteric typhoon\":\"ヒステリックタイフーン\",\"hyudorabo\":\"ひゅどらぼ\",\"hzkletter\":\"HZKletter\",\"i\":\"I\",\"i am a rock\":\"I am a Rock\",\"i slash h slash r\":\"I/H/R\",\"i think\":\"i think\",\"i-proya\":\"あいぷろ屋\",\"i.r.o.zi\":\"i.r.o.Zi\",\"i.s.o.p.\":\"I.S.O.P.\",\"i.t.gyro\":\"I.T.ジャイロ\",\"ibiza\":\"Ibiza\",\"ibotsukigunte\":\"いぼつきぐんて\",\"ibros\":\"ibros\",\"ice cream\":\"アイスクリウム\",\"ice kick\":\"アイスキック\",\"ice lycoris\":\"氷のリコリス\",\"ice manjuu\":\"あいす饅頭\",\"ice pink\":\"Ice Pink\",\"ice sugar\":\"Ice Sugar\",\"ice-place\":\"ICE-PLACE\",\"ichigo\":\"いちご\",\"ichigo bakery\":\"イチゴベーカリ\",\"ichigo batake\":\"いちご畑\",\"ichigo crepe oomorigumi\":\"いちごクレープ大盛組\",\"ichigo fax\":\"Ichigo Fax\",\"ichigo ichie\":\"一期一会\",\"ichigo jet\":\"いちごじぇっと\",\"ichigo maririn\":\"いちごマリ凛\",\"ichigo milk\":\"いちごみるく\",\"ichigoen\":\"いちご苑\",\"ichigohou\":\"苺砲\",\"ichigoya\":\"いちご屋\",\"ichikasho nihoukou\":\"一箇所二方向\",\"ichikawa gekibansha\":\"市川劇版社\",\"inomaru\":\"いの丸\",\"ichimatsu kougyou\":\"市松稿行\",\"ichimonkai\":\"一門会\",\"ichinichi atelier\":\"いちにちアトリエ\",\"ichinichijuu guttari\":\"一日中ぐったり\",\"ichino nijou\":\"いちのにじょう\",\"ichinose\":\"一ノ瀬\",\"ichiokumangenjaya\":\"一億万軒茶屋\",\"ichiokunen wakusei\":\"1億年惑星\",\"ichiya neko no yume\":\"一夜猫の夢\",\"ichiya teikoku\":\"壱屋帝国\",\"ichiyonroku\":\"イチヨンロク\",\"ichiyuzai\":\"壱釉斎\",\"icicle\":\"Icicle\",\"iciclepink\":\"IciclePink\",\"ico-ba\":\"Ico-ba\",\"idenshi no fune\":\"遺伝子の舟\",\"idivide\":\"アイディバイド\",\"ido no naka\":\"井戸の中\",\"ido no soko\":\"井戸の底\",\"idobata kaigisho\":\"井戸端会議所\",\"idolize\":\"iDOLIZE\",\"idomizuya\":\"井戸水屋\",\"if no danpen\":\"ifの断篇\",\"ifdef\":\"ifdef\",\"ifpark com\":\"ifpark.com\",\"igou\":\"異郷\",\"iihama shokudou\":\"飯浜食堂\",\"iihitoya dosukoidou\":\"いい人屋どすこい堂\",\"iiiiitune\":\"IIIIItune\",\"iinari bijin\":\"いいなり美人\",\"iio tetsuaki honpo\":\"飯尾鉄明本舗\",\"iiwake-gaisya\":\"いいわけ会社\",\"iji\":\"IJI\",\"ijigen kichi\":\"異次元基地\",\"ijiise\":\"イジイセ\",\"ik.projectear\":\"IK.projectear\",\"ika client\":\"いか・クライアント\",\"ikaruganomiya\":\"斑鳩宮\",\"ikasumi no dendou\":\"イカスミの殿堂\",\"ikasumiya\":\"烏賊墨屋\",\"ikechika\":\"いけちか\",\"ikeda jun kikakushitsu\":\"池田淳企画室\",\"ikemen teikoku\":\"イケメン帝国\",\"ikennabi\":\"イケンナビ\",\"ikibata 49ers\":\"いきばた49ERS\",\"ikigire shoukai\":\"いきぎれ商会\",\"ikihaji hummingbird\":\"生き恥ハミングバード\",\"ikite-chou-made-todoku\":\"生きて腸まで届く\",\"ikka risan\":\"一家離散\",\"ikkansei\":\"一貫星\",\"ikuiku com\":\"いくいくコン\",\"ikumura\":\"郁村\",\"ikuukan massatsu-ken\":\"異空間抹殺圏\",\"ild cat\":\"ILD CAT\",\"illuminator\":\"illuminator\",\"illust koubou kakutasu\":\"イラスト工房描くたす\",\"im\":\"Im\",\"im fragile\":\"i'm Fragile\",\"imagawatei\":\"今川亭\",\"image craft\":\"IMAGE CRAFT\",\"image rider\":\"Image Rider\",\"imagination scenery\":\"Imagination scenery\",\"imagineforme\":\"イマジンフォルム\",\"imakan\":\"IMAKAN\",\"imakaya\":\"いまか屋\",\"imasori dondai\":\"イマソリドンダイ\",\"imazon no ana\":\"今ゾンの穴\",\"imitation genome\":\"イミテーションゲノム\",\"imitation moon\":\"Imitation Moon\",\"imitation star\":\"イミテーション スタア\",\"immoral heart\":\"Immoral Heart\",\"imoarai-ya\":\"芋洗屋\",\"imomaru\":\"芋。\",\"imopotato\":\"いもポテト\",\"imotare\":\"imotare\",\"imoutogensouzitiku\":\"妹幻想自治区\",\"imozaiku\":\"いもざいく\",\"imozuru-shiki\":\"いもずる式\",\"imperial chicken\":\"インペリアルチキン\",\"imuneko\":\"イムネコ\",\"in the teapot\":\"In the Teapot\",\"in the water\":\"in the WATER.\",\"inaf\":\"INAF\",\"inai uchi ni\":\"いないうちに\",\"inakagurashi\":\"イナカグラシ\",\"inaridou shoten\":\"稲荷堂書店\",\"inarimochi.\":\"いなり餅。\",\"inarizushi\":\"いなりずし\",\"inasaku\":\"稲作\",\"inayama shrine\":\"稲山神社\",\"inchikidou\":\"いんちき堂\",\"include\":\"include\",\"independenko\":\"インデペンダンコ\",\"ineusaruka\":\"イネウサルカ\",\"infinity\":\"infinity\",\"infinity line\":\"infinity line\",\"iniminimanimo\":\"イニミニマニモ\",\"initiative\":\"イニシアティ部\",\"inja no kuruwa\":\"陰者の廓\",\"inkstone\":\"InkStone\",\"inner map\":\"Inner Map\",\"innocence\":\"Innocence\",\"innocent lucy\":\"イノセントルーシー\",\"inran teddy bear\":\"淫乱テディベア\",\"inre\":\"インレ\",\"inshoujo\":\"淫少女\",\"insky.\":\"insky.\",\"inspi.\":\"inspi.\",\"inspire\":\"inspire\",\"intendou\":\"淫天堂\",\"interlude\":\"interlude\",\"intondou\":\"隠遁堂\",\"intrepid\":\"イントレピッド\",\"inu batake\":\"犬畑\",\"inu no sekai\":\"いぬのせかい\",\"inu ringo\":\"イヌリンゴ\",\"inu system\":\"犬システム\",\"inu to kotatsu\":\"犬とコタツ\",\"inubaka\":\"いぬばか\",\"inudamashi\":\"いぬだまし\",\"inudrill lolita engine\":\"イヌドリルロリータエンジン\",\"inudrill.\":\"イヌドリル。\",\"inuduya\":\"いぬづや\",\"inufuro\":\"いぬふろ\",\"inuhouse.\":\"いぬはうす。\",\"inukamedou\":\"いぬかめ堂\",\"inukare\":\"犬彼\",\"inuyamakagashi\":\"イヌヤマカガシ\",\"inuyoukan\":\"狼幼館\",\"inuzuka clinic\":\"犬塚クリニック\",\"inym\":\"INYM\",\"inyu-goya\":\"いにゅ小屋\",\"io lite\":\"Io Lite\",\"ioom\":\"ioom\",\"ioteact\":\"Ioteact\",\"ip\":\"IP\",\"ipheion\":\"Ipheion\",\"ippatsu shooter\":\"一発シューター\",\"ippatsutei\":\"一発亭\",\"ippo mae e\":\"一歩前へ\",\"ipro back dancers\":\"iProバックダンサーズ\",\"iraremai\":\"いられまい\",\"irekubadou\":\"いれくば堂\",\"irene\":\"Irene\",\"iris art\":\"Iris art\",\"iro neko pencil\":\"色ねこペンシル\",\"irodorip\":\"彩RIP\",\"iroiroiro\":\"iroiroiro\",\"iroman\":\"いろまん\",\"iron\":\"iron\",\"iron fin\":\"IRON FIN\",\"iron grimoire\":\"IRON GRIMOIRE\",\"iron plate\":\"あいあんぷれーと\",\"iron sugar\":\"アイアンシュガー\",\"iron y\":\"IRON Y\",\"isada-ke\":\"いさだ家\",\"isami kaihatsu jigyoudan\":\"イサミ再開発事業団\",\"ise no mug cup\":\"いせのマグカップ\",\"isekai ryokou dairiten\":\"異世界旅行代理店\",\"ishi kenpi\":\"石ケンピ\",\"ishi wa hakanaki ame no shirabe ni\":\"意思は儚き雨の調べに\",\"ishidaya\":\"イシダヤ\",\"ishikari shake nabe doukoukai\":\"石狩しゃけ鍋同好会\",\"ishikorodou\":\"イシコロドウ\",\"ishin denshin\":\"以心伝心\",\"ishitoku ya\":\"イシトク屋\",\"island belle\":\"Island Belle\",\"island green\":\"アイランドグリーン\",\"iso no sozaiten\":\"いその惣菜店\",\"isocurve\":\"アイソカーブ\",\"isofura\":\"いそふら\",\"isofura ribbon\":\"イソフラリボン\",\"isorashi dou\":\"イソラシ堂\",\"isotonix\":\"アイソトニクス\",\"isou\":\"isou\",\"issun kobo\":\"一寸工房\",\"isurusdo\":\"いするす堂\",\"itachitai\":\"イタチ隊\",\"itadaki\":\"頂\",\"itadaki cat\":\"イタダキキャット\",\"item box\":\"あいてむぼっくす\",\"itibosi\":\"ITIBOSI\",\"ito ichizo shouten\":\"伊藤一蔵商店\",\"itou chaba\":\"伊東茶葉\",\"itsuka no sora\":\"いつかのそら\",\"itsukano\":\"イツカノ\",\"itsukano cabayaki\":\"いつかのカバヤキ\",\"itsukidou\":\"樹堂\",\"itsutsuba no clover\":\"五つ葉のクローバー\",\"itsuwari no shirohata\":\"偽りの白旗\",\"ittou ryoudan\":\"一刀両断\",\"iv va shin\":\"IV VA SHIN\",\"ivory\":\"IVORY\",\"ivycrown\":\"ivycrown\",\"iwamanga honpo\":\"いわまんが本舗\",\"iwanakaya\":\"岩中屋\",\"iwashita shoten\":\"いわした書店\",\"iyokan.\":\"いよかん。\",\"iyou\":\"iYou\",\"izakaya yocchan\":\"居酒屋よっちゃん\",\"izayoi no tsuki\":\"十六夜の月\",\"izumi gakuen\":\"いずみ学園\",\"izumi shoseki\":\"いづみ書籍\",\"izumiyu\":\"イズミユ\",\"izumnizm\":\"イズムニズム\",\"izumo gasshuukoku\":\"いづも合衆国\",\"izumunizm\":\"IzumuNizm\",\"izuya\":\"IZU屋\",\"j\":\"j\",\"j-m-box\":\"J-M-BOX\",\"j.o.c e.go\":\"J.O.C★e.go!!\",\"j.s\":\"ジェイ・エス\",\"j7w\":\"j7w\",\"jabara yane\":\"じゃばら屋根\",\"jabyssk\":\"JabyssK\",\"jack dou\":\"ジャック堂\",\"jack-o-lantern\":\"ぢゃっからんたん\",\"jack-r\":\"Jack-R\",\"jackass\":\"ジャッカス\",\"jacklake\":\"Jacklake\",\"jackmarry\":\"JACKMARRY\",\"ja no michi wa hebi soft\":\"蛇ノ道ハ蛇ソフト\",\"jagaimo potato\":\"じゃがいもポテト\",\"jail black\":\"JaiL Black\",\"jajujo\":\"じゃじゅじょ\",\"jakushou jimusho shokun\":\"弱小事務所諸君\",\"jaleco\":\"ジャレコ\",\"jam\":\"ジャム\",\"jam kingdom\":\"ジャム王国\",\"jamboree\":\"Jamboree!\",\"jamurika\":\"ジャム理科\",\"jangari koubou\":\"じゃんがり工房\",\"janis toilet\":\"ジャニストイレ\",\"jasmon\":\"JASもん\",\"je taime\":\"濡鼎夢\",\"jelly fish\":\"Jelly fish\",\"jennys jimusho\":\"じぇにーず事務所\",\"jenoa cake\":\"じぇのばけーき\",\"jereheim garden\":\"Jereheim Garden\",\"jermaneels\":\"jermaneels\",\"jet dekopin books\":\"JET DEKOPIN BOOKS\",\"jeter studio\":\"ジータースタジオ\",\"jewelry\":\"ジュエリー\",\"jibaku-system\":\"自爆SYSTEM\",\"zydan\":\"痔男\",\"jido-hikki\":\"じどー筆記\",\"jiesu\":\"じーえす\",\"jigen bakudan\":\"時限爆弾\",\"jigoku potion\":\"地獄ポーション\",\"jigoku shinjuu\":\"地獄心中\",\"jigoku studio\":\"地獄スタジオ\",\"jikansa-kougeki\":\"時間差攻撃\",\"jikayou kamihikouki\":\"自家用紙飛行機\",\"jikomankitsu.\":\"自己満喫。\",\"jikomanzoku\":\"じこまんぞく\",\"jinapakusu\":\"じなぱーくす\",\"jinbow\":\"JINBOW\",\"jingai makyou club\":\"人外魔境倶楽部\",\"jinkenhakudatsu kougeki\":\"人権剥奪攻撃\",\"jinmen 62\":\"ジンメン62\",\"jinoriya\":\"じのり屋\",\"jinraiken\":\"迅雷拳\",\"jinrikisha\":\"人力社\",\"jinsei ano denchuu made sakusen\":\"人生あの電柱まで作戦\",\"jinsei tsuukoudome\":\"人生通行止め\",\"jipohou\":\"時ポ砲\",\"jishaku no sunaba\":\"じしゃくのすなば\",\"jishin kajyou\":\"地震過剰\",\"jishou seijunha\":\"自称清純派\",\"jisyakunyudo\":\"じしゃく入道\",\"jitaku ijouari\":\"自宅異常あり!\",\"jitaku studio\":\"自宅すたじお\",\"jitsuyou tosho fukyuukai r\":\"実用図書普及会\",\"jiyuu inpon tou\":\"自由いんぽん党\",\"jiyuubeya\":\"自由部屋\",\"jiyuugaoka shoutengai\":\"自由ヶ丘商店会\",\"jizeru enjin\":\"じーぜるエンジン\",\"jk-pasta\":\"JKぱすた\",\"jms space\":\"JMSスペース\",\"john doe shinobu\":\"あっぱーきゃんでぃー\",\"johnny iron pipe\":\"ジョニー鉄パイプ\",\"joji panchu uriba\":\"女児ぱんちゅ売場\",\"joker type\":\"JOKER TYPE\",\"jokou kukan\":\"徐行区間\",\"jon\":\"JON\",\"jonathan ssss\":\"じょなさんず\",\"jongotei\":\"ジョーんご亭\",\"jorijori\":\"JoRiJoRi\",\"joshi nimo katezu\":\"女子ニモ勝テズ\",\"joshinzoku\":\"女真族\",\"joujou tenki\":\"上々天気\",\"joukitei\":\"蒸気亭\",\"joy convoy\":\"ジョイコンボイ\",\"joydivision\":\"JoyDivision\",\"js style\":\"J's STYLE\",\"judgement\":\"JUDGEMENT\",\"juicy fruits\":\"Juicy Fruits\",\"jujuppe\":\"ヂュヂュッペ\",\"jukai shoko\":\"樹海書庫\",\"jukujuku juvenile\":\"熟々ジュブナイル\",\"jukuseiya koubou\":\"熟成屋工房\",\"julia\":\"JULIA\",\"jumbomax\":\"JUMBOMAX\",\"jumelles\":\"ジュメルズ\",\"junai shijoushugi\":\"純愛至上主義\",\"junes rain\":\"六月雨\",\"junes202\":\"ジュネス202\",\"junk arts\":\"ジャンクアーツ\",\"junk box\":\"Junk Box\",\"junk center kameyoko bldg\":\"JUNKセンター亀横ビル\",\"junk gear\":\"ジャンクギア\",\"junk island\":\"ジャンクアイランド\",\"junk market\":\"Junk Market\",\"junk story\":\"JUNK STORY\",\"junkan\":\"循環\",\"junkin\":\"純禁\",\"junkissa gen\":\"潤喫茶・弦\",\"junkland2\":\"JUNKLAND2\",\"junkxjunk\":\"JUNK×JUNK\",\"junpuumanpandou\":\"順風満帆堂\",\"jushoku to sono ichimi\":\"住職とその一味\",\"jusou music\":\"十三ミュジック\",\"juubai matsuri\":\"十倍祭り\",\"juugoichie\":\"十誤一会\",\"juujigen\":\"十次元\",\"juuryoku dou\":\"重力堂\",\"juvecross\":\"じゅぶくろす\",\"jyakonegi sarada\":\"じゃこネギさらだ\",\"jyaraya\":\"じゃらや\",\"jyouren kishidan\":\"ジョウ・レン騎士団\",\"jzargo\":\"ジェイザルゴ\",\"k equals k\":\"[K=K]\",\"k h\":\"K☆H\",\"k plus w\":\"K+W\",\"k plus y equals k\":\"K+Y=K\",\"k-1\":\"K-1\",\"k-ten\":\"K-てん\",\"k.a.d\":\"K.A.D\",\"k.f.d.\":\"K.F.D.\",\"k.h.r\":\"K.H.R\",\"k.n.d.\":\"K.N.D.\",\"k.s. ozaki\":\"K.S.尾崎\",\"k2 manhole\":\"K2マンホール\",\"k2 tomo no kai\":\"K²友の怪\",\"ka-mi-night town\":\"カーミー夜番街\",\"kaaburidou\":\"顔振堂\",\"kab-studio\":\"KAB-studio\",\"kabaya\":\"樺屋\",\"kabocha company\":\"かぼちゃカンパニー\",\"kabocha daioh\":\"かぼちゃ大王\",\"kabocha get\":\"かぼちゃげっと\",\"kabocha heim\":\"かぼちゃハイム\",\"kabocha obake\":\"カボチャオバケ\",\"kabocha oukoku\":\"かぼちゃ王国\",\"kabuki-man\":\"カブキマン\",\"kabuto jirushi\":\"カブト印\",\"kabutomushi\":\"カブとムシ\",\"kabuttari kaburanakattari\":\"かぶったりかぶらなかったり\",\"kachiwari jikkenshitsu\":\"カチワリ実験室\",\"kachusha\":\"Kachusha\",\"kadobeya tengoku\":\"角部屋天国\",\"kaede momiji\":\"かえでもみじ\",\"kaede no harawata\":\"楓のはらわた\",\"kaededou\":\"楓道\",\"kaedelic\":\"KAEdeLIC\",\"kaeru neko no shippo\":\"かえるねこのしっぽ\",\"kaeru no oyado\":\"カエルの御宿\",\"kaerudon teishoku\":\"カエル丼定食\",\"kagamichaya\":\"鏡茶屋\",\"kage kiri\":\"影霧\",\"kagehara juukou\":\"影原重工\",\"kageneko\":\"カゲねこ\",\"kageneko.\":\"かげねこ。\",\"kagero\":\"カゲ路\",\"kaginord\":\"鍵のーど\",\"kagimushi\":\"かぎむし\",\"kagitsuki\":\"限月\",\"kagura hitsuji\":\"神楽ひつじ\",\"kaguradou\":\"かぐら堂\",\"kaguyahime\":\"かぐや姫\",\"kahlua milk\":\"かるーあみるく\",\"kai\":\"KAI\",\"kai.tenchou\":\"改・店長\",\"kaibido\":\"快微動\",\"kaicho-maniax\":\"カイチョーマニアックス\",\"kaigansen\":\"カイガンセン\",\"kaigetsudou\":\"海月堂\",\"kaigishitsu\":\"カイギ室\",\"kaigun daisan shidan\":\"怪軍第3師団\",\"kaihatsushitsu\":\"開発室\",\"kaikan algorithm\":\"快感アルゴリズム\",\"kaiki dennou manga bako\":\"怪奇電脳漫画箱\",\"kaiki nisshoku\":\"怪奇日蝕\",\"kaiman\":\"カイマン\",\"kairaku shuudan\":\"怪楽集団\",\"kairaku yarou g team\":\"快楽野郎Gチーム\",\"kairanban\":\"快乱版\",\"kairansya\":\"海覧車\",\"kairoudou\":\"海老堂\",\"kairyuu\":\"海竜\",\"kaisei hallelujah\":\"快晴ハレルヤ\",\"kaisei yohou\":\"快晴予報\",\"kaisen teikoku\":\"海鮮帝国\",\"kaishaku\":\"介錯\",\"kaishundou honpo\":\"回春堂本舗\",\"kaiteisinden\":\"海底神殿\",\"kaiteki circle\":\"カイテキサークル\",\"kaiten anzu tei\":\"回転杏子亭\",\"kaiten sommelier\":\"回転ソムリエ\",\"kaitenshiki kebabu\":\"回転式けばぶ\",\"kaiun\":\"海運\",\"kaiyuu kikaku\":\"回遊企画\",\"kaizoku seibutsu\":\"海族生物\",\"kajigurumi\":\"かじぐるみ\",\"kajimura market\":\"かじむらマーケット\",\"kakao kakoujou\":\"カカオ加工場\",\"kaki no boo\":\"柿ノ房\",\"kakinotanehitotsubu\":\"柿の種一粒\",\"kakitsubata no yashiro\":\"杜若社\",\"kakkasouyou\":\"かっかそうよう\",\"kakogawa-ya\":\"加古川屋\",\"kakohimenoutuwa\":\"かこひめのうつわ\",\"kaku shoseki\":\"架空書籍\",\"kakumei seifu kouhoushitsu\":\"革命政府広報室\",\"kakumeiji\":\"革命児\",\"kakuni\":\"KAKUNI\",\"kakuq\":\"kakuQ\",\"kakuu byoutou\":\"架空病棟\",\"kalbi santarou\":\"カルビさん太郎\",\"kaleido sky\":\"Kaleido Sky\",\"kalmia\":\"KALMIA\",\"kalmia8\":\"Kalmia8\",\"kamaboko koujouchou.\":\"かまぼこ工場長。\",\"kamaboko-doh\":\"かまぼこ堂\",\"kamabokodokoro\":\"かまぼこ処\",\"kamadeva\":\"Kamadeva\",\"kamagabuchi\":\"かまがぶち\",\"kamakiri farm\":\"カマキリファーム\",\"kamameshiya\":\"かまめし屋\",\"kamaros\":\"カマロス\",\"kamarujirushi\":\"かまる印\",\"kamawanyo\":\"KAMAWANYO\",\"kame no ko\":\"亀の子\",\"kamebeya\":\"かめべや\",\"kamemushi\":\"カメムシ\",\"kameneji\":\"かめねじ\",\"kamepotel\":\"かめぽてる\",\"kami no misosiru\":\"神のみそ汁\",\"kami no tsuki no yashiro\":\"神の月の社\",\"kamibukuro works\":\"紙袋Works\",\"kamico\":\"カミコ!\",\"kamifubukimura\":\"紙ふぶき村\",\"kamikawa studio\":\"神川スタジオ\",\"kamikaze style\":\"神風STYLE\",\"kaminari-neko\":\"カミナリネコ\",\"kaminendo.corporation\":\"KAMINENDO.CORPORATION\",\"kaminosaki shiten\":\"神ノ裂支店\",\"kamiyan\":\"かみやん\",\"kamiyorozu\":\"上万\",\"kamome no shokudou\":\"かもめの食道\",\"kamoro-sa-z\":\"鴨ローサーズ\",\"kamoshireya\":\"かもしれ屋\",\"kamotama shuzou\":\"かもたま酒造\",\"kamotamaza\":\"かもたま座\",\"kamukamu\":\"かむかむっ!\",\"kanagawa macchiato.\":\"かながわマキアート。\",\"kanakana shoutengai\":\"カナカナ商店街\",\"kanariya bai kanariya\":\"カナリヤバいカナリヤ\",\"kanarukan\":\"歌鳴館\",\"kanbotan\":\"カンボタン\",\"kancho hatto\":\"艦長法度\",\"kandelaar\":\"カンテラ\",\"kanemasita\":\"kanemasita\",\"kaneshiro083\":\"カネシロ083\",\"kanidouraku\":\"かにどうらく\",\"kanie-don\":\"鹿贄どん\",\"kanifry\":\"カニフライ\",\"kanikieru\":\"カニキエル\",\"kaniman\":\"かにまん\",\"kanimura hanten\":\"蟹村飯店\",\"kaniparadise\":\"かにぱらだいす\",\"kaniya\":\"かに家\",\"kankyokusetsu\":\"寒極雪\",\"kanmi ningyou\":\"甘味人形\",\"kanmido\":\"甘味堂\",\"kanmidokoro usb\":\"甘味処USB\",\"kanmidokoro-hibiki\":\"甘味処 響\",\"kanmiya makkuro\":\"感味屋真黒\",\"kanmuri kamuri\":\"冠かむり\",\"kannazuki seisakusho\":\"神無月製作所\",\"kanosamu line\":\"KANOSAMU LINE\",\"kanosawa\":\"カノサワ\",\"kansai kemono rengou\":\"関西ケモノ連合\",\"kanshasai soft\":\"感謝祭ソフト\",\"kanshin soft\":\"かんしんソフト\",\"kansyouyou marmotte\":\"鑑賞用モルモット\",\"kanten garas\":\"寒天硝子\",\"kantera\":\"かんてら\",\"kantera no kissaten\":\"カンテラの喫茶店\",\"kantou usagi gumi\":\"関東うさぎ組\",\"kanyou shounen\":\"観用少年\",\"kanzen busouya\":\"完全武装屋\",\"kanzen dokusen\":\"完全独占\",\"kanzume honpo\":\"かんづめ本舗\",\"kaochuu kingdom\":\"顔厨王国\",\"kaodashi bijutsukan\":\"顔出し美術館\",\"kaokaoiyan\":\"かおかおいやん\",\"kaori no nichiyoubi\":\"Kaoriの日曜日\",\"kaoru system\":\"KAORU SYSTEM\",\"kappa create\":\"カッパくりえいと\",\"kappa yousai\":\"かっぱ要塞\",\"kappaya\":\"河童屋\",\"kara no mozuku\":\"空のもずく\",\"kara no tsuki\":\"カラノツキ\",\"karaage market\":\"からあげ市場\",\"karaage of the year\":\"からあげオブザイヤー\",\"karakuchi choucream\":\"辛口しゅーくりーむ\",\"karamomo tart\":\"からももたると\",\"karamoyou\":\"唐模様\",\"karappa\":\"karappa\",\"karashitakana\":\"からしたかな\",\"karasu chan\":\"カラスちゃん\",\"karasu no su\":\"鴉の巣\",\"karasuke honpo\":\"烏毛本舗\",\"karasuma pink higashiiru\":\"烏丸ぴんく東入ル\",\"karaya\":\"殻屋\",\"karazishibotan\":\"からじしぼたん\",\"kareha\":\"生姜うどん\",\"karehaneko\":\"かれはねこ\",\"karei nudol\":\"華麗NUDOL\",\"karen soft\":\"可憐ソフト\",\"karibian\":\"かりび庵\",\"karikari bacon\":\"カリカリベーコン\",\"karin\":\"Karin\",\"karintou\":\"かりん党\",\"karitara kaesu\":\"かりたらかえす\",\"karma laboratory\":\"業-karma-Laboratory\",\"karoyaka step\":\"かろやかステップ\",\"karst diary\":\"カルスト日記\",\"karuhazumi\":\"かるはずみ\",\"karumaya\":\"かるま屋\",\"karuwani\":\"かるわに\",\"kasama kou\":\"カサマ コウ\",\"kasaya\":\"かさや\",\"kasetsu shirokuma kakko yoi\":\"仮設しろくま\",\"kasetsu yousai\":\"仮設要塞\",\"kasha\":\"珈舎\",\"kashinoki\":\"カシノ木\",\"kashitsuki\":\"菓子つき\",\"kashiwa-ya\":\"かしわ屋\",\"kasou genjitsu\":\"禍葬現実\",\"kasozama\":\"過疎座間\",\"kassam rocketer\":\"Kassam rocketer\",\"kasshoku amazoness\":\"褐色アマゾネス\",\"kasshoku waisei\":\"褐色矮星\",\"kasuga 1-chome\":\"春日ー丁目\",\"kasugano kikaku\":\"春日野企画\",\"kasukabe pantsu hunter\":\"糟日部☆ぱんつハンター\",\"kasumi eater\":\"カスミイーター\",\"kasuterura\":\"かすてるら\",\"katagun catapult\":\"片眼カタパルト\",\"katahaba creatures\":\"肩幅クリーチャーズ\",\"katakuchiiwashi\":\"カタクチイワシ\",\"katakuri house\":\"カタクリハウス\",\"katame koime oome\":\"硬め濃いめ多め\",\"katamichi kippu\":\"カタミチキップ\",\"katamimi buta\":\"片耳豚\",\"katamimi headphone\":\"カタミミヘッドフォン\",\"kataribeya\":\"かたりべや\",\"katayude tamago\":\"かたゆでたまご\",\"katooya\":\"カトー屋\",\"katou suzuki\":\"加藤鈴木\",\"katsubushi\":\"勝つ節\",\"katsuma gokurakudou\":\"かつま極楽堂\",\"katsuo shisetsu gallery\":\"カツオ私設ギャラリー\",\"katsuobushi\":\"勝男武士\",\"katuobusi\":\"カツオ武士\",\"katuraya\":\"カツラ屋\",\"kaudenya lab\":\"高電壓Lab\",\"kawaisouko\":\"可哀想子\",\"kawaisounako\":\"かわいそうな子\",\"kawanakashima kobo\":\"川中島工房\",\"kawasaki jian\":\"川崎事案\",\"kawasemi\":\"翡翠\",\"kawauso no hokanko cg\":\"kawauso no hokanko CG\",\"kawazunoen\":\"蛙の宴\",\"kaya no soto\":\"蚊帳の外\",\"kayano mototo\":\"茅ノ素ト\",\"kayoubi\":\"火曜日\",\"kayoudou\":\"華容道\",\"kazakiribane\":\"風切羽\",\"kazama dojo\":\"風間道場\",\"kazamichizu\":\"風海地図\",\"kaze no kotowari\":\"かぜのことわり\",\"kazetonbo\":\"風蜻蛉\",\"kazeuma\":\"かぜうま\",\"kazum\":\"kazum\",\"kazuya\":\"カズ屋\",\"kb\":\"KB\",\"ke-kiyasan\":\"けーきやさん\",\"kearuda\":\"けあるだ\",\"kebero corporation\":\"EBEROコーポレーション\",\"kedama cube\":\"毛玉キューブ\",\"kedamono\":\"kedamono\",\"kedamono kangoku tou\":\"けだもの監獄島\",\"kedamonoya san\":\"ケダモノ屋さん\",\"kee sanpo\":\"けー散歩\",\"keep-out\":\"きーぷあうと\",\"kegani kenkyuushitsu\":\"毛ガニ研究室\",\"kei kei dou\":\"啓々堂\",\"kei kei kei loan\":\"ケイケイケイローン\",\"keigai tengen\":\"境外天元\",\"keikouon\":\"傾向音\",\"keisotsu na ana\":\"軽率な穴\",\"keito\":\"圭斗\",\"keito no mori\":\"毛糸の森\",\"kekanoya\":\"けかの屋\",\"kemao coopercent\":\"ケマオ9%\",\"kemochi\":\"けもち\",\"kemokomoya\":\"けもこも屋\",\"kemomimi eki\":\"けもみみ駅\",\"kemomimi koukyuu jikken kikan\":\"獣耳恒久実験機関\",\"kemono masshigura.\":\"けものまっしぐら。\",\"kemono michi\":\"けものみち\",\"kemono no koshikake\":\"けもののこしかけ\",\"kemonoburg\":\"けものぶるく\",\"kemonomichi\":\"KEMONOMICHI\",\"kemoshiko doukoukai\":\"けもシコ同好会\",\"kemotsubo\":\"ケモつぼ\",\"kemoyuru\":\"けもゆる\",\"kemuriya\":\"煙屋\",\"kemusi no bansan kai\":\"けむしの晩餐会\",\"ken-chan no tokoro\":\"ケンちゃんのところ\",\"kengai san\":\"圏外さん\",\"kenix\":\"KENIX\",\"kenja mode\":\"賢者も～ど\",\"kenkou kyoushitsu\":\"健康教室\",\"kenkou wagomu\":\"けんこう輪ゴム\",\"kenou shineitai\":\"拳王親衛隊\",\"kenrou koubo\":\"けんろー工房\",\"kensoh ogawa\":\"ケンソウオガワ\",\"keraku no tsubomi\":\"けらくのつぼみ\",\"kereno teikoku\":\"けれの帝国\",\"kerokero mountain chicken\":\"けろけろまうんてんちきん\",\"keruto\":\"ける都\",\"kes3000\":\"KES3000\",\"kesa and noise\":\"ケサトノイズ\",\"kesson shoujo\":\"欠損少女\",\"ketchup aji no mayonnaise\":\"ケチャップ味のマヨネーズ\",\"ketsudon teishoku\":\"ケツ丼定食\",\"ketsune cyadokoro\":\"けつね茶処\",\"keumaya\":\"希有马屋\",\"keyspa\":\"きーすぱ\",\"kezukaya\":\"毛塚屋\",\"kf\":\"KF\",\"kfc\":\"KFC\",\"kgb\":\"KGB\",\"ki no nekko\":\"木のねっこ\",\"ki-software\":\"KI-SofTWarE\",\"kibawomuku\":\"牙を剥く\",\"kichiku bansankai\":\"きちくばんさんかい\",\"kichinemu\":\"キチネム\",\"kichu\":\"きちゅ!\",\"kid\":\"KID\",\"kidou juushi\":\"機動重視\",\"kidoukan\":\"綺堂館\",\"kieyza cmp\":\"喜栄座cmp\",\"kigeki banzai\":\"喜劇万歳\",\"kigeki gahou\":\"喜劇画報\",\"kigineiro\":\"木々音色。\",\"kiheitai\":\"畸兵隊\",\"kiina vitamin\":\"きいなビタミン\",\"kiiro bird\":\"きいろバード\",\"kijinrou\":\"奇人楼\",\"kijinabe to kitsunedon\":\"きじ鍋ときつね丼\",\"kikaiatama\":\"機械頭\",\"kikaishojo kaiho-sensen\":\"機械少女解放戦線\",\"kikaten\":\"キカテン\",\"kikitsukiya\":\"ききつき屋\",\"kikka-shurou\":\"菊花酒楼\",\"kikkanten\":\"喫甘展\",\"kikkaya\":\"橘花屋\",\"kikonet\":\"きこねっと\",\"kikuya\":\"姫玖屋\",\"kikyou no hana no saku tokoro\":\"桔梗の花の咲くところ\",\"kill the king\":\"きるきん\",\"killer bambi\":\"KILLER BAMBI\",\"killkill michill\":\"Killkill Michill\",\"kilometer\":\"きろめーとる\",\"kimagu restaurant\":\"きまぐれすとらん\",\"kimagure blue\":\"きまぐれblue\",\"kimagure full course\":\"気まぐれフルコース\",\"kimagure na bakeneko\":\"気まぐれな化け猫\",\"kimagure nyaa nyaa\":\"きまぐれ娘々♪\",\"kimarinet\":\"Kimarinet\",\"kimidori\":\"君彩\",\"kimino kakuremino\":\"キミノカクレミノ\",\"kimpotsu\":\"きムぽつ\",\"kimuchi\":\"鬼武致\",\"kimuchi-tei\":\"キムチ亭\",\"kin-youbi\":\"金揚尾\",\"kinari\":\"きなり\",\"kinbou sokai\":\"近傍租界\",\"kindandowa\":\"禁断童話\",\"kindergarten\":\"キンダーガーテン\",\"kinema bambi\":\"キネマ☆バンビ\",\"kinen jumper\":\"禁煙ジャンパー\",\"kinetoscope\":\"キネトスコープ\",\"king revolver\":\"キングリボルバー\",\"kingpin\":\"キングピン\",\"kingyo no suisou\":\"金魚の水槽\",\"kinmekki damashii\":\"金メッキ魂\",\"kinmekki studio\":\"金メッキスタジオ\",\"kinmirai kyouyou bunko\":\"近未来教養文庫\",\"kino manga sekkeishitsu\":\"鬼ノ漫画設計室\",\"kinoko dx\":\"きのこDX\",\"kinoko hamburg tei\":\"きのこはんばーぐ亭\",\"kinoko house\":\"キノコハウス\",\"kinoko no kakushi beya\":\"きのこの隠し部屋\",\"kinoko no karutei-nu\":\"キノコの狩るてぃーぬ\",\"kinoko pot pie\":\"きのこポットぱい\",\"kinoko-ex\":\"KINOKO-ex\",\"kinokotai\":\"きのこ隊\",\"kinokoya kari\":\"茸屋(仮)\",\"kinominoyama\":\"きのみの山\",\"kinomiya\":\"季の宮\",\"kinzoku hannou\":\"きんぞくはんのう\",\"kirakira candy\":\"キラキラキャンディ\",\"kirarinkuru\":\"きらりんくる\",\"kirei club\":\"奇令クラブ\",\"kirei na oneesan\":\"紀霊なお姉さん\",\"kirimochi texture\":\"キリモチテクスチャ\",\"kirin mamire\":\"キリンまみれ\",\"kirin no chisato\":\"きりんのちさと\",\"kirisawa giken\":\"桐沢技研\",\"kirsi engine\":\"キルシーエンジン\",\"kirscherise\":\"kirscherise\",\"kisachi\":\"kisachi\",\"kisama soredemo ningenka\":\"貴様それでも人間か!!\",\"kisamamaki soft\":\"貴様巻きソフト\",\"kisaradudou\":\"木更津堂\",\"kiseki\":\"軌跡\",\"kisekitei\":\"軌跡亭\",\"kisha-\":\"きしゃー\",\"kishiben\":\"きし弁\",\"kisidou\":\"旗幟堂\",\"kisoima\":\"きそいま\",\"kisou d koubou\":\"奇想D工房\",\"kisoutengai\":\"奇想天外\",\"kissyoudo\":\"亀祥堂\",\"kitagawajima\":\"キタガワジマ\",\"kitaizumi koubou\":\"北泉工房\",\"kitakami triple\":\"北神トリプル\",\"kitakara tagayase\":\"きたからたがやせ\",\"kitchen studio\":\"きっちんすたじお\",\"kitkaters\":\"キットカッターズ\",\"kitsch\":\"吉鼠-Kitsch-\",\"kitsukedou\":\"きつけ堂\",\"kitsune\":\"来つ寝\",\"kitsune box system\":\"きつねぼっくすしすてむ\",\"kitsune no daishokudou\":\"キツネの大食堂\",\"kitsune to budou\":\"きつねとぶどう\",\"kitsunenomori\":\"狐の杜\",\"kitsunenotera\":\"きつねのてら\",\"kitsuneya\":\"きつね屋\",\"kitsuneyane\":\"きつね屋根\",\"kitsunezuka\":\"狐塚\",\"kittydrop\":\"KittyDrop\",\"kiyosumi hurricane\":\"清炭ハリケーン\",\"kizaruya\":\"黄猿屋\",\"kizuna project\":\"絆プロジェクト\",\"kk-spa\":\"KK-SPA\",\"kki\":\"KKI\",\"kkk\":\"KKK\",\"kkkk\":\"kkkk\",\"kkm\":\"K·K·M\",\"klara works\":\"Klara Works\",\"klaramate\":\"クララメイト\",\"kleitos\":\"クレイトス\",\"kmkz5.56\":\"KMKZ5.56\",\"knife edge\":\"ナイフエッジ\",\"knights\":\"KNIGHTS\",\"knuckle chop\":\"knuckle chop\",\"knuckle head\":\"KNUCKLE HEAD\",\"ko nekoneko house\":\"こねこねこはうス\",\"koa\":\"こあ\",\"koakuma sageha\":\"小悪魔sage派\",\"koala machine\":\"コアラマシン\",\"koban dou\":\"小判堂\",\"kobasoft\":\"KOBAsoft;\",\"koboro nindan\":\"小幌忍団\",\"koboshi no niwa\":\"コボシノニワ\",\"kocher\":\"コッヘル\",\"kocho kocho koukou\":\"こちょこちょ高校\",\"kodama planet\":\"コダマノ惑星\",\"kodanukidou\":\"小狸堂\",\"kodoh\":\"kodoh\",\"kodomo no koe\":\"こどものこえ\",\"kodukuejou\":\"小机城\",\"koedame\":\"KOEDAME\",\"koei\":\"コーエー\",\"kogemashita\":\"焦げました\",\"kohaneto\":\"こはねと\",\"koharu koubou\":\"こはる工房\",\"koharuchaya\":\"KOHARUCHAYA\",\"koharumachi\":\"小春町\",\"kohimemachi\":\"狐姫町\",\"kohitsujitei\":\"古羊亭\",\"kohri club\":\"氷倶楽部\",\"koi no danmenzu\":\"恋の断面図\",\"koigokoro no borderline\":\"恋心のボーダーライン\",\"koike-ya\":\"こいけ屋\",\"koikuchi kinako\":\"こいくちきなこ\",\"koinu computer\":\"koinu computer\",\"koinu gumi\":\"こいぬ組\",\"koinu kantai\":\"子犬艦隊\",\"koito sousakusho\":\"小糸創作所\",\"koji2\":\"KOJI2\",\"kojiki hiroba\":\"乞食広場\",\"kojimashiki\":\"コジマシキ\",\"kokemomo\":\"こけもも\",\"kokesimuken\":\"こけしム軒\",\"kokikko\":\"KOKIKKO\",\"kokkei-nagaya\":\"滑稽長屋\",\"kokkishin\":\"こっき心\",\"kokochikyuu\":\"心地球\",\"kokonokiya\":\"ここのき屋\",\"kokoro metro\":\"ココロメトロ\",\"kokoro no boss\":\"心のBOSS\",\"kokoro no ie\":\"心之家\",\"kokoro no tsubasa\":\"こころのつばさ\",\"kokoro shidoushitsu\":\"ココロ指導室\",\"kokumaren\":\"kokumaren\",\"kokuten no sato\":\"黒甜の郷\",\"kokutou kuromame\":\"黒糖くろまめ\",\"kokuyouchou\":\"黒耀蝶\",\"komagome pipette\":\"コマゴメピペット\",\"komamesugata\":\"こまめすがた\",\"komanest\":\"こまねすと\",\"komatsuna-ya\":\"小松菜屋\",\"komatta tomato\":\"こまったとまと\",\"komatta yatsu da na.\":\"こまった奴だな。\",\"komaya\":\"駒屋\",\"kome\":\"米\",\"kome nouka\":\"こめ農家\",\"komebitsu\":\"米びつ\",\"komedokoro\":\"こめどころ\",\"komekami kishi dan\":\"こめかみ騎士団\",\"komekouji\":\"コメコウジ\",\"komenikki\":\"米にっき。\",\"komenosukima\":\"米の隙間\",\"kometubu\":\"米粒\",\"komickers\":\"Komickers\",\"komorebi-notebook\":\"こもれびのーと\",\"komorebitei\":\"木漏れ日亭\",\"komugiko 100 percent\":\"小麦粉100%\",\"kon no pencase\":\"紺のペンケース\",\"konagona biscuit\":\"こなごなビスケット\",\"konagona makki shoujou\":\"粉々末期症状\",\"konapoka01\":\"こなぽか01\",\"konatuiro\":\"来夏色\",\"konbu-maru\":\"こんぶ丸\",\"konbuni\":\"こんぶに\",\"koneko dorobou\":\"子猫泥棒\",\"koneko gumi\":\"こねこ組\",\"koneko no manma\":\"こねこのまんま\",\"konekotei\":\"虎猫亭\",\"kongou rikisi\":\"金剛力士\",\"kongs home\":\"kongs home\",\"koniro drops\":\"绀色ドロップス\",\"koniro milkiro\":\"紺色ミルク色\",\"konjiki no monde selection\":\"金色のモンドセレクション\",\"konjikineko\":\"金色猫\",\"konna tokoro no kinniku made kitaeru nante...\":\"こんなところのきんにくまできたえるなんて...\",\"konno seisakubou\":\"紺野制作坊\",\"konnyaku\":\"こんにゃく\",\"konoderu\":\"このでる\",\"konoha\":\"このは\",\"konohanaya\":\"此花屋\",\"konowata\":\"コノワタ\",\"konpekitou\":\"紺碧糖\",\"konpon jinja\":\"コンポン神社\",\"kontohboh\":\"痕桃梦\",\"konton lady studio\":\"混沌レディースタジオ\",\"koori ame\":\"こおりあめ\",\"koorigoya\":\"氷小屋\",\"kooriume\":\"こおりうめ\",\"kopanda\":\"子パンダ\",\"koppamijin\":\"コッパミジン\",\"koppun\":\"骨粉\",\"korikori koubou\":\"狐狸古里工房\",\"korindou\":\"こりん堂\",\"korisuya\":\"こりすや\",\"korogarutsuki\":\"コロガルツキ\",\"korogi comics\":\"こおろぎコミックス\",\"korokoro koronp\":\"ころころころんぴ\",\"korokorokokoro\":\"ころころこころ\",\"korokuto\":\"ころくと\",\"korokyu\":\"孤狼宮\",\"koropot\":\"ころぽっと\",\"kororofu\":\"コロロフ\",\"koruri-ya\":\"こるり屋\",\"kosuru buta\":\"こする豚\",\"kotacyuya\":\"こたちゅ屋\",\"kotake souhonke\":\"小武総本家\",\"kotatsu de mikan chokubaijo\":\"こたつでみかん直売所\",\"kotatsu guild\":\"コタツギルド\",\"kotatsu no tsukaima\":\"古竜の使い魔\",\"kotatsu room\":\"KOTATSU ROOM\",\"kotatsuya\":\"炬燵屋CO.LTD\",\"kotau\":\"こたう\",\"kotee\":\"コテ絵\",\"koti\":\"KOTI\",\"kotoba asobi\":\"言葉遊戯\",\"kotobukiya\":\"ことぶきや\",\"kotonoya\":\"琴乃屋\",\"kotori jimusho\":\"小鳥事務所\",\"kotoribidou\":\"小鳥日堂\",\"kotorikan\":\"小鳥館\",\"kotoshiki\":\"コトシキ\",\"kotoyoshi wired\":\"琴義ワイアード\",\"kotsumudiya\":\"こつむぢや\",\"kou kidou shoujo\":\"高機動少女\",\"koubai gekka\":\"紅梅月下\",\"koubaitei\":\"勾配亭\",\"koubou juuichiya\":\"工房十一屋\",\"koucha rakkyo\":\"紅茶辣韭\",\"koudansha\":\"幸田ん舎\",\"koufukuya\":\"幸福屋\",\"kougaku meisai\":\"光学迷彩\",\"kougeki\":\"幸撃\",\"kougi anmitsu\":\"公儀あんみつ\",\"kougi no mikan batake\":\"KOUGIのみかん畑\",\"kougyo\":\"耿魚\",\"kougyokutei dokuringo\":\"紅玉亭毒林檎\",\"kouhuku shigen\":\"幸福資源\",\"kouketsu no otome\":\"高潔の乙女\",\"koukotsu panda\":\"恍惚熊猫\",\"koukyou koukoku kikou\":\"公共広告奇行\",\"kourinsha\":\"降臨社\",\"koushi\":\"子牛\",\"kousoku bitch network\":\"高速ビッチネットワーク\",\"kousoku gurihari-tei\":\"高速グリハリ亭\",\"kousoku kaiten\":\"高速回転\",\"koutarou with t\":\"こうたろうWithティー\",\"koutetsu\":\"鋼鉄\",\"koutetsu rengou\":\"鋼鉄連合\",\"koutetsuryoku kikaku\":\"鋼鉄力企画\",\"kouya ni sakebu aitsu no heya\":\"荒野に叫ぶアイツの部屋\",\"kouyadou\":\"こうや堂\",\"kouzaka-san to makino jimusho\":\"神坂さんとマキノ事務所\",\"kouzukitei\":\"香月亭\",\"kouzuya\":\"興津屋\",\"kowaremono\":\"こわれもの\",\"kowareta omocha\":\"壊れたおもちゃ\",\"kozimoko\":\"こじもこ\",\"kozouya\":\"子蔵屋\",\"kptms\":\"KPTM'S\",\"kraftbox\":\"Kraftbox\",\"krono-hudenekotei\":\"クロノ筆猫亭\",\"kss\":\"ケイエスエス\",\"ktn\":\"KTN\",\"ktq48\":\"KTQ48\",\"ku-ten\":\"KU-TEN\",\"kubaya\":\"くば屋\",\"kubotaya\":\"久保田屋\",\"kuchen sirup\":\"く～へんしろっぷ\",\"kuchibashi feti\":\"くちばしフェチ\",\"kuchiki no uro\":\"朽木ノ洞\",\"kudamono damono\":\"くだものだもの\",\"kudarizaka guardrail\":\"下り坂ガードレール\",\"kugatsuya\":\"九月屋\",\"kuikome sagi\":\"食い込め詐欺\",\"kujira logic\":\"くぢらろじっく\",\"kujuukuri nyajuu kai\":\"九十九里ニャ獣会\",\"kukudou\":\"くく堂\",\"kukuya\":\"くく屋\",\"kulmov\":\"kulmov_\",\"kuma knights\":\"クマナイツ\",\"kuma no mori\":\"くまのもり\",\"kuma x usagi\":\"くま×うさぎ\",\"kuma-puro\":\"Kuma-puro\",\"kumagai stars\":\"くまがいスターズ\",\"kumagaya hakushon kai\":\"熊谷はくしょん会\",\"kumakumadou\":\"くまくま道\",\"kumakumaice\":\"くまくまあいす\",\"kumakuramizu\":\"熊倉水\",\"kumameshi-ya\":\"クマ飯屋\",\"kumanikotec\":\"クマニコテック\",\"kumao cafe\":\"くまおカフェ\",\"kumapanda\":\"くまぱんだ\",\"kumatyu bokujou\":\"クマチュウ牧場\",\"kume\":\"久米\",\"kumikae dna\":\"組換DNA\",\"kumogakure.\":\"くもがくれ。\",\"kumohatiya\":\"雲八屋\",\"kune kune project\":\"Kune Kune Project\",\"kunkakunka teikoku\":\"くんかくんか帝国\",\"kunseidou\":\"燻製堂\",\"kuon hirohiko\":\"久遠広彦\",\"kuoone\":\"くお～ね\",\"kuragakuya\":\"倉楽屋\",\"kurage kenkyuusho\":\"くらげ研究所\",\"kurage no candume\":\"くらげのかんづめ\",\"kurage suizokukan\":\"くらげ水族館\",\"kurahashi shoin\":\"倉橋書院\",\"kurakamadou\":\"くらかま堂\",\"kurasan\":\"倉さん\",\"kurenai heptagon\":\"KureNAI HeptaGoN\",\"kurenai shoujo\":\"紅少女\",\"kureten\":\"KURETEN\",\"kureura seisakujo\":\"呉浦製作所\",\"kuributon\":\"栗布団\",\"kurimanjuu\":\"くりまんじゅう\",\"kurione-sha\":\"くりおね館\",\"kuripachi no heya\":\"クリパチの部屋\",\"kuripick\":\"栗pick\",\"kuripod\":\"KURIPOD\",\"kurita sora\":\"栗田空\",\"kuro cornet\":\"黒こるね\",\"kuro inu sha\":\"黒戌舎\",\"kuro majutsu coffee\":\"黒魔術コーヒー\",\"kuro no alice\":\"黒のアリス\",\"kuro queen\":\"Kuro Queen\",\"kuro to kane no hane\":\"黒と銀の羽\",\"kuro-level\":\"KURO-LEVEL\",\"kurobuchi\":\"クロブチ\",\"kurocan\":\"クロ缶\",\"kurodamaya\":\"黒玉屋\",\"kurodensha\":\"黒電車\",\"kurodenwa\":\"黒電話\",\"kurodou holdings\":\"黒堂ホールディングス(株)\",\"kurogane cage\":\"くろがねけーじ\",\"kuroge to momojiru\":\"黒毛と桃汁\",\"kurogomaknights\":\"黒ごま騎士団\",\"kurohamya\":\"黒ハム屋\",\"kurohime\":\"黒姫\",\"kurohina\":\"黒雛\",\"kurohinabako\":\"黒雛箱\",\"kurohonyasan\":\"くろほんやさん\",\"kuroi inu no daisharin\":\"黒い犬の大車輪\",\"kuroi kyoudain\":\"黒いキョーダイン\",\"kuroi mikan no naru momo no ki\":\"黒いみかんのなるももの木\",\"kuroi miyako\":\"黒イ都\",\"kuroi mono\":\"黒いモノ\",\"kurokami studio s\":\"クロカミスタジオS\",\"kurokari\":\"くろかり\",\"kurokishi no kakurega\":\"黒騎士の隠れ家\",\"kurokoya\":\"くろこ屋\",\"kuromame pack\":\"くろまめぱっく\",\"kuromisakaijou\":\"黒ミサ会場\",\"kuromogu teikoku\":\"黒モグ帝国\",\"kuromori-ya\":\"黒森屋\",\"kuroneko akaribon\":\"黒ねこ赤リボン\",\"kuroneko to taijutei\":\"黒猫と大樹亭\",\"kuroneko waltz\":\"黒ネコワルツ\",\"kuronekodou\":\"黒猫堂\",\"kuronekokan-monpetit\":\"黒猫館モンプチ\",\"kuronekotei\":\"黒猫亭\",\"kurono taitsu\":\"黒野タイツ\",\"kuropoplar\":\"くろぽぷら\",\"kurosawa pict\":\"黒澤pict\",\"kuroshikatei\":\"黒鹿亭\",\"kuroshiro desire\":\"黒白デザイア\",\"kurotoshiro\":\"黒ト白\",\"kurotoya\":\"黒杜屋\",\"kurotsuki shoukai\":\"黒月商会\",\"kurousagi\":\"kurousagi\",\"kuroyuki\":\"黒雪\",\"kurozako palace\":\"くろざこパレス\",\"kurubusi-kai\":\"踝会\",\"kuruguru dna\":\"くるぐるDNA\",\"kurumian\":\"くるみ庵\",\"kurusugawa pikumintei\":\"来栖川ピクミン亭\",\"kusanagi-blade\":\"KUSANAGI-BLADE\",\"kusari\":\"KUSARI\",\"kusari caterpillar\":\"锁キャタピラ\",\"kusari no youjo\":\"鎖の幼女\",\"kusariku\":\"草陸\",\"kushimoto house\":\"くしもとハウス\",\"kushiyabu\":\"クシヤブ\",\"kusosweets\":\"kusosweets\",\"kusoyuridanchi\":\"クソユリ団地\",\"kusozako nameko\":\"くそざこなめこ\",\"kusugu land\":\"くすぐらんど\",\"kusuribako\":\"くすり箱\",\"kusurin soft\":\"くすりんソフト\",\"kutushita nijiru honpo\":\"靴下煮汁本舗\",\"kuuchuusen\":\"空中線\",\"soramitiheno-r\":\"空道へのR\",\"kuudou flare\":\"空洞フレア\",\"kuuppii\":\"くぅっぴぃ\",\"kuurintei\":\"空輪艇\",\"kuusou banana\":\"空想バナナ\",\"kuusou kyuuka\":\"空想休暇\",\"kuusou monochrome\":\"空想モノクローム\",\"kuusou post\":\"空想ポスト\",\"kuusou riot\":\"空想RIOT!\",\"kuusou switch\":\"空想スイッチ\",\"kuwaikuwa\":\"くわいくわ\",\"kuzu no kagami\":\"クズの鑑\",\"kuzumochi\":\"KUZUMOCHI\",\"kuzunari\":\"くずなり\",\"kwi ag\":\"KWI AG\",\"kyapa city\":\"きゃぱCITY\",\"kyo-rakuji\":\"享楽寺\",\"kyodai kidou yousai kyoushuu\":\"巨大軌道要塞強襲\",\"kyojinkou\":\"巨人港\",\"kyokutou dennou kaihatsukyoku\":\"極東電脳開発局\",\"kyokutou funamushi\":\"極東舟虫\",\"kyomu no uta\":\"虚無の歌\",\"kyoshoku shou\":\"虚飾症\",\"kyosuu shiniki\":\"虚数神域\",\"kyoten heichou\":\"拠点兵長\",\"kyou no keiro\":\"今日の毛色\",\"kyoubou jouchotai\":\"凶暴情緒帯\",\"kyougetsutei\":\"共月邸\",\"kyouki na shiunten\":\"狂気な試運転\",\"kyoumata\":\"今日また\",\"kyounetsuzanbun\":\"強熱残分\",\"kyourakuen\":\"享樂苑\",\"kyouretsu hiyougeka\":\"強烈肥養外科\",\"kyouryuu no tamago\":\"恐竜の卵\",\"kyousatu\":\"きょうさつ\",\"kyousei josou kyousei nyotaika kyousei otokonoko\":\"強制女装・強制女体化・強制男の娘\",\"kyousei tsf no ohanashi\":\"強制TSFのお話し\",\"kyouun rrr\":\"きょううんRRR\",\"kyouya\":\"今日屋\",\"kyozoya\":\"京蔵屋\",\"kyujitsusyukkin\":\"休日出勤\",\"kyun kyun art works\":\"きゅんきゅんあーとわーくす\",\"kyusuisei polymer\":\"吸水性ポリマー\",\"kyuu no mon\":\"九の門\",\"kyuu tekki jidai\":\"旧鉄器時代\",\"kyuukeijo no higashi\":\"休憩所の東\",\"kyuuketsukousi\":\"吸血公子\",\"kyuusanpin\":\"きゅうさんぴん\",\"kyuushoku dorobou\":\"給食泥棒\",\"l novels\":\"Lノベルズ\",\"l-u\":\"L-u\",\"l.l. milk\":\"L.L.MILK\",\"l.o.w\":\"L.O.W\",\"l.p.e.g.\":\"L.P.E.G.\",\"la vender\":\"La vender\",\"la.c.\":\"La.C.\",\"lab chicken\":\"LAB CHICKEN\",\"lab-star\":\"らびすたー\",\"laboratory\":\"Laboratory\",\"laboratory 09\":\"Laboratory#09\",\"lacti9\":\"Lacti9\",\"lactobacillus\":\"ラクトバシラス\",\"lactucopicrin\":\"ラクチュコピクリン\",\"ladybacker\":\"LadyBacker\",\"lagarto\":\"Lagarto\",\"lagerstatten\":\"Lagerstatten\",\"lagrangian-point\":\"Lagrangian-Point\",\"laichi\":\"LAICHI\",\"lala soft\":\"Lala soft\",\"lala studio\":\"LALA STUDIO\",\"lamchat\":\"ラム茶っと!\",\"lamia\":\"Lamia\",\"lamipas\":\"lamipas\",\"landurchin\":\"Land Urchin\",\"landcut\":\"ランドカット\",\"lapis blue.\":\"LAPIS BLUe.\",\"lapis lazuli\":\"ラピスラズリ\",\"lapiss\":\"Lapiss\",\"lapiz lazuli kouseki\":\"ラピスラズリ鉱石\",\"laplacedotcom\":\"らぷらすどっとこむ\",\"laplacian\":\"Laplacian\",\"lass\":\"ラス\",\"lass pixy\":\"Lass Pixy\",\"last eden\":\"LAST EDEN\",\"last resort\":\"ラストリゾート\",\"latelate\":\"latelate\",\"lathimania kyouwakoku\":\"ラチマニア共和国\",\"latte\":\"Latte\",\"laurier\":\"ろりえーる\",\"lazy crew\":\"レイジークルー\",\"lazystyle\":\"LazyStyle\",\"leaf geometry\":\"リーフジオメトリ\",\"leaf party\":\"リーフパーティー\",\"leaz koubou\":\"りーず工房\",\"left\":\"LEFT\",\"legato\":\"Legato\",\"leimz-project\":\"LEIMZ-PROJECT\",\"leman koukoku\":\"レマン公国\",\"lemming\":\"Lemming\",\"lemniscate\":\"レムニスケート\",\"lemon bakudan\":\"レモンばくだん\",\"lemon cake\":\"レモンケーキ\",\"remon no omise\":\"れもんのお店\",\"lemon zest\":\"LEMON ZEST\",\"lemonbridge\":\"レモンブリッジ\",\"lemontei\":\"檸檬亭\",\"leo-circle\":\"さーくるLEO-CIRCLE\",\"leprotto\":\"Leprotto\",\"lesport\":\"Lesport\",\"lesser panda ga yome\":\"レッサーパンダが嫁\",\"leucojum\":\"LEUCOJUM\",\"level-x\":\"LEVEL-X\",\"level.41\":\"Level.41\",\"level1\":\"level1\",\"lewd angels\":\"Lewd Angels\",\"leymei\":\"LEYMEI\",\"lhezi\":\"LHEZI\",\"liar-soft\":\"ライアーソフト\",\"libertaria\":\"リバタリア\",\"libido\":\"リビドー\",\"libido kaikan\":\"リビドー会館\",\"libido soft\":\"りびどーそふと\",\"libya cuckoo\":\"リビア郭公\",\"licorice candy\":\"リコリスキャンディ\",\"liddell\":\"Liddell\",\"liebe\":\"リーベ\",\"lielos no kakurega\":\"ゆいれその隠れ家\",\"life\":\"life\",\"life degeneration laboratory\":\"人生堕落研究所\",\"light\":\"ライト\",\"light garden\":\"ライト・ガーデン\",\"light in the night\":\"ライトインザナイト\",\"light of night\":\"Light of Night\",\"light pink\":\"ライトピンク\",\"light rate port pink\":\"ライト・レイト・ポート・ピンク\",\"lightguide\":\"LightGuide\",\"lightplan\":\"ライトプラン\",\"likefairly\":\"LikeFairly\",\"lilac\":\"lilac\",\"lili\":\"lili\",\"lili marleen\":\"リリーマルレーン\",\"lilije drug\":\"リリェドラッグ\",\"lilim\":\"LiLiM\",\"lilim darkness\":\"リリムダークネス\",\"lilium\":\"りーりうむ\",\"lilium auratum\":\"Lilium auratum\",\"liliya\":\"リリ舎\",\"lilliput\":\"リリパット\",\"lily under\":\"リリーアンダー\",\"lilyth\":\"Lilyth\",\"limecat\":\"LimeCat\",\"limit\":\"LIMIT\",\"limit break\":\"りみっとぶれいく\",\"limit cycle\":\"LIMIT CYCLE\",\"limit plus\":\"limit+\",\"limit works\":\"Limit Works\",\"limited\":\"ちこ★小屋\",\"lindas ark\":\"Linda's ark\",\"linke hand\":\"Linke Hand\",\"linkringrin\":\"リンクリングリン\",\"lion heart\":\"Lion Heart\",\"liongoya\":\"らいおん小屋\",\"lip van winkle\":\"Lip Van Winkle\",\"lipstar\":\"LIPSTAR\",\"lipterrible\":\"クチビルテリブル\",\"liquid\":\"リキッド\",\"lirico\":\"lirico\",\"listless time\":\"listless time\",\"lithium\":\"Lithium\",\"little bear\":\"リトルベア\",\"little cosmos\":\"Little☆Cosmos\",\"little hopper with h\":\"りとるほっぱー with H\",\"little lindo\":\"Little Lindo\",\"little mantis\":\"Little mantis\",\"little mermaid henshuubu\":\"リトル・マーメイド編集部\",\"little quartz\":\"Little Quartz\",\"little shop\":\"little shop\",\"little snow\":\"little snow\",\"littlemare\":\"リトルメア\",\"littleollie\":\"Littleollie\",\"live kuroneko iin\":\"来舞黒猫医院\",\"liz\":\"LiZ\",\"liz project\":\"liz project\",\"lo likyo new\":\"LoりきょNEW!\",\"lo5type\":\"Lo5type\",\"lobatt\":\"LOBATT\",\"lobelia\":\"Lobelia\",\"local kintas\":\"Local Kintas\",\"locomocodon\":\"ろこもこどん\",\"locus\":\"Locus\",\"log\":\"LOG\",\"log house\":\"Log House\",\"logic choco\":\"ロジックチョコ\",\"loiter\":\"loiter\",\"lol\":\"LOL\",\"loli goranyo\":\"ろりーごーらんにょ\",\"lolic system\":\"LOLIC SYSTEM\",\"lolicon trap\":\"ロリコントラップ\",\"lolimajin\":\"ろりま陣\",\"lolimate seizou koujou\":\"ロリメイト製造工場\",\"lolli pop\":\"Lolli*PoP\",\"lolol\":\"LOLOL\",\"lomelette\":\"Lomelette\",\"lonely island\":\"ロンリーアイランド\",\"longhorntrain\":\"LongHornTrain\",\"loopholic\":\"loopholic\",\"loopsoft\":\"loopsoft\",\"lop\":\"LOP\",\"lopet dan\":\"ろぺっとだん\",\"loser\":\"LOSER\",\"lost garden\":\"Lost Garden\",\"lotus\":\"LOTUS\",\"love and sekkan\":\"らぶ&セッカン\",\"love bird\":\"Love Bird\",\"love bitch\":\"らぶびっち\",\"love circle young punch\":\"ラブサークルヤングパンチ\",\"love kyun maiden\":\"らぶキュンめいでん\",\"love me do\":\"LOVE ME DO\",\"love size\":\"ラブサイズ\",\"love xxx.\":\"love xxx.\",\"love-rs\":\"love-Rs\",\"love4sale\":\"love4sale\",\"lovejuice pink\":\"LoveJuiceピンク\",\"loveletter carburetor\":\"恋文気化器\",\"lovelovedoll\":\"LOVELOVEDOLL\",\"lovely complex\":\"Lovely complex\",\"lovely pretty chou aishiteru\":\"ラブリープリチー超愛してる\",\"loveolsis\":\"らぶおるしす\",\"lovesca\":\"lovesca\",\"lovesugi\":\"らぶすぎ\",\"low angler\":\"ろうあんぐら～\",\"low tech team\":\"Low Tech Team\",\"low-f\":\"Low-F\",\"low-tension\":\"Low-Tension\",\"lowhide project\":\"LOWHIDE PROJECT\",\"lrig lab\":\"ルリ研\",\"ls\":\"LS\",\"ls-box\":\"LS-Box\",\"lsize\":\"Lサイズ\",\"ltm.\":\"LTM.\",\"ltu\":\"Ltu\",\"luciferhood\":\"Luciferhood\",\"luck and pluck co.\":\"LUCK&PLUCK!Co.\",\"luck gear\":\"Lucky GEAR\",\"luck10\":\"Luck10\",\"lucky club\":\"LUCKY CLUB\",\"lucky paranoia\":\"lucky paranoia\",\"luckyend\":\"ラッキーエンド\",\"luckystripe\":\"LuckyStripe\",\"lucretia\":\"LUCRETiA\",\"lucyr\":\"LUCYR\",\"lulu koubou\":\"LULU工房\",\"lummy\":\"Lummy\",\"lumnesoda\":\"ラムネソーダ\",\"luna industria\":\"ルナ・インダストリア\",\"luna papa\":\"LUNA PAPA\",\"luna soft\":\"ルナソフト\",\"lunacy\":\"Lunacy\",\"lunar gravity acceleration\":\"月面重力加速度\",\"lunarium\":\"ルナリウム\",\"lunasummit\":\"LUNASUMMIT\",\"lunaterk\":\"るなたーく\",\"lunatic\":\"ルナティック\",\"lunatic joker\":\"lunatic joker\",\"lunatic orgasm\":\"ルナティックオーガズム\",\"lunatic prophet\":\"LUNATIC PROPHET\",\"lunatic star\":\"ルナティックスター\",\"lunatic traveler\":\"るなてぃっくとらべらー\",\"lunatics\":\"Lunatics\",\"lunatique\":\"LUNATIQUE\",\"lunch box\":\"LUNCH BOX\",\"lunchbox\":\"lunchbox\",\"lune\":\"ルネ\",\"lune comic\":\"ルネコミック\",\"lune team bitters\":\"ルネ Team Bitters\",\"lust bit\":\"ルストビット\",\"lusterise\":\"Lusterise\",\"lutein\":\"るていん\",\"luwen workshop\":\"Luwen Workshop\",\"luxia continent\":\"るくしあ大陸\",\"luxury\":\"ラグジュアリー\",\"luxury tiara\":\"Luxury Tiara\",\"lv.x\":\"LV.X+\",\"lycoly\":\"Lycoly\",\"lyrical magical\":\"リリカルマジカル\",\"lyricalize\":\"Lyricalize\",\"lyricbox\":\"リリックボックス\",\"m\":\"M\",\"m de pink\":\"M de PINK\",\"m no violet\":\"エム・ヴァイオレット\",\"m shousetsu doumei\":\"M小説同盟\",\"m-10\":\"M-10\",\"m-free\":\"M-FREE\",\"m-keifu\":\"Mケイフ\",\"m-koujou\":\"M工場\",\"m-lab.\":\"M-LAB.\",\"m-style\":\"M・S T Y L E\",\"m-trinity\":\"M-trinity\",\"m.a.d works\":\"M.A.D WORKS\",\"m.a.f\":\"M.A.F\",\"m.a.l.t\":\"m.a.l.t\",\"m.h. bokujou\":\"M.H.牧場\",\"m.i.r.u\":\"M.I.R.U\",\"m.i.ring\":\"M.I.RING\",\"m.o.k. teabag\":\"M.O.K.ちゃぶくろ\",\"m.r products\":\"M.R プロダクツ\",\"m2230\":\"m2230\",\"ma2\":\"MA2\",\"mabatakimosezu\":\"瞬きもせず\",\"mabo udon teishoku\":\"麻婆うどん定食\",\"mabonasu\":\"マーボーナス\",\"macaron\":\"マカロン\",\"macaron sketch\":\"Macaron*Sketch\",\"macaron sugar\":\"まかろんシュガー\",\"macaroncrown\":\"MacaronCrown\",\"macaroni ring\":\"マカロニグミ\",\"macaroni teikoku\":\"マカロニ帝国\",\"macchadokoro\":\"抹茶処\",\"macdoll\":\"macdoll\",\"machednia\":\"まけどに屋\",\"machi no kissaten\":\"街の喫茶店\",\"machida cherry boys\":\"町田チェリーボーイズ\",\"machikado-mapoze\":\"街角麻婆豆\",\"machinery\":\"マシーナリー\",\"machwing\":\"マッハウイング\",\"maclona\":\"まっ黒な\",\"macneil koubou\":\"マクニエル工房\",\"macolulu\":\"マコルル\",\"macrown\":\"macrown\",\"macv-sog\":\"MACV-SOG\",\"mad hand rowa\":\"マドハンドロワ\",\"mad mac\":\"MAD MAC\",\"mad-puppy\":\"MAD-PUPPY\",\"mada maniau kamo\":\"まだ間に合うかも\",\"madam project\":\"マダム・プロジェクト\",\"mado no kuchibue fuki\":\"窓の口笛吹き\",\"mado soft\":\"まどそふと\",\"madogiwa oukoku\":\"窓際王国\",\"madogiwa works\":\"Madogiwa Works\",\"madou shiryoushitsu\":\"魔導資料室\",\"madraid\":\"マッドレイド\",\"maebax\":\"maebax\",\"mafiya\":\"マフィ家\",\"mafuri marimonnu\":\"まふりまりもんぬ\",\"mafuya\":\"まふ屋\",\"mag\":\"まぐ!\",\"mag kan\":\"MAG館\",\"magaimonoyasoinabashiten\":\"まがいもの八十稲羽支店\",\"magetarudou\":\"髷樽堂\",\"magi\":\"MAGI\",\"magi black\":\"MAGI black\",\"magic fortune hachioujiten\":\"マジックフォーチュン八王子店\",\"magic house\":\"まじっくハウス\",\"magic machinery\":\"MAGIC MACHINERY\",\"magic private eye\":\"魔法探偵社\",\"magic wand\":\"Magic wand\",\"magical arts\":\"マジカルアーツ\",\"magical garden\":\"魔法庭園\",\"magnetic field\":\"MAGNETIC FIELD\",\"magnitude 711\":\"マグニ厨度711\",\"magnolia\":\"MAGNOLIA\",\"magont\":\"MAGONT\",\"magudara kaihou doumei\":\"マグダラ解放同盟\",\"magukappu\":\"マグカップ\",\"maguma sansou\":\"マグマ山荘\",\"maguni fc\":\"マグニFC\",\"maguro\":\"MAGURO\",\"maguro beya\":\"まぐろ部屋\",\"maguro bokujo\":\"まぐろ牧場\",\"maguro donburi\":\"まぐろどんぶり\",\"maguro.\":\"maguro.\",\"magurodrastic\":\"まぐろドラスティック\",\"mahirutei\":\"まひる亭\",\"mahjong yugen co.ltd 58\":\"麻雀有限会社58\",\"mahola\":\"MaHoLa\",\"mahouse\":\"MAHOUSE\",\"mahupoko\":\"マフポコ\",\"maibotsu\":\"埋没\",\"maichan kikaku\":\"まいちゃん企画\",\"maid club\":\"メイド倶楽部\",\"maika\":\"MAIKA\",\"maikata kougyou\":\"マイカタ工業\",\"maimaimai\":\"まいまいまい！\",\"maina-mania\":\"マイナー・マニア\",\"mainichi ga mushi no iki\":\"毎日が虫の息\",\"mainichi sonoba shinogi\":\"毎日その場シノギ\",\"maisai\":\"まいさい\",\"majesticrune\":\"MajesticRune\",\"majihima\":\"まじひま\",\"majikayo\":\"マジかよ\",\"majikoru gensou kyoudan\":\"蠱る幻想狂団\",\"majimadou\":\"真嶋堂\",\"majin houkou\":\"魔神咆哮\",\"majocolony\":\"majocolony\",\"maka no sokutu\":\"摩訶の巣窟\",\"maka-rakko\":\"まからっこ\",\"make pig press\":\"make pig press\",\"make3d\":\"MAKE3D\",\"makepriority\":\"MakePriority\",\"makiba no asa\":\"まきばの朝\",\"makikusu\":\"まきくす\",\"makino eki\":\"牧野駅\",\"makka tintin\":\"マッカTINTIN\",\"makkou kujira\":\"まっこうくじら\",\"makkurona\":\"まっ黒な\",\"makoto shiyaka\":\"間琴しや架\",\"makoto skip\":\"まこと☆スキップ\",\"maku\":\"Maku\",\"makura\":\"枕\",\"makuriya\":\"まくりや\",\"makushiro\":\"マクシロ\",\"malus pumila\":\"まるすぷみら\",\"mama ni wa naisho\":\"ママにはナイショ\",\"mama-san ballet\":\"ママさんバレエ\",\"mamagotoya\":\"ままごと屋\",\"mamagult\":\"ママグル徒\",\"mamamax\":\"MAMAMAX\",\"mame\":\"豆\",\"mamedaifukuya\":\"豆大福屋\",\"mamekome\":\"まめこめ\",\"mamekura\":\"豆蔵\",\"mamemochi\":\"まめもち\",\"mamenon\":\"まめのん\",\"mamex\":\"mamex\",\"mamiana paradise\":\"狸穴天国\",\"mammypoko\":\"＊mammypoko＊\",\"mamoru soup\":\"まもるスープ\",\"man chin low\":\"満珍楼\",\"man say\":\"Man Say\",\"man-room\":\"MAN-ROOM\",\"manam\":\"MANAM\",\"manamagu\":\"まなまぐ\",\"manbaka\":\"漫バカ\",\"manboutei\":\"まんぼう亭\",\"manbun no ichi\":\"万分の市\",\"manchindou\":\"マンチン堂\",\"mandoragora striker\":\"まんどらごらすとらいかー\",\"mandrill\":\"まんドリル\",\"manga jigoku\":\"マンガジゴク\",\"manga super\":\"マンガスーパー\",\"mangan\":\"マンガン\",\"mangana\":\"漫画な。\",\"manganiku\":\"幡芽にく\",\"mange\":\"万華\",\"mangetsu hagure\":\"満月はぐれ\",\"mangosteen\":\"マンゴスチン\",\"manguri cannon\":\"まんぐりキャノン\",\"maniac street\":\"Maniac Street\",\"manianima\":\"まにあにま\",\"maniax55\":\"ManiaX55\",\"manimani.\":\"まにまに。\",\"manitou\":\"MANITOU\",\"manjuu x\":\"まんじゅうX\",\"manjyu-umai.\":\"まんじゅううまい。\",\"mankan zenseki\":\"漫甘全席\",\"manles laboratory\":\"マンルのラボラトリー\",\"manman\":\"まんまん\",\"manmanya\":\"まんまん屋\",\"manmaru hoppe\":\"まんまるほっぺ\",\"mano-ya\":\"まの屋\",\"manpuchi\":\"まんぷち\",\"mantaman\":\"マンタマン\",\"manten hoshizora\":\"満天星空\",\"mantobi\":\"まんとび\",\"many b\":\"Many B\",\"manymanyrain\":\"雨暈郁太\",\"manzokudou\":\"満足堂\",\"maple-go\":\"maple号\",\"marabians\":\"マラビアンズ\",\"marakkuma\":\"マラックマ\",\"maraparte\":\"まらぱるて\",\"marasca no oni\":\"マラスカの鬼\",\"maraschino\":\"MARASCHINO\",\"marastudio\":\"MaraStudio\",\"marble\":\"marble\",\"marble candy soft\":\"マーブルCandySoft\",\"marble kid\":\"マーブルキッド\",\"marbodon\":\"MARBODON\",\"march\":\"MARCH\",\"marchen honpo\":\"メルヘン本舗\",\"margarita\":\"Margarita\",\"marge-loop\":\"Marge-Loop\",\"maria system00\":\"Maria_System00\",\"marialite\":\"Marialite\",\"mariana kaikou kikaku\":\"まりあな海溝企画\",\"marigold\":\"marigold\",\"marin\":\"まりん\",\"marinconia\":\"MARINCONIA\",\"marine\":\"マリン\",\"marinwhip\":\"まりんホイップ\",\"mario almanac\":\"MARIO ALMANAC\",\"marisaya\":\"まりさ屋\",\"marley and scrooge shoukai\":\"マーリィ&スクルージ商会\",\"marmalade\":\"ま～まれぇど\",\"maromayu\":\"まろまゆ\",\"maromi club\":\"まろみくらぶ\",\"maron head\":\"マロンヘッド\",\"maroron ex\":\"マロロンEX\",\"maroyaka kominka\":\"まろやか古民家\",\"marry bell\":\"マリーベル\",\"marshmallow kyoudan\":\"マシュマロ響団\",\"marshmallow soft\":\"ましゅまろそふと\",\"marshmallow x whip\":\"ましゅまろ×ほいっぷ\",\"maru tendon\":\"まる天丼\",\"maruarai\":\"まるあらい\",\"marubatsu bunko\":\"○×文庫\",\"maruchuu seisaku\":\"まるちゅう製作\",\"marugoshi-do\":\"丸腰堂\",\"maruguya.exe\":\"まるぐ屋.exe\",\"maruhamaya\":\"マルハマヤ\",\"marui don\":\"丸居丼\",\"maruiro kikou\":\"丸色季候\",\"marukaya\":\"まるか家\",\"marumagic\":\"まるまgic\",\"marumaru arumajiro\":\"まるまるアルマジロー\",\"marume works\":\"マルメワークス\",\"maruno keikaku\":\"まるの計画\",\"marunomare\":\"まる のま れ\",\"marusan\":\"まるサン\",\"maruta production\":\"MARUTA Production\",\"maruta-dojo\":\"丸田道場\",\"marutori corp\":\"まる鳥Corp\",\"marutori no chazuke\":\"丸鳥の茶漬け\",\"marvelous zents\":\"Marvelous Zents\",\"mary no yamai\":\"メリィの病\",\"mashimin koubou\":\"ましみん工房\",\"mashiro no hihoukan\":\"真城の秘宝館\",\"mashomaro\":\"マショ麻呂\",\"masmenos\":\"マスメノス\",\"massala\":\"まっさら\",\"massaratou\":\"まっさら島\",\"master volume\":\"Master Volume\",\"master-random\":\"Master-random\",\"masulao maximum\":\"MASULAO MAXIMUM\",\"masuraion.\":\"ますらいおん。\",\"masurao\":\"MASURAO\",\"mat\":\"MAT\",\"matagitei\":\"マタギ亭\",\"matango honten\":\"マタンゴ本店\",\"matatabi sanjou\":\"またたび参上\",\"maten\":\"魔天\",\"material\":\"Material\",\"matilda kanmidokoro\":\"まちるだ甘味処\",\"matine\":\"matine\",\"matsuda shin\":\"松田シン\",\"matsuge antenna\":\"マツゲアンテナ\",\"matsumoto drill kenkyuujo\":\"松本ドリル研究所\",\"matsumoto kichidi\":\"松本きちぢ\",\"matsumotoke\":\"松本家\",\"matsunoan\":\"マツノアン\",\"matsuri kikaku\":\"祭企画\",\"matsurika\":\"茉莉花\",\"matsutakehime\":\"松茸姫\",\"matsuyama seiji\":\"松山せいじ\",\"mattari house\":\"まったりハウス\",\"mattsuaya\":\"まっつあ屋\",\"matyaya\":\"真茶屋\",\"maumau shoujotai\":\"まうまう少女帯\",\"max and cool\":\"MAX&Cool.\",\"maxal\":\"マクサル\",\"maxi\":\"MAXI\",\"maxi age\":\"MAXI AGE\",\"maxi queen\":\"Maxi Queen\",\"maximum wind\":\"MAXIMUM WIND\",\"maxiy\":\"MAXIY\",\"maxzheart\":\"マックズハート\",\"may\":\"May\",\"may no tenshi\":\"メイの天使\",\"maya-tei\":\"まや邸\",\"mayakasiya\":\"まやかしや\",\"mayo bukuro\":\"マヨぶくろ\",\"mayoineko\":\"迷い猫\",\"mayonaka no acchigawa\":\"真夜中のあっち側\",\"mayonaka no funkotsudou\":\"真夜中のふんこつどう\",\"mayonaka tsubame\":\"真夜中ツバメ\",\"mayonnaise bakufu\":\"マヨネーズ幕府\",\"mayorice suishou iinkai\":\"マヨライス推奨委員会\",\"mayu to mato\":\"まゆとまと\",\"mayugesaien\":\"眉毛菜園\",\"mayugeya\":\"眉毛屋\",\"mazarashi\":\"まざらし\",\"maze\":\"まぜ | 迷-めいず-(メイズ)\",\"maze rerijio\":\"迷図 レリジオ\",\"mazemono\":\"まぜもの\",\"mbs truth\":\"メイビーソフトトゥルース\",\"mc hanbaiten\":\"エムシー販売店\",\"mcnail koubou\":\"まくねいる工房\",\"mdo\":\"MDO\",\"mean machine\":\"MEAN MACHINE\",\"mebi-ken\":\"女美研\",\"mach maze\":\"メックメイズ\",\"mechanical code\":\"メカニカルコード\",\"mechanical pencil\":\"メカニカルペンシル\",\"mecharis\":\"mecharis\",\"medama keikoku\":\"めだま渓谷\",\"medetasi\":\"めでたし\",\"media zomex\":\"メディアZOMEX\",\"medical berry\":\"Medical Berry\",\"medical company\":\"めでぃかるカンパニー\",\"medium bodied\":\"Medium bodied\",\"medium passion\":\"medium passion\",\"mega heart ski\":\"Mega Heart Ski\",\"mega w\":\"mega w\",\"mega-mix\":\"MEGA-MIX\",\"megabox\":\"メガボックス\",\"megacycle13\":\"Megacycle13\",\"megafeps\":\"MEGAFEPS\",\"megalith production\":\"MEGALITH PRODUCTION\",\"megalodon\":\"megalo丼\",\"megami\":\"メガミ\",\"megami kyouten\":\"女神教典\",\"megami no tamago\":\"メガミノタマゴ\",\"megamouthsystem\":\"MEGAMOUTHsystem\",\"megane beam\":\"めがねビーム\",\"megane gaikotsu\":\"メガネガイコツ\",\"megane81\":\"MEGANE81\",\"megasoundorchestra\":\"MegaSoundOrchestra\",\"megative gate\":\"メガてぃぶGATE\",\"megaton express\":\"メガトン・エクスプレス\",\"megrim\":\"Megrim\",\"meguro teikoku\":\"目黒帝国\",\"megurumi\":\"めぐるみ\",\"mei\":\"明\",\"meikyoushisui\":\"明鏡止水\",\"meiousei presents\":\"冥王星Presents\",\"meirei denpa\":\"命令電波\",\"meisaku network\":\"名作ネットワーク\",\"meishou misettei\":\"名称未設定\",\"meisou junkie\":\"迷走ジャンキー\",\"meiteitei.\":\"MEiTEiTEi.\",\"mekabu fighter\":\"メカブファイター\",\"mekabutei\":\"めかぶ亭\",\"mekakushi musume\":\"目隠し娘\",\"mekao\":\"Mekao\",\"mekimeki oukoku\":\"めきめき王国\",\"mekongdelta\":\"MEKONGDELTA\",\"mekujira\":\"めくじら\",\"mekurume yuuen\":\"目眩悠遠\",\"mellow\":\"mellow\",\"melody\":\"Melody\",\"melomo\":\"メロモ\",\"melon\":\"Melon\",\"melon no hoshiboshi\":\"めろんの星々\",\"melon pants\":\"めろんぱんつ\",\"meloncholic\":\"meloncholic\",\"melt downers\":\"MELT DOWNERS\",\"melt-down\":\"MELT-DOWN\",\"melty koubou\":\"メルティ工房\",\"mememery\":\"mememery\",\"memexile\":\"めめXILE\",\"memeya\":\"メメ屋\",\"memme douza\":\"メッメ堂座\",\"memoria\":\"Memoria\",\"mengerekun\":\"めんげれくん\",\"menino\":\"Menino\",\"mens equal k\":\"MEN'S=K\",\"mentaiko\":\"MENたいこ\",\"mental sex\":\"mental sex\",\"mental specialist\":\"めんたるスペシャリスト\",\"mentei dokoro\":\"めんてい処\",\"menya okamoto\":\"麺屋オカモト\",\"meow\":\"MEOW\",\"meowdic core\":\"Meowdic Core\",\"mephisto\":\"メフィスト\",\"merapuremi\":\"めらぷれみ\",\"mercator zuhou\":\"メルカトル図法\",\"merci\":\"メルシー\",\"mercurochrome\":\"ま～きゅろ\",\"meringue\":\"めれんげ\",\"merino\":\"めりの\",\"merkmal\":\"めるくまーる\",\"meromero melon\":\"xoxoメロン\",\"meromerofactory xl\":\"メロメロファクトリーXL\",\"meronpanchu\":\"めろんぱんちゅ\",\"meroro\":\"meroro\",\"merukoro\":\"メルコロ\",\"merveille\":\"merveille\",\"meryx3\":\"MERYx3\",\"meshita\":\"目下\",\"meshiya\":\"飯屋\",\"mess zylinder\":\"メスしりんだ～\",\"messiah and pikaring\":\"messiah&pikaring\",\"messiah syndrome\":\"MessiahSyndrome\",\"shiawase hotel\":\"しあわせホテル\",\"mesuchanghonpo\":\"メスチャンホンポ\",\"mesuman teikoku\":\"メスマン帝国\",\"metabocafe offensive smell uproar\":\"メタボ喫茶異臭騒ぎ\",\"metal drill pure chinpo land\":\"メタルドリルピュアちんぽランド\",\"metal kids meeting\":\"METAL KIDS MEETING\",\"metal-egg\":\"METAL-EGG\",\"metal-wind\":\"METAL-WIND\",\"metallic steel\":\"メタリックスチール\",\"metalltanz\":\"メタルタンツ\",\"metalrack\":\"めたるらっく\",\"metamor\":\"めたもる\",\"metamorphose\":\"めたもるふぉーぜ\",\"meteor\":\"メテオ\",\"meteor garden\":\"メテオガーデン\",\"meteor labyrinth\":\"メテオ☆ラビリンス\",\"metro notes\":\"めとろのーつ\",\"metroier\":\"メトロイヤー\",\"mexe.jp\":\"mexe.jp\",\"mezase esisama\":\"目指せ絵師様\",\"mf future\":\"MF Future\",\"mg.\":\"mg.\",\"mgt\":\"MGT\",\"mgw\":\"MGW\",\"mi\":\"mi\",\"miburi\":\"美武里\",\"mica\":\"MICA\",\"michinakaba\":\"三血中吐\",\"michinoku hitori tabi\":\"みちのく一人旅\",\"micro page\":\"みくろぺえじ\",\"microbeurre\":\"Microbeurre\",\"microbit\":\"Microbit\",\"microdat\":\"マイクロ脱兎\",\"micromacro\":\"MICROMACRO\",\"middle earth\":\"みどるあ～す\",\"midnight muumus\":\"ミッドナイトむぅむズ\",\"midnight pleasure\":\"ミッドナイトプレジャー\",\"midori no niwatori\":\"緑の鶏\",\"midoriiro cut in\":\"緑色カットIN\",\"midoriya\":\"みどりや\",\"mig\":\"mig\",\"migimagari-ya\":\"右曲がり屋\",\"migome\":\"ミゴメ\",\"migumigu-sou\":\"ミグミグ荘\",\"mijirushi box\":\"みじるしBOX\",\"mika-chan center\":\"ミカちゃんセンター\",\"mikaguuland\":\"みかぐーらんど\",\"mikaka\":\"みかか\",\"mikan douwa\":\"未完童話\",\"mikan to uri\":\"蜜柑と瓜\",\"mikan-ya\":\"みかん屋\",\"mikanbako\":\"みかん箱\",\"mikanberry\":\"ミカンベリー\",\"mikandensya\":\"蜜柑電車\",\"mikapikazo\":\"MikaPikazo\",\"mikayla\":\"ミカイラ\",\"mikazuki ondo\":\"三日月音頭\",\"mike ni mage\":\"三毛にマゲ\",\"mikeneko disco\":\"三毛猫ディスコ\",\"mikeneko-children\":\"三毛猫チルドレン\",\"mikenekodou\":\"三毛猫堂\",\"mikenekotei\":\"みけ猫亭\",\"mikkamisaki\":\"みっかみさき\",\"mikorabi\":\"みこらび\",\"mikouken 2nd\":\"味巧軒2nd\",\"milcrepe\":\"みるくれーぷ\",\"milf shobou\":\"ミルフ書房\",\"milk angel\":\"みるくえんじぇる\",\"milk boy\":\"みるくぼーい\",\"milk cha\":\"みるく茶\",\"milk chips\":\"ミルクチップス\",\"milk cocoa shake\":\"ミルクココアセーキ\",\"milk crown\":\"ミルククラウン\",\"milk drop\":\"みるくどろっぷ\",\"milk ejaculation\":\"みるくいじゃきゅれーしょん\",\"milk gohan\":\"みるくごはん\",\"milk hall\":\"milk hall\",\"milk land\":\"MILK LAND\",\"milk pai\":\"みるくぱい\",\"milk price\":\"MILK☆PRICE\",\"milk ring\":\"milk ring\",\"milk rotary\":\"みるくロータリー\",\"milk server\":\"みるくさーばー\",\"milk standard\":\"MILK STANDARD\",\"milk tea house\":\"牛乳茶屋\",\"milk-size\":\"みるく-SIZE\",\"milkholic\":\"milkholic\",\"milkpop\":\"MILKPOP\",\"milkshake work\":\"奶昔工坊\",\"milktub\":\"milktub\",\"milky high tension\":\"ミルキーハイテンション♂\",\"milky paint\":\"Milky Paint\",\"milky pearl\":\"みるきぃぱぁる\",\"milky souffle\":\"みるきーすふれ\",\"milky strike\":\"milky strike\",\"milky way\":\"みるきーうぇい\",\"mill-mill\":\"Mill-Mill\",\"mille-feuille\":\"ミルフィーユ\",\"million bank\":\"みりおんばんく\",\"million beast from diana\":\"Million beast from DIANA\",\"million drops\":\"MILLION☆DROPS\",\"millionlove\":\"みりおんらぶ\",\"millions hope\":\"Millions Hope\",\"milts chaya\":\"みるつ茶屋\",\"mimasaka direct\":\"ミマサカダイレクト\",\"mime channel\":\"MImeチャンネル\",\"mimesis\":\"ミメーシス\",\"mimicry.z\":\"みみくりどっとぜっと\",\"mimippu\":\"みみっぷ\",\"mimishiki\":\"耳式\",\"mimitto\":\"ミミット\",\"mimiya\":\"耳屋\",\"mimizu thousand\":\"ミミズサウザンド\",\"mimo hutamo\":\"身も蓋も\",\"mimori.\":\"ミモリ。\",\"mimoritei\":\"水護亭\",\"mimoton\":\"みもとん\",\"mimura namae\":\"三村生恵\",\"minadukitei\":\"水無月亭\",\"minami alps\":\"ミナミアルプス\",\"minamikanazawa 5th studio\":\"南金沢第五スタジオ\",\"minamono\":\"みなmono\",\"minamoon\":\"みなむーん\",\"minarai honpo\":\"みならい本舗\",\"minarindo\":\"みなりん堂\",\"minarui\":\"みなるい\",\"minasokomori\":\"水底森\",\"minato carnival\":\"みなとカーニバル\",\"minato future\":\"minato future\",\"mind and mind\":\"Mind and Mind\",\"mindstone\":\"マインドストーン\",\"mine noujou\":\"ミネ農場\",\"mine slash mine\":\"mine/mine\",\"mineya\":\"峰屋\",\"mini\":\"mini\",\"minies club\":\"MINIES CLUB\",\"minimum lab\":\"みにまむラボ\",\"mink\":\"ミンク\",\"mink ego\":\"Mink EGO\",\"minna shindoi\":\"みんなしんどい\",\"mino kureha\":\"美濃紅葉\",\"minobu gentle\":\"身延ジェントル\",\"minobuya\":\"みのぶ屋\",\"minomushitei\":\"みのむし亭\",\"minori\":\"minori\",\"minori kenkyuujo\":\"みのり研究所\",\"minors escort\":\"マイナーズエスコート\",\"minpee\":\"みんペー\",\"minshuku inarimushi\":\"民宿いなりむし\",\"mint blue\":\"MINT BLUE\",\"mint chocolate\":\"ミントチョコレート\",\"mintcube\":\"MintCUBE\",\"mintjulep\":\"mintjulep\",\"minus unlimited\":\"-unlimited\",\"minusartworks\":\"MinusArtWorks\",\"minwa\":\"ミンワ\",\"miogui\":\"澪杙\",\"miracle candy\":\"ミラクルキャンディ\",\"miracle ponchi matsuri\":\"ミラクルポンチ祭り\",\"mirage\":\"鏡樹\",\"mirage cat\":\"MIRAGE CAT\",\"mirage-soft\":\"みらーじゅそふと\",\"mirai\":\"mirai\",\"mirapare\":\"みらぱれ\",\"mirin\":\"みりん\",\"mirukomi\":\"みるこみ\",\"mirukuseiki\":\"みるく世紀\",\"misaki ai\":\"美咲愛\",\"misakix megamix\":\"MISAKIX MEGAMIX\",\"misokko chuutai\":\"みそっ子中隊\",\"misonodenpatou\":\"みそのデンパ塔\",\"misopanya\":\"みそパン屋\",\"misoya\":\"味噌屋\",\"miss black offline\":\"MISS BLACK OFFLINE\",\"missa\":\"missa\",\"missing park\":\"MISSING PARK\",\"misssail\":\"MISS/SAIL\",\"mist night\":\"Mist Night\",\"misty\":\"ミスティ\",\"misty isle\":\"Misty Isle\",\"misty wind\":\"Misty Wind\",\"mita kazuo daihyakka\":\"三田和夫大百科\",\"mitarashi club\":\"みたらし倶楽部\",\"mitarou teishoku\":\"ミタロウ定食\",\"mitegura\":\"MITEGURA\",\"mithril\":\"ミスリル\",\"miti\":\"ミィティ\",\"mitikage\":\"みちかげ\",\"mitsu\":\"蜜\",\"mitsu-iro syrup\":\"蜜色シロップ\",\"mitsuami mobius\":\"蜜あみメビウス\",\"mitsuami romance\":\"三つ編みロマンス\",\"mitsuiri house\":\"みついり♡ハウス\",\"mitsuki no mori\":\"林樹の森～ミツキノモリ～\",\"mitsumata suihanki\":\"三又炊飯器\",\"mitsunoya\":\"みつのや\",\"mitsuya yoguru\":\"ミツヤヨーグル\",\"miumiu\":\"MiUMiU\",\"miura jota\":\"三浦いお太\",\"mitsuwa building\":\"三輪ビルヂング\",\"miwaku-iro missile\":\"魅惑色ミサイル\",\"mix station\":\"ミックス ステーション\",\"mix-ism\":\"MIX-ISM\",\"mixed breed\":\"mixed breed\",\"mixwill soft\":\"Mixwill Soft\",\"miyabi tsuzuru bu\":\"みやびつづる部\",\"miyama enseki\":\"深山燕石\",\"miyanchi\":\"みやんち\",\"miyubi\":\"ミユビ\",\"miyumiyu project\":\"みゆみゆProject\",\"mizu\":\"水\",\"mizuiro usagi\":\"Mizuiro うさぎ\",\"mizuiro zenmai\":\"みずいろぜんまい\",\"mizujouyu jouryuusho\":\"水醤油蒸留所\",\"mizuki-chan club\":\"みずきちゃんくらぶ\",\"mizukidou\":\"観月堂\",\"mizumo club\":\"みずも倶楽部\",\"mizutama neko\":\"水玉ねこ\",\"mizutofu\":\"水豆腐\",\"mizuwari neko\":\"水割り猫\",\"mjgg\":\"もりじおぎゅうぎゅう\",\"mjkitty\":\"mjkitty\",\"mjks\":\"mjks\",\"mk ultra\":\"MKウルトラ\",\"mlkx\":\"MLKx\",\"mm kan\":\"MM館\",\"mmt\":\"MMT!!\",\"mmu2000\":\"MMU2000\",\"mnh\":\"MNH\",\"moai lion\":\"モアイライオン\",\"mob.1\":\"MOB.1\",\"mobco.\":\"mobco.\",\"mobris\":\"MOBRIS\",\"mocchimochiya\":\"もっちもち屋\",\"mocchomudake\":\"モッチョム茸\",\"mochi dog laboratory\":\"餅犬製作所\",\"mochi hasamiuchi da\":\"餅はさみ撃ちだっ!\",\"mochi kiss junkie\":\"もちxoジャンキー\",\"mochi mochi\":\"もちもち\",\"mochi mochi mikan\":\"もちもちみかん\",\"mochi-ya\":\"餅屋\",\"mochimochi carnevale\":\"もちもちCarnevale\",\"mochimochi dou\":\"もちもち堂\",\"mochimochitaiyo\":\"もちもちたいよう\",\"mochinige\":\"持ち逃げ\",\"mochinonnon.\":\"もちのんのん。\",\"mocking soft\":\"木琴Soft\",\"moco chouchou\":\"Moco Chouchou\",\"moco note\":\"もこのーと\",\"mocreation\":\"mocreation\",\"modae shine\":\"悶え死ね!!!\",\"moe\":\"MoE\",\"moe dukuri oukoku\":\"萌えづくり王国\",\"moegekidon\":\"萌撃丼\",\"moehina kagaku\":\"萌雛化学\",\"moekorodo\":\"萌殺堂\",\"moenai gomi bukuro\":\"萌えないゴミ袋\",\"moenomiya\":\"萌宮\",\"moeru gomi\":\"燃えるゴミ\",\"moewrest\":\"もえれす\",\"moffle\":\"moffle\",\"mofu shippo lab\":\"もふしっぽらぼ\",\"mofumanjuu\":\"もふまんじゅう\",\"mofumofuen\":\"もふもふ苑\",\"mofurafu\":\"mofurafu\",\"mofuya\":\"モフ屋\",\"mogemogeya\":\"モゲモゲ屋\",\"mogetama\":\"もげたま\",\"mogiki-chan chi\":\"もぎきちゃんち\",\"mogullaz\":\"Mogullaz\",\"mogumogu soft\":\"もぐもぐソフト\",\"mogura company\":\"MOGURA COMPANY\",\"mogura tengu\":\"もぐら天狗\",\"moirai\":\"moirai\",\"mojiya\":\"MOじ屋\",\"mokkori musume.\":\"もっこり娘。\",\"mokugyuutan\":\"もくぎゅうたん。\",\"mokumoku\":\"もくもく\",\"mokusa\":\"Mokusa\",\"mokusei-gaeri\":\"木星帰り\",\"mokuzou zabuton\":\"モクゾウザブトン\",\"molamola.software\":\"Molamola.software\",\"molfo\":\"molfo\",\"molossan\":\"丧loss庵\",\"molotov cocktail\":\"モロトフカクテル\",\"molten club\":\"モルテンクラブ\",\"moment silicon\":\"木綿シリコン\",\"momi momi studio\":\"もみもみスタジオ\",\"momiage rapunzel\":\"もみあげラプンツェル\",\"momiji coffee\":\"もみじ珈琲\",\"momiji mofumofutei\":\"椛もふもふ亭\",\"momiji oroshi\":\"もみじおろし\",\"mominoki\":\"もみの木\",\"momizi koubou\":\"もみじ工房\",\"momo\":\"Momo\",\"momo mania\":\"桃マニア\",\"momo no kanzume\":\"桃のカンヅメ\",\"momo no omochi\":\"もものおもち\",\"momo-meron\":\"桃メロン\",\"momo.\":\"momo。\",\"momoameya\":\"桃飴屋\",\"momochi\":\"MOMOCHI\",\"momochoko\":\"ももチョコ\",\"momodaya\":\"百田屋\",\"momohina\":\"桃雛\",\"momoiro cait sith\":\"ももいろけっとしー\",\"momoiro diva\":\"桃色DIVA\",\"momoiro scissors\":\"桜色シザーズ\",\"momoiro settoudan\":\"桃色窃盗団\",\"momoiro sugoroku\":\"桃色双六\",\"momoiro toiki\":\"桃色吐息\",\"momoiro-gekijyou\":\"桃色劇場\",\"momoiro-netsuduki\":\"桃色熱月\",\"momoiro-rip\":\"ももいろリップ\",\"momoirohoppe\":\"ももいろほっぺ\",\"momoirosyounenki\":\"桃色少年期\",\"momokan\":\"ももかん\",\"momokawa\":\"モモカワ\",\"momokuri\":\"もも栗\",\"momomoya\":\"もももや\",\"momonashi potato\":\"桃梨ぽてと\",\"momoneko doumei\":\"ももねこ同盟\",\"momonga club\":\"モモンガ倶楽部\",\"momosakiiro\":\"桃咲色\",\"momoshiba anzu\":\"ももしば杏子\",\"momoziri hustle dou\":\"桃尻ハッスル堂\",\"mon amour.\":\"もなむーる。\",\"mon-petit\":\"mon-petit\",\"monado\":\"MONADO\",\"monako\":\"MONAKO\",\"mondo\":\"モンド\",\"mongoose studio\":\"高浜屋\",\"moni teishoku\":\"もに定食\",\"monica\":\"monica\",\"monji koubou\":\"もんじ肛房\",\"monke\":\"もんけ\",\"monkey adventure\":\"モンキー・アドベンチャー\",\"monkey pinx.\":\"MonkeyPinx.\",\"monkey reppuutai\":\"モンキー烈風隊\",\"monkeys factory\":\"モンキーズFACTORY\",\"monmo bokujou\":\"モンモー牧場\",\"mono letter\":\"モノ手紙\",\"mono x chro\":\"モノ×クロ\",\"monochrome\":\"モノクローム\",\"monochrome circuit\":\"ものくろサーキット\",\"monochrose\":\"monochrose\",\"monoeye\":\"Monoeye\",\"monokichi youhoujou\":\"ものきち養蜂場\",\"monokulolli\":\"ものくろり\",\"monokuromomiji\":\"モノクロモミジ\",\"monokurored\":\"モノクロRed\",\"monolove\":\"MONOLOVE\",\"mononoke hobaku butai\":\"もののけ捕縛部隊\",\"monorabbi\":\"ものらび\",\"monpe kagekiha\":\"モンペ過激派\",\"monshiro\":\"モンシロ\",\"monster box\":\"もんすたーぼっくす\",\"monster tribe\":\"MONSTER TRIBE\",\"monstera\":\"モンステラ\",\"monsters biscuit\":\"モンスターズビスケット\",\"monte carlo-ya\":\"もんてかるろ屋\",\"monteriakitto\":\"もんてりあきっと\",\"monukenokara\":\"もぬけのから\",\"moon knight sparkle\":\"MOON KNIGHT SPARKLE\",\"moon the angry\":\"Moon the angry!\",\"moon wort\":\"Moon Wort\",\"moongarden\":\"MoonGarden\",\"moonknives\":\"moonknives\",\"moonlight diner\":\"ムーンライト・ダイナー\",\"moonrevenge\":\"MoonRevenge\",\"moorusu\":\"モール巣\",\"mopuo oyakata\":\"もぷお親方\",\"mor\":\"MOR\",\"moladolog\":\"モラードログ\",\"morgue\":\"morgue\",\"mori no kumasan yuugekitai\":\"森のくまさん遊撃隊\",\"mori no mushi\":\"森の蟲\",\"mori no seirei tittilty\":\"森の精霊ティッティルティ\",\"morihama no shindansho\":\"モリハマの診断書\",\"moriisan-tokono\":\"森井さんとこの\",\"moriman shoten\":\"森まん商店\",\"morimori runrun\":\"もりもりルンルン\",\"morino koubou\":\"森野工房\",\"morinomiya koushinkyoku\":\"森ノ宮行進曲\",\"morishigeru laboratory\":\"もりしげる研究所\",\"morisoba iccho\":\"盛りそば一丁\",\"morittokoke\":\"もりっとこけ\",\"moriya\":\"杜屋\",\"moriya630\":\"moriya630\",\"morizo\":\"盛増\",\"morning\":\"もーにんぐ\",\"morohane.\":\"もろはね。\",\"morozumix\":\"morozumix\",\"morrow\":\"morrow\",\"moruda ramenya\":\"もる田ラーメン屋\",\"morugastudio\":\"MORUGAstudio\",\"morutaya\":\"もるた屋\",\"mosome\":\"モソーム\",\"motachi\":\"もたち\",\"motchie kingdom\":\"もっちー王国\",\"mothman\":\"もすまん\",\"motley crew\":\"Motley crew\",\"motsu ryouri\":\"もつ料理\",\"mottekoi sangyou\":\"モッテコイ産業\",\"mottocompany\":\"MottoCompany\",\"motu club\":\"モツクラブ\",\"mou nero\":\"もう寝ろ\",\"mou sukoshi hidari e\":\"もう少し左へ\",\"moudou\":\"もうどう\",\"mouko mouretsu hasai dan\":\"蒙古猛烈破砕団\",\"moumoku nezumi\":\"盲目ねずみ\",\"moumoku no inu-tachi\":\"盲黙のいぬたち\",\"moumoubox\":\"も〜も〜ぼっくす\",\"mount position\":\"マウントポジション\",\"mountain topper\":\"マウンテントッパー\",\"mousou aria\":\"妄想アリア\",\"mousou bussan\":\"妄想物産\",\"mousou caution\":\"妄想Caution\",\"mousou colosseum\":\"妄想コロッセオ\",\"mousou endemic\":\"妄想エンデミック\",\"mousou engine\":\"妄想エンジン\",\"mousou fukuzagata\":\"妄想複座型\",\"mousou katharsis\":\"妄想カタルシス\",\"mousou kenkyuujo\":\"妄想研究所\",\"mousou meteoroid\":\"妄想メテオロイド\",\"mousou pasta\":\"妄想パスタ\",\"mousou pushon\":\"妄想PushOn\",\"mousou tokkyuu\":\"妄想特急\",\"mousou wakusei\":\"妄想惑星\",\"mousou web\":\"妄想ウェブ\",\"mousou zukan\":\"もーそーずかん\",\"mousoudokei\":\"妄想時計\",\"moviendo\":\"Moviendo\",\"moyasix\":\"moyasix\",\"mozuchichi\":\"MOZUCHICHI\",\"mozuya\":\"もず屋\",\"mp0\":\"MP0\",\"mr.outside\":\"Mr. Outside\",\"mr.rabbit\":\"Mr.Rabbit\",\"mro\":\"MRO\",\"ms is\":\"M's I's\",\"ms works.\":\"M's WORKS.\",\"msize\":\"エムサイズ\",\"mtk\":\"MTK\",\"mu\":\"美遊\",\"mu-cute\":\"μ-CuTe\",\"mucha koubou\":\"無茶工房\",\"mudai picture\":\"無題ピクチャ\",\"mugcat\":\"Mugcat\",\"mugen honpo\":\"むげん本舗\",\"mugen kairou\":\"夢幻回廊\",\"mugen kidousha\":\"夢幻機動舎\",\"mugen lens\":\"無限レンズ\",\"mugen mountain\":\"夢幻マウンテン\",\"mugen mousou\":\"無限妄想\",\"mugen no soul\":\"無限のソウル\",\"mugendou cinema\":\"無限堂キネマ\",\"mugenkan\":\"夢幻館頒布\",\"mugenya honpo\":\"無限屋本舗\",\"mugicha.\":\"むぎちゃ。\",\"mugichoko store\":\"むぎちょこストア\",\"mugiwara club\":\"麦わらクラブ\",\"muhakiya\":\"ムハキヤ\",\"muhouchitai\":\"無法地帯\",\"muin coffee\":\"無印コーヒー\",\"mujina\":\"狢\",\"mujirushi shounen\":\"無印少年\",\"mujirushi-dou\":\"無印堂\",\"mukade tou\":\"ムカデ島\",\"mukeikaku syugi\":\"無計画主義\",\"muki pomera\":\"ムキぽめら\",\"mukibutsu heart\":\"無機物はーと\",\"mukuchi na hakoniwa\":\"無口な箱庭\",\"mukuge\":\"毳\",\"mukumukumoon\":\"むくむくむーん\",\"mukuton kyouju to soratobu potato.\":\"むくトン教授と空飛ぶポテト。\",\"mukyuu dynamic\":\"ムキューダイナミック\",\"mulberry\":\"マルベリ\",\"multi-type\":\"Multi-Type\",\"multivitamin\":\"MULTIVITAMIN\",\"mumeiya\":\"夢迷屋\",\"mumumu jirushi\":\"むむむ印\",\"mumunyan\":\"むむにゃん\",\"mumyoudou\":\"夢妙堂\",\"mumyoukutsu\":\"無明窟\",\"munak\":\"ムナック\",\"munmun dou\":\"ムンムン堂\",\"munomeritei\":\"むのめり亭\",\"mura no ikinokori\":\"村の生き残り\",\"muramura pocky\":\"ムラムラPocky\",\"murasaki nyanko bar\":\"むらさきにゃんこバー\",\"murasaki switch\":\"ムラサキスイッチ\",\"murasaki-dou honten\":\"紫紀堂本店\",\"murasaki.\":\"紫。\",\"murasakiiro no yoru\":\"むらさきいろのよる\",\"murasakiiro orange\":\"むらさきいろオレンジ\",\"murasame no yousai\":\"村雨の要塞\",\"murderhouse\":\"MURDERHOUSE\",\"muremure kaisendon\":\"むれむれ海鮮丼\",\"murmur\":\"murmur\",\"musansodou\":\"無酸素堂\",\"musasabidou\":\"むささび堂\",\"musashi-dou\":\"武蔵堂\",\"muscadet\":\"ミュスカデ\",\"muse\":\"MUSE\",\"museifu kutsushita doumei\":\"無政府靴下同盟\",\"mushaburu\":\"むしゃぶる\",\"mushikui lettuce\":\"むしくいレタス\",\"mushimusume aikoukai\":\"蟲娘愛好会\",\"mushiringo\":\"むしりんご\",\"mushiyaki\":\"むしやき!!\",\"mushroom pig\":\"マッシュルームピッグ\",\"mushroom shoutengai\":\"マッシュルーム商店街\",\"musukichi\":\"むす吉\",\"mutospectacle\":\"無糖スペクタクル\",\"mutsukidou\":\"睦月堂\",\"mutsuraboshi\":\"むつらぼし\",\"mutsuya\":\"陸奥屋\",\"muttumuu\":\"むっつむー\",\"mx2\":\"M×2\",\"my blue sky\":\"マイブルースカイ\",\"my darling\":\"my_darling\",\"my pace world\":\"my pace world\",\"myao\":\"Myao\",\"mycology.\":\"マイコロジィ。\",\"mylab\":\"MYLAB\",\"myon plus 1\":\"MYON+1\",\"myonlyone\":\"MYONLYONE\",\"myoukenya\":\"みょうけん屋\",\"myriad purity\":\"Myriad Purity\",\"mysp5cm\":\"まいすぺ5cm\",\"mystery clock\":\"MYSTERY CLOCK\",\"mystic chord\":\"ミスティック・コード\",\"n\":\"ん！\",\"n b g\":\"エヌベージー\",\"n no tsukue\":\"Nの机\",\"n shiki\":\"N式\",\"n-bomb asylum\":\"核弾避難室\",\"n-craft\":\"n-craft\",\"n.a.u.s.\":\"N.A.U.S.\",\"n.cs\":\"N.Cs\",\"n.n.f.s\":\"N.N.F.S\",\"n.r.d.works\":\"N.R.D.WORKS\",\"n.s craft\":\"N.S Craft\",\"n.s.project\":\"N.S.project\",\"n2jirai\":\"N2地雷\",\"n7747\":\"N7747\",\"nabe no circle\":\"nabeのサークル\",\"nabesekizaiten\":\"鍋石材店\",\"nabeyaki udon\":\"鍋焼きうどん\",\"nabeyama kaidou\":\"鍋山街道\",\"nabeyashiki\":\"鍋屋敷\",\"nac.\":\"Nac.\",\"nac000\":\"nac000\",\"nachtzug\":\"Nachtzug\",\"nae petit\":\"nae petit\",\"nagaremono\":\"流れもの\",\"nagasaki-inter\":\"長崎インター\",\"nagashi soumen\":\"ながしそうめん\",\"naginata kikaku\":\"なぎなた企画\",\"naginata-kan\":\"薙刀館\",\"nagisa no haikara kingyo\":\"渚のハイカラ金魚\",\"nagisawaya\":\"なぎさわ屋\",\"nagomi no ame\":\"和ノ雨\",\"nagumoya\":\"なぐも屋\",\"naguu no shiro\":\"なぐうの城\",\"nahabaru\":\"ナハバル\",\"nahapuro\":\"なはぷろ\",\"naitou kirara\":\"内藤キララ\",\"naitou2\":\"NAITOU2\",\"naivta\":\"ナイーブタ\",\"naiyori alpha zaidan\":\"Naiyori alpha 財団\",\"nakagawaya\":\"中川家\",\"nakamuratakumi\":\"仲村巧\",\"nakanoku kurochanno...\":\"中野区くろちゃんの…\",\"nakasatogumi\":\"ナカサト組\",\"nakasone battalion\":\"中曽根バタリアン\",\"nakatashi family\":\"中田紫ファミリー\",\"nakaun\":\"なかうん\",\"nakayama shiki kenkou tosho\":\"中山式健康図書\",\"nakayohi\":\"なかよひ\",\"nakayoshi koyoshi\":\"なかよShiこよShi\",\"nakayoshi obgyn\":\"なかよし産婦人科\",\"nakigara\":\"無空\",\"nakuru box\":\"ナクルボックス\",\"nama mochi shichi banchi\":\"生餅七番地\",\"nama shibori sour\":\"生搾りサワー\",\"namaco\":\"NAMACO\",\"namae kinyuuran\":\"名前記入欄\",\"namaikichibi\":\"なまいきちび\",\"namakemono kishidan\":\"なまけもの騎士団\",\"namakoya\":\"なまこ屋\",\"namakura dou\":\"なまくら堂\",\"namakura na kura\":\"なまくらな鞍\",\"namanama shandy gaff\":\"生ナマシャンディガフ\",\"namanamago\":\"ナマナマゴ\",\"namanecotei\":\"生猫亭\",\"namaniku tappuri\":\"生肉たっぷり\",\"namashoku de hara kowasu tami\":\"生食デ腹壊ス民\",\"namasute koubou\":\"生棄工房\",\"namayake.\":\"なまやけ。\",\"namazu-no-ikesu\":\"鯰の生け簀\",\"nambokuya\":\"南北屋\",\"nameless\":\"ネームレス\",\"namelesszero\":\"NamelessZero\",\"nami-nami restaurant\":\"並々食堂\",\"namiroji\":\"波路地\",\"namitaitei\":\"並大抵\",\"nanaban chamaru dou\":\"七番茶○堂\",\"nanacan\":\"NANACAN\",\"nanafundou\":\"七分堂\",\"nanairo batake\":\"なないろ畑\",\"nanairo koubou\":\"なないろ工房\",\"nanairo momogumi\":\"なないろもも組\",\"nanairo no magatama\":\"七色の勾玉\",\"nanairo senpu-ji\":\"七色旋風児\",\"nanairo shichihenge\":\"七色七変化\",\"nanakamado\":\"七竈\",\"nanakorobi yaoki\":\"七転八起\",\"nanakumi\":\"ななくみ\",\"nanamehan\":\"ななめ班\",\"nanameno\":\"ななめの\",\"nanamigumi\":\"七海組\",\"nanamiya\":\"奈波屋\",\"nanamoya\":\"ななも屋\",\"nananana\":\"なななな\",\"nanashi inflation\":\"ななしいんふれーしょん\",\"nanashi shounen\":\"ナナシ少年\",\"nanashiki\":\"七式\",\"nanaten manten\":\"七点万点\",\"nanatsu no kagiana\":\"七つの鍵穴\",\"nanatsuboshi\":\"七つ星\",\"nanatsugumi\":\"ななつ組\",\"nanatsuhane\":\"ナナツハネ\",\"nanaya\":\"奈々屋\",\"nanayoduki\":\"七夜月\",\"nanbu\":\"なんぶ\",\"nandemodozo\":\"なんでもどうぞ\",\"nandemoii\":\"なんでもいい\",\"nanika\":\"なにか\",\"nanika no heya\":\"何かの部屋\",\"nanika-modoki\":\"なにかもどき\",\"nanikaya\":\"なにか屋\",\"naniwaya\":\"浪速屋\",\"nankin honpo\":\"南京本舗\",\"nankotsu age rice\":\"なんこつ揚げライス\",\"nankyoku\":\"なんきょく\",\"nano royal\":\"Nano Royal\",\"nanokah\":\"なのかH\",\"nansyu-koubow\":\"南洲好房\",\"nantan e\":\"南端へ\",\"nantoka narunaru.\":\"なんとかなるなる。\",\"napier sabre\":\"Napier Sabre\",\"napolinu\":\"napolinu\",\"naranashitori\":\"ならなしとり\",\"narashino kaitoudan\":\"習志野海盗団\",\"narimasuya\":\"なります屋\",\"narukotei\":\"鳴狐亭\",\"naruto kenkyu sha\":\"なると研究社\",\"nas-on-ch\":\"NAS-ON-CH\",\"nasi-pasuya\":\"なしぱす屋\",\"nasubi knight\":\"ナスビ騎士\",\"nata de coco soda\":\"ナタデココ・ソーダ\",\"natadekoko\":\"なたでここ\",\"natakuga-yuku\":\"なたくが行く!\",\"natorina dou\":\"なとりな堂\",\"natsu no cheese koujou\":\"夏のチーズ工場\",\"natsu no umi\":\"なつのうみ\",\"natsugumo himawari\":\"夏雲ひまわり\",\"natsuiro laika\":\"夏色ライカ\",\"natsuiro otome\":\"なついろ乙女\",\"natsuiro shoujo\":\"夏色少女\",\"natsuiro terrace\":\"夏色テラス\",\"natsukanmi\":\"なつかんみ\",\"natsukon\":\"なつこん\",\"natsumemo\":\"なつめも\",\"natsumin no circle\":\"なつみんのさーくる\",\"natsuyasumi\":\"夏休み\",\"nattou mania\":\"納豆☆マニア\",\"nattou no mori\":\"なっとうの杜\",\"natukiya\":\"なつき屋\",\"natumiruku\":\"なつみぃ〜るク♪\",\"naturaldays\":\"NATURALDAYS\",\"nature\":\"NaTuRe\",\"nature.\":\"nature.\",\"naughtygal style b\":\"NaughtyGal Style B\",\"naunau\":\"なうなう\",\"navi001\":\"Navi001\",\"navy\":\"NAVY\",\"navy blue\":\"Navy Blue\",\"navy garden\":\"ネイビーガーデン\",\"nawanoren\":\"縄のれん\",\"nayuta\":\"ナユタ\",\"nazo no akanekokan\":\"謎の赤猫団\",\"nazonokai\":\"謎の会\",\"nb teishoku\":\"NB定食\",\"nb.\":\"nb.\",\"ncdn\":\"ニチダン\",\"ne.\":\"ね。\",\"nebosukekin\":\"ねぼすけ菌\",\"necomuffler\":\"ネコマフラー\",\"necotoxin\":\"NECOTOXIN\",\"necrolincer\":\"ネクロリンサー\",\"nedaore\":\"ネダオレ\",\"needle\":\"NEEDLE\",\"needle garden\":\"NEEDLE GARDEN\",\"neet corp\":\"ニート(株)\",\"negapoji-bu\":\"ネガぽじーぶ\",\"negibouzu\":\"ねぎ坊主\",\"negimaers\":\"ねぎまーず\",\"neginegio\":\"ネギネギ夫\",\"negi to takenoko\":\"ねぎとたけのこ\",\"negoro teppou tai\":\"根来鉄砲隊\",\"negoto\":\"negoto\",\"negoya\":\"寝語屋\",\"neguradou\":\"塒堂\",\"negurie\":\"ねぐりえ\",\"neji hina no sekai\":\"ネジヒナの世界\",\"neji roll\":\"ねじロール\",\"nejikiri sister\":\"捻切シスター\",\"nejimaki kougen\":\"ねじまきこうげん\",\"nejiya no hito\":\"ねじやのひと\",\"neko blizzard\":\"猫ブリザード\",\"neko bus unsou\":\"ねこばす運送\",\"neko daifuku\":\"ねこ大福\",\"neko irazu\":\"猫イラズ\",\"nekojarashy\":\"猫じゃらし\",\"nekojarashi\":\"猫じゃらし\",\"neko kan\":\"ねこ缶\",\"neko kinryouku\":\"猫禁猟区\",\"neko melonya\":\"猫メロン屋\",\"neko neko house\":\"ねこねこハウス\",\"neko no onsen\":\"猫の温泉\",\"neko no sakegoto\":\"ねこのさけごと\",\"neko no shoushuugen\":\"ねこの消臭元\",\"neko no te koubou\":\"猫の手工房\",\"neko no yurikago\":\"猫のゆりかご\",\"neko pantsu\":\"ネコぱんつ\",\"neko pockle\":\"ねこぽっくる\",\"neko rop\":\"ねころっぷ\",\"neko rush\":\"ねこらっしゅ\",\"neko saffron\":\"ネコサフラン\",\"neko shounen\":\"ねこ少年\",\"neko studio\":\"ねこスタジオ\",\"neko tantei dan\":\"ネコ☆探偵団\",\"neko to hato\":\"ねことはと\",\"neko yashiki\":\"ねこ屋敷\",\"neko-rise\":\"Neko-rise\",\"nekoarashi\":\"ねこあらし\",\"nekoashi sanbi\":\"猫足讃美\",\"nekomasshigura\":\"猫驀地\",\"nekodaisuki\":\"猫大好き\",\"nekodotto\":\"ネコドット\",\"nekogoro\":\"ねこごろ\",\"nekohachi eigyoubu\":\"猫八営業部\",\"nekohige radio\":\"猫ひげラジオ\",\"nekohigetei\":\"ねこひげ亭\",\"nekoiro\":\"ネコイロ\",\"nekokabe\":\"ネコカベ\",\"nekokaburi\":\"ネコかブリ\",\"nekokagerou\":\"猫蜻蛉\",\"nekokota\":\"nekokotA\",\"nekomajin\":\"ねこまじん\",\"nekomakura soft\":\"ねこまくらsoft\",\"nekomatakan\":\"猫又館\",\"nekomeshiya\":\"ねこめし屋\",\"nekomikan aruiwa nekomikan\":\"猫美館或いは猫蜜柑\",\"nekomimi catharsis\":\"猫耳カタルシス\",\"nekomiya\":\"猫見屋\",\"nekonetoru\":\"ネコネトル\",\"nekonin-so\":\"猫忍荘\",\"nekono kaweruya\":\"ネコノカヱルヤ\",\"nekonohoshi\":\"ネコノホシ\",\"nekonote shobou\":\"ねこのてしょぼう\",\"nekopunch bashibashi\":\"ねこぱんちバシバシ\",\"nekoranbu\":\"猫乱舞\",\"nekorinchi\":\"ねこりんち\",\"nekoro ryuuseigun\":\"ねころ流星群\",\"nekorobi\":\"ねころび\",\"nekorondoru\":\"ネコロンドル\",\"nekosenyou milk\":\"猫専用牛乳\",\"nekoshaku\":\"猫尺\",\"nekosupi\":\"ねこすぴ\",\"nekottorando\":\"ネコットランド\",\"nekousa pudding\":\"ねこうさプリン\",\"nekoya\":\"ねこ屋\",\"nekoya kaigetsudou\":\"猫屋懐月堂\",\"nekoya-systemz\":\"猫屋システムズ\",\"nekozame\":\"ネコザメ\",\"nekozamedan\":\"ねこざめ団\",\"nel\":\"ネル\",\"nel-zel formula\":\"NEL-ZEL FORMULA\",\"nemachizuki chaya\":\"寝待月茶屋\",\"nemaki\":\"ねまき\",\"nemokoroppu\":\"ネモコロップ\",\"nemuke\":\"nemuke?\",\"nemurineko\":\"ねむりねこ\",\"nemutai neko\":\"眠たい猫\",\"nengaranenjuu\":\"年がら年中\",\"nenneko tanuki\":\"ねんねこたぬき\",\"nenokuni\":\"ねのくに\",\"neo frontier\":\"Neo Frontier\",\"neo ultimate works\":\"ネオアルティメットワークス\",\"neo wing\":\"Neo Wing\",\"neo-de\":\"NEO-de\",\"neondou\":\"ねおん堂\",\"neoneet\":\"寝起新人\",\"neonsign\":\"NeonSign\",\"neoseporium\":\"NeoSeporium\",\"neotenys\":\"ネオテニーズ\",\"neotocite\":\"ネオトサイト\",\"nephrite\":\"Nephrite\",\"nerihibari\":\"ねりひばり\",\"neron soft\":\"ネロンソフト\",\"neta e okiba\":\"ネタ絵置き場\",\"netorare masochist\":\"寝取られマゾヒスト\",\"nettaigyo club\":\"熱帯魚倶楽部\",\"neuromancer.\":\"Neuromancer.\",\"neutral boy\":\"にゅーとらるぼぉい\",\"new koubou\":\"NEW工房\",\"new world\":\"NEW WORLD\",\"new york spirits\":\"New York Spirits\",\"new.\":\"NEW.\",\"newberry transfer\":\"Newberry Transfer\",\"newtype kenkyuujo\":\"にゅうたいぷ研究所\",\"nexarius\":\"NEXARIUS\",\"next\":\"N・E・X・T\",\"nextage\":\"NEXTAGE\",\"nexumi no sumika\":\"ねずみの住家\",\"nexus koubou\":\"ネクサス工房\",\"nezumitori\":\"ねズみ砦\",\"nf121\":\"NF121\",\"ngamura-san\":\"んがむらさん\",\"ngl\":\"NGL\",\"nguppu do m hakushaku\":\"んぐっぷ・ド・M伯爵\",\"nhoooooooooooooo\":\"んほぉおおおぉおおおおおお♥おっ♥おっ♥\",\"ni\":\"Ni\",\"nibarera\":\"にばれら\",\"nibiiro no sora\":\"鈍色の空\",\"nibunn no ichi\":\"にぶんのいち!\",\"nichijou superumisu\":\"日常すぺるみす\",\"nico\":\"nico\",\"nico plus\":\"Nico plus\",\"nicolai\":\"NICOLAI\",\"nicolion\":\"二コリオン\",\"niesox\":\"niesox\",\"nigakuriya\":\"ニガクリ屋\",\"nigenige soldier\":\"逃げ逃げソルジャー\",\"nigeru support\":\"にげるサポート\",\"night ray kiss\":\"ナイトレイキス\",\"night stalkers\":\"ないとすとーかーず\",\"night stars\":\"ないと・すたーず\",\"nightmare\":\"NIGHTMARE\",\"nightride\":\"ナイトライド\",\"nightstalker\":\"nightstalker\",\"nigimitama no ya\":\"和魂屋\",\"nigred\":\"ニグレド\",\"nihon dandy\":\"日本ダンディ\",\"nihon denga senmon gakkou\":\"日本電画専門学校\",\"nihon sanjuufu\":\"二飜三十符\",\"nihon sensou game kaihatsu\":\"日本戦争ゲーム開発\",\"nihon shokushu shinkou kyoukai\":\"日本触手振興協会\",\"nihon waru waru doumei\":\"日本ワルワル同盟\",\"niikyuu\":\"にーきゅー\",\"niimii dan\":\"にぃみぃ団\",\"niizuma gaikokkaku\":\"新妻外骨格\",\"niji no saki\":\"虹の先\",\"niji seichou\":\"二次性徴\",\"niji wo machinagara\":\"虹を待ちながら\",\"nijigen complex\":\"にじげんCOMPLEX\",\"nijigen koubou\":\"2次元工房\",\"nijiiro denryuu\":\"虹色電流\",\"nijiiro hyakka\":\"虹色百花\",\"nijiiro mask\":\"虹色MASK\",\"nijiiro suisho\":\"にじいろすいしょう\",\"nijinoren\":\"虹のれん\",\"nijiyome\":\"にじよめ\",\"nijusei\":\"Nijusei\",\"nikka\":\"NIKKA\",\"niko\":\"NIKO\",\"nikomark\":\"にこまあく\",\"nikomutoko\":\"にこむとこ\",\"nikopondo\":\"NIKOPONDO\",\"niku jaguars\":\"NIKU・JAGUARS\",\"niku no sashimi\":\"にくのさしみ\",\"niku sushi\":\"肉寿司\",\"nikukyu\":\"nikukyu\",\"nikumanyaitimi\":\"にくまん屋一味\",\"nikumomu\":\"ニクモム\",\"nikutai gengo club\":\"肉体言語倶楽部\",\"nikutaiha\":\"肉体派\",\"nikuyakitei\":\"肉焼き亭\",\"nikuyoku boutarou\":\"肉欲棒太郎\",\"nil\":\"†NIL†\",\"nilitsu haihan\":\"ニリツハイハン\",\"nimame\":\"煮豆\",\"nimensai\":\"二面賽\",\"nine tail\":\"NINE TAIL\",\"ninelives\":\"ninelives\",\"ningen modoki\":\"人間モドキ\",\"ningen tte iina\":\"にんげんっていいな\",\"nininini\":\"にににに\",\"ninjinpasta\":\"にんじんパスタ\",\"ninniku batake\":\"にんにく畑\",\"ninnindo\":\"にんにん堂\",\"nino-kan\":\"にのカン\",\"niponipo\":\"にぽにぽ\",\"nipopo crisis\":\"ニポポクライシス\",\"nihatsu shika ataranai\":\"2発しか当たらない\",\"nipple mokuba\":\"にっぷる木馬\",\"nippon teikoku toshokan\":\"日本帝國図書館\",\"nipponbashi dennougumi\":\"ニッポンバシ電脳組\",\"nir\":\"NiR\",\"nirabatake\":\"にら畑\",\"niratama\":\"にらたま\",\"nirvana\":\"みるばーな\",\"nirvana soft\":\"Nirvana Soft\",\"nisemono\":\"偽もの\",\"nisemonogoya\":\"ニセもの小屋\",\"nisepakudo\":\"偽朴堂\",\"nisha takuitsu\":\"二沙択一\",\"nisin sansin\":\"にしん三振\",\"nishiogi koubou\":\"西荻工房\",\"nita ken\":\"ニタ研\",\"nita-kane\":\"煮た鐘\",\"nitaroutei\":\"ニタロウ亭\",\"nicchi sangyou\":\"にっちさんぎょう\",\"nitiniti sowa\":\"日々草話\",\"niwakakamikiriyamodoki\":\"ニワカカミキリヤモドキ\",\"niwatori\":\"にわとり\",\"niwatoritowani\":\"にわとりとわに\",\"niyatto company\":\"にやっとカンパニー\",\"niyodo blue\":\"NIYODO BLUE\",\"nizeru\":\"煮ぜる\",\"niziyumedokoro\":\"虹夢処\",\"nna timun\":\"んつぁてぃむん\",\"nnz dan\":\"NNZ団\",\"no actor\":\"NO ACTOR\",\"no brand\":\"NO BRAND\",\"no color\":\"No Color\",\"no future\":\"No Future\",\"no mercy\":\"No Mercy\",\"no need\":\"NO NEED\",\"no plan\":\"No Plan\",\"no strike\":\"の～すとらいく\",\"no such agency\":\"No Such Agency\",\"no-plan\":\"No-Plan\",\"no.3\":\"No.3\",\"no3\":\"No3\",\"noa\":\"noa\",\"noa no sasabune\":\"のあのささぶね\",\"noantica\":\"noantica\",\"nobishiro\":\"のびしろ\",\"nobita graph\":\"ノビタグラフ\",\"nocohica\":\"nocohica\",\"nocturnum\":\"ノクトルム\",\"nodobotoke kingyo\":\"のどぼとけきんぎょ\",\"noelvu\":\"ノエルヴ\",\"noesis\":\"Noesis\",\"noibara-en\":\"ノイバラ園\",\"noirsoft\":\"ノアールソフト\",\"noisy crown\":\"ノイジークラウン\",\"noix\":\"ノア\",\"nokishiki-box\":\"のき式BOX\",\"nokishita-ya\":\"ノキシタ屋\",\"nomad\":\"ノマド\",\"nomucchi\":\"のむっち\",\"nomugicha\":\"野麦茶\",\"non brand\":\"Non_Brand\",\"non non palette\":\"のんのんパレット\",\"nonaka logic\":\"野中ロジック\",\"nonbiri nonbiri\":\"のんびり のんびり\",\"nonchalant\":\"のんしゃらん\",\"nonono tsuushin\":\"ののの通信\",\"nonoya\":\"のの屋\",\"nonsense\":\"Nonsense\",\"nonsugarloess\":\"のんしゅがーれす\",\"nopland\":\"noPland\",\"noppera koubou\":\"のっぺら工房\",\"nora\":\"野良\",\"norakurari.\":\"のらくらり。\",\"noraneko koubou\":\"ノラ猫工房\",\"noranoma\":\"noranoma\",\"noraya\":\"のら屋\",\"nori tokumori\":\"海苔特盛\",\"noriajou\":\"のりあ城\",\"norihee ginjou\":\"のりへぇ吟醸\",\"norinori seika\":\"のりのり製菓\",\"noritama-gozen\":\"のりたま御膳\",\"north carolina power\":\"NORTH CAROLINA POWER\",\"north70\":\"North70\",\"nosebleed\":\"NOSEBLEED\",\"nosekichiku\":\"野石竹\",\"noshiki\":\"の式\",\"nostalgic syndrome\":\"ノスタルジックシンドローム\",\"not\":\"NOT\",\"notari\":\"のたり\",\"notears\":\"NoTears\",\"notes.\":\"Notes.\",\"nothing-plan\":\"Nothing-Plan\",\"notonote\":\"NOTONOTE\",\"notorious\":\"NOTORIUS\",\"nottaya\":\"のっ田屋\",\"noujiru teishokuya\":\"のぅじる定食屋\",\"nounai ekijiru\":\"脳内液汁\",\"nounai pg\":\"脳内PG\",\"nounai zayaku\":\"脳内座薬\",\"nounaihokan\":\"脳内補完\",\"nounanka sedai\":\"脳軟化世代\",\"noushuku kangen\":\"脳縮還元\",\"nouzui majutsu\":\"脳髄魔術\",\"novia\":\"Novia\",\"nowhere\":\"NOWHERE\",\"noxious plant\":\"noxious plant\",\"noyau\":\"noyau\",\"nozarashi\":\"のざらし\",\"nozubeya\":\"野図部屋\",\"nozzo gt\":\"のっつぉGT\",\"np virus jouryuusho\":\"NPウイルス蒸留所\",\"ns2k\":\"ns2k\",\"dondondon\":\"どんどんどん\",\"nt confess\":\"NTconfess\",\"ntlabo\":\"NTラボ\",\"ntr king\":\"NTR キング\",\"ntr suishin iinkai\":\"NTR推進委員会\",\"ntr system\":\"NTRシステム\",\"ntrbear\":\"Ntrbear\",\"nu\":\"Nu\",\"nui gohan\":\"ぬいごはん\",\"nuigurumiya-san\":\"ぬいぐるみやさん\",\"nuit\":\"nuit\",\"nuite amore\":\"抜いて☆アモーレ!\",\"nukarumi\":\"泥濘\",\"nukidamari\":\"ヌキダマリ\",\"nukidokoro.\":\"ぬきどころ。\",\"nukkoru\":\"ぬっこる\",\"nukomashi dou\":\"ぬこまし堂\",\"nukotigura\":\"ぬこちぐら\",\"nukoya\":\"ぬこや\",\"nul neverland\":\"ヌルネバーランド\",\"null mayu\":\"NULLまゆ\",\"null poplus\":\"ぬるぽぷらす\",\"num\":\"#NUM!\",\"numachi\":\"沼地\",\"numadax\":\"ヌマダックス\",\"number 910\":\"910号室\",\"nun\":\"ヌン\",\"nuno no ie\":\"布の家\",\"nuno to kami\":\"布と紙\",\"nupuryu no sato\":\"ぬぷ竜の里\",\"nurebairo\":\"濡羽色\",\"nurume\":\"ぬるめ\",\"nurunuru 30 percent\":\"ぬるぬる30%\",\"nurunurunerune\":\"ぬるぬるねるね\",\"nv3offline\":\"NV3OFFLINE\",\"nw-project\":\"NW-project\",\"nwa\":\"nWa\",\"nwonyo pasun\":\"んをんよ・ぱすん\",\"nxcthermit\":\"N×Cてるみっと\",\"nyaa nyaa koushinjo\":\"にゃ～にゃ～興信所\",\"nyaa. to hidamari\":\"にゃー。とひだまり\",\"nyagos\":\"にゃごズ\",\"nyake\":\"NYAKE\",\"nyakko-ya\":\"にゃっこ屋\",\"nyala ponga\":\"ニャリャポンガ\",\"nyamo nyamo\":\"にゃもにゃも\",\"nyan nyan festival\":\"ニャンニャンフェスティバル\",\"nyan nyan nyan\":\"にゃんにゃんにゃん!\",\"nyan-nyan-hanten\":\"娘娘飯店\",\"nyanderful vegitarian\":\"にゃんだふるべじたりあん\",\"nyanko no me\":\"にゃんこの目\",\"nyankopi\":\"にゃんこぴぃ\",\"nyankoromochimochi\":\"にゃんころもちもち\",\"nyanmilla\":\"ニャンミラ\",\"nyannyan club\":\"娘々倶楽部\",\"nyanpunibocchi\":\"にゃんぷにぼっち\",\"nyaro kizoku\":\"にゃろ貴族\",\"nyawatesou\":\"にゃわて荘\",\"nylon 100\":\"ナイロン100%\",\"nymph\":\"Nymph\",\"nymphy fine fresh\":\"Nymphy Fine Fresh\",\"nyoninka kenkyuujo\":\"女人化研究所\",\"nyoro junction\":\"にょろじゃんくしょん\",\"nyotai kougaku kenkyuujo\":\"女体光学研究所\",\"nyotaian\":\"女体庵\",\"nyuuface\":\"乳ふぇいす\",\"nyuuseihin\":\"乳性貧\",\"o-penguin\":\"俺企鵝\",\"o.riginal brand\":\"O.RIginal brand\",\"o157\":\"O157\",\"oasis plus\":\"Oasis+\",\"oba-q honpo qt\":\"OBA-Q HONPO QT\",\"obake candle\":\"おばけキャンドル\",\"oberkochen\":\"オーバーコッヘン\",\"oboro\":\"朧\",\"oboro hyakuhachishiki\":\"朧百八式\",\"obsession.\":\"おぶせっしょん!\",\"obsidian order\":\"Obsidian Order\",\"obumanjuu\":\"おぶまんじゅう\",\"oc5\":\"oC5\",\"ocarina\":\"おかりな\",\"occhoko-cho\":\"OCCHOKO-CHO\",\"ocelot\":\"オセロット\",\"ochadukeya sandaime\":\"お茶漬け屋三代目\",\"ochaocha honpo\":\"おちゃおちゃ本舗\",\"ochawannomushi\":\"おちゃわんのむし\",\"ochaya\":\"御茶屋\",\"ochigan\":\"堕ち玩\",\"ochikochitei\":\"おちこち亭\",\"ochitsu daisensei\":\"おちつ大先生\",\"ocojoco\":\"ocojoco\",\"odaku\":\"oda九\",\"oden sensei\":\"汚電せんせい\",\"oden-ya\":\"おでんや\",\"odenden\":\"おでんでん\",\"odin\":\"odin\",\"odoshiro canvas\":\"おどしろキャンバス\",\"oekaki seikatsu nikki\":\"お絵かき生活日記\",\"oeuf\":\"Oeuf\",\"off side\":\"OFF SIDE\",\"offaria\":\"offaria\",\"office amagasa\":\"雨傘日傘事務所\",\"office baku\":\"オフィス・バク\",\"office fairy\":\"office fairy\",\"office neko\":\"Office猫\",\"ofuro works\":\"おふろワークス\",\"ofuroya\":\"オフロ屋\",\"ofuzake tale\":\"お巫山戯テイル\",\"ogagaga-sou\":\"おががが荘\",\"ogawa jinguu\":\"小川神宮\",\"ogawaya\":\"小河屋\",\"ogeretsu-dan\":\"おげれつ団\",\"ogerwillow\":\"オーガウィロウ\",\"ogofwitch\":\"OgOfWitch\",\"ogura tankenka\":\"小倉探検家\",\"oguradou\":\"小倉堂\",\"oh-banzai studio\":\"おばんざい☆スタジオ\",\"ohagi.\":\"おはぎ。\",\"ohakotomeno\":\"おはことめの\",\"oharaibako\":\"御祓箱\",\"ohige\":\"おひげ\",\"ohka works\":\"おーかわーくす!\",\"ohnegs\":\"オーネグス\",\"ohsaka spirits\":\"大坂魂\",\"oideyasu honpo\":\"おいでやす本舗\",\"oilan\":\"oilan\",\"oimoto\":\"おいもと\",\"oinari summer\":\"お稲荷Summer\",\"oishii oniku\":\"おいしいお肉\",\"oishii oniku.\":\"おいしいお肉。\",\"oishii udon\":\"おいしいうどん\",\"oiyoko\":\"オイヨコ\",\"ojin koukoku\":\"オジン公国\",\"ojmomo\":\"OJmomo\",\"okachimentaiko\":\"おかちめんたいこ\",\"okameya honpo\":\"おかめや本舗\",\"okami kaikou\":\"おかみかいこう\",\"okashi na denpa\":\"お可視な電波\",\"okashi no ie\":\"お瑕疵の家\",\"okashi senmonten\":\"おかしせんもんてん\",\"okashimo\":\"おかしも\",\"okatoraya\":\"岡虎屋\",\"okayushop\":\"OkayuShop\",\"okazu club\":\"Okazu Club\",\"okazu company\":\"おかずカンパニー\",\"okazu musume\":\"オカズ娘\",\"okett\":\"okett\",\"okina flying factory\":\"Okina Flying Factory\",\"okina keikaku\":\"翁計画\",\"okina utsuwa\":\"大きな器\",\"okinawa chinkosuu\":\"沖縄ちんこすう\",\"okinawa taieki gunjinkai\":\"沖縄体液軍人会\",\"oko-san\":\"おこさん\",\"okojo no machi\":\"オコジョの街\",\"okojodou\":\"御娘女堂\",\"okome rice don\":\"おこめライス丼\",\"okosama lunch\":\"お子様ランチ\",\"okosama pancake\":\"お子様パンケーキ\",\"okosamastar company\":\"オコサマ・スター社\",\"okottei\":\"おこっ亭\",\"okt\":\"OKT!\",\"oktm\":\"OKTM\",\"oku no hosomichi\":\"奥の細道\",\"ol\":\"OL\",\"old school academy\":\"オールドスクールアカデミー\",\"old weapon\":\"おーるどうぇぽん\",\"oldwiseman\":\"Oldwiseman\",\"ole-m\":\"OLE-M\",\"om\":\"おっえむ\",\"omame cyokueitenn\":\"おまめ直営店\",\"omaru bokujou\":\"おまる牧場\",\"omega 2-d\":\"OMEGA 2-D\",\"omega circuit\":\"おめがさーきっと\",\"omega house\":\"おめがはうす\",\"omikidokkuri\":\"オミキドックリ\",\"omizuya\":\"おみずや\",\"ommed\":\"オムメド\",\"omocha kaden\":\"玩具家電\",\"omochaya meguri\":\"おもちゃやめぐり\",\"omochi bazooka\":\"おもち☆バズーカ\",\"omochi soft\":\"おもちそふと\",\"omochibako no text log\":\"おもちばこのテキストログ\",\"omodume\":\"想詰め\",\"omoiukabi enikki\":\"思い浮かび絵日記\",\"omoshiro burger\":\"おもしろバーガー\",\"omoshiro usagi\":\"オモシロウサギ\",\"omoya\":\"母屋\",\"on my way\":\"on my way\",\"on your mark\":\"ON YOUR MARK\",\"on-show\":\"怨床\",\"onagoya\":\"おなご屋\",\"onaka ga suita\":\"おなかがすいた\",\"onbundou\":\"音文堂\",\"once only\":\"Once Only\",\"one week holiday\":\"One Week Holiday\",\"one-seven\":\"ONE-SEVEN\",\"one-shot\":\"ONE-SHOT\",\"one-up\":\"One-up\",\"oneashi\":\"オネアシ\",\"oneekyou\":\"御姉狂\",\"oneforall\":\"わんふぉーおーる\",\"onegross\":\"ONEGROSS\",\"onemu hormone\":\"おねむホルモン\",\"ongr\":\"ongr\",\"oni kizoku\":\"鬼貴族\",\"onigiriz\":\"ONIGIRIズ\",\"onikibitou\":\"鬼きび党\",\"oninoe\":\"鬼ノ餌\",\"onna ni yoru onna e no ryoujoku\":\"女による女への陵辱\",\"onnanoko himitsu seisan koujou\":\"女の子秘密生産工場\",\"onnanoko payapaya\":\"女の子パヤパヤ\",\"onoderasanchi\":\"おのでらさん家\",\"onoe network\":\"小乃枝電網\",\"onomatopoeia\":\"オノマトピア\",\"onpuman\":\"オンプマン\",\"onsoku ebifly\":\"音速エビフライ\",\"onsoku soukou\":\"音速走行\",\"onsoku ubaguruma\":\"音速うばぐるま\",\"onyitei\":\"鬼ぃ亭\",\"onzskds\":\"御曹司ください\",\"ooarai nourakudou\":\"大洗能楽堂\",\"oobae toudai\":\"オオバエ灯台\",\"oobeya potechi house\":\"大部屋ポテチハウス\",\"oogane farm\":\"大金ファーム\",\"ooitei\":\"大井亭\",\"oojinushi\":\"おおじ主\",\"ookami shoujo yuugi dan\":\"狼少女遊戯団\",\"ookina kodomo no omocha bako\":\"大きな子供のおもちゃ箱\",\"oomorian\":\"大森庵\",\"ootsuku shouji\":\"大津久商事(有)\",\"oozora kaiko\":\"大空カイコ\",\"operating room\":\"Operating Room\",\"operation\":\"operatioN\",\"operation panel\":\"操作パネル\",\"oppai baibai\":\"おっぱいばいばい\",\"oppai click\":\"おっぱいクリック\",\"oppai guild\":\"ぱいギル\",\"oppai mochi\":\"おっぱい餅\",\"opt\":\"OPT\",\"optimism small country\":\"楽観主義小国\",\"oracle eggs\":\"Oracle Eggs\",\"orange blossom\":\"おれんじ☆ぶろっさむ\",\"orange chocolat\":\"Orange Chocolat\",\"orange crown\":\"Orange Crown\",\"orange gallery henshuubu\":\"オレンジ・ギャラリー編集部\",\"orange girl\":\"orange girl\",\"orange mill\":\"オレンジミル\",\"orange peel\":\"Orange Peel\",\"orange piece\":\"Orange Piece\",\"orange powder\":\"おらんげぱうだー\",\"orange typhoon\":\"オレンジタイフーン\",\"orangelepsy\":\"オレンジレプシー\",\"ore dake ga tokusuru onsei koubou\":\"俺だけが得する音声工房\",\"ore jon\":\"俺JON\",\"oreaji\":\"俺味\",\"oregun\":\"俺軍\",\"oreichigo\":\"俺苺\",\"oremuha x\":\"オレムハX\",\"orenjiru\":\"おれんジル\",\"oretachi misnon ikka\":\"俺たちミスノン一家\",\"oreteki shikou\":\"俺的嗜好\",\"organico\":\"おるがにこ\",\"orgasmpotential\":\"orgasmpotential\",\"oriental lattice\":\"Oriental Lattice\",\"origami farm\":\"折纸牧场\",\"orihime-bunko\":\"織姫文庫\",\"orubara\":\"オルバラ\",\"orukaniumu-labo\":\"orukaniumu-labo\",\"orz\":\"orz\",\"orz commushoz\":\"Orzコミュショーズ\",\"os tokku\":\"OS特区\",\"osaka lucha libre\":\"大阪ルチャリブレ\",\"osakana planet\":\"おさかなプラネット\",\"osakana tabeyo\":\"おさかなたべよ\",\"osanagokoro no kimi ni\":\"幼心の君に\",\"osaru no noumiso\":\"お猿の脳みそ\",\"osaru-san panic\":\"おさるさんパニック\",\"oshigoto no jikan\":\"おしごとのぢかん\",\"oshikko channel\":\"おしっ娘ちゃんねる\",\"oshiruko kan\":\"おしるこ缶\",\"oshiruko sentimental\":\"おしるこセンチメンタル\",\"oshisyo-san\":\"おししょーさんっ\",\"osiri\":\"osiri\",\"osiris\":\"オシリス\",\"osova\":\"おそば\",\"osterei\":\"OSTEREi\",\"osu to mesu\":\"♂×♀オスとメス\",\"ota office\":\"OTA OFFICE\",\"otafukutei\":\"おたふく亭\",\"otaku no youjinbou\":\"オタクの用心棒\",\"ote\":\"お手っ\",\"otenkiya\":\"おてんき屋\",\"otentomaru\":\"オテント丸\",\"othello ice\":\"オセロアイス\",\"oto\":\"OTO\",\"otogi no kuni no soapland\":\"おとぎの国のソープランド\",\"otogiya\":\"御伽屋\",\"otohime\":\"おとひめ\",\"otohime 49-gou\":\"オトヒメ49号\",\"otohimedou\":\"乙姫堂\",\"otoko no roman\":\"男のROMAN\",\"otokonoko club\":\"おとこの娘倶楽部\",\"otokonoko daisuki iinchou\":\"ショタモブモム\",\"otokonoko soft\":\"男の娘ソフト\",\"otokonoko to onnanoko\":\"男の子と女の子\",\"otome half line\":\"乙女ハーフライン\",\"otome no eden\":\"乙女のエデン\",\"otomeza\":\"処女座\",\"otona no douraku\":\"大人の道楽\",\"otona no youchien\":\"大人の幼恥園\",\"otona teikoku\":\"オトナテイコク\",\"otoreko\":\"OTOREKO\",\"otousan\":\"尾刀産\",\"otto\":\"OTTO\",\"otukimidango\":\"お月見団子\",\"oudon shikoshiko\":\"おうどん☆シコシコ\",\"ougi production\":\"扇プロダクション\",\"ougi ranmaru\":\"扇蘭丸\",\"ougon no yofuke dan\":\"黄金の夜更け団\",\"oumi shouan\":\"近江小庵\",\"ourakutei\":\"王烙亭\",\"ourindou\":\"王林堂\",\"out of mind\":\"Out of Mind\",\"out of service\":\"OUT of SERVICE\",\"out-of-date\":\"アウトオブデイト\",\"outflow\":\"OUTFLOW\",\"outrate\":\"アウトレート\",\"outroad\":\"あうとろーど\",\"ovacas\":\"OVACAS\",\"over drive\":\"OVER DRIVE\",\"over3\":\"Over3\",\"overcrowd\":\"オーバークラウド\",\"overdose\":\"オーバードーズ\",\"overflow\":\"オーバーフロー\",\"overgrown generations\":\"OVERGROWN GENERATIONS\",\"overload\":\"おーばーろーど\",\"owatasha\":\"おわた社\",\"oxg\":\"OXG\",\"oxide.lab\":\"OXIDE.Lab\",\"oxydan\":\"おきし団\",\"oyajiji gumi\":\"オヤジジ組\",\"oyakodon\":\"親子丼\",\"oyasumi disco\":\"おやすみDISCO\",\"oyasumi kobe gyuu\":\"おやすみ神戸牛\",\"oyasumi switch\":\"オヤスミスイッチ\",\"oyasuminasai\":\"おやすみなさい\",\"oyatsukan\":\"おやつ缶\",\"oz project\":\"Oz Project\",\"ozashiki\":\"オザ式\",\"ozawa kobo\":\"緒沢工房\",\"ozen shiryoushitsu\":\"御前資料室\",\"ozone\":\"おぞね\",\"p freak\":\"Pふりーく\",\"p herb\":\"Pハーブ\",\"p kikaku\":\"P企画\",\"p-850\":\"P-850\",\"p-forest\":\"P-FOREST\",\"p-lemo\":\"ぴぃれも\",\"p-me\":\"P-ME\",\"p-point\":\"P-POINT\",\"p.a. project\":\"P.A.Project\",\"p.p.p\":\"P.P.P\",\"p2paramount\":\"P2Paramount\",\"pa-pu-\":\"ぱーぷー\",\"pa.da.wan\":\"Pa・Da・ワン\",\"pachipachi soft\":\"ぱちぱちそふと\",\"pag-pag-magu\":\"ぱぐぱぐまぐぅ\",\"pagumiee\":\"パグミィ\",\"paintingbird\":\"PaintingBird\",\"pairesshu\":\"Paiれっしゅ\",\"pajamas ex\":\"ぱじゃまエクスタシー\",\"pajamas soft\":\"ぱじゃまソフト\",\"pakupaku\":\"ぱくぱく\",\"pakupikubon\":\"パクピクボン\",\"palace village ke\":\"パレスヴィレッジ家\",\"pale scarlet\":\"Pale Scarlet\",\"palette\":\"ぱれっと\",\"palette enterprise\":\"Palette Enterprise\",\"pallet box\":\"Pallet Box\",\"palm sunday\":\"パームサンデー\",\"palpiteria\":\"パルピテリア\",\"pamunosu\":\"ぱむの巣\",\"pan 2\":\"パン2\",\"pan koubou\":\"パン工房\",\"pan no mimi\":\"パンノミミ\",\"pan to butterfly.\":\"パンとバタフライ。\",\"panbai\":\"PANBAI\",\"panda 4gou\":\"パンダ4号\",\"panda pro\":\"ぱんだぷろ\",\"panda scanners\":\"パンダスキャナーズ\",\"panicerr\":\"パニッカー\",\"panier\":\"パニエ\",\"panjandrum\":\"Panjandrum\",\"pankoppe\":\"ぱんこっぺ\",\"pannacotta\":\"Pannacotta\",\"panoramakan\":\"ぱのらま館\",\"panorama tsuushinkyoku\":\"パノラマ通信局\",\"panteitei\":\"PanTei亭\",\"pantie party project\":\"Pantie Party Project\",\"pantsu kakumei.\":\"パンツ革命。\",\"pantsu koubou\":\"ぱんつ工房\",\"pantwo\":\"pantwo\",\"panty stocking\":\"Panty Stocking\",\"panya no enzo\":\"パン屋のエンツォ\",\"pao pao\":\"PAO・PAO\",\"paopaship\":\"ぱぉぱしっぷ\",\"papamilk\":\"Papamilk\",\"papaya milk\":\"ぱぱいや・みるく\",\"papepox2\":\"PAPEPOX2\",\"paper cup and adult key\":\"Paper Cup and Adult Key\",\"paper-doll\":\"Paper-Doll\",\"papercrown\":\"ぺぱくら\",\"papered armor\":\"紙装甲\",\"parade\":\"Parade\",\"paradigm conflict\":\"PARADIGM CONFLICT\",\"paradis\":\"PaRaDis\",\"paradise city\":\"ぱらだいすCity\",\"paradise d products\":\"PARADISED PRODUCTS\",\"paradise jack\":\"パラダイスジャック\",\"paradise lost\":\"パラダイス・ロスト\",\"paradisegom\":\"ParadiseGom\",\"paraiso\":\"ぱらいそ\",\"paraiso saigu\":\"ぱらゐそ祭具\",\"paraiso shugi\":\"パライソ主義\",\"parallel area\":\"パラレルエリア\",\"parameter\":\"パラミター\",\"parasol\":\"Parasol\",\"paret\":\"paret\",\"parin to wareru\":\"パリンと割れる\",\"pariparicandy\":\"ぱりぱりきゃんでぃー\",\"parity nyuu\":\"ぱりてぃー・にゅー\",\"park popcorn\":\"パークポップコーン\",\"part k\":\"Part K\",\"parthenon\":\"パルテノン\",\"particle\":\"ぱーてぃくる\",\"party nights\":\"パーリィナイツ\",\"parukusu\":\"ぱるくす\",\"parupunte\":\"ぱるぷんて\",\"passing shower\":\"ぱっしんぐしゃわー\",\"past\":\"Past\",\"pastel bitch\":\"パステルビッチ\",\"patio canvas\":\"ぱてぃお☆きゃんばす\",\"patoto\":\"PATOTO\",\"patricide\":\"PATRICIDE\",\"pavington\":\"Pavington\",\"pazooka\":\"Pazooka\",\"pazzo s.p.\":\"Pazzo S.P.\",\"pe theta\":\"Peθ\",\"pe.\":\"ぺ。\",\"peach cat\":\"PEACH CAT\",\"peach fox\":\"peach fox\",\"peach kupaa\":\"ピーチクパァ\",\"peach palette\":\"ぴーちパレット\",\"peach store\":\"ぴーちストア\",\"peachbooks hachinohe-ten\":\"PEACHBOOKS八戸店\",\"peachbreath\":\"PeachBreath\",\"peachpulsar\":\"peachpulsar\",\"peaky\":\"ピーキー\",\"pecan\":\"ピーカン\",\"peco poco\":\"ぺこぽこ\",\"peeping phantom\":\"Peeping Phantom\",\"pegasisters\":\"ペガシスターズ\",\"peke no hima\":\"ぺけの閑\",\"peko renmei\":\"ぺこ連盟\",\"pekoe\":\"Pekoe\",\"pell-mell works\":\"PELL-MELL WORKS\",\"pelpan omt\":\"ぺるぱんOMT\",\"peneya\":\"ぺね屋\",\"penguin teikoku\":\"ペンギン帝国\",\"penguindou\":\"筆吟堂\",\"penpen mushi no koucha\":\"ぺんぺん虫の紅茶\",\"penpengusa club\":\"ペンペン草くらぶ\",\"penteru kohboh\":\"ぺんてる工房\",\"peony\":\"ピオニー\",\"peperoncino\":\"ぺぺろんちーの\",\"perceptron\":\"ぱーせぷとろん\",\"perestroika\":\"ピリストローイカ\",\"perfect sea\":\"PERFECT SEA\",\"performance\":\"パーフォーマンス\",\"perilab\":\"ぺりラボ\",\"pero\":\"Pero\",\"peromuji-ya\":\"ぺろむじ屋\",\"perosikos\":\"ペロシコス\",\"persicaria eater\":\"persicaria eater\",\"personal color\":\"PERSONAL COLOR\",\"personal space\":\"personal space\",\"pervert\":\"pervert\",\"petapan\":\"ぺたパン\",\"petica\":\"ペチカ\",\"petit bunny\":\"Petit Bunny\",\"petit ego\":\"ぷちえご!\",\"petit machiya\":\"ぷち町屋\",\"petite x cerisier\":\"Petite＊Cerisier\",\"petit pack\":\"Petit Pack\",\"peto-ya\":\"ぺと屋\",\"pets\":\"PETS\",\"pettanko\":\"ペッたんコっ!\",\"pez.\":\"pez.\",\"pfactory\":\"Pfactory\",\"phantom vibration syndrome\":\"幻想振動症候群\",\"phantomcross\":\"ファントムクロス\",\"phantomsoft\":\"ファントムソフト\",\"phase nine\":\"PHASE NINE\",\"phenomena\":\"PHENOMENA\",\"pheromone lover 358\":\"フェロモンラバー358\",\"philippiana honpo\":\"フィリピアナ本舗\",\"phlodexy\":\"Phlodexy\",\"phoenix project\":\"PHOENIX PROJECT\",\"photonix\":\"PHOTONIX\",\"physalis\":\"PHYSALIS\",\"pi o 2\":\"πO2\",\"pianissimo\":\"ピアニッシモ\",\"piccalilli\":\"ピッカリリ\",\"piccolo studio\":\"ピッコロ工房\",\"pichi pichi garou r\":\"ぴちぴち画廊R\",\"pickled teishoku\":\"ピクルス定食\",\"pico pico labyrinth\":\"ピコピコ★ラビリンス\",\"picopicosoft\":\"PICOPICOSOFT\",\"picosolenodon\":\"ピコソレノドン\",\"picotama.\":\"ぴこたま。\",\"picricacid\":\"ぴくりんさん\",\"pictlier\":\"ぴくとりえ\",\"piepillow\":\"ピエピロー\",\"pierre\":\"PIERRE\",\"pierrot\":\"Pierrot\",\"pigeon blood\":\"鳩血\",\"piggstar\":\"PIGGSTAR\",\"pignon\":\"pignon\",\"pihii shobou\":\"ぴひー書房\",\"pikopiko saber\":\"ピコピコサーベル\",\"pikopikotei\":\"ぴこぴこ亭\",\"pil-vamp\":\"PIL-VAMP\",\"pile driver\":\"PILE DRIVER\",\"pilen\":\"PileN\",\"pillow works\":\"PILLOW WORKS\",\"pilotstar\":\"Pilotstar\",\"pin-13\":\"ピンのワンスリー\",\"pin-point\":\"ピンポイント\",\"pinacotheca\":\"Pinacotheca\",\"pine\":\"ぱいん\",\"pine candy\":\"PINE CANDY\",\"pineapple candy\":\"パイナップルキャンディ\",\"pinpoint\":\"ピンポイント\",\"pink bat\":\"ピンクバット\",\"pink cherry cocktail\":\"Pink Cherry Cocktail\",\"pink chuchu\":\"PINK CHUCHU\",\"pink cloud\":\"ピンククラウド\",\"pink december\":\"Pink December\",\"pink kitten\":\"ぴんくのこねこ\",\"pink no chao\":\"PINKのCHAO!\",\"pink no jaguchi\":\"ピンクの蛇口\",\"pink pepper\":\"Pink pepper\",\"pink pineapple\":\"ピンクパイナップル\",\"pink poison\":\"PINK POISON\",\"pink revolver\":\"ピンクリボルバー\",\"pink rose\":\"PINK ROSE\",\"pink thin cellophane\":\"pink thin cellophane\",\"pink tissue\":\"Pink Tissue\",\"pink-noise\":\"pink-noise\",\"pink.in black\":\"PINK.in BLACK\",\"pinkbell software\":\"PINKBELL SOFTWARE\",\"pinke\":\"ぴんけ\",\"pinkharlem\":\"PinkHarlem\",\"pinkjoe\":\"pinkjoe\",\"pinktips.info\":\"pinktips.info\",\"pinky girl\":\"PINKY GIRL\",\"pintsize\":\"ぱいんとさいず\",\"pipapipa9\":\"pipapipa9\",\"pipasuta\":\"ぴぱスタ\",\"pipiya\":\"ぴぴや\",\"pirates patrol\":\"パイレーツパトロール\",\"pirisyuga\":\"ぴりしゅが\",\"piropiro\":\"PIROPIRO\",\"piropiro-go\":\"ぴろぴろごー\",\"pirorunchi\":\"ぴろるんち\",\"piruporo\":\"ぴるぽろー\",\"pisces\":\"ぴすけす\",\"pish lover\":\"ピシュ☆ラバ\",\"piss\":\"PISS\",\"pistonpower\":\"Pistonpower\",\"pit\":\"PiT\",\"pit.ra.bit\":\"pit.ra.bit\",\"pixel cot.\":\"Pixel Cot.\",\"pixel mint\":\"PIXEL MINT\",\"pixel works\":\"Pixel Works\",\"pixy bell\":\"ピクシーベル\",\"piyo project\":\"ぴよぷろじぇくと\",\"piyokoya\":\"ぴよこ屋\",\"piyopit\":\"PiyoPit\",\"piyopiyo teikoku\":\"ピヨピヨ帝国\",\"piyotama\":\"ぴよたま\",\"pizzaizm\":\"PIZZAIZM\",\"placre\":\"プラクリ\",\"plain ghost\":\"Plain Ghost\",\"planariatei\":\"ぷらなりあ亭\",\"planet\":\"プラネット\",\"planet maris\":\"PLANET MARIS\",\"planet matier\":\"Planet Matier\",\"planet piece\":\"PLANET PIECE\",\"planetary\":\"Planetary\",\"plantain\":\"plantain\",\"plastics\":\"plastics\",\"plato.\":\"plato.\",\"platonica\":\"PLATONiCA\",\"please continue\":\"please continue\",\"pleats time\":\"プリーツたいむ\",\"pleco\":\"PLECO\",\"pleiades fortune\":\"PLEIADES☆FORTUNE\",\"plott\":\"Plott\",\"plum factory\":\"Plum Factory\",\"plume works\":\"PLUME WORKS\",\"plumzero\":\"PlumZERO\",\"plus donburi\":\"+丼\",\"plus elegy\":\"+Elegy\",\"plus house\":\"Plus house\",\"plus10\":\"Plus Ten\",\"plus810\":\"+810\",\"pluto\":\"プルート\",\"pm02 colon 00\":\"pm02:20\",\"pno group\":\"PNO グループ\",\"pno.\":\"PNO.\",\"pnp\":\"ピィーエヌピィー\",\"pocket\":\"POCKET\",\"pocket drop\":\"ポケットドロップ\",\"poco\":\"!POCO\",\"poco poco\":\"POCO POCO\",\"pocorit\":\"ぽこりっと\",\"poga\":\"Poga*\",\"poifull\":\"ぽいふる\",\"point m\":\"Point M\",\"points\":\"Points\",\"poison\":\"POISON\",\"poison breath\":\"ポイズンブレス\",\"poison gray\":\"Poison Gray\",\"poison squid\":\"ポイズンスクイッド\",\"poisonblues\":\"POISONBLUES\",\"poiyo dimension\":\"ポイヨディメンション\",\"pokopen-honpo\":\"ぽこぺん本舗\",\"pokotou\":\"ぽことう\",\"polaris\":\"POLARIS\",\"polbockle\":\"polbockle\",\"pollinosis\":\"ぽりのしす\",\"polorinken\":\"ポロリン軒\",\"pom\":\"PoM\",\"pomato-ya\":\"ぽまと屋\",\"pomegranate\":\"ぽめぐら\",\"pomelanian\":\"Pomelanian\",\"pometeor\":\"ぽメテオ\",\"pon de ushi\":\"ポン・デ・ウシ\",\"poncho mojah\":\"PONCHO MOJAH\",\"pondemix\":\"PONDEMIX\",\"poniponi\":\"poniponi\",\"poniteke zoku\":\"ポニテケ族\",\"ponkotsu box\":\"ぽんこつ×ぼっくす\",\"ponkotsu damashii\":\"ポンコツ魂\",\"ponkotsu teikoku\":\"ポンコツ帝国\",\"ponkotsu-ki\":\"ぽんこつ紀\",\"ponkotsudou\":\"凡骨道\",\"ponkotuna potunoya\":\"ぽんこつなぽつの屋\",\"ponpon-o\":\"ぽんぽんお\",\"ponte\":\"Ponte\",\"pony farm\":\"仔马牧场\",\"pony roll\":\"PONY ROLL\",\"ponyfarm\":\"ポニー牧場\",\"ponys bridle\":\"PONY'S BRIDLE\",\"ponz.info\":\"ponz.info\",\"ponzoom\":\"ぽんずーむ\",\"ponzu ame\":\"ぽんずアメ\",\"pooca\":\"pooca\",\"popcorn koujou\":\"ポップコーン工場\",\"popcorn lamp\":\"にゃじらんぷ\",\"popeo\":\"ぽぺお\",\"popin rabbit\":\"popin'rabbit\",\"popo candy\":\"ぽぽきゃんでぃ\",\"popo doctrine\":\"ポポドクトリン\",\"popoin\":\"ぽぽいん\",\"poppozu\":\"ポッポーズ\",\"popship\":\"ポップシップ\",\"popshot\":\"POPSHOT\",\"popularplus\":\"popularplus\",\"porika\":\"ポリカ\",\"poritabe.\":\"ポリたべ。\",\"porno maker\":\"ぽるのめーかー\",\"pornostar\":\"ポルノ★スター\",\"portion\":\"Portion\",\"porygon137\":\"PORYGON137\",\"potage\":\"Potage\",\"potato salad\":\"ぽてとさらだ\",\"potato seikatsu\":\"ポテト生活\",\"potch pocket\":\"ぽっちぽけっと\",\"poteto-chips\":\"poteto-chips\",\"potosu koubou\":\"ポトス工房\",\"poulain\":\"poulain\",\"powderskin\":\"PowderSkin\",\"power gradation\":\"パワーグラデイション\",\"power of maca\":\"power of maca\",\"power skill\":\"パワースキル\",\"power slide\":\"パワースライド\",\"power step\":\"Power Step\",\"powerful soft\":\"ぱわふるソフト\",\"powerplay\":\"POWERPLAY\",\"praetorium-somnus\":\"プラエトーリウム=ソムヌス\",\"prahapripa\":\"ぷらはぷりぱ\",\"pravo713\":\"PRAVO713\",\"prekano\":\"プレカノ\",\"pretty maids\":\"PRETTY☆MAIDS\",\"pretty penis\":\"プリティペニス\",\"prettydolls\":\"prettydolls\",\"prick\":\"PRICK\",\"prickly ash\":\"プリックリーアッシュ\",\"pride zero\":\"プライドZERO\",\"prima stella\":\"Prima Stella\",\"primal gleam\":\"Primal Gleam\",\"primal gym\":\"Primal Gym\",\"primavista\":\"Primavista\",\"prime-f\":\"Prime-F\",\"princess cage\":\"Princess Cage\",\"princess heart\":\"Princess Heart\",\"princess sugar\":\"Princess Sugar\",\"princia\":\"プリンシア\",\"prism eye\":\"Prism eye\",\"prism silhouette\":\"ぷりずむ しるえっと\",\"prism store\":\"Prism Store\",\"prismatic\":\"PRISMATIC\",\"pritannia\":\"ぷりたにあ\",\"pro-tec\":\"Pro-tec\",\"prodrug\":\"PRODRUG\",\"production n.g\":\"PRODUCTION N.G\",\"progretrance\":\"プログレトランス\",\"project 345\":\"Project 345\",\"project d\":\"ぷろじぇくとD\",\"project freaks\":\"project フリークス\",\"project fw\":\"プロジェクトFW\",\"project harakiri\":\"PROJECTハラキリ\",\"project of dr.q\":\"Project of Dr.Q\",\"project-11\":\"Project-11\",\"projectgs\":\"ProjectGS\",\"proom\":\"Proom\",\"propeller\":\"propeller\",\"protmind\":\"PROTMIND\",\"prymary\":\"prymary\",\"przm star\":\"Przm Star\",\"psy-chs\":\"Psy-chs\",\"psy-force-project\":\"Psy-Force-Project\",\"psy-walken\":\"Psy-Walken\",\"psychetangle\":\"サイケタングル\",\"psycho\":\"Psycho\",\"psychosteak\":\"PSYCHOSTEAK\",\"psycodelicious\":\"PSYCODELICIOUS\",\"ptd\":\"PTD\",\"ptislands\":\"ptislands\",\"public planet\":\"ぱぶりっくぷらねっと\",\"pucchies\":\"ぷっち~ず\",\"pucchu\":\"ぷっちゅ\",\"puchi momo club\":\"ぷちもも倶楽部\",\"puchi parfait\":\"ぷちぱるふぇ\",\"puchi-ya\":\"ぷち屋\",\"pudding delices\":\"プディングデリス\",\"pukupukumanbow\":\"PUKUPUKUMANBOW\",\"pulin nabe\":\"PULIN Nabe\",\"pulltop\":\"PULLTOP\",\"pulltop latte\":\"PULLTOP LATTE\",\"pulp sector\":\"パルプセクタ\",\"pulpox\":\"Pulpox\",\"pulupulu punch\":\"pulupulu punch\",\"pumpkin\":\"ぱんぷきん\",\"pumpkin freaks\":\"PUMPKIN FREAKS\",\"puni puni kikaku\":\"ぷにぷに企画\",\"puni-douraku\":\"ぷに道楽\",\"puni-soft\":\"ぷにソフト\",\"puniiyu\":\"ぷにいゆ\",\"puniponya\":\"ぷにぽんや\",\"punipuni doka-n\":\"ぷにぷにどか～ん♪\",\"punipunikan\":\"ぷにぷに館\",\"punisher punishment\":\"ぱにっしゃーぱにっしゅめんと\",\"punyanica\":\"ぷにゃニカ\",\"puppy biscuit\":\"ぱぴービスケット\",\"puralinedou\":\"puraline堂\",\"puratina no sakana\":\"プラチナのサカナ\",\"pure cruel\":\"PureCruel\",\"pure light\":\"ぴゅあらいと\",\"pure more\":\"pure more\",\"pure-liquid\":\"Pure-Liquid\",\"purehime\":\"PUREHIME\",\"pureskip\":\"PureSkip\",\"pureslider\":\"PureSlider\",\"purge\":\"purge\",\"purgic i.m.o\":\"Purgic I.M.O\",\"purikura\":\"プリクラ\",\"purimomo\":\"ぷり桃\",\"purin dou\":\"ぷりん堂\",\"purin house\":\"ぷりんはうす\",\"purin yokochou\":\"ぷりん横丁\",\"purincho.\":\"ぷりんちょ。\",\"puripoyo pudding\":\"ぷりぽょぷりん\",\"purple dream\":\"パープルドリーム\",\"purple haze\":\"PURPLE HAZE\",\"purple kiss\":\"ぱーぷるきっす\",\"purple sky\":\"パープルスカイ\",\"purple software\":\"パープルソフトウェア\",\"purpleclover\":\"PurpleClover\",\"purumetal\":\"ぷるめたる\",\"purupuru finale\":\"ぷるぷるフィナーレ!!\",\"pururun\":\"ぷるるん\",\"push pop\":\"ぷっしゅぽっぷ\",\"pussy cat\":\"Pussy・CAT\",\"pussy.cat seisaku iinkai\":\"Pussy・CAT制作委員会\",\"pussymark\":\"Pussymark\",\"puzzle74\":\"PUZZLE74\",\"puzzlebox\":\"パズルボックス\",\"px-real\":\"PX-REAL\",\"pyonpyororin\":\"ぴょんぴょろりん\",\"pyramid house\":\"ピラミッドハウス\",\"q kikaku ankoku kiheidan\":\"Q企画暗黒奇兵団\",\"q.o.n\":\"Q.O.N\",\"qcumber\":\"QCUMBER\",\"qlapz\":\"クラプス\",\"qoobrand\":\"Qoobrand\",\"qqq\":\"QQQ\",\"qross\":\"QRoss\",\"quad prime\":\"Quad Prime\",\"qualia\":\"qualia\",\"qualia cheese\":\"くおりあちーず\",\"quarter.\":\"QUARTER.\",\"quartierlatin\":\"カルチェラタン\",\"quartzshow\":\"晶\",\"quda\":\"Q.U.D.A.\",\"queen of vanilla\":\"Queen Of VANILLA\",\"queen soft\":\"クィーンソフト\",\"question\":\"QUESTION?\",\"quick kick lee\":\"Quick kick Lee\",\"quintallagosta\":\"QuintalLagosta\",\"quo vadis\":\"Quo Vadis\",\"quotation\":\"Quotation\",\"qureate\":\"qureate\",\"r equals birth\":\"R=birth\",\"r style\":\"R*style\",\"r-blue\":\"R・blue\",\"r-deco\":\"R-Deco\",\"r-type nirvana\":\"R-Type Nirvana\",\"r-works\":\"R-WORKS\",\"r.a.n.software\":\"ランソフトウェア\",\"r.c.i\":\"R.C.I\",\"r.c.w.d\":\"R.c.W.d\",\"r.e.c\":\"R.E.C\",\"r.h.d\":\"R・H・D\",\"r.i.s factory\":\"r.i.s factory\",\"r.o.c\":\"R.O.C\",\"r1\":\"r;1\",\"r18\":\"R18\",\"r2\":\"R2\",\"r2a\":\"r2A\",\"r55 kyouwakoku\":\"R55共和国\",\"ra-raradan\":\"らーらら団\",\"rabbit beat\":\"Rabbit Beat\",\"rabbit company\":\"ラビットカンパニー\",\"rabbit house\":\"ラビットハウス\",\"rabbit hutch\":\"Rabbit Hutch\",\"rabbit kuukan\":\"ラビット空間\",\"rabbit sniper\":\"ラビットスナイパー\",\"rabbit syndrome\":\"rabbit syndrome\",\"rabbits\":\"らびっつ\",\"rabbits foot\":\"ラビッツフット\",\"raccoon\":\"ラクーン\",\"ractica\":\"RACTICA\",\"radial engine\":\"ラジアルエンジン\",\"radiant slash h plus\":\"radiant/H+\",\"radical dash\":\"RADICAL DASH\",\"rafflesia\":\"らふれしあ\",\"rafoguramu\":\"裸フォグラ夢\",\"ragho\":\"らぐほ\",\"rahue kojo\":\"らふ絵工場\",\"raiden labo\":\"らいでんらぼ\",\"raigekitai\":\"らいげきたい\",\"raijinoh\":\"雷迅皇\",\"raijuu shoujo\":\"雷獣少女\",\"rain drop\":\"Rain*drop\",\"rain rainbow\":\"Rain Rainbow\",\"rain shot\":\"Rain Shot\",\"rainbow cyc\":\"Rainbow Cyc\",\"rainbow force\":\"RAINBOW FORCE\",\"rairai rakuraku\":\"らいらいらくらく\",\"raising staff\":\"Raising Staff\",\"rakdo\":\"落童\",\"rakka sokudo 2.5\":\"落下速度2.5\",\"rakkasei\":\"ラッカセイ\",\"rakubi\":\"楽日\",\"rakuen koubou\":\"楽園工房\",\"rakuen no sora\":\"楽園の空\",\"rakuen tiramisu\":\"楽園ティラミス\",\"rakugaki drops\":\"RAKUGAKI DROPS\",\"rakugaki evo\":\"らくがきEVO\",\"rakugaki ippentou\":\"らくがき一辺倒\",\"rakugaki omochabako\":\"らくがきおもちゃばこ\",\"rakugaki switch\":\"らくがきスイッチ\",\"rakuichimonji\":\"楽一文字\",\"rakukisa\":\"ラクキサ\",\"rakutoa\":\"ラクトア\",\"ramble cat\":\"Ramble Cat\",\"rame\":\"ラメ\",\"ramen half price 280 yen\":\"ラーメン半額280円\",\"ramen rice\":\"らーめんらいす\",\"rampancy\":\"Rampancy\",\"rampant\":\"Rampant\",\"ramubi koubou\":\"らむびー工房\",\"ramune button\":\"ラムネボタン\",\"random parts\":\"ランダムパーツ\",\"ranmado\":\"乱馬堂\",\"ranranpop\":\"らんらんぽっぷ\",\"ranshi to kimi to.\":\"乱視と君と。\",\"rapurando\":\"らぷらんど\",\"rare okowa\":\"レアおこわ\",\"rasa house\":\"らさはうす\",\"rascou\":\"らすこう\",\"rasen kyuuri\":\"螺旋きゅうり\",\"rasinban\":\"Rasinban\",\"rask\":\"RASK\",\"raspberry\":\"Raspberry\",\"raspberry galette\":\"raspberry galette\",\"rat tail\":\"RAT TAIL\",\"ratio1\":\"レシオ1\",\"rauhreif\":\"ラウライフ\",\"raving phantom\":\"RAVING PHANTOM\",\"rayroh\":\"玲瓏\",\"raytrec\":\"RAYTREC\",\"razchoco\":\"RazChoco\",\"rbooks\":\"rbooks\",\"re clel\":\"Re_Clel\",\"re cre at tors\":\"Re:Cre@tors\",\"re set\":\"Re:Set\",\"re-bidou\":\"Re-BI堂\",\"re-fire\":\"リファイア\",\"re-tale\":\"Re-tale\",\"re-vival\":\"Re-vival\",\"real\":\"real\",\"reason\":\"Reason\",\"rebecca\":\"REBECCA\",\"rebirth\":\"rebirth\",\"recaroya\":\"れかろ屋\",\"recette\":\"Recette\",\"rectorica\":\"Rectorica\",\"red\":\"RED\",\"red axis\":\"Red Axis\",\"red bean milk tea\":\"小豆ミルクティー\",\"red chuck\":\"レッドチャック\",\"red delicious\":\"レッドデリシャス\",\"red etude\":\"赤のエチュード\",\"red label\":\"レッドレーベル\",\"red paprika\":\"RED Paprika\",\"red rebel\":\"レッドレベル\",\"red ribbon\":\"RED RIBBON\",\"red ribbon revenger\":\"RED RIBBON REVENGER\",\"red x blue\":\"Red×Blue\",\"red-uguisu\":\"RED-UGUISU\",\"red-zone\":\"RED-ZONE\",\"redbell\":\"れっどべる\",\"reds\":\"Reds!\",\"redsquid\":\"REDSQUID\",\"ref\":\"ref\",\"reflectia\":\"Reflectia\",\"reflection\":\"リフレクション\",\"regnenshower\":\"Regnenshower\",\"regulus\":\"レグルス\",\"rei no tokoro\":\"例の所\",\"reien\":\"黎en\",\"reika-doh\":\"麗華堂\",\"reimonya\":\"礼門屋\",\"reitou cafe terrace\":\"冷凍カフェテラス\",\"rekka\":\"烈火\",\"reku kuukan\":\"れく空間\",\"rela factory\":\"Rela Factory\",\"relpam\":\"りるぱむ\",\"rem9\":\"REM9\",\"remagi\":\"リメイジ\",\"remationmade\":\"リメーションメイド\",\"remnants\":\"Remnants\",\"remonsan project\":\"Remonsan Project\",\"remora field\":\"remora field\",\"remora works\":\"remora works\",\"remorse\":\"Remorse\",\"ren\":\"Ren\",\"ren-ai\":\"REN-AI\",\"rena koubou\":\"レナ工房\",\"renainou\":\"恋愛脳\",\"rengeza\":\"蓮華座\",\"rennyuu aquarium\":\"練乳アクアリウム\",\"renrakumou ami doujin section\":\"連絡網ＡＭＩ同人セクション\",\"renrendou\":\"漣々堂\",\"rensei\":\"連星\",\"rensougyo\":\"蓮双魚\",\"rental senkan\":\"レンタル戦艦\",\"renyaa hearts\":\"レンヤーハーツ\",\"reparation\":\"レパラシオン\",\"replicailia\":\"レプリカイリア\",\"resemble blue\":\"Resemble Blue\",\"resident of iii\":\"Resident of III\",\"respect\":\"リスペクト\",\"ressentiment\":\"ルさんちまん\",\"retasuya\":\"れたす屋\",\"retro star\":\"レトロスター\",\"rev3\":\"Rev3\",\"reverie\":\"REVERIE\",\"revoeme\":\"れぼえめ\",\"revorious\":\"RevoRious\",\"rh\":\"あーるえいち\",\"rh minus\":\"RHまいなす\",\"rhein no mamori shoukai\":\"ラインの守り商会\",\"ribbon super kikaku\":\"リボンスーパー企画\",\"ribons nights\":\"リボーンズナイツ\",\"riboshika unit\":\"Riboshika Unit\",\"rice\":\"Rice\",\"rice ball\":\"らいすぼ～る\",\"ricecandy\":\"RiceCandy\",\"ricering\":\"RiceRing\",\"ricky-tick\":\"RICKY-TICK\",\"rico project\":\"リコプロジェクト\",\"riddle soft\":\"リドルソフト\",\"rideshion\":\"りでしおん\",\"riff-racket\":\"リフラケット\",\"right hand\":\"ライトハンド\",\"riki\":\"RIKI\",\"rikomam\":\"RIKOMAM\",\"rikudou juku\":\"六道塾\",\"rikudoukan\":\"六道館\",\"rikudouya\":\"六道屋\",\"rima cafe\":\"Rima Cafe\",\"rin\":\"RIN\",\"rinarina\":\"RINARINA\",\"rinfin\":\"りんふぃん\",\"ring a bell\":\"リングアベル\",\"ring memo\":\"Ring memo\",\"ringo doumei\":\"りんご同盟\",\"ringo koucha\":\"りんご紅茶\",\"ringo no kisetsu.\":\"りんごの季節。\",\"ringoya\":\"リンゴヤ\",\"rinji party\":\"臨時PT\",\"rinkandou\":\"輪漢堂\",\"rinkichibu\":\"りんキチぶ\",\"rinne\":\"りんね\",\"rinnetensei\":\"輪廻転生\",\"rinrin\":\"倫鈴\",\"rio grande\":\"リオグランデ\",\"ripel egg\":\"らいぷるえっぐ\",\"rippadou\":\"立派堂\",\"ripton sabo\":\"りぷとん☆茶房\",\"ririadoll\":\"リリアドール\",\"ririmat\":\"りりまっと\",\"riroland\":\"RIROLAND\",\"rising sun\":\"らいじんぐさん\",\"risoukyou\":\"理ソウ郷\",\"rissuinoti\":\"立錐之地\",\"ritard.a2\":\"ritard.A2\",\"rivajima\":\"リバ島\",\"rix\":\"RIX\",\"rizaru forest.\":\"リザルフォレスト。\",\"rj\":\"RJ\",\"rkaffy\":\"アールカフィ\",\"rm kikaku\":\"RM企画\",\"road\":\"ロード\",\"road equals road\":\"Road=ロード=\",\"road map\":\"Road map\",\"road side roman\":\"Road Side Roman\",\"roam\":\"roam\",\"robayan no mori\":\"ロバヤンの森\",\"robazoku\":\"ロバ族\",\"robo ittetsu\":\"ロボ一徹\",\"robo moe kenkyuujo\":\"ロボ萌え研究所\",\"roboko teikoku\":\"ろぼこ帝国\",\"rocca\":\"ROCCA\",\"rock clime\":\"ROCK CLIME\",\"rock steady\":\"ろっくすてでぃ\",\"rocket kyoudai\":\"ロケット兄弟\",\"rocket nenryou 21\":\"ロケット燃料★21\",\"rockinchair\":\"ROCK`inChair\",\"rocomani\":\"ろこまに\",\"rocoroto\":\"ロコロト\",\"rodeo\":\"■RODEO\",\"rodiura.\":\"ろぢうら。\",\"rohgun kyoh\":\"老眼郷\",\"rojiko\":\"ロジコ\",\"rojiura holic\":\"路地裏Holic\",\"rojiura jack\":\"路地裏JACK\",\"rojiurakinema\":\"路地裏キネマ\",\"rokugatsu no kashiwamochi\":\"六月の柏餅\",\"rokugatsu no reizouko\":\"六月の冷蔵庫\",\"rokujinchuu\":\"六人柱\",\"rokumen roppi\":\"ろくめん・ろっぴ\",\"rokuroku sanjuuroku\":\"ロクロクサンジューロク\",\"rokusyoku mikan\":\"緑色みかん\",\"rollin thunder\":\"ろーりんさんだー\",\"rolling box\":\"Rolling box\",\"rolling haiena\":\"Rollingハイエナ\",\"romantic london\":\"Romantic London\",\"romantic ren-ai mode\":\"ロマンティック恋愛モード\",\"romantic shinjuu\":\"浪漫的心中\",\"romeo dash\":\"ROMEO DASH\",\"ronpaia\":\"ろんぱいあ\",\"room guarder\":\"ルームガーダー\",\"room0016\":\"Room0016\",\"rope island\":\"ろーぷあいらんど\",\"roppongi shinjuu\":\"六本木神獣\",\"rorerore-ya\":\"ろれろれ屋\",\"rorioiru\":\"ろりおいる\",\"roritora\":\"ロリとら!!\",\"rorororomo\":\"ロロロロモ\",\"rose liese\":\"Rose Liese\",\"rose tiara\":\"ローズティアラ\",\"rose water\":\"ROSE WATER\",\"rosebud\":\"Rosebud\",\"rosemarygarden\":\"RosemaryGarden\",\"roshiman\":\"ろしまん\",\"rotary engine\":\"ろ～たり～Engine\",\"rotten apple\":\"ろってんあっぷる\",\"roubai-tei\":\"狼狽亭\",\"rouge\":\"ルージュ\",\"rough love\":\"ラフラブ\",\"round-house\":\"ROUND-HOUSE\",\"round-o\":\"round-O\",\"rouseiya\":\"狼星屋\",\"route08\":\"ROUTE08\",\"royal\":\"ROYAL\",\"royal crown\":\"ROYAL CROWN\",\"royal maya\":\"Royal Maya\",\"royal moon\":\"Royal Moon\",\"royal.s\":\"ロイヤル・S\",\"royalwatts\":\"ROYALWATTS\",\"rr kenkyuukai\":\"RR研究会\",\"rro\":\"RRO\",\"rrr\":\"RRR\",\"rsag\":\"RSAG\",\"ru-vic\":\"RU-VIC\",\"rubber cup boys\":\"ラバーカップボーイズ\",\"rubbish selecting squad\":\"RUBBISH選別隊\",\"rubens tinctura\":\"Rubens Tinctura\",\"rubicon\":\"ルビコン\",\"ruby eye\":\"Ruby Eye\",\"ruby fruit\":\"RUBY FRUIT\",\"ruf\":\"ruf\",\"ruikotsu\":\"泪骨\",\"ruki ruki exiss\":\"るきるきEXISS\",\"rukruk\":\"RukRuk\",\"ruler shot\":\"Ruler Shot\",\"rumbling heart\":\"らんぶりんぐはあと\",\"rune\":\"ルーン\",\"runner bean\":\"runner bean\",\"runway\":\"Runway\",\"rupinasu touzokudan\":\"るぴなす盗賊団\",\"ruri ringo\":\"瑠璃りんご\",\"ruruna and nimunimu\":\"るるな＆にむにむ\",\"rururairai\":\"縷々来来\",\"rush\":\"RUSH\",\"rush rise line\":\"Rush Rise Line\",\"rushimaru dou\":\"るしまる堂\",\"russia cake\":\"Russia cake\",\"russian neko\":\"ロシアン猫\",\"russiapan\":\"ロシアパン\",\"rustic house\":\"RUSTIC HOUSE\",\"rxr renmei\":\"あるある連盟\",\"ryanhan shibari\":\"二飜縛り\",\"rycanthropy\":\"RYCANTHROPY\",\"ryokucha combo\":\"緑茶コンボ\",\"ryonas station\":\"Ryona's Station\",\"ryoujoku kagekidan\":\"陵辱過激団\",\"ryousangata ponyta\":\"量産型ポニテ\",\"ryu no abara\":\"りゅうのあばら\",\"ryujya dou\":\"竜蛇道\",\"ryuknigthia\":\"リュナイティア\",\"ryuu no yadorigitei\":\"竜の宿り木亭\",\"ryuukisha\":\"隆起社\",\"ryuukotsusan\":\"龍骨山\",\"ryuukuujou\":\"竜宮城\",\"ryuuryokukakou.\":\"りゅうりょくかこう。\",\"ryuusei koubou\":\"流星工房\",\"ryuushikei\":\"粒子系\",\"ryuutai rikigaku\":\"流体力学\",\"ryuutai urinal\":\"流体ユリナアル\",\"s shoten\":\"エス書店\",\"s-14\":\"S-14\",\"s-core\":\"S-Core\",\"s-flake\":\"S-FLAKE\",\"s-force\":\"S-FORCE\",\"s-g.h.\":\"S-G.H.\",\"s-ram\":\"S-Ram\",\"s.\":\"S.\",\"s.c.c.\":\"S.C.C\",\"s.d.works\":\"S・D・Works\",\"s.k.\":\"S.K\",\"s.n.l\":\"S.N.L\",\"s.s.l\":\"S.S.L\",\"saba down\":\"鯖DOWN\",\"sabai shuppan\":\"さばーい出版\",\"sabakunosakura\":\"サバクノサクラ\",\"sabamiso\":\"さばみそ\",\"saberfish\":\"セイバーフィッシュ\",\"sabo-p\":\"SABO-P\",\"saboriguse syndrome\":\"サボリ癖症候群\",\"saboten\":\"サボテン\",\"saboten binta\":\"サボテンビンタ\",\"saboten sankaku\":\"サボテンさんかく\",\"saboten-dou honpo\":\"仙人掌堂本舗\",\"sabusukatchi\":\"サブスカッチ\",\"sadakichi-tei\":\"定吉亭\",\"sadakichidou\":\"定吉堂\",\"sadistic alice\":\"Sadistic Alice\",\"sadistic green\":\"SADISTIC GREEN\",\"sadistic mary\":\"SADISTIC MARY\",\"sae\":\"冴\",\"safire\":\"SAFIRE\",\"saga angel\":\"SAGA Angel\",\"sagamani.\":\"サガマニ。\",\"sagano line\":\"さがのせん\",\"sage\":\"Sage\",\"saicoro chick\":\"サイコロちっく\",\"saigo made anko tappuri\":\"最後まであんこたっぷり\",\"saigo no rakuen -the perfect world-\":\"最後の楽園-the perfect world-\",\"saihate\":\"最果て\",\"saikaihatsu\":\"催開発\",\"saikasou seiteki shoudou kenkyuukai\":\"最下層性的衝動研究会\",\"saikawa youzyo\":\"さぃヵゎ♡ょぅι゛ょ\",\"saiki industrial\":\"佐伯重工\",\"saiko smiling show\":\"サイコすまいりんぐショウ\",\"saikyo gakuen\":\"最強学園\",\"sail-ring on\":\"Sail-ring on\",\"sailor q2\":\"SAILOR Q2\",\"saimin sushiya\":\"催眠すし屋\",\"sainometei\":\"賽の目亭\",\"saint seiya\":\"聖性屋\",\"saipin\":\"さいピン\",\"sairo publishing\":\"豺狼出版\",\"saisons\":\"SaiSonS\",\"saita tsuushin\":\"才田通信\",\"saitei no butagoya\":\"最低の豚小屋\",\"saito-penguin\":\"西東ペンギン\",\"saitou satou\":\"斎藤さとー\",\"saitou teikoku\":\"齋藤帝國\",\"saitoukai\":\"斉藤会\",\"saitouya\":\"斎藤屋\",\"saka muke\":\"さか☆むけ\",\"sakaiya\":\"境屋\",\"sakamusiya\":\"さかむし屋\",\"sakanahen\":\"サカナヘン\",\"sakasadorirakka\":\"逆さ鳥落下\",\"sakasama clover\":\"さかさまクローバー\",\"sakazuki-tei\":\"さかずき亭\",\"sakeitiba\":\"サケ市場\",\"sake no sanran\":\"鮭の産卵\",\"sakekan memorial\":\"鮭缶メモリアル\",\"saketanuki no kakushigura\":\"酒たぬきの隠し蔵\",\"saketoba meshi\":\"鮭とば飯\",\"sakiyama bakufu\":\"sakiyama幕府\",\"sakomicho\":\"さこみちょ\",\"sakotsu no kuni\":\"鎖骨ノ国\",\"saku saku circle\":\"さくさくさーくる\",\"sakuko seisakusho\":\"作呼製作所\",\"sakumaya\":\"さくま屋\",\"sakura garden\":\"さくらがーでん\",\"sakura koubou\":\"さくら工房\",\"sakura mochi\":\"桜餅\",\"sakura no hanabira\":\"桜の花びら\",\"sakura prin\":\"さくらぷりん\",\"sakura zensen\":\"さくら前線\",\"sakuraen\":\"櫻園\",\"sakurai dai energy\":\"櫻井台エネルギー\",\"sakurairo etranger\":\"桜色エトランゼ\",\"sakuraito\":\"サクライト\",\"sakurakan\":\"さくら缶\",\"sakurako\":\"さくら庫\",\"sakurakusa\":\"サクラクサ\",\"sakuraminto\":\"桜眠都\",\"sakuramochi\":\"さくらもち\",\"sakuramouse\":\"SAKURAMOUSE\",\"sakuranbo\":\"桜桃\",\"sakuranbo little\":\"さくらんぼりとる\",\"sakurapink\":\"sakuraPINK\",\"sakurasake\":\"桜鮭\",\"sakurasaku koubou\":\"桜咲く工房\",\"sakurautage\":\"櫻宴\",\"sakurawhite\":\"SAKURAWHITE\",\"sakuraya\":\"SAKURAYA\",\"sakurazuki\":\"桜月\",\"sakuri uchuu model\":\"サクリ宇宙モデル\",\"sakusaku kangen noushuku\":\"サクサク還元濃縮\",\"sakusakusakuchan\":\"さくさくさくちゃん\",\"sakuya no hakoniwa\":\"昨夜の箱庭\",\"sakuya17sai\":\"咲耶17歳\",\"sakyuu\":\"砂丘\",\"salad abura\":\"サラダ油\",\"salmon daisuki club\":\"サーモンだいすきクラブ\",\"salt peanuts\":\"Salt Peanuts\",\"salvage kouboh\":\"サルヴェージ工房\",\"samalimi\":\"samalimi\",\"sameno soft cream\":\"鮫野ソフトクリーム\",\"samgyetang\":\"サムゲタン\",\"samonaberu\":\"サモナベール\",\"samugakupetti\":\"SGPT\",\"samurai\":\"侍\",\"samurai shipmaru\":\"さむらいシップ丸\",\"sunora\":\"さんおれ\",\"sana house\":\"Sana House\",\"sanazura doujinshi hakkoujo\":\"さなづら同人誌発行所\",\"sanb.\":\"さんびー。\",\"sanbai kaiouken\":\"3倍界王軒\",\"sanban yashiki\":\"三番屋敷\",\"sanchi chokusou maguro dan\":\"産地直送マグロ団\",\"sancho panda\":\"さんちょぱんだ\",\"sandal nyan\":\"サンダルニャン\",\"sandansu\":\"sandansu\",\"sandglass\":\"sandglass\",\"sangatsu no lion\":\"三月のライオン\",\"sangatsu no osakai\":\"三月のお茶会\",\"sangenkaidou\":\"三弦回胴\",\"sangenshokudou\":\"三原色堂\",\"sangeriya\":\"サンゲリ屋\",\"sangria\":\"さんぐりあ\",\"sangria kyuuden\":\"サングリア宮殿\",\"sankaku apron\":\"さんかくエプロン\",\"sankaku doumei\":\"さんかく同盟\",\"sanketsushuu\":\"酸欠集\",\"sankyaku rasen\":\"三脚ラセン\",\"sannyuutei\":\"三乳亭\",\"sanolemoon\":\"Sanolemoon\",\"sanryuu club\":\"三流倶楽部\",\"sanryuu kaigishitsu\":\"三流会議室\",\"sansei biyori\":\"賛成日和\",\"sanshodou\":\"山椒堂\",\"sansui\":\"泉泉泉\",\"sansuisha\":\"散水社\",\"santa fe radio\":\"Santa Fe Radio\",\"santarose\":\"サンタローズ\",\"santonana\":\"サントナナ\",\"sanukiya\":\"讃岐屋\",\"sanyongo\":\"三四五\",\"sanzoku no uta\":\"山賊の唄\",\"saomako\":\"さおまこ\",\"saotome-laboratory\":\"早乙女けんきゅう所\",\"saperon black\":\"さぺろんブラック\",\"sardnix\":\"サードニックス\",\"sardonyx\":\"sardonyx\",\"sarfatation\":\"sarfatation\",\"sark\":\"SARK\",\"sarobetsu ginga\":\"サロベツ銀河\",\"sarpaccio\":\"サルパッチョ\",\"sartaiz\":\"さぁたいず\",\"sarurururu\":\"サルルルル\",\"sasa chaya\":\"ささ茶屋\",\"sasainamono\":\"ささいなもの\",\"sasakama box\":\"笹かまボックス\",\"sasaki maru\":\"ささきまる\",\"sasaki muu shouten\":\"佐々木無宇商店\",\"sasaki yasiki\":\"佐々木屋敷\",\"sasami no maruyaki\":\"ささみの丸焼き\",\"sasanoha toro\":\"笹乃葉とろ\",\"sasha forest\":\"サーシア・フォレスト\",\"sashimi choco\":\"さしみチョコ\",\"sashimi no wife\":\"サシミノワイフ\",\"sasumata seven\":\"さすまたせぶん\",\"sasurai no manbou\":\"さすらいのマン棒\",\"sata cleaning\":\"さたクリーニング\",\"satei\":\"砂亭\",\"satellite na spark\":\"サテライトなスパーク\",\"satellites\":\"Satellites\",\"sato samitt\":\"サトサミット\",\"satoimo bokujou\":\"さといも牧場\",\"satomachine.\":\"satomachine.\",\"satooya\":\"さとうや\",\"satori gozen\":\"悟リ御膳\",\"satou furo\":\"砂糖風呂\",\"satou to shio\":\"砂糖と塩\",\"satouseika\":\"サトウ製菓\",\"satsukiimonet\":\"satsukiimonet\",\"satsukinchi\":\"サツキん家\",\"saturday night special\":\"Saturday Night Special\",\"aurorasoft\":\"AuroraSoft\",\"sausage koubou\":\"ソーセージ工房\",\"savageland\":\"SavageLand\",\"sawa chaya\":\"さわ茶屋\",\"sawaraya shoten\":\"佐原屋書店\",\"sayakata kouchakan\":\"さやかた紅茶館\",\"sayonara hornet\":\"サヨナラホーネット\",\"sayupot\":\"さゆぽっと\",\"sayuu-hanten\":\"サユウハンテン\",\"sazameki dori\":\"さざめき通り\",\"sazanka no yado\":\"山茶花の宿\",\"sazareito\":\"さざれいと\",\"sbd\":\"SBD\",\"sbi\":\"SBI\",\"scale garden\":\"スケイルガーデン\",\"scape alice\":\"Scape Alice\",\"scarabe\":\"scarabe\",\"scarlet beast\":\"Scarlet Beast\",\"scarlet leaf\":\"Scarlet Leaf\",\"schatz\":\"Schatz\",\"schenkel union\":\"Schenkel Union\",\"schoolzone\":\"schoolzone\",\"schwarz libelle\":\"シュバルツ･リベレ\",\"schwester\":\"しゅべすた\",\"sco.labo\":\"SCO.LABO\",\"score\":\"スコア\",\"scotchy\":\"すこっちぃ\",\"scp-mio slash\":\"SCP-MiO/\",\"scramble yourouin\":\"スクランブル養老院\",\"screaming dog\":\"Screaming DOG\",\"scrotum\":\"scrotum\",\"scrum hitori\":\"スクラムヒトリ\",\"sddy\":\"SDDY\",\"se-ri\":\"セーリ\",\"seacloud\":\"SEACLOUD\",\"seafox\":\"SeaFox\",\"seamanz\":\"seamanz\",\"search-light\":\"サーチライト\",\"searchlight missing\":\"サーチライトミッシング\",\"sebas\":\"sebas\",\"sec44\":\"sec44\",\"second color\":\"セカンドカラー\",\"second point\":\"Second Point\",\"secreder\":\"SECREDER\",\"secret cure\":\"Secret Cure\",\"secret dmain\":\"Secret Dmain\",\"secret milk\":\"secret milk\",\"secretgarden\":\"secretgarden\",\"section-11\":\"SECTION-11\",\"seduce\":\"SEDUCE\",\"segue laboratory\":\"セグエラボラトリー\",\"sei kuroneko kishidan\":\"聖クロネコ騎士団\",\"seibunkaken\":\"性文化研\",\"seigadou\":\"勢画堂\",\"seigakukan\":\"性学館\",\"seigi no chikubi\":\"正義のちくび\",\"seigi no yakata\":\"セイギノヤカタ\",\"seigou\":\"せいごう\",\"seiheki master\":\"セイヘキマスター\",\"seikan hitchhiker\":\"星間ヒッチハイカー\",\"seikatsu seshishou\":\"性活窃視症\",\"seikinkan\":\"星菫館\",\"seinen shinshi doumei\":\"青年紳士同盟\",\"seishimentai\":\"せいしめんたい\",\"seishinkan eikyuu\":\"星神官永級\",\"seisyun katsusand\":\"青春カツサンド\",\"seisyun to strategy.\":\"青春と戦略。\",\"seiteijin\":\"井庭人\",\"seiwa kanmu\":\"せいわかんむ\",\"seiyou tanka\":\"西洋短歌\",\"seizousha\":\"性造社\",\"sekai chizu wa chi no ato\":\"世界地図は血の跡\",\"sekai kakumei club\":\"世界革命俱乐部\",\"sekai no hate ni hanataba o.\":\"世界の果てに花束を。\",\"sekai no tomizawa\":\"世界のTOMIZAWA\",\"sekai saiko\":\"世界最古\",\"seken no katasumi\":\"世間の片隅\",\"sekichou\":\"赤蝶\",\"sekidou nakama\":\"赤道仲間\",\"sekigaiken\":\"赤外圏\",\"sekilala\":\"せ・き・ら・ら\",\"sekimen shoujo\":\"赤面少女\",\"sekipan\":\"石板\",\"sekishoku vanilla\":\"赤色バニラ\",\"sekitan bukuro\":\"石炭袋\",\"selen\":\"Selen\",\"selene\":\"Selene\",\"sem colon\":\"SEM;COLON\",\"semakute kurai\":\"狭くて暗い\",\"semedain g\":\"セメダインG\",\"semimogura\":\"せみもぐら\",\"sen\":\"煎\",\"sen ka\":\"SEN_KA\",\"sen.exe\":\"sen.exe\",\"senarinko\":\"senarinko\",\"senba kitchen\":\"船場きっちん\",\"senbata rom\":\"せんばたROM\",\"senbata-rom\":\"せんばたROM\",\"senbon knock zadankai\":\"千本ノック座談会\",\"senbunritsu\":\"千分率\",\"sendankaisen\":\"千段櫂船\",\"sengoku joketsu emaki\":\"戦国女傑絵巻\",\"seniman kartun\":\"セニマンカルタン\",\"senju\":\"千寿\",\"senkou campanella\":\"閃光カンパネラ\",\"senmatu-chaya\":\"千松茶屋\",\"sennen comodo\":\"千年コモド\",\"sennen ookami\":\"千年狼\",\"sennohi.\":\"センノヒ.\",\"senri no dou\":\"千里ノ洞\",\"sentou kaiiki\":\"戦闘海域\",\"sentou yousei\":\"仙桃妖星\",\"senya sabou\":\"千夜茶房\",\"senyen\":\"SENYEN\",\"senzendou\":\"仙々堂\",\"sepia\":\"SEPIA\",\"sepia concerto\":\"セピアコンチェルト\",\"sequence\":\"し～くえんす\",\"sequence breaker\":\"シークエンスブレイカー\",\"seraphim\":\"せらぴん\",\"serenta\":\"Serenta\",\"serious graphics\":\"serious graphics\",\"sero-sero\":\"SERO-SERO\",\"service boy\":\"SERVICE BOY\",\"sesame\":\"セサミ\",\"seseragi no machikado\":\"せせらぎの街角\",\"sesso minus\":\"節操マイナス\",\"setouchi pharm\":\"瀬戸内製薬\",\"setsugetsuka\":\"雪月花\",\"setsunasamidare\":\"せつなさみだれ\",\"seven gods\":\"SEVEN GODS!\",\"seven sea star\":\"SEVEN SEA STAR\",\"seven wonder\":\"SEVEN WONDER\",\"sevens magajin\":\"セブンズマガジン\",\"seventh heaven\":\"SEVENTH HEAVEN\",\"sevirey\":\"セビレィ\",\"sexpet project j\":\"sexpet project J\",\"sextant\":\"SEXTANT\",\"sf-l\":\"SF-L\",\"sg\":\"SG\",\"sgsix\":\"SGsix\",\"shadow garden\":\"Shadow Garden\",\"shadow sorceress communication protocol\":\"影法師通訊協定\",\"shagbase\":\"Shadbase\",\"shagwell\":\"SHAGWELL\",\"shakestyle\":\"shakestyle\",\"shallow sleep plus plus\":\"Shallow Sleep++\",\"shamontei\":\"沙門亭\",\"shamrock.\":\"Shamrock.\",\"shan maryland\":\"シャンメリーランド\",\"shanghai honey bee\":\"上海蜜蜂\",\"shangrila\":\"シャングリラ\",\"shanhai kaijou koushi\":\"上海海上公司\",\"sharuru hunter\":\"シャルルハンター\",\"shay-cone\":\"SHAY-CONE\",\"sheep cat\":\"しーぷきゃっと\",\"sheepcloud\":\"SHEEPCLOUD\",\"sherbet soft\":\"シャーベットソフト\",\"shi shi shijimi\":\"SHI SHI しじみ\",\"shi-kugakari saru\":\"飼育係さる\",\"shian\":\"紫庵\",\"shiashiya\":\"しあし屋\",\"shiawase kanmiryou\":\"しあわせ甘味料\",\"shiawase kyouwakoku\":\"幸せ共和国\",\"shiawase manjuu\":\"しあわせまんじゅう\",\"shiawase pudding dou\":\"しあわせプリン堂\",\"shibafu cement\":\"芝生セメント\",\"shibaneko hungry\":\"芝猫はんぐりー!\",\"shibou suitei jikoku\":\"志望推定時刻\",\"shibubu shibubushi\":\"しぶぶしぶぶし\",\"shichirin taisha\":\"七輪大社\",\"shichiyou\":\"七陽\",\"shichiyou souryuujin\":\"七曜蒼龍陣\",\"shigaraki ceramic\":\"シガラキセラミック\",\"shigunyan\":\"しぐにゃん\",\"shigure ebi\":\"しぐれえび\",\"shigureya\":\"しぐれや\",\"shihai shoujo\":\"支配少女\",\"shiina club\":\"しいなくらぶ\",\"shiinotomoshibitake\":\"しいのともしびたけ\",\"shiitake\":\"椎茸\",\"shijima\":\"しじま\",\"shijou misaki\":\"紙上岬\",\"shikaku to sankaku\":\"しかくとさんかく\",\"shiki hanana\":\"紫木はなな\",\"shikibu\":\"式部\",\"shikimisan keiro\":\"シキミ酸経路\",\"shikioriori\":\"シキオリオリ\",\"shikitenshi\":\"色天使\",\"shikkoku no hekireki\":\"漆黒の霹靂\",\"shikkoku no tsubasa\":\"漆黒の翼\",\"shikkoku no voltecker\":\"漆黒のボルテッカー\",\"shikkokuno j.p.s.\":\"漆黒のJ.P.S.\",\"shiko neru mix\":\"シコ寝るミックス\",\"shikunikiwa\":\"しくにきわ\",\"shima hitsuji\":\"しまひつじ\",\"shima kneesocks tayoutai\":\"縞ニーソックス多様体\",\"shimane no inugoya\":\"島根の犬小屋\",\"shimanto seiryuu\":\"四万十清流\",\"shimapanicecandy\":\"しまぱんアイスキャンディー\",\"shimarisutei\":\"しまりす亭\",\"shimashima stripe\":\"しましますとらいぷ\",\"shimashima-pnt\":\"しましまPNT\",\"shimeji777\":\"Shimeji777\",\"shimekiri sanpunmae\":\"〆切り3分前\",\"shimerike\":\"シメリケ\",\"shimoboard\":\"シモボード\",\"shimoda nekomaru\":\"霜田猫丸\",\"shimofuri green meat\":\"しもふりグリーンミート\",\"shimofuritei\":\"霜降亭\",\"shimofutaketa zorome\":\"下二桁ぞろ目\",\"shimokuniya\":\"シモクニヤ\",\"shimotarou\":\"下太郎\",\"shin-chan carnival\":\"Shin-Chan Carnival !?\",\"shinachiku castella\":\"しなちくかすてぃーら\",\"shinanoya\":\"信濃屋\",\"shinba oolong cha\":\"神葉烏龍茶\",\"shinchara\":\"しんきゃら\",\"shinderarejou\":\"しんでられ城\",\"shine nabyss\":\"シャイン・ナビス\",\"shine no syoujyo\":\"シャインの少女\",\"shinimonogurui\":\"しにものぐるい\",\"shining\":\"SHINING\",\"shining star\":\"Shining Star\",\"shinjae iinkai\":\"死んじゃえ委員会\",\"shinjuku koma gekijou\":\"新宿狛劇場\",\"shinkai\":\"深海\",\"shinkai hikou\":\"深海飛行\",\"shinkai saboten\":\"深海サボテン\",\"shinkai seizu\":\"深海星図\",\"shinkan ochimashita\":\"新刊堕ちました\",\"niitakayama tozantai\":\"新高山登山队\",\"shinkuraiku\":\"しんくらいく\",\"shinmichikai\":\"真道会\",\"shinnihon pepsitou\":\"新日本ペプシ党\",\"shinobi no yakata\":\"忍ノ館\",\"shinobi rocket\":\"シノビロケット\",\"shinohara heavy industry\":\"篠原重工営業部\",\"shinpakusu teika\":\"心拍数低下\",\"shinsei shoujo nyuugyou\":\"神聖少女乳業\",\"shinsekai manga kenkyuukai\":\"新世界漫画研究会\",\"shinsen gokuraku\":\"新鮮極楽\",\"shinshi zaibatsu\":\"紳士財閥\",\"shinshunshantonshou\":\"新春山東省\",\"shiodome project\":\"汐留project\",\"shiohama\":\"SHIOHAMA\",\"shioji\":\"しおじ\",\"shionoya\":\"しおのや\",\"shiotsuki suien\":\"汐月水園\",\"shioya\":\"塩屋\",\"shioya abu tsuushin\":\"塩屋虻通信\",\"sioyaki\":\"しおやき\",\"sioyude\":\"しおゆで\",\"shippo banchou\":\"しっぽ番長\",\"shippuudotou\":\"疾風怒濤\",\"shirakaba doori\":\"白樺通り\",\"shiraki no kobeya\":\"白木の小部屋\",\"shiranai ouchi\":\"しらないおうち\",\"shirasagisou\":\"しらさぎ荘\",\"shirasu an\":\"しらす庵\",\"shirasugayu\":\"白子粥\",\"shiratama\":\"しらたま\",\"shiratamarch\":\"しらたまーち\",\"shirayuki shoujodan\":\"白雪少女団\",\"shirikageru taberu\":\"シリカゲルタベル\",\"shiritsu sakuranbo shougakkou\":\"私立さくらんぼ小学校\",\"shiro anmitsu\":\"しろあんみつ\",\"shiro gas koujou\":\"白瓦斯工場\",\"shiro kuro soft\":\"シロクロソフト\",\"shiro no kigen\":\"白の起源\",\"shiroboshi koubou\":\"白星工房\",\"shiroganean\":\"白金庵\",\"shiroi famicon\":\"しろいファミコン\",\"shiroi kitsune no sumu yashiro\":\"白い狐の住む社\",\"shiroi shinoshino\":\"しろいしのしの\",\"shiroi tentoumushi\":\"白い天道虫\",\"shiroi yami\":\"白い闇\",\"shiroino.\":\"白いの。\",\"shiroiro\":\"しろいろ\",\"shiroiro ribbon\":\"しろ色りぼん\",\"shirojia\":\"シロジア\",\"shirokarasuya\":\"白からす屋\",\"shirokuro panda\":\"白黒ぱんだ\",\"shirokurofuurinkou\":\"しろくろ風鈴刻\",\"shirokyuuketsuki\":\"白吸血鬼\",\"shiromitsu nyuugyou\":\"白蜜乳業\",\"shiromitsuya\":\"しろみつ屋\",\"shironegiya\":\"白ネギ屋\",\"shironeko ichizoku\":\"白猫一族\",\"shirorika\":\"シロリカ\",\"shirotsumekusa\":\"シロツメクサ\",\"shis laboratory\":\"SHi's Laboratory\",\"shishamo house\":\"ししゃもハウス\",\"shishamo teikoku\":\"ししゃも帝国\",\"shishamotei\":\"ししゃも亭\",\"shishigami\":\"ししがみ\",\"shishimaruya\":\"獅子丸屋\",\"shishunki\":\"思春棄\",\"shishunki paradigm\":\"思春期パラダイム\",\"shisshin chuudoku\":\"失神中毒\",\"shitsuji no kumaana\":\"シツジノクマアナ\",\"shiwodou.\":\"しを堂。\",\"shiya\":\"志屋\",\"shiyou kougen\":\"四葉弘彦\",\"shiyouka.\":\"しようか。\",\"shizendou\":\"四然堂\",\"shizuka no umi\":\"静香の海\",\"shizuoka kakusei shoujo\":\"静岡覚醒少女\",\"shm\":\"SHM\",\"shobocon\":\"しょぼコン\",\"shocoratie\":\"ショコラティエ!\",\"shokkakuya\":\"食客屋\",\"shokumu taiman\":\"職務タイマン\",\"shokushu mind\":\"触手mind\",\"shokuzai\":\"贖罪\",\"shonen shojo tai\":\"少年少女隊\",\"shonnaka-dou\":\"しょんなか堂\",\"shore\":\"ショアー\",\"shosekido\":\"硝石堂\",\"shoshi magazine hitori\":\"書肆マガジンひとり\",\"shoshinsha crossover\":\"初心者クロスオーバー\",\"shota scratch jikkou iinkai\":\"スクラッチ実行委員会\",\"shotafes junbikai\":\"ショタフェス準備会\",\"shoudansha\":\"笑談者\",\"shouga udon\":\"枯葉\",\"shoujo aigan club\":\"少女愛玩倶楽部\",\"shoujo ex\":\"少女EX\",\"shoujo idenshi\":\"少女遺伝子\",\"shoujo kaihatsu shitsu\":\"少女開発室\",\"shoujo katharsis.\":\"少女カタルシス。\",\"shoujo kousaku\":\"少女交錯\",\"shoujo no dangan\":\"少女の弾丸\",\"shoujo no mori\":\"少女の杜\",\"shoujo no youni\":\"少女のように\",\"shoujo seiyaku\":\"少女製薬\",\"shoujo shumi.\":\"少女趣味。\",\"shoujo zukin\":\"少女頭巾\",\"shounan oshinobi club\":\"湘南おしのびCLUB\",\"shounen byoukan\":\"少年病監\",\"shounen x shoujo\":\"少年×少女\",\"shounen yuuichirou\":\"少年ゆういちろう\",\"shounen-h\":\"少年H\",\"shounendan\":\"少年団\",\"shounin eden\":\"聖人エデン\",\"shouwa kara heisei e\":\"昭和から平成へ\",\"shouwa prism\":\"昭和プリズム\",\"showa saishuu sensen\":\"昭和最終戦線\",\"shouyu gohan\":\"しょうゆごはん\",\"syowajukou\":\"昭和重工\",\"shrine\":\"SHRINE\",\"shudoushiki denki jidousha\":\"手動式電気自動車\",\"shukketsu kansatsu nikki\":\"出血観察日記\",\"shumisen jiru\":\"シュミセンジル\",\"shun shun shouten\":\"しゅん々商店\",\"shungabu\":\"春画部\",\"shuniku 2\":\"しゅにく2\",\"shunran\":\"春蘭\",\"shuraba keikaku\":\"修羅場計画\",\"shuuchuugouu keihou\":\"集中豪雨警報\",\"shuukan freaks\":\"収監フリークス\",\"shuukyuu itsukasei\":\"週休五日制\",\"shuusei patch 3gb\":\"修正パッチ3GB\",\"shyness over drive\":\"SHYNESS OVER DRIVE\",\"shyo chiku bai\":\"笑畜売\",\"side buy side\":\"Side Buy Side\",\"side m\":\"Side:M\",\"side-a\":\"SIDE-A\",\"sideoff\":\"サイドオフ\",\"sigamitsuki mizuhiki\":\"しがみつきみずひき\",\"sigma-plan\":\"∑-PLAN\",\"sigmanica\":\"SIGMANICA\",\"signal go\":\"SIGNaL_GO\",\"signal group\":\"シグナルグループ\",\"signalred\":\"SignalRed\",\"signal yellow\":\"しぐなるいえろー\",\"signares jigen\":\"シグナレス次元\",\"signstandard\":\"サインスタンダード\",\"sikosiko network\":\"SIKOSIKO NETWORK\",\"sikouya\":\"試行屋\",\"silent hill\":\"SILENT HILL\",\"silent4\":\"サイレント4\",\"silicon jichou\":\"シリコン自重\",\"silky to yukai na nakama-tachi\":\"しるきーと愉快な仲間たち\",\"silmaril\":\"しるまりる\",\"silver bloom\":\"SILVER BLOOM\",\"silver bullet\":\"Silver Bullet\",\"silver way\":\"銀色宇宙(仮)\",\"silverfox\":\"銀狐\",\"silver rice\":\"シルバーライス\",\"silverstone\":\"SilverStone\",\"simasima system\":\"しましましすてむ\",\"simfrill\":\"シンプリル\",\"simokentarous\":\"しもケンタロス\",\"simotsukekai\":\"下野会\",\"simple house\":\"SIMPLE HOUSE\",\"sin-maniax\":\"sin-maniax\",\"singleton\":\"Singleton\",\"sinistra\":\"シニストラ\",\"sinizon\":\"SINIZON\",\"sinkirou\":\"心輝楼\",\"sinonome\":\"シノノメ\",\"sinoriya\":\"しのり屋\",\"sinosino\":\"しのしの\",\"sion\":\"SION\",\"siooninco\":\"塩おにんこ\",\"siop\":\"単一統合作戦計画\",\"sippo-soft\":\"SIPPO-SOFT\",\"siratama nikukyuu\":\"しらたま肉球\",\"siratamadon\":\"白玉井\",\"sirius.\":\"SIRIUS.\",\"sirojio\":\"白塩\",\"siropome\":\"しろぽめ\",\"sirotaruto\":\"しろたると\",\"sirotateto\":\"しろたてと\",\"sirousagicafe\":\"しろうさぎカフェ\",\"sister screaming i die\":\"SISTER SCREAMING I DIE\",\"sister soft\":\"しすたーそふと\",\"sisui sisters\":\"しすいシスターズ\",\"sittori oblaat\":\"しっとりオブラート\",\"situation laboratory\":\"シチュラボ\",\"sk01\":\"SK01\",\"skeleton scape\":\"skeleton scape\",\"sketch-book\":\"落描帳\",\"skew\":\"SKEW\",\"skirt tsuki\":\"スカートつき\",\"sklabel\":\"SKlabel\",\"skug\":\"SKUG\",\"skunks\":\"スカンクス\",\"sky daruton gyokuza\":\"天空怠豚玉座\",\"sky lounge garden\":\"Sky Lounge Garden\",\"sky walk\":\"Sky Walk\",\"skycolours\":\"SkycolourS\",\"skyworks\":\"SKYワークス\",\"sl\":\"SL\",\"slaman bokujou\":\"すらまん牧場\",\"slamp\":\"すらんぷ\",\"slap-stick\":\"スラップスティック\",\"slapstickstrike\":\"SlapStickStrike\",\"slavedoll\":\"SlaveDoll\",\"slavenir\":\"スレイブニール\",\"sledgehammerout\":\"SledgehammerOut!\",\"sleeper\":\"Sleeper\",\"sleeping helianthus\":\"Sleeping Helianthus\",\"sleepwatch.ex\":\"寝ヲチEX\",\"slice wakame\":\"スライスわかめ\",\"slime eer\":\"スライムイール\",\"slime mint\":\"すらいむみんと\",\"slime teishoku\":\"スライム定食\",\"slimy alpha\":\"スライミーアルファ\",\"slip bounds\":\"Slip Bounds\",\"sludge\":\"sludge\",\"slump life\":\"すらんぷらいふ\",\"slw\":\"SLW\",\"small dog\":\"Small Dog\",\"small gift\":\"Small Gift\",\"smat.\":\"smat.\",\"smocle\":\"smocle\",\"smokin sick style\":\"Smokin' Sick Style\",\"smooth\":\"smooth\",\"sms\":\"SMS\",\"smuggler\":\"SMUGGLER\",\"smysle\":\"SMYSLE\",\"snack factory\":\"スナック・ファクトリー\",\"snack yoshie\":\"スナックよし江\",\"snake foot\":\"Snake foot\",\"sniff dogs\":\"Sniff Dogs\",\"snob nerd works\":\"SNOB NERD WORKS\",\"snow child\":\"Snow child\",\"snow ice\":\"Snow Ice\",\"snow ring\":\"Snow Ring\",\"snowdance\":\"SNOWDANCE\",\"snowgale\":\"SnowGale\",\"snowrich\":\"すのーりっち\",\"so much in luv\":\"sO mUCH iN LUV\",\"so-matou\":\"そーま党\",\"soar\":\"Soar\",\"soba to mayo\":\"蕎麦とマヨ\",\"soba udon\":\"そばうどん\",\"sobabu\":\"蕎麦部\",\"sobakara\":\"そばから\",\"sobalabo\":\"sobalabo\",\"sobaworks\":\"sobaworks\",\"socarrat\":\"socarrat\",\"soda batake\":\"苏打畑\",\"soda rain\":\"Soda Rain\",\"sodenosumi\":\"袖の墨\",\"sodomutogomora\":\"ソドムトゴモラ\",\"soft circle courreges\":\"ソフトさ～くるクレージュ\",\"soft on omanko\":\"SOFT ON OMANKO\",\"soft thigh\":\"Soft Thigh\",\"soitsu wa yabee\":\"そいつはヤベェ!\",\"soket equals pocket\":\"そけっと=ぽけっと\",\"soko\":\"倉庫\",\"sokotsuya baker\":\"粗忽屋ベイカー\",\"sokuochi neurosis\":\"即堕ちノイローゼ\",\"solala\":\"solala\",\"solar milk soft\":\"そらみるソフト\",\"solarray\":\"ソーラレイ\",\"soleil\":\"Soleil\",\"solex\":\"SOLEX\",\"solid air\":\"SOLID AIR\",\"soloistick\":\"ソリスティック\",\"soloship\":\"ソロシップ\",\"some leaves\":\"SOME LEAVES\",\"somnia\":\"somnia\",\"sondake.\":\"そんだけ。\",\"sonei danchi\":\"村営団地\",\"sonflower\":\"sonflower\",\"sonic\":\"そにっく\",\"sonic star\":\"SONIC STAR\",\"sonic winter\":\"SONIC WINTER\",\"sonnet\":\"Sonnet\",\"sonograph\":\"sonograph\",\"sonohigurashi\":\"その日ぐらし\",\"sonotaozey\":\"その他大勢\",\"sora mint\":\"ソラミント\",\"sora no colors\":\"空のCOLORS\",\"sora no sakura\":\"そらのさくら\",\"sora osen nantai neko\":\"空汚染軟体猫\",\"sora wa chimidoro\":\"空は血みどろ\",\"sorabatake\":\"そらばたけ\",\"soragokoro\":\"そらごころ\",\"soragoto\":\"空言\",\"sorahima\":\"そらひま\",\"sorairo march\":\"空色まーち\",\"sorairo panda\":\"空色パンダ\",\"sorairo telephone\":\"ソライロテレフォン\",\"soramimi\":\"そらみみ\",\"soramune\":\"そらむね\",\"sorasore\":\"そらそれ\",\"soratobu mighty python\":\"空飛ぶマイティ・パイソン\",\"soratobu umeboshi\":\"空飛ぶうめぼし\",\"sorekara\":\"それから\",\"soreya\":\"其レ屋\",\"soronosanchi\":\"そろのさん家\",\"sorudeia\":\"そるでいあ\",\"soseidoh\":\"想成堂\",\"sosl\":\"SOSL\",\"sou soul\":\"Sou Soul\",\"souchou bazooka\":\"早朝バズーカ\",\"souchou no koubou\":\"曹長の工房\",\"sougetsutei\":\"双月亭\",\"souju\":\"蒼樹\",\"souka sentou\":\"双花仙桃\",\"soukai fusso\":\"蒼海☆フッ素\",\"soukentyaya\":\"想見茶屋\",\"souko\":\"倉庫\",\"soukuu\":\"蒼空\",\"soukyuutendou\":\"蒼穹天堂\",\"soul magic\":\"そうるまぢっく\",\"soulfly\":\"SOULFLY\",\"soulsonic\":\"soulsonic\",\"souma books\":\"SOUMA BOOKS\",\"sound milk\":\"SOUND MILK\",\"sounds good\":\"Sounds Good\",\"soundvillage\":\"SoundVillage\",\"sousaku sekkei benran\":\"創作設計便覧\",\"souseiji\":\"創精児\",\"southern blue sky\":\"サザンブルースカイ\",\"souzai soft\":\"そうざいそふと\",\"soy-darake\":\"SOYだらけ\",\"soyoking\":\"ソヨキング\",\"space baron\":\"宇宙男爵\",\"space cat\":\"スペースキャット\",\"space whale\":\"スペースくじら\",\"special action force\":\"SPECIAL ACTION FORCE\",\"speed\":\"SPEED\",\"speed of sound\":\"Speed of Sound\",\"spelflare\":\"すぺるふれあ\",\"spellcaster.\":\"spellcaster.\",\"spermagic\":\"スペルマジック\",\"spermaniax\":\"スペルマニアックス\",\"spermation\":\"スペルメーション\",\"sphere garden\":\"SPHERE GARDEN\",\"spica\":\"♡Spica\",\"spicia\":\"すぱぃしあ\",\"spiciacrow\":\"SpiciaCrow\",\"spicy daisakusen\":\"スパイシー大作戦\",\"spicy loves heaven\":\"スパイシーラブスヘブン\",\"spiel\":\"spiel\",\"spika07\":\"spika07\",\"spinergy\":\"SPINERGY\",\"spira mirabilis\":\"スピラ・ミラビリス\",\"spiral\":\"すぱいらる\",\"spirit-edge\":\"Spirit-Edge\",\"splush wave\":\"SPLUSH WAVE\",\"spongehead\":\"スポンジヘッド\",\"spookyhouse\":\"spookyhouse\",\"spread happiness\":\"Spread Happiness\",\"sprechchor\":\"シュプレヒコール\",\"spring castle\":\"spring castle\",\"springlove\":\"SpringLOVE\",\"sprinkler of calpis\":\"Sprinkler of かるぴす\",\"sprout\":\"SPROUT\",\"spt\":\"SPT\",\"spunk\":\"Spunk!\",\"sputnik\":\"すぷーとにく\",\"spy\":\"SPY\",\"squall\":\"Squall\",\"sr inma no mori\":\"SR 淫魔ノ森\",\"srats\":\"SRATS\",\"ssb\":\"SSB\",\"ssc\":\"SSC\",\"ssdl\":\"SSDL\",\"ssize\":\"Ssize\",\"sst\":\"SST\",\"st 3point\":\"St 3point\",\"st. different\":\"St. Different\",\"st. ochappa\":\"St.おちゃっぱ\",\"st. rio\":\"聖＝リオ\",\"staffing\":\"スタッフィング\",\"stain.\":\"Stain.\",\"stakhanovite movement\":\"スタハノフ運動\",\"stametch\":\"STAMETCH!\",\"stand erection\":\"スタンドエレクション\",\"stand play\":\"STAND PLAY\",\"star berry\":\"STAR BERRY\",\"star fall\":\"STAR FALL\",\"star parlor\":\"STAR PARLOR\",\"stargazer\":\"STARGAZER\",\"starlit sky\":\"Starlit Sky\",\"starmine18\":\"Starmine18\",\"starry sky\":\"Starry Sky\",\"starworks\":\"STARWORKS\",\"stasis\":\"ステイシス\",\"state of see\":\"ステートオブシー\",\"statice\":\"スターチス\",\"status doku\":\"ステータスどく\",\"stay gold\":\"STAY GOLD\",\"steam bread factory\":\"すちーむぶれっどふぁくとりー\",\"steel mayonnaise\":\"Steel Mayonnaise\",\"steelact\":\"STEELACT\",\"stellar\":\"STELLAR\",\"stencil step\":\"ステンシルステップ\",\"steppen wolf\":\"STEPPEN WOLF\",\"stew ni gohan\":\"シチューにごはん\",\"stick number\":\"ステック なんばー\",\"still\":\"Still\",\"stk\":\"STK\",\"stm\":\"STM\",\"stoic romance\":\"Stoic Romance\",\"stone heads\":\"STONE HEADS\",\"stonecake\":\"stonecake\",\"stonemason\":\"stonemason\",\"stop-ten\":\"STOP店\",\"storm\":\"STORM\",\"storm hammer\":\"STORM HAMMER\",\"straight\":\"Straight\",\"strand kyokusen gai\":\"ストランド曲線街\",\"strange beast\":\"ストレンジビースト\",\"strange coquetry\":\"ストレンジコケットリー\",\"strange pop\":\"STRANGE POP\",\"strangesagittarius\":\"StrangeSagittarius\",\"stratos\":\"STRATOS\",\"stratosphere\":\"ストラトスフィア\",\"strawberry\":\"すとろべりー\",\"strawberry and tea\":\"いちごと紅茶\",\"strawberry nipple\":\"ストロベリーにっぷる\",\"strawberry shower\":\"すとろべりーシャワー\",\"straymoon\":\"StrayMoon\",\"stream of creek\":\"STREAM OF CREEK\",\"strega\":\"STREGA\",\"stripe orange\":\"stripe orange\",\"stripeg\":\"stripeg\",\"stroll in the woods\":\"STROLL IN THE WOODS !! -森林浴-\",\"strong7\":\"STRONG7\",\"sts\":\"宇宙旅行協会\",\"studio 7\":\"Studio 7\",\"studio americ\":\"スタジオアメリック\",\"studio anshin\":\"STUDIOあんしん\",\"studio anteros\":\"スタジオ・アンテロス\",\"studio aqa\":\"Studio AQA\",\"studio awake\":\"スタジオ★アオーク\",\"studio b9\":\"Studio B9\",\"studio baki\":\"STUDIO BAKI\",\"studio bass line\":\"STUDIO BASS LINE\",\"studio berserk\":\"Studioベルセック\",\"studio boto-master\":\"すたじおぼとますたあ\",\"studio cardamom\":\"STUDIO カルダモン\",\"studio charen\":\"すたじおちゃれん\",\"studio claim\":\"STUDIO CLAIM\",\"studio cute\":\"Studio Cute\",\"studio d-suke\":\"STUDIO D-Suke\",\"studio daiya alt\":\"スタジオ・ダイヤ・オルタ\",\"studio dellforce\":\"STUDIOデルフォース\",\"studio dia\":\"スタジオ・ダイア\",\"studio diamond\":\"スタジオ・ダイヤ\",\"studio dimple\":\"スタジオDimple\",\"studio erohouse\":\"スタジオエロハウス\",\"studio f\":\"スタジオ・エフ\",\"studio fatality\":\"STUDiO FATALITY\",\"studio fng\":\"studio FNG\",\"studio fuck\":\"STUDIO FUCK\",\"studio gaudi\":\"Studio Gaudi\",\"studio gomasenbe\":\"STUDIO GOMASENBE\",\"studio gorenuke\":\"スタジオGORENUKE\",\"studio hamachigumi\":\"STUDIOはまち組\",\"studio hamburg\":\"すたじおはんばーぐ\",\"studio hofu-na kaihou sen2\":\"STUDIOホフーナ解放戦線\",\"studio hoshiwatari\":\"Studio 星渡\",\"studio hp plus\":\"STUDIO HP+\",\"studio implant\":\"Studio Implant\",\"studio insane\":\"Studio Insane\",\"studio ipponzeoi\":\"スタジオ一本背負い\",\"studio jam\":\"STUDIO JAM\",\"studio jaren\":\"STUDIO 邪恋\",\"studio jibeta\":\"studio jibeta\",\"studio jikkenshitsu\":\"すたじお実験室\",\"studio k\":\"すたぢおK\",\"studio kakinoha-zaka\":\"STUDIO柿ノ葉坂\",\"studio kame\":\"スタジオ カメ\",\"studio katsudon\":\"スタジオかつ丼\",\"studio kimigabuchi\":\"スタジオKIMIGABUCHI\",\"studio kom\":\"スタジオコム\",\"studio kyawn\":\"スタジオきゃうん\",\"studio lood\":\"STUDIO LOOD\",\"studio loud in school\":\"STUDIO LOUD IN SCHOOL\",\"studio m nda pon\":\"スタジオMんだPON\",\"studio mark ii\":\"スタジオMARKII\",\"studio min\":\"STUDIO Min\",\"studio miris\":\"すたじおみりす\",\"studio mukon\":\"スタジオ夢魂\",\"studio n.ball\":\"スタジオN・BALL\",\"studio nadeshiko\":\"スタジオナデシコ\",\"studio narazuke\":\"スタジオ奈良漬\",\"studio naze\":\"スタジオ名瀬\",\"studio neko kick\":\"スタジオねこキック\",\"studio neko punch\":\"スタジオねこぱんち\",\"studio neo black\":\"Studio Neo Black\",\"studio nunchaku\":\"スタジオヌンチャク\",\"studio omg\":\"スタジオOMG\",\"studio orca\":\"studioオルカ\",\"studio p.m.y\":\"Studio P.M.Y\",\"studio pakira\":\"Studio PAKIRA\",\"studio paradise\":\"STUDIO PARADISE\",\"studio parfe\":\"すたじおぱふぇ\",\"studio parm\":\"Studio★ParM\",\"studio pastel\":\"Studio Pastel\",\"studio pelqurappe\":\"STUDIOぺるくらっぺ\",\"studio pork\":\"スタジオポーク\",\"studio q\":\"すたぢおQ\",\"studio r\":\"すたじおあ～る\",\"studio rakkyou\":\"スタジオらっきょう\",\"studio retake\":\"スタジオリテイク\",\"studio runaway wolf\":\"STUDIO RUNAWAY WOLF\",\"studio ryokucha\":\"すたじお緑茶\",\"studio-sakura\":\"Studio-Sakura\",\"studio sample\":\"Studio SAMPLE\",\"studio sepia\":\"スタジオセピア\",\"studio sfc\":\"スタジオSFC\",\"studio sharaku\":\"STUDIO写裸苦\",\"studio skb\":\"スタジオSKB\",\"studio southpaw\":\"スタジオサウスポー\",\"studio strike\":\"スタジオストライク\",\"studio sunadokei\":\"studio砂時計\",\"studio sushi kui-ne\":\"すたじお寿司くいねぇ\",\"studio tagata\":\"studio TAGATA\",\"studio tamo\":\"スタジオTAMO\",\"studio tapa tapa\":\"すたじお☆たぱたぱ\",\"studio tar\":\"スタジオた～\",\"studio the devil\":\"Studio The DEVIL\",\"studio tiamat\":\"STUDIO TIAMAT\",\"studio triumph\":\"STUDIO TRIUMPH\",\"studio ubai\":\"スタジオ奪\",\"studio walk\":\"studio WALK\",\"studio woruto\":\"すたぢおヲルト\",\"studio z-agnam\":\"スタジオZ-AGNAM\",\"studio z.m\":\"STUDIO Z.M\",\"studio zonzai\":\"STUDIOぞんざい\",\"studio-74\":\"Studio-74\",\"studio.h.a.o\":\"Studio.好\",\"studio187\":\"studio187\",\"studio309\":\"Studio309\",\"studio30neko\":\"Studio30NEKO\",\"studios\":\"StudioS\",\"stuntmans\":\"スタントマンズ\",\"style-c3\":\"スタイルシースリー\",\"stylish marunage\":\"スタイリッシュ丸投げ\",\"styworks\":\"STYworks\",\"subachikyu\":\"すばちきゅ!\",\"subapai-jigyobu\":\"すばパイ事業部\",\"subaruen himawarigumi\":\"すばる園ひまわり組\",\"subcontract studio\":\"SUBCONTRACT STUDIO\",\"subesube tsukiyo\":\"すべすべ月夜\",\"subesube1kg\":\"すべすべ1kg\",\"subliminal daikaiten\":\"サブリミナル大回転\",\"subsonic factor\":\"Subsonic Factor\",\"succubus\":\"Succubus\",\"sucharaka knight\":\"すちゃらか騎士!\",\"suck drop bambies\":\"Suck Drop Bambies\",\"sudachic\":\"すだちっく\",\"sudou factory\":\"すどーファクトリー\",\"suedama\":\"スヱダマ\",\"suezen\":\"据えZEN\",\"sugahouse\":\"スガハウス\",\"sugar house\":\"シュガーハウス\",\"sugar maple\":\"SUGAR MAPLE\",\"sugar star\":\"Sugar Star\",\"sugareya shouten\":\"すがれや商店\",\"sugarspot\":\"SUGAR(S)POT\",\"sugiya\":\"杉屋\",\"sugofire\":\"SUGOFIRE\",\"sugoi ikioi de\":\"すごい勢いで\",\"sugusoko\":\"すぐそこ\",\"suhamaya\":\"洲浜屋\",\"sui sui works\":\"スイスイワークス\",\"suichuu white\":\"水中ホワイト\",\"suika dokei\":\"すいか時計\",\"suikanotane\":\"すいかのたね\",\"suinose\":\"すいのせ\",\"suiren\":\"翠憐\",\"suishoku sendan\":\"翠色戦団\",\"suiteibuin\":\"推定部員\",\"suitekiya\":\"水滴屋\",\"suizokukan\":\"睡族館\",\"sukapon-do\":\"スカポン堂\",\"sukaradog\":\"SUKARADOG\",\"sukebe time\":\"SUKEBE TIME\",\"sukerasparo\":\"SukeraSparo\",\"suketamaya\":\"スケタ魔屋\",\"sukidarake\":\"すきだらけ\",\"sukiiro sekai\":\"スキイロセカイ\",\"sukima sangyou\":\"スキマ産業\",\"sukimakaze honpo\":\"スキマ風本舗\",\"sukinishitai\":\"すきにし隊\",\"sukoburumers\":\"すこぶるまぁズ\",\"sukoyaka collagen\":\"すこやかコラーゲン\",\"sukuri umu\":\"すくりうむ\",\"sumeragi designs\":\"皇DESIGNS\",\"sumicco.\":\"すみっこ。\",\"sumikko\":\"すみっこ\",\"sumire club\":\"スミレ倶楽部\",\"sumisumi dou\":\"スミスミ堂\",\"summer child\":\"SUMMER CHILD\",\"sumomo dou\":\"すもも堂\",\"sunadokei to enpitsu\":\"砂時計と鉛筆\",\"sunagimo.\":\"すなぎも。\",\"sunday shower\":\"SUNDAY SHOWER\",\"sunezumi fauvism\":\"素鼠フォーヴィスム\",\"sunomono purin\":\"すのもの☆ぷりん\",\"sunroad travellers\":\"Sunroad Travellers\",\"sunset dreamer\":\"サンセットドリーマー\",\"sunsetmoon\":\"SunsetMoon\",\"sunsun lab\":\"サンサンLAB\",\"sunyiru\":\"すにぃる\",\"super colorful\":\"スーパーカラフル\",\"super ichigo-chan\":\"スーパーイチゴチャン\",\"super sentou\":\"スーパー銭湯\",\"super usagi comic\":\"スーパーウサギコミック\",\"superbad\":\"スーパーバッド\",\"supplement\":\"サプリメント\",\"supplemental\":\"サプリメンタル\",\"supposo\":\"スッポソ\",\"supurabi\":\"すぷらび\",\"suraimu no youna nanika\":\"すらいむのような何か\",\"surface\":\"Surface\",\"surface tension\":\"Surface Tension\",\"suriko gi\":\"すりこギ部\",\"surumenium\":\"スルメニウム\",\"survive\":\"survive\",\"sus\":\"SUS\",\"susano arashi\":\"スサノアラシ\",\"sushi-go-round\":\"回転寿司\",\"sushi-ya\":\"寿司屋\",\"sushiya.\":\"スシヤ。\",\"sutaco rider\":\"スタコライダー\",\"suteiburus\":\"すていぶるず\",\"suvwave\":\"SUVWAVE\",\"suwatteru\":\"座ってる\",\"suzome\":\"酢ぞめ\",\"suzuki shouten\":\"鈴木商店\",\"suzukure\":\"涼暮\",\"suzume no miya\":\"雀の宮\",\"suzumeno\":\"すずめの\",\"suzumeya\":\"すずめや\",\"suzunaridou\":\"鈴鳴堂\",\"suzune rai chikashitsu\":\"鈴根らい地下室\",\"suzuneiro\":\"すずねいろ\",\"suzuneya ni youkoso\":\"スズネ屋にようこそ\",\"suzupony\":\"すずぽに\",\"suzuran\":\"鈴蘭\",\"suzushirodou\":\"蘿蔔堂\",\"swan\":\"スワン\",\"swan mania\":\"スワンマニア\",\"swastika\":\"SWASTIKA\",\"sweet candle\":\"Sweet Candle\",\"sweet devil\":\"すいーとでびる\",\"sweet girls\":\"Sweet Girls\",\"sweet jasmine\":\"sweet☆jasmine\",\"sweet pea\":\"スイートピー\",\"sweet princess\":\"Sweet Princess\",\"sweet raspberry\":\"スウィートラズベリー\",\"sweet taste\":\"SWEET TASTE\",\"sweetedda\":\"SweetEdda\",\"sweets spaghetti\":\"スイーツスパゲティ\",\"sweetsprite\":\"SweetSprite\",\"swims\":\"SwimS\",\"sxs\":\"SXS\",\"syamisen koubou\":\"三味線工房\",\"sylphian ruby\":\"Sylphian Ruby\",\"sylvia\":\"SYLVIA\",\"symphony\":\"シンフォニー\",\"synchrose\":\"シンクローズ\",\"synthetic garden\":\"Synthetic Garden\",\"syoku\":\"SYOKU\",\"syosyo yakkyoku\":\"処々薬局\",\"syoujyo complete\":\"少女コンプリート\",\"syounen heroine\":\"少年Heroine\",\"syouryu yasui-kai\":\"昇竜安井会\",\"sys3.6.3.\":\"sys3.6.3.\",\"system gzzy\":\"SYSTEM GZZY\",\"syukurin\":\"シュクリーン\",\"syunkasyuutou iinkai\":\"春夏秋冬委員会\",\"syuntyu\":\"春昼\",\"t-court\":\"T-court\",\"t-north\":\"T-NORTH\",\"t-press\":\"T-Press\",\"t-project\":\"T-Project\",\"t-zone\":\"T-ZONE\",\"t.a.k.k.\":\"T.A.K.K.\",\"t.cop\":\"T.cop\",\"t.k.h.k\":\"T・K・H・K\",\"t2 unit\":\"T2 UNIT\",\"t2000\":\"T2000\",\"tabidori\":\"旅鳥\",\"tabisuke to panda\":\"旅輔とパンダ\",\"tabito\":\"旅人\",\"tabitoya\":\"旅人屋\",\"tablet\":\"TABLET\",\"tachikawa juukougyou\":\"タチカワ重工業\",\"tachimukau\":\"タチムカウ\",\"tachineko miya\":\"タチネコ宮\",\"tachinomi-ya\":\"立呑屋\",\"tackle box\":\"たっくるぼっくす\",\"tactical notes\":\"タクティカルノーツ\",\"tadaichidono\":\"ただ一度の\",\"tagamesou\":\"タガメ槽\",\"tai kamaboko\":\"鯛かまぼこ\",\"tai no okashira\":\"鯛のおかしら\",\"taifuu biyori\":\"台風日和\",\"taikan kyohougumi\":\"大鑑巨砲組\",\"taiki ken club\":\"たいけん部!\",\"taiko no tsuki\":\"太古の月\",\"taiku yamori\":\"対空ヤモリ\",\"taikuu works\":\"滞空ワークス\",\"tail\":\"tail\",\"tail of nearly\":\"てーるおぶにやりー\",\"tail spot\":\"ているすぽっと\",\"tailbell\":\"TailBell\",\"tainaikaiki\":\"tainaikaiki\",\"tainone takikomi gohan\":\"たいのね炊き込みご飯\",\"taira mune suki iinkai\":\"平胸好き委員会\",\"tairagi\":\"TAIRAGI\",\"tairyo-tei\":\"大呂亭\",\"taisenshadou kenkyuukai\":\"対戦車道研究会\",\"taishokukannoirowze\":\"大食漢のいろうぜ\",\"taiwan shuppan\":\"タイワン出版\",\"taiyaki\":\"たいやき\",\"taiyaki yaketa\":\"たいやきやけた\",\"taiyako takoyaki\":\"たいやこタコヤキ\",\"taiyosin\":\"太陽神\",\"taiyou no megumi\":\"太陽の恵み\",\"taiyoukei kaihatsu kikou\":\"太陽系開発機構\",\"tak in wonderland\":\"Tak In Wonderland\",\"taka no dan\":\"鷹ノ団\",\"takadoya-tei\":\"たかどや亭\",\"takahamaya\":\"高浜屋\",\"takahashi record-ten\":\"高橋レコード店\",\"takaiwerks\":\"TAKAIWERKS\",\"takamagaharahouraku\":\"高天ヶ原崩落\",\"takane no hanazono\":\"たかねの花園\",\"takaneko\":\"たかねこ\",\"takanicle\":\"てかにくる\",\"takashita-ya\":\"たかした屋\",\"takatans waffen-ss\":\"Takatan's Waffen-SS\",\"takatobiya\":\"タカトビヤ\",\"takaya\":\"たか屋\",\"takayashiki kaihatsu\":\"高屋敷開発\",\"take-chan island\":\"タケチャンアイランド\",\"take-dake\":\"TAKE-DAKE\",\"take3\":\"TAKE3\",\"takeda syouten\":\"武田商店\",\"takedake\":\"武田家\",\"takemaruya\":\"竹○屋\",\"takeout\":\"Takeout!\",\"takeritake daishuukakusai\":\"猛茸大収穫祭\",\"takesatorispa\":\"たけさとりすぱ\",\"taketombo\":\"竹とんぼ\",\"takeuma no tomo\":\"竹馬の友\",\"takeya\":\"たけ家\",\"takeyabu\":\"タケヤブ\",\"takeyamaya\":\"茸山屋\",\"takimoto doujou\":\"滝本道場\",\"takion melo\":\"瀧音MELO\",\"takitate\":\"炊きたて\",\"takkyudou\":\"達急堂\",\"takotsubo club\":\"たこつぼ倶楽部\",\"takotsuboya\":\"蛸壷屋\",\"takoya honpo\":\"多胡屋本舗\",\"takoyaki-batake\":\"たこ焼き畑\",\"taku-tama\":\"たくたま\",\"takuan\":\"たくあん\",\"takumi na muchi\":\"たくみなむち\",\"takumiya\":\"匠屋\",\"tama center\":\"たまセンター\",\"tamafull\":\"tamaFull\",\"tamafuwa\":\"たまふわ\",\"tamagawa enema\":\"多摩川エネマ\",\"tamagobou\":\"玉子房\",\"tamagomura\":\"タマゴ村\",\"tamakakeya\":\"たまかけ屋\",\"tamakiya\":\"環屋\",\"tamakuraya\":\"玖蔵屋\",\"tamamo soft\":\"玉藻ソフト\",\"tamaran koujou\":\"たまらん工場\",\"tamarun\":\"タマラン\",\"tamashii max\":\"魂MAX\",\"tamashu\":\"珠秋\",\"tamatebako\":\"珠手箱\",\"tameshigaki\":\"ためしがき\",\"tamokuteki hall\":\"たもくてきほーる\",\"tamokuteki kuukan\":\"多目的空間\",\"tanaka shouten\":\"田中商店\",\"tanakana\":\"たなかな\",\"tanaura honpo\":\"棚裏本舗\",\"tanbo\":\"田圃\",\"tanden shuzou\":\"丹田酒蔵\",\"tanetsuke ichinengo\":\"種付け一年後\",\"tange kentou club\":\"丹下拳闘倶楽部\",\"tangerine\":\"Tangerine\",\"tangerine ward\":\"Tangerine Ward\",\"tanmatsu ijou\":\"端末異常\",\"tanoma-project\":\"たのまーproject\",\"tanoshiitake\":\"たのしいたけ\",\"tanpanizm\":\"タンパニズム\",\"tanpatsu kikaku\":\"短髪企画\",\"tanpatsuism\":\"短髪イズム\",\"tanpopo\":\"■■■たんぽぽ■■■\",\"tanpopo suisan\":\"たんぽぽ水産\",\"tansan senbei\":\"タンサンセンベイ\",\"tanuki ichiba\":\"たぬき市場\",\"tanuki no sato\":\"狸の里\",\"tanuki no takarabako\":\"たぬきの宝箱\",\"tanuki riot\":\"たぬき・らいおっと\",\"tanukian\":\"たぬき庵\",\"tanuking sleep\":\"たぬきんぐすりーぷ\",\"taob\":\"TAOB\",\"tapioca box\":\"タピオカボックス\",\"tarako cream\":\"たらこクリーム\",\"tarako koubou\":\"たらこ工房\",\"tarakospa\":\"タラコスパ\",\"taranbo\":\"タランボ\",\"tarapo\":\"TARAPO\",\"tarchi\":\"Tarchi\",\"taromochian\":\"太呂餅庵\",\"tarots\":\"TAROTS\",\"tarugun\":\"たるぐん\",\"tata\":\"TATA\",\"tatazumai\":\"タタズマイ\",\"tate\":\"殺陣\",\"tate-a-tate\":\"tate-A-tate\",\"tateana juukyo\":\"竪穴住居\",\"tategami 5tyoume\":\"たてがみ5丁目\",\"tatesima.\":\"タテシマ。\",\"tateyama engineering\":\"館山エンジニアリング\",\"tatintotarte\":\"たたんとたると\",\"tatsu no otoshigo\":\"たつのおとしご\",\"tatsumaki koutei\":\"たつまき皇帝\",\"tatsunoyorozuya\":\"辰ノ万屋\",\"taurin 1 oku\":\"タウリン1億\",\"tax inn\":\"Tax inn\",\"tayo\":\"たよ\",\"tayutaya\":\"たゆた屋\",\"tbk\":\"TBK\",\"tcl art 178-2\":\"TCL ART 178-2\",\"tcnc\":\"tcnc\",\"tdtk\":\"TDTK\",\"tea bullet\":\"TEA BULLET\",\"teabreak scriptea\":\"混沌レディースタジオ\",\"team almond\":\"Team Almond\",\"team crepe sucre\":\"Team Crepe Sucre\",\"team harenchi\":\"Teamはれんち\",\"team ibm\":\"Team IBM\",\"team inazuma\":\"Team Inazuma\",\"team kihara\":\"チームキハラ\",\"team oto deli\":\"Teamおと♂デリ\",\"team plus-y\":\"チームプラスY\",\"team princess\":\"TEAM PRINCESS\",\"team sazandora\":\"チームサザンドラ\",\"team shuffle\":\"TEAM SHUFFLE\",\"team tanabe\":\"田辺組\",\"team twin devils\":\"Team Twin Devils\",\"team zero\":\"TEAM ZERO\",\"team-weak tail\":\"Team-weak tail\",\"team.mk\":\"Team.MK\",\"teamjoker\":\"TeamJOKER\",\"teamtgs\":\"teamTGs\",\"tecchitecchi\":\"テッチテッチ\",\"technibuster\":\"TECHNIBUSTER\",\"techno break izonshou\":\"テクノブレイク依存症\",\"technobrake\":\"TechnoBrake\",\"technomics.\":\"てくのみくす。\",\"technos a\":\"テクノスA\",\"tecmet\":\"TECMET\",\"tedaingu\":\"てだいんぐ\",\"teddy-plaza\":\"TEDDY-PLAZA\",\"teemonk\":\"てえもんく\",\"tei hanpatsu purin\":\"低反発ぷりん\",\"teihatu syouzyo titai\":\"剃髪少女地帯\",\"teikoku uchugun\":\"帝国宇宙軍\",\"teiltype\":\"TEILTYPE\",\"teionyakedo\":\"低音火傷\",\"teisoku sonic\":\"低速ソニック\",\"teito bouei ryodan\":\"帝都防衛旅団\",\"teketo\":\"TEKETO\",\"tekireiki ni shokuchuudoku\":\"適齢期に食中毒\",\"tekitou\":\"適当\",\"tekkamaki\":\"鉄華巻\",\"tekken dynamite\":\"鉄拳ダイナマイト\",\"tekken neko gourmet\":\"鉄拳ねこグルメ\",\"tekkou girls\":\"鉄甲ガールズ\",\"tekokids\":\"てこきっず\",\"telenet japan\":\"日本テレネット\",\"telluru\":\"telluru\",\"telomerena\":\"てろめあな\",\"temaemiso-koubou\":\"手前みそ工房\",\"temari cat\":\"てまりきゃっと\",\"temparing\":\"テンパりんぐ\",\"tempest\":\"てんぺすと\",\"temple\":\"TEMPLE\",\"ten\":\"TEN\",\"ten no katsuraya\":\"天のカツラ屋\",\"ten plus aku\":\"てん+あく\",\"tenburi\":\"てんぶり\",\"tenchuugumi\":\"天誅組\",\"tenda\":\"TENDA\",\"tendou\":\"てん堂\",\"tendou kikaku\":\"天童企画\",\"tendoushi\":\"天堂紙\",\"tengai aku juumonji\":\"天外悪十文字\",\"tengallonhat\":\"Tengallonhat\",\"tengohambre\":\"tengohambre\",\"tengu kotengu\":\"テングコテング\",\"tengu no tsuzura\":\"天狗のつづら\",\"tengu syoukougun\":\"天狗症候群\",\"tengudou\":\"テング堂\",\"tenguren\":\"天愚連\",\"tengusa\":\"テングサ\",\"tengsten\":\"テングステン\",\"tenhaii\":\"天海一\",\"tenjo kakuhen\":\"天井確変\",\"tenjou renge\":\"天上蓮華\",\"tenju-rengoku\":\"天樹恋獄\",\"tenkafubu rengou\":\"天下布武連合\",\"tenkigumi\":\"てんきぐみ\",\"tenku-dou\":\"纏苦堂\",\"tenkuu bokujou\":\"天空牧場\",\"tennen doumei\":\"天然同盟\",\"tennen menbou\":\"てんねん綿棒\",\"tennentagayasan\":\"天然たがやさん\",\"tenny le tai\":\"テニーレ隊\",\"tenohira tambourine\":\"てのひらタンバリン\",\"tenotsukyu\":\"天乙宮\",\"tenpura kobo\":\"てんぷら工房\",\"tenrake chaya\":\"てんらけ茶屋\",\"tenshi syndrome\":\"天子震度籠娘\",\"tenshindo\":\"天津堂\",\"tentendou\":\"てんてん堂\",\"tenya wanya\":\"てんやわんや\",\"tenyati\":\"TenYati\",\"tenzan koubou\":\"天山工房\",\"terada naoko\":\"寺田尚子\",\"teraoka digital works\":\"寺岡デジタルワークス\",\"terebi-san\":\"てれびさん\",\"terios\":\"テリオス\",\"teriyaki-sabo\":\"てりやき茶房\",\"terminus aqua\":\"ターミナスアクア\",\"ternotte\":\"ternotte\",\"terolin soft\":\"てろりんソフト\",\"terralunar\":\"テラルナ\",\"terrarium\":\"Terrarium\",\"terrorize\":\"てららいず\",\"teruo haruo\":\"てるおはるお\",\"teruterubocchi\":\"てるてるぼっち\",\"tesla pod\":\"てすらpod\",\"tesuri no post\":\"手すりのポスト\",\"tetchan hato\":\"てっちゃんハト\",\"tete a tete fragile\":\"tete a tete fragile\",\"tete-a-tete\":\"tete-a-tete\",\"tetrapod\":\"Tetrapod\",\"tetrara\":\"TETRARA\",\"tetrascope\":\"TetraScope\",\"tetratech\":\"テトラテック\",\"tetravortex\":\"テトラボルテックス\",\"tetrodotoxin\":\"TETRODOTOXIN\",\"tetsu no otoshigo\":\"てつのおとしご\",\"tetsugakuteki zombie\":\"哲学的ゾンビ\",\"tetsukazuno ao.\":\"手つかずの青。\",\"tetsukuzuya\":\"鉄屑屋\",\"tex-mex\":\"TEX-MEX\",\"tga\":\"TGA\",\"th4\":\"Throttle/4\",\"the flyers\":\"THE FLYERS\",\"the fuckin toyzaras\":\"The Fuckin Toyzaras\",\"the gentry\":\"The Gentry\",\"the giveup pose\":\"もうだめぽ\",\"the horizon\":\"The HORIZON\",\"the hyperman\":\"THE HYPERMAN\",\"the knight of the pants\":\"パンツ騎士団\",\"the latest engine\":\"fujiyama takashi\",\"the mistress of the adriatic\":\"アドリア海の女王\",\"the monthly istanbul\":\"月刊イスタンブール\",\"the rettoukan\":\"THE 劣等感\",\"the saturn\":\"THE SATURN\",\"the seventh sign\":\"The Seventh Sign\",\"theeshakya\":\"ザ借家\",\"the super dimension dirty empire\":\"超時空猥褻帝国\",\"the world\":\"The World\",\"the-franken\":\"THE・FRANKEN\",\"the-paper\":\"THE-PAPER\",\"theory of heaven\":\"Theory of HEAVEN\",\"third brand\":\"THIRD BRAND\",\"third foot\":\"サードフット\",\"thisarmor\":\"ThisArmor\",\"thompon\":\"とむぽん\",\"three m\":\"すりーえむ\",\"threecords\":\"スリーコーズ\",\"threshold\":\"スレッショルド\",\"thrylos\":\"Thrylos\",\"thw.jp\":\"THW.jp\",\"tiare\":\"ティアラ\",\"tick\":\"擽—Tick—\",\"tico tico\":\"TICO TICO\",\"ticotico\":\"TICOTICO\",\"tiger 79\":\"Tiger☆79\",\"tiger roman\":\"タイガーロマン\",\"timatima\":\"ちまちま\",\"time-leap\":\"time-leap\",\"timplu\":\"ティンプラ\",\"tinkerbell\":\"てぃんかーべる\",\"tinkle position\":\"Tinkle Position\",\"tiny potato\":\"Tiny potato\",\"tinyking\":\"TinyKing\",\"tipoplaza\":\"ティポプラーザ\",\"tiramisu\":\"Tiramisu\",\"tiramisu tart\":\"てぃらみすたると\",\"tirolcat\":\"TirolCat\",\"tistrya\":\"ティシュトリ屋\",\"titancolor brand\":\"チタンカラーブランド\",\"titania\":\"てぃたーにあ\",\"titano-makhia\":\"ティタノマキア\",\"tiusan kingdom\":\"ちうさんキングダム\",\"tk jesus\":\"TKジーザス\",\"tk-brand\":\"TK-Brand\",\"tk-bros\":\"TK-BROS\",\"tkciao\":\"tkciao\",\"tkspower\":\"TKSpower\",\"tlg\":\"ねこのこね\",\"tmg\":\"TMG\",\"tmtkdou\":\"TMTK堂\",\"tnc.\":\"TNC.\",\"toaster\":\"トースター\",\"tobatya2ke\":\"とばちゃづけ\",\"tobihizageri\":\"とびひざげり\",\"tobuchikara\":\"飛ぶちから\",\"toculitoc\":\"とくりとっこ\",\"todd special\":\"トッドスペシャル\",\"tofu on fire\":\"Tofu On Fire\",\"tofu soft\":\"TOFU SOFT\",\"togijiru\":\"とぎじる\",\"toha spiral\":\"とーはスパイラル\",\"tohoippun\":\"徒歩一分\",\"tohoorin\":\"TOHOORIN\",\"toiro no iro\":\"といろのいろ\",\"toitoikai\":\"対々会\",\"tojora-men\":\"東条らーめん\",\"tokachi no kuni\":\"とかちのくに\",\"tokaeshina koubou\":\"トカエシナ工房\",\"tokage 3gou\":\"とかげ3号\",\"tokage juukou\":\"蜥蜴重工\",\"tokage mori\":\"トカゲ森\",\"tokage no shippo\":\"トカゲのしっぽ\",\"tokei to kan co-hi-\":\"時計と缶コーヒー\",\"tokemashita.\":\"とけました。\",\"toketou no bansan\":\"とけとうの晩餐\",\"toki nokogiri\":\"トキノコギリ\",\"tokimigumi\":\"時美組\",\"tokinochaya\":\"時乃茶屋\",\"tokinoseisyo\":\"トキノセイショ\",\"tokkuriya\":\"徳利屋\",\"toko-ya\":\"床子屋\",\"tokohana\":\"とこはな\",\"tokonoma\":\"トコノマ\",\"tokoroten\":\"ところてん\",\"tokoroten house\":\"トコロテンハウス\",\"toku yakusou\":\"特薬草\",\"tokuda\":\"とくだ\",\"tokumei tentai\":\"匿名天体\",\"tokusen ohinasama\":\"特選おひなさま\",\"tokyo bungeling bay yokohama\":\"東京バンゲリングベイ横浜\",\"tokyo circuit\":\"Tokyoサーキット\",\"tokyo continent\":\"東京大陸\",\"tokyo gamachannel\":\"東京ガマチャンネル\",\"tokyo glider\":\"東京グライダー\",\"tokyo lemon\":\"東京檸檬\",\"tokyo ponpon dou\":\"東京ポンポン堂\",\"tokyo tomodachi kouen\":\"東京友達公園\",\"tokyo tsunamushi land\":\"東京つなむしランド\",\"tokyo-rozewomond club\":\"東京ロゼヲモンド倶楽部\",\"tokyusen\":\"東九線\",\"tololinco\":\"とろりんこ\",\"toluene ittokan\":\"トルエン一斗缶\",\"tomas\":\"TOMAS\",\"tomato company\":\"TOMATO COMPANY\",\"tomato kanzume\":\"トマト缶詰\",\"tomato namaashi\":\"トマト生足\",\"tomaya no taki\":\"苫屋の滝\",\"tombstone\":\"Tombstone\",\"tomcat\":\"TomCat\",\"tomofuku\":\"とも福\",\"ton toro\":\"とんとろ\",\"tonari no dagashiya-san\":\"となりの駄菓子屋さん\",\"tondemo awabihime\":\"とんでもあわび姫\",\"tondesu\":\"トンデス\",\"tonkotsu fuumi\":\"とんこつふうみ\",\"tonkotsu yama\":\"トンコツ山\",\"tonnerre gakuen\":\"トネール学園\",\"tonoya\":\"との屋\",\"tonpuuratei\":\"とんぷぅら亭\",\"tonteki teishoku\":\"トンテキ定食\",\"tonten\":\"トンテン\",\"tonton byoushi\":\"とんとんびょーし\",\"tontoro daiyokujou\":\"豚トロ大浴場\",\"tooku no sora\":\"とおくのそら\",\"toon worker\":\"トゥーンワーカー\",\"tooya\":\"十矢\",\"top\":\"TOP\",\"topcat\":\"トップキャット\",\"topgun\":\"TOPGUN\",\"tora koubou\":\"寅工房\",\"tora tamatama\":\"とらたまたま\",\"toragoyashiki\":\"虎小屋敷\",\"toraisix\":\"とらいしっくす\",\"torajima-shi kouhouka\":\"寅島市広報課\",\"torano ori\":\"寅乃檻\",\"toranoe no makimono\":\"とらのえのまきもの\",\"torara studio\":\"トララスタジオ\",\"toratanuza\":\"とらたぬ座\",\"toratepotto\":\"とらてぽっと\",\"toraya\":\"トラ屋\",\"tore\":\"蕩れ\",\"torenia\":\"torenia\",\"tori no oishii tokoro\":\"とりのおいしいところ\",\"tori no sanpomichi\":\"トリの散歩道\",\"tori no ya\":\"鳥の屋\",\"toriaezu kari\":\"とりあえず(仮)\",\"toriaezu nama\":\"とりあえず、生!\",\"toriaridou\":\"トリ有リ堂\",\"toribako\":\"toribako\",\"toriihime\":\"鳥居姫\",\"torimeshi\":\"とり飯\",\"torinabe\":\"Tori鍋\",\"toriniku seikatsu\":\"鶏肉生活\",\"toriwasabi\":\"とりわさび\",\"toriya\":\"トリ屋\",\"toro toro resistance\":\"とろとろレジスタンス\",\"torochidan\":\"とろーち団\",\"toromilk\":\"トロみるく\",\"toroniku yukke\":\"とろにくゆっけ\",\"tororoimo\":\"とろろいも\",\"tortesoft\":\"とるてそふと\",\"toruneko chaya\":\"獲る猫茶屋\",\"torya\":\"TORYA!\",\"tosyoen\":\"凍傷炎\",\"totem pole\":\"トーテムポール\",\"totemo zako\":\"とても雑魚\",\"toto max\":\"toto MAX\",\"toto-taste\":\"ととていすと\",\"totocal land\":\"ととかるLAND\",\"totoki kikaku\":\"十時企画\",\"totonishi\":\"ととにし\",\"totoya\":\"トト屋\",\"totsugasa\":\"凸傘\",\"totsugeki tonarino jo-galbi\":\"突撃!となりの上カルビ\",\"totsugeki wolf\":\"突撃ウルフ\",\"tottemodaiji\":\"とってもだいじ\",\"tottorou\":\"totto廊\",\"tottototomekichi\":\"とっとととめきち\",\"touch\":\"TOUCH\",\"touchable\":\"TOUCHABLE\",\"touchin hanten\":\"東珍飯店\",\"toudori no su\":\"トウドリの巣\",\"touenketsu\":\"桃园结\",\"toufuya\":\"燈風屋\",\"tougall kai\":\"東ガル会\",\"touge mine\":\"峠峰\",\"tougechaya\":\"峠茶屋\",\"tougenkyo\":\"桃源郷\",\"tougesakuraya\":\"峠桜屋\",\"touhi kuukan\":\"逃避空間\",\"touhou marupondou\":\"当方丸宝堂\",\"touka biyori\":\"桃花日和\",\"toukaidou\":\"東海堂\",\"toumei kousoku\":\"透明光速\",\"toumei tsuushin\":\"透明通信\",\"tousoku chokusen undou\":\"等速直線運動\",\"toutaku tuyagadou\":\"董卓艶画堂\",\"touyoko surfrider\":\"東横サーフライダー\",\"touyou zatsugidan\":\"東洋雑技団\",\"toxic\":\"toxic\",\"toxic love\":\"ときしっくらぶ\",\"toxic store\":\"Toxic Store\",\"toybox\":\"といぼっくす\",\"tozan bu\":\"TOZAN:BU\",\"tp\":\"tp!\",\"tra-tama ry\":\"トラたま(略)\",\"tracklisko\":\"とらっくりすこ\",\"trample rigger\":\"Trample Rigger\",\"tranceg\":\"TRANCEG\",\"tranquility\":\"Tranquility\",\"trans\":\"トランス\",\"trans soft\":\"トランスソフト\",\"trans tribune\":\"トランス・トリビューン\",\"transgenics.\":\"遺伝子組換え\",\"transient melody\":\"Transient Melody\",\"transistor angel\":\"Transistor Angel\",\"transistor baby\":\"トランジスタベイビィ\",\"transonic\":\"TRANSONIC\",\"transpot\":\"TranSpot\",\"trap\":\"TRAP\",\"trauma\":\"虎馬\",\"trauma2g\":\"trauma2g\",\"traumatize\":\"Traumatize\",\"treat me nice\":\"Treat me nice\",\"tree ga muttsu\":\"ツリーがむっつ\",\"treetop helper\":\"TREETOP Helper\",\"tremolo works\":\"トレモロワークス\",\"trend kill\":\"TREND KILL\",\"tri-k soft\":\"tri-k soft\",\"triad\":\"TRAID\",\"triage tag\":\"TRIAGE TAG\",\"trial3\":\"TriaL3\",\"tribo\":\"TRIBO\",\"trick dream\":\"Trick Dream\",\"trick-color\":\"Trick-Color\",\"tricklot\":\"TrickLot\",\"tridisaster\":\"Tridisaster\",\"trifle\":\"とらいふる\",\"triflehouse\":\"とらいフルハウス\",\"triflingbook\":\"TriflingBook\",\"trigger.m\":\"trigger.m\",\"trinitron cg\":\"トリニトロンCG\",\"trinity kyoudan\":\"トリニティ教団\",\"trinitysaber\":\"トリニティセイバー\",\"trip dancer\":\"TRIP DANCER\",\"trip drip\":\"trip drip\",\"triple luck\":\"Triple Luck\",\"triple n\":\"TRIPLE N\",\"triple pinch\":\"とりぷるぴんち!\",\"triplebunny\":\"TripleBunny\",\"troid-oh\":\"トロイ堂\",\"trok\":\"TRoK\",\"trompeloeil\":\"TROMPELOEILL\",\"troopingout\":\"TROOPINGOUT\",\"tropical sudachi\":\"トロピカルすだち\",\"trough-bird\":\"Trough-Bird\",\"trubka\":\"trubka\",\"true ride\":\"True RIDE\",\"true-bell\":\"True-Bell\",\"trueblue\":\"trueblue\",\"trush\":\"トラッシュ\",\"truth child\":\"Truth Child\",\"tryset break\":\"TRYSET Break\",\"ts naienki\":\"TS内燃機\",\"ts revolver\":\"TSリボルバー\",\"ts-complex2nd\":\"ts-complex2nd\",\"tsk\":\"TSK\",\"tsk-bar\":\"TSK-BAR\",\"tsm\":\"TSM\",\"tsu ga mittsu.\":\"「つ」がみっつ。\",\"tsubo\":\"TSUBO\",\"tsubo r\":\"つぼR\",\"tsuboya\":\"つぼや\",\"tsubuan doumei\":\"つぶあん同盟\",\"tsuchinoko bokujou\":\"つちのこ牧場\",\"tsuinte\":\"ついんて!\",\"tsujigiri cross chop\":\"辻斬りクロスチョップ\",\"tsujikaidou\":\"辻街道\",\"tsukareno\":\"つかれの\",\"tsukasa bullet\":\"司弾\",\"tsuki no kurai bubun\":\"霸\",\"tsuki no mizu kikaku\":\"月の水企画\",\"tsuki to koori no\":\"ツキトコオリノ\",\"tsuki wa koyoi mo kurikaesu\":\"つきはこよいもくりかえす\",\"tsukigami zukan\":\"月神図鑑\",\"tsukiguni\":\"月国\",\"tsukikusa koubou\":\"月草工房\",\"tsukimachi soft\":\"つきまちそふと\",\"tsukimigusa\":\"月見草\",\"tsukimitake\":\"つきみたけ\",\"tsukino chikake ikoku\":\"つきのちかけいこく\",\"tsukinoyuki\":\"つきのゆき\",\"tsukisame koubou\":\"月鮫工房\",\"tsukitake\":\"Tsukitake\",\"tsukiyo no yume\":\"ツキヨノユメ\",\"tsukiyogarasu\":\"月夜鴉\",\"tsukkumo mattoron\":\"つっくもまっとろん!\",\"tsukudani no sato\":\"つくだにの里\",\"tsukune-ya\":\"つくね屋\",\"tsukupare\":\"つくぱれ\",\"tsumarimashita\":\"詰まりました\",\"tsumasaki label\":\"ツマサキレーベル\",\"tsumayoji\":\"つまようじ\",\"tsundere oniku\":\"ツンデレお肉\",\"tsuniverse\":\"tsuniverse\",\"tsunken\":\"ツン研\",\"tsupan\":\"ツパン\",\"tsurezurezuki\":\"徒然月\",\"tsurimura\":\"ツリムラ\",\"tsurugashima heights\":\"鶴ヶ島ハイツ\",\"tsurumachi\":\"鶴町\",\"tsurumiku\":\"つるみく\",\"tsurupeta kenkyuusho\":\"つるぺた研究所\",\"tsurutsuru ippai\":\"つるつるいっぱい\",\"tsurutsuru pain\":\"つるつるぱいん\",\"tsutakazura mau mau\":\"ツタカズラまうまう\",\"tsutsumorien\":\"筒森園\",\"tsxy\":\"tsxy\",\"ttsy\":\"TTSY\",\"tubasa\":\"翼\",\"tuck cross\":\"Tuck Cross\",\"tuiteyukenuyo\":\"ついてゆけぬよ\",\"tukamori club\":\"ツカモリ倶楽部\",\"tukibuto\":\"TUKIBUTO\",\"tukimi atelier\":\"ツキミアトリエ\",\"tumble weed\":\"TUMBLE WEED\",\"tuned by aiu\":\"Tuned by AIU\",\"tunnel\":\"とんねる\",\"tunnel love letter\":\"Tunnel Love Letter\",\"turbanist\":\"たーばにすと\",\"turing game\":\"Turing Game\",\"turning point\":\"Turning Point\",\"turtle cookies\":\"Turtle Cookies\",\"twin heart\":\"TWIN HEART\",\"twin magnet\":\"ツインマグネット\",\"twin tail\":\"TWIN TAIL\",\"twinbunny\":\"Twinbunny\",\"twinkle hearts\":\"twinkle hearts\",\"twinkle snows\":\"twinkle snows\",\"twinkle teacher\":\"てぃんくる☆ティーチャー\",\"twinklestar\":\"ティンクルスター\",\"twinscatear\":\"ついんずかてぃあ\",\"twintel\":\"TWINTEL\",\"two tone color\":\"－・～\",\"two-handed axe\":\"Two-handed Axe\",\"twocraft\":\"TwoCraft\",\"tyatsune\":\"茶常\",\"tyongera kenkyuujo\":\"ちょんげら研究所\",\"type-57\":\"TYPE-57\",\"type-g\":\"Type-G\",\"type-spare\":\"TYPE-SPARE\",\"u-me soft\":\"U・Me SOFT\",\"u-ral\":\"うーらる\",\"u-room\":\"U-ROOM\",\"u-type\":\"U-Type\",\"u.m.e.project\":\"U.M.E.Project\",\"u.r.c\":\"U.R.C\",\"u.zoo\":\"U.ZOO\",\"ua\":\"UA\",\"ub\":\"UB\",\"ubiquitous\":\"ユビキタス\",\"uchinon\":\"うちのん\",\"uchiwa ryou nagon\":\"団扇涼納言\",\"uchizum\":\"UCHIZUM\",\"uchoten\":\"有頂天\",\"uchu\":\"Uchu\",\"uchuu neko-juu kougyou\":\"宇宙猫獣工業\",\"uchuu porta\":\"宇宙☆ポルタ\",\"uchuusen shoujigou\":\"宇宙船庄司号\",\"ucyu-kago\":\"宇宙カゴ\",\"udon-ya\":\"うどんや\",\"uzukikan\":\"卯月館\",\"ueda-san.\":\"ウエダさん。\",\"ugaya 74th\":\"ウガヤ74th\",\"uge connection\":\"UGEコネクション\",\"ugeman\":\"うげ漫\",\"ugokuna pharmacy theta\":\"うごくな薬局θ\",\"ugou no shuu\":\"烏合ノ衆\",\"uguisu kagura\":\"ウグイスカグラ\",\"uguisuya\":\"莺屋\",\"uhii\":\"うひい\",\"uirokai\":\"ういろうかい\",\"uji\":\"蛆\",\"uk-works\":\"UK-WORKS\",\"ukikusaya\":\"うきくさ屋\",\"ultimania\":\"アルティマニア\",\"ultimate works\":\"アルティメットワークス\",\"ultra one\":\"ULTRA ○NE\",\"ultra siccative\":\"ウルトラシッカチーフ\",\"ultra violet\":\"ULTRA Violet\",\"ululun\":\"UluluN\",\"uma goya\":\"UMA小屋\",\"uma no are\":\"うまのあれ\",\"uma no hone\":\"うまのほね\",\"umakatei\":\"うまか亭\",\"umami zeitaku dashi\":\"うまみ贅沢出汁\",\"umanori kishidan\":\"うまのり騎士団\",\"umari-ya\":\"埋まり屋\",\"umasugiyu\":\"うますぎゆ\",\"umaya\":\"厩\",\"umbrella.corp\":\"UMBRELLA.CORP\",\"ume-nyan-tei\":\"うめにゃん亭\",\"umeboshi\":\"梅ぼし\",\"umehimeden\":\"梅姫殿\",\"umekkodo\":\"うめっこ堂\",\"umenonukaduke\":\"うめのぬかづけ\",\"umesuke\":\"梅助\",\"umigarasu madoushi dan\":\"海烏魔道士団\",\"umihan\":\"うみはん\",\"umikaidou\":\"海貝堂\",\"uminari\":\"ウミナリ\",\"uminekotei\":\"うみねこ亭\",\"uminoie hamanasu\":\"海の家はまなす\",\"uminouie\":\"海納家\",\"umipro\":\"umiプロ\",\"un gallo\":\"Un gallo\",\"un-moto shoko\":\"云元書庫\",\"unagi no nedoko\":\"うなぎの寝床\",\"unaginobori\":\"うなぎのぼり\",\"uncats\":\"UNCATS\",\"unceder\":\"アンシーダー\",\"undead\":\"Undead\",\"undel\":\"あんでる\",\"under colony\":\"Under Colony\",\"under control\":\"UNDER CONTROL\",\"underground campaign\":\"Underground Campaign\",\"undermoon\":\"アンダームーン\",\"underwhite\":\"Underwhite\",\"undouken\":\"雲洞軒\",\"uneune-kissa\":\"うねうね喫茶\",\"unfixed\":\"UNFIXED\",\"ungrofish\":\"地下魚!\",\"unholy production\":\"アンホリ☆プロダクション\",\"uni\":\"UNI\",\"unicorn-a\":\"unicorn-a\",\"unimayo chuubou\":\"ウニマヨ厨房\",\"union of the snake\":\"Union of the Snake\",\"unique\":\"ゆにきゅう\",\"unisonshift\":\"ユニゾンシフト\",\"unit cheese\":\"ゆにっとちーず\",\"unitonasubi\":\"うにとなすび\",\"uniuni\":\"uniuni\",\"uniya\":\"雲丹屋\",\"uniyaa\":\"うに屋あ\",\"unizo\":\"うに蔵\",\"unknown\":\"アンノウン\",\"unlucky strike\":\"アンラッキーストライク\",\"unmei no ikasumi\":\"運命のイカスミ\",\"unnunkannun\":\"うんぬんかんぬん\",\"unreal\":\"UNreal\",\"unshuu sakuramochi\":\"温州桜餅\",\"unyarara daihanten\":\"うにゃらら大飯店\",\"uohaman\":\"魚歯満\",\"uotatsu18kinshiten\":\"魚辰一八金支店\",\"uozanoko\":\"うお座の子\",\"upsp\":\"UPSP\",\"ura fmo\":\"裏FMO\",\"ura kent no himitsu kichi\":\"裏KENTの秘密基地\",\"ura makura\":\"裏まくら\",\"ura meshiya\":\"裏飯屋\",\"ura no hikidashi\":\"うらのひきだし\",\"ura no kami\":\"裏のカミ\",\"ura urethan\":\"裏ウレタン\",\"ura.\":\"URA.\",\"urabashi seisaku\":\"裏橋製作\",\"urabb28 gou\":\"uraBB28号\",\"uradoori no nukemichi\":\"裏通りの抜け道\",\"uradora mangan\":\"裏ドラ満貫\",\"uragiri no doukutsu\":\"うらぎりのどうくつ\",\"urahushigi\":\"裏不思議\",\"urainutei\":\"裏イヌ亭\",\"urakaryuu\":\"裏火竜\",\"uraken\":\"うらけん\",\"urakusog\":\"urakusoG\",\"urama mejirushi\":\"裏間目印\",\"uramac\":\"うらまっく\",\"uraniwa\":\"ウラニワ\",\"uraroji\":\"ウラロジ\",\"uraryon kikaku\":\"うらりょん企画\",\"urasazan\":\"うらさざん\",\"urawa anime festa\":\"浦和アニメフェスタ\",\"uraya\":\"ura屋\",\"urban doujin magazine\":\"街中同人誌會\",\"uresen\":\"熟れ専\",\"uresuji awabi\":\"熟レ筋アワビ\",\"ureure kaikai\":\"嬉嬉怪怪\",\"uribox\":\"ウリボックス\",\"urimarutei\":\"うりまる亭\",\"uritz\":\"Uritz\",\"uro\":\"URO\",\"uropyon\":\"うろぴょん☆\",\"urumin\":\"うるみん\",\"ururuc\":\"URURUC\",\"urusai kokuen\":\"うるさい黒鉛\",\"urushiya seitai jikkenshitsu\":\"漆屋生態実験室\",\"us\":\"US\",\"usa gunbu\":\"USA軍部\",\"usaburo\":\"うさブロ！\",\"usacastle\":\"Usacastle\",\"usaden\":\"うさでん\",\"usagi ame\":\"うさぎあめ\",\"usagi no ana\":\"ウサギの穴\",\"usagi no shippo\":\"うさぎのしっぽ\",\"usagi paradise\":\"うさぎパラダイス\",\"usagi purin\":\"うさぎプリン\",\"usagi to kame\":\"うさぎとかめ\",\"usagi youchien\":\"うさぎ幼稚園\",\"usagi youjinbou\":\"うさぎ用心棒\",\"usagigoya\":\"うさぎ小屋\",\"usagijiru\":\"うさぎじる\",\"usagizadou\":\"兎座堂\",\"usamimi syndrome\":\"うさみみしんどろーむ\",\"usanamaco\":\"うさなまこ\",\"usaneri island\":\"うさねり★アイランド\",\"usendou plus 1\":\"優先度+1\",\"ushichichi bokujou\":\"うしちち牧場\",\"ushinokokumairi\":\"ウシノコクマイリ\",\"ushitora-dou\":\"丑寅堂\",\"uso\":\"噓\",\"uso kara makoto\":\"うそからまこと\",\"uso seisakusho\":\"うそ製作所\",\"usoppu land\":\"ウソップランド\",\"usotsuki honey\":\"うそつきHONEY\",\"usui hon hitori roudoku kai\":\"薄い本一人朗読会\",\"usukawa kintsuba\":\"薄皮きんつば\",\"usume sanchi\":\"うすめ産地\",\"utachan honpo\":\"ウタチャンホンポ\",\"utadokei\":\"ウタドケイ\",\"utage\":\"宴\",\"utahime\":\"うたひめ\",\"utakata gentou-ya\":\"泡沫幻燈屋\",\"utakata.\":\"うたかた。\",\"utaneya\":\"うたね屋\",\"utanone dou\":\"うたのね堂\",\"utataneyashiki\":\"転寝屋敷\",\"utinotyutai\":\"ウチの中隊\",\"utsumuki garden\":\"うつむきガーデン\",\"utsusemi shuu\":\"空蝉衆\",\"utsutsutsutsu.\":\"うつつつつ。\",\"uu-zone\":\"UU-ZONE\",\"uwasa no ero radiohead\":\"噂のエロレディオヘッド\",\"uwd\":\"UWD\",\"uxmal\":\"Uxmal\",\"uzigaya\":\"氏賀屋\",\"uzomzo\":\"UZOMZO\",\"uzumaki shikenkan\":\"うずまき試験管\",\"v. hercules\":\"V・ヘラクレス\",\"v muscle\":\"Vまっする\",\"v112cr\":\"ぶい112CR\",\"vachicalist\":\"Vachicalist\",\"vadass\":\"Vadass\",\"vagina dentata\":\"有齒女陰\",\"valiant\":\"VALIAN党\",\"valkyria\":\"わるきゅ～れ\",\"valrhona\":\"VALRHONA\",\"valssu\":\"valssu\",\"vampire berry\":\"Vampire*Berry\",\"vanadis\":\"Vanadis\",\"vanilla sky\":\"VANILLA SKY\",\"vanilla tenrankai\":\"バニラ展覧会\",\"vanilla type\":\"バニラタイプ\",\"vanilla-dou max\":\"バニラ堂MAX\",\"vanishing point.\":\"Vanishing Point.\",\"vanity press\":\"Vanity Press\",\"vashadow\":\"VASHADOW\",\"vegas project\":\"VEGAS PROJECT\",\"velvet rose\":\"Velvet Rose\",\"venus\":\"VENUS\",\"venuspunk\":\"VENUSPUNK\",\"ver.mimizuk\":\"Ver.みみずく\",\"ver9\":\"Ver9\",\"verdant force\":\"Verdant Force\",\"vermiculite\":\"ばーみきゅらいと\",\"vermilion\":\"ばみりおん\",\"verydrop\":\"Verydrop\",\"veto\":\"VETO\",\"viento campanilla\":\"Viento Campanilla\",\"viewness\":\"Viewness\",\"vincent\":\"ヴィンセント\",\"vinegar mackerel\":\"Vinegar Mackerel\",\"violence club\":\"ばいおれんす倶楽部\",\"violet order\":\"VIOLET ORDER\",\"violetstar\":\"Violetstar\",\"vip games\":\"VIP Games\",\"virginal\":\"VIRGINAL\",\"virophilia\":\"virophilia\",\"viscaria\":\"VISCARIA\",\"vista\":\"VISTA\",\"visual biscuits\":\"Visual Biscuits\",\"vitamin gohan\":\"ビタミンごはん\",\"vitamin soft\":\"ビタミン\",\"viva mikinosuke\":\"ビバ・みきのすけ\",\"vivid dot\":\"vivid_dot\",\"vivid flag\":\"Vivid Flag\",\"vivido\":\"ヴィヴィ堂\",\"vm500\":\"VM500\",\"vogelschwein\":\"フォーゲルシュヴァイン\",\"vogue\":\"VOGUE\",\"voice of flower\":\"Voice of flower\",\"voisin\":\"VOISIN\",\"vollmond\":\"VOLLMOND\",\"voltcompany.\":\"VOLTCOMPANY.\",\"volutes\":\"VOLUTES\",\"volvox\":\"VOLVOX\",\"vpans extasy\":\"Vパン'sエクスタシー\",\"vulcannu\":\"ヴぁるかん濡\",\"vulgar bull\":\"VULGAR BULL\",\"vyowolf\":\"vyowolf\",\"w-room\":\"W-ROOM\",\"waage\":\"Waage\",\"wabi sabi wasabi\":\"ワビサビワサビ\",\"wag the dog\":\"Wag The Dog\",\"wagamama dou\":\"我儘堂\",\"wagarashiya\":\"和がらし屋\",\"wagashi-ya\":\"わがし屋\",\"wagaya no kurorekishi\":\"我が家の黒歴史\",\"wainable\":\"ワイナブル\",\"wakamaker\":\"wakamaker\",\"wakayotareso\":\"わかよたれそ\",\"waki waki koubou\":\"わきわき工房\",\"wakusei nostalgia\":\"惑星ノスタルジー\",\"wakusei-teki shukou\":\"惑星的趣向\",\"wakuseiburo\":\"ワクセイブロ\",\"wakuwaku shotaland\":\"わくわくショタランド\",\"walpurgisnacht\":\"Walpurgisnacht\",\"wamusho\":\"わむショ\",\"wando wando\":\"ワンドワンド\",\"wanko-tei\":\"わんこ亭\",\"wankoroya\":\"わんころ屋\",\"wannyan club\":\"ワンニャン倶楽部\",\"wanpaku brothers\":\"わんぱくブラザーズ\",\"wanpaku shoujo\":\"腕白少女\",\"wanton land kumiai\":\"とわんとんランド組合\",\"wanwan oukoku\":\"わんわん王国\",\"wanwan teikoku\":\"わんわん帝国\",\"wanwanhouse\":\"わんわんはうす\",\"wanwano\":\"わんわんお\",\"wappoi\":\"わっぽい\",\"warainaki festa\":\"ワライナキフェスタ\",\"ware pon\":\"われPON\",\"wareago\":\"ワレアゴ\",\"waribashi kouka\":\"割り箸効果\",\"warukuriya\":\"ワルクリ屋\",\"wasabi mochi\":\"わさびもち\",\"wasabiberry jam\":\"Wasabiberry JAM\",\"wasei nekohime\":\"和製猫姫\",\"wasre kaban\":\"忘れカバン\",\"wasshoi koubou\":\"ワッショイ☆工房\",\"waste\":\"Waste\",\"wastepapermarket\":\"WastePaperMarket\",\"wasukoro\":\"わすころ\",\"wasuraruru tegami\":\"忘らるる手紙\",\"watanuki shinguten\":\"綿貫寝具店\",\"watanuki tanuki\":\"わたぬきたぬき\",\"wataridori\":\"わたりどり\",\"wataridori no rakuen\":\"渡り鳥の楽園\",\"watashinchi\":\"わたしンち\",\"water beryl\":\"ウォーターベリル\",\"water closet\":\"water closet\",\"water garden\":\"水の庭\",\"water valley\":\"うぉ～た～ばれ～\",\"watosato\":\"ワトサト\",\"wave\":\"うぇ～ぶ\",\"wawomidasu\":\"和を乱su\",\"wchees\":\"Wchees\",\"web knight\":\"ウェブ乃藤\",\"webstudioofflimits\":\"WebStudioOffLimits\",\"wechselhaft\":\"ヴェクセルハフト\",\"wednesday\":\"Wednesday\",\"wendybell\":\"ウェンディベル\",\"west island\":\"ウエストアイランド\",\"west vision\":\"ウエストビジョン\",\"wheel\":\"ホイール\",\"whirl pool\":\"WHIRL POOL\",\"white clover\":\"ほわいとくろーばー\",\"white croaker\":\"White croaker\",\"white cross\":\"ホワイトクロス\",\"white elephant\":\"WHITE ELEPHANT\",\"white garden\":\"WHITE GARDEN\",\"white heart\":\"WHITE HEART\",\"white identity\":\"White Identity\",\"white lolita\":\"White Lolita\",\"white moon\":\"WHITE MOON\",\"white note\":\"ホワイトノート\",\"white out\":\"WHITE OUT\",\"white roots\":\"white roots\",\"white sail\":\"ホワイトセイル\",\"white spring\":\"White Spring\",\"whiteapple\":\"whiteapple\",\"whitecheese\":\"ほわいとちぃず\",\"whitecute\":\"WhiteCute\",\"whitemoor\":\"WhiteMoor\",\"whitepink\":\"ホワイトピンク\",\"whitewill\":\"WHITEWILL\",\"wi-fe hacker\":\"Wi-Fe hacker\",\"wild duck\":\"WILD DUCK\",\"wild heart\":\"ワイルドハート\",\"will be well\":\"WILL BE WELL\",\"will tame\":\"ウィルテイム\",\"win win\":\"win win\",\"wind mail\":\"WIND MAIL\",\"windfall\":\"WINDFALL\",\"windmill\":\"ういんどみる\",\"windmill oasis\":\"ういんどみるOasis\",\"windtone\":\"うぃんどとーん\",\"windwave\":\"WINDWAVE\",\"windy wing\":\"WiNDY WiNG\",\"wing hero\":\"ウィングヒーロー\",\"wing kyanite\":\"Wing Kyanite\",\"wingbinta\":\"ウイングビンタ\",\"winsuka.\":\"うぃんすか。\",\"winter garden\":\"Winter Garden\",\"wishdou\":\"うぃっしゅ堂\",\"wisteria\":\"Wisteria\",\"witchflame\":\"WitchFlame\",\"withdrop\":\"ウィズドロップ\",\"withsoda\":\"withsoda\",\"wizaldx\":\"WizaldX\",\"wlc soft\":\"WLCソフト\",\"wolfs tail radio station\":\"Wolf's Tail Radio Station\",\"wolkenkratzer\":\"Wolkenkratzer\",\"wonder fool\":\"Wonder Fool\",\"wonderful life\":\"Wonderful Life\",\"wonderful one\":\"WONDERFUL ONE\",\"wonderia\":\"わんだりあ\",\"wordgear\":\"WordGear\",\"words worth\":\"ワーズワース\",\"works makes evolution\":\"Works makes evolution\",\"workstation r\":\"ワークステーションR\",\"world box\":\"WORLD BOX\",\"world lover\":\"world lover\",\"woshiro\":\"をしろ\",\"wotona no namae\":\"をとなのなまえ\",\"woyoyo\":\"ヲヨヨ\",\"wrench studio\":\"WRENCH STUDIO\",\"wriggle souzeme tomonokai\":\"リグル総攻め友の会\",\"ws.\":\"WS.\",\"wxy comics\":\"WXY COMICS\",\"x model\":\"X∞MODEL\",\"x-10sion\":\"X-10SION\",\"x-bangbang\":\"X-bangbang\",\"x-tei\":\"えっくす亭\",\"x-toys\":\"X-TOYS\",\"x.t.c\":\"X.T.C\",\"xain\":\"XAIN\",\"xenoms\":\"Xenoms\",\"xephs artwork\":\"Xeph's Artwork\",\"xikyougumi\":\"賽響組\",\"xpanda\":\"Xpanda\",\"xration\":\"Xration\",\"xuse\":\"ザウス\",\"xxkorori\":\"××コロリ\",\"xxx\":\"トリプルエックス\",\"xyzyroh\":\"朱儒楼\",\"y no shokutaku\":\"Yの食卓\",\"y-nrg system\":\"Y-NRG SYSTEM\",\"ya-ho-games\":\"ya-ho-games\",\"ya-zy\":\"YA-ZY\",\"yaboudo project\":\"野望堂PROJECT\",\"yabougumi\":\"野望組\",\"yabuno seisakusho\":\"やぶの製作所\",\"yabure kabure\":\"やぶれかぶれ\",\"yaburi dokoro\":\"破り処\",\"yachan coffee\":\"やちゃん珈琲\",\"yachu onsen\":\"やちゅ温泉\",\"yadapot\":\"やだぽっと\",\"yadokani daikaiten\":\"やどかに大回転\",\"yagami hyakka\":\"八神百科\",\"yagezawa bunko\":\"やげざわ文庫\",\"yagiya\":\"山羊屋\",\"yah-yah-doh\":\"YAH-YAH-DOH\",\"yajinsei ra-men\":\"野人性ラーメン\",\"yajirushi key\":\"矢印キー\",\"yajiya\":\"八至屋\",\"yajuu kazoku\":\"野獣家族\",\"yakan hikou\":\"夜間飛行\",\"yakan honpo\":\"薬缶本舗\",\"yakata\":\"館\",\"yaki lemon\":\"焼きレモン\",\"yaki tomahawk steak\":\"烧きトマホークステーキ\",\"yakihata nyuugyou\":\"焼畑乳業\",\"yakihebi\":\"やきへび\",\"yakimisomura\":\"ヤキミソ村\",\"yakimorokoshi\":\"やきもろこし\",\"yakinasu teishoku\":\"焼き茄子定食\",\"yakiniku teishoku\":\"焼肉定食\",\"yakinikuya yusi\":\"焼肉屋由史\",\"yakisaba teishoku\":\"焼鯖定食\",\"yakisaketeishoku\":\"焼鮭定食\",\"yakisoba rengo\":\"やきそば連合\",\"yakitate jamaica\":\"焼きたてジャマイカ\",\"yakou chaofan\":\"夜光チャーハン\",\"yakousei fan club\":\"夜行性ファンクラブ\",\"yakouyousei\":\"夜光幼性\",\"yakusoku no kaigansen\":\"約束の海岸線\",\"yakutsk tokkoutai\":\"ヤクーツク特攻隊\",\"yama momo kajitsu\":\"山桃果実\",\"yamaboshike\":\"山星家\",\"yamaburoya\":\"やまぶろ屋\",\"yamada air base\":\"YAMADA AIR BASE\",\"yamada factory\":\"山田ファクトリー\",\"yamada ichizoku.\":\"山田一族。\",\"yamada koubou\":\"山田工房\",\"yamadake\":\"山田家\",\"yamadaya\":\"山田屋\",\"yamagarasu\":\"やまガラス\",\"yamagiwa art cg studio\":\"ヤマギワアート CG STUDIO\",\"yamago house\":\"山後ハウス\",\"yamaguchi print\":\"やまぐちぷりんと\",\"yamaguchirou\":\"やまぐち楼\",\"yamakawa denenhuukei\":\"山川田園風景\",\"yamami no yado\":\"やまみの宿\",\"yamaori\":\"YAMAORI\",\"yamato nadeshiko tei\":\"大和なでしこ亭\",\"yamato soft\":\"大和ソフト\",\"yamazakura\":\"山櫻\",\"yami kaiten zushi\":\"闇回転寿司\",\"yami ni ugomeku\":\"闇に蠢く\",\"yami no naka\":\"闇の中\",\"yaminabe daiichi kantai\":\"闇鍋第一艦隊\",\"yamotodou rakugakiichi\":\"矢本堂落書市\",\"yanagi-tei\":\"やなぎ亭\",\"yanagigaeru\":\"ヤナギガエル\",\"yanagisegawa\":\"柳瀬川\",\"yancha club\":\"やんちゃ倶楽部\",\"yaneura tv\":\"屋根裏TV\",\"yanonoshiya\":\"やののし屋\",\"yaoya\":\"やお屋\",\"yapis company\":\"YAPIS COMPANY\",\"yappari ao ga suki\":\"やっぱり青が好き\",\"yappy-yappy\":\"ヤッピーヤッピー\",\"yarakashidan\":\"やらかし団\",\"yareba dekiru ko.\":\"やればできる娘。\",\"yariiya\":\"枪衣屋\",\"yaritaihodai.\":\"やりたいほうだい。\",\"yasakanomagatama\":\"八坂の勾玉\",\"yashiromori\":\"ヤシロモリ\",\"yashiroya\":\"やしろ屋\",\"yasrin-do\":\"やすりん堂\",\"yasudanchi\":\"ヤスダンチ\",\"yasunaoz\":\"安直Z\",\"yasuomi-craft\":\"Yasuomi-Craft\",\"yasutakeya\":\"ヤスタケ屋\",\"yasyokutei\":\"夜食亭\",\"yatagarasu\":\"八咫烏\",\"yatsufusa koubou\":\"八房工房\",\"yatsugami ryouriten\":\"八ツ神料理店\",\"yatsukaan\":\"夜束庵\",\"yawaragi bin\":\"やわらぎ瓶\",\"yawaraka gate\":\"やわらかGATE\",\"yawaraka kougyou\":\"やわらか工業\",\"yawaraka okashiya\":\"やわらか御菓子屋\",\"yawaraka taiyou\":\"やわらか太陽\",\"yaya hinata-ya\":\"稍日向屋\",\"yayoi fantasy zone\":\"やよいファンタジーゾーン\",\"yayui\":\"やゆい\",\"yeast house\":\"いーすとはうす\",\"yellow apple\":\"YELLOW☆APPLE\",\"yellow tag\":\"YELLOW TAG\",\"yellowcotton\":\"yellowcotton\",\"yes sir.\":\"Yes sir.\",\"yggdrasil\":\"イグドラシル\",\"ylang-ylang\":\"イランイラン\",\"ymc\":\"YMC\",\"ymi factory\":\"YMI factory\",\"yo wa okazu wo shomou shiteoru\":\"余はおかずを所望しておる\",\"yoake andon\":\"ヨアケ行燈\",\"yoban left\":\"よばんれふと\",\"yogurt\":\"yogurt\",\"yohanemu\":\"よはねむ\",\"yohitama\":\"Yohitama\",\"yoidore rodeo\":\"酔いどれロデオ\",\"yoidore usagitei\":\"酔いどれ兎亭\",\"yoiko books\":\"よい子ブックス\",\"yojouhan\":\"四畳半\",\"yojouhan factory\":\"四畳半ファクトリー\",\"yojouhan toshi\":\"四畳半都市\",\"yokainosu\":\"ヨーカイノス\",\"yokazetei\":\"夜風亭\",\"yoke\":\"Yoke\",\"yokohama junky\":\"Yokohama Junky\",\"yokohama zza koubou\":\"横浜ZZA工房\",\"yokoshima\":\"ヨコシーマ\",\"yokoshimanchi.\":\"横島んち。\",\"yokoyamagumi\":\"横山組\",\"yokubou no tou\":\"欲望の塔\",\"yolki palki\":\"ヨールキ・パールキ\",\"yomamagoto\":\"夜ままごと\",\"yomiji hyakki yakou\":\"黄泉路百鬼夜行\",\"yomo zakkaten\":\"四方雑貨店\",\"yomoda yomo japan\":\"よもだよもJAPAN\",\"yomogi\":\"よもぎ\",\"yomogiya\":\"よもぎや\",\"yomosue doukoukai\":\"ヨモスエ同好会\",\"yomosugara\":\"よもすがら\",\"yomothuhirasaka\":\"黄泉比良坂\",\"yomoyama sand\":\"よもやまサンド\",\"yonakiya\":\"よなきや\",\"yonmasuya\":\"四桝屋\",\"yorimichi\":\"よりみち\",\"yorozuya miyakotei\":\"よろず屋みやこ亭\",\"yoru no benkyoukai\":\"夜の勉強会\",\"yorugumi\":\"よるぐみ。\",\"yoruyama no kyuukeijo\":\"夜山の休憩所\",\"yosei yumeshiko\":\"酔セイ夢シコ\",\"yoshida gorou shoukai\":\"吉田悟郎商會\",\"yoshida kingdom\":\"ヨシダキングダム\",\"yoshiga dokoro\":\"吉賀所\",\"yoshii tech sha\":\"吉井テック社\",\"yoshitakashi athletic\":\"吉丘アスレチック\",\"yotayota honpo\":\"よたよた本舗\",\"yotogizousi\":\"夜伽草紙\",\"yotsumi works\":\"よつみわーくす\",\"yottanchi\":\"よったんち\",\"you you tsuushin\":\"遊遊通信\",\"you2hp\":\"YOU2HP\",\"youchien\":\"妖痴艶\",\"yougekisya\":\"幼撃舎\",\"youjo sentai loliconger\":\"幼女戦隊口リコンジャー\",\"youjo teishoku\":\"Youjo定食\",\"youkai ankake\":\"妖怪あんかけ\",\"youmu no shio\":\"ようむのしお\",\"youmusya\":\"遥夢社\",\"yousei allergen\":\"幼性アレルゲン\",\"yousei imagination\":\"幼性Imagination\",\"youseimangasya\":\"妖精漫画社\",\"youtou oniku\":\"妖刀お肉\",\"youtoujirushi\":\"洋燈印\",\"youtsuu rock\":\"腰痛ROCK\",\"youyoumu\":\"妖幼夢\",\"yozorairodrops\":\"夜空色ドロップ\",\"ytoh2\":\"YtoH2\",\"yu-gure yane\":\"ゆうぐれ屋根\",\"yu-ta.18\":\"YU-TA.18\",\"yu-topia\":\"佑とぴあ\",\"yu-yake spectrum\":\"夕焼スペクトル\",\"yu-yu tei\":\"YU-YU TEI\",\"yu.\":\"ゆ。\",\"yuasa rengou\":\"ゆあさ連合\",\"yubeshi\":\"甘菓子\",\"yude tamago\":\"ゆで卵\",\"yudenakya nama-beer\":\"ゆでなきゃ生ビール\",\"yudenonno\":\"ゆでのんの\",\"yuga\":\"yuga\",\"yuiumiya\":\"結海屋\",\"yukagenikaga\":\"湯加減いかが?\",\"yukan high zakura\":\"有閑high桜\",\"yukari\":\"縁 -yukari-\",\"yukarita\":\"ゆかりた\",\"yukemuri froster\":\"ゆけむりフロスター\",\"yukemuri inferno\":\"湯けむりインフェルノ\",\"yuki mango\":\"ゆきマンゴー\",\"yuki no hitohira\":\"ユキノヒトヒラ\",\"yuki no iori\":\"ユキノ庵\",\"yuki sumi iori\":\"雪墨庵\",\"yuki-iro\":\"YuKi-IRo\",\"yukidaruma kumiai\":\"ゆきだるま組合\",\"yukima honpo\":\"雪間本舗\",\"yukimi honpo\":\"ゆきみ本舗\",\"yukimi onsen\":\"雪見温泉\",\"yukirins\":\"YUKIRINS\",\"yukisizuku\":\"ゆきしずく\",\"yukisora\":\"ユキソラ\",\"yukitenkan\":\"雪天館\",\"yukyou\":\"ゆきょう\",\"yukyu-kyuka\":\"悠久休暇\",\"yume no kakera\":\"ユメノカケラ\",\"yume no manimani\":\"夢のまにまに\",\"yume no niwatori goya\":\"夢のニワトリ小屋\",\"yumeiro-goromo\":\"ゆめいろごろも\",\"yumeizukosya\":\"夢何処社\",\"yumekakiya\":\"夢かき屋\",\"yumemi\":\"yumemi\",\"yumemigaoka\":\"ユメミガオカ\",\"yumemigokoti\":\"夢見ごこち\",\"yumemushi\":\"ユメムシ\",\"yumenamakon\":\"ゆめなまこん\",\"yumenekoya\":\"夢ねこ屋\",\"yumeno miya\":\"夢乃宮\",\"yumeoikyounouta\":\"夢追狂の謳\",\"yumetoki\":\"ユメトキ\",\"yumeya honpo\":\"夢屋本舗\",\"yumiharizuki\":\"弓張月\",\"yunomata\":\"♨ゆのまた\",\"yunte\":\"yunte\",\"yuraraka koubou\":\"ゆららか工房\",\"yurari biyori\":\"ゆらり日和\",\"yurei yashiki\":\"ゆーれーやしき\",\"yureika\":\"ゆれいか\",\"yurerutikuwabu\":\"ゆれるちくわぶ\",\"yuri equal 18l\":\"百合=18L\",\"yuririn no moto\":\"ゆりりんの素\",\"yurufuwa megane\":\"ゆるふわ☆めがね\",\"yuruhuwa-kinniku\":\"ゆるふわ筋肉\",\"yururuka-dou\":\"ゆるるか堂\",\"yurusu\":\"許す\",\"yurutto pocket\":\"ゆるっとポケット\",\"yusuzumi\":\"夕涼み\",\"yutakadou\":\"豊堂\",\"yutori-nu\":\"ゆとりーぬ\",\"yuu adashino suisan\":\"(有)化野水産\",\"yuu heya\":\"ゆう部屋\",\"yuubeno gakuensai\":\"ユウベノ学園祭\",\"yuuen floor\":\"遊園ふろあ\",\"yuugai tosho kikaku\":\"有害図書企画\",\"yuugatou\":\"誘蛾党\",\"yuugen jikkou\":\"有言実行\",\"yuugengaisha mach spin\":\"有限会社マッハスピン\",\"yuugensangyou sukimakaze\":\"有限産業すきま風\",\"yuuhodou\":\"遊歩堂\",\"yuuhoku.\":\"ゆーほく。\",\"yuuji wonder\":\"ゆうじワンダー\",\"yuujiro\":\"遊字路\",\"yuuk web\":\"yuuk web\",\"yuukai kinshi\":\"誘拐禁止\",\"yuukakumin\":\"遊廓民\",\"yuukan madam\":\"勇敢マダム\",\"yuukari soft\":\"ゆ～かりそふと\",\"yuuki nyuugyou\":\"ゆーき乳業\",\"yuuki ryu\":\"結城流\",\"yuukyuu shinden\":\"悠久神殿\",\"yuunagisou\":\"夕凪荘\",\"yuuriko\":\"ユウリコ\",\"yuusei honpo\":\"遊星本舗\",\"yuuseian\":\"遊星庵\",\"yuusha kandenchi\":\"勇者乾電池\",\"yuusha-sama go-ikkou\":\"勇者様御一行\",\"yuhshiki\":\"憂式\",\"yuuyami sabou\":\"夕闇茶房\",\"yuuyami tokeidai\":\"ゆうやみとけいだい\",\"yuuyaminabe club\":\"夕闇鍋倶楽部\",\"yuuzen animal dou\":\"友禅あにまる堂\",\"yuyake box\":\"ゆうやけボックス\",\"yuzucha\":\"ゆず茶\",\"yuzucha biyori\":\"柚子茶日和\",\"yuzuen\":\"柚子苑\",\"yuzuhoge.\":\"Yuzuhoge.\",\"yuzumikan\":\"ゆずみかん\",\"yuzumonaka\":\"ゆずもなか\",\"yuzupon\":\"YUZUPON\",\"yuzuriha\":\"譲葉\",\"yuzurihaya\":\"譲葉屋\",\"yuzuya\":\"ゆずや\",\"yuzuyu\":\"ゆず湯\",\"yz plus\":\"YZ+\",\"z jirushi\":\"Z印\",\"z-front\":\"Z-FRONT\",\"z-less\":\"Z-Less\",\"z-s-e\":\"z-s-e\",\"z-tabukuroneko house\":\"Zた袋猫はうす\",\"zabuton makura\":\"ざぶとんまくら\",\"zaclock\":\"ZacLock\",\"zahhatorute\":\"ざっはとるて\",\"zakkin heiki seizou koujou\":\"雑菌兵器製造工場\",\"zakogoya\":\"ざこ小屋\",\"zakuro an\":\"柘榴庵\",\"zandaka-77yen\":\"残高77円\",\"zangyaku koui teate\":\"残虐行為手当\",\"zankirow\":\"斬鬼楼\",\"zankoku doumei\":\"残酷同盟\",\"zankoku ondo\":\"残酷音頭\",\"zanmai\":\"三昧-zanmai-\",\"zarigani arms\":\"ザリガニARMS\",\"zashiki-neco\":\"ざしきねこ\",\"zassou\":\"雑草\",\"zassoubatake\":\"雑草畑\",\"zatouichi\":\"座頭市\",\"zatsunen koubou\":\"雑念工房\",\"zatsuyou elixir\":\"雑用エリクサー\",\"zattou keshiki\":\"雑踏景色\",\"zawameki jambo\":\"ざわめきじゃんぼ\",\"zeiniku shoujotai\":\"ぜいにく少女隊\",\"zenmai-shiki kouchuusen\":\"ゼンマイ式航宙船\",\"zenmain\":\"ZENMAIN\",\"zennihon haeteru kai\":\"全日本生えてる會\",\"zenos\":\"Zenos\",\"zenpou chuugaeri kick\":\"前方宙返りキック\",\"zenpou fuchuui\":\"前方不注意\",\"zenpou kouenhun\":\"前方後円墳\",\"zenryoku back dash\":\"全力バックダッシュ\",\"zensekai yakenohara doumei\":\"全世界焼野原同盟\",\"zenshuu bougyo\":\"ゼンシュウボウギョ\",\"zensoku punks\":\"喘息パンクス\",\"zensoku zenkai.\":\"喘息全快。\",\"zensyuui\":\"全周囲\",\"zero\":\"ゼロ\",\"zero calorie\":\"ゼロカロリ\",\"zero-sen\":\"zero戦\",\"zero-xx\":\"ZERO・XX\",\"zeroinfinityone\":\"0∞1\",\"zeros factory\":\"零’sふぁくとりー\",\"zetonpoison\":\"ゼトンポイソン\",\"zettai bluenoid\":\"絶対ブルーノイド\",\"zettai yarumoni\":\"絶対やるもに\",\"zetubou\":\"zetubou\",\"zi\":\"Zi\",\"zi0topia\":\"ジ○トピア\",\"ziggy star dust\":\"Ziggy STAR Dust\",\"zigzag\":\"ZIGZAG\",\"zigzag company\":\"ジグザグカンパニー\",\"zinzin\":\"ジンジン\",\"zion\":\"ZION\",\"ziploc\":\"Ziploc\",\"zipper wrist\":\"ジッパリスト\",\"zircon prime\":\"じるこんプライム\",\"zitadelle\":\"Zitadelle\",\"zmey no soukutsu\":\"ズメイの巣窟\",\"zng\":\"ZNG\",\"znn\":\"ZNN\",\"zoal\":\"ZOAL\",\"zokubutsu.zip\":\"俗物.zip\",\"zombie team\":\"Zombie Team\",\"zooerastia\":\"ZOOERASTIA\",\"zooko\":\"Zooko\",\"zou no ran\":\"象の檻\",\"zouri no sato\":\"ゾウリの里\",\"zozalist\":\"ゾザリスト\",\"zubunure lab\":\"ずぶ濡れラボ\",\"zugaikotsu marudashi\":\"ズガイコツマルダシ\",\"zukaishiki\":\"ずかいしき\",\"zuukoku shoukai\":\"ずぅこく商会\",\"zuwaigani beam\":\"ズワイガニビーム\",\"zweidrei\":\"zweidrei\",\"zyulokuya\":\"十録屋\",\"zyx\":\"ジックス\",\"ajito529\":\"アジト529\",\"miomix\":\"miomix;\",\"hinobashi seifukukan\":\"日野橋制服館\",\"hoshii koubou\":\"星井工房\",\"ascii media works\":\"ASCII Media Works\",\"mitsume no mitsumame\":\"みつ目のみつ豆\",\"rhf migite no tomo sha\":\"RHF=右手の友社\",\"jurei no mori\":\"呪霊の杜\",\"tsukitate-koubou\":\"つきたて工房\",\"aramaa\":\"あらまあ\",\"kazamidori\":\"かざみどり\",\"m3\":\"M3\",\"hiwa izumo taisha\":\"秘話出雲大社\",\"caisson\":\"CAISSON\",\"tuberose\":\"月化香\",\"naga to yappari yukai na nakama-tachi\":\"nagaとやっぱり愉快な仲間たち\",\"attakai inu no yoru de\":\"暖かい淫雨の夜で\",\"nikoushikou\":\"に向思考\",\"anata wa onaka ga suiteiru\":\"あなたはお腹がすいている\",\"yurushite ochinti kyo\":\"許しておちんち教\",\"seiheki kenkyuujo bravo han\":\"性癖研究所 ブラボー班\",\"icchao murasakiimoren new\":\"いっちゃお♪紫芋れんnew\",\"otokonoko de asobou\":\"男の子で遊ぼう\",\"babaa no mitsuboshi restaurant\":\"ババアの三ツ星レストラン\",\"mugisabou\":\"麦茶房\",\"dessert soft\":\"DESSERT Soft\",\"akatukiya\":\"赤月屋\",\"metacorapusu\":\"めたこらぷす\",\"hana q studio\":\"花Qスタジオ\",\"shinsen shiboritate nama gyuunyuu.\":\"新鮮、搾りたて生牛乳。\",\"shota mangaya-san\":\"ショタ漫画屋さん\",\"kana note\":\"Kana Note\",\"pirio destruction\":\"ピリオデストラクション\",\"mauve\":\"mauve\",\"tiguhagu metronome\":\"ちぐはぐメトロノーム\",\"daisan-keitai\":\"第3形態\",\"ray n maker\":\"Ray N' Maker\",\"ijou higan sensen\":\"异常彼岸战线\",\"shinkaihuyu\":\"深海浮遊\",\"dull zodesadehai\":\"ダル・ゾデサデハーイ\",\"fetishism pocket\":\"フェチズムポケット\",\"kantou dougakai\":\"关东动画会\",\"fusuma cafe\":\"ふすま喫茶\",\"platinum kinoko\":\"プラチナきのこ\",\"lunaberry\":\"Lunaberry\",\"sakura no tomoru hie\":\"桜の灯る日へ\",\"xx koubou\":\"××工房\",\"hengen monogatari\":\"変幻物語\",\"straight lemon kajuu 100\":\"ストレートレモン果汁100\",\"gekidan 375\":\"劇団375\",\"ryuuka hanten\":\"龍華飯店\",\"hakumaidokoro\":\"白米所\",\"dandakadan\":\"ダンダカダン\",\"shikoshiko biyori\":\"しこしこ日和\",\"ohige no shishimai\":\"お髭の獅子舞\",\"damenahidou\":\"だめなひ堂\",\"petanko bokujo\":\"ぺたんこ牧場\",\"chanbara kishidan\":\"ちゃんばら騎士団\",\"gensou kagetourou\":\"幻想影燈籠\",\"chou rojiura gasshuukoku\":\"超路地里合众国\",\"random footwork\":\"ランダムフットワーク\",\"chabatake ni haeta takenoko\":\"茶畑に生えた筍\",\"mizuyakinko\":\"水屋金库\",\"namagaki\":\"生牡蛎\",\"chouzankai\":\"超斩开\",\"kirin planet\":\"キリンプラネット\",\"sonpuushi\":\"村夫子\",\"koushoku na reichourui\":\"好色な霊長類\",\"yukinko okeya\":\"雪ん娘おけ屋\",\"momonomi plus\":\"もものみプラス\",\"metsuki warui kyoudan\":\"目つき悪い教団\",\"chinpan-bu\":\"チンパン部\",\"mondomura tomo no kai\":\"蒙德村友会\",\"pirori kingdom\":\"PiRORI KINGDOM\",\"kinomiki no mama\":\"木の幹のまま\",\"raise wa futanari bishoujo\":\"来世是扶她美少女\",\"kakuzatou\":\"角砂糖\",\"gyuunyuu shoujo seisakusho\":\"牛乳少女制作所\",\"abukumadou\":\"阿武隈堂\",\"hakutamayu\":\"白玉汤\",\"nodomaru biyori\":\"のどまる日和\",\"itabira yasai\":\"イタビラ野菜\",\"maria planet\":\"マリアプラネット\",\"uishiro\":\"初代\",\"140km slash h\":\"140km/h\",\"shirokuma terepasu\":\"白熊テレパス\",\"nipa nipa company\":\"NIPA NIPA COMPANY\",\"omochi box\":\"OMOCHI BOX\",\"kinokko\":\"きのっ子\",\"dark horse comics\":\"黑马漫画\",\"mt.sushi\":\"Mt.Sushi\",\"milk lamp\":\"ミルクランプ\",\"germanium detroit\":\"ゲルマニウム・デトロイト\",\"suiren no yado\":\"水莲之宿\",\"tariki honganji\":\"他力本愿寺\",\"ebisujima misato\":\"戎島実里\",\"jikahatsudensho\":\"自家発電処\",\"signal violet\":\"Signal:Violet\",\"me no sato\":\"芽の里\",\"shuukyuu 8-ka\":\"週休8日\",\"sagamiokiva\":\"さがみおきば\",\"bochi bochi no ki\":\"ぼちぼちの木\",\"pham\":\"PHAM!\",\"henry plaza\":\"半里プラザー\",\"shirokuroino\":\"白黒いの\",\"riku no kotoutei\":\"陆の孤岛亭\",\"kuniku no saku\":\"狗肉の策\",\"taipeijin\":\"台北人\",\"shinya koujou\":\"深夜工場\",\"alpaca bokujou\":\"里アルパカ牧场\",\"pink sakuhin okiba\":\"ピンク作品置き場\",\"oden usagi\":\"おでんうさぎ\",\"omochiya-san\":\"おもちやさん\",\"shitsuren restaurant for men\":\"失恋レストラン FOR MEN\",\"makuragi zabuton\":\"枕木ざぶとん\",\"koko de chikubi o hitotsumami\":\"ここで乳首をひとつまみ\",\"noumusai\":\"浓雾菜\",\"nyoroman shouji\":\"にょろまん商事\",\"praha keisanki\":\"プラハ計算機\",\"mosoya\":\"毛想屋\",\"mikamishi juukou\":\"三神氏重工\",\"kudamonoichizu\":\"果物一途\",\"mimitako seijin\":\"耳タコ星人\",\"nukunuku jima\":\"ぬくぬく島\",\"amagami honpo\":\"甘啮本铺\",\"jyuu sensya usagitai\":\"重战车兔队\",\"lv426\":\"LV426\",\"circle mizusane\":\"サークルみづさね\",\"milk farm tanaka\":\"ミルクファーム田中\",\"agartha houeikyoku\":\"アガルタ放映局\",\"menbou renpou\":\"めんぼーれんぽー\",\"dukeyushimagurodon\":\"漬けゆしまぐろ丼\",\"solo play\":\"そろぷれい\",\"niji-teru\":\"虹照\",\"kokumaro chousei tounyuu\":\"こくまろちょうせい豆乳\",\"noya\":\"乃屋\",\"touhikou\":\"陶惹好\",\"yorunobando\":\"夜のバンド\",\"shiba no shippo\":\"しばのしっぽ\",\"futsu-no-tapioca-yasan\":\"ふつうのタピオカやさん\",\"ushinomaruyaki\":\"ウシノマルヤキ\",\"silver dog\":\"シルバードッグ\",\"aburanabeshiki\":\"油锅式\",\"gahahahahahaha\":\"がはははははは!\",\"marshmalloya\":\"ましゅまろや\",\"nanadou\":\"七堂\",\"ayawasuca\":\"文忘蚊\",\"sugomori bird\":\"巣ごもりバード\",\"gensou pump\":\"幻想ポンプ\",\"elizabeth collar\":\"エリザベスカラー\",\"toropucchi\":\"とろぷっち\",\"satou mitsu\":\"さとうみつ\",\"mannen dokodoko dondodoko\":\"まんねんドコドコドンドドコ\",\"uruudoki\":\"うるうどき\",\"shironekoya\":\"白猫屋\",\"mugen karaage\":\"無限からあげ\",\"yonaka works\":\"ヨナカWorks\",\"touketsu shamen\":\"トウケツ斜面\",\"koutetsu shabon dama\":\"钢铁しゃぼん玉\",\"hogeramu\":\"ほげらむ\",\"mizushirazu\":\"みずしらず\",\"yakitori teishoku\":\"焼きトリ定食\",\"dakkoku kidoutai s.a.c\":\"脱壳机动队 S.A.C\",\"mitsumitsuniku\":\"ミツミツにく\",\"akirerushoujo\":\"アキレルショウジョ\",\"fuzume\":\"ふずめ\",\"hitakamoya\":\"ひたかもや\",\"kasokuiki\":\"過疎区域\",\"khaos distance\":\"カオス距離\",\"tohosanhun\":\"徒歩三分\",\"morunchi\":\"モルチ\",\"gutsutoma\":\"ぐつとま\",\"kaiten paradogs\":\"回転ParaDOGs\",\"umi no sachi teishoku\":\"海の幸定食\",\"tennensuidousui\":\"天然水道水\",\"sorairo koubou\":\"空色工房\",\"kakuran operetta\":\"攪乱オペレッタ\",\"hikoushiki\":\"飞行式\",\"toyoko daisyouten\":\"东横大赏典\",\"maimu maimu\":\"まいむ～まいむ\",\"yakimeshi modoki\":\"やきめしもどき\",\"nananto\":\"ななんと\",\"gogatsu souzaiten\":\"五月惣菜店\",\"syunichi kansuu\":\"しゅにち関数\",\"edamametei\":\"えだまめ亭\",\"texteater\":\"Texteater\",\"evolment tycoon\":\"EVOLMENT TYCOON\",\"utsusumi onsen\":\"うつすみおんせん\",\"dorayakiya\":\"どらやきや\",\"kazumiya\":\"かずみ屋\",\"high land\":\"HIGH:LAND\",\"shibasaki shouji\":\"柴崎障子\",\"ecchi ecchi daifuku\":\"えちえち大福\",\"hoyhoy colo\":\"ホイホイこーろ\",\"higashinodou\":\"東ノ堂\",\"imagescript\":\"イメージscript\",\"kawaiso nanoha nukeru\":\"かわいそうなのは抜ける\",\"jinsei saboribu\":\"人生サボり部\",\"mori no michi\":\"森の道\",\"studio yama roman\":\"スタジオ山ロマン\",\"inu ha sakana\":\"犬は鱼\",\"mizukani\":\"みずかに\",\"one hit wonder\":\"ONE HIT WONDER\",\"fuwafuwa palette\":\"ふわふわパレット\",\"marble dog\":\"MARBLE DOG\",\"annbrellahouse\":\"あんぶれらはうす\",\"citric acid1350\":\"クエン酸1750\",\"tissue bako\":\"ティッシュ箱\",\"mushoku muho\":\"無色ムホ\",\"kushidatelier\":\"クシダトリエ\",\"shiono room\":\"SHIONO ROOM\",\"nanao heavy industries\":\"七尾重工\",\"hoshoku shoujo\":\"捕食少女\",\"mirakoku\":\"みら国\",\"usonoki\":\"ウソノキ\",\"tuyuiri kakinotane\":\"梅雨入り柿の種\",\"ueshita\":\"UESHITA\",\"minmintaro\":\"みんみんたろう\",\"haimitsutou\":\"廃蜜灯\",\"mrm lab\":\"MRMラボ\",\"monkees\":\"モンキーズ\",\"jalapeno chips\":\"ハラペーニョチップス\",\"yattemiyou\":\"ヤッてみよう!\",\"nekonokarintou\":\"ねこのかりんとう\",\"chikara koso power\":\"力こそパワー\",\"chachanako\":\"茶茶ナコ\",\"shiro no ie\":\"シロの家\",\"sankaku button\":\"三角ボタン\",\"geppei bunchou\":\"月餅文蝶\",\"nullspace\":\"NULLSPACE\",\"sys-lila\":\"シスリラ\",\"kaisendon\":\"カイセンドン\",\"dandan dango\":\"段々団子\",\"mobumomu ntr\":\"モブモムNTR\",\"ice to choco\":\"あいすとちょこ\",\"sakura suishou\":\"桜水晶\",\"nekomimi to kuro mask\":\"猫耳と黒マスク\",\"champion soft\":\"Champion Soft\",\"dojiro books\":\"どじろーブックス\",\"alwayshp1\":\"いつも死にかけ\",\"shurashushushu\":\"しゅらしゅしゅしゅ\",\"channel zakuro\":\"チャンネルざくろ\",\"kitsune komachi\":\"きつねこまち\",\"kaitendon\":\"海転丼\",\"cre no monookiba\":\"シーレの物置場\",\"studio park\":\"スタジオぱーく\",\"donut church\":\"ドーナツ教会\",\"netsuko\":\"ネツ湖\",\"milkdou shoukai\":\"みるく堂商会\",\"airimiash\":\"アイリミアーシュ\",\"mokkorihan\":\"もっこりはん\",\"zenjidou shimoneta seizou machine\":\"全自动下ネタ制造マシーン\",\"shachi\":\"しゃち\",\"mittsuman\":\"みっつまん\",\"zyougesayuu\":\"上下左右\",\"rakuenya\":\"乐园屋\",\"torinoya\":\"とりの屋\",\"gomikasu tarou\":\"五味滓太郎\",\"kaoinshou zero\":\"顔印象零\",\"yasudajuku\":\"保田塾\",\"mahou no kinoko\":\"魔法のキノコ\",\"suihanya\":\"炊飯屋\",\"climbcrown\":\"クライムクラウン\",\"takahiro no ie\":\"たかひろの家\",\"shiosai\":\"潮騒\",\"touzainanboku\":\"とうざいなんぼく\",\"arijigoku\":\"蚁地狱\",\"tianoblue\":\"ティアノブルー\",\"nerimono koujou\":\"練り物工場\",\"marosaan\":\"まろ茶庵\",\"pachypodium\":\"ぱきぽぢうむ\",\"europia\":\"ゆーろぴあ\",\"iinchou no yabai yatsu\":\"委員長のやばいヤツ\",\"gotarou no all night fuck\":\"ゴ太郎\",\"ruri-iro special room\":\"瑠璃色特別室\",\"harmonear\":\"HarmoNeaR\",\"higedokoro\":\"ひげどころ\",\"shinjiroya\":\"信じろや\",\"pontaroya\":\"ぽんたろ家\",\"watochip melonpan\":\"わとちっぷめろんぱん\",\"miraiha kireini\":\"ミライハキレイニ\",\"otonagokko iinkai\":\"おとなごっこ委員会\",\"elica\":\"ELICA\",\"gojihan\":\"五时半\",\"netorare no tami\":\"ネトラレの民\",\"7 rensa\":\"7连锁\",\"citrusniper\":\"シトラスナイパー\",\"unadon\":\"うなどぅーむ\",\"torii-za\":\"鳥居座\",\"sokuochi shoujo\":\"即オチ少女\",\"nora nee-sama\":\"Nora姉様\",\"ochaban\":\"お茶番\",\"shaft\":\"SHAFT\",\"kagayaku hoshizuna\":\"輝く星砂\",\"chikyuujin\":\"ちきゅうじん\",\"nyum production\":\"にゅむproduction\",\"heppoko usagi cafe\":\"へっぽこうさぎ＊cafe\",\"asakasha doujin\":\"朝花社同人\",\"maisou no soko\":\"埋葬ノ底\",\"kyuryo koen\":\"丘陵公園\",\"chairoiyatsu\":\"ちゃいろいやつ\",\"surudoiman no irutokoro\":\"するどいマンのいるところ\",\"kinkai 100 kg\":\"金塊100kg\",\"mukyou no utopia\":\"梦境的Utopia\",\"nomiyagumi\":\"ノミヤ組\",\"manaita koujou\":\"まな板工場\",\"choukenkouya\":\"超健康屋\",\"namekuzu\":\"なめくず\",\"yuujikouji\":\"ゆうじこうじ\",\"kuwaiya\":\"くわい屋\",\"sumeshiya-san\":\"すめし屋さん\",\"yumemimochi honpo\":\"夢みもち本舗\",\"kikumonza\":\"菊門座\",\"uru uru onsen\":\"うるうる温泉\",\"sourou yarou a-team\":\"早漏野郎Aチーム\",\"wakaba syokei\":\"若葉祥慶\",\"honyuubin\":\"ほ乳びん\",\"im moralist\":\"I'm moralist\",\"palcomix\":\"Palcomix\",\"naporitan\":\"ナポりたん\",\"charon\":\"LAPUTA\",\"tawawa delivery\":\"たわわデリバリー\",\"patapo\":\"ぱーたぽ\",\"chae\":\"ちゃえ\",\"modokashiwc\":\"もどかしWC\",\"tufos\":\"Tufos\",\"nekochiwawa.\":\"ネコチワワ。\",\"nikujiru shinkou\":\"霧中夜行\",\"asakurag plus\":\"AsakuraG+\",\"nishi no tora\":\"西ノ虎\",\"noir auto\":\"ノワールオート\",\"yuuki saien\":\"ユーキ菜園\",\"ginshio honpo\":\"銀しお本舗\",\"kitsune no nijibiya\":\"狐の虹火屋\",\"juubako seisakujo\":\"重箱製作所\",\"mandara ryuuseigun\":\"マンダラ流星群\",\"chimimou land\":\"ちみもうらんど\",\"neyagurui\":\"ねやぐるい\",\"tsurutsuru udon club\":\"ツルツルおうどん俱乐部\",\"tabehoudai\":\"食べ放題\",\"yururiya.\":\"ゆるり屋。\",\"chokuretsu reactor\":\"直列りあくとる\",\"kaminarisama\":\"カミナリサマ\",\"hoshikuzu pot-au-feu\":\"星屑ぽとふ\",\"binzoko\":\"BINZOKO\",\"flower classe\":\"ふらわーくらっせ\",\"iro murasaki\":\"やみつきハグハグ\",\"minshuku izmd\":\"民宿IZMD\",\"youyouan\":\"葉々庵\",\"kurumaya koudou\":\"クルマヤ公道\",\"harugakita\":\"はるがきた\",\"imoimolatte\":\"いもいもラテ\",\"kitahara koubou\":\"北原工房。\",\"smile foran company\":\"すまいるふぉらんかんぱにぃ。\",\"kozuki sousaku dokoro\":\"甲月創作処\",\"nezumi no haha\":\"鼠の母\",\"hachihachihachi\":\"蜂蜂蜂\",\"sakuranbo nouen\":\"さくらんぼ農園\",\"nurupon\":\"ぬるポン\",\"waifusplit\":\"WaifuSplit\",\"shirasu latte\":\"しらすラテ\",\"metrobay comix\":\"Metrobay Comix\",\"mono stellar\":\"Mono*Stellar\",\"cominaya\":\"こみな屋\",\"agenasu\":\"揚げナス(仮)\",\"miracleburn\":\"みらくるバーン\",\"ice coffee\":\"冷珈琲\",\"nasu homu\":\"なすほーむ\",\"hitaki nikomiya\":\"ひたき煮込み屋\",\"tori salt\":\"トリソルト\",\"archa1c\":\"アルカ一区\",\"tehakusen\":\"テハクセン\",\"waniwanipanic\":\"わにわにぱにっく\",\"morelia standard\":\"もれりあすたんだーど\",\"orutama\":\"オルタマ\",\"gelatin koubou\":\"ゼラチン工房\",\"marukuramaru\":\"まる鞍丸\",\"shigaeya\":\"しがえ屋\",\"nemaki wa sailor fuku\":\"寝間着はセーラー服\",\"mochigometei\":\"もちごめ亭\",\"ikkyuu nyuukon\":\"一球入魂\",\"meichougijuku\":\"鳴鳥義塾\",\"marumitei\":\"まる巳亭\",\"madakoya\":\"まだ子屋\",\"4c-fantasy\":\"四色绮想\",\"mekimekitei\":\"めきめき亭\",\"anmitsutei\":\"あんみつ亭\",\"tokumei kibounu\":\"匿名キボンヌ\",\"poipoi ramen\":\"ぽいぽいラーメン\",\"ore no sasakure\":\"俺のささくれ\",\"akasa seiheki kenkyuujo\":\"赤佐性癖研究所\",\"aheazif\":\"アヘアジフ\",\"temperature\":\"テンプレチャー\",\"teriniku\":\"テリにく\",\"sesame dou\":\"せさみ堂\",\"fujikane haruyo\":\"藤鉄はるよ\",\"mochi to shiawase\":\"モチと幸せ\",\"awaya\":\"あわや\",\"mumumu\":\"むむむ\",\"shoshosho frontier\":\"処庶所フロンティア\",\"teishibou new\":\"低脂肪NEW\",\"shimasoft\":\"しまそふと\",\"littlehopper\":\"りとるほっぱー\",\"sakaetenai desu.\":\"さかえてないです。\",\"ebiten kaido\":\"海老天街道\",\"negiyashiki\":\"ねぎやしき\",\"yorutake\":\"よるたけ\",\"kawasu shuppan\":\"川洲出版\",\"mukoneya\":\"むこね屋\",\"lilith\":\"莉莉丝\",\"blacknwhite\":\"BlackNWhite\",\"torunitaranai\":\"とるにたらない\",\"shinya koubou\":\"深夜工房\",\"aruminikarubi\":\"あるみにカルビ\",\"slime no kanmuri\":\"すらいむのかんむり\",\"ohanabatake\":\"御花畑\",\"penguin senbanchi\":\"ペンギン千番地\",\"furashirushi\":\"ふら印\",\"ushikani gassen\":\"牛蟹合戦\",\"tsukuten\":\"つくてん\",\"pomepome kokuuken\":\"ポメポメコクウケン\",\"porcini\":\"ぽるちーに\",\"shoujo rakugakichuu\":\"少女落描中\",\"ikebukuro distillery\":\"池袋蒸留所\",\"honeyroad\":\"Bee導師\",\"golden bazooka\":\"ゴールデンバズーカ\",\"nature carute\":\"天然養殖\",\"crazy brain pulse\":\"くれいじーぶれいんぱるす\",\"nuts koumuten\":\"ナッツ工務店\",\"faunas\":\"ファウナス\",\"hatome honpo\":\"はとめ本舗\",\"dorayakiza\":\"どらやき座\",\"seinyanko gakuen\":\"聖にゃんこ学園\",\"mana channel\":\"まなちゃんねる\",\"teiyouryou neko\":\"低用量ねこ\",\"mankai zenseki\":\"满开全席\",\"charcoal tail\":\"Charcoal Tail\",\"hyper kettle yesterday\":\"ハイパーケトルイエスタデイ\",\"sakura mikan hoikuen\":\"桜みかん保育園\",\"wafuu\":\"わ風\",\"unahouse\":\"うなハウス\",\"shinki sakusei file do m\":\"新規搾精ファイル・ド・M\",\"owakari itadaketa darou ka\":\"お解りいただけただろうか\",\"coscoteikoku\":\"こすこ帝国\",\"sugomori.\":\"巣ごもり。\",\"root nanajuugo\":\"√75\",\"spangle opera\":\"スパンコールオペラ\",\"amayadori\":\"雨宿り\",\"gesutarte houkai\":\"ゲスタルト崩壊\",\"oniku ga tabetai gozen niji\":\"お肉が食べたい午前二時\",\"yukai mangasha\":\"ゆかいまんが社\",\"tsundere ham katsu volcano\":\"ツンデレハムカツボルケーノ\",\"gekkouchou\":\"月光帳\",\"tanajou\":\"棚上\",\"maruantei\":\"丸杏亭\",\"shikoushoku\":\"嗜好色\",\"anzuya\":\"あんず屋\",\"komorebi palette\":\"木漏れ陽ぱれっと\",\"uni piano gakudan\":\"雲丹ピアノ\",\"mochi mochi bomb\":\"もちもち爆弾\",\"ogura nougyou\":\"小倉農業\",\"soup oishii\":\"スープおいしい\",\"simpleclass\":\"しんぷるくらす\",\"triple lettuce burger\":\"トリプルレタスバーガー\",\"yama danchi\":\"やまだんち\",\"studio iwashi\":\"スタジオいわし\",\"urasujibeya\":\"裏筋部屋\",\"tamima-ya\":\"たみま屋\",\"yotsuba no suisou\":\"四ツ葉ノ水槽\",\"gamanuntaka\":\"がまぬんたか\",\"kisei toukyoku\":\"規制当局\",\"houkago highball land\":\"放課後ハイボールランド\",\"meifu madou\":\"めーふまどー\",\"nani kashira no shokushu\":\"なにかしらの触手\",\"satsuki no usa koya\":\"サツキのウサ小屋\",\"jikabi baisen\":\"直火焙煎\",\"junk food\":\"じゃんくふぅど\",\"jiko moratorium\":\"自己モラトリアム\",\"buster app\":\"ばすたーあっぷ\",\"ofuro haitta erai\":\"お風呂入ったえらい\",\"187 seibutsu\":\"187生物\",\"futari bocchi no solitude\":\"ふたりぼっちのSolitude\",\"sarukome\":\"サルコメ\",\"unidentified flying baumkuchen\":\"未確認飛行ばーむくーへん\",\"setsugetsuhuuka\":\"雪月楓花\",\"putama koubou\":\"ぷ玉工房\",\"natsukian\":\"七月庵\",\"kikiki no kikki\":\"きききのきっき\",\"nekomaya\":\"ねこまや\",\"kurage no suizou\":\"くらげのすいそう\",\"neko no youchuu kansatsukai\":\"猫の幼虫観察会\",\"fumotonoya\":\"梺乃屋\",\"yorunineru\":\"ヨルニネル\",\"usaginoheya\":\"ウサギノヘヤ\"},\"artist\":{\"2\":\"2\",\"7\":\"7\",\"8\":\"8\",\"13\":\"13\",\"20\":\"廿\",\"23\":\"23\",\"24\":\"24\",\"38\":\"38\",\"41\":\"41\",\"66\":\"66\",\"68\":\"68\",\"76\":\"七六\",\"88\":\"88\",\"144\":\"144\",\"222\":\"222\",\"254\":\"254\",\"346\":\"346\",\"445\":\"445\",\"543\":\"543\",\"581\":\"581\",\"691\":\"ムクイ\",\"892\":\"八9二\",\"961\":\"𝟡𝟞𝟙\",\"1103\":\"1103\",\"3104\":\"3104\",\"7010\":\"7010\",\"8000\":\"8000\",\"33297\":\"33297\",\"pop\":\"POP\",\"oouso\":\"大嘘\",\"peko\":\"ぺこ（かにビーム）\",\"akaza\":\"あかざ\",\"ishikei\":\"石惠\",\"endou hiroto\":\"远藤弘土\",\"happoubi jin\":\"八宝备仁\",\"fujisaki hikari\":\"藤崎ひかり\",\"ichiri\":\"イチリ\",\"satou kibi\":\"さとうきび\",\"nanpuu\":\"なんぷぅ\",\"yukiu con\":\"雪雨こん\",\"land sale\":\"兰户せる\",\"emily\":\"emily\",\"chiri\":\"ちり\",\"kantoku\":\"监督\",\"sayori\":\"Sayori\",\"ideolo\":\"ideolo\",\"sky\":\"SKY | Sky-FreeDom\",\"m.vv\":\"M.vv\",\"miyahara ayumu\":\"宫原步\",\"nishikawa kou\":\"西川康\",\"narusawa kei\":\"なるさわ景\",\"akatsuki myuuto\":\"赤月みゅうと\",\"kisaragi gunma\":\"如月群真\",\"ohtomo takuji\":\"大友卓二\",\"yamada no seikatu ga daiichi\":\"山田の性活が第一\",\"asamura hiori\":\"朝丛志描\",\"matsukawa\":\"松河\",\"mmm\":\"暗黑えむ将军\",\"facominn\":\"ふぁこみん\",\"great mosu\":\"ぐれーともす\",\"ringo sui\":\"りんご水\",\"kanzaki muyu\":\"神崎むゆ\",\"mizuyan\":\"みずやん\",\"ranyues\":\"仴\",\"horonamin\":\"ホロナミン\",\"chiyami\":\"ちやみ\",\"hanahanamaki\":\"花花卷\",\"sousouman\":\"草草馒\",\"muk\":\"MUK\",\"ore p 1-gou\":\"俺P1号\",\"menyoujan\":\"めんようじゃん\",\"hodumi kaoru\":\"八月朔日珈瑠\",\"watsuki rumi\":\"わつきるみ\",\"soramoti\":\"そらモチ\",\"blastbeat\":\"BLASTBEAT\",\"takashina at masato\":\"高阶@圣人\",\"shibayuki\":\"しばゆき\",\"newmen\":\"NeWMeN\",\"miyasaka miyu\":\"宫坂みゆ\",\"miyasaka naco\":\"宫坂なこ\",\"shimahara\":\"40原\",\"hayakawa akari\":\"早川あかり\",\"masaharu\":\"まさはる\",\"ail\":\"あいる\",\"saigado\":\"彩画堂\",\"nanase meruchi\":\"ななせめるち\",\"marushin\":\"丸新\",\"amamiya mizuki\":\"雨宫ミズキ\",\"mibu natsuki\":\"みぶなつき\",\"ogata zen\":\"尾形全\",\"himura kiseki\":\"比村奇石\",\"cle masahiro\":\"吴マサヒロ\",\"nakajima yuka\":\"なかじまゆか\",\"fujima takuya\":\"藤真拓哉\",\"hisasi\":\"Hisasi\",\"akizora momidi\":\"秋空もみぢ\",\"yuunagi sesina\":\"夕凪セシナ\",\"ippongui\":\"一本杭\",\"sekine hajime\":\"咳寝はじめ\",\"mura osamu\":\"ムラオサム\",\"sody\":\"Sody\",\"fujiwara shunichi\":\"藤原俊一\",\"ohigetan\":\"尾髭丹\",\"kisaragi-mic\":\"如月みっく\",\"kisaragi-ice\":\"如月あいす\",\"takanashi rei\":\"小鸟游レイ\",\"kawakami rokkaku\":\"川上六角\",\"niro\":\"にろ\",\"okuri banto\":\"送り万都\",\"runrun\":\"るんるん\",\"zonda\":\"ぞんだ\",\"bekkankou\":\"べっかんこう\",\"santa matsuri\":\"さんた茉莉\",\"quick wiper\":\"クイック賄派\",\"jigoku ouji\":\"地狱王子\",\"kobayashi youkoh\":\"小林由高\",\"saeki tatsuya\":\"佐伯达也\",\"mamo williams\":\"まもウィリアムズ\",\"koga nozomu\":\"古我望\",\"shinokawa arumi\":\"篠川あるみ\",\"ichio\":\"イチオ\",\"shimada fumikane\":\"岛田文金\",\"ryohka\":\"凉香\",\"shinkai makoto\":\"新海诚\",\"benet\":\"ベネット\",\"ponpon\":\"ぽんぽん\",\"tetsujin\":\"铁人\",\"hiyoko\":\"ひよさん\",\"syukurin\":\"シュクリーン\",\"araki kanao\":\"あらきかなお\",\"nagiyama\":\"那岐山\",\"kittsu\":\"キッツ\",\"neko toufu\":\"猫豆腐\",\"nagare hyo-go\":\"流ひょうご\",\"mizuki gyokuran\":\"瑞姬玉兰\",\"tenchisouha\":\"天地争霸\",\"arui ryou\":\"あるい椋\",\"sasamori tomoe\":\"笹森トモエ\",\"sasai saji\":\"笹井さじ\",\"okazaki takeshi\":\"岡崎武士\",\"harukaze soyogu\":\"春风ソヨグ\",\"kasi\":\"华师\",\"cheru\":\"ちぇる\",\"umedama nabu\":\"梅玉奈部\",\"aranmaru\":\"亚兰丸\",\"tachibana omina\":\"立花オミナ\",\"ibuki ren\":\"伊吹莲\",\"uran\":\"URAN | 雨兰\",\"billion\":\"Billion\",\"nanao\":\"ななお\",\"pirontan\":\"ピロンタン\",\"tokyo yamane\":\"东京0ヤマネ\",\"yuki higasinakano\":\"ゆーき東中野\",\"nosada\":\"乃定\",\"yukibuster z\":\"ユキバスターZ\",\"roga\":\"RoGa\",\"bonnari\":\"ぼんなり\",\"komone ushio\":\"相音うしお\",\"yuriko\":\"白河子\",\"nanno koto\":\"南野琴\",\"minazuki mikka\":\"水无月三日\",\"minazuki juuzou\":\"水无月十三\",\"minazuki tooru\":\"水无月彻\",\"minazuki no-mu\":\"水无月のーむ\",\"minazuki satoshi\":\"水无月サトシ\",\"minazuki futago\":\"みなづきふたご\",\"minazuki tsuyuha\":\"水无月露叶\",\"minaduki kanna\":\"水无月神奈\",\"karaage tarou\":\"からあげ太郎\",\"okumori boy\":\"奥森ボウイ\",\"sahara wataru\":\"砂原涉\",\"amano kazumi\":\"天乃一水\",\"ichiyo moka\":\"一叶モカ\",\"naturalton\":\"なちゅらるとん\",\"aono ribbon\":\"青野りぼん\",\"hidaka toworu\":\"ヒダカトヲル\",\"rara8\":\"らら8\",\"medaka kenichi\":\"目高健一\",\"kanna\":\"かん奈\",\"kazabuki poni\":\"风吹ぽに\",\"ouma tokiichi\":\"逢魔刻壹\",\"momonoki fum\":\"百乃木富梦\",\"miito shido\":\"三糸シド\",\"motomiya mitsuki\":\"もとみやみつき\",\"interstellar\":\"Interstellar\",\"mikeou\":\"みけおう\",\"hinata nao\":\"日向奈尾\",\"sakurazaka tsuchiyu\":\"樱坂千由\",\"yamakaze ran\":\"やまかぜ嵐\",\"anko\":\"あん子 | あんこ\",\"kohaku.\":\"こはく。\",\"kousaka jun\":\"香坂纯\",\"gerotan\":\"げろたん\",\"kozakura kumaneko\":\"小樱クマネコ\",\"distance\":\"DISTANCE\",\"kawaraya a-ta\":\"瓦屋A太\",\"usou\":\"雨草\",\"awayume\":\"淡梦\",\"shiroo\":\"しろー\",\"ryokucha\":\"绿茶\",\"niimaru yuu\":\"ニイマルユウ\",\"simon\":\"さいもん\",\"tanaka aji\":\"田中あじ\",\"unadon\":\"うな井\",\"otakumin\":\"オタクミン\",\"muneshiro\":\"むねしろ\",\"haruki genia\":\"はるきゲにあ\",\"ikegami tatsuya\":\"池上龙矢\",\"pony r\":\"ポニーR\",\"sakura yuu\":\"桜ゆう\",\"yan-yam\":\"Yan-Yam\",\"watanabe kenpo\":\"渡边宪法\",\"kamiya zuzu\":\"神谷ズズ\",\"tsumumaru hifu\":\"纺丸ひふ\",\"yasakani an\":\"ヤサカニ·アン\",\"ayachi\":\"あやち\",\"kurori\":\"くろり\",\"suwa izumo\":\"诹访出云\",\"ishigami kazui\":\"石神一威\",\"kamogawa tanuki\":\"鸭川狸\",\"shiruka bakaudon\":\"知るかバカうどん\",\"amekosame\":\"雨小雨\",\"kiira\":\"きぃら～☆\",\"kanoe\":\"庚\",\"daichi kouta\":\"大地巧太\",\"kylin\":\"Kylin\",\"morishima kon\":\"森岛コン\",\"mdo-h\":\"无道睿智\",\"ginyou haru\":\"银曜晴\",\"shiina\":\"シイナ\",\"mikuta\":\"みくた\",\"shibasaki syouzi\":\"柴崎しょうじ（柴崎ショージ）\",\"tempo gensui\":\"天蓬元帅\",\"mafuyu\":\"真冬\",\"kakugari kyoudai\":\"カクガリ兄弟\",\"matsumomo mahiru\":\"松百まひる\",\"aoi masami\":\"苍海\",\"itou life\":\"伊东life\",\"taniguchi-san\":\"谷口さん\",\"amou mari\":\"天羽真理\",\"tsuttsu\":\"つっつ\",\"minarai zouhyou\":\"见习杂兵\",\"aya\":\"AYA | 蓝夜\",\"oi shibako\":\"しばこ（司马淳子）\",\"sato-satoru\":\"さとーさとる\",\"gengorou\":\"源五郎\",\"rokuyo ten\":\"六曜テン\",\"mitsuru\":\"みつる\",\"rage\":\"らげ\",\"chouzetsu bishoujo mine\":\"超绝美少女mine\",\"fried\":\"ふりいど\",\"kouji\":\"孝治\",\"sanada\":\"さなだ\",\"shikei\":\"しけー\",\"ruri\":\"ルリ | るり | 瑠璃\",\"kohata tsunechika\":\"小旗つねちか\",\"carn\":\"夏庵\",\"okada kou\":\"冈田コウ\",\"neko pantsu\":\"ねこパンツ\",\"suzunone rena\":\"铃音れな\",\"miyabi\":\"美矢火\",\"pochi.\":\"ぽち。\",\"hayami jun\":\"早见纯\",\"katou chakichi\":\"加藤茶吉\",\"taono kinoko\":\"汰尾乃きのこ\",\"aikawa monako\":\"あいかわモナコ\",\"tenma femio\":\"天马ふぇみお\",\"kurusumin\":\"来须眠\",\"chobi\":\"ちょび\",\"norakuro nero\":\"野良黑ネロ\",\"izumi yuujiro\":\"泉ゆうじろ～\",\"itameshi\":\"炒饭\",\"hiraoka ryuichi\":\"平冈龙一\",\"maguro teikoku\":\"まぐろ帝国\",\"pote\":\"ぽて\",\"karakuchi choucream\":\"辛口しゅーくりーむ\",\"mafen\":\"マフェン\",\"kuroda kuro\":\"黑田クロ\",\"ooooalikui\":\"おおおおありくい\",\"juna juna juice\":\"ジュナジュナジュース\",\"hiro hiroki\":\"ひろひろき\",\"yone kinji\":\"与根金次\",\"zankuro\":\"ザンクロー\",\"wa\":\"WA\",\"satou kuuki\":\"左藤空气\",\"kouzuki hajime\":\"香月一花\",\"furukawa remon\":\"古川れもん\",\"nukunuku batten\":\"ぬくぬくばってん\",\"sadokko\":\"さどっこ\",\"izumi\":\"和泉\",\"reizei\":\"冷泉\",\"petenshi\":\"ペテン师\",\"maruwa tarou\":\"丸和太郎\",\"fujishima sei1go\":\"藤岛制1号\",\"nanotsuki\":\"なのつき\",\"norutaru\":\"のるたる\",\"koi\":\"Koi\",\"koishi chikasa\":\"小石ちかさ\",\"koikawa minoru\":\"恋河ミノル\",\"koiko irori\":\"恋小いろり\",\"koi nobori\":\"Koiのぼり\",\"koiken\":\"こいけん\",\"koizumi hitsuji\":\"小泉ひつじ\",\"hormone koijirou\":\"ホルモン恋次郎\",\"koinu\":\"こいぬ\",\"kinnotama\":\"またのんき▼\",\"suka\":\"すか\",\"amazon\":\"雨存\",\"milk jam\":\"みるくジャム\",\"isami nozomi\":\"伊佐美ノゾミ\",\"souryuu\":\"双龙\",\"umi suzume\":\"雨美すずめ\",\"michiking\":\"米奇王\",\"otabe sakura\":\"おたべさくら\",\"ryo\":\"RYO\",\"minori kenshirou\":\"实验四郎\",\"umemura\":\"梅村\",\"peter mitsuru\":\"ペーター・ミツル\",\"tennouji kitsune\":\"天王寺狐\",\"shikishima tenki\":\"敷岛天气\",\"shikishima shoutarou\":\"敷岛昭太郎\",\"siina yuuki\":\"椎名悠輝\",\"manami tatsuya\":\"真未たつや\",\"miharu\":\"美春 | ミハル\",\"mush\":\"むっしゅ\",\"haneinu\":\"跳犬\",\"misaki takahiro\":\"はぶらえる\",\"sada ko-ji\":\"さだこーじ\",\"mikami mika\":\"三上ミカ\",\"nagare ippon\":\"流一本\",\"hicoromo kyouichi\":\"绯衣响一\",\"akaze kidai\":\"亚风纪代\",\"yuuki\":\"悠宇树\",\"ohkami ryosuke\":\"狼亮辅\",\"jitsuma\":\"儿妻\",\"kawaisaw\":\"可哀想\",\"alpha alf layla\":\"α・アルフライラ\",\"tori hrami\":\"鳥ハラミ\",\"mori marimo\":\"もりまりも\",\"fujisaka lyric\":\"藤坂リリック\",\"mori kouichirou\":\"杜講一郎\",\"sakura akami\":\"さくらあかみ\",\"hatomugi munmun\":\"鳩麦月々\",\"gegera toshikazu\":\"げげら俊和\",\"eromame\":\"えろ豆\",\"momoya chika\":\"桃屋チカ\",\"ooshima tomo\":\"大岛智\",\"hinemosu notari\":\"ひねもすのたり\",\"kurasawa makoto\":\"倉澤まこと\",\"bokujou nushi k\":\"牧场主K\",\"youta\":\"夜歌 | よう太\",\"tsumugi kyuuta\":\"紬きゅうた\",\"minaga tsukune\":\"水賀つくね\",\"cha mirai\":\"茶みらい\",\"serizawa\":\"芹泽\",\"toono suika\":\"远野西瓜\",\"pierre yoshio\":\"ピエ～ル☆よしお\",\"shinji mao\":\"真慈真雄\",\"aoi manabu\":\"あおいまなぶ\",\"izumi tsubasu\":\"和泉つばす\",\"sakai hamachi\":\"堺はまち\",\"kannazuki nem\":\"神無月ねむ\",\"sakurabe notos\":\"桜部のとす\",\"misaki kurehito\":\"深崎暮人\",\"kuroya shinobu\":\"黑谷忍\",\"san sheng wan\":\"三生万\",\"el\":\"える\",\"mango pudding\":\"まんごープリン\",\"wakamiya santa\":\"若宫参太\",\"shungiku tenudon\":\"春菊天うどん\",\"mikaduki neko\":\"三日月ネコ\",\"aihara shouta\":\"相原翔太\",\"mimofu\":\"みもふ\",\"takatuki nato\":\"鷹月ナト\",\"shiratama\":\"白玉\",\"nohara hiromi\":\"野原ひろみ\",\"higashino mikan\":\"東野みかん\",\"dr.bug\":\"Dr.阿虫\",\"ameto yuki\":\"あめとゆき\",\"kenkou cross\":\"健康クロス\",\"yanagawa rio\":\"やながわ理央\",\"kakuzatou\":\"核座头\",\"kaminagi\":\"神凪\",\"twinbox\":\"TwinBox\",\"izuminoaru\":\"イズミノアル\",\"nora shinji\":\"白野じん\",\"shihachiro\":\"しはちろ\",\"daikoukoku shinbun\":\"大広告新聞\",\"yuuki hagure\":\"憂姫はぐれ\",\"paru\":\"パル\",\"rikatan\":\"利华炭☆\",\"jackdempa\":\"弱电波\",\"hiyama izumi\":\"火山一角\",\"kazuma muramasa\":\"和马村政\",\"amatsuka china\":\"天使ちな\",\"denki shougun\":\"电气将军\",\"gibuchoko\":\"ぎヴちょこ\",\"sinbo tamaran\":\"神保玉兰\",\"kaenuco\":\"かえぬこ\",\"arikawa satoru\":\"有河サトル\",\"yui toshiki\":\"唯登诗树\",\"kitahara tomoe\":\"北原朋萌。\",\"kizaki yuuri\":\"树崎祐里\",\"shio kazunoko\":\"塩かずのこ\",\"muska\":\"むすか\",\"amaduyu tatsuki\":\"甘露树\",\"kawata hisashi\":\"カワタヒサシ\",\"mitsumi misato\":\"みつみ美里\",\"nakamura takeshi\":\"なかむらたけし\",\"minase syu\":\"水濑修\",\"yoshiura kazuya\":\"由浦カズヤ\",\"erect sawaru\":\"エレクトさわる\",\"katsurai yoshiaki\":\"桂井よしあき\",\"sanazura hiroyuki\":\"さなづらひろゆき\",\"takamura wamu\":\"高村わむ\",\"menoko\":\"めの子\",\"tamon\":\"たもん\",\"haruaki\":\"明彰\",\"oomori yoshiharu\":\"おおもりよしはる\",\"amedamacon\":\"飴玉コン\",\"eisen\":\"英战\",\"harigane shinshi\":\"针金绅士\",\"kazuhiro\":\"一弘\",\"lobster\":\"ロブ☆スター\",\"magifuro konnyaku\":\"magifuro蒟蒻\",\"ueda john\":\"うえだジョン\",\"wenajii\":\"ヱナジー\",\"zeno\":\"是乃\",\"imizu\":\"威未図\",\"shindou hajime\":\"新道一\",\"type.90\":\"TYPE.90\",\"bu-chan\":\"ぶーちゃん\",\"sasahiro\":\"笹弘\",\"haikawa hemlen\":\"灰川ヘムレン\",\"harasho\":\"はらしょ\",\"nishimu\":\"にしむ\",\"narita koh\":\"成田コウ\",\"shiden\":\"しでん\",\"mira\":\"みら | 未镜\",\"fuusen club\":\"風船クラブ\",\"shioroku\":\"シオロク\",\"kaname aomame\":\"要青豆\",\"kouno yukiyo\":\"こうのゆきよ\",\"seno fumiki\":\"濑野文希\",\"shimuu\":\"しゃむ\",\"rie-chan 14-sai\":\"りえちゃん14歳\",\"fukori\":\"フコリ\",\"shinyashiki\":\"新屋敷\",\"kanzume\":\"KANZUME\",\"kishimen\":\"きしめん\",\"ken-1\":\"Ken-1\",\"midoh tsukasa\":\"御堂つかさ\",\"oyama yasunaga\":\"尾山泰永\",\"kino hitoshi\":\"鬼ノ仁\",\"tam-u\":\"Tam-U\",\"lunaluku\":\"るなるく\",\"shiokonbu\":\"しおこんぶ\",\"mon-mon\":\"MON-MON\",\"kohoshi moe\":\"小星萌\",\"kurumiko\":\"胡桃子\",\"hirari\":\"ひらり\",\"aoi nagisa\":\"葵渚\",\"alde hyde\":\"アルデヒド\",\"mutsuno hexa\":\"六ツ野へきさ\",\"takenokoya\":\"筍屋\",\"ankoku tiger\":\"暗黒タイガー\",\"kakkii\":\"かっきー\",\"shizuki shuya\":\"紫月秋夜\",\"himukai kyousuke\":\"日向恭介\",\"fuyutugu\":\"冬嗣\",\"mogudan\":\"モグダン\",\"100yen locker\":\"100円ロッカー\",\"hana hook\":\"华フック\",\"taki minashika\":\"滝美梨香\",\"hirame\":\"ヒラメ | 比目鱼\",\"minakami rinka\":\"水上凛香\",\"andou shuki\":\"安藤周记\",\"nakata shunpei\":\"中田春平\",\"kurun\":\"くるん\",\"inuzumi masaki\":\"戌角柾\",\"kurashima tomoyasu\":\"仓岛丈康\",\"hanamo daiou\":\"はなも大王\",\"mizu gokiburi\":\"水ゴキブリ\",\"kazumu\":\"一梦\",\"rentb\":\"Rentb\",\"ren\":\"REN\",\"kotera\":\"コテラ\",\"fei\":\"飞燕\",\"miyano kintarou\":\"宫野金太郎\",\"sumino yuuji\":\"速野悠二\",\"shouji ayumu\":\"小路步\",\"maka fushigi\":\"魔訶不思議\",\"draw2\":\"土狼弐\",\"muronaga chaashuu\":\"室永叉烧\",\"sawao\":\"さわお\",\"kudou hiroshi\":\"工藤洋\",\"tsurui\":\"鹤井\",\"okiraku nic\":\"お気楽ニック\",\"kanten\":\"寒天\",\"usubeni sakurako\":\"うすべに桜子\",\"nori\":\"糊\",\"mitsugi\":\"ミツギ\",\"seura isago\":\"濑浦沙悟\",\"tsukudani norio\":\"佃煮のりお\",\"kasugano tobari\":\"春日野トバリ\",\"hisaka hazara\":\"檜坂はざら\",\"sumiyao\":\"すみやお\",\"ikkyuu\":\"一休\",\"hasemi ryo\":\"长谷见亮\",\"summer\":\"サマー\",\"tokitsu mika\":\"都月十佳\",\"arigase shinji\":\"ありがせしんじ\",\"arisaka k\":\"有坂K\",\"asakaze abyss\":\"朝風あびす\",\"youki akira\":\"优希辉\",\"matsuda k\":\"マツダK\",\"amanatsu aki\":\"甘夏あき\",\"magukappu\":\"马克杯\",\"michiyon\":\"みちよん\",\"hijiri tsukasa\":\"圣☆司\",\"tsukino jyogi\":\"月野定规\",\"gotou junji\":\"后藤润二\",\"nogi makoto\":\"のぎまこと\",\"shinonome ryu\":\"东云龙\",\"nikusyo\":\"弐駆緒\",\"shimanto youta\":\"四万十曜太\",\"sugou hiroyuki\":\"菅生博倖\",\"bow rei\":\"某零\",\"inochi wazuka\":\"命わずか\",\"hiduki yayoi\":\"ひづき夜宵\",\"komori kei\":\"こもりけい\",\"toyama teiji\":\"戸山テイジ\",\"komiya hitoma\":\"こみやひとま\",\"hitsuji takako\":\"ひつじたかこ\",\"mizoro tadashi\":\"深泥正\",\"q-gaku\":\"Q-Gaku\",\"kemigawa mondo\":\"検見川もんど\",\"tadano akira\":\"只野あきら\",\"kaisen chuui\":\"开栓注意\",\"ozy\":\"オジィ\",\"sakurai shizuku\":\"桜井雫\",\"kokutou nikke\":\"黒糖ニッケ\",\"makuwauni\":\"まくわうに\",\"seki\":\"赤\",\"monorino\":\"モノリノ\",\"tomohiro kai\":\"智弘カイ\",\"kuribayashi chris\":\"栗林クリス\",\"nagai wataru\":\"长井わたる\",\"suzuhane suzu\":\"すずはねすず\",\"tanaka decilitre\":\"田中竕\",\"yahiro\":\"黑小枝\",\"sabamu\":\"鲭梦\",\"fujise akira\":\"藤瀬あきら\",\"shouryuu\":\"升龙\",\"kisaragi wataru\":\"如月わたる\",\"mizone\":\"みぞね\",\"herokey\":\"ヒーローキィ\",\"mikanuji\":\"みかん氏\",\"honda arima\":\"ほんだありま\",\"oshiki hitoshi\":\"御敷仁\",\"shimaji\":\"しまじ\",\"tenro aya\":\"天路あや\",\"meme50\":\"メメ50\",\"menea the dog\":\"メネア・ザ・ドッグ\",\"makibe kataru\":\"牧部かたる\",\"ikeshita maue\":\"池下真上\",\"ikuhana niro\":\"几花にいろ\",\"c.r\":\"しーあーる\",\"chimosaku\":\"ちもさく\",\"otoo\":\"ぉとぉ\",\"belu\":\"BeLu\",\"yotsuba chika\":\"四葉チカ\",\"hashimoto takashi\":\"桥本隆\",\"suzuhira hiro\":\"铃平广\",\"nishimata aoi\":\"西又葵\",\"hadumi rio\":\"羽純りお\",\"matsushita makako\":\"松下まかこ\",\"sakura hanpen\":\"桜はんぺん\",\"hatori piyoko\":\"羽鳥ぴよこ\",\"naenae\":\"なえなえ\",\"takayaki\":\"たかやKi\",\"uonuma yuu\":\"うおぬまゆう\",\"amamine\":\"あまみね\",\"niki\":\"にき\",\"rokudou itsuki\":\"六九導イツキ\",\"rubi-sama\":\"るび様\",\"wori\":\"ヲリ\",\"mura\":\"むら\",\"tsurusaki takahiro\":\"鹤崎贵大\",\"fusataka sikibu\":\"ふさたか式部\",\"kutani\":\"九手児\",\"takei masaki\":\"竹井正树\",\"yamaki rin\":\"山木铃\",\"shokushu-san\":\"触手さん\",\"wazakita\":\"わざきた\",\"erodezain koubou\":\"エロデザイン工房\",\"coffee-kizoku\":\"咖啡贵族\",\"rindou\":\"龙胆\",\"iruma kamiri\":\"いるまかみり\",\"zakkin\":\"杂菌\",\"aotsu umihito\":\"蒼津ウミヒト\",\"shiina soutyou\":\"椎名总长\",\"hikage eiji\":\"日阴影次\",\"amakura\":\"アマクラ\",\"ebi193\":\"えび193\",\"shinama\":\"しなま\",\"mars\":\"Mars\",\"yuran\":\"ゆらん\",\"toumi haruka\":\"遠海ハルカ\",\"chris\":\"CHRIS\",\"shiromaki mizuga\":\"みずが\",\"alpine\":\"あるぴーぬ\",\"yuuka nonoko\":\"夕華ののこ\",\"hakuho\":\"白凤\",\"ooshima ryou\":\"大嶋亮\",\"aeba fuchi\":\"飨庭渊\",\"hakka yuki\":\"薄荷ゆき\",\"derauea\":\"でらうえあ\",\"rurukichi\":\"るるキチ\",\"unasaka\":\"うなさか\",\"anmi\":\"Anmi\",\"kishizuka kenji\":\"木静谦二\",\"kanenomori sentarou\":\"金ノ森銭太郎\",\"hazuki kaoru\":\"八月薫\",\"kenzaki mikuri\":\"犬崎みくり\",\"kofunami\":\"こふなみ\",\"touma itsuki\":\"东磨树\",\"asaba yuu\":\"浅葉ゆう\",\"akizuki ryou\":\"秋月亮\",\"nanigawa rui\":\"名仁川るい\",\"ohkura kazuya\":\"大藏一也\",\"psycocko\":\"碎骨子\",\"hanainu\":\"花犬\",\"madoutei\":\"魔童贞\",\"ra\":\"RA\",\"yohane\":\"ヨハネ\",\"akiduki tsukasa\":\"秋月つかさ\",\"hanamiya natsuka\":\"花宮なつか\",\"nagayama yuunon\":\"永山ゆうのん\",\"sakura denbu\":\"樱田麸\",\"sin-go\":\"Sin-Go\",\"tsunagami\":\"つながみ\",\"yassy\":\"YASSY\",\"rokuwata tomoe\":\"六羽田トモエ\",\"souma\":\"相马\",\"annekuma\":\"ANNEKUMA\",\"108 gou\":\"108号\",\"akazawa red\":\"あかざわRED\",\"r-koga\":\"あ～る・こが\",\"ashimoto yoika\":\"あしもと☆よいか\",\"awaji himeji\":\"あわじひめじ\",\"itou\":\"いトう\",\"usashiro mani\":\"うさ城まに\",\"ookami uo\":\"オオカミうお\",\"kawady max\":\"カワディMAX\",\"kimio tamako\":\"きみおたまこ\",\"quzilax\":\"クジラックス\",\"gorgeous takarada\":\"ゴージャス宝田\",\"zaki zaraki\":\"ザキザラキ\",\"tamachi yuki\":\"たまちゆき\",\"bar peachpit\":\"バー・ぴぃちぴっと\",\"higashiyama show\":\"东山翔\",\"yoshino\":\"よしの\",\"minion\":\"みにおん\",\"nishikibasami\":\"二式鋏\",\"onizuka naoshi\":\"鬼束直\",\"hayashibara hikari\":\"林原ひかり\",\"suzuki kyoutarou\":\"铃木狂太郎\",\"nekogen\":\"猫玄\",\"kiya shii\":\"木谷椎\",\"molokonomi\":\"平屋のぼり\",\"maeshima ryou\":\"前岛龙\",\"yamazaki kazuma\":\"山崎かずま\",\"momonosuke\":\"桃之助\",\"murian\":\"无有利安\",\"mutou mato\":\"武藤まと\",\"kobayashi oukei\":\"小林王桂\",\"tanabe kyou\":\"田边京\",\"kiai neko\":\"樺島あきら\",\"charu\":\"茶琉\",\"tamahagane\":\"たまはがね\",\"nakani\":\"なかに\",\"mizuryu kei\":\"水龙敬\",\"oyari ashito\":\"大枪苇人\",\"hagiya masakage\":\"はぎやまさかげ\",\"siina tai\":\"椎名鲷\",\"greenteaneko\":\"GreenTeaNeko\",\"kuroshiro neko\":\"黑白音子\",\"dean\":\"ディーン\",\"mizutani rin\":\"みずたにりん\",\"ayakase chiyoko\":\"綾枷ちよこ\",\"ayakase riberi\":\"綾枷りべり\",\"yuasa\":\"ゆあさ\",\"genzaburoh\":\"Genzaburoh\",\"smac\":\"SMAC\",\"hie himiko\":\"日枝御子\",\"hisakawa tinn\":\"久川ちん\",\"mizuhara yuu\":\"水原优\",\"hasumi milk\":\"はすみみるく\",\"karasu\":\"空巢\",\"akiha at\":\"あきは@\",\"amagiri mio\":\"雨雾MIO\",\"bifidus\":\"ビフィダス\",\"ice\":\"ICE\",\"kumoemon\":\"くもえもん\",\"kuro fn\":\"クロFn\",\"lorica\":\"Lorica\",\"nakayama tetsugaku\":\"中山哲学\",\"nisepakuman-san\":\"偽パクマンさん\",\"oobayashi mori\":\"大林森\",\"piero\":\"PIえろ\",\"saida kazuaki\":\"さいだ一明\",\"sayryu\":\"性龙\",\"tsukasawa\":\"塚泽\",\"yukiguni omaru\":\"雪國おまる\",\"asakura mitsuru\":\"朝仓满\",\"hase tsubura\":\"长谷圆\",\"herohero tom\":\"へろへろTom\",\"hoshino ryuichi\":\"星野龙一\",\"inoue nanaki\":\"井上七树\",\"macaroni and cheese\":\"マカロニandチーズ\",\"mozu k\":\"もずK\",\"natsuka q-ya\":\"奈塚Q弥\",\"sakaki utamaru\":\"榊歌丸\",\"yontarou\":\"よんたろう\",\"hamada yoshikadu\":\"浜田よしかづ\",\"meowwithme\":\"MeowWithMe\",\"nishizaki eimu\":\"西崎えいむ\",\"mutsumi masato\":\"むつみまさと\",\"samerupa\":\"さめるぱ\",\"yumemi\":\"ゆめみ\",\"watsuki ayamo\":\"わつき彩雲\",\"yataro\":\"やたろー\",\"poco\":\"ポコ\",\"mucha\":\"むちゃ\",\"fujimaru\":\"藤丸\",\"gechu\":\"ゲッチュ\",\"owanta\":\"Owanta\",\"mikan\":\"みかん\",\"amanatsu mero\":\"甘夏メロ\",\"sayika\":\"Sayika\",\"rihito akane\":\"りひと茜\",\"abe inori\":\"阿部いのり\",\"akuochisukii sensei\":\"アクオチスキー先生\",\"ameyama denshin\":\"雨山电信\",\"aoyama mayama\":\"青山まやま\",\"bitch goigostar\":\"ビッチ☆ゴイゴスター\",\"danbo\":\"ダンボ\",\"dunga\":\"ドゥンガ\",\"musashi daichi\":\"武蔵ダイチ\",\"nukunuku orange\":\"ヌクヌクオレンジ\",\"onikubo hirohisa\":\"鬼窪浩久\",\"sagattoru\":\"サカッとる\",\"tamaki\":\"TAMAKI\",\"ahemaru\":\"アヘ丸\",\"akikusa peperon\":\"秋草ぺぺろん\",\"drachef\":\"ドラチェフ\",\"hikage hinata\":\"日陰ひなた\",\"kijima daisyarin\":\"鬼岛大车轮\",\"minikoara\":\"瑞稀樱花\",\"nanairo\":\"ナナイロ\",\"ryuuta\":\"竜太\",\"shomu\":\"しょむ\",\"sunagawa tara\":\"砂川多良\",\"amahara\":\"天原\",\"arino hiroshi\":\"ありのひろし\",\"cheewts\":\"ちいうつ\",\"katsura airi\":\"桂あいり\",\"koori\":\"粉织\",\"red-rum\":\"RED-RUM\",\"ryoh-zoh\":\"椋藏\",\"shouji nigou\":\"庄司二号\",\"henrybird\":\"半里バード9\",\"homing\":\"ホーミング\",\"kageno illyss\":\"影乃いりす\",\"katou jun\":\"加藤じゅん\",\"kuroda ariake\":\"黑田有明\",\"miyabi tatsuto\":\"みやびたつと\",\"mizuki eimu\":\"みずきえいむ\",\"momon kooji\":\"ももんこーじ\",\"monogusa wolf\":\"ものぐさうるふ\",\"moroha\":\"乙\",\"naitou satoshi\":\"乃藤悟志\",\"oonuki makuri\":\"大貫まくり\",\"sabashi renya\":\"左桥レンヤ\",\"t.k-1\":\"T.K-1\",\"tachibana surimu\":\"橘すりむ\",\"takahashi kobato\":\"高橋こばと\",\"takashita takashi\":\"たかしたたかし\",\"yokoi rego\":\"横井レゴ\",\"amayumi\":\"あまゆみ\",\"ameya kirica\":\"飴屋きりか\",\"arsenal\":\"アーセナル\",\"asagi ryu\":\"あさぎ龍\",\"hayano rinta\":\"早野りんた\",\"jenigata\":\"ジェニガタ\",\"mita kurumi\":\"みたくるみ\",\"mutsuki\":\"睦月\",\"shinobu tanei\":\"志乃武丹英\",\"cuzukago\":\"くずかご\",\"kojima miu\":\"儿岛未生\",\"kokudakaya\":\"こくだかや\",\"kuroishi ringo\":\"黒石りんご\",\"mokuzou\":\"杢臓\",\"suitekiya yuumin\":\"水滴家悠民\",\"takasugi kou\":\"タカスギコウ\",\"uramac\":\"うらまっく\",\"isawa nohri\":\"いさわのーり\",\"kinomoto anzu\":\"木之本杏\",\"misumi tsubaki\":\"三澄ツバキ\",\"nekodanshaku\":\"猫男爵\",\"oosawa ofuda\":\"大沢おふだ\",\"ryoumoto hatsumi\":\"岭本八美\",\"salad\":\"さらだ\",\"sawayaka samehada\":\"さわやか鮫肌\",\"ueda yuu\":\"上田裕\",\"usakun\":\"兔君\",\"chiguchi miri\":\"チグチミリ\",\"fuyuno mikan\":\"冬野みかん\",\"hikoma hiroyuki\":\"彦馬ヒロユキ\",\"imotoka tsuyuki\":\"芋とか露木\",\"natsuki kiyohito\":\"夏木きよひと\",\"noise\":\"Noise\",\"nukkoru\":\"ぬっこる\",\"ponsuke\":\"ポンスケ\",\"satuyo\":\"さつよ\",\"soine\":\"添い寝\",\"takaoka motofumi\":\"高冈基文\",\"sink\":\"SINK\",\"warabino matsuri\":\"蕨野まつり\",\"nandz\":\"NandZ\",\"urakan\":\"U罗汉\",\"shiwasu horio\":\"師走ほりお\",\"pokachu\":\"ぽかちゅ\",\"wasabi\":\"わさび | 和錆\",\"naruko hanaharu\":\"鸣子花春\",\"bosshi\":\"ぼっしぃ\",\"inu\":\"犬\",\"takeda hiromitsu\":\"武田弘光\",\"shiwasu no okina\":\"师走之翁\",\"shindol\":\"新堂エル\",\"otono natsu\":\"音乃夏\",\"yasui riosuke\":\"ヤスイリオスケ\",\"kizuki aruchu\":\"鬼月あるちゅ\",\"sameda koban\":\"さめだ小判\",\"koume keito\":\"小梅京人\",\"thomas\":\"藤ます\",\"mutsutake\":\"睦茸\",\"midori no rupe\":\"绿のルーペ\",\"homunculus\":\"ホムンクルス\",\"lunch\":\"らんち\",\"inoue kiyoshirou\":\"胃之上奇嘉郎\",\"namonashi\":\"无望菜志\",\"oda non\":\"织田non\",\"nemunemu\":\"ネムネム\",\"makita masaki\":\"莳田真记\",\"hoshiai hilo\":\"星逢ひろ\",\"takase yuu\":\"鹰势优\",\"hiiragi masaki\":\"柊柾葵\",\"po-ju\":\"ぽ～じゅ\",\"abu hyaku\":\"あぶひゃく\",\"suehirogari\":\"末广雅里\",\"kuritsu yoshihiro\":\"くりつよしひろ\",\"guglielmo\":\"ぐりえるも\",\"kusano yuu\":\"草野ゆぅ\",\"matsuno susumu\":\"松野进\",\"murasaki syu\":\"むらさき朱\",\"nishi iori\":\"西安\",\"ohara tometa\":\"小原トメ太\",\"sakura koharu\":\"さくら小春\",\"junkos\":\"淳子\",\"hoshino lily\":\"星野リリィ\",\"heriyama\":\"缘山\",\"nasuyama\":\"茄子山\",\"misasagi task\":\"陵たすく\",\"oyu no kaori\":\"お湯の香り\",\"kojima saya\":\"小岛纱\",\"mitsuki sakura\":\"美月樱\",\"tmzf\":\"TMZF\",\"kamikaze makoto\":\"神风诚\",\"saikawa akoya\":\"斎川あこや\",\"saikawa yusa\":\"さいかわゆさ\",\"kita kaduki\":\"北かづき\",\"mach ii\":\"まぁくII\",\"tatsunami youtoku\":\"辰波要徳\",\"tinkle\":\"Tinkle\",\"kiriyama\":\"桐山\",\"takatsu\":\"高津\",\"gekkoji\":\"激昂寺\",\"monety\":\"もねてぃ\",\"hyji\":\"灰司\",\"rokuichi\":\"六壹\",\"yakumi benishouga\":\"药味红生姜\",\"takeyuu\":\"タケユウ\",\"pokka\":\"ぽっか\",\"hiroshiki\":\"宏式\",\"tonda\":\"Tonda\",\"matsu takeshi\":\"松武\",\"matsuzaki tsukasa\":\"松崎司\",\"zootan\":\"ZooTAN\",\"redlight\":\"REDLIGHT\",\"yukie\":\"ゆき恵\",\"raven\":\"RAVEN\",\"sujoyushi\":\"酢醤油氏\",\"date\":\"DATE\",\"kase daiki\":\"加濑大辉\",\"nakamura kumarin\":\"中村くまりん\",\"masago\":\"まさご\",\"ron\":\"RON\",\"zounose\":\"ゾウノセ\",\"suzuka sakito\":\"凉加早希兔\",\"sugi g\":\"すぎぢー\",\"kanzaki maguro\":\"潤咲まぐろ\",\"sakagaki\":\"サカガキ\",\"leslie brown\":\"Leslie Brown\",\"satsuki imonet\":\"皋月芋网\",\"chiyoko\":\"ちよこ\",\"marui maru\":\"丸居まる\",\"asuhiro\":\"アスヒロ\",\"bomb\":\"ボム\",\"eguchi jaws\":\"江口ジョーズ\",\"eno yukimi\":\"榎ゆきみ\",\"esuke\":\"えーすけ\",\"gintarou\":\"ぎん太郎\",\"hardboiled yoshiko\":\"ハードボイルドよし子\",\"hinahara emi\":\"雛原えみ\",\"hitori\":\"火鸟\",\"karasuma yayoi\":\"乌丸弥生\",\"napata\":\"なぱた\",\"nokin\":\"のきん\",\"savan\":\"SAVAN\",\"sugaishi\":\"すがいし\",\"sumiya\":\"スミヤ\",\"takashi\":\"タカシ\",\"ushino kandume\":\"牛野缶诘\",\"yahiro pochi\":\"八寻ぽち\",\"yanyo\":\"やんよ\",\"yuzuha\":\"ユズハ\",\"yamagara tasuku\":\"山雀たすく\",\"zumikuni\":\"ズミクニ\",\"juder\":\"Juder\",\"nagase yutaka\":\"长濑ゆたか\",\"yumeno owari\":\"ユメのオワリ\",\"kamimiya kozue\":\"神宫梢\",\"anzu\":\"庵ズ\",\"lu renbing\":\"路人丙\",\"takei ooki\":\"タケイオーキ\",\"azuma tesshin\":\"东铁神\",\"akagi asahito\":\"赤城あさひと\",\"benimura karu\":\"红村かる\",\"bota mochito\":\"牡丹もちと\",\"cuvie\":\"Cuvie\",\"hazuki yuto\":\"羽月ユウト\",\"hinasaki yo\":\"雏咲叶\",\"naruko\":\"鸣湖（平间ひろかず）\",\"hishigata tomaru\":\"ひし形とまる\",\"mokufu\":\"もくふう\",\"okumoto yuuta\":\"オクモト悠太\",\"regdic\":\"れぐでく\",\"shiba nanasei\":\"柴七世\",\"shimetta seiya\":\"湿った星夜\",\"tsukitokage\":\"月蜥蜴\",\"izumi yuhina\":\"いずみゆひな\",\"akino sora\":\"あきのそら\",\"yumeno tanuki\":\"梦乃狸\",\"ichinomiya\":\"一ノ宮\",\"kikuchi seiji\":\"菊池政治\",\"yabuki gou\":\"矢吹豪\",\"sanbun kyoden\":\"山文京传\",\"takunomi\":\"たくのみ\",\"1-gou\":\"1号\",\"kadoi aya\":\"门井亚矢\",\"doumeki bararou\":\"百目鬼蔷薇郎\",\"umiushi\":\"うみうし\",\"samidare setsuna\":\"五月雨せつな\",\"shinobe\":\"しのべ\",\"kamiya\":\"Kamiya | かみや\",\"aduma ren\":\"あづま煉\",\"akiya akira\":\"秋谷昭\",\"ashiomi masato\":\"アシオミマサト\",\"hamao\":\"Hamao\",\"hyocorou\":\"ひょころー\",\"ichimatsu\":\"いちまつ\",\"ishikawa shisuke\":\"石川シスケ\",\"itou ei\":\"いとうえい\",\"karma tatsurou\":\"かるま龍狼\",\"kizuka kazuki\":\"きづかかずき\",\"koppori nama beer\":\"こっぽり生ビール\",\"mojarin\":\"もじゃりん\",\"momoko\":\"ももこ\",\"netoromorikon\":\"ねとろもりこん\",\"okara\":\"おから\",\"reco\":\"Reco\",\"zanzi\":\"暂时\",\"hozumi kenji\":\"ほずみけんじ\",\"mel\":\"Mel\",\"getty\":\"Getty\",\"ramjak\":\"Ramjak\",\"the jinshan\":\"The Jinshan\",\"yu-ta\":\"YU-TA\",\"ooba nii\":\"大庭新\",\"yuuki sei\":\"结城成\",\"natsume eri\":\"なつめえり\",\"kuroinu juu\":\"黑犬兽\",\"bakutaso\":\"爆タソ\",\"mda starou\":\"MだSたろう\",\"tsuchigayu\":\"土粥\",\"myu-po\":\"myu-po\",\"nase\":\"名濑\",\"noba\":\"の歯\",\"shiki takuto\":\"史鬼匠人\",\"sakagami umi\":\"坂上海\",\"kuno touya\":\"九野十弥\",\"sakurasawa yukino\":\"さくらさわゆきの\",\"inomoto rikako\":\"井之本理佳子\",\"mikemono yuu\":\"神毛物由宇\",\"tsukioka kirio\":\"ツキオカキリオ\",\"nishi\":\"弐肆 | にし | 西\",\"chachaki noriyuki\":\"清山昌\",\"abe morioka\":\"あべもりおか\",\"akishima shun\":\"昭嶋しゅん\",\"alexi laiho\":\"荒岸来步\",\"dobato\":\"ドバト\",\"fuyu mikan\":\"冬みかん\",\"hatch\":\"ハッチ\",\"inoue yoshihisa\":\"井上よしひさ\",\"ken\":\"KEN | けん\",\"kimura neito\":\"木村宁都\",\"kir-rin\":\"きりりん\",\"ootori ryuuji\":\"おおとりりゅうじ\",\"suzunone kanata\":\"音々かなた\",\"terada nuki\":\"寺田ぬき\",\"wakana hanabi\":\"わかなはなび\",\"amecha\":\"アメちゃ\",\"tamano nae\":\"珠乃なえ\",\"caviar\":\"きゃびあ\",\"mojyako\":\"モジャコ\",\"hammer\":\"ハマー\",\"sugiyuu\":\"スギユウ\",\"wox yang\":\"沃克羊\",\"garland\":\"があらんど\",\"homare\":\"ほまれ | 誉\",\"amadume ryuuta\":\"甘诘留太（A・浪漫・我慢）\",\"blade\":\"BLADE\",\"itou seto\":\"イトウせと\",\"tanno ran\":\"タンノらん\",\"junk kameyoko\":\"JUNK龟横\",\"mizutenka\":\"水点下\",\"maro\":\"MARO\",\"eb110ss\":\"EB110SS\",\"equal\":\"イコール\",\"hippopotamus\":\"ひぽぽたます\",\"mikan r\":\"みかんR\",\"sanezaki tsukiuo\":\"志崎月鱼\",\"wang-pac\":\"わんぱく\",\"arai taiki\":\"新井大器\",\"ayano rena\":\"綾乃れな\",\"chuunen\":\"中年\",\"hanafuda sakurano\":\"花札さくらの\",\"kaponco taroh\":\"かぽんこたろう\",\"lockheart\":\"ロックハート\",\"nasipasuta\":\"なしぱすた\",\"poccora\":\"ぽっこら\",\"puyocha\":\"ぷよちゃ\",\"rakujin\":\"らくじん\",\"syuuen\":\"终焉\",\"harazaki takuma\":\"はらざきたくま\",\"hashimura aoki\":\"桥村青树\",\"malcorond\":\"まるころんど\",\"marugari santarou\":\"丸刈参太郎\",\"poncocchan\":\"ぽんこっちゃん\",\"tetsuna\":\"テツナ\",\"kazan no you\":\"火山の楊\",\"mtu\":\"MtU\",\"alp\":\"あるぷ\",\"chiba toshirou\":\"チバトシロウ\",\"choco pahe\":\"チョコぱへ\",\"hal\":\"HAL\",\"haruhisky\":\"春日喜欢\",\"ichinomiya yuu\":\"一宮夕羽\",\"inago\":\"INAGO\",\"maki daikichi\":\"牧だいきち\",\"raita\":\"来太\",\"sasachinn\":\"ささちん\",\"soushamoku\":\"桑柘木\",\"suzuki akoni\":\"鈴月あこに\",\"tachibana yuu\":\"橘由宇\",\"takeda aranobu\":\"武田あらのぶ\",\"jinnai\":\"ジンナイ\",\"dhibi\":\"ディビ\",\"fuuga\":\"枫牙\",\"yoshimura tatsumaki\":\"吉村龙卷\",\"hinokawa jun\":\"火の川純\",\"womi\":\"WOMI\",\"otsumami\":\"おつまみ\",\"shiramayumi\":\"白真弓\",\"chiro\":\"CHIRO | チろ\",\"junny\":\"JUNNY\",\"wakino keibun\":\"胁乃敬文\",\"suzuneco\":\"Suzu猫。\",\"utakata\":\"泡沫\",\"yakou\":\"夜光\",\"lambda\":\"Lambda\",\"pon takahanada\":\"ポン贵花田\",\"kazakura\":\"夏樱\",\"rikka kai\":\"リッカー改\",\"matsuryu\":\"松龙\",\"suzutsuki kurara\":\"涼月くらら\",\"naruhodo\":\"なるほど\",\"hb\":\"HB\",\"yamatogawa\":\"大和川\",\"obiwan\":\"obiwan\",\"xin\":\"xin\",\"aratamaru\":\"改多丸\",\"7zu7\":\"7zu7\",\"atage\":\"あたげ\",\"ebina ebi\":\"海老名えび\",\"kisen\":\"奇仙\",\"kyockcho\":\"局长\",\"maumen\":\"まうめん\",\"nukunuku\":\"ぬくぬく\",\"sumiyoshi\":\"すみよし\",\"umeko\":\"うめ子\",\"yamada yuuya\":\"ヤマダユウヤ\",\"yumoteliuce\":\"ユモテリウス\",\"ichihaya\":\"いちはや\",\"oboro\":\"胧\",\"takayanagi katsuya\":\"高柳カツヤ\",\"hori hiroaki\":\"堀博昭\",\"yuugiri\":\"夕雾\",\"eba\":\"EBA\",\"kutibue\":\"くちぶえ\",\"aoi shou\":\"葵抄\",\"myougi kulaganosuke\":\"妙義倉賀ノ助\",\"karatakewari\":\"からたけわり\",\"mifune seijirou\":\"三船诚二郎\",\"natsu no oyatsu\":\"夏のおやつ\",\"homura subaru\":\"焰すばる\",\"dakouin saburou\":\"蛇光院三郎\",\"gura nyuutou\":\"ぐら乳頭\",\"inomaru\":\"いのまる\",\"iori yuzuru\":\"庵让\",\"itaba hiroshi\":\"板场广志\",\"james hotate\":\"ジェームスほたて\",\"jamming\":\"じゃみんぐ\",\"mitsuki rintarou\":\"水月林太郎\",\"n.o. chachamaru\":\"N.O-茶々丸\",\"naga\":\"な～が\",\"nakamura nishiki\":\"中村锦\",\"noq\":\"NOQ（下月重吾）\",\"otonashi kyousuke\":\"音无响介\",\"saki urara\":\"さきうらら\",\"shinogi a-suke\":\"しのぎ鋭介\",\"tonami satoshi\":\"となみさとし\",\"yajima index\":\"矢岛Index\",\"amano yoshitaka\":\"天野喜孝\",\"aoba hachi\":\"青葉はち\",\"minami\":\"みなみ\",\"ouji hiyoko\":\"桜路ひよこ（ひなづか凉）\",\"yoshiro\":\"夜士郎\",\"urushihara satoshi\":\"漆原智志\",\"yukijirushi\":\"逝印\",\"riichu\":\"りいちゅ\",\"momo no suidousui\":\"モモの水道水\",\"kamitsurugi ouka\":\"神剑樱花\",\"kantaka\":\"かんたか\",\"katagiri hinata\":\"片桐雏太\",\"kinosaki reisui\":\"城崎冷水\",\"kuwada yuuki\":\"くわだゆうき\",\"mayusaki yuu\":\"茧咲悠\",\"natsuhiko\":\"夏彦\",\"reita\":\"rei太\",\"saeki hokuto\":\"さえき北都\",\"shinozuka atsuto\":\"しのづかあつと\",\"yatsuha kanan\":\"八叶香南\",\"hashibiro kou\":\"桥广こう\",\"koutarou\":\"こうたろう\",\"piririnegi\":\"ぴりりねぎ\",\"spiritus tarou\":\"スピリタス太郎\",\"tel\":\"朝峰テル\",\"tomomimi shimon\":\"ともみみしもん\",\"mitsumomo mam\":\"蜜桃まむ\",\"lolisin\":\"ろりしn\",\"miyako hito\":\"ミヤコヒト\",\"sola bozu\":\"空坊主\",\"mimonel\":\"ミモネル\",\"kloah\":\"Kloah\",\"chirumakuro\":\"ちるまくろ\",\"fumihiko\":\"ふみひこ\",\"gustav\":\"ぐすたふ\",\"matsuna hitoshi\":\"松名一\",\"uekan\":\"うえかん\",\"koga ryouichi\":\"古贺亮一\",\"sakai nayuta\":\"坂井なゆ太\",\"fan no hitori\":\"煌野一人\",\"yuuzu tsushiro\":\"ゆうづつしろ\",\"sendou hachi\":\"仙道八\",\"saeki\":\"佐伯\",\"cool kyou shinja\":\"クール教信者\",\"hirasaka fuyu\":\"比良坂冬\",\"joy\":\"じょい\",\"kasuga souichi\":\"カスガソウイチ\",\"kemonono\":\"けものの★\",\"mameko\":\"まめこ\",\"miyoshi\":\"みよし\",\"neriume\":\"ねりうめ\",\"odd\":\"Odd\",\"otone\":\"音音\",\"sakujirou\":\"咲次朗\",\"torimushi\":\"鸟莉蒸师\",\"ai ha muteki\":\"愛は無敵\",\"kazetani yasunari\":\"风谷安成\",\"amatarou\":\"天太郎\",\"aoi hitori\":\"葵ヒトリ\",\"aoten\":\"青点\",\"clone ningen\":\"clone人间\",\"dowman sayman\":\"道满晴明\",\"kagura moromi\":\"神楽もろみ\",\"mikaze takashi\":\"水风天\",\"kurogane kenn\":\"玄铁绚\",\"momo youkan\":\"ももようかん\",\"musashimaru\":\"ムサシマル\",\"nixinamo lens\":\"にびなも凸面体\",\"osomatsu\":\"おそまつ\",\"sanagi torajirou\":\"蛹虎次郎\",\"eiichirou\":\"瑛一朗\",\"izawa shinichi\":\"伊泽慎壹\",\"kurumiya mashimin\":\"胡桃屋ましみん\",\"miura takehiro\":\"みうらたけひろ\",\"sena youtarou\":\"濑奈阳太郎\",\"yumesaki sanjuro\":\"夢咲三十郎\",\"sakomae aichi\":\"佐古前あいち\",\"bakuya\":\"ばくや\",\"c.meiko\":\"C.みーこ\",\"eightman\":\"えいとまん\",\"henoeno\":\"へのえの\",\"kurofood\":\"くろふーど\",\"momozukuku\":\"ももずくく\",\"pija\":\"ピジャ\",\"psycho\":\"さいこ\",\"rico\":\"Rico\",\"tomonaga kenji\":\"友永ケンジ\",\"fukuyama naoto\":\"复八磨直兔\",\"kurokawa otogi\":\"黒川おとぎ\",\"satou takumi\":\"佐藤匠\",\"shino\":\"シノ\",\"shousan bouzu\":\"しょうさん坊主\",\"yamabuki zarame\":\"山吹ざらめ\",\"magatama\":\"マガタマ\",\"mako kujira\":\"まこくじら\",\"uesugi kyoushirou\":\"上杉响士郎\",\"kai hiroyuki\":\"甲斐ひろゆき\",\"kihiru\":\"きひる\",\"kogaku kazuya\":\"虎顎かずや\",\"kokonoki nao\":\"ここのき奈緒\",\"naz\":\"NAZ\",\"neriwasabi\":\"ねりわさび\",\"yonyon\":\"よんよん\",\"yugami goosyu\":\"由上ゴーシュ\",\"pedocchi\":\"ぺどっち\",\"hokou kikai\":\"补讲机械\",\"papermania\":\"奴隶妇人\",\"kawahagitei\":\"かわはぎ亭\",\"kirieppa\":\"キリエっぱ\",\"shohei\":\"将兵\",\"kiyose\":\"KIYOSE\",\"u-tom\":\"う~とむ\",\"shiramori yuse\":\"白森ゆせ\",\"bak hyeong jun\":\"朴亨濬\",\"yanagihara mitsuki\":\"柳原ミツキ\",\"ponkotsu works\":\"ぽんこつわーくす\",\"nibo\":\"にぼ\",\"mightyhonk\":\"MightyHonk\",\"goldendawn\":\"Goldendawn\",\"fatke\":\"FatKE\",\"satsuki neko\":\"五月猫\",\"akinashi yuu\":\"春夏冬ゆう\",\"jakou nezumi\":\"じゃこうねずみ\",\"nagi yuki\":\"凪居ユキ\",\"kusui aruta\":\"久水あるた\",\"tamanosuke\":\"たまのすけ\",\"minamihama yoriko\":\"南浜よりこ\",\"butcha-u\":\"ブッチャーU\",\"nekomata naomi\":\"ねこまたなおみ\",\"kiichi\":\"きいち\",\"norve watanabe\":\"なーべ渡辺\",\"jin\":\"Jin\",\"luv p\":\"Luv P\",\"rozer\":\"ROZER\",\"mame danuki\":\"まめだぬき\",\"lolicept\":\"Belko（LOLICEPT）\",\"shiduki michiru\":\"しづきみちる\",\"jet yowatari\":\"ジェット世渡り\",\"jigeum\":\"지금\",\"oyster\":\"オイスター\",\"imachi\":\"いまち\",\"momiyama\":\"もみやま\",\"shimantogawa\":\"四万十川\",\"zhen lu\":\"珍绿\",\"devilhs\":\"Devil_HS\",\"aina nana\":\"愛菜奈々\",\"yokoshima takemaru\":\"邪武丸\",\"hawa\":\"はわ\",\"tomose shunsaku\":\"トモセシュンサク\",\"reiha\":\"零覇\",\"chimaq\":\"チマQ\",\"magaki ryouta\":\"間垣りょうた\",\"yukino minato\":\"雪野みなと\",\"maruchang\":\"丸ちゃん。\",\"sukiyo\":\"スキヨ\",\"aiue oka\":\"爱上陆\",\"rustle\":\"らする\",\"calipur\":\"ｶﾘﾊﾟ−\",\"dokurosan\":\"どくろさん\",\"rebis\":\"Rebis\",\"taihei tengoku\":\"太平天极\",\"hitomaru\":\"人丸\",\"kurozu\":\"くろず\",\"unagimaru\":\"鳗丸\",\"decarabia\":\"デカラビア\",\"takurou\":\"たくろう\",\"tsukimoto kizuki\":\"月本筑希\",\"taigiakira\":\"タイギアキラ\",\"ishikawa naoya\":\"石川直哉\",\"takaku nozomu\":\"高玖のぞむ\",\"oni-noboru\":\"Oni-noboru\",\"hamo\":\"はも\",\"satsumaage\":\"さつま揚げ\",\"abu\":\"アブ | ABU\",\"sinntarou\":\"心太朗\",\"kotoba ai\":\"コトバアイ\",\"strong bana\":\"Strong Bana\",\"kuroadam\":\"黒葉だむ\",\"midoriiro no shinzou\":\"緑色の心臓\",\"kujou danbo\":\"九条だんぼ\",\"kagiyama pandora\":\"鍵山ぱんどら\",\"shitto mask\":\"嫉妬マスク\",\"umitsubame\":\"うみつばめ\",\"nanappe\":\"七っぺ\",\"akeyama kitsune\":\"绯山狐\",\"sakura\":\"樱\",\"yakiniku king\":\"烧肉キング\",\"nekoi hikaru\":\"猫伊光\",\"inanaki shiki\":\"稻鸣四季\",\"tohgarashi hideyu\":\"唐辛子ひでゆ\",\"shinjinkun\":\"新人君\",\"barlun\":\"ばーるん\",\"kiyomiya ryo\":\"清宫凉\",\"higata\":\"HIGATA\",\"outou chieri\":\"无洗米\",\"hoshizaki hikaru\":\"星崎ひかる\",\"shinoda sanjuurou\":\"篠田参重郎\",\"mimi mimizu\":\"実々みみず\",\"takemura sesshu\":\"竹村雪秀\",\"ishigami hajime\":\"石纸一\",\"kawamori misaki\":\"かわもりみさき\",\"nagashima chosuke\":\"ながしま超助\",\"ozaki akira\":\"尾崎晶\",\"shiomaneki\":\"シオマネキ\",\"takebayashi takeshi\":\"武林武士\",\"umemaru\":\"うめ丸\",\"eo masaka\":\"EOまさか\",\"hanabi\":\"HANABi\",\"kakizaki kousei\":\"垣崎コウセイ\",\"miyamoto issa\":\"宮元一佐\",\"murasaki nyaa\":\"紫☆にゃ～\",\"okyuuri\":\"おきゅうり\",\"parabola\":\"ぱらボら\",\"sugar milk\":\"シュガーミルク\",\"tachibana aruto\":\"橘アルト\",\"yamahata rian\":\"山畑璃杏\",\"muoto\":\"むおと\",\"emyo\":\"えみょ\",\"nazuna\":\"ナズナ\",\"mitsui jun\":\"三井纯\",\"tsurugi hagane\":\"蔓木钢音\",\"worin\":\"Worin\",\"haeilian\":\"Haeilian\",\"mayui yukisaki\":\"Mayui Yukisaki\",\"asan\":\"あさん\",\"akahige\":\"赤髭\",\"nangou jingeru\":\"南郷じんげる\",\"mitsurugi aoi\":\"能都くるみ\",\"kuuchuu yousai\":\"空中幼彩\",\"kotomi yo-ji\":\"ことみようじ\",\"hirowa nagi\":\"广轮凪\",\"kanehira morihito\":\"金平守人\",\"kii takashi\":\"キイタカシ\",\"kouzuki rio\":\"香月りお\",\"matsusaka takeshi\":\"松阪刚志\",\"nagai michinori\":\"永井道纪\",\"nagisa minami\":\"渚ミナミ\",\"alexi\":\"アレキシ\",\"benantoka\":\"Beなんとか\",\"dynamite moca\":\"ダイナマイトmoca\",\"sakurafubuki nel\":\"桜吹雪ねる\",\"urai tami\":\"浦井民\",\"yusa\":\"ゆさ\",\"gyuunyuu rinda\":\"牛乳リンダ\",\"usagi nagomu\":\"うさぎなごむ\",\"oohira sunset\":\"太平さんせっと\",\"obui\":\"おぶい\",\"amazeroth\":\"Amazeroth\",\"batsu\":\"ばつ\",\"campbell gichou\":\"キャンベル議長\",\"hinotsuki neko\":\"日月ネコ\",\"jake\":\"じぇいく\",\"kamaboko red\":\"かまぼこRED\",\"koharu nanakusa\":\"小春七草\",\"kousuke\":\"交介\",\"kuronomiki\":\"黒ノ樹\",\"kurosawa kiyotaka\":\"黒澤清崇\",\"misaki kaho.\":\"ミサキカホ。\",\"ogura shuuichi\":\"小仓修一\",\"yuuki homura\":\"结城焰\",\"yamamoto\":\"山本\",\"yamamoto yammy\":\"山本やみー\",\"murakami maki\":\"村上真纪\",\"ditama bow\":\"ぢたま(某)\",\"yabuki kentarou\":\"矢吹健太朗\",\"clamp\":\"CLAMP\",\"kinoshita rei\":\"きのした黎\",\"waero\":\"西野\",\"modaetei anetarou\":\"闷亭姉太郎\",\"modaetei imojirou\":\"闷亭妹次郎\",\"fuckuma\":\"ふぁっ熊\",\"itou daiku\":\"伊藤第九\",\"kaiduka\":\"かいづか\",\"moketa\":\"もけ太\",\"nodame\":\"nod饴\",\"sage joh\":\"sage・ジョー\",\"utsutsu minoru\":\"うつつ＊みのる\",\"isou doubaku\":\"位相同爆\",\"kenshou izanamu\":\"剣匠イザナム\",\"kotobuki kazuki\":\"琴吹かづき\",\"mayumi daisuke\":\"真弓大介\",\"nagano noriko\":\"永野のりこ\",\"protonsaurus\":\"プロトンザウルス\",\"sabe\":\"SABE\",\"shibata masahiro\":\"柴田昌弘\",\"youkihi\":\"阳气婢\",\"kinoshita ichi\":\"木下壹\",\"92m\":\"92M\",\"kasukabe taro\":\"春日部太郎\",\"zucchini\":\"ズッキーニ\",\"shirane taito\":\"白根戴斗\",\"morimi ashita\":\"森见明日\",\"upanishi.\":\"うぱ西。\",\"shimazu isami\":\"島津いさみ\",\"arumajiki\":\"或真じき\",\"uru\":\"Uru\",\"higashitotsuka raisuta\":\"東戸塚らいすた\",\"nizimoto hirok\":\"虹元ひろk\",\"kinnikku\":\"キンニック\",\"takepen\":\"タケペン\",\"taikou\":\"タイコウ\",\"aikawa touma\":\"藍川とうま\",\"tamanoi peromekuri\":\"玉乃井ぺろめくり\",\"shinozuka george\":\"筱塚酿二\",\"miotama\":\"みおたま\",\"kido keiji\":\"城户敬司\",\"terada ochiko\":\"寺田落子\",\"chimi\":\"ちみ\",\"haruyukiko\":\"はるゆきこ\",\"horitomo\":\"ほりとも\",\"jun\":\"Jun\",\"marneko\":\"まる寝子\",\"miyamoto liz\":\"宮本りず\",\"nanase mizuho\":\"七濑瑞穗\",\"satou souji\":\"佐藤想次\",\"shiina kazuki\":\"しいなかずき\",\"sumisuzu\":\"すみすず\",\"take\":\"タケ\",\"yukiusagi.\":\"ゆきうさぎ。\",\"clearite\":\"くれりて\",\"makuro\":\"まくろ\",\"bakugatou\":\"麦芽糖\",\"nekohane ryou\":\"猫羽燎\",\"gamang\":\"Gamang\",\"kiryu reihou\":\"桐生玲峰\",\"koutaro\":\"こうたろ\",\"sasaoka gungu\":\"笹岡ぐんぐ\",\"mikazuki akira\":\"みかづきあきら!\",\"mikoshiro honnin\":\"みこしろ本人\",\"ariko youichi\":\"有子瑶一\",\"taira tsukune\":\"平つくね\",\"monikano\":\"モニカノ\",\"kayama rim\":\"香山リム\",\"tomokichi\":\"友吉\",\"nagi ichi\":\"凪市\",\"ponz\":\"ぽん酢\",\"arekusa mahone\":\"荒草まほん\",\"akasa ai\":\"あかさあい\",\"mizu umi\":\"瑞海\",\"hisato\":\"ひさと\",\"gyuunyuu nomio\":\"牛乳乃澪\",\"konkichi\":\"绀吉\",\"butcherboy\":\"ButcherBOY\",\"aim\":\"AIM\",\"sasakuma kyouta\":\"ささくまきょうた\",\"tsujizen\":\"辻善\",\"mizukoshi mayu\":\"水越まゆ\",\"mitaonsya\":\"MITAONSYA\",\"tokumi yuiko\":\"笃见唯子\",\"dantetsu\":\"断铁（干支門三十四，〇タ）\",\"inuboshi\":\"犬星\",\"saitou tsukasa\":\"さいとうつかさ\",\"shinkaida tetsuyarou\":\"新贝田铁也郎\",\"sorimura youji\":\"そりむらようじ\",\"yamamoto kazue\":\"山本和枝\",\"natsuo monaka\":\"なつおもなか\",\"binkan argento\":\"びんかんargento\",\"minagiku\":\"みなぎく\",\"landolt tamaki\":\"ランドルトたまき\",\"kisaragi miyu\":\"如月みゆ\",\"igumox\":\"井云くす\",\"kuune rin\":\"くうねりん\",\"goto-beido\":\"ゴト・ベイドー\",\"morikura en\":\"森仓圆\",\"af kuro\":\"アフ黒\",\"kaguyuzu\":\"カグユヅ\",\"dsmile\":\"DSマイル\",\"monoto\":\"ものと\",\"snowmi\":\"すのみ\",\"dozamura\":\"どざむら\",\"kiryu\":\"Kiryu\",\"kozakura nanane\":\"小桜菜々音\",\"hazakura momo\":\"葉桜もも\",\"sakura syoji\":\"咲良将司\",\"hidiri rei\":\"ヒヂリレイ\",\"nadeara bukichi\":\"抚荒武吉\",\"qoopie\":\"Qoopie\",\"kanbe chuji\":\"かんべ忠治\",\"shuten douji\":\"酒呑童子\",\"murlachrot\":\"みうらっは\",\"tanaha\":\"棚叶\",\"sakai minato\":\"坂井みなと\",\"ijima yuu\":\"伊島ユウ\",\"inari\":\"稻荷\",\"momo-deary\":\"Momo-Deary\",\"nonaka tama\":\"のなかたま\",\"chinbotsu\":\"沈没\",\"teterun\":\"ててるん\",\"fuetakishi\":\"フエタキシ\",\"purukogi\":\"プルコギ\",\"sawaki koma\":\"沢木コマ\",\"ohtsuki tohru\":\"大槻とおる\",\"hidebou\":\"ひでぼう\",\"kiyose kaoru\":\"キヨセ薫\",\"asanagi\":\"朝凪\",\"kikunyi\":\"菊にぃ\",\"lasto\":\"らすと～\",\"yoroduya hyakuhachi\":\"万屋百八\",\"takapiko\":\"たかぴこ\",\"kobayashi chisato\":\"小林ちさと\",\"siomidu\":\"しおみづ\",\"fudou ran\":\"不动乱\",\"ikuya daikokudou\":\"几夜大黑堂\",\"kaduchi\":\"カヅチ\",\"sakurazuki masaru\":\"桜月マサル\",\"uchuu teiou\":\"宇宙帝王\",\"zundarepon\":\"ズンダレぽん\",\"chokoboll mukakoi.\":\"チョコボール向囲。\",\"majirou\":\"まじろー\",\"nemui neru\":\"眠井ねる\",\"takato kurosuke\":\"高遠くろ助\",\"adachi takumi\":\"安达拓实\",\"asamori mizuki\":\"朝森瑞季\",\"azuma taira\":\"東タイラ\",\"enoki tomoyuki\":\"榎木知之\",\"fujisaka kuuki\":\"藤坂空树\",\"grace ishikawa\":\"グレイス石川\",\"harumi chihiro\":\"ハルミチヒロ\",\"hiyama shuri\":\"ヒヤマシュリ\",\"izumi yoshiki\":\"いづみよしき\",\"maakou\":\"雅亚公\",\"tsukioka reitarou\":\"月冈丽太朗\",\"kurokawa kei\":\"くろかわ京\",\"itachi\":\"いたち\",\"aya shachou\":\"彩社长\",\"fukumaaya\":\"ふくまーや\",\"higashide irodori\":\"东出彩\",\"hiura r\":\"火浦R\",\"karube guri\":\"軽部ぐり\",\"kusatsu terunyo\":\"草津てるにょ\",\"mario\":\"まりお\",\"puniiyu\":\"ぷにいゆ\",\"kotengu\":\"コテング\",\"otare mayu\":\"おたれまゆ\",\"shirouzu myuuta\":\"白水ミュウタ\",\"dosent\":\"Dosent\",\"fuun daiki\":\"風雲だいき\",\"satou saori\":\"佐藤沙绪理\",\"takashina asahi\":\"たかしな浅妃\",\"bkub\":\"Bkub\",\"gemu555\":\"Gemu555\",\"ichiren takushou\":\"一炼托生\",\"katase minami\":\"カタセミナミ\",\"masamune shirow\":\"士郎正宗\",\"nikusoukyuu\":\"肉そうきゅー。\",\"nimu\":\"ニム\",\"okayusan\":\"おかゆさん\",\"wakai ikuo\":\"若井いくお\",\"z-ton\":\"Zトン\",\"hanpera\":\"はんぺら\",\"hirono azuma\":\"広乃あずま\",\"ikeda matamune\":\"池田又心\",\"kon-kit\":\"蒟吉人\",\"ohsaka minami\":\"逢坂ミナミ\",\"raymon\":\"RAYMON\",\"shiroie mika\":\"白家ミカ\",\"tes-mel\":\"tes_mel\",\"toba yuga\":\"跳马游鹿\",\"yoshida tobio\":\"吉田鸢牡\",\"zero no mono\":\"ゼロの者\",\"hige masamune\":\"ひげ政宗\",\"h2o\":\"H2O\",\"kekemotsu\":\"けけもつ\",\"yom\":\"よむ\",\"yuzugin\":\"柚银\",\"akatsuki hiziri\":\"あかつき聖\",\"chig\":\"Chig\",\"tsumugie\":\"つむじぃ\",\"maimu-maimu\":\"舞六まいむ\",\"kotoyoshi yumisuke\":\"琴义弓介\",\"mctek\":\"MCtek\",\"hidaka sora\":\"日高空\",\"mamabe mami\":\"眞々部まみ\",\"sakusyaaya\":\"作者文\",\"ruschuto\":\"るしゅーと\",\"murata range\":\"村田莲尔\",\"haguhagu\":\"はぐはぐ\",\"reitou mikan\":\"れいとうみかん\",\"ruuen rouga\":\"龙炎狼牙\",\"kisaragi nana\":\"如月なな\",\"adumi kazuki\":\"あづみ一樹\",\"sasagawa iko\":\"佐々川いこ\",\"wancho\":\"わんちょ\",\"kajishima masaki\":\"梶岛正树\",\"muririn\":\"梦璃凛\",\"lilithlauda\":\"リリスラウダ\",\"miyase mahiro\":\"宮瀬まひろ\",\"tajima yuki\":\"田岛有纪\",\"nyaito\":\"にゃいと\",\"hitsuka no tsukimiko\":\"ひつかのつきみこ\",\"nagami yuu\":\"永深ゆう\",\"oda kenichi\":\"おだけんいち\",\"toranoe\":\"トラノエ\",\"kinoebi\":\"KinoeBi\",\"nanashi\":\"774\",\"yokoyama lynch\":\"横山私刑\",\"tamposa\":\"たむポ～サ（TAM）\",\"tatami\":\"叠\",\"hoozuki shia\":\"鬼灯しあ\",\"samantha whitten\":\"Samantha Whitten\",\"romi\":\"ろみ\",\"kamiya maneki\":\"かみやまねき\",\"rella\":\"Rella\",\"apaman\":\"あぱまん\",\"takamin\":\"たかみん\",\"pink taro\":\"ピンク太郎\",\"tendou masae\":\"天道まさえ\",\"numahana\":\"ヌマハナ\",\"hino toshiyuki\":\"飞野俊之\",\"yokkora\":\"ヨッコラ\",\"ahen\":\"AHEN\",\"kirishima satoshi\":\"桐島サトシ\",\"kuroiwa madoka\":\"黒磐まどか\",\"nanaroba hana\":\"ななろば華\",\"ouma\":\"OUMA\",\"irie jyunn\":\"入江jyunn\",\"komeshiro kasu\":\"米白粕\",\"gotou suzuna\":\"後藤スズナ\",\"pettanp\":\"ペッタンP\",\"nanashi noizi\":\"ななしのいぢ\",\"koori nezumi\":\"冰鼠\",\"fluff kevlar\":\"Fluff-Kevlar\",\"mukka\":\"Mukka\",\"harenchi tomeko\":\"はれんちとめこ\",\"yukiji shia\":\"雪路时爱\",\"mirin fu-ka\":\"味燐ふーか\",\"toroshio\":\"とろしお\",\"yuzuki\":\"柚木\",\"kusaka souji\":\"久坂宗次\",\"izumi banya\":\"和泉万夜\",\"katzchen\":\"Kätzchen\",\"kanden sky\":\"感电数寄\",\"heiqing langjun\":\"黑青郎君\",\"darkmaya\":\"Darkmaya\",\"unini seven\":\"うにに☆せぶん\",\"nekometaru\":\"ねこめたる\",\"naoya\":\"直哉\",\"sansyoku amido.\":\"三色网户。\",\"yukiyanagi\":\"ゆきやなぎ\",\"fujimoto ikura\":\"藤本いくら\",\"ramiya ryou\":\"兰宫凉\",\"tamiya akito\":\"田宫秋人\",\"joy ride\":\"JOY RIDE\",\"arima natsubon\":\"ありまなつぼん\",\"ebi ebi\":\"エビエビ\",\"gabyonuno\":\"ガビョ布\",\"heppokokun\":\"へっぽこくん\",\"honda aru\":\"翻田亚流\",\"hoshino fuuta\":\"ほしのふうた\",\"kani kani\":\"かにかに\",\"katsumata kazuki\":\"かつまたかずき\",\"kirihara kotori\":\"桐原小鸟\",\"kokekokko coma\":\"こけこっこ☆こま\",\"nagareboshi hikaru\":\"流星ひかる\",\"mihara jun\":\"みはらじゅん\",\"dpc\":\"DPC\",\"urase shioji\":\"浦瀬しおじ\",\"yakusho\":\"やくしょ\",\"kedama keito\":\"毛玉ケヰト\",\"kurai nao\":\"仓井尚\",\"narutaki shin\":\"鳴滝しん\",\"matasabu yarou\":\"またさぶ野郎\",\"kagutsuchi\":\"カグツチ\",\"nyuu\":\"にゅう\",\"kani club\":\"蟹俱乐部\",\"tabuchi\":\"たぶち\",\"nora higuma\":\"野良ヒグマ\",\"tohyama eight\":\"东山エイト\",\"shakuhachi nameko\":\"尺八ナメコ\",\"bai asuka\":\"呗飞鸟\",\"bttamako\":\"豚たま子\",\"eggplantex\":\"茄子EX\",\"kouno aya\":\"煌乃あや\",\"uzuki haruka\":\"卯月遥佳\",\"rokudenashi\":\"ロクデナシ\",\"mukoujima tenro\":\"むこうじまてんろ\",\"kamitsuki manmaru\":\"上月まんまる\",\"kaitou yuuhi\":\"快刀雄飞\",\"danevan\":\"丹·艾凡\",\"kakifly\":\"kakifly\",\"go-it\":\"Go-It\",\"ibuki haruhi\":\"一颯はるひ\",\"beauty hair\":\"ビューティ・ヘア\",\"yamamoto yoshifumi\":\"山本善文\",\"yamano kitsune\":\"矢间野狐\",\"yamanobe kitta\":\"やまのべきった\",\"shishoku gankou\":\"紫色雁行\",\"nakagawa you\":\"中川优\",\"matsutou tomoki\":\"松任知基\",\"kamakiri\":\"カマキリ\",\"kurikara\":\"倶梨伽罗\",\"lazy club\":\"LAZYCLUB\",\"amano koyo\":\"天乃红叶\",\"hindenburg\":\"ひんでんブルグ\",\"kamidera chizu\":\"神寺千寿\",\"kanou soukyuu\":\"狩野苍穹\",\"kurokawa mio\":\"黒河澪\",\"mizukami ranmaru\":\"水上兰丸\",\"ogawa kanran\":\"小川甘蓝\",\"orizumeda nyoizou\":\"折诘田如意三\",\"tanaka juice\":\"田中十酢\",\"tom tamio\":\"都夢たみお\",\"tsukamoto miei\":\"塚本ミエイ\",\"unno hotaru\":\"海野萤\",\"watanabe wataru\":\"わたなべわたる\",\"ikegami akane\":\"池上茜\",\"gujira\":\"ぐじら\",\"xierra099\":\"Xierra099\",\"inazuma\":\"INAZUMA\",\"tomatto\":\"とまっと\",\"gabri-l\":\"雅舞罹-L\",\"amagaeru\":\"あまがえる\",\"batta\":\"Batta\",\"cyocyo\":\"ちょちょ\",\"emons\":\"えもんず\",\"saryuu\":\"沙流\",\"tamano kedama\":\"毛玉牛乳\",\"yumano yuuki\":\"有間乃ユウキ\",\"kink\":\"きんく\",\"kamen no hito\":\"仮面之人\",\"hakuyagen\":\"白夜弦\",\"kugami angning\":\"九神杏仁\",\"yanagi asahi\":\"夜凪朝妃\",\"tanaka shoutarou\":\"田中松太郎\",\"nuko yarou\":\"ぬこやろう\",\"kaniya shiku\":\"蟹屋しく\",\"suzushiro atsushi\":\"铃城敦\",\"denjarasu yamada\":\"やまだ\",\"sakura puchilo\":\"さくらぷちろー\",\"shuko\":\"SHUKO\",\"todoroki\":\"轰\",\"kitamura kouichi\":\"奇田村光一\",\"jabara tornado\":\"蛇腹トルネード\",\"kuroda mutu\":\"黑田陆奥\",\"hoyoyo\":\"ほよよ\",\"aoi tiduru\":\"葵井ちづる\",\"agawa ryo\":\"阿川椋\",\"nise kurosaki\":\"偽くろさき\",\"catapult\":\"かたぱると\",\"kizuki akizuki\":\"きづきあきづき\",\"low\":\"Low\",\"murakami takashi\":\"村上隆史\",\"natsukawa fuyu\":\"夏川冬\",\"tetsu\":\"てつ\",\"fuji shinobu\":\"藤忍\",\"himehachi\":\"ひめはち\",\"kurita yuugo\":\"栗田勇午\",\"mihoshi kurage\":\"海星海月\",\"mikage baku\":\"御影獏\",\"sakurai uta\":\"樱井U太\",\"ayase mai\":\"あやせまい\",\"kishibe\":\"岸边\",\"sake\":\"鲑\",\"takizawa naia\":\"滝沢ナイア\",\"hirugohan\":\"昼ごはん\",\"izumi rin\":\"和泉凛\",\"kamijou noboru\":\"上上上\",\"matsutaka zon\":\"松鷹ぞん\",\"mukaibi aoi\":\"向井弥・葵\",\"takane nohana\":\"たかねのはな\",\"yokoyama chicha\":\"よこやまちちゃ\",\"yuuma\":\"祐马 | ゆーま\",\"koide nao\":\"小出奈央\",\"ueyama you\":\"Ueyama You\",\"umino luka\":\"海野留珈\",\"kabocha\":\"南瓜\",\"kaidou kazuki\":\"海道阔毅\",\"nishikawa kouto\":\"西川孔人\",\"torosawa\":\"とろさわ\",\"sekira ame\":\"せきらあめ\",\"koayako\":\"コアヤアコ\",\"yagami shuuichi\":\"八神秋一\",\"aimaitei umami\":\"愛昧亭うまみ\",\"ohara hiroki\":\"绪原博绮\",\"hanaduka ryouji\":\"华塚良治\",\"komine tsubasa\":\"小峯つばさ\",\"arikawa katokichi\":\"ありかわかときち\",\"branshea\":\"ブランシェア\",\"hiruma kouji\":\"ひるまこうじ\",\"kyon\":\"きょん\",\"minami tomoko\":\"南智子\",\"misaki yukihiro\":\"岬ゆきひろ\",\"ajishio\":\"アジシオ\",\"basara\":\"バサラ\",\"terada zukeo\":\"寺田ヅケ夫\",\"nekomaru\":\"猫丸\",\"yuzumiya mono\":\"柚宫MoNo\",\"ginhaha\":\"ぎんハハ\",\"kiken shisou\":\"危险思想\",\"dokokano aitsu\":\"何処乃アイツ\",\"ginyoku screw\":\"銀欲スクリュー\",\"hg chagawa\":\"HG茶川\",\"john sitch-oh\":\"ジョン湿地王\",\"kamitani\":\"カミタニ\",\"nico pun nise\":\"笑花伪\",\"okina saina\":\"冲那彩菜\",\"sonomiya ponta\":\"想乃宮ぽん太\",\"uziga waita\":\"氏賀Y太\",\"araki kyouya\":\"荒木京也\",\"bunchin\":\"ぶんちん\",\"don shigeru\":\"DON繁\",\"dorei jackie\":\"奴隷ジャッキー\",\"drill murata\":\"ドリルムラタ\",\"kira hiroyoshi\":\"吉良广义\",\"koshow showshow\":\"故障少将\",\"shiromi kazuhisa\":\"しろみかずひさ\",\"yukarigawa yumiya\":\"紫川弓夜\",\"eric w. schwartz\":\"Eric W. Schwartz\",\"x pierrot\":\"Xぴえろ\",\"minust\":\"minusT\",\"irohakaede\":\"イロハカエデ\",\"miwatari renge\":\"美渡れんげ\",\"satofuji masato\":\"了藤诚仁\",\"yoshi hyuuma\":\"吉飞雄马\",\"yuri ai\":\"悠理爱\",\"yamakumo\":\"山云\",\"purin purin\":\"プリンプリン\",\"aoki ume\":\"蒼樹うめ\",\"nekosawaritai\":\"猫泽鲤鲷\",\"raidon\":\"来钝\",\"namaniku atk\":\"なまにくATK\",\"kumaco\":\"くまこ\",\"kuroshibe\":\"クロシベ\",\"akise\":\"秋濑\",\"fukuguri yuuto\":\"福栗悠斗\",\"futaba yae\":\"双叶八重\",\"koorizu\":\"コオリズ\",\"kumataro\":\"隈太郎\",\"mokkouyou bond\":\"木工用ボンド\",\"mustang r\":\"マスタングR\",\"nanakagi satoshi\":\"七键智志\",\"saba ibaru\":\"佐羽いばる\",\"takuwan\":\"たくわん\",\"tsukiwani\":\"月わに\",\"jyun\":\"JYUN\",\"nokoppa\":\"のこっぱ\",\"aru ra une\":\"アル・ラ・ウネ\",\"aranasi\":\"新良梨\",\"maki yoshitaka\":\"真木佳刚\",\"kazuma g-version\":\"カズマ・G-VERSION\",\"fangcat\":\"FangCat\",\"wtk\":\"WTK\",\"as109\":\"As109\",\"jm\":\"JM\",\"breakrabbit\":\"Breakrabbit\",\"farg\":\"Farg\",\"yamamoto zenzen\":\"山本善々\",\"miyata ichimi\":\"宫田一海\",\"kumak\":\"KUMAK\",\"neneru\":\"ねねる\",\"orange bull\":\"牛橘\",\"ipuu\":\"伊菩\",\"ohayou-san\":\"翁さい\",\"nadeneko ponia\":\"撫狸ぽにあ\",\"harukoubou norimaki\":\"春工房のりまき\",\"forester\":\"ふぉれすた\",\"metal owl\":\"Metal Owl\",\"ozaki miray\":\"尾崎未来\",\"madcat\":\"Madcat\",\"shinooka homare\":\"篠岡ほまれ\",\"uruujima call\":\"うるう島呼音\",\"koizumi amane\":\"恋泉天音\",\"stikyfinkaz\":\"StikyfinkaZ\",\"shirasagi rokuwa\":\"白鹭六羽\",\"armadillo daiji\":\"大慈\",\"akeno minato\":\"绯野湊\",\"hanabana tsubomi\":\"華々つぼみ\",\"soyosoyo\":\"SOYOSOYO\",\"sasorigatame\":\"さそりがため\",\"chong wuxin\":\"虫无心\",\"shiitakemiya donco\":\"椎茸宮どんこ\",\"minase kuru\":\"水瀬くうる\",\"miwa futaba\":\"三輪フタバ\",\"arano oki\":\"荒野冲\",\"nekotewi\":\"ねこてゐ\",\"ohisashiburi\":\"お久しぶり\",\"tsushima zan\":\"津嶋ザン\",\"tsuda nanafushi\":\"津田七节\",\"tokuni mirashichi\":\"戸国みらしち\",\"ganari ryu\":\"がなり龍\",\"ayuya\":\"あゆや\",\"kagato\":\"加画都\",\"ki-you\":\"贵勇\",\"koujima tenro\":\"向島てんろ\",\"natsume fumika\":\"夏目文花\",\"potekoro\":\"ぽてころ\",\"yukawa asami\":\"由河朝巳\",\"alto seneka\":\"或十せねか\",\"doi sakazaki\":\"土居坂崎\",\"dowarukofu\":\"どわるこふ\",\"isono toshiaki\":\"磯野としあき\",\"kakogawa tarou\":\"加古川太郎\",\"kokoromi shingon\":\"こころみ真言\",\"komori ei\":\"古森詠\",\"mashue\":\"Mashue\",\"matsuzawa kei\":\"松沢慧\",\"oohashi takayuki\":\"オオハシタカユキ\",\"rollpan2\":\"Roll-Pants\",\"rusty soul\":\"ラスティソウル\",\"sakaki shiori\":\"さかき栞\",\"shibahara gotyo\":\"しばはらごちょ\",\"uyuu atsuno\":\"烏有あつの\",\"iguchi sentarou\":\"井口千太郎\",\"oborogumo takamitsu\":\"朧雲たかみつ\",\"aoi kumiko\":\"葵久美子\",\"noripachi\":\"のりパチ\",\"hatokonro\":\"鳩こんろ\",\"abe yoshitoshi\":\"安倍吉俊\",\"son hee-joon\":\"손희준\",\"herurun\":\"へるるん\",\"hoshino\":\"星乃\",\"zyugoya\":\"十五夜\",\"yamaoka koutetsurou\":\"山冈钢铁郎\",\"henreader\":\"へんりいだ\",\"47agdragon\":\"47AgDragon\",\"josho isamu\":\"城所委佐武\",\"ogipote\":\"荻pote\",\"marimofu\":\"まりもふ\",\"alison\":\"ALISON\",\"shimajirou\":\"岛次郎\",\"kazuharu kina\":\"和遥キナ\",\"ponta\":\"PoN太\",\"akisora\":\"秋穹\",\"tanishi mitsuru\":\"タニシミツル\",\"mizuno koori\":\"水乃コオリ\",\"akaiguppy\":\"全红白子\",\"etuzan jakusui\":\"越山弱衰\",\"eiji\":\"Eiジ\",\"oryou\":\"おりょう\",\"waguchi shouka\":\"和口昇火\",\"tenzen miyabi\":\"天渐雅\",\"windart\":\"WindArt\",\"masaki kei\":\"真崎ケイ\",\"mousou-kun\":\"もうそうくん\",\"ooishi chuuni\":\"大石中二\",\"mitsudoue\":\"みつどうえ\",\"watanabe akio\":\"渡边明夫\",\"kiyokawa nijiko\":\"虚川二次子\",\"himuro serika\":\"冰室芹夏\",\"nachisuke\":\"なちすけ\",\"kasuga mayu\":\"春日まゆ\",\"kirimoto yuuji\":\"桐下悠司\",\"suihei sen\":\"水平线\",\"yuunagi\":\"ユウナギ\",\"jadenkaiba\":\"Jadenkaiba\",\"legoman\":\"Legoman\",\"staryume\":\"星遥ゆめ\",\"kamifuji mikeko\":\"神藤みけこ\",\"hekicha\":\"碧茶\",\"nrr\":\"Nrr\",\"inue shinsuke\":\"犬江しんすけ\",\"onigirikun\":\"おにぎり君\",\"nekosu\":\"ねこす\",\"akahito\":\"赤人\",\"hanada yanochi\":\"花田やのち\",\"kinokomushi\":\"きのこむし\",\"ichimura\":\"イチムラ\",\"crimson\":\"クリムゾン\",\"tanishi\":\"たにし\",\"akizora sawayaka\":\"秋空さわやか\",\"izumiya otoha\":\"いづみやおとは\",\"minamida usuke\":\"南田U助\",\"mizuyuki\":\"みずゆき\",\"nise\":\"似せ\",\"kojirou\":\"KOJIROU!\",\"hidemaru\":\"英丸\",\"hakkyou daioujou\":\"发狂大往生\",\"blackshirtboy\":\"Blackshirtboy\",\"xpray\":\"Xpray\",\"shika yuno\":\"椎架ゆの\",\"azarashi\":\"アザラシ\",\"syamonabe\":\"シャモナベ\",\"tyagama\":\"茶釜\",\"tkp\":\"TKP\",\"yakumo ginjirou\":\"八云银次郎\",\"namamo nanase\":\"なまもななせ\",\"pyon-kti\":\"ぴょん吉\",\"azuki yui\":\"阿月唯\",\"minato itoya\":\"ミナトイトヤ\",\"shiraishinsuke\":\"白石Nスケ\",\"soramame-san\":\"そら豆さん\",\"wabara hiro\":\"羽原ヒロ\",\"synchroaki\":\"しんくろあき\",\"kin no tamamushi\":\"金ノ玉虫\",\"yamamoto hyugo\":\"山本ひゅーご\",\"lithium\":\"Lithium\",\"athu\":\"Athu\",\"kawarajima koh\":\"かわらじま晃\",\"focke wolf\":\"ほっけうるふ\",\"rukitsura.\":\"るきつら。\",\"tsuchinoshita kaeru\":\"土ノ下かえる\",\"nokobeya\":\"のこべや\",\"ponfaz\":\"ぽんふぁーず\",\"hihumi hajime\":\"一二三始\",\"momoyama jirou\":\"桃山ジロウ\",\"r5\":\"R5\",\"c2\":\"C2\",\"shitappa\":\"したっぱ\",\"kanbayashi takaki\":\"神林タカキ\",\"nyx\":\"にゅくす\",\"akashia\":\"アカシア\",\"shigeta\":\"しげた\",\"uminori\":\"うみのり\",\"yopparai oni\":\"酔っ払い鬼?\",\"alpaca club\":\"あるぱかくらぶ\",\"berosu\":\"べろす\",\"silly\":\"しりー\",\"sekiri\":\"せきり\",\"midorino tanuki\":\"翠野タヌキ\",\"kanna hisashi\":\"かんな久\",\"kitahara eiji\":\"北原エイジ\",\"aoi miharu\":\"蒼井ミハル\",\"arinotowatari\":\"ありのとわたり\",\"dagashi\":\"駄菓子\",\"e-musu aki\":\"いーむす・アキ\",\"himeno komomo\":\"姫野こもも\",\"kamisiro ryu\":\"神代龙\",\"kerorin\":\"けろりん\",\"kenji\":\"けんじ\",\"knuckle curve\":\"ナックルカーブ\",\"koumo\":\"コーモ\",\"mikarin\":\"ミカリン\",\"minagiri\":\"ミナギリ\",\"nijou katame\":\"二条かため\",\"ouchi kaeru\":\"楝蛙\",\"sexyturkey\":\"すたーきー\",\"shikkarimono no takashi-kun\":\"しっかり者のタカシくん\",\"survival knife\":\"サバイバル刃\",\"kishiri toworu\":\"ヲルト\",\"yakitomato\":\"八木户マト\",\"ban kazuyasu\":\"伴カズヤス\",\"kaneko toshiaki\":\"かねことしあき\",\"labui\":\"羅ぶい\",\"tanaka ginji\":\"田中银二\",\"tetsuyama kaya\":\"鉄山かや\",\"oota takeshi\":\"大田武志\",\"sora inoue\":\"いのうえ空\",\"tan jiu\":\"坛九\",\"shigeru\":\"しげる\",\"akata izuki\":\"亚方逸树\",\"matsumori shou\":\"茉森晶\",\"datarou\":\"だたろう\",\"miso tya\":\"みそ茶\",\"eirizo\":\"エイリゾ\",\"ootomo yuuki\":\"大友ゆうき\",\"sorai shinya\":\"空维深夜\",\"muuba\":\"梦生场\",\"orukaniumu\":\"おるかにうむ\",\"izayoi no kiki\":\"十六夜のキキ\",\"wada rco\":\"ワダアルコ\",\"agobitch nee-san\":\"アゴビッチ姉さん\",\"kito sakeru\":\"鬼头サケル\",\"misa wasabi\":\"三左わさび\",\"momoduki suzu\":\"桃月すず\",\"picao\":\"ぴかお\",\"girls number\":\"Girl's Number\",\"asazuki norito\":\"浅月のりと\",\"nodoka\":\"长闲\",\"ajiichi\":\"アジイチ\",\"aoihito\":\"蒼い人\",\"namusoubyou\":\"名无双描\",\"marushamo\":\"まるしゃも\",\"haruhonya\":\"はるほんや\",\"shinya\":\"しんや\",\"yonban\":\"よんばん\",\"nori-haru\":\"のりはる\",\"neko totora\":\"ねこトトラ\",\"wulazula\":\"うらずら\",\"aian\":\"あいあん\",\"nmo ezago\":\"ンモ=エザゴ\",\"mikuni atsuko\":\"三国あつ子\",\"nekousa\":\"猫兔\",\"shown\":\"ショーン\",\"shimakaze\":\"岛风\",\"hamatyonn\":\"ハマちょん\",\"fukufukuan\":\"福々餡\",\"aikawa an\":\"愛川あん\",\"nao takami\":\"尚たかみ\",\"okuni yoshinobu\":\"小国由喜\",\"oreiro\":\"オレイロ\",\"ndc\":\"NDC\",\"rocket monkey\":\"ロケットモンキー\",\"a-teru haito\":\"A辉废都\",\"kusumoto toka\":\"楠元とうか\",\"utatane hiroyuki\":\"うたたねひろゆき\",\"chuuka naruto\":\"中華なると\",\"area\":\"Area\",\"kruth666\":\"Kruth666\",\"f4u\":\"F4U\",\"higenamuchi\":\"ひげなむち\",\"honryo hanaru\":\"本領はなる\",\"ichigain\":\"一概\",\"konchiki\":\"こんちき\",\"namboku\":\"南北\",\"tohzai\":\"东西\",\"ogadenmon\":\"オガデンモン\",\"sakuma tsukasa\":\"さくま司\",\"arai togami\":\"荒居栂美\",\"fujitsuna\":\"フジツナ\",\"fukuroumori\":\"枭森\",\"yukino koreyuki\":\"之之之之\",\"momio\":\"もみお\",\"vivian tian zong\":\"Vivian天纵\",\"sugihara\":\"すぎはら\",\"minagi umihito\":\"深凪ウミヒト\",\"natsu no koucha\":\"夏の紅茶\",\"prime\":\"Prime\",\"tatekawa mako\":\"館川まこ\",\"hrd\":\"hr津\",\"choco-chip\":\"チョコ・チップ\",\"sakurai makoto\":\"櫻井マコト\",\"kuronyan\":\"くろニャン\",\"moriyama yusuke\":\"森山雄介\",\"son yohsyu\":\"孙阳州\",\"ray-kbys\":\"Ray-Kbys\",\"potato\":\"POTATO\",\"ichihara hikari z\":\"位置原光Z\",\"komezawa\":\"こめざわ\",\"mozu\":\"もず\",\"aoiro ichigou\":\"あお色一号\",\"futamine kobito\":\"二峰跨人\",\"gennari\":\"ゲンナリ\",\"inukami\":\"いぬかみ\",\"narumiya akira\":\"成宫亨\",\"oosawara sadao\":\"大童贞男\",\"sugarbt\":\"sugarBt\",\"sunahama nosame\":\"砂浜のさめ\",\"zakotsu\":\"佐骨\",\"nidy-2d-\":\"Nidy-2D-\",\"urico take\":\"瓜子たけ\",\"tanohito\":\"たのひと\",\"kouki kuu\":\"こうきくう\",\"engawa suguru\":\"エンガワ卓\",\"fuji-han\":\"ふじはん\",\"hayashida toranosuke\":\"林田虎之助\",\"buchou chinke\":\"部長ちんけ\",\"asakura kukuri\":\"アサクラククリ\",\"nanao naru\":\"七尾奈留\",\"kirishima ayu\":\"雾岛鲇\",\"keita naruzawa\":\"Keita Naruzawa\",\"amami sen\":\"天观仙\",\"juujou tatami\":\"十畳たたみ\",\"ermuzibu\":\"Ermuzibu\",\"gingami\":\"银河味\",\"makino tomoe\":\"槇野ともえ\",\"teppeki kyojin\":\"铁壁巨人\",\"mimiyoshi\":\"みみよし\",\"jinsuke\":\"甚助\",\"mushoku santaro\":\"无色三太郎\",\"tawara hiryuu\":\"俵绯龙\",\"marugoshi\":\"まるごし\",\"missbehaviour\":\"MissBehaviour\",\"funsexydragonball\":\"Funsexydragonball\",\"badonion\":\"BadOnion\",\"hazuki ruka\":\"羽月るか\",\"eno tato\":\"江野たと\",\"daiaru\":\"ダイアル\",\"mokusei zaijuu\":\"木星在住\",\"kaga akuru\":\"加賀あくる\",\"nekoaruko\":\"ねこ＠るこ\",\"hari senbon\":\"针千本\",\"bang-you\":\"BANG-YOU\",\"bubuzuke\":\"ぶぶづけ\",\"gentle sasaki\":\"ジェントル佐々木\",\"kamina koharu\":\"神无小春\",\"kei.\":\"刑。\",\"mikoyan\":\"みこやん\",\"nuezou\":\"ヌエゾウ\",\"ribyuhki\":\"リブユウキ\",\"sgk\":\"SGK\",\"shinkuu tatsuya\":\"しんくうたつや\",\"unou\":\"右脑\",\"yuuki shin\":\"悠木しん\",\"harumi\":\"春海\",\"mirei\":\"みれい\",\"miwa yoshikazu\":\"美和美和\",\"wildcat\":\"ワイルドキャット\",\"fujita yukihisa\":\"藤田幸久\",\"l axe\":\"L Axe\",\"s.m.o.k.e.\":\"S.M.O.K.E.\",\"samurai\":\"さむらい\",\"kureyon\":\"くれよん\",\"broccoli takeda\":\"ブロッコリーたけだ\",\"maatsu\":\"ま～つ\",\"toumasu\":\"とーます\",\"ishikawa sae\":\"石川沙绘\",\"nagihashi coko\":\"なぎはしここ\",\"u-jin\":\"游人\",\"piripun\":\"ぴりぷん\",\"akabashi\":\"アカバシ\",\"mataro\":\"魔太郎\",\"kekocha\":\"けこちゃ\",\"mogiki hayami\":\"十はやみ\",\"the amanoja9\":\"The Amanoja9\",\"fumitsuki sou\":\"二三月そう\",\"fuji hyorone\":\"藤ひょろね\",\"hibimegane\":\"ヒビメガネ\",\"dekosuke 18gou\":\"デコ助18号\",\"geso smith\":\"ゲソスミス\",\"hidarite tarou\":\"左手太郎\",\"jagayamatarawo\":\"じゃが山たらヲ\",\"kasei\":\"かせい\",\"kayanoi ino\":\"茅乃井いの\",\"kiiroi tamago\":\"黄色的蛋\",\"kirihara you\":\"桐原湧\",\"mdakoki\":\"M田K樹\",\"ooyoko yamaame\":\"大横山饴\",\"ryokuchaism\":\"緑茶イズム\",\"shiden akira\":\"しでん晶\",\"soborogo\":\"ソボロゴ\",\"syoukaki\":\"消火器\",\"1 equals 2\":\"1=2\",\"zouo-san\":\"憎恶产\",\"machida hiraku\":\"町田ひらく\",\"mamezou\":\"まめぞう\",\"yamaya oowemon\":\"山家大右卫门\",\"yuizaki kazuya\":\"ユイザキカズヤ\",\"shichimenchou\":\"しちめんちょう\",\"bigshine\":\"ビッグシャイン\",\"apoidea\":\"Apoidea\",\"randou\":\"乱道\",\"midoriiro\":\"緑いろ\",\"koukou punch\":\"高校パンチ\",\"arai kogane\":\"新井コガネ\",\"aoin\":\"AOIN\",\"takase asagiri\":\"鷹瀬あさぎり\",\"ugaromix\":\"Ugaromix\",\"aizawa hiroshi\":\"あいざわひろし\",\"b-ginga\":\"B-银河\",\"nanami\":\"七弥\",\"narumi cristear note\":\"成海クリスティアーノート\",\"saku usako\":\"佐久うさこ\",\"aotsu karin\":\"蒼都かりん\",\"mori airi\":\"森あいり\",\"mimura zaja\":\"三村ざじゃ\",\"itomugi-kun\":\"糸麦くん\",\"aru urara\":\"あるうらら\",\"sakura saku sakura\":\"佐倉さくさくら\",\"akinaro\":\"あきなろ\",\"hanakawa sugar\":\"花川シュガー\",\"urabi\":\"紅吊うらび\",\"kichirock\":\"キチロク\",\"wes heartland smith\":\"ウェス·ハートランド·スミス\",\"pochincoff\":\"ポチンコフ\",\"shimeji nameko\":\"しめじなめこ\",\"sakibashiri jiru\":\"先走汁\",\"hayashi tugumi\":\"林つぐみ\",\"tamura chii\":\"田村ちい\",\"jagausa\":\"じゃがうさ\",\"misuroma\":\"みすろま\",\"kabe umari-ko\":\"壁埋まり子\",\"crowly\":\"くろうり\",\"sekiya asami\":\"关谷あさみ\",\"nananana\":\"ナナナナ\",\"cafekun\":\"cafekun\",\"hataraki ari\":\"ハタラキ有\",\"kilesha\":\"きれゐしゃ\",\"spec\":\"SPEC\",\"gogocherry\":\"GOGOCHERRY\",\"kitajima yuuki\":\"北嶋ゆうき\",\"renji\":\"练慈\",\"wise speak\":\"ワイズスピーク\",\"ayamy\":\"あやみ\",\"cekonikova\":\"Cekonikova（ぐらら）\",\"ke-ta\":\"ke-ta\",\"roteri\":\"ろてり\",\"kannaduki kanna\":\"神無月かんな\",\"endou okito\":\"袁藤沖人\",\"messy\":\"メッシィ\",\"aomushi\":\"あおむし\",\"zheng\":\"Zheng\",\"yukimoto shuuji\":\"雪本愁二\",\"omaru gyuunyuu\":\"牛乳うまお\",\"futami paran\":\"二見パラン\",\"torajima tao\":\"虎島タオ\",\"mr.takealook\":\"Mr.takealook\",\"isobe maki\":\"イソベマキ\",\"sensouji kinoto\":\"浅草寺きのと\",\"shinozuka yuuji\":\"篠塚裕志\",\"shikishiro konomi\":\"色白好\",\"sakurayu hal\":\"樱汤ハル\",\"nanao yukiji\":\"七尾ゆきじ\",\"herio\":\"ヘリを\",\"aikawa arisa\":\"相川亚利砂\",\"yamaishi juhachi\":\"山石18\",\"rokkaku yasosuke\":\"六角八十助\",\"tomono hiro\":\"友野ヒロ\",\"yonekura kengo\":\"米倉けんご\",\"yosuteinu\":\"世棄犬\",\"hiyoshi hana\":\"日吉ハナ\",\"tabigarasu\":\"旅乌\",\"tsuge yasuna\":\"つげ安奈\",\"hissatsukun\":\"ひっさつくん\",\"ayakawa riku\":\"あやかわりく\",\"yoshida inuhito\":\"吉田犬人\",\"yuyama chika\":\"湯山チカ\",\"kumakiti\":\"隈吉\",\"umakuchi syouyu\":\"うまくち酱油\",\"tokie hirohito\":\"刻江寻人\",\"yuzuki n dash\":\"柚木N’\",\"itou nanami\":\"井藤ななみ\",\"porutan\":\"ぽるたん\",\"kaitenfude\":\"回转笔\",\"tachikawa negoro\":\"立川ねごろ\",\"emine kendama\":\"遠峰犬玉\",\"masami chie\":\"柾见ちえ\",\"ryuuki yumi\":\"りゅうき夕海\",\"nakano sora\":\"中乃空\",\"napo\":\"ナポ\",\"kazuki misaki\":\"数木美咲\",\"nakata modem\":\"中田モデム\",\"anzaki moral\":\"杏咲モラル\",\"brother pierrot\":\"ブラザーピエロ\",\"oltlo\":\"おるとろ\",\"piromizu\":\"ピロ水\",\"jorori\":\"じょろり\",\"abe manabu\":\"安部マナブ\",\"matsunami rumi\":\"松波留美\",\"narita kyousha\":\"成田香車\",\"arakure\":\"あらくれ\",\"seto yuuki\":\"世徒ゆうき\",\"yami kota\":\"やみこた\",\"kakumayu\":\"カクマユ\",\"sorairo len\":\"空色れん\",\"yamiochi umekichi\":\"闇堕ち梅吉\",\"namaribou nayonayo\":\"铅棒なよなよ\",\"amasaka takashi\":\"天坂隆志\",\"kazuma\":\"和真\",\"uni8\":\"うにあはと\",\"denchi\":\"电池\",\"ono no imoko\":\"小野妹子\",\"nishieda\":\"西E田\",\"gomennasai\":\"御免なさい\",\"ame arare\":\"雨あられ\",\"abi kamesennin\":\"俺正读\",\"futayami\":\"双暗\",\"deadflow\":\"Deadflow（Б）\",\"yukishizuku\":\"ユキシズク\",\"mappa ninatta\":\"マッパニナッタ\",\"ryuuto hisashi\":\"りゅうとひさし\",\"tamazatou\":\"玉砂糖\",\"tanaka yuuichi\":\"田中雄一\",\"nakamura kuzuyu\":\"中村葛汤\",\"bekotarou\":\"ベコ太郎\",\"ayuma sayu\":\"あゆま紗由\",\"fumi miyabi\":\"文雅\",\"masuda\":\"枡田\",\"nunnu\":\"ぬんぬ\",\"shimanto shisakugata\":\"40010试作型\",\"yuzuna hiyo\":\"柚子奈ひよ\",\"kojiki ohji\":\"古事记王子\",\"tamakake\":\"たまかけ\",\"shiromochi sakura\":\"白もち桜\",\"shimao kazu\":\"嶋尾和\",\"kanou ryuuji\":\"叶竜児\",\"yatanukikey\":\"やたぬき圭\",\"maihara matsuge\":\"舞原マツゲ\",\"genzou kokuto\":\"幻像黒兎\",\"yamashita kurowo\":\"山下クロヲ\",\"yanagi yuu\":\"ヤナギユウ\",\"ponite korosuke\":\"ポニテコロ介\",\"azuse\":\"あずせ\",\"mameojitan\":\"まめおじたん\",\"giuniu\":\"ぎうにう\",\"sabusuka\":\"サブスカ\",\"senji\":\"煎路\",\"komowata haruka\":\"こもわた遥華\",\"murakami suigun\":\"村上水軍\",\"takanae kyourin\":\"高苗京鈴\",\"shirabe shiki\":\"調四季\",\"kobuichi\":\"小舞一\",\"yaneko uta\":\"弥猫うた\",\"kirisaki byakko\":\"雾咲白狐\",\"bareisho\":\"马铃薯\",\"wakadori nikomi\":\"若鶏にこみ\",\"shikitani asuka\":\"色谷あすか\",\"furisuku\":\"ふりすく\",\"kosuke haruhito\":\"虎助遥人\",\"tomoe yousuke\":\"巴八丞\",\"tokita alumi\":\"鴇田アルミ\",\"poshi\":\"ぽし\",\"haguruma\":\"歯車\",\"kanekiyo miwa\":\"兼清みわ\",\"gayarou\":\"☆画野朗\",\"yashiro seika\":\"八城惺架\",\"tokiwa midori\":\"常磐绿\",\"tsubaki jushirou\":\"椿十四郎\",\"tukinowagamo\":\"月ノ輪ガモ\",\"uron rei\":\"ウーロン・レイ\",\"mushanokouji shizuka\":\"武者小路静香\",\"emori uki\":\"江森うき\",\"shindou\":\"しんどう\",\"kikurage\":\"きくらげ\",\"sanom\":\"鎖ノム\",\"amagasa ikuta\":\"雨暈郁太\",\"sukesaburou\":\"助三郎\",\"jiraiya\":\"児雷也\",\"kuromotokun\":\"黑本君\",\"gomano lio\":\"胡麻乃りお\",\"shiratama moti\":\"白玉もち\",\"shiratama yomogi\":\"しらたま よもぎ\",\"yoshida iyo\":\"吉田 依世\",\"sakura oriko\":\"佐倉おりこ\",\"hinata yuu\":\"ひなた悠\",\"odawara hakone\":\"オダワラハコネ\",\"ikari\":\"いかり\",\"humuyun\":\"ふむゆん\",\"watagashi yui\":\"わたがしゆい\",\"kohinata hoshimi\":\"小日向ほしみ\",\"yudzuki hina\":\"遊月ひな\",\"sakura ani\":\"桜あに\",\"tsukishima yuuko\":\"月嶋ゆうこ\",\"tomoshibi hidekazu\":\"赤提灯\",\"kamisyakujii yubeshi\":\"紙石神井ゆべし\",\"kurosu gatari\":\"黑巢ガタリ\",\"doku denpa\":\"毒でんぱ\",\"dokiyuri\":\"どきゆり\",\"tamagoro\":\"たまごろー\",\"mizore\":\"みぞれ\",\"akure ekuto\":\"吾暮えくと\",\"chacharan\":\"茶々らん\",\"isuwie\":\"イスィ\",\"misaoka\":\"みさおか\",\"ootori mahiro\":\"鳳まひろ\",\"yaya hinata\":\"稍日向\",\"koeda shiro\":\"こえだしろ\",\"honjou hideaki\":\"本条秀明\",\"notzackforwork\":\"NotZackForWork\",\"hayashizaki fumihiro\":\"林崎文博\",\"hatomizu\":\"ハト水\",\"hiroya\":\"广弥\",\"amamiya\":\"アマミヤ\",\"nedia\":\"ねでぃあ\",\"aiki\":\"Aiki\",\"mumei\":\"Mumei\",\"tefun\":\"てふん\",\"shikoripa\":\"しこりぱ\",\"tani takuya\":\"谷拓也\",\"maron\":\"魔龙\",\"yomoyama takashi\":\"四方山贵史\",\"fuji tarawi\":\"藤たらゐ\",\"mousou\":\"妄想\",\"yokohama inka\":\"よこはまインカ\",\"hoshi\":\"ほし\",\"nanamatsu kenji\":\"七松建司\",\"fuumi\":\"ふーみ\",\"shacho\":\"社ちょ\",\"toito\":\"トイト\",\"toketou\":\"とけとう\",\"shisyo\":\"ししょー\",\"whistlerx\":\"WhistlerX\",\"hagiwara asami\":\"萩原あさ美\",\"itose ikuto\":\"爱濑郁人\",\"osaru\":\"御猿\",\"etori yuuya\":\"江鸟\",\"ootsuka kotora\":\"大塚子虎\",\"testa\":\"てすた\",\"butachang\":\"ぶたちゃんぐ\",\"sahara gensei\":\"佐原玄清\",\"hino hino\":\"緋乃ひの\",\"tsukuru\":\"作\",\"habara meguru\":\"羽原メグル\",\"hanabusa satoshi\":\"はなぶささとし\",\"hado\":\"はあど\",\"takemasa takeshi\":\"武将武\",\"akabeko\":\"あかべこ\",\"hisui\":\"翡翠石\",\"sakura yuki\":\"咲良ゆき\",\"suga hideo\":\"スガヒデオ\",\"nadaka harutsugu\":\"南高春告（梅干）\",\"hatori you\":\"葉鳥侑\",\"byougaku\":\"猫額\",\"yoshu ohepe\":\"養酒オヘペ\",\"amanagi seiji\":\"天凪青磁\",\"tsukako\":\"つかこ\",\"mochi\":\"モチ\",\"araiguma\":\"あらいぐま\",\"2-g\":\"2-G\",\"sukoyaka gyuunyuu\":\"健やか牛乳\",\"saeki nao\":\"彩季なお\",\"endori\":\"えんどり\",\"fukuoka tarou\":\"福冈太朗\",\"mafuyu hemp\":\"麻冬HEMP\",\"kanno takanori\":\"南乃さざん\",\"takehana note\":\"竹花ノート\",\"sakuraba hikaru\":\"桜庭光\",\"wolflong\":\"╰狼龍\",\"toyosaki shu\":\"豊咲\",\"mutou koucha\":\"无糖红茶\",\"kurihara kenshirou\":\"栗原ケンシロウ\",\"matsumotoke\":\"松本家御愛用\",\"utamaro\":\"歌麿\",\"tadima yoshikadu\":\"たぢまよしかづ\",\"puuakachan\":\"プーアカちゃん\",\"wataame\":\"わたあめ\",\"aduki\":\"あづき\",\"inui waon\":\"乾和音\",\"majima shiroyuki\":\"间岛白幸\",\"sougetsu nonono\":\"草月野々乃\",\"wantan meo\":\"云吞めお\",\"kemuri haku\":\"煙ハク\",\"kani biimu\":\"かにビーム\",\"watanohara\":\"わたのはら\",\"kawasaki tadataka\":\"川崎直孝\",\"shiraishi nagisa\":\"白石なぎさ\",\"kurikimaru\":\"くりきまる\",\"hinohara fuki\":\"檜原フキ\",\"kobayashi kina\":\"小林キナ\",\"takemitsu\":\"たけみつ\",\"shiki\":\"四季\",\"deyuyama\":\"でゆ山\",\"namidame\":\"泪目\",\"higata akatsuki\":\"阳方晶月\",\"kayumidome\":\"かゆみ止め\",\"naha 78\":\"ナハ78\",\"getsuyou yasumi.\":\"月曜休み。\",\"arumamai ayuka plus\":\"在誠舞あゆか+\",\"take calcium\":\"竹刈シウム\",\"aritsuno\":\"有角\",\"shinova\":\"シノバ\",\"mahito\":\"真人\",\"anon 2-okunen\":\"あのん2億年\",\"zikataro\":\"自家太郎\",\"footaro\":\"辻風太郎\",\"mokuzu\":\"もくず\",\"mizuno kurage\":\"水乃くらげ\",\"aoi\":\"あおい\",\"uguisu mochi\":\"うぐいす餅\",\"kirero\":\"kirero\",\"hyura3\":\"ひゅらさん\",\"fumituki\":\"ふみつき\",\"mimi\":\"魅未\",\"doru\":\"$\",\"mikagami hiyori\":\"水鏡ひより\",\"hisaka tooru\":\"氷坂透\",\"eseneko\":\"えせねこ\",\"oinari\":\"おいなり\",\"kata k\":\"カタケイ\",\"miisha\":\"みーしゃ\",\"ichiba youichi\":\"市葉葉市\",\"beni shake\":\"べにしゃけ\",\"megumiya\":\"megumiya\",\"aiu\":\"蓝兔\",\"kobato neneko\":\"小鳩ねねこ\",\"marota\":\"麻吕太\",\"maineko ruru\":\"舞猫ルル\",\"kanroame\":\"甘露アメ\",\"shaa\":\"しゃあ\",\"aka shio\":\"朱シオ\",\"tomobe kinuko\":\"友部キヌコ\",\"hirasaka makoto\":\"比良坂真琴\",\"matsuriuta\":\"祭唄（松竜太）\",\"momizi-kei\":\"紅葉-K\",\"nagayori\":\"长赖\",\"toosaka asagi\":\"遠坂あさぎ\",\"momoco\":\"ももこ\",\"ashima\":\"アシマ\",\"suzumori\":\"铃森\",\"kimishima ao\":\"君岛青\",\"motiduki siina\":\"望月椎那\",\"kino\":\"kino\",\"mitha\":\"Mitha\",\"tateha\":\"立羽\",\"yano mitsuki\":\"夜ノみつき\",\"fukahire\":\"フカヒレ\",\"takano yuki\":\"鷹乃ゆき\",\"suimya\":\"すいみゃ\",\"shirokuma a\":\"シロクマA\",\"karory\":\"karory\",\"tomo\":\"ともー\",\"kiba satoshi\":\"木場智士\",\"ziko\":\"ziko\",\"techi\":\"てち\",\"koza\":\"コザ\",\"mame denkyuu\":\"まめでんきゅう\",\"mocha\":\"Mocha\",\"teitetsu\":\"蹄铁\",\"sugiura sen\":\"杉浦线\",\"izumi nanase\":\"いずみななせ\",\"moekibara fumitake\":\"萌木原文武\",\"mizuki takehito\":\"みづきたけひと\",\"takahashi tetsuya\":\"高桥哲哉\",\"hiten\":\"Hiten\",\"inugami kira\":\"狗神煌\",\"korie riko\":\"梱枝莉子\",\"hasune\":\"はすね\",\"muku\":\"muku\",\"kurou\":\"九郎\",\"natsuki yuu\":\"なつきゆう\",\"pan\":\"ぱん\",\"yaman\":\"yaman**\",\"anapon\":\"あなぽん\",\"mashiro shirako\":\"真白しらこ\",\"yagi the goat\":\"ヤギの人\",\"morimiya masayuki\":\"森宫正幸\",\"airandou\":\"あいらんどう\",\"nishizawa 5mm\":\"西沢5ミリ\",\"ninoko\":\"にの子\",\"kibii mocha\":\"きびぃもか\",\"ohnaka ito\":\"大仲いと\",\"anzuame\":\"杏飴\",\"takaharu\":\"タカハル\",\"asanoha\":\"麻の葉\",\"sasaki akira\":\"ささきあきら\",\"asahina hikage\":\"アサヒナヒカゲ\",\"piyodera mucha\":\"ぴよ寺むちゃ\",\"daichi\":\"矢座だいち\",\"ramchi\":\"らむち\",\"mignon\":\"mignon\",\"natsuki marina\":\"夏月まりな\",\"watanon\":\"わたのん\",\"amami mikihiro\":\"甘味みきひろ\",\"mikage\":\"未影\",\"mk\":\"MK\",\"aria.\":\"ありあ。\",\"kago\":\"加护\",\"akashi rokuro\":\"明石六露\",\"kuon\":\"久遠\",\"miyasu risa\":\"ミヤスリサ\",\"konomi\":\"konomi\",\"bokkun\":\"ぼっくん\",\"ikura nagisa\":\"伊倉ナギサ\",\"furukawa odoro\":\"古河おどろ\",\"nishiki chizu\":\"西木地図\",\"konka\":\"绀菓\",\"hakomaru\":\"箱。\",\"makoto\":\"MAKOTO\",\"iori\":\"ゐおり\",\"chocoan\":\"ちょこ庵\",\"hisagi\":\"ひさぎ\",\"arato asato\":\"あらと安里\",\"caigen\":\"菜★梗\",\"maple\":\"まぷる\",\"kon\":\"紺\",\"shibi\":\"ShiBi\",\"yamu\":\"やむっ\",\"senyuu\":\"戦友\",\"noukatu\":\"noukatu\",\"yoyomura\":\"夜々村\",\"yuhi\":\"ゆーひ\",\"katase aoko\":\"片瀬蒼子\",\"yuzuri ai\":\"ゆずりあい\",\"tony taka\":\"Tony\",\"fal maro\":\"ファルまろ\",\"hiru okita\":\"昼沖太\",\"marumie\":\"まるミエ\",\"hiyashi mirano\":\"ひやしみらの\",\"kageyama kuroto\":\"景山玄都\",\"netarou\":\"ねたろう\",\"itou eight\":\"伊藤エイト\",\"sajipen\":\"さじぺん\",\"dam\":\"だむ\",\"ko-yahu\":\"こーやふ\",\"toufu\":\"とうふ\",\"kuriyuzu kuryuu\":\"栗柚くりゅー\",\"homu\":\"homu\",\"kamelie\":\"Kamelie\",\"nicoby\":\"にこびぃ\",\"mitsuba choco\":\"三つ葉ちょこ\",\"miyama\":\"箕山\",\"ayagi daifuku\":\"綾城大福\",\"taruhi\":\"たるひ\",\"kikunosukemaru\":\"菊のすけまる\",\"hamaken.\":\"はまけん。\",\"konohana\":\"此花\",\"hirotti\":\"ひろっち\",\"rogobo\":\"ろごぼ\",\"momoya show-neko\":\"桃屋しょう猫\",\"mashiro yukiya\":\"真白雪夜\",\"hikagi tatsuhiko\":\"绯键龙彦\",\"tekehiro\":\"てけひろ\",\"marumikan\":\"丸美甘\",\"yamato bambies\":\"ヤマトバンビーズ\",\"azuma sawayoshi\":\"アズマサワヨシ\",\"oyabe ryo\":\"小矢部亮\",\"naoharu\":\"直晴\",\"tamashii carnival botamochi\":\"魂カーニバルぼたもち\",\"arima kouichi\":\"有马纮一\",\"kamochome\":\"かもちょめ\",\"horny-oni\":\"Horny-Oni\",\"sora ni tori ga\":\"空に鳥が\",\"serebi ryousangata\":\"セレビィ量産型\",\"abara heiki\":\"肋兵器\",\"ukami\":\"うかみ\",\"itou hachi\":\"伊藤ハチ\",\"nishihata kei\":\"西畑けい\",\"bon\":\"凡\",\"john\":\"じょん\",\"tamaki kurou\":\"鐶九朗\",\"haiba\":\"灰叶\",\"makita yoshiharu\":\"卷田佳春\",\"asahiru yuu\":\"浅ひるゆう\",\"rokumaru inami\":\"六丸いなみ\",\"mogu\":\"モグ\",\"cbgb\":\"CBGB\",\"eretto\":\"えれっと\",\"ken hultgren\":\"赓·赫尔脱格仑\",\"senmu\":\"SeNMU\",\"arito arayuru\":\"有都あらゆる\",\"9so\":\"9SO\",\"haruba negi\":\"春场葱\",\"maki komura\":\"真木こむら\",\"sakamata nerimono\":\"逆又练物\",\"nagata maria\":\"永田まりあ\",\"kinona\":\"紀奈\",\"hano haruka\":\"葉乃はるか\",\"shiden hiro\":\"四電ヒロ\",\"kyabetsuka\":\"篝町狐懐\",\"midoriha mint\":\"緑葉みんと | 洗面きぬ子\",\"scott robertson\":\"斯科特·罗伯逊\",\"andrew loomis\":\"安德鲁·路米斯\",\"bert dodson\":\"伯特·多德森\",\"kuzuya ramurin\":\"葛谷らむりん\",\"taka\":\"タカ\",\"sw\":\"Sw（すぅ）\",\"piro\":\"Piro\",\"itou noizi\":\"いとうのいぢ\",\"hirose madoka\":\"広瀬まどか\",\"nabe wataru\":\"名部渉\",\"gaou\":\"がおう\",\"umekiti\":\"うめきち\",\"onaka emi\":\"小中えみ\",\"bobobo\":\"ボボボ\",\"okinaga umanosuke\":\"翁贺马乃助\",\"yoikono tt\":\"ヨイコノtt\",\"gosaiji\":\"ごさいじ\",\"rokkotsu\":\"肋骨\",\"akino komichi\":\"秋乃こみち\",\"ido\":\"いど\",\"asaki takayuki\":\"朝木贵行\",\"koyanagi royal\":\"小柳ロイヤル\",\"iketaki ganguten\":\"池泷玩具店\",\"akagi kuro\":\"赤木クロ\",\"ash yokoshima\":\"Ash横島\",\"haitokukan\":\"背德汉\",\"henkuma\":\"变熊\",\"kawashima yoshio\":\"川島よしお\",\"kanari tokusaku\":\"鹿成トクサク\",\"onigiri unicorn\":\"鬼斬ゆにこーん\",\"namae renraku\":\"なまえ れんらく\",\"kouda tomohiro\":\"幸田朋弘\",\"senbei\":\"煎饼\",\"corundum\":\"こらんだむ\",\"miyabe kiwi\":\"宮部キウイ\",\"dendenbotch\":\"でんでんぼっち\",\"redash\":\"RedAsh\",\"kuroha reiji\":\"九郎\",\"kirekawa\":\"きれかわ\",\"taro oimo\":\"たろおいも\",\"akimoto dai\":\"あきもと大\",\"kumada\":\"くまのとおる（くまだ）\",\"nipi\":\"nipi\",\"misakana\":\"みさかな\",\"cru\":\"Cru\",\"garana\":\"ガラナ\",\"muraimura\":\"村井村\",\"murasakio\":\"紫御\",\"itohana\":\"イトハナ\",\"shirogane hina\":\"シロガネヒナ\",\"chikuwa.\":\"ちくわ。\",\"naka\":\"なか\",\"midorino haru\":\"緑野はる\",\"ma-sa\":\"MA-SA\",\"ameno usari\":\"飴乃うさり\",\"mizukaga syou\":\"水利硝\",\"kudo\":\"９℃\",\"sumii\":\"すみい\",\"ai takurou\":\"安威拓郎\",\"nagisora riku\":\"凪空りく\",\"minase\":\"御奈瀬\",\"niwacho\":\"niwacho\",\"yasaka syu\":\"矢坂しゅう\",\"nimuno\":\"にむの\",\"watanore\":\"わたのれ\",\"qblade\":\"blade\",\"mugen no sudadokei\":\"無限の須田時計\",\"omimo\":\"おみも\",\"minami aomori\":\"南森\",\"uo denim\":\"魚デニム\",\"mitsuba minoru\":\"三叶稔\",\"zeros\":\"是露巣\",\"necomi\":\"necömi\",\"cona kinaco\":\"小奈きなこ\",\"kamioka chirol\":\"神岡ちろる\",\"mikoma sanagi\":\"美驹沙名希\",\"nanashiki fuka\":\"七色風香\",\"ashita\":\"アシタ\",\"midorinocha\":\"みどりのちや\",\"tsurukawa yashiro\":\"鶴川社\",\"samizu gumi\":\"さみずぐみ\",\"seijin\":\"せーじん\",\"yukisaki miale\":\"雪咲MIALE\",\"shennai misha\":\"神奈弥莎\",\"tsunano\":\"つなの\",\"eizan\":\"影斩\",\"akino kabocha\":\"秋野かぼちゃ\",\"kiyu fuyuki\":\"季結ふゆき\",\"ankoman\":\"あんこまん\",\"highlow\":\"废狼\",\"hanao.\":\"熊尾もふもふ\",\"otokura ringo\":\"乙倉りんご\",\"rougetu\":\"胧月\",\"ryuga syo\":\"龍牙翔\",\"kurage modoki\":\"くらげもどき\",\"oozora wakaba\":\"大空若叶\",\"nigirimeshi\":\"にぎりめし\",\"minami chisato\":\"南ちさと（有澤司）\",\"aotsuki shinobu\":\"蒼月しのぶ\",\"oshima aki\":\"大岛あき\",\"kimino tomonari\":\"君野朋成\",\"sune\":\"sune\",\"molgen\":\"モルゲン\",\"skylader\":\"すかいれーだー\",\"topia\":\"とぴあ\",\"nakamura regura\":\"仲村レグラ\",\"narumiya\":\"鳴海也\",\"ekakibit\":\"えかきびと\",\"yuki\":\"雪\",\"tadano mezashi\":\"只野めざし\",\"ojo\":\"おじょ\",\"himino\":\"ひみの\",\"6u\":\"6U☆\",\"nagioka\":\"凪丘\",\"yukiguni yuu\":\"雪国裕\",\"jairou\":\"ジャイロウ\",\"hirune\":\"昼寝\",\"nanatsuda\":\"七ツ田\",\"fun bo\":\"ふんぼ\",\"siseki hirame\":\"芝石ひらめ\",\"nattou mazeo\":\"納豆まぜお\",\"yamago\":\"山后\",\"hamon ai\":\"波纹爱\",\"misaka12003\":\"御坂12003\",\"mayafufu -kakko- kashikoi\":\"まやふふ(賢)\",\"yamanashi yuuya\":\"山梨ユウヤ\",\"ashinoue futomomo\":\"苇上太桃\",\"echigoya takeru\":\"越後屋タケル\",\"kawauchi\":\"川内\",\"aoi yun\":\"蒼井ゆん\",\"nimoshi\":\"にもし\",\"ennorei\":\"円之怜\",\"yuuki sonisuke\":\"ゆうきそにすけ\",\"kurororo rororo\":\"くろろろろろろ\",\"junsui na fujunbutsu\":\"純粋な不純物\",\"takano saku\":\"嵩乃朔\",\"sikusiku\":\"シクシク\",\"shiguma\":\"しぐま\",\"hisona\":\"ひそな\",\"nakatani nio\":\"仲谷鳰\",\"crerp\":\"くれ～ぷ\",\"indozou\":\"インド僧\",\"itou yuuji\":\"イトウゆーじ\",\"yu-ki\":\"ユーキ\",\"gotoh juan\":\"后藤寿庵\",\"binto\":\"瓶人\",\"itaru\":\"至る\",\"wasavi 8\":\"wasavi_8\",\"kitahara aki\":\"北原亚希\",\"satsuki itsuka\":\"五月五日\",\"kawaraya\":\"瓦爺\",\"kamizuki shiki\":\"守月史贵\",\"ponekusan\":\"ポネクサン\",\"akasa tanu\":\"赤佐たぬ\",\"takeya\":\"竹や\",\"makihitsuji\":\"巻羊\",\"jimmy\":\"jimmy\",\"healthyman\":\"ヘルシーマン\",\"aokoji\":\"青こじ\",\"miginohito mitsuru\":\"右の人みつる\",\"hidari kagetora\":\"左カゲトラ\",\"suruga kreuz\":\"駿河クロイツ\",\"mauve\":\"Mauve\",\"saeki sola\":\"佐伯ソラ\",\"tange suzuki\":\"丹下スズキ\",\"neji\":\"寝路\",\"negom\":\"ネゴム\",\"opanchu\":\"おぱんちゅ\",\"xion\":\"Xion\",\"tomoki tomonori\":\"ともきとものり\",\"pistonring nishizawa\":\"西泽みずき\",\"kokuryuugan\":\"黑龙眼\",\"kazakami sudare\":\"かざかみすだれ\",\"paryi\":\"帕里\",\"satoh\":\"砂糖\",\"amatake akewo\":\"甘竹朱郎\",\"jikasei\":\"自家製\",\"sakura hiyori\":\"桜ひより\",\"mukyu\":\"無休\",\"h2so4\":\"H2SO4\",\"yamada konayuki\":\"山田コナユキ\",\"mizushima sorahiko\":\"水岛空彦\",\"taneno nakami\":\"種乃なかみ\",\"mgmee\":\"MGMEE\",\"nathaniel pennel\":\"Pennel\",\"hadron9\":\"HADRON9\",\"supu\":\"すぷ\",\"kitaku\":\"きたく\",\"shirota dai\":\"白田太\",\"moyazou\":\"もや造\",\"kuguri oimo\":\"九栗おいも\",\"namio.h.ryuudou\":\"NAMIO.H.龍堂\",\"kazawa\":\"かざわ\",\"nukaji\":\"ぬかじ（wizakun）\",\"negresco\":\"Negresco\",\"navia\":\"なびあ\",\"sagaraten\":\"纱柄天\",\"naoto\":\"naoto\",\"green\":\"GreeN\",\"wakured\":\"和紅\",\"mankai kaika\":\"满开开花\",\"kumatora\":\"天空太一\",\"teshima nari.\":\"手島nari\",\"amashiro natsuki\":\"甘城なつき\",\"tumiki akeno\":\"積木あけの\",\"miwano rag\":\"美和野らぐ\",\"shigure ui\":\"しぐれうい\",\"nanahara fuyuki\":\"七原冬雪\",\"fukuinu\":\"福犬\",\"shotan\":\"しょたん\",\"ezoshika\":\"エゾシカ\",\"taketori zaiku\":\"竹取细工\",\"harada shoutarou\":\"原田将太郎\",\"kyougoku shin\":\"京極しん\",\"yamamori\":\"山森\",\"daki makura\":\"滝まくら\",\"nagishiro mito\":\"凪白みと\",\"minase nagi\":\"みなせなぎ\",\"nii manabu\":\"仁井学\",\"o-zicha\":\"おーじ茶\",\"p19\":\"p19\",\"sakuragi ren\":\"桜木蓮\",\"poruno ibuki\":\"はるのいぶき\",\"kenichi\":\"ケンイチ\",\"mashu\":\"ましゅー\",\"na-ga\":\"Na-Ga\",\"sakurazawa izumi\":\"桜沢いづみ\",\"hinayuki usa\":\"ヒナユキウサ\",\"amamitu kousuke\":\"甘蜜こうすけ\",\"atiki\":\"Aちき\",\"masaru.jp\":\"まさる.jp\",\"kizuki rei\":\"傷希レイ\",\"arisu kazumi\":\"有栖かずみ\",\"nanashiki\":\"七色\",\"tokuno yuika\":\"徳之ゆいか\",\"cut\":\"カット\",\"taya\":\"TAYA\",\"kamaboko\":\"釜ボコ\",\"mountainhan\":\"山含\",\"ahugan sugita\":\"アフガン杉田\",\"kurebayashi asami\":\"暮林あさ美\",\"oshiro\":\"阿白\",\"hakaishin\":\"破坏神\",\"muryotaro\":\"むりょたろ\",\"stealyy\":\"すてりい\",\"yamabukiiro\":\"山吹色\",\"gotoh\":\"ごとー\",\"casino\":\"カジノ\",\"hanekoto\":\"はねこと\",\"kanzaki hiro\":\"かんざきひろ\",\"saki chisuzu\":\"さき千鈴\",\"fujoujoshi\":\"不嬢女子\",\"mikuni saho\":\"御国纱帆\",\"tatsuse yumino\":\"龙濑弓乃\",\"ma-kurou\":\"まー九郎\",\"maitaimu\":\"舞大梦\",\"kyozip\":\"狂zip\",\"nishi yoshiyuki\":\"西义之\",\"momonosukebe\":\"腿之助兵卫\",\"torichamaru\":\"鸟茶丸\",\"uonome beji\":\"魚目ベジ\",\"j-kisarazu\":\"JK更津\",\"greco roman\":\"暮古浪漫\",\"shugao\":\"しゅがお\",\"andoryu\":\"安堂流\",\"commamion\":\"狐狸恩\",\"numa\":\"numa | 沼\",\"amagappa shoujogun\":\"雨がっぱ少女群\",\"suzumi raika\":\"凉海来夏\",\"aramaki echizen\":\"荒卷越前\",\"nakada rumi\":\"中田瑠美\",\"yuzuto sen\":\"柚十扇\",\"hayashi kewi\":\"林けゐ\",\"tadano saboten\":\"ただのサボテン\",\"hara yui\":\"原悠衣\",\"ibuki notsu\":\"伊吹のつ\",\"kinako\":\"木なこ\",\"shiino sera\":\"椎野せら\",\"kusakabe\":\"草壁\",\"kaiware\":\"かいわれ\",\"nakyo\":\"なきょ\",\"kutori panya\":\"九鳥ぱんや\",\"chiica\":\"ちぃか\",\"ushiro\":\"う白\",\"yuyumatsu\":\"ゆゆまつ\",\"sakura shiho\":\"紗倉シホ\",\"gomzi\":\"gomzi\",\"amamitsuki\":\"天三月\",\"xenon\":\"世音\",\"gyozanuko\":\"餃子ぬこ\",\"raptor7\":\"ラプトル７\",\"toshi\":\"toshi\",\"taishinkokuoh anton\":\"大秦国王安敦\",\"wanyanaguda\":\"完颜阿骨打\",\"kaede\":\"ゆか\",\"fummy\":\"ふみー\",\"shobu\":\"菖蒲\",\"sakayama shinta\":\"茶化山心太\",\"takasaki keisuke\":\"高咲圭介\",\"ushino naka\":\"うしの菜夏\",\"doskoinpo\":\"doskoinpo\",\"rin yuu\":\"リン☆ユウ\",\"mushi\":\"ムシ\",\"trigger\":\"TRIGGER\",\"miwabe sakura\":\"みわべさくら\",\"shirisensha\":\"尻戦車\",\"makabe gorou\":\"真壁吾郎\",\"kakuninii\":\"角煮煮\",\"tukimi daifuku\":\"月見大福\",\"satou chagashi\":\"佐藤茶菓子\",\"touno itsuki\":\"桐野いつき\",\"gekka kaguya\":\"月下火愚夜\",\"maguro shining\":\"まぐろシャイニング\",\"santa\":\"santa\",\"togi\":\"とぎ\",\"akizuki mac\":\"秋月まく\",\"fujii jun\":\"藤伊洵\",\"morino bambi\":\"森乃ばんび\",\"nekoi mie\":\"猫井ミィ\",\"ikujinashi no fetishist\":\"いくじなしのフェティシスト\",\"chomikuplus\":\"Chomikuplus\",\"fuzui\":\"不随\",\"tokomaya keita\":\"とこまやけいた\",\"holiday yasumi\":\"堀出井靖水\",\"ronrinri ronri\":\"論倫理ろんり\",\"tsukueno elf\":\"机野エルフ\",\"hiiragi popura\":\"柊ぽぷら\",\"nogiwa kaede\":\"野際かえで\",\"hitoi\":\"灯問\",\"bouen\":\"ぼうえん\",\"tsukudani\":\"佃煮\",\"shigemiya kyouhei\":\"樹宮匡平\",\"roshin\":\"炉心\",\"mamemametama\":\"まめまめたま\",\"nakagami takashi\":\"中上たかし\",\"ukanmuri\":\"うかんむり\",\"momotomato\":\"桃とまと\",\"muchin\":\"むーちん\",\"hou\":\"蜂様 (ほう)\",\"nakamura b-ta\":\"中村べーた\",\"lengsediaokafei\":\"冷色调咖啡\",\"naruse hirofumi\":\"鸣濑ひろふみ\",\"momose sumomo\":\"桃瀬すもも\",\"nukuo\":\"ヌク男\",\"sindoll\":\"シンドール\",\"horikawa gorou\":\"堀川悟郎\",\"kandenki\":\"感电器\",\"tsukimi ruko\":\"月見ルコ\",\"kameyama shiruko\":\"亀山しるこ\",\"takimoto yukari\":\"瀧本ゆかり\",\"sakamoto kafka\":\"阪本KAFKA\",\"itsutsuse\":\"古川五势（いつつせ）\",\"chiyingzai\":\"帜瑛\",\"isako rokuroh\":\"井硲六郎\",\"nigiri usagi\":\"にぎりうさぎ\",\"mizumizuni\":\"見ず水煮\",\"shinagawa mikuzu\":\"品川ミクズ\",\"wakamatsu\":\"わかまつ\",\"geko\":\"GEKO\",\"yatosaki haru\":\"やとさきはる\",\"ootsuka mahiro\":\"大塚まひろ\",\"fuyuichi monme\":\"冬壱もんめ\",\"momosawa\":\"ももさわ\",\"sangatsu sanichi\":\"三月さんいち\",\"konnyaku\":\"蒟蒻\",\"yaminabe\":\"やみなべ\",\"tenjo ryuka\":\"天壌りゅか\",\"nekoya\":\"猫夜\",\"muninshiki\":\"むにんしき\",\"masayo\":\"まさよ\",\"momozu komamochi\":\"桃豆こまもち\",\"hoshii nasake\":\"星井情\",\"amezawa koma\":\"飴沢狛\",\"kanda dan\":\"館田ダン\",\"mikuni mizuki\":\"みくに瑞貴\",\"yamamoto naoki\":\"山本直树\",\"neromashin\":\"ねろましん\",\"yuugen\":\"ゆーげん\",\"oshio\":\"おしお\",\"torotarou\":\"トロ太郎\",\"mishima kurone\":\"三岛黑音\",\"himuro shunsuke\":\"氷室しゅんすけ\",\"haikome\":\"灰米\",\"bizen dorobune\":\"備前泥舟\",\"kagura nanaki\":\"神楽七姫\",\"nozomi tsubame\":\"希望つばめ\",\"saba satoru\":\"佐波サトル\",\"nagashiro rouge\":\"長代ルージュ\",\"kuroiwa menou\":\"黑岩玛瑙\",\"isorashi\":\"五十岚唱乃\",\"minato fumi\":\"三巷文\",\"hashida mamoru\":\"桥田镇\",\"hiryuu ran\":\"飞龙乱\",\"nyoro nyorozou\":\"清炭ハリケーン\",\"denkichi\":\"でん吉\",\"qdou kei\":\"Q堂恵\",\"hisen kaede\":\"緋仙カエデ\",\"kazushiki midori\":\"一色緑\",\"someoka yusura\":\"染岡ゆすら\",\"haruse hiroki\":\"晴瀬ひろき\",\"tenmu shinryuusai\":\"天夢森流彩\",\"anza yuu\":\"あんざゆう\",\"amane ruri\":\"天音るり\",\"dytm\":\"DYTM\",\"gentsuki\":\"ゲンツキ\",\"iwasaki yuuki\":\"岩崎ユウキ\",\"mashiraga aki\":\"猿駕アキ\",\"midori aoi\":\"みどり葵\",\"musha sabu\":\"武者サブ\",\"sanjuurou\":\"三十郎\",\"souji hougu\":\"扫除朋具\",\"uousaoh\":\"鱼ウサ王\",\"kuroharuto\":\"くろはると\",\"oomori\":\"大盛り\",\"yasson yoshiyuki\":\"やっそん義之\",\"hiyori mizuki\":\"陽寄瑞貴\",\"fushoku\":\"腐蝕\",\"coupe\":\"こっぺ\",\"panchira steak\":\"ぱんちらステーキ\",\"saizu nitou gunsou\":\"才津二等軍曹\",\"nakamura rohane\":\"中村六翅\",\"nohito\":\"nohito\",\"turiganesou\":\"釣鐘草\",\"kyo1\":\"響樹はじめ\",\"shimimaru\":\"纸鱼丸\",\"arai kei\":\"荒井启\",\"suzudama renri\":\"鈴玉レンリ\",\"kurokoshi you\":\"黑越阳\",\"inato serere\":\"稲戸せれれ\",\"akitsuki itsuki\":\"秋月伊槻\",\"yd\":\"yd\",\"azuma yuki\":\"东由希\",\"enokido\":\"エノキドォ\",\"gokubuto mayuge\":\"极太眉毛\",\"hakaba\":\"墓場\",\"hitotsuba\":\"ひとつば\",\"furyouhin\":\"ニャ獣（不良品）\",\"gesundheit\":\"ゲズンタイト\",\"takamichi\":\"たかみち\",\"aki99\":\"aki99\",\"rensyu\":\"Rensyu\",\"himitsu\":\"蜜酱（ひみつ）\",\"tooo\":\"tooo\",\"abubu\":\"あぶぶ\",\"red romanov\":\"はだぱるか\",\"bubukka\":\"ぶぶっか\",\"itosugi masahiro\":\"糸杉柾宏\",\"a-801\":\"アニメ8OI\",\"araki akira\":\"あらきあきら\",\"haregama shiina\":\"晴釜椎名\",\"misao.\":\"みさお。\",\"yamazaki kana\":\"山崎かな\",\"kanyapyi\":\"かにゃぴぃ\",\"maruta\":\"MARUTA\",\"ichiichi yuuna\":\"一市裕納\",\"rinrin\":\"RINRIN\",\"meramera jealousy\":\"メラメラジェラシー\",\"miyazaki maya\":\"宫崎摩耶\",\"sasakura ayato\":\"笹仓绫人\",\"mori guruta\":\"森ぐる太\",\"mayonnaise.\":\"まよねーず。\",\"broiler\":\"broiler\",\"zukiki\":\"ZUKI树\",\"urute\":\"urute\",\"anyanko\":\"あにゃんこ\",\"inuarasi\":\"犬嵐\",\"sasahara yuuki\":\"佐佐原忧树\",\"wakaba kaoru\":\"わかばかおる\",\"teruki kuma\":\"てるき熊\",\"shitou\":\"四头\",\"ryunnu\":\"りゅんぬ\",\"sage\":\"Sage（りゅんぬ ）\",\"hikami izuto\":\"ひかみいずと\",\"e10\":\"e10\",\"tawawaringo\":\"たわわりんご\",\"ujiie moku\":\"氏家もく\",\"urotan\":\"うろたん\",\"kaishinshi\":\"怪绅士\",\"kakkuu\":\"滑空\",\"urajirou\":\"杉浦次郎\",\"chuushin kuranosuke\":\"忠臣藏之介\",\"tsukiyoshi hiroki\":\"月吉ヒロキ\",\"tomozawa shou\":\"智泽渚优\",\"nakamura mizumo\":\"中村みずも\",\"nendo.\":\"ねんど。\",\"hokama mitsuri\":\"ほかまみつり\",\"horihone saizou\":\"掘骨碎三\",\"toruneko\":\"获る猫\",\"sirokuma shake\":\"白クマシェイク\",\"mizui kaou\":\"瑞井鹿央\",\"minasuki popuri\":\"みなすきぽぷり\",\"hoshino shiho\":\"星野志保\",\"miyashita miki\":\"宫下未纪\",\"yamamoto kumoi\":\"山本云居\",\"marcy dog\":\"MARCYどっぐ\",\"asahina makoto\":\"朝比奈诚\",\"majoccoid\":\"majoccoid\",\"aogiri penta\":\"あおぎりぺんた\",\"mitsuba\":\"三叶 | みつば\",\"ppshex\":\"芝士糖\",\"misakamitoko0903\":\"电磁炮二期\",\"kimimaru\":\"きみまる（东毅）\",\"softcharm\":\"SOFTCHARM\",\"tsuruyama mito\":\"鶴山ミト\",\"tanimachi maid\":\"谷町女仆\",\"bookmoun10\":\"ぶっくまうんten\",\"ogataaz\":\"OgataAz\",\"ayato ayari\":\"あやとあやり\",\"rangetsu\":\"岚月\",\"misakura nankotsu\":\"御樱软骨\",\"kio seiji\":\"きお誠児\",\"riyo\":\"リヨ\",\"hanamaki kaeru\":\"花巻かえる\",\"bennys\":\"BENNY'S\",\"inaba cozy\":\"稻叶COZY\",\"oie kaeru\":\"御家かえる\",\"chinzurena\":\"チンズリーナ\",\"palco nagashima\":\"パルコ長嶋\",\"ponpon itai\":\"ぽんぽんイタイ\",\"takeuchi takashi\":\"武内崇\",\"takahashi keitarou\":\"高桥庆太郎\",\"shima drill\":\"しまどりる\",\"bunbun\":\"BUNBUN\",\"abec\":\"abec\",\"a-10\":\"A-10（不破大辅）\",\"atori k\":\"秋尚\",\"umashika\":\"うましか\",\"ebifly\":\"えびふらい\",\"azumawari\":\"あずまわり\",\"namori\":\"Namori\",\"hata kenjirou\":\"畑健二郎\",\"gelatin\":\"沟口明胶\",\"utahane w\":\"うたはね\",\"kusano kouichi\":\"草野红壹\",\"konata hyuura\":\"虎向Hyuura\",\"konno azure\":\"紺野あずれ\",\"sawano akira\":\"泽野明\",\"shiran takashi\":\"しらんたかし\",\"matra milan\":\"的良米兰\",\"morisaki kurumi\":\"森崎胡桃\",\"todoroki shin\":\"轰真\",\"hirotake awataka\":\"粟岳高弘\",\"hayake\":\"はやけ\",\"hasblow cream\":\"はすぶろくりーむ\",\"kagami fumio\":\"加賀美ふみを\",\"kamirenjaku sanpei\":\"上连雀三平\",\"kyaradain\":\"きゃらだいん\",\"minna daisuki\":\"みんなだいすき\",\"cloba.u\":\"Cloba・U\",\"binsen\":\"びんせん\",\"koari\":\"小蚁\",\"toriburi\":\"トリブリ\",\"osanpo suisou\":\"おさんぽ水槽\",\"ohaguro dobu\":\"御歯黒溝（桜シロウ）\",\"makio\":\"マキオ\",\"mikaduchi\":\"みかづち\",\"ogu\":\"おぐ\",\"aoki kanji\":\"青木干治\",\"amagi kei\":\"亚麻木硅\",\"ikumo taisuke\":\"井云泰助\",\"mana\":\"MANA\",\"hanpen\":\"はんぺん\",\"zeroshiki kouichi\":\"ぷぅ崎ぷぅ奈\",\"kagono tori\":\"かごのとり\",\"haga yui\":\"叶贺唯\",\"shinichirou otsuka\":\"大冢真一郎\",\"haniwa hao\":\"はにわはお\",\"akitaka mika\":\"明贵美加\",\"kanabun\":\"kanabun\",\"miyasaka takaji\":\"ミヤサカタカジ\",\"crowe\":\"クロエ\",\"ruhika\":\"ルヒカ\",\"oobanburumai\":\"オオバンブルマイ\",\"shin fuzen\":\"シン 普禅\",\"magekichi\":\"まげきち\",\"juna\":\"JUNA\",\"kotokane hajime\":\"ことかねはじめ\",\"yoshitani ganjitsu\":\"义谷元日\",\"kawai masaki\":\"川合正起\",\"wada wau\":\"和田羽烏\",\"rondonko\":\"ろんどんこ\",\"pirason\":\"ぴらそん\",\"zettai yarumoni\":\"絶対やるもに\",\"shishi senmaru\":\"狮子千丸\",\"kameyoshi ichiko\":\"亀吉いちこ\",\"leonardo 16sei\":\"れオナるド16世\",\"funwari rice\":\"ふんわり☆らいす\",\"akao\":\"朱尾\",\"omecho\":\"おめちょ\",\"chicken\":\"チキン\",\"uba yoshiyuki\":\"宇场义行\",\"syokuyou-mogura\":\"Syokuyou-Mogura\",\"nanjou asuka\":\"南条飞鸟\",\"kurenai yuuji\":\"紅ゆーじ\",\"kohsaka novak\":\"高坂のばく\",\"osisio\":\"osisio\",\"kazune haka\":\"和音ハカ\",\"yatomi\":\"やとみ\",\"karaage3\":\"からあげ3\",\"gibachan\":\"ぎばちゃん\",\"takitarou\":\"滝太郎\",\"yangcong chaodasuan\":\"洋葱炒大蒜\",\"tokunou shoutarou\":\"得能正太郎\",\"tsugumi suzuma\":\"亚美寿真\",\"kakao\":\"kakao\",\"akabane\":\"アカバネ\",\"miyashiro ryuutarou\":\"三夜代龙太郎\",\"meganei\":\"メガねぃ\",\"tamatanuki\":\"たまたぬき\",\"asabi miho\":\"山葵美保\",\"matsumiya kiseri\":\"茉宮祈芹\",\"hirokawa\":\"広川\",\"kamiya yuu\":\"榎宮祐\",\"imigimuru\":\"いみぎむる\",\"kise itsuki\":\"木濑树\",\"shono kotaro\":\"宵野小太郎\",\"rurudo\":\"rurudo\",\"ashima takumi\":\"芦間拓海\",\"nishigori atsushi\":\"锦织敦史\",\"nanashimushi\":\"ななし虫\",\"ippo\":\"ippo\",\"smomo\":\"smomo\",\"madoromi\":\"まどろみ\",\"nishiyama yuichi\":\"にしやまゆーいち\",\"azumi akitake\":\"安曇アキタケ\",\"dondakei\":\"どんだけい\",\"imaishi hiroyuki\":\"今石洋之\",\"gilse\":\"Gilse\",\"junkie\":\"千要よゆち\",\"nibiirokaden\":\"鈍色家電\",\"migihaji\":\"右端\",\"miyoshino\":\"みよしの\",\"omochi monaka\":\"おもち もなか\",\"ootsuka reika\":\"大塚麗夏\",\"zanka\":\"ざんか\",\"ashizuki\":\"アシズキ\",\"abe nattou\":\"あべなっつ\",\"yuushi tessen\":\"柚子铁线\",\"hitsujino\":\"羊乃\",\"ancotaku\":\"餡こたく\",\"shirokimochi\":\"白生もち\",\"nagatukiin\":\"长月院\",\"tanuma\":\"たぬま\",\"chihiro\":\"Chihiro\",\"soba\":\"soba\",\"kaneko\":\"華猫\",\"sekai saisoku no panda\":\"世界最速のパンダ\",\"ayame iro\":\"絢芽いろ\",\"kaiduka akuta\":\"貝塚芥\",\"katsuten\":\"かつてん\",\"waterring\":\"WaterRing\",\"gwegwe\":\"gweda\",\"nehani\":\"ねはに\",\"juukyuu\":\"じゅうきゅう\",\"chobipero\":\"ちょびぺろ\",\"takama\":\"高天\",\"pesshin\":\"ペッシン\",\"tomatojigoku\":\"とまとじごく\",\"midori\":\"みどり\",\"ponponmaru\":\"ぽんぽんまる\",\"hame dragon\":\"ハメドラゴン\",\"ziran\":\"ZIRAN\",\"hinamo\":\"ひなも🍀\",\"keso shirou\":\"けそシロウ\",\"nishimura nike\":\"西村にけ\",\"ererep\":\"エレレ🌸\",\"mammoth\":\"ドロンタビ\",\"yonemochi akihiko\":\"米餅昭彦\",\"momikocu\":\"籾殻\",\"danimaru\":\"だにまる\",\"reba\":\"れば☆\",\"chifuyu\":\"千冬\",\"itsuki kuro\":\"伊月クロ\",\"tonari\":\"隣\",\"sawaragi\":\"沢良宜\",\"sanrokumaru\":\"さんろく丸\",\"kuga mayuri\":\"久我茧莉\",\"jiyu2\":\"磁油2\",\"yoshida\":\"吉田\",\"dokukinokozin\":\"毒茸人\",\"danrenji\":\"だんれんじ\",\"kiri-kiri mai\":\"ギリギリ舞\",\"oshino\":\"推乃\",\"shiramizu mizuchi\":\"白瑞みずち\",\"majima tetsurou\":\"真島てつろー\",\"super zombie\":\"すーぱーぞんび\",\"seuma\":\"せうま\",\"ryoma\":\"きただりょうま\",\"kannko\":\"缶子\",\"sencha\":\"せんちゃ\",\"miyazaki hayao\":\"宫崎骏\",\"amatou\":\"甘党\",\"aki akane\":\"秋赤音\",\"lack\":\"lack\",\"morikoke\":\"もり苔\",\"tansuiken\":\"淡水犬\",\"yamakonbu\":\"やまこんぶ\",\"crew\":\"クルー\",\"toujou tsukushi\":\"東條土筆\",\"yamada gogogo\":\"山田ゴゴゴ\",\"g-wara\":\"爺わら\",\"ibarame hisa\":\"茨芽ヒサ\",\"aoyama kiiro.\":\"あおやまきいろ。\",\"ushiro muki\":\"丑露ムキ\",\"uono shinome\":\"魚野シノメ\",\"igedoaha\":\"イゲドアハ\",\"tachibana nagon\":\"立花なごん\",\"takoyaki rock\":\"タコヤキロック\",\"yuruchin kyouso\":\"ゆるちん教祖\",\"mitsuki\":\"ミツ季\",\"momono yuuca\":\"もものユーカ\",\"oyama kina\":\"大山树奈\",\"ronna\":\"ろんな\",\"uranokyuu\":\"ウラノキュウ\",\"7x2\":\"7×2\",\"kurowa\":\"黒輪\",\"pei\":\"ぺい\",\"shimazu tekko\":\"島津鉄甲（raikoh）\",\"enoki\":\"えのき\",\"mizuno cho\":\"みずのちょう\",\"rca\":\"rca\",\"satotuki tiyo\":\"里月ちよ\",\"gar\":\"ガー\",\"shibaken goro\":\"柴犬五郎\",\"tachibana roku\":\"タチロク（MegaPantS）\",\"tang-pong\":\"Tang-Pong★\",\"yamaimo tororo\":\"山芋とろろ\",\"furumoto takeru\":\"降本孟\",\"kayama kifumi\":\"加山きふみ（樹八ウロ）\",\"tobari saru\":\"トバリ猿\",\"utsusumi kio\":\"空住キオ\",\"eshimoto\":\"Eシモト\",\"shingo.\":\"Shingo.\",\"nedokoro mitsuki\":\"ねどころみつき\",\"hoshi to lucky\":\"ほしとラッキー\",\"fuzichoco\":\"藤原\",\"yuiga naoha\":\"由雅なおは\",\"tousen\":\"冬扇\",\"edogawa roman\":\"江戸川浪漫\",\"kurimoti tiduru\":\"栗餅ちづる\",\"the-sinner\":\"The-Sinner\",\"nochanzero\":\"Nochanzero\",\"10eki\":\"10駅\",\"voidmaki\":\"Voidmaki\",\"star chaser\":\"STAR☆CHASER\",\"greko\":\"Greko🔞\",\"onikun\":\"おにくん\",\"c ice\":\"C_ICE\",\"saitom\":\"斋藤将嗣\",\"komi zumiko\":\"コミズミコ\",\"kawakami masaki\":\"川上真树\",\"hizuki akira\":\"绯月Akira\",\"cream cod\":\"奶油鳕鱼\",\"yasuyuki\":\"やすゆき\",\"hisama kumako\":\"ひさまくまこ\",\"mikisai\":\"みきさい\",\"kisaragi yuri\":\"きさらぎゆり\",\"ichikawa halu\":\"いちかわはる\",\"betm\":\"杯面\",\"bttn\":\"bttn\",\"hao\":\"はお\",\"wool\":\"うーる\",\"dainyu\":\"代入\",\"koshino\":\"こしの\",\"haiki\":\"はいき\",\"50 percent off\":\"50%OFF\",\"shiba kumiko\":\"柴くみこ\",\"tousaki shiina\":\"凍咲しいな\",\"shiba yuuji\":\"司馬ゆうじ\",\"ruki\":\"琉希\",\"longbow flintlock\":\"长弓燧龙\",\"milkybot\":\"Milkybot\",\"kyougoku touya\":\"京极灯弥\",\"ikutsuki\":\"イクツキ\",\"mitarou\":\"ミタロウ\",\"higuchi isami\":\"ひぐちいさみ\",\"yuuki rika\":\"結城リカ\",\"meicha\":\"冥茶\",\"shinoda kazuhiro\":\"篠田一宏\",\"cure slum\":\"キュアスラム\",\"nanakichi\":\"七吉\",\"yoshitama ichirou\":\"吉玉一楼\",\"rifuru\":\"りふる\",\"oniharigusa\":\"鬼针草\",\"komota\":\"こもた\",\"akamoku\":\"あかもく\",\"hiyama yuki\":\"檜山ユキ\",\"izumi kirifu\":\"和泉キリフ\",\"suzuki nago\":\"铃木和\",\"ito fleda\":\"伊藤達哉Tatsuya Ito\",\"namatsui\":\"なまつい\",\"mimamoriencyo\":\"みまもり園長\",\"yukiyoshi mamizu\":\"ゆきよし真水\",\"miyashiro sousuke\":\"宮社惣恭\",\"sasaki bullet\":\"佐々木バレット\",\"kuroki hidehiko\":\"黑木秀彦\",\"agemo agm\":\"阿戈魔AGM\",\"jackasss\":\"空蜂ミドロ（テラダ・ジャッカス）\",\"izayoi seishin\":\"十六夜清心\",\"dancyo\":\"だんちょ\",\"ame\":\"雨\",\"jp06\":\"JP06\",\"kazepana\":\"かぜぱな\",\"gyouza teishoku\":\"ギョウザテイショク\",\"kyouichirou\":\"狂一郎\",\"kuon michiyoshi\":\"久远道义\",\"gorgeous mushroom\":\"绚烂的蘑菇\",\"samneco\":\"寒猫\",\"yakuhina\":\"yakuhina\",\"kawayoi\":\"かわよい\",\"nishida megane\":\"仁志田メガネ\",\"furuya nagisa\":\"古矢渚\",\"chouchin ankou\":\"提灯暗光\",\"kantamaki yui\":\"環々唯\",\"emu emuo\":\"えむえむお\",\"yanagi hareta\":\"晴太\",\"houkisei\":\"ほうき星\",\"takahama tarou\":\"高浜太郎\",\"ikezaki misa\":\"池咲弥撒\",\"ikameshi\":\"乌贼饭\",\"sakura romako\":\"桜ロマ子\",\"moejin\":\"萌尽\",\"shinjitsu\":\"真实\",\"yoshiie\":\"由家\",\"nikubou maranoshin\":\"肉棒魔罗之进\",\"goya\":\"蜜姫モカ\",\"doji ro\":\"どじろー\",\"hiro\":\"博\",\"inokuma shinobu\":\"猪熊忍\",\"kusayarou\":\"草野郎\",\"eufoniuz\":\"Eufoniuz\",\"chaoroushi\":\"炒肉师\",\"nikujiruc\":\"肉汁uc\",\"nakadera akira\":\"中寺明良\",\"kushida\":\"くしだ\",\"ono kenuji\":\"尾野けぬじ\",\"gotoh akira\":\"後藤晶\",\"niko\":\"ニコ\",\"hcwj\":\"心味觉\",\"kunimoto takashi\":\"国本隆史\",\"okyou\":\"おきょう\",\"testame\":\"ツリサス\",\"jj\":\"jj\",\"sesena yau\":\"せせなやう\",\"cai pi jun\":\"菜さん\",\"hara\":\"へら\",\"nenobi\":\"子野日\",\"maki hideto\":\"牧秀人\",\"sahara ikkou\":\"佐原一光\",\"izumi mahiru\":\"泉まひる\",\"ranou\":\"卵の黄身\",\"abso lu\":\"あぶそる\",\"kyuusuikei\":\"給水係\",\"sr\":\"SR\",\"azure\":\"あずーる\",\"ishimura\":\"石村\",\"random\":\"兰田梦\",\"hamadamiku\":\"浜田みく\",\"nanasaki\":\"七崎\",\"satsuki misuzu\":\"皐月深鈴\",\"haneru\":\"HaneRu\",\"manbou\":\"マンボー\",\"mokuseirokku\":\"木星ろっく\",\"ment\":\"ment\",\"nardack\":\"Nardack\",\"borisu\":\"ボリス\",\"kunisaki kei\":\"国崎蛍\",\"torimogura\":\"とりもぐら\",\"ihara asta\":\"伊原あす太\",\"yasu\":\"yasu\",\"akadama\":\"红玉\",\"shiranami kouki\":\"白波航希\",\"asaga aoi\":\"浅賀葵\",\"camonome\":\"かものめ\",\"shikigami kuroko\":\"式神くろ子\",\"coburaco\":\"コブラノヲヤツ\",\"nemu\":\"ネム\",\"yoshika\":\"ヨシカ\",\"uduki takeru\":\"卯月たける\",\"yunagi amane\":\"憂凪あまね\",\"nusmusbim\":\"ナスムスビム\",\"tatsu tairagi\":\"燵成\",\"doemutan\":\"どえむたん\",\"ooshima towa\":\"大島永遠\",\"posuimianju\":\"破碎面具\",\"suzuki hinomi\":\"鈴木ひのみ\",\"minamo\":\"みなも\",\"ka-9\":\"ないん\",\"shinjima saki\":\"心岛咲\",\"riko\":\"利行\",\"shinozaki rei\":\"しのざき嶺\",\"mei ichi\":\"名一\",\"sadakage\":\"貞影\",\"akako\":\"AKAKO\",\"momokumo\":\"桃云\",\"umiyamasoze\":\"海山そぜ\",\"cailin020\":\"Cailin020\",\"yuzhou\":\"宇宙\",\"tantan\":\"たん旦\",\"rana yume\":\"らな夢\",\"sen\":\"Sen\",\"oumikun\":\"近江训\",\"fukai ryousuke\":\"深井涼介\",\"hmongt\":\"hmongt\",\"saber01\":\"saber_01\",\"tripleq\":\"TripleQ\",\"kashieda subaru\":\"貸江田昴\",\"uranoa\":\"うらのあ\",\"tisen\":\"撥撥 (Tisen)\",\"chamu\":\"雅茶木HZ\",\"owari\":\"おわり\",\"zoharwolf\":\"Zoharwolf\",\"ushi no shita\":\"牛の舌\",\"dikk0\":\"ディッコ\",\"nanamoto\":\"ななもと\",\"naidong\":\"奶凍\",\"karan\":\"からん\",\"hetaren\":\"へたれん\",\"ginger shuka\":\"姜糖\",\"sazaemu\":\"さざえむ\",\"gunjou\":\"群青\",\"takaman\":\"高馒\",\"xiaoxi\":\"小西0619\",\"arimura daikon\":\"有村大根\",\"toyama burin\":\"遠山ブリン\",\"tsukai you\":\"塚井ヨウ\",\"botan m\":\"牡丹M\",\"syouwaru\":\"性悪\",\"indo curry\":\"印度咖喱\",\"hirasawa zen\":\"平沢Zen\",\"shimuro itaru\":\"至室\",\"mishiro shizuku\":\"水白しずく\",\"gedou danshaku\":\"外道男爵\",\"nero augustus\":\"尼禄奥古斯都\",\"sarena\":\"百花星彩メメちゃん\",\"makari tohru\":\"魔狩十织\",\"mizoguchi keiji\":\"沟口凯吉\",\"bing gong asylum\":\"冰宫Asylum\",\"mikimoto haruhiko\":\"美树本晴彦\",\"asakura ryosuke\":\"朝仓亮介\",\"b-river\":\"B-RIVER\",\"katakura mikki\":\"片倉みっき\",\"chichan54\":\"ちーちゃん54\",\"midori niku\":\"绿肉\",\"oko yomiko\":\"小神よみ子\",\"umemotsuzou\":\"梅モツ蔵\",\"nori gorou\":\"のり伍郎\",\"0-g\":\"0-G\",\"0bake\":\"0BAKE\",\"0k0j0\":\"0k0j0\",\"10-shion\":\"10-Shion\",\"10mo\":\"10mo\",\"10nin\":\"10nin\",\"13.\":\"13.\",\"2 equals 8\":\"2=8\",\"286c\":\"286c\",\"2gou\":\"2号\",\"2t\":\"2T\",\"322g\":\"322g\",\"360mb yano\":\"360MB矢野\",\"38kb\":\"38kb\",\"3e\":\"さんい\",\"3u\":\"3u\",\"4 coulomb\":\"よんくーろん\",\"45acp\":\"45ACP\",\"4shi\":\"4氏\",\"4why\":\"4why\",\"5jack\":\"5jack\",\"77gl\":\"77gl\",\"78rr\":\"だぶるあーる\",\"7c\":\"7c\",\"7ten paoki\":\"7点ぱおき\",\"846gou\":\"846号\",\"94plum\":\"94Plum\",\"9chibiru\":\"九千ビノレ\",\"9law\":\"9LAW\",\"a toshi\":\"Aとし\",\"a-loveru\":\"A・Loveる\",\"a-lucky murashige\":\"アラーキー村重\",\"a-s\":\"A-S\",\"a-tak\":\"A-tak\",\"a.k.a.nyarot\":\"a.k.a.にゃろっと\",\"a.s. hermes\":\"A.S.ヘルメス\",\"a1\":\"A1\",\"ababari\":\"ababari\",\"abara\":\"アバラ\",\"abazu red\":\"あばずRed\",\"abc-pauler\":\"abc-pauler\",\"abe\":\"ABE\",\"abe aiko\":\"安部愛コ\",\"abe ryu\":\"悪部瑠\",\"abe tsukumo\":\"あべつくも\",\"abeno chaco\":\"阿倍野ちゃこ\",\"abi\":\"あび\",\"abio\":\"あびお\",\"abmayo\":\"abmayo\",\"abo\":\"ABO\",\"abo manten\":\"阿保満天\",\"abu4\":\"あぶ4\",\"aburaage\":\"柳瀬敬之\",\"aburi\":\"あぶり\",\"aburidashi zakuro\":\"あぶりだしざくろ\",\"abutomato\":\"アブトマト\",\"abzome\":\"エビゾメ\",\"acbins\":\"あくびんす\",\"accio\":\"あっちょ\",\"ace\":\"A士\",\"acht\":\"アハト\",\"achumuchi\":\"あちゅむち\",\"aco\":\"Aco\",\"adon no aniki\":\"アドンの兄貴\",\"aduma kei\":\"あづま京\",\"afuro\":\"あふろ\",\"agata\":\"アガタ\",\"agata akira\":\"県晶\",\"agemon\":\"アゲモン\",\"agetama\":\"あげたま\",\"ago\":\"顎\",\"agro bio\":\"阿黒バイオ\",\"agu\":\"あぐ\",\"agumen\":\"アグ麺\",\"agurecchi\":\"アグれっち\",\"aguri\":\"あぐり\",\"ahaha\":\"あはは\",\"ahchi\":\"あぁち\",\"ahe\":\"あへ\",\"aheen\":\"あへーん\",\"ahiru\":\"あひる\",\"ahobaka\":\"AHOBAKA\",\"ahorobo\":\"ahorobo\",\"ahou miya\":\"阿呆宮\",\"ahru.\":\"あーる。\",\"ai\":\"あぃ\",\"ai ni shisu\":\"愛に死す\",\"aiu kaho\":\"相羽翔穂\",\"aibu yue\":\"相武ゆえ\",\"aichi shiho\":\"あいち志保\",\"aida mai\":\"英田舞\",\"aida maki\":\"あいだまき\",\"aida takanobu\":\"会田孝信\",\"aiiro danchi\":\"藍色団地\",\"aika\":\"Aika\",\"aikawa\":\"愛川\",\"aikawa ruru\":\"藍川琉々\",\"aikawa ryou\":\"相川りょう\",\"aikawa tatsuki\":\"相川たつき\",\"aikura mahiru\":\"藍倉真昼\",\"aikura shuuya\":\"藍倉秋夜\",\"aikuri\":\"あいくり\",\"aimirucha\":\"藍海松茶\",\"aimitsu\":\"あいみつ\",\"aimo\":\"アイモ\",\"aimy\":\"あいみ*\",\"ainaryumu\":\"藍那りゅむ\",\"aino\":\"あいの\",\"ainu mania\":\"アイヌマニア\",\"aioi aoi\":\"相生青唯\",\"air\":\"air\",\"aira\":\"姶良\",\"aitanikov\":\"あいたにこふ\",\"aito matoko\":\"あいとまとこ\",\"aiuchi yoshiki\":\"あいうちよしき\",\"aiueou\":\"愛飢王\",\"aiyama toshikazu\":\"愛山寿一\",\"aiyoshi hazuki\":\"藍吉はづき\",\"aizawa\":\"相沢\",\"aizawa chihiro\":\"藍沢ちひろ\",\"aizawa moe\":\"相澤萌\",\"aizawa sanae\":\"相沢早苗\",\"aizawa shin\":\"あいざわしん\",\"aizawa tetora\":\"アイザワテトラ\",\"aizima atsushi\":\"相嶋敦\",\"aizome gorou\":\"愛染五郎\",\"aji\":\"鯵\",\"aji pontarou\":\"安治ぽん太郎\",\"ajino\":\"あじの\",\"ajoea\":\"あじょぁ\",\"aju\":\"アジュ\",\"aka\":\"亚果\",\"aka marl\":\"赤Marl\",\"aka p\":\"赤P\",\"aka satanan\":\"赤さたなん\",\"aka seiryuu\":\"赤セイリュウ\",\"akaboshi rika\":\"赤星りか\",\"akabur\":\"Akabur\",\"akadume\":\"朱爪\",\"akae neo\":\"赤絵ねお\",\"akae shirou\":\"朱江士朗\",\"akaga hirotaka\":\"赤賀博隆\",\"akage no un\":\"赤毛のUN\",\"akagi gisho\":\"アカギギショウ\",\"akagi rio\":\"赤木リオ\",\"akaguchi yuuda\":\"赤口ユウダ\",\"akahira kirin\":\"あかひらきりん\",\"akai hoya\":\"赤井ほや\",\"akai kagerou\":\"あかいかげろう\",\"akai mato\":\"紅唯まと\",\"akaiken\":\"あかいけん\",\"akainu pochi\":\"赤犬ポチ\",\"akairo\":\"あかゐろ\",\"akaishi shiroishi\":\"あかいししろいし\",\"akame\":\"あかめ\",\"akamichi\":\"朱道\",\"akan tare\":\"阿寒たれ\",\"akanagi\":\"AKANAGI\",\"akanagi youto\":\"紅薙遥兎\",\"akane\":\"あかね\",\"akane shuuhei\":\"茜しゅうへい\",\"akane souichi\":\"明音そーいち\",\"akaneman\":\"明寝マン\",\"akaou\":\"赤王\",\"akari\":\"アカリ\",\"akari seisuke\":\"明誠助\",\"akarin\":\"あかりん\",\"akasaka kazuhiro\":\"赤坂かずひろ\",\"akasode\":\"赤袖\",\"akasya botan\":\"朱赦ぼたん\",\"akatsuki\":\"あかつき\",\"akatsuki akane\":\"あかつき茜\",\"akatsuki johnny reitou\":\"紅月ジョニー冷凍\",\"akatsuki katsuie\":\"暁勝家\",\"akatsuki kochi\":\"暁月こち\",\"akatsuki yakyou\":\"暁夜響\",\"akatu bon\":\"赤津梵\",\"akatuki\":\"アカツキ\",\"akatuki tetora\":\"暁てとら\",\"akaume\":\"あかうめ\",\"akayoshi hajime\":\"赤善元\",\"akazaki yasuma\":\"赤崎やすま\",\"akazawa fuyuki\":\"赤沢冬希\",\"akazukin\":\"赤ZUKIN\",\"akchu\":\"akchu\",\"akechi shizuku\":\"明地雫\",\"akemi\":\"明美\",\"aken\":\"あけん\",\"akenami yasutaka\":\"明波康孝\",\"akenotsuki renya\":\"朱乃月蓮夜\",\"aki\":\"あき\",\"aki eda\":\"秋★枝\",\"aki kyouma\":\"秋恭摩\",\"aki matsuri\":\"亜木・祭\",\"aki suzuki\":\"秋鈴木\",\"aki yuuto\":\"秋遊兎\",\"akiba monaka\":\"秋葉もなか\",\"akiba nagi\":\"秋葉凪樹\",\"akiba ryu\":\"暁葉龍\",\"akiba wataru\":\"秋葉わたる\",\"akichin\":\"あきちん\",\"akiduki akina\":\"秋月秋名\",\"akiduki touya\":\"秋月十夜\",\"akiha chiaki\":\"秋葉千秋\",\"akihazama\":\"akihazama\",\"akihiro\":\"旭洋\",\"akishiro kiko\":\"秋城鬼子\",\"akikan\":\"あきかん\",\"akikaze shirakumo\":\"秋風白雲\",\"akimbo\":\"Akimbo\",\"akimoto akio\":\"あきもとあきお\",\"akimoto kei\":\"秋元けい\",\"akimoto youichi\":\"あきもとよういち\",\"akimura yafumi\":\"秋村八二三\",\"akina\":\"秋凪\",\"akina rei\":\"秋奈伶\",\"akinaie\":\"アキナイエ\",\"akino hidefumi\":\"秋乃秀文\",\"akino konomi\":\"秋乃このみ\",\"akino melpa\":\"秋乃めるぱ\",\"akino nagaame\":\"秋乃長雨\",\"akino nonomi\":\"秋乃ののみ\",\"akino shin\":\"あきのしん\",\"akino takehiko\":\"秋乃武彦\",\"akira\":\"アキラ\",\"akira hajime\":\"あきら肇\",\"akiru\":\"秋留\",\"akisa\":\"アキサ\",\"akisame ruu\":\"秋雨ルウ\",\"akisamo\":\"アキサモ\",\"akisawa yusi\":\"秋沢由史\",\"akishima\":\"秋島\",\"akisoba\":\"秋蕎麦\",\"akita hika\":\"晃田ヒカ\",\"akita seito\":\"秋田成都\",\"akitaka\":\"あきたか\",\"akitani\":\"明谷\",\"akito\":\"あきと\",\"akitsuki hirozumi\":\"秋月ひろずみ\",\"akitsuki karasu\":\"榎本ひでひら\",\"akiyama\":\"あきやま\",\"akiyama kenta\":\"あきやまけんた\",\"akiyama yuuzi\":\"秋山裕治\",\"akiyoshi yoshiaki\":\"あきよしよしあき\",\"akizuki takahiro\":\"秋月たかひろ\",\"akki\":\"あっきー\",\"akki gedoumaru\":\"惡鬼外導丸\",\"akkii\":\"あっきー\",\"ako\":\"A子\",\"akoko.\":\"あここ。\",\"akow kazumi\":\"亜神和美\",\"aku\":\"あく\",\"akuma\":\"あくま\",\"akuno toujou\":\"悪の東丈\",\"akushizu\":\"あくしず\",\"akuta\":\"アクタ\",\"akuta noe\":\"阿久多のえ\",\"akutabin\":\"アクタビン\",\"akutabone\":\"芥骨\",\"akutagawa manbou\":\"芥川まんぼう\",\"akutenkou\":\"悪天候\",\"akuto\":\"あくと\",\"al eas\":\"アル・イース\",\"alapi\":\"あらぴ\",\"alber\":\"Alber\",\"ganassa\":\"Ganassa\",\"alex\":\"あれっくす\",\"alfabravo\":\"アルファブラボー\",\"ali\":\"ALI\",\"alimika satomi\":\"ありみかさとみ\",\"allegro\":\"アレグロ\",\"alpacaeater\":\"アルパカイーター\",\"alpha\":\"有葉\",\"alphe\":\"あるふぇ\",\"alpini\":\"あるぴに\",\"alroune\":\"アルラウネ\",\"alt bayern\":\"あるとばいえるん\",\"alto\":\"あると\",\"amaama\":\"いちこ\",\"amadeusky\":\"アマデウスキー\",\"amado nageru\":\"雨戸ナゲル\",\"amagasa higasa\":\"雨傘日傘\",\"amagi michihito\":\"あまぎみちひと\",\"amagi yuuru\":\"あまぎゆうる\",\"amaguri aniko\":\"甘栗あに子\",\"amahara mizuho\":\"あまはらみずほ\",\"amai choco\":\"甘伊ちょこ\",\"amakara surume\":\"あまからするめ\",\"amakase masaki\":\"天枷雅樹\",\"amakawa ginga\":\"天川銀河\",\"amagi kazuko\":\"天城一子\",\"amakuchi\":\"甘口\",\"amama\":\"あまま\",\"amami fuu\":\"天海ふう\",\"amami ryouko\":\"あまみりょうこ\",\"amamiya iria\":\"雨宮杁亜\",\"amamiya tsumugi\":\"雨宮ツムギ\",\"amamiya yuki\":\"雨宮結鬼\",\"amamizu\":\"amamizu\",\"amamori tsuruha\":\"天森つるは\",\"amanai uni\":\"天内うに\",\"amanatsu\":\"あまなつ\",\"amane\":\"Amane\",\"amane hasuhito\":\"天音蓮人\",\"amane mari\":\"天音真理\",\"amane shirou\":\"あまね紫狼\",\"amaniji\":\"天虹\",\"amano ameno\":\"天野雨乃\",\"amano chiharu\":\"天乃ちはる\",\"amano hidemi\":\"天野英美\",\"amano jack\":\"尼野じゃっく\",\"amano kanehisa\":\"アマノカネヒサ\",\"amano koori\":\"桑折二号\",\"amano mitsurugi\":\"天乃御剣\",\"amano ribbon\":\"天野りぼん\",\"amano taiki\":\"天野大気\",\"amano yosora\":\"天野よそら\",\"amano youki\":\"あまの・よ～き\",\"amano yuu\":\"天之有\",\"amanogami dai\":\"あまのがみだい\",\"amanomiya haruka\":\"天宮遥\",\"amaro tamaro\":\"あまろたまろ\",\"amasawa natsuhisa\":\"天沢夏久\",\"amashoku\":\"あましょく\",\"amassa hikae\":\"あまさひかえ\",\"amasyoku jiro\":\"甘食次郎\",\"amato yuuki\":\"天戸祐輝\",\"amaya kan\":\"あまやかん\",\"amaya kyo\":\"雨耶恭\",\"amayu\":\"あまゆ\",\"amazing\":\"飴井神具\",\"amedama akihito\":\"雨珠秋比人\",\"amedori\":\"飴鳥\",\"amei sumeru\":\"あめいすめる\",\"amelie\":\"amelie\",\"amemiya luky\":\"雨宮ルキ\",\"amemiya nyanko\":\"飴宮にゃんこ\",\"ameno ringo\":\"飴乃苹果\",\"ameotoko\":\"雨男\",\"amesawa yagi\":\"飴沢やぎ\",\"ameya kyo\":\"雨矢恭\",\"amhoo\":\"amhoo!!\",\"ami\":\"阿見\",\"ami hideto\":\"弥舞秀人\",\"ami2\":\"ami2\",\"amida murasaki\":\"あみだむらさき\",\"amin\":\"あみん\",\"amino\":\"あみ野\",\"amu\":\"あむ\",\"amum\":\"amum\",\"amury\":\"あむりー\",\"amyuchan\":\"アミュちゃん\",\"an2a\":\"An2A\",\"ana\":\"穴\",\"ana-chan s\":\"穴ちゃんS\",\"anachans\":\"穴ちゃんS\",\"anago\":\"Anago\",\"anakuro\":\"あなくろ\",\"anan yutaka\":\"阿南ゆたか\",\"anapom\":\"あなぽん\",\"anchors\":\"Anchors\",\"hamaburicchi\":\"ハマブリッチ\",\"andoriyu\":\"あんどりゅ～\",\"andou hiroyuki\":\"安藤裕行\",\"andou tomoya\":\"安藤智也\",\"andouyou\":\"アンドウユウ\",\"andrew\":\"Andrew\",\"andy\":\"ANDY\",\"ane\":\"姉\",\"angel dust\":\"エンジェルダスト\",\"angelica\":\"アンジェリカ\",\"angie nishikawa\":\"アンジー西川\",\"aniki\":\"アニキ\",\"anji\":\"杏二\",\"ankoromochi\":\"あんころもち\",\"anma\":\"安間\",\"anmitsu sou\":\"あんみつ草\",\"ann\":\"Ann\",\"annie\":\"あにぃ\",\"annin\":\"杏仁\",\"annjeria\":\"あんじぇりあ\",\"annkoku daimaou\":\"暗黒大魔王\",\"anohito\":\"あのひと\",\"anoshabu\":\"アノシャブ\",\"anparu98\":\"anparu98\",\"anshin mama\":\"あんしんママ\",\"anyakunin\":\"暗躍人\",\"anyama takemi\":\"案山たけみ\",\"anzu hime\":\"あんず姫\",\"ao\":\"蒼\",\"ao banana\":\"青ばなな\",\"ao madousi\":\"蒼惑う子\",\"aogen genda\":\"青木ゲンダ\",\"aohashi ame\":\"青橋雨\",\"aohashi yutaka\":\"青橋由高\",\"aoi chiro\":\"碧井チロ\",\"aoi hiro\":\"葵比呂\",\"aoi itigo\":\"葵イチゴ\",\"aoi levin\":\"あおいれびん\",\"aoi mikan\":\"葵蜜柑\",\"aoi mikku\":\"アオイみっく\",\"aoi mizuki\":\"蒼居観月\",\"aoi muramasa\":\"蒼井村正\",\"aoi remi\":\"青井レミ\",\"aoi runa\":\"蒼井るな\",\"aoi shinji\":\"葵信次\",\"aoi taishi\":\"蒼井タイシ\",\"aoi takayuki\":\"蒼隆行\",\"aoi tsuyukusa\":\"蒼井露草\",\"aoi yumi\":\"蒼井遊美\",\"aojiru\":\"あおじる\",\"aoki eichi\":\"蒼木えいち\",\"aoki reimu\":\"青樹零夢\",\"aoko\":\"Aoko\",\"aokura shou\":\"青倉ショウ\",\"aomeyuu\":\"アオメユウ\",\"aonaga heri\":\"青永HERI\",\"aonatsusu\":\"蒼夏酢\",\"aono\":\"あおの\",\"aono akira\":\"蒼野アキラ\",\"aono keita\":\"青野圭太\",\"aono yami\":\"蒼野矢美\",\"aonuma shizuma\":\"蒼沼シズマ\",\"aoreyo\":\"あおれよ\",\"aosusuki dakuna\":\"青薄 だくな\",\"aotsuki hirotada\":\"蒼月裕忠\",\"aotsuki kakka\":\"蒼月かっか\",\"aotsuki ren\":\"蒼月蓮\",\"aoume kaito\":\"青梅街人\",\"aox\":\"あおっくす\",\"aoyama reo\":\"青山怜央\",\"aozame takao\":\"青雨高夫\",\"aozuki ran\":\"蒼月蘭\",\"apacchi\":\"アパッチ\",\"apart\":\"おだねるapart\",\"apita\":\"あぴ太\",\"apophis str\":\"アポフィス★STR\",\"aporon\":\"Aporon\",\"apostle\":\"apostle\",\"apple13\":\"apple13\",\"apploute\":\"あっぷるーと\",\"appuri ko\":\"あっぷり子\",\"appyalpie\":\"あぴゃるぴえ\",\"aqu\":\"亜空\",\"aqua vit\":\"アクアビット\",\"kosuke poke\":\"こーすけぽけ\",\"aqui\":\"AQUI\",\"ar-mai\":\"ar-mai\",\"arabiki koshou\":\"あらびき故障\",\"araco\":\"あらこー\",\"aragishi\":\"あらぎし\",\"arai kazuki\":\"新井和崎\",\"arai nobu\":\"アライノブ\",\"arai yuu\":\"新居佑\",\"araki akihito\":\"荒木アキヒト\",\"araki hiroaki\":\"あらきひろあき\",\"araki jeccy\":\"Araki Jeccy\",\"araki mitsuru\":\"荒木みつる\",\"aramaki shake\":\"荒巻しゃけ\",\"arami taito\":\"荒海泰人\",\"arao masaki\":\"荒尾マサキ\",\"araragi ayune\":\"あららぎあゆね\",\"araruck\":\"あららっく\",\"arashi-d-akira\":\"嵐-D-悪鬼羅\",\"arashiyama tsugumoto\":\"嵐山次元\",\"arata mai\":\"新米\",\"aratagawa nikei\":\"荒田川にけい\",\"arcana rude\":\"あるかな(るど)\",\"arch enemy\":\"あーちえねみー\",\"arciealbano\":\"arciealbano\",\"arctic char\":\"Arctic char\",\"are\":\"ARE\",\"ari\":\"蟻\",\"aria\":\"Aria\",\"ariesu watanabe\":\"ありえす渡辺\",\"ariga tou\":\"有賀冬\",\"ariichi kyuu\":\"有一九\",\"ariike tomosane\":\"有池智実\",\"arikawa koba\":\"有川古葉\",\"ariko\":\"亜璃子\",\"arima\":\"ありま\",\"arima jun\":\"有马纯\",\"arima keitarou\":\"有马启太郎\",\"arima you\":\"有马有\",\"arima yutaka\":\"有马ゆたか\",\"arimori haru\":\"在森 晴\",\"arimura ario\":\"有村ありお\",\"arimura shinobu\":\"有村しのぶ\",\"arimura yuu\":\"有村悠\",\"arinko\":\"蟻ん子\",\"arisaka ako\":\"有坂あこ\",\"arisato natsuki\":\"ありさと奈月\",\"arisawa masaharu\":\"有沢柾春\",\"arisue tsukasa\":\"有末つかさ\",\"ariyas honda\":\"本田有保\",\"ariyoshi gen\":\"蟻吉げん\",\"ark waver\":\"あるくでんぱ\",\"arkas\":\"Arkas\",\"aro\":\"あろ\",\"art jam\":\"Art Jam\",\"afro\":\"あふろ\",\"akagi\":\"赤木\",\"pastel\":\"ぱすてる\",\"aru\":\"ある\",\"aruma\":\"あるま\",\"andou jirou\":\"安藤慈朗\",\"arumi\":\"あるみ\",\"aruse yuuji\":\"有瀬祐志\",\"aruta\":\"あるた\",\"arutan\":\"あるたん\",\"aruva\":\"aruva\",\"as-special\":\"As-Special\",\"asa\":\"あさ\",\"asaba hideaki\":\"あさばひであき\",\"asagi\":\"浅戯\",\"asagi aya\":\"あさぎあや\",\"asagi hiroshi\":\"浅葱洋\",\"asagi shion\":\"浅葱しおん\",\"asagi yoshimitsu\":\"あさぎよしみつ\",\"asagi yukia\":\"浅樹ゆきあ\",\"asagiri\":\"あさぎり\",\"asagiri miyabi\":\"朝霧雅\",\"asagiri rira\":\"あさぎりりら\",\"asagiri tendou\":\"朝霧天道\",\"asagiri.\":\"ASAGIRI.\",\"asahi\":\"アサヒ\",\"asahi uta\":\"あさひウタ\",\"asahikawa\":\"旭川\",\"asahimaru\":\"旭丸\",\"asai yuuri\":\"浅井ユウリ\",\"asakai mocchinu\":\"浅貝もっちぬ\",\"asakawa yuki\":\"麻川由貴\",\"asako\":\"あさこ\",\"asakura\":\"麻倉\",\"asakura blue\":\"朝倉ブルー\",\"asakura gin\":\"浅倉ギン\",\"asakura hina\":\"朝倉妃那\",\"asakura kazuki\":\"あさくらかずき\",\"asakura nao\":\"明桜なお\",\"asakura ryou\":\"朝倉亮\",\"asakura sakura\":\"麻倉桜\",\"asama\":\"あさま\",\"asamaki\":\"あさマキ\",\"asamashi masashi\":\"浅増マサシ\",\"asami asami\":\"浅海朝美\",\"asami waka\":\"浅見わか\",\"asami yumesuke\":\"朝見ユメスケ\",\"asami yurumu\":\"浅湖葵天\",\"asano\":\"朝野\",\"asano akira\":\"浅野晃\",\"asano keigo\":\"浅野けいご\",\"asano maya\":\"麻野まや\",\"asano shimon\":\"麻乃史門\",\"asano yukino\":\"あさのゆきの\",\"asanuma katsuaki\":\"浅沼克明\",\"asari yoshitoo\":\"あさりよしとお\",\"asaroku\":\"あさろく\",\"asatsuki madoka\":\"朝月円\",\"asazaki\":\"アサザキ\",\"asazuki\":\"アサヅキ\",\"ase\":\"汗\",\"ashi o\":\"Ashi_O\",\"ashiashi\":\"あしあし\",\"ashisyun\":\"芦俊\",\"ashita cha\":\"明日茶\",\"ashling\":\"あしゅりんぐ\",\"ashura kumo\":\"阿修羅クモ\",\"asio\":\"アシオ\",\"asitaba tomorou\":\"明日葉友婁\",\"aska takuya\":\"飛鳥拓哉\",\"asou\":\"阿宗\",\"asou shin\":\"麻生シン\",\"aspara daisuke\":\"アスパラダイスケ\",\"assteka\":\"あずてか\",\"asterisk\":\"＊\",\"astre\":\"ASTRE\",\"astroguy2\":\"ASTROGUY2\",\"asu\":\"asu\",\"asu oikiru\":\"明日追斬\",\"asuka\":\"アスカ\",\"asuka nashina\":\"飛鳥梨菜\",\"asuma omi\":\"遊馬臣\",\"asumi jinta\":\"明澄迅汰\",\"asuoi kiru\":\"明日追斬\",\"asupaka\":\"あすぱか\",\"asurai masaki\":\"明日頼真咲\",\"asya\":\"亞沙\",\"at\":\"AT\",\"atagawa\":\"あたがわ\",\"atahuta\":\"atahuta\",\"atai\":\"A太\",\"atarime\":\"当たり目\",\"ataru\":\"あたる\",\"atera\":\"アテラ\",\"ather birochi\":\"アザービロチ\",\"atoki\":\"あとき\",\"atono matsuri\":\"後野祭\",\"atono maturi\":\"亜斗乃茉利\",\"atori rei\":\"あとり玲\",\"atp\":\"ATP\",\"atsyu\":\"亞つゅ\",\"atte nanakusa\":\"あって七草\",\"atunabe\":\"圧鍋\",\"aturn\":\"ATURN\",\"atutoku\":\"あつとく\",\"atyuto\":\"あちゅと\",\"auauun\":\"あうあうーん\",\"aula\":\"あうら\",\"autumm\":\"秋\",\"awa\":\"AwA\",\"awamori ichitarou\":\"泡盛一太郎\",\"awata mokane\":\"粟田もかね\",\"aweida\":\"アウェイ田\",\"aya shiina\":\"彩しーな\",\"aya-cis\":\"AYA-cis\",\"ayakashi\":\"アヤカシ\",\"hatakeyama tohya\":\"畠山桃哉\",\"ayakaze ryuushou\":\"綾風柳晶\",\"ayakumo\":\"ayakumo\",\"ayame\":\"アヤメ\",\"ayame riyo\":\"あやめりよ\",\"ayame sino\":\"彩恵紫乃\",\"ayana mizuki\":\"綾那瑞奇\",\"ayana rio\":\"彩奈りお\",\"ayanagi gumimi\":\"彩柳グミミ\",\"ayane\":\"あやね\",\"ayano naoto\":\"綾野なおと\",\"ayano rumi\":\"綾乃るみ\",\"ayanokouji haruka\":\"綾小路はるか\",\"ayasaka mitsune\":\"綾阪みつね\",\"ayase\":\"綾瀬\",\"ayase hazuki\":\"綾瀬はづき\",\"ayase jun\":\"綾瀬純\",\"ayase mako\":\"綾瀬真子\",\"ayase shinomu\":\"綾瀬しのむ\",\"ayase suitento\":\"綾瀬水天戸\",\"ayase totsuki\":\"彩瀬とつき\",\"ayase yura\":\"綾瀬ゆら\",\"ayashi ayashibe\":\"妖部あやし\",\"ayasugi tsubaki\":\"綾杉つばき\",\"ayato\":\"綺人\",\"ayatsuri-doll\":\"文釣遠瑠\",\"ayu\":\"あゆ\",\"ayuka\":\"あゆか\",\"ayukisa\":\"アユキサ\",\"azasuke\":\"AZASUKE\",\"azmodan\":\"Azmodan\",\"azu\":\"Azu\",\"azuki\":\"アズキ\",\"azuki kurenai\":\"あずき紅\",\"azukiko\":\"あずきこ\",\"azuma\":\"あずま\",\"azuma aya\":\"あずまあや\",\"azuma hirota\":\"東ひろた\",\"azuma kyouto\":\"東京都\",\"azuma minatu\":\"東みなつ\",\"azuma seiya\":\"東聖夜\",\"azumi kyohei\":\"あずみ京平\",\"azusa norihee\":\"あずさのりへー\",\"azuteru.\":\"あずてる。\",\"b.tarou\":\"B.たろう\",\"b1h\":\"B1H\",\"bach\":\"Bach\",\"backfischalter\":\"伸長に関する考察\",\"bacon\":\"ベーコン\",\"badbamboo\":\"badbamboo\",\"badhand\":\"BadHanD\",\"badman bastich\":\"Deceased.\",\"baerun\":\"ばえるん\",\"bajou takurou\":\"馬乗拓郎\",\"bakedanuki\":\"バケダヌキ\",\"bakko\":\"跋扈\",\"bakkon tamago\":\"バッコンたまご\",\"bakuchin\":\"ばくちん\",\"bakudanbonbon\":\"ばくだんぼんぼん\",\"bakuretsu chichihirosu\":\"爆裂チチヒロス.\",\"bakusai\":\"爆砕\",\"baldie\":\"BALDIE\",\"balpanther\":\"ばるぱんさー\",\"baltan\":\"Baltan\",\"baltika\":\"ばるてぃか\",\"ban\":\"ばん!\",\"bancha\":\"番茶\",\"bangetsu setsuka\":\"晩月雪加\",\"banjaku\":\"ばんじゃく\",\"bankokudou\":\"ばんこく堂\",\"barbachos\":\"ばるばちょす\",\"baron mori\":\"バロン森\",\"baron.m\":\"BARON.M\",\"bash\":\"BASH\",\"bazaar\":\"ばざーる\",\"bb\":\"BB\",\"bbsacon\":\"bbsacon\",\"bbwh\":\"bbwH\",\"bea\":\"bea\",\"beat-kun\":\"びーとくん\",\"beater\":\"Beater\",\"bebebe\":\"べべべ\",\"beco\":\"Beco\",\"bee\":\"bee\",\"beijuu\":\"米獸\",\"bekko.\":\"べっ子。\",\"bekkou megane buchiko\":\"べっこうめがねぶち子\",\"bell\":\"ベル\",\"bells\":\"Bell’s\",\"bellsuke\":\"ベル助\",\"belmond uozumi\":\"ベルモンド魚住\",\"ben\":\"BEN\",\"ben237\":\"BEN237\",\"beni bana\":\"紅花\",\"benikawa akito\":\"紅川アキト\",\"benimashiko\":\"べにましこ\",\"benzou\":\"ベンゾウ\",\"berggold\":\"バーゴ\",\"berose\":\"べろせ\",\"berukko\":\"べるっこ\",\"beti\":\"べてぃ\",\"betty\":\"べってぃ\",\"bibandamu\":\"びばんだむ\",\"bibi\":\"ビビ\",\"big.g\":\"big.g\",\"bikkle\":\"ビックル\",\"binbi\":\"びん美\",\"binf\":\"ななし\",\"biozs\":\"バイオ前線\",\"birobon\":\"ビロボン\",\"bisco\":\"ビスコ\",\"bismarcho\":\"ビスマルチョ\",\"bitaro\":\"ビ太郎\",\"bitibiti\":\"bitibiti\",\"bitou\":\"微糖\",\"bittsu\":\"びっつ\",\"biwa\":\"枇杷\",\"bizen\":\"備前\",\"bkyu\":\"bkyu\",\"black\":\"ぶらっく\",\"blackbaka\":\"ブラック馬鹿\",\"blackheart\":\"BLACKHEART\",\"blacksaw\":\"BLACKSAW\",\"blast\":\"Blast\",\"blind\":\"ブラインド\",\"blmanian\":\"ぶるまにあん\",\"bloomer hogero\":\"ぶるマほげろー\",\"blue blood\":\"BLUE BLOOD\",\"blue gk\":\"Blue_Gk\",\"blue impulse\":\"ブルーインパルス\",\"blz\":\"BLZ\",\"bmg\":\"bmg\",\"bnr\":\"BNR\",\"bob jr\":\"ボブJr\",\"bob kosugi\":\"ボブ小杉\",\"bob r\":\"暴武R\",\"bobca\":\"ボブキャ\",\"bocha\":\"ぼちゃ\",\"bojore\":\"ボジョレ\",\"bol\":\"bol\",\"boljoy-kun\":\"ぼりじょいくん\",\"boltack\":\"ぼるたっく\",\"bom\":\"BOM\",\"bomber grape\":\"ボンバーグレープ\",\"bon-3000\":\"BON_3000\",\"bond\":\"ボンド\",\"bondo\":\"ぼんど\",\"bonehead\":\"Bonehead\",\"bonnie\":\"ぼに～\",\"bono\":\"ぼの\",\"bonske\":\"ぼんすけ\",\"bonten\":\"梵典\",\"bontenkarasu\":\"梵天鴉\",\"bonyuu cheese no natsu\":\"母乳ち～ずの夏\",\"bonzakashi\":\"盆座\",\"booch\":\"Booch\",\"boots\":\"物\",\"borurun\":\"ぼるるん\",\"bose\":\"bose\",\"boss chin\":\"BOSS珍\",\"botan\":\"牡丹\",\"bottomline\":\"Bottomline\",\"boudan nyuugyuu\":\"防弾乳牛\",\"bouko\":\"bouko\",\"bourne\":\"ボーン\",\"bouto\":\"帽都\",\"bov\":\"bov\",\"bowalia\":\"タケユウ\",\"bowcan\":\"ぼーかん\",\"bowieknife\":\"ボウイナイフ\",\"brave\":\"brave\",\"brewstar\":\"ぶりすた\",\"brilliant jijii\":\"ブリリアントじじい\",\"brll\":\"BRLL\",\"brokao\":\"BroKao\",\"brother bob\":\"ブラザーボブ\",\"bt\":\"BT\",\"btk\":\"BTK\",\"buaisou\":\"無愛想\",\"bubonic\":\"ぶぼにっく\",\"buccho\":\"ぶっちょ\",\"buchimaru\":\"ぶちマル\",\"buhi\":\"ぶひ\",\"bukatsu\":\"ぶかつ\",\"bullion\":\"ばるらいおん\",\"bun\":\"ぶん\",\"bun150\":\"Bun150\",\"bunapi 397 yen\":\"ぶなぴー397円\",\"bunbon\":\"ぶんぼん\",\"bunny\":\"バニー\",\"buri\":\"ブリ\",\"buriki\":\"ブリキ\",\"bushi\":\"BUSHI\",\"butajiman\":\"豚じまん\",\"butao\":\"ブタ男\",\"buthikireta\":\"ぶっちぃ\",\"butsuri neko\":\"物理猫\",\"butter\":\"butter\",\"bwell\":\"bwell\",\"byoin\":\"びょーいん\",\"byte\":\"Byte\",\"bzsk.\":\"Bzsk.\",\"c\":\"C\",\"c-cake\":\"C-Cake\",\"c-low\":\"C-Low\",\"c-taro\":\"C-taro\",\"cabayaki\":\"Cabayaki\",\"caburi\":\"caburi\",\"cacao\":\"cacao\",\"cai\":\"cai\",\"cait\":\"Cait\",\"calpara\":\"calpara\",\"calpish\":\"かるぴ\",\"can\":\"CAN\",\"canadazin\":\"カナダ人\",\"canvas solaris\":\"カンバスそらりす\",\"capriccio\":\"かぷりっちょ\",\"capriccyo\":\"カプリッチョ\",\"cara subato\":\"空すばと\",\"caramel dow\":\"きゃらめる堂\",\"carbon rice\":\"カーボン飯\",\"carlos toshiki\":\"カルロスとしき\",\"carnelian\":\"CARNELIAN\",\"carrot\":\"きゃろっと\",\"caruta\":\"caruta\",\"cashew\":\"かしゅう\",\"cashue\":\"香愁\",\"cassandra\":\"かっさんどら\",\"castella\":\"カステラ\",\"caterpillar\":\"キャタピラ\",\"cccpo\":\"cccpo\",\"cel\":\"Cel\",\"cesar\":\"しーざー\",\"cevoy\":\"せぼい\",\"chaa\":\"ちゃあ\",\"chabashira tatsukichi\":\"茶柱立吉\",\"chabin\":\"茶瓶\",\"chabo\":\"茶鳥\",\"chaccu\":\"chaccu\",\"chado\":\"茶戸\",\"chagata\":\"ちゃがた\",\"chagu\":\"ちゃぐ\",\"chaigidhiell\":\"カイギディエル\",\"chakkaman\":\"チャッカマン\",\"chamame\":\"茶豆\",\"chameleon\":\"かめれおん\",\"chan shin han\":\"chan shin han\",\"chanary\":\"Chanary\",\"chane\":\"ちゃね\",\"chano mina\":\"茶野みな\",\"chanta\":\"チャン太\",\"chaos 2nd\":\"かおす二号\",\"charlie nishinaka\":\"チャーリーにしなか\",\"chasaracha\":\"茶皿茶\",\"chataro\":\"ちゃたろー\",\"chatsune\":\"ちゃつね\",\"chawa\":\"ちゃわ\",\"chazutsu sayu\":\"茶筒さゆ\",\"cheko\":\"ちぇこ\",\"chemical flow\":\"けみかるふろう\",\"cherry\":\"CHERRY\",\"cheruno\":\"ちぇるの\",\"chesuka\":\"チェスカ\",\"chiba chibasa\":\"千葉ちばさ\",\"chiba dirou\":\"ちば・ぢろう\",\"chiba shinji\":\"千葉進司\",\"chiba shuusaku\":\"千葉秀作\",\"chiba tetsutarou\":\"千葉哲太郎\",\"chibibibi\":\"ちびびび\",\"chibineco master\":\"ちびねこマスター\",\"chibinon\":\"チビのん☆\",\"chibou\":\"ちーぼう\",\"chicago\":\"シカゴ\",\"chicke iii\":\"Chicke III\",\"chidori\":\"ちどり\",\"chidori nekoro\":\"千鳥ねころ\",\"chidorinu\":\"チドリヌ\",\"chiebukuro ichiban\":\"知恵袋一番\",\"chief\":\"ちーふ\",\"chiei\":\"智英\",\"chieko\":\"ちえこ\",\"chigiri maru\":\"ちぎりまる\",\"chihi\":\"ちひ\",\"chihiro aoi\":\"葵千尋\",\"chihuri\":\"ちふり\",\"chii\":\"地井\",\"chijiwa sawa\":\"千々石さわ\",\"chika\":\"千翔\",\"chikado\":\"ちかど\",\"chikahii\":\"ちかひー\",\"chikake\":\"ちかけー\",\"chikane\":\"千鐘\",\"chikasato michiru\":\"近里みちる\",\"chikaya\":\"ちかや\",\"chikijima\":\"ちきじま\",\"chikiko\":\"チキコ\",\"chikomayo\":\"ちこマヨ\",\"chikotam\":\"ちこたむ\",\"chiku\":\"築\",\"chikubai\":\"竹梅\",\"chikugen\":\"竹玄\",\"chilt\":\"ちると\",\"chimaro\":\"ちまろ\",\"chimo\":\"チモ\",\"chimple hotter\":\"チンプル堀田\",\"chin\":\"chin\",\"chin tokusyu\":\"珍・特集\",\"china\":\"茶否\",\"chinhou\":\"珍步\",\"chinjao roosu\":\"ちんじゃおろおす\",\"chino fumiyu\":\"稚乃ふみゆ\",\"chinyoko\":\"ちんよこ\",\"chipa\":\"薙派\",\"chirorian\":\"ちろり庵\",\"chiroru\":\"ちろる\",\"chisato\":\"チサト\",\"chisato kirin\":\"千里きりん\",\"chisato reiri\":\"チサトレイリ\",\"chita arihiro\":\"知多有洋\",\"chitose\":\"ちとせ\",\"chitosezaka suzu\":\"千歳坂すず\",\"chiune\":\"ちうね\",\"chiyo\":\"千代\",\"chiyoda mikurou\":\"千代多みく郎\",\"chiyomi\":\"chiYOMI\",\"chizakya\":\"ちざきゃ\",\"chizu\":\"ちず\",\"chizuru\":\"ちづる\",\"chocco coronetto\":\"チョココロネット\",\"chocho\":\"チョチョ\",\"choco\":\"CHOCO\",\"choco coronet\":\"チョココロネット\",\"chocomint\":\"ちょこみんと\",\"chocore\":\"ちょこれ\",\"choko yarou\":\"ちょこ野郎\",\"chomes\":\"Chomes\",\"chomo\":\"ちょも\",\"chonko\":\"ちよんこ\",\"chou creme\":\"シュークリーム\",\"chou shippaisaku\":\"超失敗作\",\"chouniku\":\"超肉\",\"chourui\":\"鳥類\",\"chouzetsu yarou\":\"超絶野朗\",\"chro\":\"chro\",\"chun\":\"CHuN\",\"chunko\":\"ちゅんこ\",\"chunrouzan\":\"春籠漸\",\"chupimaro\":\"ちゅぴまろ\",\"chuusuu kairo\":\"中枢回路\",\"chuuta\":\"ちゅー太\",\"ci\":\"Ci\",\"cian yo\":\"Cian yo\",\"cilica\":\"CILICA\",\"cindy\":\"cindy\",\"circussion\":\"circussion\",\"ck j\":\"Ckj\",\"ckj\":\"ckj\",\"cl\":\"シーエル\",\"cla\":\"Cla\",\"clappy\":\"くらっぴ\",\"clarin\":\"くらりん\",\"clip\":\"くりっぷ\",\"cloire clover\":\"Cloire Clover\",\"cloth tsugutoshi\":\"黒須嗣載\",\"clover\":\"clover\",\"co ma\":\"Co_Ma\",\"coara\":\"coara\",\"coaster\":\"コースター\",\"cobo\":\"こぼ\",\"cock robin\":\"クックロビン\",\"cocoa\":\"ここあ\",\"cocolog\":\"ココローグ\",\"coconoe ricoco\":\"九重リココ\",\"coconoha mikage\":\"心葉御影\",\"cocorono arika\":\"心野ありか\",\"cocounco\":\"cocounco\",\"cocoyama\":\"ココ山\",\"coelacanth\":\"しーらかんす\",\"cohen\":\"cohen\",\"coin rand\":\"コインRAND\",\"colin\":\"COLIN\",\"collagen\":\"コラーゲン/藩滑るめる\",\"colonel aki\":\"Colonel AKI\",\"color\":\"COLOR\",\"colulun\":\"こるるん\",\"combat ecchu\":\"戦闘的越中\",\"comeon showme\":\"花門初海\",\"comizuk\":\"こみずく\",\"comord\":\"コモード\",\"comugico\":\"comugico\",\"condessa\":\"Condessa\",\"coo\":\"くー\",\"copo copo\":\"こぽこぽ\",\"core-suke\":\"コア助\",\"cosine\":\"COSiNE\",\"cosmashiva\":\"COSMASHIVA\",\"cotoba\":\"COTOBA\",\"cotoji\":\"琴慈\",\"couch potato\":\"かうちぽてと\",\"cozy\":\"コージー\",\"cpk418\":\"CPK418\",\"cpu\":\"CPU\",\"cr-r\":\"Cr-R\",\"craft\":\"くらふと\",\"crataegus\":\"Crataegus\",\"crazy nirin\":\"クレイジー二厘\",\"crazy white\":\"クレイジーホワイト\",\"cream\":\"Cream\",\"creek\":\"CREEK\",\"crepix\":\"シーレ\",\"cross\":\"クロス\",\"crossco\":\"くろすこ\",\"crow\":\"CROW\",\"crozu\":\"黒酢\",\"crystal shoujo\":\"クリスタル少女\",\"ctk\":\"CTK\",\"cube\":\"キューブ\",\"cube85\":\"Cube85\",\"cumasyo\":\"くましょう\",\"cup-chan\":\"カップちゃん\",\"cura\":\"cura\",\"cureryuta\":\"キュアリュータ\",\"custom\":\"カスタム\",\"cuteg\":\"CUTEG\",\"cv1115\":\"cv1115\",\"cylia-the-antelope\":\"Cylia-The-Antelope\",\"cyorisuke\":\"ちょりすけ\",\"cyoro suke\":\"チョロ助\",\"d-2\":\"D-2\",\"d-suke\":\"D-Suke\",\"d.hiranuma\":\"D.HIRANUMA\",\"da\":\"だ\",\"daga shikashi\":\"だがしかし\",\"dagasi\":\"DAGASI\",\"dai\":\"Dai\",\"dai pippy\":\"大ピッピ\",\"daidai\":\"大々\",\"daidokoro\":\"台所\",\"daifuku keiji\":\"大福けーじ\",\"daigo\":\"DAIGO\",\"daihuku\":\"大福\",\"daiji\":\"だいじ\",\"daiki\":\"だいき\",\"daikyojin\":\"大巨神\",\"daimon\":\"大門\",\"dainakishin\":\"ダイナキシン\",\"dairoku tenmaou great\":\"第六天魔王グレート\",\"daisaku\":\"大作\",\"daitou\":\"だい唐\",\"daitouchi runoru\":\"大灯地ルノル\",\"dakara\":\"だかラ\",\"dame neko\":\"ダメ猫\",\"nakao hamu\":\"仲尾ハム\",\"damii\":\"駄みぃ\",\"dan\":\"ダン\",\"danchino\":\"団地の\",\"dandy\":\"だんでぃ\",\"dangan\":\"DANGAN\",\"dango\":\"団子\",\"dango.\":\"だんご。\",\"danna\":\"ダンナ\",\"danshaku\":\"男爵\",\"dantou\":\"暖冬\",\"dantyo neko\":\"だんちょねこ\",\"dara\":\"だら\",\"darabuchi\":\"だらぶち\",\"darius-kun\":\"ダライアスくん\",\"darkilow\":\"DarkⅠlow\",\"darkside-g\":\"DARKSIDE-G\",\"darren\":\"だれん\",\"daru.\":\"だる。\",\"daruton\":\"怠豚\",\"dash\":\"DASH\",\"dashio\":\"だしお\",\"dastar\":\"ダスター\",\"date kazuki\":\"伊達和騎\",\"date naoto\":\"ダテナオト\",\"date natsuku\":\"伊達なつく\",\"dawy\":\"DAWY\",\"dd\":\"DD\",\"ddal\":\"ddal\",\"ddg160\":\"DDG160\",\"de\":\"De\",\"deadnoodles\":\"ゴミョン\",\"dear\":\"dear\",\"dearonnus\":\"Dearonnus\",\"deburasu\":\"でぶらす\",\"decko\":\"でっこ\",\"decosuke\":\"デコスケ\",\"deego\":\"ディーゴ\",\"deep purple 72\":\"深紫'72\",\"deep valley\":\"ディープバレー\",\"dei\":\"dei\",\"deibara\":\"泥原\",\"dekochin hammer\":\"でこちんハンマー\",\"dekoisu\":\"デコいす\",\"dekosen takuji\":\"デコセンタクジ\",\"delf\":\"DELF\",\"delta-tsf\":\"delta-TSF\",\"deme\":\"DEME\",\"demio\":\"デミオ\",\"den\":\"デン\",\"den meka\":\"電メカ\",\"denden\":\"でんでん\",\"denki\":\"電鬼\",\"denki biribiri\":\"電気びりびり\",\"denkousekka gou\":\"電光石火轟\",\"denpanic\":\"デンぱにっく\",\"densetsu no shimi\":\"伝説のシミ\",\"densuke\":\"電SUKE\",\"deo\":\"deo\",\"deshima shin\":\"出縞臣\",\"detritus\":\"デトリタス掘込\",\"deusa\":\"でうさ\",\"devilob\":\"デビロブ\",\"dha\":\"DHA\",\"digdug\":\"DigDug\",\"diisuke\":\"ヂイスケ\",\"din\":\"DIN\",\"dining\":\"ダイニング\",\"diru\":\"ぢる\",\"dit\":\"DIT\",\"jnnkleche\":\"じんにくれーちぇ\",\"dmpn\":\"dmpn\",\"doburocky\":\"ドブロッキィ\",\"doctor rei\":\"ドクトル零\",\"dodai shouji\":\"土代昭治\",\"dodomeiro mayonnaise\":\"どどめ色マヨネーズ\",\"dodomori\":\"ドドもり\",\"dodorian suzuki\":\"ドドリアン鈴木\",\"dofib\":\"dofib\",\"doga\":\"DOGA\",\"doguu\":\"どぐう\",\"dohi kensuke\":\"土肥けんすけ\",\"doki\":\"フリピク\",\"doko tetora\":\"何処テトラ\",\"doku corne\":\"毒コロネ\",\"doll\":\"DOLL\",\"doluta\":\"ドルタ\",\"dom danshaku\":\"ドM男爵\",\"domoshipette\":\"どもしペッテ\",\"don\":\"Don\",\"jt dong-agyoku\":\"ドン・アギョク\",\"donan\":\"どなん\",\"donburako\":\"丼ﾌﾞﾗｺ\",\"donburi\":\"丼\",\"babalilo\":\"ばばりろ\",\"donguri\":\"団栗\",\"donkey\":\"DONKEY\",\"donki\":\"どんき\",\"donson\":\"鈍村\",\"dora\":\"どら\",\"dorabmon\":\"DoraBmon\",\"dori rumoi\":\"どり留萌\",\"doro doneru\":\"泥どねる\",\"doromiez\":\"泥水\",\"doru riheko\":\"ドルリヘコ\",\"dos\":\"どす\",\"dosu\":\"どす\",\"dot-r\":\"どっとあーる\",\"dote kabocha\":\"どてかぼちゃ\",\"dotsuco\":\"dotsuco\",\"dou yutaka\":\"堂豊\",\"double deck\":\"だぶるでっく\",\"doudantsutsuji\":\"満天星\",\"doug winger\":\"Deceased.\",\"douman ao\":\"道満青\",\"doumou\":\"ドウモウ\",\"dousai\":\"百斎\",\"dova\":\"DOVA\",\"dowabako\":\"童話箱\",\"dpg\":\"DPg\",\"dr-man\":\"Dr-Man\",\"dr. ten\":\"Dr.天\",\"dr. vu\":\"ヴー博士\",\"dr.momo\":\"毒桃\",\"dr.p\":\"Dr.P\",\"dr.q\":\"Dr.Q\",\"dra\":\"Dra\",\"drain\":\"drain\",\"dre\":\"DRE\",\"drill jill\":\"ドリル汁\",\"drossel\":\"泥っせる\",\"dry\":\"DRY\",\"dt hone\":\"DT骨\",\"dulce-q\":\"ダルシー研Q所\",\"dune\":\"でゅーん\",\"dura\":\"でゅら\",\"dy\":\"Dy\",\"dynamite kantou\":\"ダイナマイト関東\",\"dyne equals gallon\":\"ダイン=ガロン\",\"dyon\":\"ぢょん\",\"e\":\"E\",\"e-noy\":\"E-noy\",\"e.snow\":\"E.Snow\",\"ebgr\":\"エビグラ\",\"ebi blue\":\"海老ブルー\",\"ebidou\":\"えびどー\",\"ebifry akita\":\"えびふらい秋田\",\"ebifurya\":\"えびふりゃ\",\"ebikichi\":\"えび吉\",\"ebiko\":\"えびこ\",\"ebimayo\":\"えびまよ\",\"ebisu\":\"えびす\",\"ebisubashi seizou\":\"戎橋政造\",\"ebisuyu nogi\":\"戎湯のぎ\",\"ebiwantan\":\"えびわんたん\",\"eboshi\":\"え★\",\"ech\":\"エイチ\",\"echigawa ryuuka\":\"越川リューカ\",\"echo jiro\":\"江高次郎\",\"ed\":\"ED\",\"edih\":\"Edih\",\"edo\":\"い～どぅ～\",\"edo shigezu\":\"江戸しげズ\",\"edoya pochi\":\"江戸屋ぽち\",\"efink\":\"EFINK\",\"egami\":\"えがみ\",\"eguchi\":\"江口\",\"eguchi chibi\":\"江口ちび\",\"ehime mikan\":\"江姫蜜柑\",\"eho\":\"会帆\",\"eigetu\":\"eigetu\",\"eight\":\"エイト\",\"eikichi\":\"エーキチ\",\"eiko\":\"エイコ\",\"eikokukan momoha\":\"英国館桃葉\",\"eimu yuu\":\"影夢優\",\"eiri\":\"嬰里\",\"eitaisa\":\"ぇぃたいさ\",\"eitarou\":\"えーたろー\",\"eixen\":\"EIXIN\",\"eixin\":\"Eixen\",\"ekimae\":\"駅前\",\"eko\":\"絵虎\",\"ekz\":\"EKZ\",\"electric sheep\":\"Electric Sheep\",\"elf\":\"ELF\",\"elf.k\":\"elf.k\",\"elia\":\"Elia\",\"elijah\":\"エリヤ\",\"elimiko\":\"えりみこ\",\"elis 120 percent\":\"エリス120%\",\"eltole\":\"eltole\",\"em\":\"em\",\"ema20\":\"ema20\",\"eman\":\"eman\",\"emanon123\":\"emanon123\",\"emi\":\"えみ\",\"emilio\":\"えみりお\",\"emina\":\"emina\",\"emino\":\"えみの\",\"emit\":\"えみっと\",\"emori misaki\":\"江森美沙樹\",\"emote\":\"えもて\",\"emu\":\"ゑむ\",\"emua\":\"えむあ\",\"emya\":\"emya\",\"en\":\"袁\",\"enamizawa\":\"江波沢\",\"end\":\"えんど\",\"endles\":\"炎℃れす\",\"endou\":\"えんどう\",\"endou marin\":\"遠藤真理ん\",\"endou tatsumi\":\"遠藤辰己\",\"engo\":\"えんご\",\"enigma\":\"えにぐま\",\"enikuma\":\"えにくま\",\"enishi nasa\":\"縁なさ\",\"enji\":\"エンジ\",\"enma koorogi\":\"エンマコオロギ\",\"enno syouta\":\"縁乃生多\",\"eno\":\"eno\",\"enokifu\":\"えのきふ\",\"enokitake yuniku\":\"榎茸ゆにく\",\"enoma shinji\":\"江之間真次\",\"enomoto heights\":\"榎本ハイツ\",\"enomoto hidehira\":\"榎本ひでひら\",\"enomoto hina\":\"榎本ひな\",\"enoshima iki\":\"江ノ島行き\",\"enotou\":\"えのとう\",\"enoughmin\":\"イナフミン\",\"enu\":\"エヌ\",\"enu-yamayama\":\"えぬーやまやま\",\"epuko\":\"えぷ子\",\"era\":\"Era\",\"ere 2 earo\":\"えれ2エアロ\",\"erika\":\"えりか\",\"ero kojiki\":\"エロ乞食\",\"ero koutei\":\"エロ皇帝\",\"ero murasaki\":\"エロムラサキ\",\"erobaldo\":\"エロバルド\",\"erutasuku\":\"えるたすく\",\"escape\":\"えすけーぷ!\",\"esora koto\":\"絵空コト\",\"esukichizuru\":\"S木チズリ\",\"esuo\":\"えすお\",\"esupu\":\"えすぷ\",\"esureki\":\"えすれき\",\"et alors\":\"Et alors\",\"ether\":\"ether\",\"eto\":\"えと\",\"etosei\":\"干支政\",\"eud\":\"euD\",\"eugene batten\":\"ユージン・バートン\",\"eunos\":\"ゆ～のす\",\"euphonia\":\"Euphonia\",\"eve\":\"eve\",\"exabyte\":\"Exabyte\",\"excel\":\"EXCEL\",\"exeter\":\"エクゼター\",\"exp\":\"EXP\",\"ezo renge\":\"えぞれんげ\",\"f\":\"f\",\"faith\":\"faith\",\"fan\":\"FAN\",\"fana\":\"ふぁな\",\"faust\":\"FAUST\",\"fct\":\"FCT\",\"fe\":\"Fe\",\"feccso\":\"ふぇっくそ\",\"fechi\":\"ふぇっちー\",\"feiren\":\"feiren\",\"femto\":\"ふぇむと\",\"fence 14\":\"柵野14\",\"ferdinand\":\"フェルディナン\",\"feriko\":\"フェリコ\",\"fes\":\"ふぇす\",\"fey tas\":\"Fey Tas\",\"fi-san\":\"Fi-san\",\"figaro\":\"ふぃがろ\",\"fight fight chiharu\":\"ファイトファイトチハル\",\"fin no uta\":\"フィンの詩\",\"final\":\"Final\",\"fireyuki\":\"フィレユキ\",\"fk696\":\"fk696\",\"flanvia\":\"Flanvia\",\"flat\":\"FLAT\",\"flipper\":\"FLIPPER\",\"flowerchild\":\"FLOWERCHILD\",\"flugel\":\"Flugel\",\"flyking\":\"Flyking\",\"follet\":\"Follet\",\"fondue\":\"フォンデュ\",\"fontin\":\"ふぉんてぃん\",\"foolest\":\"ふぅすりと\",\"foosnow\":\"ふーすのー\",\"fortythree\":\"fortythree\",\"loic foster\":\"Loic Foster\",\"franken n\":\"Franken N\",\"frapowa\":\"ふらぽわ\",\"fred kelly\":\"フレッドケリー\",\"free style\":\"Free style\",\"friday\":\"フライデイ\",\"fried.\":\"ふらいど。\",\"frunbell\":\"ふらんべる\",\"fu\":\"ふぅ\",\"fu-ta\":\"Fu-ta\",\"fuchi\":\"fuchi\",\"fudematsuri kyousuke\":\"筆祭競介\",\"fudou shin\":\"不動心\",\"fue\":\"Fue\",\"fugetsu taku\":\"浮月たく\",\"fugo\":\"FUGO\",\"fuhatsu\":\"ふはつ\",\"fuji fujino\":\"富士フジノ\",\"fuji sangou\":\"富士参號\",\"fuji yoshida\":\"藤吉田\",\"fujibayashi haru\":\"フジバヤシ春\",\"fujihara gacho\":\"藤原がちょ\",\"fujii aya\":\"藤井あや\",\"fujii chifumi\":\"藤井ちふみ\",\"fujii mochi\":\"藤井もち\",\"fujii rino\":\"藤井理乃\",\"fujikawa daichi\":\"藤川大智\",\"fujikawa riko\":\"藤川梨子\",\"fujikawa satoshi\":\"不二河聡\",\"fujiko\":\"ふじこ\",\"fujiku yuima\":\"藤久ゆいま\",\"fujikura ryune\":\"藤倉琉音\",\"fujimaru arikui\":\"ふぢまるありくい\",\"fujimi\":\"藤味\",\"fujimi gaku\":\"富士見ガク\",\"fujimiya akane\":\"藤宮茜\",\"fujimiya midori\":\"藤宮緑\",\"fujimiya siryu\":\"フジミヤ子龍\",\"fujimiya yahiro\":\"藤宮やひろ\",\"fujimon\":\"ふじもん\",\"fujimori saya\":\"ふじもり沙耶\",\"fujimoto gou\":\"藤本郷\",\"fujimoto hideaki\":\"藤本秀明\",\"fujimoto sei\":\"ふじもとせい\",\"fujimura erika\":\"藤村えりか\",\"fujinami arisa\":\"藤浪有沙\",\"fujinari ayako\":\"藤成アヤコ\",\"fujinari takumi\":\"藤也卓巳\",\"fujino yoshika\":\"ふじの芳夏\",\"fujinomiya yuu\":\"藤ノ宮悠\",\"fujioka toki\":\"藤岡とき\",\"fujirin\":\"ふじりん\",\"fujisaki kou\":\"藤崎こう\",\"fujisaki makoto\":\"藤咲真\",\"fujisaki rei\":\"ふじさき怜\",\"fujisawa tatsurou\":\"ふじさわたつろー\",\"fujishima\":\"フジシマ\",\"fujishiro seiki\":\"藤城成騎\",\"fujita hidetoshi\":\"藤田秀俊\",\"fujiwara\":\"藤原\",\"fujiwara hisashi\":\"藤原ひさし\",\"fujiwara warawara\":\"藤原々々\",\"fujiwara yumi\":\"藤原結実\",\"fujiya\":\"ふじや\",\"fujiya apota\":\"不二家あぽ太\",\"fujiyama\":\"富士やま\",\"fujiyama takashi\":\"フジヤマタカシ\",\"fuka\":\"FUKA\",\"fukada takushi\":\"深田拓士\",\"fukai maro\":\"ふかぃまろ\",\"fukai miyabi\":\"深井雅\",\"fukami naoyuki\":\"深水直行\",\"fukami otoha\":\"フカミオトハ\",\"fukami ryou\":\"深海リョウ\",\"fukao toriko\":\"深生とり子\",\"fukase ayaka\":\"深瀬アヤカ\",\"fukashiba\":\"深シバ\",\"fukazume\":\"ふかづめ\",\"fukiko\":\"フキコ\",\"fukin\":\"布巾\",\"fukudahda\":\"フクダーダ\",\"fukui sora\":\"福井空\",\"fukumimi\":\"ふくみみ\",\"fukunaga yukito\":\"福永ゆきと\",\"fukunotsukuribe\":\"ふくのつくりべ\",\"fukuoka kisara\":\"福岡きさら\",\"fukurokouji\":\"袋小路\",\"fukurou\":\"フクロウ\",\"fukutarou\":\"ふくたろう\",\"fukutoku saori\":\"福徳紗織\",\"fukuzawa yukine\":\"福沢ゆきね\",\"fume\":\"fume\",\"fumi\":\"ふみ\",\"fumi haru\":\"ふみはる\",\"fumicha\":\"史茶\",\"fumihiro\":\"ふみひろ\",\"fumikage\":\"文影\",\"fumikiri\":\"ふみきり\",\"fumio\":\"フミオ\",\"fumitani yasunori\":\"フミタニヤスノリ\",\"fumiya\":\"文哉\",\"fumizuki misoka\":\"文月みそか\",\"fumotono mikoto\":\"梺乃みこと\",\"funabori nariaki\":\"船堀斉晃\",\"funakura\":\"ふなくら\",\"funamushi\":\"船虫\",\"funan\":\"ふなん\",\"funato hitoshi\":\"船戸ひとし\",\"funatsu kazuki\":\"ふなつかずき\",\"funaya sakichi\":\"船弥さ吉\",\"fundoshi\":\"褌\",\"funeral\":\"Funeral\",\"funiai riko\":\"不似合りこ\",\"funky function\":\"ファンキーファンクション\",\"fupe\":\"ふぺ\",\"furafura\":\"ふらふら\",\"furanshisu\":\"フランシス\",\"furari\":\"フラリ\",\"furiri\":\"ふりり\",\"furo\":\"ふろ\",\"furuta a.\":\"ふる太・A\",\"fusa\":\"房\",\"fushimori tonkatsu\":\"不死森トンカツ\",\"fusisya o\":\"不死者O\",\"futaba\":\"ふたば\",\"futaba miwa\":\"ふたば実和\",\"futaba841\":\"双葉841\",\"futago\":\"双子\",\"futamaro\":\"ふうたまろ\",\"futami kazuha\":\"ふたみかずは\",\"futami shihen\":\"双視使翩\",\"futamura futon\":\"ふたむらふとん\",\"futase hijiri\":\"双瀬聖\",\"futase hikaru\":\"二瀬ひかる\",\"futatsuki hisame\":\"双月氷雨\",\"futatsuki kazuo\":\"2月かずお\",\"futee\":\"ふてー\",\"futomaki tamamo.\":\"太巻多摩も。\",\"futoo\":\"フトー\",\"futou ryouko\":\"不透りょうこ\",\"fuuga utsura\":\"風雅うつら\",\"fuurai\":\"風籟\",\"fuurin\":\"ふぅりん\",\"fuyo\":\"ふよ\",\"fuyube rion\":\"冬部李穏\",\"fuyukaze tsubasa\":\"冬風つばさ\",\"fuyuki masato\":\"冬木真人\",\"fuyunagi reku\":\"冬凪れく\",\"fuyuno hitsuji\":\"冬野ひつじ\",\"fuyuno yuno\":\"冬野由乃\",\"fuyutarou\":\"ふゆたろう\",\"fuyuwa kotatsu\":\"冬和こたつ\",\"fuzai yumoto\":\"不在ゆもと\",\"g zero\":\"Gゼロ\",\"g-co\":\"G-co\",\"g.g. kakeru\":\"G.G.翔\",\"ga015\":\"ga015\",\"gabagobogebe\":\"ガバゴボゲベ\",\"gaburi\":\"ガブリ\",\"gachonjirou\":\"がちょん次郎\",\"gaden\":\"GADEN\",\"gagarin kichi\":\"ガガーリン吉\",\"gaiseisya\":\"凱聖者\",\"gajirabute\":\"ガジラビュート\",\"gakimagari\":\"ガキマガリ\",\"gakugaku\":\"楽々\",\"gamako\":\"ガマ子\",\"gamma\":\"gamma\",\"gamma chaos\":\"ガンマカオス\",\"gamu\":\"がむ\",\"gangi mari\":\"雁木麻理\",\"ganmarei\":\"眼魔礼\",\"gao\":\"gao\",\"gara ayuri\":\"柄あゆり\",\"garakuta sochi\":\"瓦落多装置\",\"garou damenade\":\"画廊ダメナデ\",\"garyou\":\"臥龍\",\"gatari\":\"Gatari\",\"gatling a\":\"ガトリングA\",\"gattai soutou\":\"合体総統\",\"gazeru\":\"GAZERU\",\"gazetta masuda\":\"ガゼッタ増田\",\"gb\":\"GB\",\"ge-b\":\"ゲB\",\"geboku\":\"下僕\",\"gedo\":\"外道\",\"gekato\":\"ゲカト\",\"gekoge satoru\":\"ゲコゲさとる\",\"gemuo\":\"げむお\",\"gemurax\":\"じぇーむら\",\"gemuta\":\"げむた\",\"gen\":\"GEN | 源 | 舷\",\"gengetsu\":\"玄月\",\"genjirou\":\"言示弄\",\"genjuroh\":\"元十郎\",\"genka ichien\":\"原価壱円\",\"genki tarou\":\"元気太郎\",\"genkung\":\"Genkung\",\"gennosuke\":\"源之助\",\"genshi\":\"GENSHI\",\"george\":\"ジョージ\",\"geppei\":\"月餅\",\"gero\":\"げろ\",\"shimaki ika\":\"風巻いか\",\"gesho ichirou\":\"げしょ一郎\",\"geshop\":\"げしょぷ\",\"gggg\":\"GGGG\",\"ggrn\":\"GGRN\",\"gia\":\"ギア\",\"gida\":\"ぎだ\",\"gigokku\":\"疑獄\",\"gimako\":\"ぎまこ\",\"gin\":\"ぎん\",\"gin jyuji\":\"銀十字\",\"gincha\":\"銀茶\",\"ginga azuma\":\"銀河アズマ\",\"gingitsune\":\"宇宙戦艦ヤマト\",\"ginichi\":\"銀一\",\"ginkamen\":\"銀仮面\",\"ginko\":\"ginko\",\"ginmugi\":\"銀麦\",\"ginnosuke\":\"銀ノ助\",\"gino\":\"Gino\",\"ginseiou\":\"銀星王\",\"ginta\":\"ぎん太\",\"ginto\":\"吟人\",\"ginzake\":\"ギンザケ\",\"giro chinko-chan\":\"ギロ・チン子ちゃん\",\"gisyo\":\"gisyo\",\"giu\":\"ぎう\",\"glastonbury1966\":\"グラストンベリー1966\",\"glycerol takeru\":\"グリセリンたける\",\"glyserin\":\"グリセ麟\",\"gmkj\":\"GMKJ\",\"go-1\":\"Go-1\",\"goban\":\"ごばん\",\"goblin\":\"ゴブリン\",\"goblinboy\":\"kronn\",\"gochou\":\"伍长\",\"gody\":\"Gody\",\"goggles\":\"goggles\",\"gohan no otomo\":\"ごはんのおとも\",\"goji\":\"ゴジ\",\"gojou kurota\":\"五條くろた\",\"gojou shino\":\"ごじょう忍\",\"gokuraku jouko\":\"极乐浄子\",\"gokurou\":\"ごくろう\",\"golden\":\"ゴールデン\",\"golgi bon\":\"ゴルジイ本\",\"goma\":\"ごま\",\"goma satoshi\":\"ごまさとし\",\"gomabura\":\"ごまぶら\",\"gomashi\":\"ごまし\",\"gomatamago\":\"ゴマタマゴ\",\"gomoku tsukune\":\"ごもくつくね\",\"gomtang\":\"GomTang\",\"gomu\":\"ゴム\",\"gon\":\"ごん\",\"gon heihachi\":\"ゴン平八\",\"gonbuto\":\"ごんぶと\",\"gonta\":\"ゴンタ\",\"gonza\":\"gonza\",\"gonzaburo-\":\"ゴンざぶろー\",\"gorgon\":\"ゴルゴン\",\"golgonzola\":\"ごるごんぞーら\",\"goriyaku\":\"ごりやく\",\"goro\":\"ごろ\",\"gorogoro\":\"ゴロごろ\",\"gorohati\":\"ごろはち\",\"goro ichi\":\"五六壱\",\"goroumaru\":\"五郎丸\",\"gotakichi\":\"誤汰吉\",\"goto-p\":\"ごとP\",\"gotou\":\"ゴトウ\",\"gotou sakaaki\":\"ごとうさかあき\",\"gouda hakase\":\"ｺﾞｳﾀﾞﾊｶｾ\",\"gouda nagi\":\"剛田ナギ\",\"gouguru\":\"ゴーグル\",\"goyac\":\"ごやっち\",\"gozaemon\":\"御座衛門\",\"gozaru\":\"ござる\",\"gozen\":\"午前\",\"gozen reiji\":\"御前零士\",\"gozz\":\"gozz\",\"gram\":\"グラム\",\"great daikon\":\"グレイト大根\",\"great magami\":\"グレート魔神\",\"grey fisher\":\"グレイ・フィッシャー\",\"grifon\":\"GRIFON\",\"grimmelkin\":\"グリムメルキン\",\"ground\":\"GROUND\",\"grune\":\"Grune\",\"gt\":\"GT\",\"guchi wota\":\"愚痴ヲタ\",\"gum\":\"ガム\",\"gumbat\":\"Gumbat\",\"gumi\":\"ぐみ\",\"gun ryuusei\":\"群りゅうせい\",\"gunnousa\":\"ぐんのうさ\",\"gura\":\"ぐら\",\"gure\":\"ぐれ\",\"gurekan\":\"ぐれ缶\",\"guri\":\"ぐり\",\"guriko\":\"Guriko\",\"guriko-san\":\"ぐりこ・さん\",\"gushigushi maru\":\"ぐしぐし丸\",\"gussan\":\"ぐっさん\",\"gust-san\":\"ガストさん\",\"guy\":\"GUY\",\"gyakushuu takeshi\":\"逆襲武士\",\"gyarin\":\"ぎゃりん\",\"gyoko\":\"漁港\",\"gyokro\":\"ぎょくろ\",\"gyonikun\":\"魚肉ん\",\"gyony\":\"Gyony\",\"akatsuki kanten\":\"暁寒天\",\"gyro amarume\":\"ジャイロ余目\",\"gyunyu\":\"牛乳\",\"gyuunyuuzaemon\":\"牛乳左卫门\",\"gyuutei\":\"牛帝\",\"h-h\":\"H・H\",\"h9\":\"H9\",\"ha-ru\":\"ha-ru\",\"haba hirokazu\":\"幅ヒロカズ\",\"habatakuhituji\":\"羽ばたく羊\",\"habezamurai\":\"侍侍\",\"habutae kyusetsu\":\"羽双重 毬雪\",\"hacchake tarou\":\"はっちゃけ太郎\",\"hachi\":\"はち\",\"hachi duchi\":\"hachi_duchi\",\"hachiko\":\"ハチコ\",\"hachimitsu\":\"はちみつ\",\"hachimitsu cute\":\"ハチミツキュート\",\"hachiro\":\"ハチロ\",\"hachiya mitsu\":\"蜂屋みつ\",\"hacho\":\"はちょ\",\"had\":\"ハディ\",\"hadacra\":\"羽田暮\",\"hafu\":\"HaFu\",\"hagane soushi\":\"羽鐘そうし\",\"hagane tetsu\":\"鋼鉄\",\"haganemaru kennosuke\":\"鋼丸剣ノ介\",\"hage\":\"はげ\",\"hagetaka\":\"ハゲたか\",\"hagure kedama\":\"はぐれけだま\",\"hagure metal\":\"はぐれメタル\",\"haiboku\":\"敗北\",\"haida nanako\":\"灰田 ナナコ\",\"haiiroguma\":\"はいいろぐま\",\"haineken\":\"はいねけん\",\"hairaito\":\"灰雷兎\",\"haison\":\"haison\",\"haito mitori\":\"灰都みとり\",\"haitukun\":\"Haitukun\",\"haizaki mejiro\":\"灰崎めじろ\",\"haji\":\"ﾊｼﾞ\",\"hajime\":\"創\",\"hajime-san.\":\"はじめさん。\",\"hajin\":\"Hajin\",\"hakaba yodomu\":\"墓場淀夢\",\"hakai taitei\":\"破坏大帝\",\"hakano shinshi\":\"ハカノシンシ\",\"hakiata\":\"はきあた\",\"hakika\":\"はきか\",\"hakkaku shikimi\":\"八角シキミ\",\"hakoiri nekohime\":\"箱入猫姫\",\"hakojima akane\":\"ハコジマアカネ\",\"haku\":\"白\",\"hakua ugetsu\":\"白亜右月\",\"hakubun.\":\"はくぶん.\",\"hakugi\":\"白義\",\"hakui ami\":\"羽咋あみ\",\"hakuma\":\"HAKUMA\",\"hakumai gen\":\"白米玄\",\"hakusui riko\":\"白水リコ\",\"hakuto\":\"ハクト\",\"hakutou\":\"白桃\",\"hakuun\":\"はく雲\",\"hakuzen\":\"白髯\",\"halcachanel\":\"ハルカチャンネル\",\"halco\":\"ハルコ\",\"halcon\":\"はるこん\",\"halfpricecelebr\":\"半額セレブ\",\"hallelujah\":\"晴屋\",\"halo\":\"HALO\",\"halogen\":\"halogen\",\"ham\":\"HAM\",\"ham sausage\":\"公双誠二\",\"hama\":\"はま\",\"hama machisu\":\"濱まちす\",\"hamada mari\":\"濱田麻里\",\"hamahara yoshio\":\"浜原義雄\",\"hamalu\":\"hamalu\",\"hamanasu\":\"はまなす\",\"hamano makoto\":\"ハマノマコト\",\"hamaoka ponta\":\"浜岡ポン太\",\"hamashima shigeo\":\"はましま薫夫\",\"hamigaki shinji\":\"はみがきしんぢ\",\"hamihe\":\"はみへ\",\"hamiltan\":\"ハミルタン\",\"hamuhamu\":\"ハムハム\",\"hamunohito\":\"ハムの人\",\"hamuta\":\"公タ\",\"han\":\"HAN\",\"hana\":\"花\",\"hanabi21\":\"花火21\",\"hanada hyou\":\"はなだひょう\",\"hanada ranmaru\":\"花田蘭丸\",\"hanamizawa q-tarou\":\"花見沢Q太郎\",\"hanamoto ari\":\"花本アリ\",\"hanamura shikika\":\"華村色花\",\"hanamura shuuzou\":\"花村しゅーぞー\",\"hanao\":\"はなぉ。\",\"hanapin\":\"はなぴん\",\"hanasaki\":\"華咲\",\"hanasaku mahiru\":\"花咲まひる\",\"hanataka retomo\":\"はなたかれとも\",\"hanauna\":\"はなうな\",\"hanazawa suou\":\"花澤すおう\",\"hanchou\":\"班長\",\"handa\":\"handa\",\"handsofmidaz\":\"handsofmidaz\",\"hane\":\"HANE\",\"haneda ikao\":\"羽田いかお\",\"hanee\":\"HANEE\",\"hanekumo\":\"羽雲\",\"hanemikakko\":\"ハネミカッコ\",\"hanetsuki tokei\":\"羽月とけい\",\"hanibi\":\"hanibi\",\"hanikura un\":\"羽仁倉雲\",\"hanini\":\"はにーに\",\"haniwa pao\":\"埴輪ぱお\",\"hankkwo\":\"H@nk²wo\",\"hankotsu max\":\"反骨MAX\",\"hanma akira\":\"範馬アキラ\",\"hans\":\"hans\",\"hansharu\":\"半しゃる\",\"hanya\":\"Hanya\",\"hanyw\":\"ハニュー\",\"hanzaki jirou\":\"はんざきじろう\",\"hanzawa 821\":\"半澤821\",\"happamushi\":\"はっぱむし\",\"hara sakeru\":\"はらさける\",\"hara shigeyuki\":\"原茂之\",\"hara-peco\":\"腹ペ娘\",\"harada\":\"はらだ\",\"haraita\":\"はらいた\",\"harano\":\"原野\",\"harasaki\":\"原崎\",\"hardcrom\":\"hardcrom\",\"harenochiame\":\"ハレノチアメ\",\"hareya umako\":\"晴屋うまこ\",\"hari\":\"hari\",\"hariken hanna\":\"はりけんはんな\",\"harimoji\":\"はりもじ\",\"harino646\":\"harino646\",\"haritama hiroki\":\"針玉ヒロキ\",\"hariyu\":\"はりゆ\",\"harry\":\"ハリー\",\"haru\":\"春\",\"haru z\":\"はるZ\",\"haru.\":\"はる。\",\"haruchika\":\"ハルチカ\",\"haruemon\":\"ハルゑもん\",\"harufumi\":\"ハルフミ\",\"harubaru haruto\":\"春々春兎\",\"haruhina murasaki\":\"春雛紫\",\"haruichigo\":\"はるいちご\",\"haruka\":\"はるか\",\"harukami rio\":\"春上里央\",\"harukaze do-jin\":\"春風道人\",\"harukaze koucha\":\"春風紅茶\",\"harukaze unipo\":\"春風うにぽ\",\"haruken\":\"ハル犬\",\"haruki\":\"春辉\",\"haruma tokihiko\":\"ハルマ刻彦\",\"harumari\":\"はるまり\",\"kasane haruo\":\"かさね春緒\",\"harumi jun\":\"春海潤\",\"harumi zyun\":\"春海淳\",\"haruna mao\":\"榛名まお\",\"harunaga makito\":\"晴永牧兎\",\"haruno yomogi\":\"春野蓬\",\"harunori\":\"はるのり\",\"harura\":\"はるら\",\"harurun\":\"はるるん\",\"haruruyuco\":\"はるるゆこ\",\"harusame\":\"春雨\",\"harusame kiruke\":\"榛雨きるけ\",\"harusawa\":\"ハルサワ\",\"harusuke\":\"春助\",\"haruyoshi\":\"はるよし\",\"haruyuki\":\"はるゆき\",\"haryu\":\"ハリュー\",\"hase yuu\":\"はせ☆裕\",\"hasebe kazunari\":\"长谷部一成\",\"hasebe mitsuhiro\":\"长谷部臣丈\",\"hasebe souutsu\":\"はせべso鬱\",\"hasegawa daisuke\":\"ハセガワダイスケ\",\"hasegawa keita\":\"はせがわけいた\",\"hasegawa yukino\":\"長谷川ユキノ\",\"hasei agana\":\"ハセイアガナ\",\"hasekura\":\"支倉\",\"hasekura chiaki\":\"支倉ちあき\",\"hasekura noise\":\"支倉ノイズ\",\"hash\":\"hash\",\"hashi cube\":\"土師キューブ\",\"hashiba yachi\":\"端葉やち\",\"hashikure\":\"はしくれ\",\"hashimo yuki\":\"羽霜ゆき\",\"hashimoto\":\"橋本\",\"hashinoha\":\"はしのは\",\"hasuke\":\"葉助\",\"hasumi elan\":\"蓮見江蘭\",\"hasumi hana\":\"羽純ハナ\",\"hasumi hiro\":\"ハスミヒロ\",\"hasumi tsuina\":\"蓮見ついな\",\"hasuno\":\"ハスノ\",\"hasunoue baitsu\":\"はすの上梅津\",\"hata\":\"ハタ\",\"hata jinshichi\":\"湊甚七\",\"hatachi\":\"はたち\",\"ekataraf\":\"エカタラフ\",\"hatara\":\"HATARA\",\"hatimoto\":\"鉢本\",\"hato\":\"hato\",\"hato no suisou\":\"ハトの水槽\",\"hatoba\":\"はとば\",\"hatoko\":\"ハトこ\",\"hatomugi\":\"鳩むぎ\",\"hatoya kobayashi\":\"ハトヤ小林\",\"hatoya mameshichi\":\"鳩矢豆七\",\"hatsuki kyou\":\"葉月京\",\"hatsushio\":\"ハツ塩\",\"kuzunoha hiroshi\":\"葛葉洋志\",\"hattori\":\"ハットリ\",\"hattori gorou\":\"はっとりゴロー\",\"hattori masaki\":\"はっとりまさき\",\"hattori mitsuka\":\"服部ミツカ\",\"hatty\":\"はてぃ\",\"haura shouhei\":\"葉浦昌平\",\"hawkear\":\"ハウケア\",\"hayabusa shingo\":\"はやぶさ真吾\",\"hayahide\":\"ハヤヒデ\",\"hayakawa halui\":\"早川ハルイ\",\"hayakawa torinone\":\"はやかわトリノネ\",\"hayama yuu\":\"羽山悠\",\"hayami aya\":\"はやみあや\",\"hayami kuro\":\"速水くろ\",\"hayami osamu\":\"速水オサム\",\"hayami rokusichi\":\"速水ろくしち\",\"hayami sakura\":\"速水桜\",\"hayasaka mebawe\":\"はやさかめばゑ\",\"hayashi\":\"はやし\",\"hayashi custom\":\"はやしけ\",\"hayashi mario\":\"林マリオ\",\"hayashi tsukasa\":\"はやしつかさ\",\"hayuta\":\"はゆた\",\"hazaka mau\":\"羽坂まう\",\"hazaki\":\"ハザキ\",\"hazio\":\"ハジオ\",\"hazuki\":\"はづき\",\"hazuki kyou\":\"葉月梗\",\"hazuki shishimaru\":\"葉月獅子丸\",\"hazuki yuu\":\"葉月祐\",\"hazumi yae\":\"羽純やえ\",\"hcwr\":\"HCWR\",\"heat one\":\"ヒートワン\",\"hebereke black\":\"へべれけBLACK\",\"hechi\":\"へち\",\"hechimabushi\":\"ヘチマ節\",\"hechiumu\":\"ヘチウム\",\"heguri\":\"へぐり\",\"heibon kaeru\":\"平凡蛙\",\"heigani\":\"兵蟹\",\"heika\":\"HEIKA\",\"heiya\":\"へぃや\",\"heizo\":\"HEIZO\",\"hekyu\":\"碧宇\",\"hemachi\":\"hemachi\",\"hemoglobina1c\":\"へもぐろびんA1C\",\"henichi\":\"ヘンイチ\",\"henshako\":\"ヘンシャコ\",\"heppoko taro\":\"へっぽこ太郎\",\"herahera\":\"へらへら\",\"hermmy\":\"Hermmy\",\"hertro\":\"Hertro\",\"herunia ninja\":\"ヘルニア忍者\",\"heshi\":\"HESHI\",\"hews\":\"Hews\",\"hhh\":\"HHH\",\"hi-mosu\":\"ひ～もす\",\"hiatari shin\":\"日辺しん\",\"hibakichi\":\"ひばきち\",\"hibiiro\":\"日々色\",\"hibiki jun\":\"ひびき純\",\"hibiki seiya\":\"響星哉\",\"hibiki wataru\":\"響ワタル\",\"hibino tomoki\":\"日比野友輝\",\"hida\":\"火田\",\"hida mari\":\"妃田マリ\",\"hida tatsuo\":\"飛田竜夫\",\"hidaka ryou\":\"ヒダカリョウ\",\"hidari pory5n\":\"左ポリ5ン\",\"hidarikiki\":\"左利き\",\"hide\":\"___hide___\",\"hidori\":\"日鳥\",\"higashiyama sion\":\"東山しをん\",\"higashizukihi sei\":\"東月陽西\",\"hige\":\"ひげ\",\"hige ojisan\":\"ヒゲおじさん\",\"higemorigen\":\"ヒゲモリゲン\",\"higetora\":\"髭寅\",\"higuchi tsuyuhito\":\"樋口露仁\",\"higure samon\":\"日暮さもん\",\"hihiyama yokikana\":\"比比山よきかな\",\"hiiaru\":\"ひいある\",\"hiichan\":\"ひぃちゃん\",\"hiiragi azato\":\"柊アザト\",\"hiiragi hajime\":\"柊はじめ\",\"hiiragi yuki\":\"柊ゆき\",\"hiiro yuki\":\"緋色雪\",\"hijikawa\":\"Hijikawa\",\"hijiki\":\"ひじき\",\"hijiri\":\"聖\",\"hijiribashi chaki\":\"聖橋茶紀\",\"hikabe sakuho\":\"ひかべさくほ\",\"hikanyan\":\"ひかにゃん\",\"hikari\":\"ひかり\",\"hikawa hekiru\":\"氷川へきる\",\"hikawa yuuki\":\"斐川悠希\",\"hikeshi no kaze zimbabwe\":\"火消しの風ジンバブエ\",\"hikitogu\":\"ひきとぐ\",\"hiko\":\"ヒコ\",\"hikou nabe\":\"飛行鍋\",\"hima\":\"HIMA\",\"himadara\":\"ひまだら\",\"hime hajime\":\"ひめ はじめ\",\"himei yoru\":\"ひめいよる\",\"himekawa akira\":\"姫川明月\",\"himekuri\":\"ヒめくり\",\"himemiya aoi\":\"姫宮葵\",\"himemiya aya\":\"姫宮あや\",\"himemiya nina\":\"ひめみやにいな\",\"himeno\":\"ひめの\",\"himeoka yuki\":\"姫岡幸忌\",\"himori tsukineko\":\"妃杜つきねこ\",\"himukai yuji\":\"日向悠二\",\"himura eiji\":\"緋村えいじ\",\"himuro kouichi\":\"氷室光一\",\"hina miruku\":\"未来みるく\",\"hinadori\":\"雛鳥\",\"hinagi rion\":\"緋凪りおん\",\"hinaki\":\"ヒナキ\",\"hinako yui\":\"比奈子惟\",\"hinakuma\":\"ひなくま\",\"hinamatsuri touko\":\"雛祭桃子\",\"hinami\":\"ひなみ\",\"hinamori yui\":\"ひなもりゆい\",\"hinapo\":\"ヒナポ\",\"hinase aya\":\"雛瀬あや\",\"hinase kazusa\":\"ヒナセカズサ\",\"hinata aimi\":\"日向アイミ\",\"hinata aoi\":\"日向あおい\",\"hinata karin\":\"ひなた夏鈴\",\"hinata momo\":\"ひなたもも\",\"hinata mutsuki\":\"ひなた睦月\",\"hinata neru\":\"ひなたねる\",\"hinata yagaki\":\"日向野牙樹\",\"hinayori\":\"ヒナヨリ\",\"hino\":\"ひの\",\"hinoakimitu\":\"ヒノアキミツ\",\"hinoe nami\":\"ヒノエナミ\",\"hinoki\":\"ひのき\",\"hinooka shuuji\":\"緋ノ丘シュウジ\",\"hinori\":\"ひのり\",\"hinoshima sora\":\"緋乃島空\",\"hinoue itaru\":\"樋上いたる\",\"hir\":\"Hir\",\"hira\":\"平\",\"hira taira\":\"ひらたいら\",\"hiraizumi\":\"比良泉\",\"hiraizumi kou\":\"ひらいずみこう\",\"hiraki naori\":\"平木直利\",\"hirame guard\":\"ひらめがーど\",\"hirano kana\":\"平野かな\",\"hirano kawajuu\":\"平野河重\",\"hirano kouta\":\"平野耕太\",\"hirano tsukiko\":\"平野月子\",\"hiraru\":\"ヒラル\",\"hirasato\":\"ヒラサト\",\"hirase yuu\":\"平瀬ゆう\",\"hiratsura masaru\":\"ひらつらまさる\",\"hirayan\":\"ひらやん\",\"hirno\":\"Hirno\",\"hiro kari\":\"ひろ(仮)\",\"hiro kazuki\":\"比呂カズキ\",\"hirob816\":\"HiRoB816\",\"hiroe rei\":\"広江礼威\",\"hirogoori akio\":\"広郡明生\",\"hiroichi\":\"ヒロイチ\",\"hirokawa kouichirou\":\"広川浩一郎\",\"hirokawa tomo\":\"緋呂河とも\",\"hirokazukine\":\"HirokazuKine\",\"hiroko\":\"ヒロ子\",\"hiromaji\":\"ひろまじ\",\"hirome\":\"ひろめ\",\"hironii\":\"ひろにい\",\"hirono\":\"Hirono\",\"hirooki\":\"博海城\",\"hiroshi\":\"ヒロシ\",\"hirosue maron\":\"広末まろん\",\"hirota masatane\":\"廣田眞胤\",\"hiroto\":\"启人\",\"hiroyama hiroshi\":\"广山弘\",\"hiroyoshi\":\"ヒロヨシ\",\"hiroyuki\":\"ヒロユキ\",\"hiroyuki koto\":\"比呂之\",\"hiryuu takahiro\":\"緋龍高弘\",\"hisa\":\"ひさ\",\"hisahiko\":\"久彦\",\"hisakabe oto\":\"久壁おと\",\"hisame\":\"氷雨\",\"hisame genta\":\"氷雨げんた\",\"hisano\":\"ひさの\",\"hisaya\":\"久夜\",\"hisayakiq\":\"ひさやききゅう\",\"hishimori\":\"菱守\",\"histamine c\":\"ヒスタミンC\",\"hiten onee-ryuu\":\"飛天御姉流\",\"hitohako\":\"人箱\",\"hitokko\":\"ひとっこ\",\"hitomasu modoru\":\"ヒトマスモドル\",\"hitomi\":\"人見\",\"hitomi aki\":\"人見あき\",\"hitori jozu\":\"日盗りジョーズ\",\"hitotose rin\":\"春夏秋冬鈴\",\"hits\":\"ひっつ\",\"hitsuji\":\"HITSUJI\",\"hitsuji hako\":\"日辻ハコ\",\"hitsujibane shinobu\":\"羊羽 忍\",\"hitsujiko\":\"羊子\",\"hitsujin\":\"ひつじん\",\"hitsujinx\":\"ヒツジンクス\",\"hitsuki\":\"ひつき\",\"hiviki.n\":\"Hiviki.N\",\"hiwatari rin\":\"樋渡りん\",\"hiya\":\"Hiya\",\"hiyama chiaki\":\"桧山千秋\",\"hiyo hiyo\":\"ひよひよ\",\"hiyocco\":\"hiyocco\",\"hiyoko daiou\":\"ひよこ大王\",\"hiyoko.\":\"ひよこ。\",\"hiyokomame\":\"ひよこまめ\",\"hiyou\":\"飛熊\",\"hiyozakura\":\"ひよざくら\",\"hizaka\":\"ひざか\",\"hizaki ryuuta\":\"ひざきりゅうた\",\"hjb\":\"HJB\",\"hobilo\":\"Hobilo\",\"hobo3\":\"ほぼ3\",\"hohehohe\":\"ほへほへ\",\"hoihoi\":\"hoihoi\",\"hoimin\":\"ホイミン\",\"hojo\":\"hojo\",\"hokage\":\"ほかげ\",\"hokagemio\":\"ホカゲミオ\",\"hokku\":\"ホック\",\"hokuna rin\":\"北那リン\",\"hokuro ryuseigun\":\"ホクロ流星群\",\"hokuto\":\"北斗\",\"homaderi\":\"ほまでり\",\"homra\":\"homra\",\"honda formalin\":\"本田ホルマリン\",\"honda hajime\":\"本田基\",\"honda mitsuru\":\"本多みつる\",\"honda naoki\":\"本田直樹\",\"honda negi\":\"本田ねぎ\",\"honda opon\":\"本田おぽん\",\"hone\":\"ホネ\",\"honebuto danshaku\":\"骨太男爵\",\"honewo arukemita\":\"ホネヲ・アルケミタ\",\"honey-usako\":\"はにいうさこ\",\"honjou masato\":\"本庄マサト\",\"honmachi keisuke\":\"本町圭祐\",\"honnori\":\"ほんのり\",\"honnouchi honoji\":\"本能血ホノジ\",\"honoka\":\"萌香\",\"honokun\":\"ほのくん\",\"honoutsukai\":\"炎使\",\"hontai bai\":\"本体売\",\"hontoku\":\"ホン・トク\",\"honya\":\"ほにゃー\",\"hoono yurumu\":\"頬乃ゆるむ\",\"hoosaku\":\"ほ～さく\",\"hoppege\":\"ほっぺげ\",\"hora\":\"法螺\",\"hori hiraki\":\"堀ヒラキ\",\"horie\":\"ホリエ\",\"horie tankei\":\"堀江耽閨\",\"horiguchi\":\"ホリグチ\",\"horikawa kyo\":\"堀川◆キョウ\",\"horikiri haruto\":\"堀切ハルト\",\"horimoto akira\":\"ほりもとあきら\",\"hormone\":\"ホルモン\",\"horo makoto\":\"幌真人\",\"horosuke\":\"ホロすけ\",\"hosaka takemaru\":\"保坂たけまる\",\"hosaka yuuichi\":\"ほさかゆーいち\",\"hoshi nohara\":\"ほしのはら\",\"hoshiduki akira\":\"星月晃\",\"hoshiduki melon\":\"星月めろん\",\"hoshieda\":\"ほしえだ\",\"hoshifuri\":\"ホシフリ\",\"hoshikawa atsuki\":\"星河あつき\",\"hoshikawa kirara\":\"ほしかわきらら\",\"hoshimoto piero\":\"星本ピエロ\",\"hoshina\":\"ほしな\",\"hoshino cobato\":\"星野小鳩\",\"hoshino kabi\":\"ホシノカビ\",\"hoshino lala\":\"星野ララ\",\"hoshino nia\":\"星野ニア\",\"hoshioki\":\"ホシオキ\",\"hoshizaki ryuu\":\"星崎龍\",\"hoshizora\":\"星空\",\"hosikawa tukimi\":\"星川月海\",\"hosizora mikoto\":\"星空ミコト\",\"hosoi kouzou\":\"細井コウゾウ\",\"hosokawa fuziemon\":\"細川ふじえもん\",\"hot\":\"HOT\",\"hot melon\":\"Hot Melon\",\"hota.\":\"ほた。\",\"hotaru\":\"蛍\",\"hotarugusa\":\"ほたる草\",\"hotei kazuha\":\"保汀一葉\",\"hotori\":\"歩鳥\",\"houga\":\"芳芽\",\"houhokekiyo\":\"ホウホケキヨ\",\"houmitsu\":\"方密\",\"houou-tan\":\"鳳凰たん\",\"houruri\":\"蓬瑠璃\",\"housubaru\":\"鳳スバル\",\"houtei kara\":\"法廷から\",\"hozumi takashi\":\"Hozumi Takashi\",\"hozumi touzi\":\"八月一日冬至\",\"hplay\":\"Hplay\",\"hroz\":\"ふろず\",\"htg\":\"htg\",\"huet\":\"Huet\",\"hujinon\":\"ふじのん\",\"hukidamari\":\"吹溜\",\"hukokukyohei\":\"腐国狂兵\",\"hukuhukuan\":\"福々餡\",\"humei\":\"フメイ\",\"humi\":\"ふみ\",\"humiu\":\"ふみぅ\",\"humizuki\":\"Humizuki\",\"huracan\":\"うらかん\",\"hutoshi\":\"ふとし\",\"huupo\":\"フーポ\",\"huyukiti\":\"冬吉\",\"huzinami kaoru\":\"藤波薫\",\"hyaku\":\"ヒャク\",\"hyakuen\":\"hyakuen\",\"hyakuhachi\":\"ひゃくはち\",\"hyakushiki cheerio\":\"百式テリヲ\",\"hydrant\":\"HYDRANT\",\"hyouga.\":\"ひょうが。\",\"hyouju issei\":\"氷樹一世\",\"hyoukai\":\"氷海\",\"hypar\":\"Hypar\",\"hyper unko cannon\":\"ハイパーウンコキャノン\",\"hypno sushi\":\"ひぷの寿司\",\"hyudora\":\"ヒュドラ\",\"hyung tae kim\":\"김형태\",\"hyuuga azuri\":\"日向あずり\",\"iapoc\":\"IAPOC\",\"ibn\":\"Ibn\",\"ibonnu\":\"イボンヌ\",\"ibu hidekichi\":\"伊武秀吉\",\"ibuki pon\":\"息吹ポン\",\"ibukichi\":\"いぶきち\",\"iburo.\":\"いぶろー。\",\"ica\":\"ica\",\"icelee\":\"IceLee\",\"ichi\":\"ichi\",\"ichi ume\":\"いちうめ\",\"ichi-san\":\"いち\",\"ichiboshi\":\"イチボシ\",\"ichie ryouko\":\"一恵りょうこ\",\"ichiei\":\"一栄\",\"ichifuji nitaka\":\"壱藤弐鷹\",\"ichigo\":\"いちご\",\"ichigo mark\":\"いちごまぁく\",\"ichigo.\":\"いちご。\",\"ichiha\":\"いちは\",\"ichihara kazuma\":\"市原和真\",\"ichii akira\":\"いちい瑛\",\"ichika\":\"いちか\",\"ichikawa\":\"市川\",\"ichikawa ichiko\":\"市川いちこ\",\"ichikawa kazuhide\":\"市川和秀\",\"ichikawa ryuunosuke\":\"壱河柳乃助\",\"ichikawa yayoi\":\"イチカワヤヨイ\",\"ichiki tomoe\":\"壱樹ともえ\",\"ichimai ugou\":\"一枚烏合\",\"ichimedou\":\"いちめどー\",\"ichimi\":\"いちみ\",\"ichimi tougarashi\":\"いちみとうがらし\",\"ichimonji mutsuki\":\"一文字睦月\",\"ichinashi kimi\":\"市梨きみ\",\"ichino\":\"いちの\",\"ichinomiya kazusa\":\"一ノ宮かずさ\",\"ichinose\":\"イチノセ\",\"ichiokunen wakusei\":\"1億年惑星\",\"ichiro\":\"一滝\",\"ichitaka\":\"いちたか\",\"ichiya\":\"一夜\",\"ichiya koutei\":\"いちや皇帝\",\"icica\":\"いちか\",\"id-ed\":\"ID-ED\",\"idogawa\":\"井戸川\",\"iduki\":\"いづき\",\"idumi minami\":\"いづみみなみ\",\"ie gami\":\"いえがみ\",\"ieda kirizen\":\"家田キリゼン\",\"ifnil\":\"IFNIL\",\"ifpark\":\"ifpark\",\"ifuji shinsen\":\"いふじシンセン\",\"igakino agenasu\":\"井垣野あげなす\",\"igan seijin\":\"胃がん星人\",\"iganseijin\":\"胃がん星人\",\"ignica\":\"ignica\",\"iguchi takajin\":\"井口たかじん\",\"igusa shunrou\":\"井草春朗\",\"ihara tatsuya\":\"伊原達矢\",\"iida toyoyuki\":\"いいだ豊雪\",\"iihama daka\":\"飯浜ダカ\",\"iinano\":\"いいなの\",\"iino haseru\":\"イイノ　ハセル\",\"iio tetsuaki\":\"飯尾鉄明\",\"iio tetsuomi\":\"飯尾哲臣\",\"mesiyama\":\"飯山\",\"iiyo koiyo\":\"伊々代恋夜\",\"iiyon\":\"いいよん\",\"iizuki tasuku\":\"唯々月たすく\",\"ijiro suika\":\"居城スイカ\",\"ika\":\"いか\",\"ikagawa shirou\":\"いかがわ四郎\",\"ikanomaru\":\"イカノマル\",\"ikasumi bokuju\":\"イカスミぼくじゅー\",\"ikeda jun\":\"池田淳\",\"ikeda shuuko\":\"池田秀子\",\"ikeda usao\":\"イケダウサオ\",\"ikeda yasuhiro\":\"池田靖宏\",\"ikeden\":\"いけでん\",\"ikelag\":\"ikelag\",\"iken\":\"イケン\",\"ikoma ippei\":\"伊駒一平\",\"iktk\":\"イキテク\",\"iku\":\"郁\",\"ikue fuji\":\"幾枝風児\",\"ikuhashi muiko\":\"郁橋むいこ\",\"ikuma satsuki\":\"伊久間さつき\",\"ikuno harusame\":\"生野ハルサメ\",\"ikura gunkan\":\"いくら軍艦\",\"ikurumi bill\":\"生王ビル\",\"ikuta takanon\":\"いくたたかのん\",\"ikuwiron\":\"イクヰロン\",\"ikuyoan\":\"ikuyoan\",\"illi\":\"ILLI\",\"imacchi\":\"いまっち\",\"imachi reki\":\"居待暦\",\"imaden\":\"いまでん\",\"imagawa akira\":\"今川あきら\",\"imai hanako\":\"イマイ\",\"imai riho\":\"今井里穂\",\"imaichi\":\"居妹治\",\"imaima sayuki\":\"今々沙雪\",\"imaizumi atsushi\":\"いまいずみあつし\",\"imaka hideki\":\"いまかひでき\",\"imaki hitotose\":\"春夏秋冬\",\"imari\":\"伊万里\",\"imawano lem\":\"忌野Lem\",\"imazon\":\"今ゾン\",\"imiju\":\"寒天\",\"imotarei\":\"イモタレ\",\"imozuka panikuru\":\"芋塚ぱにくる\",\"imperial boy\":\"帝国少年\",\"inaba fuyuki\":\"稲場冬樹\",\"inaba sunimi\":\"いなばすにみ\",\"inaho\":\"稲穂\",\"inai\":\"居内\",\"iname\":\"稲芽\",\"inami heil\":\"伊波ハイル\",\"inari kinzou\":\"稲荷金蔵\",\"inari.\":\"ゐなり。\",\"inasaki shirau\":\"稲咲しらう\",\"inase shinya\":\"稲瀬信也\",\"inax\":\"INAX\",\"inayama\":\"稲山\",\"infraton\":\"インフラトン\",\"ingamorugu\":\"いんがもるぐ\",\"ingram 97\":\"いんぐらむ'97\",\"ini\":\"イニ\",\"initsukkii\":\"いにつっきー\",\"inkey\":\"inkey\",\"ino-ki\":\"ino-ki\",\"ino.\":\"ino.\",\"inode\":\"いので\",\"inoino\":\"inoino\",\"inono\":\"inono\",\"inori\":\"いのり\",\"inoshita\":\"いのした\",\"inoue junichi\":\"井上純一\",\"inoue kiyoshi\":\"井上清\",\"inoue mitan\":\"いのうえみたん\",\"inoue takuya\":\"いのうえたくや\",\"inoue tommy\":\"いのうえとみい\",\"inoue yuki\":\"イノウエユキ\",\"inseki 3gou\":\"隕石3号\",\"inu g\":\"犬G\",\"inu-blade\":\"犬ブレード\",\"inuboe\":\"狗吠\",\"yoshino hodaka\":\"吉野ホダカ\",\"inuburo\":\"いぬぶろ\",\"inucreamice\":\"いぬくりぃむあいす\",\"inuduka takeru\":\"犬塚毅\",\"inufuro\":\"いぬふろ\",\"inugahora an\":\"犬洞あん\",\"inugai shin\":\"犬凱新\",\"inugami johnny\":\"犬神じょにー\",\"inugami naoyuki\":\"犬神尚雪\",\"inugami nepia\":\"犬上ねぴあ\",\"inui haruka\":\"乾はるか\",\"inui nui\":\"乾ぬい\",\"inui sekihiko\":\"犬威赤彦\",\"inukai\":\"犬飼\",\"inukkoro\":\"いぬっころ\",\"inukon geek.\":\"いぬこんぎーく。\",\"inumaru\":\"犬丸\",\"inumimi moeta\":\"犬耳もえ太\",\"inumori sayaka\":\"犬森サヤカ\",\"inunare\":\"inunare\",\"inuyashiki\":\"犬屋敷\",\"inuzuka bouru\":\"犬塚ボウル\",\"inyucchi\":\"いにゅっち\",\"io takuya\":\"射尾卓弥\",\"iogi juichi\":\"井荻寿一\",\"ippachi\":\"いっぱち\",\"ippon\":\"一本\",\"iri\":\"イリ\",\"irie\":\"IRIE\",\"irie yamazaki\":\"IRIE YAMAZAKI\",\"iripyon\":\"いりぴょん\",\"iroen\":\"いろえん\",\"iroha\":\"いろは\",\"irohane sui\":\"彩羽スイ\",\"iroito\":\"色糸\",\"irotsuya\":\"いろつや\",\"irua\":\"irua\",\"iruka\":\"Iruka\",\"isada\":\"伊佐田\",\"isaki\":\"伊佐木\",\"isaki uta\":\"伊咲ウタ\",\"isao\":\"isao\",\"isato\":\"イサト\",\"ise.\":\"いせ。\",\"iseki\":\"いせき\",\"isemagu\":\"いせマグ\",\"iseno yajin\":\"いせのやじん\",\"ishibashi shingo\":\"石橋シンゴ\",\"ishida masayuki\":\"石田麻茶行\",\"ishigaki takashi\":\"イシガキタカシ\",\"ishigana\":\"いしがな\",\"ishihara kouhei\":\"石原浩平\",\"ishihara souka\":\"石原そうか\",\"ishikawa kingyo\":\"石川きんぎょ\",\"ishikkoro\":\"石っころ\",\"ishimu\":\"イシム\",\"ishino kanon\":\"石野鐘音\",\"ishioto\":\"Ishioto\",\"ishitoku\":\"イシトク\",\"ishitomo ren\":\"いしとも蓮\",\"ishizuchi ginko\":\"石鎚ぎんこ\",\"isiyama kosuke\":\"石山コースケ\",\"island\":\"あいらんど\",\"isna\":\"イスナ\",\"iso nogi\":\"磯乃木\",\"isogani\":\"イソガニ\",\"isoroku\":\"いそろく\",\"isoya kashi\":\"磯谷かし\",\"isshi taira\":\"いっしたいら\",\"isshiki nishiki\":\"一敷錦\",\"issi-13\":\"イッシー13\",\"isuke gratanity\":\"イスケ・グラタニティー\",\"isutasshu\":\"イスタッシュ\",\"isutoshi\":\"ISUTOSHI\",\"isya\":\"isya\",\"it\":\"イット\",\"itachou\":\"いたちょう\",\"itaku\":\"イタク\",\"itami\":\"伊丹\",\"itamochi\":\"板餅\",\"itaya satoruno\":\"板谷さとるの\",\"ithino li\":\"一ノらい\",\"ito\":\"いとう\",\"ito ichizo\":\"伊藤一蔵\",\"ito katsumi\":\"いとう克巳\",\"ito ryusei\":\"伊藤隆生\",\"itoh kani\":\"伊藤蟹\",\"itome\":\"糸目\",\"itotin\":\"itotin\",\"itou ben\":\"伊藤ベン\",\"itou hiromine\":\"伊東聖峰\",\"itou jin\":\"イトウヂン\",\"itou makoto\":\"伊藤誠\",\"itou puriso\":\"伊藤プリソ\",\"itou satera\":\"伊藤サテラ\",\"itou souichi\":\"伊藤宗一\",\"itoyoko\":\"ITOYOKO\",\"itsuki\":\"いつき\",\"itsuki kousuke\":\"いつきこうすけ\",\"itsuki mai\":\"イツキ舞\",\"itsuki makoto\":\"いつきまこと\",\"itsuki tsukune\":\"樹つくね\",\"itto\":\"一十\",\"iuro\":\"ゆうろ\",\"iwai takeshi\":\"祝たけし\",\"iwaki amami\":\"磐城あまみ\",\"iwama yoshiki\":\"いわまよしき\",\"iwami shouko\":\"石見翔子\",\"iwano\":\"いわの\",\"iwanori\":\"いわのり\",\"iwao naoto\":\"岩尾尚人\",\"iwasaki hiromasa\":\"岩崎啓眞\",\"iwasaki takashi\":\"いわさきたかし\",\"iwashita\":\"いわした\",\"iwatsuki aware\":\"岩月あわれ\",\"iyoda mato\":\"伊与田まと\",\"iyohara kansuke\":\"伊予原勘助\",\"iyutani\":\"iyutani\",\"izuki jirou\":\"戌月ジロウ\",\"izumi aki\":\"和泉あき\",\"izumi kyouta\":\"いずみきょうた\",\"izumi masashi\":\"和泉まさし\",\"izumi rion\":\"和泉リオン\",\"izumi tomoki\":\"泉ともき\",\"izumi yakumo\":\"和泉八雲\",\"izumi yayoi\":\"和泉弥生\",\"izumi yoshikazu\":\"和泉美和\",\"izumi yukiru\":\"和泉ゆきる\",\"izumikado kou\":\"泉門コウ\",\"izumimipu\":\"いずみみぷ\",\"izumo kuutarou\":\"出雲空太郎\",\"izumo ryo\":\"出雲りょう\",\"izuna kazuki\":\"Izuna Kazuki\",\"izuna masaru\":\"飯綱まさる\",\"izure\":\"いづれ\",\"izurumi\":\"いづるみ\",\"izushi juunin\":\"出石十人\",\"j\":\"ジェイ\",\"j kakeru\":\"ジョウ・カケル\",\"j-max japan\":\"J-MAX JAPAN\",\"j.c.pandam\":\"J・C・パンダム\",\"j.sairo\":\"J・さいろー\",\"jack\":\"ジャック\",\"jack auber\":\"ジャック・アウバー\",\"rapscallion\":\"Rapscallion\",\"jack hamster\":\"ジャック・ハムスター\",\"jacky\":\"Jacky\",\"jacky knee-san\":\"ジャッキーニーさん\",\"jaguar imoko\":\"ジャガー芋子\",\"jajala\":\"ジャジャラ\",\"jakko\":\"じゃっこ\",\"jakomaru\":\"じゃこまる\",\"jakoten\":\"じゃこてん\",\"jakuwa\":\"邪鍬\",\"jam ouji\":\"ジャム王子\",\"jambread\":\"Jambread\",\"james\":\"ジェームス\",\"james hardiman\":\"skunkworks\",\"jas\":\"JAS\",\"jason\":\"J村\",\"jax2o\":\"じゃじゃお\",\"jd\":\"jd\",\"jean louis\":\"ジャン・ルイ\",\"jellytits7\":\"JellyTits7\",\"jema\":\"jema\",\"jet\":\"JET\",\"jeter\":\"ジーター\",\"ji yuuyuu\":\"じゆうゆう\",\"jiba tenko\":\"じばてんこ\",\"jigoku\":\"jigoku\",\"jigoku sensei hirobe\":\"地獄先生ひろべ～\",\"jii\":\"ぢぃ\",\"jii jii sachira\":\"じーじー☆さちら\",\"jiji\":\"じじ\",\"jils\":\"JILS\",\"jimi sakita\":\"ジミサキタ\",\"jimo\":\"じも\",\"jinbaku-ryuoh\":\"神爆龍王\",\"jingai modoki\":\"人外モドキ\",\"jingo kajiki\":\"神護カジキ\",\"jingrock\":\"甚六\",\"jinkennashi tarou\":\"人権なし太郎\",\"jinmu hirohito\":\"神武裕仁\",\"jinnai jun\":\"陣内潤\",\"jino\":\"じーの\",\"jiro\":\"JIRO\",\"jirou\":\"ジロウ\",\"jiseki\":\"ジセキ\",\"jita\":\"爺太\",\"jitsuyou shinshiki\":\"実用新式\",\"jjj\":\"JJJ\",\"jjune\":\"JJune\",\"john k. pe-ta\":\"ジョン・K・ペー太\",\"johnnie\":\"じょにぃ\",\"johnny\":\"じょにー\",\"johnson\":\"ジョンソン\",\"jomae\":\"錠間江\",\"jomo\":\"じょも\",\"jon\":\"じょん\",\"jon ozaki\":\"ジョン尾崎\",\"jordi\":\"じょるでぃ\",\"joumu\":\"条夢\",\"jovejun.\":\"じょぶじゅん。\",\"jude\":\"jude\",\"jumping dogeza\":\"ジャンピング土下座\",\"jungfrau\":\"Jungfrau\",\"junji\":\"じゅんじぃ\",\"junko\":\"淳子\",\"jura\":\"樹羅\",\"juri reiqa\":\"樹莉麗華\",\"jusc0\":\"jusc0\",\"justy\":\"Justy\",\"juubaori mashumaro\":\"十羽織ましゅまろ\",\"juugatsu\":\"十月\",\"juuji\":\"拾次\",\"juunigatsu shoujo\":\"十二月少女\",\"juurouta\":\"十郎太\",\"juusangatsu\":\"拾参月\",\"jyom\":\"jyom\",\"jyouden\":\"ジョウデン\",\"jyujyo\":\"銃丈\",\"jyunintoiro\":\"獣人といろ\",\"jyura\":\"じゅら\",\"jyuuji\":\"拾次\",\"k no ji\":\"Kの字\",\"k-nattou\":\"K‐なっとう\",\"k-you\":\"K-you\",\"k-zima\":\"圭島瞬里\",\"k. k usako\":\"k.kうさこ\",\"k2 dorachan\":\"K2ドラちゃん\",\"k2isu\":\"ケィス\",\"k3\":\"K3\",\"kabaki\":\"kabaki\",\"kabane\":\"カバネ\",\"kabaya kosuke\":\"樺矢耕助\",\"kabayaki unagi\":\"蒲焼鰻\",\"kabocha head\":\"かぼちゃヘッド\",\"kabocya torute\":\"南瓜とるて\",\"kabotyausagi\":\"かぼちゃ兎\",\"kabuki shigeyuki\":\"香吹茂之\",\"kaburaya seiden\":\"鏑矢正伝\",\"kachoufuugetsu\":\"花鳥風月\",\"kadita\":\"かぢ太\",\"kadokura tomomi\":\"門倉ともみ\",\"kadomaki shinnosuke\":\"門巻森乃介\",\"kadomaru tsubura\":\"角丸つぶら\",\"kadota hisashi\":\"角田ひさし\",\"kadou\":\"カドウ\",\"kaduki\":\"かづき\",\"kaduki ryo\":\"香月稜\",\"kaede kaeru\":\"楓蛙\",\"kaede minoru\":\"カエデミノル\",\"kaen miso\":\"火炎味噌\",\"kaeru\":\"小松菜屋\",\"kaeru neko\":\"かえるねこ\",\"kaerudon\":\"カエル丼\",\"kaeruyama yoshitaka\":\"蛙山芳隆\",\"kagajou hiroki\":\"加賀城ヒロキ\",\"kagami\":\"嘉臥深\",\"kagami mochi\":\"かがみもち\",\"kagami uekusa\":\"鏡植草\",\"kagari\":\"kagari\",\"kagari touya\":\"篝とうや\",\"kagawa tomonobu\":\"矢野たくみ\",\"kage oi\":\"影追い\",\"kagehara hanzou\":\"影原半蔵\",\"kageira\":\"カゲイラ\",\"daigaijin\":\"Daigaijin\",\"kagemusya\":\"KAGEMUSYA\",\"kagerou1991\":\"陽炎1991\",\"kagesaki yuna\":\"影崎由那\",\"kageshio\":\"カゲシオ\",\"kageusu gokuto\":\"影薄獄人\",\"kagiana\":\"鍵穴\",\"kagimushi\":\"かぎむし\",\"kagiyama ryuta\":\"鍵山りゅうた\",\"kagome\":\"籠目\",\"kagura\":\"神楽\",\"kagura kazuto\":\"神楽一刀\",\"kagura momiji\":\"神楽紅葉\",\"kagura nisiki\":\"神楽弐式\",\"kagura takeshi\":\"神楽武志\",\"kagura tsukune\":\"神楽つくね\",\"kagura yutakamaru\":\"神楽雄隆丸\",\"kagura yuuki\":\"かぐらゆうき\",\"kagura yuuto\":\"神楽優人\",\"kagurazaka nagu\":\"神楽坂なぐ\",\"kagurazaka saki\":\"神楽坂沙希\",\"kahasina\":\"川科\",\"kahlua suzuki\":\"カルーア鈴木\",\"kai\":\"改\",\"kai makoto\":\"櫂まこと\",\"kaibara keiya\":\"海原圭哉\",\"kaibara you\":\"海原由布\",\"kaibutsu o koeta kaibutsu\":\"怪物を超えた怪物\",\"kaida michi\":\"海田路\",\"kaidiu\":\"かいぢう\",\"kaidou\":\"海道\",\"kaidou j1\":\"蚕堂j1\",\"kaidou mizuki\":\"海棠深月\",\"kaiga\":\"kaiga\",\"kaigun santouhei\":\"怪軍三等兵\",\"kaika\":\"Kaika\",\"kaiko\":\"初音\",\"kaim\":\"kaim\",\"kaiou\":\"悔王\",\"kairakuen umeka\":\"快楽園梅香\",\"kairi\":\"魁李\",\"kaishaku\":\"介錯\",\"kaishundou\":\"回春堂\",\"kaisoku babangita\":\"快足ババンギタ\",\"kaito shirou\":\"海都しろー\",\"kaitou pink\":\"かいとうぴんく\",\"kaizu\":\"かいず\",\"kaji naoki\":\"梶なおき\",\"kajimura kajima\":\"かじむらカジマ\",\"kajitsu\":\"果実\",\"kajiura\":\"かじうら\",\"kajiwara chihaya\":\"梶原千早\",\"kajiyama hiroshi\":\"梶山浩\",\"kaka otoko\":\"カカ男\",\"kakashi asahiro\":\"かかし朝浩\",\"kakei asato\":\"筧あさと\",\"kakenari\":\"kakenari\",\"kakenashi\":\"かけなし\",\"kakeru\":\"KAKERU\",\"kakiemon\":\"カキえもん\",\"kakino nashiko\":\"柿野なしこ\",\"kakinomoto utamaro\":\"柿ノ本歌麿\",\"kakitamajiru\":\"かきたま汁\",\"kakitsubata kanae\":\"杜若かなえ\",\"kakitsubata tsukune\":\"杜若つくね\",\"kakizaki\":\"柿崎\",\"kakka hideto\":\"活火秀人\",\"kakudai\":\"カクダイ\",\"kakugari ani\":\"カクガリ兄\",\"kakuka\":\"かくか\",\"kakutou oukoku\":\"格闘王国\",\"kakuzato yun\":\"角砂糖ゆん\",\"kakyouin chiroru\":\"華京院ちろる\",\"kamado\":\"かまど\",\"kamata\":\"かまた\",\"kamatori pokari\":\"かまとりぽかり\",\"kame\":\"かめ\",\"kamehama takeshi\":\"亀浜たけし\",\"kamei\":\"仮名\",\"kamei kaori\":\"亀井香里\",\"kamekichi\":\"かめ吉\",\"kameponde\":\"カメポンデ\",\"kami\":\"kami\",\"kamimiya\":\"神宮\",\"kamidou haruki\":\"神堂ハルキ\",\"kamiishi nyny\":\"上石ニーニー\",\"kamiishi sono\":\"神石その\",\"kamikaze\":\"Kamikaze\",\"kamikaze miyabi\":\"神風雅\",\"kamimaki enpitsu\":\"紙巻エンピツ\",\"kaminaru fuyu\":\"神鳴る冬\",\"kamino ryu-ya\":\"上乃龙也\",\"kamio 96\":\"神尾96\",\"kamiryou kaduki\":\"上嶺榎月\",\"kamisae ryouya\":\"上冴良夜\",\"kamisato takeharu\":\"上里竹春\",\"kamishima akira\":\"剃嶋章\",\"kamishima tatsuya\":\"神嶋龍矢\",\"kamishima yu\":\"神島悠\",\"kamishiro midorimaru\":\"カミシロ緑マル\",\"kamisori\":\"かみそり\",\"kamita\":\"かみ田\",\"kamitou masaki\":\"上藤政樹\",\"kamitsuki shion\":\"神月紫苑\",\"kamiya karin sakurako\":\"神谷迦麟桜子\",\"kamiya naoya\":\"神谷尚哉\",\"kamiya ogawa\":\"神宮小川\",\"kamiya tomoe\":\"神谷ともえ\",\"kamiyama aya\":\"神山彩\",\"kamiyoshi\":\"神吉\",\"kamizaki yotsuba\":\"上崎よつば\",\"kamizawa reiji\":\"神沢零司\",\"kamizono\":\"かみぞの\",\"kamotama\":\"かもたま\",\"kamui aya\":\"神居あや\",\"kan\":\"環\",\"kan da chi\":\"かん(だ)ち\",\"kan koromoya\":\"寒衣屋\",\"kana\":\"カナ\",\"kanade sou\":\"奏奏\",\"kanae\":\"かなえ\",\"kanahito\":\"かなひと\",\"kanaisei jitenshasougyou\":\"家内制自転車操業\",\"kaname\":\"kaname\",\"kaname nagi\":\"かなめ\",\"kaname.\":\"かなめ。\",\"kanan asuka\":\"河南あすか\",\"kanano ayu\":\"奏乃あゆ\",\"kanaru\":\"かなる\",\"kanbayashi chico\":\"神林ちこ\",\"kanbayashi makoto\":\"上林眞\",\"kanbe\":\"kanbe\",\"kanchela\":\"Kanchela\",\"kanda\":\"神田\",\"kandagawa\":\"神田川\",\"kanduki kamibukuro\":\"環月紙袋\",\"kandume\":\"かんづめ\",\"kaneda asao\":\"金田麻生\",\"kaneda shotaro\":\"金田正太郎\",\"kanei yoh\":\"鐘井楊\",\"kaneko ako\":\"金子アコ\",\"kaneko rin\":\"金子鈴\",\"kaneneko\":\"カネ-ネコ\",\"kanesada keishi\":\"兼処敬士\",\"kaneta\":\"かねた\",\"kanetsuki masayoshi\":\"カネツキマサヨシ\",\"kangaechuu\":\"考え中\",\"kani\":\"かに\",\"kanibasami\":\"かにばさみ\",\"kanichiri\":\"かにちり\",\"kanie\":\"鹿贄\",\"kanif\":\"Kanif\",\"kanikama\":\"カニカマ\",\"kanikoro\":\"KANIKORO\",\"kanimaru\":\"かにまる\",\"kanimura ebio\":\"かに村えびお\",\"kanitaro\":\"かに太郎\",\"kanitoon\":\"蟹丹\",\"kanju\":\"kanju\",\"kanka\":\"カンカ\",\"kanko\":\"かんこ\",\"kanmimitsu\":\"甘味みつ\",\"kanmuri\":\"かんむり\",\"kanna asuke\":\"神無あすけ\",\"kanna satsuki\":\"神無さつき\",\"kanna tetsuboku\":\"かんな鉄木\",\"kannagi kyouichi\":\"巫杏壱\",\"kannatsuki noboru\":\"神奈月昇\",\"kannazuki akira\":\"神無月アキラ\",\"kannazuki motofumi\":\"神無月元史\",\"kannazuki sakyou\":\"神名月紗香\",\"kanno izuka\":\"かんのいずか\",\"kanno kei\":\"神乃啓\",\"kannon ouji\":\"観音王子\",\"kano\":\"カノ\",\"kanon\":\"花音\",\"kanosamu\":\"KANOSAMU\",\"kanri kokka semashi\":\"管理国家せまし\",\"kansuke\":\"カンスケ\",\"kantarou\":\"燗汰朗\",\"kantori\":\"かんとり\",\"kanu\":\"カヌ\",\"kanzaki gorou\":\"かんざき五郎\",\"kanzaki katsumi\":\"神崎かつみ\",\"kanzaki misora\":\"神崎美宙\",\"kanzaki shirou\":\"神崎四郎\",\"kao\":\"Kao\",\"kaori\":\"かおり\",\"kapa\":\"かぱ\",\"kapo\":\"カポ\",\"kappa\":\"かっぱ\",\"kappipe\":\"かっぴぺ\",\"kara\":\"から\",\"karaage muchio\":\"からあげむちお\",\"karaage-chan\":\"からあげチャン\",\"karakuri\":\"からくり\",\"karakuribee\":\"カラくりべえ\",\"karakuriusagi\":\"からくりうさぎ\",\"karamai\":\"空舞\",\"karasawa yonjuu\":\"唐沢四十\",\"karasu chan\":\"カラスちゃん\",\"karasuke d\":\"カラスケD\",\"karasuma amiru\":\"烏丸あみる\",\"karasuma nishiki\":\"からすま弐式\",\"karasuma pink\":\"烏丸ぴんく\",\"karasuma renya\":\"烏丸蓮耶\",\"karasumaru\":\"烏間ル\",\"karateka value\":\"カラテカ・バリュー\",\"karatekikku\":\"karatekikku\",\"karen kyuu\":\"華蓮きゅう\",\"kari\":\"かり\",\"kari paku\":\"かりぱく\",\"karin\":\"かりん\",\"karin akira\":\"花琳晶\",\"karitaka akira\":\"狩鷹明\",\"karo\":\"カロ\",\"karoti\":\"かろちー\",\"karucho\":\"カルチョ\",\"karukanko\":\"カルカン子\",\"karura jun\":\"迦楼羅淳\",\"karura syou\":\"華瑠羅翔\",\"karutamo\":\"かるたも\",\"kasai ema\":\"葛西えま\",\"kasaiya\":\"カサイ屋\",\"kasaran\":\"kasaran\",\"kashi\":\"華師\",\"kashiba toshizou\":\"樫葉歳三\",\"kashimi masao\":\"樫見正央\",\"kashipam\":\"仮死パン\",\"kashiwamochi june\":\"柏餅ジュン\",\"kashou uta\":\"嘉咲ウタ\",\"kasose\":\"風合瀬\",\"kasuga\":\"春日\",\"kasuga naoka\":\"春日直加\",\"kasuga sunao\":\"春日沙生\",\"kasuga tousen\":\"春日冬扇\",\"kasugai\":\"春日井\",\"kasukabe akira\":\"カスカベアキラ\",\"kasuki masato\":\"春日木雅人\",\"kasumi ryo\":\"かすみりょう\",\"kasumi\":\"カスミ\",\"kat\":\"KAT\",\"katagiri\":\"カタギリ\",\"katagiri atsuko\":\"かたぎりあつこ、牛乳リンダ\",\"katagiri chisato\":\"片桐ちさと\",\"katagiri hinoka\":\"片桐火華\",\"katakana\":\"カタカナ\",\"katakuri komeko\":\"片栗こめこ\",\"katakuri-ko\":\"片栗子\",\"katanbina\":\"かたんびな\",\"katari\":\"かたり\",\"katase yuu\":\"片瀬ゆう\",\"katatuka kouji\":\"片塚工司\",\"katazaki miki\":\"かたざきみき\",\"katita\":\"Katita\",\"kato cobayashi\":\"カトーコバヤシ\",\"kato sig\":\"加藤シグ\",\"katori youichi\":\"鹿取葉一\",\"katou\":\"加藤\",\"katou fuguo\":\"加藤フグオ\",\"katou kakashi\":\"かとうかかし\",\"katou koban\":\"加藤小判\",\"katou takaaki\":\"加藤天秋\",\"katou teppei\":\"加藤徹平\",\"katou tetsuya\":\"加糖哲哉\",\"katsudansou\":\"活断層\",\"katsuma rei\":\"かつまれい\",\"katsuo\":\"かつお\",\"katsura 24 gou\":\"桂24號\",\"katsuragi maya\":\"桂騎魔夜\",\"katsuragi you\":\"葛城ゆう\",\"katsuto\":\"かつと\",\"katte ni kappa\":\"勝手に河童\",\"katutoshi\":\"かつとし\",\"katuu\":\"KATUU\",\"katydid keeeta\":\"KATYDID KEEETA\",\"kauti\":\"かーうち\",\"kawa\":\"Kawa\",\"kawacchi hirohiro\":\"かわっちひろひろ\",\"kawachi izumi\":\"河内和泉\",\"kawachi yuki\":\"かわち雪\",\"kawada shougo\":\"かわだ章吾\",\"kawadu\":\"カワヅ\",\"kawagishi keitarou\":\"カワギシケイタロウ\",\"kawahara\":\"カワハラ\",\"kawahara shin\":\"かわはらしん\",\"kawai\":\"カワイ\",\"kawai kenji\":\"河合健司\",\"kawakami ioru\":\"川上イオル\",\"kawakami kou\":\"河上康\",\"kawakami takashi\":\"川上聖\",\"kawamoto hiroshi\":\"河本ひろし\",\"kawamoto yutsuki\":\"河本ゆつき\",\"kawamura tsukasa\":\"川邑司\",\"kawana\":\"かわな\",\"kawanakajima\":\"川中島\",\"kawanishi yuuji\":\"かわにしゆうじ\",\"kawano masatoshi\":\"川乃雅慧\",\"kawanuma uotsuri\":\"川沼魚釣\",\"kawase marimo\":\"川瀬まりも\",\"kawase seiki\":\"カワセセイキ\",\"kawasemi makiko\":\"かわせみまきこ\",\"kawatare\":\"かわたれ\",\"kawatsu kenjiro\":\"川津健二郎\",\"kawazu kento\":\"河津ケント\",\"kawazuko chouji\":\"蛙子丁字\",\"kaya\":\"加耶\",\"kaya rio\":\"夏谷リオ\",\"kayabanashi\":\"かやばなし\",\"kayako\":\"かやこ\",\"kayama harumizu\":\"加山春水\",\"kayama ikkaku\":\"加山一角\",\"kayanagi takahiro\":\"芽薙隆裕\",\"kayano\":\"茅乃\",\"kayanoyuki\":\"kayanoyuki\",\"kayura yuka\":\"かゆらゆか\",\"kaz\":\"kaz\",\"kazami aki\":\"風海聡\",\"kazami rei\":\"KAZAMI澪\",\"kazami ruk\":\"風見るく\",\"kazamik\":\"風見圭\",\"kazamitiu\":\"かざみちう\",\"kazasuzu\":\"風鈴\",\"kaze\":\"カゼ\",\"kazekawa nagi\":\"風川なぎ\",\"kazet\":\"かぜっと\",\"kazeya\":\"風夜\",\"kazu\":\"和\",\"kazuboh\":\"KAZUBOH\",\"kazuha\":\"kazuha\",\"kazuhito\":\"かづひと\",\"kazuki hiyori\":\"かずきひより\",\"kazuki kaho\":\"香月かほ\",\"kazuki yuu\":\"霞月由羽\",\"kazum\":\"kazum\",\"kazurasui\":\"かずらすい\",\"kazushi\":\"一志\",\"kazushirononko\":\"カズシロノンコ\",\"kazutaro\":\"かずたろ\",\"kazuto\":\"和斗\",\"kazuwo daisuke\":\"カズヲダイスケ\",\"kazuya\":\"カズヤ\",\"kcccc\":\"kcccc\",\"kebabuta\":\"けばブタ\",\"kedai no kokoro\":\"懈怠の心\",\"kedama\":\"けだま\",\"kei\":\"慧\",\"kei jiei\":\"けいじえい\",\"kei kei\":\"啓々\",\"kei natsu\":\"景夏\",\"matumoto kei\":\"松本痙\",\"keigen asuka\":\"蛍幻飛鳥\",\"keiji\":\"けいじ\",\"keijoh ayano\":\"圭条あやの\",\"keiki\":\"けーき\",\"keiko\":\"K子\",\"keimi\":\"けいみ\",\"keiryu\":\"keiryu\",\"keishiki\":\"系式\",\"keisuke\":\"Keisuke\",\"keita\":\"蛍汰\",\"keito\":\"圭斗\",\"keke\":\"ケケ\",\"kemoribbon\":\"けもりぼん\",\"kemukemuke\":\"けむけむけ\",\"kemushi\":\"けむし\",\"ken tatuki\":\"剣辰輝\",\"ken tsukikage\":\"ケン月影\",\"ken-sya\":\"ken-sya\",\"kenbouka\":\"KENBOUKA\",\"kenmochi ena\":\"剣持えな\",\"kenmomen\":\"けんもめん\",\"kenpi\":\"けんぴ\",\"kensuke\":\"拳介\",\"kent\":\"KENT\",\"kenta\":\"犬太\",\"kentarou\":\"けんたろう\",\"keny\":\"keny\",\"kenzi\":\"kenzi\",\"keoko\":\"けおこ\",\"keraton\":\"ケラトン\",\"kereno\":\"けれの\",\"keroko\":\"けろこ\",\"keso\":\"keso\",\"kesupu\":\"ケスープ\",\"ket\":\"KET\",\"keta\":\"ケタ\",\"ketama\":\"けたま\",\"ketarou\":\"毛太郎\",\"ketsudrum\":\"ケツドラム\",\"keuma\":\"希有马\",\"key\":\"きい\",\"keyneq\":\"きーねく\",\"kh\":\"KH\",\"ki equals yuu\":\"キ=ユウ\",\"ki-51\":\"ki-51\",\"kiasa\":\"kiasa\",\"kibimoca\":\"きびもか\",\"kicchan\":\"きっちゃん\",\"kichihachi\":\"きちはち\",\"kichijouji kitashirou\":\"吉祥寺北四郎\",\"kichiku hiroshi\":\"鬼畜広子\",\"kidmo\":\"Kidmo\",\"kidou muichi\":\"綺堂無一\",\"kidouchi kon\":\"木戸内紺\",\"kiduki erika\":\"季月えりか\",\"kieyza\":\"喜栄座\",\"kigetu miya\":\"キゲツミヤ\",\"kigisuke\":\"木々助\",\"kiguchi\":\"木口\",\"kihinata hiroki\":\"希日向ひろき\",\"kiiro\":\"きいろ\",\"kiiro kurumi\":\"きいろくるみ\",\"kijima hyougo\":\"鬼嶋兵伍\",\"kijinaka mahiro\":\"雉中真裕\",\"kijirushi\":\"キジルシ\",\"kika\":\"きか\",\"kiki\":\"kiki\",\"kiki ryu\":\"貴騎琉\",\"kikira\":\"ききら\",\"kikkawa kabao\":\"吉川かば夫\",\"kikkawa ryounei\":\"季川良寧\",\"kikuchi tsutomu\":\"キクチツトム\",\"kikuduki taro\":\"菊月太朗\",\"kikuichi monji\":\"菊一もんじ\",\"kikuno\":\"きくの\",\"kikusui\":\"菊水\",\"kikuta kouji\":\"菊田高次\",\"kilie\":\"切絵\",\"kiliu\":\"きぃう\",\"killcy\":\"きるし\",\"kim chii\":\"KIMちー\",\"kima azusa\":\"鬼魔あづさ\",\"kima-gray\":\"Kima-gray\",\"kimagu\":\"きまぐ\",\"kimakura\":\"きまくら\",\"kimarin\":\"きまりん\",\"kimi\":\"黄身\",\"kimidori\":\"きみどり\",\"kimidori iro\":\"樹碧唯旅\",\"kimino yume\":\"君乃遊女\",\"kimizuka aoi\":\"きみづか葵\",\"kimobusa-j\":\"KIMOBUSA-J\",\"kimotani\":\"胆谷\",\"kimoto kanata\":\"きもとかなた\",\"kimoto rai\":\"木本らい\",\"kimrin\":\"機夢倫\",\"kimura naoki\":\"樹村ナオキ\",\"kimuraya izumi\":\"木村屋いづみi\",\"kimuti\":\"きむち\",\"kimuti-g\":\"KIMUTI-G\",\"kinari\":\"きなり\",\"kinata\":\"葵奈太\",\"kinbakuman\":\"緊縛魔\",\"kindatsu\":\"きんだつ\",\"kine\":\"杵\",\"kingindou yumeji\":\"琴吟どう夢路\",\"kinka\":\"金夏\",\"kinkoumori\":\"きんこうもり\",\"kinniku shinkou\":\"筋肉信仰\",\"kinntarou\":\"kinntarou\",\"kino ayuri\":\"きのアユリ\",\"kinohara hikaru\":\"きのはらひかる\",\"kinoko\":\"Kinoko\",\"kinoko dake\":\"きのこダケ\",\"kinokuniya kanoko\":\"キノクニヤカノコ\",\"kinosaki yuki\":\"木ノ崎由貴\",\"kinoshita junichi\":\"きのした順市\",\"kinoshita shashinkan\":\"木下写真館\",\"kinouchi ai\":\"生之内あい\",\"kinryuu\":\"禽竜\",\"kinta\":\"金太\",\"kinta mawaru\":\"きんたまわる\",\"kintarou\":\"金たロウ\",\"kintoki\":\"公時\",\"kinuta kouji\":\"絹田コウジ\",\"kippow\":\"キッポウ\",\"kira boshi\":\"綺羅星\",\"kira maru\":\"綺羅丸\",\"kirara\":\"きらら\",\"kirara moe\":\"きらら萌\",\"kiri\":\"桐\",\"kirigakure takaya\":\"きりがくれたかや\",\"kirigirisu\":\"きりぎりす\",\"kirihara futaha\":\"桐原ふたは\",\"kirihara subako\":\"霧原すばこ\",\"kirii nao\":\"桐井ナオ\",\"kirikaze\":\"霧風\",\"kirikiriya\":\"きりきりや\",\"kirimia\":\"きりみあ\",\"kirimoro\":\"きりもろ\",\"kirin\":\"きりん\",\"kirin kakeru\":\"木鈴カケル\",\"kirino kyousuke\":\"桐野キョウスケ\",\"kiriri takanori\":\"霧李孝徳\",\"kirisaki akihito\":\"霧咲空人\",\"kirisaki mocori\":\"切裂モコリ\",\"kirisawa shinji\":\"桐沢しんじ\",\"kirisawa tokito\":\"きりさわときと\",\"kirise\":\"キリセ\",\"kirise mitsuru\":\"霧瀬ミツル\",\"kirishima fuuki\":\"霧島ふうき\",\"kirishima riona\":\"桐島りおな\",\"kirishima shiroo\":\"霧島シロー\",\"kiritachi\":\"キリタチ\",\"kiritomo koroha\":\"霧巴ころは\",\"kiriya\":\"霧也\",\"kiriyama machi\":\"桐山マチ\",\"kiriyama taichi\":\"キリヤマ太一\",\"kirome\":\"きろめ\",\"kirsi\":\"キルシー\",\"kiryuu makoto\":\"騎竜まこと\",\"kiryu masumi\":\"桐生真澄\",\"kiryuu mina\":\"霧生実奈\",\"kisa\":\"キサ\",\"kisaki\":\"后\",\"kisaki nana\":\"木崎七\",\"kisaki noah\":\"希咲のあ\",\"kisaki saki\":\"きさきさき\",\"kisamu\":\"キサム\",\"kisara ai\":\"きさら藍\",\"kisara shi-\":\"キサラしぃ\",\"kisaradu\":\"木更津\",\"kisaragi\":\"如月\",\"kisaragi kanata\":\"如月かなた\",\"kisaragi mizu\":\"如月水\",\"kisaragi mizuka\":\"如月瑞香\",\"kisaragi moyu\":\"如月モユ\",\"kisaragi neon\":\"如月ねおん\",\"kisaragi sara\":\"如月沙良\",\"kisaragi zwei\":\"如月ツヴァヰ\",\"kishi kaisei\":\"旗幟灰星\",\"kishi nisen\":\"騎士二千\",\"kishida mel\":\"岸田メル\",\"kishiguma toragorou\":\"岸熊虎五郎\",\"kishikino\":\"きしきの\",\"kishimasa\":\"きしまさ\",\"kishimoto daisuke\":\"岸本大介\",\"kishinosato satoshi\":\"岸里さとし\",\"kisia\":\"きしあ\",\"kisin juki\":\"姫心重機\",\"kisirian\":\"kisirian\",\"kisu yoshimitsu\":\"貴須ヨシミツ\",\"kisugi\":\"きすぎ\",\"kisunka\":\"kisunka\",\"kisyuu naoyuki\":\"紀州直行\",\"kitagawa kei\":\"きたがわけい\",\"kitagawa ryuu\":\"きたがわ竜\",\"kitakaze tsukasa\":\"北風つかさ\",\"kitamiya genbu\":\"北宮弦武\",\"kitamura hato\":\"北村鳩\",\"kitamura tooru\":\"きたむらとおる\",\"kitani ikari\":\"希谷一光\",\"kitani sai\":\"木谷さい\",\"kitao taki\":\"北尾タキ\",\"kitaohji guranosuke\":\"北大路倉之介\",\"kitatani uni\":\"北谷うに\",\"kitayori minami\":\"きたよりみなみ\",\"kitazato nawoki\":\"北里ナヲキ\",\"kitoen\":\"鬼頭えん\",\"kitoha\":\"きとは\",\"kitsune\":\"きつね\",\"kitsune tsuki\":\"狐憑き\",\"kitsuneko anko\":\"狐古あんこ\",\"kitto shibaru\":\"吉都しばる\",\"kitty\":\"キ帝ィ\",\"kiu\":\"希憂\",\"kiwa\":\"きわ\",\"kiwata\":\"木綿\",\"kiyama shiro\":\"キヤマシロ\",\"kiyan\":\"喜屋武\",\"kiyo mori\":\"紀世盛\",\"kiyokiba miyo\":\"清木場みよ\",\"kizaki\":\"キザキ\",\"kizaru\":\"黄猿\",\"kizoku\":\"貴族\",\"kkyz13\":\"Kkyz13\",\"km\":\"KM\",\"kni-droid\":\"Kにぃー\",\"knight\":\"ナイト\",\"knsk\":\"knsk\",\"ko\":\"ko\",\"ko tora\":\"小虎\",\"ko-ri azuki\":\"氷あずき\",\"ko.darts\":\"ko.darts\",\"koala\":\"こあら\",\"kobaji\":\"こばじ\",\"kobako\":\"KOBAKO\",\"kobanya koban\":\"孤蛮屋こばん\",\"kobayashi hiyoko\":\"こばやしひよこ\",\"kobayashi masakazu\":\"小林正和\",\"kobayashi tetsuya\":\"コバヤシテツヤ\",\"kobenza\":\"コベンザ\",\"kobiyuun\":\"こびゆうん\",\"kobucha\":\"昆布茶\",\"kobuta no shinai\":\"こぶたのしない\",\"koda masanov\":\"コダマサノブ\",\"kodai heiki\":\"古代兵器\",\"kodamashi\":\"kodamashi\",\"kodeida\":\"こでぃだ\",\"kodou\":\"コドウ\",\"kodou kuji\":\"巨道空二\",\"kodukue\":\"こづくえ\",\"koe\":\"声\",\"koga chiharu\":\"古蛾千春\",\"koga rejini\":\"古賀れじに\",\"koga yoshihisa\":\"胡河義久\",\"kogakunama itohiro\":\"こがくなまイトヒロ\",\"koganemushi\":\"こがねむし\",\"kogawa masayoshi\":\"こがわまさよし\",\"niiyama takashi\":\"古川やすし\",\"koge neko\":\"こげねこ\",\"kogma pierre\":\"こぐまピエール\",\"koguma no joey\":\"こぐまのジョーイ\",\"koguro masami\":\"小黒正巳\",\"kohachi\":\"こはち\",\"kohaku q\":\"こはくQ\",\"koharu\":\"小春\",\"koharuko\":\"こはるこ\",\"kohinata ryou\":\"小日向 諒\",\"kohitsuji\":\"こひつじ\",\"kohri ms\":\"こおりみず\",\"koike sadaji\":\"小池定路\",\"koishikawa\":\"小石川\",\"koishikawa hibiki\":\"小石川響\",\"kojika\":\"こじか\",\"kojima\":\"kojima\",\"kojima aya\":\"こじまあや\",\"kojima shoutarou\":\"小島祥太朗\",\"kojiro izuta\":\"神代イヅタ\",\"kojou\":\"kojou\",\"koke\":\"こけ\",\"koken\":\"こけん\",\"kokeshi men\":\"こけし☆メン\",\"kokiri\":\"コキリ\",\"kokka\":\"こっか\",\"koko\":\"呱呱\",\"kokonoe yomogi\":\"ここのえ蓬\",\"kokonoka\":\"ここのか\",\"kokori\":\"ここり\",\"kokujin\":\"黒人\",\"kokumaro\":\"こくまろ\",\"kokuu rikishi\":\"虚空力士\",\"kolgha\":\"コルガー\",\"kom\":\"Kom\",\"koma\":\"KOMA\",\"komac\":\"鼓膜\",\"komagata\":\"狛形\",\"komaki ren\":\"小巻恋\",\"komaki tamotsu\":\"小牧保\",\"komakichi\":\"こまきち\",\"komame\":\"こまめ\",\"komamemaru\":\"こまめ丸\",\"komano mako\":\"狛野まこ\",\"komaru\":\"こまる\",\"kome\":\"こめ\",\"kome dorobou\":\"米泥棒\",\"kome tsubu\":\"こめつぶ\",\"komechu\":\"こめちゅー\",\"komeko\":\"komeko\",\"kometanuki\":\"米たぬき\",\"komichi\":\"こみち\",\"komihisa\":\"こみひさ\",\"kominato takuya\":\"小湊拓也\",\"komon\":\"コモン\",\"komori kaeru\":\"小森かえる\",\"komori kiyoka\":\"小森キヨカ\",\"komotoda emai\":\"小本田絵舞\",\"komugi\":\"こむぎ\",\"komura keita\":\"こむらけいた\",\"komura saki\":\"小邑紗希\",\"komuro\":\"コムロ\",\"komusou\":\"こむそう\",\"kona\":\"KONA\",\"kona matsu\":\"粉末\",\"konako\":\"こなこ\",\"konata gazel\":\"此方がぜる\",\"konayama kata\":\"粉山カタ\",\"konboi\":\"KONBOI\",\"kondom\":\"昆童虫\",\"konecha\":\"こね茶\",\"konkon\":\"KON-KON\",\"konmori\":\"こんもり\",\"konno chikata\":\"紺野チカ太\",\"konnyaku yukko\":\"蒟蒻ゆっこ\",\"kono\":\"河野\",\"konode minoru\":\"このでみのる\",\"konoi iko\":\"木井いこ\",\"konoma waho\":\"このま和歩\",\"konshin\":\"魂神\",\"konsome\":\"コンソメ\",\"koohii inu\":\"珈琲犬\",\"koorogi\":\"コオロギ\",\"koppamu\":\"こっぱむ\",\"korikku\":\"コリック\",\"korikori takeya\":\"こりこりタケヤ\",\"korisei\":\"孤裡精\",\"korisu\":\"こりす\",\"koro\":\"ころ\",\"koromia\":\"ころみあ\",\"koromo\":\"衣\",\"korone shousa\":\"コロね少佐\",\"korotasuke\":\"コロ太助\",\"korotsuke\":\"コロツケ\",\"koruri\":\"こるり\",\"koryu misato\":\"湖竜美里\",\"kosa\":\"こさ\",\"kosakai\":\"kosakai\",\"koshika rina\":\"小鹿りな\",\"koshimura\":\"越村\",\"kosuge yuutarou\":\"小菅勇太郎\",\"kosugi koutarou\":\"小杉光太郎\",\"kosuke\":\"小助\",\"kosuzu\":\"小鈴\",\"kota\":\"耕太 | コタ | こた(炬太郎) | kota´\",\"kotaru\":\"瑚樽\",\"kotatsu\":\"虎龍(小龍)\",\"kotatsu tomodachi\":\"コタツトモダチ\",\"koto\":\"koto\",\"kotobuki\":\"kotobuki\",\"kotobuki hajime\":\"ことぶきはじめ\",\"kotobuki maimu\":\"ことぶきまいむ\",\"kotobuki ringo\":\"寿りんご\",\"kotobuki utage\":\"寿宴\",\"kotoduki z\":\"琴月絶人\",\"kotoeri iroha\":\"ことえりいろは\",\"kotogi raura\":\"虎兎木蘭浦\",\"kotojima motoki\":\"琴島もとき\",\"kotomuke fuurin\":\"平国風鈴\",\"kotono wakako\":\"琴の若子\",\"kotori aiko\":\"コトリアイコ\",\"kotou ichigou\":\"小嶌一豪\",\"kotowari\":\"理\",\"kotsumudi\":\"こつむぢ\",\"kou\":\"孝\",\"kou1\":\"こう1\",\"kouba\":\"こうば\",\"kouduki miyabi\":\"神月みやび\",\"koudzuki shinobu\":\"たまご\",\"kouenji marimo\":\"高円寺まりも\",\"kouenji rei\":\"紅園寺麗\",\"kougami\":\"鴻上\",\"kougi\":\"KOUGI\",\"kouguchi moto\":\"工口本\",\"kouhaku\":\"紅白\",\"kouma hidehito\":\"慌麻秀仁\",\"koume satsuki\":\"小梅さつき\",\"koumorikaizin\":\"こうもり貝人\",\"koumoto nami\":\"河本那美\",\"kouno kei\":\"光野けい\",\"kouno mai\":\"香野舞\",\"kouno mizuho\":\"紅野瑞穂\",\"kouno you\":\"河野曜\",\"kounose akara\":\"神瀬あから\",\"kounosu\":\"こうのす\",\"kousaka donten\":\"高坂曇天\",\"kousaki\":\"光崎\",\"kou siryou\":\"黄支亮\",\"kousoku\":\"光燭\",\"koutarosu\":\"コウタロス\",\"koutei\":\"皇帝\",\"koutei penko\":\"校庭ぺん子\",\"kouyou sakaki\":\"后謡榊\",\"kouzaka kouhei\":\"神坂公平\",\"koyama ichi\":\"こやまいち\",\"koyama tomosato\":\"こやまともさと\",\"koyama unkaku\":\"小山雲鶴\",\"koyasu kazu\":\"子安和\",\"koyomisa\":\"こよみさ\",\"kozakura botan\":\"小桜ぼたん\",\"kozakura ryou\":\"小桜りょう\",\"kozara\":\"小皿\",\"kozi\":\"kozi\",\"kozirow\":\"Kozirow\",\"kozou\":\"小僧\",\"kozue akari\":\"こずえあかり\",\"kozy\":\"kozy\",\"krohudeanna\":\"黒筆ANnA\",\"ksg\":\"ksg\",\"ksheera\":\"ksheera\",\"kso\":\"けそ\",\"kswazza\":\"くすわZZA\",\"kty\":\"KTY\",\"ktzw\":\"ktzw\",\"ku-ba\":\"ku-ba\",\"kubota chihiro\":\"久保田チヒロ\",\"kubyou azami\":\"九猫あざみ\",\"kudou\":\"クドウ\",\"kudou shino\":\"工藤詩乃\",\"kudou taizou\":\"工藤大蔵\",\"kuga mingo\":\"久我みんご\",\"kugayama hodai\":\"久我山砲台\",\"kugelschreiber\":\"くーげるしゅれいばー\",\"kujira sanbiki\":\"くじら三匹\",\"kujiran\":\"くぢらん\",\"kujou shirei\":\"九条志玲\",\"kuju shikuro\":\"苦渋しくろ\",\"kukuru\":\"KKR\",\"kuloamaki\":\"黒天姫\",\"kuma\":\"くま\",\"kumacchi\":\"くまっち\",\"kumada kazushi\":\"熊田一司\",\"kumagai hachi\":\"くまがいはち\",\"kumagaya nerico\":\"熊谷ネリコ\",\"kumagaya shin\":\"熊谷しん\",\"kumaki toshikazu\":\"熊木十志和\",\"kumakichi\":\"熊吉\",\"kumano kotaro\":\"くまのこたろ\",\"kumao\":\"く魔王\",\"kumasaku tamizou\":\"クマ作民三\",\"kumashiro\":\"くましろ\",\"kumatora tatsumi\":\"熊虎たつみ\",\"kumatyu\":\"クマチュウ\",\"kumicho\":\"くみちょー\",\"kumimon\":\"kumimon\",\"kumisan\":\"くみさん\",\"kumoi takashi\":\"菅野タカシ\",\"kunaboto\":\"クナボト\",\"kuni\":\"クニ\",\"kunifuto\":\"くにふと\",\"kunoichi\":\"くノ壱\",\"kawahara reki\":\"川原砾\",\"kuonji hodaka\":\"久遠路火鷹\",\"kupala\":\"Kupala\",\"kura oh\":\"蔵王\",\"kurabayashi\":\"倉林\",\"kurada\":\"蔵田\",\"kuragari\":\"くらがり\",\"kuragi\":\"蔵儀\",\"kuraki hiro\":\"椋木尋\",\"kurakino issiki\":\"椋木野一式\",\"kurakumo nue\":\"黒雲鵺\",\"kuramachi bun\":\"蔵街ぶん\",\"kurami\":\"蔵見\",\"kuramoto keizou\":\"蔵本鶏蔵\",\"kurano yuuichi\":\"倉野ユウイチ\",\"kuraoka aki\":\"倉岡亜妃\",\"kurasaki aya\":\"倉崎あや\",\"kurasawa kyosyo\":\"倉澤京章\",\"kurata ichiro\":\"倉田いち朗\",\"kurata muto\":\"倉田むと\",\"kurata shinji\":\"倉田シンジ\",\"kuratsuka riko\":\"倉塚りこ\",\"kuraya\":\"蔵屋\",\"kure\":\"くれ\",\"kure ichirou\":\"くれいちろう\",\"kure shikure\":\"久澪しくれ\",\"kureha mitsushige\":\"自遊本舗「宇」\",\"kureha yosho\":\"くれは洋書\",\"kurei daisuke\":\"暮井大助\",\"kurenami yuuji\":\"暮浪夕時\",\"kuresato yoshiaki\":\"暮里良昭\",\"kureta fumiaki\":\"呉田文明\",\"kureura keita\":\"暮浦鶏太\",\"kuri\":\"栗\",\"kurikama\":\"くりかま\",\"kuriki\":\"kuriki\",\"kurisu\":\"くりす\",\"chris tina\":\"栗栖ティナ\",\"kuro\":\"KURO\",\"kuro hiyoko\":\"黒ひよこ\",\"kuro itachi\":\"黒イタチ\",\"kuro koshou\":\"黒胡椒\",\"kuro oolong\":\"黒烏龍\",\"kuro tengu\":\"黒てんぐ\",\"kuro yorozu\":\"くろよろず\",\"kuroama\":\"黒甘\",\"kuroarama soukai\":\"黒荒馬双海\",\"kurocastle\":\"黒城\",\"kurocazenosora\":\"黒風ノ空\",\"kuroda\":\"黒田\",\"kuroda akimi\":\"黒田晶見\",\"kurodou katana\":\"黒堂カタナ\",\"kurogane\":\"くろがね\",\"kurogane riku\":\"鐵陸\",\"kurogane satsuki\":\"黒金さつき\",\"kuroha nue\":\"クロハぬえ\",\"kuroha rapid\":\"黒羽ラピッド\",\"kurohagane\":\"クロハガネ\",\"kurohekiten\":\"黒碧天\",\"kuroi inu\":\"黒い犬\",\"kuroi kingyo\":\"黒井きんぎょ\",\"kuroi moyamoya\":\"黒井もやもや\",\"kuroichiba\":\"くろいちば\",\"kuroie\":\"黒家\",\"kuroihi\":\"くろいひ\",\"kuroinu\":\"くろ犬\",\"kurokari nigou\":\"黒狩弐号\",\"kurokawa girito\":\"黒川ギリト\",\"kurokawa izumi\":\"黒川 IZUMI\",\"kurokawa juso\":\"黒川呪詛\",\"kurokawa rikuu\":\"黒川律空\",\"kurokawa ryu\":\"黒川竜\",\"kurokawa tasuku\":\"黒川たすく\",\"kurokaze hanare\":\"黒風離零\",\"kuroki bicoco\":\"黒木ビココ\",\"kuroki masahiro\":\"黒木雅弘\",\"kurokishi\":\"黒騎士\",\"kuroko\":\"クロ子\",\"kurokura eri\":\"黒倉エリ\",\"kurokuro\":\"くろくろ\",\"kurokuroku\":\"黒九六\",\"kuromame\":\"クロマメ\",\"kuromame mugicha\":\"黑豆麦茶\",\"kuromi\":\"kuromi\",\"kuromitu\":\"kuromitu\",\"kuromiya sakana\":\"黒宮魚\",\"kuromogu\":\"黒モグ\",\"kuromoinu no kemono\":\"黒藻犬の獣\",\"kurona\":\"くろな\",\"kuroneko nigou\":\"黒猫弐号\",\"kuroneko reigou\":\"黒猫零号\",\"kuronezumi\":\"くろねズみ\",\"kurono masakado\":\"黒乃マサカド\",\"kurono rokurou\":\"黒野六郎\",\"kuroore\":\"黒俺\",\"kurosai\":\"黒齋\",\"kurosaki bunta\":\"黒崎文太\",\"kurosaki kotora\":\"黒崎仔虎\",\"kurosaki mairi\":\"黒崎まいり\",\"kurosaki yuuri\":\"黒崎 百利\",\"kurosawa\":\"クロサワ\",\"kurosawa shouhei\":\"黒沢庄平\",\"kuroshiki\":\"玄式\",\"kurosirogurei\":\"黒白ぐれい\",\"kurosu\":\"黒須\",\"kurosuke\":\"黒すけ\",\"kurota\":\"くろた\",\"kurota nichiru\":\"黒田にちる\",\"kurotama\":\"くろたま\",\"kuroto\":\"黑斗\",\"kurotsuki\":\"黑月\",\"kurotsuki kyouto\":\"黒月京都\",\"kurouku\":\"くろーく\",\"kuroya kenji\":\"黒谷賢志\",\"kuroyume naoto\":\"黒夢奈音\",\"kurozako\":\"くろざこ\",\"kurukuru\":\"クルクル\",\"kuruma\":\"くるま\",\"kurumai\":\"くるまい\",\"kurumi moka\":\"胡桃もか\",\"kurumi riko\":\"胡桃りこ\",\"kurushima\":\"くるしま\",\"kurusu kanon\":\"来栖かのん\",\"kurutsuki\":\"KURUTSUKI\",\"kuruwa aki\":\"くるわ亜希\",\"kusabi keri\":\"楔ケリ\",\"kusahara kuuki\":\"草原空貴\",\"kusairo kaede\":\"草色楓\",\"kusaka maichi\":\"駆坂真一\",\"kusakabe tsukasa\":\"日下部つかさ\",\"kusakami akira\":\"草上明\",\"kusanagi ryuuiti\":\"草薙龍一\",\"kusanagi tonbo\":\"草凪蜻蛉\",\"kusano houki\":\"草野ほうき\",\"kusano tsuyuri\":\"草野つゆり\",\"kushida ashura\":\"くしだあしゅら\",\"kushikatsu koumei\":\"串カツ孔明\",\"kushinada iruwe\":\"櫛灘ゐるゑ\",\"kusnoha kaede\":\"くすのは楓\",\"kusugano\":\"我野\",\"kusunoki hina\":\"楠木ひな\",\"kusunoki rin\":\"楠木りん\",\"kusurin\":\"くすりん\",\"kutsugen kanna\":\"屈原神無\",\"kuurin\":\"空輪\",\"kuusou\":\"空想\",\"kuuya\":\"空也\",\"kuwabara\":\"くわばら\",\"kuwabatake kajuen\":\"桑畑果樹園\",\"kuzirazio\":\"くじらジオ\",\"kuzu\":\"屑\",\"kuzukow\":\"屑コウ\",\"kuzuya\":\"くずや\",\"kuzuyama mememe\":\"屑山めめめ\",\"kuzuyu\":\"葛湯\",\"kuzzy\":\"くっじー\",\"ky.\":\"ky.\",\"kyanite\":\"Kyanite\",\"kyantama\":\"きゃんたま\",\"kyantaman\":\"きゃんたマン\",\"kyarine\":\"きゃりね\",\"kyawashuku\":\"きゃわしゅく\",\"kyohei\":\"KYOHEI\",\"kyokkai\":\"曲解\",\"kyoko\":\"響胡\",\"kyokugeiteki jiisha\":\"曲芸的自慰者\",\"kyokutyo\":\"kyokutyo\",\"kyolnov\":\"キョルノフ\",\"kyoro\":\"きょろ\",\"kyosu\":\"キョス\",\"kyou\":\"kyou\",\"kyou konogoro\":\"kyouこの頃\",\"kyouan\":\"狭暗\",\"kyouka\":\"狂華\",\"kyouno aki\":\"京野秋\",\"kyouta\":\"きょう太\",\"kyouyuu kei\":\"叫遊佳\",\"kyuri\":\"kyuri\",\"kyusui\":\"吸水\",\"kyuun\":\"きゅうん\",\"kyuunosuke\":\"きゅうのすけ\",\"kyuuri\":\"kyuuri\",\"kyuuryuujousai\":\"九龍城砦\",\"kyuusho tarou\":\"急所太郎\",\"kyuushoku\":\"給食\",\"l apple\":\"Lアップル\",\"l-road\":\"エルロード\",\"l-s\":\"L-S\",\"la-men\":\"LA-MEN\",\"lact mangan\":\"楽人満願\",\"lakuhito\":\"lakuhito\",\"lamb\":\"Lamb\",\"lamcha\":\"ラム茶\",\"langerhans\":\"ランゲルハンス\",\"lantana\":\"ランタナ\",\"laomeng\":\"LaoMeng\",\"lapiness\":\"lapiness\",\"larua\":\"ラルア\",\"laserflip\":\"Laserflip\",\"lassie\":\"らっしー\",\"laut 2-sei\":\"ラウト2世\",\"lay dragon\":\"零龍\",\"lazu\":\"Lazu\",\"lazuli\":\"らずり\",\"lbl\":\"LBL\",\"leaf\":\"Leaf\",\"leafy\":\"リーフィ\",\"lee\":\"LEE\",\"lefleau\":\"ルフレ王\",\"lefthand\":\"レフトハンド\",\"leli\":\"レリ\",\"lem\":\"LEM\",\"lemon jiru\":\"レモン汁\",\"lena a-7\":\"LENA[A-7]\",\"lento\":\"蓮斗\",\"leonardo\":\"れオナるド\",\"leonat\":\"レオナト\",\"leopard\":\"レオパルド\",\"leopon\":\"れおぽん\",\"level.21\":\"Level.21\",\"lew\":\"レゥ\",\"lewis\":\"ルイス\",\"lewis mclaren\":\"るいす・まくられん\",\"leymei\":\"LEYMEI\",\"liang xing\":\"狼星\",\"libonzu\":\"吉啓\",\"lielos\":\"ゆいれそ\",\"lien\":\"Lien\",\"like\":\"Like\",\"lilish\":\"lilish\",\"lime\":\"Lime\",\"lina\":\"Lina\",\"lionel\":\"ライオネル\",\"littlemare\":\"リトルメア\",\"liveis watanabe\":\"リーバイス渡辺\",\"llm\":\"LLM\",\"locon\":\"locon\",\"locos\":\"ろこす\",\"lod\":\"Lod\",\"logie\":\"路地\",\"lolee\":\"炉LEE\",\"loliconder\":\"ロリコンダー\",\"lolie\":\"ろりえ\",\"lolimoyashi\":\"ろりもやし\",\"lond\":\"ろんど\",\"lopez hakkinen\":\"ロペス・ハッキネン\",\"loriko\":\"Loriko\",\"lowhide\":\"ろーはいど\",\"luchi\":\"ルーチ\",\"lucie\":\"ルーシー\",\"luck\":\"らっく\",\"lucknight\":\"Lucknight\",\"luka\":\"ルカ\",\"luku\":\"る～く\",\"lummy\":\"Lummy\",\"lumper sheider\":\"LumperSheider\",\"luphis\":\"luphis\",\"lutein\":\"Lutein\",\"luu\":\"Luu\",\"lux\":\"Lux\",\"lvi\":\"LVI\",\"m\":\"M\",\"m-max\":\"M-MAX\",\"m2go\":\"M2号\",\"m9kndi\":\"m9kndi\",\"ma-yu\":\"ma-yu\",\"mabo\":\"マボ\",\"maboku\":\"魔ボク\",\"mabuchoko m\":\"マブチョコ M\",\"mac-v\":\"MAC-V\",\"macanoka\":\"マカノカ\",\"macaroni\":\"まかろに\",\"maccha\":\"抹茶\",\"maccha chamomo\":\"抹茶ちゃもも\",\"maccha neji\":\"抹茶ねじ\",\"maccha vanilla\":\"抹茶バニラ\",\"macchaume\":\"抹茶梅\",\"macchi\":\"まっち\",\"macchuu\":\"まっちゅう\",\"machi\":\"マチ\",\"machi gaita\":\"街凱太\",\"machi machiko\":\"町マチコ\",\"machigi ruru\":\"街樹るる\",\"machimura komori\":\"町村こもり\",\"machine head\":\"Machine Head\",\"machino henmaru\":\"町野変丸\",\"macho.\":\"マッチョ。\",\"maclo\":\"まっ黒\",\"macop\":\"Macop\",\"madae thor\":\"未江達\",\"madara\":\"まだら\",\"madara sai\":\"まだらさい\",\"mado\":\"まど\",\"madohan\":\"まどはん\",\"madoka hifumi\":\"まどかひふみ\",\"mae\":\"前\",\"maeda\":\"まえだ\",\"maeda momo\":\"まえだもも\",\"maeguchi syunzou\":\"前口俊三\",\"maekawa hayato\":\"前川ハヤト\",\"mag\":\"MAG\",\"mage\":\"mage\",\"magic xiang\":\"Magic_Xiang\",\"magiko\":\"マギコ\",\"magokoro kurage\":\"まごころくらげ\",\"magorona\":\"まごろな\",\"magpoppo\":\"まぐぽっぽ\",\"magtan\":\"まぐたん\",\"magu\":\"マグ\",\"maguro ouji\":\"真黒皇子\",\"maguro taishi\":\"マグロ大使\",\"mahan.\":\"まはん。\",\"mahimaru\":\"まひまる\",\"mahiruno kagerou\":\"まひるの影郎\",\"maho\":\"真秀\",\"mahouya\":\"魔法屋\",\"mai\":\"MAI\",\"myrage\":\"舞麗辞\",\"mai renjie\":\"麥人杰\",\"maihara\":\"まいはら\",\"maihime\":\"舞姫\",\"maino\":\"マイノ\",\"maino umi\":\"まいのうみ\",\"maitake\":\"まいたけ\",\"maji\":\"マジ\",\"majiyoko\":\"まじよこ\",\"maka kiseki\":\"マカキセキ\",\"makano mucchi\":\"摩訶乃ムッチ\",\"makarou\":\"まかろー\",\"suta furachina\":\"スター不埒な＠まかそに\",\"make\":\"make\",\"makedon\":\"まけどん\",\"maki\":\"まき\",\"maki katsuya\":\"勝生真菜美\",\"maki miyuki\":\"牧美雪\",\"maki morun\":\"槙モルン\",\"makiavery\":\"牧亜べりぃ\",\"makigai ikko\":\"巻貝一ヶ\",\"makimaru\":\"巻丸\",\"makinaru\":\"まきなる\",\"makinon tm\":\"まきのんTM\",\"makinosaka shinichi\":\"牧野坂シンイチ\",\"makirin\":\"まきリン\",\"makishi miya\":\"槇志未夜\",\"makita aoi\":\"魔北葵\",\"makita miki\":\"蒔田ミキ\",\"makka\":\"makka\",\"makka na kedamono\":\"真っ赤なケダモノ\",\"makko reader\":\"maッコ・リーダー\",\"makkuro\":\"まっ黒\",\"makomo ashino\":\"まこも葦乃\",\"makoni\":\"makoni\",\"makoto daikichi\":\"まこと大吉\",\"makoushi\":\"魔公子\",\"makpower\":\"Makpower\",\"makui\":\"幕井\",\"makuma ikeru\":\"マ熊イケル\",\"makunouchi\":\"幕野内\",\"makunouchi isami\":\"幕の内勇\",\"makura cover\":\"枕河馬亜\",\"makura no doushi\":\"まくらの同士\",\"makuwa\":\"ま・くわ\",\"malaia\":\"マライぁ\",\"malino\":\"MALINO\",\"maluball\":\"毛玉丸\",\"mam melon\":\"まむめろん\",\"mamaka\":\"麻々花\",\"mame\":\"豆\",\"mame-p\":\"まめP\",\"mamedanuki\":\"まめだぬき\",\"mami\":\"まみ\",\"mamiya\":\"マミヤ\",\"mamiya noriko\":\"間宮法子\",\"mamiya poko\":\"まみやぽこ\",\"mamiya shouko\":\"間宮庄子\",\"mamo\":\"MAMO\",\"mamoi\":\"まもぃ\",\"mamono karin\":\"まものかりん\",\"mamoribito\":\"守り人\",\"mamuru\":\"mamuru\",\"man\":\"mAn\",\"manabe jouji\":\"真鍋譲治\",\"manaka mizuki\":\"マナカミズキ\",\"manao\":\"まなお\",\"manarou\":\"まなろう\",\"manatsu roco\":\"真夏ろこ\",\"manboren\":\"まんぼん練\",\"mance\":\"まんす\",\"manekineko\":\"マネキ猫\",\"mangetsu pon\":\"満月ポン\",\"mangosteen\":\"マンゴスチン\",\"manjiro\":\"まんじろー\",\"manjuurou\":\"まんじゅうろう\",\"manle\":\"マンル\",\"manmosu marimo\":\"マンモスまりも\",\"mao\":\"真尾\",\"mao fabao\":\"猫法宝\",\"mao no\":\"MAOの\",\"maomi leon\":\"真臣レオン\",\"map\":\"まっぷ\",\"maple-go\":\"maple号\",\"mappa\":\"まっぱ\",\"mapputatsu\":\"マップタツ\",\"marble\":\"マーブル\",\"mare halberd eye\":\"メアー・ハルベルト・アイ\",\"mareo\":\"まれお\",\"margamoid\":\"まーがもいど\",\"maria\":\"まりあ\",\"marianne hanako\":\"マリアンヌ花子\",\"marika\":\"まりか\",\"marimo\":\"マリモ\",\"marin\":\"まりる\",\"marinade vinegar\":\"マリネ・ビネガー\",\"mario kaneda\":\"まりお金田\",\"maripyon\":\"まりぴょん\",\"maririn\":\"まりりん\",\"maririn anaka\":\"マリリンあなか\",\"marlin\":\"まーりん\",\"marron\":\"魔龍\",\"martan\":\"まあたん\",\"maru\":\"マル\",\"maru dasshu\":\"まるだっしゅ\",\"maru mary\":\"墨丸まり\",\"maru mikan\":\"○蜜柑\",\"maru sun\":\"まるサン\",\"maru.\":\"まる。\",\"marubayashi shumaru\":\"○林修○\",\"marugoto ringo\":\"まるごと林檎\",\"maruhage p\":\"丸禿P\",\"marui\":\"まるい\",\"marui ryuu\":\"まるいりゅう\",\"marukidou\":\"まるキ堂\",\"marukome\":\"まるこめ\",\"maruma\":\"まるま\",\"marumarusuke\":\"まる丸介\",\"marumi\":\"丸美\",\"marumu\":\"まるむ\",\"maruna\":\"まるな\",\"marunosuke\":\"まるのすけ\",\"marupuni\":\"まるぷに\",\"marurou\":\"まるろう\",\"marurumi\":\"まるるみ\",\"maruto\":\"Maruto!\",\"maruyama kaori\":\"まるやま香里\",\"maruyama kei\":\"丸山圭\",\"masa\":\"将\",\"masa-nii\":\"マサ兄\",\"masaki\":\"MASAKI\",\"masaki shisari\":\"真咲シサリ\",\"masakichi\":\"まさきち\",\"masama\":\"まさma\",\"masamu\":\"マサムー\",\"masanaga\":\"政长\",\"masara\":\"まさら\",\"masaya ichika\":\"磨鞘一佳\",\"masayoshi tomoko\":\"まさよしともこ\",\"masbe akyto\":\"まそべ晶磨\",\"masha\":\"masha\",\"mashikodori\":\"ましこどり\",\"mashiro\":\"ましろ\",\"mashitaka\":\"ましたか\",\"mashu maro\":\"真朱麻呂\",\"mashune\":\"MASHUNE\",\"mask the j\":\"マスクザJ\",\"massan\":\"まっさん\",\"masuda tsuyoshi\":\"増田剛\",\"masuishi kinoto\":\"桝石きのと\",\"masujima kensue\":\"ますじまけんすー\",\"masumasu\":\"ますます\",\"masurao\":\"ますらお\",\"matashita kintama\":\"股下金珠\",\"matatabi\":\"またたび\",\"match\":\"マッチ\",\"matetsu\":\"まてつ\",\"mato\":\"まと\",\"matoba\":\"的場\",\"maton\":\"マトン\",\"matou\":\"まとう\",\"matra-mica\":\"MATRA-MICA\",\"matrix one\":\"ロジャー・マンゴー\",\"matsubara kanabun\":\"松原かなぶん\",\"matsubayashi nagana\":\"松林ながな\",\"matsubayashi satoru\":\"松林悟\",\"matsuda eine\":\"松田えいね\",\"matsue\":\"まつえー\",\"matsuka\":\"松果\",\"matsukura nemu\":\"松倉ねむ\",\"matsumoto akira\":\"松本英\",\"matsumoto himiko\":\"松本姫美子\",\"matsumoto inaki\":\"松本いなき\",\"matsumoto katsuya\":\"まつもとかつや\",\"matsumoto mimiko\":\"松本耳子\",\"matsumoto mitohi.\":\"松本ミトヒ。\",\"matsunaga garana\":\"松永がらな\",\"matsunaga hijiri\":\"松永ヒジリ\",\"matsunoan\":\"松之庵\",\"matsuo\":\"松雄\",\"matsuri\":\"まつり\",\"matsuri miko\":\"まつりみこ\",\"matsurino naginata\":\"祭野薙刀\",\"matsurioka hideyuki\":\"祭丘ヒデユキ\",\"matsushima namio\":\"松島ナオミ\",\"matsuyama hayate\":\"松山はやて\",\"matsuyama seiji\":\"松山せいじ\",\"matsuyoshi ako\":\"松吉アコ\",\"matsuyuki kabun\":\"松足嘉分\",\"matsuzaka reia\":\"まつざかれいあ\",\"matsuzono\":\"松園\",\"matui you\":\"末井夕\",\"maverick\":\"まーべりっく\",\"mawaru\":\"きんたまわる\",\"may\":\"MAY\",\"maya gorou\":\"まゃ～吾郎\",\"maya temple\":\"真夜テンプル\",\"mayag\":\"MayaG\",\"mayama haruji\":\"真山春二\",\"mayamura aki\":\"真矢村明\",\"mayao\":\"まやお\",\"mayashinya\":\"真夜真夜\",\"maybe\":\"めいびい\",\"mayofun\":\"まよふん\",\"mayohara-san\":\"マヨハラさん\",\"mayu\":\"まゆ\",\"mayugeyama\":\"眉毛山\",\"mayuki\":\"マユキ\",\"mazaki katsumi\":\"まざきかつみ\",\"maze\":\"maze*\",\"mcqueen\":\"mcqueen\",\"mebachi maguro\":\"目鉢鮪\",\"mebae\":\"mebae\",\"mebura\":\"めぶら\",\"mee\":\"めー\",\"meem\":\"MEEM!\",\"megi\":\"めぎ\",\"mego\":\"めご\",\"meguo\":\"メグオ\",\"meguro\":\"目黒\",\"meguro linu\":\"目黒霖雨\",\"meguro sankichi\":\"目黒三吉\",\"mei\":\"芽唯\",\"meido sushi\":\"冥土すし\",\"meido yomi\":\"冥土黄泉\",\"meiji\":\"めいじ\",\"meiji michiru\":\"明治ミチル\",\"meika\":\"めいか\",\"meiko\":\"めい子\",\"meito\":\"星名めいと | めいと\",\"meiya\":\"メイヤ\",\"mekabu aji max\":\"めかぶ味MAX\",\"mekuri\":\"めくり\",\"romulo mancin\":\"Romulo Mancin\",\"melodic core.\":\"石月めろこあ\",\"melon22\":\"めろん22\",\"meloso leaf\":\"メロソリーフ\",\"melu\":\"Melu\",\"meme\":\"めめ\",\"memeo\":\"女々男\",\"menbo\":\"めんぼ\",\"menimo\":\"めにも\",\"meno\":\"meno\",\"menosuke\":\"メノスケ\",\"mens\":\"Men's\",\"mennsuke\":\"めんスケ\",\"menteiyakuna\":\"めんていやくな\",\"menu.\":\"めぬ。\",\"mepikari\":\"メピカリ\",\"mercy rabbit\":\"マーシーラビット\",\"meri\":\"めり\",\"meria\":\"メリア\",\"meridier\":\"Meridier\",\"meriko\":\"めりこ\",\"merkonig\":\"Merkonig\",\"merry luna\":\"めりぃるな\",\"meshi\":\"めし\",\"mesousan\":\"めそうさん\",\"metabond\":\"めたぼんど\",\"metal gummo\":\"めたるがんも\",\"meten\":\"めてん\",\"meto\":\"Meto\",\"mevius9\":\"mevius9\",\"mezashi gohan\":\"めざしごはん\",\"mhs\":\"MHS\",\"mia\":\"みあ\",\"mibry\":\"MIBRY\",\"micchan\":\"みっちゃん\",\"michael f91\":\"マイコーF91\",\"michairu\":\"ミ茶いる\",\"michikusa akimichi\":\"道草閑道\",\"michinoku atami\":\"みちのくアタミ\",\"michiyoshi\":\"ミチヨシ\",\"mico\":\"蜜co\",\"micopp\":\"micopp\",\"midarin\":\"midarin\",\"midoh torako\":\"水堂とらこ\",\"midorigi mura\":\"緑木邑\",\"midoriko\":\"ミドリコ\",\"midou midori\":\"御堂みどり\",\"midou ren\":\"御堂廉\",\"midou shin\":\"魅堂真\",\"miduki aki\":\"観月あき\",\"miduki sho\":\"みづき翔\",\"miduno kenshi\":\"みづの剣士\",\"miel\":\"Miel\",\"mifune yatsune\":\"三船八音\",\"miga\":\"美雅\",\"migchip\":\"MIGCHIP\",\"migi tonari\":\"みぎ隣\",\"migio moto\":\"右雄基留\",\"migiwa\":\"みぎわ\",\"migiyori\":\"右頼\",\"migu\":\"みぐ\",\"migumigu\":\"みぐみぐ\",\"mihara\":\"みはら\",\"mihara nori\":\"三原のり\",\"miho rei\":\"御歩れい\",\"mii akira\":\"美衣暁\",\"miicho\":\"みーちょ\",\"miiru\":\"みいる\",\"miitoban\":\"みぃとばん\",\"mika pikazo\":\"Mika Pikazo\",\"mika sayaki\":\"みかさやき\",\"mikagami mamizu\":\"水鏡まみず\",\"mikagami sou\":\"水鏡想\",\"mikage kirino\":\"神影霧乃\",\"mikage nao\":\"みかげ尚\",\"mikage sekizai\":\"御影石材\",\"mikagura\":\"みかぐら\",\"mikami cannon\":\"三上キャノン\",\"mikami hokuto\":\"箕神北都\",\"mikami sasara\":\"みかみ沙更\",\"mikamikan\":\"みかみかん\",\"mikan gyuunyuu\":\"みかん牛乳\",\"mikan no kawa houchikai no shinsei\":\"みかんの皮放置界の新星\",\"mikan.\":\"みかん。\",\"mikawa\":\"み皮\",\"mikawa no yummy\":\"三河のヤミー\",\"mikawaya\":\"みかわや\",\"mikaze\":\"みかぜ\",\"mike\":\"ミケ\",\"mikeko\":\"みけこ\",\"mikepon\":\"みけぽん\",\"miketa miekichi\":\"みけ田みい吉\",\"mikihime\":\"みき姫\",\"mikkoukun\":\"ミッコウクン\",\"miko\":\"みこ\",\"mikoita\":\"みこいた\",\"mikokuno homare\":\"みこくのほまれ\",\"mikorin\":\"みこりん\",\"mikoto kei\":\"未琴圭\",\"miku\":\"みく\",\"mikuni hadzime\":\"三国ハヂメ\",\"mil\":\"mil\",\"milcara\":\"ミルキャラ\",\"milda7\":\"Milda7\",\"milele\":\"Milele\",\"militia\":\"みりしゃ\",\"milk panda\":\"みるくぱんだ\",\"milkcow\":\"MILKCOW\",\"milkexplorer\":\"MilkExplorer\",\"milkshake\":\"奶昔\",\"millefeuille\":\"ミル・フィーユ\",\"milli\":\"ミリ\",\"milts\":\"みるつ\",\"mima\":\"みま\",\"mimamui\":\"みまむぃ\",\"mimasaka hideaki\":\"美作英明\",\"mimasaka yorozu\":\"みまさかよろず\",\"mimikaki\":\"みみかき\",\"mimimaru\":\"耳丸\",\"mimishiki\":\"耳式\",\"mimisuke\":\"みみすけ\",\"mimizu\":\"蚯蚓\",\"mimori nahda\":\"水護難陀\",\"mimoton\":\"みもとん\",\"mimoza\":\"みもざ\",\"mimuda ryouzou\":\"みむだ良雑\",\"min\":\"ミン\",\"min-naraken\":\"MIN-NARAKEN\",\"minaduki haruka\":\"水月悠\",\"minaduki nanana\":\"皆月ななな\",\"minagata\":\"ミナガタ\",\"minagi ruiji\":\"ミナギルイジ\",\"minai\":\"ミナイ\",\"minakami hiroki\":\"水上広樹\",\"minakami kurena\":\"水上暮菜\",\"minakami riku\":\"ミナカミ理久\",\"minakawa haruhisa\":\"皆川晴久\",\"minako nami\":\"みなこなみ\",\"minakuchi takashi\":\"水口鷹志\",\"minami funi.\":\"南ふに。\",\"minami kohto\":\"南狡兎\",\"minami kunimusu\":\"南邦結\",\"minami sei\":\"みなみせい\",\"minami star\":\"南☆\",\"minamichou naname\":\"南町ななめ\",\"minamino hazuki\":\"南乃映月\",\"minamishi\":\"南嗣\",\"minamoto\":\"みな本\",\"minamoto jin\":\"皆素人\",\"minamura haruki\":\"皆村春樹\",\"minarai\":\"美奈來\",\"minari\":\"minari\",\"minase kaya\":\"水瀬佳也\",\"minase norihiko\":\"みなせのりひこ\",\"minase ruruu\":\"水瀬るるう\",\"minase sizuku\":\"水瀬雫\",\"minase tamaki\":\"皆瀬たまき\",\"minase taruhi\":\"水無瀬たるひ\",\"minase yowkow\":\"水瀬揺光\",\"minase yuu\":\"水瀬結宇\",\"minato akira\":\"湊晶\",\"minato yoshihiro\":\"湊良弘\",\"minatoya shunsaku\":\"湊谷俊作\",\"minatsuki alumi\":\"水月あるみ\",\"minatsuki hina\":\"みなつきひな\",\"minazoi kuina\":\"水添水鶏\",\"minazuki akira\":\"水無月あきら\",\"minazuki ayu\":\"水無月愛勇\",\"mineyuki\":\"峰之\",\"mingaru\":\"ミンガル\",\"miniru\":\"miniru\",\"minna no haipe\":\"みんなのハイペ\",\"mino kureha\":\"美濃紅葉\",\"minobu gentle\":\"身延ジェントル\",\"minoda kenichi\":\"みのだけんいち\",\"minoh rom\":\"水尾ろむ\",\"ojigi\":\"箕吉\",\"minomushi\":\"みのむし\",\"minor boy\":\"まいなぁぼぉい\",\"minori\":\"みのり\",\"minority\":\"マイノリティ\",\"minpei ichigo\":\"民兵一号\",\"mintice\":\"みんとあいす\",\"minto\":\"みんと\",\"minus a\":\"-A\",\"minutati\":\"みぬたち\",\"mio\":\"MIO\",\"mioki koeru\":\"みおき超\",\"mirai denki\":\"未来電機\",\"miri\":\"ミリ\",\"mirino\":\"みりの\",\"miromiro mumu\":\"みろみろ☆むむ\",\"miru\":\"MIRU\",\"mirun\":\"ミルン\",\"misa\":\"美沙\",\"misagi nagomu\":\"みさぎ和\",\"misaka\":\"御坂\",\"misaka niumu\":\"三坂ニウム\",\"misaka nyuumen\":\"みさかにゅうめん\",\"misaka shou\":\"三坂晶\",\"misaki\":\"御崎\",\"misaki ren\":\"美咲恋\",\"misaki ryo\":\"御前伶\",\"misaki tou\":\"ミサキ闘 | ミサキ糖\",\"misana\":\"みさな\",\"misao\":\"小野ミサオ\",\"misaragi\":\"みさらぎ\",\"misasagi yuuya\":\"ミササギユウヤ\",\"misato nana\":\"三郷なな\",\"miseo\":\"みせお\",\"mishibe hamata\":\"みしべハマタ\",\"mishima hiroji\":\"みしまひろじ\",\"misnon the great\":\"ミスノン・ザ・グレート\",\"miso oden\":\"みそおでん\",\"miso panda\":\"みそパンダ\",\"miso poteto\":\"みそぽてと\",\"misoiri\":\"味噌入り\",\"misono denpachi\":\"みそのデンパ\",\"misonou\":\"みそのう\",\"misooden\":\"みそおでん\",\"misril\":\"Misril\",\"miss black\":\"MISS BLACK\",\"missile228\":\"MISSILE228\",\"mister\":\"ミスター\",\"mister ochitsu\":\"ミスターおちつ\",\"misumi natsuki\":\"水澄夏希\",\"mita kazuo\":\"三田和夫\",\"mita satomi\":\"みたさとみ\",\"mitaka\":\"美岳\",\"mitamori tatsuya\":\"みた森たつや\",\"mitarai\":\"御手洗\",\"mitarai yuuki\":\"御手洗佑樹\",\"mitarashi kousei\":\"みたらし侯成\",\"mitei\":\"未定\",\"mito\":\"ミト\",\"miton\":\"みとん\",\"mitsu king\":\"蜜キング\",\"mitsufuji kouichi\":\"みつふじこういち\",\"mitsui mana\":\"みついまな\",\"mitsuie\":\"みついえ\",\"mitsukazu\":\"みつかず\",\"mitsuki kisara\":\"観月きさら\",\"mitsuki mantarou\":\"光姫満太郎\",\"mitsuki ponz\":\"蜜葵ぽんず\",\"mitsuki yuuya\":\"御月ユウヤ\",\"mitsumaro\":\"みつまろ\",\"mitsurugi tsurugi\":\"御剱剣\",\"mitsuya\":\"みつや\",\"mitsuyama hajime\":\"みつやまはじめ\",\"mitty\":\"Mitty\",\"miu\":\"みU\",\"miumi\":\"みうみ\",\"miura\":\"miura\",\"miura jota\":\"三浦いお太\",\"miya\":\"みや\",\"miya9\":\"miya9\",\"miyabe makoto\":\"みやべまこと\",\"miyabi tsuzuru\":\"みやびつづる\",\"miyabi yutaka\":\"ミヤビユタカ\",\"miyabikawa sakura\":\"雅川佐倉\",\"esaki tamotsu\":\"江崎惟\",\"miyagi yasutomo\":\"宮城靖朋\",\"miyagoe yoshitsuki\":\"宮越良月\",\"miyahara mimikaki\":\"みやはらみみかき\",\"miyakawa hajime\":\"美夜川はじめ\",\"kyou no gohan\":\"京のごはん\",\"miyama rima\":\"宮馬りま\",\"miyama zero\":\"美山零\",\"miyamoto ikusa\":\"みやもといくさ\",\"miyamoto yuu\":\"みやもとゆう\",\"miyamu\":\"みやむ\",\"miyamura\":\"みやむら\",\"miyane aki\":\"みやねあき\",\"miyanogi jiji\":\"宮野木ジジ\",\"miyanoyuki\":\"みやのゆき\",\"miyashita kitsune\":\"宮下キツネ\",\"miyatsuki itsuka\":\"美弥月いつか\",\"miyauchi yuka\":\"宮内由香\",\"miyazaki yuki\":\"宮崎ユウキ\",\"miyazawa riewo\":\"宮沢りえを\",\"miyoichi\":\"みよいち\",\"miyu\":\"MIYU\",\"miyuki\":\"深雪\",\"miyuki yaya\":\"御幸やや\",\"miyuma subaru\":\"未由間すばる\",\"miyuu\":\"未柚\",\"mizinnkosutinn\":\"みじんこすちん\",\"mizo\":\"原人\",\"mizoguchi kou\":\"ミゾグチコウ\",\"mizu\":\"mizu\",\"mizu asato\":\"水あさと\",\"mizuha\":\"みずは\",\"mizuhara mei\":\"水原明\",\"mizuhati saru\":\"水八申\",\"mizui\":\"みずい\",\"mizuiro megane\":\"みずいろ めがね\",\"mizujouyu\":\"水醤油\",\"mizuki\":\"みずき\",\"mizuki gai\":\"水樹凱\",\"mizuki haruto\":\"みづき春人\",\"mizuki hitoshi\":\"みずきひとし\",\"miduki honey\":\"水月ハニー\",\"mizuki loose\":\"みづきるうず\",\"mizuki makoto\":\"観月真\",\"mizuki yuu\":\"瑞紀悠\",\"mizuki yuuma\":\"みずき佑真\",\"mizukimaru\":\"満月◯\",\"mizumidori\":\"水緑\",\"mizumori omizu\":\"水森おみず\",\"mizumura kaoru\":\"水村かおる\",\"mizuna\":\"みづな\",\"mizunashi\":\"みずなし\",\"mizunezumi\":\"水鼠\",\"mizuno\":\"みずの\",\"mizuno haruyoshi\":\"水野珍\",\"mizuno kei\":\"水野慧\",\"mizuno makoto\":\"みずのまこと\",\"mizuno mumomo\":\"水野むもも\",\"mizuno poppo\":\"水翠野ポッポ\",\"mizuno sao\":\"水野早桜\",\"mizunoe nemone\":\"壬星ねもね\",\"mizusaka saki\":\"水坂早希\",\"mizusawa\":\"水澤\",\"mizusawa mimori\":\"水沢深森\",\"mizusawa nagi\":\"水沢凪\",\"mizushima aru\":\"みづしま亜留\",\"mizushima kero\":\"水島ケロ\",\"mizushima sei\":\"みずしま聖\",\"mizushina minato\":\"水科湊\",\"mizushiro takuya\":\"水城たくや\",\"mizutama\":\"みずたま\",\"mizutani tooru\":\"水谷とおる\",\"mizuto\":\"水兎\",\"mizuya tiharu\":\"水夜ちはる\",\"mizuyoukan\":\"水ようかん\",\"mko\":\"マキオ\",\"ml\":\"ML\",\"mm\":\"えむえむ\",\"mmmnomu\":\"むむむのム\",\"mnk\":\"MNK\",\"mo\":\"も\",\"moai tentyou\":\"モアイ店長\",\"moccyi\":\"モッチィー\",\"mochi ice\":\"もちアイス\",\"mochi sensee\":\"もちせんせぇ\",\"mochiduki nano\":\"モチヅキナノ\",\"mochiji tada\":\"餅持唯\",\"mochikuu usagi\":\"もちくううさぎ\",\"mochimako\":\"モチマコ\",\"mochinosora\":\"もちのそら\",\"mochizuki nao\":\"望月なお\",\"mochizuki tooya\":\"望月とーや\",\"mockmock\":\"MockMock\",\"moech\":\"moech\",\"moeda kazukichi\":\"萌田かずきち\",\"moeki yuta\":\"萌木雄太\",\"moekichi.\":\"もえきち。\",\"mofuriru\":\"もふりる\",\"mogg\":\"mogg\",\"mogi\":\"モギ\",\"mogi yasunobu\":\"茂木康信\",\"mogiri\":\"もぎり\",\"mogo-721\":\"mogO-721\",\"mogunosukes\":\"モグ乃助\",\"mogupuchi.\":\"もぐぷち。\",\"moiky\":\"Moiky\",\"moizumi shipon\":\"茂泉しぽん\",\"moja\":\"MOJA\",\"mokamoka\":\"モカモカ\",\"moke\":\"もけ\",\"mokei\":\"百景\",\"mokeke\":\"mokeke\",\"mokichi\":\"茂吉\",\"mokke\":\"もっけ\",\"mokki\":\"もっき\",\"moko\":\"もこ\",\"mokokee\":\"もこけ\",\"mokomoko yanakku\":\"モコモコヤナック\",\"mokumokuren\":\"目目蓮\",\"mokushi\":\"もくし\",\"mokyu\":\"もきゅ\",\"momi\":\"もみ\",\"momiji\":\"もみじ\",\"momiji mao\":\"もみじ真魚\",\"momijizuki luna\":\"紅葉月るな\",\"momizi inori\":\"紅葉いのり\",\"momo\":\"もも\",\"momo inu\":\"ももいぬ\",\"momo iwao\":\"百々巌\",\"momo no kanzume\":\"桃の缶詰\",\"momoda yasuhito\":\"百田やすひと\",\"momoe\":\"ももえ\",\"momofuki rio\":\"桃吹リオ\",\"momohime shibuki\":\"桃姫しぶき\",\"momoiro retas\":\"桃色レタス\",\"momokan85\":\"momokan85\",\"momomitsu kinako\":\"桃蜜きなこ\",\"momomo\":\"ももも\",\"momonashi potato\":\"桃梨ぽてと\",\"momonga\":\"桃ん画\",\"momosaki\":\"桃咲\",\"momose\":\"ももせ\",\"momose sei\":\"百瀬せー\",\"momoshiro\":\"モモシロ\",\"momota momo\":\"モモタ モモ\",\"mon-petit\":\"もんぷち\",\"monaka\":\"最中\",\"monatsu\":\"もなつ\",\"monchan rev3\":\"もんちゃんrev3\",\"monchy\":\"もんちぃ\",\"monimitto\":\"もにみっと\",\"monin\":\"もにん\",\"moninna\":\"もにんな\",\"monio\":\"もにお\",\"monkey ni-gou\":\"悶鬼威弐号\",\"monkeycandy\":\"MonkeyCandy\",\"monme\":\"monme\",\"monodevil\":\"ものっち\",\"monou natsuki\":\"桃生夏綺\",\"monsuke\":\"MONSUKE\",\"monvasa\":\"モンヴァサ\",\"moonlight\":\"むーんらいと\",\"mor.\":\"モル\",\"more\":\"モレ\",\"mori\":\"森\",\"mori takuya\":\"杜拓哉\",\"moribell\":\"モリーベル\",\"moricocco\":\"もりこっこ\",\"morii\":\"MORII\",\"morii fuzuki\":\"森井文月\",\"morii shizuki\":\"森井しづき\",\"morikawa\":\"もりかわ\",\"morikawa narumi\":\"森川鳴海\",\"morikurousagi\":\"森黑兎\",\"warabi mochi\":\"わらびモチ\",\"morina masayuki\":\"森菜雅雪\",\"morinaga milk\":\"森永みるく\",\"morinaga ramune\":\"森永らむね\",\"morino hon\":\"もりのほん\",\"morino kinoco\":\"森乃きの子\",\"morino kinoko\":\"森乃きのこ\",\"morino muck\":\"森野ムック\",\"morinomiya maachi\":\"森ノ宮まあち\",\"morisaki tirol\":\"森崎ちろる\",\"morisaki yoshino\":\"杜崎淑乃\",\"morishige\":\"もりしげ\",\"morishima petit\":\"森嶋プチ\",\"morishita kaoru\":\"モリシタカオル\",\"morisoba\":\"もりそば\",\"morisova\":\"morisova\",\"morisugi\":\"morisugi\",\"moritaka takashi\":\"もりたかたかし\",\"moritake\":\"モリタケ\",\"moritan\":\"もりたん\",\"moriyama rikka\":\"森山六花\",\"moriyama shijimi\":\"森山しじみ\",\"morochin-san\":\"もろちんさん\",\"morokoshitaroh\":\"morokoshitaroh\",\"morota\":\"もろた\",\"morozumi junka\":\"両角潤香\",\"morpheus\":\"モルペウス\",\"morris\":\"モリス\",\"moruda\":\"もる田\",\"moruga\":\"MORUGA\",\"mos\":\"Mos\",\"mosa\":\"モサ\",\"moscow\":\"モスクワ\",\"mosha\":\"もしゃ\",\"mosuke\":\"mosuke\",\"motchie\":\"もっちー\",\"moti moti omoti\":\"餅もちお餅\",\"mothica\":\"モティカ\",\"moto\":\"MoTo\",\"motobi\":\"もとび\",\"motoe hiroya\":\"元永尋也\",\"motoichi\":\"素壱\",\"motomushi\":\"元虫\",\"motoyon\":\"基4\",\"motsu\":\"もつ\",\"motsuaki\":\"もつあき\",\"motti\":\"モッチー\",\"mou\":\"もう\",\"moukin punch\":\"猛禽パンチ\",\"mountain pukuichi\":\"マウンテンプクイチ\",\"moup\":\"もうぴい\",\"moya\":\"moya\",\"moyashi\":\"もやし\",\"moyasibasto\":\"もやしばーすと\",\"moyomoto lv48\":\"もょもとLV48\",\"moyori\":\"moyori\",\"moyuru-n\":\"MOYURU/n\",\"moza\":\"もざ\",\"mozuku\":\"もずく\",\"mozuya murasaki\":\"もずや紫\",\"mr.lostman\":\"Mr.Lostman\",\"mr.sugar\":\"MR.sugar\",\"mr.way\":\"Mr.way\",\"mt\":\"mt\",\"mt.somo\":\"Mt.somo\",\"mtd\":\"mtd\",\"mu mu munou\":\"66-夢王\",\"mu-min\":\"夢～眠\",\"mucc\":\"ムック\",\"muchabou\":\"無茶坊\",\"mufuru\":\"ムフル\",\"mugen no ossan\":\"無限のおっさん\",\"mugendai\":\"無限大\",\"mugenkidou\":\"無限軌道\",\"mugi\":\"MUGI\",\"mugicha\":\"麦茶\",\"mugichoko\":\"むぎちょこ\",\"mugimaru\":\"麦丸\",\"mugino hotaru\":\"麦野ほたる\",\"muichimon\":\"無一文\",\"mujiko\":\"むじこ\",\"mujin\":\"霧迅\",\"mujina\":\"むじな\",\"mukai kiyoharu\":\"むかいきよはる\",\"mukai masayoshi\":\"向正義\",\"mukasa kouki\":\"六笠洸季\",\"mukaunosato isuke\":\"イスケ・グラタニティー\",\"mukeikaku\":\"夢計画\",\"mukku\":\"MUKKU\",\"mukouhara shiryu\":\"むこうはらしりゅう\",\"mukuge\":\"毳\",\"mukyuu\":\"むきゅう☆\",\"mumin\":\"むみん\",\"mumu\":\"MUMU\",\"mumumu\":\"むむむ\",\"munashimujou\":\"むなしむじょう\",\"munitin\":\"むにちん\",\"munomerikun\":\"ミネむら\",\"munoshishi\":\"むのしし\",\"munyuu\":\"むにゅう\",\"murai g\":\"村井Ｇ\",\"murai kei\":\"ムライケイ\",\"murakami\":\"村上\",\"murakami masaki\":\"村上雅貴\",\"murakumo\":\"村雲\",\"muramurabito\":\"村々人\",\"muranako\":\"ムラナコ\",\"murasaki\":\"むらさき\",\"murasaki akari\":\"むらさきあかり\",\"murasaki orange\":\"紫オレンジ\",\"murasaki tohka\":\"村崎とーか\",\"murasakiiro orange\":\"むらさきいろオレンジ\",\"murasame chiaki\":\"村雨知秋\",\"murasame ha\":\"村雨刃\",\"murasame maru\":\"村雨丸\",\"murata denji\":\"村田電磁\",\"murata.\":\"ムラタ。\",\"muren\":\"ムウレン\",\"muro\":\"むろ\",\"muryou myakudou\":\"無料脈動\",\"musashino sekai\":\"ムサシノセカイ\",\"musasiya chogenbo\":\"武蔵屋長元坊\",\"muscleman\":\"マッスルマン\",\"mushanokouji atsune\":\"武者小路あつね\",\"mushiboy\":\"MUSHIBOY\",\"musouduki\":\"梦双月\",\"muteki soda\":\"无敌苏打\",\"muten\":\"武天\",\"mutou\":\"無糖\",\"mutou hiroki\":\"武藤裕樹\",\"mutou keiji\":\"むとうけいじ\",\"mutou kurihito\":\"武藤此史\",\"mutou rei\":\"武藤礼恵\",\"mutsu\":\"ムツ\",\"mutsu nagare\":\"陸奥流\",\"mutsuki aya\":\"睦月綾\",\"mutsuki ginji\":\"睦月ぎんじ\",\"mutsuki haru\":\"睦月はる\",\"mutsuki hiiro\":\"睦月緋色\",\"mutsuki kei\":\"睦月圭\",\"mutsuki lime\":\"むつき来夢\",\"mutsumi\":\"むつみ\",\"mutuki shin\":\"六樹しん\",\"mutumi\":\"MuTuMi\",\"mutunari\":\"むつなり\",\"muumuu\":\"ムームー\",\"muuna\":\"むーな\",\"muunyan\":\"むーにゃん\",\"muya\":\"むや\",\"myaa\":\"みゃー\",\"myake\":\"みゃけ\",\"myanie\":\"宮兄\",\"myouga\":\"茗荷\",\"myouji namae\":\"苗字なまゑ\",\"mytyl\":\"Mytyl\",\"myuratch\":\"Myuratch\",\"myv\":\"myv\",\"mzk\":\"MZK\",\"mzne\":\"mzne\",\"n\":\"ん\",\"n-p-katou\":\"N・P・KATOU\",\"n820\":\"n820\",\"na\":\"な\",\"naba\":\"菜葉\",\"nabe\":\"Nabe\",\"nabenco\":\"なべんこ\",\"nabeshiki\":\"ナベシキ\",\"nabeshima mike\":\"鍋島ミケ\",\"nabeya sakihana\":\"鍋谷咲花\",\"nabeyu\":\"なべゆ\",\"nabuu\":\"なぶぅ\",\"nac\":\"Nac\",\"nacha\":\"NACHA\",\"nachiku\":\"なちく\",\"naco\":\"なこ\",\"nada haruka\":\"灘遥歌\",\"nadzuka\":\"ナヅカ\",\"nae\":\"なえ\",\"nagai kao\":\"永井佳緒\",\"nagai momiage\":\"长井もみあげ\",\"nagaikusa\":\"長い草\",\"nagamatsu heizo\":\"永松平蔵\",\"nagami mairu\":\"長海まいる\",\"nagana sayui\":\"ながな坂結\",\"naganeko\":\"ながねこ\",\"naganohara nis\":\"長野原にす\",\"naganoon\":\"ながの～ん\",\"naganoro\":\"ながのろ\",\"nagare\":\"nagare\",\"nagareboshi\":\"流れ星\",\"nagareboshi purin\":\"流れ星☆プリン\",\"nagaro\":\"ながろ\",\"nagase yuuki\":\"长濑佑希\",\"nagasode\":\"长そで\",\"nagata tsubasa\":\"永田翼\",\"nagatsuki rio\":\"长月莉绪\",\"nagi mayuko\":\"凪まゆこ\",\"nagi wataru\":\"那木渡\",\"nagisa manoa\":\"渚まのあ\",\"nagisano usagi\":\"渚乃兎\",\"nagisawa you\":\"なぎさわゆう\",\"naglfar\":\"なぐるふぁる\",\"nago.k\":\"NAGO.K\",\"nagoshi\":\"夏越\",\"nagoya shachihachi\":\"名古屋鯱八\",\"naguu\":\"なぐう\",\"nagy\":\"ナギー\",\"nagyo\":\"なぎょ\",\"naha ryou\":\"那覇了\",\"naik\":\"NAiK\",\"naipeta\":\"ないぺた\",\"naisho\":\"内緒\",\"naito loveca\":\"内藤らぶか\",\"naitou gura\":\"内東ぐら\",\"naitou haruto\":\"内藤春人\",\"naitou ryuu\":\"内藤隆\",\"naizou chimuko\":\"内蔵チムコ\",\"nakabe e\":\"なかべ江\",\"nakafusa momo\":\"中総もも\",\"nakagawa\":\"中川\",\"nakagawa kei\":\"中川けい\",\"nakagawa ryna\":\"中川リィナ\",\"nakahata izuru\":\"仲畑いづる\",\"nakai\":\"ナカイ\",\"nakai kana\":\"なかいかな\",\"nakajima akihiko\":\"中島秋彦\",\"nakajima kotoko\":\"中島ことこ\",\"nakajima rei\":\"中島零\",\"nakajima tomoki\":\"なかじまともき\",\"nakajou\":\"ナカジョー\",\"nakami yoshikage\":\"中海美影\",\"nakamura hirofumi\":\"中村博文\",\"nakamura kanko\":\"中村カンコ\",\"nakamura koutarou\":\"中村紅太郎\",\"nakamura morris\":\"中村モリス\",\"nakamura osawari kun\":\"中村おさわり君\",\"nakamura rumi\":\"仲村留海\",\"nakamura subaru\":\"なかむらすばる\",\"nakamura syumitto\":\"中村趣味人\",\"nakamura uzuki\":\"中村卯月\",\"nakamura zeus\":\"中村天神\",\"nakano\":\"中野\",\"nakano yuu\":\"中野ゆう\",\"nakanoku kurochan\":\"中野区くろちゃん\",\"nakaore porkbits\":\"中折れポークビッツ\",\"nakasone haiji\":\"中曽根ハイジ\",\"nakasumi\":\"なかすみ\",\"nakata hana\":\"なかた華\",\"nakatsugawa minoru\":\"中津川みのる\",\"nakaya\":\"なかや\",\"nakayama miyuki\":\"中山みゆき\",\"nakayuki\":\"仲雪\",\"nakazawa hinoto\":\"なかざわひのと\",\"nakika\":\"鳴華\",\"nako\":\"なこ\",\"nako mameta\":\"なこ豆太\",\"nakuma meika\":\"なくま冥架\",\"nakura\":\"なくら\",\"nakura yumari\":\"奈倉ゆまり\",\"nalvas\":\"nalvas\",\"nalzo\":\"nalzo\",\"namaki\":\"奈慎\",\"namakura\":\"なまくら\",\"namakura makibishi\":\"鈍撒菱\",\"namanie\":\"生煮え\",\"namao\":\"なまお\",\"namazu\":\"なまず\",\"name\":\"なめ\",\"name john\":\"なめジョン\",\"namekata fumiaki\":\"行方ふみあき\",\"nametake\":\"なめ茸\",\"namiri\":\"なみり\",\"namita\":\"浪田\",\"namusan\":\"南無三\",\"nana\":\"奈々\",\"nana shinshi\":\"七紳士\",\"nanaca mai\":\"ななかまい\",\"nanae\":\"Nanae\",\"nanae juu\":\"七影愁\",\"nanagami you\":\"七神優\",\"nanahachi\":\"ななはち\",\"nanahi tosi\":\"七比とし\",\"nanahime\":\"ななひめ\",\"nanahoshi nas\":\"七星なす\",\"nanahoshi tento\":\"七星てんと\",\"nanakawa roduka\":\"七川楼塚\",\"nanaki nana\":\"ナナキナナ\",\"nanaki seijyu\":\"七輝静樹\",\"nanako\":\"ナナコ\",\"nanakoro\":\"七転\",\"nanakura nanane\":\"七座菜々音\",\"nanakusa amane\":\"七草天音\",\"nanakusa mutsuki\":\"七草むつき\",\"nanamaru\":\"菜々丸\",\"nanami ayane\":\"七海綾音\",\"nanami natuki\":\"七海夏樹\",\"nanami shizuka\":\"ななみ静\",\"nanami yasuna\":\"ナナミヤスナ\",\"nanamiya rin\":\"ななみやりん\",\"nanamiya tsugumi\":\"七宫つぐ实\",\"nanamo\":\"ななも\",\"nanamomo rio\":\"七桃りお\",\"nanana nana\":\"七名菜奈\",\"nananana nanana\":\"七々ななな\",\"nanao mizuho\":\"七尾瑞穂\",\"nanao-kun\":\"ななおくん\",\"nanase aoi\":\"七瀬葵\",\"nanase masato\":\"七瀬雅人\",\"nanase michiru\":\"七瀬みちる\",\"nanasiro\":\"ななしろ\",\"nanasumi\":\"奈々澄\",\"nanatsu nemu\":\"七夏ねむ\",\"nanbu arata\":\"南部新\",\"nandaba\":\"ナンダバ\",\"naniwadou matatabi\":\"浪花道またたび\",\"nankai no sizimi\":\"南海のしぢみ\",\"nankakureman\":\"なんかくれまん\",\"nankin maachan\":\"南京まーちゃん\",\"nannal\":\"なんなる\",\"nano\":\"nano\",\"nanotaro\":\"なのたろ\",\"nantetsu\":\"軟鉄\",\"nantomo anison\":\"なんともアニソン\",\"nanzaki iku\":\"南崎いく\",\"nao\":\"なお\",\"nao hiren\":\"緋蓮尚\",\"nao michi\":\"直通\",\"naochi\":\"naochi\",\"naohiro\":\"NAOHIRO\",\"naokame\":\"直かめ\",\"naoki\":\"なおき\",\"naokichi.\":\"なおきち。\",\"naoko\":\"なお子\",\"naonao\":\"尚尚\",\"naop\":\"naop\",\"narashino zoe\":\"習志野ゾーイ\",\"narcisse noir\":\"なるしすのあ～る\",\"narinatsu machi\":\"成夏万智\",\"nario\":\"ナリヲ\",\"narita riuku\":\"成田りうく\",\"narita rumi\":\"成田るみ\",\"narita suguru\":\"成田すぐる\",\"narukami\":\"なるかみ\",\"narukami ginryu\":\"鳴神銀龍\",\"narukami x\":\"鳴神X\",\"narumi\":\"ナルみ\",\"narumi meiko\":\"鳴海鳴子\",\"narumi yuu\":\"鳴海ゆう\",\"narusawa aya\":\"鳴沢綾\",\"narusawa sora\":\"成沢 空\",\"naruse\":\"なるせ\",\"naruse makoto\":\"成瀬真琴\",\"naruse mamoru\":\"成瀬守\",\"naruse michi\":\"成瀬みち\",\"narushima godou\":\"成岛ゴドー\",\"nas\":\"NAS\",\"nas-o\":\"NAS-O\",\"nasake muyou\":\"なさけむよう\",\"nash\":\"nash\",\"nashie\":\"なしえ\",\"nashinori tunnel\":\"梨憲タヌル\",\"nashiru\":\"なしる\",\"nassukun\":\"ナッス君\",\"nasu\":\"なす\",\"nasu hanahana\":\"那須花花\",\"nasukichi\":\"茄子吉\",\"nasuo\":\"なすお\",\"natin\":\"なてぃん\",\"nato\":\"NATO\",\"natsu\":\"捺\",\"natsu kirin\":\"ナツキリン\",\"natsufuyu denki\":\"夏冬伝季\",\"natsuhara saike\":\"夏原サイケ\",\"natsuhime yuran\":\"夏媛柚蘭\",\"natsukawa sarasa\":\"なつかわさらさ\",\"natsuki\":\"奈月\",\"natsuki coco\":\"奈月ここ\",\"natsuki hajime\":\"夏生一\",\"natsuki shuri\":\"なつきしゅり\",\"natsuki takatora\":\"なつきたかとら\",\"natsume\":\"夏目\",\"natsume kei\":\"夏目系\",\"natsumezaka sorekara\":\"夏目坂それから\",\"natsumi\":\"Natsumi\",\"natsumi akira\":\"夏海あきら\",\"natsumi chiharu\":\"ナツミチハル\",\"natsumi kansai\":\"なつみかんさい\",\"natsumikan\":\"なつみかん\",\"natsumin\":\"なつみん\",\"natsunagi\":\"なつなぎ\",\"natsuno hareruya\":\"ナツノハレルヤ\",\"natsuno maki\":\"夏野槙\",\"natsuno suika\":\"なつのすいか\",\"natsuo\":\"夏尾\",\"natsuta kousuke\":\"夏田コウスケ\",\"natsuyo\":\"ナツヨ\",\"natsuzora haduki\":\"夏空葉月\",\"nattaka\":\"なったか\",\"nattsu\":\"なっつ\",\"natumyun\":\"なつみゅん♪\",\"nayoshi\":\"なよし\",\"nayuta daichi\":\"那由他大地\",\"nayuzaki natsumi\":\"ナユザキナツミ\",\"nazca\":\"ナスカ\",\"nazumi kei\":\"菜澄桂\",\"neco\":\"neco\",\"nectar\":\"ねくたー\",\"nedoko\":\"ネドコ\",\"neet\":\"にぃと\",\"negitama\":\"ねぎたま\",\"negitoroko\":\"ネギトロ子\",\"negoya\":\"ねご屋\",\"negura nao\":\"ねぐら☆なお\",\"negurie\":\"ねぐりえ\",\"nei chi\":\"ねいちー\",\"neji-pan\":\"ネジ\",\"nejiro\":\"ねじろ\",\"neko bus\":\"ねこばす\",\"neko denryoku\":\"ねこ電力\",\"neko gohan\":\"猫御飯\",\"neko manma\":\"猫御飯\",\"neko maru rentarou\":\"猫丸恋太郎\",\"neko na yasai\":\"猫な野菜\",\"neko samurai\":\"猫サム雷\",\"neko sensei\":\"猫センセイ\",\"nekobuton\":\"猫布団\",\"nekodel\":\"ねこでる\",\"nekoga yoshiki\":\"猫賀好樹\",\"nekohige\":\"ねこひげ\",\"nekojima lei\":\"猫島礼\",\"nekojima myu\":\"猫島みゅう\",\"nekokan\":\"ねこかん\",\"nekokokazuma\":\"ねここかずま\",\"nekokyuu\":\"ねこきゅう\",\"nekomajin\":\"ねこまじん\",\"nekomanma\":\"ねこまんま\",\"nekomata\":\"ねこまた\",\"nekomatsuri\":\"猫祭\",\"nekomi haruto\":\"猫見春人\",\"nekomimi kanon\":\"猫耳花音\",\"nekomura\":\"猫村\",\"nekomushi\":\"ねこむし\",\"nekoneko\":\"ねこねこ\",\"nekoneko panchu\":\"ねこねこぱんちゅっ\",\"nekonin\":\"猫忍\",\"nekono lonmiy\":\"猫乃ろんみい\",\"nekono matatabi\":\"猫乃またたび\",\"nekono shiro\":\"ねこのしろ\",\"nekono tamami\":\"猫野たまみ\",\"nekonomori maririn\":\"猫守麻里鈴\",\"nekonose hajime\":\"猫ノ瀬はじめ\",\"nekonso\":\"ねこんそ\",\"nekonta\":\"ねこんた\",\"nekonyan\":\"猫にゃん\",\"nekookaji tayo\":\"猫岡寺多代\",\"nekoro tanuki\":\"ねころたぬき\",\"nekota chihiro\":\"猫田ちひろ\",\"nekota kojirow\":\"猫田小次郎\",\"nekota nanami\":\"ねこたななみ\",\"nekota nigra\":\"猫多にぐら\",\"nekotasou\":\"ねこたそう\",\"nekotsuki naoya\":\"猫月なおや\",\"nekou izuru\":\"猫生いづる\",\"nekoume\":\"ねこうめ\",\"nekoya marble\":\"猫屋まぁぶる\",\"nekoyashiki nekomaru\":\"猫屋敷ねこ丸\",\"nekozawa yukari\":\"猫沢ゆかり\",\"nekubila\":\"ねくびぁ\",\"nelo angelo\":\"Nelo安十朗\",\"nemachizuki inesu\":\"寝待月いねすー\",\"nemigi tsukasa\":\"ねみぎつかさ\",\"nemo\":\"ネモ\",\"nemokuge\":\"ねもくげ\",\"nemoto\":\"ネモト\",\"nemui\":\"tintin\",\"nenchi\":\"ねんち\",\"nene\":\"nene\",\"nenemaru\":\"音音丸\",\"neno\":\"ねの\",\"neo black\":\"Neo Black\",\"neo kusano\":\"NEO草野\",\"neon ui\":\"音遠うい\",\"neoneet\":\"寝起新人\",\"nepuka\":\"根深\",\"nerima marine\":\"ねりままりね\",\"nerio\":\"ねりお\",\"nero\":\"nero\",\"neropaso\":\"neropaso\",\"nerotarou\":\"ねろたろう\",\"nerune\":\"ねるね\",\"nesuo\":\"ねすお\",\"net\":\"NET\",\"new\":\"新\",\"new ab\":\"にゅーAB\",\"neyonsan\":\"ねよんさん\",\"neyuki rei\":\"根雪れい\",\"nezumeta\":\"ねずメーター\",\"nezumidosi\":\"ねづみどし\",\"nezumin\":\"ネズミン\",\"nf4\":\"nf4\",\"ngng\":\"ngng\",\"nibi\":\"nibi\",\"nicchi sangyou\":\"ニッチサンギョウ\",\"nice tack\":\"ナイスタック\",\"niche\":\"ニッチ\",\"nichii\":\"ニチヰ\",\"nick\":\"NICK\",\"nico\":\"にこ\",\"nico-momo\":\"にこもも\",\"nicoco\":\"nicoco\",\"nicutoka\":\"nicutoka\",\"nidoro\":\"nidoro\",\"niea\":\"にえあ\",\"nietagiru\":\"にえたぎる\",\"nigakuri takeshi\":\"ニガクリタケシ\",\"nigane\":\"煮鐘\",\"nigesapo\":\"にげサポ\",\"nightjoy\":\"Nightjoy\",\"nigo\":\"にご\",\"niiruma kenji\":\"にいるまけんじ\",\"niisan\":\"にーさん\",\"nijiden\":\"ニジデン\",\"nijihashi sola\":\"にじはしそら\",\"nijiru\":\"煮汁\",\"nijou tayun\":\"二条たゆん\",\"nijyou makoto\":\"二条マコト\",\"nikaido kai\":\"二階堂改\",\"nikami\":\"にかみ\",\"niku\":\"にく\",\"niku jill\":\"肉Jill\",\"nikudanmaru\":\"肉弾丸\",\"nikuname\":\"肉ネーム\",\"nikuyaki\":\"ニクヤキ\",\"nikyu\":\"にきゅ\",\"nilitsu\":\"ニリツ\",\"nilo\":\"にろ\",\"nina\":\"丹娜\",\"nina ryo\":\"新和涼\",\"ningen\":\"にんげん\",\"ninniku\":\"にんにく\",\"ninnin\":\"にんにん\",\"nino paru\":\"にのパル\",\"ninomae kazuichi\":\"二ノ前和市\",\"ninomiya hitomi\":\"二宮仁巳\",\"ninomotoko\":\"ニノモトコ\",\"ninroku\":\"認六\",\"nio\":\"nio\",\"nioti\":\"におち\",\"nippa takahide\":\"新羽隆秀\",\"nippori\":\"にっぽり\",\"nirapii\":\"にらぴー\",\"niryuu tkys\":\"にりゅうtkys\",\"nishi tagame\":\"西タガメ\",\"nishida\":\"西田\",\"nishifuji\":\"西藤\",\"nishihara atsuko\":\"弐士原あつこ\",\"nishikawa coto\":\"ニシカワコト\",\"nishiki meyu\":\"西樹めゆ\",\"nishiki yoshimune\":\"にしき義統\",\"nishimaki tohru\":\"にしまきとおる\",\"nishimo\":\"にしも\",\"nishimura arimi\":\"西村有未\",\"nishimura takashi\":\"にしむらたかし\",\"nishin\":\"ニシン\",\"nishino\":\"西野\",\"nishino hikodge\":\"西野彦二\",\"nishinozawa kaorisuke\":\"西野沢かおり介\",\"nishitsuki tsutomu\":\"西月力\",\"nisin\":\"ニシン\",\"nisson\":\"nisson\",\"nitiba rokusaburou\":\"にちばろくさぶろう\",\"nitta jun\":\"にったじゅん\",\"nittakumi\":\"新匠\",\"niu\":\"丹雨\",\"niwa\":\"にわ\",\"niwa yukari\":\"丹羽ユカリ\",\"niwaka yuan\":\"丹羽香ゆあん\",\"niwakaame\":\"俄雨\",\"niwasane\":\"にわさね\",\"niwatori gunsou\":\"にわとり軍曹\",\"niyama\":\"にやま\",\"nkedoshita\":\"んけどした\",\"nken\":\"NKEN\",\"nmasse\":\"ンマッセ\",\"nme\":\"んめ\",\"nmi\":\"Nみ\",\"nno\":\"nno\",\"no.gomes\":\"NO.ゴメス\",\"noa\":\"ノア\",\"noah\":\"のあ\",\"nobi nobita\":\"野火ノビタ\",\"nobita\":\"ノビタ\",\"nobu\":\"NOBU\",\"nobuki chihiro\":\"のぶきちひろ\",\"nobuyuki\":\"信行\",\"nochita sin\":\"のちた紳\",\"nogami takeshi\":\"野上武志\",\"nogod\":\"NOGOD\",\"noguchi masatsu\":\"野口摩擦\",\"nohara monyoral\":\"野原もにょらる\",\"noi\":\"のい\",\"noibara kou\":\"野茨杏\",\"noji\":\"ノジ\",\"nokishita negio\":\"軒下ネギヲ\",\"noko\":\"乃子\",\"nolia\":\"NOLIA\",\"nomady mao\":\"のまでぃMAO\",\"nomayo\":\"野マヨ\",\"nomu\":\"NOMU\",\"nomura teruya\":\"野村輝弥\",\"non\":\"のん\",\"nonaff\":\"のんアフ\",\"noname\":\"NONAME\",\"noneto\":\"ノネト\",\"nonnon\":\"のんのん\",\"nonohachi\":\"ノノはち\",\"nonoki\":\"乃軒\",\"nonoko\":\"ののこ\",\"nonomura hideki\":\"野々村秀樹\",\"nononono\":\"のののの\",\"nonta\":\"のんた\",\"nooca\":\"nooca\",\"noran\":\"noran\",\"norasuko\":\"ノラスコ\",\"nori heita\":\"海苔餅太\",\"nori senbei\":\"海苔せんべい\",\"norikara\":\"のりから\",\"norikin\":\"海苔規\",\"noriko\":\"NORIKO\",\"norimatsu nanami\":\"のりまつななみ\",\"norinko\":\"のりんこ\",\"norio\":\"のりお\",\"norita\":\"のり太\",\"noritama\":\"のりたま\",\"norizi\":\"のりじ\",\"norte\":\"Norte\",\"noruriri\":\"ノルリリ\",\"nosa\":\"NOSA\",\"nosekichiku\":\"野石竹\",\"noshi\":\"ノシ\",\"noshigami\":\"のしがみ\",\"nosuke\":\"のすけ\",\"noto\":\"能戸\",\"noumen\":\"ノウメン\",\"noumiso\":\"脳みそ\",\"noumitsu\":\"のうみつ\",\"nov\":\"nov\",\"noyomi dx\":\"ノヨミDX\",\"nozarashi satoru\":\"秋神サトル\",\"nozawa yukiko\":\"野澤ゆき子\",\"nozomi ayaka\":\"希望あやか\",\"nozomu\":\"のぞむ\",\"np\":\"NP\",\"npo\":\"んぽ\",\"ns\":\"NS\",\"nt robo\":\"NTロボ\",\"nt00\":\"NT00\",\"nu-\":\"ぬー\",\"nucomas\":\"ぬこマス\",\"nue\":\"鵺\",\"nui\":\"ぬい\",\"nukiyama gaisei\":\"拔山蓋世\",\"nukobao\":\"ぬこばお\",\"nukoko\":\"ぬここ\",\"nukui lususu\":\"ぬくい味汐\",\"numada\":\"沼田\",\"numata chihiro\":\"ぬまたちひろ\",\"number 55\":\"number_55\",\"numeko\":\"Numeko\",\"numeri\":\"ぬめり\",\"nun\":\"ぬん\",\"nunohechima\":\"ヌノヘチマ\",\"nupuryu\":\"ぬぷ竜\",\"nurikabe\":\"ぬり壁\",\"nuruken\":\"ぬるけん\",\"nurumu\":\"ぬるむ\",\"nutro\":\"nutro\",\"nuu\":\"ヌゥ\",\"nuyakana\":\"ぬャカな\",\"nwonyo\":\"んをんよ\",\"ny-o-ph\":\"NY-O-PH\",\"nyagomaru\":\"にゃご丸\",\"nyahu\":\"にゃふ\",\"nyakaaki\":\"にゃかあき\",\"nyake\":\"にゃけ\",\"nyakki\":\"にゃっき\",\"nyakkuru\":\"ニャックル\",\"nyamal\":\"にゃまる\",\"nyamota\":\"にゃもた\",\"nyamu\":\"にゃむ\",\"nyanbii\":\"にゃんびぃ\",\"nyangorou\":\"にゃんごろー\",\"nyanko\":\"猫狐\",\"nyanko mic\":\"にゃんこMIC\",\"nyantarou\":\"にゃん太郎\",\"nyanya\":\"nyanya\",\"nyanzo\":\"にゃんぞー\",\"nyara\":\"nyara\",\"nyarosu\":\"にゃろす\",\"nylon\":\"ナイロン\",\"nyoichi\":\"にょいち\",\"nyonyonba tarou\":\"にょにょんば太郎\",\"nyoriko\":\"にょりこ\",\"nyorori\":\"にょろり\",\"nyorutarou\":\"にょる太郎\",\"nyu\":\"nyu\",\"nyuuhin\":\"にゅーひん\",\"o-bow\":\"O-bow\",\"o-ji\":\"おーじ\",\"o.p com\":\"おぽこむ\",\"o.ri\":\"O.RI\",\"oasis\":\"オアシス\",\"oba yoshifumi\":\"大庭佳文\",\"obakyu-taro\":\"089タロー\",\"obata hiroyuki\":\"小幡寛之\",\"obata yayoi\":\"おばたやよい\",\"obmas\":\"obmas\",\"oboroduki yamiya\":\"朧月闇夜\",\"oborotsuki kakeru\":\"朧月カケル\",\"obyaa\":\"おびゃー\",\"ocha\":\"お茶\",\"ochatan\":\"おちゃたん\",\"ochatsumi\":\"オチャツミ\",\"ochi ai\":\"越智愛\",\"ochi gento\":\"越智源斗\",\"ochita taiji\":\"越智多たいじ\",\"ocodo\":\"おこど\",\"octotaco\":\"奥藤た子\",\"oda\":\"oda\",\"oda akira\":\"おだ あきら\",\"oda haiji\":\"織田灰至\",\"oda natsuki\":\"織田夏樹\",\"odabutsu\":\"おだぶつ\",\"oden\":\"おデン\",\"oden no shima\":\"おでんno島\",\"oden70\":\"おでん70\",\"oekakizuki\":\"oekakizuki\",\"og\":\"Og\",\"ogami kazuki\":\"拝一樹\",\"ogami wolf\":\"拝狼\",\"ogata\":\"Ogata\",\"ogata gatarou\":\"オガタガタロー\",\"ogata hiro\":\"御形紘\",\"ogata mamimi\":\"緒方マミ美\",\"ogata satomi\":\"緒方賢美\",\"ogawa hidari\":\"小川ひだり\",\"ogawa mashiro\":\"オガワマシロ\",\"ogawa renji\":\"小河レンジ\",\"ogiara\":\"オギアラ\",\"ogino\":\"オギノ\",\"oguma\":\"oguma\",\"ogura anko\":\"おぐらあん子\",\"oguramansai\":\"小倉萬采\",\"ohakotome\":\"おはことめ\",\"ohanabatake run\":\"御花畑るん\",\"ohara makoto\":\"おはら誠\",\"ohiensis\":\"オヒエンシス\",\"ohio-shuu riki\":\"オハイオ州力\",\"ohiru\":\"電SUKE\",\"ohiya\":\"お冷\",\"ohka\":\"おーか\",\"ohma\":\"謳馬\",\"ohmi\":\"近江\",\"ohmi takeshi\":\"大見武士\",\"ohno kanae\":\"大野かなえ\",\"ohrin\":\"王林\",\"ohsima kouichi\":\"大島洸一\",\"ohsugi yukihiro\":\"大杉 ゆきひろ\",\"ohtsuki suzuki\":\"大槻涼樹\",\"oimo\":\"おいも\",\"oimori yura\":\"及森ゆうら\",\"oimoto jirou\":\"おいもとじろう\",\"ojii\":\"おじい\",\"ojii-chan\":\"おじいちゃん\",\"okabayashi beru\":\"岡林べる\",\"okada kojiko\":\"冈田こじ子\",\"okada reimi\":\"冈田れいみ\",\"okagiri shou\":\"岡霧硝\",\"okama\":\"OKAMA\",\"okamoto\":\"オカモト\",\"okamoto fujio\":\"おかもとふじお\",\"okamura hijiki\":\"岡村ひじき\",\"okamura takahiro\":\"岡村孝公\",\"okashira\":\"おかしら\",\"okashita makoto\":\"岡下誠\",\"okatora\":\"岡虎\",\"okawa wataru\":\"大河渡\",\"okawari\":\"OKAWARI\",\"okawari jiyuu\":\"おかわり児遊\",\"okaya hitsuji\":\"ヲカヤヒツジ\",\"okayado\":\"オカヤド\",\"okayu\":\"Okayu\",\"okazaki mituki\":\"おかざきみつき\",\"okazaki nao\":\"岡崎那緒\",\"okazu yuuichi\":\"オカズゆういち\",\"oke\":\"桶\",\"okeashi chiyoko\":\"桶葭千夜子\",\"oki yukao\":\"沖由佳雄\",\"okidaka yuu\":\"沖高有\",\"okina\":\"OKINA\",\"okina naoki\":\"沖名なおき\",\"okino matsushiro\":\"沖の松城\",\"okino ryuuto\":\"沖野琉人\",\"okita ababa\":\"沖田あばば\",\"okiura\":\"okiura\",\"okiyo\":\"おきよ\",\"okki\":\"okki\",\"okoge senbei\":\"おこげ煎餅\",\"okome\":\"お米\",\"okowa\":\"おこわ\",\"okumura\":\"おくむら\",\"okuva\":\"奥ヴぁ\",\"okusan\":\"奥さん\",\"okuse saki\":\"奥瀬サキ\",\"om\":\"om\",\"omangarl\":\"オマンガール\",\"omega destroyer\":\"オメ～ガ・デストロイヤー\",\"omegane\":\"御眼鏡\",\"omi\":\"おみ\",\"omizu\":\"おみず\",\"omizu chihiro\":\"お水ちひろ\",\"omochi\":\"おもち\",\"omoutubo\":\"思うつぼ\",\"onamaru\":\"おな丸\",\"onapan\":\"おなぱん\",\"onetouch\":\"わんたっち\",\"onguuchi\":\"御宮内\",\"oni japu\":\"鬼 ジャプ\",\"oniben katze\":\"鬼遍かっつぇ\",\"oniku\":\"お肉\",\"oniku.\":\"お肉。\",\"onineko\":\"おにねこ\",\"onita\":\"歐尼鬼\",\"oniyama\":\"鬼山\",\"oniyuri\":\"オニユリ\",\"onizuka takuto\":\"鬼塚たくと\",\"onna\":\"onna\",\"onnami chiyu\":\"御並千侑\",\"ono misao\":\"小野ミサオ\",\"ono nui\":\"小野ぬい\",\"onoda sachi\":\"おのださち\",\"onodera\":\"おのでら\",\"onodera kazumi\":\"小野寺和海\",\"onoderasan\":\"おのでらさん\",\"onogawa kiwi\":\"小野川キウイ\",\"onomesin\":\"オノメシン\",\"onomichi\":\"Onomichi\",\"onsen nakaya\":\"おんせんなかや\",\"onsen no tubuyaki\":\"おんせんなかや\",\"onsoku zekuu\":\"己即是空\",\"onyo\":\"Onyo\",\"ooba jun\":\"大刃じゅん\",\"oofuji reiichirou\":\"大藤玲一郎\",\"oogane\":\"大金\",\"oohashi kaoru\":\"大橋薫\",\"ooi hanimaru\":\"大井はに丸\",\"ooi masakazu\":\"大井昌和\",\"ooi sakae\":\"大井栄\",\"ooiwa kenzi\":\"大岩ケンヂ\",\"ooizumi daisaku\":\"大泉だいさく\",\"ookami\":\"狼\",\"ookami yuuki\":\"大神ゆうき\",\"ooki bonta\":\"おおきぼん太\",\"ookido karo\":\"大城戸カロ\",\"ookubo matagi\":\"おおくぼマタギ\",\"ookuma tanuki\":\"大熊狸喜\",\"oomori harusame\":\"大守春雨\",\"oomori makoto\":\"大森誠\",\"oona mitsutoshi\":\"おおなみつとし\",\"oonami youko\":\"大波耀子\",\"oonita hiroyuki\":\"大仁田ヒロユキ\",\"oono\":\"オオノ\",\"oono tetsuya\":\"大野哲也\",\"oonuma shinichi\":\"大沼信一\",\"oosaka hananoko\":\"大阪花之呼\",\"oosawa\":\"大沢\",\"oose tsunami\":\"大瀬津波\",\"oosugi kazuma\":\"大杉和馬\",\"oota yuuichi\":\"大田優一\",\"ootake pashio\":\"大竹パシ夫\",\"ootani mikoto\":\"大谷みこと\",\"ootsuka potato\":\"大塚ぽてと\",\"ootsuka shirou\":\"大塚志郎\",\"ootsuki wataru\":\"大月渉\",\"oowada tomari\":\"大輪田泊\",\"ooyake\":\"公\",\"ooyama chiroru\":\"おおやまちろる\",\"opaisukii\":\"オパイスキー\",\"orange manbou\":\"おれんじまんぼう\",\"ore\":\"ore\",\"ore ebis\":\"俺エビス\",\"orenchin\":\"おれんちん\",\"orenuma tooko\":\"オレヌマトオコ\",\"oretto\":\"おれっと\",\"organico\":\"おるがにこ\",\"orico\":\"オリコ\",\"orihara kotone\":\"折原琴音\",\"orihi chihiro\":\"織日ちひろ\",\"orikawa\":\"折川\",\"orikuchi hirata\":\"折口ヒラタ\",\"orima inaka\":\"織間いなか\",\"orimiya mai\":\"おりみや舞\",\"orimoto mimana\":\"おりもとみなま\",\"oris\":\"織栖\",\"orishima yupopo\":\"織島ユポポ\",\"orita\":\"オリタ\",\"oriue wato\":\"織上ワト\",\"orizen\":\"おりぜん\",\"orizuru bros\":\"折鶴兄弟\",\"oroneko\":\"おろねこ\",\"oruna\":\"オルナ\",\"oryoku\":\"おーりょく\",\"os\":\"OS\",\"osafune\":\"オサフネ\",\"osagashi\":\"オサガシ\",\"osakana\":\"ヲさかな\",\"osana sumika\":\"幼菜すみか\",\"osanai mujica\":\"小山内ムジカ\",\"osato\":\"おさとう\",\"oseron\":\"オセロン\",\"oshimugi\":\"押麦\",\"oshousui\":\"和尚吹\",\"osora\":\"緒空\",\"osterei\":\"OSTEREi\",\"osuzu akiomi\":\"尾铃明臣\",\"osyakana\":\"おしゃかな\",\"otakehiko\":\"雄竹彦\",\"othello\":\"オセロ\",\"otochichi\":\"音乳\",\"otogi\":\"おとぎ\",\"otogi tetsurou\":\"おとぎてつろう\",\"otohiko\":\"音彦\",\"otohuke bonne\":\"音更ボンヌ\",\"otokam\":\"オトカム\",\"otokawa kazuki\":\"乙川カヅキ\",\"otori\":\"おとり\",\"ototo\":\"おとと\",\"otou\":\"尾刀\",\"otsuki miharu\":\"鳴月みはる\",\"ottoman turks\":\"オスマントル子\",\"otumaru\":\"乙丸\",\"otyawan\":\"オチャワン\",\"ou\":\"おぅ\",\"oudon\":\"おうどん\",\"ougi hina\":\"扇城ひな\",\"ougi nozomi\":\"扇希実\",\"ougon dokuro\":\"黄金髑髏\",\"ouhashi\":\"おうはし\",\"oujano kaze\":\"王者之風\",\"ouji tsukino\":\"王子月乃\",\"ouka\":\"オウカ\",\"ouka sushi\":\"桜花すし\",\"oukawa shiya\":\"桜川シヤ\",\"ouma bunshichirou\":\"逢摩文七郎\",\"oshiume nyora\":\"押梅にょら\",\"oumi noe\":\"近江のえ\",\"ouno\":\"奥之\",\"ounwm\":\"ounwm\",\"ousawa kanata\":\"桜沢かなた\",\"ouse riruka\":\"桜瀬りるか\",\"over line\":\"オーバーライン\",\"owa\":\"尾和\",\"owahu\":\"おわふ\",\"owal\":\"おわる\",\"oxideengine\":\"OXIDEENGINE\",\"oxxo\":\"OXXO\",\"oxy\":\"おきし\",\"oyaji\":\"オヤジ\",\"oyama robi\":\"御山ロビ\",\"oyuki\":\"おゆき\",\"ozaki\":\"おざき\",\"ozawa akifumi\":\"織澤あきふみ\",\"ozawa aoi\":\"オザワアオイ\",\"ozawa hiyori\":\"小沢ひより\",\"ozawa manabu\":\"緒沢まなぶ\",\"ozawa reido\":\"小泽零人\",\"ozawa you\":\"小沢悠\",\"ozora ituki\":\"大空樹\",\"ozuno mahou\":\"緒図乃真朋\",\"p no ji\":\"pの字\",\"p senpuki\":\"P せんぷき\",\"p tag\":\"Pタグ\",\"pageratta\":\"ぱげらった\",\"painpa\":\"パインパ\",\"paintmusume\":\"ペイント娘\",\"pal maison\":\"パルめぞん\",\"paleatus\":\"paleatus\",\"pan koojo\":\"パン☆工場\",\"pana\":\"PANA\",\"panbai\":\"PANBAI 旁白\",\"panda\":\"ぱんだ\",\"pandacorya\":\"ぱんだこりゃ\",\"pandain\":\"パンダィン\",\"pandatyama\":\"ぱんだちゃま\",\"pang9943\":\"pang9943\",\"panimi\":\"ぱに魅\",\"panpa\":\"ぱんぱー\",\"panta\":\"ぱん太\",\"pao\":\"パオ\",\"papa papan\":\"ぱぱ・ぱぱん\",\"papepoxx\":\"PAPEPOX2\",\"paper\":\"ぱぺる\",\"pappa\":\"パッパ\",\"paprika cider\":\"パプリカサイダー\",\"paradise d\":\"PARADISE“D”\",\"pararan\":\"ぱららん\",\"parfait\":\"ぱふぇ\",\"parins\":\"Parins\",\"parmiria\":\"パーミリア\",\"parua\":\"ぱるあ\",\"paruparu\":\"ぱるぱる\",\"pasdar\":\"pasdar\",\"pasera\":\"ぱせら\",\"pastachin\":\"パスタチン\",\"pato-chan\":\"パトちゃん\",\"patori\":\"ぱとり\",\"patricia\":\"パトリシア\",\"patrick hateman\":\"Patrick Hateman\",\"pd\":\"Pd\",\"peach\":\"Peach\",\"peat lock\":\"ぴーと・ろっく\",\"peke\":\"ぺけ\",\"pekeko\":\"ペケこ\",\"penguindou\":\"筆吟堂\",\"peniken\":\"ぺに健\",\"pensuke\":\"ぺんすけ\",\"pepe\":\"ぺぺ\",\"pepo\":\"ぺぽ\",\"perimaru\":\"ぺり丸\",\"permille\":\"permille\",\"pero\":\"ぺろ\",\"personality\":\"personality\",\"peruri\":\"ぺるり\",\"peso\":\"ペソ\",\"petag2\":\"petaG2\",\"pgb\":\"pgb\",\"phantom\":\"ふぁんとむ\",\"philan\":\"Philan\",\"philly\":\"Philly\",\"phoenicia masako\":\"フェニキア雅子\",\"pi-ko\":\"ぴーこ\",\"pia pia\":\"Pia☆Pia\",\"piano\":\"ぴあの\",\"piaroo\":\"Piaroo\",\"pickles\":\"ピクルス\",\"picpicgram\":\"ぴこぴこぐらむ\",\"pide\":\"Piで\",\"pierre norano\":\"ピエールのらの\",\"pihii\":\"ぴひー\",\"pikachi\":\"ぴかち\",\"pikachurin\":\"ピカチュリン\",\"pikaichi\":\"ぴかいち\",\"pikath\":\"ぴかっち\",\"pikazo\":\"Pikazo\",\"pikeru\":\"ピケル\",\"piku star cell\":\"ぴく☆せる\",\"pikupikun\":\"ピクピクン\",\"pilky\":\"ぴるきー\",\"pimoco\":\"pimoco\",\"pin vice\":\"PIN・VICE\",\"pinakes\":\"ピナケス\",\"pingure\":\"ピングレ\",\"pinksel\":\"Pinksel\",\"pino\":\"ぴの\",\"pinta\":\"PINTA\",\"pip\":\"PIP\",\"pipa\":\"ぴぱ\",\"pira\":\"ぴら\",\"pirikara syuga\":\"ピリ辛シュガー\",\"pirorun\":\"ぴろるん\",\"pistanya\":\"ピスターニャ\",\"piston\":\"ぴすとん\",\"piyo\":\"PiYo\",\"piyopiyo\":\"ぴよぴよ\",\"pizanuko\":\"ぴざぬこ\",\"pizi2 gou\":\"pizi2号\",\"pj-1\":\"PJ-1\",\"plasma beach\":\"プラズマビーチ\",\"plum\":\"ぷらむ\",\"plus\":\"プラス\",\"pocchi\":\"ぽっち\",\"poin\":\"ぽいん\",\"poison needle\":\"Poison Needle\",\"pokke\":\"ぽっけ\",\"pokochin\":\"ぽこちん\",\"pokota\":\"ぽこた\",\"pokurouta\":\"ポクロウタ\",\"pole\":\"ポール\",\"polorinken\":\"ポロリン軒\",\"poma\":\"poma\",\"pomimiko\":\"ぽみみ子\",\"pomupomu\":\"ぽむぽむ\",\"ponchi\":\"ぽんち\",\"ponde\":\"ぽんで\",\"ponhosikotu\":\"PON☆骨\",\"poni.\":\"ぽに。\",\"ponkan 8\":\"ぽんかん⑧\",\"ponkichi\":\"ぽんきち\",\"ponkotsu\":\"ぽんこつ\",\"ponpe matkachi\":\"尾形全\",\"ponyuzu\":\"ぽんゆず\",\"ponzu\":\"ぽん酢\",\"popo\":\"popo\",\"poponko\":\"ぽぽんこ\",\"popopalt\":\"ぽぽぱると\",\"nishi shizumu\":\"西しずむ\",\"poriko\":\"ポリ子\",\"poriuretan\":\"ぽりうれたん\",\"poron\":\"ぽろん\",\"poronatsu\":\"ポロなつ\",\"porosuke\":\"ぽろすけ\",\"porurin\":\"ポルリン\",\"poshushi\":\"ぽしゅ氏\",\"potsu\":\"ぽつ\",\"potu\":\"ぽつ\",\"powaito\":\"ぽわいと\",\"poyamu\":\"ぽやむ\",\"poyo equals namaste\":\"ポヨ=ナマステ\",\"pozesuke\":\"ポゼ助\",\"ppoint\":\"Pポイント\",\"preggypenny\":\"PreggyPenny\",\"president-p\":\"president-p\",\"prhs\":\"Prhs\",\"pri\":\"ぷり\",\"princess lemanko\":\"プリンセスレマン子\",\"project bellerophon\":\"Project Bellerophon\",\"prophecy\":\"ぷろへしぃ\",\"propolisee\":\"プロポリスEE\",\"psohatten\":\"psohatten\",\"ptai\":\"ptai\",\"pu-en\":\"pu-en\",\"pu2\":\"pu2\",\"pua\":\"Pua\",\"pucca\":\"ぷっか\",\"puchida\":\"ぷちだ\",\"puchii puuchii\":\"ぷーちぃ・ぷぅちぃ\",\"pukara\":\"PUKARA\",\"pukkunn\":\"ぷっくん\",\"punita\":\"ぷにた\",\"puniyama meroro\":\"ぷにやまめろろ\",\"punyon\":\"プニョン\",\"puranpuman\":\"ぷらんぷまん\",\"purapa\":\"ぷらぱ\",\"pureinn\":\"pureinn\",\"puriko\":\"プリ子\",\"purin\":\"ぷりん\",\"puripuri jet\":\"プリプリJET\",\"puripuri kikou shidan\":\"ぷりぷり機甲師団\",\"puripuri uemon\":\"ぷりぷり大佐\",\"purisa\":\"purisa\",\"puritei\":\"ぷりてゐ\",\"purplecroudhill\":\"紫雲山頂\",\"puti\":\"ぷち\",\"pyouryuu\":\"彪竜\",\"pyz\":\"pyz\",\"q1\":\"究一\",\"qiqo\":\"qiqo\",\"qko\":\"Q子\",\"qoom\":\"くーム\",\"quanxing\":\"光星\",\"qudamomo\":\"Qudamomo\",\"qunami himehiko\":\"九波ヒメヒコ\",\"qutouten\":\"句読点\",\"quu\":\"Quu\",\"qzna\":\"qzna\",\"r\":\"あーる\",\"r-ex\":\"R-Ex\",\"ra-men\":\"らーめん\",\"rabbi\":\"らび\",\"rabbit\":\"Rabbit\",\"racer\":\"racer\",\"racket\":\"らけっと\",\"radio\":\"ラジオ\",\"radiohead\":\"ラヂヲヘッド\",\"raemz\":\"Raemz\",\"rafuro\":\"ラフロ\",\"ragetsu\":\"裸月\",\"rai\":\"ライ\",\"raiden\":\"らいでん\",\"raijin maru\":\"雷神丸\",\"raika\":\"ライカ\",\"raimu\":\"莱夢\",\"raipa zrx\":\"雷覇ZRX\",\"rairarai\":\"らいらライ\",\"raitei\":\"雷丁\",\"raiun\":\"らいうん\",\"rajii\":\"らじー\",\"rakia\":\"rakiA\",\"rakko\":\"らっこ\",\"rakkyo\":\"ラッキョ\",\"rakuda torino\":\"楽田トリノ\",\"rakuji tarahi\":\"楽時たらひ\",\"rakuria\":\"ラクリア\",\"rama\":\"らま\",\"ramble\":\"RAMBLE\",\"ramdac 300\":\"RAMDAC 300\",\"ramen-penguin\":\"拉麵企鵝\",\"rami\":\"らみ\",\"ramii\":\"らみぃ\",\"ramototu\":\"ラモトツ\",\"ramu\":\"らむ\",\"ran\":\"RAN\",\"ranaecho\":\"ranaECHO\",\"ranke\":\"らんけ\",\"rannero\":\"RanneRo\",\"rarana\":\"ららな\",\"rasahan\":\"ラサハン\",\"rasson\":\"らっそん\",\"rasukaru\":\"らすかる\",\"rate\":\"RaTe\",\"rati\":\"ラティ\",\"rayze\":\"瑞氏\",\"razy\":\"らじー\",\"razz\":\"らず\",\"recaro\":\"れかろ\",\"red.d\":\"Red.D\",\"redhair\":\"RedHair\",\"redking\":\"れっどきんぐ\",\"rei\":\"REI\",\"rei park\":\"れいぱぁく\",\"reigamk2\":\"麗牙Mk-2\",\"reiji\":\"れゐぢ\",\"reika\":\"零花\",\"reimei\":\"黎明\",\"reine\":\"レーヌ\",\"reishiki aria\":\"零式アリア\",\"rekisitaihoonoji\":\"レキシタイふのじ\",\"reku\":\"れく\",\"rela\":\"Rela\",\"relm\":\"りるむ\",\"remora\":\"remora\",\"remu\":\"れむ\",\"ren mizuha\":\"蓮みづは\",\"ren suru\":\"れんする\",\"rena\":\"れな\",\"renge\":\"れんげ\",\"rentaichou\":\"连队长\",\"rentan\":\"煉丹\",\"rescar\":\"れすか\",\"reso\":\"れーそ\",\"retasu\":\"れたすー\",\"reto\":\"れと\",\"retota\":\"れと太\",\"ri-ru-\":\"りーるー\",\"ri.\":\"ri.\",\"tajima ria\":\"立嶋りあ\",\"rian\":\"りあん\",\"riboshika\":\"リボシカ\",\"ricca\":\"りっか\",\"ricchy\":\"ricchy\",\"rice oomori\":\"ライスおおもり\",\"rie\":\"RiE\",\"rihi\":\"りひ\",\"rihitozoire\":\"リヒトゾイレ\",\"rii\":\"りい\",\"rikamarika\":\"rikamarika\",\"rikazu\":\"rikazu\",\"riki\":\"利木\",\"rikka\":\"立夏\",\"rikoko\":\"りここ\",\"rikomaru\":\"りこ丸\",\"rikose\":\"リコセ\",\"riku maru\":\"りくまる\",\"rikudo inuhiko\":\"六堂犬彦\",\"rikudou\":\"六道\",\"rikudou koushi\":\"六道神士\",\"rikume\":\"rikume\",\"rikusu\":\"リクス\",\"rikuto\":\"六兎\",\"rimukoro\":\"リムコロ\",\"rimviolet\":\"rimviolet\",\"rin\":\"rin\",\"rindoh\":\"竜瞳\",\"rindou akira\":\"りんどうあきら\",\"ringo\":\"りんご\",\"ringo amee\":\"林檎あめぇ\",\"ringo anu\":\"りんごあぬ\",\"ringo no kisetsu.\":\"りんごの季節。\",\"rinku\":\"りんく\",\"rinno arara\":\"りんのあらら\",\"rino nymphet\":\"Rino nymphet\",\"rinoko\":\"リノコ\",\"rinri kazuki\":\"倫理一輝\",\"rinsun\":\"リンスン\",\"rinta\":\"りんた\",\"rinunu\":\"りぬぬ\",\"rioemon\":\"緋良雪リオ\",\"rioka\":\"rioka\",\"rioko\":\"りおこ\",\"ripton\":\"りぷとん\",\"rir\":\"RIR\",\"ririmat tsuruegar\":\"リリマット・ツルーガー\",\"risa.\":\"りさ。\",\"risei\":\"李星\",\"risuou\":\"李子昴\",\"risupu\":\"risupu\",\"rit.\":\"rit.\",\"rittiri\":\"リッティリ\",\"rityou\":\"リチョウ\",\"riumu\":\"りうむ\",\"riuta gao\":\"りうたがお\",\"rivale\":\"RIVALE\",\"riyun\":\"RiYUN\",\"ro\":\"ro\",\"roche\":\"Roche\",\"rocket kyoudai\":\"ロケット兄弟\",\"rocket okaboshi\":\"ロケット岡星\",\"rockmanwjh\":\"rockmanwjh\",\"roco\":\"ロコ\",\"rohgun\":\"老眼\",\"rojione\":\"ロジオネ\",\"roki\":\"Roki\",\"rokko\":\"ロッコ\",\"rokomaru\":\"ロコ丸\",\"roku\":\"ロク\",\"rokudou ashura\":\"六道阿修羅\",\"rokujyou\":\"六畳\",\"rokuku\":\"ろくく\",\"rokumei kanau\":\"鹿鳴叶\",\"rokumonsen kako\":\"六文銭カコ\",\"rokuroichi\":\"ロクロイチ\",\"rokusiru\":\"六汁\",\"rokusuke\":\"ろくすけ\",\"rokusyou kokuu\":\"緑青黒羽\",\"rollei\":\"ローライ\",\"rontan\":\"ろんたん\",\"root001\":\"root001\",\"roreru\":\"ろれる\",\"roro\":\"ロロ\",\"rorochannel\":\"ろろちゃんねる\",\"roromo\":\"ろろも\",\"rororogi mogera\":\"露々々木もげら\",\"ros\":\"ROS\",\"roshuu takehiro\":\"浪州建博\",\"rou\":\"rou\",\"rouka\":\"ろうか\",\"route39\":\"Route39\",\"roy tong-koh\":\"瑞東航\",\"roze\":\"ロゼ\",\"rozen\":\"ロゼン\",\"rq\":\"RQ\",\"rt.\":\"RT.\",\"rubaka\":\"Rubaka\",\"rucu\":\"るく\",\"rucuk\":\"るく\",\"rudo\":\"Rudo\",\"rudoni\":\"ルドーニ\",\"ruha69\":\"ruha69\",\"rui\":\"RUI\",\"ruiko\":\"RUIKO\",\"ruirui\":\"るいるい\",\"rukichi\":\"るきち\",\"rumina\":\"るみな\",\"rumiya\":\"るみや\",\"rumiya isasa\":\"流宮いささ\",\"run\":\"ルン\",\"runa\":\"runa\",\"rune\":\"るね\",\"ruratto\":\"るらっと\",\"ruri erika\":\"瑠璃えりか\",\"ruri rarako\":\"瑠璃ららこ\",\"rurien\":\"瑠璃燕\",\"rurimaru\":\"瑠璃丸\",\"ruroo\":\"るろお\",\"rururu\":\"流×3♪\",\"rusher verak\":\"ラッシャーヴェラク\",\"rushi\":\"るし\",\"rushsoldier\":\"RushSoldier\",\"russia no dassouhei\":\"ロシヤの脱走兵\",\"rutubo\":\"るつぼ\",\"rux\":\"rux\",\"rxjx\":\"RxJx\",\"ryo.k\":\"りょう・K\",\"ryoattoryo\":\"りょう@涼\",\"ryoji\":\"Ryoji\",\"ryokunyo\":\"りょうくんよ\",\"ryokuoushoku\":\"緑黄色\",\"ryokusiki\":\"緑式\",\"ryokutya\":\"ryokutya\",\"ryomaru\":\"りょまる\",\"ryome gantai\":\"両目眼帯\",\"ryosuke.\":\"涼助。\",\"ryouei\":\"諒英\",\"ryu\":\"RYU\",\"ryu shou\":\"劉祥\",\"ryu-akt\":\"Ryu-Akt\",\"ryujin\":\"RYUJIN\",\"ryuki\":\"リュウキ\",\"ryumage\":\"りう☆めいじ\",\"ryuno\":\"ryuno\",\"ryunosuke\":\"龍之介\",\"ryutou\":\"竜湯\",\"ryuudou hiromi\":\"龍堂ひろみ\",\"ryuuka ryou\":\"りゅうか綾\",\"konoshige\":\"コノシゲ\",\"ryuuna\":\"りゅうな\",\"ryuutai niku\":\"流体肉\",\"s\":\"S\",\"s parameter\":\"S・パラミター\",\"s-ram\":\"エスラム\",\"s.kosugi\":\"S.濃すぎ\",\"s.shimizu\":\"S.SHIMIZU\",\"s73d\":\"s73d\",\"saaya\":\"さあや\",\"sabahito\":\"鯖人\",\"sabaku\":\"砂漠\",\"sabakui\":\"食鯖獣\",\"sabaneko\":\"さばねこ\",\"sabanoniwatori\":\"さばのにわとり\",\"sabawo\":\"サバヲ\",\"sabbath\":\"Sabbath\",\"sabi wasabi\":\"錆わさび\",\"sabuko\":\"サブコ\",\"saburou\":\"サブロー\",\"sacchi\":\"さっち\",\"sachito\":\"サチト\",\"sachuma\":\"さちゅま\",\"saco\":\"saco\",\"sad\":\"SAD\",\"sadagorou\":\"貞五郎\",\"sadahiro\":\"定宏\",\"sadakichi\":\"さだ吉\",\"sado\":\"さど\",\"saebashi\":\"さえばし\",\"saegusa kohaku\":\"冴草こはく\",\"saegusa mutsumi\":\"さえぐさ睦\",\"saeki kura\":\"佐伯倉\",\"saeki takao\":\"冴樹高雄\",\"saemon\":\"サエモン\",\"safi\":\"さふぃ\",\"sagakichi\":\"さがきち\",\"sagami inumaru\":\"佐上犬丸\",\"sagami rin\":\"相模琳\",\"sagami yoshitsune\":\"沙神よしつね\",\"sagano hellmer\":\"サガノヘルマー\",\"sagano yuuji\":\"サガノユウジ\",\"sahara\":\"サハラ\",\"sai-go\":\"sai-go\",\"saiga mayu\":\"栖賀まゆ\",\"saigi\":\"サイギ\",\"saijo satoru\":\"西條サトル\",\"saika\":\"彩霞\",\"saiki\":\"斉木\",\"saiki efu\":\"彩樹衛生\",\"saiki makiko\":\"斉木マキコ\",\"saikirider\":\"サイキライダー\",\"saikyo pink\":\"才京ぴんく\",\"saint shiro\":\"聖シロー\",\"sainyan\":\"さいにゃん\",\"saipin\":\"さいピン\",\"sairi\":\"サイリ\",\"saita masataka\":\"才田雅孝\",\"saito\":\"才斗\",\"saito sakae\":\"さいとー栄\",\"saito yahu\":\"サイトウヤフ\",\"saitou\":\"斎藤\",\"saitou natsuki\":\"斎藤なつき\",\"saitou tomoyuki\":\"斉藤友之\",\"saitou yamashironokami yukihiko\":\"齋藤山城守之彦\",\"saitou yuuichi\":\"斉藤祐一\",\"saizuka mio\":\"祭塚澪\",\"saji\":\"さじ\",\"saka\":\"さか\",\"sakae\":\"サカエ\",\"sakai hitoshi\":\"酒井仁\",\"sakai meri\":\"境メリ\",\"sakai ringo\":\"坂井リンゴ\",\"sakaki imasato\":\"さかきいまさと\",\"sakaki maki\":\"榊MAKI\",\"sakaki naomoto\":\"さかきなおもと\",\"sakaki shigeru\":\"榊しげる\",\"sakaki tsui\":\"さかきツイ\",\"sakaki yuino\":\"榊ゆいの\",\"sakakibara kaorunaoko\":\"榊原薫奈緒子\",\"sakakibara keisuke\":\"榊原圭介\",\"sakamoto sarutomunto nerima\":\"坂本サルトムント練馬\",\"sakana\":\"魚\",\"sakana tomomi\":\"魚ともみ\",\"sakasana\":\"さかさな\",\"sakata kintoki\":\"坂田金時\",\"sakawaki herodai\":\"サカワキヒロ太\",\"sakayaki\":\"月代\",\"sakazuki homare\":\"酒月ほまれ\",\"sakemasu\":\"サケマス\",\"saketanuki\":\"酒たぬき\",\"saki\":\"saki\",\"saki meguru\":\"咲巡留\",\"sakida saki\":\"さきだ咲紀\",\"sakifox\":\"sakifox\",\"sakimi\":\"さきみ\",\"sakimiya\":\"sakimiya\",\"sakishita senmu\":\"さきしたせんむ\",\"sakisita\":\"さきした\",\"sakiyamama\":\"sakiyamama\",\"sakiyo cake\":\"崎由けぇき\",\"sako\":\"サコ\",\"sakofu\":\"さこふ\",\"sakokichi\":\"さこきち\",\"saku\":\"saku\",\"sakuganki\":\"削顔鬼\",\"sakula\":\"SAKULA\",\"sakumi\":\"サクミ\",\"sakumichi\":\"さくみち\",\"sakuna\":\"さくな\",\"sakura alta\":\"桜あるた\",\"sakura ashika\":\"さくらあしか\",\"sakura bunchou\":\"桜文鳥\",\"sakura hanatsumi\":\"佐倉はなつみ\",\"sakura hiiro\":\"さくらひいろ\",\"sakura ichika\":\"桜イチカ\",\"sakura kotetsu\":\"桜小鉄\",\"sakura mafumi\":\"佐倉まふみ\",\"sakura masachi\":\"佐倉まさち\",\"sakura mkii\":\"SAKURA・mkII\",\"sakura moyon\":\"桜もよん\",\"sakura pino\":\"咲楽ぴの\",\"sakura pochi\":\"桜ポチ\",\"sakura rio\":\"佐倉りお\",\"sakura ryuuken\":\"桜りゅうけん\",\"sakura sawa\":\"紗久楽さわ\",\"sakura yukimi\":\"桜ゆきみ\",\"sakuraba yuuki\":\"桜庭友紀\",\"sakuragi rian\":\"桜木李杏\",\"sakurai\":\"サクライ\",\"sakurai aya\":\"桜井綾\",\"sakurai energy\":\"櫻井エネルギー\",\"sakurai kouki\":\"桜井コウキ\",\"sakuraizumi yuu\":\"桜泉ゆう\",\"sakuramaru\":\"さくらまる\",\"sakuramochi\":\"桜餅\",\"sakurano hinako\":\"桜乃ひな子\",\"sakurano ru\":\"櫻野露\",\"sakurazari hotori\":\"桜去ほとり\",\"sakusaku\":\"sakusaku\",\"sakusha fushou\":\"作者不詳\",\"sakuya tsuitachi\":\"さくやついたち\",\"sakw\":\"sakw\",\"salamander\":\"サラマンダ\",\"salmon\":\"サーモン\",\"salty\":\"ソルティ\",\"salty dog\":\"ソルティドッグ\",\"sam\":\"Sam\",\"same\":\"さめ\",\"same kamaboko\":\"鮫かまぼこ\",\"samejima minoru\":\"鮫島実\",\"samoko\":\"さもこ\",\"samozumo tooru\":\"さもずも融\",\"sanada kana\":\"真田カナ\",\"sanada mike\":\"真田ミケ\",\"sanada rin\":\"真田鈴\",\"sanada sin-ichi\":\"真田真壱\",\"sanami\":\"さなみ\",\"sanase nasa\":\"真世那沙\",\"sanbasou\":\"さんば挿\",\"sanbu kousaku\":\"三部耕作\",\"sangatsu\":\"三月\",\"sangou\":\"さんごう\",\"sanjou tomomi\":\"三条友美\",\"sanku\":\"三九\",\"sankuro\":\"三九呂\",\"sannyuutei shinta\":\"三乳亭しん太\",\"sano lemon\":\"さのレモン\",\"sano toshihide\":\"佐野俊英\",\"sanomako\":\"さのまこ\",\"sanpaku\":\"三泊\",\"sanpatisiki\":\"38式\",\"sansyouo\":\"山椒魚\",\"santos\":\"サントス\",\"sanuki ami\":\"さぬき亜美\",\"sanukinokami takakage\":\"讃岐守隆影\",\"sanwaribiki\":\"三割引\",\"sanzo\":\"三三\",\"sanzui\":\"酸水\",\"saogokushi\":\"さおごくし\",\"saotome mokono\":\"早乙女もこ乃\",\"sape\":\"さぺ\",\"sapphire\":\"サファイア\",\"saraki\":\"saraki\",\"saranaru takami\":\"皿成高味\",\"saranoki chikara\":\"沙羅木力\",\"sarashina ryouichi\":\"更科了一\",\"sarfata\":\"さふぁ太\",\"sarikyou\":\"サリキョウ\",\"saru\":\"saru\",\"saru pikkoro\":\"サル・ピッコロ\",\"sarujie\":\"さるぢえ\",\"saruno ikigimo\":\"さるのいきぎも\",\"sas\":\"SAS\",\"sasa\":\"ささ\",\"sasa sakuno\":\"佐々さくの\",\"sasagawa nagaru\":\"笹川ながる\",\"sasai\":\"些細\",\"sasaki\":\"ササキ\",\"sasaki kuro\":\"ささきくろ\",\"sasaki maru\":\"笹木まる\",\"sasaki muu\":\"佐々木無宇\",\"sasaki saki\":\"ササキ サキ\",\"sasaki sasa\":\"笹木ささ\",\"sasaki sasasa\":\"ささき笹々\",\"sasaki shinpei\":\"佐々木慎平\",\"sasaki tamaru\":\"佐々木珠流\",\"sasaki teron\":\"佐々木てろん\",\"sasakichi\":\"ささきち\",\"sasamaru\":\"笹丸\",\"sasamashin\":\"ササマシン\",\"sasana\":\"sasana\",\"sasanoha toro\":\"笹乃葉とろ\",\"sasara\":\"ささら\",\"sasato\":\"笹徒\",\"sasayuki\":\"SASAYUKi\",\"sashimi\":\"さしみ\",\"sasizume soutarou\":\"差詰そうたろう\",\"sasori butter\":\"さそりバター\",\"sataken\":\"佐竹犬\",\"satetsu\":\"サテツ\",\"sato\":\"sato\",\"sato seila\":\"佐藤せいら\",\"satomi\":\"里美\",\"satomi hidefumi\":\"さとみひでふみ\",\"satomi hinako\":\"里海ひなこ\",\"satomi hiroyuki\":\"里見ひろゆき\",\"satomi sato\":\"里見サト\",\"satonaka chora\":\"さとなか樗良\",\"satonishi\":\"サトニシ\",\"satoo aki\":\"さとうあき\",\"satosi\":\"Satosi\",\"satou\":\"佐藤\",\"satou hagane\":\"佐藤はがね\",\"satou iori\":\"佐藤イオリ\",\"satou kana\":\"佐藤カナ\",\"satou kimiatsu\":\"さとうきみあつ\",\"satou makura\":\"さとう枕\",\"satou masa\":\"沙藤昌\",\"satou memeko\":\"さとうメメ子\",\"satou rima\":\"佐藤りま\",\"satou samu\":\"佐藤36\",\"satou santouhei\":\"さとう三等兵\",\"satou shouji\":\"佐藤想次\",\"satou tomoyuki\":\"佐藤知行\",\"satou toshio\":\"佐藤登志夫\",\"satouori\":\"さとうおり\",\"satozaki\":\"里崎\",\"satsuki\":\"朔月\",\"satsuki fumi\":\"皐月フミ\",\"satsuki gen\":\"皐月幻\",\"satsuki haru\":\"皐月ハル\",\"satsuki mikazu\":\"皐月みかず\",\"satsuki suzuran\":\"皐月すずらん\",\"satsuki usagi\":\"皐月ウサギ\",\"satsuki yuni\":\"佐月由仁\",\"sattol\":\"さっとる\",\"sattsu\":\"さっつ\",\"sawa\":\"さわ\",\"sawada daisuke\":\"沢田大介\",\"sawai delta\":\"澤井デルタ\",\"sawaki saki\":\"澤木沙樹\",\"sawako\":\"サワコ\",\"sawamura\":\"澤村\",\"sawamura ao\":\"沢村青\",\"sawamura kina\":\"さわむらきな\",\"sawarano goan\":\"さわらの五庵\",\"sawasaki\":\"沢崎\",\"sawashiro kei\":\"沢城ケイ\",\"sawatari hitoshi\":\"沢渡仁司\",\"sawatei\":\"さわてぃ\",\"sawori\":\"サヲリ\",\"sayaka\":\"紗弥香\",\"sayakata katsumi\":\"茶館カツミ\",\"sayoshi ayumi\":\"作吉歩允\",\"sayossa\":\"さよっさ\",\"sayousuke\":\"さようすけ\",\"sayun\":\"さゆん\",\"sazanami kazuto\":\"漣一人\",\"sazanami mio\":\"さざなみみぉ\",\"scarlet\":\"スカーレット\",\"sch-mit\":\"シューミット\",\"school izumi\":\"すくーるいずみ\",\"scope cat\":\"すこぉぷCAT\",\"scotch\":\"スコチ\",\"sdwing\":\"SDwing\",\"seanji sariel\":\"セアンジ・サリエル\",\"secco\":\"Secco\",\"sedra cicir\":\"sedra・cicir\",\"segami daisuke\":\"瀬上大輔\",\"segawa\":\"瀬川\",\"seguchi takahiro\":\"瀬口たかひろ\",\"sei torao\":\"瀬井虎男\",\"seidenki\":\"seidenki\",\"seigo\":\"せいご\",\"seiha\":\"Seiha\",\"seihoukei\":\"せいほうけい\",\"seiichi\":\"清一\",\"seijirou kagechika\":\"せいじろうかげちか\",\"seiju\":\"セイジュ\",\"seiryou touya\":\"青凌とうや\",\"seishinja\":\"精子ンジャ\",\"seito a\":\"生徒A\",\"sekiguchi hiroki\":\"セキグチヒロキ\",\"sekihan\":\"せきはん\",\"sekihara\":\"せきはら\",\"sekino takehiro\":\"関野武弘\",\"sekiyu\":\"石油\",\"sella\":\"せら\",\"semahiro\":\"せまひろ\",\"semimaru semi\":\"蝉丸せみ\",\"semino yuu\":\"蝉のゆう\",\"sena chifuyu\":\"瀬奈茅冬*\",\"sena monaco\":\"瀬菜モナコ\",\"sena rinko\":\"瀬名鈴子\",\"senakagashiri\":\"背中が尻\",\"senba\":\"千羽\",\"senbata roh\":\"せんばた楼\",\"senbon torii\":\"千本トリイ\",\"senda kouji\":\"千田耕司\",\"sendorikun\":\"せんどりくん\",\"senga migiri\":\"旋牙闇霧\",\"sengoku aky\":\"千国AKY\",\"sengoku-kun\":\"戦国くん\",\"senju rion\":\"千樹りおん\",\"senkan yamatoni\":\"戦艦大和煮\",\"senke kagero\":\"千家カゲロー\",\"senkou hanabi\":\"閃光花火\",\"sennomori maitake\":\"千ノ森まいたけ\",\"senomoto hisashi\":\"瀬之本久史\",\"senor daietsu\":\"セニョール大悦\",\"senpuyaro\":\"旋風野郎\",\"senrabanshou\":\"千羅万象\",\"senwa\":\"センワ\",\"senya yomi\":\"千夜詠\",\"seo haruto\":\"瀬尾春人\",\"seo tatsuya\":\"瀬尾辰也\",\"sera tooru\":\"瀬良透\",\"serakichi.\":\"世罗吉。\",\"seres ryu\":\"セレス龍\",\"seresu\":\"せれす\",\"seri nazuna\":\"せりなずな\",\"serika\":\"セリカ\",\"serikawa kazumi\":\"芹川一海\",\"serikawa saki\":\"芹川沙樹\",\"serimiya ransu\":\"芹宮らんす\",\"serino itsuki\":\"芹野いつき\",\"serizawa anne\":\"芹沢あんね\",\"serizawa katsumi\":\"芹沢克己\",\"serizawa nae\":\"芹澤ナエ\",\"serizawa yuuji\":\"芹沢ゆーじ\",\"sesame surigoma\":\"セサミすりごま\",\"seseri\":\"せせり\",\"sessa takuma\":\"浙佐拓馬\",\"sesso nashiko\":\"節操なし子\",\"sethxzoe\":\"sethxzoe\",\"setouchi\":\"瀬戸内\",\"setouchi kurage\":\"瀬戸内くらげ\",\"setouchi sumako\":\"せとうちすま子\",\"setsuna\":\"刹那\",\"setsuna yui\":\"せつな唯\",\"setuna rio\":\"刹那莉織\",\"sezan\":\"sezan\",\"sezoku\":\"セゾク\",\"shaa peipei\":\"西北々\",\"shachi\":\"しゃち\",\"shadow\":\"Shadow\",\"shaian\":\"しゃいあん\",\"shain a\":\"社員A\",\"shake\":\"しゃけ\",\"samon shiu\":\"左門しう\",\"shakeko\":\"しゃけこ\",\"shamon\":\"沙門\",\"shamorock heart\":\"シャモロックハート\",\"shamp samurai\":\"SHAMP侍\",\"sharaku seiya\":\"写裸苦聖也\",\"shark yaminabe\":\"シャーク闇鍋\",\"sharpffffff\":\"sharpFFFFFF\",\"shayo\":\"しゃよー\",\"shen yan\":\"哂言\",\"shena excel\":\"椎名エクセル\",\"shian\":\"しあん\",\"shiawase 1500\":\"幸せ1500\",\"shiawase ninaru\":\"幸瀬になる\",\"shiawase no katachi\":\"幸せのかたち\",\"shiba\":\"柴\",\"shibainu\":\"柴犬\",\"shibame\":\"しばあめ\",\"shibari kana\":\"縛夏奈\",\"shibaya\":\"しばや\",\"shibire hitsuji\":\"シビレヒツジ\",\"shibuki oroshi\":\"飛沫おろし\",\"shibusawa hayato\":\"渋沢隼人\",\"shichoson\":\"市町村\",\"shidaka akikuni\":\"しだかあきくに\",\"shidatsu takayuki\":\"紫妲たかゆき\",\"shieko\":\"しえこ\",\"shift\":\"shift\",\"shigaoka touki\":\"志峨丘トウキ\",\"shigatake\":\"シガタケ\",\"shigatsu sekito\":\"卯月赤人\",\"shigehira\":\"茂平\",\"shigekix\":\"しげきっくす\",\"shigi azusa\":\"鴫あずさ\",\"shiguchi satoshi\":\"シグチサトシ\",\"shigunyan\":\"しぐにゃん\",\"shigure kyou\":\"しぐれ卿\",\"shigure ryuunosuke\":\"時雨龍之介\",\"shihou\":\"志方\",\"shii\":\"しぃ\",\"shiigetsu yuu\":\"詩月雄\",\"shiina nami\":\"椎名波\",\"shiino yuy\":\"椎野唯\",\"shijima\":\"しじま\",\"shijima kiri\":\"しじま嬉吏\",\"shijima yukio\":\"四島由紀夫\",\"shijimi\":\"しじみ\",\"shijokko\":\"しじょっこ\",\"shijou mako\":\"士嬢マコ(・c_・ )\",\"shijou sadafumi\":\"四条定史\",\"shikage nagi\":\"しかげなぎ\",\"shikanari\":\"シカナリ\",\"shikata haru\":\"志方ハル\",\"shikato miyo\":\"しかとみよ\",\"shiki satoshi\":\"土贵智志\",\"shikigami azuma\":\"しきがみあずま\",\"shikimura\":\"しきむら\",\"shikino\":\"シキノ\",\"shikniful\":\"shikniful\",\"shikojo\":\"シコジョー\",\"shikunikiwa\":\"しくにきわ\",\"shikuta maru\":\"シクタ丸\",\"shima\":\"シマ\",\"shima kyousuke\":\"志摩京佑\",\"shima mitsuru\":\"志摩みつる\",\"shima seiryuu\":\"嶋成龍\",\"shima syu\":\"しまシュー\",\"shima takashi\":\"嶌隆\",\"shimachiyo\":\"しまちよ\",\"shimada kazuma\":\"島田和真\",\"shimada robin\":\"嶋田ロビン\",\"shimagarasu\":\"嶋鴉\",\"shimamoto chise\":\"しまもとちせ\",\"shimamoto harumi\":\"島本晴海。\",\"shimamoto utsumi\":\"嶋元うつみ\",\"shimano natsume\":\"しまのなつめ\",\"shimataka\":\"しまたか\",\"shimazaki lem\":\"島崎れむ\",\"shimeji\":\"しめじ\",\"shimeko\":\"しめ子\",\"shimesaba\":\"しめさば\",\"shimizu kiyoshi\":\"清水清\",\"shimizu naotaka\":\"志水なおたか\",\"shimo yamashi\":\"下やまし\",\"shimoda\":\"下田\",\"shimodaira tooko\":\"下平十子\",\"shimofuri oniku\":\"しもふりおにく\",\"shimokata kouzou\":\"霜方降造\",\"shimomura\":\"シモムラ\",\"shimomura keiko\":\"シモムラ\",\"shimosan\":\"シモサン\",\"shimotsuka\":\"しもつか\",\"shimotsuki ria\":\"しもつきりあ\",\"shimoyake\":\"しもやけ\",\"shimoyama giruko\":\"下山ギルコ\",\"shin\":\"真\",\"shin en\":\"新苑\",\"shin-go\":\"シンゴ\",\"shinachiku\":\"しなちく\",\"shinade kuro\":\"科手黒\",\"shinano yura\":\"しなのゆら\",\"shinda mane\":\"Shinda Mane\",\"shindoro mondoro\":\"新泥もんどろー\",\"shindou mayumi\":\"シンドウマユミ\",\"shindou naoto\":\"新堂なおと\",\"shingata juukidou mecha\":\"新型重機動メカ\",\"shingo\":\"SHINGO\",\"shinichi\":\"しんいち\",\"shinjiro\":\"信じろ\",\"shinkai\":\"真海\",\"shinma mei\":\"シンマメイ\",\"shinme\":\"新芽\",\"shinno kei\":\"神野けい\",\"shinnosuke\":\"慎之介\",\"shinobu\":\"シノブ\",\"shinobu akira\":\"篠部秋良\",\"ninbyo nin\":\"忍猫\",\"shinobu shou\":\"哀側翔\",\"shinocco\":\"しのっこ\",\"shinogi kei\":\"しのぎけい\",\"shinonome tarou\":\"東雲太郎\",\"shinonome yuu\":\"東雲優\",\"shinozaki mizu\":\"シノザキミズ\",\"shinozuki kou\":\"しのづき巧\",\"shinshin\":\"しんしん\",\"shinsou comachi\":\"深窓小町\",\"shinta\":\"シン太\",\"shintani\":\"森谷\",\"shio\":\"しお\",\"shio604\":\"塩604\",\"shiogochi\":\"シオゴチ\",\"shioiri numa\":\"汐入ぬま\",\"shioji miduho\":\"汐路ミヅホ\",\"shioko shou\":\"塩胡しょう\",\"shiomeshi\":\"塩飯\",\"shiomi yuusuke\":\"士臣佑介\",\"shion\":\"しおん\",\"shiono etorouji\":\"塩野干支郎次\",\"shiono maki\":\"塩野まき\",\"shiory\":\"shiory\",\"shiosaba\":\"塩鯖ッ\",\"shioya maico\":\"塩屋舞子\",\"shiragiku\":\"白菊\",\"shiraha mato\":\"白羽まと\",\"shirahata\":\"白旗\",\"shiraichigo\":\"しらいちご\",\"shiraishi mamim\":\"白石まみむ\",\"shirakaba\":\"shirakaba\",\"shirakaba masara\":\"白樺まさら\",\"shirakawa yoka\":\"白河桜花\",\"shirane shiratsuki\":\"白嶺白月\",\"shirasagi ug\":\"しらさぎゆうじ\",\"shirasaka rio\":\"白坂りお\",\"shirasaki sana\":\"しらさきさな\",\"shiraso\":\"しらそ\",\"shirasu reiji\":\"白州礼二\",\"shirasu youichi\":\"白須遙一\",\"shiratama azuki\":\"白玉アズキ\",\"shiratama dango\":\"白玉团子\",\"shiratama1gou\":\"白玉一号\",\"shiratsuki shiori\":\"白月しおり\",\"shirihito\":\"尻人\",\"shiritani\":\"尻谷\",\"shirizou\":\"シリ蔵\",\"shiro\":\"しろ\",\"shiroa urang\":\"白亜卯蘭\",\"shirogane\":\"城兼\",\"shirogisu\":\"シロギス\",\"shirogoma rai\":\"白駒らい\",\"shiroi\":\"シロイ\",\"shiroi gunpan\":\"白井薫範\",\"shiroi hakuto\":\"しろいはくと\",\"shiroi kuroneko\":\"白い黒猫\",\"shiroi noria\":\"城井のりあ\",\"shiroishi gatta\":\"白石ガッタ\",\"shirokai mua\":\"白貝みゅあ\",\"shirokarasu\":\"白からす\",\"shirokitsune\":\"しろきつね\",\"shiroku mako\":\"しろくまこ\",\"shirokuro\":\"いれぐ白黒\",\"shiromitsu daiya\":\"白蜜ダイヤ\",\"shiromitsu suzaku\":\"しろみつスザク\",\"shiromuu\":\"しろむー\",\"shirona mikoto\":\"白奈美琴\",\"shironeko haru\":\"白猫ハル\",\"shironeko sanbou\":\"白猫参謀\",\"shirono jia\":\"白野ジア\",\"shirony\":\"しろにい\",\"shiroobi\":\"しろおび\",\"shiroshi\":\"しろし\",\"shirosuzu\":\"しろすず\",\"shirota\":\"代田\",\"shirota kuronosuke\":\"白田クロノスケ\",\"shirota kurota\":\"シロタクロタ\",\"shirotsumekusa\":\"城爪草\",\"shiroya\":\"白弥\",\"shiru\":\"汁\",\"shiruko jiru\":\"しるこ汁\",\"shishido kurou\":\"宍戸くろう\",\"shishigai\":\"シシガイ\",\"shishiji\":\"ししじ\",\"shishimaru\":\"獅子丸\",\"shishimaru kenya\":\"ししまるけんや\",\"shishiotome\":\"ししおとめ\",\"shiso\":\"SHISO\",\"shisui\":\"シスイ\",\"shisui ao\":\"シスイ青\",\"shisuka\":\"シスカ\",\"shitaji mochimochi\":\"下地もちもち\",\"shitori\":\"Shitori\",\"shitou fumiaki\":\"志藤ふみあき\",\"shitsuji kuma\":\"執事クマ\",\"shiun\":\"紫雲陽\",\"shiva\":\"shiva\",\"shivharu\":\"シブハル\",\"shiwo.\":\"しを。\",\"shizaki masayuki\":\"士崎雅雪\",\"shizuki shinra\":\"獅月しんら\",\"shizuku\":\"しずく\",\"shizuna miyuri\":\"しずなみゆり\",\"shizuru\":\"シズル\",\"sho-tan\":\"sho-tan\",\"sho-yan\":\"しょーやん\",\"shocco\":\"しょこ\",\"shoco\":\"shoco\",\"shocora\":\"ショコラ\",\"shoda norihiro\":\"しょうだのりひろ\",\"shogo\":\"shogo\",\"shokora\":\"ショコラ\",\"shotenin matori\":\"書店院まとり\",\"shougeki no hirayama\":\"衝撃の平山\",\"shouhei\":\"しょーへー\",\"shouji bc\":\"庄司BC\",\"shouji haruzo\":\"障子張蔵\",\"shouki\":\"しょうき\",\"shourin kiyoshi\":\"松林清\",\"shoutarou\":\"ショウタロウ\",\"show\":\"Show\",\"showronpopy\":\"しょうろんぽぴー\",\"shozo\":\"SHOZO\",\"shri\":\"shri\",\"shrine\":\"シュライン\",\"shu cream\":\"シュクリム\",\"shuffle\":\"shuffle\",\"shuga\":\"しゅがぁ\",\"shuma\":\"しゅま\",\"shunjou shuusuke\":\"春城秋介\",\"shunzou\":\"しゅんぞう\",\"shuragyoku mami\":\"珠羅玉魔魅\",\"shuu\":\"じゅう\",\"shuui takahiro\":\"しゅうい☆たかひろ\",\"shuurin\":\"シュウリン\",\"shuuto\":\"シュウト\",\"shuz\":\"shuz\",\"sian\":\"しあん\",\"sibamura\":\"しばむら\",\"sibusawa eiki\":\"澁澤鋭樹\",\"sid alice\":\"獅童ありす\",\"sid daisuke\":\"士土大介\",\"sieles\":\"しーるず\",\"sigma rio\":\"しぐまりお\",\"sigmarion\":\"シグマリオン\",\"silinder\":\"silinder\",\"silky\":\"しるきー\",\"simama\":\"simama\",\"sin\":\"sin\",\"sin iti\":\"シン・イチ\",\"sindo aoi\":\"新堂葵\",\"sinensian\":\"Sinensian\",\"sinohara sinome\":\"しのはらしのめ\",\"sinori\":\"しのり\",\"sinzan\":\"sinzan\",\"sippufx\":\"しっぷfx\",\"siratama nikukyuu\":\"しらたま肉球\",\"sirazawa kousi\":\"白沢宏志\",\"sirofugu\":\"白フグ\",\"sirokoma\":\"白狛\",\"sirokuma\":\"しろくま\",\"sirou\":\"Sirou\",\"siroyuki\":\"しろゆき\",\"sirpent\":\"さあぺんと\",\"sisakugata\":\"試咲型\",\"sisei\":\"しせい\",\"sisochair\":\"sisochair\",\"sisui kyouko\":\"しすいきょうこ\",\"siva.\":\"シヴァ。\",\"sizma\":\"SIZMA\",\"skemaid\":\"スケメイド\",\"sknr\":\"SKNR\",\"katochin\":\"カトチン\",\"sl8-all\":\"SL8-all\",\"smile yuu\":\"スマイル幽\",\"so-ma\":\"そーま\",\"sob\":\"Sob\",\"soda\":\"soda\",\"soda lychee\":\"曹田らいち\",\"softoof\":\"ソフトーフ\",\"soga\":\"Soga\",\"sohya\":\"そーや\",\"soi\":\"Soi\",\"soket\":\"そけっと\",\"soko wa miwaku no lemon kyou\":\"そこは魅惑の檸檬郷\",\"sol\":\"そる\",\"sola\":\"sola\",\"solar milk\":\"そらみる\",\"solid lum\":\"SOLID LUM\",\"solomon k\":\"そろもんK\",\"solopipb\":\"ソロピップB\",\"some sumiko\":\"染墨子\",\"somejima\":\"ソメジマ\",\"somemaru\":\"染マル\",\"someya miho\":\"染谷みほ\",\"son\":\"SoN\",\"son palace\":\"ソンパレス\",\"sonnano ari\":\"村菜野有梨\",\"sono chiyoko\":\"園千代子\",\"sono.\":\"その。\",\"sonobe kazuaki\":\"園部一晶\",\"sonohen no zako\":\"その辺のザコ\",\"sonokawa sono\":\"園河ソノ\",\"sonote\":\"sonote\",\"sora\":\"ソラ\",\"sora mame\":\"そら豆\",\"zegga\":\"絶牙\",\"sora tokumo\":\"空十雲\",\"soraga-\":\"そらがー\",\"sorami\":\"そらみ\",\"sorami sio\":\"そらみしお\",\"sorane miki\":\"空音美樹\",\"sorani\":\"sorani\",\"sorano kanata\":\"空乃カナタ\",\"sorano natsumi\":\"ソラノ夏実\",\"sorano umi\":\"空野海\",\"soranona\":\"ソラノナ\",\"sorano suzume\":\"天ノ雀\",\"sorato\":\"そらと\",\"sorawa reo\":\"そらわれお\",\"sorono\":\"sorono\",\"soso\":\"そそ\",\"soso-zagri\":\"そそざぐり\",\"sot\":\"sot\",\"sou\":\"そう\",\"sou akiko\":\"奏亜希子\",\"soubi\":\"そーび\",\"souchou\":\"曹长\",\"souda gumi\":\"創田ぐみ\",\"souen hiro\":\"蒼鉛ヒロ\",\"souichi\":\"そういち\",\"souko souji\":\"倉子倉次\",\"soukoban\":\"倉庫番\",\"soukurou\":\"双九朗\",\"soul\":\"Soul\",\"souma tatsuya\":\"そうま竜也\",\"souma monooki2tsu tokage\":\"双馬・物置2つ・蜥蜴\",\"souseiou\":\"創世王\",\"sousen\":\"Sousen\",\"soushin souma\":\"創神蒼魔\",\"souto\":\"草人\",\"soutome emu\":\"五月女えむ\",\"sovayu\":\"そば湯\",\"sowjun\":\"宗純\",\"soyane\":\"そやね\",\"soyoki\":\"そよき\",\"sparrow\":\"雀\",\"special g\":\"すぺしゃるじー\",\"speed\":\"speed\",\"squarewave29\":\"矩形波\",\"ssz\":\"SSZ\",\"st.germain-sal\":\"さんぢぇるまん・猿\",\"st.retcher\":\"ST.レッチャー\",\"stain\":\"STAIN\",\"stealth changing line\":\"ステルス改行\",\"stealth moko\":\"ステルスもこ\",\"stem\":\"stem\",\"stereotype\":\"stereotype\",\"stiel\":\"すてぃえる\",\"stigaya\":\"チガヤ\",\"stir\":\"ステア\",\"subachi\":\"すばち\",\"subaru\":\"スバル\",\"subuina 81r\":\"スブイナ81R\",\"sudoo kaoru\":\"すどおかおる\",\"sudou\":\"すどー\",\"suehiro yoshiyuki\":\"末廣よしゆき\",\"suemitsu dicca\":\"すえみつぢっか\",\"sueyuu\":\"すえゆう\",\"sugai\":\"スガイ\",\"sugaleon\":\"スガレオン\",\"sugamon\":\"すがもん\",\"sugar picola\":\"しゅがーピコラ\",\"sugata uri\":\"菅田うり\",\"sugawara miyako\":\"菅原ミヤコ\",\"sugayama\":\"菅山\",\"sugii tsukasa\":\"すぎいつかさ\",\"sugimura tomokazu\":\"杉村友和\",\"sugita ranpaku\":\"過ぎた卵白\",\"sugitomo kazuhiro\":\"杉友カヅヒロ\",\"sugiyama genshou\":\"すぎやま現象\",\"sugiyama yuzuki\":\"杉山ゆずき\",\"sugoi hi\":\"すごい火\",\"sugoi kinniku\":\"すごいきんにく\",\"sugoku zako\":\"すごく雑魚\",\"suhara shiina\":\"須原シイナ\",\"suhoi\":\"すほい\",\"sui\":\"sui\",\"suien\":\"翠燕\",\"suihei kiki\":\"水兵きき\",\"suihi\":\"すいひ\",\"suika\":\"酔花\",\"suika koron\":\"酔花ころん\",\"suika soda\":\"すいかソーダ\",\"suiren\":\"睡蓮\",\"suiren touru\":\"水簾藤流\",\"suirenka\":\"翠錬華\",\"suisen toilet\":\"水洗トイレ\",\"suishin tenra\":\"水心天羅\",\"suisui\":\"すいすい\",\"sukage\":\"須影\",\"suke6\":\"スケ6\",\"sukedai\":\"すけだい\",\"sukeichi\":\"すけいち\",\"sukeya kurov\":\"助谷クロウ\",\"suki na mono wa yakiniku\":\"好きなものは焼肉\",\"sukima man\":\"すきま満\",\"sukiyoshi shinji\":\"好善信士\",\"sukumizu\":\"すくみづ\",\"sukumo\":\"すくも\",\"sukunahiko\":\"少名彦\",\"sumeragi bron\":\"スメラギバロン\",\"sumeragi kohaku\":\"すめらぎ琥珀\",\"sumeragi kou\":\"すめらぎこう\",\"sumeragi seisuke\":\"皇征介\",\"sumeragi yuusuke\":\"皇裕介\",\"sumeshi\":\"すめし\",\"sumihey\":\"すみ兵\",\"sumio\":\"すみおー\",\"sumisaki yuduna\":\"住咲ゆづな\",\"sumisumi\":\"スミスミ\",\"sumitomo\":\"すみとも\",\"sumizaki\":\"炭崎\",\"sumomo ex\":\"すももEX\",\"sumomo pink\":\"すももぴんく\",\"suna\":\"すな\",\"sunahara izuko\":\"砂原何処\",\"sunameri\":\"すなめり\",\"sunao\":\"スナオ\",\"sundomeya\":\"すんどめ屋\",\"sunshow\":\"さんしょう\",\"sunson\":\"SUNSON\",\"supopo\":\"すぽぽ\",\"suppy\":\"スッピー\",\"supurai\":\"すぷらい\",\"suradora\":\"すらドラ\",\"suruga rinu\":\"駿河りぬ\",\"susuanpan\":\"煤あんぱん\",\"susugu\":\"ススグ\",\"suto\":\"すと\",\"suu\":\"すう\",\"suv\":\"SUV\",\"suzu\":\"すず\",\"suzu kazumi\":\"寿杜缶住\",\"suzuhara kouki\":\"鈴原考樹\",\"suzuho hotaru\":\"鈴穗ほたる\",\"suzui narumi\":\"鈴井ナルミ\",\"suzukawa rino\":\"鈴川梨乃\",\"suzuki address\":\"木あどれす\",\"suzuki amaharu\":\"涼樹天晴\",\"suzuki ganma\":\"鈴木がんま\",\"suzuki kimuchi\":\"鈴木キムチ\",\"suzuki metal\":\"鈴木メタル\",\"suzuki mey\":\"すずきめい\",\"suzuki nene\":\"鈴樹ねね\",\"suzuki sakura\":\"鈴輝 桜\",\"suzuki shina\":\"鈴木志奈\",\"suzuki sinobu\":\"鈴木忍\",\"suzuki takeo\":\"鈴木岳生\",\"suzuki toto\":\"すずきとと\",\"suzumaru\":\"すずまる\",\"suzumiya\":\"涼御夜\",\"suzumiya kazuki\":\"涼宮和貴\",\"suzumiya kiriha\":\"鈴宮きりは\",\"suzumori uina\":\"鈴森ういな\",\"suzune rai\":\"鈴根らい\",\"suzune yuuji\":\"鈴音ゆうじ\",\"suzunokei\":\"スズノケイ\",\"suzunomoku\":\"すずのもく\",\"suzurame\":\"スズラメ\",\"suzuri\":\"石見すずり(硯)\",\"suzusato rinka\":\"鈴里厘花\",\"suzusawa aki\":\"鈴沢秋\",\"suzuse\":\"涼瀬\",\"suzushiro nazuna\":\"蘿蔔なずな\",\"suzushiro yutaka\":\"すずしろゆたか\",\"suzushiro\":\"すずしろ\",\"suzuta yume\":\"鈴田ゆめ\",\"swa\":\"SWA\",\"swakichi\":\"すわきち\",\"syanal\":\"しゃーなる\",\"syaneko\":\"しゃねこ\",\"syaraku\":\"しゃらく\",\"sync\":\"sync\",\"syou\":\"syou\",\"syougo kota\":\"省吾こた\",\"syouji\":\"将司\",\"syouryuupen\":\"しょーりゅーぺん\",\"syowmaru\":\"翔丸\",\"syoyu\":\"しょーゆ\",\"syu\":\"川上修一\",\"syunichi\":\"しゅにち\",\"syunzo\":\"しゅんぞう\",\"syutaro\":\"秋太郎\",\"t\":\"T\",\"t-factory\":\"T factory\",\"t-hiko\":\"T彦\",\"t-zok\":\"T-ZOK\",\"t.cylinder\":\"円柱\",\"ta\":\"ta\",\"ta and a\":\"TA&A\",\"ta152\":\"Ta152\",\"taankee\":\"た～んけー\",\"tabe koji\":\"たべ・こーじ\",\"tabo\":\"tabo\",\"taca\":\"taca\",\"tachi tsubaki\":\"太刀椿\",\"tachibana\":\"たちばな\",\"tachibana chata\":\"橘チャタ\",\"tachibana hisui\":\"橘ヒスイ\",\"tachibana naoki\":\"断華ナオキ\",\"tachibana riuta\":\"橘りうた\",\"tachibana sakuya\":\"たちばなさくや\",\"tachibana satsuki\":\"橘颯希\",\"tachibanaei\":\"たちばなえい\",\"koyama shigeru\":\"こやま滋\",\"tachitsu teto\":\"舘津テト\",\"tacky\":\"tacky\",\"tada atsunori\":\"ただ☆あつのり\",\"tadano happa\":\"ただのはっぱ\",\"tadano kagekichi\":\"唯野影吉\",\"tadano kushami\":\"唯乃くしゃみ\",\"tadano myoushi\":\"忠之みょうし\",\"tagame gengoroh\":\"田亀源五郎\",\"tagro\":\"TAGRO\",\"taguchi\":\"たグち\",\"taguchi kirei\":\"田口綺麗\",\"taguchi makoto\":\"田口まこと\",\"tahara anco\":\"田原あんこ\",\"tahibo\":\"誰罷慕\",\"tai\":\"泰\",\"tai0201\":\"楠木帯\",\"taiki\":\"大気\",\"taiki ken\":\"大気KEN\",\"taikuu jikan\":\"滞空時間\",\"taira\":\"たいら\",\"taira hajime\":\"たいらはじめ\",\"taira kosaka\":\"平こさか\",\"taira kouichirou\":\"平光一郎\",\"tairame\":\"タイラメ\",\"taireru\":\"たいれる\",\"tairyo ryou\":\"大呂亮\",\"taishi\":\"たいし\",\"taishow tanaka\":\"たいしょう田中\",\"taiyaki\":\"たいやき\",\"taji\":\"たじ\",\"tajima ryuushi\":\"タジマ粒子\",\"tajima yasue\":\"田嶋安恵\",\"tak\":\"T@k\",\"tak-u\":\"TAK-U\",\"taka pon\":\"タカ☆ぽん\",\"taka sena\":\"嵩世菜\",\"takabatake enaga\":\"高畠エナガ\",\"takadoya akira\":\"たかどやあきら\",\"takagari mitsuru\":\"鷹狩みつる\",\"takagi kyou\":\"高木喬\",\"takahagi kemono\":\"タカハギケモノ\",\"takahan\":\"タカはん\",\"takaha momo\":\"高羽もも\",\"takahara sea-gull\":\"高原シーガル\",\"takahashi\":\"多花ハシ\",\"takahashi konnyaku\":\"高橋こんにゃく\",\"takahashi mako\":\"タカハシマコ\",\"takahashi note\":\"タカハシノヲト\",\"takahashi record\":\"高橋レコード\",\"takahashi yoshiki\":\"高橋良喜\",\"takahashikun\":\"高橋君\",\"takahiko\":\"たかひこ\",\"takahirou ringu\":\"たかひろーりんぐ\",\"takahisa kunihiro\":\"鷹久邦弘\",\"takai biki\":\"高井美姫\",\"takaishi fuu\":\"高石ふう\",\"takako\":\"タカコ\",\"takaku shouko\":\"高久尚子\",\"takaku toshihiko\":\"高久としひこ\",\"takaku tubby\":\"高句タビー\",\"takamiya\":\"たかみや\",\"takamiya sakura\":\"鷹宮沙玖羅\",\"takamori3\":\"たかもり3\",\"takamoto akisa\":\"上下右左\",\"takamura tabisuke\":\"高村旅輔\",\"takana yu-ki\":\"鷹那優輝\",\"takanabe chitose\":\"高鍋千歳\",\"takanaru\":\"たかなる\",\"takanashi ayumu\":\"小鳥遊\",\"takanashi china\":\"たかなし知那\",\"takanashi haruto\":\"たかなしはると\",\"takanashi kei\":\"小鳥遊啓\",\"takanashi nozomi\":\"高梨のぞみ\",\"takanashi shiro\":\"高梨志郎\",\"takano hayato\":\"たかのはやと\",\"takano iori\":\"高野庵\",\"takano masayuki\":\"高野真之\",\"takano uaka\":\"たかのうあか\",\"takano yuu\":\"高野有\",\"takanotume\":\"たかのつめ\",\"takao hiroi\":\"高緒拾\",\"takao ukyou\":\"高雄右京\",\"takao yori\":\"高尾鷹浬\",\"takaoka chikara\":\"高岡智空\",\"takapi\":\"たかぴ\",\"takara akihito\":\"宝あきひと\",\"takaryoo\":\"たかりょー\",\"takasaki akira\":\"高崎晶\",\"takasaki karin\":\"高崎かりん\",\"takasaki maco\":\"高崎まこ\",\"takasaki ryo\":\"貴崎涼\",\"takasaki takemaru\":\"高崎たけまる\",\"takase hiroe\":\"貴瀬博恵\",\"takase muh\":\"高瀬むぅ\",\"takashina urara\":\"高階麗\",\"takasumi miduki\":\"貴澄美月\",\"takatora\":\"タカトラ\",\"takatsuki ichi\":\"タカツキイチ\",\"takatsuki nagy\":\"高槻ナギー\",\"takatsuki shuuya\":\"高月柊也\",\"takatuka ramune\":\"鷹柄ラムネ\",\"takaya yoshiyuki\":\"鷹屋ヨシユキ\",\"takayama chihiro\":\"高山千尋\",\"takayamanon\":\"タカヤマノン\",\"takayuki hiyori\":\"Evo.R.B\",\"take takeshi\":\"武猛\",\"take toshiaki\":\"武俊彰\",\"takea saki\":\"たけあ崎\",\"takeashiro\":\"たけあしろ\",\"takeda\":\"たけだ\",\"takeda sora\":\"武田空\",\"takedake\":\"タケダケ\",\"takei tsukasa\":\"タケイツカサ\",\"takemaru\":\"タケマル\",\"takemitz\":\"たけみつ\",\"takemori shintarou\":\"竹森真太郎\",\"takenaka hideo\":\"武中英雄\",\"takenoko\":\"takenoko\",\"takenoko maru\":\"たけのこ丸\",\"takenoko seijin\":\"たけのこ星人\",\"takenouchi suama\":\"竹之内すあま\",\"takepon\":\"たけぽん\",\"takeponian\":\"たけぽにあん\",\"takese nono\":\"高瀬乃々\",\"takeshima eku\":\"竹嶋えく\",\"takeshisu\":\"タケシス\",\"takeshita kenjirou\":\"竹下けんじろう\",\"taketora suzume\":\"竹虎スズメ\",\"takeu\":\"たけう\",\"takeuchi reona\":\"竹内玲于奈\",\"takeuma\":\"たけうま\",\"takewakamaru\":\"武若丸\",\"takewan\":\"たけわん\",\"takeyama kaki\":\"たけやまかき\",\"takeyama shimeji\":\"茸山しめじ\",\"taki re-ki\":\"滝れーき\",\"takimoto satoru\":\"滝本悟\",\"takineko\":\"タキ猫\",\"takizawa hajime\":\"瀧澤春\",\"takkii\":\"たっきぃ\",\"takku\":\"たっく\",\"tako\":\"たこ\",\"tako kuboh\":\"蛸公方\",\"takorice\":\"たこらいす\",\"takotyu\":\"たこちゅう\",\"takoya kiki\":\"多胡屋きき\",\"takoyaki\":\"たこ焼き\",\"takto\":\"TAKTO\",\"taku\":\"タク\",\"taku hiraku\":\"拓ヒラク\",\"takuji yuusaku\":\"卓二雄作\",\"takuma\":\"琢磨\",\"takuma tomomasa\":\"たくま朋正\",\"takumi na muchi\":\"たくみな無知\",\"takumi rohan\":\"たくみ露伴\",\"takura mahiro\":\"田倉まひろ\",\"takuteks\":\"TAKUTEKS\",\"tama\":\"tama\",\"tama ii\":\"たまつー\",\"tama kifuyu\":\"たまきふゆ\",\"tamachi\":\"たまち\",\"tamachie\":\"たまちえ\",\"tamaco\":\"tamaco\",\"tamagawa chiruru\":\"多摩川ちるる\",\"tamagawa yakkyou\":\"多摩川やっきょう\",\"tamagawa yukimaru\":\"多摩川雪丸\",\"tamago\":\"煌月忍\",\"tamago meshi\":\"たまごめし\",\"tamahiro\":\"たまひろ\",\"tamahiyo\":\"たまひよ\",\"tamaki kaoru\":\"環かおる\",\"tamaki nozomu\":\"環望\",\"tamaki yayoi\":\"珠樹やよい\",\"tamaki yui\":\"タマキ結\",\"tamamo ozen\":\"たまも御前\",\"tamanegi\":\"たまねぎ\",\"tamaoki benkyo\":\"玉置勉強\",\"tamaran niisan\":\"たまらん兄さん\",\"tamaru\":\"たまる\",\"tamaru makoto\":\"田丸まこと\",\"tamarun\":\"タマラン\",\"tamatsuyada\":\"たまつやだ\",\"tame\":\"ため\",\"tamekou\":\"ためこう\",\"tami-k\":\"TAMI-K\",\"tamifull\":\"たみふる\",\"tamiko\":\"たみこ\",\"tamineko\":\"タミネコ\",\"tamo\":\"たも\",\"tamochi\":\"田持\",\"tamon ketsuyuki\":\"多門結之\",\"tamori tadaji\":\"たもりただぢ\",\"tamu\":\"たむ\",\"tamuhi\":\"タムヒ\",\"tamura searchlight\":\"田村サーチライト\",\"tamura shimeji\":\"田村シメジ\",\"tana\":\"TANA\",\"tanabe\":\"TANABE\",\"tanaka keigo\":\"たなかけいご\",\"tanaka kumubou\":\"田中伍某\",\"tanaka penta\":\"田中ペン太\",\"tanaka rin\":\"田中琳\",\"tanaka sei\":\"田中セイ\",\"tanaka tarou\":\"田中太郎\",\"tanakamori yokota\":\"田中森よこた\",\"tanakana\":\"たなかな\",\"tanba kuromame\":\"丹波KURO豆\",\"tanemura arina\":\"種村有菜\",\"tanenashi kuribo\":\"たねなしくりぼ\",\"tanenashi miya\":\"種梨みや\",\"tange rin\":\"丹下凛\",\"tango-tango\":\"tango-tango\",\"taniguchi daisuke\":\"谷口大介\",\"tanihara natsuki\":\"たにはらなつき\",\"tanimura marika\":\"谷村まりか\",\"tanizakura shidare\":\"谷桜しだれ\",\"tanken harahara\":\"探検はらはら\",\"tankslayer equals san\":\"タンクスレイヤー=サン\",\"tano\":\"たの\",\"tanoma suzume\":\"たのますずめ\",\"tanpopo shunmaru\":\"たんぽぽ隼丸\",\"tansui shirasu\":\"淡水シラス\",\"tanufude\":\"たぬふで\",\"tanuki\":\"たぬき\",\"tanuma yuuichirou\":\"田沼雄一郎\",\"tanunosuke\":\"たぬ之助\",\"tanutan\":\"たぬたん\",\"tanzi\":\"丹治\",\"tao\":\"たお\",\"tapisuke\":\"たぴすけ\",\"tappa\":\"たっぱ\",\"tar\":\"TAR\",\"tarakan\":\"たらかん\",\"tarazoo\":\"たらぞお\",\"tare\":\"たれ\",\"tare mayuzou\":\"タレ眉ぞう\",\"tarekatsu\":\"TARE活\",\"tarihou\":\"タリホウ\",\"tarinu\":\"足りぬ\",\"tariyoshi\":\"たりよし\",\"taro\":\"taro\",\"taro-san\":\"たろさん\",\"taropun\":\"たろプン\",\"taroro\":\"たろろ\",\"tarte\":\"タルト\",\"tarutarugungun\":\"たるたるぐんぐん\",\"taryl.\":\"たりる｡\",\"tasa urara\":\"たさうらら\",\"tasuku\":\"助\",\"tasuro kuzuha\":\"たすろくずは\",\"tataru\":\"タタル\",\"tatejima.\":\"縦縞。\",\"tateno tomoki\":\"タテノトモキ\",\"sennohito.\":\"線の人。\",\"tatsuhiko\":\"たつひこ\",\"tatsumiya motokazu\":\"たつみやもとかず\",\"tatsumu kyou\":\"龍武京\",\"tatsuneko\":\"たつねこ\",\"tatsunosuke yukiya\":\"逹之介ユキヤ\",\"tatsuoka miyoshi\":\"龍岡巳葦\",\"tatsuya\":\"立つ屋\",\"tatunokosso\":\"タツノコッソ\",\"tau\":\"tau\",\"tavor\":\"Tavor\",\"taya takashi\":\"たやたかし\",\"tayuta yuu\":\"たゆた☆ゆう\",\"teaindian\":\"紅茶インディアン\",\"tear\":\"Tear\",\"tec\":\"TEC\",\"tecchan\":\"てっちゃん\",\"techizou\":\"てちぞう\",\"techno\":\"てくの\",\"teckei\":\"TEcKei\",\"tedain\":\"てだいん\",\"tegdor\":\"てぐどら\",\"tegura yuuki\":\"テグラユウキ\",\"tehen\":\"てへん\",\"tei-oh-k-takamuro\":\"TEI-OH-K-TAKAMURO\",\"teil\":\"teil\",\"teitaraku\":\"ていた楽\",\"teka\":\"てか\",\"tekkyuu\":\"鉄球\",\"teko\":\"てこ\",\"tekuteku\":\"てくてく\",\"teltelhousi\":\"てるてる法師\",\"ten\":\"貂\",\"ten ga\":\"天駕\",\"ten no hoshi\":\"天ノ星\",\"tenamaru\":\"テナマル\",\"tenchuumaru\":\"天誅丸\",\"tenchuunan\":\"天誅男\",\"tendou itsuki\":\"天堂樹\",\"tendou kuon\":\"天童久遠\",\"tendou makura\":\"天童まくら\",\"tengudake\":\"テングダケ\",\"tenji\":\"てんじ\",\"tenjiku rounin\":\"天竺浪人\",\"tenju\":\"天咒\",\"tenkawa ai\":\"天河藍\",\"tenken\":\"てんけん\",\"tenma\":\"天馬\",\"tenmaso\":\"てんまそ\",\"tenori\":\"てのり\",\"tenrai\":\"天籟\",\"tenshou akira\":\"天祥輝\",\"tenteko\":\"てんてこ\",\"tentenkingyo\":\"てんてんきんぎょ\",\"tenyati\":\"TenYati\",\"tenyuu\":\"てんゆ～\",\"tenzaki kanna\":\"天崎かんな\",\"tera\":\"TERA\",\"terada\":\"寺田\",\"terada tera\":\"寺田てら\",\"terai daikichi\":\"寺イ大吉\",\"teramoto kaoru\":\"寺本薫\",\"terashi\":\"てらし\",\"terasu mc\":\"テラスmc\",\"terazip\":\"テラzip\",\"teri terio\":\"てりてりお\",\"terry hijiri\":\"照井聖\",\"teru\":\"てる\",\"terufuu\":\"てるふう\",\"terujirou\":\"晃次郎\",\"teruwi\":\"てるうぃ\",\"teruyama momiji\":\"照山紅葉\",\"tes\":\"tes\",\"teshio\":\"てしお\",\"tete\":\"tete\",\"tetoga\":\"てとが\",\"tetora\":\"てとら\",\"tetramax\":\"てとらまっくす\",\"tetsu kazuna\":\"鉄カズナ\",\"tetsubirei\":\"てつびれい\",\"tetsukui\":\"鐡喰\",\"tetsumi\":\"哲美\",\"tetsunohiji\":\"てつのひじ\",\"tetsuya\":\"テツヤ\",\"tetubuta\":\"鉄豚\",\"tetujin momoko\":\"鉄人桃子\",\"tetumiya\":\"鉄宮\",\"thanat\":\"たなと\",\"the fall guy\":\"フォール・ガイ\",\"walter wolf\":\"うぉるたーうるふ\",\"thor\":\"THOR\",\"tickzou\":\"てぃくぞー\",\"tid\":\"TID\",\"tief\":\"Tief\",\"tiger\":\"タイガー\",\"tiger shark\":\"大牙射悪\",\"tigusa suzume\":\"千草雀\",\"tilm\":\"ティルム\",\"tim\":\"TIM\",\"tima\":\"ちぃま\",\"timato\":\"ちまと\",\"timuni\":\"チムニ\",\"ting\":\"Ting\",\"tipo\":\"ティーポ\",\"tira\":\"Tira\",\"tirotata\":\"ちろたた\",\"titiduki\":\"チチヅキ\",\"tiv\":\"Tiv\",\"tj-type1\":\"TJ-type1\",\"tk\":\"TK\",\"tkdash\":\"TKDASH\",\"tks\":\"TKS\",\"tnsk\":\"TNSK\",\"tobari\":\"とばり\",\"tobimura\":\"鳶村\",\"tobunda jet\":\"飛ぶんだジェット\",\"toby\":\"だぶるあーる\",\"tocky\":\"Tocky\",\"toda kaduki\":\"とだかづき\",\"todd oyamada\":\"トッド小山田\",\"todoroki shusei\":\"等々力秋声\",\"tofu\":\"とうふ\",\"togame\":\"とがめ\",\"togashi\":\"トガシ\",\"toge toge\":\"棘棘\",\"togo\":\"とーご\",\"toguchi masaya\":\"トグチマサヤ\",\"tohani\":\"とーはに\",\"tohno tatsuki\":\"遠野タツキ\",\"toi\":\"Toi\",\"toi amatsu\":\"とい天津\",\"toichi\":\"トイチ\",\"toilet\":\"といれ\",\"toilet komoru\":\"トイレ籠\",\"toine hoko\":\"樋音歩琥\",\"toitoi\":\"といとい\",\"toka\":\"toka\",\"tokachi genjuurou\":\"十勝源十郎\",\"tokei\":\"時計\",\"tokei usagi\":\"とけーうさぎ\",\"tokeiya-san\":\"時計屋さん\",\"toki\":\"トキ\",\"tokiai haya\":\"伽藍快\",\"tokihama jiro\":\"時浜次郎\",\"tokimachi eisei\":\"トキマチ★エイセイ\",\"tokimal yoshihisa\":\"時丸佳久\",\"tokino\":\"時乃\",\"tokinobutt\":\"ときのぶっと\",\"tokinon\":\"ときのん\",\"tokio\":\"ときお\",\"tokisaka mugi\":\"時坂夢戲\",\"tokisana\":\"トキサナ\",\"tokita monta\":\"刻田門大\",\"tokitoki\":\"ときとき\",\"tokiwa kanenari\":\"常磐兼成\",\"tokiwa wako\":\"ときわようこ\",\"tokiwa youko\":\"常葉ヨウコ\",\"tokiwa yutaka\":\"ときわゆたか\",\"tokizumi emishi\":\"時積恵美之\",\"tokkou kujira\":\"特攻くじら\",\"tokonaru\":\"トコナル\",\"tokonone\":\"床音\",\"tokorot\":\"tokorot\",\"tokorotenf\":\"ところてんf\",\"tokoyo\":\"常世\",\"tokoyo akashi\":\"常夜あかし\",\"tokoyon\":\"tokoyon\",\"toku\":\"特\",\"toku soncho\":\"とく村長\",\"tokuda shinnosuke\":\"徳田しんのすけ\",\"tokugawa miyo\":\"徳川みよ\",\"tokui supermarket\":\"徳井スーパーマーケット\",\"tokumei hero\":\"匿名ヒーロー\",\"tokunaga\":\"とくなが\",\"tokunomura\":\"とおくのむら\",\"tokurito\":\"とくりと\",\"tokusa lico\":\"砥草りこ\",\"tokutan\":\"とくたん\",\"tokyo\":\"tokyo\",\"tokyokyoto\":\"東京京都\",\"tololi\":\"とろり\",\"tom\":\"トム\",\"tom keith\":\"とむ・きーす\",\"toma\":\"TOMA\",\"tomakomai\":\"とまこまい\",\"tomatomato\":\"トマトマト\",\"tome\":\"トメ\",\"tomekichi\":\"とめきち\",\"tometo\":\"とめと\",\"tomihero\":\"トミヒロ\",\"tomisawa chinatsu\":\"とみさわ千夏\",\"tomite\":\"とみて\",\"tomiyama akiji\":\"兎耳山アキジ\",\"tomiyoshi\":\"トミヨシ\",\"tomneko\":\"吐夢猫\",\"tomo takino\":\"智タキノ\",\"tomoe\":\"巴萌\",\"tomoe kiko\":\"トモエキコ\",\"tomoe tenbu\":\"巴天舞\",\"tomohara michiya\":\"友原道哉\",\"tomoharu\":\"トモハル\",\"tomohiro\":\"ともひろ\",\"tomojo\":\"ともじょー\",\"tomoki shikata\":\"志方朋季\",\"tomomaya\":\"tomomaya\",\"tomona\":\"tomona\",\"tomosuke\":\"ともすけ\",\"tomotsuka haruomi\":\"ともつか治臣\",\"tomoya\":\"ともや\",\"tomoya kankurou\":\"友屋勘九郎\",\"tomto\":\"Tomto\",\"tomu\":\"tomu\",\"tonbo\":\"トンボ\",\"tonchan\":\"とんちゃん\",\"tonikaku\":\"兎に角\",\"tonnosuke\":\"とんのすけ\",\"tonotani\":\"とのたに\",\"tonpu\":\"とんぷ\",\"tonsuke\":\"とんすけ\",\"tonten\":\"トンテン\",\"tooco\":\"Tooco\",\"tooda shunkei\":\"遠田春景\",\"tooka\":\"とーか\",\"toono yayoi\":\"十野弥生\",\"tooya\":\"十矢\",\"tooya daisuke\":\"遠矢大介\",\"topo\":\"とぽ\",\"tora\":\"虎\",\"torai ryuu\":\"虎井 龍\",\"toraisi666\":\"とらいし666\",\"torajimaneko\":\"とらじまねこ\",\"torakichi\":\"とらきち\",\"toran\":\"とらん\",\"toraneko\":\"トラ猫\",\"kyukyutto\":\"キュキュット\",\"tori\":\"トリ◯\",\"tori hikari\":\"とりひかり\",\"tori mogura\":\"鳥土竜\",\"tori nice par\":\"とりナイスパー\",\"toria\":\"とりあ\",\"toribami sasami\":\"鳥喰ささみ\",\"torigoshi yayoi\":\"鳥越やよい\",\"torikawa\":\"鳥皮\",\"toriki cooya\":\"とりきくーや\",\"torimaki\":\"鳥巻\",\"torimaru\":\"トリ○\",\"torino munenik\":\"トリノ宗肉\",\"torisan\":\"鳥三\",\"torisana\":\"トリサナ\",\"torishimo\":\"とりしも\",\"toritora\":\"酉寅\",\"toriumi kapiko\":\"鳥海かぴこ\",\"toroi\":\"toroi\",\"tororo\":\"とろろ\",\"torque\":\"トルク\",\"toryuu\":\"十竜\",\"tos-tos-f-ski\":\"とすとすFスキー\",\"tosa\":\"トサ\",\"tosh\":\"tosh\",\"toshihiro\":\"トシヒロ\",\"toshiki yuuji\":\"としきゆうぢ\",\"toshio\":\"としお\",\"toshizo\":\"トシぞー\",\"toto nemigi\":\"ととねみぎ\",\"totofumi\":\"ととふみ\",\"totoki kikaku\":\"十時企画\",\"totokichi\":\"トトキチ\",\"totto\":\"totto\",\"tottori sakyuu\":\"鳥取砂丘\",\"toudori\":\"トウドリ\",\"toudou fumika\":\"藤堂冬美香\",\"toufu majin\":\"とうふ魔神\",\"touga kotobuki\":\"塔河寿\",\"touge hiro\":\"峠比呂\",\"toujou\":\"東條\",\"touko\":\"東子\",\"touma nao\":\"藤馬奈緒\",\"tourou\":\"灯籠\",\"touta\":\"淘汰\",\"toutaku\":\"董卓\",\"touya\":\"と～や\",\"touya tsuduru\":\"塔夜綴\",\"tow\":\"tow\",\"towa\":\"とわ\",\"towai raito\":\"問合来人\",\"towamin\":\"とわみん\",\"tower\":\"ToWeR\",\"toya hayato\":\"トヤハヤト\",\"toyama jigoku\":\"外山じごく\",\"toyama nanao\":\"とやま七生\",\"toyo\":\"とよ\",\"toyoman\":\"TOYOMAN\",\"toyomaru\":\"十夜丸\",\"toyoshima yuusaku\":\"豊島ゆーさく\",\"tozakura nagomi\":\"都桜和\",\"transition\":\"transition\",\"trickster\":\"TrickSter\",\"trident\":\"トライデント\",\"trista\":\"トリスタ\",\"trump\":\"Trump\",\"try\":\"TRY\",\"tsubaki hara\":\"ツバキハラ\",\"tsubaki metasu\":\"椿めたす\",\"tsubakiya meguru\":\"椿屋めぐる\",\"tsubakiyama parry\":\"椿山パリィ\",\"tsubasa\":\"ツバサ\",\"tsucaco\":\"tsucaco\",\"tsuchiya tarou\":\"土屋太郎\",\"tsuda akira\":\"津田 晶\",\"tsugaru\":\"Tsugaru\",\"tsugu\":\"つぐ\",\"tsugumi\":\"月海\",\"tsugumi nagisa\":\"ツグミ渚\",\"tsuina\":\"tsuina\",\"tsuino sumika\":\"終野すみか\",\"tsuizi\":\"ついじ\",\"tsuji\":\"ツジ\",\"tsuji takeshi\":\"辻武司\",\"tsujigiri\":\"つじぎり\",\"tsujimaru\":\"辻丸\",\"tsukadama\":\"つかだま\",\"tsukasa jun\":\"司淳\",\"tsukasa ningyou\":\"司人形\",\"tsuki neko\":\"月猫\",\"tsuki yoshimi\":\"月嘉\",\"tsukigami\":\"月咬\",\"tsukigami chronica\":\"月上クロニカ\",\"tsukiji\":\"月路\",\"tsukikage hisashi\":\"月影久\",\"tsukikage manmaru\":\"月影満丸\",\"tsukimi kirara\":\"月見キララ\",\"tsukinami kousuke\":\"月並甲介\",\"tsukino\":\"月野\",\"tsukino wakuma\":\"月野輪熊\",\"tsukino yuuya\":\"月野悠也\",\"tsukinose maro\":\"月之瀬まろ\",\"tsukishima kai\":\"月島改\",\"tsukishima mist\":\"月島ミスト\",\"tsukishima takafuyu\":\"月島隆冬\",\"tsukuba kensuu\":\"つくばケンスウ\",\"tsukumizu yuu\":\"月水憂\",\"tsukumo\":\"九十九\",\"tsukumo gou\":\"19号\",\"tsukumo kazuki\":\"ツクモカヅキ\",\"tsukumo matoro\":\"月雲まとろ\",\"tsukushino makoto\":\"つくしの真琴\",\"tsukuyomi sazin\":\"月読さじん\",\"tsumetoro\":\"つめとろ\",\"tsumitani daisuke\":\"罪谷死輔\",\"tsumugi\":\"つむぎ\",\"tsumumi\":\"つむみ\",\"tsuna\":\"ツナ\",\"tsuna onigiri\":\"ツナおにぎり\",\"tsunami\":\"ツナミ\",\"tsunamushi\":\"つなむし\",\"tsunapiko\":\"TSUNAPIKO\",\"tsunbeji\":\"つんべじ\",\"tsune yoshi\":\"常好し\",\"tsuneyoshi\":\"つねよし\",\"tsuno\":\"つの\",\"tsunoame kazuya\":\"角雨和八\",\"tsunoda mag\":\"つのだ★まぐ\",\"tsunoda saburoo\":\"つのだサブロー\",\"tsunomiya katsuki\":\"津宮伽月\",\"tsunsuki\":\"ツンスキ\",\"tsurimiya gen\":\"釣宮弦\",\"tsuru\":\"つる\",\"tsurugi\":\"Tsurugi\",\"tsurugi ai\":\"剑城蓝\",\"tsurugi hikaru\":\"つるぎ輝\",\"tsurugi wakarou\":\"鶴亀ワカロー\",\"tsurugi yasuyuki\":\"剣康之\",\"tsurukame\":\"ツルKAME\",\"tsuruma megumi\":\"つるまめぐみ\",\"tsurumaki kazuya\":\"鶴巻和哉\",\"tsusauto\":\"津差宇土\",\"tsutsumi\":\"包\",\"tsutsumi akari\":\"つつみあかり\",\"tsutsumori\":\"筒森\",\"tsuwabuki raishi\":\"石蕗らいし\",\"tsuyoshi\":\"津義\",\"tsuzuki kazuhiko\":\"都築和彦\",\"tsuzuki masumi\":\"つづきますみ\",\"tsuzura\":\"つづら\",\"tsuzurao kaya\":\"九尾かや\",\"tsuzuri\":\"水瀬修\",\"tt\":\"tt\",\"ttl\":\"ttl\",\"ttomm\":\"TTOMM\",\"ttuunn\":\"つん\",\"tukamori syuuji\":\"ツカモリシュウジ\",\"tukazi\":\"つかぢ\",\"tukii yasiro\":\"月井やしろ\",\"tukikage nemu\":\"月影ネム\",\"tukise mizuna\":\"月瀬水無\",\"tukisiro saya\":\"月白沙耶\",\"tukito\":\"月兎\",\"tukumo keiichi\":\"九十九K1\",\"tukusi hirokazu\":\"土筆ヒロカズ\",\"tulip\":\"ちゅーりっふ。\",\"tuna milk\":\"つなみるく\",\"tuyo\":\"tuyo\",\"twilight\":\"TWILIGHT\",\"tyanaka\":\"てぃゃなか\",\"tyatubo\":\"ちゃつぼ\",\"tyauke\":\"茶請\",\"tyke\":\"たいく\",\"tyongera.\":\"ちょんげら。\",\"typehatena\":\"たいぷはてな\",\"tyrant sugawara\":\"タイラント菅原\",\"tyranu\":\"ティラヌー\",\"tyuda\":\"ちゅだ\",\"tyuuten\":\"蟲天\",\"u\":\"う\",\"u nitro\":\"うにとろ\",\"u-1\":\"U-1\",\"u-hi\":\"U-hi\",\"u-k\":\"U-K\",\"u-ko\":\"U子\",\"u-ring\":\"うーりん\",\"u-ta\":\"u-ta\",\"u35\":\"U35\",\"ubanis\":\"うばにす\",\"uchi-uchi keyaki\":\"内々欅\",\"uchida shou\":\"内田翔\",\"uchiga\":\"ウチガ\",\"uchikura\":\"内座\",\"uchiyan\":\"ウチやん\",\"uchoten\":\"有頂天\",\"uchuu ika\":\"宇宙烏賊\",\"udon\":\"うどん\",\"uduki sonowo\":\"空月苑生\",\"ueda rieko\":\"上田リエコ\",\"ueda ryou\":\"植田亮\",\"uehara ari\":\"上原あり\",\"uehasu\":\"上蓮\",\"uehiro\":\"うえひろ\",\"uemukai dai\":\"上向だい\",\"ueno ebisen\":\"上野えびせん\",\"ueno juubai\":\"上野十倍\",\"ueno meguru\":\"植野メグル\",\"ueno naoya\":\"ウエノ直哉\",\"ueshima haruki\":\"上嶋ハルキ\",\"uesugi shingo\":\"上杉信五\",\"uetake\":\"植竹\",\"ueto seri\":\"上戸セリ\",\"ugatsu matsuki\":\"うがつ末期\",\"ugeppa\":\"うげっぱ\",\"ugetsu\":\"ウゲツ\",\"ugo\":\"ゆうご\",\"ugou gou\":\"うごうゴウ\",\"uguisu kagura\":\"莺神乐\",\"uhhii\":\"うっひー\",\"uin\":\"uin\",\"uirotuzi yumihiko\":\"外郎辻ゆみ彦\",\"uirou\":\"うぃろう\",\"ukatu jyuzou\":\"迂闊十臓\",\"ukikotatsu\":\"うきこたつ\",\"ukita tougo\":\"宇岐多冬梧\",\"uku\":\"uku\",\"ukyo rst\":\"ukyo_rst\",\"ukyochu\":\"うきょちゅう\",\"ulrich\":\"うるりひ\",\"ultone\":\"うるとん\",\"ultrabuster\":\"ウルトラバスター\",\"uma\":\"UMA\",\"umadura grenouille\":\"馬面グルヌイユ\",\"umanosuke\":\"馬の助\",\"umayadono ohji\":\"厩戸王子\",\"ume\":\"うめ\",\"umehara suzuko\":\"梅原スズコ\",\"umekichi\":\"ウメ吉\",\"umekko\":\"うめっこ\",\"umemachi syouji\":\"梅町将二\",\"umeran\":\"うめらん\",\"umetarou\":\"梅太郎\",\"umezo\":\"うめ蔵\",\"umezu yoko\":\"梅津葉子\",\"umi kurage\":\"海海月\",\"umi tamako\":\"うみたまこ\",\"umiazuma kakeru\":\"うみあずまかける\",\"umibouzu\":\"うみぼうず\",\"umichika\":\"うみちか\",\"umihoshi minori\":\"海星みのり\",\"umihotaru harumare\":\"海蛍はるまれ\",\"umineko akira\":\"海猫明\",\"umino haine\":\"海野灰猫\",\"umino sachi\":\"海野幸\",\"umino yayoi\":\"海野やよい\",\"uminya\":\"うみにゃ\",\"umipro\":\"umiプロ\",\"umiyama misaki\":\"宇美山ミサキ\",\"umiyume\":\"紅壱\",\"umu rahi\":\"有無らひ\",\"umuga yasusi\":\"U無我仁\",\"un-moto\":\"云元\",\"una\":\"うな\",\"unacchi\":\"うなっち\",\"unadare\":\"うなだれ\",\"unamu\":\"うなむ\",\"unazuki\":\"うなづき\",\"unbalance\":\"UnBaLanCE\",\"unepon\":\"うねぱん\",\"uneta\":\"うねた\",\"uni\":\"うに\",\"uni-corn\":\"Uni-corn\",\"unico kasumi\":\"ゆにこかすみ\",\"unikura\":\"うに蔵\",\"uniskie seagal\":\"ウニスキー・セガール\",\"unknown\":\"春香\",\"uno ryoku\":\"温野りょく\",\"unohanat\":\"うのはな透\",\"unomi\":\"うのみ\",\"unoqlo\":\"UNOQLO\",\"unoshima kanaka\":\"卯ノ島カナカ\",\"unp\":\"UNp\",\"untue\":\"ウンツエ\",\"unwikkii\":\"うぃっきい\",\"unyo\":\"うにょ\",\"uona telepin\":\"うおなてれぴん\",\"ura\":\"URA\",\"ura dramatic\":\"裏ドラマチック\",\"ura ichiko\":\"裏一子\",\"uradoori nukemichi\":\"裏通抜道\",\"uraharukon\":\"うらはるこん\",\"urakami sosogi\":\"浦上そそぎ\",\"urakawa opera\":\"浦河おぺら\",\"urakuso\":\"うらくそ\",\"urakusog\":\"有楽そG\",\"uranfu\":\"うらんふ\",\"urano mami\":\"浦乃まみ\",\"urashima yuuhi\":\"浦島ゆうひ\",\"uraura\":\"uraura\",\"urayama\":\"うらやま\",\"urec\":\"UREC\",\"urekemo lala\":\"熟獣LaLa\",\"ureshino megumi\":\"嬉野めぐみ\",\"ureup\":\"うれあっぷ\",\"uriboh\":\"ウリ坊\",\"urin\":\"卯林\",\"urivo\":\"ウリボぅ\",\"uro\":\"ウロ | 雨露\",\"uro-g\":\"Uro-G\",\"urokozuki\":\"ウロコヅキ\",\"uron\":\"うろん\",\"urotsuki\":\"うろつき\",\"urozuki akira\":\"宇路月\",\"urushi\":\"ウルシ\",\"urutsu\":\"ウルツ\",\"uruu\":\"うるう\",\"uryu sango\":\"瓜生珊瑚\",\"us them\":\"あすぜむ\",\"usa\":\"ウサ\",\"usa usagi\":\"うさうさぎ\",\"usagi ink\":\"うさぎいンく\",\"usagi kei\":\"宇佐木恵\",\"usaki\":\"うさき\",\"usako\":\"ウサ小\",\"usami rui\":\"ウサミルイ\",\"usami suruga\":\"うさみするが\",\"usano riko\":\"兎野りこ\",\"usen\":\"ユウセン\",\"ushi\":\"うし\",\"ushi mochi\":\"うしもち\",\"ushitora tatsumi\":\"丑寅たつみ\",\"usi\":\"usi\",\"usimanu\":\"うしまぬ\",\"usoneko\":\"うそねこ\",\"usso\":\"USSO\",\"usuchi.\":\"うすちー。\",\"usui\":\"薄\",\"usuke bou\":\"うすけ坊\",\"usuki\":\"薄稀\",\"usurai\":\"うすら氷\",\"usyuuri\":\"白ぅ～凪ぃ\",\"uta\":\"唄\",\"utage\":\"宴\",\"utahara\":\"ウタハラ\",\"utakata nagi\":\"UTAKATA凪\",\"utako\":\"うた子\",\"utana\":\"うたな\",\"utano\":\"うた乃\",\"utanone sion\":\"うたのねしおん\",\"utase yui\":\"うたせゆい\",\"utida k\":\"ウチダケイ\",\"utsubo kazura\":\"うつぼかずら\",\"utsugi tsuguha\":\"空木次葉\",\"utsuki\":\"うー☆月\",\"utsurogi angu\":\"空木あんぐ\",\"uttorikun\":\"うっとりくん\",\"utu\":\"utu\",\"uwano sora\":\"ウワノソラ\",\"uzukinoko\":\"うづきのこ\",\"uzunoki tamaki\":\"渦の木環\",\"uzura no tamago\":\"うずらのたまご\",\"v-mag\":\"v-mag\",\"vae\":\"ヴァエ\",\"val\":\"val\",\"valero\":\"ヴァレロ\",\"valiant\":\"ばりあんと\",\"vanadium\":\"Vanadium\",\"vancho\":\"ばんちょー\",\"vanilla\":\"vanilla\",\"vanilla coke\":\"ヴァニラコーク\",\"vanilla cream\":\"ヴァニラCREAM\",\"vanity\":\"VANITY\",\"varein\":\"Varein\",\"velfro\":\"べるふろ\",\"velzhe\":\"ベルゼ\",\"ven\":\"ヴェン\",\"venomlin\":\"venomlin\",\"vice\":\"vice\",\"vinny\":\"vinny\",\"virth\":\"ばぁす\",\"vivi\":\"びび\",\"vogue\":\"vogue\",\"volcano shigeru\":\"ボルケーノ滋\",\"vt\":\"VT\",\"vulcan nure\":\"ヴぁるかん濡\",\"vyo\":\"べぃお\",\"walzrj erorider\":\"W18\",\"wabuki\":\"わぶき\",\"wacoco waco\":\"輪子湖わこ\",\"wada erika\":\"和田エリカ\",\"wadachi kururu\":\"わだちくるる\",\"wadanaka\":\"ワダナカ\",\"wadatsumi\":\"わだつみ\",\"waga na wa masamichi\":\"我が名は正道\",\"wagahai hakushaku\":\"ワガハイ伯爵\",\"waira\":\"猥裸\",\"waka\":\"わか\",\"wakachiko\":\"わかちこ\",\"wakaki tamiki\":\"若木民喜\",\"wakamesan\":\"ワカメさん\",\"wakamiya teresa\":\"我宮てれさ\",\"wakatsuki\":\"若月\",\"wako\":\"わこ\",\"wakura\":\"わくら\",\"wakyo\":\"Wakyo\",\"wamuko\":\"わむこ\",\"wamusato haru\":\"和六里ハル\",\"wan-pyo\":\"王彪\",\"wanaata\":\"わなあた\",\"wanao\":\"わなお\",\"wanashiro giovanna\":\"和南城ジョアンナ\",\"wanderer\":\"Wanderer\",\"wanie digital\":\"ワニデジタル\",\"wanriky\":\"腕力\",\"wantaro\":\"ワン夕口\",\"wap\":\"WaP\",\"wapokichi\":\"わぽ吉\",\"warabi yuuzou\":\"わらびゆうぞう\",\"warashibe\":\"わらしべ\",\"warashina mama\":\"わらしなママ\",\"waroko\":\"ワロコ\",\"warp mind\":\"warp_mind\",\"wasa beef\":\"わさビーフ\",\"wasabi yuuma\":\"わさび悠馬\",\"wasamo\":\"わさも\",\"wase rin\":\"早生リン\",\"washima\":\"washima\",\"washimi yu-ko\":\"わしみゆーこ\",\"washimori\":\"鷲森\",\"washizuka sho\":\"鷲塚翔\",\"wasizuu\":\"わしず\",\"wassyoi\":\"WASSYOI\",\"wasu\":\"ワス\",\"wata motsu\":\"綿もつ\",\"wata-ruh\":\"わた・るぅー\",\"wataichi meko\":\"綿市めこ\",\"watanabe ignica\":\"渡辺イグニカ\",\"watanabe yoshimasa\":\"わたなべよしまさ\",\"watanabe yuuna\":\"渡辺ゆうな\",\"watanuki kaname\":\"四月朔日要\",\"watanuki lon\":\"綿貫ろん\",\"watao\":\"わたお\",\"watarai\":\"度会\",\"wataru\":\"渉\",\"watase rei\":\"渡瀬玲\",\"watase sakana\":\"渡瀬さかな\",\"wataya\":\"綿谷\",\"watayoshi\":\"わたよし\",\"watchie\":\"わっちー\",\"watts\":\"Watts\",\"wave\":\"WAVE\",\"waves\":\"waves\",\"wawa\":\"和々\",\"wawon\":\"ワヲン\",\"waysin\":\"Waysin\",\"wazuka\":\"ワズカ\",\"we53\":\"we53\",\"wedge\":\"WEDGE\",\"wemu\":\"ゑむ\",\"white\":\"ほわいと\",\"who are you\":\"風亜 ゆう\",\"wing bird\":\"WING☆BIRD\",\"winopz\":\"WinOPZ\",\"winte\":\"winte\",\"winter\":\"うぃんたぁ\",\"wk.\":\"wk.\",\"wkar\":\"WKAR\",\"wm\":\"wm\",\"wokasiya\":\"ヲカシヤ\",\"woody\":\"WOODY\",\"woof\":\"woof\",\"workaholic\":\"若堀久\",\"woza\":\"うぉざ\",\"wtwinmk2nd\":\"WTwinMkⅡ2nd\",\"www\":\"www\",\"wx\":\"WX\",\"x6suke\":\"X6suke\",\"xain\":\"ザイン\",\"xanadu\":\"Xanadu\",\"xe\":\"Xe\",\"xelvy\":\"xelvy\",\"xeph\":\"Xeph\",\"xi daisei\":\"クスィー大誠\",\"xiaohua\":\"消化\",\"xiaowoo\":\"小武\",\"xiarobo\":\"しあろぼ\",\"xii\":\"イニ\",\"xiin\":\"xiin\",\"xopc\":\"XOPC\",\"xxzero\":\"xxzero\",\"y\":\"Y\",\"ya\":\"ヤッ\",\"yabuki mao\":\"矢吹マオ\",\"yabuno uguisu\":\"やぶのうぐいす\",\"yaburebouki akuta\":\"破箒芥\",\"yac\":\"YAC\",\"yace\":\"YAce\",\"yachan\":\"やちゃん\",\"yachi\":\"ヤチ\",\"yada masaka\":\"やだ！まさかっ\",\"yadapoteto\":\"やだぽてと\",\"yadokari genpachirou\":\"宿借り源八郎\",\"yadoroku 7\":\"やどろく7\",\"yae\":\"八重\",\"yaeba\":\"やえば\",\"yaebane\":\"八重羽根\",\"yaeda nagumo\":\"八重田なぐも\",\"yaegashi nan\":\"八重樫南\",\"yaeto\":\"yaeto\",\"yagami dai\":\"八神大\",\"yagami sanjin\":\"矢上参仁\",\"yagami shimei\":\"八神士明\",\"yagezawa tetsuyuki\":\"やげざわてつゆき\",\"yagi yuu\":\"山羊ゆう\",\"yagumo kengou\":\"八雲剣豪\",\"yahakin\":\"やはきん\",\"yajiro masaru\":\"野城まさる\",\"yajuu\":\"野獣\",\"yakata soukei\":\"屋形宗慶\",\"yaki ohagi\":\"やきおはぎ\",\"yakisoba ohmori\":\"やきそばおおもり\",\"yakisobapantarou\":\"ヤキソバぱん太郎\",\"yakob\":\"やこぶ\",\"yakuta tetsuya\":\"やくたてつや\",\"yakuwa ken\":\"八鍬健\",\"yakuzaishi\":\"薬剤師\",\"yam\":\"yam\",\"yama\":\"YAMA\",\"pokoten\":\"ぽこてん\",\"yamabatake\":\"山場岳\",\"yamaboshi-kun\":\"やまぼしくん\",\"yamabuki mook\":\"山吹ムック\",\"yamaburo\":\"やまぶろ\",\"yamachan\":\"やまちゃん\",\"yamada\":\"ヤマダ\",\"yamada ako\":\"山田あこ\",\"yamada enako\":\"山田エナ子\",\"yamada kou\":\"山田こう\",\"yamada non\":\"やまだノン\",\"yamada satoshi\":\"山田サトシ\",\"yamada shiguma\":\"山田シグ魔\",\"yamada shuutarou\":\"山田秋太郎\",\"yamada takashi\":\"山田高嗣\",\"yamada yuumi\":\"やまだゆうみ\",\"yamadori\":\"山鳥\",\"yamadori kodi\":\"山鳥こぢ\",\"yamagiwa yuusuke\":\"山際悠介\",\"yamaguchi\":\"ヤマグチ\",\"yamaguchi nao\":\"やまぐち なお\",\"yamaguchi shinji\":\"やまぐちしんじ\",\"yamaguchi shunichi\":\"山口俊一\",\"yamaguchi ugou\":\"やまぐち羽轟\",\"yamai\":\"山井\",\"yamai sakatarou\":\"山井逆太郎\",\"yamaimo torotoro\":\"山いもとろとろ\",\"yamaishi\":\"山石\",\"yamaishi joe\":\"山石ジョウ\",\"yamaiso\":\"やまいそ\",\"yamakawa yuu\":\"山河勇\",\"yamako\":\"やまこ\",\"yamamoh\":\"やまもー\",\"yamamoto atsuji\":\"山本貴嗣\",\"yamamoto canponi\":\"やまもと かんぽに\",\"yamamoto johanne\":\"山本夜羽音\",\"yamamoto kaori\":\"山本佳織\",\"yamamoto ryuusuke\":\"はせ☆裕\",\"yamamoto tomomitsu\":\"山本ともみつ\",\"yamamura natsuru\":\"山村なつる\",\"yamane masahiro\":\"やまねまさひろ\",\"yamaneko suzume\":\"山猫スズメ\",\"yamano\":\"やまの\",\"yamano konzaburo\":\"山野紺三郎\",\"yamaori\":\"yamaori\",\"yamashita masahiro\":\"山下正浩\",\"yamashita woory\":\"山下うり\",\"yamato\":\"YAMATO\",\"yamato akami\":\"大和あかみ\",\"yamato masaomi\":\"やまと将臣\",\"yamato nadeshiko\":\"大和なでしこ\",\"yamato nyaon\":\"ヤマトにゃ音\",\"yamato osamushi\":\"大和乃 史\",\"yamato techno\":\"大和テクノ\",\"yamatodanuki\":\"大和狸\",\"yamaura shou\":\"山浦章\",\"yamazaki show\":\"夜魔咲翔\",\"yameru doushi\":\"病める同志\",\"yameta takashi\":\"止田卓史\",\"yami no naka\":\"闇の中\",\"yamikage missa\":\"闇影みさ\",\"yaminoki\":\"やみのき\",\"yamisupi\":\"やみすぴ\",\"yamizawa\":\"ヤミザワ\",\"yamizora hikari\":\"闇空光\",\"yamome\":\"ヤモメ\",\"yamoto\":\"yamoto\",\"yan\":\"ヤン\",\"yana\":\"也な\",\"yanagi\":\"柳\",\"yanagi hirohiko\":\"柳ひろひこ\",\"yanagida fumita\":\"柳田史太\",\"yanagie\":\"やなぎー\",\"yanagise\":\"やなぎせ\",\"yanase kotatsu\":\"柳瀬こたつ\",\"yanasegawabeya\":\"柳瀬川部屋\",\"yaneura meteor impact\":\"屋根裏メテオインパクト\",\"yang\":\"ヤン\",\"yankopi\":\"やんこぴ\",\"yano\":\"Yano\",\"yano rahna\":\"夜乃らあな\",\"yano takumi\":\"香川友信\",\"yano toshinori\":\"矢野トシノリ\",\"yanokake\":\"やのかけ\",\"yanonoshin\":\"やののしん\",\"yao.\":\"YaO.\",\"yaomai\":\"やおまい\",\"yappen\":\"ヤッペン\",\"yappy\":\"yappy\",\"yarii shimeta\":\"枪衣七五三太\",\"yas\":\"yas\",\"yasaka\":\"弥栄\",\"yasaka minato\":\"八坂ミナト\",\"yasha\":\"yasha\",\"yashai\":\"やしゃい\",\"yashichii\":\"やしちぃ\",\"yashiki third\":\"屋敷さーど\",\"yashima koto\":\"屋嶋コト\",\"yashio taiga\":\"八潮タイガー\",\"yashiro\":\"社\",\"yashiro ryo\":\"八代涼\",\"yason shain\":\"ヤソン社員\",\"yass\":\"yass\",\"yasu rintarou\":\"安麟太郎\",\"yasuaki\":\"ヤスアキ\",\"yasuda\":\"YASUDA\",\"yasuda katsunori\":\"安田かつのり\",\"yasuhara tsukasa\":\"安原司\",\"yasumon\":\"yasumon\",\"yasumori zen\":\"安森然\",\"yasunaga kouichirou\":\"安永航一郎\",\"yasunao\":\"やすなお\",\"yasuto\":\"泰斗\",\"yat\":\"yat\",\"yata\":\"yata\",\"yataneko\":\"ヤタネコ\",\"yatano\":\"やたの\",\"yatengetu\":\"夜天月\",\"yato hikaru\":\"八仁ヒカル\",\"yatsuashi matomo\":\"ヤツアシマトモ\",\"yatsufusa hajime\":\"八房一\",\"yatsugami tenchou\":\"八ツ神店長\",\"yatsuka yuhata\":\"夜束ユハタ\",\"yatsushima tetsuya\":\"八嶋テツヤ\",\"yatsuzaki\":\"八咲\",\"yatuzaki\":\"やつざき\",\"yautsuro\":\"ヤウツロ\",\"yawaraka concrete\":\"やわらかコンクリート\",\"yawaraka midori\":\"やわらかみどり\",\"yayo\":\"夜与\",\"yayoi kotoyuki\":\"弥生ことゆき\",\"yayoichi\":\"夜よいち\",\"yazawa oke\":\"矢澤おけ\",\"yazawa owl\":\"Yazawa Owl\",\"yazuki aoi\":\"野月あおい\",\"yellowseeds\":\"YellowSeeds\",\"yequo\":\"イエクオ\",\"yf studio\":\"YF Studio\",\"yk\":\"yk\",\"yo-jin\":\"YO-JIN\",\"yo-suke\":\"yo-suke\",\"yo2\":\"YO2\",\"yoban\":\"よばん\",\"yocchi\":\"よっち\",\"yodare\":\"よだれ\",\"yodori\":\"よどり\",\"yoekosukii\":\"ヨエコスキー\",\"yofukashi\":\"夜ふかし\",\"yogiri neo\":\"夜霧音緒\",\"yohi\":\"よひ\",\"yohinori\":\"ヨヒノリ\",\"yoichi\":\"よいち\",\"yoihoshi hikari\":\"宵星ヒカリ\",\"yoikuma\":\"酔\",\"yoki\":\"よーき\",\"yokko\":\"よっこ～\",\"yokkyun\":\"よっきゅん\",\"yoko\":\"yoko\",\"yoko juusuke\":\"横十輔\",\"yoko mawatari\":\"馬渡ようこ\",\"yokohachi\":\"よこはち\",\"yokosima\":\"横縞\",\"yokota mamoru\":\"横田守\",\"yokoyama kouji\":\"横山コウジ\",\"yokoyama michiru\":\"横山ミチル\",\"yokoyama naoki\":\"よこやまなおき\",\"yokoyama negi\":\"横山葱\",\"yoku\":\"ヨク\",\"yokuran\":\"翼卵\",\"yomiclone\":\"yomiclone\",\"yomoda yomo\":\"よもだよも\",\"yomogi\":\"よもぎ\",\"yomogi ringo\":\"よもぎりんご\",\"yomogiya keita\":\"よもぎや敬太\",\"yomosaka\":\"よもさか\",\"yomotsuka tsukasa\":\"四方塚ツカサ\",\"yomoyama akira\":\"四方山哲\",\"yonaga\":\"よなが\",\"yonbangai\":\"4番街\",\"yone\":\"ヨネ\",\"yonekura\":\"米蔵\",\"yonekura hisaki\":\"米倉久記\",\"yonekura kihiro\":\"米倉きひろ\",\"yonemaru\":\"よねまる\",\"yonezou\":\"よねぞう\",\"yonige-ya no kyou\":\"夜逃げ屋の恭\",\"yonu\":\"よる\",\"yoo oona\":\"よーな\",\"yorihito\":\"頼一\",\"yoriko\":\"よりこ\",\"yorisuke\":\"よりすけ\",\"yoriu mushi\":\"寄生虫\",\"yoroshiku tarou\":\"夜露死苦汰楼\",\"yorozu\":\"よろづ\",\"yoru yoru\":\"ヨルヨル\",\"yorutori\":\"よるとり\",\"yosage yoshikazu\":\"よさげよしかず\",\"yosai\":\"葉才\",\"yoshi\":\"yoshi\",\"yoshi keto\":\"よしけ～と\",\"yoshi-puu\":\"よしぷー\",\"yoshida gorou\":\"吉田悟郎\",\"yoshida goten\":\"吉田御殿\",\"yoshida hajime\":\"吉田創\",\"yoshida masahiko\":\"吉田正彦\",\"yoshida nami\":\"吉田浪\",\"yoshida negi\":\"よしだねぎ\",\"yoshida yoshimi\":\"よしだよしみ\",\"yoshiga fuumi\":\"吉賀ふうみ\",\"yoshihara maito\":\"芳原舞人\",\"kasaki yoshihiko\":\"加崎善彦\",\"yoshii toshinari\":\"由衣利成\",\"yoshiizumi hana\":\"よしいずみはな\",\"yoshijima ataru\":\"よしじまあたる\",\"yoshiki\":\"YOSHIKI\",\"yoshimiya chitose\":\"義宮ちとせ\",\"yoshimoto ayumu\":\"芳本あゆむ\",\"yoshimune\":\"よしむね\",\"yoshimura\":\"吉村\",\"yoshimura kentaro\":\"よしむらけんたろー\",\"yoshinaga eikichi\":\"吉永えいきち\",\"yoshinari ayaka\":\"吉成綾加\",\"yoshino kasa\":\"よしのかさ\",\"yoshino sora\":\"吉乃そら\",\"yoshino.\":\"よしの。\",\"yoshiragi\":\"ヨシラギ\",\"yoshiron\":\"よしろん\",\"yoshiten\":\"よし天\",\"yoshitora\":\"YOSHITORA\",\"momomo momo\":\"桃萌 百\",\"yoshiwo\":\"よしを\",\"yoshiyuki\":\"ヨシユキ\",\"yoshizane akihiro\":\"好実昭博\",\"yoshizawa kei\":\"吉沢蛍\",\"yoshizawa mayu\":\"よしざわ真由\",\"yoshizawa megane\":\"吉沢メガネ\",\"yoshizawa miyabi\":\"吉沢雅\",\"yoshizawa tomoaki\":\"吉澤友章\",\"yoshizawa vanilla\":\"芳澤ばにら\",\"yositama\":\"英戦\",\"yosomono\":\"よそ者\",\"yosuke\":\"ヨースケ\",\"yosyo-\":\"ヨショー\",\"yotaka\":\"yotaka\",\"yotarou\":\"夜太弄\",\"yotsuba yuiko\":\"四葉ゆいこ\",\"yotsura\":\"寄弦\",\"yotsuya mika\":\"よつやみか\",\"yottan\":\"ヨッタン\",\"you2\":\"YOU2\",\"you3.\":\"you3｡\",\"youdou\":\"謡堂\",\"youichirou w\":\"よーいちろーW\",\"youjomodoki\":\"ヨウジョモドキ\",\"youka\":\"よーか\",\"youkan\":\"ようかん\",\"youma kachie\":\"夜馬勝絵\",\"youtou sadamitsu\":\"妖刀定光\",\"yowashi\":\"よわし\",\"yoyo\":\"YoYo\",\"yoyoyoyou\":\"よよよよう\",\"yozi\":\"YoZi\",\"yozo\":\"yozo\",\"yts takana\":\"YTS 鷹那\",\"yu\":\"YU\",\"yu-ri\":\"YU-RI\",\"yu-ya\":\"熊耶\",\"yua\":\"夕海\",\"yuam\":\"ゆあま\",\"yucchris\":\"ゆっ栗栖\",\"yuchi\":\"ゆち\",\"yuchitose\":\"ゆうちとせ\",\"yuda-chan\":\"湯田ちゃん\",\"yude pea\":\"茹でピー\",\"yuduki kei\":\"雪月佳\",\"yuduki kisa\":\"柚希妃紗\",\"yuge\":\"ゆげ\",\"yui-7\":\"YUI_7\",\"yuika\":\"ゆいか\",\"yuima yutaka\":\"ゆいまゆたか\",\"yuisaki takumi\":\"結崎拓海\",\"yuitsu\":\"ゆいつ\",\"yukagen tenyu\":\"湯加減てんゆ～\",\"yukako\":\"ゆかこ\",\"yukaran nosuke\":\"ゆからんのすけ\",\"yukatama\":\"ゆかたま\",\"yukataro\":\"ゆかたろ\",\"yukawa mario\":\"湯川まりお\",\"yuki mau\":\"有希まう\",\"yuki seriya\":\"yuki seriya\",\"yuki tomoshi\":\"幸灯\",\"yukia\":\"ゆきあ\",\"yukian\":\"Yukian\",\"yukibana\":\"雪華\",\"yukichi-san\":\"ゆきちさん\",\"yukiguni eringi\":\"雪国エリンギ\",\"yukiharu\":\"にゃわて荘\",\"yukihime haruka\":\"雪姫はるか\",\"yukihoshi kokoro\":\"雪星こころ\",\"yukimachi tounosuke\":\"雪町灯之助\",\"yukimai\":\"ゆきまい\",\"yukimaro yukky\":\"ゆきまろゆっきー\",\"yukimaru.\":\"雪丸。\",\"yukimi\":\"由木彌\",\"yukimi iris\":\"雪味あいりす\",\"yukimino yukio\":\"雪見野ユキオ\",\"yukimitsu\":\"ゆきみつ\",\"yukimura hajime\":\"雪村一\",\"yukimura tsugumi\":\"ゆきむらつぐみ\",\"yukina\":\"ゆきな\",\"yukina funa\":\"幸奈ふな\",\"yukino\":\"ゆきの\",\"yukino yukikaze\":\"ゆきのゆきかぜ\",\"yukiri takashi\":\"結桐たかし\",\"yukishiro yima\":\"雪白イマ\",\"yukisiro arte\":\"雪代あるて\",\"yukitaka\":\"柚木貴\",\"yukito\":\"雪人\",\"yukitsuka tsukasa\":\"ゆきつかつかさ\",\"yukiusagi\":\"ゆきうさぎ\",\"yukiwo\":\"ユキヲ\",\"yukiya\":\"雪哉\",\"yukiyanagi yui\":\"雪柳唯依\",\"yukizuki chikuba\":\"雪月竹馬\",\"yukke-ani\":\"ゆっけ兄\",\"yukke.\":\"ゆっけ。\",\"yukki\":\"ゆっき\",\"yukko\":\"ゆっこ\",\"yukkyun\":\"ユッキュン\",\"yuku\":\"ゆく\",\"yukyu ponzu\":\"悠久ポン酢\",\"yuma\":\"ゆーま\",\"yuma ryouhei\":\"ゆま亮平\",\"yumaman\":\"ゆままん\",\"yumbo anahoru\":\"ゆんぼあなほる\",\"yume\":\"夢\",\"yumegi\":\"ユメギ\",\"yumegi atsuki\":\"ゆめぎあつき\",\"yumemiya subaru\":\"夢宮すばる\",\"yumeno shiya\":\"夢ノ紫也\",\"yumesato makura\":\"夢里まくら\",\"yumeutsutsu hideki\":\"夢現ひでき\",\"yumi ichirou\":\"友美イチロウ\",\"yumiya\":\"ゆみや\",\"yuna\":\"由那\",\"yunagi kahoru\":\"夕凪薫\",\"yuniba\":\"ゆにば\",\"yunioshi\":\"ゆにおし\",\"yuno shigure\":\"雪乃時雨\",\"yunodon\":\"ゆのどん\",\"yunoka gashuu\":\"ゆのか雅愁\",\"yunokawa yosomi\":\"温泉川よそ見\",\"yunoki yu\":\"柚木ユウ\",\"yunopanchako\":\"ゆのぱんちゃこ\",\"yunosuke\":\"ゆのすけ\",\"yurarin\":\"遊来りん\",\"yurei\":\"ゆーれー\",\"yuri kamome\":\"友梨かもめ\",\"yuri tamashii\":\"百合魂\",\"yuri tohru\":\"百合融\",\"yuriaki\":\"ユリアキ\",\"yurige\":\"ゆりげ\",\"yurihara aki\":\"百合原明\",\"yurikawa\":\"百合川\",\"yuririn\":\"ゆりりん\",\"yuriwhale\":\"Yuriwhale\",\"yusa ikuyoshi\":\"遊佐育美\",\"yusui\":\"ゆすい\",\"yusura\":\"山桜桃\",\"yutakame\":\"ゆたかめ\",\"yuto\":\"yuto\",\"yutori-nu\":\"ゆとりーぬ\",\"yutsuki tsuzuri\":\"愉月綴\",\"yuu\":\"由宇\",\"yuu sagi\":\"ユウサギ\",\"yuuga\":\"遊賀\",\"yuuga momiji\":\"夕雅紅葉\",\"yuuge\":\"夕餉\",\"yuugo\":\"ユーゴ\",\"ariuo\":\"有魚\",\"yuuhi\":\"雄飛\",\"yuuhi alpha\":\"悠飛あるふぁ\",\"yuuichi\":\"ゆういち\",\"yuuk\":\"yuuk\",\"yuuka rei\":\"優華麗\",\"yuuki alice\":\"夕姫ありす\",\"yuuki haruka\":\"結城遥\",\"yuuki hb\":\"ユウキHB\",\"yuuki hide\":\"悠希ヒデ\",\"yuuki mia\":\"結城みあ\",\"yuuki mitsuru\":\"結城みつる\",\"yuuki miya\":\"結城美夜\",\"yuuki miyabi\":\"結城みやび\",\"yuuki noco\":\"悠樹ノコ\",\"yuuki ray\":\"ユウキレイ\",\"yuuki ryo\":\"結城稜\",\"yuuki satoru\":\"結城さとる\",\"yuuki tomoka\":\"ゆうきともか\",\"yuuki tsumugi\":\"ゆうきつむぎ\",\"yuuki yu\":\"結城結\",\"yuumazume\":\"ゆうまずめ\",\"yuumi takako\":\"夕海たかこ\",\"yuumyago\":\"ゆうみゃご\",\"yuunagi show\":\"夕凪ショウ\",\"yuuno\":\"ゆうの\",\"yuunyan\":\"ゆうにゃん\",\"yuuri\":\"遊離\",\"yuurin\":\"佑りん\",\"yuusa riki\":\"ゆうさ理姫\",\"yuusei iori\":\"遊星庵\",\"yuusuke asazume\":\"麻爪佑助\",\"yuuta\":\"湯唄\",\"yuuyake roji\":\"夕焼け路地\",\"yuya\":\"悠夜\",\"yuyu\":\"ゆゆ\",\"yuzaki\":\"ユウザキ\",\"yuzco\":\"ゆずこ\",\"yuzn\":\"ゆずん\",\"yuzu ramune\":\"柚子ラムネ\",\"yuzu syrup\":\"ゆずしろっぷ\",\"yuzucky\":\"ゆずっきー\",\"yuzuka\":\"柚夏\",\"yuzuki makii\":\"柚木まき\",\"yuzuki rin\":\"柚木鈴\",\"yuzuki ruri\":\"柚木ルリ\",\"yuzuki suzu\":\"柚木鈴\",\"yuzuki yu\":\"柚木ゆう\",\"yuzuki yua\":\"柚月ゆあ\",\"yuzuki yuno\":\"柚木ゆの\",\"yuzuko syou\":\"ゆずこしょう\",\"yuzupon\":\"ゆずぽん\",\"yuzuriha\":\"杠\",\"yuzushiko\":\"ゆずしこ\",\"yuzuyoukan\":\"ゆずようかん\",\"z-s-e\":\"z-s-e\",\"z26\":\"Z26\",\"zacro\":\"柘榴\",\"zakiko\":\"ザキコ\",\"zakkunpoppu\":\"雑君保プ\",\"zakotv\":\"ZakoTV\",\"zakuro\":\"ざくろ\",\"zama shouji\":\"座間翔二\",\"zan\":\"ZAN\",\"zaneri\":\"ザネリ\",\"zangi\":\"ざんぎ\",\"zarasi\":\"ざらし\",\"zariya ranmaru\":\"座裏屋蘭丸\",\"zasan\":\"ざさん\",\"zasha\":\"ザシャ\",\"zashiki ushi\":\"座敷牛\",\"zassyu\":\"ザッシュ\",\"zawa\":\"ざわ\",\"zawameki\":\"ざわめき\",\"zawar\":\"ZawarC\",\"zax\":\"Zax\",\"zekkyosyu\":\"絶巨主\",\"zekkyou\":\"絶叫\",\"zeku\":\"ゼク\",\"zen\":\"ZEN\",\"zen.\":\"ぜん。\",\"zen33n\":\"Zen33n\",\"zen9\":\"zen9\",\"zengo\":\"前後\",\"zenki\":\"ぜんき\",\"zenra\":\"全裸\",\"zenra yashiki\":\"全裸屋敷\",\"zentam\":\"ゼンタム\",\"zephi\":\"ゼフィ\",\"zephid\":\"ゼフィド\",\"raianonzika\":\"RaianOnzika\",\"zero\":\"zero\",\"zero punch\":\"ぜろぽんち\",\"zero tanuki\":\"零狸\",\"zessekaishonen\":\"絶世界少年\",\"zest\":\"ゼスト\",\"zettaizetumei\":\"絶対絶命\",\"zetz\":\"ぜっつ\",\"zima\":\"Zima\",\"zin\":\"ZiN\",\"zinan\":\"ジナン\",\"zinno\":\"zinno\",\"zion\":\"ZION\",\"ziz\":\"ziz\",\"zo\":\"ぞ\",\"zol\":\"ZOL\",\"zono\":\"ぞの\",\"zonta\":\"ぞん太\",\"zorane\":\"ぞらね\",\"zourion\":\"ゾウリオン\",\"zukky\":\"Zukky\",\"zummy\":\"Zummy\",\"zumo8\":\"ずも8\",\"zun nyannyan\":\"ズンにゃんにゃん\",\"zundamochi\":\"ずんだ餅\",\"zundarinda\":\"ズンダリンダ\",\"zunta\":\"Zunta\",\"zuru\":\"ズル\",\"zutta\":\"Zutta\",\"zuzu\":\"ズズ\",\"zyaroh akira\":\"邪琅明\",\"zyougen\":\"上弦\",\"zyulokuya\":\"十録屋\",\"zzinzinz\":\"なめジョン\",\"zzz\":\"zzz\",\"1up\":\"1UP\",\"6zo\":\"6zo\",\"anzheli\":\"Anzheli\",\"cfr\":\"CFR\",\"inagita\":\"INAGITA\",\"inside\":\"Inside\",\"kashiko akira\":\"かしこ村\",\"kururururu\":\"くるるるる\",\"murayamamon\":\"村山門\",\"nanohana800\":\"なのはな800\",\"nns\":\"nnS\",\"norainu\":\"野良犬\",\"noysca\":\"noysca\",\"styx\":\"STYX\",\"takamiya hairi\":\"たかみやはいり\",\"tinmeshi\":\"珍飯\",\"utatane\":\"うたたね\",\"tomodachi\":\"Tomodachi\",\"puracotte\":\"Puracotte＊ぷらこ\",\"tsuyuhisa fumi\":\"露久ふみ\",\"hinoshita akame\":\"日之下あかめ\",\"ryokuchamichi\":\"緑茶みち\",\"mamimi\":\"Mamimi\",\"mujin bensin\":\"無人\",\"jima\":\"じま\",\"miyama tsubakime\":\"美山椿芽\",\"haku89\":\"haku89\",\"shengtian\":\"升天\",\"tezuka osamu\":\"手冢治虫\",\"oyuyu\":\"おゆゆ\",\"mo oku\":\"MO:OKU\",\"rounds chen\":\"RoundsChen\",\"tsubame\":\"つばめ\",\"ushinomiya\":\"うしのみや\",\"yoikorogashi\":\"よいころがし\",\"natsu jam\":\"夏ジャム\",\"aosawa yuki\":\"青沢由紀\",\"inui nuinu\":\"犬居ぬいぬ\",\"2no.\":\"2no.\",\"h.carrrrrrot\":\"カロロット\",\"toriattogununu\":\"とりあっとぐぬぬ\",\"harrishero\":\"ハリスヒロ\",\"potatorinrin\":\"孟達\",\"hotter daimon\":\"掘多大門\",\"cirilla\":\"CIRILLA\",\"tsunakama\":\"ツナかま\",\"yoshida ninn\":\"吉田にん\",\"yukimura yukio\":\"雪村雪緒\",\"akiyoshi amelie\":\"秋芳あめり\",\"shikibe tsuko\":\"色辺つこ\",\"yusha-m\":\"Yusha-M\",\"kuroboshi kouhaku\":\"黑星红白（饭冢武史）\",\"aji taro\":\"AJ/鯵太郎\",\"aizen pochi\":\"愛染ぽち\",\"nagatsuki hatsuka\":\"長月はつか\",\"kotobuki haruki\":\"琴吹はるき\",\"kou kou ax\":\"口口AX\",\"madoka tsukumo\":\"円つくも\",\"takeda hinata\":\"武田日向\",\"tsuyuri inu\":\"栗花落淫雨\",\"minagi koh\":\"海凪コウ\",\"mumumu seijin\":\"むむむ星人\",\"redchicken\":\"붉은닭\",\"shirai bebe\":\"白井べべ\",\"nekosaki aoi\":\"猫崎葵\",\"kakuchou no okina\":\"拡張の翁\",\"shiawase na choshoku.\":\"幸せな朝食。\",\"cenangam\":\"CeNanGam\",\"tabasco pasta\":\"タバスコパスタ\",\"gin eiji\":\"銀エイジ\",\"yan-baru\":\"やんBARU\",\"hanasaka houcha\":\"花咲方茶\",\"fallen-leaves\":\"Fallen落叶\",\"hanayama\":\"はなやま\",\"kusoniku yokichi\":\"糞肉与吉\",\"hatoba akane\":\"波止場茜\",\"hachi no hachihachi\":\"はちの八八\",\"rhasta\":\"牛乳重工\",\"melailai\":\"么赖赖\",\"da mao banlangen\":\"大猫板蓝根\",\"touwa nikuman\":\"空72色\",\"yushi quetzalli\":\"羽蛇Quetzalli\",\"fukuro daizi\":\"Fukuro袋子\",\"tsukumo nikyu\":\"九十九弐級\",\"uten ameka\":\"雨天あめか\",\"sakuraba rokusuke\":\"樱庭六辅\",\"aoyama akira\":\"苍山哲\",\"kamitake\":\"鱗物\",\"k-ko\":\"K子\",\"sisyamo 2 percent\":\"sisyamo2%\",\"metacora\":\"めたこら\",\"kangoku meika\":\"監獄銘菓\",\"souseki\":\"層積\",\"manno\":\"まんの\",\"tamada heijun\":\"玉田平准\",\"nagai go\":\"永井豪\",\"takamaru\":\"鷹丸\",\"nidaime\":\"二代目\",\"minato ojitan\":\"湊おじたん\",\"orukoa\":\"orukoa\",\"karakuri musha\":\"からくり武者\",\"neisan\":\"ねいさん\",\"takekawa sin\":\"武川慎\",\"galbany denryuu\":\"ガルバニー電流\",\"utsunomiya ukatsu\":\"郁之宫迂阔\",\"suito\":\"すいと\",\"kura\":\"倉\",\"ayasaka\":\"綾坂\",\"akusema\":\"あくせま\",\"takumichi\":\"Taku道\",\"ramanda\":\"ラマンダ\",\"suimi\":\"水深\",\"totoyama keiji\":\"魚山ケイジ\",\"konery\":\"ｺﾈﾘｨ＠(ヽ'ω`)\",\"cocomachi\":\"ここまち\",\"mizuse kiseki\":\"星の紅茶\",\"momomo gasshuukoku\":\"ももも合衆国\",\"nameless peasant\":\"皮三豆\",\"minamoto kosada\":\"源康定\",\"mukatsuku\":\"ム菓ツク（むか）\",\"akiamare\":\"あきあまれ\",\"sakuragi yomi\":\"樱木黄泉\",\"suichuu hanabi\":\"水中花火\",\"enmanuelart\":\"enmanuelart\",\"shirosaba\":\"白サバ\",\"cslucaris\":\"CSLucaris\",\"4riasensei\":\"フォリア\",\"matsuda\":\"ユウスケ\",\"rasen kyofu kaku\":\"ラセン恐怖閣\",\"damenahito\":\"だめなひと\",\"satou teruhito\":\"佐藤辉人\",\"yamada tahichi\":\"山田タヒチ\",\"nijiiro tyahantei\":\"虹色チャーハン亭\",\"ikemura hiroichi\":\"池村ヒロイチ\",\"kizaki masuta\":\"季崎ますた\",\"komera\":\"こめら\",\"kurotane\":\"くろたね\",\"toushiki yubune\":\"橙織ゆぶね\",\"shimada panda\":\"しま田ぱんだ\",\"kakei kei\":\"花兄けい\",\"kudou hisashi\":\"くどうひさし\",\"yuuzuki hijiri\":\"夕月ひじり\",\"koumashiro\":\"こうましろ\",\"denpouya chamaru\":\"伝法谷ちゃまる\",\"miazi\":\"miazi\",\"namagome negi\":\"瑠川ねぎ\",\"ebi fry teishoku\":\"ぐえー/エビフライ定食\",\"shishido sakura\":\"宍戸沙玖来\",\"pontaro\":\"ぽんたろ\",\"ikawa waki\":\"わき\",\"aizawa marimo\":\"愛沢 まりも\",\"moyamoya\":\"モヤモヤ\",\"okabe gyoza\":\"尾壁餃子\",\"shizuhime\":\"静姬\",\"kagawa yusaku\":\"香川悠作\",\"daito\":\"daito\",\"nakamura asumiko\":\"中村明日美子\",\"muto\":\"醤油エビ\",\"dokuneko noil\":\"毒猫ノイル\",\"urabe katsuto\":\"浦辺克斗\",\"minakami rin\":\"ミナカミ\",\"koyomania\":\"Koyomania\",\"magowasabi\":\"magowasabi\",\"kurigami\":\"kurigamiin\",\"renetan\":\"レネタン\",\"hi\":\"Hi\",\"kitsune choukan\":\"きつね長官\",\"kagura kurumi\":\"神楽くるみ\",\"yaemugura\":\"八重葎\",\"pottsness\":\"pottsness\",\"kimyou chourui\":\"奇妙鸟类\",\"kawakami minoru\":\"川上稔\",\"omulet tomato\":\"オムレットマト\",\"hyouta\":\"俵太\",\"asaomi shimura\":\"アサオミ志群\",\"ooban yaki\":\"大伴ヤキ\",\"yoshida killy\":\"吉田Killy\",\"tou\":\"トウ\",\"natsusaka\":\"夏坂\",\"tempura dozaemon\":\"天妇罗土左卫门\",\"furatsu\":\"ふらつ\",\"matsui yasutsugu\":\"松井康治（郁那和なにろ）\",\"inari bancha\":\"稻荷ばん茶\",\"pumpkinspicelatte\":\"pumpkinspice\",\"sca-ji\":\"SCA-自\",\"shichi ouji\":\"七王子\",\"mankai beesuke\":\"満開べえスケ\",\"hiiragi yuichi\":\"柊裕一\",\"mukaino kei\":\"向野圭衣\",\"sogom\":\"裕珍\",\"bk-mita\":\"灰濁クロム\",\"sanjiro\":\"さんじろ♨\",\"atelier30\":\"Atelier30\",\"magnificent sexy gals\":\"Magnificent\",\"yoshinari you\":\"吉成曜\",\"sirosoil\":\"白土\",\"chinpan\":\"チンパン\",\"chocoro\":\"チョコロ\",\"sasaki shounen\":\"佐佐木少年\",\"haruno tomoya\":\"春野友矢\",\"pirorikin\":\"ピロリ菌\",\"hayama junichi\":\"羽山淳一\",\"kureha\":\"クレハ\",\"kinomiki\":\"きのみき\",\"ao plus beni\":\"青十紅\",\"ruzhai\":\"儒宅\",\"hukairi botan\":\"深煎り牡丹\",\"katano chika\":\"片野ちか\",\"shirai samoedo\":\"白井サモエド\",\"madana\":\"まだな\",\"squchan\":\"SquChan\",\"mikamin\":\"みかみん\",\"nakamori\":\"なかもり\",\"gittangittan\":\"ギッタンギッタン\",\"kuroda kurota\":\"黒田くろた\",\"inui hana\":\"犬居葉菜\",\"yukai na factory\":\"愉快なFactory\",\"otsunosuke\":\"乙の助\",\"sada sadao\":\"佐田さだお\",\"asakura clock\":\"朝倉クロック\",\"koromotake\":\"ころもたけ\",\"hashina tamaki\":\"葉科たまき\",\"kusogaki\":\"くそガキ\",\"aestheticc-meme\":\"ミームクリーム\",\"denkou nyako\":\"電光にゃコ\",\"hamico\":\"はみこ\",\"takeru\":\"たける\",\"yamoge\":\"やもげ\",\"taguchi monyata\":\"田口もにゃ太\",\"sushiyama\":\"寿司山\",\"kaminari doon\":\"カミナリ・ドーン\",\"ayanakitori\":\"アヤナキトリ\",\"yukoring\":\"優子鈴\",\"fjsmu\":\"fjsmu（ふじしむ）\",\"tomari\":\"トマリ\",\"miso tanuki inka teikoku\":\"みそたぬきインカ帝国\",\"asakawa\":\"浅川\",\"fellatrix\":\"fellatrix\",\"bone hiko\":\"骨彦\",\"yuzuhara moke\":\"柚原もけ\",\"onigashima eryu\":\"鬼ヶ島えりゅ\",\"micosivaa\":\"神輿葉\",\"doritoru\":\"どりとる\",\"nagina\":\"なぎな\",\"ura kaizokudan\":\"裏海俗団\",\"tsuda hitokuchi\":\"津田ヒトクチ\",\"sakura ab\":\"さくらAB\",\"sevengar\":\"せぶんがー\",\"jagi iwa\":\"ジャギ岩\",\"seneto\":\"セネト\",\"unosero\":\"うのせろ\",\"murasaki shingou\":\"紫信号\",\"meriibe\":\"めりーべ\",\"hoshina mimiwo\":\"星奈みみヲ\",\"sakauchi waka\":\"坂内若\",\"sagami yuki\":\"さがみおきば\",\"miyanose you\":\"宮ノ瀬陽\",\"tsukiyo\":\"月夜\",\"nakkar\":\"Nakkar\",\"bippew\":\"Bippew\",\"omegazero01\":\"Omegazero01\",\"diesel\":\"でーぜる\",\"sincos\":\"サインこす\",\"lshiki\":\"Lshiki\",\"asahina yoshitosi\":\"朝比奈吉利（420号高速道路）\",\"mithril rim\":\"みすりるリム\",\"matsunaga kouyou\":\"松永紅葉\",\"muta no yoi oniku\":\"mutaの良いお肉\",\"hokkyoku hotaru\":\"北極ホタル\",\"sunhyun\":\"そんひょん\",\"mizuno yukimi\":\"みずの雪見\",\"greem bang\":\"GreemBang\",\"bibimbub\":\"Bibimbub\",\"kuni-kun\":\"クニくん\",\"mushihara\":\"虫原\",\"momomomo hakushaku\":\"モモモーモー伯爵\",\"takaoka sui\":\"高岡彗\",\"gatoh ganaha\":\"我藤がなは\",\"shirasu\":\"しらす\",\"kandata nijou\":\"神多二丞\",\"saipaco.\":\"SAIPACo.\",\"jj.jj\":\"JJ.JJ\",\"ringo club\":\"りんごくらぶ\",\"usatsuka eiji\":\"兔冢英志\",\"ishii takamori\":\"石井高森\",\"coro fae\":\"Coro Fae\",\"piuta\":\"piuta\",\"meeko\":\"めえこ（めえお）\",\"kuroni bokujou\":\"クロニ\",\"himiya zyo-zu\":\"比宮じょーず\",\"hinageshi\":\"雏罂粟\",\"unknown showhey\":\"马岛祥平\",\"saito naoki\":\"斋藤直葵\",\"yoshiku\":\"四々九\",\"kakage\":\"かかげ\",\"nibiiro shizuka\":\"鈍色玄\",\"kousaka tohru\":\"香坂透\",\"aikolik\":\"AIKOlik\",\"2bls\":\"2bls\",\"utagawa yosiero\":\"歌川芳江呂\",\"allenes\":\"ALLENES\",\"haiironpada\":\"灰色ンパダ\",\"hanamaluo\":\"ハナマルオ\",\"kuroto yu\":\"黒兎ゆう\",\"sugue tetto\":\"スグエ鉄塔\",\"sorayama hajime\":\"空山基\",\"hotate-chan\":\"ほたてちゃん\",\"akai same\":\"かふぇいん中毒\",\"takano tomohiro\":\"高野友宏\",\"ameno shigure\":\"雨野时雨\",\"ushi kousen\":\"牛工船\",\"eroi-roe\":\"エロ井ロエ\",\"camekirin\":\"かめきりん\",\"mayonaka taroupho\":\"真夜中足穗\",\"sharekoube\":\"メカしゃれこうべ\",\"mizusane\":\"みづさね\",\"ninda hayo\":\"忍田波葉\",\"delta chimaki\":\"▲ちまき\",\"menbou\":\"めんぼー\",\"uishi poru\":\"羽衣石ぽる\",\"momoyama hato\":\"モモヤマハト\",\"inukami inoji\":\"犬上いの字\",\"ichikawa noa\":\"一河のあ\",\"mary-san\":\"メリサン\",\"auman zureedus\":\"オーマンズリーダス\",\"maeshima shigeki\":\"前嶋重機\",\"nanquanzl\":\"南拳蟑狼\",\"janggun\":\"jeneral\",\"eros o gutsugutsu nikonda megane\":\"エロスをぐつぐつ煮込んだメガネ\",\"sekkei\":\"雪景\",\"mouja\":\"モウじゃ\",\"hararame\":\"はららめ\",\"shiba aya\":\"柴あや\",\"kiyoshi\":\"キヨシ\",\"shiworiita\":\"シヲリイタ\",\"kitakawa touta\":\"北河トウタ\",\"okiha\":\"沖葉\",\"uekura eku\":\"上倉エク\",\"dendoro kakariya\":\"澱泥カカリヤ\",\"cucchiore\":\"くっきおーれ\",\"konbu wakame\":\"昆布わかめ\",\"omusubi korori\":\"緒結ころり\",\"memeyu\":\"めめゆ\",\"yoki kana\":\"斧カナ\",\"masuda miyaka\":\"枠田ちさき\",\"arima zin\":\"有马侭\",\"silver dog\":\"シルバードッグ\",\"shihira tatsuya\":\"四平龙也\",\"aoki seishin\":\"碧木诚心\",\"tachibana takashi\":\"橘孝志\",\"sekai ichii\":\"世界一位\",\"maroya kayo\":\"まろや伽夜\",\"kobayashi ritz\":\"小林立\",\"hiroki\":\"宏き\",\"emoto shikeko\":\"えもと しけこ\",\"gogopanda\":\"ごーごーぱんだ\",\"naminori kamome\":\"波乗かもめ\",\"tyontyon\":\"てょんてょん\",\"soejima shigenori\":\"副岛成记\",\"chisunosuke\":\"ちすの助\",\"sakurayashiki tonkotsu\":\"桜屋敷とんこつ\",\"fukumoto masahisa\":\"福本真久\",\"signo mandara\":\"シグノマンダラ\",\"tobiume sayu\":\"飞梅さゆ\",\"omitsu\":\"えびおみつ\",\"hangetsuban sonshou\":\"半月板损伤\",\"tottotonero tarou.\":\"とっととねろ太郎。\",\"nakagomi\":\"中込\",\"d.\":\"D.\",\"oyu\":\"おゆ\",\"pononozo\":\"ぽののぞ\",\"hirota shimaguni\":\"浩田岛国\",\"mutou tetsu\":\"武藤铁\",\"agachi\":\"あがち\",\"shiina shinya\":\"椎名深夜\",\"touketsu\":\"トウケツ\",\"hoshina meito\":\"星名めいと\",\"nanonanno\":\"なのなんの\",\"kuroseimu\":\"クロセイム\",\"teppo\":\"鉄歩\",\"mochio\":\"白蜜モチ\",\"kitagawa zayaku\":\"北川ざやく\",\"saito tsubame\":\"齋藤燕\",\"aohonoo\":\"蒼炎\",\"tamayura banko\":\"玉ぼん\",\"tamaki nao\":\"玉姫なお\",\"inonaka kawazu\":\"胃ノ中かわず\",\"saiogauma\":\"塞翁が马\",\"usui yui\":\"碓氷汐泉\",\"raiou\":\"raiou\",\"yokoyari mengo\":\"横枪萌果\",\"alexanderdinh\":\"Alexanderdinh\",\"toubaru rairu\":\"桃原らいる\",\"murao mio\":\"村生未央\",\"toriyaro\":\"トリヤロウ\",\"umeda nautilus\":\"梅田ノーチラス\",\"komura\":\"コムラ\",\"dakkoku jiro\":\"脱壳次郎\",\"futatsuno-peanuts\":\"ふたつのピーナツ\",\"kanzarin\":\"カンザリン\",\"nemurinemu\":\"ねむりねむ\",\"wusui yangcong\":\"五岁洋葱\",\"yuga\":\"ゆがー\",\"akadashi\":\"赤だし\",\"hitakamo\":\"ひたかも\",\"osaki\":\"オオサキ\",\"usa otome\":\"うさおとめ\",\"hatsuuni ikura\":\"初雲丹いくら\",\"asano yomichi\":\"朝野よみち\",\"fuguta-ke\":\"フグタ家\",\"namahiyu\":\"なまひゆ\",\"keise.\":\"慧瀬。\",\"zandoro\":\"ざんどろ\",\"rinaka moruchi\":\"モルんち\",\"tachi\":\"タチ\",\"metsubushi\":\"メツブシ\",\"iuui\":\"イウウイ\",\"cham22\":\"cham22\",\"ie\":\"ie\",\"kokushi\":\"黑司\",\"matsuri seishiro\":\"マツリセイシロウ\",\"mameroku\":\"豆六\",\"chigusa minori\":\"千種みのり\",\"xiaomu\":\"筱牧\",\"petra\":\"佩城\",\"akano murasaki\":\"アカノムラサキ\",\"wood cube\":\"小木蹬子\",\"pentagon\":\"ぺんたごん\",\"radio sensei\":\"ラジオ先生\",\"suitshark\":\"Suitshark\",\"honashi\":\"Honashi\",\"hayanye r\":\"はやにぇR\",\"awamiku\":\"あわこと\",\"barakey\":\"バラキー\",\"ricerice\":\"飯桶君\",\"ahbai\":\"阿白\",\"parsley\":\"パセリ\",\"ochin-sama\":\"おちんさま\",\"takafumi\":\"たかふみ\",\"rkrk12\":\"rkrk12\",\"yurishima shiro\":\"ゆりしましろ\",\"purumetal\":\"ぷるめたる\",\"nicolai no yome\":\"ニコライの嫁（nicolai）\",\"sukusan\":\"SukuSan\",\"noya macoto\":\"ノヤマコト\",\"ryouta\":\"りょうた\",\"shijiu\":\"いけめる\",\"sorimachi toufu\":\"反町豆腐\",\"shibatora\":\"柴寅\",\"cowbow\":\"矼房\",\"yamada kintetsu\":\"山田金铁\",\"kudou maimu\":\"九童まいむ\",\"iwamoto kuyo\":\"いーなん\",\"pilaf modoki\":\"ぴらふもどき\",\"uenosuke\":\"↑野介\",\"inoue makito\":\"井植莳人\",\"mudoochi\":\"むどおち\",\"mori manpei\":\"森万平\",\"frogsnake\":\"蛙记\",\"tearontaron\":\"てぃーろんたろん\",\"tonee\":\"Tonee\",\"rangu\":\"らんぐ\",\"icomochi\":\"イコモチ\",\"hongshi\":\"紅世\",\"shibori kasu\":\"搾り課す\",\"sensiya\":\"千氏夜\",\"aruto naruto\":\"有人成徒\",\"denbu momo\":\"でんぶ腿\",\"gogatsu unagi\":\"五月うなぎ\",\"uko\":\"うこ\",\"ishimari yuuya\":\"イシマリユウヤ\",\"mannen junyuuki\":\"万年授乳期(ジュニー)\",\"putama\":\"ぷ玉\",\"waka mochi ta\":\"わかもち太\",\"mmchair\":\"MM\",\"arisugawa kotone\":\"有栖川琴音\",\"hitonitati\":\"ひとにたち\",\"ryou\":\"涼\",\"ono elle\":\"える\",\"usitora tatumi\":\"牛虎たつみ\",\"takashima shoa\":\"高嶋しょあ\",\"half horse hanma\":\"半馬ハンマ\",\"ekimae machinaka\":\"駅前街中\",\"hoyhoy colo\":\"ホイホイこーろ\",\"noyama\":\"のやま\",\"araizumi rui\":\"新泉留衣\",\"hui yin\":\"慧骃\",\"pineapple panda\":\"鳳梨ぱんだ\",\"qiandai yiyu\":\"Qiandai以宇\",\"kacyu\":\"卡丘\",\"bagelbomb\":\"Bagelbomb\",\"kitano yukito\":\"北乃ゆきと\",\"haruri\":\"HARURI\",\"sumina en\":\"澄名エン\",\"jinja eru\":\"神社えーる\",\"nukeru\":\"ヌケル\",\"musui ethanol\":\"無水エタノール\",\"mori sinrisk\":\"森シンリスク\",\"moegi\":\"萌黄おじさん\",\"kikomuhito\":\"着込む人\",\"elegant\":\"えれがんと\",\"tonyman plus\":\"トニーマン+\",\"shimetsuki tanki\":\"湿月タンキ\",\"yuukey\":\"ゆーきぃ\",\"wu qing yan hui gang\":\"无情烟灰缸\",\"yoshimura bitchmotor\":\"吉村ビッチモーター\",\"mochimoon curry\":\"餅月カレン\",\"yukimochi kinako\":\"幸餅きなこ\",\"houraku\":\"HOURAKU\",\"nagatsuki misoka\":\"长月みそか\",\"wosushi\":\"をすし\",\"kiyohara hiro\":\"清原纮\",\"yakiuni\":\"烧きうに\",\"inui ayu\":\"犬井あゆ\",\"osanai shiina\":\"小山内しいな\",\"umino ryo\":\"海野りょう\",\"daruma jd\":\"だるまJD\",\"gsus\":\"GSUS\",\"gucchian\":\"ぐっち庵\",\"uekura ryona\":\"上倉RyoNA\",\"kusothumu\":\"くそつむ\",\"ashitaba mofu\":\"明日葉もふ\",\"yoshitomi akihito\":\"吉富昭仁\",\"lestart\":\"lestart\",\"shiono\":\"しおの\",\"semino hazuki\":\"セミノハヅキ\",\"yasumi mirakichi\":\"やすみみらきち\",\"tsukunendo\":\"つくねんど\",\"okachimachi tamachi\":\"御徒町たまち\",\"jmg\":\"JMG\",\"ueshita\":\"うえした\",\"mintaro\":\"みんたろう\",\"bergyb\":\"博哥\",\"yukimochi\":\"ゆきもち\",\"jury\":\"じゅらい\",\"yandama\":\"やんだま\",\"youngjijii\":\"ヤングじじい\",\"kawazoe taichi\":\"河添太一\",\"mochikushi\":\"もちくし\",\"shaggy susu\":\"Shaggy SUSU\",\"xiao bai tian\":\"小白天\",\"suzukawa\":\"凉河\",\"kizuna\":\"絆\",\"natsume yochiki\":\"よちき\",\"modare\":\"モ誰\",\"momoshiki\":\"ももしき\",\"momochi chia\":\"桃稚 ちあ\",\"skai kun\":\"Skai_kun\",\"tsuyatsuya\":\"艶々\",\"star shadow magician\":\"STAR影法师\",\"sakai\":\"坂井\",\"reiichi\":\"零壱\",\"akichi\":\"空き地\",\"kouzu sousuke\":\"兴津惣介\",\"lemon snail\":\"Lemon Snail\",\"zirba\":\"Zirba\",\"fyxfd\":\"肥油小分队\",\"karei\":\"かれい\",\"arashiya\":\"嵐屋\",\"yamamoto yumiko\":\"山本由美子\",\"zurikishi\":\"ずり騎士\",\"himeno mikan\":\"姫野蜜柑\",\"fujimura q\":\"藤村久\",\"kaneko naoya\":\"カネコナオヤ\",\"grimgrim\":\"grimgrim\",\"makochan42\":\"まこちあ\",\"wagashi\":\"和菓子\",\"kayama yuichiro\":\"鹿山裕一郎\",\"iranon\":\"冬灯\",\"takanaga kouhei\":\"高永浩平\",\"shuru-ban\":\"しゅる版\",\"yoongonji\":\"尹坤志\",\"mobuta\":\"モブ太\",\"xiaozi xiao\":\"笑笑饺子\",\"shura\":\"朱雷\",\"kokonobi\":\"九尾\",\"pooh\":\"ぷぅ\",\"irono\":\"ゐろの\",\"isshi pyuma\":\"一志ピューマ\",\"mamerakko\":\"豆ラッコニキ\",\"amakusa tobari\":\"天草帳\",\"sasaki mutsumi\":\"ささきむつみ\",\"murabito toufuten\":\"村人豆腐店\",\"kuma ashi s\":\"熊足S\",\"sasai nakoto\":\"茶彩なこと\",\"hina\":\"氷菜\",\"yozakura souki\":\"夜桜ソウキ\",\"susukumo nagi\":\"煤雲なぎ\",\"cielo\":\"CIELO\",\"hekoman\":\"へこまん\",\"ichinosono yui\":\"一之园唯\",\"rindow masaki\":\"あるでぃ\",\"orihika\":\"おりひか\",\"scottie\":\"スコッティ\",\"makin\":\"まきん\",\"myamo\":\"ミャモ\",\"pedopetton\":\"ぺどぺっとん\",\"mikozin\":\"ミコジン\",\"imajin kouji\":\"イマジン孝二\",\"meisuke\":\"めーすけ\",\"kotobuki mairo\":\"寿まいろ\",\"minato yuu\":\"湊ゆう\",\"ameko\":\"あめこ\",\"senda hisamaru\":\"せんだ寿丸\",\"fujiwara noa\":\"藤原のあ\",\"ryoutani kana\":\"両谷哉\",\"hoshino rao\":\"星野らお\",\"jankey\":\"ジャンキー\",\"nettsuu\":\"ねっつー\",\"point takashi\":\"みるく工房\",\"wakatake\":\"わかたけ\",\"aak\":\"aak\",\"rabu\":\"ラブ\",\"uni toshiki\":\"ウニトシキ\",\"teikuuhikou\":\"低空飞行\",\"iwami yasoya\":\"石见やそや\",\"mittsuman\":\"みっつまん\",\"chinetsu\":\"ちねつ\",\"akausu ko\":\"赤薄红\",\"otona no sexy ehon\":\"大人のSEXY絵本\",\"hogeramu\":\"ほげらむ\",\"raikou\":\"らい公\",\"raku\":\"乐\",\"karaage\":\"唐扬\",\"jinze\":\"今沢\",\"hosigarasu\":\"干しガラス\",\"koyama harutarou\":\"コヤマハルタロウ\",\"iketatsu shizuru\":\"池竜静留\",\"kogara tsugumi\":\"小雀つぐみ\",\"papipukepo\":\"ぱぴぷけぽ\",\"yomogi mametaro\":\"よもぎ豆太郎\",\"yasuda yasuhiro\":\"保田やすひろ\",\"minazuki miyabi\":\"水無月雅\",\"okome taberu\":\"おこめタベル\",\"nagase tooru\":\"長瀬 徹\",\"az slash hybrid\":\"をん（AZ/HYBRID）\",\"shirabii\":\"しらび\",\"ushio kiyoshi\":\"潮汐きよし\",\"yumemi teer\":\"夢見てぇる\",\"kisaragi sonami\":\"生肉\",\"nishi yasuaki\":\"西ヤスアキ\",\"higashi taishi\":\"東太子\",\"kokudou juunigou\":\"国道12号\",\"sushi yuusha toro\":\"寿司勇者トロ\",\"sandbox\":\"砂场\",\"yunamaro\":\"ゆなまろ\",\"810eru\":\"草葉える\",\"mochiduki riku\":\"望月りく\",\"asoka\":\"あそか\",\"komiya yuuta\":\"小宮裕太\",\"inchou no naka no hito\":\"いんちょ～の中の人\",\"asakura hayate\":\"朝倉はやて\",\"yutaka izubuchi\":\"出渕裕\",\"tachibana-ko\":\"橘子\",\"toridamono\":\"トリダモノ\",\"yoshimura takuya\":\"吉村拓哉\",\"yuki no arashi\":\"雪之岚\",\"yiduan\":\"异端\",\"kii kanna\":\"紀伊カンナ\",\"watosu mama\":\"わとす\",\"wodae\":\"ヲダエ\",\"nagoyaka jirou\":\"なごやか次郎\",\"kyonta\":\"きょんた\",\"amakawa gumi\":\"甘皮ぐみ\",\"blvefo9\":\"blvefo9\",\"nyaon\":\"にゃおん\",\"fuugetsu makoto\":\"楓月誠\",\"rebutsu\":\"りぶつ\",\"miyazaki usagi\":\"みやざきうさぎ\",\"touchuu kasou\":\"冬虫夏草\",\"cbmus\":\"Cbmus\",\"torii yoshitsuna\":\"鳥居ヨシツナ\",\"mannack\":\"まんなく\",\"miwerjooggetser\":\"無名老圖\",\"shimohara\":\"しもはら\",\"kazutake hazano\":\"和武はざの\",\"kanpancake\":\"kanpancake\",\"satoh sugar\":\"砂藤シュガー\",\"okura-chan\":\"おくらちゃん\",\"bannou\":\"万能\",\"rokita\":\"ろきた\",\"naruya shin\":\"なるやしん\",\"tamura-chan\":\"田村ちゃん\",\"nyum\":\"にゅむ\",\"tsunako\":\"つなこ\",\"amagai tarou\":\"おるだん\",\"takota konu\":\"蛸田こぬ\",\"made rokuri\":\"迄ロクリ\",\"charin\":\"チャリン\",\"usodi\":\"ウソヂ\",\"chairoino\":\"茶色いの\",\"sugiyama\":\"杉山\",\"antifreez3\":\"天凉多喝防冻液\",\"norihito\":\"仁人\",\"ogatatei\":\"緒方てい\",\"aota sora\":\"あおたそら\",\"4uu\":\"4UU\",\"miginer\":\"みぎなー\",\"kenko shindan-chan\":\"健康診断ちゃん\",\"hibari\":\"雲雀ひな\",\"neko no youchuu\":\"猫の幼虫\",\"to hegemonikon\":\"ト！ヘーゲモニコン\",\"agagaga\":\"あがががが\",\"namekuji\":\"なめくじ\",\"bonnou obaa-chan\":\"煩悩おばあちゃん\",\"neneneg\":\"ねねねじ\",\"otemoto\":\"おてもと\",\"yamato hotaru\":\"ヤマト蛍\",\"kakure area\":\"影おじ\",\"muromaki\":\"ムロマキ\",\"yapo\":\"yapo\",\"kogyoku\":\"红玉\",\"fake enn\":\"Fake Enn\",\"actuale\":\"ActualE\",\"throtem\":\"トロテム\",\"hiro hirono\":\"ヒロ広野\",\"asama hinami\":\"浅間ひなみ\",\"katase shou\":\"かたせ湘\",\"garagara tarou\":\"ガラガラ太郎\",\"sorenari no ishi\":\"それなりの石\",\"toxic ramen\":\"劇毒拉麵\",\"kudaraji hatsuka\":\"百済児廿日\",\"rim\":\"りむ\",\"hinahara hajime\":\"雛原肇\",\"crazy dad\":\"CrazyDad3D\",\"pig king\":\"PigKing\",\"nia\":\"にあ\",\"nanakotu\":\"なな骨\",\"aratani\":\"あらたに\",\"tsuruki\":\"ツルキ\",\"incognitymous\":\"Incognitymous\",\"matsuzawa muni\":\"松沢夢丹\",\"tsuki no senninno\":\"月之仙人丿\",\"hellap\":\"hellaP\",\"mamaloni\":\"mamaloni\",\"thiccwithaq\":\"ThiccWithaQ\",\"kimkun0162\":\"kimkun0162\",\"kurono yuzuko\":\"黒乃柚子\",\"aoi sakura\":\"青い桜\",\"sekki kettle\":\"石器ケトル\",\"howako\":\"ほわこ\",\"yotogi\":\"よとぎ\",\"yamito\":\"やみと\",\"noodlenood\":\"Noodle\",\"naitou kirara\":\"内藤キララ\",\"ngtvisualstudio\":\"NGTVisualStudio\",\"daimong\":\"大文G\",\"fujun nyuushi\":\"黒森ヤガ\",\"alfre-tori\":\"あるふれっ鳥\",\"incase\":\"InCase\",\"ishikawa hirodi\":\"石川ヒロヂ\",\"hisamaru hajime\":\"久丸一\",\"asakura shimoichi\":\"麻倉下市\",\"croc\":\"Croc\",\"takami itsu\":\"高見乙\",\"kaza midori\":\"可座ミドリ\",\"kahmasu\":\"かーます\",\"ginen\":\"銀塩\",\"saitou renji\":\"西東レンジ\",\"suzuro aruki\":\"スズロアルキ\",\"moritama\":\"もりたま\",\"inainaka\":\"不在中\",\"nizigensan\":\"ニジィー\",\"yaruku\":\"ヤルク\",\"jeattle\":\"ジアトー\",\"yoshio ereki\":\"よしおエレキ\",\"ueda metawo\":\"上田メタヲ\",\"ematsuko\":\"エマツコ\",\"kimineko\":\"君ねこ\",\"toono esuke\":\"远野えすけ\",\"ozu satoru\":\"を图さとる\",\"ainame\":\"あいなめ\",\"fuyutsumi chiaki\":\"ふゆつみ千明\",\"akatsuki usagi\":\"あかつき兎\",\"umako\":\"ウマ子\",\"kumamoto aichi\":\"熊本愛知\",\"arata\":\"アラタ\",\"yumemi gachi\":\"夢ミガチ\",\"sinobiin\":\"しのびん\",\"funnyaka\":\"フンニャカ\",\"yonaka ao\":\"よなかあお\",\"scaf\":\"SCAF（すかーふ）\",\"bonnouji yura\":\"烦恼寺ゆら\",\"kuware\":\"クワレ\",\"izumida izumi\":\"泉田一角\",\"yurashima\":\"ゆらしま\",\"aoyagi kabota\":\"青柳カボた\",\"phathusa\":\"Phathusa\",\"kitsune maru\":\"きつね丸\",\"toshizou\":\"としぞう\",\"izhardraws\":\"IzharDraws\",\"jay naylor\":\"Jay Naylor\",\"blue striker\":\"Blue Striker\",\"fred perry\":\"Fred Perry\",\"matemi\":\"Matemi\",\"zourik\":\"Zourik\",\"garabatoz\":\"Garabatoz\",\"koyubita beru\":\"こゆびた べる\",\"shiroha\":\"しろ羽\",\"ex alnam\":\"EXアルナム\",\"koohii koucha maru\":\"コーヒー紅茶丸\",\"handplug\":\"HandPlug\",\"ro-g\":\"Ro_G\",\"vicky\":\"ビッキー\",\"kondo yume\":\"魂童夢\",\"namonaki\":\"なもなき\",\"villainchin\":\"VillainChin\",\"katou roca\":\"カトウロカ\",\"lsc5\":\"LSC5\",\"kanitama\":\"カニタマ\",\"smallflyingrat\":\"小飛鼠\",\"sanhualishuwu\":\"三花栗鼠屋\",\"haishima shioji\":\"はいしま潮路\",\"dokuro deluxe\":\"ドクロ Deluxe\",\"fetio\":\"フェチ男\",\"kaisenbatake no yuu\":\"海鮮畑の遊\",\"yamamoto fcn\":\"山本fcn\",\"takotokite\":\"たことかいと\",\"shane ballard\":\"Shane Ballard\",\"deathpulse\":\"Deathpulse\",\"poland\":\"Poland\",\"renderpretender\":\"RenderPretender\",\"andava\":\"Andava\",\"lilith-fetish\":\"Lilith-Fetish\",\"dire lilith\":\"Dire Lilith\",\"lilith\":\"Lilith\",\"twistedscarlett60\":\"TwistedScarlett60\",\"cutesexyrobutts\":\"Cutesexyrobutts\",\"shintaro\":\"しんたろ\",\"haiba nemumi\":\"灰刃ねむみ\",\"mohu2factory\":\"モフ2製作所\",\"tadano comina\":\"但野こみな\",\"bingbingzi\":\"冰冰子\",\"pepper0\":\"pepper0\",\"mikitoamon\":\"ミキトアモン\",\"tamabi\":\"たまび\",\"imadeej\":\"ImaDeeJ\",\"oca\":\"Oca\",\"tslove\":\"tslove\",\"the kite\":\"TheKite\",\"ujihara shitone\":\"蛆孕茵\",\"nodo\":\"nodo\",\"comiching\":\"こみちん\",\"rosuuri\":\"Rosuuri\",\"otogiri fua\":\"おとぎりふあ\",\"pirates cat\":\"パイレーツキャット\",\"boshi\":\"ぼし\",\"hitaki ni\":\"ひたき煮\",\"kaji makoto\":\"カジマコト\",\"matrix16\":\"Matrix16\",\"cyi\":\"CYI\",\"choipiro\":\"ちょいぴろ\",\"shimizu tomomi\":\"清水ともみ\",\"umai\":\"馬胃\",\"nada shio\":\"なだソルト\",\"toriuchi\":\"トリウチ\",\"huwahuwa raidou\":\"ふわふわらいどう\",\"mother kiisuke\":\"マザーきーすけ\",\"kurihara sakura\":\"栗原さくら\",\"washoku\":\"和食\",\"wanitaroo.\":\"わにたろー。\",\"paingumi\":\"パイングミ\",\"baret\":\"バレット\",\"otsumoon\":\"乙むん\",\"marukura\":\"まる鞍\",\"ide shota\":\"胃出ショータ\",\"habe rin\":\"羽部凛\",\"doshima\":\"どうしま\",\"amatsuji\":\"あまつじ\",\"huyumitsu\":\"ふゆみつ\",\"yakinikuteishoku\":\"烧肉定食\",\"hoshisaka ami\":\"星坂網\",\"pyomaru\":\"ぴょまる\",\"kinoshita kou\":\"木ノ下コウ\",\"idaten funisuke\":\"いだ天ふにすけ\",\"yasiro osa\":\"やしろおさ\",\"murai toyo\":\"むらいとよ\",\"kaitou nyanko\":\"解凍にゃんこ\",\"toki garasu\":\"時烏\",\"ichino milk\":\"いちのみるく\",\"madako\":\"まだ子\",\"osakana arichi\":\"御魚ありち\",\"suzusimo\":\"すずしも\",\"sima\":\"志真\",\"yumeki banana\":\"夢木ばなな\",\"ruutyan\":\"るち餡\",\"announ\":\"暗ノ吽\",\"shien\":\"しえん\",\"kibi anmitsu\":\"吉備あんみつ\",\"nozora yuzu\":\"望宙ゆず\",\"aburi saamon maru\":\"炙りサーモン丸\",\"shiranai hitoshi\":\"しらないひとし\",\"setagaya 45rou\":\"せたがや四五郎\",\"fujisaki\":\"ふじさき\",\"shinraku kogome\":\"聖 コゴメ\",\"consome\":\"紺そめ\",\"fuuzasa\":\"ウラザサ\",\"yukinpo dida\":\"ゆきんぽでぃだ\",\"garasu hokou\":\"硝子歩行\",\"hoshitani kyo\":\"星谷京\",\"higashimidou hisagi\":\"東御堂ひさぎ\",\"tsuruga\":\"鹤贺\",\"taira rurit\":\"平るりっと\",\"ishi no shita\":\"石の下\",\"okusaka maeue\":\"奥坂前上\",\"fujizarashi\":\"ふじざらし\",\"ogino satoshi\":\"オギノサトシ\",\"oekaki ojisan\":\"お絵かきおじさん\",\"pochitaro\":\"ぽちたろ\",\"siokaze sango\":\"潮風サンゴ\",\"kanzaki kureha\":\"神崎紅葉\",\"shiyuu secchuu\":\"雌雄折衷\",\"saitoh maho\":\"斎藤まほ\",\"liyoosa\":\"りゆさ\",\"oekaki kaki\":\"おえかきかき\",\"horori\":\"horori\",\"non-sugar\":\"ノンシュガー\",\"niui\":\"niui\",\"almondman\":\"アーモンドマン\",\"yawano yawa\":\"柔乃やわ\",\"efuri\":\"えふり\",\"suzushiro nerita\":\"鈴白ねりた\",\"momoshika fujiko\":\"ももしか藤子\",\"kidoban\":\"木户番\",\"nekoshoko\":\"猫しょこ\",\"usagihara kuro\":\"兎原クロ\",\"aiga\":\"アイガ\",\"hoshino minami\":\"星乃みなみ\",\"ema\":\"えま\",\"bodoyama\":\"ボド山\",\"maruco\":\"マルコ\",\"contllenge\":\"コントレンジ\",\"guusuka\":\"ぐうすか\",\"dekigokoro\":\"出来心\",\"binetsu\":\"びねつ\",\"nishimoto rou\":\"西本ろう\",\"shiroi yoru\":\"白い夜\",\"edachi hoho\":\"えだちほほ\",\"yuzhe s\":\"愚者s\",\"sango\":\"参号\",\"yoshinao\":\"よしなお\",\"romm\":\"ろむむ\",\"kasuya mako\":\"粕谷まこ\",\"tsuruta bungaku\":\"鶴田文学\",\"nanase makoto\":\"七瀬真琴\",\"uehara taichi\":\"上原た壱\",\"kozuki\":\"甲月\",\"templus\":\"TeMたす\",\"aoena\":\"アオエナ\",\"senoo hibiteru\":\"瀬尾日々照\",\"nakajima chizuna\":\"中嶋ちずな\",\"tsunonigau\":\"ツノニガウ\",\"sanatuki\":\"さなつき\",\"amai meiden\":\"雨居めいでん\",\"otaki\":\"おたき\",\"unomiki\":\"うのみき\",\"nandemona\":\"なんでもな\",\"xiujia yihuizi\":\"休嫁一慧\",\"sozoremi\":\"そぞれみ\",\"nanohana\":\"nanohana\",\"kamogawa akira\":\"鴨川彰\",\"ame no machi\":\"雨の町\",\"mukone\":\"むこね\",\"tappa suzuki\":\"タッパー鈴木\",\"tom smith\":\"Tom Smith\",\"bryam\":\"Bryam\",\"yair\":\"Yair\",\"kadath\":\"Kadath\",\"viktria\":\"Zummeng\",\"the-shadow-of-light\":\"The-Shadow-of-Light\",\"ono miren\":\"小野未練\",\"deer kid\":\"Deerkid\",\"onaka\":\"ONAKA\",\"ushikani gassen\":\"牛蟹合戦\",\"yoruneko\":\"夜猫\",\"gotarou\":\"ゴ太郎\",\"ion\":\"伊翁\",\"sanukiyan\":\"さぬきやん\",\"tsukisiro\":\"月代\",\"kunabishi\":\"くなびし\",\"furau\":\"ふらう\",\"kurokawa ryoichi\":\"黒川リョーイチ\",\"chinton\":\"チントン\",\"saiou ga ushi\":\"塞翁が牛\",\"inumiso\":\"イヌミソ\",\"cosmic\":\"こずみっく\",\"kagamino mochiko\":\"鏡乃もちこ\",\"ereere\":\"ereere\",\"lakilolom\":\"らきろろむ\",\"akahoshi jake\":\"赤星ジェイク\",\"mabanna\":\"マバンナ\",\"hakonnbu\":\"歯昆布\",\"hanaji sensei\":\"鼻血先生\",\"himajin no izu\":\"暇人のいず\",\"huruga yuudai\":\"フルガユウダイ\",\"kuzumoti\":\"くずもち\",\"aizawa uji\":\"相沢U字\",\"atori\":\"あとり\",\"kurumi nasu\":\"くるみなす\",\"rioreori\":\"リオレオリ\",\"cyberboi\":\"Cyberboi\",\"hatome\":\"はとめ\",\"hayasaka\":\"はやさか\",\"uraho an\":\"浦歩あん\",\"hamachika\":\"はまちか\",\"yazawa mana\":\"やざわまな\",\"kurosawa karura\":\"黒澤カルラ\",\"mokutan\":\"木炭\",\"sinogi asa\":\"しのぎあさ\",\"pizza\":\"ぴっつぁ\",\"ijou\":\"Ijou\",\"yuzu lemon\":\"柚子れもん\",\"ayano val\":\"絢乃ばる\",\"akosuke\":\"あこ助\",\"starraisins\":\"星レーズン\",\"bef\":\"お肉が食べたい午前二時\",\"mizushima irohasu\":\"水嶋イロハス\",\"wolf ameno\":\"雨野うるふ\",\"hiiragi hiiro\":\"ひいらぎひろ\",\"fumm tarou\":\"ふむたろう\",\"tikuwa zyousyou\":\"ちくわ丞相\",\"napopasu\":\"ナポパス\",\"biyon\":\"びよん\",\"nago\":\"なご\",\"amakasa\":\"雨かさ\",\"momonipu\":\"ももにぷ\",\"hatsuyasumi\":\"はつやすみ\",\"mayuge\":\"まゆげ\",\"gekkou\":\"月光\",\"tsumiki\":\"ツミキ\",\"tanakala\":\"タナカラ\",\"hatsuden pengin\":\"発電ペンギン\",\"novice tori\":\"のーびす鸟\",\"dion\":\"DION\",\"ricochet\":\"リコシェット\",\"tem10\":\"Tem10\",\"simao\":\"simao\",\"enishi\":\"えにし\",\"shikou shiki\":\"紫紅シキ\",\"tateyama keita\":\"館山けーた\",\"yamaguchi kyo\":\"樱井亚矢子\",\"niichi\":\"にいち\",\"uni piano\":\"雲丹ピアノ\",\"isegawa yasutaka\":\"いせぽん\",\"masco\":\"Masco\",\"amatani haruka\":\"アマタニハルカ\",\"togami\":\"とがみ\",\"mochizuki hall\":\"望月ハル\",\"tomozero\":\"トモゼロ\",\"iwami kiyoko\":\"岩见树代子\",\"aoiro 3-gou\":\"青色3号\",\"okita yuuho\":\"冲田有帆\",\"tsukushi haru\":\"筑紫はる\",\"shiinyan\":\"しいにゃん\",\"geboku kazuaki\":\"げぼくカズアキ\",\"momota tetsu\":\"桃田テツ\",\"nise neko\":\"偽猫\",\"sasanoma nibi\":\"笹ノ間にび\",\"minestrone\":\"ミネストローネ\",\"shigeatsu nagata\":\"重厚长太\",\"shikiniki\":\"式二季\",\"ryuda kosei\":\"竜田光生\",\"hibino sho\":\"日比野翔\",\"ateoyh\":\"ATEOYH\",\"izumi asuka\":\"泉飛鳥\",\"koruse\":\"こるせ\",\"keine\":\"KEINE\",\"ume fumi\":\"梅枫味\",\"urasuji samurai\":\"裏筋侍\",\"enomoto nao\":\"榎本尚\",\"kamo naberou\":\"加茂なべ郎\",\"hanakage alt\":\"花影あると\",\"clara.v\":\"clara鳴晴\",\"shipuoru\":\"しぷおる\",\"mochiji\":\"モチヂ\",\"mushipan\":\"むしパン\",\"kiriha\":\"桐叶\",\"nakata yumi\":\"中田由美\",\"tamima\":\"たみま\",\"amaki\":\"あまき\",\"puru\":\"puru\",\"sheryama\":\"シャーやま\",\"hoshara\":\"ほしゃら\",\"panna\":\"ぱんな\",\"sabuustar\":\"さぶ～☆\",\"mokuyama hito\":\"木山ひと\",\"kurotsuki machi\":\"黒月マチ\",\"mameneko\":\"まめ猫\",\"richard bahman\":\"リヒャルト・バフマン\",\"boukoku daitouryou\":\"某国大統領\",\"yuuki fuumi\":\"有機風味\",\"nonohara miki\":\"野々原幹(野野原干)\",\"yumejidake\":\"ユメジダケ\",\"morino koala\":\"森乃こあら\",\"genmai\":\"玄米\",\"satsuki usa\":\"サツキのウサ小屋\",\"kamishiro piyo\":\"神代ぴよ\",\"tachibana kou\":\"橘こお\",\"kutsushita danshaku\":\"靴下男爵\",\"taniyama-san\":\"谷山さん\",\"kannagi rei\":\"かんなぎれい\",\"luicent\":\"るいせんと\",\"dnwls3010\":\"ふわり\",\"rucaco\":\"るかこ\",\"kazesaki furea\":\"風咲ふれあ\",\"teritama potekora\":\"照玉ぽてこら\",\"akabane aomori\":\"赤羽アオモリ\",\"yusano\":\"ゆさの\",\"yukiko\":\"雪子\",\"shintarou\":\"しんたろー\",\"nanohana kohina\":\"なのはなこひな\",\"annin doufu\":\"杏仁豆腐\",\"surada mami\":\"すらだまみ\",\"oomiya\":\"お一みや\",\"hatopopoko\":\"ハトポポコ\",\"shinjou ruru\":\"新条るる\",\"chochomi\":\"チョチョミ\",\"ikamatsu\":\"烏賊松\",\"yodogawa yuo\":\"淀川ゆお\",\"washuu\":\"わしゅう\",\"annin musou\":\"杏仁無双\",\"take shinshi\":\"たけ紳士\",\"nanase kokono\":\"七瀬玖\",\"matsumoto kichidi\":\"松本きちぢ\",\"tachikawa natsuki\":\"太刀川七月\",\"kotakemaru\":\"小竹丸\",\"nekomugi\":\"猫麦\",\"yuyuco\":\"ゆゆこ\",\"karya\":\"かりゃー\",\"kanora\":\"かのら\",\"metako\":\"めた子\",\"hiroki00\":\"Hiro潶\",\"keganin\":\"毛蟹ん\",\"yuzu kiro\":\"ゆずきいろ\",\"nekoma kotomitsu\":\"猫間ことみつ | 猫間ことみ\",\"particular\":\"ぱてくらー\",\"karashina en\":\"カラシナ円\",\"hagakure kurage\":\"葉隠くらげ\",\"tamon sakaki\":\"多紋サカキ\",\"asano tooru\":\"あさの透\",\"uiri\":\"ういり\",\"fujiyoshi\":\"ふじよし\",\"harumachi uro\":\"春待うろ\",\"yorune\":\"ヨルネ\",\"kurosaki shun\":\"黒咲俊\",\"isoi\":\"あいそい\",\"maij chichico\":\"明治乳子\",\"guremasu\":\"ぐれます\",\"alpha91\":\"Alpha91\"},\"cosplayer\":{\"otohara an\":\"乙原あん\",\"rioko\":\"凉凉子\",\"atsuki\":\"あつき\",\"hane ame\":\"雨波\",\"chunmomo\":\"蠢沫沫\",\"kalinka fox\":\"Kalynka Fox\",\"nora fawn\":\"Nora Fawn\",\"saku\":\"サク\",\"arty huang\":\"Arty亚缇\",\"carry key\":\"Carry Key\",\"valery himera\":\"Valery Himera\",\"vinnegal\":\"Vinnegal\",\"nath sokolova\":\"Nath Sokolova\",\"virtual geisha\":\"Virtual Geisha\",\"kaya huang\":\"KaYa 萱\",\"sayako\":\"さやこ\",\"mikomi hokina\":\"Mikomi Hokina\",\"akane araragi\":\"Akane Araragi\",\"lenfried\":\"lenfried\",\"xidaidai\":\"习呆呆\",\"senluo caituan\":\"森萝财团\",\"pigma\":\"Pigman\",\"abaoyeshituniang\":\"阿包也是兔娘\",\"kimmie mi\":\"蜜蜜子\",\"aqua area\":\"水淼Aqua\",\"erzuo nisa\":\"二佐nisa\",\"sola\":\"Sola\",\"tsuki desu\":\"Tsuki Desu\",\"kokura chiyo\":\"小倉ちよ\",\"g44 wa kizutsukanai\":\"G44不会受伤\",\"okita rinka\":\"冲田凛花\",\"nekokoyoshi\":\"爆机少女喵小吉\",\"akemi101xoxo\":\"Akemi101xoxo\",\"hoshilily\":\"星之迟迟\",\"yurikodxd\":\"YurikoDxD\",\"yuuforia\":\"Yuuforia\",\"lovelyspacekitten\":\"LovelySpaceKitten\",\"uyuy\":\"UyUy\",\"alicekyo\":\"Alicekyo\",\"baoer mysterial\":\"宝儿Mysterial\",\"menmentan\":\"焖焖碳\",\"rio-chan\":\"愛瀬りおな\",\"siao ding\":\"小丁\",\"franxcos\":\"FranXcos\",\"junkenstein\":\"Junkenstein\",\"helly von valentine\":\"Helly von Valentine\",\"penkarui\":\"Penkarui\",\"mizhimaoqiu\":\"蜜汁猫裘\",\"refeen\":\"Refeen\",\"ely cosplay\":\"ElyEE子\",\"azami\":\"Azami\",\"mercurylamp\":\"水銀燈\",\"niyeye\":\"你烨烨\",\"yaoyaoqwq\":\"软妹摇摇乐\",\"maria desu\":\"Maria Desu\",\"hidori rose\":\"Hidori Rose\",\"ai lei jiang\":\"少女映画\",\"shimotsuki\":\"霜月shimo\",\"hua qi hana\":\"花柒Hana\",\"lostwind10\":\"猫と爪呸罗呸罗\",\"xue qi-sama\":\"雪琪SAMA\",\"larissa rochefort\":\"Larissa Rochefort\",\"kitaro\":\"Kitaro绮太郎\",\"banbanko\":\"半半子\",\"aninnyan\":\"桜井宁宁\",\"nagisa\":\"NAGISA魔物喵\",\"katiecakey\":\"Katie Cakey\",\"linzi jiang\":\"凛子酱\",\"cherry neko\":\"桜桃喵\",\"kuuko w\":\"Kuuko W\",\"luo xiaoli miao\":\"洛璃LoLiSAMA\",\"yaokoututu\":\"咬一口兔娘\",\"yuki astra\":\"雪晴Astra\",\"niannian d\":\"念念_D\",\"tyouduki maryou\":\"蝶月真綾\",\"ringo mitsuki\":\"林檎蜜纪\",\"tokar\":\"浵卡Tokar\",\"saotome love\":\"早乙女らぶ\",\"tsubomin\":\"つぼみん\",\"omimi\":\"おみみ\",\"sakura noa\":\"桜のぁ\",\"yuricha\":\"YURICHA\",\"na-san\":\"なーさん\",\"mashiro yuki\":\"真白ゆき\",\"alina becker\":\"Alina Becker\",\"shizuku honami\":\"穂南しずく\",\"lmusicl\":\"lMusicl\",\"masako yume\":\"Masako Yume\",\"ain nguyen\":\"Ain Nguyễn\",\"oniksiya sofinikum\":\"Oniksiya Sofinikum\",\"kaya nilson\":\"Kaya Nilson\",\"hana bunny\":\"Hana Bunny\",\"tsunnyanchan\":\"Tsunnyanchan\",\"rynkerbelle\":\"Rynkerbelle\",\"cattashaa\":\"Cattashaa\",\"potato godzilla\":\"Potato Godzilla\",\"miyamoto sakura\":\"宮本桜\",\"kokuhui\":\"玉汇\",\"feng jiang jiang\":\"封疆疆\",\"baozoumoziaa\":\"抱走莫子\",\"xia xia zi\":\"夏夏子\",\"caomeiyuyi\":\"草莓羽衣\",\"purinpuppy\":\"屿鱼\",\"makachan\":\"麻花酱\",\"shimizu yuno\":\"清水由乃\",\"tomoyo jiang\":\"Tomoyo酱\",\"tao liang azhai\":\"桃良阿宅\",\"guaxichan\":\"瓜希酱\",\"ying lili\":\"樱梨梨\",\"rissoft\":\"前羽rr\"},\"male\":{\"age progression\":\"年龄增长\",\"age regression\":\"返老还童\",\"dilf\":\"熟男\",\"infantilism\":\"幼稚型\",\"kodomo doushi\":\"两小无猜\",\"old man\":\"老人\",\"shotacon\":\"正太\",\"toddlercon\":\"幼儿\",\"amputee\":\"截肢\",\"big muscles\":\"大肌肉\",\"body modification\":\"身体改造\",\"conjoined\":\"连体\",\"doll joints\":\"关节娃娃\",\"gijinka\":\"拟人化\",\"inflation\":\"腹部膨胀\",\"invisible\":\"透明\",\"multiple arms\":\"多臂\",\"muscle\":\"肌肉\",\"muscle growth\":\"肌肉成长\",\"stretching\":\"拉伸\",\"tailjob\":\"尾交\",\"wings\":\"翅膀\",\"absorption\":\"吸收\",\"petrification\":\"石化\",\"transformation\":\"变身\",\"alien\":\"外星人👽\",\"angel\":\"天使\",\"bat boy\":\"蝙蝠男\",\"bear boy\":\"狗熊男\",\"bee boy\":\"蜂男\",\"bird boy\":\"鸟男\",\"bunny boy\":\"兔子男孩\",\"catboy\":\"猫男\",\"centaur\":\"半人马\",\"corpse\":\"尸体\",\"cowman\":\"牛男\",\"deer boy\":\"鹿男孩\",\"demon\":\"恶魔\",\"dog boy\":\"狗男孩\",\"draenei\":\"德莱尼\",\"elephant boy\":\"象男孩\",\"fairy\":\"仙子🧚‍♂️\",\"fox boy\":\"狐男\",\"frog boy\":\"青蛙男孩\",\"furry\":\"毛茸茸\",\"giraffe boy\":\"长颈鹿男\",\"ghost\":\"幽灵👻\",\"goblin\":\"哥布林\",\"harpy\":\"鸟人\",\"horse boy\":\"马男孩\",\"human on furry\":\"人毛\",\"hyena boy\":\"鬣狗男孩\",\"insect boy\":\"昆虫男孩\",\"kappa\":\"河童\",\"lizard guy\":\"蜥蜴男孩\",\"merman\":\"人鱼🧜‍♂️\",\"minotaur\":\"牛头人\",\"monkey boy\":\"猴男孩\",\"monster\":\"怪物\",\"mouse boy\":\"鼠男孩\",\"necrophilia\":\"奸尸\",\"oni\":\"鬼\",\"orc\":\"半兽人\",\"otter boy\":\"水獭男孩\",\"panda boy\":\"熊猫男\",\"pig man\":\"猪男\",\"plant boy\":\"植物男孩\",\"raccoon boy\":\"浣熊男孩\",\"robot\":\"机器人🤖\",\"shark boy\":\"鲨男孩\",\"sheep boy\":\"羊男孩\",\"slime\":\"史莱姆\",\"slime boy\":\"史莱姆男孩\",\"snake boy\":\"蛇男\",\"spider boy\":\"蜘蛛男\",\"squid boy\":\"乌贼男\",\"squirrel boy\":\"松鼠男\",\"skunk boy\":\"臭鼬男\",\"tentacles\":\"触手\",\"vampire\":\"吸血鬼🧛‍♂️\",\"wolf boy\":\"狼男孩\",\"zombie\":\"丧尸🧟‍♂️\",\"animal on animal\":\"兽兽\",\"animal on furry\":\"兽毛\",\"bear\":\"熊🐻\",\"bestiality\":\"兽交\",\"bull\":\"牛🐂\",\"camel\":\"骆驼🐫\",\"cat\":\"猫🐈\",\"crab\":\"螃蟹🦀\",\"deer\":\"鹿🦌\",\"dinosaur\":\"恐龙🦖\",\"dog\":\"狗🐕\",\"dolphin\":\"海豚🐬\",\"donkey\":\"驴\",\"dragon\":\"龙🐉\",\"eel\":\"鳗鱼\",\"elephant\":\"象🐘\",\"fish\":\"鱼🐟\",\"fox\":\"狐狸🦊\",\"frog\":\"青蛙🐸\",\"goat\":\"山羊🐐\",\"gorilla\":\"猩猩🦍\",\"horse\":\"马🐎\",\"insect\":\"昆虫🐜\",\"kangaroo\":\"袋鼠\",\"lion\":\"狮🦁\",\"maggot\":\"蛆🐛\",\"monkey\":\"猴🐒\",\"mouse\":\"鼠🐀\",\"octopus\":\"章鱼🐙\",\"ostrich\":\"鸵鸟\",\"panther\":\"豹🐆\",\"pegasus\":\"天马\",\"pig\":\"猪🐖\",\"rabbit\":\"兔🐇\",\"reptile\":\"爬虫\",\"rhinoceros\":\"犀牛🦏\",\"sheep\":\"绵羊🐏\",\"shark\":\"鲨🦈\",\"slug\":\"蛞蝓\",\"snake\":\"蛇🐍\",\"spider\":\"蜘蛛🕷\",\"tiger\":\"虎🐅\",\"turtle\":\"龟🐢\",\"unicorn\":\"独角兽🦄\",\"whale\":\"鲸🐋\",\"wolf\":\"狼🐺\",\"worm\":\"蠕虫\",\"zebra\":\"斑马🦓\",\"giant\":\"巨人\",\"growth\":\"巨大化\",\"midget\":\"侏儒\",\"miniguy\":\"迷你男孩\",\"shrinking\":\"缩小\",\"tall man\":\"高个男\",\"albino\":\"白化\",\"body writing\":\"身体写作\",\"body painting\":\"身体绘画\",\"dark skin\":\"黑皮\",\"freckles\":\"雀斑\",\"gyaru-oh\":\"黄毛\",\"large tattoo\":\"全身纹身\",\"lipstick mark\":\"口红印\",\"scar\":\"瘢痕\",\"skinsuit\":\"人皮衣\",\"tanlines\":\"晒痕\",\"anorexic\":\"瘦骨嶙峋\",\"bbm\":\"胖男人\",\"ssbbm\":\"超级胖男人\",\"weight gain\":\"体重增加\",\"ahegao\":\"阿黑颜\",\"beauty mark\":\"美人痣\",\"brain fuck\":\"脑交🧠\",\"cockslapping\":\"屌掴\",\"crown\":\"王冠👑\",\"ear fuck\":\"耳交👂\",\"elf\":\"精灵🧝‍♂️\",\"facesitting\":\"坐脸\",\"facial hair\":\"胡子\",\"gasmask\":\"防毒面具\",\"halo\":\"光环\",\"hood\":\"帽兜\",\"horns\":\"角\",\"kemonomimi\":\"兽耳\",\"kigurumi pajama\":\"动物连体睡衣\",\"makeup\":\"化妆\",\"masked face\":\"假面\",\"mouth mask\":\"口罩\",\"thick eyebrows\":\"浓眉\",\"afro\":\"爆炸头\",\"bald\":\"秃顶\",\"drill hair\":\"螺旋辫\",\"eye-covering bang\":\"长刘海\",\"hair buns\":\"丸子头\",\"hairjob\":\"发丝交\",\"pixie cut\":\"精灵头\",\"ponytail\":\"马尾辫\",\"prehensile hair\":\"抓握发\",\"shaved head\":\"光头\",\"twintails\":\"双马尾\",\"very long hair\":\"超长发\",\"body swap\":\"换身\",\"chloroform\":\"迷药\",\"corruption\":\"堕落\",\"drugs\":\"药物\",\"drunk\":\"醉酒\",\"emotionless sex\":\"性冷淡\",\"mind break\":\"洗脑\",\"mind control\":\"催眠\",\"moral degeneration\":\"道德退化\",\"parasite\":\"寄生\",\"personality excretion\":\"人格排泄\",\"possession\":\"附身\",\"shared senses\":\"感官共享\",\"sleeping\":\"睡觉\",\"blindfold\":\"遮眼布\",\"closed eyes\":\"闭眼\",\"crying\":\"流泪\",\"dark sclera\":\"深色巩膜\",\"eye penetration\":\"插入眼睛\",\"eyemask\":\"眼部面具\",\"eyepatch\":\"眼罩\",\"glasses\":\"眼镜👓\",\"heterochromia\":\"异色瞳\",\"monoeye\":\"独眼\",\"sunglasses\":\"太阳镜🕶\",\"unusual pupils\":\"异瞳\",\"nose fuck\":\"鼻交\",\"nose hook\":\"鼻吊钩\",\"smell\":\"气味\",\"big lips\":\"大嘴唇💋\",\"blowjob\":\"口交\",\"blowjob face\":\"口交颜\",\"braces\":\"牙套\",\"burping\":\"打嗝\",\"coprophagia\":\"食粪\",\"deepthroat\":\"深喉\",\"double blowjob\":\"一口二鸟\",\"foot licking\":\"舔足\",\"gag\":\"口塞\",\"gokkun\":\"饮精\",\"kissing\":\"接吻💏\",\"long tongue\":\"长舌👅\",\"multimouth blowjob\":\"多口口交\",\"piss drinking\":\"饮尿\",\"rimjob\":\"舔肛\",\"saliva\":\"唾液\",\"smoking\":\"吸烟🚬\",\"tooth brushing\":\"刷牙\",\"unusual teeth\":\"异齿\",\"vomit\":\"呕吐🤮\",\"vore\":\"吞食\",\"asphyxiation\":\"窒息\",\"collar\":\"项圈\",\"hanging\":\"绞刑\",\"leash\":\"狗链\",\"armpit licking\":\"腋下舔\",\"armpit sex\":\"腋交\",\"hairy armpits\":\"腋毛\",\"fisting\":\"拳交💪\",\"gloves\":\"手套\",\"handjob\":\"打手枪\",\"multiple handjob\":\"多重打手枪\",\"big areolae\":\"大乳晕\",\"big breasts\":\"巨乳\",\"breast expansion\":\"乳房膨胀\",\"breast feeding\":\"哺乳\",\"lactation\":\"母乳\",\"milking\":\"挤奶\",\"paizuri\":\"乳交\",\"big nipples\":\"大乳头\",\"dark nipples\":\"暗色乳头\",\"dicknipples\":\"阴茎乳头\",\"inverted nipples\":\"乳头内陷\",\"multiple nipples\":\"多乳头\",\"nipple birth\":\"乳头出产\",\"nipple fuck\":\"乳穴性交\",\"nipple piercing\":\"乳头穿孔\",\"nipple stimulation\":\"乳头刺激\",\"cumflation\":\"精液膨胀\",\"navel birth\":\"肚脐出产\",\"navel fuck\":\"肚脐奸\",\"pregnant\":\"怀孕\",\"stomach deformation\":\"腹部变形\",\"chastity belt\":\"贞操带\",\"crotch tattoo\":\"淫纹\",\"genital piercing\":\"性器穿孔\",\"hairy\":\"多毛\",\"mesuiki\":\"干高潮\",\"multiple orgasms\":\"连续高潮\",\"no balls\":\"无蛋\",\"pantyjob\":\"内裤交\",\"pubic stubble\":\"阴毛茬\",\"urethra insertion\":\"尿道插入\",\"adventitious penis\":\"畸位阴茎\",\"ball caressing\":\"揉蛋\",\"balls expansion\":\"睾丸生长\",\"ball sucking\":\"吸球\",\"balljob\":\"球交\",\"big balls\":\"大睾丸\",\"big penis\":\"大根\",\"cloaca insertion\":\"泄殖腔插入\",\"cockphagia\":\"阴茎吞食\",\"cock ring\":\"锁精环\",\"frottage\":\"阴茎摩擦🤺\",\"horse cock\":\"马根\",\"huge penis\":\"巨根\",\"multiple penises\":\"鸡鸡复鸡鸡\",\"penis birth\":\"阴茎出产\",\"penis enlargement\":\"阴茎生长\",\"phimosis\":\"包茎\",\"prostate massage\":\"前列腺按摩\",\"retractable penis\":\"可伸缩阴茎\",\"smegma\":\"阴垢\",\"cervix prolapse\":\"宫颈脱垂\",\"clit insertion\":\"阴蒂插入\",\"clit stimulation\":\"阴蒂刺激\",\"cunnilingus\":\"舔阴\",\"unbirth\":\"入阴\",\"vaginal birth\":\"阴道出产\",\"anal\":\"爆肛\",\"anal birth\":\"肛门出产\",\"anal intercourse\":\"肛交\",\"analphagia\":\"肛门吞食\",\"anal prolapse\":\"脱肛\",\"ass expansion\":\"臀部膨胀\",\"assjob\":\"尻交\",\"big ass\":\"大屁股\",\"enema\":\"灌肠\",\"farting\":\"放屁\",\"multiple assjob\":\"多重尻交\",\"pegging\":\"爆菊\",\"spanking\":\"打屁股\",\"tail\":\"尾巴\",\"tailphagia\":\"尾巴吞食\",\"eggs\":\"产卵\",\"gaping\":\"敞口\",\"large insertions\":\"大玩具\",\"nakadashi\":\"中出\",\"prolapse\":\"脱垂\",\"leg lock\":\"勾腿\",\"sumata\":\"股间性交\",\"denki anma\":\"电气按摩\",\"foot insertion\":\"足插入\",\"footjob\":\"足交\",\"multiple footjob\":\"多重足交\",\"sockjob\":\"袜交🧦\",\"animegao\":\"头壳\",\"apron\":\"围裙\",\"bandages\":\"绷带\",\"bandaid\":\"创可贴\",\"bike shorts\":\"自行车短裤\",\"bikini\":\"比基尼👙\",\"bloomers\":\"布鲁马\",\"bodystocking\":\"连身袜\",\"bodysuit\":\"紧身衣裤\",\"bride\":\"婚纱\",\"business suit\":\"西装\",\"butler\":\"管家\",\"cashier\":\"收银员\",\"cheerleader\":\"啦啦队员\",\"chinese dress\":\"旗袍\",\"christmas\":\"圣诞装🎅\",\"clothed female nude male\":\"裸男\",\"clown\":\"小丑🤡\",\"condom\":\"避孕套\",\"corset\":\"紧身胸衣\",\"cosplaying\":\"Cosplay\",\"crossdressing\":\"异性装\",\"detached sleeves\":\"分离袖子\",\"diaper\":\"尿布\",\"dougi\":\"练功服🥋\",\"exposed clothing\":\"开洞装\",\"fishnets\":\"渔网\",\"fundoshi\":\"六尺褌\",\"garter belt\":\"吊袜带\",\"gothic lolita\":\"哥特萝莉装\",\"gymshorts\":\"运动短裤\",\"haigure\":\"高叉装\",\"headphones\":\"头戴式耳机\",\"high heels\":\"高跟鞋\",\"hijab\":\"头巾\",\"hotpants\":\"热裤\",\"kimono\":\"和服👘\",\"kindergarten uniform\":\"幼儿园制服\",\"kunoichi\":\"女忍装\",\"lab coat\":\"白大褂\",\"latex\":\"乳胶紧身衣\",\"leotard\":\"紧身衣\",\"lingerie\":\"情趣内衣\",\"living clothes\":\"生物衣\",\"magical girl\":\"魔法少女\",\"maid\":\"女仆装\",\"mecha boy\":\"机男\",\"metal armor\":\"金属盔甲\",\"miko\":\"巫女装\",\"military\":\"军装\",\"nazi\":\"纳粹军装\",\"ninja\":\"忍者装\",\"nun\":\"修女服\",\"nurse\":\"护士装\",\"painted nails\":\"美甲\",\"pantyhose\":\"连裤袜\",\"pasties\":\"乳贴\",\"piercing\":\"穿孔\",\"pirate\":\"海盗服\",\"policeman\":\"警服\",\"priest\":\"牧师服\",\"randoseru\":\"书包\",\"schoolboy uniform\":\"男生制服\",\"schoolgirl uniform\":\"女生制服\",\"school gym uniform\":\"学校体操服\",\"school swimsuit\":\"死库水\",\"scrotal lingerie\":\"阴囊袋\",\"small penis\":\"小小鸟\",\"shimapan\":\"条纹胖次\",\"stewardess\":\"空姐服\",\"steward\":\"男空乘服\",\"stirrup legwear\":\"马镫裤\",\"stockings\":\"长筒袜\",\"straitjacket\":\"拘束衣\",\"sundress\":\"夏装\",\"swimsuit\":\"泳装\",\"tabi socks\":\"足袋\",\"thigh high boots\":\"高筒靴\",\"tiara\":\"宝冠\",\"tights\":\"厚连裤袜\",\"tracksuit\":\"运动服\",\"transparent clothing\":\"透明服装\",\"waiter\":\"男侍者装\",\"waitress\":\"女侍者装\",\"wet clothes\":\"湿身\",\"witch\":\"女巫装\",\"double anal\":\"双插肛门\",\"gang rape\":\"轮奸\",\"group\":\"乱交\",\"harem\":\"后宫\",\"layer cake\":\"夹心蛋糕\",\"mmm threesome\":\"男3P\",\"multiple straddling\":\"多人跨骑\",\"oyakodon\":\"父子丼\",\"shimaidon\":\"兄弟丼\",\"triple anal\":\"三插肛门\",\"twins\":\"双胞胎\",\"all the way through\":\"消化道贯穿\",\"double penetration\":\"双重插入\",\"triple penetration\":\"三重插入\",\"clamp\":\"夹具\",\"glory hole\":\"寻欢洞\",\"machine\":\"机械奸\",\"onahole\":\"飞机杯\",\"pillory\":\"枷具\",\"pole dancing\":\"钢管舞\",\"sex toys\":\"性玩具\",\"speculum\":\"扩张器\",\"strap-on\":\"穿戴式阳具\",\"syringe\":\"注射器\",\"tail plug\":\"尾塞\",\"tube\":\"插管\",\"unusual insertions\":\"异物插入\",\"vacbed\":\"真空床\",\"whip\":\"鞭打\",\"wooden horse\":\"木马\",\"wormhole\":\"虫洞\",\"oil\":\"油\",\"underwater\":\"水下\",\"blood\":\"血液\",\"apparel bukkake\":\"穿衣颜射\",\"bukkake\":\"颜射\",\"cum bath\":\"精液浴\",\"giant sperm\":\"巨大精子\",\"internal urination\":\"内部排尿\",\"omorashi\":\"漏尿\",\"public use\":\"肉便器\",\"scat\":\"粪便💩\",\"sweating\":\"出汗\",\"urination\":\"排尿\",\"blackmail\":\"要挟\",\"chikan\":\"痴汉\",\"confinement\":\"监禁\",\"rape\":\"强奸\",\"bdsm\":\"调教\",\"domination loss\":\"统治丢失\",\"food on body\":\"男体盛\",\"forniphilia\":\"人体家具\",\"human cattle\":\"人类饲养\",\"josou seme\":\"女装攻\",\"orgasm denial\":\"高潮禁止\",\"petplay\":\"人宠\",\"slave\":\"奴隶\",\"smalldom\":\"逆体格差\",\"tickling\":\"挠痒\",\"bondage\":\"束缚\",\"fanny packing\":\"人肉腰包\",\"harness\":\"挽具\",\"shibari\":\"捆绑\",\"stuck in wall\":\"卡在墙上\",\"abortion\":\"堕胎\",\"cannibalism\":\"食人\",\"cbt\":\"虐屌\",\"dismantling\":\"拆解\",\"guro\":\"猎奇\",\"electric shocks\":\"电击\",\"ryona\":\"凌虐\",\"snuff\":\"杀害\",\"torture\":\"拷打\",\"trampling\":\"践踏\",\"wrestling\":\"摔角\",\"autofellatio\":\"自吹\",\"clone\":\"克隆\",\"masturbation\":\"自慰\",\"phone sex\":\"电话性爱\",\"selfcest\":\"自交\",\"solo action\":\"自摸\",\"table masturbation\":\"桌角自慰\",\"blind\":\"失明\",\"handicapped\":\"残疾\",\"mute\":\"哑巴\",\"full tour\":\"消化道游览\",\"cuntboy\":\"人妖♀\",\"feminization\":\"女性化\",\"gender change\":\"性转换\",\"gender morph\":\"女体化\",\"otokofutanari\":\"扶他\",\"bisexual\":\"双性恋\",\"dickgirl on male\":\"扶上男\",\"first person perspective\":\"第一人称视角\",\"x-ray\":\"透视\",\"coach\":\"教练\",\"impregnation\":\"受孕\",\"mesugaki\":\"雄小鬼\",\"prostitution\":\"卖淫\",\"teacher\":\"教师\",\"tomgirl\":\"伪娘\",\"tutor\":\"家庭教师\",\"virginity\":\"丧失童贞\",\"vtuber\":\"虚拟主播\",\"widower\":\"鳏夫\",\"yandere\":\"病娇\",\"yaoi\":\"男同\",\"males only\":\"纯男性⚣\",\"pussyboys only\":\"纯扶他\",\"sole male\":\"单男主\",\"sole pussyboy\":\"单扶他\",\"cheating\":\"出轨\",\"netorare\":\"NTR\",\"netorase\":\"绿帽癖\",\"swinging\":\"换夫\",\"brother\":\"兄弟\",\"cousin\":\"表兄弟\",\"father\":\"父亲\",\"grandfather\":\"祖父\",\"incest\":\"乱伦\",\"inseki\":\"姻亲\",\"uncle\":\"叔叔\",\"exhibitionism\":\"露阴癖\",\"filming\":\"摄像\",\"forced exposure\":\"强制暴露\",\"hidden sex\":\"隐蔽性交\",\"humiliation\":\"屈辱\",\"voyeurism\":\"偷窥\",\"low bestiality\":\"低存在兽交\",\"low guro\":\"低存在猎奇\",\"low incest\":\"低存在乱伦\",\"low scat\":\"低存在排便\",\"low shotacon\":\"低存在正太\",\"low smegma\":\"低存在阴垢\",\"focus anal\":\"高存在肛交\",\"focus blowjob\":\"高存在口交\",\"focus paizuri\":\"高存在乳交\"},\"female\":{\"age progression\":\"年龄增长\",\"age regression\":\"返老还童\",\"infantilism\":\"幼稚型\",\"kodomo doushi\":\"两小无猜\",\"lolicon\":\"萝莉\",\"milf\":\"熟女\",\"old lady\":\"老女人\",\"toddlercon\":\"幼女\",\"amputee\":\"截肢\",\"big muscles\":\"大肌肉\",\"body modification\":\"身体改造\",\"conjoined\":\"连体\",\"doll joints\":\"关节娃娃\",\"gijinka\":\"拟人化\",\"inflation\":\"腹部膨胀\",\"invisible\":\"透明\",\"multiple arms\":\"多臂\",\"multiple breasts\":\"多乳房\",\"muscle\":\"肌肉\",\"muscle growth\":\"肌肉成长\",\"shapening\":\"平面化\",\"stretching\":\"拉伸\",\"tailjob\":\"尾交\",\"wingjob\":\"翼交\",\"wings\":\"翅膀\",\"absorption\":\"吸收\",\"futanarization\":\"扶她化\",\"petrification\":\"石化\",\"transformation\":\"变身\",\"alien girl\":\"外星女👽\",\"angel\":\"天使\",\"bat girl\":\"蝙蝠娘\",\"bear girl\":\"狗熊娘\",\"bee girl\":\"蜂女\",\"bird girl\":\"鸟娘\",\"bunny girl\":\"兔女郎\",\"catgirl\":\"猫女\",\"centaur\":\"半人马\",\"corpse\":\"尸体\",\"cowgirl\":\"牛女孩\",\"deer girl\":\"鹿女孩\",\"demon girl\":\"恶魔女孩\",\"dog girl\":\"狗女孩\",\"draenei\":\"德莱尼\",\"elephant girl\":\"象女孩\",\"fairy\":\"仙女🧚‍♀️\",\"frog girl\":\"青蛙女孩\",\"fox girl\":\"狐女\",\"furry\":\"毛茸茸\",\"giraffe girl\":\"长颈鹿娘\",\"ghost\":\"幽灵👻\",\"goblin\":\"哥布林\",\"harpy\":\"鸟人\",\"horse girl\":\"马女孩\",\"human on furry\":\"人毛\",\"hyena girl\":\"鬣狗女孩\",\"insect girl\":\"昆虫女孩\",\"kappa\":\"河童\",\"lizard girl\":\"蜥蜴女孩\",\"mermaid\":\"美人鱼🧜‍♀️\",\"monkey girl\":\"猴女孩\",\"monster girl\":\"魔物娘\",\"mouse girl\":\"鼠女孩\",\"necrophilia\":\"奸尸\",\"oni\":\"鬼\",\"orc\":\"半兽人\",\"otter girl\":\"水獭女孩\",\"panda girl\":\"熊猫娘\",\"pig girl\":\"猪女\",\"plant girl\":\"植物女孩\",\"raccoon girl\":\"浣熊女孩\",\"robot\":\"机器人🤖\",\"shark girl\":\"鲨女孩\",\"sheep girl\":\"羊女孩\",\"slime\":\"史莱姆\",\"slime girl\":\"史莱姆女孩\",\"snail girl\":\"蜗牛女孩\",\"snake girl\":\"蛇女\",\"spider girl\":\"蜘蛛娘\",\"squid girl\":\"乌贼娘\",\"squirrel girl\":\"松鼠娘\",\"skunk girl\":\"臭鼬娘\",\"tentacles\":\"触手\",\"vampire\":\"吸血鬼🧛‍♀️\",\"wolf girl\":\"狼女孩\",\"zombie\":\"丧尸🧟‍♀️\",\"animal on animal\":\"兽兽\",\"animal on furry\":\"兽毛\",\"bear\":\"熊🐻\",\"bestiality\":\"兽交\",\"cat\":\"猫🐈\",\"cow\":\"牛🐄\",\"crab\":\"螃蟹🦀\",\"deer\":\"鹿🦌\",\"dinosaur\":\"恐龙🦕\",\"dog\":\"狗🐩\",\"dolphin\":\"海豚🐬\",\"donkey\":\"驴\",\"dragon\":\"龙🐉\",\"eel\":\"鳗鱼\",\"elephant\":\"象🐘\",\"fish\":\"鱼🐟\",\"fox\":\"狐狸🦊\",\"frog\":\"青蛙🐸\",\"goat\":\"山羊🐐\",\"horse\":\"马🐎\",\"insect\":\"昆虫🐜\",\"kangaroo\":\"袋鼠\",\"lioness\":\"狮🦁\",\"maggot\":\"蛆🐛\",\"monkey\":\"猴🐒\",\"mouse\":\"鼠🐁\",\"octopus\":\"章鱼🦑\",\"pegasus\":\"天马\",\"pig\":\"猪🐖\",\"rabbit\":\"兔🐇\",\"reptile\":\"爬虫\",\"rhinoceros\":\"犀牛🦏\",\"sheep\":\"绵羊🐑\",\"shark\":\"鲨🦈\",\"slug\":\"蛞蝓\",\"snake\":\"蛇🐍\",\"spider\":\"蜘蛛🕷\",\"tiger\":\"虎🐅\",\"turtle\":\"龟🐢\",\"unicorn\":\"独角兽🦄\",\"whale\":\"鲸🐋\",\"wolf\":\"狼🐺\",\"worm\":\"蠕虫\",\"zebra\":\"斑马🦓\",\"giantess\":\"女巨人\",\"growth\":\"巨大化\",\"midget\":\"侏儒\",\"minigirl\":\"迷你女孩\",\"shrinking\":\"缩小\",\"tall girl\":\"高个女\",\"albino\":\"白化\",\"body writing\":\"身体写作\",\"body painting\":\"身体绘画\",\"dark skin\":\"黑皮\",\"freckles\":\"雀斑\",\"gyaru\":\"辣妹\",\"large tattoo\":\"全身纹身\",\"lipstick mark\":\"口红印\",\"scar\":\"瘢痕\",\"skinsuit\":\"人皮衣\",\"tanlines\":\"晒痕\",\"anorexic\":\"瘦骨嶙峋\",\"bbw\":\"胖女人\",\"ssbbw\":\"超级胖女人\",\"weight gain\":\"体重增加\",\"ahegao\":\"阿黑颜\",\"beauty mark\":\"美人痣\",\"brain fuck\":\"脑交🧠\",\"cockslapping\":\"屌掴\",\"crown\":\"王冠👑\",\"ear fuck\":\"耳交👂\",\"elf\":\"精灵🧝‍♀️\",\"facesitting\":\"坐脸\",\"facial hair\":\"胡子\",\"gasmask\":\"防毒面具\",\"halo\":\"光环\",\"headless\":\"无头\",\"hood\":\"帽兜\",\"horns\":\"角\",\"kemonomimi\":\"兽耳\",\"kigurumi pajama\":\"动物连体睡衣\",\"makeup\":\"化妆\",\"masked face\":\"假面\",\"mouth mask\":\"口罩\",\"thick eyebrows\":\"浓眉\",\"afro\":\"爆炸头\",\"bald\":\"秃顶\",\"drill hair\":\"螺旋辫\",\"eye-covering bang\":\"长刘海\",\"hair buns\":\"丸子头\",\"hairjob\":\"发丝交\",\"pixie cut\":\"精灵头\",\"ponytail\":\"马尾辫\",\"prehensile hair\":\"抓握发\",\"shaved head\":\"光头\",\"twintails\":\"双马尾\",\"very long hair\":\"超长发\",\"body swap\":\"换身\",\"chloroform\":\"迷药\",\"corruption\":\"堕落\",\"drugs\":\"药物\",\"drunk\":\"醉酒\",\"emotionless sex\":\"性冷淡\",\"mind break\":\"洗脑\",\"mind control\":\"催眠\",\"moral degeneration\":\"道德退化\",\"parasite\":\"寄生\",\"personality excretion\":\"人格排泄\",\"possession\":\"附身\",\"shared senses\":\"感官共享\",\"sleeping\":\"睡觉\",\"blindfold\":\"遮眼布\",\"closed eyes\":\"闭眼\",\"crying\":\"流泪\",\"cum in eye\":\"眼射\",\"dark sclera\":\"深色巩膜\",\"eye penetration\":\"插入眼睛\",\"eyemask\":\"眼部面具\",\"eyepatch\":\"眼罩\",\"glasses\":\"眼镜👓\",\"heterochromia\":\"异色瞳\",\"monoeye\":\"独眼\",\"sunglasses\":\"太阳镜🕶\",\"unusual pupils\":\"异瞳\",\"nose fuck\":\"鼻交\",\"nose hook\":\"鼻吊钩\",\"smell\":\"气味\",\"adventitious mouth\":\"畸位口\",\"big lips\":\"大嘴唇💋\",\"blowjob\":\"口交\",\"blowjob face\":\"口交颜\",\"braces\":\"牙套\",\"burping\":\"打嗝\",\"coprophagia\":\"食粪\",\"deepthroat\":\"深喉\",\"double blowjob\":\"一口二鸟\",\"foot licking\":\"舔足\",\"gag\":\"口塞\",\"gokkun\":\"饮精\",\"kissing\":\"接吻💏\",\"long tongue\":\"长舌👅\",\"multimouth blowjob\":\"多口口交\",\"piss drinking\":\"饮尿\",\"rimjob\":\"舔肛\",\"saliva\":\"唾液\",\"smoking\":\"吸烟🚬\",\"tooth brushing\":\"刷牙\",\"unusual teeth\":\"异齿\",\"vomit\":\"呕吐🤮\",\"vore\":\"吞食\",\"asphyxiation\":\"窒息\",\"collar\":\"项圈\",\"hanging\":\"绞刑\",\"leash\":\"狗链\",\"armpit licking\":\"腋下舔\",\"armpit sex\":\"腋交\",\"hairy armpits\":\"腋毛\",\"fingering\":\"指法\",\"fisting\":\"拳交💪\",\"gloves\":\"手套\",\"handjob\":\"打手枪\",\"multiple handjob\":\"多重打手枪\",\"big areolae\":\"大乳晕\",\"big breasts\":\"巨乳\",\"breast expansion\":\"乳房膨胀\",\"breast feeding\":\"哺乳\",\"breast reduction\":\"乳房缩小\",\"gigantic breasts\":\"极乳\",\"huge breasts\":\"超乳\",\"lactation\":\"母乳\",\"milking\":\"挤奶\",\"multiple paizuri\":\"多重乳交\",\"oppai loli\":\"巨乳萝莉\",\"paizuri\":\"乳交\",\"clothed paizuri\":\"穿衣乳交\",\"small breasts\":\"贫乳\",\"big nipples\":\"大乳头\",\"dark nipples\":\"暗色乳头\",\"dicknipples\":\"阴茎乳头\",\"inverted nipples\":\"乳头内陷\",\"multiple nipples\":\"多乳头\",\"nipple birth\":\"乳头出产\",\"nipple expansion\":\"乳头膨胀\",\"nipple fuck\":\"乳穴性交\",\"nipple piercing\":\"乳头穿孔\",\"nipple stimulation\":\"乳头刺激\",\"cumflation\":\"精液膨胀\",\"navel birth\":\"肚脐出产\",\"navel fuck\":\"肚脐奸\",\"pregnant\":\"怀孕\",\"stomach deformation\":\"腹部变形\",\"ball-less shemale\":\"无蛋人妖\",\"chastity belt\":\"贞操带\",\"crotch tattoo\":\"淫纹\",\"full-packaged futanari\":\"有蛋扶她\",\"genital piercing\":\"性器穿孔\",\"hairy\":\"多毛\",\"mesuiki\":\"干高潮\",\"multiple orgasms\":\"连续高潮\",\"pantyjob\":\"内裤交\",\"pubic stubble\":\"阴毛茬\",\"urethra insertion\":\"尿道插入\",\"adventitious penis\":\"畸位阴茎\",\"ball caressing\":\"揉蛋\",\"balls expansion\":\"睾丸生长\",\"ball sucking\":\"吸球\",\"balljob\":\"球交\",\"big balls\":\"大睾丸\",\"big penis\":\"大根\",\"cockphagia\":\"阴茎吞食\",\"cock ring\":\"锁精环\",\"frottage\":\"阴茎摩擦🤺\",\"horse cock\":\"马根\",\"huge penis\":\"巨根\",\"multiple penises\":\"鸡鸡复鸡鸡\",\"penis birth\":\"阴茎出产\",\"penis enlargement\":\"阴茎生长\",\"phimosis\":\"包茎\",\"prostate massage\":\"前列腺按摩\",\"retractable penis\":\"可伸缩阴茎\",\"smegma\":\"阴垢\",\"adventitious vagina\":\"畸位阴道\",\"big clit\":\"大阴蒂\",\"big vagina\":\"大阴道\",\"cervix penetration\":\"宫颈穿透\",\"cervix prolapse\":\"宫颈脱垂\",\"clit growth\":\"阴蒂生长\",\"clit insertion\":\"阴蒂插入\",\"clit stimulation\":\"阴蒂刺激\",\"cunnilingus\":\"舔阴\",\"defloration\":\"破处\",\"multiple vaginas\":\"多阴道\",\"tribadism\":\"贝合\",\"unbirth\":\"入阴\",\"vaginal birth\":\"阴道出产\",\"anal\":\"爆肛\",\"anal birth\":\"肛门出产\",\"anal intercourse\":\"肛交\",\"analphagia\":\"肛门吞食\",\"anal prolapse\":\"脱肛\",\"ass expansion\":\"臀部膨胀\",\"assjob\":\"尻交\",\"big ass\":\"大屁股\",\"enema\":\"灌肠\",\"farting\":\"放屁\",\"multiple assjob\":\"多重尻交\",\"spanking\":\"打屁股\",\"tail\":\"尾巴\",\"tailphagia\":\"尾巴吞食\",\"eggs\":\"产卵\",\"gaping\":\"敞口\",\"large insertions\":\"大玩具\",\"nakadashi\":\"中出\",\"prolapse\":\"脱垂\",\"kneepit sex\":\"膝下性交\",\"leg lock\":\"勾腿\",\"legjob\":\"腿交\",\"sumata\":\"股间性交\",\"denki anma\":\"电气按摩\",\"foot insertion\":\"足插入\",\"footjob\":\"足交\",\"multiple footjob\":\"多重足交\",\"sockjob\":\"袜交🧦\",\"animegao\":\"头壳\",\"apron\":\"围裙\",\"bandages\":\"绷带\",\"vaginal sticker\":\"阴贴\",\"bandaid\":\"创可贴\",\"bike shorts\":\"自行车短裤\",\"bikini\":\"比基尼👙\",\"bloomers\":\"布鲁马\",\"bodystocking\":\"连身袜\",\"bodysuit\":\"紧身衣裤\",\"bride\":\"婚纱\",\"business suit\":\"西装\",\"butler\":\"管家\",\"cashier\":\"收银员\",\"cheerleader\":\"啦啦队员\",\"chinese dress\":\"旗袍\",\"christmas\":\"圣诞装🤶\",\"clothed male nude female\":\"裸女\",\"clown\":\"小丑🤡\",\"condom\":\"避孕套\",\"corset\":\"紧身胸衣\",\"cosplaying\":\"Cosplay\",\"crossdressing\":\"异性装\",\"detached sleeves\":\"分离袖子\",\"diaper\":\"尿布\",\"dougi\":\"练功服🥋\",\"exposed clothing\":\"开洞装\",\"fishnets\":\"渔网\",\"fundoshi\":\"六尺褌\",\"garter belt\":\"吊袜带\",\"gothic lolita\":\"哥特萝莉装\",\"gymshorts\":\"运动短裤\",\"haigure\":\"高叉装\",\"headphones\":\"头戴式耳机\",\"high heels\":\"高跟鞋\",\"hijab\":\"头巾\",\"hotpants\":\"热裤\",\"kimono\":\"和服👘\",\"kindergarten uniform\":\"幼儿园制服\",\"kunoichi\":\"女忍装\",\"lab coat\":\"白大褂\",\"latex\":\"乳胶紧身衣\",\"leotard\":\"紧身衣\",\"lingerie\":\"情趣内衣\",\"living clothes\":\"生物衣\",\"magical girl\":\"魔法少女\",\"maid\":\"女仆装\",\"mecha girl\":\"机娘\",\"metal armor\":\"金属盔甲\",\"miko\":\"巫女装\",\"military\":\"军装\",\"nazi\":\"纳粹军装\",\"nun\":\"修女服\",\"nurse\":\"护士装\",\"painted nails\":\"美甲\",\"pantyhose\":\"连裤袜\",\"pasties\":\"乳贴\",\"piercing\":\"穿孔\",\"pirate\":\"海盗服\",\"policewoman\":\"警服\",\"ponygirl\":\"小马女\",\"race queen\":\"赛车女郎\",\"randoseru\":\"书包\",\"sarashi\":\"缠胸布\",\"schoolboy uniform\":\"男生制服\",\"schoolgirl uniform\":\"女生制服\",\"school gym uniform\":\"学校体操服\",\"school swimsuit\":\"死库水\",\"scrotal lingerie\":\"阴囊袋\",\"small penis\":\"小小鸟\",\"shimapan\":\"条纹胖次\",\"stewardess\":\"空姐服\",\"stirrup legwear\":\"马镫裤\",\"stockings\":\"长筒袜\",\"straitjacket\":\"拘束衣\",\"sundress\":\"夏装\",\"swimsuit\":\"泳装\",\"tabi socks\":\"足袋\",\"thigh high boots\":\"高筒靴\",\"tiara\":\"宝冠\",\"tights\":\"厚连裤袜\",\"tracksuit\":\"运动服\",\"transparent clothing\":\"透明服装\",\"waiter\":\"男侍者装\",\"waitress\":\"女侍者装\",\"wet clothes\":\"湿身\",\"witch\":\"女巫装\",\"double anal\":\"双插肛门\",\"double vaginal\":\"双插阴道\",\"fff threesome\":\"女3P\",\"fft threesome\":\"女扶女3P\",\"gang rape\":\"轮奸\",\"group\":\"乱交\",\"harem\":\"后宫\",\"layer cake\":\"夹心蛋糕\",\"multiple straddling\":\"多人跨骑\",\"oyakodon\":\"母女丼\",\"shimaidon\":\"姐妹丼\",\"triple anal\":\"三插肛门\",\"triple vaginal\":\"三插阴道\",\"ttf threesome\":\"扶女扶3P\",\"ttt threesome\":\"扶3P\",\"twins\":\"双胞胎\",\"all the way through\":\"消化道贯穿\",\"double penetration\":\"双重插入\",\"triple penetration\":\"三重插入\",\"clamp\":\"夹具\",\"glory hole\":\"寻欢洞\",\"machine\":\"机械奸\",\"onahole\":\"飞机杯\",\"pillory\":\"枷具\",\"pole dancing\":\"钢管舞\",\"real doll\":\"充气娃娃\",\"sex toys\":\"性玩具\",\"speculum\":\"扩张器\",\"strap-on\":\"穿戴式阳具\",\"syringe\":\"注射器\",\"tail plug\":\"尾塞\",\"tube\":\"插管\",\"unusual insertions\":\"异物插入\",\"vacbed\":\"真空床\",\"whip\":\"鞭打\",\"wooden horse\":\"木马\",\"wormhole\":\"虫洞\",\"oil\":\"油\",\"underwater\":\"水下\",\"blood\":\"血液\",\"squirting\":\"潮吹\",\"apparel bukkake\":\"穿衣颜射\",\"bukkake\":\"颜射\",\"cum bath\":\"精液浴\",\"cum swap\":\"交换精液\",\"giant sperm\":\"巨大精子\",\"internal urination\":\"内部排尿\",\"menstruation\":\"经血\",\"omorashi\":\"漏尿\",\"public use\":\"肉便器\",\"scat\":\"粪便💩\",\"scat insertion\":\"粪便插入\",\"sweating\":\"出汗\",\"urination\":\"排尿\",\"blackmail\":\"要挟\",\"chikan\":\"痴汉\",\"confinement\":\"监禁\",\"rape\":\"强奸\",\"bdsm\":\"调教\",\"femdom\":\"女性主导\",\"domination loss\":\"统治丢失\",\"food on body\":\"女体盛\",\"forniphilia\":\"人体家具\",\"human cattle\":\"人类饲养\",\"orgasm denial\":\"高潮禁止\",\"petplay\":\"人宠\",\"slave\":\"奴隶\",\"smalldom\":\"逆体格差\",\"tickling\":\"挠痒\",\"bondage\":\"束缚\",\"fanny packing\":\"人肉腰包\",\"harness\":\"挽具\",\"shibari\":\"捆绑\",\"stuck in wall\":\"卡在墙上\",\"abortion\":\"堕胎\",\"cannibalism\":\"食人\",\"catfight\":\"猫斗\",\"cbt\":\"虐屌\",\"cuntbusting\":\"阴道破坏\",\"dismantling\":\"拆解\",\"guro\":\"猎奇\",\"electric shocks\":\"电击\",\"ryona\":\"凌虐\",\"snuff\":\"杀害\",\"torture\":\"拷打\",\"trampling\":\"践踏\",\"wrestling\":\"摔角\",\"autofellatio\":\"自吹\",\"autopaizuri\":\"自乳交\",\"clone\":\"克隆\",\"masturbation\":\"自慰\",\"phone sex\":\"电话性爱\",\"selfcest\":\"自交\",\"solo action\":\"自摸\",\"table masturbation\":\"桌角自慰\",\"blind\":\"失明\",\"handicapped\":\"残疾\",\"mute\":\"哑巴\",\"full tour\":\"消化道游览\",\"futanari\":\"扶她\",\"gender change\":\"性转换\",\"gender morph\":\"男体化\",\"shemale\":\"人妖♂\",\"bisexual\":\"双性恋\",\"dickgirl on dickgirl\":\"扶上扶\",\"dickgirl on female\":\"扶上女\",\"male on dickgirl\":\"男上扶\",\"first person perspective\":\"第一人称视角\",\"x-ray\":\"透视\",\"coach\":\"教练\",\"impregnation\":\"受孕\",\"mesugaki\":\"雌小鬼\",\"prostitution\":\"卖淫\",\"teacher\":\"教师\",\"tomboy\":\"假小子\",\"tutor\":\"家庭教师\",\"vtuber\":\"虚拟主播\",\"widow\":\"寡妇\",\"yandere\":\"病娇\",\"yuri\":\"百合\",\"dickgirls only\":\"纯扶她\",\"females only\":\"纯女性⚢\",\"sole dickgirl\":\"单扶她\",\"sole female\":\"单女主\",\"cheating\":\"出轨\",\"netorare\":\"NTR\",\"netorase\":\"绿帽癖\",\"swinging\":\"换妻\",\"aunt\":\"阿姨\",\"cousin\":\"表姐妹\",\"daughter\":\"女儿\",\"granddaughter\":\"孙女\",\"grandmother\":\"祖母\",\"incest\":\"乱伦\",\"inseki\":\"姻亲\",\"mother\":\"母亲\",\"niece\":\"侄女\",\"sister\":\"姐妹\",\"exhibitionism\":\"露阴癖\",\"filming\":\"摄像\",\"forced exposure\":\"强制暴露\",\"hidden sex\":\"隐蔽性交\",\"humiliation\":\"屈辱\",\"voyeurism\":\"偷窥\",\"low bestiality\":\"低存在兽交\",\"low guro\":\"低存在猎奇\",\"low incest\":\"低存在乱伦\",\"low lolicon\":\"低存在萝莉\",\"low scat\":\"低存在排便\",\"low smegma\":\"低存在阴垢\",\"focus anal\":\"高存在肛交\",\"focus blowjob\":\"高存在口交\",\"focus paizuri\":\"高存在乳交\"},\"mixed\":{\"kodomo doushi\":\"两小无猜\",\"animal on animal\":\"兽兽\",\"body swap\":\"换身\",\"multimouth blowjob\":\"多口口交\",\"multiple handjob\":\"多重打手枪\",\"frottage\":\"阴茎摩擦🤺\",\"multiple assjob\":\"多重尻交\",\"multiple footjob\":\"多重足交\",\"nudism\":\"裸体主义\",\"ffm threesome\":\"女男女3P\",\"gang rape\":\"轮奸\",\"group\":\"乱交\",\"mmf threesome\":\"男女男3P\",\"mmt threesome\":\"男扶男3P\",\"mtf threesome\":\"男扶女3P\",\"oyakodon\":\"亲子丼\",\"shimaidon\":\"手足丼\",\"ttm threesome\":\"扶扶男3P\",\"twins\":\"双胞胎\",\"incest\":\"乱伦\",\"inseki\":\"姻亲\",\"low incest\":\"低存在乱伦\"},\"other\":{\"yukkuri\":\"油库里\",\"dakimakura\":\"抱枕\",\"time stop\":\"时间停止⏱️\",\"3d\":\"3D\",\"3d imageset\":\"3D图片集\",\"ai generated\":\"AI生成\",\"anaglyph\":\"红蓝3D\",\"animated\":\"动图\",\"comic\":\"西方漫画\",\"extraneous ads\":\"外部广告\",\"figure\":\"手办\",\"full color\":\"全彩\",\"game sprite\":\"像素画\",\"how to\":\"教程\",\"multipanel sequence\":\"多格序列\",\"multi-work series\":\"系列作品\",\"non-h game manual\":\"无H游戏手册\",\"non-h imageset\":\"无H图片集\",\"paperchild\":\"纸片人\",\"redraw\":\"重绘\",\"screenshots\":\"截图\",\"sketch lines\":\"线稿\",\"stereoscopic\":\"立体图\",\"story arc\":\"故事线\",\"themeless\":\"无主题\",\"western cg\":\"西方CG\",\"western non-h\":\"西方无H\",\"western imageset\":\"西方图集\",\"uncensored\":\"无修正\",\"mosaic censorship\":\"马赛克修正\",\"full censorship\":\"完全修正\",\"hardcore\":\"硬核\",\"non-nude\":\"无露点\",\"already uploaded\":\"已上传\",\"defaced\":\"污损\",\"forbidden content\":\"禁止内容\",\"realporn\":\"真人色情\",\"replaced\":\"已替换\",\"compilation\":\"汇编\",\"incomplete\":\"缺页\",\"missing cover\":\"缺封面\",\"out of order\":\"顺序错乱\",\"sample\":\"样本\",\"scanmark\":\"扫描水印\",\"watermarked\":\"水印\",\"anthology\":\"选集\",\"artbook\":\"画集\",\"goudoushi\":\"合作本\",\"novel\":\"小说\",\"soushuuhen\":\"总集篇\",\"tankoubon\":\"单行本\",\"variant set\":\"变体集\",\"webtoon\":\"条漫\",\"caption\":\"说明文字\",\"rough grammar\":\"语法差\",\"rough translation\":\"渣翻\",\"kodomo only\":\"仅儿童\",\"no penetration\":\"无插入\",\"nudity only\":\"仅裸体\",\"object insertion only\":\"仅物体插入\"}}"
  },
  {
    "path": "assets/tags_tw.json",
    "content": "{\n    \"rows\": {\n        \"female\": \"女性\",\n        \"male\": \"男性\",\n        \"mixed\": \"混合\",\n        \"language\": \"語言\",\n        \"other\": \"其他\",\n        \"group\": \"團隊\",\n        \"artist\": \"藝術家\",\n        \"cosplayer\": \"Coser\",\n        \"parody\": \"原作\",\n        \"character\": \"角色\",\n        \"reclass\": \"重新分類\",\n        \"temp\": \"臨時\"\n    },\n    \"reclass\": {\n        \"doujinshi\": \"同人誌\",\n        \"manga\": \"漫畫\",\n        \"artistcg\": \"畫師CG\",\n        \"gamecg\": \"遊戲CG\",\n        \"non-h\": \"無H\",\n        \"imageset\": \"圖集\",\n        \"western\": \"西方\",\n        \"cosplay\": \"Cosplay\",\n        \"misc\": \"雜項\",\n        \"asianporn\": \"亞洲色情\",\n        \"private\": \"私有\"\n    },\n    \"language\": {\n        \"afrikaans\": \"南非語\",\n        \"albanian\": \"阿爾巴尼亞語\",\n        \"arabic\": \"阿拉伯語\",\n        \"aramaic\": \"阿拉姆語\",\n        \"armenian\": \"亞美尼亞語\",\n        \"bengali\": \"孟加拉語\",\n        \"bosnian\": \"波斯尼亞語\",\n        \"bulgarian\": \"保加利亞語\",\n        \"burmese\": \"緬甸語\",\n        \"catalan\": \"加泰羅尼亞語\",\n        \"cebuano\": \"宿霧語\",\n        \"chinese\": \"漢語\",\n        \"cree\": \"克里語\",\n        \"creole\": \"克里奧爾語\",\n        \"croatian\": \"克羅埃西亞語\",\n        \"czech\": \"捷克語\",\n        \"danish\": \"丹麥語\",\n        \"dutch\": \"荷蘭語\",\n        \"english\": \"英語\",\n        \"esperanto\": \"世界語\",\n        \"estonian\": \"愛沙尼亞語\",\n        \"finnish\": \"芬蘭語\",\n        \"french\": \"法語\",\n        \"georgian\": \"喬治亞語\",\n        \"german\": \"德語\",\n        \"greek\": \"希臘語\",\n        \"gujarati\": \"古吉拉特語\",\n        \"hebrew\": \"希伯來語\",\n        \"hindi\": \"印地語\",\n        \"hmong\": \"苗語\",\n        \"hungarian\": \"匈牙利語\",\n        \"icelandic\": \"冰島語\",\n        \"indonesian\": \"印尼語\",\n        \"irish\": \"愛爾蘭語\",\n        \"italian\": \"義大利語\",\n        \"japanese\": \"日語\",\n        \"javanese\": \"爪哇語\",\n        \"kannada\": \"卡納達語\",\n        \"kazakh\": \"哈薩克語\",\n        \"khmer\": \"高棉語\",\n        \"korean\": \"韓語\",\n        \"kurdish\": \"庫爾德語\",\n        \"ladino\": \"猶太西班牙語\",\n        \"lao\": \"寮國語\",\n        \"latin\": \"拉丁語\",\n        \"latvian\": \"拉脫維亞語\",\n        \"marathi\": \"馬拉地語\",\n        \"mongolian\": \"蒙古語\",\n        \"ndebele\": \"恩德貝萊語\",\n        \"nepali\": \"尼泊爾語\",\n        \"norwegian\": \"挪威語\",\n        \"oromo\": \"奧羅莫語\",\n        \"papiamento\": \"帕皮阿門託語\",\n        \"pashto\": \"普什圖語\",\n        \"persian\": \"波斯語\",\n        \"polish\": \"波蘭語\",\n        \"portuguese\": \"葡萄牙語\",\n        \"punjabi\": \"旁遮普語\",\n        \"romanian\": \"羅馬尼亞語\",\n        \"russian\": \"俄語\",\n        \"sango\": \"桑戈語\",\n        \"sanskrit\": \"梵語\",\n        \"serbian\": \"塞爾維亞語\",\n        \"shona\": \"紹納語\",\n        \"slovak\": \"斯洛伐克語\",\n        \"slovenian\": \"斯洛維尼亞語\",\n        \"somali\": \"索馬利亞語\",\n        \"spanish\": \"西班牙語\",\n        \"swahili\": \"斯瓦希里語\",\n        \"swedish\": \"瑞典語\",\n        \"tagalog\": \"他加祿語\",\n        \"tamil\": \"泰米爾語\",\n        \"telugu\": \"泰盧固語\",\n        \"thai\": \"泰語\",\n        \"tibetan\": \"藏語\",\n        \"tigrinya\": \"提格雷尼亞語\",\n        \"turkish\": \"土耳其語\",\n        \"ukrainian\": \"烏克蘭語\",\n        \"urdu\": \"烏爾都語\",\n        \"vietnamese\": \"越南語\",\n        \"welsh\": \"威爾士語\",\n        \"yiddish\": \"意第緒語\",\n        \"zulu\": \"祖魯語\",\n        \"speechless\": \"無語言\",\n        \"text cleaned\": \"文字清除\",\n        \"translated\": \"翻譯\",\n        \"rewrite\": \"改寫\"\n    },\n    \"parody\": {\n        \"86\": \"86 -不存在的战区-\",\n        \"300\": \"300\",\n        \"original\": \"原创\",\n        \"touhou project\": \"东方Project\",\n        \"moetan\": \"萌单✏️\",\n        \"kanon\": \"Kanon❄\",\n        \"air\": \"AIR🕊\",\n        \"clannad\": \"CLANNAD👪\",\n        \"angel beats\": \"Angel Beats!❤\",\n        \"charlotte\": \"Charlotte🌠\",\n        \"little busters\": \"Little Busters!⚾🐈\",\n        \"rewrite\": \"Rewrite\",\n        \"ore no imouto ga konna ni kawaii wake ga nai\": \"我的妹妹不可能那么可爱\",\n        \"kantai collection\": \"舰队Collection\",\n        \"pokemon\": \"精灵宝可梦\",\n        \"higurashi no naku koro ni\": \"寒蝉鸣泣之时🔪\",\n        \"saki\": \"天才麻将少女🀄️\",\n        \"puella magi madoka magica\": \"魔法少女小圆\",\n        \"puella magi madoka magica side story magia record\": \"魔法纪录 魔法少女小圆外传\",\n        \"toradora\": \"龙与虎\",\n        \"lotte no omocha\": \"露蒂的玩具\",\n        \"sword art online\": \"刀剑神域\",\n        \"sword art online alternative gun gale online\": \"刀剑神域外传Gun Gale Online\",\n        \"to love-ru\": \"出包王女\",\n        \"ro-kyu-bu\": \"萝球社🏀\",\n        \"tantei opera milky holmes\": \"侦探歌剧 少女福尔摩斯🔎\",\n        \"hyperdimension neptunia\": \"超次元游戏：海王星🎮\",\n        \"love live\": \"LoveLive! School idol project\",\n        \"love live sunshine\": \"Love Live! Sunshine!!\",\n        \"love live nijigasaki high school idol club\": \"LoveLive!虹咲学园学园偶像同好会\",\n        \"sora no otoshimono\": \"天降之物\",\n        \"boku wa tomodachi ga sukunai\": \"我的朋友很少\",\n        \"vocaloid\": \"VOCALOID\",\n        \"voiceroid\": \"VOICEROID\",\n        \"date a live\": \"约会大作战\",\n        \"the idolmaster\": \"偶像大师\",\n        \"my little pony friendship is magic\": \"小马宝莉：友谊就是魔法🐎\",\n        \"himouto umaru-chan\": \"干物妹！小埋\",\n        \"bakemonogatari\": \"化物语\",\n        \"yahari ore no seishun love come wa machigatteiru\": \"我的青春恋爱物语果然有问题\",\n        \"tengen toppa gurren lagann\": \"天元突破\",\n        \"cardcaptor sakura\": \"魔卡少女樱\",\n        \"mayoi neko overrun\": \"迷途猫OverRun\",\n        \"outbreak company\": \"萌萌侵略者\",\n        \"kyoukai no kanata\": \"境界的彼方\",\n        \"hataraku maou-sama\": \"打工吧！魔王大人\",\n        \"haiyore nyaruko-san\": \"潜行吧！奈亚子\",\n        \"hentai ouji to warawanai neko\": \"变态王子与不笑猫\",\n        \"nagi no asukara\": \"来自风平浪静的明天\",\n        \"sekai seifuku bouryaku no zvezda\": \"世界征服～谋略之星～\",\n        \"no game no life\": \"游戏人生\",\n        \"barakamon\": \"元气囝仔\",\n        \"divine gate\": \"神圣之门\",\n        \"sayonara zetsubou sensei\": \"再见！绝望先生\",\n        \"highschool of the dead\": \"学园默示录\",\n        \"gakkou gurashi\": \"学园孤岛\",\n        \"a channel\": \"A频道\",\n        \"granblue fantasy\": \"碧蓝幻想\",\n        \"gundam\": \"高达\",\n        \"gundam age\": \"机动战士高达AGE\",\n        \"gundam 00\": \"机动战士高达00\",\n        \"gundam 0080\": \"机动战士高达0080 口袋里的战争\",\n        \"gundam 0083\": \"机动战士高达0083 星尘回忆录\",\n        \"gundam unicorn\": \"机动战士高达UC\",\n        \"gundam f91\": \"机动战士高达F91\",\n        \"gundam seed\": \"机动战士高达SEED\",\n        \"gundam seed destiny\": \"机动战士高达SEED DESTINY\",\n        \"gundam zz\": \"机动战士高达ZZ\",\n        \"mobile suit gundam\": \"机动战士高达\",\n        \"mobile suit gundam lost war chronicles\": \"机动战士高达战记 Lost War Chronicles\",\n        \"mobile suit gundam tekketsu no orphans\": \"机动战士高达 铁血的孤儿\",\n        \"gundam wing\": \"新机动战记高达W\",\n        \"gundam build fighters\": \"高达创战者\",\n        \"gundam build fighters try\": \"高达创战者TRY\",\n        \"gundam build divers\": \"高达创形者\",\n        \"gundam g no reconguista\": \"高达G之复国运动\",\n        \"gundam x\": \"机动新世纪高达X\",\n        \"victory gundam\": \"机动战士V高达\",\n        \"zeta gundam\": \"机动战士Z高达\",\n        \"g gundam\": \"机动武斗传G高达\",\n        \"turn a gundam\": \"∀高达\",\n        \"kiniro mosaic\": \"黄金拼图\",\n        \"gochuumon wa usagi desu ka\": \"请问您今天要来点兔子吗？\",\n        \"non non biyori\": \"悠哉日常大王\",\n        \"oda nobuna no yabou\": \"织田信奈的野望\",\n        \"tamako market\": \"玉子市场\",\n        \"yama no susume\": \"向山进发\",\n        \"pripara\": \"美妙天堂\",\n        \"sora no method\": \"天体的秩序\",\n        \"accel world\": \"加速世界\",\n        \"dungeon ni deai o motomeru no wa machigatteiru darou ka\": \"在地下城寻求邂逅是否搞错了什么\",\n        \"c cube\": \"C³-魔方少女-\",\n        \"shingeki no kyojin\": \"进击的巨人\",\n        \"onidere\": \"鬼骄\",\n        \"infinite stratos\": \"无限斯特拉托斯\",\n        \"disgaea\": \"魔界战记\",\n        \"chuunibyou demo koi ga shitai\": \"中二病也要谈恋爱！\",\n        \"ano hi mita hana no namae wo bokutachi wa mada shiranai\": \"我们仍未知道那天所看见的花的名字。\",\n        \"amagi brilliant park\": \"甘城光辉游乐园\",\n        \"hidan no aria\": \"绯弹的亚莉亚🔫\",\n        \"steinsgate\": \"命运石之门\",\n        \"lucky star\": \"幸运☆星\",\n        \"zero no tsukaima\": \"零之使魔\",\n        \"shakugan no shana\": \"灼眼的夏娜\",\n        \"the melancholy of haruhi suzumiya\": \"凉宫春日的忧郁\",\n        \"kannagi\": \"神薙\",\n        \"kashimashi\": \"女生爱女生\",\n        \"to heart\": \"ToHeart\",\n        \"toheart2\": \"ToHeart2\",\n        \"k-on\": \"轻音少女\",\n        \"he is my master\": \"我的主人\",\n        \"code geass\": \"叛逆的鲁鲁修\",\n        \"naruto\": \"火影忍者\",\n        \"school rumble\": \"校园迷糊大王\",\n        \"mahou sensei negima\": \"魔法老师\",\n        \"uq holder\": \"悠久持有者！\",\n        \"neon genesis evangelion\": \"新世纪福音战士\",\n        \"hidamari sketch\": \"向阳素描\",\n        \"mahou shoujo lyrical nanoha\": \"魔法少女奈叶\",\n        \"rosario vampire\": \"十字架与吸血鬼\",\n        \"pretty cure\": \"光之美少女\",\n        \"futari wa pretty cure\": \"光之美少女\",\n        \"futari wa precure splash star\": \"光之美少女 Splash Star\",\n        \"yes precure 5\": \"Yes! 光之美少女5\",\n        \"fresh precure\": \"光之美少女：幸福精灵\",\n        \"heartcatch precure\": \"光之美少女：甜蜜天使！\",\n        \"suite precure\": \"光之美少女：美乐天使\",\n        \"smile precure\": \"Smile 光之美少女！\",\n        \"dokidoki precure\": \"心跳！光之美少女\",\n        \"happinesscharge precure\": \"幸福爆发 光之美少女！\",\n        \"go princess precure\": \"Go! 公主 光之美少女\",\n        \"maho girls precure\": \"魔法使 光之美少女！\",\n        \"kirakira precure a la mode\": \"光之美少女：食尚甜心\",\n        \"hugtto precure\": \"拥抱！光之美少女\",\n        \"star twinkle precure\": \"星光闪亮☆光之美少女\",\n        \"jojos bizarre adventure\": \"JOJO的奇妙冒险\",\n        \"pangya\": \"魔法飞球\",\n        \"shokugeki no soma\": \"食戟之灵\",\n        \"working\": \"迷糊餐厅🍴\",\n        \"kono subarashii sekai ni syukufuku o\": \"为美好的世界献上祝福！\",\n        \"ore no kanojo to osananajimi ga shuraba sugiru\": \"我女友与青梅竹马的惨烈修罗场\",\n        \"ore no nounai sentakushi ga gakuen love comedy wo zenryoku de jama shiteiru\": \"我的脑内恋碍选项\",\n        \"overwatch\": \"守望先锋\",\n        \"halo\": \"光环\",\n        \"mass effect\": \"质量效应\",\n        \"half-life\": \"半衰期\",\n        \"portal\": \"传送门\",\n        \"the witcher\": \"巫师\",\n        \"the elder scrolls\": \"上古卷轴\",\n        \"defense of the ancients\": \"刀塔\",\n        \"re zero kara hajimeru isekai seikatsu\": \"Re：从零开始的异世界生活\",\n        \"saenai heroine no sodatekata\": \"路人女主的养成方法\",\n        \"koihime musou\": \"恋姬†无双\",\n        \"senran kagura\": \"闪乱神乐\",\n        \"kobayashi-san-chi no maid dragon\": \"小林家的龙女仆\",\n        \"new game\": \"NEW GAME!\",\n        \"shirobako\": \"白箱\",\n        \"girlish number\": \"少女编号\",\n        \"gabriel dropout\": \"珈百璃的堕落\",\n        \"chobits\": \"人形电脑天使心\",\n        \"dead or alive\": \"死或生\",\n        \"eromanga sensei\": \"埃罗芒阿老师\",\n        \"dorei to no seikatsu\": \"与奴隶的生活 -Teaching Feeling-\",\n        \"girls und panzer\": \"少女与战车\",\n        \"seto no hanayome\": \"濑户的花嫁\",\n        \"brave witches\": \"无畏魔女\",\n        \"strike witches\": \"强袭魔女\",\n        \"kemono friends\": \"兽娘动物园\",\n        \"league of legends\": \"英雄联盟\",\n        \"kill la kill\": \"斩服少女\",\n        \"dagashi kashi\": \"粗点心战争\",\n        \"street fighter\": \"街头霸王\",\n        \"fate grand order\": \"Fate/Grand Order\",\n        \"fate stay night\": \"Fate/stay night\",\n        \"fate apocrypha\": \"Fate/Apocrypha\",\n        \"fate zero\": \"Fate/Zero\",\n        \"fate hollow ataraxia\": \"Fate/hollow ataraxia\",\n        \"fate extra\": \"Fate/EXTRA\",\n        \"fate kaleid liner prisma illya\": \"Fate/kaleid liner 魔法少女☆伊莉雅\",\n        \"mahou tsukai no yoru\": \"魔法使之夜\",\n        \"kara no kyoukai\": \"空之境界\",\n        \"canaan\": \"迦南\",\n        \"tsukihime\": \"月姬\",\n        \"kimi no na wa.\": \"你的名字。\",\n        \"mashiro iro symphony\": \"纯白交响曲\",\n        \"dragon quest\": \"勇者斗恶龙\",\n        \"dragon quest i\": \"勇者斗恶龙I\",\n        \"dragon quest ii\": \"勇者斗恶龙II 恶灵的众神\",\n        \"dragon quest iii\": \"勇者斗恶龙III 传说的开始\",\n        \"dragon quest iv\": \"勇者斗恶龙IV 被引导的人们\",\n        \"dragon quest v\": \"勇者斗恶龙V 天空的新娘\",\n        \"dragon quest vi\": \"勇者斗恶龙VI 幻之大地\",\n        \"dragon quest vii\": \"勇者斗恶龙VII 伊甸的战士们\",\n        \"dragon quest viii\": \"勇者斗恶龙VIII 天空、碧海、大地与被诅咒的公主\",\n        \"dragon quest ix\": \"勇者斗恶龙IX 星空的守护者\",\n        \"dragon quest x\": \"勇者斗恶龙X 觉醒的五种族 Online\",\n        \"dragon quest xi\": \"勇者斗恶龙XI 追寻逝去的时光\",\n        \"dragon quest dai no daibouken\": \"勇者斗恶龙 达尔大冒险\",\n        \"dragon quest monsters\": \"勇者斗恶龙怪兽篇\",\n        \"dragon quest yuusha abel densetsu\": \"勇者斗恶龙 勇者阿贝尔传说\",\n        \"dragon quest heroes\": \"勇者斗恶龙 英雄\",\n        \"left 4 dead\": \"求生之路\",\n        \"bloodrayne\": \"吸血莱恩\",\n        \"star wars\": \"星球大战\",\n        \"shin megami tensei\": \"真·女神转生\",\n        \"shin megami tensei devil children\": \"真·女神转生 恶魔之子\",\n        \"devil survivor\": \"女神异闻录 恶魔幸存者\",\n        \"persona\": \"女神异闻录\",\n        \"persona 2\": \"女神异闻录2\",\n        \"persona 3\": \"女神异闻录3\",\n        \"persona 4\": \"女神异闻录4\",\n        \"persona 5\": \"女神异闻录5\",\n        \"monsters inc.\": \"怪兽电力公司\",\n        \"hai to gensou no grimgar\": \"灰与幻想的格林姆迦尔\",\n        \"pretty rhythm\": \"美妙旋律\",\n        \"mamono musume zukan\": \"魔物娘图鉴\",\n        \"getsuyoubi no tawawa\": \"星期一的丰满\",\n        \"phantasy star\": \"梦幻之星\",\n        \"phantasy star 2\": \"梦幻之星II 不归的终点\",\n        \"phantasy star online\": \"梦幻之星Online\",\n        \"phantasy star online 2\": \"梦幻之星Online 2\",\n        \"phantasy star portable 2\": \"梦幻之星：携带版2\",\n        \"phantasy star universe\": \"梦幻之星 宇宙\",\n        \"phantasy star zero\": \"梦幻之星ZERO\",\n        \"arms\": \"ARMS\",\n        \"astro boy\": \"铁臂阿童木\",\n        \"detective conan\": \"名侦探柯南\",\n        \"ore twintail ni narimasu.\": \"我，要成为双马尾\",\n        \"kiss x sis\": \"亲吻姐姐\",\n        \"kimikiss\": \"君吻\",\n        \"super sonico\": \"超级索尼子\",\n        \"final fantasy\": \"最终幻想\",\n        \"final fantasy ii\": \"最终幻想II\",\n        \"final fantasy iii\": \"最终幻想III\",\n        \"final fantasy iv\": \"最终幻想IV\",\n        \"final fantasy v\": \"最终幻想V\",\n        \"final fantasy vi\": \"最终幻想VI\",\n        \"final fantasy vii\": \"最终幻想VII\",\n        \"final fantasy viii\": \"最终幻想VIII\",\n        \"final fantasy ix\": \"最终幻想IX\",\n        \"final fantasy x\": \"最终幻想X\",\n        \"final fantasy x-2\": \"最终幻想X-2\",\n        \"final fantasy xi\": \"最终幻想XI\",\n        \"final fantasy xii\": \"最终幻想XII\",\n        \"final fantasy xiii\": \"最终幻想XIII\",\n        \"final fantasy xiv\": \"最终幻想XIV\",\n        \"final fantasy xv\": \"最终幻想XV\",\n        \"final fantasy crystal chronicles\": \"最终幻想水晶编年史\",\n        \"final fantasy tactics\": \"最终幻想战略版\",\n        \"final fantasy tactics advance\": \"最终幻想战略版Advance\",\n        \"dissidia final fantasy\": \"最终幻想大乱斗\",\n        \"final fantasy unlimited\": \"最终幻想：无限\",\n        \"final fantasy type-0\": \"最终幻想 零式\",\n        \"kill me baby\": \"爱杀宝贝\",\n        \"shinryaku ika musume\": \"侵略！乌贼娘\",\n        \"one piece\": \"海贼王\",\n        \"dragon ball\": \"龙珠\",\n        \"dragon ball z\": \"龙珠Z\",\n        \"dragon ball gt\": \"龙珠GT\",\n        \"dragon ball super\": \"龙珠超\",\n        \"sakurasou no pet na kanojo\": \"樱花庄的宠物女孩\",\n        \"myriad colors phantom world\": \"无彩限的怪灵世界\",\n        \"soul eater\": \"噬魂师\",\n        \"urara meirochou\": \"Urara迷路帖\",\n        \"ranma 12\": \"乱马½\",\n        \"yosuga no sora\": \"缘之空\",\n        \"fire emblem if\": \"火焰之纹章 if\",\n        \"fire emblem\": \"火焰之纹章\",\n        \"fire emblem awakening\": \"火焰之纹章 觉醒\",\n        \"fire emblem gaiden\": \"火焰之纹章外传\",\n        \"fire emblem seisen no keifu\": \"火焰之纹章 圣战之系谱\",\n        \"fire emblem thracia 776\": \"火焰之纹章 多拉基亚776\",\n        \"fire emblem fuuin no tsurugi\": \"火焰之纹章 封印之剑\",\n        \"fire emblem rekka no ken\": \"火焰之纹章 烈火之剑\",\n        \"fire emblem the sacred stones\": \"火焰之纹章 圣魔之光石\",\n        \"fire emblem path of radiance\": \"火焰之纹章 苍炎之轨迹\",\n        \"fire emblem radiant dawn\": \"火焰之纹章 晓之女神\",\n        \"fire emblem mystery of the emblem\": \"火焰之纹章 纹章之谜\",\n        \"fire emblem heroes\": \"火焰之纹章 英雄\",\n        \"gintama\": \"银魂\",\n        \"panty and stocking with garterbelt\": \"吊带袜天使\",\n        \"kamen rider\": \"假面骑士\",\n        \"kamen rider decade\": \"假面骑士Decade\",\n        \"kamen rider amazon\": \"假面骑士亚马逊\",\n        \"kamen rider wizard\": \"假面骑士Wizard\",\n        \"kamen rider drive\": \"假面骑士Drive\",\n        \"kamen rider ex-aid\": \"假面骑士EX-AID\",\n        \"kamen rider w\": \"假面骑士W\",\n        \"kamen rider hibiki\": \"假面骑士响鬼\",\n        \"kamen rider kabuto\": \"假面骑士Kabuto\",\n        \"kamen rider den-o\": \"假面骑士电王\",\n        \"kamen rider fourze\": \"假面骑士Fourze\",\n        \"kamen rider ooo\": \"假面骑士OOO\",\n        \"kaiji\": \"赌博默示录\",\n        \"my hero academia\": \"我的英雄学院\",\n        \"shinmai maou no testament\": \"新妹魔王的契约者\",\n        \"youjo senki\": \"幼女战记\",\n        \"touken ranbu\": \"刀剑乱舞\",\n        \"teen titans\": \"少年泰坦\",\n        \"undertale\": \"传说之下\",\n        \"five nights at freddys\": \"在弗雷迪的五个夜晚\",\n        \"one punch man\": \"一拳超人\",\n        \"black rock shooter\": \"黑岩射手\",\n        \"dragons crown\": \"龙之皇冠\",\n        \"noir\": \"黑街二人组\",\n        \"guilty crown\": \"罪恶王冠\",\n        \"nana\": \"娜娜\",\n        \"nier\": \"尼尔\",\n        \"nier automata\": \"尼尔：机械纪元\",\n        \"psycho-pass\": \"心理测量者\",\n        \"ben 10\": \"少年骇客\",\n        \"hey arnold\": \"嘿，阿诺德！\",\n        \"bungou stray dogs\": \"文豪Stray Dogs\",\n        \"gugure kokkuri-san\": \"银仙\",\n        \"zootopia\": \"疯狂动物城\",\n        \"umineko no naku koro ni\": \"海猫鸣泣之时\",\n        \"ah my goddess\": \"我的女神\",\n        \"denpa onna to seishun otoko\": \"电波女与青春男\",\n        \"mirai nikki\": \"未来日记\",\n        \"oshiete galko-chan\": \"告诉我！辣妹子酱\",\n        \"eureka 7\": \"交响诗篇\",\n        \"darkstalkers\": \"恶魔战士\",\n        \"x-men\": \"X战警\",\n        \"x-men evolution\": \"X战警：进化\",\n        \"ichigo 100\": \"草莓100%\",\n        \"tonari no kaibutsu-kun\": \"邻座的怪同学\",\n        \"danganronpa\": \"弹丸论破\",\n        \"koutetsujou no kabaneri\": \"甲铁城的卡巴内利\",\n        \"yu-gi-oh\": \"游戏王\",\n        \"yu-gi-oh 5ds\": \"游戏王5D's\",\n        \"yu-gi-oh zexal\": \"游戏王ZEXAL\",\n        \"yu-gi-oh arc-v\": \"游戏王ARC-V\",\n        \"yu-gi-oh gx\": \"游戏王－怪兽之决斗GX\",\n        \"yu-gi-oh vrains\": \"游戏王VRAINS\",\n        \"kimi ni todoke\": \"好想告诉你\",\n        \"akatsuki no yona\": \"晨曦公主\",\n        \"onii-chan dakedo ai sae areba kankeinai yo ne\": \"就算是哥哥，有爱就没问题了，对吧\",\n        \"oniichan no koto nanka zenzen suki janain dakara ne\": \"腹黑妹妹控兄记!!\",\n        \"sora no woto\": \"空之音\",\n        \"occult academy\": \"世纪末超自然学院\",\n        \"gatchaman crowds\": \"科学小飞侠Crowds\",\n        \"saya no uta\": \"沙耶之歌\",\n        \"vividred operation\": \"绯色战姬\",\n        \"kodomo no jikan\": \"萝莉的时间\",\n        \"shuffle\": \"Shuffle!\",\n        \"power rangers\": \"超能战士\",\n        \"rune soldier\": \"魔法战士李维\",\n        \"kirby\": \"星之卡比\",\n        \"sakura quest\": \"樱花任务\",\n        \"aldnoah.zero\": \"ALDNOAH.ZERO\",\n        \"maoyuu maou yuusha\": \"魔王勇者\",\n        \"splatoon\": \"喷射战士\",\n        \"prunus girl\": \"樱桃少女\",\n        \"king of fighters\": \"拳皇\",\n        \"love plus\": \"爱相随\",\n        \"love hina\": \"纯情房东俏房客\",\n        \"akagami no shirayukihime\": \"赤发的白雪姬\",\n        \"minami-ke\": \"南家三姐妹\",\n        \"queens blade\": \"女王之刃\",\n        \"sekirei\": \"鹡鸰女神\",\n        \"yuuki yuuna wa yuusha de aru\": \"结城友奈是勇者\",\n        \"blazblue\": \"苍翼默示录\",\n        \"frame arms girl\": \"机甲少女\",\n        \"busou shinki\": \"武装神姬\",\n        \"bayonetta\": \"猎天使魔女\",\n        \"devil may cry\": \"鬼泣\",\n        \"tekken\": \"铁拳\",\n        \"super mario brothers\": \"超级马力欧兄弟\",\n        \"spider-man\": \"蜘蛛侠\",\n        \"gunsmith cats\": \"猫眼女枪手\",\n        \"puzzle and dragons\": \"智龙迷城\",\n        \"senki zesshou symphogear\": \"战姬绝唱Symphogear\",\n        \"shaman king\": \"通灵王\",\n        \"gegege no kitarou\": \"怪怪怪的鬼太郎\",\n        \"marmalade boy\": \"橘子酱男孩\",\n        \"esper mami\": \"超能力魔美\",\n        \"fushigi no umi no nadia\": \"蓝宝石之谜\",\n        \"martian successor nadesico\": \"机动战舰抚子\",\n        \"kino no tabi\": \"奇诺之旅\",\n        \"infinite ryvius\": \"无限的未知\",\n        \"machine robo\": \"天威勇士\",\n        \"rage of bahamut\": \"巴哈姆特之怒\",\n        \"kono naka ni hitori imouto ga iru\": \"其中1个是妹妹\",\n        \"sailor moon\": \"美少女战士\",\n        \"dog days\": \"犬勇者物语\",\n        \"onegai teacher\": \"拜托了☆老师\",\n        \"onegai twins\": \"拜托了☆双子星\",\n        \"rinne no lagrange\": \"轮回的拉格朗日\",\n        \"monster musume no iru nichijou\": \"魔物娘的相伴日常\",\n        \"black lagoon\": \"黑礁\",\n        \"steven universe\": \"史帝芬宇宙\",\n        \"the legend of zelda\": \"塞尔达传说\",\n        \"totally spies\": \"少女特工组\",\n        \"the legend of korra\": \"科拉传奇\",\n        \"kangoku senkan\": \"监狱战舰\",\n        \"prison school\": \"监狱学园\",\n        \"macross\": \"超时空要塞\",\n        \"the super dimension fortress macross\": \"超时空要塞Macross\",\n        \"macross 7\": \"超时空要塞7\",\n        \"macross frontier\": \"超时空要塞F\",\n        \"macross plus\": \"超时空要塞Plus\",\n        \"macross delta\": \"超时空要塞Δ\",\n        \"macross vf-x\": \"超时空要塞VF-X\",\n        \"little red riding hood\": \"小红帽\",\n        \"gekkan shoujo nozaki-kun\": \"月刊少女野崎君\",\n        \"girl friend beta\": \"临时女友\",\n        \"bakuman\": \"食梦者\",\n        \"nisekoi\": \"伪恋\",\n        \"blade and soul\": \"剑灵\",\n        \"inu x boku ss\": \"妖狐×仆SS\",\n        \"guilty gear\": \"罪恶装备\",\n        \"nanatsu no taizai\": \"七大罪\",\n        \"starcraft\": \"星际争霸\",\n        \"alice in wonderland\": \"爱丽丝梦游仙境\",\n        \"ikkitousen\": \"一骑当千\",\n        \"g.i. joe\": \"特种部队\",\n        \"metroid\": \"银河战士\",\n        \"metal gear solid\": \"合金装备\",\n        \"tomb raider\": \"古墓丽影\",\n        \"xena warrior princess\": \"战士公主西娜\",\n        \"the fifth element\": \"第五元素\",\n        \"terminator\": \"终结者\",\n        \"yurikuma arashi\": \"百合熊风暴\",\n        \"adventure time\": \"探险时光\",\n        \"strike the blood\": \"噬血狂袭\",\n        \"valkyrie drive\": \"女武神驱动\",\n        \"saber marionette\": \"机械女神\",\n        \"dance with devils\": \"与魔共舞\",\n        \"samurai 7\": \"七武士\",\n        \"samurai jack\": \"杰克武士\",\n        \"samurai deeper kyo\": \"鬼眼狂刀\",\n        \"samurai pizza cats\": \"功夫猫党\",\n        \"samurai spirits\": \"侍魂\",\n        \"hyakka ryouran samurai girls\": \"百花缭乱 武士少女\",\n        \"samurai champloo\": \"混沌武士\",\n        \"afro samurai\": \"爆炸头武士\",\n        \"samurai sentai shinkenger\": \"侍战队真剑者\",\n        \"samurai flamenco\": \"武士弗拉明戈\",\n        \"onechambara bikini samurai squad\": \"忌血的继承者\",\n        \"samurai warriors\": \"战国无双\",\n        \"dynasty warriors\": \"真·三国无双\",\n        \"demons souls\": \"恶魔之魂\",\n        \"seiken densetsu\": \"圣剑传说\",\n        \"seiken densetsu 3\": \"圣剑传说3\",\n        \"kore wa zombie desu ka\": \"这个是僵尸吗？\",\n        \"ojamajo doremi\": \"小魔女DoReMi\",\n        \"terra formars\": \"火星异种\",\n        \"spirited away\": \"千与千寻\",\n        \"el hazard\": \"神秘的世界\",\n        \"langrisser\": \"梦幻模拟战\",\n        \"slayers\": \"秀逗魔导士\",\n        \"grendizer\": \"UFO机器人 古连泰沙\",\n        \"keroro gunsou\": \"Keroro军曹\",\n        \"sakura taisen\": \"樱花大战\",\n        \"saint seiya\": \"圣斗士星矢\",\n        \"agent aika\": \"海底娇娃蓝华\",\n        \"city hunter\": \"城市猎人\",\n        \"super robot wars\": \"超级机器人大战\",\n        \"super robot wars w\": \"超级机器人大战W\",\n        \"super robot wars k\": \"超级机器人大战K\",\n        \"super robot wars z 2nd\": \"第2次超级机器人大战Z\",\n        \"endless frontier\": \"无限边界：超级机器人大战OG传说\",\n        \"hellsing\": \"地狱之歌\",\n        \"super black jack\": \"兔女郎的诱惑\",\n        \"hell teacher nube\": \"地狱老师\",\n        \"hitsugi no chaika\": \"棺姬嘉依卡\",\n        \"kishin douji zenki\": \"鬼神童子\",\n        \"muv-luv\": \"Muv-Luv\",\n        \"muv-luv alternative total eclipse\": \"Muv-Luv Alternative Total eclipse\",\n        \"dangaioh\": \"破邪大星弹劾皇\",\n        \"3x3 eyes\": \"三只眼\",\n        \"bakuretsu hunters\": \"爆走猎人\",\n        \"vampire princess miyu\": \"吸血姬美夕\",\n        \"reco love\": \"真爱记录\",\n        \"spice and wolf\": \"狼与香辛料\",\n        \"youkai watch\": \"妖怪手表\",\n        \"battle programmer shirase\": \"战争程序员白濑\",\n        \"kung fu panda\": \"功夫熊猫\",\n        \"star vs. the forces of evil\": \"星蝶公主\",\n        \"the amazing world of gumball\": \"阿甘妙世界\",\n        \"wakfu\": \"沃土\",\n        \"wander over yonder\": \"宇宙小奇兵\",\n        \"batman\": \"蝙蝠侠\",\n        \"resident evil\": \"生化危机\",\n        \"kim possible\": \"麻辣女孩\",\n        \"jinrui wa suitai shimashita\": \"人类衰退之后\",\n        \"miss machiko\": \"真知子老师\",\n        \"gaogaigar\": \"勇者王\",\n        \"hibike euphonium\": \"吹响！上低音号\",\n        \"ragnarok online\": \"仙境传说\",\n        \"no more heroes\": \"英雄不再\",\n        \"akuma no riddle\": \"恶魔之谜\",\n        \"overlord\": \"不死者之王\",\n        \"full ani\": \"Fullani\",\n        \"full metal panic\": \"全金属狂潮\",\n        \"fullmetal alchemist\": \"钢之炼金术师\",\n        \"full moon o sagashite\": \"寻找满月\",\n        \"full metal daemon muramasa\": \"装甲恶鬼村正\",\n        \"futsuu no joshikousei ga locodol yattemita.\": \"普通女高中生要做当地偶像\",\n        \"fallout\": \"辐射\",\n        \"fancy lala\": \"梦幻拉拉\",\n        \"final fight\": \"快打旋风\",\n        \"beauty and the beast\": \"美女与野兽\",\n        \"baka to test to shoukanjuu\": \"笨蛋测验召唤兽\",\n        \"arcana heart\": \"圣灵之心\",\n        \"heroman\": \"HEROMAN\",\n        \"anyamaru tantei kiruminzoo\": \"动物侦探奇鲁米\",\n        \"kyoukai senjou no horizon\": \"境界线上的地平线\",\n        \"rwby\": \"RWBY\",\n        \"lupin iii\": \"鲁邦三世\",\n        \"ensemble stars\": \"偶像梦幻祭\",\n        \"ajin\": \"亚人\",\n        \"kingdom hearts\": \"王国之心\",\n        \"tobaku haouden zero\": \"赌博霸王传 零\",\n        \"kannazuki no miko\": \"神无月的巫女\",\n        \"haikyuu\": \"排球少年!!\",\n        \"free\": \"Free! 男子游泳部\",\n        \"itsuka tenma no kuro usagi\": \"曾几何时天魔的黑兔\",\n        \"magic knight rayearth\": \"魔法骑士雷亚斯\",\n        \"kochikame\": \"乌龙派出所\",\n        \"bakusou kyoudai lets and go\": \"四驱兄弟\",\n        \"the powerpuff girls\": \"飞天小女警\",\n        \"powerpuff girls z\": \"飞天小女警Z\",\n        \"omoikkiri kagaku adventure sou nanda\": \"充满干劲十足的科学冒险—神秘智慧石\",\n        \"wedding peach\": \"爱天使传说 婚纱桃子\",\n        \"fushigiboshi no futagohime\": \"不可思议星球的☆双胞胎公主\",\n        \"aquarion\": \"创圣的亚库艾里翁\",\n        \"aquarion logos\": \"创圣的亚库艾里翁LOGOS\",\n        \"aquarion evol\": \"创圣的亚库艾里翁EVOL\",\n        \"welcome to the n.h.k.\": \"欢迎加入NHK！\",\n        \"sakurako-san no ashimoto ni wa shitai ga umatteiru\": \"樱子小姐的脚下埋着尸体\",\n        \"shimoneta to iu gainen ga sonzai shinai taikutsu na sekai\": \"下流梗不存在的灰暗世界\",\n        \"kyonyuu fantasy\": \"巨乳幻想\",\n        \"puyo puyo\": \"噗哟噗哟\",\n        \"kaku-san-sei million arthur\": \"扩散性百万亚瑟王\",\n        \"genji tsuushin agedama\": \"电脑小奇侠\",\n        \"dennou coil\": \"电脑线圈\",\n        \"god eater\": \"噬神者\",\n        \"demi-chan wa kataritai\": \"亚人酱有话要说\",\n        \"akazukin chacha\": \"小红帽恰恰\",\n        \"idol janshi suchie-pai\": \"美少女雀士\",\n        \"twin angels\": \"淫兽圣战\",\n        \"shadow lady\": \"月光淑女\",\n        \"oboro muramasa\": \"胧村正\",\n        \"zettai bouei leviathan\": \"绝对防卫利维坦\",\n        \"tokimeki memorial\": \"心跳回忆\",\n        \"future card buddyfight\": \"未来卡 搭档对战\",\n        \"fun fun pharmacy\": \"不可思议魔法药店\",\n        \"aiura\": \"校园日记 AIURA\",\n        \"gokujou seitokai\": \"极上学生会\",\n        \"show by rock\": \"Show By Rock!!\",\n        \"star fox\": \"星际火狐\",\n        \"white album\": \"白色相簿❄\",\n        \"tenchi muyo\": \"天地无用！\",\n        \"variable geo\": \"格斗女神\",\n        \"ashita no nadja\": \"明日的娜嘉\",\n        \"goldfish warning\": \"魔力小金鱼\",\n        \"mazinger z\": \"魔神Z\",\n        \"magi the labyrinth of magic\": \"魔笛MAGI\",\n        \"ultraman\": \"奥特曼\",\n        \"we bare bears\": \"咱们裸熊\",\n        \"gravity falls\": \"怪诞小镇\",\n        \"karakai jouzu no takagi-san\": \"擅长捉弄人的高木同学\",\n        \"goshogun\": \"战国魔神豪将军\",\n        \"plawres sanshiro\": \"无敌三四郎\",\n        \"hime-chans ribbon\": \"缎带魔法少女\",\n        \"taimanin asagi\": \"对魔忍阿莎姬\",\n        \"makai kishi ingrid\": \"魔界骑士英格丽德\",\n        \"taimanin yukikaze\": \"对魔忍雪风\",\n        \"kick-ass\": \"海扁王\",\n        \"gad guard\": \"钢铁守护者\",\n        \"tears to tiara\": \"提亚拉之泪\",\n        \"tenshi no inai 12-gatsu\": \"天使不在的12月\",\n        \"comic party\": \"漫画同人会\",\n        \"kizuato\": \"痕\",\n        \"sentimental graffiti\": \"青涩宝贝\",\n        \"bleach\": \"死神\",\n        \"hayate no gotoku\": \"旋风管家\",\n        \"yoake mae yori ruriiro na\": \"更胜黎明前的琉璃色\",\n        \"fortune arterial\": \"FORTUNE ARTERIAL\",\n        \"princess holiday\": \"公主假日 ~回转苹果亭的一千零一夜~\",\n        \"tsuki wa higashi ni hi wa nishi ni\": \"东月西阳\",\n        \"daitoshokan no hitsujikai\": \"大图书馆的牧羊人\",\n        \"aiyoku no eustia\": \"秽翼的尤斯蒂娅\",\n        \"rokka no yuusha\": \"六花的勇者\",\n        \"seiren\": \"清恋\",\n        \"oniisama e...\": \"亲亲天使心\",\n        \"long riders\": \"长骑美眉\",\n        \"flower knight girl\": \"美少女花骑士\",\n        \"mitsudomoe\": \"超元气三姐妹\",\n        \"no-rin\": \"农林\",\n        \"space battleship yamato\": \"宇宙战舰大和号\",\n        \"utawarerumono\": \"传颂之物\",\n        \"utawarerumono itsuwari no kamen\": \"传颂之物 虚伪的假面\",\n        \"highschool dxd\": \"恶魔高校D×D\",\n        \"the world god only knows\": \"只有神知道的世界\",\n        \"mabinogi\": \"洛奇\",\n        \"m.u.g.e.n\": \"MUGEN\",\n        \"summon night\": \"召唤之夜\",\n        \"mai-hime\": \"舞-HiME\",\n        \"mai-otome\": \"舞-乙HiME\",\n        \"hyouka\": \"冰菓\",\n        \"ookami-san to shichinin no nakama-tachi\": \"大神与七位伙伴\",\n        \"machine-doll wa kizutsukanai\": \"机巧少女不会受伤\",\n        \"its not my fault that im not popular\": \"我不受欢迎，怎么想都是你们的错！\",\n        \"mouretsu pirates\": \"迷你裙宇宙海贼\",\n        \"gantz\": \"杀戮都市\",\n        \"angry birds\": \"愤怒的小鸟\",\n        \"zero kara hajimeru mahou no sho\": \"从零开始的魔法书\",\n        \"knights of sidonia\": \"希德尼娅的骑士\",\n        \"sket dance\": \"学园救援团\",\n        \"summer wars\": \"夏日大作战\",\n        \"flcl\": \"特别的她\",\n        \"the girl who leapt through time\": \"穿越时空的少女\",\n        \"inazuma eleven\": \"闪电十一人\",\n        \"battle royale\": \"大逃杀\",\n        \"archaic sealed heat\": \"远古封印之炎\",\n        \"fruits basket\": \"水果篮子\",\n        \"tari tari\": \"TARI TARI\",\n        \"the legend of heroes\": \"英雄传说\",\n        \"the legend of the legendary heroes\": \"传说中勇者的传说\",\n        \"the last of us\": \"最后生还者\",\n        \"wall-e\": \"机器人总动员\",\n        \"alpha teens on machines\": \"A.T.O.M.\",\n        \"tera\": \"神谕之战\",\n        \"digimon\": \"数码宝贝\",\n        \"digimon adventure\": \"数码宝贝大冒险\",\n        \"digimon tamers\": \"数码宝贝03驯兽师之王\",\n        \"digimon frontier\": \"数码宝贝04无限地带\",\n        \"digimon savers\": \"数码宝贝05拯救者\",\n        \"digimon xros wars\": \"数码宝贝06合体战争\",\n        \"digimon universe appli monsters\": \"数码宝贝宇宙-应用怪兽\",\n        \"snow white and the seven dwarfs\": \"白雪公主和七个小矮人\",\n        \"shadowverse\": \"影之诗\",\n        \"eyeshield 21\": \"光速跑者21号\",\n        \"skullgirls\": \"骷髅女孩\",\n        \"the ring\": \"午夜凶铃\",\n        \"the lord of the rings\": \"指环王\",\n        \"the matrix\": \"黑客帝国\",\n        \"evil dead\": \"鬼玩人\",\n        \"from dusk till dawn\": \"杀出个黎明\",\n        \"the sims\": \"模拟人生\",\n        \"the big o\": \"魅影巨神\",\n        \"the lion king\": \"狮子王\",\n        \"frozen\": \"冰雪奇缘\",\n        \"mortal kombat\": \"格斗之王\",\n        \"aladdin\": \"阿拉丁\",\n        \"the little mermaid\": \"小美人鱼\",\n        \"atlantis the lost empire\": \"亚特兰蒂斯：失落的帝国\",\n        \"sengoku otome\": \"战国少女～桃色异传～\",\n        \"monster hunter\": \"怪物猎人\",\n        \"sennen sensou aigis\": \"千年战争Aigis\",\n        \"star ocean 3\": \"星之海洋3\",\n        \"kokoro connect\": \"心灵链环\",\n        \"robopon\": \"机甲宝贝\",\n        \"upotte\": \"枪械少女!!\",\n        \"tokyo mew mew\": \"东京喵喵\",\n        \"mahoromatic\": \"魔力女管家\",\n        \"sister princess\": \"妹妹公主\",\n        \"ace attorney\": \"逆转裁判\",\n        \"tiger and bunny\": \"老虎和兔子\",\n        \"ghost in the shell\": \"攻壳机动队\",\n        \"hunter x hunter\": \"全职猎人\",\n        \"howls moving castle\": \"哈尔的移动城堡\",\n        \"kikis delivery service\": \"魔女宅急便\",\n        \"ace combat\": \"皇牌空战\",\n        \"mermaid melody pichi pichi pitch\": \"人鱼的旋律\",\n        \"attack no. 1\": \"女排No.1\",\n        \"devilman\": \"恶魔人\",\n        \"la seine no hoshi\": \"月光女侠\",\n        \"winx club\": \"魔法俏佳人\",\n        \"cats eye\": \"猫眼三姐妹\",\n        \"transformers\": \"变形金刚\",\n        \"high school fleet\": \"高校舰队\",\n        \"shinmai fukei kiruko-san\": \"新人女警斩子小姐\",\n        \"how to train your dragon\": \"驯龙高手\",\n        \"hacka doll\": \"骇客娃娃\",\n        \"kaiju girls\": \"怪兽娘\",\n        \"shinrabansho\": \"神罗万象\",\n        \"azumanga daioh\": \"阿滋漫画大王\",\n        \"galaxy fight\": \"银河快打\",\n        \"youkai hyakkitan\": \"妖怪百姬谭\",\n        \"papa no iu koto wo kikinasai\": \"要听爸爸的话！\",\n        \"himegoto\": \"搞姬日常\",\n        \"nogizaka haruka no himitsu\": \"乃木坂春香的秘密\",\n        \"south park\": \"南方公园\",\n        \"soushin shoujo matoi\": \"装神少女小缠\",\n        \"kindaichi shounen no jikenbo\": \"金田一少年事件簿\",\n        \"kekkai sensen\": \"血界战线\",\n        \"tokyo afterschool summoners\": \"东京放课后召唤师\",\n        \"saga frontier\": \"沙加开拓者\",\n        \"twelve kingdoms\": \"十二国记\",\n        \"atelier series\": \"炼金工作室\",\n        \"atelier marie\": \"玛莉的工作室\",\n        \"atelier elie\": \"艾莉的工作室\",\n        \"atelier lilie\": \"莉莉的工作室\",\n        \"atelier judie\": \"尤蒂的工作室\",\n        \"atelier iris\": \"伊莉斯的工作室\",\n        \"mana khemia\": \"玛娜传奇\",\n        \"atelier rorona\": \"罗罗娜的工作室\",\n        \"atelier totori\": \"托托莉的工作室\",\n        \"atelier meruru\": \"梅露露的工作室\",\n        \"atelier ayesha\": \"爱夏的工作室\",\n        \"atelier escha and logy\": \"艾斯卡与罗吉的工作室\",\n        \"atelier shallie\": \"夏莉的工作室\",\n        \"atelier sophie\": \"索菲的工作室\",\n        \"atelier firis\": \"菲莉丝的工作室\",\n        \"atelier lulua\": \"露露亚的工作室\",\n        \"atelier ryza\": \"莱莎的工作室\",\n        \"atelier lina\": \"莉娜的工作室\",\n        \"my neighbor totoro\": \"龙猫\",\n        \"professor layton\": \"雷顿教授\",\n        \"bubblegum crisis\": \"泡泡糖危机\",\n        \"kamikaze kaitou jeanne\": \"神风怪盗贞德\",\n        \"boruto\": \"博人传\",\n        \"kuromukuro\": \"黑骸\",\n        \"minecraft\": \"我的世界\",\n        \"world masterpiece theater\": \"世界名作剧场\",\n        \"the adventures of tom sawyer\": \"汤姆·索亚历险记\",\n        \"les miserables shoujo cosette\": \"悲惨世界 少女珂赛特\",\n        \"lucy of the southern rainbow\": \"南方彩虹的露西\",\n        \"tico of the seven seas\": \"七海的堤可\",\n        \"space adventure cobra\": \"哥布拉传奇\",\n        \"cutey honey\": \"甜心战士\",\n        \"megazone 23\": \"无限地带23\",\n        \"ganbare robocon\": \"加油啊！！小露宝\",\n        \"moero robocon\": \"燃烧吧！！小露宝\",\n        \"rainbow sentai robin\": \"彩虹战队罗宾\",\n        \"remi nobodys girl\": \"无家可归的孩子蕾米\",\n        \"revolutionary girl utena\": \"少女革命\",\n        \"corrector yui\": \"Cyber守护星\",\n        \"steel angel kurumi\": \"钢铁天使胡桃\",\n        \"zoids\": \"ZOIDS\",\n        \"world of warcraft\": \"魔兽世界\",\n        \"diablo\": \"暗黑破坏神\",\n        \"star trek\": \"星际迷航\",\n        \"binan koukou chikyuu bouei-bu love\": \"美男高校地球防卫部LOVE!\",\n        \"asobi ni iku yo\": \"玩伴猫耳娘\",\n        \"assassins creed\": \"刺客信条\",\n        \"peter pan\": \"小飞侠\",\n        \"romeos blue skies\": \"罗密欧的蓝天\",\n        \"3000 leagues in search of mother\": \"三千里寻母记\",\n        \"alps no shoujo heidi\": \"阿尔卑斯山的少女\",\n        \"anne of green gables\": \"绿山墙的安妮\",\n        \"futari no lotte\": \"我与我 两个绿蒂\",\n        \"katri girl of the meadows\": \"牧场上的少女卡特莉\",\n        \"the bush baby\": \"大草原上的小天使 灌丛婴猴\",\n        \"the story of perrine\": \"佩琳物语\",\n        \"dr. slump\": \"阿拉蕾\",\n        \"zettai muteki raijin-oh\": \"绝对无敌\",\n        \"dirty pair\": \"搞怪拍档\",\n        \"ai no wakakusa monogatari\": \"爱的小妇人物语\",\n        \"the story of pollyanna\": \"爱少女波丽安娜物语\",\n        \"princess sarah\": \"小公主莎拉\",\n        \"tobe isami\": \"伊沙米大冒险\",\n        \"doraemon\": \"哆啦A梦\",\n        \"pretty sammy\": \"魔法少女砂沙美\",\n        \"ochame na futago\": \"青葱岁月\",\n        \"miracle girl limit-chan\": \"奇迹少女理美\",\n        \"mahou no yousei persia\": \"魔法妖精贝露莎\",\n        \"minky momo\": \"魔法公主明琪桃子\",\n        \"majokko megu-chan\": \"魔女Megu\",\n        \"creamy mami\": \"我是小甜甜\",\n        \"magical angel sweet mint\": \"欢欢仙子\",\n        \"sally the witch\": \"魔法使莎莉\",\n        \"mahou shoujo lalabel\": \"魔法少女拉拉贝尔\",\n        \"hana no ko lunlun\": \"花仙子\",\n        \"magical emi\": \"魔法之星爱美\",\n        \"floral magician mary bell\": \"俏皮小花仙\",\n        \"mahou tsukai chappy\": \"魔法使恰比\",\n        \"marvelous melmo\": \"神奇糖\",\n        \"pastel yumi\": \"魔法偶像神笔由美\",\n        \"laputa castle in the sky\": \"天空之城\",\n        \"appleseed\": \"苹果核战记\",\n        \"himitsu no akko-chan\": \"亚子的秘密\",\n        \"yawara\": \"以柔克刚\",\n        \"cyborg 009\": \"人造人009\",\n        \"future boy conan\": \"未来少年柯南\",\n        \"muka muka paradise\": \"为食龙少爷\",\n        \"the goose that laid the golden eggs\": \"下金蛋的鹅\",\n        \"andersen monogatari\": \"安徒生童话\",\n        \"cinderella\": \"灰姑娘\",\n        \"k.o. beast\": \"KO世纪三兽士\",\n        \"trapp family story\": \"崔普一家物语\",\n        \"wakakusa monogatari nan to jo-sensei\": \"小妇人物语 南与乔老师\",\n        \"watashi no ashinaga ojisan\": \"长腿叔叔\",\n        \"nurse angel ririka sos\": \"守护天使莉莉佳\",\n        \"youre under arrest\": \"逮捕令\",\n        \"phantom quest corp\": \"幽幻怪社\",\n        \"urusei yatsura\": \"福星小子\",\n        \"attacker you\": \"胜利女排\",\n        \"giant gorg\": \"巨神GORG\",\n        \"gunslinger girl\": \"神枪少女\",\n        \"yu yu hakusho\": \"幽游白书\",\n        \"stella no mahou\": \"斯特拉的魔法\",\n        \"hinako note\": \"雏子的笔记\",\n        \"hoozuki no reitetsu\": \"鬼灯的冷彻\",\n        \"daiya no ace\": \"钻石王牌\",\n        \"durarara\": \"无头骑士异闻录 DuRaRaRa!!\",\n        \"supernatural\": \"邪恶力量\",\n        \"koi to senkyo to chocolate\": \"恋爱与选举与巧克力\",\n        \"goblin slayer\": \"哥布林杀手\",\n        \"dungeon meshi\": \"迷宫饭\",\n        \"kanokon\": \"我的狐仙女友\",\n        \"ladies versus butlers\": \"大小姐×执事！\",\n        \"arpeggio of blue steel\": \"苍蓝钢铁的琶音\",\n        \"maken-ki\": \"魔剑姬！\",\n        \"expelled from paradise\": \"乐园追放 -Expelled from Paradise-\",\n        \"glasslip\": \"玻璃之唇\",\n        \"hanasaku iroha\": \"花开伊吕波\",\n        \"akaneiro ni somaru saka\": \"茜色染红的街道\",\n        \"hoshizora e kakaru hashi\": \"架向星空之桥\",\n        \"gj-bu\": \"GJ部\",\n        \"kaze no yojimbo\": \"旋风之用心棒\",\n        \"kishin taisen gigantic formula\": \"机神大战-巨型方程式\",\n        \".hack\": \".hack\",\n        \".hacksign\": \".hack//SIGN\",\n        \".hackg.u.\": \".hack//G.U.\",\n        \".hackroots\": \".hack//Roots\",\n        \".hacklegend of the twilight\": \".hack//黄昏的腕轮传说\",\n        \"log horizon\": \"记录的地平线\",\n        \"kamisama minarai himitsu no cocotama\": \"见习神明 秘密的COCOTAMA\",\n        \"phantom of inferno\": \"幻灵镇魂曲\",\n        \"dramatical murder\": \"戏剧性谋杀\",\n        \"robotics notes\": \"机器人笔记\",\n        \"rampo kitan game of laplace\": \"乱步奇谭 拉普拉斯的游戏\",\n        \"gravity rush\": \"重力眩晕\",\n        \"cowboy bebop\": \"星际牛仔\",\n        \"wii fit\": \"Wii Fit\",\n        \"uta no prince-sama\": \"歌之王子殿下\",\n        \"hime chen otogi chikku idol lilpri\": \"变身！公主偶像\",\n        \"ib\": \"Ib\",\n        \"ichigo mashimaro\": \"草莓棉花糖\",\n        \"yuusha ni narenakatta ore wa shibushibu shuushoku wo ketsui shimashita.\": \"当不成勇者的我，只好认真找工作了。\",\n        \"chrono crusade\": \"圣枪修女\",\n        \"lost universe\": \"宇宙刑警\",\n        \"amanchu\": \"蓝海少女！\",\n        \"mangaka-san to assistant-san to\": \"漫画家与助手\",\n        \"sisters natsu no saigo no hi\": \"SISTERS～夏最后之日～\",\n        \"tokyo 7th sisters\": \"东京 7th Sisters\",\n        \"7th dragon\": \"第七龙神\",\n        \"project blue earth sos\": \"蓝色计划-地球SOS\",\n        \"sakura hime\": \"樱姬华传\",\n        \"the 3rd birthday\": \"第三次生日\",\n        \"asuka 120\": \"飞鸟120% 燃烧的学园祭\",\n        \"jumping rabbit\": \"小兔飞飞\",\n        \"the fairly oddparents\": \"反斗家族\",\n        \"amagami\": \"圣诞之吻\",\n        \"fosters home for imaginary friends\": \"亲亲麻吉\",\n        \"futurama\": \"飞出个未来\",\n        \"kimi ga yobu megiddo no oka de\": \"你在米吉多之丘的呼唤\",\n        \"kuroko no basuke\": \"黑子的篮球\",\n        \"boku to maou\": \"魔王与我\",\n        \"cerberus\": \"刻耳柏洛斯\",\n        \"robot girls z\": \"机器人少女Z\",\n        \"akibas trip\": \"秋叶原之旅\",\n        \"bravely default\": \"勇气默示录\",\n        \"madan no ou to vanadis\": \"魔弹之王与战姬\",\n        \"star driver\": \"STAR DRIVER 闪亮的塔科特\",\n        \"tales of\": \"传说\",\n        \"tales of phantasia\": \"幻想传说\",\n        \"tales of destiny\": \"宿命传说\",\n        \"tales of eternia\": \"永恒传说\",\n        \"tales of symphonia\": \"仙乐传说\",\n        \"tales of rebirth\": \"重生传说\",\n        \"tales of legendia\": \"遗迹传说\",\n        \"tales of the abyss\": \"深渊传说\",\n        \"tales of innocence\": \"圣洁传说\",\n        \"tales of vesperia\": \"薄暮传说\",\n        \"tales of hearts\": \"心灵传说\",\n        \"tales of graces\": \"圣恩传说\",\n        \"tales of xillia\": \"无尽传说\",\n        \"tales of zestiria\": \"情热传说\",\n        \"tales of berseria\": \"狂战传说\",\n        \"tales of asteria\": \"星彩传说\",\n        \"little witch academia\": \"小魔女学园\",\n        \"rokudenashi majutsu koushi to akashic records\": \"不正经的魔术讲师与禁忌教典\",\n        \"martial champion\": \"武术冠军\",\n        \"virtua fighter\": \"VR战士\",\n        \"muscle bomber\": \"摔跤霸王\",\n        \"aria\": \"水星领航员\",\n        \"rozen maiden\": \"蔷薇少女\",\n        \"soulcalibur\": \"魂之系列\",\n        \"empowered\": \"Empowered\",\n        \"parasite eve\": \"寄生前夜\",\n        \"predator\": \"铁血战士\",\n        \"underworld\": \"黑夜传说\",\n        \"danny phantom\": \"幻影丹尼\",\n        \"the loud house\": \"喧闹一家亲\",\n        \"nodame cantabile\": \"交响情人梦\",\n        \"another\": \"Another\",\n        \"valkyria chronicles\": \"战场女武神\",\n        \"princess lover\": \"公主恋人\",\n        \"witchblade\": \"魔女之刃\",\n        \"warship girls\": \"战舰少女\",\n        \"sexfriend\": \"SEXFRIEND\",\n        \"school days\": \"日在校园\",\n        \"walkure romanze\": \"少女骑士物语\",\n        \"majin bone\": \"魔神之骨\",\n        \"starry sky\": \"Starry☆Sky\",\n        \"amano megumi ha sukidarake\": \"天野惠浑身是破绽！\",\n        \"yowamushi pedal\": \"飚速宅男\",\n        \"black cat\": \"黑猫\",\n        \"superjail\": \"超级监狱\",\n        \"superman\": \"超人\",\n        \"iron man\": \"钢铁侠\",\n        \"iron man armored adventures\": \"钢铁侠：装甲冒险\",\n        \"jackie chan adventures\": \"成龙历险记\",\n        \"avengers\": \"复仇者联盟\",\n        \"monster\": \"怪物\",\n        \"jungle wa itsumo hare nochi guu\": \"热带雨林的爆笑生活\",\n        \"w.i.t.c.h.\": \"魔力W.i.t.c.h.\",\n        \"ninja gaiden\": \"忍者外传\",\n        \"otome wa boku ni koishiteru\": \"少女爱上姐姐\",\n        \"fairy tail\": \"妖精的尾巴\",\n        \"oni chichi\": \"鬼父\",\n        \"clamp gakuen tanteidan\": \"CLAMP学园侦探团\",\n        \"soredemo machi wa mawatteiru\": \"女仆咖啡厅\",\n        \"happy tree friends\": \"欢乐树的朋友们\",\n        \"kare kano\": \"他和她的事情\",\n        \"spongebob squarepants\": \"海绵宝宝\",\n        \"wizard of oz\": \"绿野仙踪\",\n        \"cream lemon\": \"乳霜柠檬\",\n        \"dream c club\": \"梦幻俱乐部\",\n        \"katekyo hitman reborn\": \"家庭教师HITMAN REBORN!\",\n        \"tsugumomo\": \"怪怪守护神\",\n        \"the simpsons\": \"辛普森一家\",\n        \"ano natsu de matteru\": \"在盛夏等待\",\n        \"net ghost pipopa\": \"网络精灵PIPOPA\",\n        \"dominion tank police\": \"特搜战车队\",\n        \"ruin explorers\": \"秘境探险\",\n        \"streets of rage\": \"怒之铁拳\",\n        \"yume no crayon oukoku\": \"梦之蜡笔王国\",\n        \"megaman\": \"洛克人\",\n        \"megaman zero\": \"洛克人ZERO\",\n        \"megaman zx\": \"洛克人ZX\",\n        \"mega man x\": \"洛克人X\",\n        \"megaman battle network\": \"洛克人EXE\",\n        \"mega man legends\": \"洛克人DASH\",\n        \"mega man star force\": \"流星洛克人\",\n        \"konjiki no gash\": \"金色的卡修\",\n        \"super doll licca-chan\": \"丽佳公主\",\n        \"kasumin\": \"妙妙魔法屋\",\n        \"di gi charat\": \"铃铛猫娘\",\n        \"lamento\": \"挽歌\",\n        \"dexters laboratory\": \"德克斯特的实验室\",\n        \"mahoujin guru guru\": \"咕噜咕噜魔法阵\",\n        \"mon colle knights\": \"六门天外\",\n        \"is\": \"I\\\"s\",\n        \"beast wars\": \"百变金刚\",\n        \"wonder project j2\": \"J计划2\",\n        \"nights into dreams...\": \"梦精灵\",\n        \"waku waku 7\": \"火热火热7\",\n        \"okusan\": \"新手人妻\",\n        \"gakkou no kaidan\": \"学校怪谈\",\n        \"gear fighter dendoh\": \"GEAR战士电童\",\n        \"hand maid may\": \"袖珍女侍小梅\",\n        \"vandread\": \"银河冒险战记\",\n        \"mahou shoujo ai\": \"魔法少女爱\",\n        \"ys\": \"伊苏\",\n        \"yumeria\": \"梦物语\",\n        \"re creators\": \"Re:CREATORS\",\n        \"gasaraki\": \"饿沙罗鬼\",\n        \"yuyushiki\": \"悠悠式\",\n        \"sonic the hedgehog\": \"刺猬索尼克\",\n        \"beat blades haruka\": \"超昂闪忍遥\",\n        \"hikaru no go\": \"棋魂\",\n        \"rosenkreuzstilette\": \"蔷薇十字小剑\",\n        \"kuon no kizuna\": \"久远之绊\",\n        \"viper gts\": \"蝰蛇GTS\",\n        \"dragon age\": \"龙腾世纪\",\n        \"nyan koi\": \"猫愿三角恋\",\n        \"another lady innocent\": \"Front Innocent\",\n        \"historys strongest disciple kenichi\": \"史上最强弟子兼一\",\n        \"growlanser\": \"梦幻骑士\",\n        \"kono bijutsubu ni wa mondai ga aru\": \"这个美术社大有问题！\",\n        \"seikon no qwaser\": \"圣痕炼金士\",\n        \"high school kimengumi\": \"高校奇面组\",\n        \"onmyou taisenki\": \"阴阳大战记\",\n        \"ao no kanata no four rhythm\": \"苍之彼方的四重奏\",\n        \"captain commando\": \"名将\",\n        \"voltage fighter gowcaizer\": \"超人学园钢帝王\",\n        \"legend of lemnear\": \"极黑之翼\",\n        \"duel masters\": \"决斗大师\",\n        \"battle spirits\": \"战斗之魂\",\n        \"galaxy express 999\": \"银河铁道999\",\n        \"gaiking\": \"新大空魔龙\",\n        \"girls frontline\": \"少女前线\",\n        \"zettai karen children\": \"绝对可怜CHILDREN\",\n        \"selector infected wixoss\": \"选择感染者WIXOSS\",\n        \"chain chronicle\": \"锁链战记\",\n        \"the vision of escaflowne\": \"圣天空战记\",\n        \"kodomo no omocha\": \"玩偶游戏\",\n        \"quiz nanairo dreams\": \"七彩梦\",\n        \"rival schools\": \"私立正义学园\",\n        \"medabots\": \"徽章战士\",\n        \"zettai junpaku mahou shoujo\": \"绝对纯白魔法少女\",\n        \"namiuchigiwa no muromi-san\": \"人鱼又上钩\",\n        \"kuttsukiboshi\": \"紧扣的星星\",\n        \"maria-sama ga miteru\": \"圣母在上\",\n        \"youkoso jitsuryoku shijou shugi no kyoushitsu e\": \"欢迎来到实力至上主义的教室\",\n        \"kakegurui\": \"狂赌之渊\",\n        \"hajimete no gal\": \"第一次的辣妹\",\n        \"medaka box\": \"最强会长黑神\",\n        \"suisei no gargantia\": \"翠星之加尔刚蒂亚\",\n        \"mayo chiki\": \"迷茫管家与懦弱的我\",\n        \"rance\": \"兰斯\",\n        \"brave police j-decker\": \"勇者警察\",\n        \"witch craft works\": \"魔女的使命\",\n        \"heavy object\": \"重装武器\",\n        \"baby princess\": \"宝贝公主\",\n        \"bioshock\": \"生化奇兵\",\n        \"bioshock infinite\": \"生化奇兵：无限\",\n        \"akame ga kill\": \"斩·赤红之瞳！\",\n        \"harry potter\": \"哈利波特\",\n        \"tom and jerry\": \"猫和老鼠\",\n        \"mahouka koukou no rettousei\": \"魔法科高中的劣等生\",\n        \"euphoria\": \"euphoria\",\n        \"tangled\": \"长发公主\",\n        \"inside out\": \"头脑特工队\",\n        \"danball senki\": \"纸箱战机\",\n        \"hyper police\": \"猫狐警探\",\n        \"cosmic baton girl comet-san\": \"彗星公主\",\n        \"zone of the enders\": \"终极地带\",\n        \"photo kano\": \"写真女友\",\n        \"the kabocha wine\": \"南瓜酒\",\n        \"joshi shougakusei hajimemashita\": \"今天开始当女子小学生\",\n        \"cardfight vanguard\": \"卡片战斗先导者\",\n        \"the onechanbara\": \"THE 御姐玫瑰\",\n        \"gosick\": \"GOSICK\",\n        \"beyblade\": \"战斗陀螺\",\n        \"big hero 6\": \"超能陆战队\",\n        \"yuragisou no yuuna-san\": \"汤摇庄的幽奈同学\",\n        \"teekyuu\": \"女高网球部\",\n        \"jinsei\": \"人生\",\n        \"rail wars\": \"RAIL WARS! -日本国有铁道公安队-\",\n        \"rokujouma no shinryakusha\": \"三坪房间的侵略者！？\",\n        \"sabagebu\": \"生存游戏社\",\n        \"occultic nine\": \"超自然9人组\",\n        \"fist of the north star\": \"北斗神拳\",\n        \"monster girl quest\": \"勇者大战魔物娘\",\n        \"ghost sweeper mikami\": \"GS美神 极乐大作战！！\",\n        \"battle athletes\": \"大运动会\",\n        \"knights of ramune\": \"柠檬汽水骑士\",\n        \"saint tail\": \"怪盗圣少女\",\n        \"kyouran kazoku nikki\": \"狂乱家族日记\",\n        \"2x2 shinobuden\": \"酷伊忍者传\",\n        \"marriage royale\": \"皇家新娘\",\n        \"choukou tenshi escalayer\": \"超昂天使 Escalayer\",\n        \"mahou senshi sweet knights\": \"魔法战士 Sweet Knights\",\n        \"read or die\": \"R.O.D\",\n        \"uchuu no stellvia\": \"宇宙星路\",\n        \"ore monogatari\": \"俺物语!!\",\n        \"yuruyuri\": \"摇曳百合\",\n        \"death note\": \"死亡笔记\",\n        \"cooking papa\": \"妙厨老爹\",\n        \"rumble roses\": \"火爆玫瑰\",\n        \"genshiken\": \"现视研\",\n        \"pia carrot e youkoso\": \"欢迎来到Pia Carrot!!\",\n        \"pia carrot e youkoso 2\": \"欢迎来到Pia Carrot!!2\",\n        \"pia carrot e youkoso 3\": \"欢迎来到Pia Carrot!!3\",\n        \"bokutachi wa benkyou ga dekinai\": \"我们真的学不来\",\n        \"netoge no yome wa onnanoko ja nai to omotta\": \"线上游戏的老婆不可能是女生？\",\n        \"schoolgirl strikers\": \"学园少女突袭者\",\n        \"danna ga nani o itteiru ka wakaranai ken\": \"关于完全听不懂老公在说什么的事\",\n        \"golden sun\": \"黄金太阳\",\n        \"the grim adventures of billy and mandy\": \"爱酷一族\",\n        \"inspector gadget\": \"神探加杰特\",\n        \"the life and times of juniper lee\": \"魔法少女Juniper Lee\",\n        \"sousei no onmyouji\": \"双星之阴阳师\",\n        \"sengoku collection\": \"战国Collection\",\n        \"doctor strange\": \"奇异博士\",\n        \"knights and magic\": \"骑士&魔法\",\n        \"mahou shoujo ikusei keikaku\": \"魔法少女育成计划\",\n        \"arslan senki\": \"亚尔斯兰战记\",\n        \"chousoku henkei gyrozetter\": \"超速变形螺旋杰特\",\n        \"kengan ashura\": \"拳愿阿修罗\",\n        \"tonari no miko-san wa minna warau\": \"邻家的巫女在微笑\",\n        \"aikatsu\": \"偶活学园！\",\n        \"aho-girl\": \"笨女孩\",\n        \"azur lane\": \"碧蓝航线\",\n        \"isekai shokudou\": \"异世界食堂\",\n        \"baccano\": \"永生之酒\",\n        \"berserk\": \"剑风传奇\",\n        \"isekai wa smartphone to tomo ni.\": \"带着智能手机闯荡异世界。\",\n        \"atelier tanaka\": \"田中是年龄=没女朋友的魔法师\",\n        \"servant x service\": \"跟班×服务\",\n        \"bakuon\": \"爆音少女！！\",\n        \"inou-battle wa nichijou-kei no naka de\": \"日常系的异能战斗\",\n        \"denkigai no honya-san\": \"电器街的漫画店\",\n        \"bladedance of elementalers\": \"精灵使的剑舞\",\n        \"da capo\": \"初音岛\",\n        \"da capo ii\": \"初音岛II\",\n        \"da capo iii\": \"初音岛III\",\n        \"tejina senpai\": \"魔术前辈\",\n        \"valkyrie no bouken\": \"女武士大冒险\",\n        \"mugen senshi valis\": \"梦幻战士\",\n        \"dream hunter rem\": \"梦猎人丽梦\",\n        \"made in abyss\": \"来自深渊\",\n        \"wonder momo\": \"神奇桃子\",\n        \"hero bank\": \"英雄银行\",\n        \"monsuno\": \"兽旋战斗\",\n        \"tengai makyou\": \"天外魔境\",\n        \"wingman\": \"银翼超人\",\n        \"fight ippatsu juuden-chan\": \"魔力充电娘\",\n        \"needless\": \"超能力大战\",\n        \"the sacred blacksmith\": \"圣剑锻造师\",\n        \"kampfer\": \"肯普法\",\n        \"onmyoji\": \"阴阳师\",\n        \"brynhildr in the darkness\": \"极黑的布伦希尔特\",\n        \"super real mahjong\": \"超真实麻将\",\n        \"journey to the west\": \"西游记\",\n        \"busou renkin\": \"武装炼金\",\n        \"jigoku shoujo\": \"地狱少女\",\n        \"midori no hibi\": \"美鸟的日记\",\n        \"seirei no moribito\": \"精灵守护者\",\n        \"air gear\": \"飞轮少年\",\n        \"bamboo blade\": \"竹刀少女\",\n        \"dance in the vampire bund\": \"吸血鬼同盟\",\n        \"freezing\": \"零度战姬\",\n        \"omamori himari\": \"守护猫娘绯鞠\",\n        \"shinkyoku soukai polyphonica\": \"神曲奏界Polyphonica\",\n        \"tenjou tenge\": \"天上天下\",\n        \"unbalance x unbalance\": \"萌道鲜师\",\n        \"ange vierge\": \"圣洁天使\",\n        \"blend s\": \"调教咖啡厅\",\n        \"command and conquer\": \"命令与征服\",\n        \"uninhabited planet survive\": \"星球流浪记\",\n        \"fatal fury\": \"饿狼传说\",\n        \"princess crown\": \"公主王冠\",\n        \"burst angel\": \"爆裂天使\",\n        \"k\": \"K\",\n        \"prince of tennis\": \"网球王子\",\n        \"lord of lords ryu knight\": \"霸王大系龙骑士\",\n        \"tonde buurin\": \"飞天少女猪\",\n        \"nano core\": \"纳米核心\",\n        \"elsword\": \"艾尔之光\",\n        \"betterman\": \"进化战记\",\n        \"tenshi ni narumon\": \"天使不设防！\",\n        \"kamen no maid guy\": \"假面男仆\",\n        \"etrian odyssey\": \"世界树的迷宫\",\n        \"in search of the lost future\": \"寻找失去的未来\",\n        \"art of fighting\": \"龙虎之拳\",\n        \"burning force\": \"燃烧战队\",\n        \"golden axe\": \"战斧\",\n        \"popful mail\": \"啵咕物语\",\n        \"the wing of madoola\": \"玛多拉之翼\",\n        \"gakusen toshi asterisk\": \"学战都市Asterisk\",\n        \"tokyo ghoul\": \"东京食尸鬼\",\n        \"doki doki literature club\": \"心动文学俱乐部！\",\n        \"regalia the three sacred stars\": \"雷加利亚三圣星\",\n        \"kaze no densetsu xanadu\": \"风之传说XANADU\",\n        \"tower of druaga\": \"迷宫塔\",\n        \"valkyrie profile\": \"北欧女神\",\n        \"serial experiments lain\": \"玲音\",\n        \"ansatsu kyoushitsu\": \"暗杀教室\",\n        \"mirrors edge\": \"镜之边缘\",\n        \"galilei donna\": \"伽利略少女\",\n        \"teenage mutant ninja turtles\": \"忍者神龟\",\n        \"all purpose cultural cat girl nuku nuku\": \"万能文化猫娘\",\n        \"absolute duo\": \"绝对双刃\",\n        \"avatar\": \"阿凡达\",\n        \"avatar the last airbender\": \"降世神通：最后的气宗\",\n        \"coppelion\": \"核爆末世录\",\n        \"maison ikkoku\": \"相聚一刻\",\n        \"mikakunin de shinkoukei\": \"未确认进行式\",\n        \"tasogare otome x amnesia\": \"黄昏少女×失忆\",\n        \"guild wars\": \"激战\",\n        \"battle girl high school\": \"战斗女子高校\",\n        \"nausicaa of the valley of the wind\": \"风之谷\",\n        \"porco rosso\": \"红猪\",\n        \"princess mononoke\": \"幽灵公主\",\n        \"the secret world of arrietty\": \"借东西的小人阿莉埃蒂\",\n        \"mimi wo sumaseba\": \"侧耳倾听\",\n        \"space patrol luluco\": \"宇宙巡警露露子\",\n        \"shakunetsu no takkyuu musume\": \"灼热的乒乓球娘\",\n        \"silver spoon\": \"银之匙\",\n        \"imouto sae ireba ii.\": \"如果有妹妹就好了。\",\n        \"bang dream\": \"BanG Dream!\",\n        \"fantasy earth zero\": \"幻想大陆\",\n        \"fantastic four\": \"神奇四侠\",\n        \"wonder woman\": \"神奇女侠\",\n        \"family guy\": \"恶搞之家\",\n        \"galaxy angel\": \"银河天使\",\n        \"nurse witch komugi\": \"魔法护士小麦\",\n        \"popotan\": \"蒲公英之恋\",\n        \"xenoblade\": \"异度之刃\",\n        \"xenoblade x\": \"异度之刃X\",\n        \"xenoblade chronicles 2\": \"异度之刃2\",\n        \"xenogears\": \"异度装甲\",\n        \"xenosaga\": \"异度传说\",\n        \"shining sword romance\": \"剑芒罗曼史\",\n        \"shining in the darkness\": \"光明与黑暗\",\n        \"shining force\": \"光明力量\",\n        \"shining force exa\": \"光明力量EXA\",\n        \"shining force feather\": \"光明力量 羽翼\",\n        \"shining soul\": \"光明之魂\",\n        \"shining tears\": \"光明之泪\",\n        \"shining wind\": \"光明之风\",\n        \"shining hearts\": \"光明之心\",\n        \"shining blade\": \"光明之刃\",\n        \"shining ark\": \"光明之舟\",\n        \"shining resonance\": \"光明之响\",\n        \"lunar silver star story\": \"露娜 银河之星物语\",\n        \"lunar eternal blue\": \"露娜 永恒之蓝\",\n        \"maria holic\": \"玛莉亚狂热\",\n        \"boku no pico\": \"我的Pico\",\n        \"azure striker gunvolt\": \"苍蓝雷霆：刚巴尔特\",\n        \"narutaru\": \"星星公主\",\n        \"bokusatsu tenshi dokuro-chan\": \"扑杀天使朵库萝\",\n        \"rick and morty\": \"瑞克和莫蒂\",\n        \"slow start\": \"Slow Start\",\n        \"princess principal\": \"Princess Principal\",\n        \"sangokushi taisen\": \"三国志大战\",\n        \"sengoku taisen\": \"战国大战\",\n        \"chinpui\": \"大耳鼠\",\n        \"pani poni dash\": \"不可思议的教室\",\n        \"suigetsu\": \"水月\",\n        \"mizuiro\": \"水色\",\n        \"dragonaut\": \"龙鸣\",\n        \"under night in-birth\": \"夜下降生\",\n        \"world trigger\": \"境界触发者\",\n        \"mouse\": \"MØUSE\",\n        \"atashinchi\": \"我们这一家\",\n        \"crayon shin-chan\": \"蜡笔小新\",\n        \"looney tunes\": \"乐一通\",\n        \"yuru camp\": \"摇曳露营△\",\n        \"saiki kusuo no psi nan\": \"齐木楠雄的灾难\",\n        \"monster strike\": \"怪物弹珠\",\n        \"noragami\": \"野良神\",\n        \"z slash x\": \"Z/X\",\n        \"shin angyo onshi\": \"新暗行御史\",\n        \"kouchuu ouja mushiking\": \"甲虫王者\",\n        \"darling in the franxx\": \"DARLING in the FRANXX\",\n        \"fairy fencer f\": \"妖精剑士f\",\n        \"honkai gakuen\": \"崩坏学园\",\n        \"quiz magic academy\": \"问答魔法学院\",\n        \"houseki no kuni\": \"宝石之国\",\n        \"atlach-nacha\": \"ATLACH＝NACHA\",\n        \"princess maker\": \"美少女梦工场\",\n        \"grisaia no kajitsu\": \"灰色的果实\",\n        \"sakura trick\": \"樱Trick\",\n        \"pop team epic\": \"pop子和pipi美的日常\",\n        \"lollipop chainsaw\": \"电锯甜心\",\n        \"alternative girls\": \"妃十三学园 Alternative Girls\",\n        \"deadpool\": \"死侍\",\n        \"mitsuboshi colors\": \"三颗星彩色冒险\",\n        \"nekopara\": \"猫娘乐园\",\n        \"keijo\": \"竞女!!!!!!!!\",\n        \"the emoji movie\": \"表情奇幻冒险\",\n        \"animal crossing\": \"动物之森\",\n        \"black clover\": \"黑色五叶草\",\n        \"blues clues\": \"蓝色斑点狗\",\n        \"cooking mama\": \"料理妈妈\",\n        \"dragons lair\": \"龙穴历险记\",\n        \"romance of the three kingdoms\": \"三国演义\",\n        \"death march kara hajimaru isekai kyousoukyoku\": \"爆肝工程师的异世界狂想曲\",\n        \"shironeko project\": \"白猫计划\",\n        \"toji no miko\": \"刀使之巫女\",\n        \"major\": \"棒球大联盟\",\n        \"sora yori mo tooi basho\": \"比宇宙更远的地方\",\n        \"border break\": \"边境保卫战\",\n        \"last period\": \"最终休止符 -无止境的螺旋物语-\",\n        \"stella glow\": \"星光幻歌\",\n        \"ryuuou no oshigoto\": \"龙王的工作！\",\n        \"uma musume pretty derby\": \"赛马娘Pretty Derby🐎\",\n        \"os-tan\": \"OS娘\",\n        \"sunohara-sou no kanrinin-san\": \"春原庄的管理员小姐\",\n        \"yotsubato\": \"四叶妹妹！\",\n        \"dragon nest\": \"龙之谷\",\n        \"kuroinu kedakaki seijo wa hakudaku ni somaru\": \"黑兽～被白浊沾污的高傲圣女～\",\n        \"initial d\": \"头文字D\",\n        \"final romance\": \"对战偶像麻雀：最终罗曼史\",\n        \"violet evergarden\": \"紫罗兰永恒花园\",\n        \"sokkou seitokai\": \"速攻学生会\",\n        \"shantae\": \"桑塔\",\n        \"nekojishi\": \"家有大猫\",\n        \"tomo-chan wa onnanoko\": \"小智是女孩啦！\",\n        \"strawberry panic\": \"惊爆草莓\",\n        \"isekai izakaya nobu\": \"异世界居酒屋「阿信」\",\n        \"alias carnival\": \"ALIA's CARNIVAL!\",\n        \"tesagure bukatsu-mono\": \"摸索吧！部活剧\",\n        \"dna2\": \"DNA²\",\n        \"guardians of the galaxy\": \"银河护卫队\",\n        \"legendz\": \"龙王传说\",\n        \"cross ange\": \"天使与龙的轮舞\",\n        \"dungeon fighter online\": \"地下城与勇士\",\n        \"warhammer\": \"战锤\",\n        \"rakudai kishi no cavalry\": \"落第骑士英雄谭\",\n        \"xxxholic\": \"×××HOLiC\",\n        \"beatless\": \"BEATLESS\",\n        \"ao no exorcist\": \"青之驱魔师\",\n        \"gate - jieitai kano chi nite kaku tatakaeri\": \"GATE奇幻自卫队\",\n        \"playerunknowns battlegrounds\": \"绝地求生\",\n        \"masamune-kun no revenge\": \"政宗君的复仇\",\n        \"hataraku saibou\": \"工作细胞\",\n        \"binbougami ga\": \"穷神来了\",\n        \"princess connect\": \"公主连结Re:Dive\",\n        \"kuzu no honkai\": \"人渣的本愿\",\n        \"elfen lied\": \"妖精的旋律\",\n        \"katanagatari\": \"刀语\",\n        \"plastic memories\": \"可塑性记忆\",\n        \"ijiranaide nagatoro-san\": \"不要欺负我，长瀞同学\",\n        \"bijin onna joushi takizawa-san\": \"美女上司泷泽小姐\",\n        \"bible black\": \"黑暗圣经\",\n        \"uzaki-chan wa asobitai\": \"宇崎酱想要玩耍！\",\n        \"one kagayaku kisetsu e\": \"ONE～光辉的季节～\",\n        \"guardian heroes\": \"守护英雄\",\n        \"the incredibles\": \"超人总动员\",\n        \"yakitate japan\": \"日式面包王\",\n        \"planetarian\": \"星之梦\",\n        \"cave story\": \"洞窟物语\",\n        \"btooom\": \"BTOOOM!惊爆游戏\",\n        \"nichijou\": \"日常\",\n        \"isekai maou to shoukan shoujo no dorei majutsu\": \"异界少女召唤术\",\n        \"winnie the pooh\": \"小熊维尼\",\n        \"bravest warriors\": \"无惧勇士\",\n        \"candy candy\": \"小甜甜\",\n        \"moana\": \"海洋奇缘\",\n        \"scooby-doo\": \"叔比狗\",\n        \"miraculous ladybug\": \"瓢虫少女\",\n        \"inazuma eleven go\": \"闪电十一人GO\",\n        \"mushibugyo\": \"虫奉行\",\n        \"kid icarus\": \"光神话 帕尔提娜之镜\",\n        \"legend of queen opala\": \"奥帕拉女王传奇\",\n        \"shoujo kageki revue starlight\": \"少女歌剧Revue Starlight\",\n        \"deathsmiles\": \"死亡微笑\",\n        \"kaitou joker\": \"怪盗Joker\",\n        \"qualidea code\": \"Qualidea Code\",\n        \"shuumatsu no izetta\": \"终末的伊泽塔\",\n        \"donkey kong\": \"大金刚\",\n        \"whistle\": \"哨声响起\",\n        \"ore ga suki nano wa imouto dakedo imouto ja nai\": \"我喜欢的是小说里的你\",\n        \"seishun buta yarou wa bunny girl senpai no yume o minai\": \"青春猪头少年不会梦到兔女郎学姐\",\n        \"ssss.gridman\": \"SSSS.GRIDMAN\",\n        \"barbie\": \"芭比娃娃\",\n        \"hellboy\": \"地狱男爵\",\n        \"akebi no mi\": \"山姬之实\",\n        \"stardew valley\": \"星露谷物语\",\n        \"tensei shitara slime datta ken\": \"关于我转生变成史莱姆这档事\",\n        \"quiz rpg mahoutsukai to kuroneko no wiz\": \"黑猫维兹\",\n        \"boku no dorei shoukan\": \"我的奴隶妓院\",\n        \"silent mobius\": \"魔法阵都市\",\n        \"sora wo kakeru shoujo\": \"穿越宇宙的少女\",\n        \"cevio\": \"CeVIO\",\n        \"gotoubun no hanayome\": \"五等分的新娘\",\n        \"pan de peace\": \"面包带来和平\",\n        \"borderlands\": \"无主之地\",\n        \"usagi-chan de cue\": \"天生兔女郎\",\n        \"ueno-san wa bukiyou\": \"笨拙之极的上野\",\n        \"wake up girls\": \"Wake Up, Girls!\",\n        \"golden kamuy\": \"黄金神威\",\n        \"komi-san wa komyushou desu.\": \"古见同学有交流障碍症\",\n        \"kaguya-sama wa kokurasetai\": \"辉夜大小姐想让我告白\",\n        \"watashi ni tenshi ga maiorita\": \"天使降临到我身边！\",\n        \"darkest dungeon\": \"暗黑地牢\",\n        \"idol wars z\": \"IDOL WARS Z\",\n        \"sewayaki kitsune no senko-san\": \"贤惠幼妻仙狐小姐\",\n        \"shomin sample\": \"我被绑架到贵族女校当“庶民样本”\",\n        \"arknights\": \"明日方舟\",\n        \"kimetsu no yaiba\": \"鬼灭之刃\",\n        \"tenki no ko\": \"天气之子\",\n        \"arifureta shokugyou de sekai saikyou\": \"平凡职业造就世界最强\",\n        \"asobi asobase\": \"游戏3人娘\",\n        \"zombie land saga\": \"佐贺偶像是传奇\",\n        \"nazo no kanojo x\": \"谜样女友X\",\n        \"shoujo shuumatsu ryokou\": \"少女终末旅行\",\n        \"dumbbell nan kilo moteru\": \"流汗吧!健身少女\",\n        \"thumbelina\": \"拇指姑娘\",\n        \"masou gakuen hxh\": \"魔装学园H×H\",\n        \"hundred\": \"百武装战记\",\n        \"dr. stone\": \"石纪元\",\n        \"uchi no ko no tame naraba ore wa moshikashitara maou mo taoseru kamo shirenai\": \"为了女儿，我说不定连魔王都能干掉。\",\n        \"tsujou kougeki ga zentai kougeki de 2-kai kougeki no okaasan wa suki desu ka\": \"普通攻击是全体二连击，这样的妈妈你喜欢吗？\",\n        \"wagaya no oinari-sama\": \"我家有个狐仙大人\",\n        \"enen no shouboutai\": \"炎炎消防队\",\n        \"lord el-melloi ii sei no jikenbo\": \"君主·埃尔梅罗二世事件簿\",\n        \"inuyasha\": \"犬夜叉\",\n        \"jashin-chan dropkick\": \"邪神与厨二病少女\",\n        \"ishuzoku reviewers\": \"异种族风俗娘评鉴指南\",\n        \"d-frag\": \"属性同好会\",\n        \"heavens memo pad\": \"神的记事本\",\n        \"houkago play\": \"放课后play\",\n        \"ookiku furikabutte\": \"王牌投手 振臂高挥\",\n        \"black bullet\": \"漆黑的子弹\",\n        \"mawaru penguindrum\": \"回转企鹅罐\",\n        \"ben-to\": \"便·当\",\n        \"one week friends\": \"一周的朋友\",\n        \"sanoba witch\": \"魔女的夜宴\",\n        \"tonari no seki-kun\": \"上课小动作\",\n        \"high score girl\": \"高分少女\",\n        \"claymore\": \"大剑\",\n        \"sinoalice\": \"死亡爱丽丝\",\n        \"machikado mazoku\": \"街角魔族\",\n        \"the hunchback of notre dame\": \"钟楼怪人\",\n        \"kodoku no gourmet\": \"孤独的美食家\",\n        \"kishuku gakkou no juliet\": \"寄宿学校的朱丽叶\",\n        \"kemurikusa\": \"烟草\",\n        \"tate no yuusha no nariagari\": \"盾之勇者成名录\",\n        \"watashi nouryoku wa heikinchi de tte itta yo ne\": \"我，不是说了能力要平均值么！\",\n        \"itai no wa iya nano de bougyoryoku ni kyokufuri shitai to omoimasu.\": \"因为太怕痛就全点防御力了\",\n        \"rurouni kenshin\": \"浪客剑心\",\n        \"gankutsuou\": \"岩窟王\",\n        \"kiddy grade\": \"天使特警\",\n        \"yat space travel agency\": \"星际漫游YAYAYA\",\n        \"teisou gyakuten sekai\": \"贞操逆转世界\",\n        \"mondaiji-tachi ga isekai kara kuru sou desu yo\": \"问题儿童都来自异世界？\",\n        \"alice gear aegis\": \"机战少女Alice\",\n        \"houkago no pleiades\": \"放学后的昴星团\",\n        \"senren banka\": \"千恋＊万花\",\n        \"kiratto pri chan\": \"美妙☆频道\",\n        \"cafe stella to shinigami no chou\": \"星光咖啡馆与死神之蝶\",\n        \"riddle joker\": \"RIDDLE JOKER\",\n        \"grand theft auto\": \"侠盗猎车手\",\n        \"hitori bocchi no marumaru seikatsu\": \"一个人的OO小日子\",\n        \"asteroid in love\": \"恋爱小行星\",\n        \"koi wa ameagari no you ni\": \"恋如雨止\",\n        \"fire emblem three houses\": \"火焰之纹章 风花雪月\",\n        \"kanojo okarishimasu\": \"租借女友\",\n        \"15 bishoujo hyouryuuki\": \"15美少女漂流记\",\n        \"ore no natsuyasumi\": \"我的暑假\",\n        \"shinchou yuusha kono yuusha ga ore tueee kuse ni shinchou sugiru\": \"这个勇者明明超强却过分慎重\",\n        \"helltaker\": \"Helltaker\",\n        \"cyborg kuro-chan\": \"超级酷乐猫\",\n        \"oretachi ni tsubasa wa nai\": \"我们没有翅膀\",\n        \"blade of the immortal\": \"无限之住人\",\n        \"nande koko ni sensei ga\": \"为什么老师会在这里！？\",\n        \"what happens in vegas\": \"情迷拉斯维加斯\",\n        \"ore o suki nano wa omae dake kayo\": \"喜欢本大爷的竟然就你一个？\",\n        \"tricolour lovestory\": \"三色△绘恋\",\n        \"mahjong soul\": \"雀魂麻将\",\n        \"genshin impact\": \"原神\",\n        \"mobile suit gundam the 08th ms team\": \"机动战士高达 第08MS小队\",\n        \"hoshizora no memoria\": \"星空的记忆\",\n        \"bocchi kaibutsu to moumoku shoujo\": \"孤独怪物与盲少女\",\n        \"choujin koukousei-tachi wa isekai demo yoyuu de ikinuku you desu\": \"超人高中生们即便在异世界也能从容生存！\",\n        \"maou-sama retry\": \"重来吧，魔王大人！\",\n        \"maitetsu\": \"爱上火车\",\n        \"houkago teibou nisshi\": \"放学后海堤日记\",\n        \"ochikobore fruit tart\": \"满溢的水果挞\",\n        \"comic girls\": \"Comic Girls\",\n        \"endro\": \"Endro!\",\n        \"harukana receive\": \"遥的接球\",\n        \"majo no tabitabi\": \"魔女之旅\",\n        \"chainsaw man\": \"电锯人\",\n        \"josou sanmyaku\": \"女装山脉\",\n        \"penguin highway\": \"企鹅公路\",\n        \"irotoridori no sekai\": \"五彩斑斓的世界\",\n        \"tokyo xanadu\": \"东京迷城\",\n        \"terra battle\": \"地球战争\",\n        \"summer pockets\": \"Summer Pockets\",\n        \"the tatami galaxy\": \"四叠半神话大系\",\n        \"glitch techs\": \"电玩先锋\",\n        \"the owl house\": \"猫头鹰魔法社\",\n        \"maoujou de oyasumi\": \"在魔王城说晚安\",\n        \"dungeons and dragons\": \"龙与地下城\",\n        \"lilo and stitch\": \"星际宝贝\",\n        \"my life as a teenage robot\": \"我的青少年机器人时代\",\n        \"milo murphys law\": \"迈罗·墨菲定律\",\n        \"phineas and ferb\": \"飞哥与小佛\",\n        \"cthulhu mythos\": \"克苏鲁神话\",\n        \"kipo and the age of wonderbeasts\": \"奇波和神奇动物的时代\",\n        \"amphibia\": \"奇幻沼泽\",\n        \"american dragon jake long\": \"美国龙：杰克龙\",\n        \"hazbin hotel\": \"地狱客栈\",\n        \"hotel transylvania\": \"精灵旅社\",\n        \"hilda\": \"希尔达\",\n        \"the dragon prince\": \"龙太子\",\n        \"code lyoko\": \"虚幻勇士\",\n        \"the smurfs\": \"蓝精灵\",\n        \"young justice\": \"少年正义联盟\",\n        \"justice league\": \"正义联盟\",\n        \"avalon code\": \"创世法典\",\n        \"doctor who\": \"神秘博士\",\n        \"rune factory\": \"符文工房\",\n        \"coraline\": \"鬼妈妈\",\n        \"dororo\": \"多罗罗\",\n        \"sekiro shadows die twice\": \"只狼：影逝二度\",\n        \"kamihime project\": \"神姬Project\",\n        \"merc storia\": \"梅露可物语\",\n        \"twelve forever\": \"永远12岁\",\n        \"warriors orochi\": \"无双大蛇\",\n        \"little nightmares\": \"小小噩梦\",\n        \"healin good precure\": \"元气魔法♡光之美少女\",\n        \"uchi no maid ga uzasugiru\": \"我家的女仆有够烦！\",\n        \"flying witch\": \"飞翔的魔女\",\n        \"mushoku tensei\": \"无职转生\",\n        \"tanaka-kun wa itsumo kedaruge\": \"田中君总是如此慵懒\",\n        \"yakusoku no neverland\": \"约定的梦幻岛\",\n        \"iya na kao sare nagara opantsu misete moraitai\": \"很想被人用一脸嫌弃的眼神把胖次给我看\",\n        \"wrestle angels\": \"摔角天使\",\n        \"nijisanji\": \"彩虹社\",\n        \"blue archive\": \"蔚蓝档案\",\n        \"the legend of luo xiaohei\": \"罗小黑战记\",\n        \"sk8 the infinity\": \"SK8 无限滑板\",\n        \"beatmania\": \"狂热节拍\",\n        \"honzuki no gekokujou\": \"小书痴的下克上\",\n        \"oide yo mizuryuu kei land\": \"欢迎光临！水龙敬乐园\",\n        \"shuriken sentai ninninger\": \"手里剑战队忍忍者\",\n        \"hajimete no hitozuma\": \"第一次的人妻体验\",\n        \"sdorica\": \"Sdorica\",\n        \"kaifuku jutsushi no yarinaoshi\": \"回复术士的重启人生\",\n        \"sd gundam sangokuden\": \"SD高达三国传\",\n        \"promare\": \"普罗米亚\",\n        \"ssss.dynazenon\": \"SSSS.电光机王\",\n        \"yagate kimi ni naru\": \"终将成为你\",\n        \"maji de watashi ni koi shinasai\": \"请认真的和我恋爱\",\n        \"lodoss-tou senki\": \"罗德岛战记\",\n        \"tantei wa mou shindeiru.\": \"侦探已死\",\n        \"the secret of kells\": \"凯尔经的秘密\",\n        \"anarchy reigns\": \"极度混乱\",\n        \"tropical-rouge precure\": \"热情闪耀！光之美少女\",\n        \"jujutsu kaisen\": \"咒术回战\",\n        \"shugo chara\": \"守护甜心\",\n        \"manatsu no yo no inmu\": \"仲夏夜之淫梦 | Cookie☆\",\n        \"mujaki no rakuen\": \"无邪气乐园\",\n        \"hololive\": \"Hololive\",\n        \"hinamatsuri\": \"超能力女儿\",\n        \"citrus\": \"citrus～柑橘味香气～\",\n        \"tsubasa reservoir chronicle\": \"翼·年代记\",\n        \"yamada-kun to 7-nin no majo\": \"山田君与7人魔女\",\n        \"aki sora\": \"秋日天空\",\n        \"beelzebub\": \"魔王奶爸\",\n        \"kaichou wa maid-sama\": \"会长是女仆大人\",\n        \"el shaddai\": \"全能之神：梅塔特隆的升天\",\n        \"plants vs. zombies\": \"植物大战僵尸\",\n        \"madou king granzort\": \"魔动王\",\n        \"sono hanabira ni kuchizuke o\": \"亲吻那片花瓣🌸\",\n        \"jormungand\": \"军火女王\",\n        \"the wolf and the seven young kids\": \"狼和七只小山羊\",\n        \"the ugly duckling\": \"丑小鸭\",\n        \"the little match girl\": \"卖火柴的小女孩\",\n        \"hansel and gretel\": \"糖果屋\",\n        \"slime taoshite 300-nen shiranai uchi ni level max ni nattemashita\": \"打了300年的史莱姆，不知不觉就练到了满级\",\n        \"shinsekai yori\": \"来自新世界\",\n        \"tonikaku kawaii\": \"总之就是非常可爱\",\n        \"danshi koukousei no nichijou\": \"男子高中生的日常\",\n        \"seitokai yakuindomo\": \"妄想学生会\",\n        \"parasyte\": \"寄生兽\",\n        \"mairimashita iruma-kun\": \"入间同学入魔了\",\n        \"yubisaki milk tea\": \"指尖奶茶\",\n        \"kyoukai no rinne\": \"境界之轮回\",\n        \"shuumatsu no harem\": \"终末的后宫\",\n        \"bishoujo mangekyou\": \"美少女万华镜\",\n        \"koe de oshigoto\": \"声优初体验！\",\n        \"id invaded\": \"异度侵入 ID:INVADED\",\n        \"hataage kemono michi\": \"萌兽宠物店\",\n        \"valkyria chronicles 2\": \"战场女武神2\",\n        \"valkyria chronicles 3\": \"战场女武神3\",\n        \"kumo desu ga nani ka\": \"转生成蜘蛛又怎样！\",\n        \"kuma kuma kuma bear\": \"熊熊勇闯异世界\",\n        \"marco to ginga ryuu\": \"丸子与银河龙\",\n        \"moyashimon\": \"萌菌物语\",\n        \"wonder egg priority\": \"奇蛋物语\",\n        \"love live superstar\": \"Love Live! Superstar!!\",\n        \"tales of arise\": \"破晓传说\",\n        \"osananajimi ga zettai ni makenai love comedy\": \"青梅竹马绝对不会输的恋爱喜剧\",\n        \"buried stars\": \"深埋之星\",\n        \"gunbuster\": \"飞跃巅峰\",\n        \"13 sentinels aegis rim\": \"十三机兵防卫圈\",\n        \"infinite space\": \"无限航路\",\n        \"tonari no kyuuketsuki-san\": \"邻家索菲\",\n        \"rabi ribi\": \"Rabi-Ribi\",\n        \"little witch nobeta\": \"小魔女诺贝塔\",\n        \"mieruko-chan\": \"看得见的女孩\",\n        \"shigatsu wa kimi no uso\": \"四月是你的谎言\",\n        \"axis powers hetalia\": \"黑塔利亚 Axis Powers\",\n        \"disney twisted-wonderland\": \"迪士尼扭曲仙境\",\n        \"sono bisque doll wa koi o suru\": \"更衣人偶坠入爱河\",\n        \"hypnosis mic\": \"催眠麦克风\",\n        \"project sekai\": \"世界计划\",\n        \"needy streamer overload\": \"主播女孩重度依赖\",\n        \"elden ring\": \"艾尔登法环\",\n        \"otome game no hametsu flag shika nai akuyaku reijou ni tensei shiteshimatta...\": \"转生成为了只有乙女游戏破灭Flag的邪恶大小姐\",\n        \"osomatsu-san\": \"阿松\",\n        \"arena of valor\": \"王者荣耀\",\n        \"douluo continent\": \"斗罗大陆\",\n        \"grand blue\": \"碧蓝之海\",\n        \"blue submarine no. 6\": \"青之6号\",\n        \"jaku-chara tomozaki-kun\": \"弱势角色友崎君\",\n        \"aikatsu friends\": \"偶活学园Friends！\",\n        \"jahy-sama wa kujikenai\": \"贾希大人不气馁\",\n        \"ling long incarnation\": \"灵笼:INCARNATION\",\n        \"kouyoku senki exs-tia\": \"光翼战姬EXS-TIA\",\n        \"assault lily\": \"突击莉莉\",\n        \"harem tengoku da to omottara yandere jigoku datta.\": \"原本以为是后宫天国谁知道竟是病娇地狱\",\n        \"akebi-chan no sailor fuku\": \"明日同学的水手服\",\n        \"mahou shoujo celesphonia\": \"魔法少女天穹法妮雅\",\n        \"noel\": \"NOeL: NOT DiGITAL\",\n        \"tsumamigui\": \"妻中蜜\",\n        \"senpai ga uzai kouhai no hanashi\": \"关于前辈很烦人的事\",\n        \"neko no otera no chion-san\": \"猫之寺的知恩姐\",\n        \"spy x family\": \"间谍过家家\",\n        \"kawaikereba hentai demo suki ni natte kuremasu ka\": \"只要长得可爱，即使是变态你也喜欢吗?\",\n        \"dorohedoro\": \"异兽魔都\",\n        \"bokura wa minna kawaisou\": \"我们大家的河合庄\",\n        \"game of thrones\": \"权力的游戏\",\n        \"red pride of eden\": \"伊甸园的骄傲\",\n        \"nana to kaoru\": \"奈奈与薰的SM日记\",\n        \"kawaii dake ja nai shikimori-san\": \"式守同学不只可爱而已\",\n        \"toaru project\": \"魔法禁书系列\",\n        \"tenka hyakken\": \"天华百剑\",\n        \"oshiro project\": \"御城少女Project\",\n        \"amaama to inazuma\": \"天真与闪电\",\n        \"kin-iro loveriche\": \"金辉恋曲四重奏\",\n        \"ganbare douki-chan\": \"加油吧同期酱\",\n        \"drakengard\": \"龙背上的骑兵\",\n        \"bobobo-bo bo-bobo\": \"鼻毛真拳\",\n        \"majuu senshi luna varga\": \"魔兽战士\",\n        \"saijaku muhai no bahamut\": \"最弱无败神装机龙\",\n        \"trinity seven\": \"七人魔法使\",\n        \"venus eleven vivid\": \"Venus Eleven Vivid！\",\n        \"emil chronicle online\": \"艾米尔编年史\",\n        \"megido 72\": \"恶魔72\",\n        \"umihara kawase\": \"海腹川背\",\n        \"owari no seraph\": \"终结的炽天使\",\n        \"starless\": \"STARLESS\",\n        \"smite\": \"神之浩劫\",\n        \"takopii no genzai\": \"章鱼噼的原罪\",\n        \"super cub\": \"本田小狼与我\",\n        \"kekkaishi\": \"结界师\",\n        \"senyoku no sigrdrifa\": \"战翼的希格德莉法\",\n        \"densetsu no yuusha da garn\": \"勇者传说\",\n        \"video girl ai\": \"电影少女\",\n        \"last origin\": \"Last Origin\",\n        \"seven mortal sins\": \"sin 七大罪\",\n        \"jibaku shounen hanako-kun\": \"地缚少年花子君\",\n        \"shinkansen henkei robo shinkalion\": \"新干线战士\",\n        \"07-ghost\": \"07-GHOST\",\n        \"10 carat torte\": \"天降托蒂！\",\n        \"11eyes\": \"11eyes -罪与罚与赎的少女-\",\n        \"12-sai.\": \"12岁。\",\n        \"13 reasons why\": \"十三个理由\",\n        \"21 emon\": \"21卫门\",\n        \"nanabun no nijyuuni\": \"22/7\",\n        \"3-gatsu no lion\": \"3月的狮子\",\n        \"81diver\": \"81diver\",\n        \"91 days\": \"91Days\",\n        \"a dog of flanders\": \"弗兰德斯的狗\",\n        \"a little snow fairy sugar\": \"小小雪精灵\",\n        \"a nightmare on elm street\": \"猛鬼街\",\n        \"kimi no iru machi\": \"有你的小镇\",\n        \"a.d.police\": \"A.D.POLICE\",\n        \"abenobashi mahou shoutengai\": \"阿倍野桥魔法商店街\",\n        \"acca 13-ku kansatsu-ka\": \"ACCA13区监察课\",\n        \"acchi kocchi\": \"一起一起这里那里\",\n        \"adachi to shimamura\": \"安达与岛村\",\n        \"adventures of the gummi bears\": \"妙妙熊历险记\",\n        \"agarest senki\": \"亚迦雷斯特战记\",\n        \"ai no senshi rainbowman\": \"彩虹化身侠\",\n        \"ai shimai\": \"爱姐妹\",\n        \"ai yori aoshi\": \"青出于蓝\",\n        \"aim for the ace\": \"网球甜心\",\n        \"air master\": \"Air Master\",\n        \"akatsuki blitzkampf\": \"葬晓电光战记\",\n        \"akira\": \"阿基拉\",\n        \"aku no onna kanbu\": \"恶之女干部\",\n        \"akuyaku reijou nanode last boss o kattemimashita\": \"作为恶役大小姐就该养魔王\",\n        \"alice tantei kyoku\": \"爱丽丝侦探局\",\n        \"alien 9\": \"校园外星人\",\n        \"alien vs predator\": \"异形大战铁血战士\",\n        \"allison to lillia\": \"艾莉森与莉莉亚\",\n        \"a.i. ga tomaranai\": \"电脑情人梦\",\n        \"akihabara dennou gumi\": \"秋叶原电脑组\",\n        \"alpen rose\": \"阿尔卑斯杜鹃\",\n        \"alvin and the chipmunks\": \"鼠来宝\",\n        \"am driver\": \"滑板战士\",\n        \"amaenaideyo\": \"极乐天师\",\n        \"amazing nurse nanako\": \"菜菜子解体诊书\",\n        \"american dad\": \"特工老爹\",\n        \"american mcgees alice\": \"爱丽丝梦游魔境\",\n        \"amnesia\": \"失忆症\",\n        \"an american tail\": \"美国鼠谭\",\n        \"ane doki\": \"御姐百分百\",\n        \"ane haramix\": \"姐姐☆懷孕\",\n        \"angel blade\": \"Angel Blade\",\n        \"animal yokochou\": \"动物横町\",\n        \"animaniacs\": \"狂欢三宝\",\n        \"anna millers\": \"安娜·米勒\",\n        \"anne happy\": \"Anne Happy♪\",\n        \"anpanman\": \"面包超人\",\n        \"ao no flag\": \"青旗\",\n        \"aoharu x kikanjuu\": \"青春×机关枪\",\n        \"aoi shiro\": \"青城\",\n        \"aoi umi no tristia\": \"发明工坊\",\n        \"ape escape\": \"捉猴啦\",\n        \"ar nosurge\": \"Ar nosurge ～献给诞生之星的祈祷诗～\",\n        \"ciel nosurge\": \"静籁之空 ～献给失落之星的诗～\",\n        \"ar tonelico\": \"魔塔大陆\",\n        \"ar tonelico qoga\": \"魔塔大陆3\",\n        \"araiguma rascal\": \"小浣熊\",\n        \"arcana famiglia\": \"魔力家族\",\n        \"area no kishi\": \"足球骑士\",\n        \"ares no tsubasa\": \"传奇之翼\",\n        \"arete hime\": \"阿莱蒂公主\",\n        \"armored trooper votoms\": \"装甲骑兵波德姆兹\",\n        \"arrow emblem hawk of the grand prix\": \"神威赛车手\",\n        \"asa made jugyou chu\": \"授课到天亮Chu!\",\n        \"ashita e free kick\": \"踢向明天\",\n        \"ashita no joe\": \"明日之丈\",\n        \"ask dr. rin\": \"恋爱占卜师\",\n        \"asoko de hataraku musubu-san\": \"在那里工作的结小姐\",\n        \"astro fighter sunred\": \"天体战士桑雷德\",\n        \"astro plan\": \"太空历险记\",\n        \"asura cryin\": \"魔神相克者\",\n        \"atsumare fushigi kenkyuubu\": \"集合！不可思议研究社\",\n        \"aura battler dunbine\": \"圣战士丹拜因\",\n        \"ayashi no ceres\": \"梦幻妖子\",\n        \"azfareo no sobayounin\": \"苍龙的仆人\",\n        \"azuki-chan\": \"小红豆\",\n        \"b gata h kei\": \"B型H系\",\n        \"b-daman\": \"B传说！战斗弹珠人\",\n        \"back to the future\": \"回到未来\",\n        \"bagi the monster of mighty nature\": \"大自然的魔兽巴奇\",\n        \"bakuen campus guardress\": \"爆炎学院\",\n        \"bakugan\": \"爆丸\",\n        \"bakunyuu maid kari\": \"爆乳女仆狩猎\",\n        \"bakutou sengen daigunder\": \"爆斗宣言大钢弹\",\n        \"baldr force\": \"BALDR FORCE\",\n        \"ballroom e youkoso\": \"舞动青春\",\n        \"band yarouze\": \"来组乐队吧!\",\n        \"banished from the heros party i decided to live a quiet life in the countryside\": \"因为不是真正的伙伴而被逐出勇者队伍，流落到边境展开慢活人生\",\n        \"banjo-kazooie\": \"班卓熊大冒险\",\n        \"banner of the stars\": \"星界的战旗\",\n        \"baribari densetsu\": \"极速狂飙\",\n        \"battery\": \"野球少年\",\n        \"battle angel alita\": \"铳梦\",\n        \"battle arena toshinden\": \"斗神传\",\n        \"battle royal high school\": \"真魔神传\",\n        \"beck\": \"BECK\",\n        \"beelzebub-jou no okinimesu mama.\": \"只要贝尔哲布布大小姐喜欢就好\",\n        \"beet the vandel buster\": \"冒险王比特\",\n        \"beetlejuice\": \"阴间大法师\",\n        \"bemubemu hunter kotengu tenmaru\": \"伏魔小旋风\",\n        \"bernard-jou iwaku.\": \"伯纳德小姐说\",\n        \"beyond oasis\": \"托尔的传说\",\n        \"big wars\": \"Big Wars\",\n        \"binchou-tan\": \"备长炭\",\n        \"binzume yousei\": \"瓶诘妖精\",\n        \"birdy the mighty\": \"铁腕女警\",\n        \"bishounen tanteidan\": \"美少年侦探团\",\n        \"black butler\": \"黑执事\",\n        \"black desert online\": \"黑色沙漠\",\n        \"black jack\": \"怪医黑杰克\",\n        \"black magic m-66\": \"黑魔术玛丽奥M-66\",\n        \"blade runner\": \"银翼杀手\",\n        \"blast of tempest\": \"绝园的暴风雨\",\n        \"blood plus\": \"血战\",\n        \"blood royale\": \"BLOOD ROYAL\",\n        \"blood-c\": \"BLOOD-C\",\n        \"bloodstained\": \"血污\",\n        \"bloody roar\": \"血腥咆哮\",\n        \"blue dragon\": \"蓝龙\",\n        \"blue spring ride\": \"青春之旅\",\n        \"bna brand new animal\": \"动物新世代 BNA\",\n        \"boku dake ga inai machi\": \"只有我不存在的城市\",\n        \"boku no kanojo ga majimesugiru shobitch na ken\": \"关于我女友是个一本正经的碧池这件事\",\n        \"boku to misaki-sensei\": \"我和美咲老师\",\n        \"boku to roboko\": \"我与机器子\",\n        \"bokura no taiyou\": \"我们的太阳\",\n        \"bokutachi no remake\": \"我们的重制人生\",\n        \"bomberman jetters\": \"轰炸超人\",\n        \"boogiepop\": \"不吉波普\",\n        \"bounen no xamdou\": \"亡念之扎姆德\",\n        \"braceface\": \"Braceface\",\n        \"brandy and mr. whiskers\": \"小布与伟仔\",\n        \"bratz\": \"Bratz\",\n        \"brave 10\": \"BRAVE10\",\n        \"brave express might gaine\": \"勇者特急队\",\n        \"brave fencer musashi\": \"勇敢的剑士 武藏传\",\n        \"brave nine\": \"Brave Nine\",\n        \"brave story\": \"勇者物语\",\n        \"bravestarr\": \"布雷斯塔警长\",\n        \"breakers\": \"BREAKERS\",\n        \"breath of fire\": \"龙息之焰\",\n        \"breath of fire ii\": \"龙息之焰II\",\n        \"breath of fire iii\": \"龙息之焰III\",\n        \"breath of fire iv\": \"龙息之焰IV\",\n        \"breath of fire v\": \"龙息之焰V\",\n        \"breath of fire 6\": \"龙息之焰6\",\n        \"broken blade\": \"破刃之剑\",\n        \"bubuki buranki\": \"舞武器·舞乱伎\",\n        \"bucky ohare\": \"Bucky O'Hare\",\n        \"buffy the vampire slayer\": \"吸血鬼猎人巴菲\",\n        \"bully\": \"恶霸鲁尼\",\n        \"bungou to alchemist\": \"文豪与炼金术师\",\n        \"burn up\": \"杀人科\",\n        \"burn up w\": \"杀人科 W\",\n        \"burn up scramble\": \"杀人科 SCRAMBLE\",\n        \"busou shoujo machiavellianism\": \"武装少女Machiavellianism\",\n        \"buzz lightyear of star command\": \"巴斯光年的星际使命\",\n        \"c the money of soul and possibility control\": \"C钱‧未来式\",\n        \"cage of eden\": \"逃离伊甸园\",\n        \"caligula\": \"卡里古拉\",\n        \"call me by your name\": \"请以你的名字呼唤我\",\n        \"call of duty\": \"使命召唤\",\n        \"can can bunny\": \"Can Can Bunny\",\n        \"carole and tuesday\": \"卡罗尔与星期二\",\n        \"casshan\": \"再造人卡辛\",\n        \"casshern sins\": \"卡辛~罪~\",\n        \"fantasy bishoujo juniku ojisan to\": \"与变成了异世界美少女的大叔一起冒险\",\n        \"trauma center\": \"超执刀\",\n        \"alchemy stars\": \"白夜极光\",\n        \"genkai tokki monster monpiece\": \"限界凸骑 Monster Monpiece\",\n        \"castlevania\": \"恶魔城\",\n        \"casual romance club\": \"放学后恋爱俱乐部\",\n        \"chalkzone\": \"粉笔世界\",\n        \"chaos breaker\": \"混沌斩断\",\n        \"chaos child\": \"混沌之子\",\n        \"chaos head\": \"混沌之脑\",\n        \"cheer danshi\": \"男子啦啦队！！\",\n        \"chibi maruko-chan\": \"樱桃小丸子\",\n        \"chibi vampire\": \"增血鬼果林\",\n        \"chichi chichi\": \"乳乳乳乳\",\n        \"chikyu misaki\": \"地球美纱树\",\n        \"childs play\": \"鬼娃回魂\",\n        \"chio-chan no tsuugakuro\": \"千绪的通学路\",\n        \"chip n dale rescue rangers\": \"救援突击队\",\n        \"cho aniki\": \"超兄贵\",\n        \"chogattai majutsu robot ginguiser\": \"超合体魔术机器人\",\n        \"chokotto sister\": \"我的裘可妹妹\",\n        \"chou dokyuu shoujo 4946\": \"超弩级少女4946\",\n        \"chou kuse ni narisou\": \"城市小飞女\",\n        \"choudenshi bioman\": \"超电子生化人\",\n        \"chouja raideen\": \"超者雷登\",\n        \"choujikuu kidan southern cross\": \"超时空骑团\",\n        \"choujuu kishin dancougar\": \"超兽机神\",\n        \"choukou shinki ixseal\": \"超昂神骑爱克希尔\",\n        \"chrono cross\": \"穿越时空\",\n        \"chrono trigger\": \"时空之轮\",\n        \"chu-bra\": \"青春CUP\",\n        \"chuuka ichiban\": \"中华一番！\",\n        \"class of heroes\": \"剑与魔法与学园\",\n        \"clock tower\": \"钟楼惊魂\",\n        \"clover point\": \"Clover Point\",\n        \"cocoro restarter\": \"心灵重启！\",\n        \"code realize sousei no himegimi\": \"Code:Realize ～创世的姬君～\",\n        \"codename kids next door\": \"小孩大联盟\",\n        \"combat mecha xabungle\": \"战斗装甲Xabungle\",\n        \"combattler v\": \"超力电磁侠 孔巴特拉V\",\n        \"conan the barbarian\": \"蛮王柯南\",\n        \"concon-collector\": \"Concon-Collector\",\n        \"conker\": \"松鼠库克倒霉的一天\",\n        \"cooking idol ai mai main\": \"料理偶像\",\n        \"corruption of champions\": \"英雄的堕落\",\n        \"crash b-daman\": \"爆球Hit！轰烈弹珠人\",\n        \"crash bandicoot\": \"古惑狼\",\n        \"cross game\": \"幸运四叶草\",\n        \"crush gear nitro\": \"新超激力战斗车\",\n        \"crypt killer\": \"妖霸天下\",\n        \"cyberbots\": \"装甲战士\",\n        \"cyberpunk\": \"赛博朋克\",\n        \"d.gray-man\": \"驱魔少年\",\n        \"d.n.angel\": \"天使怪盗\",\n        \"d.p.s.\": \"D.P.S.\",\n        \"daa daa daa\": \"Da!Da!Da!\",\n        \"daiakuji\": \"大恶司\",\n        \"daibanchou -big bang age-\": \"大番长 -Big Bang Age-\",\n        \"daicon\": \"DAICON\",\n        \"daisenryaku\": \"大战略\",\n        \"daphne in the brilliant blue\": \"光与水的女神\",\n        \"dark chronicle\": \"暗云编年史\",\n        \"dark water\": \"Dark Water\",\n        \"darker than black\": \"DARKER THAN BLACK\",\n        \"darkwing duck\": \"狡猾飞天德\",\n        \"dave the barbarian\": \"野蛮人戴夫\",\n        \"day break illusion\": \"穿透幻影的太阳\",\n        \"dead end\": \"Dead End\",\n        \"dead rising\": \"丧尸围城\",\n        \"deadman wonderland\": \"死囚乐园\",\n        \"deception\": \"刻命馆\",\n        \"defense devil\": \"防御魔鬼\",\n        \"demento\": \"狂城丽影\",\n        \"demonbane\": \"斩魔大圣DEMONBANE\",\n        \"dennou boukenki webdiver\": \"电脑冒险记\",\n        \"makai tenshi jibril\": \"魔界天使吉普莉露\",\n        \"dennou tenshi djibril\": \"电脑天使吉普莉露\",\n        \"denpa teki na kanojo\": \"电波系彼女\",\n        \"detective school q\": \"侦探学园Q\",\n        \"the idolmaster sidem\": \"偶像大師SideM\",\n        \"ryuugajou nanana no maizoukin\": \"龙娘七七七埋藏的宝藏\",\n        \"grandia\": \"冒險奇譚\",\n        \"grappler baki\": \"刃牙\",\n        \"mayonaka no tantei nightwalker\": \"真夜中的侦探\",\n        \"boku no kokoro no yabai yatsu\": \"我内心的糟糕念头\",\n        \"inaka ni kaeru to yakeni natsuita kasshoku ponytail shota ga iru\": \"单马尾表弟 (暂译)\",\n        \"paripi koumei\": \"派对浪客诸葛孔明\",\n        \"sore ga seiyuu\": \"那就是声优！\",\n        \"advance of zeta\": \"ADVANCE OF Ζ 提坦斯的旗下\",\n        \"summertime render\": \"夏日重现\",\n        \"kiteretsu daihyakka\": \"奇天烈大百科\",\n        \"perman\": \"飞人\",\n        \"danshi koukousei de urekko light novel sakka o shiteiru keredo\": \"身为男高中生兼当红轻小说作家的我，正被年纪比我小且从事声优工作的女同学掐住脖子\",\n        \"destiny child\": \"命运之子\",\n        \"ousama ranking\": \"国王排名\",\n        \"regular show\": \"天兵公园\",\n        \"talespin\": \"航空小英雄\",\n        \"tiny toons\": \"迷你乐一通\",\n        \"recess\": \"下课后\",\n        \"garfield\": \"加菲猫\",\n        \"ok k.o. lets be heroes\": \"OK K.O.!英雄赞\",\n        \"ratchet and clank\": \"瑞奇与叮当\",\n        \"kangokutou mary skelter\": \"神狱塔：断罪玛丽\",\n        \"hourou musuko\": \"放浪男孩\",\n        \"moshidora\": \"如果杜拉\",\n        \"yumekui merry\": \"食梦者玛莉\",\n        \"ikoku meiro no croisee\": \"异国迷宫的十字路口\",\n        \"corpse party\": \"尸体派对\",\n        \"jewelpet tinkle\": \"宝石宠物Twinkle☆\",\n        \"dragon crisis\": \"龙之界点\",\n        \"who framed roger rabbit\": \"谁陷害了兔子罗杰\",\n        \"the bad guys\": \"坏蛋联盟\",\n        \"hige o soru. soshite joshikousei o hirou.\": \"剃须。然后捡到女高中生。\",\n        \"horimiya\": \"堀桑与宫村君\",\n        \"ef a tale of memories\": \"悠久之翼\",\n        \"gaikotsu kishi-sama tadaima isekai e odekakechuu\": \"骸骨骑士大人异世界冒险中\",\n        \"kou-1 desu ga isekai de joushu hajimemashita\": \"虽然才高一却在异世界当起城主\",\n        \"kansen x shoujo\": \"感染×少女\",\n        \"digimon story cyber sleuth\": \"数码宝贝物语 网络侦探\",\n        \"among us\": \"Among Us\",\n        \"landstalker\": \"秘境魔宝\",\n        \"wizardry\": \"巫术系列\",\n        \"cotton\": \"棉花小魔女系列\",\n        \"waccha primagi\": \"绫镜魔法\",\n        \"sonic soldier borgman\": \"超音战士\",\n        \"brave girl ravens\": \"Brave Girl Ravens\",\n        \"tsukuyomi moon phase\": \"月咏\",\n        \"punishing gray raven\": \"战双帕弥什\",\n        \"guardian tales\": \"坎公骑冠剑\",\n        \"otome game sekai wa mob ni kibishii sekai desu\": \"乙女游戏世界对路人角色很不友好\",\n        \"kenja no mago\": \"贤者之孙\",\n        \"lycoris recoil\": \"莉可丽丝\",\n        \"tachibana-san-chi no dansei jijou\": \"橘OO家O男性事情\",\n        \"dig delight direct drive dj\": \"D4DJ\",\n        \"seirei gensouki\": \"精灵幻想记\",\n        \"soredemo ayumu wa yosetekuru\": \"即使如此依旧步步进逼\",\n        \"nikujo no susume\": \"肉女的推荐\",\n        \"eiyuu senki\": \"英雄战姬\",\n        \"shoujo mahou gaku little witch romanesque\": \"少女魔法学\",\n        \"words worth\": \"光与影的传说\",\n        \"drifters\": \"漂流武士\",\n        \"counter side\": \"Counter:Side\",\n        \"kunoichi tsubaki no mune no uchi\": \"女忍者椿的心事\",\n        \"kanojo mo kanojo\": \"女友成双\",\n        \"ero trap dungeon\": \"色情迷宫\",\n        \"yofukashi no uta\": \"彻夜之歌\",\n        \"zannen onna kanbu black general-san\": \"遗憾女干部黑暗将军小姐\",\n        \"digimon ghost game\": \"数码宝贝幽灵游戏\",\n        \"yuusha to maou\": \"魔王勇者\",\n        \"onegai my melody\": \"我爱美乐蒂\",\n        \"bikkuriman\": \"仙魔大战\",\n        \"munou na nana\": \"无能力者娜娜\",\n        \"nurarihyon no mago\": \"滑头鬼之孙\",\n        \"bomber girl\": \"轰炸女孩\",\n        \"burn the witch\": \"龙与魔女（BURN THE WITCH）\",\n        \"hataraku onii-san\": \"打工小哥\",\n        \"tomica kizuna gattai earth granner\": \"极速牵绊 地球先锋队\",\n        \"netojuu no susume\": \"网络胜利组\",\n        \"camp buddy\": \"Camp Buddy\",\n        \"eto rangers\": \"十二生肖守护神\",\n        \"mob psycho 100\": \"灵能百分百\",\n        \"space pirate captain harlock\": \"宇宙海贼哈洛克船长\",\n        \"devil survivor 2\": \"恶魔幸存者2\",\n        \"henshin\": \"变身-emergence-\",\n        \"magika no kenshi to basileus\": \"魔技科的剑士与召唤魔王\",\n        \"aragami\": \"荒神\",\n        \"owari no chronicle\": \"终焉的年代记\",\n        \"les miserables\": \"悲惨世界\",\n        \"isekai ojisan\": \"异世界舅舅\",\n        \"star ocean\": \"星之海洋\",\n        \"kami no rhapsody\": \"神之狂想曲\",\n        \"nintama rantarou\": \"落第忍者乱太郎\",\n        \"mahoutsukai no yome\": \"魔法使的新娘\",\n        \"subarashiki hibi\": \"美好的每一天～不连续的存在～\",\n        \"tron\": \"创：战纪\",\n        \"tokyo revengers\": \"东京复仇者\",\n        \"mobile suit gundam the witch from mercury\": \"机动战士高达 水星的魔女\",\n        \"shijou saikyou no daimaou murabito a ni tensei suru\": \"史上最强大魔王转生为村民A\",\n        \"genjitsu shugi yuusha no oukoku saikenki\": \"现实主义勇者的王国重建记\",\n        \"zenless zone zero\": \"绝区零\",\n        \"mato seihei no slave\": \"魔都精兵的奴隶\",\n        \"bocchi the rock\": \"孤独摇滚！\",\n        \"scp foundation\": \"SCP基金会\",\n        \"kinnikuman\": \"金肉人\",\n        \"ever 17\": \"Ever17（时空轮回）\",\n        \"memories off\": \"告别回忆\",\n        \"shiei no sona-nyl -what a beautiful memories-\": \"紫影的索纳尼尔 ～何等美好的记忆～\",\n        \"katawa shoujo\": \"片轮少女\",\n        \"sound horizon\": \"泡沫の恋\",\n        \"honor of kings\": \"王者荣耀\",\n        \"naraka bladepoint\": \"永劫无间\",\n        \"teletubbies\": \"天线宝宝\",\n        \"goddess of victory nikke\": \"胜利女神：妮姬\",\n        \"identity v\": \"第五人格\",\n        \"morenatsu\": \"漏夏\",\n        \"mad rat dead\": \"疯老鼠之死\",\n        \"enjou genmu tan\": \"艳娘幻梦谭\",\n        \"from argonavis\": \"from ARGONAVIS\",\n        \"god of war\": \"战神\",\n        \"the world ends with you\": \"美妙世界\",\n        \"scarlet nexus\": \"绯红结系\",\n        \"dragalia lost\": \"Dragalia Lost ～失落的龙约～\",\n        \"kimi ga nozomu eien\": \"你所期望的永远\",\n        \"matantei loki ragnarok\": \"魔侦探洛基\",\n        \"washio sumi wa yuusha de aru\": \"鹫尾须美是勇者\",\n        \"kono healer mendokusai\": \"这个僧侣有够烦\",\n        \"super dimension century orguss\": \"超时空世纪\",\n        \"ouchi ni kaeru made ga mashimaro desu\": \"回家之前的棉花糖\",\n        \"karakuri circus\": \"傀儡马戏团\",\n        \"waka okami wa shougakusei\": \"温泉屋的小老板娘\",\n        \"kamen rider kuuga\": \"假面骑士空我\",\n        \"raramagi honyarara magic\": \"不确定魔法\",\n        \"space battleship yamato 2199\": \"宇宙战舰大和号2199\",\n        \"power pro kun pocket\": \"口袋力量棒球\",\n        \"anothereidos of dragon vein r\": \"龙脉·另一种姿态\",\n        \"the saga of darren shan\": \"向达伦大冒险\",\n        \"delicious party precure\": \"美味派对♡光之美少女\",\n        \"ai the somnium files\": \"AI：梦境档案\",\n        \"ku-neru maruta\": \"吃吃睡睡的玛璐塔\",\n        \"school shock\": \"雏蜂\",\n        \"shinigami bocchan to kuro maid\": \"死神少爷与黑女仆\",\n        \"2.43 seiin high school boys volleyball team\": \"2.43 清阴高中男子排球社\",\n        \"elf-san wa yaserarenai.\": \"精灵小姐瘦不下来\",\n        \"pretty face\": \"漂亮脸蛋\",\n        \"yi lian\": \"忆恋\",\n        \"meili xinshijie i\": \"美丽新世界i\",\n        \"kage no jitsuryokusha ni naritakute\": \"我想成为影之强者！\",\n        \"okane ga nai\": \"欠金情人\",\n        \"valvrave the liberator\": \"革命机\",\n        \"dodge danpei\": \"斗球儿弹平\",\n        \"sinbad legend of the seven seas\": \"辛巴达七海传奇\",\n        \"tenshin ranman\": \"天神乱漫\",\n        \"hajimete no orusuban\": \"第一次看家\",\n        \"nanami to konomi no oshiete a-b-c\": \"ななみとこのみのおしえてA・B・C\",\n        \"hajimete no oishasan\": \"はじめてのおいしゃさん\",\n        \"hajimete no otetsudai\": \"はじめてのおてつだい\",\n        \"otonari no tenshi-sama ni itsunomanika dame ningen ni sareteita ken\": \"关于我在无意间被隔壁的天使变成废柴这件事\",\n        \"onii-chan wa oshimai\": \"别当哥哥了！\",\n        \"shiki\": \"尸鬼\",\n        \"shikabane hime\": \"尸姬\",\n        \"ayakashi triangle\": \"妖幻三重奏\",\n        \"tensei oujo to tensai reijou no mahou kakumei\": \"转生公主与天才千金的魔法革命\",\n        \"summer camp island\": \"幽灵与莫莉·麦琪\",\n        \"luca\": \"夏日友晴天\",\n        \"spy kyoushitsu\": \"间谍教室\",\n        \"galaxy cyclone braiger\": \"银河旋风\",\n        \"mahou shoujo nante mouiidesukara.\": \"魔法少女什么的已经够了啦。\",\n        \"tom clancys rainbow six\": \"彩虹六号\",\n        \"sangoku rensenki\": \"三国恋战记~少女的兵法\",\n        \"epic seven\": \"第七史诗\",\n        \"godzilla\": \"哥斯拉\",\n        \"cloud meadow\": \"云端牧场\",\n        \"ookami kodomo no ame to yuki\": \"狼的孩子雨和雪\",\n        \"akiba maid sensou\": \"秋叶原冥途战争\",\n        \"kyuuketsuki sugu shinu\": \"吸血鬼马上死\",\n        \"devil summoner soul hackers\": \"恶魔召唤师\",\n        \"saikin yatotta maid ga ayashii\": \"最近雇的女仆有点怪\",\n        \"benriya saitou-san isekai ni iku\": \"万事屋斋藤先生转生异世界\",\n        \"mar\": \"MÄR魔兵传奇\",\n        \"kinsou no vermeil\": \"金装的维尔梅\",\n        \"ganbare goemon\": \"大盗五右卫门\",\n        \"jikkyou powerful pro yakyuu\": \"实况力量棒球系列\",\n        \"dolphin wave\": \"洶湧海豚\",\n        \"suzume no tojimari\": \"铃芽之旅\",\n        \"warframe\": \"星际战甲\",\n        \"brok the investigator\": \"鳄鱼侦探布罗格\",\n        \"horizon zero dawn\": \"地平线 零之曙光\",\n        \"un-go\": \"UN-GO\",\n        \"inma kourin devil carnival\": \"淫魔降臨デビル☆カーニバル\",\n        \"ryu ga gotoku\": \"如龙\",\n        \"atomic heart\": \"原子之心\",\n        \"yomawari\": \"夜廻\",\n        \"the addams family\": \"亚当斯一家\",\n        \"thundercats\": \"霹雳猫\",\n        \"gargoyles\": \"夜行神龙\",\n        \"dora the explorer\": \"爱探险的朵拉\",\n        \"gremlins\": \"小魔怪\",\n        \"lazytown\": \"懒人小镇\",\n        \"deltarune\": \"三角符文\",\n        \"vampire knight\": \"吸血鬼骑士\",\n        \"blue reflection\": \"蔚蓝反射（幻舞少女之剑）\",\n        \"fumikiri jikan\": \"平交道时间\",\n        \"all out\": \"ALL OUT!!\",\n        \"kuma miko\": \"熊巫女\",\n        \"tsuki ni yorisou otome no sahou\": \"近月少女的礼仪\",\n        \"witchs weapon\": \"魔女兵器\",\n        \"dead by daylight\": \"黎明杀机\",\n        \"sakuna of rice and ruin\": \"天穗之咲稻姬\",\n        \"oshi no ko\": \"我推的孩子\",\n        \"tensei shitara ken deshita\": \"转生就是剑\",\n        \"juuou mujin no fafnir\": \"铳皇无尽的法夫纳\",\n        \"soukyuu no fafner\": \"苍穹之法芙娜\",\n        \"heaven burns red\": \"炽焰天穹\",\n        \"fire emblem engage\": \"火焰之纹章 结合\",\n        \"watashi no yuri wa oshigoto desu\": \"我的百合乃工作是也！\",\n        \"sekai saikou no ansatsusha isekai kizoku ni tensei suru\": \"世界顶尖的暗杀者转生为异世界贵族\",\n        \"sengoku bushouki muramasa\": \"战国武将姬\",\n        \"idola phantasy star saga\": \"梦幻之星·伊多拉传说\",\n        \"golden time\": \"青春纪行\",\n        \"honkai star rail\": \"崩坏：星穹铁道\",\n        \"tongari boushi no atelier\": \"尖帽子的魔法工坊\",\n        \"sankarea\": \"散华礼弥\",\n        \"princess resurrection\": \"怪物王女\",\n        \"world flipper\": \"世界弹射物语\",\n        \"kikai sentai zenkaiger\": \"机界战队全开者\",\n        \"ng knight lamune and 40\": \"VS骑士\",\n        \"midnight girls\": \"Midnight Girls R\",\n        \"xenoblade chronicles 3\": \"异度神剑3\",\n        \"hollow knight\": \"空洞骑士\",\n        \"koutetsu no majo annerose\": \"钢铁魔女安妮罗杰\",\n        \"wuqi mitu\": \"无期迷途\",\n        \"jigokuraku\": \"地狱乐\",\n        \"tokyo mirage sessions fe\": \"幻影异闻录♯FE\",\n        \"odin sphere\": \"奥丁领域\",\n        \"ga geijutsuka art design class\": \"GA 艺术科美术设计班\",\n        \"tower of fantasy\": \"幻塔\",\n        \"ase to sekken\": \"汗皂交香\",\n        \"idoly pride\": \"偶像荣耀\",\n        \"nu carnival\": \"新世界狂欢\",\n        \"siren\": \"死魂曲\",\n        \"lapis relights\": \"宝石幻想 光芒重现\",\n        \"franken fran\": \"疯狂怪医芙兰\",\n        \"kaminaki sekai no kamisama katsudou\": \"无神世界中的神明活动\",\n        \"shoukan yuusha to f-kei kareshi\": \"召唤勇者与F系男友\",\n        \"megami device\": \"女神装置\",\n        \"skip to loafer\": \"跳跃和乐福鞋\",\n        \"astral chain\": \"异界锁链\",\n        \"taiyou no kiba dougram\": \"太阳之牙\",\n        \"natsuiro kiseki\": \"夏色奇迹\",\n        \"slam dunk\": \"灌篮高手\",\n        \"tenshi souzou re-boot\": \"天使☆嚣嚣 RE-BOOT!\",\n        \"2.5-jigen no yuuwaku\": \"2.5次元的诱惑\",\n        \"golden boy\": \"黄金小子\",\n        \"valorant\": \"无畏契约\",\n        \"zom 100 zombie ni naru made ni shitai 100 no koto\": \"僵尸百分百\",\n        \"hirogaru sky precure\": \"开阔天空！光之美少女\",\n        \"dororon enma-kun\": \"咚隆隆炎魔君\",\n        \"kekko kamen\": \"穴光假面\",\n        \"tamagotchi\": \"电子宠物蛋\",\n        \"sousou no frieren\": \"葬送的芙莉莲\",\n        \"maou gakuin no futekigousha\": \"魔王学院的不适任者\",\n        \"jewelpet\": \"宝石宠物\",\n        \"jewelpet sunshine\": \"宝石宠物 Sunshine\",\n        \"eve burst error\": \"EVE burst error\",\n        \"mahou shoujo tokushusen asuka\": \"魔法少女特殊战明日香\",\n        \"ponyo\": \"崖上的波妞\",\n        \"lv1 maou to one room yuusha\": \"LV1魔王与独居废勇者\",\n        \"love live hasunosora jogakuin school idol club\": \"莲之空女学院学园偶像俱乐部\",\n        \"little lord fauntleroy\": \"小公子西迪\",\n        \"tensai ouji no akaji kokka saisei jutsu\": \"天才王子的赤字国家振兴术\",\n        \"mardock scramble\": \"壳中少女\",\n        \"grimoire shiritsu grimoire mahou gakuen\": \"私立格里莫瓦魔法学园\",\n        \"futoku no guild\": \"不道德公会\",\n        \"kemono jihen\": \"怪物事变\",\n        \"oounabara to wadanohara\": \"大海原与大海原\",\n        \"zero escape\": \"极限脱出\",\n        \"araburu kisetsu no otome-domo yo\": \"骚动时节的少女们啊\",\n        \"yuusha party o tsuihou sareta beast tamer saikyoushu no nekomimi shoujo to deau\": \"被开除出勇者队伍的驯兽使，邂逅了最强种猫耳少女\",\n        \"doukyuusei\": \"同级生\",\n        \"dohna dohna issho ni warui koto o shiyou\": \"多娜多娜一起干坏事吧\",\n        \"chizuru-chan kaihatsu nikki\": \"千鹤酱的开发日志\",\n        \"arc the lad\": \"妖精战士\",\n        \"haiiro teien\": \"灰色庭园\",\n        \"shuumatsu nani shitemasu ka isogashii desu ka sukutte moratte ii desu ka\": \"末日时在做什么？有没有空？可以来拯救吗？\",\n        \"flint the time detective\": \"时空侦探\",\n        \"fumetsu no anata e\": \"致不灭的你\",\n        \"shiro seijo to kuro bokushi\": \"白圣女与黑牧师\",\n        \"slow loop\": \"SLOW LOOP\",\n        \"taimadou gakuen 35 shiken shoutai\": \"对魔导学园35试验小队\",\n        \"ongeki\": \"音击Ongeki\",\n        \"yamada-kun to lv999 no koi o suru\": \"和山田进行LV.999的恋爱\",\n        \"yu-gi-oh sevens\": \"游戏王SEVENS\",\n        \"ore no shikabane wo koeteyuke\": \"跨越我的尸体\",\n        \"puss in boots the last wish\": \"穿靴子的猫:最后的愿望\",\n        \"fatal frame\": \"零系列\",\n        \"arknights endfield\": \"明日方舟：终末地\",\n        \"calabiyau\": \"卡拉彼丘\",\n        \"soltyrei\": \"曙光少女\",\n        \"meikyuu black company\": \"异世界迷宫黑心企业\",\n        \"kimi no koto ga daidaidaidaidaisuki na 100-nin no kanojo\": \"超超超超超喜欢你的100个女朋友\",\n        \"kimagure orange road\": \"橙路\",\n        \"mahoutsukai no yakusoku\": \"魔法使的约定\",\n        \"genesis climber mospeada\": \"机甲创世记\",\n        \"tottemo luckyman\": \"幸运超人\",\n        \"super radical gag family\": \"浦安铁筋家族\",\n        \"edomae elf\": \"江户前精灵\",\n        \"eizouken ni wa te wo dasu na\": \"别对映像研出手！\",\n        \"rikei ga koi ni ochita no de shuomei shite mita.\": \"理科生坠入情网，故尝试证明。\",\n        \"yu-gi-oh go rush\": \"游戏王GO RUSH\",\n        \"tearmoon teikoku monogatari\": \"堤亚穆帝国物语～从断头台开始，公主重生后的逆转人生～\",\n        \"invincible\": \"无敌少侠\",\n        \"urotsukidoji\": \"超神传说\",\n        \"shutsudou minisuka police\": \"出动！迷你裙警察\",\n        \"engage kiss\": \"契约之吻\",\n        \"seitokai no ichizon\": \"学生会的一己之见\",\n        \"tsuritama\": \"钓球\",\n        \"mahou shoujo ni akogarete\": \"憧憬成为魔法少女\",\n        \"myo-chan sensei wa kaku katariki\": \"小美代老师如是说\",\n        \"kusuriya no hitorigoto\": \"药师少女的独语\",\n        \"equestria girls\": \"小马宝莉：魔法公主\",\n        \"palworld\": \"幻兽帕普\",\n        \"limbus company\": \"边狱公司\",\n        \"trigun\": \"枪神\",\n        \"saimin seishidou\": \"催眠性指导\",\n        \"tekkaman blade\": \"宇宙骑士BLADE\"\n    },\n    \"character\": {\n        \"alice\": \"爱丽丝\",\n        \"akane hino\": \"日野茜\",\n        \"ibuki\": \"伊吹\",\n        \"yui\": \"由依 | 结衣\",\n        \"hisui\": \"翡翠 | 飞彗\",\n        \"rider\": \"Rider | 龙女\",\n        \"maya\": \"摩耶\",\n        \"jeanne darc\": \"圣女贞德\",\n        \"katsuragi\": \"葛城\",\n        \"kasumi\": \"霞\",\n        \"leo\": \"丽王 | 利昂\",\n        \"haruna\": \"榛名 | 春奈\",\n        \"chitose\": \"千岁\",\n        \"murakumo\": \"丛 | 丛云\",\n        \"nachi\": \"那智\",\n        \"kagura\": \"神乐\",\n        \"ram\": \"拉姆\",\n        \"ink nijihara\": \"虹原茵可\",\n        \"pastel ink\": \"闪亮茵可\",\n        \"sumi kuroi\": \"黑威澄\",\n        \"alice shiratori\": \"白鸟爱丽丝\",\n        \"reimu hakurei\": \"博丽灵梦\",\n        \"marisa kirisame\": \"雾雨魔理沙\",\n        \"mima\": \"魅魔\",\n        \"sariel\": \"萨丽爱尔\",\n        \"chiyuri kitashirakawa\": \"北白河千百合\",\n        \"yumemi okazaki\": \"冈崎梦美\",\n        \"elly\": \"艾丽\",\n        \"gengetsu\": \"幻月\",\n        \"mugetsu\": \"梦月\",\n        \"kurumi\": \"胡桃\",\n        \"yumeko\": \"梦子\",\n        \"shinki\": \"神绮\",\n        \"rumia\": \"露米娅\",\n        \"daiyousei\": \"大妖精\",\n        \"cirno\": \"琪露诺\",\n        \"hong meiling\": \"红美铃\",\n        \"koakuma\": \"小恶魔\",\n        \"patchouli knowledge\": \"帕秋莉·诺蕾姬\",\n        \"sakuya izayoi\": \"十六夜咲夜\",\n        \"remilia scarlet\": \"蕾米莉亚·斯卡雷特\",\n        \"flandre scarlet\": \"芙兰朵露·斯卡雷特\",\n        \"letty whiterock\": \"蕾迪·霍瓦特罗克\",\n        \"chen\": \"橙\",\n        \"alice margatroid\": \"爱丽丝·玛格特洛依德\",\n        \"shanghai\": \"上海人偶\",\n        \"hourai\": \"蓬莱人偶\",\n        \"lily white\": \"莉莉霍瓦特\",\n        \"lily black\": \"莉莉黑\",\n        \"lunasa prismriver\": \"露娜萨·普莉兹姆利巴\",\n        \"merlin prismriver\": \"梅露兰·普莉兹姆利巴\",\n        \"lyrica prismriver\": \"莉莉卡·普莉兹姆利巴\",\n        \"youmu konpaku\": \"魂魄妖梦\",\n        \"yuyuko saigyouji\": \"西行寺幽幽子\",\n        \"ran yakumo\": \"八云蓝\",\n        \"yukari yakumo\": \"八云紫\",\n        \"suika ibuki\": \"伊吹萃香\",\n        \"wriggle nightbug\": \"莉格露·奈特巴格\",\n        \"mystia lorelei\": \"米斯蒂娅·萝蕾拉\",\n        \"keine kamishirasawa\": \"上白泽慧音\",\n        \"tewi inaba\": \"因幡帝\",\n        \"reisen udongein inaba\": \"铃仙·优昙华院·因幡\",\n        \"eirin yagokoro\": \"八意永琳\",\n        \"kaguya houraisan\": \"蓬莱山辉夜\",\n        \"fujiwara no mokou\": \"藤原妹红\",\n        \"aya shameimaru\": \"射命丸文\",\n        \"medicine melancholy\": \"梅蒂欣·梅兰可莉\",\n        \"yuuka kazami\": \"风见幽香\",\n        \"komachi onozuka\": \"小野塚小町\",\n        \"eiki shiki\": \"四季映姬·亚玛萨那度\",\n        \"shizuha aki\": \"秋静叶\",\n        \"minoriko aki\": \"秋穰子\",\n        \"hina kagiyama\": \"键山雏\",\n        \"nitori kawashiro\": \"河城荷取\",\n        \"momiji inubashiri\": \"犬走椛\",\n        \"sanae kochiya\": \"东风谷早苗\",\n        \"kanako yasaka\": \"八坂神奈子\",\n        \"suwako moriya\": \"洩矢诹访子\",\n        \"iku nagae\": \"永江衣玖\",\n        \"tenshi hinanai\": \"比那名居天子\",\n        \"kisume\": \"琪斯美\",\n        \"yamame kurodani\": \"黑谷山女\",\n        \"parsee mizuhashi\": \"水桥帕露西\",\n        \"yuugi hoshiguma\": \"星熊勇仪\",\n        \"satori komeiji\": \"古明地觉\",\n        \"rin kaenbyou\": \"火焰猫燐\",\n        \"utsuho reiuji\": \"灵乌路空\",\n        \"koishi komeiji\": \"古明地恋\",\n        \"nazrin\": \"纳兹琳\",\n        \"kogasa tatara\": \"多多良小伞\",\n        \"ichirin kumoi\": \"云居一轮\",\n        \"unzan\": \"云山\",\n        \"minamitsu murasa\": \"村纱水蜜\",\n        \"shou toramaru\": \"寅丸星\",\n        \"byakuren hijiri\": \"圣白莲\",\n        \"nue houjuu\": \"封兽鵺\",\n        \"hatate himekaidou\": \"姬海棠果\",\n        \"kyouko kasodani\": \"幽谷响子\",\n        \"yoshika miyako\": \"宫古芳香\",\n        \"seiga kaku\": \"霍青娥\",\n        \"soga no tojiko\": \"苏我屠自古\",\n        \"mononobe no futo\": \"物部布都\",\n        \"toyosatomimi no miko\": \"丰聪耳神子\",\n        \"mamizou futatsuiwa\": \"二岩猯藏\",\n        \"hata no kokoro\": \"秦心\",\n        \"wakasagihime\": \"若鹭姬\",\n        \"sekibanki\": \"赤蛮奇\",\n        \"kagerou imaizumi\": \"今泉影狼\",\n        \"benben tsukumo\": \"九十九弁弁\",\n        \"yatsuhashi tsukumo\": \"九十九八桥\",\n        \"seija kijin\": \"鬼人正邪\",\n        \"shinmyoumaru sukuna\": \"少名针妙丸\",\n        \"raiko horikawa\": \"堀川雷鼓\",\n        \"sumireko usami\": \"宇佐见堇子\",\n        \"seiran\": \"清兰\",\n        \"ringo\": \"铃瑚\",\n        \"doremy sweet\": \"哆来咪·苏伊特\",\n        \"sagume kishin\": \"稀神探女\",\n        \"clownpiece\": \"克劳恩皮丝\",\n        \"junko\": \"纯狐\",\n        \"hecatia lapislazuli\": \"赫卡提亚·拉碧斯拉祖利\",\n        \"joon yorigami\": \"依神女苑\",\n        \"shion yorigami\": \"依神紫苑\",\n        \"eternity larva\": \"爱塔妮缇拉尔瓦\",\n        \"nemuno sakata\": \"坂田合欢乃\",\n        \"aunn komano\": \"高丽野阿吽\",\n        \"narumi yatadera\": \"矢田寺成美\",\n        \"satono nishida\": \"尔子田里乃\",\n        \"mai teireida\": \"丁礼田舞\",\n        \"okina matara\": \"摩多罗隐岐奈\",\n        \"eika ebisu\": \"戎璎花\",\n        \"urumi ushizaki\": \"牛崎润美\",\n        \"kutaka niwatari\": \"庭渡久侘歌\",\n        \"yachie kicchou\": \"吉吊八千慧\",\n        \"mayumi joutouguu\": \"杖刀偶磨弓\",\n        \"keiki haniyasushin\": \"埴安神袿姬\",\n        \"saki kurokoma\": \"骊驹早鬼\",\n        \"mike goutokuji\": \"豪德寺三花\",\n        \"takane yamashiro\": \"山城高岭\",\n        \"sannyo komakusa\": \"驹草山如\",\n        \"misumaru tamatsukuri\": \"玉造魅须丸\",\n        \"tsukasa kudamaki\": \"菅牧典\",\n        \"megumu iizunamaru\": \"饭纲丸龙\",\n        \"chimata tenkyuu\": \"天弓千亦\",\n        \"momoyo himemushi\": \"姬虫百百世\",\n        \"tokiko\": \"朱鹭子\",\n        \"rinnosuke morichika\": \"森近霖之助\",\n        \"sunny milk\": \"桑尼米尔克\",\n        \"luna child\": \"露娜切露德\",\n        \"star sapphire\": \"斯塔萨菲雅\",\n        \"watatsuki no toyohime\": \"绵月丰姬\",\n        \"watatsuki no yorihime\": \"绵月依姬\",\n        \"hieda no akyuu\": \"稗田阿求\",\n        \"kasen ibara\": \"茨木华扇\",\n        \"kosuzu motoori\": \"本居小铃\",\n        \"miyoi okunoda\": \"奥野田美宵\",\n        \"renko usami\": \"宇佐见莲子\",\n        \"maribel han\": \"玛艾露贝莉·赫恩\",\n        \"hakurei miko\": \"先代巫女\",\n        \"honoka kosaka\": \"高坂穗乃果\",\n        \"yukiho kosaka\": \"高坂雪穗\",\n        \"eli ayase\": \"绚濑绘里\",\n        \"arisa ayase\": \"绚濑亚里沙\",\n        \"kotori minami\": \"南小鸟\",\n        \"umi sonoda\": \"园田海未\",\n        \"rin hoshizora\": \"星空凛\",\n        \"maki nishikino\": \"西木野真姬\",\n        \"nozomi tojo\": \"东条希\",\n        \"hanayo koizumi\": \"小泉花阳\",\n        \"nico yazawa\": \"矢泽妮可\",\n        \"tsubasa kira\": \"绮罗翼\",\n        \"erena toudou\": \"统堂英玲奈\",\n        \"anju yuuki\": \"优木杏树\",\n        \"chika takami\": \"高海千歌\",\n        \"riko sakurauchi\": \"樱内梨子\",\n        \"kanan matsuura\": \"松浦果南\",\n        \"dia kurosawa\": \"黑泽黛雅\",\n        \"you watanabe\": \"渡边曜\",\n        \"tsuki watanabe\": \"渡边月\",\n        \"yoshiko tsushima\": \"津岛善子\",\n        \"hanamaru kunikida\": \"国木田花丸\",\n        \"mari ohara\": \"小原鞠莉\",\n        \"ruby kurosawa\": \"黑泽露比\",\n        \"seira kazuno\": \"鹿角圣良\",\n        \"ria kazuno\": \"鹿角理亚\",\n        \"ayumu uehara\": \"上原步梦\",\n        \"kasumi nakasu\": \"中须霞\",\n        \"shizuku osaka\": \"樱坂雫\",\n        \"karin asaka\": \"朝香果林\",\n        \"ai miyashita\": \"宫下爱\",\n        \"kanata konoe\": \"近江彼方\",\n        \"haruka konoe\": \"近江遥\",\n        \"setsuna yuki\": \"优木雪菜\",\n        \"emma verde\": \"艾玛·维尔德\",\n        \"rina tennoji\": \"天王寺璃奈\",\n        \"rensouhou-chan\": \"连装炮酱\",\n        \"chiyoda\": \"千代田\",\n        \"akebono\": \"曙\",\n        \"ushio\": \"潮\",\n        \"ikazuchi\": \"雷\",\n        \"kamoi\": \"神威\",\n        \"maruyu\": \"丸输\",\n        \"z3\": \"Z3\",\n        \"italia\": \"意大利\",\n        \"luigi torelli\": \"路易吉·托雷利\",\n        \"iona\": \"伊欧娜\",\n        \"mamiya\": \"间宫\",\n        \"shikikan\": \"指挥官\",\n        \"ka-class\": \"潜艇KA级\",\n        \"so-class\": \"潜艇SO级\",\n        \"ri-class\": \"重巡RI级\",\n        \"re-class\": \"战舰RE级\",\n        \"ta-class\": \"战舰TA级\",\n        \"wo-class\": \"空母WO级\",\n        \"teitoku\": \"提督\",\n        \"nagato\": \"长门\",\n        \"mutsu\": \"陆奥\",\n        \"ise\": \"伊势\",\n        \"hyuuga\": \"日向\",\n        \"yukikaze\": \"雪风\",\n        \"akagi\": \"赤城\",\n        \"kaga\": \"加贺\",\n        \"souryuu\": \"苍龙\",\n        \"hiryuu\": \"飞龙\",\n        \"shimakaze\": \"岛风\",\n        \"fubuki\": \"吹雪\",\n        \"shirayuki\": \"白雪\",\n        \"hatsuyuki\": \"初雪\",\n        \"miyuki\": \"深雪\",\n        \"isonami\": \"矶波\",\n        \"ayanami\": \"绫波\",\n        \"shikinami\": \"敷波\",\n        \"ooi\": \"大井\",\n        \"kitakami\": \"北上\",\n        \"kongou\": \"金刚\",\n        \"hiei\": \"比睿\",\n        \"kirishima\": \"雾岛\",\n        \"houshou\": \"凤翔\",\n        \"fusou\": \"扶桑\",\n        \"yamashiro\": \"山城\",\n        \"tenryuu\": \"天龙\",\n        \"tatsuta\": \"龙田\",\n        \"ryuujou\": \"龙骧\",\n        \"mutsuki\": \"睦月\",\n        \"kisaragi\": \"如月\",\n        \"satsuki\": \"皋月\",\n        \"fumizuki\": \"文月\",\n        \"nagatsuki\": \"长月\",\n        \"kikuzuki\": \"菊月\",\n        \"mikazuki\": \"三日月\",\n        \"mochizuki\": \"望月\",\n        \"kuma\": \"球磨\",\n        \"tama\": \"多摩\",\n        \"kiso\": \"木曾\",\n        \"nagara\": \"长良\",\n        \"isuzu\": \"五十铃\",\n        \"natori\": \"名取\",\n        \"yura\": \"由良\",\n        \"sendai\": \"川内\",\n        \"jintsuu\": \"神通\",\n        \"naka\": \"那珂\",\n        \"mogami\": \"最上\",\n        \"furutaka\": \"古鹰\",\n        \"kako\": \"加古\",\n        \"aoba\": \"青叶\",\n        \"myoukou\": \"妙高\",\n        \"ashigara\": \"足柄\",\n        \"haguro\": \"羽黑\",\n        \"takao\": \"高雄\",\n        \"atago\": \"爱宕\",\n        \"choukai\": \"鸟海\",\n        \"tone\": \"利根\",\n        \"chikuma\": \"筑摩\",\n        \"hiyou\": \"飞鹰\",\n        \"junyou\": \"隼鹰\",\n        \"oboro\": \"胧\",\n        \"sazanami\": \"涟\",\n        \"akatsuki\": \"晓\",\n        \"hibiki\": \"响\",\n        \"inazuma\": \"电\",\n        \"hatsuharu\": \"初春\",\n        \"nenohi\": \"子日\",\n        \"wakaba\": \"若叶\",\n        \"hatsushimo\": \"初霜\",\n        \"shiratsuyu\": \"白露\",\n        \"shigure\": \"时雨\",\n        \"murasame\": \"村雨\",\n        \"yuudachi\": \"夕立\",\n        \"samidare\": \"五月雨\",\n        \"suzukaze\": \"凉风\",\n        \"asashio\": \"朝潮\",\n        \"ooshio\": \"大潮\",\n        \"michishio\": \"满潮\",\n        \"arashio\": \"荒潮\",\n        \"arare\": \"霰\",\n        \"kagerou\": \"阳炎\",\n        \"shiranui\": \"不知火\",\n        \"kuroshio\": \"黑潮\",\n        \"shouhou\": \"祥凤\",\n        \"shoukaku\": \"翔鹤\",\n        \"zuikaku\": \"瑞鹤\",\n        \"kinu\": \"鬼怒\",\n        \"abukuma\": \"阿武隈\",\n        \"yuubari\": \"夕张\",\n        \"zuihou\": \"瑞凤\",\n        \"mikuma\": \"三隈\",\n        \"hatsukaze\": \"初风\",\n        \"maikaze\": \"舞风\",\n        \"kinugasa\": \"衣笠\",\n        \"i-19\": \"伊19\",\n        \"suzuya\": \"铃谷\",\n        \"kumano\": \"熊野\",\n        \"i-168\": \"伊168\",\n        \"i-58\": \"伊58\",\n        \"i-8\": \"伊8\",\n        \"yamato\": \"大和\",\n        \"akigumo\": \"秋云\",\n        \"yuugumo\": \"夕云\",\n        \"makigumo\": \"卷云\",\n        \"naganami\": \"长波\",\n        \"agano\": \"阿贺野\",\n        \"noshiro\": \"能代\",\n        \"yahagi\": \"矢矧\",\n        \"sakawa\": \"酒匂\",\n        \"musashi\": \"武藏\",\n        \"taihou\": \"大凤\",\n        \"katori\": \"香取\",\n        \"i-401\": \"伊401\",\n        \"akitsu maru\": \"秋津丸\",\n        \"yayoi\": \"弥生\",\n        \"uzuki\": \"卯月\",\n        \"isokaze\": \"矶风\",\n        \"urakaze\": \"浦风\",\n        \"tanikaze\": \"谷风\",\n        \"hamakaze\": \"滨风\",\n        \"bismarck\": \"俾斯麦\",\n        \"z1\": \"Z1\",\n        \"prinz eugen\": \"欧根亲王\",\n        \"amatsukaze\": \"天津风\",\n        \"akashi\": \"明石\",\n        \"ooyodo\": \"大淀\",\n        \"taigei\": \"大鲸\",\n        \"ryuuhou\": \"龙凤\",\n        \"tokitsukaze\": \"时津风\",\n        \"unryuu\": \"云龙\",\n        \"amagi\": \"天城\",\n        \"harusame\": \"春雨\",\n        \"hayashimo\": \"早霜\",\n        \"kiyoshimo\": \"清霜\",\n        \"asagumo\": \"朝云\",\n        \"yamagumo\": \"山云\",\n        \"nowaki\": \"野分\",\n        \"akizuki\": \"秋月\",\n        \"teruzuki\": \"照月\",\n        \"hatsuzuki\": \"初月\",\n        \"takanami\": \"高波\",\n        \"asashimo\": \"朝霜\",\n        \"u-511\": \"U-511\",\n        \"graf zeppelin\": \"齐柏林伯爵\",\n        \"saratoga\": \"萨拉托加\",\n        \"ro-500\": \"吕500\",\n        \"warspite\": \"厌战\",\n        \"iowa\": \"衣阿华\",\n        \"littorio\": \"利托里奥\",\n        \"roma\": \"罗马\",\n        \"libeccio\": \"西南风\",\n        \"aquila\": \"天鹰\",\n        \"akitsushima\": \"秋津洲\",\n        \"zara\": \"扎拉\",\n        \"pola\": \"波拉\",\n        \"mizuho\": \"瑞穗\",\n        \"okinami\": \"冲波\",\n        \"kazagumo\": \"风云\",\n        \"arashi\": \"岚\",\n        \"hagikaze\": \"萩风\",\n        \"oyashio\": \"亲潮\",\n        \"yamakaze\": \"山风\",\n        \"umikaze\": \"海风\",\n        \"kawakaze\": \"江风\",\n        \"hayasui\": \"速吸\",\n        \"kashima\": \"鹿岛\",\n        \"kamikaze\": \"神风\",\n        \"asakaze\": \"朝风\",\n        \"harukaze\": \"春风\",\n        \"matsukaze\": \"松风\",\n        \"hatakaze\": \"旗风\",\n        \"amagiri\": \"天雾\",\n        \"sagiri\": \"狭雾\",\n        \"minazuki\": \"水无月\",\n        \"i-26\": \"伊26\",\n        \"hamanami\": \"滨波\",\n        \"fujinami\": \"藤波\",\n        \"uranami\": \"浦波\",\n        \"commandant teste\": \"特斯特长官\",\n        \"richelieu\": \"黎塞留\",\n        \"i-400\": \"伊400\",\n        \"i-13\": \"伊13\",\n        \"i-14\": \"伊14\",\n        \"gangut\": \"甘古特\",\n        \"tashkent\": \"塔什干\",\n        \"ark royal\": \"皇家方舟\",\n        \"shimushu\": \"占守\",\n        \"kunashiri\": \"国后\",\n        \"jervis\": \"贾维斯 | 杰维斯\",\n        \"suzutsuki\": \"凉月\",\n        \"etorofu\": \"择捉\",\n        \"matsuwa\": \"松轮\",\n        \"sado\": \"佐渡\",\n        \"tsushima\": \"对马\",\n        \"gambier bay\": \"甘比尔湾\",\n        \"intrepid\": \"无畏\",\n        \"johnston\": \"约翰斯顿\",\n        \"maestrale\": \"西北风\",\n        \"fletcher\": \"弗莱彻\",\n        \"unicorn\": \"独角兽\",\n        \"belfast\": \"贝尔法斯特\",\n        \"illustrious\": \"光辉\",\n        \"terror\": \"恐怖\",\n        \"vampire\": \"吸血鬼\",\n        \"laffey\": \"拉菲\",\n        \"eldridge\": \"埃尔德里奇\",\n        \"prince of wales\": \"威尔士亲王\",\n        \"sheffield\": \"谢菲尔德\",\n        \"ping hai\": \"平海\",\n        \"ning hai\": \"宁海\",\n        \"formidable\": \"可畏\",\n        \"admiral hipper\": \"希佩尔海军上将\",\n        \"portland\": \"波特兰\",\n        \"cygnet\": \"小天鹅\",\n        \"kent\": \"肯特\",\n        \"hammann\": \"哈曼\",\n        \"mikasa\": \"三笠\",\n        \"st. louis\": \"圣路易斯\",\n        \"san diego\": \"圣地亚哥\",\n        \"long island\": \"长岛\",\n        \"javelin\": \"标枪\",\n        \"nelson\": \"纳尔逊\",\n        \"rodney\": \"罗德尼\",\n        \"enterprise\": \"企业\",\n        \"queen elizabeth\": \"伊丽莎白女王\",\n        \"victorious\": \"胜利\",\n        \"ajax\": \"阿贾克斯\",\n        \"cleveland\": \"克利夫兰\",\n        \"honolulu\": \"火奴鲁鲁\",\n        \"z46\": \"Z46\",\n        \"z23\": \"Z23\",\n        \"tirpitz\": \"提尔比茨\",\n        \"duke of york\": \"约克公爵\",\n        \"bache\": \"贝奇\",\n        \"sirius\": \"天狼星\",\n        \"sims\": \"西姆斯\",\n        \"colorado\": \"科罗拉多\",\n        \"kuubo seiki\": \"空母栖姬\",\n        \"kuubo suiki\": \"空母水鬼\",\n        \"soukou kuuboki\": \"装甲空母姬\",\n        \"senkan seiki\": \"战舰栖姬\",\n        \"hoppou seiki\": \"北方栖姬\",\n        \"nanpou seiki\": \"南方栖鬼\",\n        \"shuusekichi seiki\": \"集积地栖姬\",\n        \"ritou seiki\": \"离岛栖姬\",\n        \"kouwan seiki\": \"港湾栖姬\",\n        \"chuukan seiki\": \"中间栖姬\",\n        \"hikoujouki\": \"飞行场姬\",\n        \"lion\": \"狮\",\n        \"kagero\": \"阳炎\",\n        \"el condor pasa\": \"神鹰\",\n        \"perth\": \"珀斯\",\n        \"renown\": \"声望\",\n        \"chang chun\": \"长春\",\n        \"gotland\": \"哥特兰\",\n        \"grecale\": \"东北风\",\n        \"bremerton\": \"布莱默顿\",\n        \"roon\": \"罗恩\",\n        \"dido\": \"黛朵\",\n        \"baltimore\": \"巴尔的摩\",\n        \"producer\": \"制作人\",\n        \"haruka amami\": \"天海春香\",\n        \"chihaya kisaragi\": \"如月千早\",\n        \"yukiho hagiwara\": \"萩原雪步\",\n        \"yayoi takatsuki\": \"高槻弥生\",\n        \"kasumi takatsuki\": \"高槻霞\",\n        \"ritsuko akizuki\": \"秋月律子\",\n        \"azusa miura\": \"三浦梓\",\n        \"iori minase\": \"水濑伊织\",\n        \"makoto kikuchi\": \"菊地真\",\n        \"ami futami\": \"双海亚美\",\n        \"mami futami\": \"双海真美\",\n        \"miki hoshii\": \"星井美希\",\n        \"hibiki ganaha\": \"我那霸响\",\n        \"takane shijou\": \"四条贵音\",\n        \"kotori otonashi\": \"音无小鸟\",\n        \"ai hidaka\": \"日高爱\",\n        \"mai hidaka\": \"日高舞\",\n        \"eri mizutani\": \"水谷绘理\",\n        \"ryo akizuki\": \"秋月凉\",\n        \"uzuki shimamura\": \"岛村卯月\",\n        \"yukari mizumoto\": \"水本紫\",\n        \"mai fukuyama\": \"福山舞\",\n        \"kanako mimura\": \"三村加奈子\",\n        \"miho kohinata\": \"小日向美穗\",\n        \"chieri ogata\": \"绪方智绘里\",\n        \"kyoko igarashi\": \"五十岚响子\",\n        \"momoka sakurai\": \"樱井桃华\",\n        \"yumeko sakurai\": \"樱井梦子\",\n        \"hasumi nagatomi\": \"长富莲实\",\n        \"chika yokoyama\": \"横山千佳\",\n        \"miku maekawa\": \"前川未来\",\n        \"saya matsubara\": \"松原早耶\",\n        \"yukino aihara\": \"相原雪乃\",\n        \"frederica miyamoto\": \"宫本芙蕾德莉卡\",\n        \"sae kobayakawa\": \"小早川纱枝\",\n        \"kotoka saionji\": \"西园寺琴歌\",\n        \"anzu futaba\": \"双叶杏\",\n        \"satomi sakakibara\": \"榊原里美\",\n        \"sachiko koshimizu\": \"舆水幸子\",\n        \"yuriko ohnishi\": \"大西由里子\",\n        \"nana abe\": \"安部菜菜\",\n        \"nene kurihara\": \"栗原宁宁\",\n        \"koharu koga\": \"古贺小春\",\n        \"akiha ikebukuro\": \"池袋晶叶\",\n        \"yuu ohta\": \"太田优\",\n        \"mayu sakuma\": \"佐久间麻由\",\n        \"mirei hayasaka\": \"早坂美玲\",\n        \"rina fujimoto\": \"藤本里奈\",\n        \"michiru ohara\": \"大原满\",\n        \"hotaru shiragiku\": \"白菊萤\",\n        \"kozue yusa\": \"游佐梢\",\n        \"kurumi ohnuma\": \"大沼胡桃\",\n        \"shiki ichinose\": \"一之濑志希\",\n        \"yuuki otokura\": \"乙仓悠贵\",\n        \"rin shibuya\": \"涩谷凛\",\n        \"sarina matsumoto\": \"松本沙理奈\",\n        \"mizuki kawashima\": \"川岛瑞树\",\n        \"nao kamiya\": \"神谷奈绪\",\n        \"haruna kamijou\": \"上条春菜\",\n        \"hina araki\": \"荒木比奈\",\n        \"ai togo\": \"东乡爱\",\n        \"riina tada\": \"多田李衣菜\",\n        \"seira mizuki\": \"水木圣来\",\n        \"chie sasaki\": \"佐佐木千枝\",\n        \"miyu mifune\": \"三船美优\",\n        \"manami kiba\": \"木场真奈美\",\n        \"hajime fujiwara\": \"藤原肇\",\n        \"helen\": \"海伦\",\n        \"noa takamine\": \"高峰诺亚\",\n        \"kaede takagaki\": \"高垣枫\",\n        \"ranko kanzaki\": \"神崎兰子\",\n        \"karen hojo\": \"北条加莲\",\n        \"honoka ayase\": \"绫濑穗乃香\",\n        \"yukimi sajo\": \"佐城雪美\",\n        \"rumi wakui\": \"和久井留美\",\n        \"kako takafuji\": \"鹰富士茄子\",\n        \"koume shirasaka\": \"白坂小梅\",\n        \"mutsumi ujiie\": \"氏家睦\",\n        \"yume narumiya\": \"成宫由爱\",\n        \"syuko shiomi\": \"盐见周子\",\n        \"minami nitta\": \"新田美波\",\n        \"kanade hayami\": \"速水奏\",\n        \"izumi ohishi\": \"大石泉\",\n        \"chizuru matsuo\": \"松尾千鹤\",\n        \"arisu tachibana\": \"橘爱丽丝\",\n        \"nono morikubo\": \"森久保乃乃\",\n        \"anastasia\": \"安娜斯塔西娅\",\n        \"aki yamato\": \"大和亚季\",\n        \"haru yuuki\": \"结城晴\",\n        \"fumika sagisawa\": \"鹭泽文香\",\n        \"layla\": \"莱拉 | 莱依拉\",\n        \"asuka ninomiya\": \"二宫飞鸟\",\n        \"nanami asari\": \"浅利七海\",\n        \"mio honda\": \"本田未央\",\n        \"aiko takamori\": \"高森蓝子\",\n        \"kaoru ryuzaki\": \"龙崎薰\",\n        \"natsuki kimura\": \"木村夏树\",\n        \"miria akagi\": \"赤城米莉亚\",\n        \"yui ohtsuki\": \"大槻唯\",\n        \"yuki himekawa\": \"姬川友纪\",\n        \"yuzu kitami\": \"喜多见柚\",\n        \"naho ebihara\": \"海老原菜帆\",\n        \"shizuku oikawa\": \"及川雫\",\n        \"reina koseki\": \"小关丽奈\",\n        \"yumi aiba\": \"相叶夕美\",\n        \"tomoka wakabayashi\": \"若林智香\",\n        \"mika jougasaki\": \"城崎美嘉\",\n        \"rika jougasaki\": \"城崎莉嘉\",\n        \"kirari moroboshi\": \"诸星琪拉莉\",\n        \"airi totoki\": \"十时爱梨\",\n        \"natalia\": \"娜塔莉亚\",\n        \"takumi mukai\": \"向井拓海\",\n        \"eve santaclaus\": \"伊芙·珊德克罗丝\",\n        \"nina ichihara\": \"市原仁奈\",\n        \"hinako kita\": \"喜多日菜子\",\n        \"mary cochran\": \"玛丽·柯克兰\",\n        \"ayame hamaguchi\": \"滨口菖蒲\",\n        \"syoko hoshi\": \"星辉子\",\n        \"ako tsuchiya\": \"土屋亚子\",\n        \"sanae katagiri\": \"片桐早苗\",\n        \"yuko hori\": \"堀裕子\",\n        \"kai nishijima\": \"西岛櫂\",\n        \"risa matoba\": \"的场梨沙\",\n        \"tokiko zaizen\": \"财前时子\",\n        \"shin sato\": \"佐藤心\",\n        \"yoshino yorita\": \"依田芳乃\",\n        \"chihiro senkawa\": \"千川千寻\",\n        \"mirai kasuga\": \"春日未来\",\n        \"hinata kinoshita\": \"木下日向\",\n        \"julia\": \"茱莉亚\",\n        \"sayoko takayama\": \"高山纱代子\",\n        \"kotoha tanaka\": \"田中琴叶\",\n        \"tomoka tenkubashi\": \"天空桥朋花\",\n        \"serika hakozaki\": \"箱崎星梨花\",\n        \"arisa matsuda\": \"松田亚利沙\",\n        \"shizuka mogami\": \"最上静香\",\n        \"anna mochizuki\": \"望月杏奈\",\n        \"emily stewart\": \"艾米莉·司徒亚特\",\n        \"tamaki ogami\": \"大神环\",\n        \"reika kitakami\": \"北上丽花\",\n        \"umi kousaka\": \"高坂海美\",\n        \"minako satake\": \"佐竹美奈子\",\n        \"elena shimabara\": \"岛原埃琳娜\",\n        \"subaru nagayoshi\": \"永吉昴\",\n        \"konomi baba\": \"马场木实\",\n        \"noriko fukuda\": \"福田法子\",\n        \"mizuki makabe\": \"真壁瑞希\",\n        \"rio momose\": \"百濑莉绪\",\n        \"nao yokoyama\": \"横山奈绪\",\n        \"tsubasa ibuki\": \"伊吹翼\",\n        \"shiho kitazawa\": \"北泽志保\",\n        \"karen shinomiya\": \"篠宫可怜\",\n        \"momoko suou\": \"周防桃子\",\n        \"matsuri tokugawa\": \"德川茉莉\",\n        \"megumi tokoro\": \"所惠美\",\n        \"fuuka toyokawa\": \"丰川风花\",\n        \"iku nakatani\": \"中谷育\",\n        \"yuriko nanao\": \"七尾百合子\",\n        \"chizuru nikaido\": \"二阶堂千鹤\",\n        \"miya miyao\": \"宫尾美也\",\n        \"roco handa\": \"伴田路子\",\n        \"kaori sakuramori\": \"樱守歌织\",\n        \"tsumugi shiraishi\": \"白石䌷\",\n        \"mishiro\": \"美城常务\",\n        \"touma amagase\": \"天濑冬马\",\n        \"teru tendo\": \"天道辉\",\n        \"minori watanabe\": \"渡边实\",\n        \"shiki iseya\": \"伊濑谷四季\",\n        \"hayato akiyama\": \"秋山隼人\",\n        \"saki mizushima\": \"水岛咲\",\n        \"shiro tachibana\": \"橘志狼\",\n        \"hokuto ijuuin\": \"伊集院北斗\",\n        \"kaoru sakuraba\": \"樱庭薫\",\n        \"rei kagura\": \"神乐丽\",\n        \"kyoji takajo\": \"鹰城恭二\",\n        \"kyosuke aoi\": \"苍井享介\",\n        \"jun fuyumi\": \"冬美旬\",\n        \"natsuki sakaki\": \"榊夏来\",\n        \"nao okamura\": \"冈村直央\",\n        \"shouta mitarai\": \"御手洗翔太\",\n        \"tsubasa kashiwagi\": \"柏木翼\",\n        \"kei tsuzuki\": \"都筑圭\",\n        \"pierre\": \"皮埃尔\",\n        \"yusuke aoi\": \"苍井悠介\",\n        \"haruna wakazato\": \"若里春名\",\n        \"makio uzuki\": \"卯月卷绪\",\n        \"kanon himeno\": \"姬野花音\",\n        \"mano sakuragi\": \"樱木真乃\",\n        \"hiori kazano\": \"风野灯织\",\n        \"meguru hachimiya\": \"八宫缭\",\n        \"mamimi tanaka\": \"田中摩美美\",\n        \"kiriko yukoku\": \"幽谷雾子\",\n        \"kogane tsukioka\": \"月冈恋钟\",\n        \"yuika mitsumine\": \"三峰结华\",\n        \"sakuya shirase\": \"白濑咲耶\",\n        \"amana osaki\": \"大崎甘奈\",\n        \"chiyuki kuwayama\": \"桑山千雪\",\n        \"tenka osaki\": \"大崎甜花\",\n        \"kaho komiya\": \"小宫果穂\",\n        \"chiyoko sonoda\": \"园田智代子\",\n        \"juri saijo\": \"西城树里\",\n        \"rinze morino\": \"杜野凛世\",\n        \"natsuha arisugawa\": \"有栖川夏叶\",\n        \"hazuki nanakusa\": \"七草叶月\",\n        \"nichika nanakusa\": \"七草日花\",\n        \"arisa mochida\": \"持田亚里沙\",\n        \"fuyuko mayuzumi\": \"黛冬优子\",\n        \"mei izumi\": \"和泉爱依\",\n        \"asahi serizawa\": \"芹泽朝阳\",\n        \"akira sunazuka\": \"砂冢明\",\n        \"riamu yumemi\": \"梦见璃亚梦\",\n        \"madoka higuchi\": \"樋口圆香\",\n        \"koito fukumaru\": \"福丸小糸\",\n        \"toru asakura\": \"浅仓透\",\n        \"hinana ichikawa\": \"市川雏菜\",\n        \"rookie trainer\": \"新手训练员\",\n        \"veteran trainer\": \"高手训练员\",\n        \"mario\": \"马里奥\",\n        \"luigi\": \"路易吉\",\n        \"yoshi\": \"耀西\",\n        \"wario\": \"瓦里奥\",\n        \"waluigi\": \"瓦路易吉\",\n        \"bowser\": \"库巴\",\n        \"wendy o. koopa\": \"温蒂库巴\",\n        \"super crown bowser\": \"库巴姬\",\n        \"princess peach\": \"碧奇公主\",\n        \"princess daisy\": \"黛西公主\",\n        \"rosalina\": \"罗塞塔\",\n        \"pauline\": \"波琳\",\n        \"boo\": \"布布\",\n        \"super crown boo\": \"幽灵姬\",\n        \"toad\": \"奇诺比奥\",\n        \"toadette\": \"奇诺比珂\",\n        \"donkey kong\": \"森喜刚\",\n        \"diddy kong\": \"狄狄刚\",\n        \"dixie kong\": \"狄可西刚\",\n        \"applejack\": \"苹果杰克\",\n        \"fluttershy\": \"小蝶\",\n        \"pinkie pie\": \"萍琪·派\",\n        \"rainbow dash\": \"云宝黛茜\",\n        \"rarity\": \"瑞瑞\",\n        \"twilight sparkle\": \"暮光闪闪\",\n        \"princess celestia\": \"塞拉斯蒂娅公主\",\n        \"princess luna\": \"露娜公主\",\n        \"princess cadance\": \"韵律公主\",\n        \"shining armor\": \"银甲闪闪\",\n        \"starlight glimmer\": \"星光熠熠\",\n        \"sunset shimmer\": \"余晖烁烁\",\n        \"apple bloom\": \"小萍花\",\n        \"scootaloo\": \"飞板璐\",\n        \"sweetie belle\": \"甜贝儿\",\n        \"big macintosh\": \"大麦哥\",\n        \"marble pie\": \"玉琪派\",\n        \"trixie\": \"崔克西\",\n        \"spitfire\": \"飞火\",\n        \"octavia\": \"奥塔维雅\",\n        \"vinyl scratch\": \"DJ3号\",\n        \"derpy hooves\": \"小呆\",\n        \"discord\": \"无序\",\n        \"diamond tiara\": \"珠玉冠冠\",\n        \"silver spoon\": \"白银勺勺\",\n        \"princess ember\": \"余焰公主\",\n        \"queen chrysalis\": \"邪茧女王\",\n        \"sonata dusk\": \"索娜塔\",\n        \"aqua\": \"阿库娅\",\n        \"megumin\": \"惠惠\",\n        \"kazuma satou\": \"佐藤和真\",\n        \"darkness\": \"达克妮丝\",\n        \"yunyun\": \"悠悠\",\n        \"wiz\": \"维兹\",\n        \"chris\": \"克莉丝\",\n        \"kokoa hoto\": \"保登心爱\",\n        \"chino kafuu\": \"香风智乃\",\n        \"rize tedeza\": \"天天座理世\",\n        \"chiya ujimatsu\": \"宇治松千夜\",\n        \"sharo kirima\": \"桐间纱路\",\n        \"maya jouga\": \"条河麻耶\",\n        \"megumi natsu\": \"奈津惠\",\n        \"mocha hoto\": \"保登摩卡\",\n        \"midori aoyama\": \"青山翠\",\n        \"kanade amakusa\": \"甘草奏\",\n        \"chocolat\": \"裘可拉\",\n        \"ayame reikadou\": \"丽华堂绚女\",\n        \"oka yuoji\": \"游王子讴歌\",\n        \"furano yukihira\": \"雪平富良野\",\n        \"chiwa harusaki\": \"春咲千和\",\n        \"eita kidou\": \"季堂锐太\",\n        \"masuzu natsukawa\": \"夏川真凉\",\n        \"himeka akishino\": \"秋篠姬香\",\n        \"ai fuyuumi\": \"冬海爱衣\",\n        \"kyousuke kousaka\": \"高坂京介\",\n        \"kirino kousaka\": \"高坂桐乃\",\n        \"ruri gokou\": \"五更琉璃（黑猫）\",\n        \"ayase aragaki\": \"新垣绫濑\",\n        \"saori makishima\": \"槙岛沙织（沙织·巴吉纳）\",\n        \"kanako kurusu\": \"来栖加奈子\",\n        \"bridget evans\": \"布莉姬·伊凡斯\",\n        \"sena akagi\": \"赤城濑菜\",\n        \"kouhei akagi\": \"赤城浩平\",\n        \"manami tamura\": \"田村麻奈实\",\n        \"daisuke kousaka\": \"高坂大介\",\n        \"tamaki gokou\": \"五更珠希\",\n        \"hinata gokou\": \"五更日向\",\n        \"ria hagry\": \"莉亚·哈格丽\",\n        \"azusa nakano\": \"中野梓\",\n        \"jun suzuki\": \"铃木纯\",\n        \"mio akiyama\": \"秋山澪\",\n        \"ritsu tainaka\": \"田井中律\",\n        \"sawako yamanaka\": \"山中佐和子\",\n        \"tsumugi kotobuki\": \"琴吹䌷\",\n        \"ui hirasawa\": \"平泽忧\",\n        \"yui hirasawa\": \"平泽唯\",\n        \"nodoka manabe\": \"真锅和\",\n        \"satoshi tainaka\": \"田井中聪\",\n        \"sumire saitou\": \"齐藤堇\",\n        \"megumi sokabe\": \"曾我部惠\",\n        \"luste teuber\": \"露斯特·特依巴\",\n        \"spiritia rosenberg\": \"斯匹莉缇娅·罗森伯格\",\n        \"yui yuigahama\": \"由比滨结衣\",\n        \"hachiman hikigaya\": \"比企谷八幡\",\n        \"komachi hikigaya\": \"比企谷小町\",\n        \"saki kawasaki\": \"川崎沙希\",\n        \"keika kawasaki\": \"川崎桂花\",\n        \"yoshiteru zaimokuza\": \"材木座义辉\",\n        \"yukino yukinoshita\": \"雪之下雪乃\",\n        \"iroha isshiki\": \"一色彩羽\",\n        \"hayato hayama\": \"叶山隼人\",\n        \"saika totsuka\": \"户冢彩加\",\n        \"haruno yukinoshita\": \"雪之下阳乃\",\n        \"shizuka hiratsuka\": \"平冢静\",\n        \"yuuta togashi\": \"富㭴勇太\",\n        \"yumeha togashi\": \"富㭴梦叶\",\n        \"rikka takanashi\": \"小鸟游六花\",\n        \"kumin tsuyuri\": \"五月七日茴香\",\n        \"shinka nibutani\": \"丹生谷森夏\",\n        \"sanae dekomori\": \"凸守早苗\",\n        \"satone shichimiya\": \"七宫智音\",\n        \"touka takanashi\": \"小鸟游十花\",\n        \"mercy\": \"天使\",\n        \"tracer\": \"猎空\",\n        \"widowmaker\": \"黑百合\",\n        \"mei\": \"美\",\n        \"d.va\": \"D.VA\",\n        \"zarya\": \"查莉娅\",\n        \"genjii\": \"源氏\",\n        \"junkrat\": \"狂鼠\",\n        \"roadhog\": \"路霸\",\n        \"pharah\": \"法老之鹰\",\n        \"soldier 76\": \"士兵：76\",\n        \"symmetra\": \"秩序之光\",\n        \"winston\": \"温斯顿\",\n        \"sombra\": \"黑影\",\n        \"ana\": \"安娜\",\n        \"ashe\": \"艾什\",\n        \"cortana\": \"科塔娜\",\n        \"gordon freeman\": \"戈登·弗里曼\",\n        \"alyx vance\": \"爱丽克斯·凡斯\",\n        \"chell\": \"雪儿\",\n        \"emilia\": \"爱蜜莉雅\",\n        \"rem\": \"雷姆\",\n        \"subaru natsuki\": \"菜月昴\",\n        \"beatrice\": \"碧翠丝\",\n        \"felix argyle\": \"菲利克斯·阿盖尔\",\n        \"felt\": \"菲鲁特\",\n        \"roswaal l. mathers\": \"罗兹瓦尔·L·梅札斯\",\n        \"otto suewen\": \"奥托·苏文\",\n        \"julius euclius\": \"由里乌斯·尤克历乌斯\",\n        \"elsa granhiert\": \"艾尔莎·葛兰西尔特\",\n        \"tomoya aki\": \"安艺伦也\",\n        \"megumi kato\": \"加藤惠\",\n        \"utaha kasumigaoka\": \"霞之丘诗羽\",\n        \"michiru hyodo\": \"冰堂美智留\",\n        \"eriri spencer sawamura\": \"泽村·斯宾塞·英梨梨\",\n        \"izumi hashima\": \"波岛出海\",\n        \"kobato hasegawa\": \"羽濑川小鸠\",\n        \"kodaka hasegawa\": \"羽濑川小鹰\",\n        \"rika shiguma\": \"志熊理科\",\n        \"sena kashiwazaki\": \"柏崎星奈\",\n        \"yozora mikazuki\": \"三日月夜空\",\n        \"yukimura kusunoki\": \"楠幸村\",\n        \"maria takayama\": \"高山玛利亚\",\n        \"ageha\": \"扬羽\",\n        \"aimu\": \"蓝梦\",\n        \"aria\": \"亚璃亚\",\n        \"ashiya\": \"芦屋\",\n        \"asuka\": \"飞鸟\",\n        \"ayame\": \"菖蒲\",\n        \"bashou\": \"芭蕉\",\n        \"chihaya\": \"千早\",\n        \"chiyo\": \"千代\",\n        \"daidouji\": \"大道寺前辈\",\n        \"fuga\": \"风雅\",\n        \"fuma\": \"风魔\",\n        \"ginrei\": \"银岭\",\n        \"haruka\": \"春花\",\n        \"hibari\": \"云雀\",\n        \"hijikata\": \"土方\",\n        \"hikage\": \"日影\",\n        \"homura\": \"焰\",\n        \"ikaruga\": \"斑鸠\",\n        \"imu\": \"忌梦\",\n        \"josui\": \"如水\",\n        \"kaede\": \"枫\",\n        \"kagari\": \"篝\",\n        \"kanon\": \"花音\",\n        \"kanzaki\": \"神咲\",\n        \"kochou\": \"胡蝶\",\n        \"kumi\": \"九魅\",\n        \"kuroudo\": \"藏人\",\n        \"mai\": \"舞\",\n        \"meimei\": \"美莓\",\n        \"minori\": \"美野里\",\n        \"mirai\": \"未来\",\n        \"misato\": \"深里\",\n        \"miyabi\": \"雅绯\",\n        \"motochika\": \"元亲\",\n        \"muramasa\": \"村正\",\n        \"murasaki\": \"紫\",\n        \"naraku\": \"奈乐\",\n        \"ryoubi\": \"两备\",\n        \"ryouna\": \"两奈\",\n        \"sakyou\": \"左京\",\n        \"seimei\": \"清明\",\n        \"siki\": \"四季\",\n        \"shiki\": \"四季\",\n        \"souji\": \"总司\",\n        \"suzune\": \"铃音（凛）\",\n        \"syuri\": \"朱璃\",\n        \"ukyou\": \"右京\",\n        \"ushimaru\": \"牛丸\",\n        \"yagyuu\": \"柳生\",\n        \"yomi\": \"咏\",\n        \"yoshimitsu\": \"吉光\",\n        \"yozakura\": \"夜樱\",\n        \"yugiri\": \"夕雾\",\n        \"yumi\": \"雪泉\",\n        \"yuyaki\": \"夕烧\",\n        \"tohru\": \"托尔\",\n        \"kanna kamui\": \"康娜卡姆依\",\n        \"quetzalcoatl\": \"魁札尔科亚特尔\",\n        \"kobayashi-san\": \"小林\",\n        \"shouta magatsuchi\": \"真土翔太\",\n        \"riko saikawa\": \"才川莉子\",\n        \"elma\": \"艾尔玛\",\n        \"ai-chan\": \"小爱\",\n        \"kouhai-chan\": \"后辈\",\n        \"azusa azuki\": \"小豆梓\",\n        \"youto yokodera\": \"横寺阳人\",\n        \"tsukiko tsutsukakushi\": \"筒隐月子\",\n        \"tsukushi tsutsukakushi\": \"筒隐筑紫\",\n        \"mai maimaki\": \"舞牧麻衣\",\n        \"emanuella porlallora\": \"艾米（艾玛努艾勒·波鲁勒劳拉）\",\n        \"tomoya okazaki\": \"冈崎朋也\",\n        \"fuko ibuki\": \"伊吹风子\",\n        \"kotomi ichinose\": \"一之濑琴美\",\n        \"ryou fujibayashi\": \"藤林椋\",\n        \"kyou fujibayashi\": \"藤林杏\",\n        \"nagisa furukawa\": \"古河渚\",\n        \"tomoyo sakagami\": \"坂上智代\",\n        \"yukine miyazawa\": \"宫泽有纪宁\",\n        \"mei sunohara\": \"春原芽衣\",\n        \"youhei sunohara\": \"春原阳平\",\n        \"misae sagara\": \"相乐美佐枝\",\n        \"sanae furukawa\": \"古河早苗\",\n        \"meiko honma\": \"本间芽衣子\",\n        \"naruko anjou\": \"安城鸣子\",\n        \"chiriko tsurumi\": \"鹤见知利子\",\n        \"jinta yadomi\": \"宿海仁太\",\n        \"atsumu matsuyuki\": \"松雪集\",\n        \"hotaru shidare\": \"枝垂萤\",\n        \"kokonotsu shikada\": \"鹿田九\",\n        \"saya endou\": \"远藤彩\",\n        \"hajime owari\": \"尾张一\",\n        \"aoba suzukaze\": \"凉风青叶\",\n        \"hifumi takimoto\": \"泷本日富美\",\n        \"kou yagami\": \"八神光\",\n        \"rin tooyama\": \"远山伦\",\n        \"hajime shinoda\": \"篠田初\",\n        \"yun iijima\": \"饭岛结音\",\n        \"shizuku hazuki\": \"叶月雫\",\n        \"momiji mochizuki\": \"望月红叶\",\n        \"nene sakura\": \"樱宁宁\",\n        \"umiko ahagon\": \"阿波根海子\",\n        \"yamato christina wako\": \"大和·克莉丝汀·和子\",\n        \"aoi miyamori\": \"宫森葵\",\n        \"ema yasuhara\": \"安原绘麻\",\n        \"midori imai\": \"今井绿\",\n        \"shizuka sakaki\": \"坂木静香\",\n        \"misa toudou\": \"藤堂美沙\",\n        \"misato segawa\": \"濑川美里\",\n        \"erika yano\": \"矢野艾莉卡\",\n        \"rinko ogasawara\": \"小笠原纶子\",\n        \"yuka okitsu\": \"兴津由佳\",\n        \"shun watanabe\": \"渡边隼\",\n        \"ai kunogi\": \"久乃木爱\",\n        \"yumi iguchi\": \"井口祐未\",\n        \"chitose karasuma\": \"乌丸千岁\",\n        \"momoka sono\": \"苑生百花\",\n        \"yae kugayama\": \"久我山八重\",\n        \"alice cartelet\": \"爱丽丝·卡塔雷特\",\n        \"aya komichi\": \"小路绫\",\n        \"karen kujou\": \"九条可怜\",\n        \"shinobu omiya\": \"大宫忍\",\n        \"youko inokuma\": \"猪熊阳子\",\n        \"sakura karasuma\": \"乌丸樱\",\n        \"akari kuzehashi\": \"久世桥朱里\",\n        \"honoka matsubara\": \"松原穗乃花\",\n        \"gabriel tenma white\": \"天真·珈百璃·怀特\",\n        \"vignette tsukinose april\": \"月乃濑·薇奈特·艾普利尔\",\n        \"satanichia kurumizawa mcdowell\": \"胡桃泽·萨塔妮娅·麦克道威尔\",\n        \"raphiel shiraha ainsworth\": \"白羽·菈菲尔·恩兹沃斯\",\n        \"chii\": \"小叽（爱露达）\",\n        \"yumi omura\": \"大村裕美\",\n        \"sumomo\": \"丝茉茉\",\n        \"chitose hibiya\": \"日比谷千岁\",\n        \"hideki motosuwa\": \"本须和秀树\",\n        \"yuzuki\": \"柚姬\",\n        \"minoru kokubunji\": \"国分寺稔\",\n        \"takako shimizu\": \"清水多香子\",\n        \"sylvie\": \"希尔薇\",\n        \"rito yuuki\": \"结城梨斗\",\n        \"ryouko mikado\": \"御门凉子\",\n        \"lala satalin deviluke\": \"菈菈·萨塔琳·戴比路克\",\n        \"haruna sairenji\": \"西连寺春菜\",\n        \"golden darkness\": \"金色暗影\",\n        \"yui kotegawa\": \"古手川唯\",\n        \"mikan yuuki\": \"结城美柑\",\n        \"nemesis\": \"涅墨西斯\",\n        \"saki tenjouin\": \"天条院沙姬\",\n        \"aya fujisaki\": \"藤崎绫\",\n        \"rin kujou\": \"九条凛\",\n        \"mea kurosaki\": \"黑咲芽亚\",\n        \"nana asta deviluke\": \"娜娜·阿斯塔·戴比路克\",\n        \"momo velia deviluke\": \"梦梦·贝莉雅·戴比路克\",\n        \"riko yuusaki\": \"夕崎梨子\",\n        \"sephie michaela deviluke\": \"赛菲·米卡埃拉·戴比路克\",\n        \"tearju lunatique\": \"提亚悠·鲁娜提克\",\n        \"run elsie jewelria\": \"伦·艾尔西·裘利亚\",\n        \"risa momioka\": \"籾冈里纱\",\n        \"mio sawada\": \"泽田未央\",\n        \"oshizu murasame\": \"村雨静\",\n        \"kyouko kirisaki\": \"雾崎恭子\",\n        \"kenichi saruyama\": \"猿山健一\",\n        \"shizu murasame\": \"村雨静\",\n        \"erina nakiri\": \"薙切绘理奈\",\n        \"alice nakiri\": \"薙切爱丽丝\",\n        \"azami nakiri\": \"薙切蓟\",\n        \"ikumi mito\": \"水户郁魅\",\n        \"megumi tadokoro\": \"田所惠\",\n        \"fuyumi mizuhara\": \"水原冬美\",\n        \"souma yukihira\": \"幸平创真\",\n        \"takumi aldini\": \"巧·阿尔迪尼\",\n        \"isami aldini\": \"勇·阿尔迪尼\",\n        \"hisako arato\": \"新户绯沙子\",\n        \"ryou kurokiba\": \"黑木场凉\",\n        \"satoshi isshiki\": \"一色慧\",\n        \"ryouko sakaki\": \"榊凉子\",\n        \"rindou kobayashi\": \"小林龙胆\",\n        \"sagiri izumi\": \"和泉纱雾\",\n        \"elf yamada\": \"山田妖精（艾蜜莉·格兰杰）\",\n        \"masamune izumi\": \"和泉正宗\",\n        \"megumi jinno\": \"神野惠\",\n        \"muramasa senju\": \"千寿村征（梅园花）\",\n        \"tomoe takasago\": \"高砂智惠\",\n        \"super sonico\": \"超级索尼子\",\n        \"super pochaco\": \"超级帕恰子\",\n        \"super taruco\": \"超级桶桶子\",\n        \"ako suminoe\": \"住之江亚香\",\n        \"riko suminoe\": \"住之江理香\",\n        \"keita suminoe\": \"住之江圭太\",\n        \"miharu mikuni\": \"三国美春\",\n        \"agiri goshiki\": \"吴织亚切\",\n        \"sonya\": \"索妮娅\",\n        \"yasuna oribe\": \"折部安奈\",\n        \"kyara botsu\": \"无名子\",\n        \"ika musume\": \"乌贼娘\",\n        \"ayumi tokita\": \"常田鲇美\",\n        \"chizuru aizawa\": \"相泽千鹤\",\n        \"cindy campbell\": \"辛迪·坎贝尔\",\n        \"eiko aizawa\": \"相泽荣子\",\n        \"sanae nagatsuki\": \"长月早苗\",\n        \"takeru aizawa\": \"相泽武\",\n        \"kiyomi sakura\": \"纱仓清美\",\n        \"nagisa saitou\": \"齐藤渚\",\n        \"miku hatsune\": \"初音未来\",\n        \"luka megurine\": \"巡音流歌\",\n        \"len kagamine\": \"镜音连\",\n        \"rin kagamine\": \"镜音铃\",\n        \"haku yowane\": \"弱音白\",\n        \"gumi\": \"GUMI\",\n        \"akari kizuna\": \"绁星灯\",\n        \"yukari yuzuki\": \"结月缘\",\n        \"maki tsurumaki\": \"弦卷真纪\",\n        \"akane kotonoha\": \"琴叶茜\",\n        \"aoi kotonoha\": \"琴叶葵\",\n        \"zunko tohoku\": \"东北俊子\",\n        \"tsudumi suzuki\": \"铃木梓梓弥\",\n        \"sorata kanda\": \"神田空太\",\n        \"mashiro shiina\": \"椎名真白\",\n        \"nanami aoyama\": \"青山七海\",\n        \"misaki kamiigusa\": \"上井草美咲\",\n        \"chihiro sengoku\": \"千石千寻\",\n        \"ryuuji takasu\": \"高须龙儿\",\n        \"taiga aisaka\": \"逢坂大河\",\n        \"minori kushieda\": \"栉枝实乃梨\",\n        \"ami kawashima\": \"川岛亚美\",\n        \"yasuko takasu\": \"高须泰子\",\n        \"maya kihara\": \"木原麻耶\",\n        \"nanako kashii\": \"香椎奈奈子\",\n        \"yuri koigakubo\": \"恋洼百合\",\n        \"yuusaku kitamura\": \"北村佑作\",\n        \"sakura kanou\": \"狩野樱\",\n        \"sumire kanou\": \"狩野堇\",\n        \"akito himenokouji\": \"姬小路秋人\",\n        \"akiko himenokouji\": \"姬小路秋子\",\n        \"anastasia nasuhara\": \"那须原安娜史塔希亚\",\n        \"ginbei haruomi sawatari\": \"猿渡银兵卫春臣\",\n        \"arashi nikaidou\": \"二阶堂岚\",\n        \"arisa takanomiya\": \"鹰乃宫亚里沙\",\n        \"origami tobiichi\": \"鸢一折纸\",\n        \"kurumi tokisaki\": \"时崎狂三\",\n        \"yoshino himekawa\": \"冰芽川四糸乃\",\n        \"kotori itsuka\": \"五河琴里\",\n        \"kaguya yamai\": \"八舞耶俱矢\",\n        \"yuzuru yamai\": \"八舞夕弦\",\n        \"miku izayoi\": \"诱宵美九\",\n        \"tohka yatogami\": \"夜刀神十香\",\n        \"shido itsuka\": \"五河士道\",\n        \"reine murasame\": \"村雨令音\",\n        \"mayuka kondou\": \"近藤茧佳\",\n        \"nao takanashi\": \"高梨奈绪\",\n        \"iroha tsuchiura\": \"土浦彩叶\",\n        \"nyaruko\": \"奈亚子\",\n        \"cthugha\": \"克图格亚\",\n        \"mahiro yasaka\": \"八坂真寻\",\n        \"hastur\": \"哈斯太\",\n        \"konoe tsuruma\": \"鹤真心乃枝\",\n        \"miyabi kannagi\": \"神凪雅\",\n        \"himeko inaba\": \"稻叶姬子\",\n        \"iori nagase\": \"永濑伊织\",\n        \"taichi yaegashi\": \"八重㭴太一\",\n        \"yui kiriyama\": \"桐山唯\",\n        \"yoshifumi aoki\": \"青木义文\",\n        \"raku ichijou\": \"一条乐\",\n        \"kosaki onodera\": \"小野寺小咲\",\n        \"haru onodera\": \"小野寺春\",\n        \"yui kanakura\": \"奏仓羽\",\n        \"marika tachibana\": \"橘万里花\",\n        \"chitoge kirisaki\": \"桐崎千棘\",\n        \"seishirou tsugumi\": \"鸫诚士郎\",\n        \"ruri miyamoto\": \"宫本琉璃\",\n        \"fumino serizawa\": \"芹泽文乃\",\n        \"nozomi kiriya\": \"雾谷希\",\n        \"chise umenomori\": \"梅之森千世\",\n        \"otome tsuzuki\": \"都筑乙女\",\n        \"touma kamijou\": \"上条当麻\",\n        \"mikoto misaka\": \"御坂美琴\",\n        \"misuzu misaka\": \"御坂美铃\",\n        \"aisa himegami\": \"姬神秋沙\",\n        \"mii konori\": \"固法美伟\",\n        \"seiri fukiyose\": \"吹寄制理\",\n        \"kaori kanzaki\": \"神裂火织\",\n        \"komoe tsukuyomi\": \"月咏小萌\",\n        \"misaka-imouto\": \"御坂妹妹\",\n        \"last order\": \"最后之作\",\n        \"index librorum prohibitorum\": \"茵蒂克丝\",\n        \"kuroko shirai\": \"白井黑子\",\n        \"misaki shokuhou\": \"食蜂操祈\",\n        \"mitsuko kongou\": \"婚后光子\",\n        \"kinuho wannai\": \"湾内绢保\",\n        \"maaya awatsuki\": \"泡浮万彬\",\n        \"aiho yomikawa\": \"黄泉川爱穗\",\n        \"tsuzuri tessou\": \"铁装缀里\",\n        \"maika tsuchimikado\": \"土御门舞夏\",\n        \"erii haruue\": \"春上衿衣\",\n        \"ruiko saten\": \"佐天泪子\",\n        \"kazari uiharu\": \"初春饰利\",\n        \"accelerator\": \"一方通行\",\n        \"oriana thomson\": \"欧莉安娜·汤姆森\",\n        \"shizuri mugino\": \"麦野沉利\",\n        \"rikou takitsubo\": \"泷壶理后\",\n        \"saiai kinuhata\": \"绢旗最爱\",\n        \"frenda seivelun\": \"芙兰达·塞维伦\",\n        \"shiage hamazura\": \"滨面仕上\",\n        \"hyouka kazakiri\": \"风斩冰华\",\n        \"harumi kiyama\": \"木山春生\",\n        \"motoharu tsuchimikado\": \"土御门元春\",\n        \"itsuwa\": \"五和\",\n        \"lucia\": \"露琪亚\",\n        \"agnese sanctis\": \"雅妮丝·桑提斯\",\n        \"angelene\": \"安洁莉娜\",\n        \"eiga kanmi\": \"甘味荣华\",\n        \"febrie\": \"菲布理\",\n        \"janie\": \"珍妮\",\n        \"shinobu nunotaba\": \"布束砥信\",\n        \"yumi kusakabe\": \"草壁优美\",\n        \"eru chitanda\": \"千反田爱瑠\",\n        \"houtarou oreki\": \"折木奉太郎\",\n        \"mayaka ibara\": \"伊原摩耶花\",\n        \"fuyumi irisu\": \"入须冬实\",\n        \"satoshi fukube\": \"福部里志\",\n        \"ayako kouchi\": \"河内亚也子\",\n        \"mitsuha miyamizu\": \"宫水三叶\",\n        \"yotsuha miyamizu\": \"宫水四叶\",\n        \"miki okudera\": \"奥寺美纪\",\n        \"taki tachibana\": \"立花泷\",\n        \"akihisa yoshii\": \"吉井明久\",\n        \"akira yoshii\": \"吉井玲\",\n        \"hideyoshi kinoshita\": \"木下秀吉\",\n        \"yuuko kinoshita\": \"木下优子\",\n        \"mizuki himeji\": \"姬路瑞希\",\n        \"minami shimada\": \"岛田美波\",\n        \"hazuki shimada\": \"岛田叶月\",\n        \"yuuji sakamoto\": \"坂本雄二\",\n        \"shouko kirishima\": \"雾岛翔子\",\n        \"aiko kudou\": \"工藤爱子\",\n        \"miharu shimizu\": \"清水美春\",\n        \"judy hopps\": \"兔朱迪\",\n        \"nick wilde\": \"狐尼克\",\n        \"jack savage\": \"野蛮杰克\",\n        \"chief bogo\": \"蛮牛局长\",\n        \"bonnie hopps\": \"兔邦妮\",\n        \"nagi\": \"薙\",\n        \"zange\": \"忏悔\",\n        \"jin mikuriya\": \"御厨仁\",\n        \"tsugumi aoba\": \"青叶鸫\",\n        \"shino ookouchi\": \"大河内紫乃\",\n        \"takako kimura\": \"木村贵子\",\n        \"kochou yoshida\": \"良田胡蝶\",\n        \"minori nakazawa\": \"中泽农\",\n        \"ringo kinoshita\": \"木下林檎\",\n        \"natsumi bekki\": \"户次菜摘\",\n        \"sora takanashi\": \"小鸟游空\",\n        \"miu takanashi\": \"小鸟游美羽\",\n        \"hina takanashi\": \"小鸟游雏\",\n        \"yuuta segawa\": \"濑川佑太\",\n        \"raika oda\": \"织田莱香\",\n        \"miia\": \"米亚\",\n        \"centorea shianus\": \"珊卓蕾亚·夏努斯\",\n        \"papi\": \"帕皮\",\n        \"suu\": \"丝\",\n        \"lala\": \"拉拉\",\n        \"rachnera arachnera\": \"拉克涅拉·阿拉克涅拉\",\n        \"manako\": \"真奈子\",\n        \"meroune lorelei\": \"美洛努·罗雷莱\",\n        \"tionishia\": \"提欧尼西亚\",\n        \"cathyl\": \"卡特尔\",\n        \"kimihito kurusu\": \"来留主公人\",\n        \"yuuki oojima\": \"大岛裕树\",\n        \"satsuki shinonome\": \"东云皋月\",\n        \"miho nishizumi\": \"西住美穗\",\n        \"saori takebe\": \"武部沙织\",\n        \"hana isuzu\": \"五十铃华\",\n        \"yukari akiyama\": \"秋山优花里\",\n        \"mako reizei\": \"冷泉麻子\",\n        \"anzu kadotani\": \"角谷杏\",\n        \"yuzu koyama\": \"小山柚子\",\n        \"momo kawashima\": \"河岛桃\",\n        \"noriko isobe\": \"矶边典子\",\n        \"taeko kondou\": \"近藤妙子\",\n        \"shinobu kawanishi\": \"河西忍\",\n        \"akebi sasaki\": \"佐佐木明日\",\n        \"azusa sawa\": \"泽梓\",\n        \"yuuki utsugi\": \"宇津木优季\",\n        \"saki maruyama\": \"丸山纱希\",\n        \"midoriko sono\": \"园绿子\",\n        \"darjeeling\": \"大吉岭\",\n        \"assam\": \"阿萨姆\",\n        \"orange pekoe\": \"橙黄白毫\",\n        \"rosehip\": \"蔷薇果\",\n        \"rukuriri\": \"鲁克莉莉\",\n        \"kay\": \"凯伊\",\n        \"chiyomi anzai\": \"安斋千代美\",\n        \"carpaccio\": \"卡尔帕乔\",\n        \"pepperoni\": \"佩帕罗妮\",\n        \"katyusha\": \"喀秋莎\",\n        \"nonna\": \"农娜\",\n        \"maho nishizumi\": \"西住真穗\",\n        \"erika itsumi\": \"逸见艾丽卡\",\n        \"mika\": \"米卡\",\n        \"aki\": \"阿基\",\n        \"mikko\": \"米科\",\n        \"kinuyo nishi\": \"西绢代\",\n        \"arisu shimada\": \"岛田爱里寿\",\n        \"azumi\": \"杏美\",\n        \"ami chouno\": \"蝶野亚美\",\n        \"rena andou\": \"安藤丽奈\",\n        \"ruka oshida\": \"押田流歌\",\n        \"murakami\": \"村上\",\n        \"yuri isuzu\": \"五十铃百合\",\n        \"shiho nishizumi\": \"西住志穗\",\n        \"yoshiko akiyama\": \"秋山好子\",\n        \"chiyo shimada\": \"岛田千代\",\n        \"a2\": \"A型二号\",\n        \"2b\": \"二号B型\",\n        \"9s\": \"九号S型\",\n        \"megumi noda\": \"野田惠\",\n        \"shinichi chiaki\": \"千秋真一\",\n        \"saki miyanaga\": \"宫永咲\",\n        \"nodoka haramura\": \"原村和\",\n        \"yuuki kataoka\": \"片冈优希\",\n        \"mako someya\": \"染谷真子\",\n        \"hisa takei\": \"竹井久\",\n        \"kyoutarou suga\": \"须贺京太郎\",\n        \"touka ryuumonbuchi\": \"龙门渊透华\",\n        \"hajime kunihiro\": \"国广一\",\n        \"koromo amae\": \"天江衣\",\n        \"mihoko fukuji\": \"福路美穗子\",\n        \"kana ikeda\": \"池田华菜\",\n        \"miharu yoshitome\": \"吉留未春\",\n        \"sumiyo fukabori\": \"深堀纯代\",\n        \"yumi kajiki\": \"加治木由美\",\n        \"momoko touyoko\": \"东横桃子\",\n        \"satomi kanbara\": \"蒲原智美\",\n        \"shizuno takakamo\": \"高鸭稳乃\",\n        \"ako atarashi\": \"新子憧\",\n        \"kuro matsumi\": \"松实玄\",\n        \"yuu matsumi\": \"松实宥\",\n        \"arata sagimori\": \"鹭森灼\",\n        \"harue akado\": \"赤土晴绘\",\n        \"teru miyanaga\": \"宫永照\",\n        \"sumire hirose\": \"弘世堇\",\n        \"awai oohoshi\": \"大星淡\",\n        \"yuuko mase\": \"真濑由子\",\n        \"hiroe atago\": \"爱宕洋榎\",\n        \"kinue atago\": \"爱宕绢惠\",\n        \"kyouko suehara\": \"末原恭子\",\n        \"toki onjouji\": \"园城寺怜\",\n        \"ryuuka shimizudani\": \"清水谷龙华\",\n        \"sera eguchi\": \"江口夕\",\n        \"hiroko funakubo\": \"船久保浩子\",\n        \"izumi nijou\": \"二条泉\",\n        \"komaki jindai\": \"神代小莳\",\n        \"tomoe karijuku\": \"狩宿巴\",\n        \"haru takimi\": \"泷见春\",\n        \"hatsumi usuzumi\": \"薄墨初美\",\n        \"kasumi iwato\": \"石户霞\",\n        \"shiromi kosegawa\": \"小濑川白望\",\n        \"aislinn wishart\": \"爱丝琳·威夏尔特\",\n        \"sae usuzawa\": \"臼泽塞\",\n        \"mairu shirouzu\": \"白水哩\",\n        \"himeko tsuruta\": \"鹤田姬子\",\n        \"yukiko maya\": \"真屋由晖子\",\n        \"yoshiko kainou\": \"戒能良子\",\n        \"kaban\": \"背包\",\n        \"serval\": \"薮猫\",\n        \"common raccoon\": \"浣熊\",\n        \"fennec\": \"耳廓狐\",\n        \"ezo red fox\": \"北狐\",\n        \"silver fox\": \"银狐\",\n        \"moose\": \"驼鹿\",\n        \"shoebill\": \"鲸头鹳\",\n        \"alpaca suri\": \"苏利羊驼\",\n        \"humboldt penguin\": \"汉波德企鹅\",\n        \"emperor penguin\": \"帝企鹅\",\n        \"royal penguin\": \"皇家企鹅\",\n        \"margay\": \"长尾虎猫\",\n        \"black leopard\": \"黑豹\",\n        \"leopard\": \"豹\",\n        \"south african giraffe\": \"南非长颈鹿\",\n        \"sabre tiger\": \"剑齿虎\",\n        \"japanese crested ibis\": \"朱鹮\",\n        \"sora kasugano\": \"春日野穹\",\n        \"haruka kasugano\": \"春日野悠\",\n        \"juliet starling\": \"朱丽叶·斯塔林\",\n        \"shinichi kudo\": \"工藤新一\",\n        \"ran mouri\": \"毛利兰\",\n        \"conan edogawa\": \"江户川柯南\",\n        \"ai haibara\": \"灰原哀\",\n        \"ayumi yoshida\": \"吉田步美\",\n        \"kazuha toyama\": \"远山和叶\",\n        \"heiji hattori\": \"服部平次\",\n        \"kaito kuroba\": \"黑羽快斗\",\n        \"kogoro mouri\": \"毛利小五郎\",\n        \"rei furuya\": \"降谷零\",\n        \"shuuichi akai\": \"赤井秀一\",\n        \"sonoko suzuki\": \"铃木园子\",\n        \"eri kisaki\": \"妃英理\",\n        \"jodie starling\": \"茱蒂·斯泰琳\",\n        \"miwako sato\": \"佐藤美和子\",\n        \"masumi sera\": \"世良真纯\",\n        \"yamcha\": \"雅木茶\",\n        \"bulma briefs\": \"布尔玛\",\n        \"chi chi\": \"琪琪\",\n        \"son gohan\": \"孙悟饭\",\n        \"son goten\": \"孙悟天\",\n        \"android 16\": \"人造人16号\",\n        \"android 18\": \"人造人18号\",\n        \"android 21\": \"人造人21号\",\n        \"videl\": \"比迪丽\",\n        \"son goku\": \"孙悟空\",\n        \"spopovich\": \"斯波比奇\",\n        \"vegeta\": \"贝吉塔\",\n        \"trunks briefs\": \"特兰克斯\",\n        \"piccolo\": \"比克\",\n        \"goku black\": \"黑悟空\",\n        \"broly\": \"布罗利\",\n        \"erasa\": \"伊蕾莎\",\n        \"majin buu\": \"魔人布欧\",\n        \"master roshi\": \"武天老师\",\n        \"oolong\": \"乌龙\",\n        \"ranfan\": \"兰芳\",\n        \"lunch\": \"兰琪\",\n        \"panchy brief\": \"布里夫太太\",\n        \"kuro kagami\": \"镜黑\",\n        \"mimi usa\": \"宇佐美美\",\n        \"rin kokonoe\": \"九重凛\",\n        \"daisuke aoki\": \"青木大介\",\n        \"hestia\": \"赫斯缇雅\",\n        \"bell cranel\": \"贝尔·克朗尼\",\n        \"tiona hiryute\": \"蒂奥娜·席吕特\",\n        \"tione hiryute\": \"蒂奥涅·席吕特\",\n        \"aiz wallenstein\": \"艾丝·华伦斯坦\",\n        \"eina tulle\": \"埃伊娜·祖尔\",\n        \"freya\": \"芙蕾雅\",\n        \"hephaistos\": \"赫菲斯托丝\",\n        \"liliruca arde\": \"莉莉露卡·厄德\",\n        \"ryuu lion\": \"琉·璃昂\",\n        \"loki\": \"洛基\",\n        \"syr flova\": \"希儿·福罗瓦\",\n        \"homura akemi\": \"晓美焰\",\n        \"madoka kaname\": \"鹿目圆\",\n        \"mami tomoe\": \"巴麻美\",\n        \"sayaka miki\": \"美树沙耶香\",\n        \"kyouko sakura\": \"佐仓杏子\",\n        \"nagisa momoe\": \"百江渚\",\n        \"kaede akino\": \"秋野枫\",\n        \"rena minami\": \"水波玲奈\",\n        \"yachiyo nanami\": \"七海八千代\",\n        \"iroha tamaki\": \"环彩羽\",\n        \"kyubey\": \"丘比\",\n        \"kyousuke kamijou\": \"上条恭介\",\n        \"danua\": \"达奴娅\",\n        \"djeeta\": \"姬塔\",\n        \"eugen\": \"欧根\",\n        \"gran\": \"格兰\",\n        \"io\": \"伊欧\",\n        \"lyria\": \"露莉亚\",\n        \"katalina\": \"卡塔莉娜\",\n        \"narmaya\": \"娜尔梅亚\",\n        \"rosetta\": \"萝赛塔\",\n        \"sturm\": \"斯特姆\",\n        \"vira\": \"维拉\",\n        \"vampy\": \"斑比\",\n        \"sakura kinomoto\": \"木之本樱\",\n        \"touya kinomoto\": \"木之本桃矢\",\n        \"yukito tsukishiro\": \"月城雪兔\",\n        \"tomoyo daidouji\": \"大道寺知世\",\n        \"sonomi daidouji\": \"大道寺园美\",\n        \"syaoran li\": \"李小狼\",\n        \"meiling li\": \"李苺铃\",\n        \"rika sasaki\": \"佐佐木利佳\",\n        \"chiharu mihara\": \"三原千春\",\n        \"naoko yanagisawa\": \"柳泽奈绪子\",\n        \"ruby rose\": \"露比·罗丝\",\n        \"weiss schnee\": \"魏丝·雪倪\",\n        \"blake belladonna\": \"布蕾克·贝拉多娜\",\n        \"yang xiao long\": \"阳小龙\",\n        \"erika chiba\": \"千叶艾莉卡\",\n        \"haruka ono\": \"小野遥\",\n        \"honoka mitsui\": \"光井穗香\",\n        \"mari watanabe\": \"渡边摩利\",\n        \"mayumi saegusa\": \"七草真由美\",\n        \"miyuki shiba\": \"司波深雪\",\n        \"mizuki shibata\": \"柴田美月\",\n        \"sayaka mibu\": \"壬生纱耶香\",\n        \"shizuku kitayama\": \"北山雫\",\n        \"suzune ichihara\": \"市原铃音\",\n        \"tatsuya shiba\": \"司波达也\",\n        \"saber\": \"Saber\",\n        \"archer\": \"Archer\",\n        \"lancer\": \"Lancer\",\n        \"caster\": \"Caster\",\n        \"berserker\": \"Berserker\",\n        \"assassin\": \"Assassin\",\n        \"shirou emiya\": \"卫宫士郎\",\n        \"rin tosaka\": \"远坂凛\",\n        \"kirei kotomine\": \"言峰绮礼\",\n        \"sakura matou\": \"间桐樱\",\n        \"shinji matou\": \"间桐慎二\",\n        \"illyasviel von einzbern\": \"伊莉雅丝菲尔·冯·爱因兹贝伦\",\n        \"saber alter\": \"Saber Alter\",\n        \"taiga fujimura\": \"藤村大河\",\n        \"gilgamesh\": \"吉尔伽美什\",\n        \"diarmuid ua duibhne\": \"迪尔姆德·奥迪那\",\n        \"iskandar\": \"伊斯坎达尔\",\n        \"gilles de rais\": \"吉尔·德·莱斯\",\n        \"lancelot\": \"兰斯洛特\",\n        \"kiritsugu emiya\": \"卫宫切嗣\",\n        \"tokiomi tohsaka\": \"远坂时臣\",\n        \"waver velvet\": \"韦伯·维尔维特\",\n        \"ryuunosuke uryuu\": \"雨生龙之介\",\n        \"kariya matou\": \"间桐雁夜\",\n        \"irisviel von einzbern\": \"爱丽丝菲尔·冯·爱因兹贝伦\",\n        \"caren ortensia\": \"卡莲·奥尔黛西亚\",\n        \"bazett fraga mcremitz\": \"巴洁特·法迦·克米兹\",\n        \"sitonai\": \"志度内\",\n        \"ishtar\": \"伊什塔尔\",\n        \"tamamo no mae\": \"玉藻前\",\n        \"shielder\": \"玛修·基列莱特\",\n        \"saber lily\": \"Saber Lily\",\n        \"artoria pendragon\": \"阿尔托莉雅·潘德拉贡\",\n        \"artoria pendragon alter\": \"阿尔托莉雅·潘德拉贡Alter\",\n        \"souji okita\": \"冲田总司\",\n        \"red saber\": \"尼禄·克劳狄乌斯\",\n        \"ayako mitsuzuri\": \"美缀绫子\",\n        \"kane himuro\": \"冰室钟\",\n        \"kaede makidera\": \"莳寺枫\",\n        \"gudao\": \"咕哒男\",\n        \"gudako\": \"咕哒子\",\n        \"kiyohime\": \"清姬\",\n        \"alexander\": \"亚历山大\",\n        \"scathach\": \"斯卡哈\",\n        \"asterios\": \"阿斯忒里俄斯\",\n        \"orion\": \"俄里翁\",\n        \"artemis\": \"阿耳忒弥斯\",\n        \"altera\": \"阿蒂拉\",\n        \"boudica\": \"布狄卡\",\n        \"mysterious heroine x\": \"谜之女主角X\",\n        \"mysterious heroine x alter\": \"谜之女主角X Alter\",\n        \"olga marie animusphere\": \"奥尔加玛丽·阿尼姆斯菲亚\",\n        \"paul bunyan\": \"保罗·班扬\",\n        \"kiara sessyoin\": \"杀生院祈荒\",\n        \"astolfo\": \"阿斯托尔福（阿福）\",\n        \"protagonist\": \"主人公\",\n        \"minamoto no raikou\": \"源赖光\",\n        \"meltryllis\": \"溶解莉莉丝\",\n        \"passionlip\": \"帕森莉普（热情迷唇）\",\n        \"ushiwakamaru\": \"牛若丸\",\n        \"jack the ripper\": \"开膛手杰克\",\n        \"jeanne alter\": \"贞德Alter\",\n        \"nitocris\": \"尼托克丽丝\",\n        \"alice kuonji\": \"久远寺有珠\",\n        \"aoko aozaki\": \"苍崎青子\",\n        \"touko aozaki\": \"苍崎橙子\",\n        \"leysritt\": \"莉洁莉特\",\n        \"chevalier deon\": \"迪昂·德·鲍蒙\",\n        \"nightingale\": \"南丁格尔 | 夜莺\",\n        \"cornelius alba\": \"科尼利厄斯·阿鲁巴\",\n        \"arcueid brunestud\": \"爱尔奎特·布伦史塔德\",\n        \"ciel\": \"希耶尔\",\n        \"circe\": \"喀耳刻\",\n        \"satsuki yumizuka\": \"弓冢五月\",\n        \"shiki tohno\": \"远野志贵\",\n        \"akiha tohno\": \"远野秋叶\",\n        \"kohaku\": \"琥珀\",\n        \"sion eltnam atlasia\": \"紫苑·艾尔特纳姆·阿特拉西亚\",\n        \"dracula\": \"德古拉\",\n        \"francis drake\": \"弗朗西斯·德雷克\",\n        \"elizabeth bathory\": \"伊丽莎白·巴托里\",\n        \"hakuno kishinami\": \"岸波白野（扎比）\",\n        \"hassan of serenity\": \"静谧之哈桑\",\n        \"medb\": \"梅芙\",\n        \"len\": \"莲\",\n        \"celenike icecolle yggdmillennia\": \"赛蕾妮可·艾斯科·千界树\",\n        \"fiore forvedge yggdmillennia\": \"菲奥蕾·弗尔维吉·千界树\",\n        \"chiron\": \"喀戎\",\n        \"achilles\": \"阿喀琉斯\",\n        \"atalanta\": \"阿塔兰忒\",\n        \"kairi sisigou\": \"狮子劫界离\",\n        \"miyako arima\": \"有间都古\",\n        \"chloe von einzbern\": \"克洛伊·冯·爱因兹贝伦（小黑）\",\n        \"luviagelita edelfelt\": \"露维亚瑟琳塔·艾德费尔特\",\n        \"miyu edelfelt\": \"美游·艾德费尔特\",\n        \"sella\": \"塞拉\",\n        \"euryale\": \"尤瑞艾莉（二姐）\",\n        \"shiki ryougi\": \"两仪式\",\n        \"stheno\": \"斯忒诺\",\n        \"mordred pendragon\": \"莫德雷德·潘德拉贡\",\n        \"queen of sheba\": \"示巴女王\",\n        \"wu zetian\": \"武则天\",\n        \"abigail williams\": \"阿比盖尔·威廉姆斯\",\n        \"hans christian andersen\": \"汉斯·克里斯蒂安·安徒生\",\n        \"hector\": \"赫克特\",\n        \"mochizuki chiyome\": \"望月千代女\",\n        \"osakabehime\": \"刑部姬\",\n        \"sakata kintoki\": \"坂田金时\",\n        \"scheherazade\": \"山鲁佐德\",\n        \"suzuka gozen\": \"铃鹿御前\",\n        \"tomoe gozen\": \"巴御前\",\n        \"xuanzang\": \"玄奘\",\n        \"fujino asagami\": \"浅上藤乃\",\n        \"mikiya kokutou\": \"黑桐干也\",\n        \"azaka kokutou\": \"黑桐鲜花\",\n        \"ibaraki douji\": \"茨木童子\",\n        \"anne bonny\": \"安妮·伯妮\",\n        \"mary read\": \"玛莉·瑞德\",\n        \"brynhildr\": \"布伦希尔德\",\n        \"cleopatra\": \"克里奥帕特拉（艳后）\",\n        \"ereshkigal\": \"埃列什基伽勒（艾蕾）\",\n        \"helena blavatsky\": \"海伦娜·布拉瓦茨基\",\n        \"leonardo da vinci\": \"莱昂纳多·达·芬奇\",\n        \"marie antoinette\": \"玛丽·安托瓦内特（蛋糕）\",\n        \"mata hari\": \"玛塔哈丽（舞娘）\",\n        \"medusa\": \"美杜莎\",\n        \"musashi miyamoto\": \"宫本武藏\",\n        \"nobunaga oda\": \"织田信长\",\n        \"penthesilea\": \"彭忒西勒亚\",\n        \"semiramis\": \"赛米拉米斯\",\n        \"shuten douji\": \"酒吞童子\",\n        \"tiamat\": \"提亚马特\",\n        \"bb\": \"BB\",\n        \"bradamante\": \"布拉达曼特\",\n        \"nero claudius bride\": \"尼禄·克劳狄乌斯〔新娘〕\",\n        \"chacha\": \"恰恰 | 茶茶\",\n        \"lavinia whateley\": \"拉薇妮亚·沃特雷\",\n        \"artoria pendragon rider alter\": \"阿尔托莉雅·潘德拉贡〔Alter〕\",\n        \"katsushika hokusai\": \"葛饰北斋（阿荣）\",\n        \"saint martha\": \"玛尔达\",\n        \"murasaki shikibu\": \"紫式部\",\n        \"kazuto kirigaya\": \"桐谷和人（桐人）\",\n        \"asuna yuuki\": \"结城明日奈（亚丝娜）\",\n        \"sachi\": \"幸\",\n        \"keiko ayano\": \"绫野珪子（西莉卡）\",\n        \"rika shinozaki\": \"筱崎里香（莉兹贝特）\",\n        \"rosalia\": \"罗莎莉雅\",\n        \"sasha\": \"纱夏\",\n        \"yolko\": \"夜子\",\n        \"suguha kirigaya\": \"桐谷直叶\",\n        \"lyfa\": \"莉法\",\n        \"shino asada\": \"朝田诗乃（诗乃）\",\n        \"yuuki konno\": \"绀野木棉季（有纪）\",\n        \"nagata shinichi\": \"长田伸一（雷根）\",\n        \"alicia rue\": \"亚丽莎·露\",\n        \"sakuya\": \"朔夜\",\n        \"kuroyukihime\": \"黑雪姬\",\n        \"haruyuki arita\": \"有田春雪\",\n        \"yuniko kouzuki\": \"上月由仁子\",\n        \"chiyuri kurashima\": \"仓岛千百合\",\n        \"akira himi\": \"冰见晶\",\n        \"fuuko kurasaki\": \"仓崎枫子\",\n        \"takumu mayuzumi\": \"黛拓武\",\n        \"nanoha takamachi\": \"高町奈叶\",\n        \"fate testarossa\": \"菲特·泰斯特罗莎\",\n        \"einhart stratos\": \"艾茵哈特·斯崔特斯\",\n        \"rinne berlinetta\": \"凛音·贝利内塔\",\n        \"vivio takamachi\": \"高町薇薇欧\",\n        \"yuuno scrya\": \"尤诺·斯克莱亚\",\n        \"amy limietta\": \"艾蜜·莉米艾特\",\n        \"erio mondial\": \"艾力奥·曼迪尔\",\n        \"hayate yagami\": \"八神疾风\",\n        \"shamal\": \"莎玛尔\",\n        \"signum\": \"希格纳姆\",\n        \"vita\": \"维塔\",\n        \"reinforce\": \"琳芙斯\",\n        \"fuka reventon\": \"风香·雷文顿\",\n        \"corona timil\": \"珂罗娜·缇米尔\",\n        \"aruf\": \"艾尔芙\",\n        \"zafira\": \"扎斐拉\",\n        \"alisa bannings\": \"爱丽莎·巴尼斯\",\n        \"kyrie florian\": \"琦莉耶·弗洛利安\",\n        \"amitie florian\": \"阿米蒂埃·弗洛利安\",\n        \"precia testarossa\": \"普蕾茜亚·泰斯特罗莎\",\n        \"alicia testarossa\": \"阿丽西亚·泰斯塔罗莎\",\n        \"lindy harlaown\": \"琳蒂·哈拉温\",\n        \"chrono harlaown\": \"克洛诺·哈洛温\",\n        \"caro ru lushe\": \"凯珞·露·露茜\",\n        \"ginga nakajima\": \"银河·中岛\",\n        \"subaru nakajima\": \"昴·中岛\",\n        \"suzuka tsukimura\": \"月村铃鹿\",\n        \"teana lanster\": \"蒂安娜·兰斯达\",\n        \"lutecia alpine\": \"璐缇希雅·阿尔菲诺\",\n        \"uno\": \"乌诺\",\n        \"due\": \"都艾\",\n        \"cinque\": \"琴柯\",\n        \"sein\": \"萨依\",\n        \"sette\": \"塞缇\",\n        \"nove\": \"诺威\",\n        \"dieci\": \"迪艾琦\",\n        \"wendi\": \"温蒂\",\n        \"deed\": \"蒂多\",\n        \"kazuma asougi\": \"亚双义一真\",\n        \"ryuunosuke naruhodou\": \"成步堂龙之介\",\n        \"phoenix wright\": \"成步堂龙一\",\n        \"trucy wright\": \"成步堂美贯\",\n        \"apollo justice\": \"王泥喜法介\",\n        \"maya fey\": \"绫里真宵\",\n        \"mia fey\": \"绫里千寻\",\n        \"pearl fey\": \"绫里春美\",\n        \"athena cykes\": \"希月心音\",\n        \"dick gumshoe\": \"糸锯圭介\",\n        \"ema skye\": \"宝月茜\",\n        \"franziska von karma\": \"狩魔冥\",\n        \"miles edgeworth\": \"御剑怜侍\",\n        \"kristoph gavin\": \"牙琉雾人\",\n        \"klavier gavin\": \"牙琉响也\",\n        \"adrian andrews\": \"华宫雾绪\",\n        \"kay faraday\": \"一条美云\",\n        \"sherlock holmes\": \"夏洛克·福尔摩斯\",\n        \"haruhi suzumiya\": \"凉宫春日\",\n        \"kyon\": \"阿虚\",\n        \"kyon no imouto\": \"虚妹\",\n        \"emiri kimidori\": \"喜绿江美里\",\n        \"mikuru asahina\": \"朝比奈实玖瑠\",\n        \"ryoko asakura\": \"朝仓凉子\",\n        \"tsuruya\": \"鹤屋\",\n        \"yuki nagato\": \"长门有希\",\n        \"itsuki koizumi\": \"古泉一树\",\n        \"kunikida\": \"国木田\",\n        \"taniguchi\": \"谷口\",\n        \"akira yukino\": \"雪乃玲\",\n        \"manaka takane\": \"高岭爱花\",\n        \"nene anegasaki\": \"姐崎宁宁\",\n        \"rinko kobayakawa\": \"小早川凛子\",\n        \"mariana prinsilla\": \"玛莉安娜·普林希拉\",\n        \"miu sagara\": \"相良美宇\",\n        \"kanade tachibana\": \"立华奏\",\n        \"yuri nakamura\": \"仲村由理\",\n        \"yuzuru otonashi\": \"音无结弦\",\n        \"hideki hinata\": \"日向秀树\",\n        \"shiina\": \"椎名\",\n        \"hisako\": \"久子\",\n        \"masami iwasawa\": \"岩泽雅美\",\n        \"miyuki irie\": \"入江美雪\",\n        \"shiori sekine\": \"关根诗织\",\n        \"umaru doma\": \"土间埋\",\n        \"taihei doma\": \"土间大平\",\n        \"kirie motoba\": \"本场切绘\",\n        \"nana ebina\": \"海老名菜菜\",\n        \"sylphynford tachibana\": \"橘·希尔芬福特\",\n        \"takeshi motoba\": \"本场猛（崩巴）\",\n        \"asagi igawa\": \"井河阿莎姬\",\n        \"sakura igawa\": \"井河樱\",\n        \"rinko akiyama\": \"秋山凜子\",\n        \"yukikaze mizuki\": \"水城雪风\",\n        \"shiranui mizuki\": \"水城不知火\",\n        \"lucy ... yamagami\": \"山神露西【以下略】\",\n        \"yutaka hasebe\": \"长谷部丰\",\n        \"tomoki sakurai\": \"樱井智树\",\n        \"ikaros\": \"伊卡洛斯\",\n        \"nymph\": \"妮姆芙\",\n        \"astraea\": \"阿斯特蕾亚\",\n        \"chaos\": \"卡奥斯\",\n        \"sohara mitsuki\": \"见月楚原\",\n        \"hiyori kazane\": \"风音日和\",\n        \"mikako satsukitane\": \"五月田根美香子\",\n        \"blossom\": \"花花\",\n        \"bubbles\": \"泡泡\",\n        \"buttercup\": \"毛毛\",\n        \"cure black\": \"黑天使\",\n        \"cure white\": \"白天使\",\n        \"shiny luminous\": \"夏妮露米纳丝\",\n        \"cure bloom\": \"花天使\",\n        \"cure egret\": \"舞天使\",\n        \"michiru kiryuu\": \"雾生满\",\n        \"kaoru kiryuu\": \"雾生薰\",\n        \"cure dream\": \"梦天使\",\n        \"cure rouge\": \"火天使\",\n        \"cure lemonade\": \"柠檬天使\",\n        \"cure mint\": \"薄荷天使\",\n        \"cure aqua\": \"水天使\",\n        \"milky rose\": \"妙奇露丝\",\n        \"cure peach\": \"桃天使\",\n        \"cure berry\": \"莓天使\",\n        \"cure pine\": \"凤梨天使\",\n        \"eas\": \"伊丝\",\n        \"cure passion\": \"百香果天使\",\n        \"cure blossom\": \"花蕾天使\",\n        \"cure marine\": \"海洋天使\",\n        \"cure sunshine\": \"阳光天使\",\n        \"cure moonlight\": \"月光天使\",\n        \"cure flower\": \"花朵天使\",\n        \"cure ange\": \"圣洁天使\",\n        \"cure amour\": \"爱神天使\",\n        \"cure etoile\": \"星辰天使\",\n        \"cure macherie\": \"挚爱天使\",\n        \"kotori nono\": \"野乃小鸟\",\n        \"cure yell\": \"喝采天使\",\n        \"dark precure\": \"暗之美少女\",\n        \"mizuki hanasaki\": \"花咲美月\",\n        \"momoka kurumi\": \"来海桃香\",\n        \"sakura kurumi\": \"来海樱\",\n        \"tsubaki myoudouin\": \"明堂院椿\",\n        \"cure melody\": \"旋律天使\",\n        \"cure rhythm\": \"节奏天使\",\n        \"siren\": \"赛莲\",\n        \"cure beat\": \"节拍天使\",\n        \"cure muse\": \"缪斯天使\",\n        \"maria houjou\": \"北条真理亚\",\n        \"misora minamino\": \"南野美空\",\n        \"cure happy\": \"快乐天使\",\n        \"cure sunny\": \"晴朗天使\",\n        \"cure peace\": \"和平天使\",\n        \"cure march\": \"旋风天使\",\n        \"cure beauty\": \"美丽天使\",\n        \"ikuyo hoshizora\": \"星空育代\",\n        \"masako hino\": \"日野正子\",\n        \"chiharu kise\": \"黄濑千春\",\n        \"tomoko midorikawa\": \"绿川伦子\",\n        \"shizuko aoki\": \"青木静子\",\n        \"wolfrun\": \"狼伦\",\n        \"akaooni\": \"赤鬼\",\n        \"bad end happy\": \"悲剧快乐天使\",\n        \"bad end sunny\": \"悲剧晴朗天使\",\n        \"bad end peace\": \"悲剧和平天使\",\n        \"bad end march\": \"悲剧旋风天使\",\n        \"bad end beauty\": \"悲剧美丽天使\",\n        \"cure heart\": \"爱心天使\",\n        \"cure diamond\": \"钻石天使\",\n        \"cure rosetta\": \"幸运草天使\",\n        \"cure sword\": \"圣剑天使\",\n        \"cure ace\": \"王牌天使\",\n        \"regina\": \"蕾吉娜\",\n        \"ryoko hishikawa\": \"菱川亮子\",\n        \"cure lovely\": \"可爱天使\",\n        \"cure princess\": \"公主天使\",\n        \"cure honey\": \"蜂蜜天使\",\n        \"cure fortune\": \"命运天使\",\n        \"maria hikawa\": \"冰川麻理亚\",\n        \"cure flora\": \"花神天使\",\n        \"cure mermaid\": \"人鱼天使\",\n        \"cure twinkle\": \"闪亮天使\",\n        \"towa akagi\": \"红城永久\",\n        \"cure scarlet\": \"赤红天使\",\n        \"cure miracle\": \"奇迹天使\",\n        \"cure magical\": \"魔法天使\",\n        \"cure felice\": \"幸福天使\",\n        \"cure whip\": \"奶油天使\",\n        \"cure custard\": \"奶黄天使\",\n        \"cure gelato\": \"冰淇淋天使\",\n        \"cure macaron\": \"马卡龙天使\",\n        \"cure chocolat\": \"巧克力天使\",\n        \"cure parfait\": \"芭菲天使\",\n        \"nobue itou\": \"伊藤伸惠\",\n        \"chika itou\": \"伊藤千佳\",\n        \"miu matsuoka\": \"松冈美羽\",\n        \"matsuri sakuragi\": \"樱木茉莉\",\n        \"ana coppola\": \"安娜·柯普拉\",\n        \"izetta\": \"伊泽塔\",\n        \"ortfine fredericka von eylstadt\": \"奥特菲涅·弗雷德里克·冯·埃尔施塔特\",\n        \"bianca\": \"毕安卡\",\n        \"lotte\": \"萝特\",\n        \"koyomi araragi\": \"阿良良木历\",\n        \"karen araragi\": \"阿良良木火怜\",\n        \"tsukihi araragi\": \"阿良良木月火\",\n        \"kiss-shot acerola-orion heart-under-blade\": \"姬丝秀忒·雅赛劳拉莉昂·刃下心\",\n        \"shinobu oshino\": \"忍野忍\",\n        \"ougi oshino\": \"忍野扇\",\n        \"meme oshino\": \"忍野咩咩\",\n        \"nadeko sengoku\": \"千石抚子\",\n        \"hitagi senjougahara\": \"战场原黑仪\",\n        \"tsubasa hanekawa\": \"羽川翼\",\n        \"suruga kanbaru\": \"神原骏河\",\n        \"mayoi hachikuji\": \"八九寺真宵\",\n        \"deishuu kaiki\": \"贝木泥舟\",\n        \"yotsugi ononoki\": \"斧乃木余接\",\n        \"seiya kanie\": \"可儿江西也\",\n        \"isuzu sento\": \"千斗五十铃\",\n        \"latifa fleuranza\": \"拉媞珐·芙尔兰札\",\n        \"salama\": \"萨拉玛\",\n        \"sylphy\": \"西尔菲\",\n        \"muse\": \"缪斯\",\n        \"kobory\": \"柯波莉\",\n        \"eiko adachi\": \"安达映子\",\n        \"soujirou izumi\": \"泉宗次郎\",\n        \"kanata izumi\": \"泉彼方\",\n        \"konata izumi\": \"泉此方\",\n        \"miki hiiragi\": \"柊美纪\",\n        \"kagami hiiragi\": \"柊镜\",\n        \"tsukasa hiiragi\": \"柊司\",\n        \"miyuki takara\": \"高良美幸\",\n        \"misao kusakabe\": \"日下部美纱绪\",\n        \"ayano minegishi\": \"峰岸绫乃\",\n        \"yutaka kobayakawa\": \"小早川优\",\n        \"minami iwasaki\": \"岩崎南\",\n        \"hiyori tamura\": \"田村日和\",\n        \"patricia martin\": \"帕特莉西亚‧马汀\",\n        \"izumi wakase\": \"若濑和泉\",\n        \"hikaru sakuraba\": \"樱庭光\",\n        \"fuyuki amahara\": \"天原冬纪\",\n        \"yukari takara\": \"高良由香里\",\n        \"subaru hasegawa\": \"长谷川昴\",\n        \"tomoka minato\": \"凑智花\",\n        \"maho misawa\": \"三泽真帆\",\n        \"saki nagatsuka\": \"永冢纱季\",\n        \"hinata hakamada\": \"袴田日向\",\n        \"airi kashii\": \"香椎爱莉\",\n        \"mimi balguerie\": \"米米·巴尔格里\",\n        \"kagetsu hakamada\": \"袴田花月\",\n        \"tsubaki takenaka\": \"竹中椿\",\n        \"hiiragi takenaka\": \"竹中柊\",\n        \"aoi ogiyama\": \"荻山葵\",\n        \"masami fujii\": \"藤井雅美\",\n        \"natsuhi takenaka\": \"竹中夏阳\",\n        \"mihoshi takamura\": \"篁美星\",\n        \"hijiri kuina\": \"久井奈圣\",\n        \"kaori minato\": \"凑花织\",\n        \"nayu hasegawa\": \"长谷川七夕\",\n        \"kamui\": \"卡姆依\",\n        \"takumi\": \"拓海\",\n        \"charlotte\": \"夏洛特 | 夏洛蒂\",\n        \"ryoma\": \"龙马\",\n        \"orochi\": \"远吕智\",\n        \"elise\": \"爱丽丝\",\n        \"flannel\": \"弗拉内尔\",\n        \"camilla\": \"卡米拉\",\n        \"felicia\": \"菲莉西亚\",\n        \"effie\": \"艾尔菲\",\n        \"flora\": \"芙洛拉\",\n        \"hinoka\": \"日乃香\",\n        \"tharja\": \"萨利娅\",\n        \"sakura\": \"樱\",\n        \"joker\": \"小丑\",\n        \"rinkah\": \"燐火\",\n        \"tiki\": \"芝琪\",\n        \"caeda\": \"希妲\",\n        \"catria\": \"卡秋娅\",\n        \"cordelia\": \"缇亚莫\",\n        \"lyndis\": \"琳蒂斯\",\n        \"nowi\": \"诺诺\",\n        \"tuxedo mask\": \"大礼服假面\",\n        \"sailor moon\": \"水手月亮\",\n        \"sailor chibi moon\": \"水手小月亮\",\n        \"sailor mercury\": \"水手水星\",\n        \"sailor mars\": \"水手火星\",\n        \"sailor jupiter\": \"水手木星\",\n        \"sailor venus\": \"水手金星\",\n        \"sailor saturn\": \"水手土星\",\n        \"sailor neptune\": \"水手海王星\",\n        \"sailor uranus\": \"水手天王星\",\n        \"sailor pluto\": \"水手冥王星\",\n        \"kenji tsukino\": \"月野谦之\",\n        \"ikuko tsukino\": \"月野育子\",\n        \"shingo tsukino\": \"月野进悟\",\n        \"naru osaka\": \"大阪奈留\",\n        \"gurio umino\": \"海野栗雄\",\n        \"motoki furuhata\": \"古幡元基\",\n        \"yuuichirou kumada\": \"熊田雄一郎\",\n        \"cammy white\": \"嘉米·怀特\",\n        \"chun-li\": \"春丽\",\n        \"rainbow mika\": \"七川美华\",\n        \"juri han\": \"韩蛛俐\",\n        \"karin kanzuki\": \"神月卡琳\",\n        \"menat\": \"米纳特\",\n        \"kolin\": \"科琳\",\n        \"sakura kasugano\": \"春日野樱\",\n        \"nanase mizugami\": \"水神七濑\",\n        \"zangief\": \"桑吉尔夫\",\n        \"balrog\": \"巴洛克\",\n        \"akuma\": \"豪鬼\",\n        \"blanka\": \"布兰卡\",\n        \"edmond honda\": \"埃德蒙·本田\",\n        \"guile\": \"古烈\",\n        \"ken masters\": \"肯·马斯达斯\",\n        \"ryu\": \"隆\",\n        \"sagat\": \"沙盖特\",\n        \"urien\": \"尤里安\",\n        \"vega\": \"维加\",\n        \"m. bison\": \"拜森\",\n        \"ingrid\": \"英格丽德\",\n        \"laura matsuda\": \"萝拉·松田\",\n        \"sean matsuda\": \"肖恩·松田\",\n        \"popuko\": \"POP子\",\n        \"pipimi\": \"PIPI美\",\n        \"haruka takayama\": \"高山春香\",\n        \"yuu sonoda\": \"园田优\",\n        \"mitsuki sonoda\": \"园田美月\",\n        \"kotone noda\": \"野田琴音\",\n        \"kasumi toyama\": \"户山香澄\",\n        \"tae hanazono\": \"花园多惠\",\n        \"rimi ushigome\": \"牛込里美\",\n        \"saaya yamabuki\": \"山吹沙绫\",\n        \"arisa ichigaya\": \"市谷有咲\",\n        \"yukina minato\": \"凑友希那\",\n        \"sayo hikawa\": \"冰川纱夜\",\n        \"lisa imai\": \"今井莉莎\",\n        \"ako udagawa\": \"宇田川亚子\",\n        \"rinko shirokane\": \"白金燐子\",\n        \"ran mitake\": \"美竹兰\",\n        \"moca aoba\": \"青叶摩卡\",\n        \"himari uehara\": \"上原绯玛丽\",\n        \"tomoe udagawa\": \"宇田川巴\",\n        \"tsugumi hazawa\": \"羽泽鸫\",\n        \"aya maruyama\": \"丸山彩\",\n        \"hina hikawa\": \"冰川日菜\",\n        \"chisato shirasagi\": \"白鹭千圣\",\n        \"maya yamato\": \"大和麻弥\",\n        \"eve wakamiya\": \"若宫伊芙\",\n        \"kokoro tsurumaki\": \"弦卷心\",\n        \"kaoru seta\": \"濑田薰\",\n        \"kanon matsubara\": \"松原花音\",\n        \"misaki okusawa\": \"奥泽美咲\",\n        \"rei wakana\": \"和奏瑞依（LAYER）\",\n        \"rokka asahi\": \"朝日六花（LOCK）\",\n        \"masuki satou\": \"佐藤益木（MASKING）\",\n        \"reona nyubara\": \"鳰原令王那（PAREO）\",\n        \"chiyu tamade\": \"珠手知由（CHU²）\",\n        \"mashiro kurata\": \"仓田真白\",\n        \"nanami hiromachi\": \"广町七深\",\n        \"tsukushi futaba\": \"二叶筑紫\",\n        \"marina tsukishima\": \"月岛麻里奈\",\n        \"kokomi shiina\": \"椎名心实\",\n        \"akane sakurai\": \"樱井明音\",\n        \"fumio murakami\": \"村上文绪\",\n        \"chloe lemaire\": \"克洛伊·勒梅尔\",\n        \"momoko asahina\": \"朝比奈桃子\",\n        \"haruka kazemachi\": \"风町阳歌\",\n        \"mutsumi shigino\": \"鴫野睦\",\n        \"erena mochizuki\": \"望月艾蕾娜\",\n        \"aika tenkuubashi\": \"天空桥爱佳\",\n        \"hakua shiodome\": \"汐留白亚\",\n        \"reiko arisugawa\": \"有栖川丽子\",\n        \"akane segawa\": \"濑川茜\",\n        \"ako tamaki\": \"玉置亚子\",\n        \"hideki nishimura\": \"西村英骑\",\n        \"nanako akiyama\": \"秋山奈奈子\",\n        \"yui saitou\": \"齐藤结衣\",\n        \"nozomi kaminashi\": \"神无希\",\n        \"sayaka miyata\": \"宫田纱耶香\",\n        \"non toyoguchi\": \"丰口浓\",\n        \"fourth raikage\": \"四代目雷影\",\n        \"sakura haruno\": \"春野樱\",\n        \"sasuke uchiha\": \"宇智波佐助\",\n        \"tsunade\": \"纲手\",\n        \"anko mitarashi\": \"御手洗红豆\",\n        \"ino yamanaka\": \"山中井野\",\n        \"kurotsuchi\": \"黑土\",\n        \"sarada uchiha\": \"宇智波佐良娜\",\n        \"tayuya\": \"多由也\",\n        \"temari\": \"手鞠\",\n        \"naruto uzumaki\": \"漩涡鸣人\",\n        \"minato namikaze\": \"波风水门\",\n        \"hinata hyuga\": \"日向雏田\",\n        \"kushina uzumaki\": \"漩涡奇奈\",\n        \"kakashi hatake\": \"旗木卡卡西\",\n        \"shikamaru nara\": \"奈良鹿丸\",\n        \"hashirama senju\": \"千手柱间\",\n        \"madara uchiha\": \"宇智波斑\",\n        \"itachi uchiha\": \"宇智波鼬\",\n        \"boruto uzumaki\": \"漩涡博人\",\n        \"himawari uzumaki\": \"漩涡向日葵\",\n        \"cinque izumi\": \"真红·和泉\",\n        \"millhiore firianno biscotti\": \"米希奥蕾·菲利安诺·比斯科迪\",\n        \"leonmitchelli galette des rois\": \"蕾昂米修莉·加雷特·德·罗瓦\",\n        \"gaul galette des rois\": \"高尔·迦雷特·德·罗瓦\",\n        \"yukikaze panettone\": \"雪风·帕尼托尼\",\n        \"rebecca anderson\": \"蕾蓓卡·安德森\",\n        \"noir vinocacao\": \"诺瓦鲁·可可酒\",\n        \"eclair martinozzi\": \"艾克蕾尔·马尔迪诺基\",\n        \"ricotta elmar\": \"利歌塔·埃玛\",\n        \"nanami takatsuki\": \"高槻七海\",\n        \"brioche darquien\": \"布丽奥修·达尔基昂\",\n        \"couvert eschenbach pastillage\": \"库贝尔·艾申巴赫·帕斯提亚修\",\n        \"percy gaudi\": \"帕西·高迪\",\n        \"vert farbreton\": \"贝尔·法布林塔\",\n        \"violle amaretto\": \"毕欧蕾·亚玛雷特\",\n        \"jaune clafouti\": \"乔奴·克拉芙缇\",\n        \"adelaide grand marnier\": \"阿德莱德·格兰玛尼亚\",\n        \"sharu\": \"夏露\",\n        \"kanata\": \"彼方\",\n        \"eika\": \"艾卡\",\n        \"kizuna ai\": \"绊爱\",\n        \"kaguya luna\": \"辉夜月\",\n        \"mirai akari\": \"Mirai Akari\",\n        \"nojaoji\": \"Mikoko\",\n        \"kira yamato\": \"基拉·大和\",\n        \"miriallia haw\": \"米丽雅莉亚·哈乌\",\n        \"natarle badgiruel\": \"娜塔尔·巴基露露\",\n        \"murrue ramius\": \"玛琉·拉米亚斯\",\n        \"stella loussier\": \"史黛拉·露西耶\",\n        \"meer campbell\": \"米娅·坎贝尔\",\n        \"meyrin hawke\": \"美玲·霍克\",\n        \"lunamaria hawke\": \"露娜玛丽亚·霍克\",\n        \"flay allster\": \"芙蕾·阿尔斯塔\",\n        \"cagalli yula athha\": \"卡嘉莉·尤拉·阿斯哈\",\n        \"lacus clyne\": \"拉克丝·克莱茵\",\n        \"haruhiko ichijou\": \"一条晴彦\",\n        \"mai kawakami\": \"川神舞\",\n        \"reina izumi\": \"和泉玲奈\",\n        \"koito minase\": \"水无濑小糸\",\n        \"doraemon\": \"哆啦A梦\",\n        \"nobita nobi\": \"野比大雄\",\n        \"shizuka minamoto\": \"源静香\",\n        \"suneo honekawa\": \"骨川小夫\",\n        \"takeshi gouda\": \"刚田武（胖虎）\",\n        \"tamako nobi\": \"野比玉子\",\n        \"dorami\": \"哆啦美\",\n        \"hidetoshi dekisugi\": \"出木杉英才\",\n        \"daiwa scarlet\": \"大和赤骥\",\n        \"gold ship\": \"黄金船\",\n        \"hishi amazon\": \"菱亚马逊\",\n        \"mejiro mcqueen\": \"目白麦昆\",\n        \"silence suzuka\": \"无声铃鹿\",\n        \"special week\": \"特别周\",\n        \"tokai teio\": \"东海帝王\",\n        \"taiki shuttle\": \"大树快车\",\n        \"neptune\": \"涅普迪努\",\n        \"noire\": \"诺瓦尔\",\n        \"blanc\": \"布兰\",\n        \"vert\": \"贝露\",\n        \"peashy\": \"皮榭\",\n        \"plutia\": \"普露露特\",\n        \"uzume\": \"天王星涡芽\",\n        \"nepgear\": \"涅普姬雅\",\n        \"uni\": \"优尼\",\n        \"rom\": \"萝姆\",\n        \"purple heart\": \"绀紫之心\",\n        \"black heart\": \"圣黑之心\",\n        \"white heart\": \"纯白之心\",\n        \"green heart\": \"翠绿之心\",\n        \"compa\": \"康帕\",\n        \"cave\": \"Cave\",\n        \"histoire\": \"伊丝特瓦尔\",\n        \"yuu otosaka\": \"乙坂有宇\",\n        \"nao tomori\": \"友利奈绪\",\n        \"misa kurobane\": \"西森柚咲\",\n        \"ayumi otosaka\": \"乙坂步未\",\n        \"ichika nakano\": \"中野一花\",\n        \"nino nakano\": \"中野二乃\",\n        \"miku nakano\": \"中野三玖\",\n        \"yotsuba nakano\": \"中野四叶\",\n        \"itsuki nakano\": \"中野五月\",\n        \"tokino sora\": \"时乃空\",\n        \"roboco\": \"萝卜子\",\n        \"sakura miko\": \"樱巫女\",\n        \"hoshimachi suisei\": \"星街彗星\",\n        \"yozora mel\": \"夜空梅露\",\n        \"aki rosenthal\": \"亚绮·罗森塔尔\",\n        \"akai haato\": \"赤井心\",\n        \"shirakami fubuki\": \"白上吹雪\",\n        \"natsuiro matsuri\": \"夏色祭\",\n        \"minato aqua\": \"凑阿库娅\",\n        \"murasaki shion\": \"紫咲诗音\",\n        \"nakiri ayame\": \"百鬼绫目\",\n        \"yuzuki choco\": \"癒月巧可\",\n        \"oozora subaru\": \"大空昴\",\n        \"ookami mio\": \"大神澪\",\n        \"inugami korone\": \"戌神沁音\",\n        \"nekomata okayu\": \"猫又小粥\",\n        \"usada pekora\": \"兔田佩克拉\",\n        \"uruha rushia\": \"润羽露西娅\",\n        \"shiranui flare\": \"不知火芙蕾雅\",\n        \"shirogane noel\": \"白银诺艾尔\",\n        \"houshou marine\": \"宝钟玛琳\",\n        \"amane kanata\": \"天音彼方\",\n        \"kiryu coco\": \"桐生可可\",\n        \"tsunomaki watame\": \"角卷绵芽\",\n        \"tokoyami towa\": \"常暗永远\",\n        \"himemori luna\": \"姬森璐娜\",\n        \"mumei\": \"无名\",\n        \"ayane\": \"绫音\",\n        \"mai shiranui\": \"不知火舞\",\n        \"naotora ii\": \"井伊直虎\",\n        \"lu lingqi\": \"吕玲绮\",\n        \"zhurong\": \"祝融\",\n        \"sun shang xiang\": \"孙尚香\",\n        \"nene\": \"宁宁\",\n        \"inahime\": \"稻姬\",\n        \"sima yi\": \"司马懿\",\n        \"wang yuanji\": \"王元姬\",\n        \"yue ying\": \"黄月英\",\n        \"zhang chunhua\": \"张春华\",\n        \"zhuge liang\": \"诸葛亮\",\n        \"ranma saotome\": \"早乙女乱马\",\n        \"angela\": \"安吉拉\",\n        \"riesz\": \"莉斯\",\n        \"eucliwood hellscythe\": \"优克莉伍德·海尔赛兹\",\n        \"hinako shijou\": \"四条雏子\",\n        \"yuri sakazaki\": \"坂崎百合\",\n        \"michelle k. davis\": \"米歇尔·K·戴维斯\",\n        \"chihiro ogino\": \"荻野千寻\",\n        \"tessie\": \"泰茜\",\n        \"leia rolando\": \"蕾娅·罗兰德\",\n        \"nami\": \"娜美\",\n        \"tashigi\": \"达斯琪\",\n        \"wang liu mei\": \"王留美\",\n        \"sage\": \"贤者\",\n        \"merchant\": \"商人\",\n        \"hero\": \"勇者\",\n        \"wizard\": \"魔法师\",\n        \"cleric\": \"僧侣\",\n        \"warrior\": \"战士\",\n        \"asuka langley soryu\": \"惣流·明日香·兰格雷\",\n        \"lucina\": \"露琪娜\",\n        \"cynthia\": \"竹兰 | 辛西娅\",\n        \"hikari horaki\": \"洞木光\",\n        \"rei ayanami\": \"绫波丽\",\n        \"milly\": \"米蕾尤\",\n        \"kusuha mizuha\": \"水羽楠叶\",\n        \"seolla schweizer\": \"塞奥拉·修拜亚\",\n        \"fujiko mine\": \"峰不二子\",\n        \"mirai andou\": \"安藤美雷\",\n        \"himea saito\": \"赛托希梅亚\",\n        \"fuu hououji\": \"凤凰寺风\",\n        \"hikaru shindo\": \"进藤光 | 狮堂光\",\n        \"umi ryuuzaki\": \"龙崎海\",\n        \"ai asato\": \"麻里爱\",\n        \"reiko katherine akimoto\": \"秋本丽子\",\n        \"hina\": \"日奈 | 雏\",\n        \"matoi giboshi\": \"拟宝珠缠\",\n        \"lemon giboshi\": \"拟宝珠柠檬\",\n        \"iroha\": \"伊吕波\",\n        \"arle nadja\": \"阿露露\",\n        \"tifa lockhart\": \"蒂法·洛克哈特\",\n        \"aerith gainsborough\": \"艾瑞丝·盖恩斯巴勒\",\n        \"yuffie kisaragi\": \"尤菲·如月\",\n        \"fumie hashimoto\": \"桥本文惠\",\n        \"yuuko amasawa\": \"天泽勇子\",\n        \"yuuko okonogi\": \"小此木京子\",\n        \"elphelt valentine\": \"艾露菲鲁特·华伦泰\",\n        \"jam kuradoberi\": \"藏土缘纱梦\",\n        \"ramlethal valentine\": \"拉姆蕾萨尔·华伦泰\",\n        \"alisa ilinichina amiella\": \"亚莉莎·伊莉妮提娜·阿米耶拉\",\n        \"lara croft\": \"劳拉·克罗夫特\",\n        \"naoto shirogane\": \"白钟直斗\",\n        \"hajime ichinose\": \"一之濑初\",\n        \"rabi en rose\": \"拉比安露斯\",\n        \"lei fang\": \"雷芳\",\n        \"menace\": \"美纳斯\",\n        \"tina armstrong\": \"蒂娜·阿姆斯特朗\",\n        \"anri misugi\": \"美杉杏莉\",\n        \"makoto hozumi\": \"穗积真琴\",\n        \"misao shinohara\": \"筱原美纱绪\",\n        \"sasami iwakura\": \"岩仓砂沙美\",\n        \"maam\": \"玛姆\",\n        \"momo yaoyorozu\": \"八百万百\",\n        \"ochako uraraka\": \"丽日御茶子\",\n        \"tsuyu asui\": \"蛙吹梅雨\",\n        \"izana shinatose\": \"科户濑伊札那\",\n        \"nagate tanikaze\": \"谷风长道\",\n        \"elpeo ple\": \"艾露比·普露\",\n        \"haman karn\": \"哈曼·卡恩\",\n        \"leina ashta\": \"莉娜·亚西塔\",\n        \"ple two\": \"普露兹\",\n        \"kurisu makise\": \"牧濑红莉栖\",\n        \"maribel\": \"玛丽贝尔\",\n        \"precia zan zenosakis\": \"普蕾茜娅·泽诺萨奇斯\",\n        \"ruka urushibara\": \"漆原琉华\",\n        \"yui takamura\": \"篁唯依\",\n        \"nico robin\": \"妮可·罗宾\",\n        \"saint shalulia\": \"夏露莉雅宫\",\n        \"snow white\": \"白雪公主\",\n        \"little red riding hood\": \"小红帽\",\n        \"saaya agata\": \"安形纱绫\",\n        \"mamori anezaki\": \"姊崎真守\",\n        \"sena kobayakawa\": \"小早川濑那\",\n        \"latooni suvota\": \"拉托妮·苏波塔\",\n        \"shine hausen\": \"夏茵·豪森\",\n        \"stella bremer\": \"史黛拉·布瑞梅尔\",\n        \"bianca whitaker\": \"碧安卡·惠特克\",\n        \"crea dolosera\": \"克蕾雅·多萝赛娅\",\n        \"mikono suzushiro\": \"御子乃·铃白\",\n        \"suomi konepi\": \"须绪美·科妮皮\",\n        \"shinji ikari\": \"碇真嗣\",\n        \"reika shimohira\": \"下平玲花\",\n        \"katina tarask\": \"卡琪娜·塔拉斯克\",\n        \"leona garstein\": \"雷欧娜·嘉施泰因\",\n        \"poison\": \"毒药\",\n        \"jessica albert\": \"杰西卡·阿尔芭\",\n        \"jigoku no fubuki\": \"地狱的吹雪\",\n        \"senritsu no tatsumaki\": \"战栗的龙卷\",\n        \"tights brief\": \"塔依丝\",\n        \"hugo\": \"雨果\",\n        \"nel zelpher\": \"奈露\",\n        \"sadi-chan\": \"小萨蒂\",\n        \"mina ashido\": \"芦户三奈\",\n        \"rebecca\": \"蕾贝卡\",\n        \"amazon\": \"亚马逊\",\n        \"sorceress\": \"女巫\",\n        \"serena\": \"莎莉娜 | 瑟妮娅 | 塞瑞娜\",\n        \"shauna\": \"莎娜\",\n        \"kiruko otonashi\": \"音无斩子\",\n        \"boa hancock\": \"波雅·汉库克\",\n        \"monkey d. luffy\": \"蒙奇·D·路飞\",\n        \"elf\": \"精灵\",\n        \"neko musume\": \"猫娘\",\n        \"kaoru matsubara\": \"松原薰\",\n        \"miyako gotokuji\": \"豪得寺美弥子\",\n        \"momoko akatsutsumi\": \"赤提和美子\",\n        \"kougyoku ren\": \"练红玉\",\n        \"masrur\": \"马斯鲁尔\",\n        \"morgiana\": \"摩尔迦娜\",\n        \"sharrkan\": \"迦尔鲁卡\",\n        \"sinbad\": \"辛巴德\",\n        \"yamuraiha\": \"雅姆莱哈\",\n        \"kurumi kumamakura\": \"熊枕久瑠美\",\n        \"priscilla barielle\": \"普莉希拉·跋利耶尔\",\n        \"roomi\": \"萝米\",\n        \"martial artist\": \"武斗家\",\n        \"thief\": \"盗贼\",\n        \"nera briscoletti\": \"芙萝菈\",\n        \"crimson viper\": \"深红毒蛇\",\n        \"blue mary\": \"布鲁玛丽\",\n        \"king\": \"琼\",\n        \"dark magician girl\": \"黑魔术少女\",\n        \"silent magician\": \"沉默魔术师\",\n        \"marcille donato\": \"玛露西露\",\n        \"fumina hoshino\": \"星野文奈\",\n        \"angela balzac\": \"安吉拉·巴尔扎克\",\n        \"yanagi takayama\": \"高山柳\",\n        \"nako oshimizu\": \"押水菜子\",\n        \"sawa okita\": \"冲田纱羽\",\n        \"bloodberry\": \"红莓\",\n        \"cherry\": \"樱桃\",\n        \"sakuya tachibana\": \"橘咲夜\",\n        \"kimi aoi\": \"葵·喜美\",\n        \"tori aoi\": \"葵·托利\",\n        \"akira yamamoto\": \"山本玲\",\n        \"kaoru niimi\": \"新见熏\",\n        \"makoto harada\": \"原田真琴\",\n        \"mikage kiryuu\": \"桐生美影\",\n        \"melda deitz\": \"梅尔达·狄兹\",\n        \"yuki mori\": \"森雪\",\n        \"ainz ooal gown\": \"安兹·乌尔·恭\",\n        \"albedo\": \"雅儿贝德 | 阿贝多\",\n        \"aura bella fiora\": \"亚乌菈·贝拉·菲欧拉\",\n        \"clementine\": \"克莱门汀\",\n        \"mare bello fiore\": \"马雷·贝罗·菲欧雷\",\n        \"shalltear bloodfallen\": \"夏提雅·布拉德弗伦\",\n        \"ai\": \"爱\",\n        \"ai kagano\": \"加贺野爱\",\n        \"mayu\": \"美格\",\n        \"rin\": \"凛\",\n        \"farrah\": \"法拉\",\n        \"zooey\": \"佐伊\",\n        \"natsu dragneel\": \"纳兹·多拉格尼尔\",\n        \"kirara\": \"绮良良\",\n        \"tamaki kousaka\": \"向坂环\",\n        \"sellma\": \"罗克珊努\",\n        \"ruida\": \"莉卡\",\n        \"mar\": \"梅亚\",\n        \"vice\": \"薇思\",\n        \"misato katsuragi\": \"葛城美里\",\n        \"mari illustrious makinami\": \"真希波·真理·伊拉丝多莉亚斯\",\n        \"angewomon\": \"天女兽\",\n        \"kazemon\": \"彩虹兽\",\n        \"ladydevimon\": \"妖女兽\",\n        \"lilamon\": \"丁香兽\",\n        \"lilymon\": \"百合兽\",\n        \"renamon\": \"妖狐兽\",\n        \"sakuyamon\": \"沙古牙兽\",\n        \"zephyrmon\": \"风神兽\",\n        \"martina\": \"玛尔缇娜\",\n        \"sancho\": \"桑丘\",\n        \"barron trump\": \"巴伦·特朗普\",\n        \"donald trump\": \"唐纳德·特朗普\",\n        \"bill clinton\": \"比尔·克林顿\",\n        \"hillary clinton\": \"希拉里·克林顿\",\n        \"vladimir putin\": \"弗拉基米尔·普京\",\n        \"barack obama\": \"巴拉克·奥巴马\",\n        \"taro aso\": \"麻生太郎\",\n        \"abraham lincoln\": \"亚伯拉罕·林肯\",\n        \"george w. bush\": \"乔治·沃克·布什\",\n        \"osama bin laden\": \"奥萨马·本·拉登\",\n        \"adolf hitler\": \"阿道夫·希特勒\",\n        \"anne frank\": \"安妮·弗兰克\",\n        \"lusamine\": \"露莎米奈\",\n        \"angelise ikaruga misurugi\": \"安琪丽莎·斑鸠·米斯尔奇\",\n        \"lelouch vi britannia\": \"鲁路修·vi·布里塔尼亚\",\n        \"c.c.\": \"C.C.\",\n        \"charlotte dunois\": \"夏洛特·德诺阿\",\n        \"nena trinity\": \"妮娜·崔尼帝\",\n        \"louise francoise le blanc de la valliere\": \"露易丝\",\n        \"saito hiraga\": \"平贺才人\",\n        \"shana\": \"夏娜\",\n        \"zero two\": \"02\",\n        \"ichigo\": \"莓\",\n        \"strelizia\": \"鹤望兰号\",\n        \"hiro\": \"广\",\n        \"alice liddell\": \"爱丽丝·李道尔\",\n        \"cinderella\": \"辛德瑞拉\",\n        \"noa himesaka\": \"姬坂乃爱\",\n        \"miyako hoshino\": \"星野宫子\",\n        \"hana shirosaki\": \"白咲花\",\n        \"hinata hoshino\": \"星野日向\",\n        \"may\": \"小遥\",\n        \"dawn\": \"小光\",\n        \"kyaru\": \"凯露\",\n        \"mai sakurajima\": \"樱岛麻衣\",\n        \"ai mizuno\": \"水野爱\",\n        \"yuuma kuga\": \"空闲游真\",\n        \"kokkoro\": \"可可萝\",\n        \"holo\": \"赫萝\",\n        \"marie rose\": \"玛丽·萝丝\",\n        \"helena douglas\": \"海莲娜\",\n        \"sylvanas windrunner\": \"希尔瓦娜斯·风行者\",\n        \"nessa\": \"露璃娜\",\n        \"sonia\": \"索妮亚\",\n        \"mallow\": \"玛奥\",\n        \"melony\": \"美蓉\",\n        \"kama\": \"迦摩\",\n        \"yu mei-ren\": \"虞美人\",\n        \"beni-enma\": \"红阎魔\",\n        \"carmilla\": \"卡米拉\",\n        \"valkyrie\": \"瓦尔基里\",\n        \"chiyo shirayuki\": \"白雪千夜\",\n        \"chitose kurosaki\": \"黑埼千岁\",\n        \"kiyomi saejima\": \"冴岛清美\",\n        \"cure milky\": \"羽衣拉拉\",\n        \"rinko iori\": \"伊织凛子\",\n        \"sei iori\": \"伊织诚\",\n        \"bea\": \"彩豆\",\n        \"kudryavka noumi\": \"能美·库特莉亚芙卡\",\n        \"yuuko shionji\": \"紫苑寺有子\",\n        \"narumi fujishima\": \"藤岛鸣海\",\n        \"sister cleaire\": \"修女克蕾雅\",\n        \"momo chiyoda\": \"千代田桃\",\n        \"yuko yoshida\": \"吉田优子\",\n        \"reines el-melloi archisorte\": \"莱妮丝·埃尔梅罗·阿奇佐尔缇\",\n        \"rindou mikoto\": \"龙胆尊\",\n        \"hotaru ichijou\": \"一条萤\",\n        \"komari koshigaya\": \"越谷小鞠\",\n        \"maria balthasar\": \"玛利亚·巴尔塔札尔\",\n        \"emeralda kasim\": \"艾美拉达·卡西姆\",\n        \"ai hinatsuru\": \"雏鹤爱\",\n        \"ginko sora\": \"空银子\",\n        \"chariot\": \"战轮妖精\",\n        \"strength\": \"力量\",\n        \"kirika akatsuki\": \"晓切歌\",\n        \"asuha chigusa\": \"千种明日叶\",\n        \"kasumi chigusa\": \"千种霞\",\n        \"ange katrina\": \"安洁·卡特莉娜\",\n        \"cagliostro\": \"卡莉奥斯特萝\",\n        \"kyouka hikawa\": \"冰川镜华\",\n        \"retoree\": \"莱托莉\",\n        \"cyan hijirikawa\": \"希安（圣川诗杏）\",\n        \"saren sasaki\": \"佐佐木咲恋\",\n        \"niyon\": \"妮欧\",\n        \"yuel\": \"尤艾尔\",\n        \"societte\": \"苏丝雅\",\n        \"kanau kongou\": \"金刚叶\",\n        \"yuuko aioi\": \"相生祐子\",\n        \"mio naganohara\": \"长野原美绪\",\n        \"mai minakami\": \"水上麻衣\",\n        \"nano shinonome\": \"东云名乃\",\n        \"hakase shinonome\": \"东云博士\",\n        \"kobayashi\": \"小林\",\n        \"ririchiyo shirakiin\": \"白鬼院凛凛蝶\",\n        \"sana inui\": \"乾纱凪\",\n        \"nanachi\": \"娜娜奇\",\n        \"nursery rhyme\": \"童谣\",\n        \"hasuki komai\": \"狛井莲季\",\n        \"juliet persia\": \"朱丽叶·佩尔西亚\",\n        \"romio inuzuka\": \"犬冢露壬雄\",\n        \"himawari furutani\": \"古谷向日葵\",\n        \"sakurako ohmuro\": \"大室樱子\",\n        \"raphtalia\": \"拉芙塔莉雅\",\n        \"filo\": \"菲洛\",\n        \"altina orion\": \"亚尔缇娜·奥莱恩\",\n        \"amiya\": \"阿米娅\",\n        \"regu\": \"雷古\",\n        \"riko\": \"莉可\",\n        \"six\": \"希斯\",\n        \"maple\": \"梅普露 | 枫\",\n        \"nezuko kamado\": \"灶门祢豆子\",\n        \"reina kousaka\": \"高坂丽奈\",\n        \"kumiko oumae\": \"黄前久美子\",\n        \"ririka kenzaki\": \"剑崎梨梨花\",\n        \"kanade hisaishi\": \"久石奏\",\n        \"mizore yoroizuka\": \"铠冢霙\",\n        \"nozomi kasaki\": \"伞木希美\",\n        \"yuuko yoshikawa\": \"吉川优子\",\n        \"natsuki nakagawa\": \"中川夏纪\",\n        \"sapphire kawashima\": \"川岛绿辉\",\n        \"kaori nakaseko\": \"中世古香织\",\n        \"hazuki katou\": \"加藤叶月\",\n        \"haruka ogasawara\": \"小笠原晴香\",\n        \"asuka tanaka\": \"田中明日香\",\n        \"raina kitamura\": \"喜多村来南\",\n        \"mikino oka\": \"冈美贵乃\",\n        \"izumi akazawa\": \"赤泽泉美\",\n        \"noboru taki\": \"泷升\",\n        \"masahiro hashimoto\": \"桥本真博\",\n        \"riko nagase\": \"长濑梨子\",\n        \"takuya gotou\": \"后藤卓也\",\n        \"shuuichi tsukamoto\": \"塚本秀一\",\n        \"akiko yoshizawa\": \"吉泽明子\",\n        \"satomi niiyama\": \"新山聪美\",\n        \"fuutarou uesugi\": \"上杉风太郎\",\n        \"kanao tsuyuri\": \"栗花落香奈乎\",\n        \"shinobu kochou\": \"蝴蝶忍\",\n        \"giyuu tomioka\": \"富冈义勇\",\n        \"mitsuri kanroji\": \"甘露寺蜜璃\",\n        \"zenitsu agatsuma\": \"我妻善逸\",\n        \"tanjirou kamado\": \"灶门炭治郎\",\n        \"kyojuro rengoku\": \"炼狱杏寿郎\",\n        \"obanai iguro\": \"伊黑小芭内\",\n        \"aoi kanzaki\": \"神崎葵\",\n        \"sabito\": \"锖兔\",\n        \"tengen uzui\": \"宇髄天元\",\n        \"hodaka morishima\": \"森岛帆高\",\n        \"chiaki minami\": \"南千秋\",\n        \"haruka minami\": \"南夏奈\",\n        \"kana minami\": \"南春香\",\n        \"mako\": \"真\",\n        \"yuka uchida\": \"内田由加\",\n        \"kaede azusagawa\": \"梓川枫\",\n        \"rio futaba\": \"双叶理央\",\n        \"sakuta azusagawa\": \"梓川咲太\",\n        \"tomoe koga\": \"古贺朋绘\",\n        \"coquelicot\": \"蔻库莉可\",\n        \"erica fontaine\": \"艾莉卡·芳汀\",\n        \"glycine bleumer\": \"库莉西奴·布鲁马\",\n        \"hanabi kitaoji\": \"北大路花火\",\n        \"ichiro ogami\": \"大神一郎\",\n        \"lobelia carlini\": \"罗贝莉娅·卡尔里尼\",\n        \"nodoka toyohama\": \"丰滨和香\",\n        \"shouko makinohara\": \"牧之原翔子\",\n        \"iris chateaubriand\": \"伊莉斯·夏特布里安\",\n        \"sakura shinguji\": \"真宫寺樱\",\n        \"kohran li\": \"李红兰\",\n        \"sumire kanzaki\": \"神崎堇\",\n        \"ci caprice\": \"茜·卡普利斯\",\n        \"mell raison\": \"梅尔·雷森\",\n        \"orihime soletta\": \"索蕾塔·织姬\",\n        \"reni milchstrasse\": \"雷尼·米尔西修特拉瑟\",\n        \"maria tachibana\": \"玛丽亚·橘\",\n        \"kanna kirishima\": \"桐岛神奈\",\n        \"tsubaki takamura\": \"高村椿\",\n        \"ayame fujieda\": \"藤枝菖蒲\",\n        \"cloud strife\": \"克劳德·史特莱夫\",\n        \"kaede fujieda\": \"藤枝枫\",\n        \"diana caprice\": \"黛安娜·卡普利斯\",\n        \"ratchet altair\": \"拉琪特·奥泰尔\",\n        \"shinjiro taiga\": \"大河新次郎\",\n        \"subaru kujou\": \"九条昴\",\n        \"wakana shinguji\": \"真宫寺若菜\",\n        \"carino soletta\": \"卡莉诺·素蕾塔\",\n        \"margueritte chateaubriand\": \"玛格丽特·夏特布里安\",\n        \"yuri sakakibara\": \"榊原由里\",\n        \"gemini sunrise\": \"洁蜜妮·桑莱兹\",\n        \"anthy himemiya\": \"姬宫安茜\",\n        \"utena tenjou\": \"天上欧蒂娜\",\n        \"ai hayasaka\": \"早坂爱\",\n        \"kaguya shinomiya\": \"四宫辉夜\",\n        \"miyuki shirogane\": \"白银御行\",\n        \"chika fujiwara\": \"藤原千花\",\n        \"soushi miketsukami\": \"御狐神双炽\",\n        \"maya tendo\": \"天堂真矢\",\n        \"seto miyako\": \"濑户美夜子\",\n        \"pecorine\": \"佩可莉姆\",\n        \"harumi fujiyoshi\": \"藤吉晴美\",\n        \"chiri kitsu\": \"木津千里\",\n        \"kaere kimura\": \"木村卡愛拉\",\n        \"nozomu itoshiki\": \"糸色望\",\n        \"veight\": \"斑特\",\n        \"wicke\": \"碧珂\",\n        \"astarotte ygvar\": \"亚斯塔萝黛·尤各瓦尔\",\n        \"asuha touhara\": \"塔原明日叶\",\n        \"isadora finnsdottir\": \"伊莎朵拉·方斯德托\",\n        \"ingrid sorveig sorgrims\": \"伊格丽德·索维克·索尔格利吾斯\",\n        \"yumiko miura\": \"三浦优美子\",\n        \"chiyo sakura\": \"佐仓千代\",\n        \"umetarou nozaki\": \"野崎梅太郎\",\n        \"akari kazemiya\": \"风宫茜里\",\n        \"ilya ornstein\": \"伊莉雅·奥恩斯坦\",\n        \"miyako izumo\": \"出云宫子\",\n        \"shinobu kamiki\": \"上喜忍\",\n        \"vikala\": \"碧卡拉\",\n        \"hayate hisakawa\": \"久川飒\",\n        \"nagi hisakawa\": \"久川凪\",\n        \"shika kuroi\": \"黑井诗花\",\n        \"nadeshiko kagamihara\": \"各务原抚子\",\n        \"rin shima\": \"志摩凛\",\n        \"chiaki oogaki\": \"大垣千明\",\n        \"aoi inuyama\": \"犬山葵\",\n        \"ena saitou\": \"齐藤惠那\",\n        \"sugumi kanagata\": \"金潟すぐみ\",\n        \"yasuri araime\": \"新居目安里\",\n        \"raiya kaeruzaka\": \"蛙坂来弥\",\n        \"rita henschel\": \"リタ・ヘンシェル\",\n        \"serina niiya\": \"新谷芹菜\",\n        \"shirley oakley\": \"シャーリー・オークレイ\",\n        \"shitara kaneshiya\": \"兼志谷シタラ\",\n        \"rin himukai\": \"日向リン\",\n        \"giorno giovanna\": \"乔鲁诺·乔巴拿\",\n        \"belzerg stylish sword iris\": \"贝尔泽古·斯黛莉休·索德·爱丽丝\",\n        \"hibiki tsukahara\": \"冢原响\",\n        \"junichi tachibana\": \"橘纯一\",\n        \"mafuyu kirisu\": \"桐须真冬\",\n        \"nariyuki yuiga\": \"唯我成幸\",\n        \"alice zuberg\": \"爱丽丝·滋贝鲁库\",\n        \"selka zuberg\": \"赛鲁卡·滋贝鲁库\",\n        \"haruhiro\": \"哈尔希洛\",\n        \"yume\": \"梦儿\",\n        \"shihoru\": \"席赫露\",\n        \"ranta\": \"蓝德\",\n        \"moguzo\": \"莫古索\",\n        \"merry\": \"梅莉\",\n        \"tamamo cat\": \"玉藻猫\",\n        \"kiritan tohoku\": \"东北切蒲英\",\n        \"rikka takarada\": \"宝多六花\",\n        \"anastasia nikolaevna romanova\": \"阿纳斯塔西娅·尼古拉耶芙娜·罗曼诺娃\",\n        \"miko iino\": \"伊井野弥子\",\n        \"yuu ishigami\": \"石上优\",\n        \"sasaki saku\": \"笹木咲\",\n        \"arulumaya\": \"阿露露梅娅\",\n        \"cain\": \"该隐\",\n        \"mahira\": \"玛琪拉\",\n        \"melissabelle\": \"梅丽莎贝尔\",\n        \"pholia\": \"芙莉亚\",\n        \"sandalphon\": \"圣德芬\",\n        \"akari tsujino\": \"辻野朱里\",\n        \"aru honshou\": \"本庄阿鲁\",\n        \"junko konno\": \"绀野纯子\",\n        \"saki nikaidou\": \"二阶堂咲\",\n        \"yuugiri\": \"夕雾\",\n        \"lily hoshikawa\": \"星川莉莉\",\n        \"koutarou tatsumi\": \"巽幸太郎\",\n        \"sakura minamoto\": \"源樱\",\n        \"tae yamada\": \"山田多惠\",\n        \"ayano sugiura\": \"杉浦绫乃\",\n        \"akari akaza\": \"赤座灯里\",\n        \"kyouko toshinou\": \"岁纳京子\",\n        \"reisalin stout\": \"莱莎琳·斯托特\",\n        \"kudou chitose\": \"久远千岁\",\n        \"higuchi kaede\": \"樋口枫\",\n        \"tsukino mito\": \"月之美兔\",\n        \"yui kusano\": \"草野优衣\",\n        \"kanon daiba\": \"台场夏音\",\n        \"marnie\": \"玛俐\",\n        \"taokaka\": \"桃卡卡\",\n        \"medusa lily\": \"美杜莎(Lancer)\",\n        \"salome\": \"莎乐美\",\n        \"zeta\": \"泽塔\",\n        \"beatrix\": \"贝阿朵丽丝\",\n        \"hoshikawa sara\": \"星川莎拉\",\n        \"honma himawari\": \"本间向日葵🌻\",\n        \"kakyoin chieri\": \"花京院樱桃\",\n        \"lize helesta\": \"莉泽·赫露艾斯塔\",\n        \"saionji mary\": \"西园寺メアリ\",\n        \"suou patra\": \"周防帕特拉\",\n        \"shiina yuika\": \"椎名唯华\",\n        \"shizuka rin\": \"静凛\",\n        \"natori sana\": \"名取纱那\",\n        \"yuzuki roa\": \"梦月萝娅\",\n        \"warabeda meiji\": \"童田明治\",\n        \"souya ichika\": \"宗谷Ichika\",\n        \"raihan\": \"奇巴纳\",\n        \"victor\": \"小胜\",\n        \"hop\": \"赫普\",\n        \"gloria\": \"小优\",\n        \"allister\": \"欧尼奥\",\n        \"klara\": \"克拉拉\",\n        \"dola\": \"多拉\",\n        \"moon\": \"美月\",\n        \"rosa\": \"鸣依\",\n        \"ars almal\": \"阿露丝·阿尔玛\",\n        \"elesa\": \"小菊儿\",\n        \"selene\": \"美月\",\n        \"lillie\": \"莉莉艾\",\n        \"honoka\": \"穗香\",\n        \"hex maniac\": \"灵异迷\",\n        \"hypno\": \"引梦貘人\",\n        \"lana\": \"水莲\",\n        \"lanas mom\": \"水莲的妈妈\",\n        \"kiawe\": \"卡奇\",\n        \"elio\": \"朗日\",\n        \"pikachu\": \"皮卡丘\",\n        \"slowpoke\": \"呆呆兽\",\n        \"izuna hatsuse\": \"初濑伊纲\",\n        \"shiro\": \"白\",\n        \"stephanie\": \"史蒂芬妮\",\n        \"stephanie dola\": \"史蒂芬妮·多拉\",\n        \"jibril\": \"吉普莉尔\",\n        \"sora\": \"空\",\n        \"chizuru ichinose\": \"一之濑千鹤\",\n        \"kazuya kinoshita\": \"木之下和也\",\n        \"sukoya kana\": \"健屋花那\",\n        \"makaino ririmu\": \"魔界之莉莉姆\",\n        \"emma august\": \"艾玛★奥加斯特\",\n        \"hakase fuyuki\": \"叶加濑冬雪\",\n        \"izumo kasumi\": \"出云霞\",\n        \"ushimi ichigo\": \"宇志海莓\",\n        \"yuhi riri\": \"夕阳莉莉\",\n        \"suzuka utako\": \"铃鹿诗子\",\n        \"mononobe alice\": \"物述有栖\",\n        \"moira\": \"摩伊拉\",\n        \"ienaga mugi\": \"家长麦\",\n        \"aki suzuya\": \"铃谷秋\",\n        \"yashiro kizuku\": \"社筑\",\n        \"uduki kou\": \"卯月光\",\n        \"todoroki kyoko\": \"轰京子\",\n        \"suzuki masaru\": \"铃木胜\",\n        \"ryushen\": \"绿仙\",\n        \"morinaka kazaki\": \"森中花咲\",\n        \"kuzuha\": \"葛叶\",\n        \"kenmochi toya\": \"剑持刀也\",\n        \"hanabatake chaika\": \"花畑嘉依卡\",\n        \"fumino tamaki\": \"文野环\",\n        \"elu\": \"艾露\",\n        \"akabane youko\": \"赤羽叶子\",\n        \"aduchi momo\": \"安土桃\",\n        \"yamiyono moruru\": \"暗夜乃莫露露\",\n        \"fuyuki hinata\": \"日向冬树\",\n        \"natsumi hinata\": \"日向夏美\",\n        \"aki hinata\": \"日向秋\",\n        \"cheshire\": \"柴郡\",\n        \"savage\": \"暴行\",\n        \"type 95\": \"95式\",\n        \"aki shiina\": \"椎名亚树\",\n        \"nana sunohara\": \"春原菜菜\",\n        \"ayaka sunohara\": \"春原彩花\",\n        \"yang guifei\": \"杨贵妃\",\n        \"akane shinjou\": \"新条茜\",\n        \"mirai kuriyama\": \"栗山未来\",\n        \"akihito kanbara\": \"神原秋人\",\n        \"ichika orimura\": \"织斑一夏\",\n        \"chifuyu orimura\": \"织斑千冬\",\n        \"gray\": \"格蕾\",\n        \"koyanskaya\": \"高扬斯卡娅\",\n        \"mineva lao zabi\": \"密涅瓦·劳·扎比（汤小美）\",\n        \"marida cruz\": \"玛莉妲·库鲁斯\",\n        \"jeanne alter lily\": \"贞德·Alter·Santa·Lily\",\n        \"mizuki usami\": \"宇佐美瑞希\",\n        \"subaru uchimaki\": \"内卷昴\",\n        \"sayla mass\": \"塞拉·玛斯\",\n        \"daisy mo\": \"墨小菊\",\n        \"violet wen\": \"文芷\",\n        \"sunny chih\": \"迟菓\",\n        \"sarah kerrigan\": \"莎拉·凯瑞甘\",\n        \"ozymandias\": \"奥斯曼狄斯\",\n        \"paimon\": \"派蒙\",\n        \"hilbert\": \"斗也\",\n        \"hilda\": \"希尔达 | 斗子\",\n        \"skyla\": \"风露\",\n        \"elisa\": \"秋子\",\n        \"misty\": \"小霞\",\n        \"alena\": \"安莉娜\",\n        \"reimi saionji\": \"蕾米\",\n        \"maika sakuranomiya\": \"樱之宫莓香\",\n        \"kaho hinata\": \"日向夏帆\",\n        \"mafuyu hoshikawa\": \"星川麻冬\",\n        \"miu amano\": \"天野美雨\",\n        \"hideri kanzaki\": \"神崎日照\",\n        \"claudine saijo\": \"西条克洛迪娜\",\n        \"deutschland\": \"德意志\",\n        \"admiral graf spee\": \"斯佩伯爵海军上将\",\n        \"dunkerque\": \"敦刻尔克\",\n        \"shirayuki tomoe\": \"白雪巴\",\n        \"yui akamatsu\": \"赤松结衣\",\n        \"sat-chan\": \"小幸\",\n        \"kotoha\": \"青山琴叶\",\n        \"ringo oohoshi\": \"大星林檎\",\n        \"shinobu sarutobi\": \"猿飞忍\",\n        \"keine kanzaki\": \"神崎桂音\",\n        \"aoi ichijou\": \"一条葵\",\n        \"lyrule\": \"莉露露\",\n        \"naofumi iwatani\": \"岩谷尚文（盾之勇者）\",\n        \"melty q melromarc\": \"梅蒂·Q·梅洛马格\",\n        \"mirellia q melromarc\": \"米蕾莉亚·Q·梅洛马格\",\n        \"malty melromarc\": \"麦蒂·S·梅洛玛格\",\n        \"motoyasu kitamura\": \"北村元康（枪之勇者）\",\n        \"hana uzaki\": \"宇崎花\",\n        \"tsuki uzaki\": \"宇崎月\",\n        \"shinichi sakurai\": \"樱井真一\",\n        \"ryoko yoshida\": \"吉田良子\",\n        \"sieg\": \"齐格\",\n        \"hajime nagumo\": \"南云始\",\n        \"yue\": \"月\",\n        \"shea haulia\": \"希娅·哈乌利亚\",\n        \"kaori shirasaki\": \"白崎香织\",\n        \"hanako honda\": \"本田华子\",\n        \"olivia\": \"奥莉薇\",\n        \"kasumi nomura\": \"野村香纯\",\n        \"merribit stapleton\": \"梅莉毕德･斯泰普尔顿\",\n        \"tanya von degurechaff\": \"谭雅·提古雷查夫\",\n        \"viktoriya ivanovna serebryakov\": \"维夏\",\n        \"takamiya rion\": \"鹰宫莉音\",\n        \"ruka sarashina\": \"更科瑠夏\",\n        \"sumi sakurasawa\": \"樱泽墨\",\n        \"mami nanami\": \"七海麻美\",\n        \"frankenstein\": \"弗兰肯斯坦（肯娘）\",\n        \"nina maehara\": \"前原仁菜\",\n        \"uruka takemoto\": \"武元润香\",\n        \"fumino furuhashi\": \"古桥文乃\",\n        \"rizu ogata\": \"绪方理珠\",\n        \"asumi kominami\": \"小美浪爱澄\",\n        \"echidna\": \"艾姬多娜\",\n        \"haruka oozora\": \"大空遥\",\n        \"kanata higa\": \"比嘉彼方\",\n        \"narumi tooi\": \"远井成美\",\n        \"ayasa tachibana\": \"立花彩纱\",\n        \"leaf\": \"叶子\",\n        \"diablo\": \"迪亚布罗（坂本拓真）\",\n        \"rem galleu\": \"蕾姆·嘉蕾邬\",\n        \"shera l. greenwood\": \"雪拉·L·古林伍德\",\n        \"alicia crystella\": \"艾莉西亚·库里斯特拉\",\n        \"edelgard\": \"艾德尔卡特\",\n        \"krebskulm\": \"库尔姆\",\n        \"chocola\": \"巧克力\",\n        \"cinnamon\": \"桂\",\n        \"coconut\": \"椰子\",\n        \"vanilla\": \"香草\",\n        \"shinku nikaidou\": \"二阶堂真红\",\n        \"shiori kashiwazaki\": \"柏崎栞\",\n        \"link\": \"林克\",\n        \"wonder woman\": \"神奇女侠\",\n        \"she-ra\": \"希瑞\",\n        \"rapunzel\": \"长发公主\",\n        \"hulk\": \"浩克\",\n        \"star girl\": \"逐星女\",\n        \"harley quinn\": \"哈莉·奎茵\",\n        \"zatanna zatara\": \"扎塔娜·扎塔拉\",\n        \"starfire\": \"星火\",\n        \"supergirl\": \"超级少女\",\n        \"superwoman\": \"超级女侠\",\n        \"batwoman\": \"蝙蝠女侠\",\n        \"batgirl\": \"蝙蝠少女\",\n        \"barbara gordon\": \"芭芭拉·戈登\",\n        \"blackfire\": \"黑火\",\n        \"bruce wayne\": \"布鲁斯·韦恩\",\n        \"jinx\": \"金克斯\",\n        \"lex luthor\": \"莱克斯·卢瑟\",\n        \"poison ivy\": \"毒藤女\",\n        \"raven\": \"渡鸦\",\n        \"terra\": \"泰拉\",\n        \"black canary\": \"黑金丝雀\",\n        \"cheetah\": \"豹女\",\n        \"giganta\": \"巨化女\",\n        \"lois lane\": \"露易丝·莱恩\",\n        \"miss martian\": \"火星少女\",\n        \"power girl\": \"神力女孩\",\n        \"talia al ghul\": \"塔利亚·艾尔·古尔\",\n        \"vixen\": \"雌狐\",\n        \"le malin\": \"恶毒\",\n        \"suzuki hina\": \"铃木雏\",\n        \"tanaka hime\": \"田中姬\",\n        \"nobukatsu oda\": \"织田信胜\",\n        \"okita souji alter\": \"冲田总司Alter\",\n        \"frostnova\": \"霜星\",\n        \"achikita chinami\": \"うさぎ工房\",\n        \"athena asamiya\": \"麻宫雅典娜\",\n        \"da ji\": \"妲己\",\n        \"da qiao\": \"大乔\",\n        \"dong zhuo\": \"董卓\",\n        \"sun ce\": \"孙策\",\n        \"xiao qiao\": \"小乔\",\n        \"zhao yun\": \"赵云\",\n        \"dakki\": \"妲己\",\n        \"oichi\": \"阿市\",\n        \"itou life\": \"伊东life\",\n        \"rangiku matsumoto\": \"松本乱菊\",\n        \"shining\": \"闪灵\",\n        \"jill valentine\": \"吉尔·瓦伦蒂安\",\n        \"exusiai\": \"能天使\",\n        \"kaworu nagisa\": \"渚薰\",\n        \"hatsune kashiwazaki\": \"柏崎初音\",\n        \"mdr\": \"MDR\",\n        \"keqing\": \"刻晴\",\n        \"atsuko kagari\": \"篝敦子\",\n        \"diana cavendish\": \"戴安娜·卡文迪什\",\n        \"eriko kuraishi\": \"仓石惠理子\",\n        \"monkshood\": \"乌头\",\n        \"makoto kowata\": \"木幡真琴\",\n        \"elaina\": \"伊蕾娜\",\n        \"ganyu\": \"甘雨\",\n        \"jean gunnhildr\": \"琴·古恩希尔德\",\n        \"jean\": \"琴\",\n        \"midori fuse\": \"布施翠\",\n        \"roxy migurdia\": \"洛琪希·米格路迪亚\",\n        \"ghislaine dedoldia\": \"基列奴·泰德路迪亚\",\n        \"eris boreas greyrat\": \"艾莉丝·伯雷亚斯·格雷拉特\",\n        \"aya fujisawa\": \"菖蒲（藤泽彩）\",\n        \"musse egret\": \"妙婕·伊格瑞特\",\n        \"alisa reinford\": \"亚莉莎·莱恩福尔特\",\n        \"fie claussell\": \"菲·克劳赛尔\",\n        \"alfin reise arnor\": \"艾尔芬·莱泽·亚诺尔\",\n        \"chen hui-chieh\": \"陈晖洁\",\n        \"hermione granger\": \"赫敏·格兰杰\",\n        \"shizuru hoshino\": \"星野静流\",\n        \"mifuyu ogami\": \"大神美冬\",\n        \"tamaki miyasaka\": \"宫坂珠希\",\n        \"yuuki\": \"佑树\",\n        \"yaya\": \"夜夜\",\n        \"parvati\": \"帕尔瓦蒂\",\n        \"okada izou\": \"冈田以藏\",\n        \"scathach skadi\": \"斯卡哈·斯卡蒂\",\n        \"caenis\": \"凯妮斯\",\n        \"artoria caster\": \"阿尔托莉雅·卡斯特\",\n        \"atlanta\": \"亚特兰大\",\n        \"kadoc zemlupus\": \"卡多克·泽姆露普斯\",\n        \"qin liangyu\": \"秦良玉\",\n        \"swire\": \"诗怀雅\",\n        \"hayase nagatoro\": \"长瀞早濑\",\n        \"texas\": \"德克萨斯\",\n        \"yuuta hibiki\": \"响裕太\",\n        \"emma\": \"艾玛\",\n        \"norman\": \"诺曼\",\n        \"ray\": \"雷\",\n        \"gilda\": \"吉尔达\",\n        \"nat\": \"奈特\",\n        \"anna\": \"安娜\",\n        \"thoma\": \"托马\",\n        \"phil\": \"菲尔\",\n        \"isabella\": \"伊莎贝拉\",\n        \"mujika\": \"穆希卡\",\n        \"sonju\": \"宋杰\",\n        \"lucas\": \"卢卡斯\",\n        \"yugo\": \"尤格\",\n        \"cecily cambell\": \"瑟希莉·坎贝尔\",\n        \"skadi\": \"斯卡蒂\",\n        \"suzuhara lulu\": \"铃原露露\",\n        \"otogibara era\": \"御伽原江良\",\n        \"yorumi rena\": \"夜见蕾娜\",\n        \"yamagami karuta\": \"山神歌流多\",\n        \"asuka hina\": \"飞鸟雏\",\n        \"hina sorasaki\": \"空崎日奈\",\n        \"rimuru tempest\": \"利姆鲁·特恩佩斯特\",\n        \"milim nava\": \"米莉姆·纳瓦\",\n        \"kotoko iwanaga\": \"岩永琴子\",\n        \"meme touwa\": \"藤和女女\",\n        \"makoto niwa\": \"丹羽真\",\n        \"erio touwa\": \"藤和艾莉欧\",\n        \"langa hasegawa\": \"驰河兰加\",\n        \"reki kyan\": \"喜屋武历\",\n        \"myne\": \"梅茵\",\n        \"ferdinand\": \"斐迪南\",\n        \"misato aikawa\": \"爱川美里\",\n        \"mitama yakumo\": \"八云御魂\",\n        \"momoko togame\": \"十咎桃子\",\n        \"aurelia le guin\": \"奥蕾莉亚·勒瑰恩\",\n        \"celine millstein\": \"瑟蕾奴·米尔斯汀\",\n        \"elie macdowell\": \"艾莉·麦克道尔\",\n        \"kea bannings\": \"琪雅·班宁斯\",\n        \"lapis rosenberg\": \"拉碧丝·罗赞贝尔克\",\n        \"nadia rayne\": \"娜狄雅·莱恩\",\n        \"noel seeker\": \"诺艾尔·希卡\",\n        \"rixia mao\": \"莉夏·毛\",\n        \"tio plato\": \"缇欧·普拉托\",\n        \"vita clotilde\": \"薇塔·克洛提德\",\n        \"duvalie\": \"杜巴莉\",\n        \"elise schwarzer\": \"爱丽榭·舒华泽\",\n        \"juna crawford\": \"悠娜·克劳弗德\",\n        \"renne bright\": \"玲·布莱特\",\n        \"emma millstein\": \"艾玛·米尔斯汀\",\n        \"laura s. arseid\": \"劳拉·S·亚尔赛德\",\n        \"shirley orlando\": \"谢莉·奥兰多\",\n        \"tita russel\": \"提妲·拉赛尔\",\n        \"towa herschel\": \"托娃·赫歇尔\",\n        \"claire rieveldt\": \"克蕾雅·利维特\",\n        \"sara valestein\": \"莎拉·巴雷斯坦\",\n        \"estelle bright\": \"艾丝蒂尔·布莱特\",\n        \"klose rinz\": \"科洛丝·琳希\",\n        \"chika misumi\": \"三角千歌\",\n        \"tsumugi mayumiya\": \"茧宫纺希\",\n        \"nozomi sakurai\": \"樱井望\",\n        \"zhongli\": \"钟离\",\n        \"ningguang\": \"凝光\",\n        \"lappland\": \"拉普兰德\",\n        \"amber\": \"安柏\",\n        \"beidou\": \"北斗\",\n        \"hilichurl\": \"丘丘人\",\n        \"lumine\": \"荧\",\n        \"hu tao\": \"胡桃\",\n        \"kallen stadtfeld\": \"卡莲·休坦菲尔特\",\n        \"suzaku kururugi\": \"枢木朱雀\",\n        \"nunnally vi britannia\": \"娜娜莉·vi·布里塔尼亚\",\n        \"kou\": \"蔻\",\n        \"yu takasaki\": \"高咲侑\",\n        \"shioriko mifune\": \"三船栞子\",\n        \"olga discordia\": \"奥利卡·迪斯克伦蒂亚\",\n        \"mamako oosuki\": \"大好真真子\",\n        \"masato oosuki\": \"大好真人\",\n        \"flare arlgrande jioral\": \"芙列雅·艾尔格兰帝·吉欧拉尔\",\n        \"andira\": \"安琪拉\",\n        \"hacka doll no.3\": \"骇客娃娃3号\",\n        \"hacka doll no.1\": \"骇客娃娃1号\",\n        \"hacka doll no.2\": \"骇客娃娃2号\",\n        \"hacka doll no.4\": \"骇客娃娃4号\",\n        \"shinshuu maru\": \"神州丸\",\n        \"akira amatsume\": \"天女目瑛\",\n        \"nao yorihime\": \"依媛奈绪\",\n        \"batman\": \"蝙蝠侠\",\n        \"galo thymos\": \"加洛·提莫斯\",\n        \"lio fotia\": \"里奥·福蒂亚\",\n        \"qiqi\": \"七七\",\n        \"mujina\": \"貉\",\n        \"yume minami\": \"南梦芽\",\n        \"yomogi asanaka\": \"麻中蓬\",\n        \"anne takamaki\": \"高卷杏\",\n        \"hathaway noa\": \"哈撒韦·诺亚\",\n        \"amuro ray\": \"阿姆罗·雷\",\n        \"char aznable\": \"夏亚·阿兹纳布\",\n        \"quess paraya\": \"葵司\",\n        \"alcina dimitrescu\": \"阿契娜·蒂米特雷斯库\",\n        \"akali\": \"阿卡丽\",\n        \"misae nohara\": \"野原美伢\",\n        \"shinnosuke nohara\": \"野原新之助\",\n        \"hiroshi nohara\": \"野原广志\",\n        \"musae koyama\": \"小山梦冴\",\n        \"mineko kazama\": \"风间峰子\",\n        \"south dakota\": \"南达科他\",\n        \"mona megistus\": \"莫娜·梅姬斯图斯\",\n        \"aether\": \"空\",\n        \"fischl\": \"菲谢尔\",\n        \"eula lawrence\": \"优菈·劳伦斯\",\n        \"barbara pegg\": \"芭芭拉\",\n        \"chongyun\": \"重云\",\n        \"xingqiu\": \"行秋\",\n        \"lisa minci\": \"丽莎·敏兹\",\n        \"noelle\": \"诺艾尔\",\n        \"sucrose\": \"砂糖\",\n        \"diona\": \"迪奥娜\",\n        \"rosaria\": \"罗莎莉亚\",\n        \"klee\": \"可莉\",\n        \"xinyan\": \"辛焱\",\n        \"venti\": \"温迪\",\n        \"xiao\": \"魈\",\n        \"razor\": \"雷泽\",\n        \"suzuran\": \"铃兰\",\n        \"hana midorikawa\": \"绿川花\",\n        \"meiko shiraki\": \"白木芽衣子\",\n        \"luz noceda\": \"露丝·诺西达\",\n        \"toph bei fong\": \"北方·托芙\",\n        \"robin\": \"罗宾\",\n        \"eugeo\": \"尤吉欧\",\n        \"quinella\": \"葵妮拉\",\n        \"makima\": \"玛奇玛\",\n        \"denji\": \"电次\",\n        \"angel devil\": \"天使恶魔\",\n        \"yanfei\": \"烟绯\",\n        \"gawr gura\": \"噶呜·古拉\",\n        \"enoch\": \"伊诺库\",\n        \"veronica\": \"维罗妮卡\",\n        \"murasaki yatsu\": \"八津紫\",\n        \"lucifer\": \"路西法\",\n        \"miyu yamano\": \"共月庭\",\n        \"watashi\": \"我\",\n        \"hina amano\": \"天野阳菜\",\n        \"enderman\": \"末影人\",\n        \"creeper\": \"苦力怕\",\n        \"piglin\": \"猪灵\",\n        \"misa amane\": \"弥海砂\",\n        \"l lawliet\": \"艾尔·罗莱特（L）\",\n        \"light yagami\": \"夜神月\",\n        \"akira toya\": \"塔矢亮\",\n        \"akari fujisaki\": \"藤崎明\",\n        \"tetsuo kaga\": \"加贺铁男\",\n        \"asumi nase\": \"奈濑明日美\",\n        \"mitsuko shindo\": \"进藤美津子\",\n        \"yuki mitani\": \"三谷祐辉\",\n        \"kimihiro tsutsui\": \"筒井公宏\",\n        \"yoko ritona\": \"优子\",\n        \"nia teppelin\": \"尼娅\",\n        \"simon\": \"西蒙\",\n        \"kamina\": \"卡米那\",\n        \"merlin\": \"梅林\",\n        \"akira kogami\": \"小神晶\",\n        \"minoru shiraishi\": \"白石稔\",\n        \"ilulu\": \"伊露露\",\n        \"perseus\": \"英仙座\",\n        \"kitasan black\": \"北部玄驹\",\n        \"haru urara\": \"春丽（春乌拉拉）\",\n        \"mayano top gun\": \"摩耶重炮\",\n        \"rice shower\": \"米浴\",\n        \"satono diamond\": \"里见光钻\",\n        \"fuji kiseki\": \"富士奇迹\",\n        \"maruzensky\": \"丸善斯基\",\n        \"mihono bourbon\": \"美浦波旁\",\n        \"mejiro ardan\": \"目白阿尔丹\",\n        \"gold city\": \"黄金城市\",\n        \"meisho doto\": \"名将怒涛\",\n        \"king halo\": \"圣王光环\",\n        \"nice nature\": \"优秀素质\",\n        \"narita taishin\": \"成田大进\",\n        \"tazuna hayakawa\": \"骏川手纲\",\n        \"agnes tachyon\": \"爱丽速子\",\n        \"manhattan cafe\": \"曼城茶座\",\n        \"grass wonder\": \"草上飞\",\n        \"himiko toga\": \"渡我被身子\",\n        \"black rock shooter\": \"黑岩射手\",\n        \"mio kisaki\": \"希咲美樱\",\n        \"lisa eostre\": \"丽莎·埃奥斯托雷\",\n        \"bertille althusser\": \"贝尔缇优·阿鲁奇赛尔\",\n        \"takahiro mizuno\": \"水野贵弘\",\n        \"shinonome\": \"东云\",\n        \"noel marres ascot\": \"诺埃尔·穆利斯·阿斯科特\",\n        \"celia cumani aintree\": \"苏利亚·库玛尼·安特里\",\n        \"ayako hiiragi\": \"柊木绫子\",\n        \"kayneth archibald el-melloi\": \"肯尼斯·埃尔梅罗·阿奇博尔德\",\n        \"romani archaman\": \"罗玛尼·阿其曼\",\n        \"sadako yamamura\": \"山村贞子\",\n        \"ryuuko matoi\": \"缠流子\",\n        \"satsuki kiryuuin\": \"鬼龙院皋月\",\n        \"mako mankanshoku\": \"满舰饰真子\",\n        \"nonon jakuzure\": \"蛇崩乃音\",\n        \"uzu sanageyama\": \"猿投山涡\",\n        \"ragyo kiryuuin\": \"鬼龙院罗晓\",\n        \"nui harime\": \"针目缝\",\n        \"ira gamagoori\": \"蟆郡苛\",\n        \"houka inumuta\": \"犬牟田宝火\",\n        \"aikuro mikisugi\": \"美木杉爱九郎\",\n        \"tsumugu kinagase\": \"黄长濑䌷\",\n        \"kiki\": \"琪琪\",\n        \"saki watanabe\": \"渡边早季\",\n        \"yui funami\": \"船见结衣\",\n        \"chitose ikeda\": \"池田千岁\",\n        \"chinatsu yoshikawa\": \"吉川千夏\",\n        \"nasa yuzaki\": \"由崎星空\",\n        \"tsukasa yuzaki\": \"由崎司（月读司）\",\n        \"ringo-chan\": \"小苹果\",\n        \"yassan\": \"文学少女\",\n        \"yuno gasai\": \"我妻由乃\",\n        \"reisuke houjou\": \"丰穰礼佑\",\n        \"tsubaki kasugano\": \"春日野椿\",\n        \"minene uryuu\": \"雨流美弥弥\",\n        \"yukiteru amano\": \"天野雪辉\",\n        \"motoko kusanagi\": \"草薙素子\",\n        \"mayuri shiina\": \"椎名真由理\",\n        \"rintarou okabe\": \"冈部伦太郎\",\n        \"suzuha amane\": \"阿万音铃羽\",\n        \"moeka kiryuu\": \"桐生萌郁\",\n        \"faris nyannyan\": \"菲利斯·喵喵\",\n        \"anzu\": \"杏子\",\n        \"hitomi mishima\": \"三岛瞳\",\n        \"komekko\": \"米米\",\n        \"airi akizuki\": \"秋月爱莉\",\n        \"kouzou akizuki\": \"秋月孝三\",\n        \"marina akizuki\": \"秋月真理奈\",\n        \"sana kuranaka\": \"仓中纱奈\",\n        \"airi akitsuki\": \"秋月爱莉\",\n        \"amu hinamori\": \"日奈森亚梦\",\n        \"utau hoshina\": \"月咏歌呗\",\n        \"rima mashiro\": \"真城璃茉\",\n        \"ikuto tsukiyomi\": \"月咏几斗\",\n        \"nadeshiko fujisaki\": \"藤咲抚子\",\n        \"akane tsunemori\": \"常守朱\",\n        \"shino amakusa\": \"天草篠\",\n        \"aria shichijou\": \"七条天空\",\n        \"suzu hagimura\": \"萩村铃\",\n        \"uomi\": \"鱼见千寻\",\n        \"takatoshi tsuda\": \"津田隆利\",\n        \"renge miyauchi\": \"宫内莲华\",\n        \"natsumi koshigaya\": \"越谷夏海\",\n        \"yaichi kuzuryuu\": \"九头龙八一\",\n        \"ai yashajin\": \"夜叉神天衣\",\n        \"inuyama tamaki\": \"犬山玉姬\",\n        \"aliza\": \"阿莉莎\",\n        \"sarasa\": \"萨拉萨\",\n        \"hallessena\": \"哈蕾泽娜\",\n        \"izmir\": \"伊休米尔\",\n        \"razia\": \"拉丝缇娜\",\n        \"magisa\": \"玛姬莎\",\n        \"anna hiiragi\": \"柊杏奈\",\n        \"shirley fenette\": \"夏莉·菲内特\",\n        \"milly ashford\": \"米蕾·阿什弗德\",\n        \"anya alstreim\": \"阿妮亚·阿鲁斯特莱依姆\",\n        \"kaguya sumeragi\": \"皇神乐耶\",\n        \"krillin\": \"克林\",\n        \"rudeus greyrat\": \"鲁迪乌斯·格雷拉特\",\n        \"sylphiette\": \"希露菲叶特\",\n        \"zamasu\": \"扎马斯\",\n        \"kokoro\": \"心\",\n        \"christie\": \"克丽丝蒂\",\n        \"mila\": \"米拉\",\n        \"hitomi\": \"瞳\",\n        \"raiden shogun\": \"雷电将军\",\n        \"musubi\": \"结\",\n        \"shut\": \"夏特\",\n        \"princess jasmine\": \"茉莉公主\",\n        \"aladdin\": \"阿拉丁\",\n        \"ariel\": \"爱丽儿\",\n        \"platelet\": \"血小板\",\n        \"ayaka kamisato\": \"神里绫华\",\n        \"shounagon sei\": \"清少纳言\",\n        \"ritsuko akagi\": \"赤木律子\",\n        \"yui ikari\": \"碇唯\",\n        \"gendo ikari\": \"碇源堂\",\n        \"kensou sie\": \"椎拳崇\",\n        \"andy bogard\": \"安迪·博加德\",\n        \"azuma\": \"吾妻\",\n        \"gorgon\": \"戈尔贡\",\n        \"repulse\": \"反击\",\n        \"north carolina\": \"北卡罗来纳\",\n        \"washington\": \"华盛顿\",\n        \"essex\": \"埃塞克斯\",\n        \"indianapolis\": \"印第安纳波利斯\",\n        \"albacore\": \"大青花鱼\",\n        \"new jersey\": \"新泽西\",\n        \"jean bart\": \"让·巴尔\",\n        \"kokomi sangonomiya\": \"珊瑚宫心海\",\n        \"kashino\": \"樫野\",\n        \"chapayev\": \"恰巴耶夫\",\n        \"saint louis\": \"路易九世\",\n        \"yume nijino\": \"虹野梦\",\n        \"laura sakuraba\": \"樱庭劳拉\",\n        \"mahiru kasumi\": \"香澄真昼\",\n        \"koharu nanakura\": \"七仓小春\",\n        \"ako saotome\": \"早乙女亚子\",\n        \"misogi hodaka\": \"穗高未奏希\",\n        \"yuni shingyouji\": \"真行寺由仁\",\n        \"takagi\": \"高木同学\",\n        \"stella unibell\": \"史黛拉·尤尼贝尔\",\n        \"hotaru futaba\": \"双叶萤\",\n        \"keke tang\": \"唐可可\",\n        \"kasumi yoshizawa\": \"芳泽霞\",\n        \"sae niijima\": \"新岛冴\",\n        \"akira kurusu\": \"来栖晓\",\n        \"futaba sakura\": \"佐仓双叶\",\n        \"haru okumura\": \"奥村春\",\n        \"makoto niijima\": \"新岛真\",\n        \"sadayo kawakami\": \"川上贞代\",\n        \"tae takemi\": \"武见妙\",\n        \"chihaya mifune\": \"御船千早\",\n        \"hifumi togo\": \"东乡一二三\",\n        \"yae miko\": \"八重神子\",\n        \"yoimiya naganohara\": \"宵宫\",\n        \"kei yuuki\": \"结城萤\",\n        \"tadayasu sawaki\": \"泽木直保\",\n        \"sortiliena serlut\": \"索尔狄丽娜·赛路尔特\",\n        \"ronye arabel\": \"罗妮耶·亚拉贝尔\",\n        \"tamami wakiyama\": \"胁山珠美\",\n        \"mimi akane\": \"茜美美\",\n        \"ashley graham\": \"阿什莉·格拉汉姆\",\n        \"mutsuki asagi\": \"浅黄睦月\",\n        \"ryo matsunaga\": \"松永凉\",\n        \"xiangling\": \"香菱\",\n        \"tomimi\": \"特米米\",\n        \"eunectes\": \"森蚺\",\n        \"shouko komi\": \"古见硝子\",\n        \"hitohito tadano\": \"只野仁人\",\n        \"itto arataki\": \"荒泷一斗\",\n        \"princess zelda\": \"塞尔达公主\",\n        \"ren hazuki\": \"叶月恋\",\n        \"sumire heanna\": \"平安名堇\",\n        \"lanzhu zhong\": \"钟岚珠\",\n        \"kanon shibuya\": \"涩谷香音\",\n        \"chisato arashi\": \"岚千砂都\",\n        \"mia taylor\": \"米娅·泰勒\",\n        \"kiana kaslana\": \"琪亚娜·卡斯兰娜\",\n        \"sakura yae\": \"八重樱\",\n        \"hornet\": \"大黄蜂\",\n        \"sara kujou\": \"九条裟罗\",\n        \"smart falcon\": \"醒目飞鹰\",\n        \"asuna ichinose\": \"一之濑明日奈\",\n        \"akane murokasa\": \"室笠茜\",\n        \"karin kakudate\": \"角楯花凛\",\n        \"gray wolf\": \"灰狼\",\n        \"brown bear\": \"棕熊\",\n        \"golden snub-nosed monkey\": \"金丝猴\",\n        \"african wild dog\": \"非洲野犬\",\n        \"kusunoki sio\": \"楠栞桜\",\n        \"sara\": \"莎拉\",\n        \"metera\": \"美黛拉\",\n        \"sutera\": \"斯黛拉\",\n        \"chieru kazama\": \"风间千爱瑠\",\n        \"hanako kuroe\": \"黑江花子\",\n        \"kasumi kirihara\": \"雾原霞\",\n        \"makoto aki\": \"安艺真琴\",\n        \"christina morgan\": \"克莉丝提娜·摩根\",\n        \"mythra\": \"光\",\n        \"pyra\": \"焰\",\n        \"cucouroux\": \"库库鲁\",\n        \"jessica\": \"杰西卡\",\n        \"jasmine\": \"茉莉\",\n        \"karva\": \"卡鲁巴\",\n        \"korwa\": \"可露瓦\",\n        \"noriko takaya\": \"高屋法子\",\n        \"kazumi amano\": \"天野和美\",\n        \"jung freud\": \"荣格·佛洛依德\",\n        \"aru rikuhachima\": \"陆八魔亚瑠\",\n        \"hifumi ajitani\": \"阿慈谷日富美\",\n        \"azusa shirasu\": \"白洲梓\",\n        \"hanako urawa\": \"浦和花子\",\n        \"koharu shimoe\": \"下江小春\",\n        \"sheffy\": \"雪菲\",\n        \"miko yotsuya\": \"四谷见子\",\n        \"hana yurikawa\": \"百合川华\",\n        \"yuria niguredou\": \"二暮堂尤利娅\",\n        \"shenhe\": \"申鹤\",\n        \"futaba marui\": \"丸井双叶\",\n        \"mitsuba marui\": \"丸井三叶\",\n        \"hitoha marui\": \"丸井一叶\",\n        \"kanna akizuki\": \"明月栞那\",\n        \"natsume shiki\": \"四季夏目\",\n        \"nozomi sumizome\": \"墨染希\",\n        \"mei hiuchidani\": \"火打谷爱衣\",\n        \"suzune shioyama\": \"汐山凉音\",\n        \"wakana gojou\": \"五条新菜\",\n        \"marin kitagawa\": \"喜多川海梦\",\n        \"akeno himejima\": \"姬岛朱乃\",\n        \"asia argento\": \"爱莎·阿尔杰特\",\n        \"koneko toujou\": \"塔城小猫\",\n        \"rias gremory\": \"莉雅丝·吉蒙里\",\n        \"amamiya kokoro\": \"天宫心\",\n        \"signora\": \"「女士」罗莎琳\",\n        \"trish una\": \"特里休·乌纳\",\n        \"kei shirogane\": \"白银圭\",\n        \"suigintou\": \"水银灯\",\n        \"kirakishou\": \"雪华绮晶\",\n        \"kanaria\": \"金丝雀\",\n        \"suiseiseki\": \"翠星石\",\n        \"shinku\": \"真红\",\n        \"hina ichigo\": \"雏莓\",\n        \"souseiseki\": \"苍星石\",\n        \"hood\": \"胡德\",\n        \"mrs. yuigahama\": \"由比滨妈妈\",\n        \"mudrock\": \"泥岩\",\n        \"nian\": \"年\",\n        \"soraka\": \"索拉卡\",\n        \"doctor\": \"博士\",\n        \"dusk\": \"夕\",\n        \"sabrina\": \"娜姿\",\n        \"nagao kagetora\": \"长尾景虎\",\n        \"shirabe tsukuyomi\": \"月读调\",\n        \"chris yukine\": \"雪音克莉丝\",\n        \"hibiki tachibana\": \"立花响\",\n        \"miku kohinata\": \"小日向未来\",\n        \"gardevoir\": \"沙奈朵\",\n        \"celestine lucullus\": \"塞蕾斯汀·卢库勒斯\",\n        \"lucario\": \"路卡利欧\",\n        \"eren jaeger\": \"艾伦·耶格尔\",\n        \"mikasa ackerman\": \"三笠·阿克曼\",\n        \"armin arlert\": \"阿明·阿诺德\",\n        \"clarisse\": \"克拉莉丝\",\n        \"hilda boreas greyrat\": \"希尔达·伯雷亚斯·格雷拉特\",\n        \"zenith greyrat\": \"塞妮丝·格雷拉特\",\n        \"lilia greyrat\": \"莉莉雅·格雷拉特\",\n        \"hakunon\": \"白野（扎比子）\",\n        \"yoshikage kira\": \"吉良吉影\",\n        \"fuka toyokawa\": \"丰川风花\",\n        \"kana yabuki\": \"矢吹可奈\",\n        \"ayumu maihama\": \"舞浜歩\",\n        \"sekai kamiki\": \"神木世海\",\n        \"kaoruko sazaki\": \"佐崎薰子\",\n        \"izuku midoriya\": \"绿谷出久\",\n        \"mitsuki bakugou\": \"爆豪光己\",\n        \"prushka\": \"普鲁修卡\",\n        \"hakui koyori\": \"博衣小夜璃\",\n        \"satoko houjou\": \"北条沙都子\",\n        \"siesta\": \"谢丝塔\",\n        \"rebecca bluegarden\": \"蕾贝卡·布鲁加甸\",\n        \"aria von reiji asuna\": \"岭司\",\n        \"kokawa asuka\": \"甲河明日香\",\n        \"mutio\": \"妙迪奥\",\n        \"yotsuba koiwai\": \"小岩井四叶\",\n        \"torako\": \"虎子\",\n        \"naruko yokoshima\": \"横岛鸣子\",\n        \"aoi hinami\": \"日南葵\",\n        \"feena fam earthlight\": \"菲娜·法姆·阿修莱特\",\n        \"akiko minase\": \"水濑秋子\",\n        \"yuuichi aizawa\": \"水濑名雪\",\n        \"itako tohoku\": \"东北伊达子\",\n        \"una otomachi\": \"音街鳗\",\n        \"kokona aoba\": \"青羽心夏\",\n        \"sayu\": \"早柚\",\n        \"takanashi kiara\": \"小鸟游琪亚拉\",\n        \"yumeko jabami\": \"蛇喰梦子\",\n        \"reed\": \"苇草\",\n        \"ui kozeki\": \"古关忧\",\n        \"battler ushiromiya\": \"右代宫战人\",\n        \"sideroca\": \"铸铁\",\n        \"utage\": \"宴\",\n        \"siege\": \"推进之王\",\n        \"barghest\": \"巴格斯特（犬魔）\",\n        \"yellow heart\": \"黄色之心\",\n        \"orange heart\": \"橙色之心\",\n        \"kotonoha katsura\": \"桂言叶\",\n        \"kokoro katsura\": \"桂心\",\n        \"sekai saionji\": \"西园寺世界\",\n        \"makoto itou\": \"伊藤诚\",\n        \"violet evergarden\": \"薇尔莉特·伊芙加登\",\n        \"lelei la lelena\": \"蕾莱·拉·列娜\",\n        \"youji itami\": \"伊丹耀司\",\n        \"pina co lada\": \"平娜·戈·兰达\",\n        \"rory mercury\": \"萝莉·麦丘利\",\n        \"yao haa dushi\": \"姚·汉·蒂修\",\n        \"tuka luna marceau\": \"杜嘉·露娜·马尔席\",\n        \"jeanne\": \"贞德\",\n        \"bayonetta\": \"贝优妮塔\",\n        \"elinalise dragonroad\": \"艾莉娜丽洁·杜拉冈罗德\",\n        \"neneko\": \"鈴樹ねね\",\n        \"mona\": \"莫娜\",\n        \"komichi akebi\": \"明日小路\",\n        \"alisa southerncross\": \"爱莉莎·南十字星\",\n        \"shishiro botan\": \"狮白牡丹\",\n        \"bennett\": \"班尼特\",\n        \"ruri hoshino\": \"星野·琉璃\",\n        \"lanling wang\": \"兰陵王\",\n        \"andrew gilbert mills\": \"安德鲁·基尔巴特·米尔斯\",\n        \"shizuku kuroe\": \"黑江雫\",\n        \"ellen baker\": \"艾伦·贝可\",\n        \"shizune\": \"静音\",\n        \"kurenai yuhi\": \"夕日红\",\n        \"mei terumi\": \"照美冥\",\n        \"ai ohto\": \"大户爱\",\n        \"kurumi ebisuzawa\": \"惠飞须泽胡桃\",\n        \"rita rossweisse\": \"丽塔·洛丝薇瑟\",\n        \"yor forger\": \"约尔·福杰\",\n        \"misaki tobisawa\": \"鸢泽美咲\",\n        \"morgan le fay\": \"摩根勒菲\",\n        \"nishizono chigusa\": \"西园千草\",\n        \"sherry birkin\": \"雪莉·柏金\",\n        \"ratna petit\": \"拉特娜·葡蒂\",\n        \"shigure ui\": \"时雨羽衣\",\n        \"suo sango\": \"周央珊瑚\",\n        \"lakshmibai\": \"拉克什米·芭伊\",\n        \"inui toko\": \"戌亥とこ\",\n        \"krul tepes\": \"克鲁鲁·采佩西\",\n        \"mutsumi otohime\": \"乙姬睦美\",\n        \"shinobu maehara\": \"前原忍\",\n        \"naru narusegawa\": \"成濑川奈留\",\n        \"meidri\": \"梅朵莉\",\n        \"crimvael\": \"克莉姆\",\n        \"samus aran\": \"萨姆斯·亚兰\",\n        \"otome saotome\": \"早乙女乙女\",\n        \"melusine\": \"美露莘\",\n        \"baobhan sith\": \"芭万·希\",\n        \"suomi\": \"索米\",\n        \"guilmon\": \"基尔兽\",\n        \"impmon\": \"小妖兽\",\n        \"nonomi izayoi\": \"十六夜野宫\",\n        \"yuuma toutetsu\": \"饕餮尤魔\",\n        \"miyuki kobayakawa\": \"小早川美幸\",\n        \"natsumi tsujimoto\": \"辻本夏实\",\n        \"yoriko nikaido\": \"二阶堂赖子\",\n        \"kyousuke natsume\": \"枣恭介\",\n        \"rin natsume\": \"枣铃\",\n        \"kobeni yonomori\": \"夜之森小红\",\n        \"sheryl nome\": \"雪露·诺姆\",\n        \"iori shiromi\": \"银镜伊织\",\n        \"barbara\": \"芭芭菈\",\n        \"enji todoroki\": \"轰炎司\",\n        \"nagisa minase\": \"水濑渚\",\n        \"lum\": \"拉姆\",\n        \"raiden\": \"雷电\",\n        \"tien shinhan\": \"天津饭\",\n        \"theresa apocalypse\": \"德丽莎·阿波卡利斯\",\n        \"rozaliya olenyeva\": \"萝莎莉娅·阿琳\",\n        \"liliya olenyeva\": \"莉莉娅·阿琳\",\n        \"torte\": \"托蒂\",\n        \"nausicaa\": \"娜乌西卡\",\n        \"belle\": \"贝儿\",\n        \"shun sunohara\": \"春原瞬\",\n        \"surtr\": \"史尔特尔\",\n        \"mostima\": \"莫斯提马\",\n        \"tensai ikkyuu\": \"一级天灾\",\n        \"daruku hoshino\": \"星野达鲁克\",\n        \"nanana ryuugajou\": \"龙娘七七七\",\n        \"nanami arihara\": \"在原七海\",\n        \"mai kawasumi\": \"川澄舞\",\n        \"yelan\": \"夜兰\",\n        \"baki hanma\": \"范马刃牙\",\n        \"mana inuyama\": \"犬山真名\",\n        \"megumi\": \"惠美\",\n        \"rumi\": \"留美\",\n        \"mare s. ephemeral\": \"梅娅·S·艾菲梅拉尔\",\n        \"loid forger\": \"劳埃德·福杰\",\n        \"anna yamada\": \"山田杏奈\",\n        \"kyoutarou ichikawa\": \"市川京太郎\",\n        \"pramanix\": \"初雪\",\n        \"medaka kurokami\": \"黑神目泷\",\n        \"miss crane\": \"鹤小姐\",\n        \"mordred\": \"莫德雷德\",\n        \"mikaela hyakuya\": \"百夜米迦尔\",\n        \"laplus darknesss\": \"拉普拉斯·达克尼斯\",\n        \"mori calliope\": \"森美声\",\n        \"ninomae inanis\": \"一伊那尔栖\",\n        \"sakamata chloe\": \"沙花叉库洛艾\",\n        \"kazama iroha\": \"风真伊吕波\",\n        \"weedy\": \"温蒂\",\n        \"makino yagami\": \"八神牧野\",\n        \"lu bu\": \"吕布\",\n        \"namiko\": \"奈美子\",\n        \"hass\": \"莲\",\n        \"kazuha kaedehara\": \"枫原万叶\",\n        \"scaramouche\": \"「散兵」（国崩）\",\n        \"himiko\": \"卑弥呼\",\n        \"zenobia\": \"芝诺比娅\",\n        \"paris\": \"帕里斯\",\n        \"captain nemo\": \"尼莫船长\",\n        \"sukuna\": \"两面宿傩\",\n        \"yuuji itadori\": \"虎杖悠仁\",\n        \"megumi fushiguro\": \"伏黑惠\",\n        \"caitlyn\": \"凯特琳\",\n        \"nikaido\": \"二阶堂\",\n        \"reno\": \"里诺\",\n        \"aegir\": \"埃吉尔\",\n        \"shinano\": \"信浓\",\n        \"foxhound\": \"狐提\",\n        \"pamiat merkuria\": \"水星纪念\",\n        \"nurnberg\": \"纽伦堡\",\n        \"nicholas\": \"尼古拉斯\",\n        \"icarus\": \"伊卡洛斯\",\n        \"palutena\": \"帕露蒂娜\",\n        \"pit\": \"皮特\",\n        \"bozes co palesti\": \"波赛斯·戈·芭蕾丝蒂\",\n        \"noi\": \"能井\",\n        \"scirocco\": \"东南风\",\n        \"miyuki kujou\": \"九条美雪\",\n        \"specter\": \"幽灵鲨\",\n        \"aether foundation employee\": \"以太基金会员工\",\n        \"hiling\": \"希琳\",\n        \"yoshino kousaka\": \"高坂佳乃\",\n        \"kuzuha togashi\": \"富㭴樟叶\",\n        \"ichigo hoshimiya\": \"星宫莓\",\n        \"aoi kiriya\": \"雾矢葵\",\n        \"yurika toudou\": \"藤堂百合香\",\n        \"kirara hanazono\": \"花园绮罗\",\n        \"orihime mitsuishi\": \"光石织姬\",\n        \"noeru otoshiro\": \"音城诺艾儿\",\n        \"raki kiseki\": \"姬石来希\",\n        \"ringo hoshimiya\": \"星宫苹果\",\n        \"tsubasa kisaragi\": \"如月翼\",\n        \"seira otoshiro\": \"音城塞拉\",\n        \"alicia charlotte\": \"艾丽西亚·夏洛特\",\n        \"aine yuuki\": \"友希爱音\",\n        \"asahi kasumi\": \"香澄朝阳\",\n        \"yozora kasumi\": \"香澄夜空\",\n        \"sumire hikami\": \"冰上堇\",\n        \"akari oozora\": \"大空明\",\n        \"risa shirakaba\": \"白桦丽莎\",\n        \"nono daichi\": \"大地乃野\",\n        \"sora kazesawa\": \"风泽空\",\n        \"kii saegusa\": \"冴草纪伊\",\n        \"mio minato\": \"凑美绪\",\n        \"rin kurosawa\": \"黑泽凛\",\n        \"ran shibuki\": \"紫吹兰\",\n        \"juri kurebayashi\": \"红林珠璃\",\n        \"hinaki shinjou\": \"新条雏姬\",\n        \"madoka amahane\": \"天羽圆香\",\n        \"hime shiratori\": \"白鸟姬\",\n        \"sussurro\": \"苏苏洛\",\n        \"alice tendou\": \"天童爱丽丝\",\n        \"hanabi hyuga\": \"日向花火\",\n        \"chisato hasegawa\": \"长谷川千里\",\n        \"anko kitashirakawa\": \"北白川馅子\",\n        \"seraphine\": \"萨勒芬妮\",\n        \"erich von rerugen\": \"埃里希·冯·雷鲁根\",\n        \"luciela r. sourcream\": \"露西艾拉·R·索克莉姆\",\n        \"eris\": \"厄里斯\",\n        \"luna\": \"露娜\",\n        \"yamato no kami yasusada\": \"大和守安定\",\n        \"takane lui\": \"鹰岭露依\",\n        \"charlotte e. yeager\": \"夏洛特·E·叶格\",\n        \"erica hartmann\": \"艾莉卡·哈特曼\",\n        \"gertrud barkhorn\": \"歌尔特露特·巴克霍隆\",\n        \"lynette bishop\": \"莉涅特·毕晓普\",\n        \"minna-dietlinde wilcke\": \"明娜·迪特林德·威尔克\",\n        \"sanya v. litvyak\": \"萨妮娅·V·利特维亚克\",\n        \"yoshika miyafuji\": \"宫藤芳佳\",\n        \"yoruichi shihoin\": \"四枫院夜一\",\n        \"tia halibel\": \"蒂雅·赫丽贝尔\",\n        \"muzan kibutsuji\": \"鬼舞辻无惨\",\n        \"karna\": \"迦尔纳\",\n        \"victorique de blois\": \"维多利加\",\n        \"kazuya kujou\": \"久城一弥\",\n        \"matsurika shinouji\": \"汐王寺茉莉花\",\n        \"sayu ogiwara\": \"荻原沙优\",\n        \"airi gotou\": \"后藤爱依梨\",\n        \"dark elven forest ranger\": \"dark elven forest ranger\",\n        \"kie kamado\": \"灶门葵枝\",\n        \"watson amelia\": \"阿米莉亚·华生\",\n        \"edmond dantes\": \"爱德蒙·唐泰斯（岩窟王）\",\n        \"ariane glenys maple\": \"阿里安\",\n        \"yukihana lamy\": \"雪花菈米\",\n        \"scarlet witch\": \"绯红女巫\",\n        \"wanda maximoff\": \"旺达\",\n        \"camie utsushimi\": \"现见凯米\",\n        \"tsubame koyasu\": \"子安燕\",\n        \"akari acura\": \"阿卡莉·亚裘拉\",\n        \"chaika trabant\": \"嘉依卡·托勒庞特\",\n        \"david\": \"大卫\",\n        \"toru acura\": \"托鲁·亚裘拉\",\n        \"chaika bogdan\": \"嘉依卡·布芙丹\",\n        \"hyakumantenbara salome\": \"壹百满天原莎乐美\",\n        \"miruki amauri\": \"甘瓜牛奶\",\n        \"ouro kronii\": \"奥罗·克洛尼\",\n        \"katsuki bakugou\": \"爆豪胜己\",\n        \"kyouko takizawa\": \"泷泽京子\",\n        \"black prince\": \"黑太子\",\n        \"tomoko kuroki\": \"黑木智子\",\n        \"yukari miyako\": \"都由香里\",\n        \"clare\": \"克蕾雅\",\n        \"raki\": \"拉基\",\n        \"teresa\": \"泰蕾莎\",\n        \"samira\": \"莎弥拉\",\n        \"katarina du couteau\": \"卡特琳娜·杜·克卡奥\",\n        \"kaltsit\": \"凯尔希\",\n        \"maho hiyajo\": \"比屋定真帆\",\n        \"venom\": \"毒液\",\n        \"katarina claes\": \"卡塔莉娜·库莱耶思\",\n        \"maria campbell\": \"玛丽亚·坎贝尔\",\n        \"diluc ragnvindr\": \"迪卢克·莱艮芬德\",\n        \"kaeya alberich\": \"凯亚·亚尔伯里奇\",\n        \"anya forger\": \"阿尼亚·福杰\",\n        \"morrigan aensland\": \"莫莉卡·安斯兰特\",\n        \"becky blackbell\": \"贝琪·布莱克贝尔\",\n        \"warfarin\": \"华法琳\",\n        \"platinum\": \"白金\",\n        \"rise kujikawa\": \"久慈川理世\",\n        \"yuu narukami\": \"鸣上悠\",\n        \"itaru hashida\": \"桥田至\",\n        \"tenten\": \"天天\",\n        \"hoshiguma\": \"星熊\",\n        \"flamebringer\": \"炎客\",\n        \"matterhorn\": \"角峰\",\n        \"silverash\": \"银灰\",\n        \"ptilopsis\": \"白面鸮\",\n        \"blemishine\": \"瑕光\",\n        \"whislash\": \"鞭刃\",\n        \"dobermann\": \"杜宾\",\n        \"nearl\": \"临光\",\n        \"blue poison\": \"蓝毒\",\n        \"skyfire\": \"天火\",\n        \"bison\": \"拜松\",\n        \"croissant\": \"可颂\",\n        \"arcanine\": \"风速狗\",\n        \"akari\": \"小照\",\n        \"irida\": \"珠贝\",\n        \"palina\": \"瓜娜\",\n        \"ambriel\": \"安比尔\",\n        \"feater\": \"食铁兽\",\n        \"closure\": \"可露希尔\",\n        \"melantha\": \"玫兰莎\",\n        \"perfumer\": \"调香师\",\n        \"grani\": \"格拉尼\",\n        \"angelina ajimu\": \"安心院安洁莉娜\",\n        \"ceobe\": \"刻俄柏\",\n        \"franka\": \"芙兰卡\",\n        \"liskarm\": \"雷蛇\",\n        \"blaze\": \"煌\",\n        \"shamare\": \"巫恋\",\n        \"popukar\": \"泡普卡\",\n        \"schwarz\": \"黑\",\n        \"rosmontis\": \"迷迭香\",\n        \"eyjafjalla\": \"艾雅法拉\",\n        \"deepcolor\": \"深海色\",\n        \"ayerscarpe\": \"断崖\",\n        \"leonhardt\": \"莱恩哈特\",\n        \"asbestos\": \"石棉\",\n        \"magallan\": \"麦哲伦\",\n        \"podenco\": \"波登可\",\n        \"kroos\": \"克洛丝\",\n        \"gavial\": \"嘉维尔\",\n        \"vigna\": \"红豆\",\n        \"glaucus\": \"格劳克斯\",\n        \"vermeil\": \"红云 | 维尔梅\",\n        \"ansel\": \"安赛尔\",\n        \"ceylon\": \"锡兰\",\n        \"sicily von claude\": \"西希莉·冯·克洛德\",\n        \"beeswax\": \"蜜蜡\",\n        \"youtouhime\": \"妖刀姬\",\n        \"ivy valentine\": \"艾薇\",\n        \"taki\": \"多喜\",\n        \"yuzu hanaoka\": \"花冈柚子\",\n        \"iroha natsume\": \"枣伊吕波\",\n        \"sasara kusugawa\": \"久寿川莎莎菈\",\n        \"maako asagiri\": \"朝雾麻亚子\",\n        \"amane\": \"亚麻音\",\n        \"setsu\": \"雪\",\n        \"mian\": \"魅杏\",\n        \"yuuka hayase\": \"早濑优香\",\n        \"azusa hanai\": \"花井梓\",\n        \"maria momoe\": \"百枝麻里亚\",\n        \"kraft lawrence\": \"克拉福·罗伦斯\",\n        \"orihime inoue\": \"井上织姬\",\n        \"elysia\": \"爱莉希雅\",\n        \"kayoko onikata\": \"鬼方佳世子\",\n        \"aoi tosaka\": \"远坂葵\",\n        \"sothis\": \"苏谛斯\",\n        \"shamir nevrand\": \"萨米亚·涅芙兰特\",\n        \"edelgard von hresvelg\": \"艾黛尔贾特·冯·弗雷斯贝尔古\",\n        \"rhea\": \"蕾雅\",\n        \"byleth eisner\": \"贝雷丝·艾斯纳\",\n        \"hoshino takanashi\": \"小鸟游星野\",\n        \"miyu kasumizawa\": \"霞泽美游\",\n        \"midori saiba\": \"才羽绿\",\n        \"momoi saiba\": \"才羽桃井\",\n        \"kaede isami\": \"勇美枫\",\n        \"mari iochi\": \"伊落玛丽\",\n        \"izuna kuda\": \"久田泉奈\",\n        \"fuuka aikiyo\": \"爱清枫香\",\n        \"haruna kurodate\": \"黑馆羽留奈\",\n        \"chinatsu hinomiya\": \"火宫千夏\",\n        \"shiroko sunaookami\": \"砂狼白子\",\n        \"neru mikamo\": \"美甘宁瑠\",\n        \"tsubaki kasuga\": \"春日椿\",\n        \"mika misono\": \"圣园未花\",\n        \"ako amau\": \"天雨亚子\",\n        \"natsu yutori\": \"柚鸟夏\",\n        \"kagome higurashi\": \"日暮戈薇\",\n        \"inuyasha\": \"犬夜叉\",\n        \"hitomi shizuki\": \"志筑仁美\",\n        \"nakoruru\": \"娜可露露\",\n        \"tomo yamanobe\": \"山边灯\",\n        \"calamity jane\": \"灾星简\",\n        \"charlotte corday\": \"夏洛特·科黛\",\n        \"ibuki douji\": \"伊吹童子\",\n        \"ranpha\": \"兰法\",\n        \"geo stelar\": \"星河昴\",\n        \"luna platz\": \"白金露娜\",\n        \"yugito nii\": \"二位柚木门\",\n        \"kanade yoisaki\": \"宵崎奏\",\n        \"mafuyu asahina\": \"朝比奈真冬\",\n        \"kanu unchou\": \"关羽云长\",\n        \"housen ryofu\": \"吕布奉先\",\n        \"shimei ryomou\": \"吕蒙子明\",\n        \"hakufu sonsaku\": \"孙策伯符\",\n        \"gentoku ryuubi\": \"刘备玄德\",\n        \"ekitoku chouhi\": \"张飞益德\",\n        \"myousai kakouen\": \"夏侯渊妙才\",\n        \"yojo bashoku\": \"马谡幼常\",\n        \"shiryuu chouun\": \"赵云子龙\",\n        \"chuukou kyocho\": \"许诸仲康\",\n        \"hakugen rikuson\": \"陆逊伯言\",\n        \"chuutatsu shibai\": \"司马懿仲达\",\n        \"shikou soujin\": \"曹仁子孝\",\n        \"mouyuu\": \"孟优\",\n        \"takezou shinmen\": \"新免武藏\",\n        \"chousen\": \"貂蝉\",\n        \"benkei musashibo\": \"武藏坊弁庆\",\n        \"genpou saji\": \"左慈元放\",\n        \"bunwa kaku\": \"贾诩文和\",\n        \"ukitsu\": \"于吉\",\n        \"shifu choushou\": \"张昭子布\",\n        \"koshaji\": \"胡车儿\",\n        \"moukaku\": \"孟获\",\n        \"kotetsu\": \"虎彻\",\n        \"arezu\": \"火夏\",\n        \"phineas flynn\": \"飞哥·福林\",\n        \"ferb fletcher\": \"小佛‧富雷察\",\n        \"miko kurokawa\": \"黒川みこ\",\n        \"rimururu\": \"莉姆露露\",\n        \"yoichi nasu no suketaka\": \"那须与一\",\n        \"bridget\": \"布里奇特\",\n        \"princess marie ange\": \"マリー・アンジュ 王女\",\n        \"sakura kagamihara\": \"各务原樱\",\n        \"frederica irving\": \"フレドリカ・アーヴィング\",\n        \"junko enoshima\": \"江之岛盾子\",\n        \"chisato nishikigi\": \"锦木千束\",\n        \"takina inoue\": \"井之上泷奈\",\n        \"rihoko amaha\": \"天羽梨穂子\",\n        \"masane amaha\": \"天羽雅音\",\n        \"ayaka tachikawa\": \"立川绚香\",\n        \"aomi yanagisako\": \"柳迫碧美\",\n        \"airi\": \"爱莉\",\n        \"melona\": \"美萝娜\",\n        \"merlin prototype\": \"梅林prototype\",\n        \"shuna\": \"朱菜\",\n        \"lenalee lee\": \"利娜莉·李\",\n        \"natsuru senou\": \"濑能名津流\",\n        \"shizuku sangou\": \"三乡雫\",\n        \"akane mishima\": \"美岛红音\",\n        \"minoru mineta\": \"峰田实\",\n        \"natalia luzu kimlasca-lanvaldear\": \"娜塔莉亚·卢慈·基姆拉斯卡·兰帕尔迪亚\",\n        \"eleonora viltaria\": \"艾蕾欧诺拉·维尔塔利亚\",\n        \"limalisha\": \"莉姆亚莉夏\",\n        \"ludmila lourie\": \"琉德米拉·露利叶\",\n        \"sofya obertas\": \"苏菲亚·欧贝达斯\",\n        \"tigrevurmud vorn\": \"堤格尔维尔穆德·冯伦\",\n        \"kobeni higashiyama\": \"东山小红\",\n        \"hildegarde\": \"希尔迪嘉露塔\",\n        \"aoi kunieda\": \"邦枝葵\",\n        \"sajuna inui\": \"乾纱寿叶\",\n        \"toushirou hitsugaya\": \"日番谷冬狮郎\",\n        \"soi fon\": \"碎蜂\",\n        \"guan yinping\": \"关银屏\",\n        \"xing cai\": \"张星彩\",\n        \"zhen ji\": \"甄姬\",\n        \"moriko morioka\": \"盛冈森子\",\n        \"yuuta sakurai\": \"樱井优太\",\n        \"lily\": \"莉莉\",\n        \"hinata kuraue\": \"仓上日向\",\n        \"aoi yukimura\": \"雪村葵\",\n        \"furen e lustario\": \"芙莲·E·露丝塔莉欧\",\n        \"nui sociere\": \"纽伊·索西艾瑞\",\n        \"yachiru kusajishi\": \"草鹿八千流\",\n        \"kagura nana\": \"神乐七奈\",\n        \"arlecchino\": \"「仆人」阿蕾奇诺\",\n        \"platinum the trinity\": \"白金·崔妮蒂\",\n        \"marta lualdi\": \"玛尔塔·路亚蒂\",\n        \"asuka katou\": \"加藤明日香\",\n        \"august von parseval\": \"奥古斯特·冯·帕塞瓦尔\",\n        \"shinn asuka\": \"真·飞鸟\",\n        \"yuzuki seo\": \"濑尾结月\",\n        \"saki yoshida\": \"吉田咲\",\n        \"nahida\": \"纳西妲\",\n        \"mitsuru kirijo\": \"桐条美鹤\",\n        \"kaguya otonashi\": \"音无辉夜\",\n        \"kaoru tanamachi\": \"棚町薰\",\n        \"nilou\": \"妮露\",\n        \"princess elsa\": \"艾莎公主\",\n        \"kristoff bjorgman\": \"克斯托夫\",\n        \"athrun zala\": \"阿斯兰·萨拉\",\n        \"rey za burrel\": \"雷·札·巴雷尔\",\n        \"mako hitachi\": \"常陆茉子\",\n        \"yoshino tomotake\": \"朝武芳乃\",\n        \"lena liechtenauer\": \"蕾娜·列支敦瑙尔\",\n        \"tamaki tamada\": \"玉田环\",\n        \"shizuko hosomi\": \"细见静子\",\n        \"yagen toushirou\": \"药研藤四郎\",\n        \"shinano toushirou\": \"信浓藤四郎\",\n        \"gotou toushirou\": \"后藤藤四郎\",\n        \"atsushi toushirou\": \"厚藤四郎\",\n        \"saniwa\": \"审神者\",\n        \"houchou toushirou\": \"包丁藤四郎\",\n        \"shokudaikiri mitsutada\": \"烛台切光忠\",\n        \"horikawa kunihiro\": \"堀川国广\",\n        \"vajra\": \"瓦姬拉\",\n        \"tighnari\": \"提纳里\",\n        \"hinata wakaba\": \"若葉日向\",\n        \"chihiro kagami\": \"各务千寻\",\n        \"perrine h. clostermann\": \"佩琳·H·克洛斯特曼\",\n        \"bronya zaychik\": \"布洛妮娅·扎伊切克\",\n        \"danzou katou\": \"加藤段藏\",\n        \"fubuki nemugaki\": \"合欢垣吹雪\",\n        \"serika kuromi\": \"黑见芹香\",\n        \"ayane okusora\": \"奥空绫音\",\n        \"mikan hinatsuki\": \"阳夏木蜜柑\",\n        \"sword maiden\": \"剑之圣女\",\n        \"chigusa kisaragi\": \"如月千种\",\n        \"dobrynya nikitich\": \"多布雷尼亚·尼基季奇\",\n        \"aratsuka ogami\": \"荒塚オガミ\",\n        \"nishikata\": \"西片\",\n        \"nezha\": \"哪吒\",\n        \"carol malus dienheim\": \"卡萝·马尔斯·狄恩海姆\",\n        \"dori\": \"多莉\",\n        \"rikka morizono\": \"森园立夏\",\n        \"aponia\": \"阿波尼亚\",\n        \"carole pepper\": \"卡萝尔·佩珀\",\n        \"rean schwarzer\": \"黎恩·舒华泽\",\n        \"millium orion\": \"米莉亚姆·奥莱恩\",\n        \"candace\": \"坎蒂丝\",\n        \"mei raiden\": \"雷电芽衣\",\n        \"durandal\": \"幽兰黛尔\",\n        \"himeko murata\": \"无量塔姬子\",\n        \"seele vollerei\": \"希儿·芙乐艾\",\n        \"cecilia schariac\": \"塞西莉亚·沙尼亚特\",\n        \"shinobu kuki\": \"久岐忍\",\n        \"springfield\": \"春田\",\n        \"natasha cioara\": \"娜塔莎·希奥拉（渡鸦）\",\n        \"fu hua\": \"符华\",\n        \"timido cute\": \"缇米朵·丘忒\",\n        \"mobius\": \"梅比乌斯\",\n        \"heizou shikanoin\": \"鹿野院平藏\",\n        \"columbina\": \"「少女」哥伦比娅\",\n        \"tartaglia\": \"「公子」达达利亚\",\n        \"gorou\": \"五郎\",\n        \"kallen kaslana\": \"卡莲·卡斯兰娜\",\n        \"yun jin\": \"云堇\",\n        \"kloe rinz\": \"科洛丝·琳希\",\n        \"anelace elfead\": \"亚妮拉丝·艾尔菲德\",\n        \"scherazard harvey\": \"雪拉扎德·哈维\",\n        \"shizuna rem misurugi\": \"静名·雷姆·御折木\",\n        \"ragna the bloodedge\": \"拉格纳·布莱德艾奇\",\n        \"noel vermillion\": \"诺爱儿·梵蜜莉欧\",\n        \"es\": \"Es\",\n        \"kajun faycott\": \"花隼·法伊科特\",\n        \"mai natsume\": \"麻衣·枣\",\n        \"makoto nanaya\": \"诚·七夜\",\n        \"ayato kamisato\": \"神里绫人\",\n        \"tsubaki yayoi\": \"椿·弥生\",\n        \"lambda-11\": \"Λ-No.11-\",\n        \"mu-12\": \"μ-No.12-\",\n        \"nu-13\": \"ν-No.13-\",\n        \"jin kisaragi\": \"琴恩·如月\",\n        \"erice utsumi\": \"宇津见绘里濑\",\n        \"emiya alter\": \"卫宫Alter\",\n        \"shinoa hiiragi\": \"柊筱娅\",\n        \"fatui electro cicin mage\": \"雷萤术士\",\n        \"fatui cryo cicin mage\": \"冰萤术士\",\n        \"mirror maiden\": \"藏镜仕女\",\n        \"sirin\": \"西琳\",\n        \"dehya\": \"迪希雅\",\n        \"noa ushio\": \"生盐诺亚\",\n        \"kokona sunohara\": \"春原心奈\",\n        \"hasumi hanekawa\": \"羽川莲见\",\n        \"hibiki nekozuka\": \"猫冢响\",\n        \"arona\": \"阿罗娜\",\n        \"saki sorai\": \"空井咲\",\n        \"collei\": \"柯莱\",\n        \"lavenza\": \"拉雯妲\",\n        \"von lycaon\": \"冯·莱卡恩\",\n        \"cyborg\": \"赛博格\",\n        \"april\": \"四月\",\n        \"eevee\": \"伊布\",\n        \"sylveon\": \"仙子伊布\",\n        \"vaporeon\": \"水伊布\",\n        \"jolteon\": \"雷伊布\",\n        \"flareon\": \"火伊布\",\n        \"espeon\": \"太阳伊布\",\n        \"umbreon\": \"月亮伊布\",\n        \"leafeon\": \"叶伊布\",\n        \"glaceon\": \"冰伊布\",\n        \"piplup\": \"波加曼\",\n        \"turtwig\": \"草苗龟\",\n        \"meowth\": \"喵喵\",\n        \"cinderace\": \"闪焰王牌\",\n        \"lopunny\": \"长耳兔\",\n        \"absol\": \"阿勃梭鲁\",\n        \"banette\": \"诅咒娃娃\",\n        \"braixen\": \"长尾火狐\",\n        \"bulbasaur\": \"妙蛙种子\",\n        \"delphox\": \"妖火红狐\",\n        \"ditto\": \"百变怪\",\n        \"greninja\": \"甲贺忍蛙\",\n        \"kirlia\": \"奇鲁莉安\",\n        \"lugia\": \"洛奇亚\",\n        \"mawile\": \"大嘴娃\",\n        \"nidoqueen\": \"尼多后\",\n        \"primarina\": \"西狮海壬\",\n        \"reshiram\": \"莱希拉姆\",\n        \"salazzle\": \"焰后蜥\",\n        \"samurott\": \"大剑鬼\",\n        \"scorbunny\": \"炎兔儿\",\n        \"zekrom\": \"捷克罗姆\",\n        \"zeraora\": \"捷拉奥拉\",\n        \"iono\": \"奇树\",\n        \"maho himemiya\": \"姬宫真步\",\n        \"ahri\": \"阿狸\",\n        \"lillia\": \"莉莉娅\",\n        \"thresh\": \"锤石\",\n        \"sophia nishikinomiya\": \"苏菲亚·锦之宫\",\n        \"anna nishikinomiya\": \"安娜·锦之宫\",\n        \"moona hoshinova\": \"Moona Hoshinova\",\n        \"miya chinen\": \"知念实也\",\n        \"koushi sugawara\": \"菅原孝支\",\n        \"shoyo hinata\": \"日向翔阳\",\n        \"taiga kagami\": \"火神大我\",\n        \"tetsuya kuroko\": \"黑子哲也\",\n        \"daiki aomine\": \"青峰大辉\",\n        \"haruka nanase\": \"七濑遥\",\n        \"rin matsuoka\": \"松冈凛\",\n        \"yuki\": \"雪\",\n        \"louise\": \"露易兹\",\n        \"ellen\": \"爱莲\",\n        \"kana anaberal\": \"卡娜·安娜贝拉尔\",\n        \"misaki kagome\": \"笼目深沙希\",\n        \"momo hinamori\": \"雏森桃\",\n        \"chen hai\": \"镇海\",\n        \"leeloo minai lekatariba-lamina-tchai ekbat de sebat\": \"Leeloo\",\n        \"hasshaku-sama\": \"八尺大人\",\n        \"ushio kofune\": \"小舟潮\",\n        \"moe kazekura\": \"风仓萌绘\",\n        \"eiko tsukimi\": \"月见英子\",\n        \"hitori gotou\": \"后藤一里\",\n        \"tsukuyo oono\": \"大野筑夜\",\n        \"mikoto aketa\": \"緋田美琴\",\n        \"nazuna nanakusa\": \"七草荠\",\n        \"revy\": \"莱薇\",\n        \"natsumi kurobe\": \"黑部夏美\",\n        \"assaultron\": \"突袭者机器人\",\n        \"satoru gojo\": \"五条悟\",\n        \"aki hayakawa\": \"早川秋\",\n        \"annie leonhart\": \"阿尼·利昂纳德\",\n        \"nekomiya hinata\": \"猫宫日向\",\n        \"himeno ayanokoji\": \"绫小路姫乃\",\n        \"seia yurizono\": \"百合园圣娅\",\n        \"hanae asagao\": \"朝颜花绘\",\n        \"saori joumae\": \"锭前纱织\",\n        \"nijika ijichi\": \"伊地知虹夏\",\n        \"ryou yamada\": \"山田凉\",\n        \"ikuyo kita\": \"喜多郁代\",\n        \"mewtwo\": \"超梦\",\n        \"shion\": \"紫苑\",\n        \"nemu manaka\": \"真中合欢\",\n        \"rinne byakuya\": \"白夜凛音\",\n        \"hanabi yasuraoka\": \"安乐冈花火\",\n        \"nayuta kani\": \"可儿那由多\",\n        \"maou\": \"魔王（红玉之瞳）\",\n        \"tabitha helene orleans de gallia\": \"塔巴萨\",\n        \"suguru geto\": \"夏油杰\",\n        \"selvaria bles\": \"塞贝莉雅·布雷斯\",\n        \"arisa eloise beau-regard\": \"亚里砂·艾洛伊丝·博勒加德\",\n        \"wakamo kosaka\": \"狐坂若藻\",\n        \"high elf archer\": \"妖精弓手\",\n        \"big bad wolf\": \"大灰狼\",\n        \"nemona\": \"妮莫\",\n        \"little red riding hoods grandmother\": \"小红帽的外婆\",\n        \"alhaitham\": \"艾尔海森\",\n        \"layla prismriver\": \"蕾拉·普莉兹姆利巴\",\n        \"chise waraku\": \"和乐千世\",\n        \"kaho kuwakami\": \"桑上果穗\",\n        \"ume\": \"梅\",\n        \"chisaki mibu\": \"壬生千咲\",\n        \"mayu shikibe\": \"式部茉优\",\n        \"maria marta cunhel guloso\": \"玛璐塔小姐\",\n        \"jenny wakeman\": \"XJ9\",\n        \"aria holmes kanzaki\": \"神崎·H·亚里亚\",\n        \"akari mamiya\": \"间宫明里\",\n        \"kaname tohyama\": \"远山金女\",\n        \"kinji tohyama\": \"远山金次\",\n        \"riko mine\": \"峰理子\",\n        \"shirayuki hotogi\": \"星伽白雪\",\n        \"the woodsman\": \"小红帽中的猎人\",\n        \"henrietta de tristain\": \"安丽埃塔\",\n        \"princess devilotte de deathsatan ix\": \"戴比萝特·德·迪斯撒旦九世\",\n        \"fianna ray ordesia\": \"菲雅娜·雷·奥地西亚\",\n        \"lady labrynth of the silver castle\": \"白银城的迷宫主·拉比丽斯\",\n        \"suletta mercury\": \"斯莱塔·墨丘利\",\n        \"miorine rembran\": \"米奥莉奈·伦布兰\",\n        \"nana daiba\": \"大场奈奈\",\n        \"minegumo\": \"峰云\",\n        \"princess star butterfly\": \"星蝶公主\",\n        \"kazusa kyouyama\": \"杏山和纱\",\n        \"mahiru shiina\": \"椎名真昼\",\n        \"margot knight\": \"玛戈特·奈特\",\n        \"malga naruze\": \"玛伽·成濑\",\n        \"evangeline a.k. mcdowell\": \"依文洁琳·安塔娜西亚·凯蒂·麦道威尔\",\n        \"momosuzu nene\": \"桃铃音音\",\n        \"omaru polka\": \"尾丸波尔卡\",\n        \"karnatia seri anabald\": \"大岛叶多\",\n        \"wang yi\": \"王异\",\n        \"hachiroku\": \"八六\",\n        \"yggdrasil\": \"尤格多拉希尔\",\n        \"otome arisugawa\": \"有栖川乙女\",\n        \"luo tianyi\": \"洛天依\",\n        \"sensei\": \"老师\",\n        \"azuma seren\": \"东雪莲\",\n        \"yaoyao\": \"瑶瑶\",\n        \"monika\": \"莫妮卡\",\n        \"tania\": \"塔妮雅\",\n        \"barret wallace\": \"巴雷特·华莱士\",\n        \"ameth\": \"爱梅斯\",\n        \"aoi futaba\": \"双叶碧\",\n        \"roselia\": \"绯之罗赛莉亚\",\n        \"goldenglow\": \"澄闪\",\n        \"sara valestin\": \"莎拉·巴雷斯坦\",\n        \"cure cosmo\": \"尤妮（宇宙天使）\",\n        \"cure selene\": \"香久矢圆香（月神天使）\",\n        \"demeter\": \"狄蜜特\",\n        \"haruka yuzuhara\": \"柚原春夏\",\n        \"matsuri kazamaki\": \"风卷祭里\",\n        \"suzu kanade\": \"花奏铃\",\n        \"mahiro oyama\": \"绪山真寻\",\n        \"seiun sky\": \"青云天空\",\n        \"curren chan\": \"真机伶\",\n        \"symboli rudolf\": \"鲁道夫象征\",\n        \"admire vega\": \"爱慕织姬\",\n        \"yorha commander\": \"寄葉指揮官\",\n        \"cidala\": \"辛妲拉\",\n        \"super creek\": \"超级溪流\",\n        \"cecilia alcott\": \"塞西莉娅·奥尔卡特\",\n        \"ling yin huang\": \"凰铃音\",\n        \"laura bodewig\": \"拉芙拉·布迪威伊\",\n        \"yuu koito\": \"小糸侑\",\n        \"touko nanami\": \"七海灯子\",\n        \"houki shinonono\": \"篠之之帚\",\n        \"mizuki nakahara\": \"中原瑞希\",\n        \"senji muramasa\": \"千子村正\",\n        \"hinagiku katsura\": \"桂雏菊\",\n        \"isumi saginomiya\": \"鹭之宫伊澄\",\n        \"nagi sanzenin\": \"三千院凪\",\n        \"marie\": \"玛丽\",\n        \"fuyutsuki\": \"冬月\",\n        \"tsukasa ayatsuji\": \"绚辻词\",\n        \"ai nanasaki\": \"七咲逢\",\n        \"haruka morishima\": \"森岛遥\",\n        \"miya tachibana\": \"橘美也\",\n        \"sae nakata\": \"中多纱江\",\n        \"rihoko sakurai\": \"樱井梨穗子\",\n        \"yukiko amagi\": \"天城雪子\",\n        \"hatsumi sega\": \"濑贺初美\",\n        \"fujisaki yua\": \"藤崎由爱\",\n        \"dante\": \"但丁\",\n        \"vergil\": \"维吉尔\",\n        \"hanbei takenaka\": \"竹中半兵卫\",\n        \"kanae kochou\": \"胡蝶香奈惠\",\n        \"sanemi shinazugawa\": \"不死川实弥\",\n        \"ryuuge kisaki\": \"龙华妃咲\",\n        \"mashiro shizuyama\": \"静山真白\",\n        \"tsurugi kensaki\": \"剑先鹤城\",\n        \"acerola\": \"阿塞萝拉\",\n        \"kou minamoto\": \"源光\",\n        \"damian desmond\": \"达米安·德斯蒙\",\n        \"cat noir\": \"黑猫诺儿\",\n        \"killua zoldyck\": \"奇犽·揍敌客\",\n        \"mirai kamiki\": \"神木未来\",\n        \"megumi amatsuka\": \"天使惠\",\n        \"mao amatsuka\": \"天使真央\",\n        \"akane isshiki\": \"一色茜\",\n        \"lyza\": \"莱萨\",\n        \"ozen\": \"奥森\",\n        \"marulk\": \"马璐璐库\",\n        \"mother spider demon\": \"蜘蛛鬼·母亲\",\n        \"kanako urashima\": \"浦岛可奈子\",\n        \"mihari oyama\": \"绪山美波里\",\n        \"white len\": \"白莲\",\n        \"momiji hozuki\": \"穗月椛\",\n        \"kaede hozuki\": \"穗月枫\",\n        \"kafka\": \"卡芙卡 | 卡夫卡\",\n        \"ookanehira\": \"大包平\",\n        \"uguisumaru\": \"莺丸\",\n        \"sovetskaya rossiya\": \"苏维埃罗西亚\",\n        \"faruzan\": \"珐露珊\",\n        \"plana\": \"普拉娜\",\n        \"rio tsukatsuki\": \"调月莉音\",\n        \"kikuri hiroi\": \"广井菊里\",\n        \"gintoki sakata\": \"坂田银时\",\n        \"toshiro hijikata\": \"土方十四郎\",\n        \"kazamori sasa\": \"佐佐风守\",\n        \"kozuki momonosuke\": \"光月桃之助\",\n        \"kanna ogata\": \"尾刃康娜\",\n        \"nero\": \"尼禄\",\n        \"deadpool\": \"死侍\",\n        \"lady\": \"蕾蒂\",\n        \"trish\": \"翠西\",\n        \"alexis rhodes\": \"天上院明日香\",\n        \"cyno\": \"赛诺\",\n        \"alexia midgar\": \"阿莱克西亚·米德嘉尔\",\n        \"wednesday addams\": \"星期三·亚当斯\",\n        \"miyako shikimori\": \"式守都\",\n        \"fuuka yamagishi\": \"山岸风花\",\n        \"yukari takeba\": \"岳羽由加莉\",\n        \"aigis\": \"埃癸斯\",\n        \"celia claire\": \"瑟莉亚·库列尔\",\n        \"hinata tachibana\": \"橘日向\",\n        \"conte di cavour\": \"加富尔伯爵\",\n        \"dhole\": \"豺\",\n        \"senjuro rengoku\": \"炼狱千寿郎\",\n        \"female protagonist\": \"汐见琴音\",\n        \"makoto yuuki\": \"结城理\",\n        \"asuka kurashina\": \"仓科明日香\",\n        \"ulrich von hutten\": \"乌尔里希·冯·胡滕\",\n        \"joey\": \"乔伊\",\n        \"feng min\": \"凤敏\",\n        \"friedrich der grosse\": \"腓特烈大帝\",\n        \"mio naruse\": \"成濑澪\",\n        \"maria naruse\": \"成濑万理亚\",\n        \"frederica baumann\": \"法兰黛莉卡·鲍曼\",\n        \"ai hoshino\": \"星野爱\",\n        \"toki asuma\": \"飞鸟马时\",\n        \"carol olston\": \"卡洛儿·奥尔斯顿\",\n        \"shiroko terror\": \"白子*恐怖\",\n        \"dia viekone\": \"蒂雅·维科尼\",\n        \"ezio auditore\": \"艾吉奥·奥迪托雷\",\n        \"sofia sartor\": \"索菲亚·萨尔托\",\n        \"tang wutong\": \"唐舞桐\",\n        \"maryland\": \"马里兰\",\n        \"shinyou\": \"神鹰\",\n        \"yawata maru\": \"八幡丸 | 云鹰\",\n        \"kishinami\": \"岸波\",\n        \"jingei\": \"迅鲸\",\n        \"chougei\": \"长鲸\",\n        \"cyllene\": \"星月\",\n        \"queen draco\": \"妖妃德拉科\",\n        \"march 7th\": \"三月七\",\n        \"himari akeboshi\": \"明星日鞠\",\n        \"asta\": \"艾丝妲 | 亚斯塔\",\n        \"garou\": \"饿狼\",\n        \"himeko\": \"姬子\",\n        \"herta\": \"黑塔\",\n        \"stelle\": \"星\",\n        \"clara\": \"克拉拉\",\n        \"nene ayachi\": \"绫地宁宁\",\n        \"neeko\": \"妮蔻\",\n        \"nidalee\": \"奈德丽\",\n        \"vex\": \"薇古丝\",\n        \"yuu nishinoya\": \"西谷夕\",\n        \"asahi azumane\": \"东峰旭\",\n        \"zoe\": \"佐伊\",\n        \"annie\": \"安妮\",\n        \"yanagi uzaki\": \"宇崎柳\",\n        \"baiken\": \"梅喧\",\n        \"asuka kazama\": \"风间飞鸟\",\n        \"lili rochefort\": \"莉莉·罗舍福尔\",\n        \"shizuko kawawa\": \"河和静子\",\n        \"akira kiyosumi\": \"清澄晶\",\n        \"kanji sasahara\": \"笹原完士\",\n        \"chika ogiue\": \"荻上千佳\",\n        \"saki kasukabe\": \"春日部咲\",\n        \"kanako ohno\": \"大野加奈子\",\n        \"makoto kousaka\": \"高坂真琴\",\n        \"kenjirou hato\": \"波户贤二郎\",\n        \"rika yoshitake\": \"吉武莉华\",\n        \"harunobu madarame\": \"斑目晴信\",\n        \"rea sanka\": \"散华礼弥\",\n        \"mero furuya\": \"降谷萌路\",\n        \"judge\": \"法官\",\n        \"himawari shinomiya\": \"四宫向日葵\",\n        \"wakaba saegusa\": \"三枝若叶\",\n        \"rei kuroki\": \"黑骑蕾\",\n        \"tomoko hoshina\": \"保科智子\",\n        \"lemmy miyauchi\": \"宫内蕾咪\",\n        \"serika kurusugawa\": \"来栖川芹香\",\n        \"akari kamigishi\": \"神岸明\",\n        \"ayaka kurusugawa\": \"来栖川绫香\",\n        \"shiho nagaoka\": \"长冈志保\",\n        \"hiroyuki fujita\": \"藤田浩之\",\n        \"aoi matsubara\": \"松原葵\",\n        \"koyomi mizuhara\": \"水原历\",\n        \"osaka\": \"大阪\",\n        \"sakaki\": \"榊\",\n        \"tomo takino\": \"泷野智\",\n        \"chiyo mihama\": \"美滨千代\",\n        \"riza wildman\": \"丽莎·瓦德曼\",\n        \"hiro hiyorimi\": \"日和见日郎\",\n        \"lillianne von phoenix\": \"莉莉安奴·冯·菲尼克斯\",\n        \"sylvia von phoenix\": \"茜维亚·冯·菲尼克斯\",\n        \"reiri kamura\": \"嘉村令里\",\n        \"taeko minazuki\": \"水无月妙子\",\n        \"amemiya nazuna\": \"飴宮なずな\",\n        \"winter schnee\": \"温特·雪倪\",\n        \"ruby hoshino\": \"露比（星野瑠美衣）\",\n        \"roka maniwa\": \"马庭芦花\",\n        \"lysithea von cordelia\": \"莉丝缇亚·冯·科迪利亚\",\n        \"tamako kitashirakawa\": \"北白川玉子\",\n        \"ui tamaki\": \"环羽衣\",\n        \"shigure mayoi\": \"间宵时雨\",\n        \"inori ichinose\": \"一之濑祈梨\",\n        \"natsumi hodaka\": \"帆高夏海\",\n        \"hina tsurugi\": \"鹤木阳渚\",\n        \"gwen stacy\": \"格温·斯黛西\",\n        \"reisa uzawa\": \"宇泽玲纱\",\n        \"power\": \"帕瓦\",\n        \"hirofumi yoshida\": \"吉田宽文\",\n        \"silver wolf\": \"银狼\",\n        \"moka akashiya\": \"赤夜萌香\",\n        \"kurumu kurono\": \"黑乃胡梦\",\n        \"mizore shirayuki\": \"白雪霙\",\n        \"nagisa kirifuji\": \"桐藤渚\",\n        \"fu xuan\": \"符玄\",\n        \"qingque\": \"青雀\",\n        \"sin mal\": \"杏·玛尔\",\n        \"bailu\": \"白露\",\n        \"tingyun\": \"停云\",\n        \"bronya rand\": \"布洛妮娅·兰德\",\n        \"shuuko komi\": \"古见秀子\",\n        \"kana arima\": \"有马加奈\",\n        \"mina majikina\": \"真镜名美奈\",\n        \"nyotengu\": \"女天狗\",\n        \"yuzuriha\": \"杠\",\n        \"velvet\": \"薇尔贝特\",\n        \"lucyna kushinada\": \"露西\",\n        \"w\": \"W\",\n        \"senko\": \"仙狐\",\n        \"johnny silverhand\": \"强尼·银手\",\n        \"david martinez\": \"大卫·马丁内斯\",\n        \"gwendolyn\": \"关德琳\",\n        \"oswald\": \"奥兹华德\",\n        \"mabel rayveil\": \"梅贝露·蕾贝露\",\n        \"akane kurokawa\": \"黑川茜\",\n        \"perona\": \"佩罗娜\",\n        \"suzume iwato\": \"岩户铃芽\",\n        \"souta munakata\": \"宗像草太\",\n        \"tsundere elf\": \"翠\",\n        \"sumika fujimiya\": \"藤宫澄夏\",\n        \"yousuke shibazaki\": \"岛㟢阳介\",\n        \"alicia edelsia\": \"艾丽西亚·伊德露西亚\",\n        \"purah\": \"普尔亚\",\n        \"touko fukawa\": \"腐川冬子\",\n        \"haru\": \"春\",\n        \"rio kastle\": \"神代璃绪\",\n        \"elizabeth liones\": \"伊丽莎白·里昂妮丝\",\n        \"yanqing\": \"彦卿\",\n        \"seika ijichi\": \"伊地知星歌\",\n        \"rika furude\": \"古手梨花\",\n        \"junko akashi\": \"赤司淳子\",\n        \"black widow\": \"黑寡妇\",\n        \"midna\": \"米多娜\",\n        \"arisu sakayanagi\": \"坂柳有栖\",\n        \"griseo\": \"格蕾修\",\n        \"melina\": \"梅琳娜\",\n        \"hinoa\": \"火芽\",\n        \"implacable\": \"怨仇\",\n        \"asuma sarutobi\": \"猿飞阿斯玛\",\n        \"mizuki akiyama\": \"晓山瑞希\",\n        \"ena shinonome\": \"东云绘名\",\n        \"airi momoi\": \"桃井爱莉\",\n        \"akito shinonome\": \"东云彰人\",\n        \"an shiraishi\": \"白石杏\",\n        \"emu otori\": \"凤笑梦\",\n        \"haruka kiritani\": \"桐谷遥\",\n        \"honami mochizuki\": \"望月穗波\",\n        \"ichika hoshino\": \"星乃一歌\",\n        \"kohane azusawa\": \"小豆泽心羽\",\n        \"minori hanasato\": \"花里实乃理\",\n        \"nene kusanagi\": \"草薙宁宁\",\n        \"rui kamishiro\": \"神代类\",\n        \"saki tenma\": \"天马咲希\",\n        \"shiho hinomori\": \"日野森志步\",\n        \"shizuku hinomori\": \"日野森雫\",\n        \"toya aoyagi\": \"青柳冬弥\",\n        \"tsukasa tenma\": \"天马司\",\n        \"kouta oyamada\": \"小山田耕太\",\n        \"chizuru minamoto\": \"源千鹤\",\n        \"nozomu ezomori\": \"犹守望\",\n        \"anisphia wynn palettia\": \"艾妮丝菲亚·温·帕雷提亚\",\n        \"euphyllia magenta\": \"尤菲莉亚·玛赞塔\",\n        \"gobuta\": \"哥布塔\",\n        \"hakos baelz\": \"哈珂斯·贝尔丝\",\n        \"saitama\": \"琦玉\",\n        \"rukia kuchiki\": \"朽木露琪亚\",\n        \"dori sangemah bay\": \"多莉·桑歌玛哈巴依\",\n        \"baizhu\": \"白术\",\n        \"lewis\": \"刘易斯\",\n        \"kagura mea\": \"神乐Mea\",\n        \"gabriel\": \"加百列\",\n        \"europa\": \"欧罗巴\",\n        \"neneka utsushimi\": \"现士实似似花\",\n        \"penny\": \"牡丹\",\n        \"arslan\": \"亚尔斯兰\",\n        \"tobio kageyama\": \"影山飞雄\",\n        \"kirari momobami\": \"桃喰绮罗莉\",\n        \"twin turbo\": \"双涡轮\",\n        \"kishirika kishirisu\": \"奇希莉卡·奇希里斯\",\n        \"urushi yaotome\": \"八乙女漆\",\n        \"anne\": \"安\",\n        \"grea\": \"古蕾雅\",\n        \"sakurako utazumi\": \"歌住樱子\",\n        \"miyako tsukiyuki\": \"月雪宫子\",\n        \"koyuki kurosaki\": \"黑崎小雪\",\n        \"atsuko hakari\": \"秤亚津子\",\n        \"saya yakushi\": \"药子纱绫\",\n        \"kaya shiranui\": \"不知火花耶\",\n        \"mine aomori\": \"苍森美弥\",\n        \"mina konoe\": \"近卫弥奈\",\n        \"marina ikekura\": \"池仓玛丽娜\",\n        \"eimi izumimoto\": \"和泉元艾米\",\n        \"megu shimokura\": \"下仓惠\",\n        \"serina sumi\": \"鹫见芹娜\",\n        \"ayumu iwabitsu\": \"岩柜步梦\",\n        \"rin nanagami\": \"七神凛\",\n        \"aoi oki\": \"扇喜葵\",\n        \"rumi akeshiro\": \"朱城瑠美\",\n        \"michiru chidori\": \"千鸟满\",\n        \"reijo kayama\": \"鹿山丽情\",\n        \"maki konuri\": \"小涂真纪\",\n        \"misaki imashino\": \"戒野美咲\",\n        \"mimori mizuha\": \"水羽三森\",\n        \"haruka igusa\": \"伊草遥香\",\n        \"kirino nakatsukasa\": \"中务桐乃\",\n        \"yoshimi ibaragi\": \"伊原木好美\",\n        \"hiyori tsuchinaga\": \"槌永日和\",\n        \"cherino renkawa\": \"连河切里诺\",\n        \"kei tsukishima\": \"月岛萤\",\n        \"izzy izumi\": \"泉光子郎\",\n        \"tai kamiya\": \"八神太一\",\n        \"agumon\": \"亚古兽\",\n        \"hatoba tsugu\": \"鸠羽伦\",\n        \"autumn blaze\": \"秋烨\",\n        \"lyra heartstrings\": \"天琴心弦\",\n        \"lopiniatre\": \"倔强\",\n        \"luca ikaruga\": \"斑鸠路加\",\n        \"hare omagari\": \"小钩晴\",\n        \"karen aijo\": \"爱城华恋\",\n        \"sawako kuronuma\": \"黑沼爽子\",\n        \"izumi shishidou\": \"狮子堂泉\",\n        \"lynette\": \"琳妮特\",\n        \"focalors\": \"芙宁娜\",\n        \"mizuki\": \"水月\",\n        \"ayame kajou\": \"华城绫女\",\n        \"kirche augusta frederica von anhalt zerbst\": \"丘鲁克·奥古斯都·菲列特利加·封·安哈尔特·泽鲁普斯特\",\n        \"london\": \"伦敦\",\n        \"enlilta reesehyde bertrand\": \"贝尔托兰\",\n        \"momiji akiizumi\": \"秋泉红叶\",\n        \"howe\": \"豪\",\n        \"aki shino\": \"志野亚贵\",\n        \"kotama otose\": \"音濑小玉\",\n        \"minoto\": \"水芸\",\n        \"matikanefukukitaru\": \"待兼福来\",\n        \"hiyori harusaki\": \"春咲日和莉\",\n        \"rei shijo\": \"士条怜\",\n        \"tomo aizawa\": \"相泽智\",\n        \"junichirou kubota\": \"久保田淳一郎\",\n        \"misuzu gundou\": \"群堂美铃\",\n        \"minato senkawa\": \"千川凑\",\n        \"yuuta sakurada\": \"樱田悠太\",\n        \"saria\": \"塞雷娅\",\n        \"saga\": \"嵯峨\",\n        \"bagpipe\": \"风笛\",\n        \"hoolheyak\": \"霍尔海雅\",\n        \"dorothy\": \"多萝西\",\n        \"daki\": \"堕姬\",\n        \"professor juniper\": \"红豆杉博士\",\n        \"hirato\": \"平户\",\n        \"dancer of the boreal valley\": \"冷冽谷的舞娘\",\n        \"ayumi momozono\": \"桃园步美\",\n        \"shirayuki mishiro\": \"白雪深白\",\n        \"killer bee\": \"奇拉比\",\n        \"jiraiya\": \"自来也\",\n        \"ares\": \"阿瑞斯\",\n        \"hippolyta\": \"希波吕忒\",\n        \"ms. marvel\": \"惊奇女士\",\n        \"io hasekura\": \"支仓伊绪\",\n        \"tuscaloosa\": \"塔斯卡卢萨\",\n        \"heywood l.e.\": \"海伍德·L·E\",\n        \"ranger\": \"突击者\",\n        \"janus\": \"雅努斯\",\n        \"ornn\": \"奥恩\",\n        \"chong yue\": \"重岳\",\n        \"ethan\": \"伊桑\",\n        \"ren yamashiro\": \"山城恋\",\n        \"sena himuro\": \"冰室濑名\",\n        \"amane tanikaze\": \"谷风天音\",\n        \"sairi mikuni\": \"三国彩里\",\n        \"kaede kinoshita\": \"木下枫\",\n        \"chika shiraishi\": \"白石千花\",\n        \"tomoya mashiro\": \"真白友也\",\n        \"constanze amalie von braunschbank-albrechtsberger\": \"康斯坦策·阿玛莉·冯·布朗施班克·阿尔布雷希茨贝格\",\n        \"kaori kyan\": \"喜屋武香织\",\n        \"janna\": \"迦娜\",\n        \"fuyu fuiba\": \"风衣叶冬优\",\n        \"jia ran\": \"嘉然\",\n        \"navia\": \"娜维娅\",\n        \"clorinde\": \"克洛琳德\",\n        \"neuvillette\": \"那维莱特\",\n        \"lyney\": \"林尼\",\n        \"yukiko kudo\": \"工藤有希子\",\n        \"myrtle\": \"桃金娘\",\n        \"ganondorf\": \"加侬多夫\",\n        \"maidena ange\": \"梅蒂娜·安洁\",\n        \"noma rune\": \"诺玛·卢恩\",\n        \"toxico dannar\": \"毒毒子·达纳\",\n        \"enome north\": \"艾诺梅·诺斯\",\n        \"marina katsuragi\": \"葛城真理奈\",\n        \"executioner\": \"行裁者\",\n        \"scarecrow\": \"稻草人\",\n        \"hk416\": \"HK416\",\n        \"dsr-50\": \"DSR-50\",\n        \"ots-14\": \"OTs-14\",\n        \"p90\": \"P90\",\n        \"wa2000\": \"WA2000\",\n        \"pa-15\": \"PA-15\",\n        \"agent\": \"代理人\",\n        \"welrod mkii\": \"维尔德MkⅡ\",\n        \"ak-12\": \"AK-12\",\n        \"an-94\": \"AN-94\",\n        \"kalina\": \"格琳娜\",\n        \"ump45\": \"UMP45\",\n        \"vsk-94\": \"VSK-94\",\n        \"g11\": \"G11\",\n        \"desert eagle\": \"沙漠之鹰\",\n        \"ump9\": \"UMP9\",\n        \"tar-21\": \"TAR-21\",\n        \"aa-12\": \"AA-12\",\n        \"mk23\": \"Mk23\",\n        \"ouroboros\": \"衔尾蛇\",\n        \"intruder\": \"干扰者\",\n        \"gager\": \"计量官\",\n        \"architect\": \"建筑师\",\n        \"alchemist\": \"炼金术士\",\n        \"hunter\": \"猎手\",\n        \"dreamer\": \"梦想家\",\n        \"destroyer\": \"破坏者\",\n        \"beak\": \"喙\",\n        \"k2\": \"K2\",\n        \"g3\": \"G3\",\n        \"g36\": \"G36\",\n        \"g36c\": \"G36C\",\n        \"eliza\": \"伊莱莎\",\n        \"m1911\": \"M1911\",\n        \"m99\": \"M99\",\n        \"m950a\": \"M950A\",\n        \"p38\": \"P38\",\n        \"ppk\": \"PPK\",\n        \"p08\": \"P08\",\n        \"mauser c96\": \"C96\",\n        \"m37\": \"M37\",\n        \"mac-10\": \"MAC-10\",\n        \"ppsh-41\": \"PPSh-41\",\n        \"pps-43\": \"PPS-43\",\n        \"pp-90\": \"PP-90\",\n        \"thunder\": \"雷电\",\n        \"negev\": \"内格夫\",\n        \"st ar-15\": \"ST AR-15\",\n        \"m4a1\": \"M4A1\",\n        \"m4 sopmod ii\": \"M4 SOPMODII\",\n        \"m16a1\": \"M16A1\",\n        \"ak-15\": \"AK-15\",\n        \"rpk-16\": \"RPK-16\",\n        \"nagant revolver\": \"纳甘左轮\",\n        \"colt revolver\": \"柯尔特左轮\",\n        \"super-shorty\": \"超级肖蒂\",\n        \"python\": \"蟒蛇\",\n        \"m9\": \"M9\",\n        \"tokarev\": \"托卡列夫\",\n        \"stechkin\": \"斯捷奇金\",\n        \"makarov\": \"马卡洛夫\",\n        \"type 92\": \"92式\",\n        \"glock 17\": \"格洛克17\",\n        \"thompson\": \"汤姆森\",\n        \"m3\": \"M3\",\n        \"kriss vector\": \"维克托\",\n        \"vector\": \"维克托\",\n        \"mp40\": \"MP40\",\n        \"mp5\": \"MP5\",\n        \"ro635\": \"RO635\",\n        \"skorpion\": \"蝎式\",\n        \"mp7\": \"MP7\",\n        \"sten mkii\": \"司登MkⅡ\",\n        \"beretta model 38\": \"伯莱塔38型\",\n        \"micro uzi\": \"微型乌兹\",\n        \"m45\": \"m45\",\n        \"m1 garand\": \"M1加兰德\",\n        \"9a-91\": \"9A-91\",\n        \"ameli\": \"阿梅利\",\n        \"m200\": \"M200\",\n        \"kar98k\": \"Kar98k\",\n        \"ots-12\": \"OTs-12\",\n        \"tmp\": \"TMP\",\n        \"fn five-seven\": \"FN-57\",\n        \"sr-3mp\": \"SR-3MP\",\n        \"k5\": \"K5\",\n        \"rfb\": \"RFB\",\n        \"art556\": \"ART556\",\n        \"florence\": \"芙洛伦 | 芙罗伦斯\",\n        \"webley\": \"韦伯利\",\n        \"ifrit\": \"伊芙利特\",\n        \"kabane kusaka\": \"日下夏羽\",\n        \"sigewinne\": \"希格雯\",\n        \"mitsuki nase\": \"名瀬美月\",\n        \"izumi nase\": \"名濑泉\",\n        \"kaito kirishima\": \"雾岛海人\",\n        \"ichika takatsuki\": \"贵月一花\",\n        \"magdeburg\": \"马格德堡\",\n        \"kaveh\": \"卡维\",\n        \"tea gardner\": \"真崎杏子\",\n        \"laphicet\": \"莱菲瑟特\",\n        \"eleanor hume\": \"艾蕾诺亚·修姆\",\n        \"magillanica lou mayvin\": \"玛琪露\",\n        \"topaz\": \"托帕\",\n        \"jingliu\": \"镜流\",\n        \"dan heng\": \"丹恒\",\n        \"caelus\": \"穹\",\n        \"pozemka\": \"鸿雪\",\n        \"kotori toyomi\": \"丰见亚都梨\",\n        \"frieren\": \"芙莉莲\",\n        \"joshua bright\": \"约修亚·布莱特\",\n        \"courier\": \"讯使\",\n        \"thorns\": \"棘刺\",\n        \"issei hyoudou\": \"兵藤一诚\",\n        \"chizuru shiina\": \"椎名千鹤\",\n        \"miss fortune\": \"厄运小姐\",\n        \"riven\": \"锐雯\",\n        \"zac\": \"扎克\",\n        \"xenovia quarta\": \"洁诺薇亚·夸塔\",\n        \"crow armbrust\": \"克洛·安布斯特\",\n        \"yshtola rhul\": \"雅·修特拉·路尔\",\n        \"fine motion\": \"美妙姿势\",\n        \"air groove\": \"气槽\",\n        \"matikane tannhauser\": \"待兼诗歌剧\",\n        \"ash ketchum\": \"小智\",\n        \"jirachi\": \"基拉祈\",\n        \"mew\": \"梦幻\",\n        \"billy the kid\": \"比利·奇德\",\n        \"lloyd bannings\": \"罗伊德·班宁斯\",\n        \"agnes claudel\": \"亚妮艾丝·克劳蒂尔\",\n        \"lorelei\": \"科拿\",\n        \"fern\": \"菲伦\",\n        \"cure sky\": \"索拉・哈雷瓦塔尔\",\n        \"chiyari tenkajin\": \"天火人血枪\",\n        \"ai sugimoto\": \"杉本爱\",\n        \"nobara kugisaki\": \"钉崎野蔷薇\",\n        \"maki zenin\": \"禅院真希\",\n        \"usagi saionji\": \"西园寺兔\",\n        \"principal minami\": \"南日和子\",\n        \"sumi takane\": \"高岭珠深\",\n        \"illumi zoldyck\": \"伊路米·揍敌客\",\n        \"charybdis\": \"卡律布狄斯\",\n        \"elbe\": \"易北\",\n        \"anchorage\": \"安克雷奇\",\n        \"jade\": \"亚德\",\n        \"scylla\": \"斯库拉\",\n        \"algerie\": \"阿尔及利亚\",\n        \"erika\": \"莉佳\",\n        \"juliana\": \"小青\",\n        \"ishizu ishtar\": \"伊西丝·伊修达尔\",\n        \"mai valentine\": \"孔雀舞\",\n        \"serenity wheeler\": \"川井静香\",\n        \"aki izayoi\": \"十六夜秋\",\n        \"aoi zaizen\": \"财前葵\",\n        \"emma bessho\": \"别所惠麻\",\n        \"kotori mizuki\": \"观月小鸟\",\n        \"anna kouzuki\": \"神月安奈\",\n        \"sherry leblanc\": \"雪莉·卢布朗\",\n        \"mina simington\": \"狭雾深影\",\n        \"romin kirishima\": \"雾岛露明\",\n        \"yuzu hiiragi\": \"柊柚子\",\n        \"sera\": \"塞拉\",\n        \"chloe\": \"小春\",\n        \"stella vermillion\": \"史黛菈·法米利昂\",\n        \"ikki kurogane\": \"黑铁一辉\",\n        \"bort\": \"圆粒金刚石\",\n        \"cinnabar\": \"辰砂\",\n        \"phosphophyllite\": \"磷叶石\",\n        \"euclase\": \"蓝柱石\",\n        \"asana mutsuba\": \"六叶麻奈\",\n        \"yuuka gouha\": \"哥哈游佳\",\n        \"haruka kamijo\": \"上城大华／泰格\",\n        \"tatsuhisa kamijo\": \"上城龙久\",\n        \"yuga ohdo\": \"王道游我\",\n        \"rossweisse\": \"罗丝薇瑟\",\n        \"villetta nu\": \"维蕾塔·努\",\n        \"kaname ohgi\": \"扇要\",\n        \"ruri\": \"黑咲琉璃\",\n        \"cornelia li britannia\": \"柯内莉亚·li·布里塔尼亚\",\n        \"monica kruszewski\": \"莫妮卡·库鲁席夫斯基\",\n        \"jessie rasberry\": \"杰西\",\n        \"tamaki\": \"环\",\n        \"nagisa\": \"凪咲\",\n        \"nanami\": \"娜娜米\",\n        \"misaki\": \"海咲\",\n        \"sayuri\": \"小百合\",\n        \"helena\": \"海伦娜\",\n        \"momiji\": \"红叶\",\n        \"nico\": \"NiCO\",\n        \"monica\": \"莫妮卡\",\n        \"fiona\": \"菲欧娜\",\n        \"cai wenji\": \"蔡文姬\",\n        \"diao chan\": \"貂蝉\",\n        \"lian shi\": \"步练师\",\n        \"aciddrop\": \"酸糖\",\n        \"claudia\": \"Claudia\",\n        \"kozue otomune\": \"乙宗梢\",\n        \"tsuzuri yugiri\": \"夕雾缀理\",\n        \"futari gotou\": \"后藤二里\",\n        \"frostleaf\": \"霜叶\",\n        \"highmore\": \"海沫\",\n        \"mei misaki\": \"见崎鸣\",\n        \"kenma kozume\": \"孤爪研磨\",\n        \"tadashi yamaguchi\": \"山口忠\",\n        \"leon s. kennedy\": \"里昂·斯科特·肯尼迪\",\n        \"sayaka igarashi\": \"五十岚清华\",\n        \"kiba inuzuka\": \"犬冢牙\",\n        \"aang\": \"安昂\",\n        \"kyouko kirigiri\": \"雾切响子\",\n        \"astral\": \"星光体\",\n        \"yuma tsukumo\": \"九十九游马\",\n        \"kite tenjo\": \"天城快斗\",\n        \"droite\": \"德鲁瓦（右臂）\",\n        \"mizar\": \"米扎艾尔\",\n        \"dumon\": \"德鲁贝\",\n        \"ariados\": \"阿利多斯\",\n        \"latias\": \"拉帝亚斯\",\n        \"endministrator\": \"管理员\",\n        \"perlica\": \"佩丽卡\",\n        \"absinthe\": \"苦艾\",\n        \"misha necron\": \"米夏·涅库罗\",\n        \"sentouki - roze\": \"闪刀姬-露世\",\n        \"kooh\": \"酷儿\",\n        \"aaya saitou\": \"齐藤亚绫\",\n        \"kiiko kawakami\": \"川上纪衣子\",\n        \"princess gradriel de valendia\": \"海拉加德的公主\",\n        \"olivier mira armstrong\": \"奥利维亚·米拉·阿姆斯特朗\",\n        \"aqua hoshino\": \"阿库亚（星野爱久爱海）\",\n        \"miyako saitou\": \"齐藤京子\",\n        \"airi kurimura\": \"栗村爱莉\",\n        \"rentarou aijou\": \"爱城恋太郎\",\n        \"karane inda\": \"院田唐音\",\n        \"hakari hanazono\": \"花园羽香里\",\n        \"mayling shen\": \"沈美玲\",\n        \"akari wanibuchi\": \"鳄渊亚伽里\",\n        \"kikyou kiryuu\": \"桐生桔梗\",\n        \"fuwawa abyssgard\": \"软软·阿比斯加德\",\n        \"mococo abyssgard\": \"茸茸·阿比斯加德\",\n        \"hijiri mochizuki\": \"望月圣\",\n        \"eila ilmatar juutilainen\": \"艾拉·伊尔玛塔尔·尤蒂莱南\",\n        \"yuuhi oudou\": \"王道游飞\",\n        \"tell kawai\": \"合羽井英\",\n        \"kouko kaga\": \"加贺香子\",\n        \"lisanna strauss\": \"丽莎娜·斯特劳斯\",\n        \"mia luna tearmoon\": \"米雅·卢娜·堤亚穆\",\n        \"ruan mei\": \"阮·梅\",\n        \"li sushang\": \"李素裳 | 素裳\",\n        \"prometheus\": \"普罗米修斯\",\n        \"lisesharte atismata\": \"莉姿夏尔蒂·亚提司玛特\",\n        \"dantoudai no aura\": \"阿乌拉\",\n        \"ayano yuugiri\": \"夕桐绫乃\",\n        \"rose oriana\": \"萝丝·奥里亚纳\",\n        \"vladilena milize\": \"芙拉蒂蕾娜·米利杰\",\n        \"sharon\": \"莎郎 | 莎朗·荷莉格蕾尔\",\n        \"warlock\": \"术士\",\n        \"tamaki kotatsu\": \"環古達\",\n        \"brigitte lindholm\": \"布丽吉塔\",\n        \"tatsuya kaname\": \"鹿目达也\",\n        \"kamille bidan\": \"卡缪·比丹\",\n        \"delta\": \"德尔塔\",\n        \"kyouko yuuki\": \"结城京子\",\n        \"maomao\": \"猫猫\",\n        \"chris redfield\": \"克里斯·雷德菲尔德\",\n        \"kazuma ikezawa\": \"池泽佳主马\",\n        \"kenji koiso\": \"小矶健二\",\n        \"yuki sanada\": \"真田雪\",\n        \"natsuki usami\": \"宇佐美夏树\",\n        \"galleon\": \"伽莱翁\",\n        \"asa mitaka\": \"三鹰朝\",\n        \"sayaka murano\": \"村野沙耶香\",\n        \"kaho hinoshita\": \"日野下花帆\",\n        \"gravel\": \"砾\",\n        \"ant-man\": \"蚁人\",\n        \"utena hiiragi\": \"柊舞缇娜\",\n        \"chevreuse\": \"夏沃蕾\",\n        \"huohuo\": \"藿藿\",\n        \"lynx landau\": \"玲可\",\n        \"pelageya sergeyevna\": \"佩拉格娅·谢尔盖耶夫娜\",\n        \"hook\": \"虎克\",\n        \"yukong\": \"驭空\",\n        \"guinaifen\": \"桂乃芬\",\n        \"rumi usagiyama\": \"兔山留美\",\n        \"ryuko tatsuma\": \"龙间龙子\",\n        \"itsuka kendou\": \"拳藤一佳\",\n        \"nejire hado\": \"波动螺卷\",\n        \"setsuna tokage\": \"取荫切奈\",\n        \"lady nagant\": \"筒美火伊那\",\n        \"kyoka jiro\": \"耳郎响香\",\n        \"tooru hagakure\": \"叶隐透\",\n        \"ibara shiozaki\": \"塩崎茨\",\n        \"kinoko komori\": \"小森希乃子\",\n        \"pony tsunotori\": \"角取波尼\",\n        \"reiko yanagi\": \"柳玲子\",\n        \"yui kodai\": \"小大唯\",\n        \"mount lady\": \"岳山优\",\n        \"moe kamiji\": \"上路萌\",\n        \"mei hatsume\": \"发目明\",\n        \"mashirao ojiro\": \"尾白猿夫\",\n        \"nemuri kayama\": \"香山睡\",\n        \"chiori\": \"千织\",\n        \"shuro yabuki\": \"箭吹棕榈\",\n        \"blade\": \"刃\",\n        \"astesia\": \"星极\",\n        \"ichika nakamasa\": \"仲正一花\",\n        \"nodoka amami\": \"天见和香\",\n        \"shadow the hedgehog\": \"夏特\",\n        \"iris\": \"艾莉丝\",\n        \"momoka yuragi\": \"由良木桃香\",\n        \"yukari kadenokouji\": \"勘解由小路紫\",\n        \"yakumo aramaki\": \"荒牧八云\",\n        \"kasumi kinugawa\": \"鬼怒川霞\",\n        \"niya amachi\": \"天地妮娅\",\n        \"fiammetta\": \"菲亚梅塔\",\n        \"shu\": \"黍\",\n        \"hahari hanazono\": \"花园羽羽里\",\n        \"naoto hachiouji\": \"八王子直人\",\n        \"xianyun\": \"闲云（留云借风真君）\",\n        \"aizawa ema\": \"蓝泽艾玛\",\n        \"kurumi noah\": \"胡桃诺娅\",\n        \"atsushi murasakibara\": \"紫原敦\",\n        \"junna hoshimi\": \"星见纯那\",\n        \"hikari kagura\": \"神乐光\",\n        \"futaba isurugi\": \"石动双叶\",\n        \"kaoruko hanayagi\": \"花柳香子\",\n        \"mahiru tsuyuzaki\": \"露崎真昼\",\n        \"shizuka yoshimoto\": \"好本静\",\n        \"anastasia hoshin\": \"安娜塔西亚·合辛\",\n        \"stark\": \"休塔尔克\",\n        \"aiba uiha\": \"相羽初叶\",\n        \"sherlock shellingford\": \"夏洛克·雪莉福德\",\n        \"sodachi oikura\": \"老仓育\",\n        \"smolder\": \"斯莫得\",\n        \"touka satomi\": \"里见灯花\",\n        \"firefly\": \"流萤\",\n        \"black swan\": \"黑天鹅\",\n        \"gaming yip\": \"嘉明\",\n        \"dunyarzad homayani\": \"迪娜泽黛\",\n        \"sparkle\": \"花火\",\n        \"senadina\": \"希娜狄雅\",\n        \"satoshi mizukami\": \"水上敏志\",\n        \"secelia dote\": \"塞西莉亚·多特\",\n        \"gon freecss\": \"杰·富力士\",\n        \"meteion\": \"梅蒂恩\",\n        \"emil sinclair\": \"辛克莱\",\n        \"yi sang\": \"李箱\",\n        \"gary oak\": \"小茂\",\n        \"red\": \"赤红\",\n        \"coralie 6626 planck\": \"科拉莉·6626·普朗克\",\n        \"ami nonomura\": \"野野村亚美\",\n        \"indomitable\": \"不挠\",\n        \"kurumi tsuchimikado\": \"土御门胡桃\",\n        \"ada wong\": \"艾达·王\",\n        \"yamato takeru\": \"日本武尊(Fate)\",\n        \"wriothesley\": \"莱欧斯利\",\n        \"rin uehara\": \"上原燐\",\n        \"himeno\": \"姬野\",\n        \"tomori takamatsu\": \"高松灯\"\n    },\n    \"group\": {\n        \"1\": \"1\",\n        \"13\": \"13\",\n        \"27\": \"27\",\n        \"38\": \"38\",\n        \"86\": \"86\",\n        \"110\": \"110\",\n        \"183\": \"183\",\n        \"203\": \"ニイマルサン\",\n        \"333\": \"333\",\n        \"471\": \"四七一\",\n        \"530\": \"530\",\n        \"560\": \"560\",\n        \"1122\": \"1122\",\n        \"1787\": \"1787\",\n        \"2961\": \"2961\",\n        \"2990\": \"2990\",\n        \"4040\": \"4040\",\n        \"8716\": \"8716\",\n        \"1000000000\": \"1000000000\",\n        \"clockup\": \"CLOCKUP\",\n        \"guilty\": \"Guilty\",\n        \"guilty plus\": \"Guilty+\",\n        \"guilty ex\": \"Guilty eX\",\n        \"nanawind\": \"NanaWind\",\n        \"orc soft\": \"ORCSOFT\",\n        \"praline\": \"Praline\",\n        \"sakuragame\": \"SakuraGame\",\n        \"frill\": \"Frill\",\n        \"triangle\": \"Triangle\",\n        \"mana\": \"mana\",\n        \"sprite\": \"sprite\",\n        \"fairys\": \"fairys\",\n        \"escude\": \"エスクード\",\n        \"campus\": \"Campus\",\n        \"interheart\": \"INTERHEART\",\n        \"darknesspot\": \"DarknessPot\",\n        \"nihon bussan\": \"日本物产\",\n        \"sphinx\": \"SPHINX\",\n        \"bishop\": \"BISHOP\",\n        \"tanuki soft\": \"たぬきそふと\",\n        \"baseson\": \"BaseSon\",\n        \"miel\": \"Miel\",\n        \"may-be soft\": \"May-Be SOFT\",\n        \"squeez\": \"SQUEEZ\",\n        \"milk factory\": \"みるふぁく\",\n        \"alicesoft\": \"ALICESOFT\",\n        \"omega star\": \"ωstar\",\n        \"norn\": \"Norn\",\n        \"aries\": \"Aries\",\n        \"ensemble\": \"ensemble\",\n        \"ensemble sweet\": \"ensemble SWEET\",\n        \"caramel box\": \"CARAMEL-BOX\",\n        \"rootnuko\": \"√nuko\",\n        \"c drive\": \"C:drive.\",\n        \"d drive\": \"D:drive.\",\n        \"grand cross\": \"GRAND†CROSS\",\n        \"skyfish\": \"SkyFish\",\n        \"skyfish poco\": \"SkyFish poco\",\n        \"chelseasoft\": \"Chelseasoft\",\n        \"sphere\": \"Sphere\",\n        \"hook\": \"HOOKSOFT\",\n        \"smee\": \"SMEE\",\n        \"asa project\": \"ASa Project\",\n        \"rosebleu\": \"Rosebleu\",\n        \"clochette\": \"Clochette\",\n        \"honey soft\": \"HONEY SOFT\",\n        \"appetite\": \"アパタイト\",\n        \"pakopako soft\": \"ぱこぱこそふと\",\n        \"neko neko soft\": \"猫猫软件\",\n        \"abhar\": \"ABHAR\",\n        \"abhar tronc\": \"ABHAR Tronc\",\n        \"incarose\": \"インカローズ\",\n        \"nutaku\": \"Nutaku\",\n        \"etude\": \"etude\",\n        \"eufonie\": \"eufonie\",\n        \"eushully\": \"Eushully\",\n        \"waffle\": \"Waffle\",\n        \"navel\": \"Navel\",\n        \"tryset\": \"TRYSET\",\n        \"seal-tutu\": \"seal-tutu\",\n        \"softhouse chara\": \"Softhouse Chara\",\n        \"softhouse-seal\": \"softhouse-seal\",\n        \"devil-seal\": \"Devil-seal\",\n        \"softhouse-seal grandee\": \"softhouse-seal GRANDEE\",\n        \"reverse\": \"Re:verse\",\n        \"samoyed smile\": \"SAMOYED SMILE\",\n        \"moonstone\": \"MOONSTONE\",\n        \"moonstone cherry\": \"MOONSTONE Cherry\",\n        \"moonstone honey\": \"MOONSTONE Honey\",\n        \"yuzu soft\": \"柚子社\",\n        \"lump of sugar\": \"Lump of Sugar\",\n        \"quince soft\": \"QUINCE SOFT\",\n        \"aquaplus\": \"AQUAPLUS\",\n        \"leaf\": \"Leaf🍃\",\n        \"key\": \"🔑Key\",\n        \"alcot\": \"ALcot\",\n        \"alcot honey comb\": \"ALcot Honey Comb\",\n        \"august\": \"AUGUST\",\n        \"feng\": \"feng\",\n        \"frontwing\": \"FrontWing\",\n        \"atelier d\": \"Atelier D\",\n        \"atelier kaguya\": \"Atelier KAGUYA\",\n        \"atelier kaguya honky-tonk pumpkin\": \"Atelier KAGUYA Honky-Tonk Pumpkin\",\n        \"atelier kaguya team gassa-q\": \"Atelier KAGUYA TEAM Gassa-Q\",\n        \"atelier kaguya team heartbeat\": \"Atelier KAGUYA TEAM HEARTBEAT\",\n        \"atelier kaguya berkshire yorkshire\": \"Atelier KAGUYA Berkshire Yorkshire\",\n        \"atelier sakura roshutsu yuugi\": \"樱花工作室 露出＊游戏\",\n        \"atelier sakura konmai studio\": \"樱花工作室 こんまいすたじお\",\n        \"atelier sakura darkness\": \"樱花工作室 DARKNESS\",\n        \"atelier sakura team.ntr\": \"樱花工作室 Team.NTR\",\n        \"atelier sakura mount position\": \"樱花工作室 Mount Position\",\n        \"atelier sakura extra\": \"樱花工作室 eXtra\",\n        \"abel software\": \"AbelSoftware\",\n        \"type-moon\": \"🌙TYPE-MOON\",\n        \"nitroplus\": \"Nitro+\",\n        \"5pb\": \"5pb.\",\n        \"aniseed\": \"AniSeed\",\n        \"candysoft\": \"Candy Soft\",\n        \"ricotta\": \"Ricotta\",\n        \"whirlpool\": \"Whirlpool\",\n        \"giga\": \"戏画\",\n        \"milksoft\": \"牛奶软件\",\n        \"cygames\": \"Cygames\",\n        \"keroq\": \"ケロQ\",\n        \"akatsuki works hibiki\": \"hibiki works\",\n        \"fairytale\": \"fairytale\",\n        \"falcom\": \"Falcom\",\n        \"softstar\": \"大宇资讯\",\n        \"dmm.com\": \"DMM.com\",\n        \"kadokawa\": \"KADOKAWA\",\n        \"winged cloud\": \"Winged Cloud\",\n        \"tech gian\": \"TECH GIAN\",\n        \"electromagneticwave\": \"ElectromagneticWave\",\n        \"usotsukiya\": \"嘘つき屋\",\n        \"archetype\": \"ARCHETYPE\",\n        \"afterschool of the 5th year\": \"5年目の放课后\",\n        \"tsf no f\": \"TSF的F\",\n        \"number2\": \"Number2\",\n        \"plant\": \"PLANT\",\n        \"opaque\": \"Opaque\",\n        \"shiroganeya\": \"しろがね屋\",\n        \"horizontal world\": \"Horizontal World\",\n        \"mousou deguchi\": \"妄想出口\",\n        \"venom\": \"VENOM\",\n        \"tsuchinoko kyoukai\": \"ツシノコ協会\",\n        \"sekine\": \"咳寝\",\n        \"ippongui\": \"一本杭\",\n        \"aomidoro\": \"アオミドロ\",\n        \"otukimi koubo\": \"おつきみ工房\",\n        \"monsieur\": \"MonsieuR\",\n        \"orange peels\": \"オレンジピールズ\",\n        \"wata 120 percent\": \"120%棉\",\n        \"watsukiya\": \"わつき屋\",\n        \"sotikoti\": \"ソチコチ\",\n        \"320bpm\": \"320BPM\",\n        \"intoku.info\": \"いんとくいんふぉ\",\n        \"47sp\": \"47sp.\",\n        \"shibayukiya\": \"芝雪屋\",\n        \"news\": \"NEWS\",\n        \"shimajiya\": \"しまじや\",\n        \"canvas garden\": \"CANVAS+GARDEN\",\n        \"mc\": \"MC\",\n        \"animachine\": \"アニマルマシーン\",\n        \"ailail\": \"あいるあいる\",\n        \"moe hime rengou\": \"萌姬连合\",\n        \"digital lover\": \"Digital Lover\",\n        \"mone keshi gum\": \"MONEけしごむ\",\n        \"nama cream biyori\": \"生クリームびより\",\n        \"clesta\": \"クレスタ\",\n        \"onasuga 99-yen\": \"おナスが99円\",\n        \"karomix\": \"KAROMIX\",\n        \"shoot the moon\": \"シュート・ザ・ムーン\",\n        \"kansai gyogyou kyoudou kumiai\": \"关西渔业协同组合\",\n        \"rainwaterserver\": \"RainWaterServer\",\n        \"lily lily rose\": \"Lily Lily Rose\",\n        \"himura nyuugyou\": \"比村乳业\",\n        \"raijinkai\": \"雷神会\",\n        \"miyamaya\": \"深山屋\",\n        \"onna kishi no shiro\": \"女騎士の城\",\n        \"yonsai books\": \"四才ブックス\",\n        \"pastel wing\": \"PASTEL WING\",\n        \"ajisaidenden\": \"アジサイデンデン\",\n        \"attendance number 26\": \"出席番号26\",\n        \"yu-yu-tei\": \"悠々亭\",\n        \"circle ohigetan\": \"サークル尾髭丹\",\n        \"mahou rikigaku\": \"魔法力学\",\n        \"minimum game koubou\": \"ミニマムゲーム工房\",\n        \"santa star festa\": \"Santa☆Festa!\",\n        \"byousatsu tanukidan\": \"秒杀狸团\",\n        \"seven days holiday\": \"セブンデイズホリディ\",\n        \"uchuu bunko\": \"宇宙文库\",\n        \"nakayohi mogudan\": \"なかよひモグダン\",\n        \"suteuka no koya\": \"すてうかの小屋\",\n        \"at ism\": \"@ism\",\n        \"twinbox\": \"TwinBox\",\n        \"ame nochi yuki\": \"あめ のち ゆき\",\n        \"mataro\": \"魔太郎\",\n        \"otonano do-wa\": \"大人の寓話\",\n        \"tsukuru no mori kabushikigaisha\": \"ツクルノモリ株式会社\",\n        \"asanoya\": \"浅野屋\",\n        \"neko works\": \"NEKO WORKs\",\n        \"goshujinsama no omochabako\": \"御主人様の玩具箱\",\n        \"rairaku jinja\": \"磊落神社\",\n        \"mani mania\": \"マニまにあ\",\n        \"kongari tokei\": \"こんがり時計\",\n        \"circle kame\": \"さーくる亀\",\n        \"sugiura-ke\": \"杉浦家\",\n        \"atelier-g\": \"Atelier-G\",\n        \"atelier tiv\": \"Atelier Tiv\",\n        \"atelier lunette\": \"Atelier Lunette\",\n        \"atelier gh\": \"Atelier G/H\",\n        \"atelier botan\": \"あとりえ牡丹\",\n        \"atelier kinta\": \"あとりえKINTA\",\n        \"atelier miyabi\": \"あとりえ雅\",\n        \"atelier knee stroke\": \"あとりえ にーすとろーく\",\n        \"atelier pachira\": \"アトリエパキラ\",\n        \"atelier pinpoint\": \"アトリエ ピン・ポイント\",\n        \"atelier hachifukuan\": \"アトリエ八福庵\",\n        \"atelier gons\": \"アトリエ GONS\",\n        \"atelier maruwa\": \"アトリエ丸和\",\n        \"atelier ms\": \"Atelier Ms\",\n        \"kinokonabe-hinanjo\": \"きのこなべ避難所\",\n        \"s-size\": \"Sサイズ\",\n        \"mugen at works\": \"むげん@WORKS\",\n        \"hyogetsu\": \"冰月\",\n        \"garakuta shoujo\": \"がらくた少女\",\n        \"mosquito man\": \"モスキートマン\",\n        \"metal\": \"METAL\",\n        \"watanabe tou\": \"渡边党\",\n        \"suzuna jct\": \"SUZUNA JCT\",\n        \"amagami dou\": \"あまがみ堂\",\n        \"bitch bokujou\": \"Bitch牧场\",\n        \"antyuumosaku\": \"暗中模索\",\n        \"kurumaya\": \"車ヤ\",\n        \"shiitake en\": \"しいたけ園\",\n        \"makutsutei\": \"魔窟亭\",\n        \"studio pal\": \"STUDIO PAL\",\n        \"frac\": \"FRAC\",\n        \"karaageyasan\": \"からあげ屋さん\",\n        \"meltdown comet\": \"MeltdoWN COmet\",\n        \"karakishi youhei-dan\": \"からきし傭兵団 真雅\",\n        \"blusterlight\": \"BlusterLight\",\n        \"24 page\": \"24ぺーじ\",\n        \"holy water club\": \"ほーりーうぉーたー倶楽部\",\n        \"black currant\": \"ブラックカラント\",\n        \"ankoku soshiki\": \"暗黑组织\",\n        \"sweet heart\": \"Sweet HEART\",\n        \"zenmai kourogi\": \"ぜんまいこうろぎ\",\n        \"tsuki no hikari keikaku\": \"月ノヒカリ計画\",\n        \"aozora\": \"青尾空\",\n        \"shoujo kishidan\": \"少女骑士团\",\n        \"shimoyakedou\": \"しもやけ堂\",\n        \"jun and yuri\": \"Jun&Yuri\",\n        \"haiiro koubou\": \"灰色工房\",\n        \"chocolate latte\": \"ショコラテ\",\n        \"chi-ra-rhyzhm\": \"ちらりずむ\",\n        \"osamuya\": \"オサム屋\",\n        \"sleeve\": \"SLeeVe\",\n        \"paranoia cat\": \"PARANOIA CAT\",\n        \"kobuta no yakata\": \"子豚の館\",\n        \"crazy9\": \"Crazy9\",\n        \"essentia\": \"ESSENTIA\",\n        \"redrop\": \"ReDrop\",\n        \"shirando\": \"炽鸾堂\",\n        \"special star week\": \"Special☆Week\",\n        \"n and r\": \"N&R\",\n        \"8chomeno-ohanayasan\": \"8丁目のお花屋さん\",\n        \"kabu fujisawa minato shinsenkan\": \"㈱藤沢みなと新鮮館\",\n        \"uran-factory\": \"URAN-FACTORY\",\n        \"hiyoko no gekijoh\": \"ひよこの劇場\",\n        \"yakiyama line\": \"YAKIYAMA LINE\",\n        \"gallop dyna\": \"ぎゃろっぷだいな\",\n        \"trick and treat\": \"TRICK&TREAT\",\n        \"shirokumaya\": \"しろくま屋\",\n        \"nanairo no neribukuro\": \"七色のねりぶくろ\",\n        \"ucyunekogundan\": \"宇宙猫军团\",\n        \"mokoke\": \"もこ家\",\n        \"p-kan\": \"p-馆\",\n        \"inst\": \"Inst\",\n        \"plum\": \"PLUM\",\n        \"kaze no gotoku\": \"風のごとく!\",\n        \"haitoku sensei\": \"はいとく先生\",\n        \"angyadow\": \"行脚堂\",\n        \"noraneko-no-tama\": \"ノラネコノタマ\",\n        \"hizadati zekkouchou\": \"ひざだち絶好調\",\n        \"sakananekobeya\": \"鱼猫部屋\",\n        \"white drop\": \"ホワイトドロップ\",\n        \"dieselmine\": \"ディーゼルマイン\",\n        \"ojou no yokushitsu\": \"お嬢の浴室\",\n        \"nagiyamasugi\": \"ナギヤマスギ\",\n        \"awatake\": \"あわたけ\",\n        \"gasobook\": \"GASOBooK!!\",\n        \"shiohama workshop\": \"SHIOHAMA WORKSHOP\",\n        \"irotenya\": \"色点屋\",\n        \"watakubi\": \"わたくび\",\n        \"kirikiri\": \"きりきり\",\n        \"kohagura.\": \"こはぐら。\",\n        \"gambler club\": \"ギャンブラー倶楽部\",\n        \"usagi no oyatsu\": \"ぅさぎのぉゃっ\",\n        \"hakke deneijyo\": \"八卦电影城\",\n        \"kuma aji tounyuu.\": \"くま味豆乳。\",\n        \"tamaranchi\": \"たまらんち\",\n        \"lucky chance\": \"Lucky Chance!\",\n        \"chicken chicken machine\": \"チキチキ☆マシーン\",\n        \"ice coffin\": \"ICE COFFIN\",\n        \"teriyaki nikuman\": \"てりやきにくまん\",\n        \"chijoku an\": \"耻辱庵\",\n        \"otajai\": \"オタじゃい\",\n        \"hades\": \"ハーデス\",\n        \"kurawanya\": \"くろわん屋\",\n        \"54burger\": \"54BURGER\",\n        \"yadokugaeru\": \"ヤドクガエル\",\n        \"butagoya\": \"ぶた小屋\",\n        \"momo ego\": \"ももエゴ\",\n        \"wada mountain\": \"和田マウンテン\",\n        \"area14\": \"エリア14\",\n        \"komorikiri.\": \"こもりきり。\",\n        \"circle eden\": \"Circle Eden\",\n        \"fukutsuu okosu\": \"腹痛起こす\",\n        \"aodouhu\": \"青豆腐\",\n        \"team lucky\": \"チーム☆ラッキー\",\n        \"deep rising\": \"DEEP RISING\",\n        \"past gadget\": \"Past Gadget\",\n        \"gekidoku shoujo\": \"剧毒少女\",\n        \"chinjao girl.\": \"チンジャオ娘。\",\n        \"kawaraya honpo\": \"瓦屋本舗\",\n        \"float shippu\": \"フロート湿布\",\n        \"yusaritsukata\": \"ゆうさりつかた\",\n        \"tamago no kara\": \"タマゴノカラ\",\n        \"drow4\": \"Drow4\",\n        \"deastim\": \"であすちーむ\",\n        \"optworks\": \"OPTWORKS\",\n        \"nikujirushi\": \"にくじるし\",\n        \"great canyon\": \"グレートキャニオン\",\n        \"amp\": \"AMP\",\n        \"peanutsland\": \"ピーナッツランド\",\n        \"black fly\": \"BLACK FLY\",\n        \"acid club\": \"ACID CLUB\",\n        \"syunkan saidaihusoku\": \"瞬间最大风速\",\n        \"sakurairo\": \"さくらいろ\",\n        \"yan-yam\": \"Yan-Yam\",\n        \"zuzuzu\": \"ズズズ\",\n        \"pictokun\": \"Pictokun\",\n        \"yo-metdo\": \"妖灭堂\",\n        \"red crown\": \"RED CROWN\",\n        \"f.a\": \"F・A\",\n        \"reverse noise\": \"Reverse Noise\",\n        \"pink\": \"PINK\",\n        \"lemonmaiden\": \"LemonMaiden\",\n        \"manjudou\": \"曼珠堂\",\n        \"asshuku koubou\": \"压缩工房\",\n        \"moreriikusu\": \"モレリークス\",\n        \"magono-tei\": \"まごの亭\",\n        \"pumpernickel\": \"PUMPERNICKEL\",\n        \"rosetta stone\": \"ろぜったすとーん\",\n        \"pigafetta\": \"ぴがふぇった\",\n        \"f taku\": \"F宅\",\n        \"ezokuroten\": \"エゾクロテン\",\n        \"itou life\": \"伊東ライフ\",\n        \"spiral brain\": \"スパイラルブレーン\",\n        \"tuzi laoda\": \"兔子老大\",\n        \"iriomote\": \"IRIOMOTE\",\n        \"kamogawaya\": \"鸭川屋\",\n        \"23.4do\": \"23.4ド\",\n        \"doza village\": \"DOZA Village\",\n        \"p.d.creations\": \"P.D.creations\",\n        \"tear drop\": \"Tear Drop\",\n        \"434notfound\": \"434 Not Found\",\n        \"hikiwari nattou\": \"ひきわり納豆\",\n        \"hirahira\": \"ひらひら\",\n        \"yasakaninomagatama\": \"八坂琼曲玉\",\n        \"kansen shoujo\": \"甘泉少女\",\n        \"yuzuponz\": \"ゆずぽん酢\",\n        \"hamurabi-dou\": \"いちお屋\",\n        \"wasabi\": \"WASABI\",\n        \"abura batake bokujyo.\": \"あぶら畑牧場。\",\n        \"poetto\": \"POETTO\",\n        \"infinity drive\": \"INFINITY DRIVE\",\n        \"warabimochi\": \"ワラビモチー\",\n        \"fusionz\": \"Fusionz\",\n        \"munchengraph\": \"MünchenGraph\",\n        \"okashi tai\": \"おかし隊\",\n        \"morigotatsu\": \"モリゴタツ\",\n        \"funi funi lab\": \"フニフニラボ\",\n        \"nantara kantara\": \"ナンタラカンタラ\",\n        \"juuryoku shiki youheki\": \"重力式拥壁\",\n        \"cannabis\": \"カンナビス\",\n        \"archives\": \"アーカイブ\",\n        \"notone\": \"NOTONE\",\n        \"small marron\": \"Small Marron\",\n        \"palepink\": \"PalePink!\",\n        \"kokatsubatake\": \"こかつ畑\",\n        \"nise-jyuusyofutei\": \"伪住所不定\",\n        \"rpg company 2\": \"RPGカンパニー2\",\n        \"royal bitch\": \"ろいやるびっち\",\n        \"einsatz\": \"Einsatz\",\n        \"majimeya\": \"真面目屋\",\n        \"almarosso\": \"アルマロッソ\",\n        \"jitaku vacation\": \"自宅vacation\",\n        \"avalanche\": \"あばらんち\",\n        \"suzu no oka\": \"鈴の丘\",\n        \"gegera standard\": \"GEGERA STANDARD\",\n        \"studio mizuyokan\": \"スタジオみずよーかん\",\n        \"a ashgrey mix\": \"A AshGrey Mix\",\n        \"m.o seisakujo\": \"M.O制作所\",\n        \"orange bullet\": \"ORANGE BULLET\",\n        \"circle taihei-tengoku\": \"サーカル太平天国\",\n        \"kankituteien\": \"柑橘庭园\",\n        \"orukaniumu haigou a-jou\": \"おるかにうむ配合A錠\",\n        \"star-dreamer tei\": \"星梦亭\",\n        \"hexivision\": \"HEXIVISION\",\n        \"naruho-dou\": \"NARUHO堂\",\n        \"index410\": \"INDEX:410\",\n        \"mzfist\": \"MZの拳\",\n        \"twilight dusk\": \"TWILIGHT DUSK\",\n        \"kamikadou\": \"かみか堂\",\n        \"oboro and tempo gensui dou\": \"胧&天蓬元帅堂\",\n        \"kanden shoujo chuuihou\": \"感电少女注意报\",\n        \"niku ringo\": \"肉りんご\",\n        \"wareme\": \"割れ目\",\n        \"hakuginmokusei\": \"白銀木犀\",\n        \"meshikutteneru.\": \"飯食って寝る。\",\n        \"little hamlet\": \"りとる☆はむれっと\",\n        \"tarehamu\": \"たれハム\",\n        \"black dog\": \"BLACK DOG\",\n        \"shimesaba\": \"しめさば\",\n        \"forestrest\": \"ForestRest\",\n        \"norioikeru\": \"のりおいける!\",\n        \"himawari no tane\": \"ひまわりのたね\",\n        \"jieitai\": \"JIEITAI\",\n        \"honey qp\": \"Honey QP\",\n        \"ayuest\": \"AYUEST\",\n        \"inbou no teikoku\": \"阴谋的帝国\",\n        \"gate of xiii\": \"Gate of XIII\",\n        \"neko masshigura\": \"ねこまっしぐら\",\n        \"rorie-do\": \"ろり絵堂\",\n        \"inumiso\": \"イヌミソ\",\n        \"natsutama\": \"なつたま\",\n        \"wakuwaku doubutsuen\": \"わくわく動物園\",\n        \"shikishima guntool\": \"敷岛赝具\",\n        \"kaname\": \"要\",\n        \"studio vanguard\": \"STUDIO VANGUARD\",\n        \"gerupin\": \"ゲルピン\",\n        \"knockout\": \"KNOCKOUT\",\n        \"atamanurui mix-er\": \"アタマヌルイMIX-eR\",\n        \"mecchori\": \"めっちょり\",\n        \"titokara 2nd branch\": \"千岁乌山第2出张所\",\n        \"fakestar\": \"FAKESTAR\",\n        \"nikomi omurice\": \"煮込みオムライス\",\n        \"inaka no yasaiya\": \"田舎の野菜屋\",\n        \"nacchuushou\": \"夏中症\",\n        \"applesauce\": \"Applesauce\",\n        \"aquadrop\": \"アクアドロップ\",\n        \"ttt\": \"TTT\",\n        \"abyukyo koubou\": \"あびゅうきょ工房\",\n        \"asatsuki dou\": \"朝月堂\",\n        \"serizawa-room\": \"芹泽室\",\n        \"suzuya\": \"凉屋\",\n        \"cradle\": \"Cradle\",\n        \"puffsleeve\": \"Puffsleeve\",\n        \"nitro\": \"NITRO\",\n        \"girls empire\": \"娘。帝國\",\n        \"ameshoo\": \"あめしょー\",\n        \"yumesaki annai kairanban\": \"夢先案内回覧版\",\n        \"aihara hanten\": \"相原饭店\",\n        \"full high kick\": \"ふるはいきっく\",\n        \"punipuni doumei\": \"ぷにぷに同盟\",\n        \"sokomono suisou\": \"底物水槽\",\n        \"shiratamaco\": \"しらたまこ\",\n        \"oreteki18kin\": \"俺的十八禁\",\n        \"dl mate\": \"DLメイト\",\n        \"kaminagi-tei\": \"神凪邸\",\n        \"execio\": \"エクセシオ\",\n        \"seza team\": \"せざちーむ\",\n        \"shihachirou\": \"四八楼\",\n        \"maccha aji\": \"抹茶味\",\n        \"wireframe\": \"WIREFRAME\",\n        \"maho-shinsengumi\": \"魔法新撰组\",\n        \"caramel crunch\": \"CARAMEL CRUNCH!\",\n        \"ncp\": \"NCP\",\n        \"choujikuu yousai kachuusha\": \"超時空要塞カチューシャ\",\n        \"nanmin festival\": \"難民ふぇすてぃばる\",\n        \"ririo gatto\": \"りーりおがーと\",\n        \"activemover\": \"ActiveMover\",\n        \"mizuchirimen\": \"ミズチリメン\",\n        \"happy water\": \"HAPPY WATER\",\n        \"naragyogyo kumiai\": \"なら漁業組合\",\n        \"shichiten battou\": \"七天罚讨\",\n        \"drop dead\": \"DROP DEAD!!\",\n        \"erect touch\": \"ERECT TOUCH\",\n        \"melanchol\": \"メランコル\",\n        \"meisho hanten\": \"めーしょー飯店\",\n        \"rushe museum\": \"Rushe Museum\",\n        \"ame usagi\": \"あめうさぎ\",\n        \"sottilo nero\": \"ソッティーロネーロ\",\n        \"hollowplus\": \"HOLLOWPLUS\",\n        \"iminic\": \"IMINIC\",\n        \"oshaban\": \"オシャバン\",\n        \"diogenes club\": \"ディオゲネスクラブ\",\n        \"puchi village\": \"ぷち★びれっじ\",\n        \"mirrorworld\": \"MirrorWorld\",\n        \"kenkokotsu\": \"KENKOKOTSU\",\n        \"hakujira uminekodan\": \"はくじら海猫団\",\n        \"missing paradise\": \"ミッシングパラダイス\",\n        \"try and hougen futari shakai\": \"TRY&方言二人社会\",\n        \"mute cafe\": \"MUTE Cafe\",\n        \"taishou romanesque\": \"大正ロマネスク\",\n        \"gangontou\": \"巌魂薹\",\n        \"kaokuba\": \"家屋場\",\n        \"yukikagerou\": \"雪陽炎\",\n        \"akumenari\": \"アクメナリ!\",\n        \"hot mikan\": \"ほっとみかん\",\n        \"g-panda\": \"Gぱんだ\",\n        \"high tech pen case\": \"ハイテクペンケース\",\n        \"strawberry milk studio\": \"Strawberry Milk Studio\",\n        \"lolita crusaders\": \"ロリータクルセイダーズ\",\n        \"buaifamu\": \"ぶあいふぁむ\",\n        \"takenoko gohan\": \"筍御饭\",\n        \"shinenkan\": \"新炎馆\",\n        \"studio himawari\": \"スタジオ☆ひまわり\",\n        \"tohgoo\": \"冬宫\",\n        \"makino jimusho\": \"マキノ事務所\",\n        \"turtle.fish.paint\": \"龟鱼派\",\n        \"bear hand\": \"熊掌社\",\n        \"star f\": \"★F\",\n        \"service heaven\": \"サービスヘブン\",\n        \"spiritoso\": \"Spiritoso\",\n        \"kurobinega\": \"クロビネガ\",\n        \"nokishita no nekoya\": \"軒下の猫屋\",\n        \"denmoe\": \"电萌\",\n        \"mocomocodo\": \"もこモコ堂\",\n        \"werk\": \"Werk\",\n        \"nicutoka tabete mitanainaa\": \"肉とか食べてみたいなぁ・・・\",\n        \"gamushara\": \"我武者ら!\",\n        \"sandan\": \"SANDAN\",\n        \"newton no ringo\": \"ニュートンの林檎\",\n        \"kinako no yama\": \"きなこの山\",\n        \"hanamo oukoku\": \"はなも王国\",\n        \"gokiburi teishoku\": \"ゴキブリ定食\",\n        \"yumeyoubi\": \"ゆめようび\",\n        \"studio ren\": \"STUDIO REN\",\n        \"koterabyte\": \"コテラバイト\",\n        \"shiroi kuroi\": \"シロイクロイ\",\n        \"maidoll\": \"MAIDOLL\",\n        \"chromatic room\": \"CHROMATIC ROOM\",\n        \"piyokorota\": \"ぴよころた\",\n        \"d-raw 2\": \"Draw Two\",\n        \"konnyaku nabe\": \"蒟蒻锅\",\n        \"onkin yuugi\": \"音筋游戏\",\n        \"radiostar\": \"RADIOSTAR\",\n        \"jackpot 64\": \"ジャックポット64\",\n        \"panzers\": \"パンツァーズ\",\n        \"kanten jigenryuu\": \"寒天示現流\",\n        \"nazunaya honpo\": \"荠屋本铺\",\n        \"usubeniya\": \"うすべに屋\",\n        \"akusei-shinseibutsu\": \"恶性真性物\",\n        \"night fuckers\": \"夜★FUCKERS\",\n        \"puppukupu\": \"ぷっぷくぷー\",\n        \"sago-jou\": \"沙悟荘\",\n        \"hi-per pinch\": \"ハイパーピンチ\",\n        \"reis room\": \"REI's ROOM\",\n        \"hasemi box\": \"Hasemi box\",\n        \"kaki no tane\": \"夏季のタネ\",\n        \"aruku denpatou no kai\": \"歩く電波塔の会\",\n        \"lolitachannel\": \"LolitaChannel\",\n        \"asakaze no shizuku\": \"朝風の雫\",\n        \"youki m.k.c.\": \"优希M.K.C.\",\n        \"poco natsu\": \"ぽこなつ\",\n        \"hoppe shokudou\": \"ほっぺ食堂\",\n        \"hinemosuan\": \"终日庵\",\n        \"moon ruler\": \"むうんるうらあ\",\n        \"shin hijiridou honpo\": \"真・圣堂☆本铺\",\n        \"toyatei\": \"とやてい\",\n        \"otona shuppan\": \"おとな出版\",\n        \"atsuya kougyou\": \"笃屋工业\",\n        \"bonjin\": \"梵人\",\n        \"mimipull\": \"MIMIPULL\",\n        \"rojiura manhole\": \"ロジウラマンホール\",\n        \"uribatakebokujou\": \"うり畑牧場\",\n        \"zenra yashiki\": \"全裸屋敷\",\n        \"beniiro kaitenkikou\": \"红色回转机构\",\n        \"gff\": \"GFF\",\n        \"waffle doumeiken\": \"ワッフル同盟犬\",\n        \"raid slash\": \"RAID SLASH\",\n        \"colomonyu\": \"ころもにゅ\",\n        \"umidori\": \"うみどり\",\n        \"l-gauge sha\": \"Lゲージ社\",\n        \"kodomo ginkou\": \"こどもぎんこう\",\n        \"kowareta radio\": \"コワレ田ラジ男\",\n        \"hatakewotagayasudake\": \"畑を耕すだけ\",\n        \"kuro no omikuji\": \"黒ノ御神籤\",\n        \"hakuchou no ouji\": \"白鳥の王子\",\n        \"kinokotei\": \"きのこ亭\",\n        \"kinokodomo\": \"きのこども\",\n        \"kohakutei\": \"琥珀亭\",\n        \"izanagi\": \"いざなぎ\",\n        \"inuteikoku\": \"犬帝国\",\n        \"yamamoto\": \"山本同人\",\n        \"private garden\": \"Private Garden\",\n        \"gs studio\": \"G's studio\",\n        \"axz\": \"AXZ\",\n        \"chagashi saiban\": \"茶菓子裁判\",\n        \"chesha neko no yakata\": \"チェシャ猫の館\",\n        \"shokuan\": \"触安\",\n        \"aomizuan\": \"青水庵\",\n        \"royal mountain\": \"ロイヤルマウンテン\",\n        \"radical dream\": \"Radical Dream\",\n        \"hellabunna\": \"へらぶな\",\n        \"zakkin kougyou\": \"杂菌工业\",\n        \"metaneko\": \"メタネコ\",\n        \"midsummer madness\": \"MIDSUMMER MADNESS\",\n        \"ebibinbintei\": \"えびびんびん亭\",\n        \"katamari-ya\": \"かたまり屋\",\n        \"amenosorashido\": \"あめのそらしど\",\n        \"o-mars\": \"O-Mars\",\n        \"moonphase\": \"MoonPhase\",\n        \"open book\": \"OPEN BOOK\",\n        \"kodomo beer\": \"こどもびーる\",\n        \"dramatic sharp\": \"Dramatic#\",\n        \"rtd\": \"RTD\",\n        \"hacchake yarou a team\": \"はっちゃけ野郎Aチーム\",\n        \"dieppe factory darkside\": \"DIEPPE FACTORY Darkside\",\n        \"booblian\": \"Booblian\",\n        \"korokoro udon\": \"コロコロうどん\",\n        \"ende der welt\": \"Ende der Welt\",\n        \"aeba no mori\": \"喘葉の森\",\n        \"hakka ame\": \"薄荷饴\",\n        \"kinengusa\": \"禁烟草\",\n        \"shinkai kissa\": \"深海喫茶\",\n        \"megane shoujo\": \"メガネ少女\",\n        \"extended part\": \"拡張パーツ\",\n        \"you you you\": \"YOU!YOU!YOU!\",\n        \"yuubin basha\": \"邮便马车\",\n        \"m.macabre\": \"M.MACABRE\",\n        \"ohkura bekkan\": \"大藏别馆\",\n        \"the dungeon in yarn\": \"The Dungeon In Yarn\",\n        \"white datura\": \"White Datura\",\n        \"hanekaze\": \"HANEKAZE\",\n        \"stardust cradle\": \"すたーだすとくれいどる\",\n        \"unagiyasan\": \"うなぎやさん\",\n        \"hana zakuro\": \"花柘榴\",\n        \"smith koumuten\": \"スミス工務店\",\n        \"tiny feather\": \"Tiny Feather\",\n        \"low thrust\": \"ロウスラスト\",\n        \"yashiya\": \"やし屋\",\n        \"enhance heart\": \"EnHANCE HEART\",\n        \"slice slime\": \"slice slime\",\n        \"fountains square\": \"Fountain's Square\",\n        \"kodoku intelligence\": \"孤独intelligence\",\n        \"comet\": \"かみっと\",\n        \"bicolor\": \"Bicolor\",\n        \"deans pro office\": \"帝恩PRO事务所\",\n        \"mizutaniya\": \"水谷屋\",\n        \"arysuivery\": \"ありぃすいべりぃ\",\n        \"nekojarasare\": \"猫じゃらされ\",\n        \"puchiota rakugaki\": \"ぷちオタ落描き\",\n        \"activa\": \"ACTIVA\",\n        \"atsuatsu muchimuchi\": \"アツアツムチムチ\",\n        \"kuro lili no heya\": \"黒りりの部屋\",\n        \"rip at lip\": \"Rip@Lip\",\n        \"marinesapphire\": \"海苍玉\",\n        \"liche\": \"Liche\",\n        \"seven deadly sins\": \"Seven deadly sins\",\n        \"mikan dou\": \"みかん堂\",\n        \"kotonosha\": \"琴乃舎\",\n        \"yume-zakura\": \"ゆめざくら\",\n        \"micro house\": \"みくろハウス\",\n        \"rapidrabbit\": \"RapidRabbit\",\n        \"melt soft\": \"めるとソフト\",\n        \"asahiage\": \"あさひあげ\",\n        \"muchakai\": \"梦茶会\",\n        \"gechunchi\": \"ゲッチュんち\",\n        \"seventh heaven maxion\": \"セブンスヘブンMAXION\",\n        \"caramel macchiato\": \"Caramel Macchiato\",\n        \"dokudoku meron\": \"どくどくめろん\",\n        \"buwu 26 celsius\": \"部屋26℃\",\n        \"htsk\": \"HTSK\",\n        \"eucalyptus house\": \"ユーカリハウス\",\n        \"akiba maou\": \"秋叶魔王\",\n        \"nagiya honpo\": \"なぎや本舗\",\n        \"lu yan suo\": \"炉研所\",\n        \"nippon h manga kyoukai\": \"日本H漫画协会\",\n        \"urakata honpo\": \"里方本铺\",\n        \"ando six gates\": \"Ando Six Gates\",\n        \"tamagou\": \"多摩豪\",\n        \"haruharutei\": \"春叶流亭\",\n        \"nizyuugokuhiya\": \"二十极秘屋\",\n        \"pokachutei\": \"ぽかちゅ亭\",\n        \"w.label\": \"W.label\",\n        \"mutekei-fire\": \"むてけいファイヤー\",\n        \"qp flapper\": \"QP:flapper\",\n        \"momo no tsubomi\": \"モモのつぼみ\",\n        \"zenra restaurant\": \"全裸レストラン\",\n        \"kabushikigaisha toranoana\": \"株式会社虎の穴\",\n        \"lezmoe\": \"レズ萌え!\",\n        \"yuriru-rarika\": \"ユリルラリカ\",\n        \"kuroquis\": \"クロッキー!!\",\n        \"tmzf no circle\": \"TMZFのサークル\",\n        \"miniature magic\": \"みにちゅあまじっく\",\n        \"tinker bell\": \"てぃんかーべる\",\n        \"just-k\": \"JUST-K\",\n        \"justice-flame\": \"JUSTICE-FLAME\",\n        \"yakumi benishouga\": \"药味红生姜\",\n        \"nekonokone\": \"ねこのこね\",\n        \"hiroshikidou\": \"宏式堂\",\n        \"shiftalton\": \"ShiftAltOn\",\n        \"masamune kokichi\": \"マサムネコキチ\",\n        \"redlight\": \"REDLIGHT\",\n        \"komachiya\": \"小町屋\",\n        \"cu-little2\": \"Cu-little2\",\n        \"furaipan daimaou\": \"ふらいぱん大魔王\",\n        \"wicked heart\": \"WICKED HEART\",\n        \"peach candy\": \"Peach Candy\",\n        \"live house\": \"LIVE HOUSE\",\n        \"sujoyu and co.\": \"酢醤油&Co.\",\n        \"dksha\": \"DKsha\",\n        \"re barna\": \"re:barna\",\n        \"furanokumarin\": \"ふらのくまりん\",\n        \"rm-rf-\": \"RM-RF-*\",\n        \"yakumi sarai\": \"薬味さらい\",\n        \"assemblink\": \"アセンブリンク\",\n        \"yorando\": \"洋兰堂\",\n        \"fdsp\": \"FDSP\",\n        \"nyankone\": \"にゃんこね\",\n        \"handsome aniki\": \"ハンサム兄貴\",\n        \"grenade\": \"ぐれねーど\",\n        \"vivid thunder\": \"びびっどサンダー\",\n        \"ryu-seki-do\": \"流石堂\",\n        \"hiyotama goten\": \"ひよたま御殿\",\n        \"seqmed\": \"SEQMED\",\n        \"ichinichi sanjou\": \"一日三锭\",\n        \"kesshoku mikan\": \"血色蜜柑\",\n        \"kakkuu mogura\": \"滑空モグラ\",\n        \"ties\": \"TIES\",\n        \"public bath\": \"Public bath\",\n        \"nagai hamu\": \"長井ハム\",\n        \"maltese\": \"まるちぃず\",\n        \"goromenz\": \"ゴロメンツ\",\n        \"stemun\": \"すてむん\",\n        \"rosapersica\": \"Rosapersica\",\n        \"kudoki dancer\": \"くどきダンサー\",\n        \"athome shuka\": \"アットホーム酒家\",\n        \"111 touban\": \"111当番\",\n        \"iro wa nioe do\": \"色は匂えど\",\n        \"joudan janai yo\": \"冗談じゃないよっっ!\",\n        \"poyopacho\": \"ぽよぱちょ\",\n        \"guilty hearts\": \"GUILTY HEARTS\",\n        \"ortensia\": \"おるてんしあ\",\n        \"expot\": \"EXPOT\",\n        \"shouchuu mac\": \"烧酎MAC\",\n        \"golden zombie\": \"金珠狼\",\n        \"melty pot\": \"Melty Pot\",\n        \"airbox\": \"AIR BOX\",\n        \"suwateria\": \"すわてりあ\",\n        \"ichigosize\": \"いちごさいず\",\n        \"bakutaso switch\": \"爆タソスイッチ\",\n        \"miyuuhodoh\": \"美游穗堂\",\n        \"7cm\": \"7センチ\",\n        \"nisemididoronokai\": \"偽MIDI泥の会\",\n        \"veronica no ha\": \"ヴェロニカの歯\",\n        \"jet-black baselarde\": \"漆黒のバゼラード\",\n        \"juicebox koujou\": \"ジュースボックス工場\",\n        \"yukinohana\": \"ユキノハナ\",\n        \"sa ku\": \"sa_ku\",\n        \"rurunoya\": \"るるノ屋\",\n        \"all delete\": \"ALL DELETE\",\n        \"sigma-arts\": \"Σ-Arts\",\n        \"fanatic fetish\": \"Fanatic Fetish\",\n        \"count2.4\": \"Count2.4\",\n        \"lily\": \"Lily\",\n        \"studio empty\": \"Studio Empty\",\n        \"fuurainin\": \"风来人\",\n        \"dasshifunnyuu\": \"脱脂粉乳\",\n        \"hidamari hwy\": \"ひだまりHWY\",\n        \"insert\": \"INSERT\",\n        \"mbl\": \"MBL\",\n        \"french letter\": \"French letter\",\n        \"sweettaboo\": \"SWEETTABOO\",\n        \"mikezoutei\": \"三毛藏亭\",\n        \"kochou no yume\": \"胡蝶夢\",\n        \"hanekura ginma\": \"羽倉ぎんま\",\n        \"suzunone strike\": \"スズノネストライク\",\n        \"bloody okojo\": \"Bloody Okojo\",\n        \"sunset beach\": \"サンセットビーチ\",\n        \"alicecreation\": \"AliceCreation\",\n        \"shirokurousa\": \"しろくろうさ\",\n        \"rehabilitation\": \"リハビリテーション\",\n        \"fools art gallery\": \"FOOL's ART GALLERY\",\n        \"galaxist\": \"GALAXIST\",\n        \"setoran\": \"せとらん\",\n        \"global one\": \"グローバルワン\",\n        \"sagittarius\": \"サジタリアス\",\n        \"rolling star\": \"ローリングスター\",\n        \"milk pudding\": \"MILK PUDDING\",\n        \"circle are\": \"サークルARE\",\n        \"kazan no you\": \"火山の楊\",\n        \"hard chrome\": \"ハードクローム\",\n        \"pochi-goya.\": \"ぽち小屋。\",\n        \"hikawado\": \"火川堂\",\n        \"mof-mof\": \"mof-mof\",\n        \"aneko no techo\": \"あねこの手帖\",\n        \"circle heron\": \"サークルヘロン\",\n        \"youkai tamanokoshi\": \"ようかい玉の輿\",\n        \"waffle sand\": \"わっふるさんど\",\n        \"monotrust\": \"モノトラスト\",\n        \"fuwamoko honpo\": \"ふわもこ本舗\",\n        \"i-raf-you\": \"I-Raf-you\",\n        \"urahyakkiyakou\": \"里百鬼夜行\",\n        \"boundary of dream\": \"夢の境界\",\n        \"innocent chapel\": \"INNOCENT CHAPEL\",\n        \"studio fow\": \"Studio-FOW\",\n        \"happouvijin\": \"八方微人\",\n        \"squeeze\": \"SQUEEZE!!\",\n        \"squeeze candy heaven\": \"squeezecandyheaven\",\n        \"polinky hiroba\": \"ポリンキー広場\",\n        \"v-slash\": \"V-SLASH\",\n        \"tanima club\": \"谷间俱乐部\",\n        \"paper hearts\": \"PAPER HEARTS\",\n        \"gekikara koushinryou\": \"激辛香辛料\",\n        \"pha-la-dogs\": \"ぱらどっくす。\",\n        \"yojouhan shobou\": \"四叠半书房\",\n        \"maron maron\": \"まろん☆まろん\",\n        \"yukijirushi nyuugyou\": \"逝印乳业\",\n        \"suimitsutou koubou\": \"水密桃工房\",\n        \"netekuras\": \"ネテクラス\",\n        \"hachimitsu syoujo\": \"蜂蜜少女\",\n        \"miyako dokei\": \"みやこ時計\",\n        \"air pocket\": \"Air Pocket\",\n        \"teitetsu kishidan\": \"蹄铁骑士团\",\n        \"yowamidori\": \"よわみどり\",\n        \"koi tenshi doumei\": \"恋☆天使同盟\",\n        \"ayamaji nuji\": \"誤じ脱ぢ\",\n        \"p.d chump\": \"P.D Chump\",\n        \"naya\": \"纳屋\",\n        \"depression\": \"でぱれーしょん\",\n        \"yanasegawabeya\": \"柳瀬川部屋\",\n        \"ponkotsu works\": \"ぽんこつわーくす\",\n        \"amezaiku\": \"雨细工\",\n        \"niboshi\": \"煮干\",\n        \"niboniboshi\": \"にぼ煮干\",\n        \"daisuki beachkun\": \"大好き!!ビーチクン\",\n        \"mirake\": \"MiraKE\",\n        \"yodakapan\": \"ヨダカパン\",\n        \"mimoneland\": \"ミモネランド\",\n        \"doronko yuuyake\": \"どろんこ夕焼\",\n        \"panic room\": \"パニックルーム!\",\n        \"studio aruta\": \"スタジオあるた\",\n        \"haruharudo\": \"はるはる堂\",\n        \"tamanokoshi\": \"たまのこし\",\n        \"minamihamaya\": \"南浜屋\",\n        \"lolipop complete\": \"ロリポップ コンプリート\",\n        \"studio wallaby\": \"スタジオ・ワラビー\",\n        \"castlism\": \"Castlism\",\n        \"mtsp\": \"MTSP\",\n        \"bijutsubu\": \"美术部\",\n        \"yowatari kouba\": \"よわたり工場\",\n        \"staccato squirrel\": \"Staccato・Squirrel\",\n        \"sakuradou\": \"樱堂\",\n        \"candy club\": \"Candy Club\",\n        \"apple amza\": \"APPLE Amza\",\n        \"rorinoutage\": \"ロリの宴\",\n        \"comex\": \"COMEX\",\n        \"marimo-ya\": \"まりも屋\",\n        \"moonglow\": \"MoonGlow\",\n        \"aikanheiwa.\": \"愛館平和。\",\n        \"yokoshimaya\": \"邪屋。\",\n        \"seiryoukei inryousui\": \"清涼系飲料水\",\n        \"mugenkidou a\": \"无限轨道A\",\n        \"penetrate\": \"Penetrate\",\n        \"astral\": \"Astral\",\n        \"choki no kamisama\": \"チョキの神さま\",\n        \"wanwandoh\": \"わんわん堂\",\n        \"f slash t\": \"F/T\",\n        \"kenja time\": \"けんじゃたいむ\",\n        \"turuvege.\": \"つるべじ。\",\n        \"seven colors drop\": \"なないろどろっぷ\",\n        \"foundation slash 1\": \"Foundation／1\",\n        \"happy birthday\": \"Happy Birthday\",\n        \"initial-g\": \"イニシャルG\",\n        \"j.o.n.g.\": \"ジョング\",\n        \"hitomishiri\": \"ひとみしり\",\n        \"mieow\": \"Mieow\",\n        \"kariya\": \"刈屋\",\n        \"kichiku koubou\": \"鬼畜工房\",\n        \"zettai shoujo\": \"绝对少女\",\n        \"circle roman hikou\": \"サークル浪漫飛行\",\n        \"asstaro-san\": \"アスタローサン\",\n        \"kurowasabi\": \"くろわさび\",\n        \"kabayakiya\": \"蒲烧屋\",\n        \"datenshi no ana\": \"墮天使の坑\",\n        \"mix fry\": \"みっくすふらい\",\n        \"kokonokaya\": \"九日屋\",\n        \"orangemaru\": \"OrangeMaru\",\n        \"ishikawa pro\": \"石川プロ\",\n        \"neyukidou\": \"根雪堂\",\n        \"o.n art works\": \"O.N Art Works\",\n        \"an-arc\": \"アンアーク\",\n        \"anmichu dou\": \"あんみちゅ堂\",\n        \"melodeathweep\": \"めろですうぃーぷ\",\n        \"absolute\": \"Absolute\",\n        \"mizone doubutsuen\": \"みぞね動物園\",\n        \"studio honeyblade\": \"STUDIO HONEYBLADE\",\n        \"furukadou\": \"古ヶ堂\",\n        \"dam koubou\": \"だむ工房\",\n        \"heart of green\": \"はーとおぶぐりーん\",\n        \"dogyear\": \"DOGYEAR\",\n        \"kagiyama baking co ltd\": \"鍵山製パン株式会社\",\n        \"shittoden\": \"嫉妬殿\",\n        \"sea-s\": \"SEA-S\",\n        \"stray hermit\": \"ストレイハーミット\",\n        \"fox grave\": \"FOX GRAVE\",\n        \"muoto lab\": \"むおとラボ\",\n        \"momoiro kageboushi\": \"桜色影法師\",\n        \"sennen teikoku\": \"千年帝国\",\n        \"tataraba\": \"たたらば\",\n        \"koniro club\": \"紺色くらぶ\",\n        \"west one\": \"WEST ONE\",\n        \"kotsu\": \"KOTSU\",\n        \"suzume nest\": \"すずめねすと\",\n        \"slash\": \"SLASH\",\n        \"yukimi biyori\": \"雪见日和\",\n        \"hinata to keidai to ennichi\": \"ひなたと境内と縁日\",\n        \"matsuri gensou\": \"祭り幻想\",\n        \"homuraya\": \"ほむら屋★プレアデス\",\n        \"heavy bunny addiction\": \"H.B.A\",\n        \"mata ashita.\": \"また明日。\",\n        \"muses garden\": \"MUSES GARDEN\",\n        \"nekomataya\": \"猫又屋\",\n        \"oving\": \"OVing\",\n        \"ditama kikaku\": \"ぢたま企画\",\n        \"crespirit\": \"CreSpirit\",\n        \"modae tei\": \"闷亭\",\n        \"oyama dennou giken\": \"小山电脑技研\",\n        \"lux soft\": \"ルクスソフト\",\n        \"gunsryu\": \"GUNsRYU\",\n        \"happy core\": \"HAPPY CORE\",\n        \"dai-kotetsu dan\": \"ダイコテツ団\",\n        \"tora machine\": \"虎マシーン\",\n        \"z.a.p.\": \"Z.A.P.\",\n        \"aozora shoujo\": \"青空少女\",\n        \"morimi-ya\": \"森见屋\",\n        \"upa24\": \"UPA24\",\n        \"twilight road\": \"Twilight Road\",\n        \"nine four air\": \"Nine Four Air\",\n        \"yogurt prince\": \"ヨーグルトプリンス\",\n        \"ukkaridou\": \"うっかり堂\",\n        \"sawwei005\": \"Sawwei005\",\n        \"fujiya honten\": \"藤屋本店\",\n        \"nijigen shoujo\": \"虹元少女\",\n        \"muskel bild\": \"Muskel☆Bild\",\n        \"takebouzu\": \"竹坊主\",\n        \"egyptsobaya\": \"エジプトそば屋\",\n        \"dm-fc\": \"DM-FC\",\n        \"awareness\": \"Awareness\",\n        \"peromex\": \"ぺろめっくす\",\n        \"jouji mujoh\": \"常时无常\",\n        \"shinjugai\": \"真珠贝\",\n        \"sui-sui-laboratory\": \"萃酔研究所\",\n        \"ashita ganbaru.\": \"明日がんばる。\",\n        \"kidoya\": \"きどや\",\n        \"chimichanga\": \"ちみチャンガ\",\n        \"fukinshin\": \"布巾心\",\n        \"cleari tei\": \"くれり亭\",\n        \"ash wing\": \"Ash Wing\",\n        \"kousyoudou\": \"咬伤堂\",\n        \"leimkissa\": \"LeimkissA\",\n        \"paschara-mode\": \"ぱっきゃらもーど\",\n        \"e61 geinou pro\": \"E61芸能プロ\",\n        \"nijiiro zakura\": \"にじいろ桜\",\n        \"tri-moon\": \"TRI-MOON!\",\n        \"algolagnia\": \"アルゴラグニア\",\n        \"arestica\": \"ARESTICA\",\n        \"hapoi-dokoro\": \"はぽい処\",\n        \"route1\": \"ROUTE1\",\n        \"chural-an\": \"ちゅらる庵\",\n        \"monaka udon\": \"もなかうどん\",\n        \"kingyo origin\": \"金魚オリジン\",\n        \"yudokuya\": \"友毒屋\",\n        \"sandworks\": \"SANDWORKS\",\n        \"sorairokibun\": \"空色気分\",\n        \"stella\": \"Stella\",\n        \"yuunagi gaibutai\": \"夕凪外部隊\",\n        \"lionoil\": \"らいおんおいる\",\n        \"arekusa thunder\": \"アレクササンダー\",\n        \"seaside\": \"SEA SIDE\",\n        \"sakyuya\": \"砂丘屋\",\n        \"ph-bu\": \"PH部\",\n        \"kyurettokyuretto\": \"^^\",\n        \"panda cotta\": \"Panda Cotta\",\n        \"tsujimo ga machi ni yattekita\": \"つじもが町に殺ってきた!!!\",\n        \"bindume syojo.\": \"瓶诘少女。\",\n        \"pinsize inc.\": \"PINSIZE Inc.\",\n        \"hakka-ya\": \"薄荷屋\",\n        \"akai shougeki\": \"緋い笑撃\",\n        \"goma saba\": \"ごまさば\",\n        \"binkan de nani ga warui\": \"びんかんでなにがわるい\",\n        \"minagi zakura\": \"みなぎざくら\",\n        \"root 12-hedron\": \"ルート十二面体\",\n        \"gunjyou zensen\": \"群青前线\",\n        \"yanagiba dai\": \"柳叶台\",\n        \"wasanbon\": \"わさんぼん\",\n        \"pk gristle\": \"PKグリッスル\",\n        \"rintoneko\": \"りんとねこ\",\n        \"seiitsukyou\": \"性一教\",\n        \"canvas\": \"カンバス\",\n        \"weee\": \"Weee\",\n        \"ichigo pants\": \"いちごぱんつ\",\n        \"uramonoya\": \"うらもの屋\",\n        \"yukinkousagi\": \"ゆきんこうさぎ\",\n        \"swat\": \"SwaT\",\n        \"sandai yokkyuu\": \"さんだいよっきゅう\",\n        \"ameya.\": \"饴屋。\",\n        \"yumemiru shiro\": \"ゆめみる白\",\n        \"peach garden\": \"桃【Peach Garden】园\",\n        \"rubi-sama wo agameru kai\": \"るび様を崇める会\",\n        \"akikaze asparagus\": \"秋風アスパラガス\",\n        \"ranpakudou\": \"卵白堂\",\n        \"decoppachi\": \"DECOッパチ\",\n        \"z-vector\": \"Z-VECTOR\",\n        \"himeshibori\": \"ヒメシボリ\",\n        \"milkybox\": \"MilkyBox\",\n        \"sushipuri\": \"スシプリ\",\n        \"ruman-dou\": \"るまん堂\",\n        \"kaientai\": \"絵援隊\",\n        \"atugi de 5\": \"厚木で5時\",\n        \"sol-fa-soft\": \"sol-fa-soft\",\n        \"right away\": \"Right away\",\n        \"pianiishimo\": \"ピアニッシモ\",\n        \"ijimaya\": \"イジマヤ\",\n        \"inariya\": \"稻荷屋\",\n        \"triple head\": \"とりぷるへっど\",\n        \"tamaya\": \"珠屋\",\n        \"nigatsu umare\": \"二月生まれ\",\n        \"ninja yashiki\": \"忍者屋敷\",\n        \"nekoshin\": \"NEKOSHIN\",\n        \"momo9\": \"ももきゅー\",\n        \"hidebou house\": \"ヒデボウハウス\",\n        \"kawazoko\": \"KAWAZOKO\",\n        \"sexual khorosho\": \"セクシャルハラショー\",\n        \"urayoroduya\": \"里万屋\",\n        \"lost rarities\": \"LOST RARITIES\",\n        \"gesshoku\": \"月蚀\",\n        \"misuterutein\": \"みすてるていん\",\n        \"namacyoko\": \"生チョコ\",\n        \"payanikov\": \"ぱやニコフ\",\n        \"3dt\": \"3DT\",\n        \"extreme ponkotsu\": \"エクストリームポンコツ\",\n        \"gorilla bouzu\": \"ゴリラ坊主\",\n        \"mutant\": \"Mutant\",\n        \"junginboshi\": \"纯银星\",\n        \"h2o aquarium\": \"H2O Aquarium\",\n        \"kurousagi project\": \"黒兎プロジェクト\",\n        \"kekemotsu\": \"ケケモツ\",\n        \"yom shoten\": \"よむ書店\",\n        \"tsukemayuge\": \"つけまゆげ\",\n        \"omochi\": \"おもち\",\n        \"horsetail\": \"ほーすている\",\n        \"nukesaku\": \"拔作\",\n        \"ichi-kan\": \"いちかん。\",\n        \"karashi mentaiko\": \"からしめんたい子\",\n        \"nextpreview\": \"NextPreview\",\n        \"saga planets\": \"Saga Planets\",\n        \"banana koubou\": \"ばな奈工房\",\n        \"mujitan\": \"むじたん\",\n        \"aka no hana\": \"赤のハナ\",\n        \"caustica\": \"コースティカ\",\n        \"denen shoujo\": \"田园少女\",\n        \"dressing plus party\": \"Dressing+Party\",\n        \"butakoma 300g\": \"ぶたコマ300g\",\n        \"white lily\": \"White Lily\",\n        \"oeuvre bijutsukan\": \"ウーブル美術館\",\n        \"kyoumen aquarium\": \"鏡面アクアリウム\",\n        \"mamemaru shoten\": \"豆丸书店\",\n        \"joibo no juunin\": \"ジョイボの住人\",\n        \"metagraft\": \"MetaGraft\",\n        \"festa.\": \"ふぇすた。\",\n        \"slash yen\": \"/￥\",\n        \"pastas estab\": \"PASTA'S ESTAB\",\n        \"rinjuu circus\": \"临终马戏团\",\n        \"ue ni aru mikan\": \"うえにあるみかん\",\n        \"ruu kikaku\": \"龙企画\",\n        \"hoshizora sutekki\": \"星空ステッキ\",\n        \"come through\": \"Come Through\",\n        \"wancho-ke\": \"わんちょ家\",\n        \"kajishima onsen\": \"梶岛温泉\",\n        \"kuroneko-kan\": \"クロネコ缶\",\n        \"cook milk\": \"くっくみるく\",\n        \"kudamono monogatari\": \"果物物语\",\n        \"romance no neko ookami musume\": \"ろまんすの猫狼娘\",\n        \"nanairo otogizoushi\": \"七色御伽草子\",\n        \"buruman\": \"BURUMAN\",\n        \"nyaito senyou\": \"にゃいと専用\",\n        \"pinata party\": \"ぴにゃたぱ～てぃ\",\n        \"hatena-box\": \"HATENA-BOX\",\n        \"black smile\": \"BLACK SMILE\",\n        \"ph\": \"PH\",\n        \"aane\": \"あーね\",\n        \"tsuki no uragawa\": \"ツキノウラガワ\",\n        \"manekineko\": \"まねきねこ\",\n        \"mayoriyo\": \"MayoRiyo\",\n        \"moe shoujo ryouiki\": \"萌少女领域\",\n        \"sakakiya\": \"榊屋\",\n        \"unstoppable plus\": \"Unstoppable+\",\n        \"the nation of head scissors\": \"The Nation of Head Scissors\",\n        \"airy socks\": \"エアリーソックス\",\n        \"sheepfold\": \"羊小屋\",\n        \"aroma gaeru\": \"あろまガエル\",\n        \"arion canvas\": \"Arion Canvas\",\n        \"a color summoner\": \"アカラサマナ\",\n        \"marimo\": \"MARIMO\",\n        \"alem-gakan\": \"アレム画館\",\n        \"re.lay\": \"莉零\",\n        \"milk force\": \"ミルクフォース\",\n        \"kuureishiki zunou\": \"空冷式头脑\",\n        \"matsurija\": \"祭社\",\n        \"asgo\": \"ASGO\",\n        \"yobigakka\": \"预备学科\",\n        \"locker room\": \"LockerRoom\",\n        \"pettan doujou\": \"ペッタン道場\",\n        \"art book chipika\": \"Art Book Chipika\",\n        \"alemateorema\": \"アレマテオレマ\",\n        \"otokojuku\": \"おとこじゅく\",\n        \"kitsune-goya\": \"きつね小屋\",\n        \"kuroni\": \"クロニ\",\n        \"seventh engine\": \"せぶんすえんじん\",\n        \"n-cyak-m-mu-\": \"んーちゃかむーむー\",\n        \"purple salamander\": \"パープルサラマンダー\",\n        \"yume yori suteki na\": \"夢よりすてきな\",\n        \"alice no takarabako\": \"ありすの宝箱\",\n        \"akumu no takuhaibin\": \"Nightmare Express-悪夢の宅配便-\",\n        \"san se fang\": \"三色坊\",\n        \"uninigumi\": \"うにに組\",\n        \"otomekibun\": \"乙女気分\",\n        \"gasshuukoku netamekoru\": \"合众国ネタメコル\",\n        \"shallot coco\": \"シャルロット・ココ\",\n        \"orange restaurant\": \"オレンジレストラン\",\n        \"astro creep\": \"ASTRO CREEP\",\n        \"gin no hoshitei\": \"銀の星亭\",\n        \"yorokobi no kuni\": \"ヨロコビの国\",\n        \"babel\": \"BABEL\",\n        \"o-g-g\": \"O・G・G\",\n        \"ikebukuro dpc\": \"池袋DPC\",\n        \"ningyou gishou\": \"人形技厂\",\n        \"saiga dou\": \"SAIGA堂\",\n        \"k-drive\": \"K-Drive\",\n        \"larchange\": \"L'ARCHANGE\",\n        \"nyuu koubou\": \"にゅう工房\",\n        \"freehand tamashii\": \"フリーハンド魂\",\n        \"tabuchi-san chi\": \"たぶちさんち\",\n        \"2d creative\": \"2Dクリエイティブ\",\n        \"higuma-ya\": \"ひぐま屋\",\n        \"clearmana plum\": \"クリアマナ・プラム\",\n        \"hanjuku iriko dashi\": \"半熟いりこ出汁\",\n        \"pururun estate\": \"プルルンエステ\",\n        \"heatwave\": \"HEATWAVE\",\n        \"nerco\": \"NERCO\",\n        \"zensuu hakai kensa\": \"全数破坏检査\",\n        \"ng010\": \"NG010\",\n        \"silver meteor\": \"SILVER METEOR\",\n        \"houmitsudou\": \"方密堂\",\n        \"tennenseki\": \"天然石\",\n        \"artienne\": \"アルティエーヌ\",\n        \"under the honey shine\": \"Under The Honey Shine\",\n        \"infinity-force\": \"INFINITY-FORCE\",\n        \"akane makes revolution\": \"A・M・R\",\n        \"gujira 4 gou\": \"ぐじら4号\",\n        \"shimapan\": \"しまぱん\",\n        \"candy paddle\": \"candy paddle\",\n        \"daihonei\": \"大本营\",\n        \"condiment moderately\": \"コンディメントは8分目\",\n        \"digital accel works\": \"Digital Accel Works\",\n        \"masaoyan\": \"まさお屋ン\",\n        \"skirthike\": \"Skirthike\",\n        \"mitarashi dango\": \"みたらし団GO\",\n        \"cartagra\": \"骨牌仓\",\n        \"fomalhaut\": \"FOMALHAUT\",\n        \"ring castle\": \"Ring Castle\",\n        \"takatakaya\": \"たか々屋\",\n        \"unagigoya\": \"うなぎ小屋\",\n        \"celtrance\": \"CELTRANCE\",\n        \"amazoness\": \"アマゾネス\",\n        \"hitotsukami\": \"ヒトツカミ\",\n        \"kossorikakuredokoro\": \"こっそり隠れ処\",\n        \"sweet milk shake\": \"すいーとみるくしぇいく\",\n        \"jabarand\": \"ジャバランド\",\n        \"kuromutu\": \"くろむつ\",\n        \"hoyoyodou\": \"ほよよ堂\",\n        \"wlho\": \"WLHO\",\n        \"mamiretei\": \"まみれ亭\",\n        \"osouzaiya-san\": \"お総菜屋さん\",\n        \"gensuifu\": \"幻醉腐\",\n        \"zooya\": \"ZOOYA!\",\n        \"nanashi no rakugakijo\": \"名無しの落書き所\",\n        \"m-ya\": \"M屋\",\n        \"blue bean\": \"ぶるーびーん\",\n        \"dr.vermilion\": \"Dr.VERMILION\",\n        \"kinqhassin\": \"紧急发进\",\n        \"yagisaki ginza\": \"八木崎银座\",\n        \"p.l.t.works\": \"P.L.T.works\",\n        \"galaxy monooki\": \"ギャラクシー物置\",\n        \"arikawadou\": \"有川堂\",\n        \"akatsuki souken\": \"晓创圈\",\n        \"ikaring\": \"乌贼轮\",\n        \"marvelous grace\": \"Marvelous Grace\",\n        \"muchi muchi seven\": \"ムチムチ7\",\n        \"yuruyuru gts\": \"ゆるゆるGTS\",\n        \"dangerous thoughts\": \"DANGEROUS THOUGHTS\",\n        \"itaba tatamiten\": \"板场叠店\",\n        \"pinvise\": \"pinvise\",\n        \"cobanzame\": \"こばんざめ\",\n        \"p shoukai\": \"P商会\",\n        \"indexacg\": \"IndexACG\",\n        \"yuriai kojinshi kai\": \"悠理爱个人志会\",\n        \"lachenalia\": \"Lachenalia\",\n        \"apricot plus\": \"apricot+\",\n        \"studio huan\": \"STUDIOふあん\",\n        \"machi no onikuya-san\": \"まちのおにくやさん\",\n        \"mnst\": \"MNST\",\n        \"aohige kaizokudan\": \"青髯海贼团\",\n        \"sanbyaku rokujuu do\": \"-三百六十度-\",\n        \"armadillo\": \"Armadillo\",\n        \"spec.c\": \"spec.C\",\n        \"dragon kitchen\": \"Dragon Kitchen\",\n        \"shirukke no ooi zakuro\": \"汁っけの多い柘榴\",\n        \"chocolate cube\": \"CHOCOLATE CUBE\",\n        \"furafura toxin\": \"ふらふらトキシン\",\n        \"cat garden\": \"CAT GARDEN\",\n        \"kuroneko smith\": \"黒猫スミス\",\n        \"rukonosu\": \"龙虎乃巢\",\n        \"samoyedest\": \"サモエデスト\",\n        \"yuunabe shinkouchuu\": \"夕锅进行中\",\n        \"royal milk\": \"Royalみるく\",\n        \"nanohanatea\": \"なのはなtea*\",\n        \"sound sticker\": \"サウンドステッカー\",\n        \"gainamon\": \"がいなもん\",\n        \"loflat\": \"LOFLAT\",\n        \"chococornet\": \"チョココロネ\",\n        \"wnb\": \"WNB\",\n        \"custom size\": \"カスタムサイズ\",\n        \"flicker10\": \"Flicker10\",\n        \"arkhetelos\": \"あるけてろす\",\n        \"juggernaut\": \"じゃがぁの～と\",\n        \"aki no mikaku\": \"あきのみかく\",\n        \"ukatsu de wa nai\": \"うかつではない\",\n        \"ennui\": \"ENNUI\",\n        \"orange channel\": \"ORANGE☆CHANNEL\",\n        \"eternal land\": \"ETERNAL LAND\",\n        \"timtim machine\": \"TIMTIMマシン\",\n        \"artistic time\": \"Artistic Time\",\n        \"niliu chahui\": \"逆流茶会\",\n        \"seikei doujin\": \"正经同人\",\n        \"b.b.t.t.\": \"B.B.T.T.\",\n        \"kumak.com\": \"KUMAK.COM\",\n        \"neruneru\": \"ねるねる\",\n        \"bomb shelter\": \"核弹避难室\",\n        \"shokakuya\": \"少年觉醒夜\",\n        \"toadstool factory\": \"有害蕈类集会所\",\n        \"elane workshop\": \"エルアネ工房\",\n        \"fukuroutei\": \"福笼亭\",\n        \"zvizva-dan\": \"ズビズバ団\",\n        \"uruujima\": \"うるう島\",\n        \"chilled house\": \"CHILLED HOUSE\",\n        \"jack to nicholson\": \"ジャックとニコルソン\",\n        \"shoujo kakei\": \"少女架刑\",\n        \"looptheloop\": \"LOOPTHELOOP!\",\n        \"tsukimi dango\": \"月见团子\",\n        \"paradiddle\": \"パラディドル\",\n        \"mousouzoku no soukutsu\": \"妄想族の巣窟\",\n        \"fuji sengendou\": \"富士浅间堂\",\n        \"negative gang\": \"ネガティブギャング\",\n        \"aloe-nano\": \"Aloe-nano\",\n        \"genshi bangou 47\": \"原子番号47\",\n        \"milky been\": \"Milky Been!\",\n        \"mebae anime\": \"めばえあにめ\",\n        \"alison airlines\": \"ALISON航空\",\n        \"boku to kimi to kakuu sekai to\": \"僕と君と架空世界と\",\n        \"gantai critical\": \"眼帯クリティカル\",\n        \"a-walks\": \"A-WALKs\",\n        \"minuetworks\": \"MinuetWorks\",\n        \"enokiya\": \"榎屋\",\n        \"bindume no kairou\": \"ビン詰めの回廊\",\n        \"mitsuroh\": \"MITSUROH\",\n        \"milk protein\": \"ミルクプロテイン\",\n        \"aokihoshi\": \"AOKIHOSHI\",\n        \"brain dead\": \"ぶれいんでっど\",\n        \"p.p\": \"P:P\",\n        \"loverevo\": \"ラブレボ\",\n        \"po buyuu\": \"PO武勇\",\n        \"zensoku rider\": \"漸速ライダー\",\n        \"windarteam\": \"风艺WindArTeam\",\n        \"curl up\": \"CURL UP\",\n        \"gensou stomach\": \"幻想ストマック\",\n        \"88 gou\": \"88号\",\n        \"ofuton de suyaa\": \"おふとんでスヤァ\",\n        \"fatalpulse\": \"Fatalpulse\",\n        \"oneone1\": \"ONEONE1\",\n        \"marchen box\": \"メルヘンBOX\",\n        \"pokopii\": \"ぽこぴー\",\n        \"hikaru no kobeya\": \"ひかるの小部屋\",\n        \"kiyokawa zaidan\": \"虚川财团\",\n        \"aardvark\": \"Aardvark\",\n        \"no osaka no life\": \"NO OSAKA NO LIFE\",\n        \"peace maker\": \"PEACE MAKER\",\n        \"solid line\": \"Solid Line\",\n        \"makeinu\": \"負け犬\",\n        \"lucky doggy\": \"LUCKY DOGGY\",\n        \"daraku jiko chousa iinkai\": \"堕落事故调查委员会\",\n        \"umi no sachi\": \"うみのさち\",\n        \"yuunagiya\": \"夕凪屋\",\n        \"aimaitei\": \"愛昧亭\",\n        \"ohmiya tsukasa\": \"大宫司\",\n        \"mikekodou\": \"みけこ堂\",\n        \"hekichaen\": \"碧茶园\",\n        \"amatoro bow\": \"甘とろ棒\",\n        \"ruciedo\": \"るしえ堂\",\n        \"jingai makyou\": \"ジンガイマキョウ\",\n        \"steam d\": \"すち～む・D\",\n        \"65535th avenue\": \"65535あべぬー。\",\n        \"makuu gundan\": \"魔空军团\",\n        \"kinokomushin\": \"きのこむ神\",\n        \"ichibariki\": \"一马力\",\n        \"okotan pekoe\": \"おこたんぺこ\",\n        \"we are coming\": \"We are COMING!\",\n        \"sanutei\": \"さぬ亭\",\n        \"tanic ya\": \"タニシ屋\",\n        \"wild flower\": \"WILD FLOWER\",\n        \"brave heart petit\": \"BRAVE HEART petit\",\n        \"chocolate synapse\": \"Chocolate Synapse\",\n        \"boku wa maso desu\": \"僕はマゾです\",\n        \"stanky\": \"STANKY\",\n        \"wizs studio\": \"Wiz's Studio\",\n        \"alkaloid\": \"アルカロイド\",\n        \"d slash l\": \"D/L\",\n        \"kirastar\": \"KiraStar\",\n        \"kokyu no heya\": \"コキュの部屋\",\n        \"askray\": \"AskRay\",\n        \"burstbomb.t\": \"BurstBomb.T\",\n        \"usa daioh\": \"ウサ大王\",\n        \"kaitsushin\": \"海通信\",\n        \"muramuramura\": \"村々村\",\n        \"mumu\": \"夢々\",\n        \"henreikai\": \"片励会\",\n        \"super flat lolinitron\": \"超平板小娘电视台\",\n        \"ashurame gajoh\": \"阿修罗女画帖\",\n        \"kyokushou shoujo\": \"极少少女\",\n        \"luft forst\": \"Luft Forst\",\n        \"gesewa na hanashi\": \"下世話な話\",\n        \"yatsufusa no kobeya\": \"八房の小部屋\",\n        \"ponpharse\": \"ぽんふぁーず\",\n        \"hihumiya\": \"一二三矢\",\n        \"saragi\": \"蛇穴\",\n        \"c2.inc\": \"C2.Inc\",\n        \"km1chome\": \"健町一丁目\",\n        \"atelier dr.heads\": \"アトリエDr.HEAD'S\",\n        \"datsuryoku kenkyuukai\": \"脱力研究会\",\n        \"mebius no wa\": \"Mebiusの環\",\n        \"zenra qq\": \"全裸QQ\",\n        \"ironimu\": \"イロニム\",\n        \"ahobaka\": \"AHOBAKA\",\n        \"corori\": \"CORORI\",\n        \"berosuya\": \"べろす屋\",\n        \"blank check\": \"ぶらんく☆ちぇっく\",\n        \"tonkotsu\": \"とんこつ\",\n        \"necocoya\": \"ねここや\",\n        \"ss-brain\": \"SS-BRAIN\",\n        \"fleur 9 pri\": \"ふるるきゅぷり\",\n        \"jyujiro\": \"十字路\",\n        \"oricomplex\": \"ORICOMPLEX\",\n        \"ohtado\": \"おおた堂\",\n        \"labomagi\": \"らぼまじ!\",\n        \"natsu otome\": \"ナツオトメ\",\n        \"nyanyahouse\": \"NyaNyaHouse\",\n        \"elephant jelly\": \"エレファントゼリー\",\n        \"shounen zoom\": \"少年ズーム\",\n        \"nemuneko\": \"寝梦猫\",\n        \"heart manju mania\": \"はぁと饅頭マニア\",\n        \"dadada coffee\": \"だだだ珈琲\",\n        \"sorairo inn\": \"空色イン\",\n        \"ecchi na taikendan kokuhaku toukou otoko jyuku\": \"エッチな体験談告白投稿男塾\",\n        \"kuramochi zukan\": \"仓持图鉴\",\n        \"uran no yakata\": \"雨兰の馆\",\n        \"tears39\": \"Tears39\",\n        \"milkberry\": \"milkberry\",\n        \"gyoniku\": \"鱼肉\",\n        \"studio c-take\": \"Studio C-TAKE\",\n        \"saru no koshikake\": \"サルノコシカケ\",\n        \"jall boint\": \"ジョールボイント\",\n        \"wadamemo\": \"wadamemo\",\n        \"nanka no atama\": \"何かのあたま!\",\n        \"scratch jikkou iinkai\": \"スクラッチ実行委員会\",\n        \"gn\": \"GN\",\n        \"anko ni gohan\": \"あんこに御飯\",\n        \"hyappo hissatsu\": \"百步必杀\",\n        \"ajiichi\": \"味市\",\n        \"aozoramichi\": \"苍空道\",\n        \"calm atmosphere\": \"カルムアトモスフィア\",\n        \"hikakuteki simple na panty\": \"比較的シンプルなパンティ\",\n        \"hachimitsu romance\": \"蜂蜜ロマンス\",\n        \"trouble makers\": \"Trouble Makers\",\n        \"p-collection\": \"P-Collection\",\n        \"nekotoraya\": \"猫虎屋\",\n        \"wulazula\": \"うらずら\",\n        \"shotaian\": \"所带庵\",\n        \"pirozhki teikoku\": \"ピロシキ帝国\",\n        \"c.rs nest\": \"C.R's NEST\",\n        \"cat expert\": \"きゃっといいえっくす\",\n        \"soundz of bell\": \"Soundz of Bell\",\n        \"achiki no megane\": \"あちきのめがね\",\n        \"blackbox\": \"BlackBox\",\n        \"basutei shower\": \"バス停シャワー\",\n        \"hakueki shobou\": \"白液书房\",\n        \"iromiiro\": \"いろみいろ\",\n        \"uroboros\": \"UROBOROS\",\n        \"marked-two\": \"Marked-two\",\n        \"surume no oka\": \"するめの丘\",\n        \"moezilla-gumi\": \"もえじら組\",\n        \"hisagoya\": \"瓢屋\",\n        \"yohsyuan\": \"杨州庵\",\n        \"bundosuikou\": \"文土水口\",\n        \"potato house\": \"POTATO HOUSE\",\n        \"sabaku x syoujyo\": \"砂漠×少女\",\n        \"hougakuya\": \"方角屋\",\n        \"koro chan fan club\": \"コロちゃんファンクラブ\",\n        \"4hands\": \"4HANDS\",\n        \"takachihoscramble\": \"高千穂スクランブル\",\n        \"doku tonkotsu niku dorei\": \"毒とんこつ肉ドレイ\",\n        \"moon night kitten\": \"月夜のこねこ\",\n        \"american kenpou\": \"アメリカン拳法\",\n        \"erondon hearts\": \"ERONDON HEARTS\",\n        \"shd\": \"SHD\",\n        \"purin kai yoghurt\": \"プリン海ヨーグルト\",\n        \"shouyu no sato\": \"醤油の里\",\n        \"amatou\": \"あまとう | 甘党\",\n        \"sennin no atelier\": \"仙人のアトリエ\",\n        \"magicalflight\": \"MagicalFlight\",\n        \"inucream\": \"いぬくりぃむ\",\n        \"dangan minorz\": \"ダンガンマイナーズ\",\n        \"wohana gokoro\": \"ヲ花心\",\n        \"jack-pot\": \"JACK-POT\",\n        \"gamu-syara\": \"饿武者罗\",\n        \"jinsukeya\": \"甚助屋\",\n        \"mushoku santaro\": \"无色三太郎\",\n        \"team nekojishi\": \"Team Nekojishi\",\n        \"angelbox\": \"ANGELBOX\",\n        \"mokusei zaijuu\": \"木星在住\",\n        \"nekonomizoshiru\": \"猫のみぞ汁\",\n        \"da hootch\": \"DA HOOTCH\",\n        \"hooliganism\": \"集团暴力\",\n        \"eroquis\": \"EROQUIS!\",\n        \"18master\": \"18マスター\",\n        \"date in vitro\": \"Date in vitro\",\n        \"yamanotesen\": \"山手线\",\n        \"lovewn outpost\": \"Lovewn Outpost\",\n        \"kitsune no shippo momitai\": \"狐の尻尾揉みたい\",\n        \"othukimi\": \"オツキミ\",\n        \"mesu gorilla.\": \"メスゴリラ。\",\n        \"samurai ikka\": \"さむらい一家\",\n        \"akutagawa toranosuke\": \"芥川虎之介\",\n        \"seventh zest\": \"seventh zest\",\n        \"niku drill\": \"肉ドリル\",\n        \"mugu\": \"MUGU\",\n        \"kaleido circus\": \"Kaleido Circus\",\n        \"marimofu extension\": \"まりもふえくすてんしょん\",\n        \"piripun\": \"ぴりぷん\",\n        \"g-nose\": \"G-Nose\",\n        \"hokyuun\": \"ほきゅーん\",\n        \"studio boxer\": \"スタジオぼくさぁ\",\n        \"chibikko kingdom\": \"CHIBIKKO KINGDOM\",\n        \"granada sky\": \"グラナダの空\",\n        \"baraneko yougashi-ten\": \"薔薇猫洋菓子店\",\n        \"puu no puupuupuu\": \"ぷぅのぷぅぷぅぷぅ\",\n        \"dokusai switch\": \"独裁スイッチ\",\n        \"junshain inoue\": \"准社员井上\",\n        \"mad order\": \"MAD ORDER\",\n        \"ochikonium\": \"おちこにうむ\",\n        \"arusenchioratatema\": \"アルセンチオラタテマ\",\n        \"fonchau\": \"蜂巢\",\n        \"abalone soft\": \"Abalone Soft\",\n        \"randou house\": \"乱道ハウス\",\n        \"chocolate chuudoku\": \"チョコレイト中毒\",\n        \"blue section\": \"Blue Section\",\n        \"aoin no junreibi\": \"アオインの巡礼日\",\n        \"akutensoushin\": \"恶转奏进\",\n        \"phylactery\": \"PHYLACTERY\",\n        \"hassystant\": \"ハシスタント\",\n        \"rabbit\": \"＊rabbit\",\n        \"kakukonoka\": \"かくこのか\",\n        \"arterial heart\": \"ARTERIALHEART\",\n        \"moriq\": \"moriQ\",\n        \"mofurentei\": \"もふれん亭\",\n        \"sonna kanji de heiankyou\": \"そんな感じで平安京\",\n        \"night springs\": \"ナイトスプリングス\",\n        \"aki to haru no yume\": \"秋と春の夢\",\n        \"tomatohouse-905s room\": \"tomatohouse-905's room\",\n        \"dai 6 kichi\": \"第6基地\",\n        \"movefromoneplacetoheaven\": \"MoveFromOnePlacetoHeaven\",\n        \"workholic\": \"わーくほりっく\",\n        \"astro qube.\": \"AstroQube.\",\n        \"pikorin\": \"ぴこりん!\",\n        \"ngmyu\": \"んみゅ\",\n        \"gintou seika\": \"银糖制菓\",\n        \"damage yuka r\": \"ダメージ床R\",\n        \"ruibosucha\": \"るいぼす茶\",\n        \"kuroisuisei\": \"黒い彗星\",\n        \"se bone\": \"背・骨\",\n        \"tugumix\": \"TUGUMIX\",\n        \"tfc kikaku to yukaina nakamatachi\": \"TFC企画とゆかいな仲間たち\",\n        \"yumemigachi campus\": \"夢想キャンパス\",\n        \"a.o.i\": \"A・O・I\",\n        \"yamanashi musume.\": \"やまなし娘。\",\n        \"zetsubou shiromuji\": \"絶望しろむじ\",\n        \"tottoko mtarou\": \"とっとこMたろう\",\n        \"sad.co\": \"sad.co\",\n        \"an an shokudou\": \"あん♪あん♪食堂\",\n        \"hurupontei\": \"ふるぽん亭\",\n        \"samidaregiri\": \"五月雨斬り\",\n        \"harigane shinshi doumei\": \"针金绅士同盟\",\n        \"dessert time\": \"Dessert Time\",\n        \"fuka fuka\": \"不可不可\",\n        \"suzuki dogezaemon\": \"铃木土下座卫门\",\n        \"anrakugai\": \"安乐街\",\n        \"nurumayu\": \"ぬるま湯\",\n        \"urasekai 2\": \"里世界2\",\n        \"yanyanyo\": \"やんやんよ\",\n        \"fuzukikai\": \"文月会\",\n        \"wanwan bakufu\": \"わんわん幕府\",\n        \"yamitsuki honpo\": \"やみつき本舗\",\n        \"studio kfc\": \"Studio KFC\",\n        \"atelier maso\": \"アトリエマゾ\",\n        \"hachigo\": \"ハチゴ\",\n        \"miyakoochi partisan\": \"都落ちPartisan\",\n        \"efuya\": \"エフ屋\",\n        \"inbuland\": \"iNBULAND\",\n        \"tsukikaze machi\": \"月风町\",\n        \"kuro zuishou\": \"黑水晶\",\n        \"shinyanchi\": \"シンヤんち\",\n        \"gyuunyuu nomiba\": \"牛乳飲み場\",\n        \"kurumi namiki\": \"くるみ並木\",\n        \"kazemichiya\": \"风道屋\",\n        \"su-mi-tan\": \"粟米汤\",\n        \"amuai okashi seisakusho\": \"あむぁいおかし製作所\",\n        \"mofmof\": \"もふもふ\",\n        \"katsu tights\": \"カツタイツ\",\n        \"ainomugen\": \"あいの無限\",\n        \"nuko majin\": \"ぬこ魔神\",\n        \"uni no tane\": \"うにの種\",\n        \"gunjou robot\": \"群青ロボット\",\n        \"hyper dropkick\": \"はいぱーどろっぷきっく\",\n        \"shanghai hanten\": \"上海饭店\",\n        \"hyakki yakou\": \"百鬼夜行\",\n        \"ame ramune\": \"アメラムネ\",\n        \"project kaguya\": \"PROJECT KAGUYA\",\n        \"futayami koubou\": \"双暗工房\",\n        \"mappa namatta\": \"マッパなまった\",\n        \"yumeiro snowgazer\": \"夢色スノーゲイザー\",\n        \"nijutteya\": \"弐十手屋\",\n        \"maguro coffee\": \"まぐろ珈琲\",\n        \"shoujo gesshoku\": \"少女月蝕\",\n        \"kokuto koukuu\": \"黒兎航空\",\n        \"manshin soui\": \"満身創痍\",\n        \"soukousen\": \"創攻線\",\n        \"neko gosho\": \"猫御所\",\n        \"harunatsuakifuyu\": \"春夏秋冬\",\n        \"yoshino\": \"吉野\",\n        \"murakami suigun no yakata\": \"村上水軍の館\",\n        \"takanaedoko\": \"高苗床\",\n        \"ichijikushirabe shiki\": \"九調四季\",\n        \"aoirokanata\": \"蒼色彼方\",\n        \"kurokudo-ya\": \"黒クド屋\",\n        \"iorigumi\": \"庵組\",\n        \"kedama gyuunyuu\": \"毛玉牛乳\",\n        \"gyuunyuuya-san\": \"牛乳屋さん\",\n        \"senpenbankashiki\": \"千变万化式\",\n        \"amakuchi syoujo\": \"あまくち少女\",\n        \"akutoku doumei\": \"悪徳同盟\",\n        \"andorogynous\": \"ANDOROGYNOUS\",\n        \"kikurage-ya\": \"きくらげ屋\",\n        \"shis\": \"SHIS\",\n        \"tomoshibiya koubou\": \"灯夜工房\",\n        \"kakuzato-ichi\": \"核座头市\",\n        \"poppenheim\": \"ぽっぺんはいむ\",\n        \"chitei no nikuya\": \"地底の肉屋\",\n        \"manaita\": \"まないた\",\n        \"mizore nabe\": \"みぞれ鍋\",\n        \"onefes jikkou iinkai\": \"オネフェス実行委員会\",\n        \"isuwie-ya\": \"イスィ屋\",\n        \"yabitsutouge\": \"弥美津峠\",\n        \"chotto dake aruyo.\": \"チョットだけアルヨ。\",\n        \"shiro no ehonya-san\": \"しろの絵本屋さん\",\n        \"neutron city\": \"Neutron city\",\n        \"h-gabmenters\": \"H-gabmenters\",\n        \"shichimen soka\": \"七面楚歌\",\n        \"shin nanka tou\": \"新なんか党\",\n        \"tefutefu.\": \"てふてふ。\",\n        \"menkui\": \"めんくい\",\n        \"amamineko cafe\": \"あまみねこカフェ\",\n        \"maron koubou\": \"マロン工房\",\n        \"nekomonido\": \"ネコモニ堂\",\n        \"nikuniku italian\": \"にくにくイタリアン\",\n        \"darkside room\": \"だーくさいどるーむ\",\n        \"chimee house\": \"ちみはうす\",\n        \"h at break\": \"H@BREAK\",\n        \"saigado\": \"彩画堂\",\n        \"yuuendou\": \"遊猿堂\",\n        \"kouchaya\": \"红茶屋\",\n        \"testa kitchen\": \"てすた厨房\",\n        \"kireinabuta\": \"キレイナブタ\",\n        \"saihate-kukan\": \"最果て空間\",\n        \"seki sabato\": \"関サバト\",\n        \"garyuuya\": \"我龍屋\",\n        \"corona 314\": \"コロナ314\",\n        \"yume to kyouki no chomolung oukoku\": \"夢と狂気のチョモラン王国\",\n        \"lazy star lazy\": \"Lazy★Lazy\",\n        \"70 nenshiki yuukyuu kikan\": \"70年式悠久機関\",\n        \"amazake hatosyo-ten\": \"甘酒鳩商店\",\n        \"batten kariba\": \"X仮歯\",\n        \"mosquitone.\": \"もすきーと音。\",\n        \"hachibusaki\": \"八分咲\",\n        \"kouen tanpaku q\": \"交援蛋白Q\",\n        \"egao de bouryoku\": \"笑顔で暴力\",\n        \"beta houkai\": \"β崩壊\",\n        \"chuuou bunritai\": \"中央分離隊\",\n        \"neko wa manma ga utsukushii\": \"ねこはまんまがうつくしい\",\n        \"nekomarudow.\": \"猫丸堂\",\n        \"honoji\": \"Honoji\",\n        \"watagashi\": \"わた菓子\",\n        \"morphine\": \"モルピネ\",\n        \"amahara teikoku\": \"天原帝国\",\n        \"rocket chousashitsu\": \"ロケット調査室\",\n        \"esora note\": \"エソラnote\",\n        \"ozitan yasan\": \"おじたん屋さん\",\n        \"nechorapoddo\": \"ねちょらぽっど\",\n        \"luminocity\": \"ルミノシティ\",\n        \"gakushokutei\": \"学食亭\",\n        \"nagisa no yoko\": \"渚のヨーコ\",\n        \"ruiketsuan\": \"泪穴庵\",\n        \"ribi dou\": \"RIBI堂\",\n        \"anmonkan\": \"暗梦馆\",\n        \"dairoku kadan\": \"第六花坛\",\n        \"salt choc\": \"塩ちょこ\",\n        \"sawayaka tokunou milk\": \"爽やか特濃みるく\",\n        \"armament calcium\": \"武装カルシウム\",\n        \"sharaku-dou\": \"写楽堂\",\n        \"shoujo renka\": \"少女恋歌\",\n        \"yakiniku tabetai\": \"焼肉食べたい\",\n        \"shiitake nouen\": \"しいたけ農園\",\n        \"almond-nabe\": \"アーモンド鍋\",\n        \"hizaue 5cm\": \"膝上5センチメートル\",\n        \"ponponpain\": \"ぽんぽんぺいん\",\n        \"grinp\": \"GRINP\",\n        \"lost rage\": \"Lost Rage\",\n        \"yahai\": \"矢ハイ\",\n        \"mohumohu chaya\": \"もふもふ茶屋\",\n        \"kirororo\": \"KirororO\",\n        \"zinfandel\": \"ZINFANDEL\",\n        \"fumituki\": \"踏月\",\n        \"mimipuru\": \"みみぷる\",\n        \"yc-tv\": \"YC－TV\",\n        \"strangechameleon\": \"ストカメ\",\n        \"eseneko tale\": \"えせねこてーる\",\n        \"tensaizoku\": \"天災族\",\n        \"zenoside\": \"ぜのさいど\",\n        \"kata k-shiki\": \"型K式\",\n        \"yume no shima\": \"ユメノシマ\",\n        \"dot eito\": \"ドットエイト\",\n        \"ao\": \"青\",\n        \"w-18\": \"W-⑱\",\n        \"poprication\": \"poprication\",\n        \"seemu\": \"seemu。\",\n        \"mix-edge\": \"MIX-EDGE\",\n        \"muni koubou\": \"むに工房\",\n        \"marota teikoku\": \"麻吕太帝国\",\n        \"tenkirin\": \"天气轮\",\n        \"gust\": \"GUST\",\n        \"tsurikichi doumei\": \"釣りキチ同盟\",\n        \"ran-ya\": \"蘭屋\",\n        \"neko-bus tei\": \"ねこバス停\",\n        \"loli ace\": \"ロリエース\",\n        \"dynamo\": \"DYNAMO\",\n        \"clash house\": \"くらっしゅハウス\",\n        \"rainbow vanilla\": \"Rainbow Vanilla\",\n        \"kuma no ana\": \"熊の穴\",\n        \"flourish\": \"flourish\",\n        \"cocoa holic\": \"ココアホリック\",\n        \"retro\": \"RETRO\",\n        \"tekomenchi\": \"てこめんち\",\n        \"nattou misoshiru\": \"納豆味噌汁\",\n        \"kurimomo\": \"くりもも\",\n        \"garimpeiro\": \"Garimpeiro\",\n        \"naturefour\": \"風林火山\",\n        \"usagigo\": \"うさぎ号\",\n        \"cube\": \"CUBE\",\n        \"stella candy\": \"Stella Candy\",\n        \"zip\": \"Zip\",\n        \"moe moe cafe\": \"モエモエカフェ\",\n        \"hitenkei\": \"HitenKei\",\n        \"muzin syoujo\": \"無人少女\",\n        \"hasuneya\": \"はすねや\",\n        \"chilly polka\": \"Chilly polka\",\n        \"morimiyakan\": \"森宫缶\",\n        \"ninokoya\": \"にのこや\",\n        \"mocha2popcorn\": \"mocha*2popcorn\",\n        \"kuronisiki\": \"黒錦\",\n        \"awayukitist\": \"あわ雪チスト\",\n        \"ugc\": \"UGC\",\n        \"akapenguin\": \"アカペンギン\",\n        \"coin toss\": \"こいんとす\",\n        \"haikibutsu\": \"廃棄物\",\n        \"betemius\": \"BETEMIUS\",\n        \"nihon kemomimi suishou iinkai\": \"日本ケモ耳推奨委員会\",\n        \"ayakase-ke no neko\": \"綾枷家の猫\",\n        \"mignon works\": \"MIGNON WORKS\",\n        \"ichijiku yogurt\": \"いちじくよーぐると\",\n        \"egoistic honey\": \"Egoistic Honey\",\n        \"amamiya\": \"甘味屋\",\n        \"curry berg dish\": \"カリーバーグディッシュ\",\n        \"tamanegiya\": \"玉葱屋\",\n        \"casis-kabosu\": \"カシスかぼす\",\n        \"studio a\": \"studio A\",\n        \"shougentei\": \"翔玄亭\",\n        \"d.n.a.lab.\": \"D・N・A.Lab.\",\n        \"kinokonomi\": \"きのこのみ\",\n        \"pigpanpan\": \"PigPanPan\",\n        \"yomairi sensei\": \"よまいり先生\",\n        \"koniro kajitsu\": \"紺色果実\",\n        \"pandora box\": \"ぱんどらぼっくす\",\n        \"jekyll and hyde\": \"Jekyll and Hyde\",\n        \"roentgen\": \"Roentgen\",\n        \"puchimaple\": \"ぷちめいぷる\",\n        \"aratoya\": \"あらと屋\",\n        \"mapler\": \"MAPLER\",\n        \"yuribatake bokujou\": \"百合畑牧場\",\n        \"monyamonya\": \"モニャモニャ\",\n        \"tatakai no kiseki\": \"戦いの軌跡\",\n        \"arcadia\": \"ARCADIA\",\n        \"sorairo nyannyan\": \"空色にゃんにゃん\",\n        \"ichigo crown\": \"Ichigo Crown\",\n        \"side effects\": \"SIDE EFFECTS\",\n        \"t2 art works\": \"T2 ART WORKS\",\n        \"yokkora pencil\": \"よっこらペンシル\",\n        \"marumieya\": \"まる美絵屋\",\n        \"indico lite\": \"Indico lite\",\n        \"haraheridou\": \"はらヘリ堂\",\n        \"hitsuji kikaku\": \"ヒツジ企画\",\n        \"hiyashi yaki teishoku\": \"冷やし焼き定食\",\n        \"burittohiroba\": \"burittohiroba\",\n        \"pypyworks\": \"PYPYworks\",\n        \"lilith lauda laboratory\": \"リリスラウダ研究所\",\n        \"slime kikaku\": \"スライム企画\",\n        \"mukousharan\": \"無口遮欄\",\n        \"l5ex\": \"L5EX\",\n        \"socha-ya\": \"そちゃ屋\",\n        \"mermerry\": \"メルメリー\",\n        \"doyagaobyo\": \"どや顔病\",\n        \"studio hitoribocchi\": \"スタジオひとりぼっち\",\n        \"kyokutou koumuten\": \"极东工务店\",\n        \"takemasaya\": \"たけまさ屋\",\n        \"novelize\": \"NOVELIZE\",\n        \"konohanaku\": \"此花区\",\n        \"hisyoku no tansansui\": \"緋色の炭酸水\",\n        \"comoyoko\": \"コモヨコ\",\n        \"witchs marionette\": \"witch's marionette\",\n        \"key trash\": \"KEY TRASH\",\n        \"alchemy\": \"あるけみい\",\n        \"a.l.l\": \"A・L・L\",\n        \"hiyakake gohan\": \"ひやかけごはん\",\n        \"expander welder\": \"エキスパンダー溶接\",\n        \"makarontaitei\": \"まかろん大帝\",\n        \"hoshi to matango\": \"ほしとマタンゴ\",\n        \"resort ukami\": \"リゾートうかみ\",\n        \"hatishiro\": \"はちしろ\",\n        \"yureru keikoutou\": \"揺れる蛍光灯\",\n        \"rump\": \"RUMP\",\n        \"soratomoe\": \"ソラトモエ\",\n        \"death para\": \"ですぱら\",\n        \"hachiouji kaipan totsugeki kiheitai\": \"八王子海パン突撃騎兵隊\",\n        \"sand\": \"sand\",\n        \"usagigoya.\": \"うさぎごや。\",\n        \"genmaicha\": \"玄米茶\",\n        \"skk\": \"SKK\",\n        \"ins-mode\": \"INS-mode\",\n        \"mellowmind\": \"めろうまいんど\",\n        \"40denier\": \"40デニール\",\n        \"utsura uraraka\": \"うつらうららか\",\n        \"pannomimi\": \"ぱんのみみ\",\n        \"sweet avenue\": \"Sweet Avenue\",\n        \"atelier stars\": \"あとりえスターズ\",\n        \"wildstyle\": \"wildstyle\",\n        \"monofille\": \"モノフィーユ\",\n        \"cassiopeia\": \"CASSIOPEIA\",\n        \"keepon\": \"keepON\",\n        \"yojigen kaidenpa\": \"四次元怪電波\",\n        \"saikutsu kichi\": \"採掘基地\",\n        \"7th semicolon mint\": \"7th;Mint\",\n        \"hitsuji no gohan\": \"ひつじのごはん\",\n        \"tokyoboogienight\": \"桃京武戯夜\",\n        \"taco\": \"TACO\",\n        \"pirokobo\": \"ピロコボ\",\n        \"fujitsubo-machine\": \"富士壺機械\",\n        \"kokusai tenjijou uramon\": \"国際展示場裏門\",\n        \"daifuku\": \"大福\",\n        \"misaki\": \"三崎\",\n        \"umenomi gahou\": \"梅の実画報\",\n        \"akari blast\": \"Akari blast!\",\n        \"rokata aruki\": \"縁側珈琲\",\n        \"idonchi\": \"いどんち\",\n        \"sanbaizu\": \"三杯酢\",\n        \"j.d.world\": \"J.D.World\",\n        \"0000\": \"0000\",\n        \"lovelyplace\": \"LOVELYPLACE\",\n        \"studio hatake\": \"STUDIO畑\",\n        \"seitokaishitsu\": \"生徒会室\",\n        \"kuma no tooru michi\": \"くまのとおるみち\",\n        \"kindou shoujo\": \"金瞳少女\",\n        \"yukimi-fuumi\": \"ゆきみ風味\",\n        \"cotesdenoix\": \"CotesDeNoix\",\n        \"from nuts\": \"From nuts\",\n        \"upagoya\": \"うぱ小屋\",\n        \"muraimura\": \"村井村\",\n        \"apple effect\": \"Apple Effect\",\n        \"sukoburuyama\": \"すこぶるやま\",\n        \"otabe dynamites\": \"おたべ★ダイナマイツ\",\n        \"milk bar\": \"MILK BAR\",\n        \"chikuwa no wakka\": \"ちくわのわっか\",\n        \"nekoyashiki\": \"猫屋敷\",\n        \"cheeseyeast\": \"チーズ酵母\",\n        \"neko tanteidan peach\": \"ネコ☆探偵団\",\n        \"water drop\": \"うぉーたーどろっぷ\",\n        \"honey butter3g\": \"はちみつバター3g\",\n        \"ichibocchi\": \"ゐちぼっち\",\n        \"low temp\": \"low*temp\",\n        \"against\": \"against\",\n        \"jigizagi\": \"ジギザギ\",\n        \"pochi\": \"POCHI\",\n        \"dragon panda\": \"DRAGON PANDA\",\n        \"trip spider\": \"TRIP SPIDER\",\n        \"smile studio\": \"すまいるすたじお\",\n        \"nimunoya\": \"にむの屋\",\n        \"studio big-x\": \"スタジオBIG-X\",\n        \"uzumaki hiyoko\": \"うずまき☆ひよこ\",\n        \"shinshi kouryuuku\": \"紳士交流区\",\n        \"yugen no suda\": \"有限の須田\",\n        \"daidabi\": \"ダイダビ\",\n        \"selvage fisheries\": \"セルビッチ水産\",\n        \"take out\": \"Take Out\",\n        \"necomicle\": \"necömicle\",\n        \"omlet\": \"OMLET\",\n        \"kohipotion\": \"KOHIPOTION\",\n        \"allegro mistic\": \"Allegro Mistic\",\n        \"aho-cross\": \"AHO-CROSS\",\n        \"nekosu no sumika\": \"ねこすのすみか\",\n        \"izumiya\": \"いずみ屋\",\n        \"middly\": \"MIDDLY\",\n        \"0846net\": \"オヤシロネット\",\n        \"fuzichaku\": \"不時着\",\n        \"studio snow man\": \"Studio Snow Man\",\n        \"goldengoblins\": \"GoldenGoblins\",\n        \"kitaku jikan\": \"归宅时间\",\n        \"tanima ginkou\": \"谷间银行\",\n        \"nagaredamaya\": \"流弹屋\",\n        \"dschinghis khan no tamanegi wa ore no yome\": \"ジンギスカンの玉葱は俺の嫁\",\n        \"usagi boss\": \"兔子老大\",\n        \"popochichi\": \"ぽぽちち\",\n        \"g.y.more.l\": \"G.Y.MORE.L\",\n        \"nyoudou juunisei\": \"尿道十二世\",\n        \"hobukuro\": \"ほおぶくろっ!\",\n        \"yasai no kuni\": \"野菜の国\",\n        \"ikkizuka\": \"いっきづか\",\n        \"komadori nouen\": \"こまどり農園\",\n        \"kuma-tan flash\": \"くまたんFlash!\",\n        \"ryuu no kinyoubi\": \"龍の金曜日\",\n        \"kuusoubune\": \"空想舟\",\n        \"perorimeshi.\": \"ぺろり飯。\",\n        \"coupe pain ginga\": \"こっぺぱん銀河\",\n        \"kimi no tomodachi.\": \"君の友達。\",\n        \"mugendai\": \"無限大\",\n        \"sanshikisumire\": \"さんしきすみれ\",\n        \"beruennea\": \"ベルエンネーア\",\n        \"orange tile\": \"オレンジタイル\",\n        \"laminaria\": \"LAMINARIA\",\n        \"nanbou hitogakushiki\": \"南方ヒトガクシキ\",\n        \"narumiya\": \"成宮\",\n        \"circle-fiore\": \"サークルフィオレ\",\n        \"popopo\": \"ぽぽぽ\",\n        \"toushitu catapult\": \"糖質過多ぱると\",\n        \"ojopie sentimental\": \"おじょぱいセンチメンタル\",\n        \"dokutoku no m\": \"独特のM\",\n        \"watari laboratory\": \"渡里laboratory\",\n        \"wappururun\": \"わっぷるるん\",\n        \"anzen chitai\": \"安全地带\",\n        \"loli seiyouken\": \"萝莉西洋剑\",\n        \"shimizuan\": \"清水庵\",\n        \"sakusei kenkyuujo\": \"搾精研究所\",\n        \"in the sky\": \"In The Sky\",\n        \"happy aroma\": \"Happy Aroma\",\n        \"molamola\": \"Molamola\",\n        \"masochist high\": \"マゾヒスト・ハイ\",\n        \"onsoku\": \"おんそく\",\n        \"ringoen\": \"RINGOEN\",\n        \"koibito wa kuroi neko\": \"コイビトハクロイネコ\",\n        \"hz-box\": \"Hz-box\",\n        \"waterfall\": \"Waterfall\",\n        \"amamori weekly\": \"あまもりウィークリー\",\n        \"signalmass\": \"SignalMass\",\n        \"suoiretsym\": \"スアリテスミ\",\n        \"rireba\": \"リレバ\",\n        \"crerpsucre\": \"CrerpSucre\",\n        \"indo no kyuuden\": \"いんどの宮殿!\",\n        \"kacchuu musume\": \"甲冑娘\",\n        \"110-groove\": \"110-GROOVE\",\n        \"yuuki kagoubutsu\": \"有機化合物\",\n        \"a gokuburi\": \"A極振り\",\n        \"sendouya\": \"千堂屋\",\n        \"kokusan jk\": \"国产JK\",\n        \"istanbul high sox\": \"イスタンブール・ハイソックス\",\n        \"chika 7cm\": \"地下7cm\",\n        \"secret society m\": \"秘密结社M\",\n        \"kawaraya-koubou\": \"瓦屋工房\",\n        \"kamishiki\": \"かみしき\",\n        \"popocket\": \"ぽぽケット\",\n        \"tanu choco\": \"たぬチョコ\",\n        \"taketate kakeya\": \"竹立掛屋\",\n        \"rico-ba\": \"Rico-ba\",\n        \"futotta obasan\": \"太ったおばさん\",\n        \"mainichi kenkou seikatsu\": \"毎日健康生活\",\n        \"noramani\": \"のらまに\",\n        \"w no honnou\": \"Wの本能\",\n        \"tokyo prominence tomato\": \"东京プロミネンストマト\",\n        \"gainax\": \"GAINAX\",\n        \"sister mytory\": \"Sister Mytory\",\n        \"yubisaki studio\": \"ユビサキスタジオ\",\n        \"wata punch\": \"WATA★PUNCH\",\n        \"poyopoyosky\": \"ぽよぽよスカイ\",\n        \"world of pure\": \"ワールドオブピュア\",\n        \"hakusen\": \"はくせん\",\n        \"pietoro\": \"ピエトロ\",\n        \"doukyara doukoukai\": \"同キャラ同好会\",\n        \"yosutebito na mangakaki\": \"世捨人な漫画描き\",\n        \"bakunyu fullnerson\": \"爆乳フルネルソン\",\n        \"kyockchokyock\": \"きょくちょ局\",\n        \"satoh katoh\": \"砂糖加糖\",\n        \"condaya\": \"今田屋\",\n        \"tennen koubo pan koubou\": \"天然酵母パン工房\",\n        \"hiyoko sabure\": \"ひよこサブレ\",\n        \"ashitamooyasumi\": \"あしたもおやすみ!\",\n        \"crown\": \"CROWN\",\n        \"island of horizon\": \"Island of Horizon\",\n        \"elriz\": \"ELRIZ\",\n        \"yakiniku teikoku\": \"焼肉帝国\",\n        \"gouache blue\": \"GOUACHE BLUE\",\n        \"duralumin love\": \"ジュラルミンラブ\",\n        \"ganryuu island\": \"巌流アイランド\",\n        \"ryoushi koubou\": \"量子工房\",\n        \"sprelidia\": \"sprelidia\",\n        \"iaidou\": \"居合堂\",\n        \"waterwheel\": \"waterwheel\",\n        \"kitaguni moyashi seizousho\": \"北国もやし製造所\",\n        \"god ryokutya\": \"GOD緑茶\",\n        \"t.4.p\": \"T.4.P\",\n        \"jagabata\": \"じゃがバター\",\n        \"ryuuseidou honpo\": \"龍正堂本舗\",\n        \"tonzura douchuu\": \"とんずら道中\",\n        \"kuromahou kenkyuujo\": \"黒魔法研究所\",\n        \"hotel negresco\": \"Hotel Negresco\",\n        \"kuzunoha\": \"屑乃葉\",\n        \"moni\": \"moni\",\n        \"greennight\": \"GreeNNight\",\n        \"unsympathetic\": \"疎ましいくらいな\",\n        \"meisaiya\": \"meisaiya\",\n        \"tegone spike\": \"てごねスパイク\",\n        \"amasyrup\": \"amasyrup\",\n        \"maybenavy\": \"MaybeNavy\",\n        \"nounai kanojo\": \"脑内彼女\",\n        \"jinsei yokosuberi.\": \"人生横滑り。\",\n        \"sanshoku nattou meshi\": \"三食納豆飯\",\n        \"shiguredoki\": \"しぐれどき\",\n        \"hirusuta\": \"昼星\",\n        \"shikaniku kohan\": \"しかにく湖畔\",\n        \"ua daisakusen\": \"U・A大作戦\",\n        \"white parabellum\": \"white parabellum\",\n        \"pecora room\": \"pecora room\",\n        \"lonely church\": \"Lonely Church\",\n        \"nekotyabatake\": \"猫茶畑\",\n        \"practice\": \"practice\",\n        \"sakuranoiro\": \"サクラノイロ\",\n        \"lunatic maiden\": \"Lunatic*Maiden\",\n        \"freelance\": \"FREELANCE\",\n        \"nekono oyashiro\": \"ねこのおやしろ\",\n        \"croix crown\": \"croix crown\",\n        \"chronolog\": \"CHRONOLOG\",\n        \"fururi.\": \"ふるり。\",\n        \"amamitu hakushi\": \"甘蜜博士\",\n        \"masaru dot com\": \"マサルドットコム\",\n        \"irodori\": \"IRODORI\",\n        \"kamaboko koubou\": \"カマボコ工房\",\n        \"shiki be careful\": \"四季注意\",\n        \"yamakon-ya\": \"山绀屋\",\n        \"botugo\": \"没后\",\n        \"calm white\": \"カームホワイト\",\n        \"curtaincall\": \"CurtainCαll\",\n        \"rainboy\": \"RainBoy\",\n        \"nekocat\": \"NekoCat\",\n        \"dicebomb\": \"DiceBomb\",\n        \"tetrapot\": \"TETRAPOT\",\n        \"tabgraphics\": \"tabgraphics\",\n        \"akari koubou\": \"灯工房\",\n        \"kajou sesshu\": \"過剰摂取\",\n        \"mousou bijutsubu\": \"妄想美術部\",\n        \"yuruyakatou\": \"ゆるやか島\",\n        \"p.a. works\": \"P.A.Works\",\n        \"commamion\": \"狐狸恩\",\n        \"gantai shoujo chudoku\": \"眼帯少女中毒\",\n        \"alice syndrome\": \"アリスシンドローム\",\n        \"pale light\": \"PALE LIGHT\",\n        \"saboten saibaijo\": \"サボテン栽培所\",\n        \"tsundere is love\": \"Tsundere is Love\",\n        \"irodoriya\": \"彩屋\",\n        \"kinakomochi\": \"木なこもち\",\n        \"gelatin\": \"Gelatin*\",\n        \"kusakabeworks\": \"KusakabeWorks\",\n        \"maho-bin\": \"まほ～びん\",\n        \"near harmonica\": \"ニアハモニカ\",\n        \"kankitsu shoujo\": \"柑橘少女\",\n        \"chickelata\": \"チキラータ\",\n        \"shida bokujou\": \"羊歯牧場\",\n        \"chiffonxx\": \"Chiffonxx\",\n        \"floralia\": \"Floralia\",\n        \"happy color festival\": \"HAPPY COLOR FESTIVAL!\",\n        \"sembyokibu\": \"扇猫喜舞\",\n        \"weapon container\": \"武器櫃\",\n        \"shinsekai set\": \"シンセカイセット\",\n        \"ruinon\": \"RUINON\",\n        \"yamada shoukai\": \"山田商会\",\n        \"takemoto seisaku iinkai\": \"竹本製作委員会\",\n        \"umemoto seisaku iinkai\": \"梅本制作委員会\",\n        \"kotei gainen\": \"固定概念\",\n        \"akausagi\": \"赤兔\",\n        \"haru koubou\": \"春工房\",\n        \"rin yuu\": \"Rin☆Yuu\",\n        \"citron no mori\": \"しとろんの杜\",\n        \"mugen jirai\": \"无限地雷\",\n        \"pion\": \"Pion\",\n        \"kuragamo\": \"蔵鴨\",\n        \"kaguya hime koubou\": \"火愚夜姫工房\",\n        \"ikujinashi no fetishist\": \"いくじなしのフェティシスト\",\n        \"fuzuii undou\": \"不随意運動\",\n        \"circle tokomaya\": \"サークルとこまや\",\n        \"barumishu\": \"ばーるみしゅ\",\n        \"megami no flask\": \"女神のフラスコ\",\n        \"hiiro no kenkyuushitsu\": \"灯色の研究室\",\n        \"sukiyaki club\": \"すきやきクラブ\",\n        \"kasoku edge\": \"かそくえっぢ\",\n        \"doku denpa jushin-chuu\": \"毒電波受信中\",\n        \"ebi manga teikoku\": \"えびまんが帝国\",\n        \"180milli cannon\": \"180ミリキャノン\",\n        \"zetsubou teisyoku\": \"ぜつぼう定食\",\n        \"milk engine\": \"Milk Engine\",\n        \"romantic sintai-kensa.\": \"ロマンティック身体検査\",\n        \"white guardian\": \"White Guardian\",\n        \"creayus\": \"CREAYUS\",\n        \"chabashira chainsaw\": \"チャバシラチェーンソー\",\n        \"renai mangaka\": \"恋爱漫画家\",\n        \"hakuto-can\": \"白桃缶\",\n        \"kemono ekaki no kousoku 2\": \"ケモノ絵描きの光速2\",\n        \"niji no magellan\": \"にじのまぜらん\",\n        \"nyanko batake\": \"猫畑\",\n        \"tsukimi dojin\": \"月見道神\",\n        \"sakanaya\": \"魚屋\",\n        \"tonyu bokujo\": \"豆乳牧場\",\n        \"kanai\": \"仮名居\",\n        \"tateyoko issen\": \"縦横一線\",\n        \"ohoshisamadou\": \"おほしさま堂\",\n        \"pure plastic\": \"純情プラスチック\",\n        \"otaku beam\": \"オタクビーム\",\n        \"gin no ame\": \"銀のあめ\",\n        \"mochipeach\": \"MochiPeach\",\n        \"tokunocin\": \"tokunocin\",\n        \"viking\": \"バイキング\",\n        \"caslton\": \"キャッスルトン\",\n        \"ntroom.\": \"NTroom.\",\n        \"shiropro\": \"しろぷろ\",\n        \"bizen dorobune koubou\": \"備前泥舟工房\",\n        \"kitsune no yomeiri\": \"きつねのよめいり\",\n        \"shinsei lolishota\": \"新生ロリショタ\",\n        \"bakuretsu fusen\": \"爆裂风船\",\n        \"natsume benkei\": \"夏目ベンケイ\",\n        \"la-go-on\": \"LA-GO-ON\",\n        \"takahashisan\": \"たかはしさん\",\n        \"kiracnadays\": \"KiracnaDays\",\n        \"nagomi\": \"和\",\n        \"dekoboko hurricane\": \"凸凹ハリケーン\",\n        \"amaineiro\": \"あまいねいろ\",\n        \"gentsuki okiba\": \"ゲンツキオキバ\",\n        \"mashira dou\": \"ましら堂\",\n        \"nijitsuya kenkyuujo\": \"虹艶研究所\",\n        \"samurai ninja greentea\": \"サムライ忍者GREENTEA\",\n        \"alicesyndrome\": \"AliceSyndrome*\",\n        \"uousaohkoku\": \"鱼ウサ王国\",\n        \"konoshiro shinko\": \"コノシロしんこ\",\n        \"kansai orange\": \"关西オレンジ\",\n        \"imomuya honpo\": \"いもむや本舗\",\n        \"ryuukakusan nodoame\": \"龙角散喉糖\",\n        \"okadatei\": \"おかだ亭\",\n        \"niramikko koujou\": \"にらみっ子工場\",\n        \"kaeri no kai 2\": \"帰りの会2\",\n        \"4h\": \"4H\",\n        \"kaitoushinshidan\": \"怪盗绅士团\",\n        \"pastyle\": \"pastyle\",\n        \"chocolate sheep\": \"Chocolate Sheep\",\n        \"hokkyoku tairiku\": \"北極大陸\",\n        \"fuguriya\": \"ふぐり屋\",\n        \"inran shounen\": \"淫乱少年\",\n        \"rokumonsen\": \"ろくもんせん\",\n        \"tenkaichi babys\": \"天下一Babys\",\n        \"beniya\": \"红屋\",\n        \"sashichigai-dan\": \"挿し違い団\",\n        \"yasai batake\": \"諏訪やさい\",\n        \"ichimi-zanmai\": \"一味三昧\",\n        \"sugar berry syrup\": \"Sugar＊Berry＊Syrup\",\n        \"kousei\": \"コウセイ\",\n        \"sugarringo\": \"SUGARRINGO\",\n        \"hajimeryu\": \"はじめりゅう\",\n        \"neovertex\": \"NEOVERTEX\",\n        \"mizuiro no bara\": \"水色のバラ\",\n        \"trinket\": \"TrinkeT\",\n        \"letra\": \"LETRA\",\n        \"kitazawa sangyo\": \"北沢産業\",\n        \"chocolate land\": \"ちょこれーとらんど\",\n        \"zebrasmise\": \"zebrasmise\",\n        \"kakurenbo\": \"かくれんぼ\",\n        \"chericot rozel\": \"Chericot*Rozel\",\n        \"pockyfactory\": \"PockyFactory\",\n        \"pixel phantom\": \"Pixel Phantom\",\n        \"afurokuma honten\": \"アフロくま本店\",\n        \"sashimi necoya\": \"さしみねこ屋\",\n        \"rurudot\": \"rurudot\",\n        \"nanashimushi land\": \"ななし虫らんど\",\n        \"chaos no genri\": \"カオスの原理\",\n        \"black sousai studio\": \"BLACK SOUSAI STUDIO\",\n        \"haechaimu\": \"ハエチャイム\",\n        \"jagaimo kenkyuujo\": \"じゃがいも研究所\",\n        \"madoromi andon\": \"まどろみ行灯\",\n        \"hakoniwa-kairou\": \"はこにわかいろう\",\n        \"akitake zensen\": \"秋茸前线\",\n        \"octopus jelly\": \"Octopus Jelly\",\n        \"kaden ryohanten seijin corner\": \"荷電量販店成人コーナー\",\n        \"black note\": \"ブラックノート\",\n        \"sentimentcolor\": \"SentimentColor\",\n        \"komowa\": \"こも輪\",\n        \"baby lop\": \"Baby Lop\",\n        \"mersugar\": \"Mersugar\",\n        \"nagatsuki\": \"NAGATSUKI\",\n        \"tayanumaya\": \"田屋沼屋\",\n        \"bottle ship bottler\": \"ボトルシップボトラー\",\n        \"saz\": \"SAZ\",\n        \"clowns\": \"Clowns'\",\n        \"toumei dolce\": \"透明ドルチェ\",\n        \"peroppoi tokoro\": \"ぺろっぽい処\",\n        \"earrings bom factory\": \"イヤリング爆弾工場\",\n        \"ororiya enpitsudo\": \"オロリヤ鉛筆堂\",\n        \"l.g.c.\": \"L.G.C.\",\n        \"midorineko\": \"みどりねこ\",\n        \"q-model\": \"Q-MODEL\",\n        \"cherish\": \"*Cherish*\",\n        \"allows\": \"Allows\",\n        \"pico martel\": \"Pico Martel\",\n        \"osenbei no mori\": \"おせんべいの森\",\n        \"sakura saku saku\": \"佐倉さくさく\",\n        \"calorie and cholesterols\": \"カロリー&Cholesterols\",\n        \"stapspats\": \"Stapspats\",\n        \"letitia no ohirune\": \"レティーシャのお昼寝\",\n        \"rokumarusou\": \"ろくまる荘\",\n        \"yamo7\": \"ヤモセブン\",\n        \"ginga-kei pride\": \"银河系PRIDE\",\n        \"suiikazuchi\": \"スイイカズチ\",\n        \"atelier hinata\": \"あとりえひなた\",\n        \"tortoiseshell\": \"トーティシェル\",\n        \"shinoya\": \"篠屋\",\n        \"ink complex\": \"Ink Complex\",\n        \"supe\": \"すぺ\",\n        \"akaneiro\": \"紅音色\",\n        \"hakukoukai\": \"白蛟会\",\n        \"marshmallow balloon\": \"マシュマロ風船\",\n        \"zombie to yukaina nakamatachi\": \"ぞんびと愉快な仲間たち\",\n        \"anmitsuyomogitei\": \"あんみつよもぎ亭\",\n        \"golden complex\": \"金色complex\",\n        \"kannko bokujyo\": \"缶子牧場\",\n        \"sencyairo\": \"sencyairo\",\n        \"himeya\": \"姫屋\",\n        \"doanobu\": \"どあのぶ\",\n        \"bunka shinryaku\": \"文化☆侵略\",\n        \"gokudou daigensui\": \"極道大元帥\",\n        \"oojikake\": \"大仕掛け\",\n        \"illumination.\": \"ゐるみねゐしょん。\",\n        \"sumi kara sumi made\": \"スミカラスミマデ\",\n        \"kankodori chaen\": \"閑古鳥茶園\",\n        \"hell and heaven\": \"ヘルアンドヘブン\",\n        \"kisarazu teikoku\": \"きさらづ帝国\",\n        \"tiba-santi\": \"千葉産地\",\n        \"yokoshoku ice\": \"洋紅色アイス\",\n        \"nekomaru shouten\": \"猫マル商店\",\n        \"pandagaippiki.\": \"パンダが一匹。\",\n        \"tousen soudou\": \"冬扇草堂\",\n        \"jukusei kakuzatou\": \"熟成角砂糖\",\n        \"mikenekohanten\": \"三毛猫饭店\",\n        \"kamikire basami\": \"紙切ればさみ\",\n        \"undescribed\": \"アンディスクライブド\",\n        \"koharu syojo\": \"小春少女\",\n        \"hakai daiteikoku\": \"破坏大帝国\",\n        \"gusha suumitsuin\": \"愚者枢密院\",\n        \"kotsubuan\": \"こつぶあん\",\n        \"gokusaishiki\": \"极彩色\",\n        \"kirintei\": \"木铃亭\",\n        \"kanyou shoujo\": \"观用少女\",\n        \"ferallemma\": \"フィラレマ\",\n        \"bakayaro\": \"ばかやろう\",\n        \"nanimoshinai\": \"NANIMOSHINAI\",\n        \"mokumokusei\": \"モクモクセイ\",\n        \"junjou harinezumi\": \"純情ハリネズミ\",\n        \"miniomlet ongakudan\": \"ミニオムレツ音楽団\",\n        \"baiuzensen\": \"梅雨前線\",\n        \"nagomiyasan\": \"なごみやさん\",\n        \"kocc house\": \"koccハウス\",\n        \"hito no fundoshi\": \"人の裈\",\n        \"himitsukessya usagi\": \"秘密结社兔\",\n        \"nekonecotton\": \"ねこねこっとん\",\n        \"punipuni no hoppe\": \"ぷにぷにのほっぺ\",\n        \"houkago inokorigumi\": \"放課後居残り組\",\n        \"hokkyoku hotaru\": \"北極ホタル\",\n        \"kikyakudou\": \"鬼脚堂\",\n        \"ikameshi shokudou\": \"乌贼饭食堂\",\n        \"tairikukan dandoudan dan\": \"大陆间弹道弹团\",\n        \"shimobashira koubou\": \"しもばしら工房\",\n        \"muriyari egao\": \"无理矢理笑颜\",\n        \"southbamboo\": \"南方山竹笋\",\n        \"permission\": \"ぱ～みっしょん\",\n        \"tsuki usagi\": \"月うさぎ\",\n        \"ameiro\": \"あめいろ\",\n        \"alpharalpha alley\": \"アルファラルファ裏通り\",\n        \"thirty saver street 2d shooting\": \"サーティセイバーストリート\",\n        \"ruri ruri kikaku\": \"瑠璃瑠璃企画\",\n        \"amanedou\": \"あまね堂\",\n        \"esperanza\": \"真田成\",\n        \"tamago no kimi\": \"卵の黄身\",\n        \"shadan katsudoh\": \"遮断活動\",\n        \"tougen shokken\": \"桃幻食研\",\n        \"ciel-arc\": \"しえるあーく\",\n        \"meshi shinja\": \"饭信者\",\n        \"ishimuraya\": \"石村屋\",\n        \"seika kairaku shoten\": \"圣华快乐书店\",\n        \"ringo no naru ki\": \"林檎のなる木\",\n        \"traya\": \"TraYA\",\n        \"kuzuya\": \"屑屋\",\n        \"momojiru teien\": \"桃汁庭园\",\n        \"tamatamasanmyaku\": \"たまたま山脈\",\n        \"harthnir\": \"HarthNir\",\n        \"yoru no hitsuji\": \"夜のひつじ\",\n        \"nawairo sonata\": \"縄色ソナタ\",\n        \"momokamasu\": \"ももかます\",\n        \"kumo no ito\": \"雲之糸\",\n        \"tokachibare\": \"十勝晴レ\",\n        \"bomubomuburin\": \"ボムボムブリン\",\n        \"nisiarea\": \"にしえりあ\",\n        \"mentsukidou\": \"眼ん月堂\",\n        \"izumo gingatei\": \"出雲銀河亭\",\n        \"gedoudan\": \"外道团\",\n        \"garyuh-chitai\": \"我流痴带\",\n        \"tsf mousou chikusekijo\": \"TSF妄想蓄积所\",\n        \"ntype\": \"NtyPe\",\n        \"h.b\": \"H・B\",\n        \"star track\": \"★track\",\n        \"o.s\": \"O.S\",\n        \"wakame no oyatsu\": \"Wakame no Oyatsu\",\n        \"pantyhose\": \"パンティーHOSE\",\n        \"tomboy\": \"TomBoy\",\n        \"... mou ii desu.\": \"…もういいです。\",\n        \".7\": \".7\",\n        \".miz\": \".miz\",\n        \"0-parts\": \"0-PARTS\",\n        \"0123456789\": \"0123456789\",\n        \"02\": \"02\",\n        \"03-3297\": \"03-3297\",\n        \"04\": \"04\",\n        \"04th heaven\": \"04th Heaven\",\n        \"04u\": \"04U\",\n        \"0725co\": \"0725co\",\n        \"08base\": \"08BASE\",\n        \"096\": \"096\",\n        \"10-man bariki\": \"10マン馬力\",\n        \"10.10mhz\": \"10.10MHz\",\n        \"1000ap\": \"1000AP\",\n        \"100acre\": \"100Acre\",\n        \"100yenmofa\": \"100円外務省\",\n        \"102 goushitsu\": \"102号室\",\n        \"106gou\": \"106GOU\",\n        \"106m\": \"106m\",\n        \"10mile\": \"10mile\",\n        \"10pasec no kanata\": \"拾八secの彼方\",\n        \"10wadaxx\": \"10wadaxx\",\n        \"10yen jondo\": \"10円ジョンドゥ\",\n        \"110u\": \"いいお湯\",\n        \"112k\": \"112K\",\n        \"12-jigen\": \"12次元\",\n        \"12cut\": \"12CUT\",\n        \"12kaffeins\": \"12KAFFEINS\",\n        \"13cm\": \"13cm\",\n        \"148bpm\": \"148bpm\",\n        \"14lolita\": \"14ロリータ\",\n        \"152hertz\": \"152HERTZ\",\n        \"16 sai\": \"16彩\",\n        \"16000 all\": \"16000オール\",\n        \"16kenme\": \"16軒目\",\n        \"1756 studio\": \"1756スタジオ\",\n        \"17in\": \"17in\",\n        \"17w\": \"17W\",\n        \"180r\": \"180R\",\n        \"185 souko\": \"185倉庫\",\n        \"1bit\": \"1bit\",\n        \"1gaya\": \"1gaya\",\n        \"1or8\": \"イチカバチカ\",\n        \"2 carat\": \"2カラット\",\n        \"2000kcal shake club\": \"2000kcalシェイク同好会\",\n        \"209 goushitsu\": \"209号室\",\n        \"20liquid\": \"20LIQUID\",\n        \"20r0\": \"20R0\",\n        \"20twenty\": \"20twenty\",\n        \"231179rock\": \"231179=ROCK\",\n        \"241 inc.\": \"241 Inc.\",\n        \"273k\": \"273K\",\n        \"2b\": \"2B\",\n        \"2cv.ss\": \"2CV.SS\",\n        \"2d-note\": \"2D-Note\",\n        \"2h\": \"2H\",\n        \"2jimusubi\": \"二次結び\",\n        \"2m\": \"2m\",\n        \"2nd\": \"2ND\",\n        \"2nd life\": \"2nd Life\",\n        \"2p-color\": \"2P-Color\",\n        \"2stroke\": \"2ストローク\",\n        \"2tailqueen\": \"2tail Queen\",\n        \"2vs\": \"2vs\",\n        \"2zigen\": \"2ZIGEN\",\n        \"3 colors cat\": \"3 colors cat\",\n        \"3 colors corona\": \"3色コロナ\",\n        \"3 on 10\": \"3 on 10\",\n        \"3-2 gagen\": \"3-2画源\",\n        \"3-mega.ne\": \"3-MEGA.ne\",\n        \"3.5tousin\": \"3.5等身\",\n        \"300cm\": \"300cm\",\n        \"301 goushitsu\": \"301号室\",\n        \"30min-5000yen\": \"30分5000円ポッキリ\",\n        \"321go\": \"321go\",\n        \"360 degrees c\": \"360°C\",\n        \"36k\": \"36K\",\n        \"38shiki\": \"三十八式\",\n        \"39dmp\": \"39dmp\",\n        \"39xream\": \"ミックスリーム\",\n        \"3egg\": \"3egg\",\n        \"3jou\": \"3情\",\n        \"3lbox\": \"3LBOX\",\n        \"4.5space\": \"4.5space\",\n        \"40010 1-go\": \"40010壱号\",\n        \"4649 club\": \"4649苦愛\",\n        \"4dip\": \"4DIP\",\n        \"4or5 works\": \"よんかごわーくす\",\n        \"4season\": \"4season\",\n        \"4st injection\": \"4st Injection\",\n        \"5 06\": \"ゴー!マルロク\",\n        \"5 slash 4\": \"5/4\",\n        \"50000s\": \"五萬S\",\n        \"50on\": \"50on!\",\n        \"50pointcaliper\": \"50PointCaliper\",\n        \"5th library\": \"5th Library\",\n        \"5up\": \"5UP\",\n        \"64bit spectrum\": \"64bitスペクトル\",\n        \"64kbit\": \"64Kbit\",\n        \"66 no oka\": \"66の丘\",\n        \"662kb\": \"662KB\",\n        \"666-346\": \"666-346\",\n        \"666protect\": \"666プロテクト\",\n        \"69erotique\": \"69EROTIQUE\",\n        \"69hb\": \"69HB\",\n        \"6colors\": \"6COLORS\",\n        \"6x8breads\": \"6x8breads\",\n        \"7 colored led\": \"虹色発光ダイオード\",\n        \"7-ban no okimono\": \"7番の置物\",\n        \"707room\": \"707号室\",\n        \"73feti\": \"73フェチ\",\n        \"73gou koudou\": \"73号坑道\",\n        \"774 house\": \"774ハウス\",\n        \"7961shiki\": \"7961式\",\n        \"7fleur\": \"7Fleur\",\n        \"7menzippo\": \"7メンZippo\",\n        \"7th ark\": \"7th_arK\",\n        \"7th door\": \"7th Door\",\n        \"7th utopia\": \"7th utopia\",\n        \"8 no ji club\": \"8の字倶楽部\",\n        \"8 slash 7\": \"8/7\",\n        \"81dora\": \"81dora\",\n        \"86 saver\": \"86 SAVER\",\n        \"86cafe\": \"86珈琲店\",\n        \"88scones\": \"88scones\",\n        \"8cm\": \"8cm\",\n        \"8graphica\": \"エイトグラフィカ\",\n        \"8ji sugi\": \"8時すぎ\",\n        \"93bangai\": \"93番街\",\n        \"999 q-miz\": \"999 Q-miz\",\n        \"99mg\": \"99mg\",\n        \"9z\": \"9z\",\n        \"a\": \"Circle A\",\n        \"a 3103 hut\": \"a 3103 hut\",\n        \"a after school of silence\": \"沈黙の放課後\",\n        \"a cherry-blossom front\": \"A cherry-blossom front\",\n        \"a face\": \"a face\",\n        \"a hoimi\": \"a hoimi\",\n        \"a pear tree\": \"a pear tree\",\n        \"a taku studio takuno\": \"A TAKU STUDIO TAKUNO\",\n        \"a yellow aurora\": \"A Yellow Aurora\",\n        \"a-anima\": \"A-Anima\",\n        \"a-arinco\": \"A-arinco\",\n        \"a-hole\": \"A-HOLE\",\n        \"a-lucky murashige no ran\": \"A-Lucky☆村重の乱\",\n        \"a-mania9s\": \"A-mania9's\",\n        \"a-mw.\": \"A-mw.\",\n        \"a-office\": \"A-office\",\n        \"a.boc70\": \"a.boc70\",\n        \"a.c.g arts\": \"A.C.Gアーツ\",\n        \"a.l.c\": \"A.L.C\",\n        \"a.la.mode\": \"ア・ラ・モード\",\n        \"a.p. retriever\": \"A.P.レトリバー\",\n        \"a.p.yamamoh\": \"A.P.YAMAMOH\",\n        \"a.s.g group\": \"A・S・Gグループ\",\n        \"a.s.s\": \"A.S.S\",\n        \"a.u.forest\": \"A.U.FOREST\",\n        \"a.v. tokkoutai\": \"A.V.特攻隊\",\n        \"a2 lampshade\": \"A2 LAMPSHADE\",\n        \"a2-wing\": \"A2-WiNG\",\n        \"a440\": \"a440\",\n        \"aa aishiteru\": \"ああ愛してる\",\n        \"aa doushiyou\": \"あぁどうしよう\",\n        \"aa warera katou hayabusa sentoutai\": \"嗚呼、我等加藤隼戦斗隊\",\n        \"aaru\": \"アアル\",\n        \"ab normal\": \"あーびーのーまる\",\n        \"ab10\": \"AB10\",\n        \"abalone kiss\": \"ABALONE KISS\",\n        \"abara ga itai\": \"あばらが痛い\",\n        \"abarenbow tengu\": \"暴れん坊天狗\",\n        \"abaretabi\": \"暴れ旅\",\n        \"abbey load\": \"Abbey Load\",\n        \"abdg encirclement formation\": \"ABDG包囲網\",\n        \"abellcain\": \"アベルカイン\",\n        \"aberyu\": \"悪部流\",\n        \"abgrund\": \"abgrund\",\n        \"abigor\": \"アビゴール\",\n        \"abliss\": \"ABLISS\",\n        \"abonriya\": \"あぼんり屋\",\n        \"abradeli kami\": \"油照紙\",\n        \"absolute fantasy\": \"ABSOLUTE FANTASY\",\n        \"absorb\": \"アブそ～ぶ\",\n        \"abstract limit\": \"抽象境界\",\n        \"abunae koubou\": \"あぶな絵工房\",\n        \"abunai zeiniku\": \"あぶないぜいにく\",\n        \"aburasoba biyori\": \"あぶらそば日和\",\n        \"abyssdragon.\": \"AbyssDragon.\",\n        \"acchi no seikatsu\": \"あっちの生活\",\n        \"accidentbitterchocolate\": \"AccidentBitterChocolate\",\n        \"accolt\": \"accolt\",\n        \"ace enterprise\": \"Ace Enterprise\",\n        \"achromic\": \"Achromic\",\n        \"achumuchi\": \"あちゅむち\",\n        \"acid eaters\": \"ACID EATERS\",\n        \"acid noel\": \"Acid Noel\",\n        \"acidsea\": \"ACIDSEA\",\n        \"acid-head\": \"ACID-HEAD\",\n        \"acoram\": \"Acoram\",\n        \"action mokei\": \"アクション模型\",\n        \"active\": \"アクティブ\",\n        \"active sunrise\": \"あくてぃぶサンライズ\",\n        \"actively dawn\": \"ACTIVELY DAWN\",\n        \"actress\": \"アクトレス\",\n        \"actuator\": \"アクチュエーター\",\n        \"acute\": \"あきゅ〜と\",\n        \"ad-hoc\": \"Ad-Hoc\",\n        \"adabana\": \"徒花\",\n        \"adalt only\": \"成人向け\",\n        \"ade no shin\": \"あでのしん\",\n        \"adeyaka kunoichi-dan\": \"艶やかくノ一団\",\n        \"adnis\": \"ADNiS\",\n        \"adult house\": \"あだるとはうす\",\n        \"advance\": \"ADVANCE\",\n        \"advanced twinkle castle shinobi jou giga\": \"ADVANCEDトィンクル☆キャッスル+忍城GIGA\",\n        \"advanced-ss\": \"Advanced-SS\",\n        \"aeba fukashi\": \"饗庭淵\",\n        \"aegistone\": \"aegistone\",\n        \"aerial\": \"エアリアル\",\n        \"aerial rave\": \"AERIAL RAVE\",\n        \"aerial soul\": \"Aerial Soul\",\n        \"aerodog\": \"AERODOG\",\n        \"affidavit\": \"Affidavit\",\n        \"affix\": \"Affix\",\n        \"afj\": \"AFJ\",\n        \"after party\": \"after party\",\n        \"again.\": \"again.\",\n        \"ageage\": \"アゲ揚げ\",\n        \"ageku no hate no\": \"あげくの果ての\",\n        \"ago\": \"アゴ\",\n        \"agohimo yoika\": \"アゴヒモヨイカ\",\n        \"agoitei\": \"AGOI亭\",\n        \"ah.\": \"あー。\",\n        \"ahaan\": \"AHAAN\",\n        \"ahm\": \"AHM\",\n        \"ahoge\": \"あほ毛\",\n        \"ahou basha\": \"阿呆馬車\",\n        \"ahriman\": \"アーリマン\",\n        \"ahun\": \"アフン\",\n        \"ai no inu koujou\": \"愛の犬工場\",\n        \"ai no kura\": \"あいの倉\",\n        \"ai no senshi mimikaki\": \"愛の戦士みみかき\",\n        \"ai no sunatokei\": \"藍の砂時計\",\n        \"ai urara\": \"あいうらら\",\n        \"ai wa kurayami\": \"愛は暗闇\",\n        \"ai-chan no ozashiki\": \"あいちゃんのお座敷\",\n        \"aiai\": \"あいあい\",\n        \"aiaigasa\": \"あいあい傘\",\n        \"aida.\": \"間。\",\n        \"aidon raiki\": \"合丼来来\",\n        \"aienkien\": \"愛鉛奇縁\",\n        \"aigamodou\": \"あいがも堂\",\n        \"aigan shounen\": \"愛玩少年\",\n        \"aihara otome\": \"相原乙女\",\n        \"aiiro paradox\": \"藍色パラドックス\",\n        \"aiirojikan\": \"藍色時間\",\n        \"aiirosakura\": \"あいいろさくら\",\n        \"aik sole\": \"アイクソール\",\n        \"aikokusha\": \"愛国者\",\n        \"aikotobako\": \"アイコトバコ\",\n        \"aim\": \"AIM\",\n        \"aim-zero\": \"Aim-ZERO\",\n        \"aimaimemai\": \"あいまいめまい\",\n        \"aimaimoko\": \"曖昧模糊\",\n        \"aimasutei\": \"愛増庭\",\n        \"aimy\": \"Aimy\",\n        \"ainekokan\": \"愛猫缶\",\n        \"aiokougadou\": \"アイオコウガドウ\",\n        \"aion\": \"AION\",\n        \"air hike\": \"Air Hike\",\n        \"air plants\": \"Air Plants\",\n        \"air praitre\": \"AirФPraitre\",\n        \"air union\": \"AIR UNION\",\n        \"airily steps\": \"Airily Steps\",\n        \"airmusica\": \"AIRMUSICA\",\n        \"airyu\": \"あいりゅ\",\n        \"aitsu no tatebue\": \"あいつのたてぶえ\",\n        \"aiuea\": \"あいうえあ\",\n        \"aiviera\": \"アイヴィエラ\",\n        \"aiyamatarei\": \"あいやまたれい\",\n        \"aizou roman kikan\": \"愛憎浪漫機関\",\n        \"ajala\": \"戯アジャラ\",\n        \"ajapaa.\": \"あじゃぱー。\",\n        \"aje\": \"AJE\",\n        \"aji no hiraki\": \"あじのひらき\",\n        \"aji star\": \"鯵スター\",\n        \"aju ga mitsukarimasen\": \"あじゅが見つかりません\",\n        \"ajinomoto\": \"あじのもと\",\n        \"ajisaihuumitei\": \"紫陽花風味亭\",\n        \"aka\": \"aka\",\n        \"akaao\": \"あかあお\",\n        \"akabei soft\": \"AKABEi SOFT\",\n        \"akabei soft2\": \"あかべぇそふとつぅ\",\n        \"akabei soft3\": \"あかべぇそふとすりぃ\",\n        \"akachang time\": \"赤ちゃングタイム\",\n        \"akachi\": \"あかち\",\n        \"akacia\": \"AKACIA\",\n        \"akadama-ya\": \"赤玉屋\",\n        \"akadashi no misoshiru\": \"赤だしのみそ汁\",\n        \"akaeboshi\": \"アカエボシ\",\n        \"akagiridan\": \"あかぎり団\",\n        \"akagisou\": \"赤木荘\",\n        \"akagumotei\": \"朱雲亭\",\n        \"akahira kirin\": \"あかひら麒麟\",\n        \"akai chi to tetsu no roudousha tou\": \"赤い血と鉄の労働者党\",\n        \"akai hitomi to aoi tsuki\": \"紅い瞳と蒼い月\",\n        \"akai kitsune\": \"アカイキツネ\",\n        \"akai marlboro\": \"赤いマルボロ\",\n        \"akai muffler\": \"赤いマフラー\",\n        \"akai syohousen\": \"赤い処方箋\",\n        \"akai tsubasa\": \"赤い翼\",\n        \"akaihoho\": \"akaihoho\",\n        \"akairo mambo\": \"赤色まんぼー\",\n        \"akaironomahou\": \"あかいろのまほう\",\n        \"akamiru\": \"Akamiru\",\n        \"akamuni.\": \"あかむに。\",\n        \"akanagi\": \"あかなぎ\",\n        \"akane shuuhei dou\": \"茜しゅうへい堂\",\n        \"akaneko\": \"赤猫\",\n        \"akanoiki\": \"赤の域\",\n        \"akari wa honnori tomoreba ii\": \"明かりはほんのり灯ればいい\",\n        \"akaringo-chan\": \"あかりんごちゃん\",\n        \"akarui sm\": \"明るいSM\",\n        \"a-ka-sa-works\": \"あかさ製作所\",\n        \"akashitei\": \"あかし亭\",\n        \"akatama\": \"アカタマ\",\n        \"akatsuki akaza dou\": \"赤月赤座堂\",\n        \"akatsuki katsuie no circle\": \"暁勝家ノサークル\",\n        \"akatsuki works\": \"暁WORKS\",\n        \"akatsuki doumei\": \"アカツキドウメイ\",\n        \"aki no yonaga ni yoiyami ni\": \"秋の夜長に宵闇に\",\n        \"aki6666\": \"AKI6666\",\n        \"akifumi-chan\": \"あきふみちゃん\",\n        \"akikan\": \"アキカン\",\n        \"akino melpa\": \"アキノメルパ\",\n        \"akisame moyashi\": \"あきさめ萌やし\",\n        \"akisora\": \"秋空\",\n        \"akitaka seinikuten\": \"あきたか贅肉店\",\n        \"akitaku kikaku\": \"アキタク＊キカク\",\n        \"akitarainu\": \"あきたらいぬ\",\n        \"akitsuki\": \"秋月\",\n        \"akiya\": \"空屋\",\n        \"akiyama production\": \"アキヤマ興業\",\n        \"akkan-bi project\": \"あっかんBi～\",\n        \"akou kurou\": \"アコウクロウ\",\n        \"akoyagai to aumale ebi\": \"あこや貝とオマールえび\",\n        \"akuheki\": \"悪癖\",\n        \"akuma no ehon hakushu dan\": \"悪魔の絵本拍手団\",\n        \"akuma toshi keikaku\": \"悪魔都市計画\",\n        \"akumara\": \"あくまら\",\n        \"akumaster\": \"Akumaster\",\n        \"akunaki hourou\": \"あくなき放浪\",\n        \"akunomangakarenmei\": \"悪の漫画家連盟\",\n        \"akuochisukii kyoushitsu\": \"アクオチスキー教室\",\n        \"akuta space\": \"あくたスペース\",\n        \"akuyukai\": \"悪遊怪\",\n        \"akys honpo\": \"AKYS本舗\",\n        \"al dente\": \"あるでんて\",\n        \"albatross\": \"あるばとろす\",\n        \"albercorp.\": \"あるばーCorp.\",\n        \"albino no yuuhatsu\": \"アルビノの融発\",\n        \"albireo 7\": \"あるびれお7\",\n        \"alchemist works\": \"Alchemist works\",\n        \"alfalfa\": \"alfalfa\",\n        \"ali-san maku\": \"ALIさんマーク\",\n        \"alibi\": \"アリバイ\",\n        \"alice complex\": \"Alice Complex\",\n        \"alice digital factory\": \"Alice Digital Factory\",\n        \"alice-do\": \"ありす堂\",\n        \"alice.blood\": \"Alice.Blood\",\n        \"aliceflag\": \"AliceFlag\",\n        \"alicegarden\": \"AliceGarden\",\n        \"alicemiller\": \"alicemiller\",\n        \"alicetale\": \"ありすている♪\",\n        \"alikui v line\": \"ありくいVライン\",\n        \"alisex\": \"alisex\",\n        \"alkaloid no baketu\": \"アルカロイドノバケツ\",\n        \"all over the place.\": \"all over the Place.\",\n        \"all-time\": \"ALL-TiME\",\n        \"allbyte\": \"AllByte\",\n        \"allegro launcher\": \"アレグロランチャー\",\n        \"allium tuberosum\": \"Allium tuberosum\",\n        \"allo\": \"allo\",\n        \"almanacco\": \"almanacco\",\n        \"almism\": \"ALMISM\",\n        \"almond republic\": \"あーもんど共和国\",\n        \"almond to kyogyuunyuu\": \"アーモンドと巨牛乳\",\n        \"aloha soft\": \"あろはそふと\",\n        \"alpa\": \"ALPA\",\n        \"alpaca unit\": \"ALPACA Unit\",\n        \"alpha to yukaina nakamatachi\": \"有葉と愉快な仲間たち\",\n        \"alpha-beta\": \"alpha-beta\",\n        \"alps\": \"アルプス興業\",\n        \"alsetro\": \"ALSeTRO\",\n        \"alsiel\": \"Alsiel\",\n        \"alt\": \"ALT\",\n        \"alte notiz\": \"あるてのてぃつ\",\n        \"alter maschine\": \"Alter Maschine\",\n        \"altergott\": \"Altergott\",\n        \"alto letzel\": \"あるとれっつぇる\",\n        \"alto realize\": \"Alto realize\",\n        \"altopia\": \"アルトピア\",\n        \"altron\": \"アルトロン\",\n        \"alumi soft\": \"あるみそふと\",\n        \"alumican\": \"あるみかん\",\n        \"am colon tiger\": \"AM:TIGER\",\n        \"amaama-tei\": \"甘々亭\",\n        \"amadeus no isan\": \"アマデウスの遺産\",\n        \"amadoiza\": \"雨樋座\",\n        \"amadoki\": \"雨時\",\n        \"amagaeru to sprocket\": \"雨蛙とスプロケット\",\n        \"amagasa touge\": \"雨傘峠\",\n        \"amagashi\": \"甘菓子\",\n        \"amagi an ironworks\": \"天城製鉄所\",\n        \"amagoi koubou\": \"雨乞い工房\",\n        \"amai wakusei\": \"あまい惑星\",\n        \"amaichigo\": \"あまいちご\",\n        \"amairo denshi koubou\": \"天色電子工房\",\n        \"amakasas\": \"Amakasas\",\n        \"amakashi\": \"アマカシ\",\n        \"amakaya\": \"天香屋\",\n        \"amakuchi\": \"あまくち\",\n        \"amakura89gou ten\": \"天倉89号店\",\n        \"amakuro okami\": \"あまくろ狼\",\n        \"amakurodou\": \"甘黒堂\",\n        \"amam\": \"AMAM\",\n        \"amamin koubou\": \"あまみん工房\",\n        \"amanatsu mix\": \"あまなつミックス\",\n        \"amanatsu quality\": \"甘夏クオリテ\",\n        \"amanatsuya\": \"天夏屋\",\n        \"amanogawa tsuushin\": \"天の川通信\",\n        \"amanojaku\": \"天ノ邪鬼\",\n        \"amaon\": \"amaon\",\n        \"amaoto rensa yohou\": \"雨音連鎖予報\",\n        \"amapoteya\": \"あまぽて屋\",\n        \"amarini senpaku\": \"あまりにセンパク!\",\n        \"amatosui\": \"甘桃水\",\n        \"amatou continue\": \"甘党こんてぃにゅー\",\n        \"amatsu hanten opi\": \"天津反転OPi!\",\n        \"amatsukami\": \"アマツカミ\",\n        \"amayadori plus\": \"AMAYADORI+\",\n        \"amazake resonance\": \"甘酒レゾナンス\",\n        \"amazawa kingdom\": \"AMAZAWA KINGDOM\",\n        \"amazingsweets\": \"Amazing Sweets\",\n        \"ambience\": \"ambience\",\n        \"ambivalence\": \"AMBIVALENCE\",\n        \"ambivalent-e\": \"Ambivalent-E\",\n        \"ambivalenz\": \"AmBiVaLenZ\",\n        \"ame hotel\": \"AMEホテル\",\n        \"ame no aji\": \"雨の味\",\n        \"ame no murakumo\": \"アメノムラクモ\",\n        \"ame no nikki\": \"雨のにっき\",\n        \"amecir\": \"あめさー\",\n        \"amedamazakura\": \"飴玉桜\",\n        \"amefurasy\": \"amefurasy\",\n        \"amefuri canvas\": \"雨ふりキャンバス\",\n        \"ameiro biscuit\": \"飴色ビスケット\",\n        \"amemizu\": \"あめみず\",\n        \"ameno oukan\": \"雨の王冠\",\n        \"amenyan-tai\": \"あめにゃん隊\",\n        \"ameyama telegraph\": \"雨山電信社\",\n        \"ami-dabutsu\": \"ami-だぶつ\",\n        \"aminendo\": \"あみねんど\",\n        \"ammolite\": \"アンモライト\",\n        \"amorphous innocent fiction\": \"AMORPHOUS innocent fiction\",\n        \"ampullaria\": \"あんぷらりあ\",\n        \"amrita\": \"AMRITA\",\n        \"amuamu tiger\": \"あむあむタイガー\",\n        \"amulet\": \"あみゅれっと\",\n        \"amuse craft erotica\": \"アミューズクラフトエロチカ\",\n        \"ana\": \"ANA\",\n        \"ana futatsu\": \"穴ふたつ\",\n        \"anagura\": \"穴蔵\",\n        \"anal crisis\": \"アナル☆クライシス\",\n        \"analcime\": \"アナルシム\",\n        \"analog e.c.\": \"アナログE.C.\",\n        \"analog store\": \"あなろぐストア\",\n        \"ananas dolce\": \"Ananas Dolce\",\n        \"ananwanco\": \"あんあんわんこ\",\n        \"anapom\": \"ANAPOM\",\n        \"anarchy gangsta\": \"アナーキーギャングスタ\",\n        \"anarcomix\": \"ANARCOMIX\",\n        \"anchor\": \"ANCHOR\",\n        \"andante\": \"あんだんて\",\n        \"anegaoka sanchoume\": \"姉ヶ丘三丁目\",\n        \"anemitsu\": \"あねみつ\",\n        \"anemone\": \"Anemone\",\n        \"aneurysm.\": \"あにゅうりずむ。\",\n        \"anfini\": \"ANFINI\",\n        \"ange\": \"アンジェ\",\n        \"angel bless\": \"Angel Bless\",\n        \"angel of blue sky\": \"Angel of Blue Sky\",\n        \"angelic feather\": \"天使の羽\",\n        \"angelphobia\": \"angelphobia\",\n        \"angensou\": \"黯幻想\",\n        \"anglachel\": \"アングラヘル\",\n        \"angler soft\": \"アングラーソフト\",\n        \"angora doll\": \"Angora doll\",\n        \"ani ga saru\": \"兄が猿\",\n        \"aniki otokodou\": \"兄貴漢堂\",\n        \"anim\": \"Anim\",\n        \"animal herb\": \"あにまるハーブ\",\n        \"animal passion\": \"Animal Passion\",\n        \"animal service\": \"アニマルサービス\",\n        \"animalism\": \"あにまりずむ\",\n        \"animankan\": \"アニマン館\",\n        \"anime brothers\": \"アニメブラザーズ\",\n        \"animeeru\": \"あにめーる\",\n        \"ankake cha-han\": \"あんかけCha-haN\",\n        \"ankake chameshi\": \"あんかけチャメシ\",\n        \"ankanke\": \"安閑家\",\n        \"ankimo factory\": \"あんきも工房\",\n        \"anko koubou\": \"あんこ工房\",\n        \"ankoku azumaya\": \"暗黒あずまや\",\n        \"ankoku marimokan\": \"アンコクマリモカン\",\n        \"ankoku-bousougumi\": \"暗黒暴走組\",\n        \"ankoya\": \"アンコ屋\",\n        \"anmin koutou benmukan jimusho\": \"安眠高等弁務官事務所\",\n        \"anmitsuya\": \"あんみつや\",\n        \"annee suplex\": \"あんねーすーぷれっくす\",\n        \"annin\": \"杏仁\",\n        \"annon club\": \"安穏倶楽部\",\n        \"anons flood myth\": \"あのんの大洪水伝説\",\n        \"anonymax\": \"あのにまっくす\",\n        \"anoprimal\": \"アノプライマル\",\n        \"anorak post\": \"Anorak Post\",\n        \"another story\": \"Another Story\",\n        \"another world\": \"Another World\",\n        \"ant colony\": \"蟻の巣\",\n        \"antares\": \"ANTARES\",\n        \"antidying\": \"AntiDying\",\n        \"antineed\": \"ANTINEED\",\n        \"anxious delusionist\": \"アンキデ\",\n        \"anya\": \"ANYa\",\n        \"anysing world\": \"ANYSING WORLD\",\n        \"anything\": \"anything\",\n        \"anzen daiichi\": \"安全第一\",\n        \"anzen ekisu\": \"安全えきす\",\n        \"anzen na buffalo\": \"安全なバッファロー\",\n        \"anzeri kai\": \"アンゼリ会\",\n        \"anzu ame\": \"あんず飴\",\n        \"ao hana\": \"青華\",\n        \"ao niwashi\": \"青庭師\",\n        \"ao no oto\": \"青ノ音\",\n        \"aoaa\": \"AOAA\",\n        \"aoba q madou\": \"青葉Q魔洞\",\n        \"aoboshi\": \"青星\",\n        \"aodiso kankou\": \"青ぢそ甘工\",\n        \"aohibachi\": \"アオヒバチ\",\n        \"aohimo familia\": \"アオヒモファミリア\",\n        \"aoi\": \"AOI\",\n        \"aoi dennou\": \"アオイ電脳\",\n        \"aoi no ie\": \"葵の家\",\n        \"aoi project\": \"AOI PROJECT\",\n        \"aoikitoiki.\": \"青息吐息。\",\n        \"aoiro hakkyou diode\": \"青色ハッキョウダイオード\",\n        \"aoiro ichiza\": \"青色一座\",\n        \"aoirobindume\": \"青色瓶詰\",\n        \"aoirotone works\": \"Aoirotone works\",\n        \"aoiten\": \"青い点\",\n        \"aokumashii\": \"アオクマシー\",\n        \"aomayu\": \"あおまゆ\",\n        \"aomi dream maker\": \"あおみどりーむめーかー\",\n        \"aomidori\": \"蒼見鳥\",\n        \"aonatsusou\": \"蒼夏荘\",\n        \"aotokage\": \"青蜥蜴\",\n        \"aotsukitei\": \"蒼月亭\",\n        \"aoyama seisaku\": \"青山制作所\",\n        \"aozakura\": \"蒼桜\",\n        \"aozora market\": \"蒼空市場\",\n        \"aozora no mieru chikashitsu\": \"青空の見える地下室\",\n        \"apadash\": \"アパダッシュ\",\n        \"apatheia\": \"APATHEIA\",\n        \"aperitif\": \"Aperitif\",\n        \"aphrodite\": \"あふろでぃ～て\",\n        \"aphrodite fan club\": \"アフロディーテファンクラブ\",\n        \"apika\": \"apika\",\n        \"aplysia-gumi\": \"Aplysia組\",\n        \"apocolotte\": \"ApoCoLotte\",\n        \"apocrine.\": \"あぽくりん。\",\n        \"apokari\": \"あぽかり\",\n        \"apollo\": \"APOLLO\",\n        \"apple mint leaves\": \"あっぷるみんとのは\",\n        \"apple pie\": \"アップルパイ\",\n        \"apple rooftop\": \"あっぷる屋上\",\n        \"apple water\": \"Apple Water\",\n        \"applecat\": \"あっぷるきゃっと\",\n        \"applesoft\": \"アップルソフト\",\n        \"applique\": \"あっぷりけ\",\n        \"apricot\": \"apricot\",\n        \"apricot cherry\": \"Apricot Cherry\",\n        \"apricot sirup\": \"あんずシロップ\",\n        \"apricottea\": \"APRICOTTEA\",\n        \"apsara project\": \"あぷさらproject\",\n        \"apsis\": \"apsis\",\n        \"apupop\": \"apupop\",\n        \"apurikokko\": \"あぷりこっこ\",\n        \"aq rotation\": \"AQローテーション\",\n        \"aqua create\": \"AQUA CREATE\",\n        \"aqua space\": \"AQUA SPACE\",\n        \"aqua-baiser\": \"Aqua-baiser\",\n        \"aquadriver\": \"アクアドライバー\",\n        \"aquamarine\": \"あくあまりん\",\n        \"aquapit\": \"あくあぴっと\",\n        \"aquarium\": \"アクアリウム\",\n        \"aquarius gate\": \"Aquarius Gate\",\n        \"aquaver\": \"AQUA:VER\",\n        \"aquilegia\": \"Aquilegia\",\n        \"aquilno-zeroex\": \"あきるのぜろえっくす\",\n        \"aqukan\": \"亜空間\",\n        \"ar da coda\": \"あ～だこ～だ\",\n        \"arachnomania\": \"あらくの☆まにあ\",\n        \"arafuradou\": \"アラフラ胴\",\n        \"arahabaki\": \"アラハバキ\",\n        \"arakiya-san\": \"あらき屋さん\",\n        \"arakureta monotachi\": \"あらくれた者たち\",\n        \"araragi-1071-\": \"ARARAGI-1071-\",\n        \"ararudaito\": \"あらるだいと\",\n        \"arc\": \"ARC\",\n        \"arc slash turbine\": \"ARC/TURBINE\",\n        \"arcana club\": \"あるかな倶楽部\",\n        \"arch\": \"ARCH\",\n        \"archangel\": \"ARCHANGEL\",\n        \"archea\": \"archea\",\n        \"archf\": \"ARCHF\",\n        \"arcon\": \"あるこん\",\n        \"arcs\": \"ArcS\",\n        \"arctangent\": \"ARCTANGENT\",\n        \"arctic char\": \"Arctic Char\",\n        \"arctic pan\": \"北極鍋\",\n        \"are.\": \"あれ。\",\n        \"area-048\": \"Area-048\",\n        \"area-s\": \"Area-S\",\n        \"area188\": \"エリア188\",\n        \"area50\": \"Area50\",\n        \"area7\": \"えりあ7\",\n        \"arearee\": \"あれあれえ\",\n        \"areya\": \"あれ屋\",\n        \"argon\": \"アルゴン\",\n        \"argonauts\": \"Argonauts\",\n        \"argyle\": \"アーガイル\",\n        \"argyle check\": \"Argyle◇check\",\n        \"aria\": \"Aria\",\n        \"aria corporation\": \"アリアコーポレーション\",\n        \"arianrhod\": \"Arianrhod\",\n        \"ariari no nashinashi\": \"ありありのなしなし\",\n        \"arieroof\": \"Arieroof\",\n        \"arigatou\": \"ありが党\",\n        \"arikamatou\": \"ありかま糖\",\n        \"arikui mcqueen\": \"アリクイマックィーン\",\n        \"arimax\": \"アリマックス\",\n        \"arinotowatari\": \"ありのとわたり\",\n        \"arisan-antenna\": \"ありさんアンテナ\",\n        \"ark emerald\": \"Ark Emerald\",\n        \"arkadia\": \"ARKADIA\",\n        \"arkizm\": \"arkizm*\",\n        \"armanium\": \"あるまにうむ\",\n        \"armeria\": \"Armeria\",\n        \"armored ginkakuji\": \"アーマードギンカクジ\",\n        \"armored namamono\": \"アーマードなまもの\",\n        \"aroma terrace\": \"あろまてらす\",\n        \"aromatic girl\": \"aromatic girl\",\n        \"arpeggio\": \"あるぺじお\",\n        \"arsenothelus\": \"アルセノテリス\",\n        \"art en ciel.\": \"art en ciel.\",\n        \"art equals theater\": \"ART=THEATER\",\n        \"art jam\": \"Art Jam\",\n        \"artichoke\": \"artichoke\",\n        \"article 60 of criminal code\": \"刑法第60条\",\n        \"artificial eden\": \"Artificial Eden\",\n        \"arts graffiti\": \"アーツグラフィティ\",\n        \"aru-run\": \"あるるん\",\n        \"arubain\": \"あるばいん\",\n        \"aruchisuto\": \"アルチスト\",\n        \"aruheito\": \"あるへゐと\",\n        \"aruk9\": \"アルK9\",\n        \"arukaseya\": \"歩かせ屋\",\n        \"arumi seigen b-chiku\": \"アルミ制限B地区\",\n        \"arunekoki\": \"歩猫記\",\n        \"arutana\": \"あるたな\",\n        \"as known as\": \"as known as\",\n        \"as mission imphal\": \"インパール作戦\",\n        \"as-zadkiel\": \"As-Zadkiel\",\n        \"asa club\": \"あさクラブ\",\n        \"asabadou\": \"浅葉堂\",\n        \"asadukuyo no utage\": \"朝月夜の宴\",\n        \"asagayatei\": \"あさがや亭\",\n        \"asagindo\": \"あさぎん堂\",\n        \"asai kikaku\": \"あさい企画\",\n        \"asairo milktea\": \"朝色みるくちー\",\n        \"asaiumi\": \"浅い海\",\n        \"asakawa hetero\": \"麻川ヘテロ\",\n        \"asaki blog branch office\": \"朝木blog出張所\",\n        \"asaki yumemishi\": \"あさきゆめみし\",\n        \"asanebou crisis\": \"朝寝坊クライシス\",\n        \"asanegi shouten\": \"麻根木商店\",\n        \"asapi-keikaku.\": \"あさぴ計画。\",\n        \"asatsukimint\": \"アサツキミント\",\n        \"asg-project\": \"ASG-Project\",\n        \"ashanti\": \"アシャンティ\",\n        \"ashi zanmai\": \"あしざんまい\",\n        \"ashibububu\": \"あしぶぶぶ\",\n        \"ashima sandou\": \"芦間山道\",\n        \"ashinoie\": \"あしの家\",\n        \"ashiromance\": \"Ashiromance\",\n        \"ashitakara-ganbaru\": \"あしたから頑張る\",\n        \"ashiya\": \"脚屋\",\n        \"ashly\": \"ashly\",\n        \"ashtray\": \"ASHTRAY\",\n        \"ashuradou\": \"阿修羅堂\",\n        \"ashuraya\": \"阿修羅屋\",\n        \"asianboy\": \"ASIANBOY\",\n        \"asiangirl\": \"ASIANGIRL\",\n        \"ask\": \"ASK\",\n        \"askot\": \"askot\",\n        \"asma\": \"ASMA\",\n        \"asmodeus seiyaku\": \"アスモデウス製薬\",\n        \"asnaronyoichi\": \"あすなろにょいち\",\n        \"asonerikes\": \"アソネリケス\",\n        \"aspara noujou\": \"アスパラ農場\",\n        \"aspergillus\": \"Aspergillus\",\n        \"assaultbeer\": \"アサルトビア\",\n        \"assistreplaytime\": \"A.R.T\",\n        \"asterism\": \"アステリズム\",\n        \"astllatte\": \"アストラッテ\",\n        \"astras\": \"ASTRA'S\",\n        \"astrological sign\": \"Astrological Sign\",\n        \"astronauts alya\": \"アストロノーツ・アリア\",\n        \"astronauts comet\": \"アストロノーツ・コメット\",\n        \"astronomy\": \"ASTRONOMY\",\n        \"asuken\": \"明日軒\",\n        \"asumo koubou\": \"あすも工房\",\n        \"asunaro\": \"ASUNARO\",\n        \"asunaro neat.\": \"Asunaro Neat.\",\n        \"at kenkyuujo\": \"AT研究所\",\n        \"at mousse\": \"あっとむーす\",\n        \"at simapan\": \"@SIMAPAN+\",\n        \"atarime jerky\": \"あたりめジャーキー\",\n        \"atariya kyoushitsu\": \"アタりや教室\",\n        \"atelier bord\": \"Atelier Bord\",\n        \"atelier comet\": \"アトリエコメット\",\n        \"atelier curlicue\": \"Atelier Curlicue\",\n        \"atelier dew\": \"Atelier:Dew\",\n        \"atelier honkijiru\": \"あとりえ本気汁\",\n        \"atelier kaguya cheshirecat\": \"アトリエかぐや CheshireCat\",\n        \"atelier kirara\": \"Atelier Kirara\",\n        \"atelier lepus\": \"あとりえれーぷす\",\n        \"atelier m\": \"アトリエM\",\n        \"atelier sava\": \"アトリエサヴァ\",\n        \"atelier tiv artworks\": \"atelier Tiv artworks\",\n        \"atelier yang\": \"あとりえ・ヤン\",\n        \"atelier-d\": \"atelier-D\",\n        \"atelierkk\": \"あとりえKK\",\n        \"ateliermarl\": \"AtelierMARL\",\n        \"atemonai heya\": \"あてもない部屋\",\n        \"atempo\": \"atempo\",\n        \"aterut\": \"アテレート\",\n        \"ather\": \"エーテル\",\n        \"atkinson\": \"アトキンソン\",\n        \"atmosphere\": \"アトモスフィア\",\n        \"ato nana fun\": \"あと7分\",\n        \"atolier tougenkyou\": \"アトリエ桃源郷\",\n        \"atori akinao\": \"あとり秋尚\",\n        \"atorie rinbou\": \"アトリエ リンボウ\",\n        \"atrip\": \"atrip\",\n        \"ats\": \"ATS\",\n        \"atsd\": \"atSD\",\n        \"atsuatsucook\": \"あつあつCOOK\",\n        \"atsugari giyuugun\": \"あつがり義勇軍\",\n        \"atsuki nettaiya\": \"アつき熱帯夜\",\n        \"attamaro\": \"あったまろ。\",\n        \"attic\": \"ATTIC\",\n        \"attic work space\": \"ATTIC WORK SPACE\",\n        \"au pied\": \"au pied\",\n        \"aug18\": \"aug18\",\n        \"aurelia\": \"オーレリア\",\n        \"auroramix\": \"オーロラミックス\",\n        \"auta moon\": \"あうたむーん\",\n        \"authoring heaven\": \"オーサリングヘヴン\",\n        \"autobahn\": \"Autobahn\",\n        \"automa kikyuu\": \"オートマ気球\",\n        \"autonoe\": \"Autonoe\",\n        \"autoroo\": \"あうとろー\",\n        \"av\": \"サークルAV\",\n        \"avalon\": \"Avalon\",\n        \"avantgarde\": \"AVANTGARDE\",\n        \"avion village\": \"アビオン村\",\n        \"avion village f\": \"アビオン村F\",\n        \"awatsu retsudou\": \"粟津烈堂\",\n        \"ax\": \"あっくす\",\n        \"axis\": \"AXIS\",\n        \"axl\": \"AXL\",\n        \"axolotl\": \"アホロートル\",\n        \"aya pon\": \"あやPON\",\n        \"ayafujii private circle\": \"藤井あや個人サークル\",\n        \"ayamegaoka\": \"文目ヶ丘\",\n        \"ayashige dan\": \"あやしげ団\",\n        \"ayashii ayakashi\": \"アヤシイアヤカシ\",\n        \"ayashii bochi\": \"あやしい墓地\",\n        \"ayashii thigh high ongakutai\": \"怪しいサイハイ音楽隊\",\n        \"ayashii yatsura\": \"あやしいやつら\",\n        \"ayasii hon-ya\": \"あやしい本屋\",\n        \"ayatsuri-doom\": \"​文釣DOOM\",\n        \"ayayabidou\": \"あややび堂\",\n        \"azarashi waltz\": \"あざらしワルツ\",\n        \"azarashisoft\": \"海豹社\",\n        \"azasuke wind\": \"AZASUKE WIND\",\n        \"azcat\": \"azcat\",\n        \"azelye\": \"AzeLye\",\n        \"azi dahaka\": \"アジダハーカ\",\n        \"azksb\": \"あずきそーば。\",\n        \"azmaya\": \"azmaya\",\n        \"aztec theater\": \"Aztec Theater\",\n        \"azuki land\": \"あづきらんど\",\n        \"azuki monaka\": \"あずきもなか\",\n        \"azuki shot\": \"AZUKI SHOT\",\n        \"azuki yougashiten\": \"小豆洋菓子店\",\n        \"azukimanma\": \"あずきまんま\",\n        \"azul\": \"Azul\",\n        \"azuma doujou\": \"東道場\",\n        \"azumaya matsukaze\": \"あずまや松風\",\n        \"azumaya shiten\": \"アズマ屋支店\",\n        \"azure\": \"Azure\",\n        \"azure bekkan\": \"あずれ別館\",\n        \"azure lapis\": \"あずーるらぴす\",\n        \"azurite\": \"Azurite\",\n        \"b kaiman\": \"Bカイマン\",\n        \"b side\": \"B:side\",\n        \"b-bishop\": \"B-bishop\",\n        \"b-crews\": \"Bクルーズ\",\n        \"b-dash jump\": \"B-Dash Jump\",\n        \"b-kyuu kasen\": \"B級河川\",\n        \"b-kyuu site\": \"B級サイト\",\n        \"b-led\": \"B-LED\",\n        \"b-wa\": \"B-wa\",\n        \"b.s.k\": \"B.S.K\",\n        \"b3\": \"B3\",\n        \"b5 doumei\": \"B5同盟\",\n        \"bababalunch\": \"バババランチ\",\n        \"baby replay\": \"ベイビーリプレイ\",\n        \"babybed\": \"ベビーベッド\",\n        \"babylook.net\": \"BabyLook\",\n        \"babymaker\": \"べびーめいかー\",\n        \"babypink\": \"ベイビーピンク\",\n        \"bacchustab\": \"BacchusTAB\",\n        \"backraze\": \"BACKRAZE\",\n        \"backyourluck\": \"ばっくゆあらっく\",\n        \"bad company\": \"ばっどかんぱにー\",\n        \"bad end rst\": \"ばっどえんどRST\",\n        \"bad friend\": \"BAD FRIEND\",\n        \"bad mushrooms\": \"坏茸社\",\n        \"badcore\": \"バッドコア\",\n        \"badis badis\": \"バジスバジス\",\n        \"baguri koubou\": \"馬栗工房\",\n        \"baguri sangyou\": \"馬栗産業\",\n        \"baidou tenpurya\": \"梅洞てんぷりゃー\",\n        \"baka to hasa me\": \"バカトハサミ\",\n        \"bakaitei\": \"馬隗亭\",\n        \"bakemonogakari\": \"ばけものがかり\",\n        \"bakuchi jinsei sp\": \"博打人生SP\",\n        \"bakugeki monkeys\": \"爆撃モンキース\",\n        \"bakuhatsu brs.\": \"ばくはつBRS.\",\n        \"bakuhatsu market\": \"爆発まーけっと\",\n        \"bakunyuu bitch sei\": \"爆乳ビッチ生\",\n        \"bakuretsu shichouson\": \"爆裂市町村\",\n        \"bakushiishi\": \"ばくしぃし\",\n        \"balklash.\": \"バルクラッシュ\",\n        \"banana king\": \"バナナキング\",\n        \"banana no kawa\": \"ばななのかわ\",\n        \"banana saruen\": \"ばななサル園\",\n        \"banana trip\": \"BANANAとりっぷ\",\n        \"bananajam\": \"ばななじゃむ\",\n        \"bananatart\": \"ばななたると\",\n        \"bananer milion\": \"ばななーみりおん\",\n        \"bandit\": \"BANDIT\",\n        \"bang\": \"banG\",\n        \"bangeya\": \"BANGEYA\",\n        \"bannoutumayoujiire\": \"バンノウツマヨウジイレ\",\n        \"banny pop\": \"BANNYぽっぷ\",\n        \"banri no syoujo\": \"万里の少女\",\n        \"bansanchi\": \"ばんさんち\",\n        \"bansankan\": \"バンサンカン\",\n        \"bantendou shoten\": \"卍天堂書店\",\n        \"banubeefriends\": \"BanubeeFriends\",\n        \"banyu\": \"万有\",\n        \"banyuu\": \"万有\",\n        \"baobabu\": \"ばおばぶ\",\n        \"bar modoshiyu\": \"BAR戻し湯\",\n        \"barbaroi no sato\": \"バルバロイの里\",\n        \"barista\": \"バリスタ\",\n        \"barko\": \"Barko\",\n        \"baroque\": \"baroQue\",\n        \"baroqupid\": \"BAROQUPID\",\n        \"bartholin sendan\": \"バルトリン船団\",\n        \"barusan\": \"バルサン\",\n        \"baseson light\": \"BaseSon Light\",\n        \"bash-inc\": \"Bash-inc\",\n        \"basic champions\": \"BASIC CHAMPIONS\",\n        \"basilisk trapezohedron\": \"バジリスクトラペゾヘドロン\",\n        \"baskindam kingdom\": \"バスキンダム王国\",\n        \"batachiki\": \"バタチキ\",\n        \"batchaya\": \"ばっちゃ屋\",\n        \"batsu freak\": \"Batsu freak\",\n        \"batsu jirushi\": \"ばつ印\",\n        \"batten sketch\": \"ばってんスケッチ\",\n        \"bb\": \"BB\",\n        \"bbb\": \"BBB\",\n        \"bbb-extra\": \"BBBえくすとら\",\n        \"bbg\": \"BBG\",\n        \"bbuttondash\": \"BBUTTONDASH\",\n        \"bear tail\": \"べあている\",\n        \"bear-bear\": \"BEAR-BEAR\",\n        \"bears cave\": \"Bear's Cave\",\n        \"beast trail\": \"Beast Trail\",\n        \"beat-pop\": \"BEAT-POP\",\n        \"beats beasts partners\": \"Beats Beasts Partners\",\n        \"beautiful snow\": \"Beautiful Snow\",\n        \"beberoncino sei\": \"ベベロンチーノ星\",\n        \"bect\": \"BECT\",\n        \"bee light\": \"BEe Light\",\n        \"beelzebub\": \"ベルゼブブ\",\n        \"beenyan\": \"び～にゃん\",\n        \"beer bear\": \"BEER BEAR\",\n        \"beer kuzu brothers\": \"ビールクズブラザーズ\",\n        \"behind moon\": \"Behind Moon\",\n        \"beicon\": \"ベイコン\",\n        \"beigon\": \"ベイゴン\",\n        \"bekkoame.\": \"べっこあめ。\",\n        \"bell no su\": \"ベルの巣\",\n        \"bell-da\": \"BELL-DA\",\n        \"belphegor no 39\": \"ベルフェゴールの39\",\n        \"beni\": \"紅-beni-\",\n        \"beni jake soran\": \"紅鮭ソーラン\",\n        \"benichigaya\": \"べにちが屋\",\n        \"benikurage\": \"べにくらげ\",\n        \"benisuzumedo\": \"紅雀堂\",\n        \"beraidot\": \"ベライドット\",\n        \"bergamot\": \"べるがもっと\",\n        \"bergmund\": \"ベルクムント\",\n        \"beropepe\": \"Beropepe\",\n        \"berry 16\": \"Berry!16\",\n        \"berry bagel\": \"BERRY BAGEL\",\n        \"berry lollipop\": \"Berry Lollipop\",\n        \"berserker\": \"バーサーカー\",\n        \"besshun-tei\": \"べっしゅん亭\",\n        \"bhm\": \"BHM\",\n        \"bias factory\": \"バイアスファクトリー\",\n        \"bibasuku\": \"BIBASUKU\",\n        \"bible\": \"ばいぶる\",\n        \"bicho bichodan\": \"びちょびちょ団\",\n        \"bickle\": \"びっくる\",\n        \"bicocattu\": \"Bicocattu\",\n        \"big boss\": \"BIG・BOSS\",\n        \"big gym\": \"BIG GYM\",\n        \"big mama\": \"ビッグママ\",\n        \"big mouse\": \"ビッグマウス\",\n        \"bigfoot no mori\": \"ビッグフットの森\",\n        \"bigwednesday\": \"BigWednesday\",\n        \"bikkuri gyouten\": \"びっくり仰天\",\n        \"bin1production\": \"Bin1production\",\n        \"binatsu\": \"びなつ\",\n        \"binbou noujou\": \"貧乏農場\",\n        \"binbou yusuri\": \"びんぼうゆすり\",\n        \"binbou yusuri express\": \"貧乏ゆすり超特急\",\n        \"bindmix\": \"BindMix\",\n        \"binmalo\": \"ビンマロ\",\n        \"binz studio\": \"Binz Studio\",\n        \"biophile\": \"Biophile\",\n        \"bird forest\": \"Bird Forest\",\n        \"bird joke\": \"バードジョーク\",\n        \"birobon\": \"ビロボン\",\n        \"biroon jr.\": \"びろーんJr.\",\n        \"biroudo kairou\": \"びろうど廻廊\",\n        \"biruban\": \"びるばん\",\n        \"bishamon\": \"びしゃもん。\",\n        \"bishoujo labo\": \"美少女ラボ\",\n        \"bishoujo netto\": \"美少女ネット\",\n        \"bishoujo suishin iinkai\": \"美少女推進委員会\",\n        \"bismarcho\": \"Bismarcho!\",\n        \"bistro mountain\": \"ビストロマウンテン\",\n        \"bitacos\": \"びっくりたこす\",\n        \"bite\": \"BITE\",\n        \"bitimaru\": \"びちまる\",\n        \"bitmap\": \"ビットマップ\",\n        \"bitmap power\": \"びとまぷぱわー\",\n        \"bitter crown\": \"ビタークラウン\",\n        \"bitter sweet\": \"BITTER SWEET\",\n        \"bitto\": \"∞Bitto\",\n        \"bizensiki roroppu\": \"備前式ロロップ\",\n        \"black and white\": \"Black and White\",\n        \"black angel\": \"ブラックエンゼル\",\n        \"black base\": \"BLACK★BASE\",\n        \"black box\": \"Black Box\",\n        \"black crusher\": \"ブラック・クラッシャー\",\n        \"black cyc\": \"ブラックサイク\",\n        \"black doctor\": \"BLACK DOCTOR\",\n        \"black factory\": \"Black Factory\",\n        \"black force\": \"BLACK FORCE\",\n        \"black light\": \"ブラックライト\",\n        \"black list\": \"Black List\",\n        \"black maria\": \"ブラックマリア\",\n        \"black megane kenkyuujo\": \"ブラックメガネ研究所\",\n        \"black moon\": \"ブラックムーン\",\n        \"black package\": \"ブラックパッケージ\",\n        \"black package try\": \"ブラックパッケージトライ\",\n        \"black panda\": \"BLACK PANDA\",\n        \"black pepper\": \"Black Pepper\",\n        \"black russian\": \"ぶらっく☆ルシアン\",\n        \"black sugar\": \"Black_Sugar(仮)\",\n        \"black thunder\": \"Black thunder\",\n        \"black vinegar\": \"ぶらっくびねがー\",\n        \"blackglobe\": \"BLACKGLOBE\",\n        \"blackrainbow\": \"BLACKRAINBOW\",\n        \"blackwing\": \"ブラックウィング\",\n        \"blade\": \"BLADE\",\n        \"blaze\": \"BLAZE\",\n        \"blazer one\": \"Blazer One\",\n        \"blessing fall\": \"Blessing Fall\",\n        \"blind alley\": \"Blind Alley\",\n        \"blink\": \"blink\",\n        \"blip\": \"BLIP\",\n        \"blitzkrieg\": \"ブリッツクリーク\",\n        \"blood plus blood\": \"ぶらっど+ぶらっど\",\n        \"blood temple\": \"BLOOD TEMPLE\",\n        \"bloodberry\": \"BloodBerry\",\n        \"bloodtype-b\": \"Bloodtype-B\",\n        \"bloody hawk\": \"ブラッディーホーク\",\n        \"bloom factory\": \"BLOOM FACTORY\",\n        \"blossom eight\": \"ブロッサムエイト\",\n        \"blossom sphere\": \"Blossom Sphere\",\n        \"blow\": \"BLOW\",\n        \"blue banana\": \"Blue Banana\",\n        \"blue blood\": \"ブルーブラッド\",\n        \"blue bloods\": \"BLUE BLOOD'S\",\n        \"blue blossom\": \"Blue Blossom\",\n        \"blue catty\": \"BLUE CATTY\",\n        \"blue colors nightmare\": \"ブルウカラアズナイトメア\",\n        \"blue cosmos\": \"BLUE COSMOS\",\n        \"blue crest\": \"Blue Crest\",\n        \"blue devil\": \"Blue Devil\",\n        \"blue drop\": \"Blue Drop\",\n        \"blue frill\": \"ブルーフリル\",\n        \"blue gale\": \"ブルーゲイル\",\n        \"blue gale light\": \"ブルゲLIGHT\",\n        \"blue garnet\": \"BLUE GARNET\",\n        \"blue killer\": \"blue killer\",\n        \"blue metal\": \"ブルーメタル\",\n        \"blue moon\": \"ブルームーン\",\n        \"blue percussion\": \"ブルー・パーカッション\",\n        \"blue shachi\": \"ブルーシャッチー\",\n        \"blue sheets\": \"ブルーシーツ\",\n        \"blue signals\": \"BLUE SIGNALS\",\n        \"blue soaproot\": \"Blue soaproot\",\n        \"blue spark\": \"BLUE★SPARK\",\n        \"blue stardust\": \"blue Stardust\",\n        \"blue topaz\": \"ぶるぅとぱぁず\",\n        \"blue trigger\": \"ブルートリガー\",\n        \"blue wave\": \"BLUE WAVE\",\n        \"blue wind\": \"blue wind\",\n        \"blue-noise\": \"BLUE-NOISE\",\n        \"blue24\": \"BLUE24\",\n        \"bluebrand\": \"BlueBrand\",\n        \"bluebullpen\": \"BlueBullPen\",\n        \"bluelagos\": \"Bluelagos\",\n        \"bluemage\": \"BlueMage\",\n        \"bluemonday\": \"BlueMonday\",\n        \"blueocean\": \"BlueOcean\",\n        \"blueversusred\": \"BlueVersusRed\",\n        \"blume\": \"BLUME\",\n        \"blz maniax\": \"BLZ Maniax\",\n        \"bm dan\": \"BM団\",\n        \"bobcaters\": \"BOBCATERS\",\n        \"bocchi island\": \"ぼっちアイランド\",\n        \"bocchi koubou\": \"ぼっち工房\",\n        \"bodley head\": \"BODLEY HEAD\",\n        \"bofubofu mat\": \"ぼふぼふマット\",\n        \"bohyadam\": \"ボヒャダム\",\n        \"bojorebon\": \"ボジョレボン\",\n        \"bokiya\": \"ぼき屋\",\n        \"bokki oniisan\": \"ぼっきおにいさん\",\n        \"boku\": \"撲\",\n        \"boku-hitori.\": \"ぼくひとり。\",\n        \"bokuhako\": \"BOKUHAKO\",\n        \"bokujin\": \"ボクジン\",\n        \"bokura\": \"ぼくら\",\n        \"bokura gosai\": \"ぼくらごさい\",\n        \"bokura no kajitsu\": \"ボクラノカジツ\",\n        \"bolze.\": \"bolze.\",\n        \"boma -born to be mild-\": \"ボマ！-Born to be Mild-\",\n        \"bon\": \"梵\",\n        \"bonanza\": \"ボナンザ\",\n        \"bonelessham\": \"ボンレスハム\",\n        \"bongaichinyon\": \"ぼんがいちにょん\",\n        \"bonnou honpo\": \"煩悩本舗\",\n        \"bonnou strategy\": \"煩悩ストラテジ\",\n        \"bonnou stream\": \"煩悩ストリーム\",\n        \"bonnoudou\": \"凡悩堂\",\n        \"bonsketch\": \"Bonsketch\",\n        \"boobookid\": \"ブーブーキッド\",\n        \"booch\": \"ぶーち\",\n        \"books takada\": \"BOOKSたかだ\",\n        \"boribiya\": \"ボリビ屋\",\n        \"boroboroya\": \"ぼろぼろ屋\",\n        \"boruboru\": \"ボルボる\",\n        \"borushiti teisyoku\": \"ぼるしち定食\",\n        \"bose no doujin manga kenkyuujo\": \"boseの同人漫画研究所\",\n        \"boshi soukan\": \"母子相姦\",\n        \"boston tea party\": \"ボストン茶会\",\n        \"botamochi no utage\": \"ぼたもちの宴\",\n        \"botanzakura\": \"牡丹桜\",\n        \"botibotiikoka\": \"ぼちぼちいこか\",\n        \"botsuraku kizoku\": \"没落貴族\",\n        \"bottle syrup\": \"ボトルシロップ\",\n        \"bottomress pit\": \"Bottomress Pit\",\n        \"bourgeois ice cream\": \"ブルジョワアイスクリーム\",\n        \"bousou fuhatsudan\": \"暴走！！不発団\",\n        \"bouzen meiden r\": \"呆然乙女R\",\n        \"box\": \"■BOX■\",\n        \"box doll\": \"BOX DOLL\",\n        \"boxbear\": \"BoxBear\",\n        \"boyari.\": \"ぼやり。\",\n        \"boyishsuky\": \"BOYISHSUKY\",\n        \"boys be gakuen\": \"ぼーいずびぃ学園\",\n        \"boys musume.\": \"ボーイズ娘。\",\n        \"bp88\": \"BP88\",\n        \"bpm12\": \"bpm12\",\n        \"bq\": \"BQ\",\n        \"brabustersystem\": \"BraBusterSystem\",\n        \"brand new way\": \"Brand New Way\",\n        \"brand nyu\": \"brand nyu\",\n        \"brave chicken\": \"ぶれいぶちきん\",\n        \"bread and cake\": \"パンとケーキ\",\n        \"bread bread\": \"Bread Bread\",\n        \"breath2\": \"BREATH2\",\n        \"breeze\": \"BREEZE\",\n        \"brief case\": \"Brief case\",\n        \"briest\": \"BRIEST\",\n        \"brilliant thunder\": \"brilliant thunder\",\n        \"bringles\": \"ブリんぐるズ\",\n        \"brio\": \"BRIO\",\n        \"britanian\": \"ぶりたにあん\",\n        \"broad smile\": \"Broad smile\",\n        \"broken world\": \"Broken World\",\n        \"bronco hitoritabi\": \"ブロンコ一人旅\",\n        \"bronze age\": \"BRONZE AGE\",\n        \"brown bunny\": \"BROWNBUNNY\",\n        \"brown sugar\": \"Brown sugar\",\n        \"brownie\": \"ブラウニー\",\n        \"brownstone\": \"brownstone\",\n        \"bubble company\": \"バブルカンパニー\",\n        \"bubble fruit\": \"バブルフルーツ\",\n        \"budou bekkan\": \"ブドウ別館\",\n        \"budou nouen\": \"ぶどう農園\",\n        \"buggeman factory\": \"ブギーマンファクトリー\",\n        \"build-tetsu\": \"ビルドテツ\",\n        \"buji kore ameba\": \"無事これアメーバ\",\n        \"buki to bougu no mise\": \"ぶきとぼうぐのみせ\",\n        \"bullet ballet\": \"Bullet Ballet\",\n        \"bumsign\": \"BUMSIGN\",\n        \"bunbonian\": \"ぶんぼにあん\",\n        \"bunbukudou\": \"ぶんぶく堂\",\n        \"bunchindoh\": \"ぶんちん堂\",\n        \"bungalow\": \"バンガロゥ\",\n        \"bunmei kaika\": \"文明快化\",\n        \"buppa studio\": \"ブッパスタジオ\",\n        \"burakuradou\": \"ブラクラ堂\",\n        \"buranko shinshi\": \"ブランコ紳士\",\n        \"buri daikon\": \"ぶり大根\",\n        \"buriburi nyanya\": \"ぶりぶりにゃにゃ\",\n        \"buriki daiou\": \"武力大王\",\n        \"burikichoco\": \"ブリキチョコ\",\n        \"burisuta\": \"ブリスタ\",\n        \"burning hammer\": \"バーニングハンマー\",\n        \"burning sisters\": \"バーニング姉妹\",\n        \"burning soul\": \"バーニンソウル\",\n        \"bushi\": \"節\",\n        \"bushiteki tamashii\": \"武士的魂\",\n        \"busou megami\": \"武装女神\",\n        \"busou yousei\": \"武装妖精\",\n        \"bust emperor\": \"バストエンペラル\",\n        \"buta no bucket\": \"豚のバケツ\",\n        \"buta no hidume\": \"ぶたのひづめ\",\n        \"butagoya dot com\": \"豚小屋.com\",\n        \"butano\": \"ぶたの\",\n        \"butazuraya seinikuten\": \"豚面屋精肉店\",\n        \"butsuri hansha club\": \"物理反射倶楽部\",\n        \"butter cookie\": \"ばたあくっきい\",\n        \"butterfly dream\": \"Butterfly Dream\",\n        \"buttyakedo\": \"ぶっちゃけ堂\",\n        \"buzzer\": \"BUZZER\",\n        \"bv31.5\": \"BV31.5\",\n        \"bye-be\": \"Bye-Be\",\n        \"byougatei\": \"猫画亭\",\n        \"byunbyunhouse\": \"びゅんびゅんはうす\",\n        \"c equal\": \"C=equal\",\n        \"c-arts\": \"C-ARTS\",\n        \"c-company\": \"C-COMPANY\",\n        \"c-line\": \"C-線上\",\n        \"c-rex\": \"C-Rex\",\n        \"c-type\": \"C-type\",\n        \"c.\": \"C.\",\n        \"c.a.t\": \"C・A・T\",\n        \"c.cpu\": \"C.CPU\",\n        \"c.h.a.r.i.o.t\": \"C.H.A.R.I.O.T\",\n        \"c.m.\": \"C.M.\",\n        \"c.n.p\": \"C.N.P\",\n        \"c.o.2\": \"C.O.2\",\n        \"c.r.c\": \"C・R・C\",\n        \"c.s.\": \"C.S.\",\n        \"c.www\": \"C.www\",\n        \"c.y.room\": \"C.Y.roOm\",\n        \"c3h8o3\": \"C3H8O3\",\n        \"c8\": \"C8\",\n        \"c9sou\": \"c9sou\",\n        \"ca.d.d\": \"C：／／A.D.D／\",\n        \"cabbage box\": \"キャベツBOX\",\n        \"cabbage soft\": \"きゃべつそふと\",\n        \"cabbit\": \"Cabbit\",\n        \"caburibbon\": \"caburibbon\",\n        \"cacao\": \"カカオ\",\n        \"cactus\": \"Cactus\",\n        \"cafe atagawa\": \"カフェあたがわ\",\n        \"cafe unlimited\": \"カフェ・アンリミテッド\",\n        \"cafe-hotcocoa.\": \"cafe-hotcocoa.\",\n        \"cafeteria watermelon\": \"カフェテリアWATERMELON\",\n        \"caffeine\": \"Caffeine\",\n        \"cage\": \"CAGE\",\n        \"cahlacahla\": \"CAHLACAHLA\",\n        \"caipirinha\": \"caipirinha\",\n        \"cake maker\": \"cake maker\",\n        \"cake-hitokire\": \"ケーキひと切れ\",\n        \"caligula\": \"カリギュラ\",\n        \"calmblue\": \"CalmBlue\",\n        \"calmboy.com\": \"カームボーイドットコム\",\n        \"calme\": \"calme\",\n        \"calorie off\": \"カロリーオフ\",\n        \"calpara-shed\": \"calpara-shed\",\n        \"calpis koubou\": \"カルピス工房\",\n        \"cambropachycope\": \"カンブロパキコーペ\",\n        \"camp.\": \"カンプ。\",\n        \"campanula\": \"campanula\",\n        \"campers\": \"きゃんぱーず\",\n        \"camrism\": \"カムリズム\",\n        \"can do now\": \"キャンドゥーなう!\",\n        \"canaria\": \"canaria\",\n        \"canary to tsubame\": \"カナリアとつばめ\",\n        \"candy pop\": \"Candy Pop\",\n        \"candy-ya\": \"キャンディー屋\",\n        \"candyman\": \"Candyman\",\n        \"canopus\": \"Canopus\",\n        \"canzume quality\": \"かんづめクオリティ\",\n        \"cao\": \"CaO\",\n        \"capital one\": \"きゃぴたるわん\",\n        \"caplet0.5\": \"caplet0.5\",\n        \"captain santa\": \"Captain SANTA\",\n        \"caramel colors\": \"カラメルシキソ\",\n        \"caramel mamire\": \"カラメルマミレ\",\n        \"caramel soft\": \"キャラメルソフト\",\n        \"caramel yarou\": \"キャラメル野郎\",\n        \"carbonate\": \"carbonate\",\n        \"carburetor\": \"キャブレター\",\n        \"carnage engine\": \"カルネージエンジン\",\n        \"carnelian\": \"CARNELIAN\",\n        \"carnevale9\": \"CARNEVALE9\",\n        \"carol works\": \"Carol Works\",\n        \"carpaccio\": \"カルパッチョ\",\n        \"carrot\": \"きゃろっと\",\n        \"carrot academy\": \"キャロットアカデミー\",\n        \"carrot caramel batake\": \"きゃろっときゃらめる畑\",\n        \"carrot works\": \"きゃろっとワークス\",\n        \"caryo\": \"CARYO\",\n        \"cascade\": \"CASCADE\",\n        \"casket\": \"Casket\",\n        \"casmania\": \"CASMANIA\",\n        \"cassis\": \"CassiS\",\n        \"castella tamago\": \"カステラたまご\",\n        \"castle.m\": \"castle.m\",\n        \"cat and me\": \"Cat&me\",\n        \"cat food\": \"Cat FooD\",\n        \"cat run\": \"Cat Run\",\n        \"cat scratch\": \"CAT scratch\",\n        \"cat tower\": \"きゃっと★たわぁー\",\n        \"catastrophe.\": \"catastrophe.\",\n        \"catcher in the rye\": \"Catcher in the Rye\",\n        \"catchers mitt of silver\": \"銀のキャッチャーミット\",\n        \"catjellyfish\": \"CatJellyFish\",\n        \"catmask\": \"catmask\",\n        \"cats-box\": \"cats-box\",\n        \"cattleya\": \"CATTLEYA\",\n        \"catwalknero\": \"catwalkNERO\",\n        \"cauldron\": \"Cauldron\",\n        \"causciant\": \"かうすしあん\",\n        \"caution\": \"かうじょん\",\n        \"caza mayor\": \"CAZA MAYOR\",\n        \"cc\": \"cc\",\n        \"ccb-elo\": \"ccb-ELO\",\n        \"cdd\": \"CDD\",\n        \"cdpa\": \"CDPA\",\n        \"cecile fan club\": \"セシールファン倶楽部\",\n        \"celeste69\": \"チェレステロック\",\n        \"celica\": \"CELICA\",\n        \"celluloid brothers\": \"セルロイド・ブラザーズ\",\n        \"celluloid-acme\": \"CELLULOID-ACME\",\n        \"celsius\": \"Celsius\",\n        \"cemetery\": \"CEMETERY\",\n        \"censored\": \"censored\",\n        \"cent millibar\": \"¢mb\",\n        \"centaurea cyanus\": \"Centaurea cyanus\",\n        \"center of universe\": \"Center Of Universe\",\n        \"center.village\": \"CENTER.VILLAGE\",\n        \"ceramic heart\": \"セラミックハート\",\n        \"ceremonica\": \"ceremonica\",\n        \"cesalion\": \"シザリオン\",\n        \"cesium-p\": \"セシウムP\",\n        \"cha cha cha brothers\": \"ちゃちゃちゃぶらざーず\",\n        \"chabanchabancha\": \"茶番茶番茶\",\n        \"chabane ninja\": \"ちゃばねにんじゃ\",\n        \"chacha batake.\": \"茶々畑。\",\n        \"chahan\": \"ちゃーはん\",\n        \"chaihazuki\": \"チャイハヅキ\",\n        \"chain reaction\": \"チェーン リアクション\",\n        \"chaingang\": \"CHAINGANG\",\n        \"chakku hankai\": \"チャック半開\",\n        \"chakui\": \"着衣\",\n        \"champagnegold\": \"シャンパンゴールド\",\n        \"champloo\": \"ちゃんぷるー\",\n        \"chandora\": \"ちゃんどら\",\n        \"chanko nabe\": \"ちゃんこ鍋\",\n        \"channel ubai\": \"チャンネル奪\",\n        \"chanpurux\": \"チャンプルX\",\n        \"chantilly\": \"chantilly\",\n        \"chaoizum\": \"ちゃおいずむ\",\n        \"chaos shoujo no mise\": \"カオス少女の店\",\n        \"chaos-graphixxx\": \"chaos-graphixxx\",\n        \"chaos-l\": \"CHAOS-L\",\n        \"chaotic otome studio\": \"カオティック乙女工房\",\n        \"chaotic wolf\": \"Chaotic Wolf\",\n        \"chapedizo\": \"ちゃぺでぃぞ\",\n        \"chaps\": \"チャップス\",\n        \"charan poran\": \"CHARAN PORAN\",\n        \"charinko fox\": \"チャリンコ狐\",\n        \"charis\": \"CHARIS\",\n        \"charisma serve\": \"カリスマサーブ\",\n        \"charme\": \"Charme\",\n        \"charveltiger\": \"シャーベルタイガー\",\n        \"chateau dassault\": \"シャトーダッソー\",\n        \"cheapseek\": \"cheapseek\",\n        \"check mate\": \"Check Mate!\",\n        \"cheese company\": \"チーズカンパニー\",\n        \"cheese takoyaki\": \"チーズたこ焼き\",\n        \"chelsea lip\": \"Chelsea lip\",\n        \"chemi-story\": \"Chemi-Story\",\n        \"chemical itoh\": \"ケミカル伊藤\",\n        \"chemical janky\": \"Chemical Janky\",\n        \"cherokee\": \"CHEROKEE\",\n        \"cherry baron\": \"cherry baron\",\n        \"cherry blossom\": \"チェリーブロッサム\",\n        \"cherry bomb g\": \"チェリーボムG\",\n        \"cherry milk\": \"cherry milk\",\n        \"cherry moon\": \"チェリームーン\",\n        \"cherry pepper\": \"cherry*pepper\",\n        \"cherry snow\": \"ちぇり☆すの\",\n        \"cherry soft\": \"ちぇりーそふと\",\n        \"chest box\": \"ちぇすとぼっくす\",\n        \"chested\": \"chested\",\n        \"chestnut tree\": \"chestnut tree\",\n        \"chibineco honpo\": \"ちびねこ本舗\",\n        \"chicchi bokujou\": \"チッチ牧場\",\n        \"chichai mono club\": \"ちっちゃい物クラブ\",\n        \"chichi mafia\": \"乳マフィア\",\n        \"chichikemo\": \"ちちけも\",\n        \"chick tack bon\": \"ちくたくぼん\",\n        \"chicken nugget gyuuniku aji\": \"チキンナゲット牛肉味\",\n        \"chicken union\": \"ちきんゆにおん\",\n        \"chicken zombies\": \"chicken zombies\",\n        \"chicropokke\": \"チクロポッケ\",\n        \"chideji\": \"チデヂ\",\n        \"chidoriashi\": \"千鳥足\",\n        \"chiduru grind\": \"チヅルグラインド\",\n        \"chie no genseki\": \"知恵の原石\",\n        \"chien\": \"シアン\",\n        \"chiffon\": \"Chiffon\",\n        \"chigen torino\": \"違んTORINO\",\n        \"chigiri-ke\": \"ちぎり家\",\n        \"chigo dou\": \"チーゴ堂\",\n        \"chigoku no icchoume\": \"痴獄の一丁目\",\n        \"chiguraya\": \"ちぐら屋\",\n        \"chigusaya\": \"千草屋\",\n        \"chihagura\": \"ちはぐら\",\n        \"chihiro lanting\": \"千仞蘭庭\",\n        \"chii sanchi\": \"ちい産地\",\n        \"chiisana kagi\": \"小さな鍵\",\n        \"chika kenkyuujo\": \"地下研究所\",\n        \"chikadoh\": \"地下堂\",\n        \"chikashitsu\": \"地下室\",\n        \"chikirazu\": \"チキラーズ\",\n        \"chikiuya\": \"ちきう屋\",\n        \"chiko goya\": \"Limited\",\n        \"chikoku doumei\": \"遅刻同盟\",\n        \"chikoku penpen\": \"遅刻ペンペン\",\n        \"chikomayoya\": \"ちこまよや\",\n        \"chikotsu mania\": \"恥骨マニア\",\n        \"chikutakudoh\": \"ちくたく堂\",\n        \"chikuwa\": \"ちくわ\",\n        \"chikuwa drop\": \"ちくわドロップ\",\n        \"chikuwanko\": \"ちくわんこ\",\n        \"chikuwano kimochi\": \"ちくわの気持ち\",\n        \"childwife\": \"childwife\",\n        \"chill-out\": \"Chill-Out\",\n        \"chilukuni\": \"散る国\",\n        \"chimamire yashiki\": \"血まみれ屋敷\",\n        \"chimatsuriya honpo\": \"血祭屋本舗\",\n        \"chime\": \"ちゃいむ\",\n        \"chimeishou\": \"致命傷\",\n        \"chimere marie\": \"chimere/marie\",\n        \"chimple hotters\": \"チンプルホッターズ\",\n        \"chimple island\": \"チンプル愛☆ランド\",\n        \"chimuya\": \"ちむ屋\",\n        \"chin soudou\": \"珍騒動\",\n        \"chin-up\": \"CHIN-UP\",\n        \"chinasanchi\": \"ちゃいなさんち\",\n        \"chinchintei\": \"ちんちん亭\",\n        \"chinjuu mufy\": \"珍獣ムフィ\",\n        \"chinpudo\": \"珍譜堂\",\n        \"chinshieden\": \"靜雪殿\",\n        \"chinzuri bop\": \"Chinzuri Bop\",\n        \"chips\": \"CHIPS\",\n        \"chiriakuta\": \"塵芥\",\n        \"chirigami goya\": \"ちり紙小屋\",\n        \"chirimen studio\": \"ちりめんすたじお\",\n        \"chirimenjako\": \"ちり綿じゃこ\",\n        \"chirimozuku cha\": \"チリモズク茶\",\n        \"chidorinu\": \"チドリヌ\",\n        \"chirorura\": \"ちろるら\",\n        \"chise\": \"千世\",\n        \"chiukorone\": \"ちうころね\",\n        \"chizakiya\": \"ちざき屋\",\n        \"chloroplast\": \"くろろぷらすと\",\n        \"cho-jin hakaba\": \"超人墓場\",\n        \"choco biscuits\": \"ちょこ★びすけっつ\",\n        \"choco box\": \"choco BOX\",\n        \"choco croissant\": \"チョコクロワッサン\",\n        \"choco zakura\": \"ちょこざくら\",\n        \"choco-banana\": \"ちょこばなな。\",\n        \"chocobits\": \"Chocobits\",\n        \"chococroissants\": \"チョコクロワッサン\",\n        \"chocoholic\": \"chocoholic\",\n        \"chocolat\": \"しょこら～と!\",\n        \"chocolate addiction\": \"Chocolate Addiction\",\n        \"chocolate banana ou lait\": \"ちょこれーとバナナ・オレ\",\n        \"chocolate jam\": \"ちょこれぃとじゃむ\",\n        \"chocolate lily\": \"ちょこりり\",\n        \"chocolate lv.5\": \"chocolate Lv.5\",\n        \"chocolate macaron\": \"チョコレートマカロン\",\n        \"chocolate pepper.\": \"Chocolate Pepper.\",\n        \"chocolate shop\": \"チョコレート・ショップ\",\n        \"chocomoka\": \"ちょこもか\",\n        \"chocotan mogumogu\": \"チョコタンもぐもぐ\",\n        \"chokie\": \"chokie\",\n        \"chokomonetto\": \"ちょこもねっと\",\n        \"chokudoukan\": \"直道館\",\n        \"chokusen ikki\": \"直線一気\",\n        \"chonmage teikoku\": \"丁髷帝国\",\n        \"chori\": \"chori\",\n        \"chotto dake yanke\": \"ちょっとだけやんけ\",\n        \"chotto h gallery\": \"ちょっとHギャラリー\",\n        \"chou a la creme\": \"chou à la crème\",\n        \"chou chemical gakuen z\": \"超ケミカル学園Z\",\n        \"chou mm bekkan\": \"超MM別館\",\n        \"chou project\": \"超プロジェクト\",\n        \"chou the taizenkutsu\": \"超THE体前屈\",\n        \"chou yutori kyouiku\": \"超ゆとり教育\",\n        \"choukyori dandou keisan\": \"长距离弹道计算\",\n        \"choushizen kenkyuujo\": \"超自然研究所\",\n        \"christmas\": \"クリスマス\",\n        \"chroma of wall\": \"壁の彩度\",\n        \"chromaticclip\": \"ChromaticClip\",\n        \"chronicle\": \"くろにくる\",\n        \"chrono mail\": \"クロノ・メール\",\n        \"chrronix\": \"Chrronix\",\n        \"chukara coffee\": \"中辛珈琲\",\n        \"chunhaikan\": \"中海館\",\n        \"chupa chupa ya\": \"ちゅぱちゅぱ屋\",\n        \"chuu ni no kaori\": \"中二のかおり\",\n        \"chuugakukan\": \"中学館\",\n        \"chuuka hanten\": \"ちゅうか飯店\",\n        \"chuuka mantou\": \"中華饅頭\",\n        \"chuuni byoutou\": \"厨二病棟\",\n        \"chuusei mafuman\": \"中性まふまん♀\",\n        \"chuutohanpa man\": \"中途半端マン\",\n        \"ciaociao\": \"ciaociao\",\n        \"cicada\": \"CICADA\",\n        \"ciel\": \"Ciel\",\n        \"cinderella complex\": \"Cinderella Complex\",\n        \"cinnamon cigar\": \"Cinnamon Cigar\",\n        \"cior\": \"Cior\",\n        \"cipher\": \"裁羽\",\n        \"circle 1 gou\": \"サークル1号\",\n        \"circle a\": \"Circle A\",\n        \"anastasia\": \"Anastasia\",\n        \"circle anco\": \"サークルアンコ\",\n        \"circle b.c.a.\": \"サークルB.C.A.\",\n        \"circle baku\": \"サークル獏\",\n        \"circle bob\": \"サークルボブ\",\n        \"circle credit\": \"サークルくれじっと\",\n        \"circle daiinma\": \"サークル大淫魔\",\n        \"circle damesimai\": \"サークル駄目姉妹\",\n        \"circle dare\": \"サークル誰?\",\n        \"circle energy\": \"サークルENERGY\",\n        \"circle enzin\": \"サークルENZIN\",\n        \"circle fairy flower\": \"サークル☆フェアリーフラワー\",\n        \"circle foundation\": \"CIRCLE FOUNDATION\",\n        \"circle ggm\": \"サークルGGM\",\n        \"circle hcm\": \"サークルHCM\",\n        \"circle hitori\": \"サークルひとり\",\n        \"circle huxian\": \"サークル狐仙\",\n        \"circle itaku\": \"サークルイタク\",\n        \"circle itomagoi\": \"サークル暇乞い\",\n        \"circle iwaodou\": \"サークル岩尾堂\",\n        \"circle kgb\": \"サークルKGB\",\n        \"circle king\": \"サークルきんぐ\",\n        \"circle kotatubuton\": \"サークルこたつぶとん\",\n        \"circle meimitei\": \"サークル冥魅亭\",\n        \"circle msm\": \"サークルMSM\",\n        \"circle nekome\": \"サークルねこめ\",\n        \"circle nnn\": \"サークルN･N･N\",\n        \"circle nuruma-ya\": \"サークルぬるま屋\",\n        \"circle of kenkyo\": \"サークルオブ謙虚\",\n        \"circle op\": \"circle OP\",\n        \"circle outerworld\": \"サークルOUTER WORLD\",\n        \"circle plum\": \"サークルぷらむ\",\n        \"circle rachigai\": \"サークル埒外\",\n        \"circle rindou\": \"さーくるりんどー\",\n        \"circle shakunetsu\": \"サークル灼熱\",\n        \"circle sigma\": \"Circle Σ\",\n        \"circle six\": \"circle six\",\n        \"slave\": \"SLAVE\",\n        \"circle spice\": \"さーくるスパイス\",\n        \"circle streak\": \"CIRCLE STREAK\",\n        \"tintin\": \"TinTin\",\n        \"circle trident\": \"Circle Trident\",\n        \"circle yaranaika\": \"サークルやらないか\",\n        \"circle yubokumin\": \"サークル遊牧民\",\n        \"circle yuki\": \"サークルゆき\",\n        \"circle den\": \"田\",\n        \"circled 1\": \"①\",\n        \"circus\": \"サーカス\",\n        \"circus fetish\": \"サーカス・フェティッシュ\",\n        \"citron\": \"CITRON\",\n        \"citron love\": \"CITRON LOVE\",\n        \"citron tree\": \"citron tree\",\n        \"citrus\": \"Citrus\",\n        \"city forest\": \"City Forest\",\n        \"ciz\": \"CIZ!!\",\n        \"cla cla clala\": \"Cla Cla Clala\",\n        \"clammbon\": \"クラムボン\",\n        \"clara soap\": \"クララソープ\",\n        \"classic orange\": \"Classic Orange\",\n        \"cle2700\": \"cle2700\",\n        \"clean up\": \"CLEAN UP\",\n        \"cleanliness.\": \"cleanliness\",\n        \"clear glass\": \"Clear Glass\",\n        \"clearbook\": \"ClearBook\",\n        \"clione house\": \"くりおねハウス\",\n        \"clip\": \"くりっぷ\",\n        \"clipline\": \"クリップライン\",\n        \"clipper\": \"CLiPPER\",\n        \"clock\": \"CLOCK\",\n        \"clodia\": \"CLODIA\",\n        \"close heart\": \"CLOSE HEART\",\n        \"cloud nine\": \"雲9\",\n        \"cloud noise\": \"クラウドノイズ\",\n        \"cloud palette\": \"Cloud Palette\",\n        \"cloudair\": \"cloudair\",\n        \"cloudy\": \"くらうでぃ\",\n        \"clover\": \"CLOVER\",\n        \"clover kai\": \"くろーヴァー会\",\n        \"clownculture\": \"ClownCulture\",\n        \"club bacteria\": \"クラブ・バクテリア\",\n        \"club dark-shadow\": \"CLUB Dark-Shadow\",\n        \"club-z\": \"CLUB-Z\",\n        \"club54\": \"club54\",\n        \"clubmatt\": \"clubmatt\",\n        \"cluster\": \"くらすたぁ\",\n        \"clutch shot king\": \"CLUTCH SHOT KING\",\n        \"clymenia\": \"クリメニア\",\n        \"cnc\": \"CNC\",\n        \"cobrano\": \"こぶらの\",\n        \"coburamenman\": \"コブラーメンマン\",\n        \"cocca\": \"cocca\",\n        \"coccinelle\": \"coccinelle\",\n        \"cock-a-doodle-doo\": \"Cock-a-Doodle-Doo\",\n        \"cocktail soft\": \"カクテル・ソフト\",\n        \"coco\": \"COCO\",\n        \"cocoa break\": \"COCOA BREAK\",\n        \"cocoloco note\": \"CoCoLoCo☆Note\",\n        \"cocon\": \"cocon!\",\n        \"coconutbless\": \"ココナッツブレス\",\n        \"cocoon\": \"cocoon\",\n        \"cocotto\": \"cocotto\",\n        \"cocytusgarden\": \"CocytusGarden\",\n        \"codeine girl\": \"コデインガール\",\n        \"coffee chazuke\": \"珈琲茶漬け\",\n        \"coffee curry\": \"コーヒーカレー\",\n        \"coffee maker\": \"こーひーめーかー\",\n        \"cokot\": \"cokot\",\n        \"cola bolt\": \"コーラーボルト\",\n        \"colette\": \"Colette\",\n        \"coli-chu\": \"coli厨\",\n        \"colobocs\": \"CoLoBoCs\",\n        \"color art\": \"Color art\",\n        \"color hiyoko dousoukai\": \"カラーひよこ同窓会\",\n        \"color-staining\": \"COLOR-STAINING\",\n        \"colosseum\": \"コロセウム\",\n        \"colour and shape\": \"からーあんどしぇいぷ\",\n        \"colt\": \"Colt\",\n        \"colt-run\": \"こるとらん\",\n        \"combat mon-mon\": \"コンバットモンモン\",\n        \"comic empire\": \"コミックエンパイア\",\n        \"comic kingdom\": \"コミックキングダム\",\n        \"command plus z\": \"Command+Z\",\n        \"commanding eagle\": \"Commanding Eagle\",\n        \"commando\": \"コマンドー\",\n        \"commelina\": \"Commelina\",\n        \"comomo\": \"COMOMO\",\n        \"compact software\": \"Compact Software\",\n        \"complete box\": \"コンプリートボックス\",\n        \"complets\": \"コンプリーツ\",\n        \"complex\": \"COMPLEX\",\n        \"concerto\": \"コンチェルト\",\n        \"concrete river\": \"CONCRETE RIVER\",\n        \"coneco house\": \"こねこはうすー\",\n        \"confiture soft\": \"コンフィチュールソフト\",\n        \"consava\": \"こんさば\",\n        \"contamination\": \"こんたみねーしょん\",\n        \"convallo-stick\": \"Convallo-stick\",\n        \"cool brain\": \"COOL BRAIN\",\n        \"cool kyou dai san shibu\": \"クール教第三支部\",\n        \"cool palace\": \"Cool Palace\",\n        \"cool sister\": \"く～るシスター\",\n        \"coolheadwarmheart\": \"CoolHeadWarmHeart\",\n        \"coonelius\": \"くーねりあす\",\n        \"coopy\": \"coopy\",\n        \"copen\": \"こぺん\",\n        \"copin\": \"Copin\",\n        \"copo deluxe\": \"こぽDELUXE\",\n        \"coral reef\": \"コーラルリーフ\",\n        \"corkbox\": \"コルクBOX\",\n        \"coronach\": \"カラナック\",\n        \"cosmic cute\": \"COSMIC CUTE\",\n        \"cothurnus\": \"Cothurnus\",\n        \"cotojikan\": \"琴慈館\",\n        \"cottage\": \"cottage\",\n        \"cotton candy\": \"Cotton Candy\",\n        \"cotton color\": \"コットンカラー\",\n        \"cotton house\": \"こっとん堂\",\n        \"cotton pop\": \"Cotton Pop\",\n        \"cottontail\": \"cottontail\",\n        \"countack\": \"カウンタック\",\n        \"counter attack\": \"COUNTER ATTACK\",\n        \"counter-censorship\": \"COUNTER-CENSORSHIP\",\n        \"counterparts\": \"COUNTERPARTS\",\n        \"countryside\": \"countryside\",\n        \"courmet-nyankichi\": \"くるめにゃん吉\",\n        \"courreges accel\": \"クレージュアクセル\",\n        \"covare\": \"covare\",\n        \"cow lipid\": \"Cow Lipid\",\n        \"cozybowl\": \"cozybowl\",\n        \"cpi\": \"cpi\",\n        \"craft\": \"CRAFT\",\n        \"craft-gear\": \"CRAFT-GEAR\",\n        \"craftworks\": \"CraftWorks\",\n        \"crank.in\": \"クランク・イン\",\n        \"crash tv\": \"CRASH TV\",\n        \"crayon arts\": \"くれよんあーつ\",\n        \"crayon48\": \"くれよん48\",\n        \"crazy alicetale\": \"Crazy Alicetale\",\n        \"crazy clover club\": \"CRAZY CLOVER CLUB\",\n        \"crazy comedian\": \"クレイジーコメディアン\",\n        \"crazyregion\": \"crazyregion\",\n        \"crea-holic\": \"Crea-Holic\",\n        \"cream cider\": \"くりぃむサイダー\",\n        \"cream gallon\": \"くりーむがろん\",\n        \"cream zenzai\": \"くりいむぜんざい\",\n        \"creamy cafe\": \"Creamy Cafe\",\n        \"crear mint\": \"CREAR★MINT\",\n        \"crepe\": \"Crepe\",\n        \"crimson\": \"クリムゾン\",\n        \"crimson crown\": \"Crimson CROWN\",\n        \"crimson ground\": \"CRIMSON GROUND\",\n        \"crimson kantai\": \"クリムゾン艦隊\",\n        \"crips\": \"Crips\",\n        \"critical hit\": \"くりてぃかるひぅと\",\n        \"crocodile-ave.\": \"CROCODILE-Ave.\",\n        \"cronus\": \"Cronus\",\n        \"crooked navel\": \"Crooked Navel\",\n        \"cross down\": \"CROSS DOWN\",\n        \"cross fire\": \"CROSS FIRE\",\n        \"cross hearts\": \"CROSS HEARTS\",\n        \"cross place\": \"CROSS PLACE\",\n        \"cross talk\": \"Cross Talk\",\n        \"cross-do\": \"黒酢堂\",\n        \"crossco switch\": \"くろすこスイッチ\",\n        \"crossnet\": \"クロスネット\",\n        \"crossover\": \"CROSSOVER\",\n        \"crossray\": \"crossray\",\n        \"crotch\": \"Crotch\",\n        \"crowclock\": \"crowclock\",\n        \"crown brigade\": \"CROWN BRIGADE\",\n        \"crowview\": \"CrowView\",\n        \"cryptid\": \"cryptid\",\n        \"crystal capricorn\": \"Crystal Capricorn\",\n        \"crystal shoujo\": \"クリスタル少女\",\n        \"crystal strawberry\": \"硝子の苺\",\n        \"crystal tower\": \"クリスタルタワー\",\n        \"crystalia\": \"CRYSTALiA\",\n        \"cshouse\": \"しーずはうす\",\n        \"ctn\": \"クリスチーネ\",\n        \"cube sugar\": \"Cube Sugar\",\n        \"cubic\": \"Cubic\",\n        \"cuffs\": \"Cuffs\",\n        \"cuniculus\": \"CUNICULUS\",\n        \"cupi\": \"キュピ\",\n        \"cupid ice\": \"キューピッドアイス\",\n        \"curefull base\": \"Curefull Base\",\n        \"curiocity\": \"Curiocity\",\n        \"current storage\": \"Current Storage\",\n        \"cursor\": \"カーソル\",\n        \"curtain wall no ie\": \"カーテンウォールの家\",\n        \"custardragon\": \"Custardragon\",\n        \"custom\": \"くすとむ\",\n        \"cut a dash\": \"CUT A DASH!!\",\n        \"cut works publishing\": \"Cut Works Publishing\",\n        \"cute\": \"Cute\",\n        \"cute bilibili\": \"キュートビリビリ\",\n        \"cvl launching pad\": \"CVL発射台\",\n        \"cyanos\": \"CYANOS\",\n        \"cyber ark\": \"CYBER ARK\",\n        \"cyber f\": \"Cyber F\",\n        \"cyber manga doujou\": \"サイバー☆マンガ道場\",\n        \"cyber sakura\": \"サイバー桜\",\n        \"cyberangel\": \"CYBERANGEL\",\n        \"cyborg hum\": \"サイボーグハム\",\n        \"cyc\": \"Cyc\",\n        \"cyc no-nos\": \"サイクノノス\",\n        \"cyclet\": \"CYCLET\",\n        \"cyclo-\": \"Cyclo-\",\n        \"cyclone\": \"サイクロン\",\n        \"cyduster\": \"CYDUSTER\",\n        \"cykranosh\": \"さいくらの〜しゅ\",\n        \"cynthia\": \"Cynthia\",\n        \"cytokine\": \"CYTOKINE\",\n        \"cz\": \"CZ\",\n        \"d-baird\": \"D-Baird\",\n        \"d-dkd\": \"D-DKD\",\n        \"d-heaven\": \"D-heaven\",\n        \"d-ivision\": \"D-ivision\",\n        \"d-lovers\": \"D-LOVERS\",\n        \"d-march\": \"D-MARCH\",\n        \"d-point\": \"D-Point!\",\n        \"d-ten\": \"D-TEN\",\n        \"d.a.p\": \"d.a.p\",\n        \"d.h\": \"D.H\",\n        \"d.o.\": \"ディーオー\",\n        \"d2 algorithm\": \"D2 Algorithm\",\n        \"dadachamame\": \"だだちゃまめ\",\n        \"daddymulk\": \"DADDYMULK\",\n        \"dagashiya\": \"駄菓子屋\",\n        \"dai 13 kantai\": \"第13艦隊\",\n        \"dai 3 no shippo\": \"だい③のしっぽ\",\n        \"dai 46 kishidan\": \"第46騎士団\",\n        \"dai n honpo\": \"第N本舗\",\n        \"dai ninja teikoku\": \"大忍者帝国\",\n        \"dai nippon kodomo shuppan\": \"大日本子供出版\",\n        \"dai-l studio\": \"第Lスタジオ\",\n        \"daidai koubou\": \"大々工房\",\n        \"daidaido\": \"橙堂\",\n        \"daidaros\": \"ダイだろす\",\n        \"daidenjin koubou\": \"大電人工房\",\n        \"daiginjou masshigura\": \"大吟醸まっしぐら\",\n        \"daiichi denshi\": \"第一電子\",\n        \"daiichi yutakasou\": \"第壱ユタカ荘\",\n        \"daiji na koto wa nikai mo iwanai\": \"大事なことは二回も言わない\",\n        \"daijobi kenkyuujo\": \"ダイジョビ研究所\",\n        \"daikichi-ya\": \"だいきち屋\",\n        \"daikonya sanchoume\": \"大根屋三丁目\",\n        \"daini hokenshitsu\": \"ダイニホケンシツ\",\n        \"dainichakai\": \"第二茶会\",\n        \"dainyu dougumo\": \"代入道雲\",\n        \"dairiseki\": \"大理石\",\n        \"daisaku no iru circle\": \"大作のいるサークル\",\n        \"daisan shinsekai\": \"第三新世界\",\n        \"daisy chain\": \"デイジーチェイン\",\n        \"daitokei\": \"大刀契\",\n        \"daitoutaku\": \"大董卓\",\n        \"daiznosusume\": \"だいずのススメ\",\n        \"daizu azuki\": \"大豆小豆\",\n        \"daizuya\": \"だいず屋\",\n        \"dakashiya oroshi\": \"堕菓子屋卸\",\n        \"daken nanban\": \"駄犬南蛮\",\n        \"dakuhan\": \"だくはん\",\n        \"dall\": \"DALL\",\n        \"dam labo\": \"だむlabo\",\n        \"damage honpo\": \"ダメージ本舗\",\n        \"damaguro\": \"だまぐろ\",\n        \"dame project\": \"DAMe project\",\n        \"damedungeon\": \"DameDungeon\",\n        \"damn bomb\": \"だむぼむ\",\n        \"danball man\": \"ダンボールまん\",\n        \"danball mansion\": \"ダンボールマンション\",\n        \"dancing cat\": \"ダンシングキャット\",\n        \"dandan chinjufu\": \"弾々鎮守府\",\n        \"dandandadan\": \"段々打団\",\n        \"dandelion\": \"だんでらいおん\",\n        \"dandy lonely cherry\": \"Dandy Lonely Cherry\",\n        \"dandy skip\": \"だんでぃすきっぷ\",\n        \"danekoya gunekodou\": \"駄猫屋愚猫堂\",\n        \"dangan densetsu\": \"弾丸伝説\",\n        \"dangan honey\": \"弾丸ハニィ\",\n        \"dange\": \"談華\",\n        \"danger equals zone\": \"DANGER=ZONE\",\n        \"dangerous charms\": \"デンジャラス・チャームス\",\n        \"dangoya\": \"DANGOYA\",\n        \"danikuya-san\": \"駄肉家さん\",\n        \"dankon no sato\": \"男根の里\",\n        \"danna\": \"ダンナ\",\n        \"dannoura\": \"壇ノ浦\",\n        \"dansei clear gadget\": \"弾性クリアガジェット\",\n        \"danshaku ryou\": \"男爵領\",\n        \"dantyo neko\": \"だんちょねこ\",\n        \"danzi engine\": \"ダンジエンジン\",\n        \"darabuchidou\": \"だらぶち堂\",\n        \"daradara no kiheitai\": \"だらだらの騎兵隊\",\n        \"dark battery\": \"Dark battery\",\n        \"dark buta gorilla\": \"ダーク・ブタゴリラ\",\n        \"dark cherish\": \"Dark Cherish\",\n        \"dark crimson\": \"Dark Crimson\",\n        \"dark force\": \"suzuki shinobu\",\n        \"dark roseex-s\": \"Dark RoseEX-S\",\n        \"dark side\": \"ダークサイド\",\n        \"dark spirit\": \"だーくすぴりっと\",\n        \"dark water\": \"Dark Water\",\n        \"dark zone\": \"ダーク・ゾーン\",\n        \"darmax\": \"DARMAX\",\n        \"darumasan koronda\": \"達磨さん転んだ\",\n        \"dashigara 100\": \"ダシガラ100%\",\n        \"dashimakitamago\": \"DASHIMAKITAMAGO\",\n        \"dashinoko\": \"だしの粉\",\n        \"dashiotto\": \"だしおっと\",\n        \"dass\": \"DASS\",\n        \"date wa gorgeous ni\": \"デートはゴージャスに\",\n        \"dateline\": \"デートライン\",\n        \"datendou\": \"堕天堂\",\n        \"daylight\": \"デイライト\",\n        \"db-soft\": \"デービーソフト\",\n        \"dbh\": \"DBH\",\n        \"ddal84\": \"DDAL84\",\n        \"ddt\": \"DDT\",\n        \"dead angle\": \"デッドアングル\",\n        \"dead ranker\": \"Dead Ranker\",\n        \"deadnoodles\": \"Deadnoodles\",\n        \"dear\": \"Dear\",\n        \"dear durandal\": \"Dear Durandal\",\n        \"dear life\": \"DEAR LIFE\",\n        \"deardeer\": \"でぃあでぃあ\",\n        \"dearmyfriends\": \"DearMyFriends\",\n        \"death dolls\": \"Death Dolls\",\n        \"death presso\": \"デスプレッソ\",\n        \"deathgaze-system\": \"deathgaze-system\",\n        \"debagame daisoujou\": \"出歯亀大僧正\",\n        \"debodebodan\": \"でボでボ団\",\n        \"debonosu works\": \"でぼの巣製作所\",\n        \"december-girl\": \"December-Girl\",\n        \"dedepoppo\": \"ででぽっぽ\",\n        \"deed\": \"DEED\",\n        \"deeeepforest\": \"DeeeePforest\",\n        \"def cats\": \"DEF CATS\",\n        \"def999\": \"DEF999\",\n        \"degicat\": \"デジキャット\",\n        \"deisui oukoku\": \"泥酔桜国\",\n        \"dejavu\": \"Dejavu\",\n        \"dejikago\": \"でじかご\",\n        \"dekiai shinkou\": \"溺愛信仰\",\n        \"dekoboko furniture\": \"凸凹ファニチャー\",\n        \"dekoponzu\": \"でこぽんず\",\n        \"dekosenn titai\": \"デコ戦地帯\",\n        \"delayder\": \"でぃれ～だー\",\n        \"delica\": \"Delica\",\n        \"delta\": \"DELTA\",\n        \"delta blade\": \"デルタブレード\",\n        \"delta box\": \"DELTA BOX\",\n        \"deltaforce\": \"DELTAFORCE\",\n        \"delusion\": \"でるしおん\",\n        \"dende\": \"でんで\",\n        \"denden\": \"電電\",\n        \"denden-dou\": \"電伝導\",\n        \"dengenoff\": \"電源OFF\",\n        \"denji yuudou\": \"電磁誘導\",\n        \"denjin\": \"電神\",\n        \"denki biribiri\": \"電気びりびり\",\n        \"denki orange\": \"電気おれんじ\",\n        \"denkishiki\": \"電気式\",\n        \"dennou chocolate\": \"電脳ちょこれーと\",\n        \"dennou denpa hatsureisho\": \"電脳電波発令所\",\n        \"dennou fuyu mikan\": \"電脳冬蜜柑\",\n        \"dennou yamasakigumi\": \"電脳山咲組\",\n        \"dennougiwa\": \"電脳戯話\",\n        \"denpa anshitsu\": \"電波暗室\",\n        \"denpa tsuushin\": \"デンパツーシン\",\n        \"denpa yunyun\": \"電波ゆんゆん\",\n        \"denpaesidan\": \"電派絵師団\",\n        \"derashine can\": \"でらしね缶\",\n        \"derashobokai\": \"でらしょぼ会\",\n        \"deresuke syuppan\": \"でれすけ出版\",\n        \"derlanger\": \"D'ERLANGER\",\n        \"derolian\": \"デロリアン\",\n        \"desafinado\": \"desafinado\",\n        \"desart.\": \"desart.\",\n        \"desire\": \"デザイアー\",\n        \"desire gadget\": \"Desire Gadget\",\n        \"desk drawer\": \"Desk Drawer\",\n        \"desorden\": \"DESORDEN\",\n        \"death purin\": \"デスプリン\",\n        \"destron shoukai\": \"デストロン商会\",\n        \"desuroguma\": \"デスロ熊\",\n        \"detergent\": \"detergent\",\n        \"detox-girls\": \"Detox-Girls\",\n        \"developers\": \"デベロッパーズ\",\n        \"devri channel\": \"デヴリチャンネル\",\n        \"dewdrop\": \"DewDrop\",\n        \"dex plus\": \"DEX+\",\n        \"dg\": \"D☆G\",\n        \"dg project\": \"DG Project\",\n        \"dhr-ken\": \"dHR研\",\n        \"diablo\": \"Diablo\",\n        \"diamond dust\": \"ダイヤモンドダスト\",\n        \"diamond guardian\": \"ダイヤモンドガーディアン\",\n        \"diamond tiara\": \"Diamond tiara\",\n        \"dicca\": \"dicca\",\n        \"dice b\": \"ダイスB\",\n        \"dickpital\": \"ディクピタル\",\n        \"dieppe factory\": \"DIEPPE FACTORY\",\n        \"diethyl ether\": \"ジエチルエーテル\",\n        \"dig dug\": \"Dig Dug\",\n        \"digi-ai\": \"DiGi-Ai\",\n        \"digianko\": \"デジアンコ\",\n        \"digiel\": \"DiGiEL\",\n        \"digital cute\": \"Digital Cute\",\n        \"digital flyer\": \"Digital Flyer\",\n        \"digital g power\": \"デジタルGパワー\",\n        \"digital graffiti\": \"Digital Graffiti\",\n        \"digital onahole\": \"でじたるおなほ～る\",\n        \"digital symphony\": \"DIGITAL SYMPHONY\",\n        \"digital tambourine\": \"でじたるたんばりん\",\n        \"digix\": \"digiX\",\n        \"dildo rotor\": \"ディルドローター\",\n        \"diletta\": \"diletta\",\n        \"dilettante\": \"ディレッタント\",\n        \"dimension empire\": \"dimension empire\",\n        \"dimension25\": \"2.5次元\",\n        \"dinosaur house\": \"だいなそ～ハウス\",\n        \"dip switch\": \"ディップ・スイッチ\",\n        \"dipper magic\": \"Dipper Magic\",\n        \"dirty\": \"DIRTY\",\n        \"dirty69star\": \"Dirty69star★\",\n        \"discovery\": \"ディスカバリー\",\n        \"discovery mars\": \"ディスカバリー・マーズ\",\n        \"dish up\": \"Dish up\",\n        \"divine fountain\": \"神聖ファウンテン\",\n        \"dix-sept\": \"dix-sept\",\n        \"dixie\": \"ディクシー\",\n        \"dixieland\": \"迪西蘭\",\n        \"dkjmn\": \"dkjmn\",\n        \"dmcontrast\": \"DMコントラスト\",\n        \"dmmc\": \"DMMC\",\n        \"do well\": \"Do well !!!\",\n        \"do you die\": \"DO YOU DIE?\",\n        \"dobakin.\": \"どばきん。\",\n        \"dobu no hotori.\": \"どぶのほとり。\",\n        \"doc.\": \"doc.\",\n        \"dodo fuguri\": \"百々ふぐり\",\n        \"dodomeiro teishoku\": \"どどめ色定食\",\n        \"dog house\": \"ドッグハウス\",\n        \"dogear\": \"Dogear\",\n        \"doggie style\": \"doggie★style\",\n        \"dogstyle\": \"DogStyle\",\n        \"dogtag\": \"DOGTAG\",\n        \"dogu-sensya storm\": \"土偶戦車ストーム\",\n        \"dohatsu shouten\": \"怒髪商店\",\n        \"dojin otome\": \"ドージンオトメ\",\n        \"dojinchi\": \"どじんち\",\n        \"dokomademo aoi sora ni ukabu niku\": \"何処までも蒼い空に浮かぶ肉。\",\n        \"doku alice\": \"どくアリス\",\n        \"doku ringo\": \"毒リンゴ\",\n        \"doku sasori\": \"毒蠍\",\n        \"doku69\": \"毒69\",\n        \"dokudami\": \"ドクダミ\",\n        \"dokudenpa jushintei\": \"毒電波受信亭\",\n        \"dokudenpa kenkyuusho\": \"毒電波研究所\",\n        \"dokudenpa tsuushin\": \"毒電波通信\",\n        \"dokudoku melon\": \"どくどくめろん\",\n        \"dokudoku ryouki garou\": \"毒どく猟奇画廊\",\n        \"dokumushi shokeitai\": \"毒虫処刑隊\",\n        \"dokunuma\": \"どくぬま\",\n        \"dokupan koubou\": \"毒パン工房\",\n        \"dokuritsu gurentai\": \"独立愚連隊\",\n        \"dolce\": \"DOLCE\",\n        \"dolce einsatz\": \"Dolce Einsatz\",\n        \"dolcecanto\": \"DolceCanto\",\n        \"dolkavtahn\": \"Dolkavtahn\",\n        \"doll play\": \"DOLL PLAY\",\n        \"dom joshidan\": \"ドM女史団\",\n        \"dom kishidan\": \"ドM騎士団\",\n        \"domestic animals\": \"Domestic animals\",\n        \"donkin darnuts\": \"どんきんだぁなっつ\",\n        \"dontokodon\": \"どんとこどん\",\n        \"dontokoi oo\": \"ドンと来い!○○!\",\n        \"donut ike\": \"ど～なつ池\",\n        \"donzoko kashiwa meshi\": \"どん底かしわめし\",\n        \"donzoko tengoku\": \"ドン底天国\",\n        \"donzoko.\": \"どんぞこ。\",\n        \"doomcomic\": \"ドゥームコミック\",\n        \"doppelgesicht\": \"DOPPELGESICHT\",\n        \"dorepooru\": \"ドレポール\",\n        \"dorgel\": \"dorgel\",\n        \"dorichin koubou\": \"ドリチン工房\",\n        \"doronuma kyoudai\": \"泥沼兄弟\",\n        \"doropanda tours\": \"どろぱんだTOURS\",\n        \"doroyume\": \"とろゆめ\",\n        \"dosukoi\": \"どすこい!\",\n        \"dosukoi jinja\": \"どす恋☆神社\",\n        \"dot collector\": \"Dot Collector\",\n        \"dotechin tengoku\": \"どてちん天国\",\n        \"dotou no m kikaku\": \"怒涛のM企画!!\",\n        \"dots and lines\": \"どっつ&らいんず\",\n        \"dou-chikikure\": \"童チキクレ\",\n        \"double branch\": \"だぶるぼらんち\",\n        \"double deck seisakujo\": \"ダブルデック製作所\",\n        \"double dice\": \"だぶるだいす\",\n        \"double melon\": \"ダブルメロン\",\n        \"double slash\": \"ダブルスラッシュ\",\n        \"double typhoon\": \"ダブルタイフーン\",\n        \"double volante\": \"だぶるぼらんち\",\n        \"double-h\": \"DOUBLE-H\",\n        \"doubleflower\": \"DoubleFlower\",\n        \"doudantsutsujitomonokai\": \"満天星友乃会\",\n        \"douganebuibui\": \"ドウガネブイブイ\",\n        \"doujin kappa\": \"同人河童\",\n        \"doujin mukashibanashi\": \"同人昔話\",\n        \"doumou\": \"DOUMOU\",\n        \"doushia\": \"ドーシア\",\n        \"doushin chaya\": \"童心茶屋\",\n        \"doutei shokudou\": \"童貞食堂\",\n        \"douwa-kensetsu\": \"童話建設\",\n        \"doux\": \"DOUX\",\n        \"downbeat\": \"downbeat\",\n        \"doyondo.\": \"どよんど。\",\n        \"dozo-mae\": \"どーぞーまえ\",\n        \"dragon edge\": \"龍泉\",\n        \"dragon goya\": \"ドラゴン小屋\",\n        \"dragon heart\": \"Dragon Heart\",\n        \"dragon island\": \"ドラゴンアイランド\",\n        \"dragonia\": \"どらごにあ\",\n        \"dragonstorm\": \"ドラゴンストーム\",\n        \"dragula\": \"DRAGULA\",\n        \"drain\": \"drain\",\n        \"drakle-nekota perpetual motion\": \"どらねこ永久機関\",\n        \"draw go\": \"Draw Go\",\n        \"drawpnir\": \"Drawpnir\",\n        \"dream chaser\": \"Dream Chaser\",\n        \"dream club\": \"ドリーム倶楽部\",\n        \"dream dot\": \"ドリームドット\",\n        \"dream halls\": \"Dream Halls!\",\n        \"dream house\": \"DREAM HOUSE\",\n        \"dream project\": \"ドリームプロジェクト\",\n        \"dream rider\": \"DREAM RIDER\",\n        \"dream-mist\": \"dream-mist\",\n        \"drei\": \"Drei\",\n        \"dress\": \"ドレス\",\n        \"dressblackheulee\": \"dressblackheulee\",\n        \"dressmash\": \"DRESSMASH\",\n        \"drill biyori\": \"どりる日和\",\n        \"drilln girl\": \"drill'n girl\",\n        \"drink it\": \"Drink it!\",\n        \"drivehome\": \"drivehome\",\n        \"drizzly rain\": \"drizzly rain\",\n        \"dro-ya\": \"泥屋\",\n        \"drop\": \"DROP\",\n        \"drops\": \"どろっぷす!\",\n        \"drum-kan\": \"ドラム缶\",\n        \"dryr\": \"DryR\",\n        \"dsb style\": \"DSB Style\",\n        \"dso\": \"でぃえすおー\",\n        \"dssk\": \"DSSK\",\n        \"dt koubou\": \"DT工房\",\n        \"dual beat\": \"DUAL BEAT\",\n        \"dual i fap\": \"Dual i fap\",\n        \"dualtail\": \"dual tail\",\n        \"dudedle studio\": \"デュードルスタジオ\",\n        \"dummyrun\": \"DUMMY RUN\",\n        \"dummyusagi\": \"DummyUsagi\",\n        \"dvcommunications\": \"DVコミュニケイションズ\",\n        \"dying kitchen z\": \"Dying Kitchen Z\",\n        \"dynamic kanoke\": \"ダイナミック棺桶\",\n        \"dynamite honey\": \"ダイナマイト☆ハニー\",\n        \"e\": \"e\",\n        \"e ali-al\": \"e☆ALI-aL!\",\n        \"e factory\": \"E factory\",\n        \"e ni kaita mochi\": \"絵にかいた餅\",\n        \"e project\": \"E project\",\n        \"e roman koubou\": \"江☆浪漫工房\",\n        \"e-10 field\": \"E-10フィールド\",\n        \"e-hentaicore\": \"E-Hentaicore\",\n        \"e-lse\": \"E-lse\",\n        \"e.b.\": \"E.B.\",\n        \"e50\": \"絵50\",\n        \"e649ne\": \"e649ne\",\n        \"e73\": \"E73\",\n        \"eapo-zu\": \"eapo-zu\",\n        \"ear-pop\": \"EAR-POP\",\n        \"earl lumines\": \"Earl LUMINES\",\n        \"earth-goya\": \"アース小屋\",\n        \"earthean\": \"アーシアン\",\n        \"earthlight\": \"アースライト\",\n        \"easy thrilling\": \"Easy Thrilling\",\n        \"easygame\": \"EasyGame\",\n        \"ebikino\": \"エビキノ\",\n        \"ebimashi\": \"えびまし\",\n        \"ebisen kikaku\": \"えびせん企画\",\n        \"ebisuya\": \"えびすや\",\n        \"ebisuyu\": \"ゑびす湯\",\n        \"ebitendon\": \"えびてん丼\",\n        \"ebysuya\": \"恵比寿屋\",\n        \"ecarlate\": \"E'carlate\",\n        \"eccentric girl\": \"エキセントリックガール\",\n        \"echigo-ya kikaku\": \"越後屋企画\",\n        \"echizen bugyousho\": \"越前奉行所\",\n        \"echo\": \"ECHO\",\n        \"echo view\": \"Echo View\",\n        \"echo.\": \"echo.\",\n        \"eclipse\": \"えくりぷす\",\n        \"eco-filter\": \"えこふぃるたぁ\",\n        \"ecolonun\": \"えころぬん\",\n        \"ecp\": \"ECP\",\n        \"ectoborn\": \"ectoborn\",\n        \"edash\": \"EDASH\",\n        \"edenmode\": \"EDENMODE\",\n        \"edge\": \"edge\",\n        \"edge diver\": \"Edge Driver\",\n        \"edge worth\": \"えっじわーす\",\n        \"edgeworthia\": \"Edgeworthia\",\n        \"edit\": \"edit\",\n        \"edo-ya\": \"EDO屋\",\n        \"edogawa koubou\": \"江戸川工房\",\n        \"ether\": \"エエテル\",\n        \"ef-labo\": \"ef-labo\",\n        \"effecter\": \"エフェクター\",\n        \"effordom soft\": \"エフォルダムソフト\",\n        \"egao ga ichiban\": \"笑顔が一番\",\n        \"eggplant\": \"えっぐぷらんと\",\n        \"ego\": \"イージーオー\",\n        \"ego dance\": \"EGO DANCE\",\n        \"egoism\": \"EGOISM\",\n        \"egonokatamari\": \"エゴノカタマリ\",\n        \"eichi jijou\": \"エイチジジョウ\",\n        \"chikatetsu shokudou\": \"地下鉄食堂\",\n        \"eien no 17-sai\": \"永遠の17歳\",\n        \"eight beat\": \"エイトビート\",\n        \"eight man\": \"eight man\",\n        \"eight world\": \"エイト・ワールド\",\n        \"eikyuu kikan\": \"永久機関\",\n        \"einfach\": \"einfach\",\n        \"einhorn\": \"あいんほるん\",\n        \"eins\": \"あいんず\",\n        \"einsatz gruppe\": \"EINSATZ GRUPPE\",\n        \"einshotenin\": \"アインショテンイン\",\n        \"eisaidou\": \"えーさい堂\",\n        \"eisbahn\": \"アイスバーン\",\n        \"eisei vegeta g\": \"衛星ベジータG\",\n        \"eisenhower\": \"あいぜんはわぁ\",\n        \"eiwa industries\": \"エイワインダストリーズ\",\n        \"ejigen\": \"EJIGEN\",\n        \"ek-shop\": \"eK-SHOP\",\n        \"ekakigoya\": \"絵描き小屋\",\n        \"ekakigoya notesystem\": \"絵描き小屋\",\n        \"ekitai no tomosha\": \"液体の友社\",\n        \"ekitica\": \"EKITICA\",\n        \"ekurabe\": \"エクラベ\",\n        \"el-ahrairah\": \"El-ahrairah\",\n        \"electric rokugen\": \"エレクトリックロクゲン\",\n        \"electrical\": \"エレクトリカル\",\n        \"electricsheep\": \"ElectricSheep\",\n        \"elephant.giraffe\": \"ELEPHANT.GIRAFFE\",\n        \"elf\": \"エルフ\",\n        \"elfin facies\": \"Elfin Facies\",\n        \"elflite\": \"elflite\",\n        \"elhearts\": \"ELHEART'S\",\n        \"elilys lab.\": \"Elily's Lab.\",\n        \"elithheart\": \"エリスハート\",\n        \"elle-murakami\": \"elle-叢神\",\n        \"ellese no yakata\": \"エリーゼの館\",\n        \"elza\": \"ELZA\",\n        \"emade.\": \"いーめいど。\",\n        \"emakiya-sakyodo\": \"絵巻屋紗香堂\",\n        \"empathy\": \"Empathy\",\n        \"empty lounge\": \"Empty Lounge\",\n        \"empty room\": \"Empty Room\",\n        \"emu\": \"emu\",\n        \"en\": \"袁\",\n        \"en-sof\": \"En-Sof\",\n        \"endless requiem\": \"Endless Requiem\",\n        \"endorphin\": \"Endorphin\",\n        \"energia\": \"えねるぎあ\",\n        \"energya\": \"エネルギヤ出版所\",\n        \"enfant terrible\": \"ENFANT TERRIBLE\",\n        \"engetsuten\": \"遠月点\",\n        \"england peach\": \"England Peach\",\n        \"engoutenma\": \"炎業天魔\",\n        \"enio\": \"Enio\",\n        \"enishi soft\": \"えにしそふと\",\n        \"enishing\": \"縁ing\",\n        \"enji\": \"ENJI\",\n        \"enjoy mix\": \"ENJOY MIX\",\n        \"enka boots\": \"塩化ブーツ\",\n        \"enkan\": \"円環\",\n        \"enmaya\": \"えんま屋\",\n        \"enmuhaze\": \"えんむへいず\",\n        \"ennui akatako\": \"アンニュイ赤蛸\",\n        \"ennui-tei\": \"アンニュイ亭\",\n        \"enokippu\": \"えのきっぷ\",\n        \"enokoro kurage\": \"えのころくらげ\",\n        \"enoughmin\": \"イナフミン\",\n        \"entelekheia\": \"エンテレケイア\",\n        \"entro beast\": \"エントロビースト\",\n        \"enueeru\": \"えぬえ～る\",\n        \"enuemu\": \"enuemu\",\n        \"enuma elish\": \"enuma elish\",\n        \"enyakora hoisassa\": \"えんやこら☆ほいさっさ\",\n        \"equivalence\": \"equivalence\",\n        \"era feel\": \"era feel\",\n        \"erare\": \"ERARE\",\n        \"erdelied\": \"エルデライド\",\n        \"erectlip\": \"エレクトリップ\",\n        \"erimo\": \"えりも\",\n        \"eringitoro salmon\": \"えりんぎとろサーモン\",\n        \"ero ero time\": \"エロ×2TIME\",\n        \"ero mangaka pikupikun\": \"えろ漫画家ピクピクン\",\n        \"ero spirits\": \"エロスピリッツ\",\n        \"erocawa tonya\": \"エロカワ問屋\",\n        \"erocs\": \"erocs\",\n        \"eroitto\": \"エロイット\",\n        \"eroliya\": \"えろり屋\",\n        \"eromafia\": \"エロマフィア\",\n        \"eromazun\": \"エロマズン\",\n        \"eronamin h\": \"エロナミンH\",\n        \"erondo\": \"eRONDO\",\n        \"eroro\": \"Eroro\",\n        \"eros and entertainment\": \"Eros&Entertainment\",\n        \"eroslium\": \"エロスリウム\",\n        \"erostellus\": \"Erostellus\",\n        \"erotic fantasy larvaturs\": \"らばた工房\",\n        \"erotic honeymoon\": \"Erotic Honeymoon\",\n        \"erotica black\": \"EROTICA BLACK\",\n        \"erotica peach\": \"EROTICA PEACH\",\n        \"erotis\": \"ErotIs\",\n        \"erotomania\": \"EROTOMANIA\",\n        \"error\": \"ERROR!\",\n        \"error404\": \"ERROR404\",\n        \"eruapo gundan\": \"エルアポ軍団\",\n        \"escape club\": \"ESCAPE CLUB\",\n        \"escapizma\": \"ESCAPIZMA\",\n        \"escargot club\": \"えすかるご倶楽部\",\n        \"esebateira\": \"エセバテイラ\",\n        \"esecool\": \"エセクール\",\n        \"esoragoto\": \"エソラゴト\",\n        \"espresso\": \"espresso\",\n        \"esto\": \"esto\",\n        \"estrella\": \"estrella\",\n        \"esuesu\": \"EsuEsu\",\n        \"esuodan\": \"えすおだん\",\n        \"esusaizu\": \"えすさいず\",\n        \"etc x etc\": \"ETC×ETC\",\n        \"etcycle\": \"etcycle\",\n        \"eterna-radiare\": \"エテルナ-ラディアーレ\",\n        \"eternal\": \"ETERNAL\",\n        \"eternal song\": \"Eternal Song\",\n        \"eternal world\": \"ETERNAL WORLD\",\n        \"eternal-eclipse\": \"ETERNAL-ECLIPSE\",\n        \"eterno\": \"Eterno\",\n        \"etigoya\": \"えち後屋\",\n        \"etoile zamurai\": \"エトワール待\",\n        \"etsuran\": \"悦卵\",\n        \"etwas\": \"etwas\",\n        \"eunospress\": \"ゆ～のす通信\",\n        \"eunox\": \"EUNOX\",\n        \"eunoxline\": \"EUNOXLINE\",\n        \"euphonia\": \"Euphonia\",\n        \"euphony production\": \"Euphony Production\",\n        \"euphoria\": \"euphoria\",\n        \"euphoric\": \"EUPHORIC!\",\n        \"eve\": \"Eve\",\n        \"eve-sya\": \"EVE-舎\",\n        \"eves garden box\": \"イヴの箱庭\",\n        \"evidence.\": \"Evidence.\",\n        \"evo.r.b\": \"宇行日和\",\n        \"evoll\": \"evoLL\",\n        \"evolution\": \"Evolution\",\n        \"evork festa\": \"Evork Festa\",\n        \"ewokakuman\": \"絵を描くマン\",\n        \"ews at works\": \"EWS@Works\",\n        \"ex production\": \"EXプロダクション\",\n        \"ex-\": \"EX-\",\n        \"ex-one\": \"EX-ONE\",\n        \"ex35\": \"EX35\",\n        \"excite\": \"絵喜祭人\",\n        \"excite neko\": \"エキサイト猫\",\n        \"excite rabbit\": \"えきらび\",\n        \"executor\": \"EXECUTOR ～エグゼクター～\",\n        \"exit nothing\": \"Exit Nothing\",\n        \"exodus\": \"エクソダス\",\n        \"explorer\": \"Explorer\",\n        \"extage\": \"EXtage\",\n        \"extern\": \"extern\",\n        \"extry\": \"ExTry\",\n        \"ezogoro\": \"エゾゴロウ\",\n        \"f no heya\": \"Fの部屋\",\n        \"f.w.zholic\": \"F.W.ZHolic\",\n        \"f.workshop\": \"F.Workshop\",\n        \"f4-company\": \"F4 COMPANY\",\n        \"face to face\": \"face to face\",\n        \"facehouse\": \"Facehouse\",\n        \"fact on fiction\": \"Fact on Fiction\",\n        \"faf\": \"FAF\",\n        \"fairy key\": \"フェアリーキー\",\n        \"fairy pink\": \"FAIRY PINK\",\n        \"fairy tale house\": \"Fairy Tale House\",\n        \"fake an\": \"FAKE庵\",\n        \"fake69rose\": \"fake69rose\",\n        \"fakepucco\": \"偽製pucco\",\n        \"faker\": \"Faker\",\n        \"fakereal\": \"FakeReal\",\n        \"falchion\": \"ファルシオン\",\n        \"fall-in-love\": \"Fall-in-Love\",\n        \"falling spiral\": \"Falling Spiral\",\n        \"fallinmoon\": \"FallinMoon\",\n        \"family affair\": \"Family Affair\",\n        \"family void\": \"ファミリーVOID\",\n        \"fan-na\": \"ふぁんな\",\n        \"fancy fantasia\": \"Fancy Fantasia\",\n        \"fancy feeling\": \"Fancy Feeling\",\n        \"fancy-polori\": \"空想ポロリ\",\n        \"fangs\": \"FANGS\",\n        \"fannel\": \"ファンネル\",\n        \"fantasy of vermilion\": \"Fantasy of Vermilion\",\n        \"fantasy wind\": \"FANTASY WIND\",\n        \"fap seisakusho\": \"FAP製作所\",\n        \"farthest land\": \"farthest land\",\n        \"fastest lap\": \"FASTEST LAP\",\n        \"fastrope\": \"FASTROPE\",\n        \"fat\": \"FAT\",\n        \"fatboy\": \"ふぁっとぼ～い\",\n        \"fatima cigarette\": \"Fatima Cigarette\",\n        \"favorite\": \"FAVORITE\",\n        \"fclg\": \"フクラグ\",\n        \"fechisupi\": \"ふぇちすぴ\",\n        \"feeld hern halle\": \"FEELD HERN HALLE\",\n        \"felicitan\": \"フェリシタン\",\n        \"felina\": \"Felina\",\n        \"felt-kobo\": \"ふぇると工房\",\n        \"femidrop\": \"フェミドロップ\",\n        \"femme enfant\": \"FEMME ♀ ENFANT\",\n        \"festa\": \"ふぇすた。\",\n        \"festival\": \"ふぇすてぃばる!\",\n        \"fetch\": \"Fetch\",\n        \"fetish\": \"ふぇてぃっしゅ\",\n        \"fetish children\": \"フェティッシュ チルドレン\",\n        \"fetism\": \"ふぇちずむ\",\n        \"fever lactic acid bacteria deluxe\": \"フィーバー乳酸菌DX\",\n        \"fhfhfh\": \"fhfhfh\",\n        \"fiance tank\": \"フィアンセ戦車\",\n        \"fiancee\": \"フィアンセ\",\n        \"fiesole\": \"Fiesole\",\n        \"fighting peroriina\": \"ファイティングペロリーナ\",\n        \"figure ni naritai zoku\": \"フィギュアになりたい\",\n        \"figure-hugging\": \"FIGURE-HUGGING\",\n        \"fika\": \"FIKA\",\n        \"film grain\": \"FILM GRAIN\",\n        \"final frontier\": \"FINAL FRONTIER\",\n        \"finecraft69\": \"Finecraft69\",\n        \"finish doll\": \"フィニッシュドール\",\n        \"fippenluck\": \"fippenluck\",\n        \"fire\": \"FIRE\",\n        \"firefly\": \"Firefly\",\n        \"fireworks\": \"ファイヤーワークス\",\n        \"first class\": \"1組\",\n        \"first crash\": \"ファーストクラッシュ\",\n        \"first mirage\": \"FIRST MIRAGE\",\n        \"firstspear\": \"Firstspear\",\n        \"fish\": \"FISH\",\n        \"fish and chicken\": \"魚肉と鳥肉\",\n        \"fishbone\": \"fish bone\",\n        \"fishneak\": \"Fishneak\",\n        \"five\": \"five\",\n        \"fivecoa.\": \"Fivecoa.\",\n        \"fiyorudou\": \"ふぃよる堂\",\n        \"fizz\": \"Fizz\",\n        \"fizzcode\": \"FIZZCODE\",\n        \"fjnsoft\": \"FJNsoft\",\n        \"flaming dragon\": \"フレイミングドラゴン\",\n        \"flamme soft\": \"ふらむそふと\",\n        \"flash point\": \"FLASH POINT\",\n        \"flat\": \"FLAT\",\n        \"flattwelve\": \"FLATTWELVE\",\n        \"flatwoods\": \"Flatwoods\",\n        \"flieger\": \"Flieger\",\n        \"flip tail\": \"FLIP TAIL\",\n        \"flock blue\": \"Flock Blue\",\n        \"flower child\": \"フラワーチャイルド\",\n        \"flowerblade\": \"FlowerBlade\",\n        \"flowerchildueda\": \"flowerchild植田\",\n        \"fluffy x fluffy\": \"fluffy×fluffy\",\n        \"fluid liquid\": \"ふるいどりきっど\",\n        \"fluorite\": \"ふろーらいと\",\n        \"flying chicken\": \"フライングチキン\",\n        \"flying panjandrum\": \"ふらいんぐパンジャンドラム\",\n        \"flyingcat\": \"FlyingCat\",\n        \"foliage fossil\": \"木葉化石\",\n        \"folkro\": \"フォルクロ\",\n        \"fonetrason\": \"FONETRASON\",\n        \"foo10\": \"Foo10\",\n        \"fool-in-love\": \"Fool-in-Love\",\n        \"forbidden-lips\": \"Forbidden-Lips\",\n        \"forest snow\": \"Forest Snow\",\n        \"forever and ever...\": \"Forever and ever...\",\n        \"fortress76\": \"七六要塞\",\n        \"fortuna\": \"FORTUNA\",\n        \"fortunequest\": \"FortuneQuest\",\n        \"foryourprotection\": \"ForYourProtection\",\n        \"foundation\": \"FOUNDATION\",\n        \"four leaves clover\": \"Four Leaves Clover\",\n        \"fourthcape\": \"fourthcape\",\n        \"fox-club\": \"FOX-CLUB\",\n        \"fp works\": \"FP WORKS\",\n        \"fractalthink\": \"FractalThink\",\n        \"fraeulein\": \"Fräulein\",\n        \"fragile\": \"fragile\",\n        \"fragrant olive\": \"Fragrant Olive\",\n        \"frank banana\": \"Frank Banana\",\n        \"frank factory\": \"Frank Factory\",\n        \"frapowa\": \"ふらぽわ\",\n        \"frapper spirits\": \"ふらすぴ\",\n        \"freakilycharming\": \"FreakilyCharming\",\n        \"freaks\": \"フリークス\",\n        \"free color 814\": \"フリーカラー814\",\n        \"free heaven\": \"FREE HEAVEN\",\n        \"free style\": \"Free Style\",\n        \"freedom\": \"FREEDOM\",\n        \"freedom prophet\": \"フリーダムプロフェット\",\n        \"freedom tomy r\": \"フリーダム☆トミーR\",\n        \"freelife\": \"freelife\",\n        \"freeze world\": \"フリーズワールド\",\n        \"french cancan\": \"フレンチカンカン\",\n        \"fresh fruit s\": \"Fresh Fruit S\",\n        \"fresnel lens\": \"ふれぇねるれんず\",\n        \"freud no inmu\": \"フロイトの淫夢\",\n        \"fried kitchen.\": \"ふらいどきっちん。\",\n        \"friendly sky\": \"Friendly Sky\",\n        \"fringe flange\": \"フリンジフランジ\",\n        \"from control\": \"from control\",\n        \"from japan\": \"ふろむ・じゃぱん\",\n        \"from nou kanja no kai\": \"フロム脳患者の会\",\n        \"from scratch\": \"from SCRATCH\",\n        \"frontline\": \"ふろんとらいん\",\n        \"fruitsjam\": \"フルーツJAM\",\n        \"fly dish\": \"ふらいでぃっしゅ\",\n        \"fss\": \"FSS\",\n        \"fuantei\": \"ふあん亭\",\n        \"fudegaki soft\": \"筆柿そふと\",\n        \"fudomae5\": \"フドウマエ5\",\n        \"fuego\": \"FUEGO\",\n        \"fuerzabruta\": \"Fuerzabruta\",\n        \"fugu macaroni\": \"フグマカロニ\",\n        \"fugudoku\": \"川豚毒\",\n        \"fuguri\": \"ふぐり\",\n        \"fuhatudan.\": \"不発団。\",\n        \"fuji sangou koubou\": \"富士参號工房\",\n        \"fuji yoshida sa\": \"藤吉田SA\",\n        \"fujidan\": \"藤団\",\n        \"fujikome-ya\": \"藤米屋\",\n        \"fujiiro bomber\": \"ふじいろボンバー\",\n        \"fujiiro sabou\": \"藤色茶房\",\n        \"fujiko fujio fc kurosawa kei\": \"藤子不二雄FC黒沢系\",\n        \"fujinomiya millenium\": \"藤ノ宮ミレニアム\",\n        \"fujitomomo\": \"藤と桃\",\n        \"fujiya\": \"ふじ家\",\n        \"fujiyuu kenkyuu\": \"不自由研究\",\n        \"fukafuka moufu\": \"ふかふか毛布\",\n        \"fukafuka tenshoku\": \"ふかふか天職\",\n        \"fukagawa\": \"深川\",\n        \"fukahire\": \"フカヒレ\",\n        \"fukakutei kuukan\": \"不確定空間\",\n        \"fukame takame\": \"ふかめたかめ\",\n        \"fukashigi\": \"不可思議\",\n        \"fukasu-santaro\": \"深酢さんたろ\",\n        \"fukazume kizoku\": \"深爪貴族\",\n        \"fuketsudan\": \"不決断\",\n        \"hukidamari\": \"吹溜\",\n        \"fukucha koubou\": \"福茶工房\",\n        \"fukuda sennen oukoku\": \"福田千年王国\",\n        \"fukugou marjoram\": \"複合マジョラム\",\n        \"fukumaden\": \"伏魔殿\",\n        \"fukunoren\": \"福のれん\",\n        \"fukupukutei\": \"福ぷく亭\",\n        \"fukurou naru tori\": \"フクロウなる鳥\",\n        \"fukurou no yuubinya san\": \"梟の郵便屋さん\",\n        \"fukurou-ya\": \"梟屋\",\n        \"fukuya\": \"福屋\",\n        \"full accele\": \"フルアクセル\",\n        \"full bottle\": \"フルボトル\",\n        \"full flap\": \"フルフラップ\",\n        \"fullauto firing\": \"fullauto firing\",\n        \"fullbloom\": \"fullbloom\",\n        \"fullbottom\": \"FULLBOTTOM\",\n        \"fullmetal madness\": \"FULLMETAL MADNESS\",\n        \"fullmoff\": \"ふるもっふ\",\n        \"fullmoon and tangerine\": \"満月と蜜柑\",\n        \"fulloro\": \"fulloro\",\n        \"fullswing otome\": \"フルスイングオトメ\",\n        \"fumichaya\": \"史茶屋\",\n        \"fumifumi cat\": \"ふみふみ☆きゃっと\",\n        \"fumikan.\": \"ふみかん。\",\n        \"fumikirimae\": \"踏切前\",\n        \"fumitsuke\": \"ふみつけ\",\n        \"funa time\": \"ふなたいむ\",\n        \"funanori house\": \"ふなのりはうす\",\n        \"funiai-ice\": \"ふにあいあいす\",\n        \"funi funi soft\": \"ふにふにソフト\",\n        \"funikigumi\": \"雰囲気組\",\n        \"funimani\": \"ふにまに\",\n        \"funiya\": \"ふに屋\",\n        \"funny devil\": \"Funny Devil\",\n        \"funny rays\": \"ファニーレイズ\",\n        \"funwari rice\": \"ふんわり☆らいす\",\n        \"funyuhanyounyaran\": \"ふにゅはにょうにゃらん\",\n        \"furafuradou\": \"ふらふら堂\",\n        \"furansowa\": \"ふらんそわ\",\n        \"furi furi paradise\": \"Furi Furi PARADISE\",\n        \"furikake parapara\": \"ふりかけぱらぱら\",\n        \"furitendou\": \"フリテン堂\",\n        \"furrock\": \"ふぁーろっく\",\n        \"furry fandom\": \"ふぁ～りぃ☆ふぁんだむ\",\n        \"furscoblus\": \"Furscoblus\",\n        \"furuhonya\": \"古本屋\",\n        \"furuike\": \"furuike\",\n        \"furuya\": \"ふる屋\",\n        \"fushigi dou\": \"フシギ堂\",\n        \"fushinsya guilty\": \"不審者罪\",\n        \"fushizen doubutsu hogodantai\": \"不自然動物保護団体\",\n        \"fusions\": \"Fusions\",\n        \"fusuido\": \"封粋堂\",\n        \"fusuma goten\": \"ふすま御殿\",\n        \"futaba\": \"双葉\",\n        \"futabasshu\": \"ふたばっしゅ\",\n        \"futabatei\": \"ふたば亭\",\n        \"futaburo\": \"ふたブロ\",\n        \"futagotei\": \"双子亭\",\n        \"futaket junbikai\": \"ふたけっと準備会\",\n        \"futamura futon ten\": \"ふたむらふとん店\",\n        \"futanarist zatsudan\": \"ふたなりすと雑談\",\n        \"futanarun\": \"ふたなるん\",\n        \"futanaya\": \"フタナ屋\",\n        \"futatsu no hokuro\": \"ふたつのほくろ\",\n        \"futeikei zenzai\": \"不定形ぜんざい\",\n        \"futon mushi\": \"布団虫\",\n        \"futonton\": \"布団団\",\n        \"futoumei z\": \"不透明Z\",\n        \"future\": \"future\",\n        \"futurepack\": \"Futurepack\",\n        \"fuuga\": \"風☆雅\",\n        \"fuukyou kimiko\": \"風狂公子\",\n        \"fuuma kekkai\": \"風舞結界\",\n        \"huurai no dan\": \"風来の団\",\n        \"fuurintei\": \"風鈴亭\",\n        \"fuusa ryouiki\": \"封鎖領域\",\n        \"fuusen club kuroshiki\": \"風船クラブ「黒式！」\",\n        \"fuwa fuwa pinkchan\": \"ふわふわぴんくちゃん\",\n        \"fuwatoro marinepolis\": \"ふわとろ★まりんぽりす\",\n        \"fuwatto\": \"ふわっと\",\n        \"fuyu wa samui\": \"冬は寒い\",\n        \"fuyugomori\": \"FUYUGOMORI\",\n        \"fuyunonchi\": \"冬のん家\",\n        \"fuzainoyamada\": \"ふざいのやまだ\",\n        \"fz5000\": \"FZ5000\",\n        \"g equals kundow\": \"G=Kundow\",\n        \"g-cage\": \"G-CAGE\",\n        \"g-complex\": \"G-complex\",\n        \"g-planet\": \"G-PLANET\",\n        \"g-power\": \"G-Power!\",\n        \"g-r\": \"G-R\",\n        \"g-ring\": \"G-RING\",\n        \"g-rough\": \"g-rough\",\n        \"g-scan corp.\": \"G-SCAN CORP.\",\n        \"g-spot\": \"じぃすぽっと\",\n        \"g.b.f\": \"G.B.F\",\n        \"g.entertainment\": \"G.Entertainment\",\n        \"g.g.blue\": \"G.G.BLUE\",\n        \"g.g.g.\": \"G.G.G.\",\n        \"g.g.t.\": \"G.G.T.\",\n        \"g.k.p.\": \"g.k.p.\",\n        \"g500\": \"G500\",\n        \"ga fake\": \"ガ・フェーク\",\n        \"gaball screen\": \"GABALL SCREEN\",\n        \"gabugabu\": \"GABUGABU\",\n        \"gabunomi tororokonbu\": \"がぶ飲みとろろ昆布\",\n        \"gacha\": \"画チャ\",\n        \"gachapin mukku.\": \"がちゃぴんむっく。\",\n        \"gachi drunkers\": \"ガチ★ドランカーズ\",\n        \"gachinko shobou\": \"我チ○コ書房\",\n        \"gadget\": \"ガジェット工房\",\n        \"gadoujuku\": \"我道塾\",\n        \"gagaga honpo\": \"ガガガ本舗\",\n        \"gagaken\": \"画々研\",\n        \"gaikotsu no spare rib\": \"骸骨のスペアリブ\",\n        \"gaisei dou\": \"凱聖堂\",\n        \"gakeppuchi koubou\": \"崖っぷち工房\",\n        \"gakuen ketsumeichou\": \"學園血盟帖\",\n        \"gakuen yuushabu\": \"学園勇者部\",\n        \"gakugen\": \"楽玄\",\n        \"gakupoppo\": \"牙九ぽっぽ\",\n        \"galapagos\": \"ガラパゴス\",\n        \"galaxy ginga\": \"ギャラクシー銀河\",\n        \"galaxy style\": \"GALAXY STYLE\",\n        \"galerie.\": \"Galerie.\",\n        \"galette\": \"Galette\",\n        \"gallery culter\": \"Gallery Culter\",\n        \"gallery walhalla\": \"gallery walhalla\",\n        \"gallerycraft\": \"ギャラリークラフト\",\n        \"galley\": \"Galley\",\n        \"gallop\": \"gallop\",\n        \"gallphilia\": \"gallphilia\",\n        \"galvas\": \"GALVAS\",\n        \"gamanjiru-ni-chinpaipai\": \"我☆慢☆汁にチンパイパイ\",\n        \"game dome\": \"GAME DOME\",\n        \"game dome ariake\": \"GAME DOME 有明店\",\n        \"game dome hamamatsuchouten\": \"GAME DOME 浜松町店\",\n        \"game technopolis\": \"GAMEテクノポリス\",\n        \"gamenhaji\": \"がめんはじ\",\n        \"gamenhaji no yoru\": \"画面端の夜\",\n        \"games express\": \"ゲーム・エクスプレス\",\n        \"gamugumi\": \"ガムグミ\",\n        \"gamute de kotei\": \"ガムテで固定\",\n        \"ganbari machine\": \"ガンバリマシン\",\n        \"gang koubou\": \"ぎゃんぐ工房\",\n        \"ganmenki joe\": \"巌面鬼JOE\",\n        \"ganmo-no-oyatsu\": \"がんものおやつ\",\n        \"ganmou koubou\": \"がんもぅ工房\",\n        \"ganso sonodaya\": \"元祖園田屋\",\n        \"gaptax\": \"GapTax\",\n        \"gara ayuri nisshi\": \"柄あゆり日誌\",\n        \"garage-talk\": \"garage-talk\",\n        \"garakuta ga oka\": \"ガラクタが丘\",\n        \"garakuta teikoku\": \"がらくた帝國\",\n        \"garakuta-ya\": \"我楽多屋\",\n        \"garam\": \"ガラム\",\n        \"garamumasara\": \"がらむまさら\",\n        \"garandou\": \"がらんどう\",\n        \"garbage\": \"がーべいじ\",\n        \"garden in the air\": \"Garden in the Air\",\n        \"gargoyle\": \"Gargoyle\",\n        \"garigarigari\": \"がりがりがり\",\n        \"garland\": \"Garland\",\n        \"garou kissa hapido\": \"画廊喫茶はぴど\",\n        \"gasayabu\": \"がさやぶ\",\n        \"gashadokuro\": \"がしゃどくろ\",\n        \"gasoku\": \"GASOKU\",\n        \"gate two\": \"GATE TWO\",\n        \"gateau scotch\": \"ガトースカッチ\",\n        \"gaten\": \"画展\",\n        \"gattomakia\": \"ガットマキア\",\n        \"gauloises blue\": \"GAULOISES BluE\",\n        \"gaus\": \"GAUS\",\n        \"gawwow\": \"gawwow!\",\n        \"gby\": \"GBY\",\n        \"gc-dan\": \"GC団\",\n        \"gdmd.\": \"gdmd.\",\n        \"geafcart\": \"ギーフカート\",\n        \"geboku shuppan\": \"下僕出版\",\n        \"gedou shoukai\": \"外道商会\",\n        \"gehlenite\": \"Gehlenite\",\n        \"geiwamiwosukuu\": \"芸は身を救う!!\",\n        \"gekidan asaroku\": \"劇団あさろく\",\n        \"gekidan bunshichi\": \"劇団文七\",\n        \"gekidan kinmirai\": \"劇團近未来\",\n        \"gekidan onigashima\": \"劇団☆鬼ヶ島\",\n        \"gekijou pierrot\": \"激情ピエロ\",\n        \"gekikara\": \"GEKIKARA\",\n        \"gekirou director\": \"激浪Director\",\n        \"gekiteki gekidan l\": \"劇的劇団エル\",\n        \"gekka bijin\": \"月下美刃\",\n        \"gekka no neko\": \"月華の猫\",\n        \"gekkan hitorizumou\": \"月刊一人相撲\",\n        \"gekkan toshiue milk tank\": \"月刊年上ミルクタンク\",\n        \"gekkou sanctuary\": \"月光サンクチュアリ\",\n        \"gekkou tei\": \"月光亭\",\n        \"gekkou touzoku\": \"月光盗賊\",\n        \"gekkou-dou\": \"月咬洞\",\n        \"gekkouya\": \"げっこうや\",\n        \"gelatin utopia\": \"ゼラチンユートピア\",\n        \"gem\": \"GEM\",\n        \"gemasyafyu\": \"ゲマシャフュ\",\n        \"gemou the cat\": \"ゲモウ the Cat\",\n        \"gen sou dokoro\": \"幻創処\",\n        \"genei teito\": \"幻影帝都\",\n        \"geneihohjin\": \"幻影法人\",\n        \"general tank\": \"じぇねらるたんく\",\n        \"genetrix\": \"GENETRIX\",\n        \"genkei yuugi\": \"幻繋遊戯\",\n        \"genki honpo\": \"元気本舗\",\n        \"genki no mizu no wakutokoro\": \"げんきのみずのわくところ\",\n        \"genkotsu dan\": \"げんこつ団\",\n        \"genmonrou\": \"幻門楼\",\n        \"genocide\": \"GENOCIDE\",\n        \"genocide niku shoujo\": \"ジェノサイド肉少女\",\n        \"genocidou\": \"ジェノサイ堂\",\n        \"genshoku sweets\": \"原色スイーツ\",\n        \"genshoudou\": \"幻笙堂\",\n        \"gensou eigakan\": \"幻創映画館\",\n        \"gensou graphics\": \"幻想グラフィックス\",\n        \"gensou hack\": \"幻想ハック\",\n        \"gensou kuukan\": \"幻蒼空間\",\n        \"gensou kyoukai\": \"幻想協会\",\n        \"gensou mikan\": \"幻想美甘\",\n        \"gensou pheles\": \"幻想フェレス\",\n        \"gensou seimeitai\": \"幻想生命体\",\n        \"gensyokuhakoniwa\": \"原色箱庭\",\n        \"gentei mikan\": \"限定蜜柑\",\n        \"gentleman trap\": \"紳士罠\",\n        \"gentou matenrou\": \"幻灯摩天楼\",\n        \"genussmittel\": \"ゲヌスミッテル\",\n        \"genyukyo\": \"幻遊郷\",\n        \"geosiphon\": \"Geosiphon\",\n        \"geranium\": \"GERANIUM\",\n        \"gerhard\": \"GERHARD\",\n        \"german kartoffel\": \"じゃーまんかとっふぇる\",\n        \"gerudochuu oukoku\": \"げるどちゅう王国\",\n        \"gesellschaft\": \"ゲゼルシャフト\",\n        \"gessen do\": \"月泉堂\",\n        \"gessyu\": \"げっしゅ\",\n        \"gesuko no heya\": \"ゲス子のへや\",\n        \"getsusekai\": \"月世界\",\n        \"getsuyoubi no brenda\": \"月曜日ノぶれんだ\",\n        \"gettsu\": \"GETTSU\",\n        \"gewalt\": \"Gewalt\",\n        \"gh\": \"GH\",\n        \"gh.k\": \"GH.K\",\n        \"ghost\": \"Ghost\",\n        \"gift\": \"Gift\",\n        \"giftbell\": \"ぎふとべる\",\n        \"giftkuchen\": \"GiftKuchen\",\n        \"gigameka\": \"ギガメーカー\",\n        \"giman no hakoniwa\": \"欺瞞の箱庭\",\n        \"gimme logic\": \"Gimme Logic\",\n        \"gimmix\": \"ギミックス\",\n        \"gin no ringo\": \"銀の林檎\",\n        \"gin penguin\": \"銀ぺんぎん\",\n        \"ginchaya\": \"銀茶屋\",\n        \"gindokei\": \"銀時計\",\n        \"ginga toppuu\": \"銀河突風\",\n        \"ginga-ryusei\": \"銀河流星\",\n        \"ginger\": \"Ginger\",\n        \"gingerblend\": \"Gingerblend\",\n        \"ginhakushi\": \"銀白紙\",\n        \"giniro noel\": \"銀色ノエル\",\n        \"ginjou maggots\": \"吟醸マゴッツ\",\n        \"ginshari.\": \"ぎんしゃり。\",\n        \"ginsiba.\": \"ぎんしば。\",\n        \"ginto\": \"銀兎\",\n        \"gioncarnival\": \"擬音謝肉祭\",\n        \"gipsy underground\": \"Gipsy underground\",\n        \"girigiri nijiiro\": \"ギリギリ虹色\",\n        \"girigiri works\": \"ギリギリWorks\",\n        \"girin mahha\": \"ぎんりんまっは\",\n        \"girlboy\": \"Girlboy\",\n        \"girls kingdom\": \"少女の王国\",\n        \"girls residence\": \"GIRLS RESIDENCE\",\n        \"girls-potion\": \"Girls-Potion\",\n        \"girls...now\": \"Girls...Now\",\n        \"girlsport\": \"GirlSport\",\n        \"giro chinko shoukai\": \"ギロ・チン子商会\",\n        \"giroutei\": \"妓楼亭\",\n        \"giuniuya\": \"ぎうにう屋\",\n        \"gj-x\": \"GJ-X\",\n        \"gkvoltage\": \"GKボルテージ\",\n        \"glace\": \"GLace\",\n        \"glamour works\": \"GLAMOUR WORKS\",\n        \"glass no kabocha\": \"ガラスのカボチャ\",\n        \"glass wall garden\": \"ぐらすうぉーるがーでん\",\n        \"glassed concrete\": \"ガラストコンクリート\",\n        \"glasses perser\": \"グラセスパーサー\",\n        \"glassfiber\": \"グラスファイバー\",\n        \"glaze\": \"glaze\",\n        \"gleipnir\": \"Gleipnir\",\n        \"globe\": \"GLOBE\",\n        \"glutamic acid\": \"GLUTAMIC:ACID\",\n        \"gmr\": \"牛MR\",\n        \"go go heaven\": \"Go! Go! Heaven!!\",\n        \"go-go-merry-go-round\": \"Go-Go-Merry-Go-Round\",\n        \"goberazzo\": \"ごべらっつぉ\",\n        \"god hand mar\": \"God Hand Mar\",\n        \"godbirdlove\": \"ゴッドバードLOVE\",\n        \"goddandies\": \"GodDandies\",\n        \"godfinmew\": \"Godfinmew\",\n        \"godone syndrome\": \"五度寝シンドローム\",\n        \"gohanya\": \"ごはん屋\",\n        \"gohyakuen chokinbako\": \"五百円貯金箱\",\n        \"gokakukansuu\": \"五角関数\",\n        \"gokigen takabisha\": \"ゴキゲン高飛車\",\n        \"goku-raku\": \"GOKU-RAKU\",\n        \"gokuaku shounin henshuubu\": \"極悪商人編集部\",\n        \"gokufero\": \"極フェロ\",\n        \"gokuraku-chou yon-choume\": \"獄楽町四丁目\",\n        \"gokutsubushi\": \"穀潰し\",\n        \"gold dust\": \"GOLD DUST\",\n        \"gold koman sex\": \"GOLD KOMAN SEX\",\n        \"gold leaf\": \"GOLD LEAF\",\n        \"gold lip\": \"ゴールドリップ\",\n        \"gold ninja\": \"黄金忍者\",\n        \"gold rush\": \"GOLD RUSH\",\n        \"golden bat\": \"GOLDEN BAT\",\n        \"golden fever\": \"ゴールデンフィーバー\",\n        \"golden tube\": \"ゴールデンチューブ\",\n        \"goldendawn89\": \"GoldenDawn89\",\n        \"golem inc.\": \"Golem Inc.\",\n        \"goma brothers\": \"ごまブラザーズ\",\n        \"goma hangetsu\": \"ごまはんげつ\",\n        \"gomadoufu\": \"ごまどうふ\",\n        \"gomafu toufudou\": \"ゴマフ豆腐堂\",\n        \"gomaneko brief\": \"ごまねこブリーフ\",\n        \"gomigomi seisaku iinkai\": \"ゴミゴミ制作委員会\",\n        \"gomix\": \"GOMIX!\",\n        \"gomiyashiki\": \"五三八式\",\n        \"gomoku gohan\": \"五目ごはん\",\n        \"gomuhachi\": \"ごむはち\",\n        \"goo-paaa\": \"goo-paaa\",\n        \"good bye life\": \"Good Bye Life\",\n        \"goodluck\": \"Goodluck\",\n        \"goodsleep\": \"GoodSleep!\",\n        \"goosebumps\": \"goosebumps\",\n        \"goraku hiroba\": \"娯楽広場\",\n        \"gorgeous lunch\": \"ゴージャスランチ\",\n        \"gorichu\": \"ゴリッチュ\",\n        \"gorigorilland\": \"ゴリゴリランド\",\n        \"gorilion\": \"ゴリライオン\",\n        \"gorilla gang dan\": \"ゴリラギャング団\",\n        \"gorilla squad\": \"ゴリラスクワッド\",\n        \"gorilla typhoon\": \"ゴリラタイフーン\",\n        \"gorinjuu\": \"ご臨終\",\n        \"goro mask\": \"クチナシ館\",\n        \"gorori no diy\": \"ゴロリのDIY\",\n        \"gorotaishi\": \"五郎太石\",\n        \"gos to vi\": \"gos to vi\",\n        \"gosousha\": \"護送車\",\n        \"gossipgothic\": \"ごしっぷごしっく\",\n        \"gosuidou\": \"午睡堂\",\n        \"gothical blade\": \"GOTHICAL BLADE\",\n        \"gothya\": \"ゴス屋\",\n        \"gotouroku-goku\": \"誤登録語句\",\n        \"gouon\": \"轟音\",\n        \"gouriki hyakkaten\": \"剛力百貨店\",\n        \"gouten doujou\": \"轟天道場\",\n        \"goutwollow\": \"GoutWolloW\",\n        \"gozen shichiji no awase kagami\": \"午前七時の合わせカガミ\",\n        \"gozenrokuji\": \"午前六時\",\n        \"gpen\": \"じーぺん\",\n        \"gpx\": \"GPX\",\n        \"grace\": \"Grace\",\n        \"grachegrache\": \"ぐらっちぇぐらっちぇ\",\n        \"graf zeppelin\": \"Graf Zeppelin\",\n        \"grafroller\": \"Grafroller\",\n        \"granberry heaven\": \"グランベリーヘヴン\",\n        \"grand cru\": \"Grand Cru\",\n        \"grand-nauts\": \"grand-nauts\",\n        \"grand-slum\": \"grand-slum\",\n        \"graphicarossa\": \"GRAPHICAROSSA\",\n        \"grary\": \"Grary\",\n        \"grassturtle\": \"グラスタートル\",\n        \"grauer hase\": \"グラウエルハーゼ\",\n        \"gravidan\": \"ぐらヴィ団\",\n        \"graygreed\": \"graygreed\",\n        \"grazie\": \"grazie\",\n        \"grease pencil\": \"グリースペンシル\",\n        \"great acta\": \"GREAT芥\",\n        \"great dadan\": \"ぐれいと・だだん\",\n        \"greatest kyuutei\": \"グレイテスト宮廷\",\n        \"green ketchup\": \"グリーンケチャップ\",\n        \"green star\": \"GREEN STAR\",\n        \"green tea lab\": \"Green tea Lab\",\n        \"greenhouse\": \"ぐりいん野はうす\",\n        \"greg soujou\": \"グレッグ僧正\",\n        \"greone\": \"GREONE\",\n        \"greyhound\": \"Greyhound\",\n        \"group 601\": \"グループ601\",\n        \"group hinoran\": \"ぐる～ぷひのらん\",\n        \"group i.n\": \"グループI・N\",\n        \"group neko\": \"グループNEKO\",\n        \"grungeworks\": \"GRUNGE WORKS\",\n        \"gt works\": \"GT Works\",\n        \"gu no nai curry\": \"具のないカレー\",\n        \"guchi wotabatake\": \"愚痴ヲタ畑\",\n        \"gudon-no-uta\": \"ぐどんの歌\",\n        \"guhan shounen\": \"虞犯少年\",\n        \"guild plus\": \"Guild Plus\",\n        \"guillotine mozzarella\": \"ぎろちんモッツァレラ\",\n        \"gul-fuh\": \"Gul-Fuh\",\n        \"gulf stream\": \"Gulf Stream\",\n        \"gum base\": \"ガムベース\",\n        \"gum junky\": \"ガムジャンキー\",\n        \"gumi syrup\": \"グミシロップ\",\n        \"guminchu\": \"ぐみんちゅ\",\n        \"gummy-rise\": \"ガミ・ライズ\",\n        \"gun modoki\": \"群モドキ\",\n        \"gunjou kakumei\": \"群青革命\",\n        \"gunjougoya\": \"群青小屋\",\n        \"gunp\": \"GUNP\",\n        \"guntank\": \"ガンタンク\",\n        \"gurasan boots\": \"ぐらさんぶーつ\",\n        \"guru guru honpo\": \"ぐるぐる本舗\",\n        \"guruguru honpo\": \"ぐるぐる本舗\",\n        \"guruguru taiyo\": \"ぐるぐる太陽\",\n        \"gurumedou\": \"ぐるめ堂\",\n        \"gurumepoppo\": \"ぐるめポッポ\",\n        \"gururido\": \"ぐるり堂\",\n        \"gusha\": \"グシャ!!\",\n        \"gutari-ya\": \"ぐたり屋\",\n        \"gutenberg no musume\": \"グーテンベルグの娘\",\n        \"guts ichimotsu\": \"ガッツいちもつ\",\n        \"guy-ya\": \"男屋\",\n        \"guybase\": \"GUY基地\",\n        \"gyara cter\": \"ギャラ☆クター\",\n        \"gyarandoh\": \"逆乱堂\",\n        \"gyarandou\": \"ぎゃらん堂\",\n        \"gyf-107\": \"GYF-107\",\n        \"gymno\": \"gymno\",\n        \"gyogyou rengou\": \"漁業連合\",\n        \"gyokotsu kouzou\": \"魚骨工造\",\n        \"gyokumi\": \"漁組\",\n        \"gyokusai club\": \"玉砕倶楽部\",\n        \"gyokusaidan\": \"玉砕団\",\n        \"gyokusaijima\": \"玉砕島\",\n        \"gyomania\": \"ギョマニア\",\n        \"gyotaku\": \"魚拓\",\n        \"gyoubudou\": \"刑部堂\",\n        \"gyoukousyu\": \"僥倖酒\",\n        \"gyoutenriki\": \"仰天力\",\n        \"gyunyu-gekijo\": \"牛乳劇場\",\n        \"gyutto dakishimetai\": \"ギュっと抱きしめ隊\",\n        \"gyuunyuuya\": \"牛乳屋\",\n        \"gyuutou chikujinkai\": \"牛頭畜人会\",\n        \"h and k\": \"H&K\",\n        \"h na hon. ya san.\": \"Hなほん。やさん。\",\n        \"h plus\": \"H+\",\n        \"h senshokutai\": \"H染色体\",\n        \"h-net\": \"H-net\",\n        \"h-squad\": \"H-SQUAD\",\n        \"h-sys.\": \"H-sYS.\",\n        \"h.a.h.g.s\": \"H.A.H.G.S\",\n        \"h.h\": \"H.H\",\n        \"h.i.t. koubou\": \"H.I.T.工房\",\n        \"h.p.c. meirei denpa\": \"H.P.C命令電波\",\n        \"h.p.d.\": \"H.P.D.\",\n        \"h.s.c.\": \"H.S.C.\",\n        \"h3i\": \"H×3I\",\n        \"haa haa works\": \"はぁはぁWORKS\",\n        \"hacca candy\": \"薄荷キャンディー\",\n        \"hacchakesou\": \"はっちゃけ荘\",\n        \"hachi\": \"hachi\",\n        \"hachibanchi no kaijin\": \"八番地の怪人\",\n        \"hachigatsu futsuka\": \"八月二日\",\n        \"hachijikan roudou\": \"はちじかんろーどー\",\n        \"hachikoromura\": \"はちころ村\",\n        \"hachimidosan\": \"八緑緑緑\",\n        \"hachimin\": \"ハチミン\",\n        \"hachimitsu himawari\": \"ハチミツヒマワリ\",\n        \"hachimitsu pineapple\": \"はちみつパイナップル\",\n        \"hachimitsu sand\": \"はちみつサンド\",\n        \"hachimitsu soft\": \"はちみつそふと\",\n        \"hachiwaredou\": \"ハチワレ堂\",\n        \"hachiyou\": \"蜂様\",\n        \"hadairo crayon\": \"はだいろクレヨン\",\n        \"hadairo rooibos tea\": \"肌色ルイボスティー\",\n        \"hadairozanmai\": \"肌色三昧\",\n        \"hadantorque\": \"破断torque\",\n        \"hadashi shoujo\": \"裸足少女\",\n        \"haekake\": \"生えかけ\",\n        \"haeya\": \"南風屋\",\n        \"hagane koubou\": \"鋼工房\",\n        \"hagane no naru ki\": \"羽鐘の鳴る木\",\n        \"hagane no tsurugi\": \"はがねのつるぎ\",\n        \"hagure maron\": \"はぐれまろん\",\n        \"haguruma\": \"はぐるま\",\n        \"haguruman\": \"はぐるまん\",\n        \"hai-tai\": \"胚胎\",\n        \"haiana gumentai\": \"肺穴愚麺隊\",\n        \"haiboku kamen\": \"敗北仮面\",\n        \"haidara\": \"haidara\",\n        \"haigoku ryodan\": \"廃獄旅団\",\n        \"haiiro jikuu\": \"灰色時空\",\n        \"haiiro koubou betsumune\": \"灰色工房別棟\",\n        \"haiiro ookami\": \"灰色狼\",\n        \"haikara cafe\": \"ハイカラ喫茶\",\n        \"haikibutsushorijou\": \"廃棄物処理場\",\n        \"haikiro\": \"灰奇路\",\n        \"haikuo-soft\": \"ハイクオソフト\",\n        \"haim mint\": \"ハイムミント\",\n        \"haine club\": \"灰猫倶楽部\",\n        \"hairyo fusoku\": \"配慮不足\",\n        \"haisui no jin\": \"ハイスイノ陣\",\n        \"haitokukan\": \"背德漢\",\n        \"hajimari to owari\": \"はじまりとおわり\",\n        \"hakaba\": \"墓場\",\n        \"hakidame no koganemushi\": \"掃き溜めのこがねむし\",\n        \"hakka onsen\": \"ハッカ温泉\",\n        \"hakkakyou\": \"八卦鏡\",\n        \"hakkekkyuu sekkekkyuu\": \"白血球赤血球\",\n        \"hakkindo\": \"白金堂\",\n        \"hakobune\": \"箱舟\",\n        \"hakkou kimuti\": \"発光きむち\",\n        \"hakoniwa toshokan\": \"ハコニワトショカン\",\n        \"hakonyan.\": \"はこにゃん。\",\n        \"hakorimu\": \"はこりむ\",\n        \"hakubajin\": \"はくばじん\",\n        \"hakuchuu doudou\": \"白昼堂々\",\n        \"hakuchuu shobou\": \"白昼書房\",\n        \"hakudakukei\": \"白濁系\",\n        \"hakuginkan\": \"白銀冠\",\n        \"hakugyoku aquarea\": \"白玉アクエリア\",\n        \"hakushu kassai\": \"拍手喝罪\",\n        \"hakusuijuko\": \"白水重工\",\n        \"hakusyoku miminagaten\": \"白触耳長店\",\n        \"hakutoukai\": \"白糖会\",\n        \"hakuzendo honpo\": \"白髯堂本舗\",\n        \"halcyon\": \"Halcyon\",\n        \"halcyon factory\": \"Halcyon Factory\",\n        \"halcyon maker\": \"ハルシオンメーカー\",\n        \"half mile\": \"はーふまいる\",\n        \"hallenchi planet\": \"ハレンチプラネット\",\n        \"hallucigenia\": \"ハルキゲニア\",\n        \"halopack\": \"HALOぱっく\",\n        \"haltype\": \"ハルタイプ\",\n        \"halumonica\": \"Halumonica\",\n        \"halvetica\": \"HALvetica\",\n        \"halworks\": \"HALWORKS\",\n        \"hamabeuo\": \"ハマベウオ\",\n        \"hamachi tomosaku\": \"ハマチトモサク\",\n        \"hamaiya\": \"はまい屋\",\n        \"hamanan-doboku\": \"浜南土木\",\n        \"hamanasu chaya\": \"はまなす茶屋\",\n        \"hamasei\": \"浜せい\",\n        \"hamehame service area\": \"はめはめサービスエリア\",\n        \"hamham soft\": \"はむはむソフト\",\n        \"hamiheya\": \"はみ部屋\",\n        \"hammer head\": \"HAMMER_HEAD\",\n        \"hamustar\": \"ハム星\",\n        \"hamusuta-nonikomi\": \"ハムスターの煮込み\",\n        \"hana tabako\": \"花煙草\",\n        \"hana to ribon\": \"華とりぼん\",\n        \"hana x hana\": \"花*はな\",\n        \"hanada\": \"縹\",\n        \"hanadorobou\": \"花泥棒\",\n        \"hanafubuki gorilla\": \"花吹雪ゴリラ\",\n        \"hanagara shirt\": \"花柄シャツ\",\n        \"hanairogaeru\": \"花色蛙\",\n        \"hanaji koubou\": \"鼻血工房\",\n        \"hanakuchi mememe\": \"はなくちめめめ\",\n        \"hanamachi horebore chou\": \"花町ホレボレ丁\",\n        \"hanamachi shimaiten\": \"花街姉妹店\",\n        \"hanami-ga saku\": \"花実ガ咲ク\",\n        \"hanamiduki\": \"華みづき\",\n        \"hanamuguri\": \"花潜\",\n        \"hanao shouke\": \"花尾娼家\",\n        \"hanasameyashiro\": \"花雨社\",\n        \"hanaya\": \"華屋\",\n        \"hanbyounin\": \"半病人\",\n        \"hand-grip\": \"はんどぐりっぷ\",\n        \"handful happiness\": \"Handful☆Happiness!\",\n        \"hang on\": \"ハングオン\",\n        \"hanger hansha\": \"ハンガー反射\",\n        \"hanibi land\": \"hanibi land\",\n        \"hanigura soft\": \"はにぐらそふと\",\n        \"haniwa mania\": \"ハニワマニア\",\n        \"haniya\": \"はに屋\",\n        \"hanjuku kinokotei\": \"半熟茸亭\",\n        \"hanjuku nora\": \"ハンジュクノラ\",\n        \"hanjuku yude tamago\": \"半熟茹で卵\",\n        \"hannama\": \"はんなま\",\n        \"hanshi x hanshow\": \"半死半生\",\n        \"hanya yashiki\": \"はにゃ屋敷\",\n        \"hanyan\": \"覇娘。\",\n        \"hanzai tengoku\": \"犯罪天国\",\n        \"haochi\": \"haochi\",\n        \"haoh\": \"覇王\",\n        \"hapa\": \"ハーパー\",\n        \"hapihapi\": \"hapihapi\",\n        \"happaya\": \"葉っぱ屋\",\n        \"happiness milk\": \"はぴねすみるく\",\n        \"happo ryuu\": \"HAPPO流\",\n        \"happy drive\": \"はっぴぃどらいぶっ!\",\n        \"happy life\": \"Happy Life\",\n        \"happy lime\": \"はっぴぃライム\",\n        \"happy man\": \"Happy Man\",\n        \"happy paranoia\": \"ハッピーパラノイア\",\n        \"happy present\": \"はっぴーぷれぜんと\",\n        \"happy strawberry\": \"はっぴーすとろべりー\",\n        \"happy studio\": \"HAPPY STUDIO\",\n        \"happy time\": \"ハッピータイム\",\n        \"happy turn\": \"はっぴ〜た〜ん\",\n        \"happy unbirthday\": \"HAPPY UNBIRTHDAY\",\n        \"happydrop\": \"Happydrop\",\n        \"happypink\": \"happypink\",\n        \"hara-zoo\": \"HARA-ZOO\",\n        \"haradaya\": \"原田屋\",\n        \"haraguro tenshi\": \"腹黒天使\",\n        \"haraise kaiwai\": \"ハライセカイワイ\",\n        \"harakiri gozen\": \"ハラキリ御膳\",\n        \"harakiri yakkyoku\": \"腹切薬局\",\n        \"harako misshitsu\": \"はらこ密室\",\n        \"haranabi shuppan\": \"はらなび出版\",\n        \"harapecodonburi\": \"はらぺこどんぶり\",\n        \"harapekkoken\": \"ハラペッコケン\",\n        \"harapeko shucchoujo\": \"はらぺこ出張所\",\n        \"harapeko teishoku\": \"はらぺこ定食\",\n        \"harapekopon\": \"はらぺこぽん\",\n        \"haratama\": \"ハラタマ\",\n        \"hard days\": \"hard days\",\n        \"hard hypno\": \"HARD HYPNO\",\n        \"hard lucker\": \"Hard Lucker\",\n        \"hard puncher maniax\": \"Hard Puncher Maniax\",\n        \"hardcore 001\": \"ハードコア001\",\n        \"hardcore zayaku souten\": \"ハードコアザヤクソウテン\",\n        \"hardcore zutsuu\": \"ハードコア頭痛\",\n        \"harem\": \"Harem\",\n        \"harem heat\": \"ハーレムヒート\",\n        \"haresaku\": \"ハレサク\",\n        \"hari poteto\": \"はりぽてと\",\n        \"hariko no tora\": \"はりこのとら\",\n        \"harinezumi koubou\": \"はりねずみ工房\",\n        \"hariwata\": \"hariwata\",\n        \"harmorise\": \"Harmorise\",\n        \"harness\": \"HARNESS\",\n        \"harogen\": \"ハロゲン\",\n        \"harshwordsworth\": \"harshwordsworth\",\n        \"haru mochi\": \"はるもち\",\n        \"haru youbi\": \"春曜日\",\n        \"harugoya\": \"はるごや\",\n        \"harugumo.\": \"はるぐも。\",\n        \"haruiro fudepen\": \"はルいろ筆ペン\",\n        \"haruiro no sora\": \"春色の空\",\n        \"harukaze\": \"HARUKAZE\",\n        \"harukomachikan.\": \"はるこまちかん。\",\n        \"harumachi tsurara\": \"春待氷柱\",\n        \"harumankai\": \"はるまん会\",\n        \"harumichi\": \"ハルミチ\",\n        \"harunoyu\": \"ハルノユ\",\n        \"harureri\": \"はるれり\",\n        \"harusame lunch b set\": \"はるさめランチBセット\",\n        \"harusame-soup\": \"はるさめすぅぷ\",\n        \"harvest\": \"HARVEST\",\n        \"harvest home\": \"ハーベストホーム\",\n        \"hashi to knife de niku wo kiru\": \"はしとナイフで肉を切る\",\n        \"hashikure koubou\": \"はしくれ工房\",\n        \"hasoyua\": \"ハソユア\",\n        \"hasshaku-sama\": \"八尺様\",\n        \"hastured cake\": \"ハスタードケーキ\",\n        \"hasuya\": \"はす家\",\n        \"hatahata factory\": \"ハタハタ工房\",\n        \"hatake no oniku\": \"はたけのお肉\",\n        \"hato suppressor\": \"ハトサプレッサー\",\n        \"hatogoya\": \"鳩小屋\",\n        \"hatomame\": \"ハトマメ\",\n        \"hatomugi x genmai\": \"はとむぎげんまい\",\n        \"hatosable\": \"ハトサブレ\",\n        \"hatsuai roumanjou\": \"初愛浪漫帖\",\n        \"hatsuen kikan\": \"発煙器官\",\n        \"hatsushio\": \"ハツ塩\",\n        \"hattari dou\": \"はったり堂\",\n        \"havemoon\": \"はべむん\",\n        \"hawk bit\": \"ホークビット\",\n        \"hayaku byouin e itte kudasai\": \"早く病院へ行ってください\",\n        \"hayashi puramoten\": \"はやしプラモ店\",\n        \"hayo-cinema\": \"はよしねま\",\n        \"hayonipo\": \"はよにぽ\",\n        \"hazama\": \"狭間\",\n        \"hazuki tsuitachi\": \"葉月一日\",\n        \"hb\": \"HB\",\n        \"hbo\": \"HBO\",\n        \"hcg\": \"HCG\",\n        \"hcom\": \"hcom\",\n        \"header liner\": \"へっだらいなー\",\n        \"headroom\": \"HEADROOM\",\n        \"healthy prime\": \"HEALTHY PRIME\",\n        \"heart ga hitotsu\": \"ハートがひとつ\",\n        \"heart house\": \"HEART HOUSE\",\n        \"heart of cool\": \"Heart of cooL\",\n        \"heart some bread\": \"heart some bread\",\n        \"heart tail\": \"ハートテイル\",\n        \"heart work\": \"HEART WORK\",\n        \"heartfolio\": \"Heartfolio\",\n        \"heartless k\": \"ココロナシK\",\n        \"hearts\": \"Hearts\",\n        \"hearts and crusts\": \"HEARTS & CRUSTS\",\n        \"hearts nest\": \"Heart's Nest\",\n        \"heat-soft\": \"HEAT-SOFT\",\n        \"heavenstar\": \"ヘヴンスター\",\n        \"heavenly\": \"heavenLy\",\n        \"heavens\": \"HEAVENS\",\n        \"heavens gate\": \"Heaven's Gate\",\n        \"heavens unit\": \"HEAVEN'S UNIT\",\n        \"heavy syrup\": \"Heavy syrup\",\n        \"hebereke black7\": \"へべれけBLACK7\",\n        \"hebichang\": \"へびちゃんぐ\",\n        \"hebitunagary\": \"ヘビツナガリ\",\n        \"hechima koubou\": \"へちま工房\",\n        \"hechima teishoku\": \"ヘチマ定食\",\n        \"hechocho\": \"ヘ蝶々\",\n        \"hegurimurayakuba\": \"へぐり村役場\",\n        \"heiantei\": \"平安亭\",\n        \"heika hp\": \"HEIKA HP\",\n        \"heikoto\": \"へいこと\",\n        \"heikoushihenkei\": \"平行四辺形\",\n        \"heineken\": \"Heineken\",\n        \"heinetsu 37 degrees celsius\": \"平熱37°C\",\n        \"heinetsu 98.5 degrees v\": \"平熱98.5°V\",\n        \"heisei chachamaru dou\": \"平成茶々丸堂\",\n        \"heisei metal gakuen\": \"平成メタル学園\",\n        \"heisen-dou\": \"へいせん堂\",\n        \"heiwa seisakujo\": \"平和製作所\",\n        \"heiyou kinki.\": \"ヘイヨウキンキ。\",\n        \"hekiga ni nemuru\": \"壁画に眠る\",\n        \"hekireki\": \"霹靂\",\n        \"hekiten industrial complex\": \"碧天コンビナート\",\n        \"hekohekoroid shidan\": \"へこへこロイド師団\",\n        \"helicalrizing\": \"HelicaLRizinG\",\n        \"hell-ion\": \"HELL-ION\",\n        \"helldevice\": \"HellDevice\",\n        \"hellenism\": \"へれニズム\",\n        \"hellfragrance\": \"ヘルフレグランス\",\n        \"hello girls\": \"Hello Girls!\",\n        \"hellter skelter\": \"ヘルタースケルター\",\n        \"helmet ga naosemasen\": \"ヘルメットが直せません\",\n        \"hemelopa\": \"HeMeLoPa\",\n        \"henderson\": \"HENDERSON\",\n        \"hending\": \"Hending\",\n        \"hentai emblem\": \"へんたいゑむぶれむ\",\n        \"hentai maker tomo no kai\": \"Hentai Maker 友の会\",\n        \"hentai musume\": \"へんたい娘\",\n        \"hentai ojisan\": \"ヘンタイオジサン\",\n        \"hentai to hentai no hentai\": \"HENTAI to HENTAI no HENTAI\",\n        \"hentaiworks\": \"hentaiworks\",\n        \"henyottobird\": \"へにょっとばーど\",\n        \"hep\": \"HEP\",\n        \"heppoko housing\": \"へっぽこはうじんぐ\",\n        \"heppoko youchien\": \"へっぽこ幼稚園\",\n        \"heppokodou\": \"へっぽこ堂\",\n        \"herencia\": \"HERENCIA\",\n        \"hermes shobou\": \"ヘルメス書房\",\n        \"hermit\": \"ハーミット\",\n        \"hermit9\": \"ハーミット9\",\n        \"heroes factory\": \"HEROES FACTORY\",\n        \"herohero hospital\": \"へろへろHospital\",\n        \"heroine engineering\": \"ヒロイン工学研究所\",\n        \"heroineism\": \"Heroineism\",\n        \"herunia tengoku\": \"ヘルニア天国\",\n        \"heshi factory\": \"HESHI FACTORY\",\n        \"hesogoma\": \"へそごま\",\n        \"hesoten\": \"ヘソてん\",\n        \"heta no yoko zuki\": \"ヘタの横好き\",\n        \"hetalearts\": \"ヘタレアーツ\",\n        \"hetaretch\": \"へたれっち\",\n        \"hetchhog\": \"へっちほっぐ\",\n        \"hews\": \"Hews\",\n        \"hexaflange\": \"hexaflange\",\n        \"hexagram point\": \"ヘキサグラムポイント\",\n        \"hexenhaus\": \"ヘクセンハウス\",\n        \"hey you\": \"hey you!\",\n        \"heya no sumi.\": \"部屋の隅。\",\n        \"hgh\": \"HGH\",\n        \"hgt labo\": \"HGTラボ\",\n        \"hhb\": \"hhb\",\n        \"hht\": \"HHT\",\n        \"hi-cal\": \"Hi-CAL\",\n        \"hi-flier\": \"Hi-Flier\",\n        \"hiatari ryoukou\": \"日当良好\",\n        \"hibari\": \"★☆雲雀☆★\",\n        \"hibi kirari production\": \"ひびきらりプロダクション\",\n        \"hibi rakuraku\": \"日日楽楽\",\n        \"hibiiro clutch\": \"ヒビイロクラッチ\",\n        \"hibiki\": \"響輝\",\n        \"hibinoutao\": \"ヒビノウタオ\",\n        \"hibitoridori\": \"日々鳥々\",\n        \"hibon\": \"非凡\",\n        \"hidari kara shitsurei\": \"左から失礼\",\n        \"hidarikiki\": \"HIDARIkiki\",\n        \"hidden sideway\": \"ryuuta\",\n        \"hiensou\": \"飛燕想\",\n        \"hierarchy\": \"ヒエラルキー\",\n        \"hiero\": \"ハイエロ\",\n        \"higashi no penguine\": \"東のペンギン\",\n        \"higasimikawa midoriiro doukoukai\": \"東三河みどり色同好会\",\n        \"hige to deko\": \"Hige to deko\",\n        \"higedaihuku\": \"ひげ大福\",\n        \"higeudon\": \"ひげうどん\",\n        \"high fly flow\": \"はいふらいふろう\",\n        \"high risk revolution\": \"HIGH RISK REVOLUTION\",\n        \"high star\": \"HIGH STAR\",\n        \"high thrust\": \"ハイスラスト\",\n        \"high-spirit\": \"High-Spirit\",\n        \"highdrug\": \"HighDrug\",\n        \"highend\": \"ハイエンド\",\n        \"highleg peach\": \"ハイレグピーチ\",\n        \"highrunning\": \"HighRunning\",\n        \"highway\": \"highway\",\n        \"highway61\": \"Highway61\",\n        \"higouhou shoujo\": \"非合法少女\",\n        \"hihiyama tsuyabon\": \"比比山艶本\",\n        \"hijet\": \"ハイジェット\",\n        \"hijiki-ya\": \"ひじき屋\",\n        \"hijinzou\": \"非人造\",\n        \"hijouguchi\": \"ひじょうぐち\",\n        \"hikage mon\": \"日陰もん\",\n        \"hikagemono\": \"ヒカゲモノ\",\n        \"hikari club\": \"光クラブ\",\n        \"hikari no ki\": \"光の樹\",\n        \"hikari no tomoshibi\": \"光の燭\",\n        \"hikarito mahou koubou\": \"光と魔法工房\",\n        \"hikodge beya\": \"彦二部屋\",\n        \"hikou dai 50 sentai\": \"飛行第50戦隊\",\n        \"hikousensuitei\": \"飛行潜水亭\",\n        \"hiland-studio\": \"ハイランド工房\",\n        \"hima serval\": \"ひまサーバル\",\n        \"himajinism\": \"ひまじにずむ\",\n        \"himameshiki\": \"火豆式\",\n        \"himawari endan\": \"ひまわり園団\",\n        \"himawari seed\": \"ひまわりシード\",\n        \"himawari-noren\": \"向日葵のれん\",\n        \"himawarisou\": \"ひまわり荘\",\n        \"hime club\": \"姫倶楽部\",\n        \"himegami\": \"姫神\",\n        \"himehajime.com\": \"himehajime.com\",\n        \"himepuchitei\": \"ひめぷち亭\",\n        \"himitsu doyoubi\": \"秘密土曜日\",\n        \"himitsu kessha vanitas\": \"秘密結社ヴァニタス\",\n        \"himitsu tetra\": \"ひみつテトラ\",\n        \"hinaeron\": \"ひなえろん\",\n        \"hinahara yashiki\": \"ひなはら屋敷\",\n        \"hinahina box\": \"HINAHINA BOX\",\n        \"hinakan\": \"ひなかん\",\n        \"hinamaru chuujou\": \"ひな丸中将\",\n        \"hinamaru soft\": \"ヒナマルソフト\",\n        \"hinaprin\": \"ひなプリン\",\n        \"hinatabokko\": \"ひなたぼっこ\",\n        \"hinatabokko club\": \"ひなたぼっこ倶楽部\",\n        \"hinauta\": \"ひなうた\",\n        \"hinjyaku\": \"HINJYAKU\",\n        \"hinoenma haken jimukyoku\": \"催眠すし屋\",\n        \"hinoiti\": \"ヒノイティ\",\n        \"hinokiburo\": \"檜風呂\",\n        \"hinokist\": \"hinokist\",\n        \"hinouhe family\": \"ひのうへファミリー\",\n        \"hirani\": \"ヒラマニ\",\n        \"hirame jichiku\": \"ひらめ自治区\",\n        \"hirari\": \"ひらり\",\n        \"hirataira\": \"平平\",\n        \"hired girl\": \"ハイヤードガール\",\n        \"hirekatsu\": \"ヒレカツ\",\n        \"hiroi heya\": \"拾い部屋\",\n        \"hirojuu renshuuchou\": \"広十練習帖\",\n        \"hirokaworld\": \"ヒロカワールド\",\n        \"hirumeshidoki\": \"昼飯時\",\n        \"hirusagari no bijutsukan\": \"昼下がりの美術館\",\n        \"hisoutan\": \"ひそうたん\",\n        \"hispano-suiza\": \"Hispano-Suiza\",\n        \"hissatsuwaza\": \"ひっさつわざ\",\n        \"hisuitei\": \"翡翠亭\",\n        \"hitobankoneko\": \"一晩仔猫\",\n        \"hitodenashi\": \"ひとでなし\",\n        \"hitoe\": \"一重\",\n        \"hitokumi\": \"ひとくみ\",\n        \"hitomaron\": \"ひとまろん\",\n        \"hitonchi\": \"ひとんち\",\n        \"hitori de dekirumon\": \"火鳥でできるもん！\",\n        \"hitori kakumei\": \"一人革命\",\n        \"hitori no daiyokujou\": \"一人の大浴場\",\n        \"hitori online\": \"一人オンライン\",\n        \"hitori tower bridge\": \"ヒトリタワーブリッジ\",\n        \"hitoride dekirumon\": \"ひとりでできるもんっ\",\n        \"hitoriyorihutari\": \"ヒトリヨリフタリ\",\n        \"hitoriyou no pot\": \"ひとりようのポット\",\n        \"hitotosensou\": \"一年戦争\",\n        \"hitoya-r\": \"ヒトヤ-R\",\n        \"hitoyasumi\": \"ひとやすみ\",\n        \"hitstales\": \"ヒッツッツ\",\n        \"hitsuji drill\": \"羊ドリル\",\n        \"hitsuji no munko hiryou\": \"羊のむんこ肥料\",\n        \"hitsuji to kitsune\": \"ひつじときつね\",\n        \"hitsuji-1ban-shibori\": \"ヒツジ一番搾り\",\n        \"hitsujimama\": \"ひつじまま\",\n        \"hitsujin toko\": \"ひつじんトコ\",\n        \"hitsujiniku\": \"ひつじにく\",\n        \"hitujinoki\": \"ひつじの木\",\n        \"hiwatari honpo\": \"樋渡本舗\",\n        \"hiyashi asia\": \"ヒヤシアジア\",\n        \"hiyashi chuuka hajimemashita\": \"冷し中華おわりました\",\n        \"hiyashichuuka hajimemashita\": \"冷やし中華はじめました\",\n        \"hiyocco\": \"HIYOCCO\",\n        \"hiyoko box\": \"ひよこBOX\",\n        \"hiyoko crown\": \"HIYOKO CROWN\",\n        \"hiyoko soft\": \"ひよこソフト\",\n        \"hiyori hamster\": \"ひよりハムスター\",\n        \"hiyorimi no sora\": \"ひよりみのソラ\",\n        \"hiyotamaya\": \"ひよたま屋\",\n        \"hiyoubeya\": \"飛葉部屋\",\n        \"hizadachi bunny\": \"膝立ちバニー\",\n        \"hizamakura\": \"ひざまくら。\",\n        \"hizatora\": \"ヒザトラ\",\n        \"hj production\": \"HJプロダクション\",\n        \"hjukism\": \"HJUKISM\",\n        \"hk\": \"HK\",\n        \"hkmnk\": \"hkmnk\",\n        \"hl\": \"エイチェル\",\n        \"hlz\": \"hlz\",\n        \"hm\": \"HM\",\n        \"hma\": \"HMA\",\n        \"hn.03\": \"Hn.03\",\n        \"hobby land soft\": \"Hobby Land Soft\",\n        \"hochidonmai\": \"ほちどんまい\",\n        \"hoepporoppo\": \"ほえっぽろっぽ\",\n        \"hoge hoge club\": \"ほげほげCLUB\",\n        \"hogege\": \"HOGEGE\",\n        \"hogeplan\": \"HOGEPLAN\",\n        \"hogero kikaku\": \"ほげろー企画\",\n        \"hohhe dan\": \"ほっへ!!団\",\n        \"hokanko\": \"ほかんこ\",\n        \"hokentaiiku\": \"保健体育\",\n        \"hokkahoka-mesotei\": \"ほっかほかめそ亭\",\n        \"hokke\": \"ホッケ\",\n        \"hokke o tabeyou\": \"ほっけを食べよう\",\n        \"hokkebain\": \"ほっけばいん!\",\n        \"hokkepen\": \"ほっけぺん\",\n        \"hokuroza\": \"ホクロ座\",\n        \"hokushintei\": \"北辰亭\",\n        \"hole in one\": \"ほーるいん椀\",\n        \"holiday note\": \"Holiday Note\",\n        \"holiday school\": \"休日学校\",\n        \"holy avenger\": \"ホーリーアベンジャー\",\n        \"holymist\": \"HolyMist\",\n        \"homadelic.\": \"homadelic.\",\n        \"home wrecker\": \"ホームレッカー\",\n        \"homerun chaya\": \"ホームラン茶屋\",\n        \"homuhomu seisakujo\": \"ほむほむ製作所\",\n        \"homunculus\": \"ホムンクルス\",\n        \"honda koumuten\": \"本田工務店\",\n        \"hone shaburi-tei\": \"骨しゃぶり亭\",\n        \"honekawaya\": \"ホネカワ屋\",\n        \"honey bomb\": \"ハニーボム\",\n        \"honey bump\": \"ハニーバンプ\",\n        \"honey bunny\": \"ハニーバニー\",\n        \"honey crunch\": \"HONEY*CRUNCH\",\n        \"honey dipped\": \"Honey Dipped\",\n        \"honey knuckle\": \"Honey Knuckle\",\n        \"honey lounge\": \"honey lounge\",\n        \"honey pharmacy\": \"Honey Pharmacy\",\n        \"honey rice\": \"はちみつごはん\",\n        \"honey rider69\": \"Honey Rider69\",\n        \"honeybee\": \"honeybee\",\n        \"honeybee-tea\": \"蜜蜂紅茶\",\n        \"honeycrown\": \"HoneyCrown\",\n        \"honeysuckle\": \"Honeysuckle\",\n        \"hongkong hanten\": \"香港飯店\",\n        \"honjitsu no higawari lunch\": \"本日の日替わりランチ\",\n        \"honmatsu tentou\": \"本末天道\",\n        \"honnojihen\": \"ホンノーヂヘン\",\n        \"honnori tei\": \"ほんのり亭\",\n        \"honnou juushigata\": \"本能重視型\",\n        \"honnou to yokubou no gyuutan\": \"本能と欲望の牛タン\",\n        \"honohono\": \"HonoHono\",\n        \"honoka na omochiya\": \"ほのかなおもち屋\",\n        \"honomiya\": \"穂の実舎\",\n        \"honoyurara\": \"HONOYURARA\",\n        \"honpou kishitsu\": \"奔放気質\",\n        \"hontoinu\": \"ほんトいぬ\",\n        \"honya no hidari click\": \"ほにゃーの左クリック\",\n        \"hoppe\": \"hoppe\",\n        \"hopper island\": \"ホッパーアイランド\",\n        \"hopuhopu team\": \"ほぷほぷチーム\",\n        \"horic works\": \"HORIC WORKS\",\n        \"horiishi horuto\": \"堀石掘人\",\n        \"horimonya\": \"彫りモン屋\",\n        \"horloger\": \"Horloger\",\n        \"horohoro tei\": \"ホロホロ亭\",\n        \"horonaminz\": \"ホロナミンZ\",\n        \"horumon curry\": \"ほるもんカレー\",\n        \"hoshizora kagekidan\": \"星空華劇団\",\n        \"hoshi ni kaeru\": \"星に帰る!\",\n        \"hoshi no kuzu\": \"星の屑\",\n        \"hoshi no yume\": \"星の夢\",\n        \"hoshiame\": \"星飴\",\n        \"hoshidokei\": \"星時計\",\n        \"hoshiedatei\": \"ほしえだ亭\",\n        \"hoshikuzu comet\": \"星屑コメット\",\n        \"hosikuz dolce\": \"星屑ドルチェ\",\n        \"hoshimaki project\": \"ほしまきProject\",\n        \"hoshimitai\": \"ほしみたい\",\n        \"hoshinagi\": \"星凪\",\n        \"hoshinatenpo\": \"保科店舗\",\n        \"hoshiratta\": \"星らった\",\n        \"hoshiyukicha\": \"干し雪茶\",\n        \"hoshizono\": \"星園\",\n        \"hoshizora tokou\": \"星空渡航\",\n        \"hosi hutatu.\": \"ほしふたつ。\",\n        \"hosinokuzu\": \"Hosinokuzu\",\n        \"hosizora step\": \"星空ステップ\",\n        \"hosokawaya\": \"細川屋\",\n        \"hot kari\": \"H：O：T(仮)\",\n        \"hot language\": \"ホットランゲージ\",\n        \"hot pot\": \"Hot Pot\",\n        \"hotateya\": \"ほたてや。\",\n        \"hotel california\": \"加州大飯店\",\n        \"hotoariboshi\": \"ほとおり星\",\n        \"hotori bocchi\": \"ほとりぼっち\",\n        \"houenken\": \"方円軒\",\n        \"hougyoku densetsu\": \"宝玉伝説\",\n        \"houjuan\": \"峯寿庵\",\n        \"houkago paradise\": \"放課後パラダイス\",\n        \"houkiboshi\": \"箒星\",\n        \"hououya\": \"鳳凰屋\",\n        \"houruri\": \"蓬瑠璃\",\n        \"house game\": \"ハウスゲーム\",\n        \"house of karsea\": \"ハウス オブ KARSEA\",\n        \"house saibai mochi\": \"ハウス栽培もち\",\n        \"houzuki\": \"ほう☆づき\",\n        \"however\": \"However\",\n        \"hozmi kan\": \"ほづみかん\",\n        \"hozuriya\": \"ほづり屋\",\n        \"hr\": \"HR\",\n        \"hr-st\": \"HR-ST\",\n        \"http\": \"http\",\n        \"hukakuteiseigenri\": \"不確定性原理\",\n        \"hulotte\": \"Hulotte\",\n        \"human high-light film\": \"ヒューマン・ハイライト・フィルム\",\n        \"hummel\": \"ヒュンメル\",\n        \"huri-neko\": \"ふりかえればねこがいる\",\n        \"hutoshi nyuugyou\": \"ふとし乳業\",\n        \"huzinami koubou\": \"藤波工房\",\n        \"hy-dou\": \"灰同\",\n        \"hyakkarou no tanuki\": \"百華楼の狸\",\n        \"hyakuen nikuniku\": \"百元肉々\",\n        \"hyakuitishiki\": \"百壱式\",\n        \"hyakumangoku\": \"百萬石\",\n        \"hyakutake sakusen\": \"百武作戦\",\n        \"hyakuyoubako\": \"百葉箱\",\n        \"hyamolot bakurai\": \"ヒャモロット爆雷\",\n        \"hybrid jimushitsu\": \"ハイブリッド事務室\",\n        \"hydden world\": \"ひどぅんワールド\",\n        \"hydroharbor\": \"HydroHarbor\",\n        \"hyk42\": \"HYK42\",\n        \"hyoco road\": \"ひょこ道\",\n        \"hyouketsu mikan\": \"氷結蜜柑\",\n        \"hyper houbokujou\": \"ハイパー放牧場\",\n        \"hyper summer wars\": \"ハイパーサマーウォーズ\",\n        \"hyperiyon\": \"はいぺりよん\",\n        \"hypnotic angel\": \"Hypnotic Angel\",\n        \"hypnotisms\": \"hypnotisms\",\n        \"hyspaniplus\": \"HyspaniPlus\",\n        \"hysteric typhoon\": \"ヒステリックタイフーン\",\n        \"hyudorabo\": \"ひゅどらぼ\",\n        \"hzkletter\": \"HZKletter\",\n        \"i\": \"I\",\n        \"i am a rock\": \"I am a Rock\",\n        \"i slash h slash r\": \"I/H/R\",\n        \"i think\": \"i think\",\n        \"i-proya\": \"あいぷろ屋\",\n        \"i.r.o.zi\": \"i.r.o.Zi\",\n        \"i.s.o.p.\": \"I.S.O.P.\",\n        \"i.t.gyro\": \"I.T.ジャイロ\",\n        \"ibiza\": \"Ibiza\",\n        \"ibotsukigunte\": \"いぼつきぐんて\",\n        \"ibros\": \"ibros\",\n        \"ice cream\": \"アイスクリウム\",\n        \"ice kick\": \"アイスキック\",\n        \"ice lycoris\": \"氷のリコリス\",\n        \"ice manjuu\": \"あいす饅頭\",\n        \"ice pink\": \"Ice Pink\",\n        \"ice sugar\": \"Ice Sugar\",\n        \"ice-place\": \"ICE-PLACE\",\n        \"ichigo\": \"いちご\",\n        \"ichigo bakery\": \"イチゴベーカリ\",\n        \"ichigo batake\": \"いちご畑\",\n        \"ichigo crepe oomorigumi\": \"いちごクレープ大盛組\",\n        \"ichigo fax\": \"Ichigo Fax\",\n        \"ichigo ichie\": \"一期一会\",\n        \"ichigo jet\": \"いちごじぇっと\",\n        \"ichigo maririn\": \"いちごマリ凛\",\n        \"ichigo milk\": \"いちごみるく\",\n        \"ichigoen\": \"いちご苑\",\n        \"ichigohou\": \"苺砲\",\n        \"ichigoya\": \"いちご屋\",\n        \"ichikasho nihoukou\": \"一箇所二方向\",\n        \"ichikawa gekibansha\": \"市川劇版社\",\n        \"inomaru\": \"いの丸\",\n        \"ichimatsu kougyou\": \"市松稿行\",\n        \"ichimonkai\": \"一門会\",\n        \"ichinichi atelier\": \"いちにちアトリエ\",\n        \"ichinichijuu guttari\": \"一日中ぐったり\",\n        \"ichino nijou\": \"いちのにじょう\",\n        \"ichinose\": \"一ノ瀬\",\n        \"ichiokumangenjaya\": \"一億万軒茶屋\",\n        \"ichiokunen wakusei\": \"1億年惑星\",\n        \"ichiya neko no yume\": \"一夜猫の夢\",\n        \"ichiya teikoku\": \"壱屋帝国\",\n        \"ichiyonroku\": \"イチヨンロク\",\n        \"ichiyuzai\": \"壱釉斎\",\n        \"icicle\": \"Icicle\",\n        \"iciclepink\": \"IciclePink\",\n        \"ico-ba\": \"Ico-ba\",\n        \"idenshi no fune\": \"遺伝子の舟\",\n        \"idivide\": \"アイディバイド\",\n        \"ido no naka\": \"井戸の中\",\n        \"ido no soko\": \"井戸の底\",\n        \"idobata kaigisho\": \"井戸端会議所\",\n        \"idolize\": \"iDOLIZE\",\n        \"idomizuya\": \"井戸水屋\",\n        \"if no danpen\": \"ifの断篇\",\n        \"ifdef\": \"ifdef\",\n        \"ifpark com\": \"ifpark.com\",\n        \"igou\": \"異郷\",\n        \"iihama shokudou\": \"飯浜食堂\",\n        \"iihitoya dosukoidou\": \"いい人屋どすこい堂\",\n        \"iiiiitune\": \"IIIIItune\",\n        \"iinari bijin\": \"いいなり美人\",\n        \"iio tetsuaki honpo\": \"飯尾鉄明本舗\",\n        \"iiwake-gaisya\": \"いいわけ会社\",\n        \"iji\": \"IJI\",\n        \"ijigen kichi\": \"異次元基地\",\n        \"ijiise\": \"イジイセ\",\n        \"ik.projectear\": \"IK.projectear\",\n        \"ika client\": \"いか・クライアント\",\n        \"ikaruganomiya\": \"斑鳩宮\",\n        \"ikasumi no dendou\": \"イカスミの殿堂\",\n        \"ikasumiya\": \"烏賊墨屋\",\n        \"ikechika\": \"いけちか\",\n        \"ikeda jun kikakushitsu\": \"池田淳企画室\",\n        \"ikemen teikoku\": \"イケメン帝国\",\n        \"ikennabi\": \"イケンナビ\",\n        \"ikibata 49ers\": \"いきばた49ERS\",\n        \"ikigire shoukai\": \"いきぎれ商会\",\n        \"ikihaji hummingbird\": \"生き恥ハミングバード\",\n        \"ikite-chou-made-todoku\": \"生きて腸まで届く\",\n        \"ikka risan\": \"一家離散\",\n        \"ikkansei\": \"一貫星\",\n        \"ikuiku com\": \"いくいくコン\",\n        \"ikumura\": \"郁村\",\n        \"ikuukan massatsu-ken\": \"異空間抹殺圏\",\n        \"ild cat\": \"ILD CAT\",\n        \"illuminator\": \"illuminator\",\n        \"illust koubou kakutasu\": \"イラスト工房描くたす\",\n        \"im\": \"Im\",\n        \"im fragile\": \"i'm Fragile\",\n        \"imagawatei\": \"今川亭\",\n        \"image craft\": \"IMAGE CRAFT\",\n        \"image rider\": \"Image Rider\",\n        \"imagination scenery\": \"Imagination scenery\",\n        \"imagineforme\": \"イマジンフォルム\",\n        \"imakan\": \"IMAKAN\",\n        \"imakaya\": \"いまか屋\",\n        \"imasori dondai\": \"イマソリドンダイ\",\n        \"imazon no ana\": \"今ゾンの穴\",\n        \"imitation genome\": \"イミテーションゲノム\",\n        \"imitation moon\": \"Imitation Moon\",\n        \"imitation star\": \"イミテーション スタア\",\n        \"immoral heart\": \"Immoral Heart\",\n        \"imoarai-ya\": \"芋洗屋\",\n        \"imomaru\": \"芋。\",\n        \"imopotato\": \"いもポテト\",\n        \"imotare\": \"imotare\",\n        \"imoutogensouzitiku\": \"妹幻想自治区\",\n        \"imozaiku\": \"いもざいく\",\n        \"imozuru-shiki\": \"いもずる式\",\n        \"imperial chicken\": \"インペリアルチキン\",\n        \"imuneko\": \"イムネコ\",\n        \"in the teapot\": \"In the Teapot\",\n        \"in the water\": \"in the WATER.\",\n        \"inaf\": \"INAF\",\n        \"inai uchi ni\": \"いないうちに\",\n        \"inakagurashi\": \"イナカグラシ\",\n        \"inaridou shoten\": \"稲荷堂書店\",\n        \"inarimochi.\": \"いなり餅。\",\n        \"inarizushi\": \"いなりずし\",\n        \"inasaku\": \"稲作\",\n        \"inayama shrine\": \"稲山神社\",\n        \"inchikidou\": \"いんちき堂\",\n        \"include\": \"include\",\n        \"independenko\": \"インデペンダンコ\",\n        \"ineusaruka\": \"イネウサルカ\",\n        \"infinity\": \"infinity\",\n        \"infinity line\": \"infinity line\",\n        \"iniminimanimo\": \"イニミニマニモ\",\n        \"initiative\": \"イニシアティ部\",\n        \"inja no kuruwa\": \"陰者の廓\",\n        \"inkstone\": \"InkStone\",\n        \"inner map\": \"Inner Map\",\n        \"innocence\": \"Innocence\",\n        \"innocent lucy\": \"イノセントルーシー\",\n        \"inran teddy bear\": \"淫乱テディベア\",\n        \"inre\": \"インレ\",\n        \"inshoujo\": \"淫少女\",\n        \"insky.\": \"insky.\",\n        \"inspi.\": \"inspi.\",\n        \"inspire\": \"inspire\",\n        \"intendou\": \"淫天堂\",\n        \"interlude\": \"interlude\",\n        \"intondou\": \"隠遁堂\",\n        \"intrepid\": \"イントレピッド\",\n        \"inu batake\": \"犬畑\",\n        \"inu no sekai\": \"いぬのせかい\",\n        \"inu ringo\": \"イヌリンゴ\",\n        \"inu system\": \"犬システム\",\n        \"inu to kotatsu\": \"犬とコタツ\",\n        \"inubaka\": \"いぬばか\",\n        \"inudamashi\": \"いぬだまし\",\n        \"inudrill lolita engine\": \"イヌドリルロリータエンジン\",\n        \"inudrill.\": \"イヌドリル。\",\n        \"inuduya\": \"いぬづや\",\n        \"inufuro\": \"いぬふろ\",\n        \"inuhouse.\": \"いぬはうす。\",\n        \"inukamedou\": \"いぬかめ堂\",\n        \"inukare\": \"犬彼\",\n        \"inuyamakagashi\": \"イヌヤマカガシ\",\n        \"inuyoukan\": \"狼幼館\",\n        \"inuzuka clinic\": \"犬塚クリニック\",\n        \"inym\": \"INYM\",\n        \"inyu-goya\": \"いにゅ小屋\",\n        \"io lite\": \"Io Lite\",\n        \"ioom\": \"ioom\",\n        \"ioteact\": \"Ioteact\",\n        \"ip\": \"IP\",\n        \"ipheion\": \"Ipheion\",\n        \"ippatsu shooter\": \"一発シューター\",\n        \"ippatsutei\": \"一発亭\",\n        \"ippo mae e\": \"一歩前へ\",\n        \"ipro back dancers\": \"iProバックダンサーズ\",\n        \"iraremai\": \"いられまい\",\n        \"irekubadou\": \"いれくば堂\",\n        \"irene\": \"Irene\",\n        \"iris art\": \"Iris art\",\n        \"iro neko pencil\": \"色ねこペンシル\",\n        \"irodorip\": \"彩RIP\",\n        \"iroiroiro\": \"iroiroiro\",\n        \"iroman\": \"いろまん\",\n        \"iron\": \"iron\",\n        \"iron fin\": \"IRON FIN\",\n        \"iron grimoire\": \"IRON GRIMOIRE\",\n        \"iron plate\": \"あいあんぷれーと\",\n        \"iron sugar\": \"アイアンシュガー\",\n        \"iron y\": \"IRON Y\",\n        \"isada-ke\": \"いさだ家\",\n        \"isami kaihatsu jigyoudan\": \"イサミ再開発事業団\",\n        \"ise no mug cup\": \"いせのマグカップ\",\n        \"isekai ryokou dairiten\": \"異世界旅行代理店\",\n        \"ishi kenpi\": \"石ケンピ\",\n        \"ishi wa hakanaki ame no shirabe ni\": \"意思は儚き雨の調べに\",\n        \"ishidaya\": \"イシダヤ\",\n        \"ishikari shake nabe doukoukai\": \"石狩しゃけ鍋同好会\",\n        \"ishikorodou\": \"イシコロドウ\",\n        \"ishin denshin\": \"以心伝心\",\n        \"ishitoku ya\": \"イシトク屋\",\n        \"island belle\": \"Island Belle\",\n        \"island green\": \"アイランドグリーン\",\n        \"iso no sozaiten\": \"いその惣菜店\",\n        \"isocurve\": \"アイソカーブ\",\n        \"isofura\": \"いそふら\",\n        \"isofura ribbon\": \"イソフラリボン\",\n        \"isorashi dou\": \"イソラシ堂\",\n        \"isotonix\": \"アイソトニクス\",\n        \"isou\": \"isou\",\n        \"issun kobo\": \"一寸工房\",\n        \"isurusdo\": \"いするす堂\",\n        \"itachitai\": \"イタチ隊\",\n        \"itadaki\": \"頂\",\n        \"itadaki cat\": \"イタダキキャット\",\n        \"item box\": \"あいてむぼっくす\",\n        \"itibosi\": \"ITIBOSI\",\n        \"ito ichizo shouten\": \"伊藤一蔵商店\",\n        \"itou chaba\": \"伊東茶葉\",\n        \"itsuka no sora\": \"いつかのそら\",\n        \"itsukano\": \"イツカノ\",\n        \"itsukano cabayaki\": \"いつかのカバヤキ\",\n        \"itsukidou\": \"樹堂\",\n        \"itsutsuba no clover\": \"五つ葉のクローバー\",\n        \"itsuwari no shirohata\": \"偽りの白旗\",\n        \"ittou ryoudan\": \"一刀両断\",\n        \"iv va shin\": \"IV VA SHIN\",\n        \"ivory\": \"IVORY\",\n        \"ivycrown\": \"ivycrown\",\n        \"iwamanga honpo\": \"いわまんが本舗\",\n        \"iwanakaya\": \"岩中屋\",\n        \"iwashita shoten\": \"いわした書店\",\n        \"iyokan.\": \"いよかん。\",\n        \"iyou\": \"iYou\",\n        \"izakaya yocchan\": \"居酒屋よっちゃん\",\n        \"izayoi no tsuki\": \"十六夜の月\",\n        \"izumi gakuen\": \"いずみ学園\",\n        \"izumi shoseki\": \"いづみ書籍\",\n        \"izumiyu\": \"イズミユ\",\n        \"izumnizm\": \"イズムニズム\",\n        \"izumo gasshuukoku\": \"いづも合衆国\",\n        \"izumunizm\": \"IzumuNizm\",\n        \"izuya\": \"IZU屋\",\n        \"j\": \"j\",\n        \"j-m-box\": \"J-M-BOX\",\n        \"j.o.c e.go\": \"J.O.C★e.go!!\",\n        \"j.s\": \"ジェイ・エス\",\n        \"j7w\": \"j7w\",\n        \"jabara yane\": \"じゃばら屋根\",\n        \"jabyssk\": \"JabyssK\",\n        \"jack dou\": \"ジャック堂\",\n        \"jack-o-lantern\": \"ぢゃっからんたん\",\n        \"jack-r\": \"Jack-R\",\n        \"jackass\": \"ジャッカス\",\n        \"jacklake\": \"Jacklake\",\n        \"jackmarry\": \"JACKMARRY\",\n        \"ja no michi wa hebi soft\": \"蛇ノ道ハ蛇ソフト\",\n        \"jagaimo potato\": \"じゃがいもポテト\",\n        \"jail black\": \"JaiL Black\",\n        \"jajujo\": \"じゃじゅじょ\",\n        \"jakushou jimusho shokun\": \"弱小事務所諸君\",\n        \"jaleco\": \"ジャレコ\",\n        \"jam\": \"ジャム\",\n        \"jam kingdom\": \"ジャム王国\",\n        \"jamboree\": \"Jamboree!\",\n        \"jamurika\": \"ジャム理科\",\n        \"jangari koubou\": \"じゃんがり工房\",\n        \"janis toilet\": \"ジャニストイレ\",\n        \"jasmon\": \"JASもん\",\n        \"je taime\": \"濡鼎夢\",\n        \"jelly fish\": \"Jelly fish\",\n        \"jennys jimusho\": \"じぇにーず事務所\",\n        \"jenoa cake\": \"じぇのばけーき\",\n        \"jereheim garden\": \"Jereheim Garden\",\n        \"jermaneels\": \"jermaneels\",\n        \"jet dekopin books\": \"JET DEKOPIN BOOKS\",\n        \"jeter studio\": \"ジータースタジオ\",\n        \"jewelry\": \"ジュエリー\",\n        \"jibaku-system\": \"自爆SYSTEM\",\n        \"zydan\": \"痔男\",\n        \"jido-hikki\": \"じどー筆記\",\n        \"jiesu\": \"じーえす\",\n        \"jigen bakudan\": \"時限爆弾\",\n        \"jigoku potion\": \"地獄ポーション\",\n        \"jigoku shinjuu\": \"地獄心中\",\n        \"jigoku studio\": \"地獄スタジオ\",\n        \"jikansa-kougeki\": \"時間差攻撃\",\n        \"jikayou kamihikouki\": \"自家用紙飛行機\",\n        \"jikomankitsu.\": \"自己満喫。\",\n        \"jikomanzoku\": \"じこまんぞく\",\n        \"jinapakusu\": \"じなぱーくす\",\n        \"jinbow\": \"JINBOW\",\n        \"jingai makyou club\": \"人外魔境倶楽部\",\n        \"jinkenhakudatsu kougeki\": \"人権剥奪攻撃\",\n        \"jinmen 62\": \"ジンメン62\",\n        \"jinoriya\": \"じのり屋\",\n        \"jinraiken\": \"迅雷拳\",\n        \"jinrikisha\": \"人力社\",\n        \"jinsei ano denchuu made sakusen\": \"人生あの電柱まで作戦\",\n        \"jinsei tsuukoudome\": \"人生通行止め\",\n        \"jipohou\": \"時ポ砲\",\n        \"jishaku no sunaba\": \"じしゃくのすなば\",\n        \"jishin kajyou\": \"地震過剰\",\n        \"jishou seijunha\": \"自称清純派\",\n        \"jisyakunyudo\": \"じしゃく入道\",\n        \"jitaku ijouari\": \"自宅異常あり!\",\n        \"jitaku studio\": \"自宅すたじお\",\n        \"jitsuyou tosho fukyuukai r\": \"実用図書普及会\",\n        \"jiyuu inpon tou\": \"自由いんぽん党\",\n        \"jiyuubeya\": \"自由部屋\",\n        \"jiyuugaoka shoutengai\": \"自由ヶ丘商店会\",\n        \"jizeru enjin\": \"じーぜるエンジン\",\n        \"jk-pasta\": \"JKぱすた\",\n        \"jms space\": \"JMSスペース\",\n        \"john doe shinobu\": \"あっぱーきゃんでぃー\",\n        \"johnny iron pipe\": \"ジョニー鉄パイプ\",\n        \"joji panchu uriba\": \"女児ぱんちゅ売場\",\n        \"joker type\": \"JOKER TYPE\",\n        \"jokou kukan\": \"徐行区間\",\n        \"jon\": \"JON\",\n        \"jonathan ssss\": \"じょなさんず\",\n        \"jongotei\": \"ジョーんご亭\",\n        \"jorijori\": \"JoRiJoRi\",\n        \"joshi nimo katezu\": \"女子ニモ勝テズ\",\n        \"joshinzoku\": \"女真族\",\n        \"joujou tenki\": \"上々天気\",\n        \"joukitei\": \"蒸気亭\",\n        \"joy convoy\": \"ジョイコンボイ\",\n        \"joydivision\": \"JoyDivision\",\n        \"js style\": \"J's STYLE\",\n        \"judgement\": \"JUDGEMENT\",\n        \"juicy fruits\": \"Juicy Fruits\",\n        \"jujuppe\": \"ヂュヂュッペ\",\n        \"jukai shoko\": \"樹海書庫\",\n        \"jukujuku juvenile\": \"熟々ジュブナイル\",\n        \"jukuseiya koubou\": \"熟成屋工房\",\n        \"julia\": \"JULIA\",\n        \"jumbomax\": \"JUMBOMAX\",\n        \"jumelles\": \"ジュメルズ\",\n        \"junai shijoushugi\": \"純愛至上主義\",\n        \"junes rain\": \"六月雨\",\n        \"junes202\": \"ジュネス202\",\n        \"junk arts\": \"ジャンクアーツ\",\n        \"junk box\": \"Junk Box\",\n        \"junk center kameyoko bldg\": \"JUNKセンター亀横ビル\",\n        \"junk gear\": \"ジャンクギア\",\n        \"junk island\": \"ジャンクアイランド\",\n        \"junk market\": \"Junk Market\",\n        \"junk story\": \"JUNK STORY\",\n        \"junkan\": \"循環\",\n        \"junkin\": \"純禁\",\n        \"junkissa gen\": \"潤喫茶・弦\",\n        \"junkland2\": \"JUNKLAND2\",\n        \"junkxjunk\": \"JUNK×JUNK\",\n        \"junpuumanpandou\": \"順風満帆堂\",\n        \"jushoku to sono ichimi\": \"住職とその一味\",\n        \"jusou music\": \"十三ミュジック\",\n        \"juubai matsuri\": \"十倍祭り\",\n        \"juugoichie\": \"十誤一会\",\n        \"juujigen\": \"十次元\",\n        \"juuryoku dou\": \"重力堂\",\n        \"juvecross\": \"じゅぶくろす\",\n        \"jyakonegi sarada\": \"じゃこネギさらだ\",\n        \"jyaraya\": \"じゃらや\",\n        \"jyouren kishidan\": \"ジョウ・レン騎士団\",\n        \"jzargo\": \"ジェイザルゴ\",\n        \"k equals k\": \"[K=K]\",\n        \"k h\": \"K☆H\",\n        \"k plus w\": \"K+W\",\n        \"k plus y equals k\": \"K+Y=K\",\n        \"k-1\": \"K-1\",\n        \"k-ten\": \"K-てん\",\n        \"k.a.d\": \"K.A.D\",\n        \"k.f.d.\": \"K.F.D.\",\n        \"k.h.r\": \"K.H.R\",\n        \"k.n.d.\": \"K.N.D.\",\n        \"k.s. ozaki\": \"K.S.尾崎\",\n        \"k2 manhole\": \"K2マンホール\",\n        \"k2 tomo no kai\": \"K²友の怪\",\n        \"ka-mi-night town\": \"カーミー夜番街\",\n        \"kaaburidou\": \"顔振堂\",\n        \"kab-studio\": \"KAB-studio\",\n        \"kabaya\": \"樺屋\",\n        \"kabocha company\": \"かぼちゃカンパニー\",\n        \"kabocha daioh\": \"かぼちゃ大王\",\n        \"kabocha get\": \"かぼちゃげっと\",\n        \"kabocha heim\": \"かぼちゃハイム\",\n        \"kabocha obake\": \"カボチャオバケ\",\n        \"kabocha oukoku\": \"かぼちゃ王国\",\n        \"kabuki-man\": \"カブキマン\",\n        \"kabuto jirushi\": \"カブト印\",\n        \"kabutomushi\": \"カブとムシ\",\n        \"kabuttari kaburanakattari\": \"かぶったりかぶらなかったり\",\n        \"kachiwari jikkenshitsu\": \"カチワリ実験室\",\n        \"kachusha\": \"Kachusha\",\n        \"kadobeya tengoku\": \"角部屋天国\",\n        \"kaede momiji\": \"かえでもみじ\",\n        \"kaede no harawata\": \"楓のはらわた\",\n        \"kaededou\": \"楓道\",\n        \"kaedelic\": \"KAEdeLIC\",\n        \"kaeru neko no shippo\": \"かえるねこのしっぽ\",\n        \"kaeru no oyado\": \"カエルの御宿\",\n        \"kaerudon teishoku\": \"カエル丼定食\",\n        \"kagamichaya\": \"鏡茶屋\",\n        \"kage kiri\": \"影霧\",\n        \"kagehara juukou\": \"影原重工\",\n        \"kageneko\": \"カゲねこ\",\n        \"kageneko.\": \"かげねこ。\",\n        \"kagero\": \"カゲ路\",\n        \"kaginord\": \"鍵のーど\",\n        \"kagimushi\": \"かぎむし\",\n        \"kagitsuki\": \"限月\",\n        \"kagura hitsuji\": \"神楽ひつじ\",\n        \"kaguradou\": \"かぐら堂\",\n        \"kaguyahime\": \"かぐや姫\",\n        \"kahlua milk\": \"かるーあみるく\",\n        \"kai\": \"KAI\",\n        \"kai.tenchou\": \"改・店長\",\n        \"kaibido\": \"快微動\",\n        \"kaicho-maniax\": \"カイチョーマニアックス\",\n        \"kaigansen\": \"カイガンセン\",\n        \"kaigetsudou\": \"海月堂\",\n        \"kaigishitsu\": \"カイギ室\",\n        \"kaigun daisan shidan\": \"怪軍第3師団\",\n        \"kaihatsushitsu\": \"開発室\",\n        \"kaikan algorithm\": \"快感アルゴリズム\",\n        \"kaiki dennou manga bako\": \"怪奇電脳漫画箱\",\n        \"kaiki nisshoku\": \"怪奇日蝕\",\n        \"kaiman\": \"カイマン\",\n        \"kairaku shuudan\": \"怪楽集団\",\n        \"kairaku yarou g team\": \"快楽野郎Gチーム\",\n        \"kairanban\": \"快乱版\",\n        \"kairansya\": \"海覧車\",\n        \"kairoudou\": \"海老堂\",\n        \"kairyuu\": \"海竜\",\n        \"kaisei hallelujah\": \"快晴ハレルヤ\",\n        \"kaisei yohou\": \"快晴予報\",\n        \"kaisen teikoku\": \"海鮮帝国\",\n        \"kaishaku\": \"介錯\",\n        \"kaishundou honpo\": \"回春堂本舗\",\n        \"kaiteisinden\": \"海底神殿\",\n        \"kaiteki circle\": \"カイテキサークル\",\n        \"kaiten anzu tei\": \"回転杏子亭\",\n        \"kaiten sommelier\": \"回転ソムリエ\",\n        \"kaitenshiki kebabu\": \"回転式けばぶ\",\n        \"kaiun\": \"海運\",\n        \"kaiyuu kikaku\": \"回遊企画\",\n        \"kaizoku seibutsu\": \"海族生物\",\n        \"kajigurumi\": \"かじぐるみ\",\n        \"kajimura market\": \"かじむらマーケット\",\n        \"kakao kakoujou\": \"カカオ加工場\",\n        \"kaki no boo\": \"柿ノ房\",\n        \"kakinotanehitotsubu\": \"柿の種一粒\",\n        \"kakitsubata no yashiro\": \"杜若社\",\n        \"kakkasouyou\": \"かっかそうよう\",\n        \"kakogawa-ya\": \"加古川屋\",\n        \"kakohimenoutuwa\": \"かこひめのうつわ\",\n        \"kaku shoseki\": \"架空書籍\",\n        \"kakumei seifu kouhoushitsu\": \"革命政府広報室\",\n        \"kakumeiji\": \"革命児\",\n        \"kakuni\": \"KAKUNI\",\n        \"kakuq\": \"kakuQ\",\n        \"kakuu byoutou\": \"架空病棟\",\n        \"kalbi santarou\": \"カルビさん太郎\",\n        \"kaleido sky\": \"Kaleido Sky\",\n        \"kalmia\": \"KALMIA\",\n        \"kalmia8\": \"Kalmia8\",\n        \"kamaboko koujouchou.\": \"かまぼこ工場長。\",\n        \"kamaboko-doh\": \"かまぼこ堂\",\n        \"kamabokodokoro\": \"かまぼこ処\",\n        \"kamadeva\": \"Kamadeva\",\n        \"kamagabuchi\": \"かまがぶち\",\n        \"kamakiri farm\": \"カマキリファーム\",\n        \"kamameshiya\": \"かまめし屋\",\n        \"kamaros\": \"カマロス\",\n        \"kamarujirushi\": \"かまる印\",\n        \"kamawanyo\": \"KAMAWANYO\",\n        \"kame no ko\": \"亀の子\",\n        \"kamebeya\": \"かめべや\",\n        \"kamemushi\": \"カメムシ\",\n        \"kameneji\": \"かめねじ\",\n        \"kamepotel\": \"かめぽてる\",\n        \"kami no misosiru\": \"神のみそ汁\",\n        \"kami no tsuki no yashiro\": \"神の月の社\",\n        \"kamibukuro works\": \"紙袋Works\",\n        \"kamico\": \"カミコ!\",\n        \"kamifubukimura\": \"紙ふぶき村\",\n        \"kamikawa studio\": \"神川スタジオ\",\n        \"kamikaze style\": \"神風STYLE\",\n        \"kaminari-neko\": \"カミナリネコ\",\n        \"kaminendo.corporation\": \"KAMINENDO.CORPORATION\",\n        \"kaminosaki shiten\": \"神ノ裂支店\",\n        \"kamiyan\": \"かみやん\",\n        \"kamiyorozu\": \"上万\",\n        \"kamome no shokudou\": \"かもめの食道\",\n        \"kamoro-sa-z\": \"鴨ローサーズ\",\n        \"kamoshireya\": \"かもしれ屋\",\n        \"kamotama shuzou\": \"かもたま酒造\",\n        \"kamotamaza\": \"かもたま座\",\n        \"kamukamu\": \"かむかむっ!\",\n        \"kanagawa macchiato.\": \"かながわマキアート。\",\n        \"kanakana shoutengai\": \"カナカナ商店街\",\n        \"kanariya bai kanariya\": \"カナリヤバいカナリヤ\",\n        \"kanarukan\": \"歌鳴館\",\n        \"kanbotan\": \"カンボタン\",\n        \"kancho hatto\": \"艦長法度\",\n        \"kandelaar\": \"カンテラ\",\n        \"kanemasita\": \"kanemasita\",\n        \"kaneshiro083\": \"カネシロ083\",\n        \"kanidouraku\": \"かにどうらく\",\n        \"kanie-don\": \"鹿贄どん\",\n        \"kanifry\": \"カニフライ\",\n        \"kanikieru\": \"カニキエル\",\n        \"kaniman\": \"かにまん\",\n        \"kanimura hanten\": \"蟹村飯店\",\n        \"kaniparadise\": \"かにぱらだいす\",\n        \"kaniya\": \"かに家\",\n        \"kankyokusetsu\": \"寒極雪\",\n        \"kanmi ningyou\": \"甘味人形\",\n        \"kanmido\": \"甘味堂\",\n        \"kanmidokoro usb\": \"甘味処USB\",\n        \"kanmidokoro-hibiki\": \"甘味処 響\",\n        \"kanmiya makkuro\": \"感味屋真黒\",\n        \"kanmuri kamuri\": \"冠かむり\",\n        \"kannazuki seisakusho\": \"神無月製作所\",\n        \"kanosamu line\": \"KANOSAMU LINE\",\n        \"kanosawa\": \"カノサワ\",\n        \"kansai kemono rengou\": \"関西ケモノ連合\",\n        \"kanshasai soft\": \"感謝祭ソフト\",\n        \"kanshin soft\": \"かんしんソフト\",\n        \"kansyouyou marmotte\": \"鑑賞用モルモット\",\n        \"kanten garas\": \"寒天硝子\",\n        \"kantera\": \"かんてら\",\n        \"kantera no kissaten\": \"カンテラの喫茶店\",\n        \"kantou usagi gumi\": \"関東うさぎ組\",\n        \"kanyou shounen\": \"観用少年\",\n        \"kanzen busouya\": \"完全武装屋\",\n        \"kanzen dokusen\": \"完全独占\",\n        \"kanzume honpo\": \"かんづめ本舗\",\n        \"kaochuu kingdom\": \"顔厨王国\",\n        \"kaodashi bijutsukan\": \"顔出し美術館\",\n        \"kaokaoiyan\": \"かおかおいやん\",\n        \"kaori no nichiyoubi\": \"Kaoriの日曜日\",\n        \"kaoru system\": \"KAORU SYSTEM\",\n        \"kappa create\": \"カッパくりえいと\",\n        \"kappa yousai\": \"かっぱ要塞\",\n        \"kappaya\": \"河童屋\",\n        \"kara no mozuku\": \"空のもずく\",\n        \"kara no tsuki\": \"カラノツキ\",\n        \"karaage market\": \"からあげ市場\",\n        \"karaage of the year\": \"からあげオブザイヤー\",\n        \"karakuchi choucream\": \"辛口しゅーくりーむ\",\n        \"karamomo tart\": \"からももたると\",\n        \"karamoyou\": \"唐模様\",\n        \"karappa\": \"karappa\",\n        \"karashitakana\": \"からしたかな\",\n        \"karasu chan\": \"カラスちゃん\",\n        \"karasu no su\": \"鴉の巣\",\n        \"karasuke honpo\": \"烏毛本舗\",\n        \"karasuma pink higashiiru\": \"烏丸ぴんく東入ル\",\n        \"karaya\": \"殻屋\",\n        \"karazishibotan\": \"からじしぼたん\",\n        \"kareha\": \"生姜うどん\",\n        \"karehaneko\": \"かれはねこ\",\n        \"karei nudol\": \"華麗NUDOL\",\n        \"karen soft\": \"可憐ソフト\",\n        \"karibian\": \"かりび庵\",\n        \"karikari bacon\": \"カリカリベーコン\",\n        \"karin\": \"Karin\",\n        \"karintou\": \"かりん党\",\n        \"karitara kaesu\": \"かりたらかえす\",\n        \"karma laboratory\": \"業-karma-Laboratory\",\n        \"karoyaka step\": \"かろやかステップ\",\n        \"karst diary\": \"カルスト日記\",\n        \"karuhazumi\": \"かるはずみ\",\n        \"karumaya\": \"かるま屋\",\n        \"karuwani\": \"かるわに\",\n        \"kasama kou\": \"カサマ コウ\",\n        \"kasaya\": \"かさや\",\n        \"kasetsu shirokuma kakko yoi\": \"仮設しろくま\",\n        \"kasetsu yousai\": \"仮設要塞\",\n        \"kasha\": \"珈舎\",\n        \"kashinoki\": \"カシノ木\",\n        \"kashitsuki\": \"菓子つき\",\n        \"kashiwa-ya\": \"かしわ屋\",\n        \"kasou genjitsu\": \"禍葬現実\",\n        \"kasozama\": \"過疎座間\",\n        \"kassam rocketer\": \"Kassam rocketer\",\n        \"kasshoku amazoness\": \"褐色アマゾネス\",\n        \"kasshoku waisei\": \"褐色矮星\",\n        \"kasuga 1-chome\": \"春日ー丁目\",\n        \"kasugano kikaku\": \"春日野企画\",\n        \"kasukabe pantsu hunter\": \"糟日部☆ぱんつハンター\",\n        \"kasumi eater\": \"カスミイーター\",\n        \"kasuterura\": \"かすてるら\",\n        \"katagun catapult\": \"片眼カタパルト\",\n        \"katahaba creatures\": \"肩幅クリーチャーズ\",\n        \"katakuchiiwashi\": \"カタクチイワシ\",\n        \"katakuri house\": \"カタクリハウス\",\n        \"katame koime oome\": \"硬め濃いめ多め\",\n        \"katamichi kippu\": \"カタミチキップ\",\n        \"katamimi buta\": \"片耳豚\",\n        \"katamimi headphone\": \"カタミミヘッドフォン\",\n        \"kataribeya\": \"かたりべや\",\n        \"katayude tamago\": \"かたゆでたまご\",\n        \"katooya\": \"カトー屋\",\n        \"katou suzuki\": \"加藤鈴木\",\n        \"katsubushi\": \"勝つ節\",\n        \"katsuma gokurakudou\": \"かつま極楽堂\",\n        \"katsuo shisetsu gallery\": \"カツオ私設ギャラリー\",\n        \"katsuobushi\": \"勝男武士\",\n        \"katuobusi\": \"カツオ武士\",\n        \"katuraya\": \"カツラ屋\",\n        \"kaudenya lab\": \"高電壓Lab\",\n        \"kawaisouko\": \"可哀想子\",\n        \"kawaisounako\": \"かわいそうな子\",\n        \"kawanakashima kobo\": \"川中島工房\",\n        \"kawasaki jian\": \"川崎事案\",\n        \"kawasemi\": \"翡翠\",\n        \"kawauso no hokanko cg\": \"kawauso no hokanko CG\",\n        \"kawazunoen\": \"蛙の宴\",\n        \"kaya no soto\": \"蚊帳の外\",\n        \"kayano mototo\": \"茅ノ素ト\",\n        \"kayoubi\": \"火曜日\",\n        \"kayoudou\": \"華容道\",\n        \"kazakiribane\": \"風切羽\",\n        \"kazama dojo\": \"風間道場\",\n        \"kazamichizu\": \"風海地図\",\n        \"kaze no kotowari\": \"かぜのことわり\",\n        \"kazetonbo\": \"風蜻蛉\",\n        \"kazeuma\": \"かぜうま\",\n        \"kazum\": \"kazum\",\n        \"kazuya\": \"カズ屋\",\n        \"kb\": \"KB\",\n        \"ke-kiyasan\": \"けーきやさん\",\n        \"kearuda\": \"けあるだ\",\n        \"kebero corporation\": \"EBEROコーポレーション\",\n        \"kedama cube\": \"毛玉キューブ\",\n        \"kedamono\": \"kedamono\",\n        \"kedamono kangoku tou\": \"けだもの監獄島\",\n        \"kedamonoya san\": \"ケダモノ屋さん\",\n        \"kee sanpo\": \"けー散歩\",\n        \"keep-out\": \"きーぷあうと\",\n        \"kegani kenkyuushitsu\": \"毛ガニ研究室\",\n        \"kei kei dou\": \"啓々堂\",\n        \"kei kei kei loan\": \"ケイケイケイローン\",\n        \"keigai tengen\": \"境外天元\",\n        \"keikouon\": \"傾向音\",\n        \"keisotsu na ana\": \"軽率な穴\",\n        \"keito\": \"圭斗\",\n        \"keito no mori\": \"毛糸の森\",\n        \"kekanoya\": \"けかの屋\",\n        \"kemao coopercent\": \"ケマオ9%\",\n        \"kemochi\": \"けもち\",\n        \"kemokomoya\": \"けもこも屋\",\n        \"kemomimi eki\": \"けもみみ駅\",\n        \"kemomimi koukyuu jikken kikan\": \"獣耳恒久実験機関\",\n        \"kemono masshigura.\": \"けものまっしぐら。\",\n        \"kemono michi\": \"けものみち\",\n        \"kemono no koshikake\": \"けもののこしかけ\",\n        \"kemonoburg\": \"けものぶるく\",\n        \"kemonomichi\": \"KEMONOMICHI\",\n        \"kemoshiko doukoukai\": \"けもシコ同好会\",\n        \"kemotsubo\": \"ケモつぼ\",\n        \"kemoyuru\": \"けもゆる\",\n        \"kemuriya\": \"煙屋\",\n        \"kemusi no bansan kai\": \"けむしの晩餐会\",\n        \"ken-chan no tokoro\": \"ケンちゃんのところ\",\n        \"kengai san\": \"圏外さん\",\n        \"kenix\": \"KENIX\",\n        \"kenja mode\": \"賢者も～ど\",\n        \"kenkou kyoushitsu\": \"健康教室\",\n        \"kenkou wagomu\": \"けんこう輪ゴム\",\n        \"kenou shineitai\": \"拳王親衛隊\",\n        \"kenrou koubo\": \"けんろー工房\",\n        \"kensoh ogawa\": \"ケンソウオガワ\",\n        \"keraku no tsubomi\": \"けらくのつぼみ\",\n        \"kereno teikoku\": \"けれの帝国\",\n        \"kerokero mountain chicken\": \"けろけろまうんてんちきん\",\n        \"keruto\": \"ける都\",\n        \"kes3000\": \"KES3000\",\n        \"kesa and noise\": \"ケサトノイズ\",\n        \"kesson shoujo\": \"欠損少女\",\n        \"ketchup aji no mayonnaise\": \"ケチャップ味のマヨネーズ\",\n        \"ketsudon teishoku\": \"ケツ丼定食\",\n        \"ketsune cyadokoro\": \"けつね茶処\",\n        \"keumaya\": \"希有马屋\",\n        \"keyspa\": \"きーすぱ\",\n        \"kezukaya\": \"毛塚屋\",\n        \"kf\": \"KF\",\n        \"kfc\": \"KFC\",\n        \"kgb\": \"KGB\",\n        \"ki no nekko\": \"木のねっこ\",\n        \"ki-software\": \"KI-SofTWarE\",\n        \"kibawomuku\": \"牙を剥く\",\n        \"kichiku bansankai\": \"きちくばんさんかい\",\n        \"kichinemu\": \"キチネム\",\n        \"kichu\": \"きちゅ!\",\n        \"kid\": \"KID\",\n        \"kidou juushi\": \"機動重視\",\n        \"kidoukan\": \"綺堂館\",\n        \"kieyza cmp\": \"喜栄座cmp\",\n        \"kigeki banzai\": \"喜劇万歳\",\n        \"kigeki gahou\": \"喜劇画報\",\n        \"kigineiro\": \"木々音色。\",\n        \"kiheitai\": \"畸兵隊\",\n        \"kiina vitamin\": \"きいなビタミン\",\n        \"kiiro bird\": \"きいろバード\",\n        \"kijinrou\": \"奇人楼\",\n        \"kijinabe to kitsunedon\": \"きじ鍋ときつね丼\",\n        \"kikaiatama\": \"機械頭\",\n        \"kikaishojo kaiho-sensen\": \"機械少女解放戦線\",\n        \"kikaten\": \"キカテン\",\n        \"kikitsukiya\": \"ききつき屋\",\n        \"kikka-shurou\": \"菊花酒楼\",\n        \"kikkanten\": \"喫甘展\",\n        \"kikkaya\": \"橘花屋\",\n        \"kikonet\": \"きこねっと\",\n        \"kikuya\": \"姫玖屋\",\n        \"kikyou no hana no saku tokoro\": \"桔梗の花の咲くところ\",\n        \"kill the king\": \"きるきん\",\n        \"killer bambi\": \"KILLER BAMBI\",\n        \"killkill michill\": \"Killkill Michill\",\n        \"kilometer\": \"きろめーとる\",\n        \"kimagu restaurant\": \"きまぐれすとらん\",\n        \"kimagure blue\": \"きまぐれblue\",\n        \"kimagure full course\": \"気まぐれフルコース\",\n        \"kimagure na bakeneko\": \"気まぐれな化け猫\",\n        \"kimagure nyaa nyaa\": \"きまぐれ娘々♪\",\n        \"kimarinet\": \"Kimarinet\",\n        \"kimidori\": \"君彩\",\n        \"kimino kakuremino\": \"キミノカクレミノ\",\n        \"kimpotsu\": \"きムぽつ\",\n        \"kimuchi\": \"鬼武致\",\n        \"kimuchi-tei\": \"キムチ亭\",\n        \"kin-youbi\": \"金揚尾\",\n        \"kinari\": \"きなり\",\n        \"kinbou sokai\": \"近傍租界\",\n        \"kindandowa\": \"禁断童話\",\n        \"kindergarten\": \"キンダーガーテン\",\n        \"kinema bambi\": \"キネマ☆バンビ\",\n        \"kinen jumper\": \"禁煙ジャンパー\",\n        \"kinetoscope\": \"キネトスコープ\",\n        \"king revolver\": \"キングリボルバー\",\n        \"kingpin\": \"キングピン\",\n        \"kingyo no suisou\": \"金魚の水槽\",\n        \"kinmekki damashii\": \"金メッキ魂\",\n        \"kinmekki studio\": \"金メッキスタジオ\",\n        \"kinmirai kyouyou bunko\": \"近未来教養文庫\",\n        \"kino manga sekkeishitsu\": \"鬼ノ漫画設計室\",\n        \"kinoko dx\": \"きのこDX\",\n        \"kinoko hamburg tei\": \"きのこはんばーぐ亭\",\n        \"kinoko house\": \"キノコハウス\",\n        \"kinoko no kakushi beya\": \"きのこの隠し部屋\",\n        \"kinoko no karutei-nu\": \"キノコの狩るてぃーぬ\",\n        \"kinoko pot pie\": \"きのこポットぱい\",\n        \"kinoko-ex\": \"KINOKO-ex\",\n        \"kinokotai\": \"きのこ隊\",\n        \"kinokoya kari\": \"茸屋(仮)\",\n        \"kinominoyama\": \"きのみの山\",\n        \"kinomiya\": \"季の宮\",\n        \"kinzoku hannou\": \"きんぞくはんのう\",\n        \"kirakira candy\": \"キラキラキャンディ\",\n        \"kirarinkuru\": \"きらりんくる\",\n        \"kirei club\": \"奇令クラブ\",\n        \"kirei na oneesan\": \"紀霊なお姉さん\",\n        \"kirimochi texture\": \"キリモチテクスチャ\",\n        \"kirin mamire\": \"キリンまみれ\",\n        \"kirin no chisato\": \"きりんのちさと\",\n        \"kirisawa giken\": \"桐沢技研\",\n        \"kirsi engine\": \"キルシーエンジン\",\n        \"kirscherise\": \"kirscherise\",\n        \"kisachi\": \"kisachi\",\n        \"kisama soredemo ningenka\": \"貴様それでも人間か!!\",\n        \"kisamamaki soft\": \"貴様巻きソフト\",\n        \"kisaradudou\": \"木更津堂\",\n        \"kiseki\": \"軌跡\",\n        \"kisekitei\": \"軌跡亭\",\n        \"kisha-\": \"きしゃー\",\n        \"kishiben\": \"きし弁\",\n        \"kisidou\": \"旗幟堂\",\n        \"kisoima\": \"きそいま\",\n        \"kisou d koubou\": \"奇想D工房\",\n        \"kisoutengai\": \"奇想天外\",\n        \"kissyoudo\": \"亀祥堂\",\n        \"kitagawajima\": \"キタガワジマ\",\n        \"kitaizumi koubou\": \"北泉工房\",\n        \"kitakami triple\": \"北神トリプル\",\n        \"kitakara tagayase\": \"きたからたがやせ\",\n        \"kitchen studio\": \"きっちんすたじお\",\n        \"kitkaters\": \"キットカッターズ\",\n        \"kitsch\": \"吉鼠-Kitsch-\",\n        \"kitsukedou\": \"きつけ堂\",\n        \"kitsune\": \"来つ寝\",\n        \"kitsune box system\": \"きつねぼっくすしすてむ\",\n        \"kitsune no daishokudou\": \"キツネの大食堂\",\n        \"kitsune to budou\": \"きつねとぶどう\",\n        \"kitsunenomori\": \"狐の杜\",\n        \"kitsunenotera\": \"きつねのてら\",\n        \"kitsuneya\": \"きつね屋\",\n        \"kitsuneyane\": \"きつね屋根\",\n        \"kitsunezuka\": \"狐塚\",\n        \"kittydrop\": \"KittyDrop\",\n        \"kiyosumi hurricane\": \"清炭ハリケーン\",\n        \"kizaruya\": \"黄猿屋\",\n        \"kizuna project\": \"絆プロジェクト\",\n        \"kk-spa\": \"KK-SPA\",\n        \"kki\": \"KKI\",\n        \"kkk\": \"KKK\",\n        \"kkkk\": \"kkkk\",\n        \"kkm\": \"K·K·M\",\n        \"klara works\": \"Klara Works\",\n        \"klaramate\": \"クララメイト\",\n        \"kleitos\": \"クレイトス\",\n        \"kmkz5.56\": \"KMKZ5.56\",\n        \"knife edge\": \"ナイフエッジ\",\n        \"knights\": \"KNIGHTS\",\n        \"knuckle chop\": \"knuckle chop\",\n        \"knuckle head\": \"KNUCKLE HEAD\",\n        \"ko nekoneko house\": \"こねこねこはうス\",\n        \"koa\": \"こあ\",\n        \"koakuma sageha\": \"小悪魔sage派\",\n        \"koala machine\": \"コアラマシン\",\n        \"koban dou\": \"小判堂\",\n        \"kobasoft\": \"KOBAsoft;\",\n        \"koboro nindan\": \"小幌忍団\",\n        \"koboshi no niwa\": \"コボシノニワ\",\n        \"kocher\": \"コッヘル\",\n        \"kocho kocho koukou\": \"こちょこちょ高校\",\n        \"kodama planet\": \"コダマノ惑星\",\n        \"kodanukidou\": \"小狸堂\",\n        \"kodoh\": \"kodoh\",\n        \"kodomo no koe\": \"こどものこえ\",\n        \"kodukuejou\": \"小机城\",\n        \"koedame\": \"KOEDAME\",\n        \"koei\": \"コーエー\",\n        \"kogemashita\": \"焦げました\",\n        \"kohaneto\": \"こはねと\",\n        \"koharu koubou\": \"こはる工房\",\n        \"koharuchaya\": \"KOHARUCHAYA\",\n        \"koharumachi\": \"小春町\",\n        \"kohimemachi\": \"狐姫町\",\n        \"kohitsujitei\": \"古羊亭\",\n        \"kohri club\": \"氷倶楽部\",\n        \"koi no danmenzu\": \"恋の断面図\",\n        \"koigokoro no borderline\": \"恋心のボーダーライン\",\n        \"koike-ya\": \"こいけ屋\",\n        \"koikuchi kinako\": \"こいくちきなこ\",\n        \"koinu computer\": \"koinu computer\",\n        \"koinu gumi\": \"こいぬ組\",\n        \"koinu kantai\": \"子犬艦隊\",\n        \"koito sousakusho\": \"小糸創作所\",\n        \"koji2\": \"KOJI2\",\n        \"kojiki hiroba\": \"乞食広場\",\n        \"kojimashiki\": \"コジマシキ\",\n        \"kokemomo\": \"こけもも\",\n        \"kokesimuken\": \"こけしム軒\",\n        \"kokikko\": \"KOKIKKO\",\n        \"kokkei-nagaya\": \"滑稽長屋\",\n        \"kokkishin\": \"こっき心\",\n        \"kokochikyuu\": \"心地球\",\n        \"kokonokiya\": \"ここのき屋\",\n        \"kokoro metro\": \"ココロメトロ\",\n        \"kokoro no boss\": \"心のBOSS\",\n        \"kokoro no ie\": \"心之家\",\n        \"kokoro no tsubasa\": \"こころのつばさ\",\n        \"kokoro shidoushitsu\": \"ココロ指導室\",\n        \"kokumaren\": \"kokumaren\",\n        \"kokuten no sato\": \"黒甜の郷\",\n        \"kokutou kuromame\": \"黒糖くろまめ\",\n        \"kokuyouchou\": \"黒耀蝶\",\n        \"komagome pipette\": \"コマゴメピペット\",\n        \"komamesugata\": \"こまめすがた\",\n        \"komanest\": \"こまねすと\",\n        \"komatsuna-ya\": \"小松菜屋\",\n        \"komatta tomato\": \"こまったとまと\",\n        \"komatta yatsu da na.\": \"こまった奴だな。\",\n        \"komaya\": \"駒屋\",\n        \"kome\": \"米\",\n        \"kome nouka\": \"こめ農家\",\n        \"komebitsu\": \"米びつ\",\n        \"komedokoro\": \"こめどころ\",\n        \"komekami kishi dan\": \"こめかみ騎士団\",\n        \"komekouji\": \"コメコウジ\",\n        \"komenikki\": \"米にっき。\",\n        \"komenosukima\": \"米の隙間\",\n        \"kometubu\": \"米粒\",\n        \"komickers\": \"Komickers\",\n        \"komorebi-notebook\": \"こもれびのーと\",\n        \"komorebitei\": \"木漏れ日亭\",\n        \"komugiko 100 percent\": \"小麦粉100%\",\n        \"kon no pencase\": \"紺のペンケース\",\n        \"konagona biscuit\": \"こなごなビスケット\",\n        \"konagona makki shoujou\": \"粉々末期症状\",\n        \"konapoka01\": \"こなぽか01\",\n        \"konatuiro\": \"来夏色\",\n        \"konbu-maru\": \"こんぶ丸\",\n        \"konbuni\": \"こんぶに\",\n        \"koneko dorobou\": \"子猫泥棒\",\n        \"koneko gumi\": \"こねこ組\",\n        \"koneko no manma\": \"こねこのまんま\",\n        \"konekotei\": \"虎猫亭\",\n        \"kongou rikisi\": \"金剛力士\",\n        \"kongs home\": \"kongs home\",\n        \"koniro drops\": \"绀色ドロップス\",\n        \"koniro milkiro\": \"紺色ミルク色\",\n        \"konjiki no monde selection\": \"金色のモンドセレクション\",\n        \"konjikineko\": \"金色猫\",\n        \"konna tokoro no kinniku made kitaeru nante...\": \"こんなところのきんにくまできたえるなんて...\",\n        \"konno seisakubou\": \"紺野制作坊\",\n        \"konnyaku\": \"こんにゃく\",\n        \"konoderu\": \"このでる\",\n        \"konoha\": \"このは\",\n        \"konohanaya\": \"此花屋\",\n        \"konowata\": \"コノワタ\",\n        \"konpekitou\": \"紺碧糖\",\n        \"konpon jinja\": \"コンポン神社\",\n        \"kontohboh\": \"痕桃梦\",\n        \"konton lady studio\": \"混沌レディースタジオ\",\n        \"koori ame\": \"こおりあめ\",\n        \"koorigoya\": \"氷小屋\",\n        \"kooriume\": \"こおりうめ\",\n        \"kopanda\": \"子パンダ\",\n        \"koppamijin\": \"コッパミジン\",\n        \"koppun\": \"骨粉\",\n        \"korikori koubou\": \"狐狸古里工房\",\n        \"korindou\": \"こりん堂\",\n        \"korisuya\": \"こりすや\",\n        \"korogarutsuki\": \"コロガルツキ\",\n        \"korogi comics\": \"こおろぎコミックス\",\n        \"korokoro koronp\": \"ころころころんぴ\",\n        \"korokorokokoro\": \"ころころこころ\",\n        \"korokuto\": \"ころくと\",\n        \"korokyu\": \"孤狼宮\",\n        \"koropot\": \"ころぽっと\",\n        \"kororofu\": \"コロロフ\",\n        \"koruri-ya\": \"こるり屋\",\n        \"kosuko teikoku\": \"こすこ帝国\",\n        \"kosuru buta\": \"こする豚\",\n        \"kotacyuya\": \"こたちゅ屋\",\n        \"kotake souhonke\": \"小武総本家\",\n        \"kotatsu de mikan chokubaijo\": \"こたつでみかん直売所\",\n        \"kotatsu guild\": \"コタツギルド\",\n        \"kotatsu no tsukaima\": \"古竜の使い魔\",\n        \"kotatsu room\": \"KOTATSU ROOM\",\n        \"kotatsuya\": \"炬燵屋CO.LTD\",\n        \"kotau\": \"こたう\",\n        \"kotee\": \"コテ絵\",\n        \"koti\": \"KOTI\",\n        \"kotoba asobi\": \"言葉遊戯\",\n        \"kotobukiya\": \"ことぶきや\",\n        \"kotonoya\": \"琴乃屋\",\n        \"kotori jimusho\": \"小鳥事務所\",\n        \"kotoribidou\": \"小鳥日堂\",\n        \"kotorikan\": \"小鳥館\",\n        \"kotoshiki\": \"コトシキ\",\n        \"kotoyoshi wired\": \"琴義ワイアード\",\n        \"kotsumudiya\": \"こつむぢや\",\n        \"kou kidou shoujo\": \"高機動少女\",\n        \"koubai gekka\": \"紅梅月下\",\n        \"koubaitei\": \"勾配亭\",\n        \"koubou juuichiya\": \"工房十一屋\",\n        \"koucha rakkyo\": \"紅茶辣韭\",\n        \"koudansha\": \"幸田ん舎\",\n        \"koufukuya\": \"幸福屋\",\n        \"kougaku meisai\": \"光学迷彩\",\n        \"kougeki\": \"幸撃\",\n        \"kougi anmitsu\": \"公儀あんみつ\",\n        \"kougi no mikan batake\": \"KOUGIのみかん畑\",\n        \"kougyo\": \"耿魚\",\n        \"kougyokutei dokuringo\": \"紅玉亭毒林檎\",\n        \"kouhuku shigen\": \"幸福資源\",\n        \"kouketsu no otome\": \"高潔の乙女\",\n        \"koukotsu panda\": \"恍惚熊猫\",\n        \"koukyou koukoku kikou\": \"公共広告奇行\",\n        \"kourinsha\": \"降臨社\",\n        \"koushi\": \"子牛\",\n        \"kousoku bitch network\": \"高速ビッチネットワーク\",\n        \"kousoku gurihari-tei\": \"高速グリハリ亭\",\n        \"kousoku kaiten\": \"高速回転\",\n        \"koutarou with t\": \"こうたろうWithティー\",\n        \"koutetsu\": \"鋼鉄\",\n        \"koutetsu rengou\": \"鋼鉄連合\",\n        \"koutetsuryoku kikaku\": \"鋼鉄力企画\",\n        \"kouya ni sakebu aitsu no heya\": \"荒野に叫ぶアイツの部屋\",\n        \"kouyadou\": \"こうや堂\",\n        \"kouzaka-san to makino jimusho\": \"神坂さんとマキノ事務所\",\n        \"kouzukitei\": \"香月亭\",\n        \"kouzuya\": \"興津屋\",\n        \"kowaremono\": \"こわれもの\",\n        \"kowareta omocha\": \"壊れたおもちゃ\",\n        \"kozimoko\": \"こじもこ\",\n        \"kozouya\": \"子蔵屋\",\n        \"kptms\": \"KPTM'S\",\n        \"kraftbox\": \"Kraftbox\",\n        \"krono-hudenekotei\": \"クロノ筆猫亭\",\n        \"kss\": \"ケイエスエス\",\n        \"ktn\": \"KTN\",\n        \"ktq48\": \"KTQ48\",\n        \"ku-ten\": \"KU-TEN\",\n        \"kubaya\": \"くば屋\",\n        \"kubotaya\": \"久保田屋\",\n        \"kuchen sirup\": \"く～へんしろっぷ\",\n        \"kuchibashi feti\": \"くちばしフェチ\",\n        \"kuchiki no uro\": \"朽木ノ洞\",\n        \"kudamono damono\": \"くだものだもの\",\n        \"kudarizaka guardrail\": \"下り坂ガードレール\",\n        \"kugatsuya\": \"九月屋\",\n        \"kuikome sagi\": \"食い込め詐欺\",\n        \"kujira logic\": \"くぢらろじっく\",\n        \"kujuukuri nyajuu kai\": \"九十九里ニャ獣会\",\n        \"kukudou\": \"くく堂\",\n        \"kukuya\": \"くく屋\",\n        \"kulmov\": \"kulmov_\",\n        \"kuma knights\": \"クマナイツ\",\n        \"kuma no mori\": \"くまのもり\",\n        \"kuma x usagi\": \"くま×うさぎ\",\n        \"kuma-puro\": \"Kuma-puro\",\n        \"kumagai stars\": \"くまがいスターズ\",\n        \"kumagaya hakushon kai\": \"熊谷はくしょん会\",\n        \"kumakumadou\": \"くまくま道\",\n        \"kumakumaice\": \"くまくまあいす\",\n        \"kumakuramizu\": \"熊倉水\",\n        \"kumameshi-ya\": \"クマ飯屋\",\n        \"kumanikotec\": \"クマニコテック\",\n        \"kumao cafe\": \"くまおカフェ\",\n        \"kumapanda\": \"くまぱんだ\",\n        \"kumatyu bokujou\": \"クマチュウ牧場\",\n        \"kume\": \"久米\",\n        \"kumikae dna\": \"組換DNA\",\n        \"kumogakure.\": \"くもがくれ。\",\n        \"kumohatiya\": \"雲八屋\",\n        \"kune kune project\": \"Kune Kune Project\",\n        \"kunkakunka teikoku\": \"くんかくんか帝国\",\n        \"kunseidou\": \"燻製堂\",\n        \"kuon hirohiko\": \"久遠広彦\",\n        \"kuoone\": \"くお～ね\",\n        \"kuragakuya\": \"倉楽屋\",\n        \"kurage kenkyuusho\": \"くらげ研究所\",\n        \"kurage no candume\": \"くらげのかんづめ\",\n        \"kurage suizokukan\": \"くらげ水族館\",\n        \"kurahashi shoin\": \"倉橋書院\",\n        \"kurakamadou\": \"くらかま堂\",\n        \"kurasan\": \"倉さん\",\n        \"kurenai heptagon\": \"KureNAI HeptaGoN\",\n        \"kurenai shoujo\": \"紅少女\",\n        \"kureten\": \"KURETEN\",\n        \"kureura seisakujo\": \"呉浦製作所\",\n        \"kuributon\": \"栗布団\",\n        \"kurimanjuu\": \"くりまんじゅう\",\n        \"kurione-sha\": \"くりおね館\",\n        \"kuripachi no heya\": \"クリパチの部屋\",\n        \"kuripick\": \"栗pick\",\n        \"kuripod\": \"KURIPOD\",\n        \"kurita sora\": \"栗田空\",\n        \"kuro cornet\": \"黒こるね\",\n        \"kuro inu sha\": \"黒戌舎\",\n        \"kuro majutsu coffee\": \"黒魔術コーヒー\",\n        \"kuro no alice\": \"黒のアリス\",\n        \"kuro queen\": \"Kuro Queen\",\n        \"kuro to kane no hane\": \"黒と銀の羽\",\n        \"kuro-level\": \"KURO-LEVEL\",\n        \"kurobuchi\": \"クロブチ\",\n        \"kurocan\": \"クロ缶\",\n        \"kurodamaya\": \"黒玉屋\",\n        \"kurodensha\": \"黒電車\",\n        \"kurodenwa\": \"黒電話\",\n        \"kurodou holdings\": \"黒堂ホールディングス(株)\",\n        \"kurogane cage\": \"くろがねけーじ\",\n        \"kuroge to momojiru\": \"黒毛と桃汁\",\n        \"kurogomaknights\": \"黒ごま騎士団\",\n        \"kurohamya\": \"黒ハム屋\",\n        \"kurohime\": \"黒姫\",\n        \"kurohina\": \"黒雛\",\n        \"kurohinabako\": \"黒雛箱\",\n        \"kurohonyasan\": \"くろほんやさん\",\n        \"kuroi inu no daisharin\": \"黒い犬の大車輪\",\n        \"kuroi kyoudain\": \"黒いキョーダイン\",\n        \"kuroi mikan no naru momo no ki\": \"黒いみかんのなるももの木\",\n        \"kuroi miyako\": \"黒イ都\",\n        \"kuroi mono\": \"黒いモノ\",\n        \"kurokami studio s\": \"クロカミスタジオS\",\n        \"kurokari\": \"くろかり\",\n        \"kurokishi no kakurega\": \"黒騎士の隠れ家\",\n        \"kurokoya\": \"くろこ屋\",\n        \"kuromame pack\": \"くろまめぱっく\",\n        \"kuromisakaijou\": \"黒ミサ会場\",\n        \"kuromogu teikoku\": \"黒モグ帝国\",\n        \"kuromori-ya\": \"黒森屋\",\n        \"kuroneko akaribon\": \"黒ねこ赤リボン\",\n        \"kuroneko to taijutei\": \"黒猫と大樹亭\",\n        \"kuroneko waltz\": \"黒ネコワルツ\",\n        \"kuronekodou\": \"黒猫堂\",\n        \"kuronekokan-monpetit\": \"黒猫館モンプチ\",\n        \"kuronekotei\": \"黒猫亭\",\n        \"kurono taitsu\": \"黒野タイツ\",\n        \"kuropoplar\": \"くろぽぷら\",\n        \"kurosawa pict\": \"黒澤pict\",\n        \"kuroshikatei\": \"黒鹿亭\",\n        \"kuroshiro desire\": \"黒白デザイア\",\n        \"kurotoshiro\": \"黒ト白\",\n        \"kurotoya\": \"黒杜屋\",\n        \"kurotsuki shoukai\": \"黒月商会\",\n        \"kurousagi\": \"kurousagi\",\n        \"kuroyuki\": \"黒雪\",\n        \"kurozako palace\": \"くろざこパレス\",\n        \"kurubusi-kai\": \"踝会\",\n        \"kuruguru dna\": \"くるぐるDNA\",\n        \"kurumian\": \"くるみ庵\",\n        \"kurusugawa pikumintei\": \"来栖川ピクミン亭\",\n        \"kusanagi-blade\": \"KUSANAGI-BLADE\",\n        \"kusari\": \"KUSARI\",\n        \"kusari caterpillar\": \"锁キャタピラ\",\n        \"kusari no youjo\": \"鎖の幼女\",\n        \"kusariku\": \"草陸\",\n        \"kushimoto house\": \"くしもとハウス\",\n        \"kushiyabu\": \"クシヤブ\",\n        \"kusosweets\": \"kusosweets\",\n        \"kusoyuridanchi\": \"クソユリ団地\",\n        \"kusozako nameko\": \"くそざこなめこ\",\n        \"kusugu land\": \"くすぐらんど\",\n        \"kusuribako\": \"くすり箱\",\n        \"kusurin soft\": \"くすりんソフト\",\n        \"kutushita nijiru honpo\": \"靴下煮汁本舗\",\n        \"kuuchuusen\": \"空中線\",\n        \"soramitiheno-r\": \"空道へのR\",\n        \"kuudou flare\": \"空洞フレア\",\n        \"kuuppii\": \"くぅっぴぃ\",\n        \"kuurintei\": \"空輪艇\",\n        \"kuusou banana\": \"空想バナナ\",\n        \"kuusou kyuuka\": \"空想休暇\",\n        \"kuusou monochrome\": \"空想モノクローム\",\n        \"kuusou post\": \"空想ポスト\",\n        \"kuusou riot\": \"空想RIOT!\",\n        \"kuusou switch\": \"空想スイッチ\",\n        \"kuwaikuwa\": \"くわいくわ\",\n        \"kuzu no kagami\": \"クズの鑑\",\n        \"kuzumochi\": \"KUZUMOCHI\",\n        \"kuzunari\": \"くずなり\",\n        \"kwi ag\": \"KWI AG\",\n        \"kyapa city\": \"きゃぱCITY\",\n        \"kyo-rakuji\": \"享楽寺\",\n        \"kyodai kidou yousai kyoushuu\": \"巨大軌道要塞強襲\",\n        \"kyojinkou\": \"巨人港\",\n        \"kyokutou dennou kaihatsukyoku\": \"極東電脳開発局\",\n        \"kyokutou funamushi\": \"極東舟虫\",\n        \"kyomu no uta\": \"虚無の歌\",\n        \"kyoshoku shou\": \"虚飾症\",\n        \"kyosuu shiniki\": \"虚数神域\",\n        \"kyoten heichou\": \"拠点兵長\",\n        \"kyou no keiro\": \"今日の毛色\",\n        \"kyoubou jouchotai\": \"凶暴情緒帯\",\n        \"kyougetsutei\": \"共月邸\",\n        \"kyouki na shiunten\": \"狂気な試運転\",\n        \"kyoumata\": \"今日また\",\n        \"kyounetsuzanbun\": \"強熱残分\",\n        \"kyourakuen\": \"享樂苑\",\n        \"kyouretsu hiyougeka\": \"強烈肥養外科\",\n        \"kyouryuu no tamago\": \"恐竜の卵\",\n        \"kyousatu\": \"きょうさつ\",\n        \"kyousei josou kyousei nyotaika kyousei otokonoko\": \"強制女装・強制女体化・強制男の娘\",\n        \"kyousei tsf no ohanashi\": \"強制TSFのお話し\",\n        \"kyouun rrr\": \"きょううんRRR\",\n        \"kyouya\": \"今日屋\",\n        \"kyozoya\": \"京蔵屋\",\n        \"kyujitsusyukkin\": \"休日出勤\",\n        \"kyun kyun art works\": \"きゅんきゅんあーとわーくす\",\n        \"kyusuisei polymer\": \"吸水性ポリマー\",\n        \"kyuu no mon\": \"九の門\",\n        \"kyuu tekki jidai\": \"旧鉄器時代\",\n        \"kyuukeijo no higashi\": \"休憩所の東\",\n        \"kyuuketsukousi\": \"吸血公子\",\n        \"kyuusanpin\": \"きゅうさんぴん\",\n        \"kyuushoku dorobou\": \"給食泥棒\",\n        \"l novels\": \"Lノベルズ\",\n        \"l-u\": \"L-u\",\n        \"l.l. milk\": \"L.L.MILK\",\n        \"l.o.w\": \"L.O.W\",\n        \"l.p.e.g.\": \"L.P.E.G.\",\n        \"la vender\": \"La vender\",\n        \"la.c.\": \"La.C.\",\n        \"lab chicken\": \"LAB CHICKEN\",\n        \"lab-star\": \"らびすたー\",\n        \"laboratory\": \"Laboratory\",\n        \"laboratory 09\": \"Laboratory#09\",\n        \"lacti9\": \"Lacti9\",\n        \"lactobacillus\": \"ラクトバシラス\",\n        \"lactucopicrin\": \"ラクチュコピクリン\",\n        \"ladybacker\": \"LadyBacker\",\n        \"lagarto\": \"Lagarto\",\n        \"lagerstatten\": \"Lagerstatten\",\n        \"lagrangian-point\": \"Lagrangian-Point\",\n        \"laichi\": \"LAICHI\",\n        \"lala soft\": \"Lala soft\",\n        \"lala studio\": \"LALA STUDIO\",\n        \"lamchat\": \"ラム茶っと!\",\n        \"lamia\": \"Lamia\",\n        \"lamipas\": \"lamipas\",\n        \"landurchin\": \"Land Urchin\",\n        \"landcut\": \"ランドカット\",\n        \"lapis blue.\": \"LAPIS BLUe.\",\n        \"lapis lazuli\": \"ラピスラズリ\",\n        \"lapiss\": \"Lapiss\",\n        \"lapiz lazuli kouseki\": \"ラピスラズリ鉱石\",\n        \"laplacedotcom\": \"らぷらすどっとこむ\",\n        \"laplacian\": \"Laplacian\",\n        \"lass\": \"ラス\",\n        \"lass pixy\": \"Lass Pixy\",\n        \"last eden\": \"LAST EDEN\",\n        \"last resort\": \"ラストリゾート\",\n        \"latelate\": \"latelate\",\n        \"lathimania kyouwakoku\": \"ラチマニア共和国\",\n        \"latte\": \"Latte\",\n        \"laurier\": \"ろりえーる\",\n        \"lazy crew\": \"レイジークルー\",\n        \"lazystyle\": \"LazyStyle\",\n        \"leaf geometry\": \"リーフジオメトリ\",\n        \"leaf party\": \"リーフパーティー\",\n        \"leaz koubou\": \"りーず工房\",\n        \"left\": \"LEFT\",\n        \"legato\": \"Legato\",\n        \"leimz-project\": \"LEIMZ-PROJECT\",\n        \"leman koukoku\": \"レマン公国\",\n        \"lemming\": \"Lemming\",\n        \"lemniscate\": \"レムニスケート\",\n        \"lemon bakudan\": \"レモンばくだん\",\n        \"lemon cake\": \"レモンケーキ\",\n        \"remon no omise\": \"れもんのお店\",\n        \"lemon zest\": \"LEMON ZEST\",\n        \"lemonbridge\": \"レモンブリッジ\",\n        \"lemontei\": \"檸檬亭\",\n        \"leo-circle\": \"さーくるLEO-CIRCLE\",\n        \"leprotto\": \"Leprotto\",\n        \"lesport\": \"Lesport\",\n        \"lesser panda ga yome\": \"レッサーパンダが嫁\",\n        \"leucojum\": \"LEUCOJUM\",\n        \"level-x\": \"LEVEL-X\",\n        \"level.41\": \"Level.41\",\n        \"level1\": \"level1\",\n        \"lewd angels\": \"Lewd Angels\",\n        \"leymei\": \"LEYMEI\",\n        \"lhezi\": \"LHEZI\",\n        \"liar-soft\": \"ライアーソフト\",\n        \"libertaria\": \"リバタリア\",\n        \"libido\": \"リビドー\",\n        \"libido kaikan\": \"リビドー会館\",\n        \"libido soft\": \"りびどーそふと\",\n        \"libya cuckoo\": \"リビア郭公\",\n        \"licorice candy\": \"リコリスキャンディ\",\n        \"liddell\": \"Liddell\",\n        \"liebe\": \"リーベ\",\n        \"lielos no kakurega\": \"ゆいれその隠れ家\",\n        \"life\": \"life\",\n        \"life degeneration laboratory\": \"人生堕落研究所\",\n        \"light\": \"ライト\",\n        \"light garden\": \"ライト・ガーデン\",\n        \"light in the night\": \"ライトインザナイト\",\n        \"light of night\": \"Light of Night\",\n        \"light pink\": \"ライトピンク\",\n        \"light rate port pink\": \"ライト・レイト・ポート・ピンク\",\n        \"lightguide\": \"LightGuide\",\n        \"lightplan\": \"ライトプラン\",\n        \"likefairly\": \"LikeFairly\",\n        \"lilac\": \"lilac\",\n        \"lili\": \"lili\",\n        \"lili marleen\": \"リリーマルレーン\",\n        \"lilije drug\": \"リリェドラッグ\",\n        \"lilim\": \"LiLiM\",\n        \"lilim darkness\": \"リリムダークネス\",\n        \"lilium\": \"LILIUM\",\n        \"lilium auratum\": \"Lilium auratum\",\n        \"liliya\": \"リリ舎\",\n        \"lilliput\": \"リリパット\",\n        \"lily under\": \"リリーアンダー\",\n        \"lilyth\": \"Lilyth\",\n        \"limecat\": \"LimeCat\",\n        \"limit\": \"LIMIT\",\n        \"limit break\": \"りみっとぶれいく\",\n        \"limit cycle\": \"LIMIT CYCLE\",\n        \"limit plus\": \"limit+\",\n        \"limit works\": \"Limit Works\",\n        \"limited\": \"ちこ★小屋\",\n        \"lindas ark\": \"Linda's ark\",\n        \"linke hand\": \"Linke Hand\",\n        \"linkringrin\": \"リンクリングリン\",\n        \"lion heart\": \"Lion Heart\",\n        \"liongoya\": \"らいおん小屋\",\n        \"lip van winkle\": \"Lip Van Winkle\",\n        \"lipstar\": \"LIPSTAR\",\n        \"lipterrible\": \"クチビルテリブル\",\n        \"liquid\": \"リキッド\",\n        \"lirico\": \"lirico\",\n        \"listless time\": \"listless time\",\n        \"lithium\": \"Lithium\",\n        \"little bear\": \"リトルベア\",\n        \"little cosmos\": \"Little☆Cosmos\",\n        \"little hopper with h\": \"りとるほっぱー with H\",\n        \"little lindo\": \"Little Lindo\",\n        \"little mantis\": \"Little mantis\",\n        \"little mermaid henshuubu\": \"リトル・マーメイド編集部\",\n        \"little quartz\": \"Little Quartz\",\n        \"little shop\": \"little shop\",\n        \"little snow\": \"little snow\",\n        \"littlemare\": \"リトルメア\",\n        \"littleollie\": \"Littleollie\",\n        \"live kuroneko iin\": \"来舞黒猫医院\",\n        \"liz\": \"LiZ\",\n        \"liz project\": \"liz project\",\n        \"lo likyo new\": \"LoりきょNEW!\",\n        \"lo5type\": \"Lo5type\",\n        \"lobatt\": \"LOBATT\",\n        \"lobelia\": \"Lobelia\",\n        \"local kintas\": \"Local Kintas\",\n        \"locomocodon\": \"ろこもこどん\",\n        \"locus\": \"Locus\",\n        \"log\": \"LOG\",\n        \"log house\": \"Log House\",\n        \"logic choco\": \"ロジックチョコ\",\n        \"loiter\": \"loiter\",\n        \"lol\": \"LOL\",\n        \"loli goranyo\": \"ろりーごーらんにょ\",\n        \"lolic system\": \"LOLIC SYSTEM\",\n        \"lolicon trap\": \"ロリコントラップ\",\n        \"lolimajin\": \"ろりま陣\",\n        \"lolimate seizou koujou\": \"ロリメイト製造工場\",\n        \"lolli pop\": \"Lolli*PoP\",\n        \"lolol\": \"LOLOL\",\n        \"lomelette\": \"Lomelette\",\n        \"lonely island\": \"ロンリーアイランド\",\n        \"longhorntrain\": \"LongHornTrain\",\n        \"loopholic\": \"loopholic\",\n        \"loopsoft\": \"loopsoft\",\n        \"lop\": \"LOP\",\n        \"lopet dan\": \"ろぺっとだん\",\n        \"loser\": \"LOSER\",\n        \"lost garden\": \"Lost Garden\",\n        \"lotus\": \"LOTUS\",\n        \"love and sekkan\": \"らぶ&セッカン\",\n        \"love bird\": \"Love Bird\",\n        \"love bitch\": \"らぶびっち\",\n        \"love circle young punch\": \"ラブサークルヤングパンチ\",\n        \"love kyun maiden\": \"らぶキュンめいでん\",\n        \"love me do\": \"LOVE ME DO\",\n        \"love size\": \"ラブサイズ\",\n        \"love xxx.\": \"love xxx.\",\n        \"love-rs\": \"love-Rs\",\n        \"love4sale\": \"love4sale\",\n        \"lovejuice pink\": \"LoveJuiceピンク\",\n        \"loveletter carburetor\": \"恋文気化器\",\n        \"lovelovedoll\": \"LOVELOVEDOLL\",\n        \"lovely complex\": \"Lovely complex\",\n        \"lovely pretty chou aishiteru\": \"ラブリープリチー超愛してる\",\n        \"loveolsis\": \"らぶおるしす\",\n        \"lovesca\": \"lovesca\",\n        \"lovesugi\": \"らぶすぎ\",\n        \"low angler\": \"ろうあんぐら～\",\n        \"low tech team\": \"Low Tech Team\",\n        \"low-f\": \"Low-F\",\n        \"low-tension\": \"Low-Tension\",\n        \"lowhide project\": \"LOWHIDE PROJECT\",\n        \"lrig lab\": \"ルリ研\",\n        \"ls\": \"LS\",\n        \"ls-box\": \"LS-Box\",\n        \"lsize\": \"Lサイズ\",\n        \"ltm.\": \"LTM.\",\n        \"ltu\": \"Ltu\",\n        \"luciferhood\": \"Luciferhood\",\n        \"luck and pluck co.\": \"LUCK&PLUCK!Co.\",\n        \"luck gear\": \"Lucky GEAR\",\n        \"luck10\": \"Luck10\",\n        \"lucky club\": \"LUCKY CLUB\",\n        \"lucky paranoia\": \"lucky paranoia\",\n        \"luckyend\": \"ラッキーエンド\",\n        \"luckystripe\": \"LuckyStripe\",\n        \"lucretia\": \"LUCRETiA\",\n        \"lucyr\": \"LUCYR\",\n        \"lulu koubou\": \"LULU工房\",\n        \"lummy\": \"Lummy\",\n        \"lumnesoda\": \"ラムネソーダ\",\n        \"luna industria\": \"ルナ・インダストリア\",\n        \"luna papa\": \"LUNA PAPA\",\n        \"luna soft\": \"ルナソフト\",\n        \"lunacy\": \"Lunacy\",\n        \"lunar gravity acceleration\": \"月面重力加速度\",\n        \"lunarium\": \"ルナリウム\",\n        \"lunasummit\": \"LUNASUMMIT\",\n        \"lunaterk\": \"るなたーく\",\n        \"lunatic\": \"ルナティック\",\n        \"lunatic joker\": \"lunatic joker\",\n        \"lunatic orgasm\": \"ルナティックオーガズム\",\n        \"lunatic prophet\": \"LUNATIC PROPHET\",\n        \"lunatic star\": \"ルナティックスター\",\n        \"lunatic traveler\": \"るなてぃっくとらべらー\",\n        \"lunatics\": \"Lunatics\",\n        \"lunatique\": \"LUNATIQUE\",\n        \"lunch box\": \"LUNCH BOX\",\n        \"lunchbox\": \"lunchbox\",\n        \"lune\": \"ルネ\",\n        \"lune comic\": \"ルネコミック\",\n        \"lune team bitters\": \"ルネ Team Bitters\",\n        \"lust bit\": \"ルストビット\",\n        \"lusterise\": \"Lusterise\",\n        \"lutein\": \"るていん\",\n        \"luwen workshop\": \"Luwen Workshop\",\n        \"luxia continent\": \"るくしあ大陸\",\n        \"luxury\": \"ラグジュアリー\",\n        \"luxury tiara\": \"Luxury Tiara\",\n        \"lv.x\": \"LV.X+\",\n        \"lycoly\": \"Lycoly\",\n        \"lyrical magical\": \"リリカルマジカル\",\n        \"lyricalize\": \"Lyricalize\",\n        \"lyricbox\": \"リリックボックス\",\n        \"m\": \"M\",\n        \"m de pink\": \"M de PINK\",\n        \"m no violet\": \"エム・ヴァイオレット\",\n        \"m shousetsu doumei\": \"M小説同盟\",\n        \"m-10\": \"M-10\",\n        \"m-free\": \"M-FREE\",\n        \"m-keifu\": \"Mケイフ\",\n        \"m-koujou\": \"M工場\",\n        \"m-lab.\": \"M-LAB.\",\n        \"m-style\": \"M・S T Y L E\",\n        \"m-trinity\": \"M-trinity\",\n        \"m.a.d works\": \"M.A.D WORKS\",\n        \"m.a.f\": \"M.A.F\",\n        \"m.a.l.t\": \"m.a.l.t\",\n        \"m.h. bokujou\": \"M.H.牧場\",\n        \"m.i.r.u\": \"M.I.R.U\",\n        \"m.i.ring\": \"M.I.RING\",\n        \"m.o.k. teabag\": \"M.O.K.ちゃぶくろ\",\n        \"m.r products\": \"M.R プロダクツ\",\n        \"m2230\": \"m2230\",\n        \"ma2\": \"MA2\",\n        \"mabatakimosezu\": \"瞬きもせず\",\n        \"mabo udon teishoku\": \"麻婆うどん定食\",\n        \"mabonasu\": \"マーボーナス\",\n        \"macaron\": \"マカロン\",\n        \"macaron sketch\": \"Macaron*Sketch\",\n        \"macaron sugar\": \"まかろんシュガー\",\n        \"macaroncrown\": \"MacaronCrown\",\n        \"macaroni ring\": \"マカロニグミ\",\n        \"macaroni teikoku\": \"マカロニ帝国\",\n        \"macchadokoro\": \"抹茶処\",\n        \"macdoll\": \"macdoll\",\n        \"machednia\": \"まけどに屋\",\n        \"machi no kissaten\": \"街の喫茶店\",\n        \"machida cherry boys\": \"町田チェリーボーイズ\",\n        \"machikado-mapoze\": \"街角麻婆豆\",\n        \"machinery\": \"マシーナリー\",\n        \"machwing\": \"マッハウイング\",\n        \"maclona\": \"まっ黒な\",\n        \"macneil koubou\": \"マクニエル工房\",\n        \"macolulu\": \"マコルル\",\n        \"macrown\": \"macrown\",\n        \"macv-sog\": \"MACV-SOG\",\n        \"mad hand rowa\": \"マドハンドロワ\",\n        \"mad mac\": \"MAD MAC\",\n        \"mad-puppy\": \"MAD-PUPPY\",\n        \"mada maniau kamo\": \"まだ間に合うかも\",\n        \"madam project\": \"マダム・プロジェクト\",\n        \"mado no kuchibue fuki\": \"窓の口笛吹き\",\n        \"mado soft\": \"まどそふと\",\n        \"madogiwa oukoku\": \"窓際王国\",\n        \"madogiwa works\": \"Madogiwa Works\",\n        \"madou shiryoushitsu\": \"魔導資料室\",\n        \"madraid\": \"マッドレイド\",\n        \"maebax\": \"maebax\",\n        \"mafiya\": \"マフィ家\",\n        \"mafuri marimonnu\": \"まふりまりもんぬ\",\n        \"mafuya\": \"まふ屋\",\n        \"mag\": \"まぐ!\",\n        \"mag kan\": \"MAG館\",\n        \"magaimonoyasoinabashiten\": \"まがいもの八十稲羽支店\",\n        \"magetarudou\": \"髷樽堂\",\n        \"magi\": \"MAGI\",\n        \"magi black\": \"MAGI black\",\n        \"magic fortune hachioujiten\": \"マジックフォーチュン八王子店\",\n        \"magic house\": \"まじっくハウス\",\n        \"magic machinery\": \"MAGIC MACHINERY\",\n        \"magic private eye\": \"魔法探偵社\",\n        \"magic wand\": \"Magic wand\",\n        \"magical arts\": \"マジカルアーツ\",\n        \"magical garden\": \"魔法庭園\",\n        \"magnetic field\": \"MAGNETIC FIELD\",\n        \"magnitude 711\": \"マグニ厨度711\",\n        \"magnolia\": \"MAGNOLIA\",\n        \"magont\": \"MAGONT\",\n        \"magudara kaihou doumei\": \"マグダラ解放同盟\",\n        \"magukappu\": \"マグカップ\",\n        \"maguma sansou\": \"マグマ山荘\",\n        \"maguni fc\": \"マグニFC\",\n        \"maguro\": \"MAGURO\",\n        \"maguro beya\": \"まぐろ部屋\",\n        \"maguro bokujo\": \"まぐろ牧場\",\n        \"maguro donburi\": \"まぐろどんぶり\",\n        \"maguro.\": \"maguro.\",\n        \"magurodrastic\": \"まぐろドラスティック\",\n        \"mahirutei\": \"まひる亭\",\n        \"mahjong yugen co.ltd 58\": \"麻雀有限会社58\",\n        \"mahola\": \"MaHoLa\",\n        \"mahouse\": \"MAHOUSE\",\n        \"mahupoko\": \"マフポコ\",\n        \"maibotsu\": \"埋没\",\n        \"maichan kikaku\": \"まいちゃん企画\",\n        \"maid club\": \"メイド倶楽部\",\n        \"maika\": \"MAIKA\",\n        \"maikata kougyou\": \"マイカタ工業\",\n        \"maimaimai\": \"まいまいまい！\",\n        \"maina-mania\": \"マイナー・マニア\",\n        \"mainichi ga mushi no iki\": \"毎日が虫の息\",\n        \"mainichi sonoba shinogi\": \"毎日その場シノギ\",\n        \"maisai\": \"まいさい\",\n        \"majesticrune\": \"MajesticRune\",\n        \"majihima\": \"まじひま\",\n        \"majikayo\": \"マジかよ\",\n        \"majikoru gensou kyoudan\": \"蠱る幻想狂団\",\n        \"majimadou\": \"真嶋堂\",\n        \"majin houkou\": \"魔神咆哮\",\n        \"majocolony\": \"majocolony\",\n        \"maka no sokutu\": \"摩訶の巣窟\",\n        \"maka-rakko\": \"まからっこ\",\n        \"make pig press\": \"make pig press\",\n        \"make3d\": \"MAKE3D\",\n        \"makepriority\": \"MakePriority\",\n        \"makiba no asa\": \"まきばの朝\",\n        \"makikusu\": \"まきくす\",\n        \"makino eki\": \"牧野駅\",\n        \"makka tintin\": \"マッカTINTIN\",\n        \"makkou kujira\": \"まっこうくじら\",\n        \"makkurona\": \"まっ黒な\",\n        \"makoto shiyaka\": \"間琴しや架\",\n        \"makoto skip\": \"まこと☆スキップ\",\n        \"maku\": \"Maku\",\n        \"makura\": \"枕\",\n        \"makuriya\": \"まくりや\",\n        \"makushiro\": \"マクシロ\",\n        \"malus pumila\": \"まるすぷみら\",\n        \"mama ni wa naisho\": \"ママにはナイショ\",\n        \"mama-san ballet\": \"ママさんバレエ\",\n        \"mamagotoya\": \"ままごと屋\",\n        \"mamagult\": \"ママグル徒\",\n        \"mamamax\": \"MAMAMAX\",\n        \"mame\": \"豆\",\n        \"mamedaifukuya\": \"豆大福屋\",\n        \"mamekome\": \"まめこめ\",\n        \"mamekura\": \"豆蔵\",\n        \"mamemochi\": \"まめもち\",\n        \"mamenon\": \"まめのん\",\n        \"mamex\": \"mamex\",\n        \"mamiana paradise\": \"狸穴天国\",\n        \"mammypoko\": \"＊mammypoko＊\",\n        \"mamoru soup\": \"まもるスープ\",\n        \"man chin low\": \"満珍楼\",\n        \"man say\": \"Man Say\",\n        \"man-room\": \"MAN-ROOM\",\n        \"manam\": \"MANAM\",\n        \"manamagu\": \"まなまぐ\",\n        \"manbaka\": \"漫バカ\",\n        \"manboutei\": \"まんぼう亭\",\n        \"manbun no ichi\": \"万分の市\",\n        \"manchindou\": \"マンチン堂\",\n        \"mandoragora striker\": \"まんどらごらすとらいかー\",\n        \"mandrill\": \"まんドリル\",\n        \"manga jigoku\": \"マンガジゴク\",\n        \"manga super\": \"マンガスーパー\",\n        \"mangan\": \"マンガン\",\n        \"mangana\": \"漫画な。\",\n        \"manganiku\": \"幡芽にく\",\n        \"mange\": \"万華\",\n        \"mangetsu hagure\": \"満月はぐれ\",\n        \"mangosteen\": \"マンゴスチン\",\n        \"manguri cannon\": \"まんぐりキャノン\",\n        \"maniac street\": \"Maniac Street\",\n        \"manianima\": \"まにあにま\",\n        \"maniax55\": \"ManiaX55\",\n        \"manimani.\": \"まにまに。\",\n        \"manitou\": \"MANITOU\",\n        \"manjuu x\": \"まんじゅうX\",\n        \"manjyu-umai.\": \"まんじゅううまい。\",\n        \"mankan zenseki\": \"漫甘全席\",\n        \"manles laboratory\": \"マンルのラボラトリー\",\n        \"manman\": \"まんまん\",\n        \"manmanya\": \"まんまん屋\",\n        \"manmaru hoppe\": \"まんまるほっぺ\",\n        \"mano-ya\": \"まの屋\",\n        \"manpuchi\": \"まんぷち\",\n        \"mantaman\": \"マンタマン\",\n        \"manten hoshizora\": \"満天星空\",\n        \"mantobi\": \"まんとび\",\n        \"many b\": \"Many B\",\n        \"manymanyrain\": \"manymanyrain\",\n        \"manzokudou\": \"満足堂\",\n        \"maple-go\": \"maple号\",\n        \"marabians\": \"マラビアンズ\",\n        \"marakkuma\": \"マラックマ\",\n        \"maraparte\": \"まらぱるて\",\n        \"marasca no oni\": \"マラスカの鬼\",\n        \"maraschino\": \"MARASCHINO\",\n        \"marastudio\": \"MaraStudio\",\n        \"marble\": \"marble\",\n        \"marble candy soft\": \"マーブルCandySoft\",\n        \"marble kid\": \"マーブルキッド\",\n        \"marbodon\": \"MARBODON\",\n        \"march\": \"MARCH\",\n        \"marchen honpo\": \"メルヘン本舗\",\n        \"margarita\": \"Margarita\",\n        \"marge-loop\": \"Marge-Loop\",\n        \"maria system00\": \"Maria_System00\",\n        \"marialite\": \"Marialite\",\n        \"mariana kaikou kikaku\": \"まりあな海溝企画\",\n        \"marigold\": \"marigold\",\n        \"marin\": \"まりん\",\n        \"marinconia\": \"MARINCONIA\",\n        \"marine\": \"マリン\",\n        \"marinwhip\": \"まりんホイップ\",\n        \"mario almanac\": \"MARIO ALMANAC\",\n        \"marisaya\": \"まりさ屋\",\n        \"marley and scrooge shoukai\": \"マーリィ&スクルージ商会\",\n        \"marmalade\": \"ま～まれぇど\",\n        \"maromayu\": \"まろまゆ\",\n        \"maromi club\": \"まろみくらぶ\",\n        \"maron head\": \"マロンヘッド\",\n        \"maroron ex\": \"マロロンEX\",\n        \"maroyaka kominka\": \"まろやか古民家\",\n        \"marry bell\": \"マリーベル\",\n        \"marshmallow kyoudan\": \"マシュマロ響団\",\n        \"marshmallow soft\": \"ましゅまろそふと\",\n        \"marshmallow x whip\": \"ましゅまろ×ほいっぷ\",\n        \"maru tendon\": \"まる天丼\",\n        \"maruarai\": \"まるあらい\",\n        \"marubatsu bunko\": \"○×文庫\",\n        \"maruchuu seisaku\": \"まるちゅう製作\",\n        \"marugoshi-do\": \"丸腰堂\",\n        \"maruguya.exe\": \"まるぐ屋.exe\",\n        \"maruhamaya\": \"マルハマヤ\",\n        \"marui don\": \"丸居丼\",\n        \"maruiro kikou\": \"丸色季候\",\n        \"marukaya\": \"まるか家\",\n        \"marumagic\": \"まるまgic\",\n        \"marumaru arumajiro\": \"まるまるアルマジロー\",\n        \"marume works\": \"マルメワークス\",\n        \"maruno keikaku\": \"まるの計画\",\n        \"marunomare\": \"まる のま れ\",\n        \"marusan\": \"まるサン\",\n        \"maruta production\": \"MARUTA Production\",\n        \"maruta-dojo\": \"丸田道場\",\n        \"marutori corp\": \"まる鳥Corp\",\n        \"marutori no chazuke\": \"丸鳥の茶漬け\",\n        \"marvelous zents\": \"Marvelous Zents\",\n        \"mary no yamai\": \"メリィの病\",\n        \"mashimin koubou\": \"ましみん工房\",\n        \"mashiro no hihoukan\": \"真城の秘宝館\",\n        \"mashomaro\": \"マショ麻呂\",\n        \"masmenos\": \"マスメノス\",\n        \"massala\": \"まっさら\",\n        \"massaratou\": \"まっさら島\",\n        \"master volume\": \"Master Volume\",\n        \"master-random\": \"Master-random\",\n        \"masulao maximum\": \"MASULAO MAXIMUM\",\n        \"masuraion.\": \"ますらいおん。\",\n        \"masurao\": \"MASURAO\",\n        \"mat\": \"MAT\",\n        \"matagitei\": \"マタギ亭\",\n        \"matango honten\": \"マタンゴ本店\",\n        \"matatabi sanjou\": \"またたび参上\",\n        \"maten\": \"魔天\",\n        \"material\": \"Material\",\n        \"matilda kanmidokoro\": \"まちるだ甘味処\",\n        \"matine\": \"matine\",\n        \"matsuda shin\": \"松田シン\",\n        \"matsuge antenna\": \"マツゲアンテナ\",\n        \"matsumoto drill kenkyuujo\": \"松本ドリル研究所\",\n        \"matsumoto kichidi\": \"松本きちぢ\",\n        \"matsumotoke\": \"松本家\",\n        \"matsunoan\": \"マツノアン\",\n        \"matsuri kikaku\": \"祭企画\",\n        \"matsurika\": \"茉莉花\",\n        \"matsutakehime\": \"松茸姫\",\n        \"matsuyama seiji\": \"松山せいじ\",\n        \"mattari house\": \"まったりハウス\",\n        \"mattsuaya\": \"まっつあ屋\",\n        \"matyaya\": \"真茶屋\",\n        \"maumau shoujotai\": \"まうまう少女帯\",\n        \"max and cool\": \"MAX&Cool.\",\n        \"maxal\": \"マクサル\",\n        \"maxi\": \"MAXI\",\n        \"maxi age\": \"MAXI AGE\",\n        \"maxi queen\": \"Maxi Queen\",\n        \"maximum wind\": \"MAXIMUM WIND\",\n        \"maxiy\": \"MAXIY\",\n        \"maxzheart\": \"マックズハート\",\n        \"may\": \"May\",\n        \"may no tenshi\": \"メイの天使\",\n        \"maya-tei\": \"まや邸\",\n        \"mayakasiya\": \"まやかしや\",\n        \"mayo bukuro\": \"マヨぶくろ\",\n        \"mayoineko\": \"迷い猫\",\n        \"mayonaka no acchigawa\": \"真夜中のあっち側\",\n        \"mayonaka no funkotsudou\": \"真夜中のふんこつどう\",\n        \"mayonaka tsubame\": \"真夜中ツバメ\",\n        \"mayonnaise bakufu\": \"マヨネーズ幕府\",\n        \"mayorice suishou iinkai\": \"マヨライス推奨委員会\",\n        \"mayu to mato\": \"まゆとまと\",\n        \"mayugesaien\": \"眉毛菜園\",\n        \"mayugeya\": \"眉毛屋\",\n        \"mazarashi\": \"まざらし\",\n        \"maze\": \"まぜ | 迷-めいず-(メイズ)\",\n        \"maze rerijio\": \"迷図 レリジオ\",\n        \"mazemono\": \"まぜもの\",\n        \"mbs truth\": \"メイビーソフトトゥルース\",\n        \"mc hanbaiten\": \"エムシー販売店\",\n        \"mcnail koubou\": \"まくねいる工房\",\n        \"mdo\": \"MDO\",\n        \"mean machine\": \"MEAN MACHINE\",\n        \"mebi-ken\": \"女美研\",\n        \"mach maze\": \"メックメイズ\",\n        \"mechanical code\": \"メカニカルコード\",\n        \"mechanical pencil\": \"メカニカルペンシル\",\n        \"mecharis\": \"mecharis\",\n        \"medama keikoku\": \"めだま渓谷\",\n        \"medetasi\": \"めでたし\",\n        \"media zomex\": \"メディアZOMEX\",\n        \"medical berry\": \"Medical Berry\",\n        \"medical company\": \"めでぃかるカンパニー\",\n        \"medium bodied\": \"Medium bodied\",\n        \"medium passion\": \"medium passion\",\n        \"mega heart ski\": \"Mega Heart Ski\",\n        \"mega w\": \"mega w\",\n        \"mega-mix\": \"MEGA-MIX\",\n        \"megabox\": \"メガボックス\",\n        \"megacycle13\": \"Megacycle13\",\n        \"megafeps\": \"MEGAFEPS\",\n        \"megalith production\": \"MEGALITH PRODUCTION\",\n        \"megalodon\": \"megalo丼\",\n        \"megami\": \"メガミ\",\n        \"megami kyouten\": \"女神教典\",\n        \"megami no tamago\": \"メガミノタマゴ\",\n        \"megamouthsystem\": \"MEGAMOUTHsystem\",\n        \"megane beam\": \"めがねビーム\",\n        \"megane gaikotsu\": \"メガネガイコツ\",\n        \"megane81\": \"MEGANE81\",\n        \"megasoundorchestra\": \"MegaSoundOrchestra\",\n        \"megative gate\": \"メガてぃぶGATE\",\n        \"megaton express\": \"メガトン・エクスプレス\",\n        \"megrim\": \"Megrim\",\n        \"meguro teikoku\": \"目黒帝国\",\n        \"megurumi\": \"めぐるみ\",\n        \"mei\": \"明\",\n        \"meikyoushisui\": \"明鏡止水\",\n        \"meiousei presents\": \"冥王星Presents\",\n        \"meirei denpa\": \"命令電波\",\n        \"meisaku network\": \"名作ネットワーク\",\n        \"meishou misettei\": \"名称未設定\",\n        \"meisou junkie\": \"迷走ジャンキー\",\n        \"meiteitei.\": \"MEiTEiTEi.\",\n        \"mekabu fighter\": \"メカブファイター\",\n        \"mekabutei\": \"めかぶ亭\",\n        \"mekakushi musume\": \"目隠し娘\",\n        \"mekao\": \"Mekao\",\n        \"mekimeki oukoku\": \"めきめき王国\",\n        \"mekongdelta\": \"MEKONGDELTA\",\n        \"mekujira\": \"めくじら\",\n        \"mekurume yuuen\": \"目眩悠遠\",\n        \"mellow\": \"mellow\",\n        \"melody\": \"Melody\",\n        \"melomo\": \"メロモ\",\n        \"melon\": \"Melon\",\n        \"melon no hoshiboshi\": \"めろんの星々\",\n        \"melon pants\": \"めろんぱんつ\",\n        \"meloncholic\": \"meloncholic\",\n        \"melt downers\": \"MELT DOWNERS\",\n        \"melt-down\": \"MELT-DOWN\",\n        \"melty koubou\": \"メルティ工房\",\n        \"mememery\": \"mememery\",\n        \"memexile\": \"めめXILE\",\n        \"memeya\": \"メメ屋\",\n        \"memme douza\": \"メッメ堂座\",\n        \"memoria\": \"Memoria\",\n        \"mengerekun\": \"めんげれくん\",\n        \"menino\": \"Menino\",\n        \"mens equal k\": \"MEN'S=K\",\n        \"mentaiko\": \"MENたいこ\",\n        \"mental sex\": \"mental sex\",\n        \"mental specialist\": \"めんたるスペシャリスト\",\n        \"mentei dokoro\": \"めんてい処\",\n        \"menya okamoto\": \"麺屋オカモト\",\n        \"meow\": \"MEOW\",\n        \"meowdic core\": \"Meowdic Core\",\n        \"mephisto\": \"メフィスト\",\n        \"merapuremi\": \"めらぷれみ\",\n        \"mercator zuhou\": \"メルカトル図法\",\n        \"merci\": \"メルシー\",\n        \"mercurochrome\": \"ま～きゅろ\",\n        \"meringue\": \"めれんげ\",\n        \"merino\": \"めりの\",\n        \"merkmal\": \"めるくまーる\",\n        \"meromero melon\": \"xoxoメロン\",\n        \"meromerofactory xl\": \"メロメロファクトリーXL\",\n        \"meronpanchu\": \"めろんぱんちゅ\",\n        \"meroro\": \"meroro\",\n        \"merukoro\": \"メルコロ\",\n        \"merveille\": \"merveille\",\n        \"meryx3\": \"MERYx3\",\n        \"meshita\": \"目下\",\n        \"meshiya\": \"飯屋\",\n        \"mess zylinder\": \"メスしりんだ～\",\n        \"messiah and pikaring\": \"messiah&pikaring\",\n        \"messiah syndrome\": \"MessiahSyndrome\",\n        \"shiawase hotel\": \"しあわせホテル\",\n        \"mesuchanghonpo\": \"メスチャンホンポ\",\n        \"mesuman teikoku\": \"メスマン帝国\",\n        \"metabocafe offensive smell uproar\": \"メタボ喫茶異臭騒ぎ\",\n        \"metal drill pure chinpo land\": \"メタルドリルピュアちんぽランド\",\n        \"metal kids meeting\": \"METAL KIDS MEETING\",\n        \"metal-egg\": \"METAL-EGG\",\n        \"metal-wind\": \"METAL-WIND\",\n        \"metallic steel\": \"メタリックスチール\",\n        \"metalltanz\": \"メタルタンツ\",\n        \"metalrack\": \"めたるらっく\",\n        \"metamor\": \"めたもる\",\n        \"metamorphose\": \"めたもるふぉーぜ\",\n        \"meteor\": \"メテオ\",\n        \"meteor garden\": \"メテオガーデン\",\n        \"meteor labyrinth\": \"メテオ☆ラビリンス\",\n        \"metro notes\": \"めとろのーつ\",\n        \"metroier\": \"メトロイヤー\",\n        \"mexe.jp\": \"mexe.jp\",\n        \"mezase esisama\": \"目指せ絵師様\",\n        \"mf future\": \"MF Future\",\n        \"mg.\": \"mg.\",\n        \"mgt\": \"MGT\",\n        \"mgw\": \"MGW\",\n        \"mi\": \"mi\",\n        \"miburi\": \"美武里\",\n        \"mica\": \"MICA\",\n        \"michinakaba\": \"三血中吐\",\n        \"michinoku hitori tabi\": \"みちのく一人旅\",\n        \"micro page\": \"みくろぺえじ\",\n        \"microbeurre\": \"Microbeurre\",\n        \"microbit\": \"Microbit\",\n        \"microdat\": \"マイクロ脱兎\",\n        \"micromacro\": \"MICROMACRO\",\n        \"middle earth\": \"みどるあ～す\",\n        \"midnight muumus\": \"ミッドナイトむぅむズ\",\n        \"midnight pleasure\": \"ミッドナイトプレジャー\",\n        \"midori no niwatori\": \"緑の鶏\",\n        \"midoriiro cut in\": \"緑色カットIN\",\n        \"midoriya\": \"みどりや\",\n        \"mig\": \"mig\",\n        \"migimagari-ya\": \"右曲がり屋\",\n        \"migome\": \"ミゴメ\",\n        \"migumigu-sou\": \"ミグミグ荘\",\n        \"mijirushi box\": \"みじるしBOX\",\n        \"mika-chan center\": \"ミカちゃんセンター\",\n        \"mikaguuland\": \"みかぐーらんど\",\n        \"mikaka\": \"みかか\",\n        \"mikan douwa\": \"未完童話\",\n        \"mikan to uri\": \"蜜柑と瓜\",\n        \"mikan-ya\": \"みかん屋\",\n        \"mikanbako\": \"みかん箱\",\n        \"mikanberry\": \"ミカンベリー\",\n        \"mikandensya\": \"蜜柑電車\",\n        \"mikapikazo\": \"MikaPikazo\",\n        \"mikayla\": \"ミカイラ\",\n        \"mikazuki ondo\": \"三日月音頭\",\n        \"mike ni mage\": \"三毛にマゲ\",\n        \"mikeneko disco\": \"三毛猫ディスコ\",\n        \"mikeneko-children\": \"三毛猫チルドレン\",\n        \"mikenekodou\": \"三毛猫堂\",\n        \"mikenekotei\": \"みけ猫亭\",\n        \"mikkamisaki\": \"みっかみさき\",\n        \"mikorabi\": \"みこらび\",\n        \"mikouken 2nd\": \"味巧軒2nd\",\n        \"milcrepe\": \"みるくれーぷ\",\n        \"milf shobou\": \"ミルフ書房\",\n        \"milk angel\": \"みるくえんじぇる\",\n        \"milk boy\": \"みるくぼーい\",\n        \"milk cha\": \"みるく茶\",\n        \"milk chips\": \"ミルクチップス\",\n        \"milk cocoa shake\": \"ミルクココアセーキ\",\n        \"milk crown\": \"ミルククラウン\",\n        \"milk drop\": \"みるくどろっぷ\",\n        \"milk ejaculation\": \"みるくいじゃきゅれーしょん\",\n        \"milk gohan\": \"みるくごはん\",\n        \"milk hall\": \"milk hall\",\n        \"milk land\": \"MILK LAND\",\n        \"milk pai\": \"みるくぱい\",\n        \"milk price\": \"MILK☆PRICE\",\n        \"milk ring\": \"milk ring\",\n        \"milk rotary\": \"みるくロータリー\",\n        \"milk server\": \"みるくさーばー\",\n        \"milk standard\": \"MILK STANDARD\",\n        \"milk tea house\": \"牛乳茶屋\",\n        \"milk-size\": \"みるく-SIZE\",\n        \"milkholic\": \"milkholic\",\n        \"milkpop\": \"MILKPOP\",\n        \"milkshake work\": \"奶昔工坊\",\n        \"milktub\": \"milktub\",\n        \"milky high tension\": \"ミルキーハイテンション♂\",\n        \"milky paint\": \"Milky Paint\",\n        \"milky pearl\": \"みるきぃぱぁる\",\n        \"milky souffle\": \"みるきーすふれ\",\n        \"milky strike\": \"milky strike\",\n        \"milky way\": \"みるきーうぇい\",\n        \"mill-mill\": \"Mill-Mill\",\n        \"mille-feuille\": \"ミルフィーユ\",\n        \"million bank\": \"みりおんばんく\",\n        \"million beast from diana\": \"Million beast from DIANA\",\n        \"million drops\": \"MILLION☆DROPS\",\n        \"millionlove\": \"みりおんらぶ\",\n        \"millions hope\": \"Millions Hope\",\n        \"milts chaya\": \"みるつ茶屋\",\n        \"mimasaka direct\": \"ミマサカダイレクト\",\n        \"mime channel\": \"MImeチャンネル\",\n        \"mimesis\": \"ミメーシス\",\n        \"mimicry.z\": \"みみくりどっとぜっと\",\n        \"mimippu\": \"みみっぷ\",\n        \"mimishiki\": \"耳式\",\n        \"mimitto\": \"ミミット\",\n        \"mimiya\": \"耳屋\",\n        \"mimizu thousand\": \"ミミズサウザンド\",\n        \"mimo hutamo\": \"身も蓋も\",\n        \"mimori.\": \"ミモリ。\",\n        \"mimoritei\": \"水護亭\",\n        \"mimoton\": \"みもとん\",\n        \"mimura namae\": \"三村生恵\",\n        \"minadukitei\": \"水無月亭\",\n        \"minami alps\": \"ミナミアルプス\",\n        \"minamikanazawa 5th studio\": \"南金沢第五スタジオ\",\n        \"minamono\": \"みなmono\",\n        \"minamoon\": \"みなむーん\",\n        \"minarai honpo\": \"みならい本舗\",\n        \"minarindo\": \"みなりん堂\",\n        \"minarui\": \"みなるい\",\n        \"minasokomori\": \"水底森\",\n        \"minato carnival\": \"みなとカーニバル\",\n        \"minato future\": \"minato future\",\n        \"mind and mind\": \"Mind and Mind\",\n        \"mindstone\": \"マインドストーン\",\n        \"mine noujou\": \"ミネ農場\",\n        \"mine slash mine\": \"mine/mine\",\n        \"mineya\": \"峰屋\",\n        \"mini\": \"mini\",\n        \"minies club\": \"MINIES CLUB\",\n        \"minimum lab\": \"みにまむラボ\",\n        \"mink\": \"ミンク\",\n        \"mink ego\": \"Mink EGO\",\n        \"minna shindoi\": \"みんなしんどい\",\n        \"mino kureha\": \"美濃紅葉\",\n        \"minobu gentle\": \"身延ジェントル\",\n        \"minobuya\": \"みのぶ屋\",\n        \"minomushitei\": \"みのむし亭\",\n        \"minori\": \"minori\",\n        \"minori kenkyuujo\": \"みのり研究所\",\n        \"minors escort\": \"マイナーズエスコート\",\n        \"minpee\": \"みんペー\",\n        \"minshuku inarimushi\": \"民宿いなりむし\",\n        \"mint blue\": \"MINT BLUE\",\n        \"mint chocolate\": \"ミントチョコレート\",\n        \"mintcube\": \"MintCUBE\",\n        \"mintjulep\": \"mintjulep\",\n        \"minus unlimited\": \"-unlimited\",\n        \"minusartworks\": \"MinusArtWorks\",\n        \"minwa\": \"ミンワ\",\n        \"miogui\": \"澪杙\",\n        \"miracle candy\": \"ミラクルキャンディ\",\n        \"miracle ponchi matsuri\": \"ミラクルポンチ祭り\",\n        \"mirage\": \"鏡樹\",\n        \"mirage cat\": \"MIRAGE CAT\",\n        \"mirage-soft\": \"みらーじゅそふと\",\n        \"mirai\": \"mirai\",\n        \"mirapare\": \"みらぱれ\",\n        \"mirin\": \"みりん\",\n        \"mirukomi\": \"みるこみ\",\n        \"mirukuseiki\": \"みるく世紀\",\n        \"misaki ai\": \"美咲愛\",\n        \"misakix megamix\": \"MISAKIX MEGAMIX\",\n        \"misokko chuutai\": \"みそっ子中隊\",\n        \"misonodenpatou\": \"みそのデンパ塔\",\n        \"misopanya\": \"みそパン屋\",\n        \"misoya\": \"味噌屋\",\n        \"miss black offline\": \"MISS BLACK OFFLINE\",\n        \"missa\": \"missa\",\n        \"missing park\": \"MISSING PARK\",\n        \"misssail\": \"MISS/SAIL\",\n        \"mist night\": \"Mist Night\",\n        \"misty\": \"ミスティ\",\n        \"misty isle\": \"Misty Isle\",\n        \"misty wind\": \"Misty Wind\",\n        \"mita kazuo daihyakka\": \"三田和夫大百科\",\n        \"mitarashi club\": \"みたらし倶楽部\",\n        \"mitarou teishoku\": \"ミタロウ定食\",\n        \"mitegura\": \"MITEGURA\",\n        \"mithril\": \"ミスリル\",\n        \"miti\": \"ミィティ\",\n        \"mitikage\": \"みちかげ\",\n        \"mitsu\": \"蜜\",\n        \"mitsu-iro syrup\": \"蜜色シロップ\",\n        \"mitsuami mobius\": \"蜜あみメビウス\",\n        \"mitsuami romance\": \"三つ編みロマンス\",\n        \"mitsuiri house\": \"みついり♡ハウス\",\n        \"mitsuki no mori\": \"林樹の森～ミツキノモリ～\",\n        \"mitsumata suihanki\": \"三又炊飯器\",\n        \"mitsunoya\": \"みつのや\",\n        \"mitsuya yoguru\": \"ミツヤヨーグル\",\n        \"miumiu\": \"MiUMiU\",\n        \"miura jota\": \"三浦いお太\",\n        \"mitsuwa building\": \"三輪ビルヂング\",\n        \"miwaku-iro missile\": \"魅惑色ミサイル\",\n        \"mix station\": \"ミックス ステーション\",\n        \"mix-ism\": \"MIX-ISM\",\n        \"mixed breed\": \"mixed breed\",\n        \"mixwill soft\": \"Mixwill Soft\",\n        \"miyabi tsuzuru bu\": \"みやびつづる部\",\n        \"miyama enseki\": \"深山燕石\",\n        \"miyanchi\": \"みやんち\",\n        \"miyubi\": \"ミユビ\",\n        \"miyumiyu project\": \"みゆみゆProject\",\n        \"mizu\": \"水\",\n        \"mizuiro usagi\": \"Mizuiro うさぎ\",\n        \"mizuiro zenmai\": \"みずいろぜんまい\",\n        \"mizujouyu jouryuusho\": \"水醤油蒸留所\",\n        \"mizuki-chan club\": \"みずきちゃんくらぶ\",\n        \"mizukidou\": \"観月堂\",\n        \"mizumo club\": \"みずも倶楽部\",\n        \"mizutama neko\": \"水玉ねこ\",\n        \"mizutofu\": \"水豆腐\",\n        \"mizuwari neko\": \"水割り猫\",\n        \"mjgg\": \"もりじおぎゅうぎゅう\",\n        \"mjkitty\": \"mjkitty\",\n        \"mjks\": \"mjks\",\n        \"mk ultra\": \"MKウルトラ\",\n        \"mlkx\": \"MLKx\",\n        \"mm kan\": \"MM館\",\n        \"mmt\": \"MMT!!\",\n        \"mmu2000\": \"MMU2000\",\n        \"mnh\": \"MNH\",\n        \"moai lion\": \"モアイライオン\",\n        \"mob.1\": \"MOB.1\",\n        \"mobco.\": \"mobco.\",\n        \"mobris\": \"MOBRIS\",\n        \"mocchimochiya\": \"もっちもち屋\",\n        \"mocchomudake\": \"モッチョム茸\",\n        \"mochi dog laboratory\": \"餅犬製作所\",\n        \"mochi hasamiuchi da\": \"餅はさみ撃ちだっ!\",\n        \"mochi kiss junkie\": \"もちxoジャンキー\",\n        \"mochi mochi\": \"もちもち\",\n        \"mochi mochi mikan\": \"もちもちみかん\",\n        \"mochi-ya\": \"餅屋\",\n        \"mochimochi carnevale\": \"もちもちCarnevale\",\n        \"mochimochi dou\": \"もちもち堂\",\n        \"mochimochitaiyo\": \"もちもちたいよう\",\n        \"mochinige\": \"持ち逃げ\",\n        \"mochinonnon.\": \"もちのんのん。\",\n        \"mocking soft\": \"木琴Soft\",\n        \"moco chouchou\": \"Moco Chouchou\",\n        \"moco note\": \"もこのーと\",\n        \"mocreation\": \"mocreation\",\n        \"modae shine\": \"悶え死ね!!!\",\n        \"moe\": \"MoE\",\n        \"moe dukuri oukoku\": \"萌えづくり王国\",\n        \"moegekidon\": \"萌撃丼\",\n        \"moehina kagaku\": \"萌雛化学\",\n        \"moekorodo\": \"萌殺堂\",\n        \"moenai gomi bukuro\": \"萌えないゴミ袋\",\n        \"moenomiya\": \"萌宮\",\n        \"moeru gomi\": \"燃えるゴミ\",\n        \"moewrest\": \"もえれす\",\n        \"moffle\": \"moffle\",\n        \"mofu shippo lab\": \"もふしっぽらぼ\",\n        \"mofumanjuu\": \"もふまんじゅう\",\n        \"mofumofuen\": \"もふもふ苑\",\n        \"mofurafu\": \"mofurafu\",\n        \"mofuya\": \"モフ屋\",\n        \"mogemogeya\": \"モゲモゲ屋\",\n        \"mogetama\": \"もげたま\",\n        \"mogiki-chan chi\": \"もぎきちゃんち\",\n        \"mogullaz\": \"Mogullaz\",\n        \"mogumogu soft\": \"もぐもぐソフト\",\n        \"mogura company\": \"MOGURA COMPANY\",\n        \"mogura tengu\": \"もぐら天狗\",\n        \"moirai\": \"moirai\",\n        \"mojiya\": \"MOじ屋\",\n        \"mokkori musume.\": \"もっこり娘。\",\n        \"mokugyuutan\": \"もくぎゅうたん。\",\n        \"mokumoku\": \"もくもく\",\n        \"mokusa\": \"Mokusa\",\n        \"mokusei-gaeri\": \"木星帰り\",\n        \"mokuzou zabuton\": \"モクゾウザブトン\",\n        \"molamola.software\": \"Molamola.software\",\n        \"molfo\": \"molfo\",\n        \"molossan\": \"喪loss庵\",\n        \"molotov cocktail\": \"モロトフカクテル\",\n        \"molten club\": \"モルテンクラブ\",\n        \"moment silicon\": \"木綿シリコン\",\n        \"momi momi studio\": \"もみもみスタジオ\",\n        \"momiage rapunzel\": \"もみあげラプンツェル\",\n        \"momiji coffee\": \"もみじ珈琲\",\n        \"momiji mofumofutei\": \"椛もふもふ亭\",\n        \"momiji oroshi\": \"もみじおろし\",\n        \"mominoki\": \"もみの木\",\n        \"momizi koubou\": \"もみじ工房\",\n        \"momo\": \"Momo\",\n        \"momo mania\": \"桃マニア\",\n        \"momo no kanzume\": \"桃のカンヅメ\",\n        \"momo no omochi\": \"もものおもち\",\n        \"momo-meron\": \"桃メロン\",\n        \"momo.\": \"momo。\",\n        \"momoameya\": \"桃飴屋\",\n        \"momochi\": \"MOMOCHI\",\n        \"momochoko\": \"ももチョコ\",\n        \"momodaya\": \"百田屋\",\n        \"momohina\": \"桃雛\",\n        \"momoiro cait sith\": \"ももいろけっとしー\",\n        \"momoiro diva\": \"桃色DIVA\",\n        \"momoiro scissors\": \"桜色シザーズ\",\n        \"momoiro settoudan\": \"桃色窃盗団\",\n        \"momoiro sugoroku\": \"桃色双六\",\n        \"momoiro toiki\": \"桃色吐息\",\n        \"momoiro-gekijyou\": \"桃色劇場\",\n        \"momoiro-netsuduki\": \"桃色熱月\",\n        \"momoiro-rip\": \"ももいろリップ\",\n        \"momoirohoppe\": \"ももいろほっぺ\",\n        \"momoirosyounenki\": \"桃色少年期\",\n        \"momokan\": \"ももかん\",\n        \"momokawa\": \"モモカワ\",\n        \"momokuri\": \"もも栗\",\n        \"momomoya\": \"もももや\",\n        \"momonashi potato\": \"桃梨ぽてと\",\n        \"momoneko doumei\": \"ももねこ同盟\",\n        \"momonga club\": \"モモンガ倶楽部\",\n        \"momosakiiro\": \"桃咲色\",\n        \"momoshiba anzu\": \"ももしば杏子\",\n        \"momoziri hustle dou\": \"桃尻ハッスル堂\",\n        \"mon amour.\": \"もなむーる。\",\n        \"mon-petit\": \"mon-petit\",\n        \"monado\": \"MONADO\",\n        \"monako\": \"MONAKO\",\n        \"mondo\": \"モンド\",\n        \"mongoose studio\": \"高浜屋\",\n        \"moni teishoku\": \"もに定食\",\n        \"monica\": \"monica\",\n        \"monji koubou\": \"もんじ肛房\",\n        \"monke\": \"もんけ\",\n        \"monkey adventure\": \"モンキー・アドベンチャー\",\n        \"monkey pinx.\": \"MonkeyPinx.\",\n        \"monkey reppuutai\": \"モンキー烈風隊\",\n        \"monkeys factory\": \"モンキーズFACTORY\",\n        \"monmo bokujou\": \"モンモー牧場\",\n        \"mono letter\": \"モノ手紙\",\n        \"mono x chro\": \"モノ×クロ\",\n        \"monochrome\": \"モノクローム\",\n        \"monochrome circuit\": \"ものくろサーキット\",\n        \"monochrose\": \"monochrose\",\n        \"monoeye\": \"Monoeye\",\n        \"monokichi youhoujou\": \"ものきち養蜂場\",\n        \"monokulolli\": \"ものくろり\",\n        \"monokuromomiji\": \"モノクロモミジ\",\n        \"monokurored\": \"モノクロRed\",\n        \"monolove\": \"MONOLOVE\",\n        \"mononoke hobaku butai\": \"もののけ捕縛部隊\",\n        \"monorabbi\": \"ものらび\",\n        \"monpe kagekiha\": \"モンペ過激派\",\n        \"monshiro\": \"モンシロ\",\n        \"monster box\": \"もんすたーぼっくす\",\n        \"monster tribe\": \"MONSTER TRIBE\",\n        \"monstera\": \"モンステラ\",\n        \"monsters biscuit\": \"モンスターズビスケット\",\n        \"monte carlo-ya\": \"もんてかるろ屋\",\n        \"monteriakitto\": \"もんてりあきっと\",\n        \"monukenokara\": \"もぬけのから\",\n        \"moon knight sparkle\": \"MOON KNIGHT SPARKLE\",\n        \"moon the angry\": \"Moon the angry!\",\n        \"moon wort\": \"Moon Wort\",\n        \"moongarden\": \"MoonGarden\",\n        \"moonknives\": \"moonknives\",\n        \"moonlight diner\": \"ムーンライト・ダイナー\",\n        \"moonrevenge\": \"MoonRevenge\",\n        \"moorusu\": \"モール巣\",\n        \"mopuo oyakata\": \"もぷお親方\",\n        \"mor\": \"MOR\",\n        \"moladolog\": \"モラードログ\",\n        \"morgue\": \"morgue\",\n        \"mori no kumasan yuugekitai\": \"森のくまさん遊撃隊\",\n        \"mori no mushi\": \"森の蟲\",\n        \"mori no seirei tittilty\": \"森の精霊ティッティルティ\",\n        \"morihama no shindansho\": \"モリハマの診断書\",\n        \"moriisan-tokono\": \"森井さんとこの\",\n        \"moriman shoten\": \"森まん商店\",\n        \"morimori runrun\": \"もりもりルンルン\",\n        \"morino koubou\": \"森野工房\",\n        \"morinomiya koushinkyoku\": \"森ノ宮行進曲\",\n        \"morishigeru laboratory\": \"もりしげる研究所\",\n        \"morisoba iccho\": \"盛りそば一丁\",\n        \"morittokoke\": \"もりっとこけ\",\n        \"moriya\": \"杜屋\",\n        \"moriya630\": \"moriya630\",\n        \"morizo\": \"盛増\",\n        \"morning\": \"もーにんぐ\",\n        \"morohane.\": \"もろはね。\",\n        \"morozumix\": \"morozumix\",\n        \"morrow\": \"morrow\",\n        \"moruda ramenya\": \"もる田ラーメン屋\",\n        \"morugastudio\": \"MORUGAstudio\",\n        \"morutaya\": \"もるた屋\",\n        \"mosome\": \"モソーム\",\n        \"motachi\": \"もたち\",\n        \"motchie kingdom\": \"もっちー王国\",\n        \"mothman\": \"もすまん\",\n        \"motley crew\": \"Motley crew\",\n        \"motsu ryouri\": \"もつ料理\",\n        \"mottekoi sangyou\": \"モッテコイ産業\",\n        \"mottocompany\": \"MottoCompany\",\n        \"motu club\": \"モツクラブ\",\n        \"mou nero\": \"もう寝ろ\",\n        \"mou sukoshi hidari e\": \"もう少し左へ\",\n        \"moudou\": \"もうどう\",\n        \"mouko mouretsu hasai dan\": \"蒙古猛烈破砕団\",\n        \"moumoku nezumi\": \"盲目ねずみ\",\n        \"moumoku no inu-tachi\": \"盲黙のいぬたち\",\n        \"moumoubox\": \"も〜も〜ぼっくす\",\n        \"mount position\": \"マウントポジション\",\n        \"mountain topper\": \"マウンテントッパー\",\n        \"mousou aria\": \"妄想アリア\",\n        \"mousou bussan\": \"妄想物産\",\n        \"mousou caution\": \"妄想Caution\",\n        \"mousou colosseum\": \"妄想コロッセオ\",\n        \"mousou endemic\": \"妄想エンデミック\",\n        \"mousou engine\": \"妄想エンジン\",\n        \"mousou fukuzagata\": \"妄想複座型\",\n        \"mousou katharsis\": \"妄想カタルシス\",\n        \"mousou kenkyuujo\": \"妄想研究所\",\n        \"mousou meteoroid\": \"妄想メテオロイド\",\n        \"mousou pasta\": \"妄想パスタ\",\n        \"mousou pushon\": \"妄想PushOn\",\n        \"mousou tokkyuu\": \"妄想特急\",\n        \"mousou wakusei\": \"妄想惑星\",\n        \"mousou web\": \"妄想ウェブ\",\n        \"mousou zukan\": \"もーそーずかん\",\n        \"mousoudokei\": \"妄想時計\",\n        \"moviendo\": \"Moviendo\",\n        \"moyasix\": \"moyasix\",\n        \"mozuchichi\": \"MOZUCHICHI\",\n        \"mozuya\": \"もず屋\",\n        \"mp0\": \"MP0\",\n        \"mr.outside\": \"Mr. Outside\",\n        \"mr.rabbit\": \"Mr.Rabbit\",\n        \"mro\": \"MRO\",\n        \"ms is\": \"M's I's\",\n        \"ms works.\": \"M's WORKS.\",\n        \"msize\": \"エムサイズ\",\n        \"mtk\": \"MTK\",\n        \"mu\": \"美遊\",\n        \"mu-cute\": \"μ-CuTe\",\n        \"mucha koubou\": \"無茶工房\",\n        \"mudai picture\": \"無題ピクチャ\",\n        \"mugcat\": \"Mugcat\",\n        \"mugen honpo\": \"むげん本舗\",\n        \"mugen kairou\": \"夢幻回廊\",\n        \"mugen kidousha\": \"夢幻機動舎\",\n        \"mugen lens\": \"無限レンズ\",\n        \"mugen mountain\": \"夢幻マウンテン\",\n        \"mugen mousou\": \"無限妄想\",\n        \"mugen no soul\": \"無限のソウル\",\n        \"mugendou cinema\": \"無限堂キネマ\",\n        \"mugenkan\": \"夢幻館頒布\",\n        \"mugenya honpo\": \"無限屋本舗\",\n        \"mugicha.\": \"むぎちゃ。\",\n        \"mugichoko store\": \"むぎちょこストア\",\n        \"mugiwara club\": \"麦わらクラブ\",\n        \"muhakiya\": \"ムハキヤ\",\n        \"muhouchitai\": \"無法地帯\",\n        \"muin coffee\": \"無印コーヒー\",\n        \"mujina\": \"狢\",\n        \"mujirushi shounen\": \"無印少年\",\n        \"mujirushi-dou\": \"無印堂\",\n        \"mukade tou\": \"ムカデ島\",\n        \"mukeikaku syugi\": \"無計画主義\",\n        \"muki pomera\": \"ムキぽめら\",\n        \"mukibutsu heart\": \"無機物はーと\",\n        \"mukuchi na hakoniwa\": \"無口な箱庭\",\n        \"mukuge\": \"毳\",\n        \"mukumukumoon\": \"むくむくむーん\",\n        \"mukuton kyouju to soratobu potato.\": \"むくトン教授と空飛ぶポテト。\",\n        \"mukyuu dynamic\": \"ムキューダイナミック\",\n        \"mulberry\": \"マルベリ\",\n        \"multi-type\": \"Multi-Type\",\n        \"multivitamin\": \"MULTIVITAMIN\",\n        \"mumeiya\": \"夢迷屋\",\n        \"mumumu jirushi\": \"むむむ印\",\n        \"mumunyan\": \"むむにゃん\",\n        \"mumyoudou\": \"夢妙堂\",\n        \"mumyoukutsu\": \"無明窟\",\n        \"munak\": \"ムナック\",\n        \"munmun dou\": \"ムンムン堂\",\n        \"munomeritei\": \"むのめり亭\",\n        \"mura no ikinokori\": \"村の生き残り\",\n        \"muramura pocky\": \"ムラムラPocky\",\n        \"murasaki nyanko bar\": \"むらさきにゃんこバー\",\n        \"murasaki switch\": \"ムラサキスイッチ\",\n        \"murasaki-dou honten\": \"紫紀堂本店\",\n        \"murasaki.\": \"紫。\",\n        \"murasakiiro no yoru\": \"むらさきいろのよる\",\n        \"murasakiiro orange\": \"むらさきいろオレンジ\",\n        \"murasame no yousai\": \"村雨の要塞\",\n        \"murderhouse\": \"MURDERHOUSE\",\n        \"muremure kaisendon\": \"むれむれ海鮮丼\",\n        \"murmur\": \"murmur\",\n        \"musansodou\": \"無酸素堂\",\n        \"musasabidou\": \"むささび堂\",\n        \"musashi-dou\": \"武蔵堂\",\n        \"muscadet\": \"ミュスカデ\",\n        \"muse\": \"MUSE\",\n        \"museifu kutsushita doumei\": \"無政府靴下同盟\",\n        \"mushaburu\": \"むしゃぶる\",\n        \"mushikui lettuce\": \"むしくいレタス\",\n        \"mushimusume aikoukai\": \"蟲娘愛好会\",\n        \"mushiringo\": \"むしりんご\",\n        \"mushiyaki\": \"むしやき!!\",\n        \"mushroom pig\": \"マッシュルームピッグ\",\n        \"mushroom shoutengai\": \"マッシュルーム商店街\",\n        \"musukichi\": \"むす吉\",\n        \"mutospectacle\": \"無糖スペクタクル\",\n        \"mutsukidou\": \"睦月堂\",\n        \"mutsuraboshi\": \"むつらぼし\",\n        \"mutsuya\": \"陸奥屋\",\n        \"muttumuu\": \"むっつむー\",\n        \"mx2\": \"M×2\",\n        \"my blue sky\": \"マイブルースカイ\",\n        \"my darling\": \"my_darling\",\n        \"my pace world\": \"my pace world\",\n        \"myao\": \"Myao\",\n        \"mycology.\": \"マイコロジィ。\",\n        \"mylab\": \"MYLAB\",\n        \"myon plus 1\": \"MYON+1\",\n        \"myonlyone\": \"MYONLYONE\",\n        \"myoukenya\": \"みょうけん屋\",\n        \"myriad purity\": \"Myriad Purity\",\n        \"mysp5cm\": \"まいすぺ5cm\",\n        \"mystery clock\": \"MYSTERY CLOCK\",\n        \"mystic chord\": \"ミスティック・コード\",\n        \"n\": \"ん！\",\n        \"n b g\": \"エヌベージー\",\n        \"n no tsukue\": \"Nの机\",\n        \"n shiki\": \"N式\",\n        \"n-bomb asylum\": \"核弾避難室\",\n        \"n-craft\": \"n-craft\",\n        \"n.a.u.s.\": \"N.A.U.S.\",\n        \"n.cs\": \"N.Cs\",\n        \"n.n.f.s\": \"N.N.F.S\",\n        \"n.r.d.works\": \"N.R.D.WORKS\",\n        \"n.s craft\": \"N.S Craft\",\n        \"n.s.project\": \"N.S.project\",\n        \"n2jirai\": \"N2地雷\",\n        \"n7747\": \"N7747\",\n        \"nabe no circle\": \"nabeのサークル\",\n        \"nabesekizaiten\": \"鍋石材店\",\n        \"nabeyaki udon\": \"鍋焼きうどん\",\n        \"nabeyama kaidou\": \"鍋山街道\",\n        \"nabeyashiki\": \"鍋屋敷\",\n        \"nac.\": \"Nac.\",\n        \"nac000\": \"nac000\",\n        \"nachtzug\": \"Nachtzug\",\n        \"nae petit\": \"nae petit\",\n        \"nagaremono\": \"流れもの\",\n        \"nagasaki-inter\": \"長崎インター\",\n        \"nagashi soumen\": \"ながしそうめん\",\n        \"naginata kikaku\": \"なぎなた企画\",\n        \"naginata-kan\": \"薙刀館\",\n        \"nagisa no haikara kingyo\": \"渚のハイカラ金魚\",\n        \"nagisawaya\": \"なぎさわ屋\",\n        \"nagomi no ame\": \"和ノ雨\",\n        \"nagumoya\": \"なぐも屋\",\n        \"naguu no shiro\": \"なぐうの城\",\n        \"nahabaru\": \"ナハバル\",\n        \"nahapuro\": \"なはぷろ\",\n        \"naitou kirara\": \"内藤キララ\",\n        \"naitou2\": \"NAITOU2\",\n        \"naivta\": \"ナイーブタ\",\n        \"naiyori alpha zaidan\": \"Naiyori alpha 財団\",\n        \"nakagawaya\": \"中川家\",\n        \"nakamuratakumi\": \"仲村巧\",\n        \"nakanoku kurochanno...\": \"中野区くろちゃんの…\",\n        \"nakasatogumi\": \"ナカサト組\",\n        \"nakasone battalion\": \"中曽根バタリアン\",\n        \"nakatashi family\": \"中田紫ファミリー\",\n        \"nakaun\": \"なかうん\",\n        \"nakayama shiki kenkou tosho\": \"中山式健康図書\",\n        \"nakayohi\": \"なかよひ\",\n        \"nakayoshi koyoshi\": \"なかよShiこよShi\",\n        \"nakayoshi obgyn\": \"なかよし産婦人科\",\n        \"nakigara\": \"無空\",\n        \"nakuru box\": \"ナクルボックス\",\n        \"nama mochi shichi banchi\": \"生餅七番地\",\n        \"nama shibori sour\": \"生搾りサワー\",\n        \"namaco\": \"NAMACO\",\n        \"namae kinyuuran\": \"名前記入欄\",\n        \"namaikichibi\": \"なまいきちび\",\n        \"namakemono kishidan\": \"なまけもの騎士団\",\n        \"namakoya\": \"なまこ屋\",\n        \"namakura dou\": \"なまくら堂\",\n        \"namakura na kura\": \"なまくらな鞍\",\n        \"namanama shandy gaff\": \"生ナマシャンディガフ\",\n        \"namanamago\": \"ナマナマゴ\",\n        \"namanecotei\": \"生猫亭\",\n        \"namaniku tappuri\": \"生肉たっぷり\",\n        \"namashoku de hara kowasu tami\": \"生食デ腹壊ス民\",\n        \"namasute koubou\": \"生棄工房\",\n        \"namayake.\": \"なまやけ。\",\n        \"namazu-no-ikesu\": \"鯰の生け簀\",\n        \"nambokuya\": \"南北屋\",\n        \"nameless\": \"ネームレス\",\n        \"namelesszero\": \"NamelessZero\",\n        \"nami-nami restaurant\": \"並々食堂\",\n        \"namiroji\": \"波路地\",\n        \"namitaitei\": \"並大抵\",\n        \"nanaban chamaru dou\": \"七番茶○堂\",\n        \"nanacan\": \"NANACAN\",\n        \"nanafundou\": \"七分堂\",\n        \"nanairo batake\": \"なないろ畑\",\n        \"nanairo koubou\": \"なないろ工房\",\n        \"nanairo momogumi\": \"なないろもも組\",\n        \"nanairo no magatama\": \"七色の勾玉\",\n        \"nanairo senpu-ji\": \"七色旋風児\",\n        \"nanairo shichihenge\": \"七色七変化\",\n        \"nanakamado\": \"七竈\",\n        \"nanakorobi yaoki\": \"七転八起\",\n        \"nanakumi\": \"ななくみ\",\n        \"nanamehan\": \"ななめ班\",\n        \"nanameno\": \"ななめの\",\n        \"nanamigumi\": \"七海組\",\n        \"nanamiya\": \"奈波屋\",\n        \"nanamoya\": \"ななも屋\",\n        \"nananana\": \"なななな\",\n        \"nanashi inflation\": \"ななしいんふれーしょん\",\n        \"nanashi shounen\": \"ナナシ少年\",\n        \"nanashiki\": \"七式\",\n        \"nanaten manten\": \"七点万点\",\n        \"nanatsu no kagiana\": \"七つの鍵穴\",\n        \"nanatsuboshi\": \"七つ星\",\n        \"nanatsugumi\": \"ななつ組\",\n        \"nanatsuhane\": \"ナナツハネ\",\n        \"nanaya\": \"奈々屋\",\n        \"nanayoduki\": \"七夜月\",\n        \"nanbu\": \"なんぶ\",\n        \"nandemodozo\": \"なんでもどうぞ\",\n        \"nandemoii\": \"なんでもいい\",\n        \"nanika\": \"なにか\",\n        \"nanika no heya\": \"何かの部屋\",\n        \"nanika-modoki\": \"なにかもどき\",\n        \"nanikaya\": \"なにか屋\",\n        \"naniwaya\": \"浪速屋\",\n        \"nankin honpo\": \"南京本舗\",\n        \"nankotsu age rice\": \"なんこつ揚げライス\",\n        \"nankyoku\": \"なんきょく\",\n        \"nano royal\": \"Nano Royal\",\n        \"nanokah\": \"なのかH\",\n        \"nansyu-koubow\": \"南洲好房\",\n        \"nantan e\": \"南端へ\",\n        \"nantoka narunaru.\": \"なんとかなるなる。\",\n        \"napier sabre\": \"Napier Sabre\",\n        \"napolinu\": \"napolinu\",\n        \"naranashitori\": \"ならなしとり\",\n        \"narashino kaitoudan\": \"習志野海盗団\",\n        \"narimasuya\": \"なります屋\",\n        \"narukotei\": \"鳴狐亭\",\n        \"naruto kenkyu sha\": \"なると研究社\",\n        \"nas-on-ch\": \"NAS-ON-CH\",\n        \"nasi-pasuya\": \"なしぱす屋\",\n        \"nasubi knight\": \"ナスビ騎士\",\n        \"nata de coco soda\": \"ナタデココ・ソーダ\",\n        \"natadekoko\": \"なたでここ\",\n        \"natakuga-yuku\": \"なたくが行く!\",\n        \"natorina dou\": \"なとりな堂\",\n        \"natsu no cheese koujou\": \"夏のチーズ工場\",\n        \"natsu no umi\": \"なつのうみ\",\n        \"natsugumo himawari\": \"夏雲ひまわり\",\n        \"natsuiro laika\": \"夏色ライカ\",\n        \"natsuiro otome\": \"なついろ乙女\",\n        \"natsuiro shoujo\": \"夏色少女\",\n        \"natsuiro terrace\": \"夏色テラス\",\n        \"natsukanmi\": \"なつかんみ\",\n        \"natsukon\": \"なつこん\",\n        \"natsumemo\": \"なつめも\",\n        \"natsumin no circle\": \"なつみんのさーくる\",\n        \"natsuyasumi\": \"夏休み\",\n        \"nattou mania\": \"納豆☆マニア\",\n        \"nattou no mori\": \"なっとうの杜\",\n        \"natukiya\": \"なつき屋\",\n        \"natumiruku\": \"なつみぃ〜るク♪\",\n        \"naturaldays\": \"NATURALDAYS\",\n        \"nature\": \"NaTuRe\",\n        \"nature.\": \"nature.\",\n        \"naughtygal style b\": \"NaughtyGal Style B\",\n        \"naunau\": \"なうなう\",\n        \"navi001\": \"Navi001\",\n        \"navy\": \"NAVY\",\n        \"navy blue\": \"Navy Blue\",\n        \"navy garden\": \"ネイビーガーデン\",\n        \"nawanoren\": \"縄のれん\",\n        \"nayuta\": \"ナユタ\",\n        \"nazo no akanekokan\": \"謎の赤猫団\",\n        \"nazonokai\": \"謎の会\",\n        \"nb teishoku\": \"NB定食\",\n        \"nb.\": \"nb.\",\n        \"ncdn\": \"ニチダン\",\n        \"ne.\": \"ね。\",\n        \"nebosukekin\": \"ねぼすけ菌\",\n        \"necomuffler\": \"ネコマフラー\",\n        \"necotoxin\": \"NECOTOXIN\",\n        \"necrolincer\": \"ネクロリンサー\",\n        \"nedaore\": \"ネダオレ\",\n        \"needle\": \"NEEDLE\",\n        \"needle garden\": \"NEEDLE GARDEN\",\n        \"neet corp\": \"ニート(株)\",\n        \"negapoji-bu\": \"ネガぽじーぶ\",\n        \"negibouzu\": \"ねぎ坊主\",\n        \"negimaers\": \"ねぎまーず\",\n        \"neginegio\": \"ネギネギ夫\",\n        \"negi to takenoko\": \"ねぎとたけのこ\",\n        \"negoro teppou tai\": \"根来鉄砲隊\",\n        \"negoto\": \"negoto\",\n        \"negoya\": \"寝語屋\",\n        \"neguradou\": \"塒堂\",\n        \"negurie\": \"ねぐりえ\",\n        \"neji hina no sekai\": \"ネジヒナの世界\",\n        \"neji roll\": \"ねじロール\",\n        \"nejikiri sister\": \"捻切シスター\",\n        \"nejimaki kougen\": \"ねじまきこうげん\",\n        \"nejiya no hito\": \"ねじやのひと\",\n        \"neko blizzard\": \"猫ブリザード\",\n        \"neko bus unsou\": \"ねこばす運送\",\n        \"neko daifuku\": \"ねこ大福\",\n        \"neko irazu\": \"猫イラズ\",\n        \"nekojarashy\": \"猫じゃらし\",\n        \"nekojarashi\": \"猫じゃらし\",\n        \"neko kan\": \"ねこ缶\",\n        \"neko kinryouku\": \"猫禁猟区\",\n        \"neko melonya\": \"猫メロン屋\",\n        \"neko neko house\": \"ねこねこハウス\",\n        \"neko no onsen\": \"猫の温泉\",\n        \"neko no sakegoto\": \"ねこのさけごと\",\n        \"neko no shoushuugen\": \"ねこの消臭元\",\n        \"neko no te koubou\": \"猫の手工房\",\n        \"neko no yurikago\": \"猫のゆりかご\",\n        \"neko pantsu\": \"ネコぱんつ\",\n        \"neko pockle\": \"ねこぽっくる\",\n        \"neko rop\": \"ねころっぷ\",\n        \"neko rush\": \"ねこらっしゅ\",\n        \"neko saffron\": \"ネコサフラン\",\n        \"neko shounen\": \"ねこ少年\",\n        \"neko studio\": \"ねこスタジオ\",\n        \"neko tantei dan\": \"ネコ☆探偵団\",\n        \"neko to hato\": \"ねことはと\",\n        \"neko yashiki\": \"ねこ屋敷\",\n        \"neko-rise\": \"Neko-rise\",\n        \"nekoarashi\": \"ねこあらし\",\n        \"nekoashi sanbi\": \"猫足讃美\",\n        \"nekomasshigura\": \"猫驀地\",\n        \"nekodaisuki\": \"猫大好き\",\n        \"nekodotto\": \"ネコドット\",\n        \"nekogoro\": \"ねこごろ\",\n        \"nekohachi eigyoubu\": \"猫八営業部\",\n        \"nekohige radio\": \"猫ひげラジオ\",\n        \"nekohigetei\": \"ねこひげ亭\",\n        \"nekoiro\": \"ネコイロ\",\n        \"nekokabe\": \"ネコカベ\",\n        \"nekokaburi\": \"ネコかブリ\",\n        \"nekokagerou\": \"猫蜻蛉\",\n        \"nekokota\": \"nekokotA\",\n        \"nekomajin\": \"ねこまじん\",\n        \"nekomakura soft\": \"ねこまくらsoft\",\n        \"nekomatakan\": \"猫又館\",\n        \"nekomeshiya\": \"ねこめし屋\",\n        \"nekomikan aruiwa nekomikan\": \"猫美館或いは猫蜜柑\",\n        \"nekomimi catharsis\": \"猫耳カタルシス\",\n        \"nekomiya\": \"猫見屋\",\n        \"nekonetoru\": \"ネコネトル\",\n        \"nekonin-so\": \"猫忍荘\",\n        \"nekono kaweruya\": \"ネコノカヱルヤ\",\n        \"nekonohoshi\": \"ネコノホシ\",\n        \"nekonote shobou\": \"ねこのてしょぼう\",\n        \"nekopunch bashibashi\": \"ねこぱんちバシバシ\",\n        \"nekoranbu\": \"猫乱舞\",\n        \"nekorinchi\": \"ねこりんち\",\n        \"nekoro ryuuseigun\": \"ねころ流星群\",\n        \"nekorobi\": \"ねころび\",\n        \"nekorondoru\": \"ネコロンドル\",\n        \"nekosenyou milk\": \"猫専用牛乳\",\n        \"nekoshaku\": \"猫尺\",\n        \"nekosupi\": \"ねこすぴ\",\n        \"nekottorando\": \"ネコットランド\",\n        \"nekousa pudding\": \"ねこうさプリン\",\n        \"nekoya\": \"ねこ屋\",\n        \"nekoya kaigetsudou\": \"猫屋懐月堂\",\n        \"nekoya-systemz\": \"猫屋システムズ\",\n        \"nekozame\": \"ネコザメ\",\n        \"nekozamedan\": \"ねこざめ団\",\n        \"nel\": \"ネル\",\n        \"nel-zel formula\": \"NEL-ZEL FORMULA\",\n        \"nemachizuki chaya\": \"寝待月茶屋\",\n        \"nemaki\": \"ねまき\",\n        \"nemokoroppu\": \"ネモコロップ\",\n        \"nemuke\": \"nemuke?\",\n        \"nemurineko\": \"ねむりねこ\",\n        \"nemutai neko\": \"眠たい猫\",\n        \"nengaranenjuu\": \"年がら年中\",\n        \"nenneko tanuki\": \"ねんねこたぬき\",\n        \"nenokuni\": \"ねのくに\",\n        \"neo frontier\": \"Neo Frontier\",\n        \"neo ultimate works\": \"ネオアルティメットワークス\",\n        \"neo wing\": \"Neo Wing\",\n        \"neo-de\": \"NEO-de\",\n        \"neondou\": \"ねおん堂\",\n        \"neoneet\": \"寝起新人\",\n        \"neonsign\": \"NeonSign\",\n        \"neoseporium\": \"NeoSeporium\",\n        \"neotenys\": \"ネオテニーズ\",\n        \"neotocite\": \"ネオトサイト\",\n        \"nephrite\": \"Nephrite\",\n        \"nerihibari\": \"ねりひばり\",\n        \"neron soft\": \"ネロンソフト\",\n        \"neta e okiba\": \"ネタ絵置き場\",\n        \"netorare masochist\": \"寝取られマゾヒスト\",\n        \"nettaigyo club\": \"熱帯魚倶楽部\",\n        \"neuromancer.\": \"Neuromancer.\",\n        \"neutral boy\": \"にゅーとらるぼぉい\",\n        \"new koubou\": \"NEW工房\",\n        \"new world\": \"NEW WORLD\",\n        \"new york spirits\": \"New York Spirits\",\n        \"new.\": \"NEW.\",\n        \"newberry transfer\": \"Newberry Transfer\",\n        \"newtype kenkyuujo\": \"にゅうたいぷ研究所\",\n        \"nexarius\": \"NEXARIUS\",\n        \"next\": \"N・E・X・T\",\n        \"nextage\": \"NEXTAGE\",\n        \"nexumi no sumika\": \"ねずみの住家\",\n        \"nexus koubou\": \"ネクサス工房\",\n        \"nezumitori\": \"ねズみ砦\",\n        \"nf121\": \"NF121\",\n        \"ngamura-san\": \"んがむらさん\",\n        \"ngl\": \"NGL\",\n        \"nguppu do m hakushaku\": \"んぐっぷ・ド・M伯爵\",\n        \"nhoooooooooooooo\": \"んほぉおおおぉおおおおおお♥おっ♥おっ♥\",\n        \"ni\": \"Ni\",\n        \"nibarera\": \"にばれら\",\n        \"nibiiro no sora\": \"鈍色の空\",\n        \"nibunn no ichi\": \"にぶんのいち!\",\n        \"nichijou superumisu\": \"日常すぺるみす\",\n        \"nico\": \"nico\",\n        \"nico plus\": \"Nico plus\",\n        \"nicolai\": \"NICOLAI\",\n        \"nicolion\": \"二コリオン\",\n        \"niesox\": \"niesox\",\n        \"nigakuriya\": \"ニガクリ屋\",\n        \"nigenige soldier\": \"逃げ逃げソルジャー\",\n        \"nigeru support\": \"にげるサポート\",\n        \"night ray kiss\": \"ナイトレイキス\",\n        \"night stalkers\": \"ないとすとーかーず\",\n        \"night stars\": \"ないと・すたーず\",\n        \"nightmare\": \"NIGHTMARE\",\n        \"nightride\": \"ナイトライド\",\n        \"nightstalker\": \"nightstalker\",\n        \"nigimitama no ya\": \"和魂屋\",\n        \"nigred\": \"ニグレド\",\n        \"nihon dandy\": \"日本ダンディ\",\n        \"nihon denga senmon gakkou\": \"日本電画専門学校\",\n        \"nihon sanjuufu\": \"二飜三十符\",\n        \"nihon sensou game kaihatsu\": \"日本戦争ゲーム開発\",\n        \"nihon shokushu shinkou kyoukai\": \"日本触手振興協会\",\n        \"nihon waru waru doumei\": \"日本ワルワル同盟\",\n        \"niikyuu\": \"にーきゅー\",\n        \"niimii dan\": \"にぃみぃ団\",\n        \"niizuma gaikokkaku\": \"新妻外骨格\",\n        \"niji no saki\": \"虹の先\",\n        \"niji seichou\": \"二次性徴\",\n        \"niji wo machinagara\": \"虹を待ちながら\",\n        \"nijigen complex\": \"にじげんCOMPLEX\",\n        \"nijigen koubou\": \"2次元工房\",\n        \"nijiiro denryuu\": \"虹色電流\",\n        \"nijiiro hyakka\": \"虹色百花\",\n        \"nijiiro mask\": \"虹色MASK\",\n        \"nijiiro suisho\": \"にじいろすいしょう\",\n        \"nijinoren\": \"虹のれん\",\n        \"nijiyome\": \"にじよめ\",\n        \"nijusei\": \"Nijusei\",\n        \"nikka\": \"NIKKA\",\n        \"niko\": \"NIKO\",\n        \"nikomark\": \"にこまあく\",\n        \"nikomutoko\": \"にこむとこ\",\n        \"nikopondo\": \"NIKOPONDO\",\n        \"niku jaguars\": \"NIKU・JAGUARS\",\n        \"niku no sashimi\": \"にくのさしみ\",\n        \"niku sushi\": \"肉寿司\",\n        \"nikukyu\": \"nikukyu\",\n        \"nikumanyaitimi\": \"にくまん屋一味\",\n        \"nikumomu\": \"ニクモム\",\n        \"nikutai gengo club\": \"肉体言語倶楽部\",\n        \"nikutaiha\": \"肉体派\",\n        \"nikuyakitei\": \"肉焼き亭\",\n        \"nikuyoku boutarou\": \"肉欲棒太郎\",\n        \"nil\": \"†NIL†\",\n        \"nilitsu haihan\": \"ニリツハイハン\",\n        \"nimame\": \"煮豆\",\n        \"nimensai\": \"二面賽\",\n        \"nine tail\": \"NINE TAIL\",\n        \"ninelives\": \"ninelives\",\n        \"ningen modoki\": \"人間モドキ\",\n        \"ningen tte iina\": \"にんげんっていいな\",\n        \"nininini\": \"にににに\",\n        \"ninjinpasta\": \"にんじんパスタ\",\n        \"ninniku batake\": \"にんにく畑\",\n        \"ninnindo\": \"にんにん堂\",\n        \"nino-kan\": \"にのカン\",\n        \"niponipo\": \"にぽにぽ\",\n        \"nipopo crisis\": \"ニポポクライシス\",\n        \"nihatsu shika ataranai\": \"2発しか当たらない\",\n        \"nipple mokuba\": \"にっぷる木馬\",\n        \"nippon teikoku toshokan\": \"日本帝國図書館\",\n        \"nipponbashi dennougumi\": \"ニッポンバシ電脳組\",\n        \"nir\": \"NiR\",\n        \"nirabatake\": \"にら畑\",\n        \"niratama\": \"にらたま\",\n        \"nirvana\": \"みるばーな\",\n        \"nirvana soft\": \"Nirvana Soft\",\n        \"nisemono\": \"偽もの\",\n        \"nisemonogoya\": \"ニセもの小屋\",\n        \"nisepakudo\": \"偽朴堂\",\n        \"nisha takuitsu\": \"二沙択一\",\n        \"nisin sansin\": \"にしん三振\",\n        \"nishiogi koubou\": \"西荻工房\",\n        \"nita ken\": \"ニタ研\",\n        \"nita-kane\": \"煮た鐘\",\n        \"nitaroutei\": \"ニタロウ亭\",\n        \"nicchi sangyou\": \"にっちさんぎょう\",\n        \"nitiniti sowa\": \"日々草話\",\n        \"niwakakamikiriyamodoki\": \"ニワカカミキリヤモドキ\",\n        \"niwatori\": \"にわとり\",\n        \"niwatoritowani\": \"にわとりとわに\",\n        \"niyatto company\": \"にやっとカンパニー\",\n        \"niyodo blue\": \"NIYODO BLUE\",\n        \"nizeru\": \"煮ぜる\",\n        \"niziyumedokoro\": \"虹夢処\",\n        \"nna timun\": \"んつぁてぃむん\",\n        \"nnz dan\": \"NNZ団\",\n        \"no actor\": \"NO ACTOR\",\n        \"no brand\": \"NO BRAND\",\n        \"no color\": \"No Color\",\n        \"no future\": \"No Future\",\n        \"no mercy\": \"No Mercy\",\n        \"no need\": \"NO NEED\",\n        \"no plan\": \"No Plan\",\n        \"no strike\": \"の～すとらいく\",\n        \"no such agency\": \"No Such Agency\",\n        \"no-plan\": \"No-Plan\",\n        \"no.3\": \"No.3\",\n        \"no3\": \"No3\",\n        \"noa\": \"noa\",\n        \"noa no sasabune\": \"のあのささぶね\",\n        \"noantica\": \"noantica\",\n        \"nobishiro\": \"のびしろ\",\n        \"nobita graph\": \"ノビタグラフ\",\n        \"nocohica\": \"nocohica\",\n        \"nocturnum\": \"ノクトルム\",\n        \"nodobotoke kingyo\": \"のどぼとけきんぎょ\",\n        \"noelvu\": \"ノエルヴ\",\n        \"noesis\": \"Noesis\",\n        \"noibara-en\": \"ノイバラ園\",\n        \"noirsoft\": \"ノアールソフト\",\n        \"noisy crown\": \"ノイジークラウン\",\n        \"noix\": \"ノア\",\n        \"nokishiki-box\": \"のき式BOX\",\n        \"nokishita-ya\": \"ノキシタ屋\",\n        \"nomad\": \"ノマド\",\n        \"nomucchi\": \"のむっち\",\n        \"nomugicha\": \"野麦茶\",\n        \"non brand\": \"Non_Brand\",\n        \"non non palette\": \"のんのんパレット\",\n        \"nonaka logic\": \"野中ロジック\",\n        \"nonbiri nonbiri\": \"のんびり のんびり\",\n        \"nonchalant\": \"のんしゃらん\",\n        \"nonono tsuushin\": \"ののの通信\",\n        \"nonoya\": \"のの屋\",\n        \"nonsense\": \"Nonsense\",\n        \"nonsugarloess\": \"のんしゅがーれす\",\n        \"nopland\": \"noPland\",\n        \"noppera koubou\": \"のっぺら工房\",\n        \"nora\": \"野良\",\n        \"norakurari.\": \"のらくらり。\",\n        \"noraneko koubou\": \"ノラ猫工房\",\n        \"noranoma\": \"noranoma\",\n        \"noraya\": \"のら屋\",\n        \"nori tokumori\": \"海苔特盛\",\n        \"noriajou\": \"のりあ城\",\n        \"norihee ginjou\": \"のりへぇ吟醸\",\n        \"norinori seika\": \"のりのり製菓\",\n        \"noritama-gozen\": \"のりたま御膳\",\n        \"north carolina power\": \"NORTH CAROLINA POWER\",\n        \"north70\": \"North70\",\n        \"nosebleed\": \"NOSEBLEED\",\n        \"nosekichiku\": \"野石竹\",\n        \"noshiki\": \"の式\",\n        \"nostalgic syndrome\": \"ノスタルジックシンドローム\",\n        \"not\": \"NOT\",\n        \"notari\": \"のたり\",\n        \"notears\": \"NoTears\",\n        \"notes.\": \"Notes.\",\n        \"nothing-plan\": \"Nothing-Plan\",\n        \"notonote\": \"NOTONOTE\",\n        \"notorious\": \"NOTORIUS\",\n        \"nottaya\": \"のっ田屋\",\n        \"noujiru teishokuya\": \"のぅじる定食屋\",\n        \"nounai ekijiru\": \"脳内液汁\",\n        \"nounai pg\": \"脳内PG\",\n        \"nounai zayaku\": \"脳内座薬\",\n        \"nounaihokan\": \"脳内補完\",\n        \"nounanka sedai\": \"脳軟化世代\",\n        \"noushuku kangen\": \"脳縮還元\",\n        \"nouzui majutsu\": \"脳髄魔術\",\n        \"novia\": \"Novia\",\n        \"nowhere\": \"NOWHERE\",\n        \"noxious plant\": \"noxious plant\",\n        \"noyau\": \"noyau\",\n        \"nozarashi\": \"のざらし\",\n        \"nozubeya\": \"野図部屋\",\n        \"nozzo gt\": \"のっつぉGT\",\n        \"np virus jouryuusho\": \"NPウイルス蒸留所\",\n        \"ns2k\": \"ns2k\",\n        \"dondondon\": \"どんどんどん\",\n        \"nt confess\": \"NTconfess\",\n        \"ntlabo\": \"NTラボ\",\n        \"ntr king\": \"NTR キング\",\n        \"ntr suishin iinkai\": \"NTR推進委員会\",\n        \"ntr system\": \"NTRシステム\",\n        \"ntrbear\": \"Ntrbear\",\n        \"nu\": \"Nu\",\n        \"nui gohan\": \"ぬいごはん\",\n        \"nuigurumiya-san\": \"ぬいぐるみやさん\",\n        \"nuit\": \"nuit\",\n        \"nuite amore\": \"抜いて☆アモーレ!\",\n        \"nukarumi\": \"泥濘\",\n        \"nukidamari\": \"ヌキダマリ\",\n        \"nukidokoro.\": \"ぬきどころ。\",\n        \"nukkoru\": \"ぬっこる\",\n        \"nukomashi dou\": \"ぬこまし堂\",\n        \"nukotigura\": \"ぬこちぐら\",\n        \"nukoya\": \"ぬこや\",\n        \"nul neverland\": \"ヌルネバーランド\",\n        \"null mayu\": \"NULLまゆ\",\n        \"null poplus\": \"ぬるぽぷらす\",\n        \"num\": \"#NUM!\",\n        \"numachi\": \"沼地\",\n        \"numadax\": \"ヌマダックス\",\n        \"number 910\": \"910号室\",\n        \"nun\": \"ヌン\",\n        \"nuno no ie\": \"布の家\",\n        \"nuno to kami\": \"布と紙\",\n        \"nupuryu no sato\": \"ぬぷ竜の里\",\n        \"nurebairo\": \"濡羽色\",\n        \"nurume\": \"ぬるめ\",\n        \"nurunuru 30 percent\": \"ぬるぬる30%\",\n        \"nurunurunerune\": \"ぬるぬるねるね\",\n        \"nv3offline\": \"NV3OFFLINE\",\n        \"nw-project\": \"NW-project\",\n        \"nwa\": \"nWa\",\n        \"nwonyo pasun\": \"んをんよ・ぱすん\",\n        \"nxcthermit\": \"N×Cてるみっと\",\n        \"nyaa nyaa koushinjo\": \"にゃ～にゃ～興信所\",\n        \"nyaa. to hidamari\": \"にゃー。とひだまり\",\n        \"nyagos\": \"にゃごズ\",\n        \"nyake\": \"NYAKE\",\n        \"nyakko-ya\": \"にゃっこ屋\",\n        \"nyala ponga\": \"ニャリャポンガ\",\n        \"nyamo nyamo\": \"にゃもにゃも\",\n        \"nyan nyan festival\": \"ニャンニャンフェスティバル\",\n        \"nyan nyan nyan\": \"にゃんにゃんにゃん!\",\n        \"nyan-nyan-hanten\": \"娘娘飯店\",\n        \"nyanderful vegitarian\": \"にゃんだふるべじたりあん\",\n        \"nyanko no me\": \"にゃんこの目\",\n        \"nyankopi\": \"にゃんこぴぃ\",\n        \"nyankoromochimochi\": \"にゃんころもちもち\",\n        \"nyanmilla\": \"ニャンミラ\",\n        \"nyannyan club\": \"娘々倶楽部\",\n        \"nyanpunibocchi\": \"にゃんぷにぼっち\",\n        \"nyaro kizoku\": \"にゃろ貴族\",\n        \"nyawatesou\": \"にゃわて荘\",\n        \"nylon 100\": \"ナイロン100%\",\n        \"nymph\": \"Nymph\",\n        \"nymphy fine fresh\": \"Nymphy Fine Fresh\",\n        \"nyoninka kenkyuujo\": \"女人化研究所\",\n        \"nyoro junction\": \"にょろじゃんくしょん\",\n        \"nyotai kougaku kenkyuujo\": \"女体光学研究所\",\n        \"nyotaian\": \"女体庵\",\n        \"nyuuface\": \"乳ふぇいす\",\n        \"nyuuseihin\": \"乳性貧\",\n        \"o-penguin\": \"俺企鵝\",\n        \"o.riginal brand\": \"O.RIginal brand\",\n        \"o157\": \"O157\",\n        \"oasis plus\": \"Oasis+\",\n        \"oba-q honpo qt\": \"OBA-Q HONPO QT\",\n        \"obake candle\": \"おばけキャンドル\",\n        \"oberkochen\": \"オーバーコッヘン\",\n        \"oboro\": \"朧\",\n        \"oboro hyakuhachishiki\": \"朧百八式\",\n        \"obsession.\": \"おぶせっしょん!\",\n        \"obsidian order\": \"Obsidian Order\",\n        \"obumanjuu\": \"おぶまんじゅう\",\n        \"oc5\": \"oC5\",\n        \"ocarina\": \"おかりな\",\n        \"occhoko-cho\": \"OCCHOKO-CHO\",\n        \"ocelot\": \"オセロット\",\n        \"ochadukeya sandaime\": \"お茶漬け屋三代目\",\n        \"ochaocha honpo\": \"おちゃおちゃ本舗\",\n        \"ochawannomushi\": \"おちゃわんのむし\",\n        \"ochaya\": \"御茶屋\",\n        \"ochigan\": \"堕ち玩\",\n        \"ochikochitei\": \"おちこち亭\",\n        \"ochitsu daisensei\": \"おちつ大先生\",\n        \"ocojoco\": \"ocojoco\",\n        \"odaku\": \"oda九\",\n        \"oden sensei\": \"汚電せんせい\",\n        \"oden-ya\": \"おでんや\",\n        \"odenden\": \"おでんでん\",\n        \"odin\": \"odin\",\n        \"odoshiro canvas\": \"おどしろキャンバス\",\n        \"oekaki seikatsu nikki\": \"お絵かき生活日記\",\n        \"oeuf\": \"Oeuf\",\n        \"off side\": \"OFF SIDE\",\n        \"offaria\": \"offaria\",\n        \"office amagasa\": \"雨傘日傘事務所\",\n        \"office baku\": \"オフィス・バク\",\n        \"office fairy\": \"office fairy\",\n        \"office neko\": \"Office猫\",\n        \"ofuro works\": \"おふろワークス\",\n        \"ofuroya\": \"オフロ屋\",\n        \"ofuzake tale\": \"お巫山戯テイル\",\n        \"ogagaga-sou\": \"おががが荘\",\n        \"ogawa jinguu\": \"小川神宮\",\n        \"ogawaya\": \"小河屋\",\n        \"ogeretsu-dan\": \"おげれつ団\",\n        \"ogerwillow\": \"オーガウィロウ\",\n        \"ogofwitch\": \"OgOfWitch\",\n        \"ogura tankenka\": \"小倉探検家\",\n        \"oguradou\": \"小倉堂\",\n        \"oh-banzai studio\": \"おばんざい☆スタジオ\",\n        \"ohagi.\": \"おはぎ。\",\n        \"ohakotomeno\": \"おはことめの\",\n        \"oharaibako\": \"御祓箱\",\n        \"ohige\": \"おひげ\",\n        \"ohka works\": \"おーかわーくす!\",\n        \"ohnegs\": \"オーネグス\",\n        \"ohsaka spirits\": \"大坂魂\",\n        \"oideyasu honpo\": \"おいでやす本舗\",\n        \"oilan\": \"oilan\",\n        \"oimoto\": \"おいもと\",\n        \"oinari summer\": \"お稲荷Summer\",\n        \"oishii oniku\": \"おいしいお肉\",\n        \"oishii oniku.\": \"おいしいお肉。\",\n        \"oishii udon\": \"おいしいうどん\",\n        \"oiyoko\": \"オイヨコ\",\n        \"ojin koukoku\": \"オジン公国\",\n        \"ojmomo\": \"OJmomo\",\n        \"okachimentaiko\": \"おかちめんたいこ\",\n        \"okameya honpo\": \"おかめや本舗\",\n        \"okami kaikou\": \"おかみかいこう\",\n        \"okashi na denpa\": \"お可視な電波\",\n        \"okashi no ie\": \"お瑕疵の家\",\n        \"okashi senmonten\": \"おかしせんもんてん\",\n        \"okashimo\": \"おかしも\",\n        \"okatoraya\": \"岡虎屋\",\n        \"okayushop\": \"OkayuShop\",\n        \"okazu club\": \"Okazu Club\",\n        \"okazu company\": \"おかずカンパニー\",\n        \"okazu musume\": \"オカズ娘\",\n        \"okett\": \"okett\",\n        \"okina flying factory\": \"Okina Flying Factory\",\n        \"okina keikaku\": \"翁計画\",\n        \"okina utsuwa\": \"大きな器\",\n        \"okinawa chinkosuu\": \"沖縄ちんこすう\",\n        \"okinawa taieki gunjinkai\": \"沖縄体液軍人会\",\n        \"oko-san\": \"おこさん\",\n        \"okojo no machi\": \"オコジョの街\",\n        \"okojodou\": \"御娘女堂\",\n        \"okome rice don\": \"おこめライス丼\",\n        \"okosama lunch\": \"お子様ランチ\",\n        \"okosama pancake\": \"お子様パンケーキ\",\n        \"okosamastar company\": \"オコサマ・スター社\",\n        \"okottei\": \"おこっ亭\",\n        \"okt\": \"OKT!\",\n        \"oktm\": \"OKTM\",\n        \"oku no hosomichi\": \"奥の細道\",\n        \"ol\": \"OL\",\n        \"old school academy\": \"オールドスクールアカデミー\",\n        \"old weapon\": \"おーるどうぇぽん\",\n        \"oldwiseman\": \"Oldwiseman\",\n        \"ole-m\": \"OLE-M\",\n        \"om\": \"おっえむ\",\n        \"omame cyokueitenn\": \"おまめ直営店\",\n        \"omaru bokujou\": \"おまる牧場\",\n        \"omega 2-d\": \"OMEGA 2-D\",\n        \"omega circuit\": \"おめがさーきっと\",\n        \"omega house\": \"おめがはうす\",\n        \"omikidokkuri\": \"オミキドックリ\",\n        \"omizuya\": \"おみずや\",\n        \"ommed\": \"オムメド\",\n        \"omocha kaden\": \"玩具家電\",\n        \"omochaya meguri\": \"おもちゃやめぐり\",\n        \"omochi bazooka\": \"おもち☆バズーカ\",\n        \"omochi soft\": \"おもちそふと\",\n        \"omochibako no text log\": \"おもちばこのテキストログ\",\n        \"omodume\": \"想詰め\",\n        \"omoiukabi enikki\": \"思い浮かび絵日記\",\n        \"omoshiro burger\": \"おもしろバーガー\",\n        \"omoshiro usagi\": \"オモシロウサギ\",\n        \"omoya\": \"母屋\",\n        \"on my way\": \"on my way\",\n        \"on your mark\": \"ON YOUR MARK\",\n        \"on-show\": \"怨床\",\n        \"onagoya\": \"おなご屋\",\n        \"onaka ga suita\": \"おなかがすいた\",\n        \"onbundou\": \"音文堂\",\n        \"once only\": \"Once Only\",\n        \"one week holiday\": \"One Week Holiday\",\n        \"one-seven\": \"ONE-SEVEN\",\n        \"one-shot\": \"ONE-SHOT\",\n        \"one-up\": \"One-up\",\n        \"oneashi\": \"オネアシ\",\n        \"oneekyou\": \"御姉狂\",\n        \"oneforall\": \"わんふぉーおーる\",\n        \"onegross\": \"ONEGROSS\",\n        \"onemu hormone\": \"おねむホルモン\",\n        \"ongr\": \"ongr\",\n        \"oni kizoku\": \"鬼貴族\",\n        \"onigiriz\": \"ONIGIRIズ\",\n        \"onikibitou\": \"鬼きび党\",\n        \"oninoe\": \"鬼ノ餌\",\n        \"onna ni yoru onna e no ryoujoku\": \"女による女への陵辱\",\n        \"onnanoko himitsu seisan koujou\": \"女の子秘密生産工場\",\n        \"onnanoko payapaya\": \"女の子パヤパヤ\",\n        \"onoderasanchi\": \"おのでらさん家\",\n        \"onoe network\": \"小乃枝電網\",\n        \"onomatopoeia\": \"オノマトピア\",\n        \"onpuman\": \"オンプマン\",\n        \"onsoku ebifly\": \"音速エビフライ\",\n        \"onsoku soukou\": \"音速走行\",\n        \"onsoku ubaguruma\": \"音速うばぐるま\",\n        \"onyitei\": \"鬼ぃ亭\",\n        \"onzskds\": \"御曹司ください\",\n        \"ooarai nourakudou\": \"大洗能楽堂\",\n        \"oobae toudai\": \"オオバエ灯台\",\n        \"oobeya potechi house\": \"大部屋ポテチハウス\",\n        \"oogane farm\": \"大金ファーム\",\n        \"ooitei\": \"大井亭\",\n        \"oojinushi\": \"おおじ主\",\n        \"ookami shoujo yuugi dan\": \"狼少女遊戯団\",\n        \"ookina kodomo no omocha bako\": \"大きな子供のおもちゃ箱\",\n        \"oomorian\": \"大森庵\",\n        \"ootsuku shouji\": \"大津久商事(有)\",\n        \"oozora kaiko\": \"大空カイコ\",\n        \"operating room\": \"Operating Room\",\n        \"operation\": \"operatioN\",\n        \"operation panel\": \"操作パネル\",\n        \"oppai baibai\": \"おっぱいばいばい\",\n        \"oppai click\": \"おっぱいクリック\",\n        \"oppai guild\": \"ぱいギル\",\n        \"oppai mochi\": \"おっぱい餅\",\n        \"opt\": \"OPT\",\n        \"optimism small country\": \"楽観主義小国\",\n        \"oracle eggs\": \"Oracle Eggs\",\n        \"orange blossom\": \"おれんじ☆ぶろっさむ\",\n        \"orange chocolat\": \"Orange Chocolat\",\n        \"orange crown\": \"Orange Crown\",\n        \"orange gallery henshuubu\": \"オレンジ・ギャラリー編集部\",\n        \"orange girl\": \"orange girl\",\n        \"orange mill\": \"オレンジミル\",\n        \"orange peel\": \"Orange Peel\",\n        \"orange piece\": \"Orange Piece\",\n        \"orange powder\": \"おらんげぱうだー\",\n        \"orange typhoon\": \"オレンジタイフーン\",\n        \"orangelepsy\": \"オレンジレプシー\",\n        \"ore dake ga tokusuru onsei koubou\": \"俺だけが得する音声工房\",\n        \"ore jon\": \"俺JON\",\n        \"oreaji\": \"俺味\",\n        \"oregun\": \"俺軍\",\n        \"oreichigo\": \"俺苺\",\n        \"oremuha x\": \"オレムハX\",\n        \"orenjiru\": \"おれんジル\",\n        \"oretachi misnon ikka\": \"俺たちミスノン一家\",\n        \"oreteki shikou\": \"俺的嗜好\",\n        \"organico\": \"おるがにこ\",\n        \"orgasmpotential\": \"orgasmpotential\",\n        \"oriental lattice\": \"Oriental Lattice\",\n        \"origami farm\": \"折纸牧场\",\n        \"orihime-bunko\": \"織姫文庫\",\n        \"orubara\": \"オルバラ\",\n        \"orukaniumu-labo\": \"orukaniumu-labo\",\n        \"orz\": \"orz\",\n        \"orz commushoz\": \"Orzコミュショーズ\",\n        \"os tokku\": \"OS特区\",\n        \"osaka lucha libre\": \"大阪ルチャリブレ\",\n        \"osakana planet\": \"おさかなプラネット\",\n        \"osakana tabeyo\": \"おさかなたべよ\",\n        \"osanagokoro no kimi ni\": \"幼心の君に\",\n        \"osaru no noumiso\": \"お猿の脳みそ\",\n        \"osaru-san panic\": \"おさるさんパニック\",\n        \"oshigoto no jikan\": \"おしごとのぢかん\",\n        \"oshikko channel\": \"おしっ娘ちゃんねる\",\n        \"oshiruko kan\": \"おしるこ缶\",\n        \"oshiruko sentimental\": \"おしるこセンチメンタル\",\n        \"oshisyo-san\": \"おししょーさんっ\",\n        \"osiri\": \"osiri\",\n        \"osiris\": \"オシリス\",\n        \"osova\": \"おそば\",\n        \"osterei\": \"OSTEREi\",\n        \"osu to mesu\": \"♂×♀オスとメス\",\n        \"ota office\": \"OTA OFFICE\",\n        \"otafukutei\": \"おたふく亭\",\n        \"otaku no youjinbou\": \"オタクの用心棒\",\n        \"ote\": \"お手っ\",\n        \"otenkiya\": \"おてんき屋\",\n        \"otentomaru\": \"オテント丸\",\n        \"othello ice\": \"オセロアイス\",\n        \"oto\": \"OTO\",\n        \"otogi no kuni no soapland\": \"おとぎの国のソープランド\",\n        \"otogiya\": \"御伽屋\",\n        \"otohime\": \"おとひめ\",\n        \"otohime 49-gou\": \"オトヒメ49号\",\n        \"otohimedou\": \"乙姫堂\",\n        \"otoko no roman\": \"男のROMAN\",\n        \"otokonoko club\": \"おとこの娘倶楽部\",\n        \"otokonoko daisuki iinchou\": \"男の娘大好き委員長\",\n        \"otokonoko soft\": \"男の娘ソフト\",\n        \"otokonoko to onnanoko\": \"男の子と女の子\",\n        \"otome half line\": \"乙女ハーフライン\",\n        \"otome no eden\": \"乙女のエデン\",\n        \"otomeza\": \"処女座\",\n        \"otona no douraku\": \"大人の道楽\",\n        \"otona no youchien\": \"大人の幼恥園\",\n        \"otona teikoku\": \"オトナテイコク\",\n        \"otoreko\": \"OTOREKO\",\n        \"otousan\": \"尾刀産\",\n        \"otto\": \"OTTO\",\n        \"otukimidango\": \"お月見団子\",\n        \"oudon shikoshiko\": \"おうどん☆シコシコ\",\n        \"ougi production\": \"扇プロダクション\",\n        \"ougi ranmaru\": \"扇蘭丸\",\n        \"ougon no yofuke dan\": \"黄金の夜更け団\",\n        \"oumi shouan\": \"近江小庵\",\n        \"ourakutei\": \"王烙亭\",\n        \"ourindou\": \"王林堂\",\n        \"out of mind\": \"Out of Mind\",\n        \"out of service\": \"OUT of SERVICE\",\n        \"out-of-date\": \"アウトオブデイト\",\n        \"outflow\": \"OUTFLOW\",\n        \"outrate\": \"アウトレート\",\n        \"outroad\": \"あうとろーど\",\n        \"ovacas\": \"OVACAS\",\n        \"over drive\": \"OVER DRIVE\",\n        \"over3\": \"Over3\",\n        \"overcrowd\": \"オーバークラウド\",\n        \"overdose\": \"オーバードーズ\",\n        \"overflow\": \"オーバーフロー\",\n        \"overgrown generations\": \"OVERGROWN GENERATIONS\",\n        \"overload\": \"おーばーろーど\",\n        \"owatasha\": \"おわた社\",\n        \"oxg\": \"OXG\",\n        \"oxide.lab\": \"OXIDE.Lab\",\n        \"oxydan\": \"おきし団\",\n        \"oyajiji gumi\": \"オヤジジ組\",\n        \"oyakodon\": \"親子丼\",\n        \"oyasumi disco\": \"おやすみDISCO\",\n        \"oyasumi kobe gyuu\": \"おやすみ神戸牛\",\n        \"oyasumi switch\": \"オヤスミスイッチ\",\n        \"oyasuminasai\": \"おやすみなさい\",\n        \"oyatsukan\": \"おやつ缶\",\n        \"oz project\": \"Oz Project\",\n        \"ozashiki\": \"オザ式\",\n        \"ozawa kobo\": \"緒沢工房\",\n        \"ozen shiryoushitsu\": \"御前資料室\",\n        \"ozone\": \"おぞね\",\n        \"p freak\": \"Pふりーく\",\n        \"p herb\": \"Pハーブ\",\n        \"p kikaku\": \"P企画\",\n        \"p-850\": \"P-850\",\n        \"p-forest\": \"P-FOREST\",\n        \"p-lemo\": \"ぴぃれも\",\n        \"p-me\": \"P-ME\",\n        \"p-point\": \"P-POINT\",\n        \"p.a. project\": \"P.A.Project\",\n        \"p.p.p\": \"P.P.P\",\n        \"p2paramount\": \"P2Paramount\",\n        \"pa-pu-\": \"ぱーぷー\",\n        \"pa.da.wan\": \"Pa・Da・ワン\",\n        \"pachipachi soft\": \"ぱちぱちそふと\",\n        \"pag-pag-magu\": \"ぱぐぱぐまぐぅ\",\n        \"pagumiee\": \"パグミィ\",\n        \"paintingbird\": \"PaintingBird\",\n        \"pairesshu\": \"Paiれっしゅ\",\n        \"pajamas ex\": \"ぱじゃまエクスタシー\",\n        \"pajamas soft\": \"ぱじゃまソフト\",\n        \"pakupaku\": \"ぱくぱく\",\n        \"pakupikubon\": \"パクピクボン\",\n        \"palace village ke\": \"パレスヴィレッジ家\",\n        \"pale scarlet\": \"Pale Scarlet\",\n        \"palette\": \"ぱれっと\",\n        \"palette enterprise\": \"Palette Enterprise\",\n        \"pallet box\": \"Pallet Box\",\n        \"palm sunday\": \"パームサンデー\",\n        \"palpiteria\": \"パルピテリア\",\n        \"pamunosu\": \"ぱむの巣\",\n        \"pan 2\": \"パン2\",\n        \"pan koubou\": \"パン工房\",\n        \"pan no mimi\": \"パンノミミ\",\n        \"pan to butterfly.\": \"パンとバタフライ。\",\n        \"panbai\": \"PANBAI\",\n        \"panda 4gou\": \"パンダ4号\",\n        \"panda pro\": \"ぱんだぷろ\",\n        \"panda scanners\": \"パンダスキャナーズ\",\n        \"panicerr\": \"パニッカー\",\n        \"panier\": \"パニエ\",\n        \"panjandrum\": \"Panjandrum\",\n        \"pankoppe\": \"ぱんこっぺ\",\n        \"pannacotta\": \"Pannacotta\",\n        \"panoramakan\": \"ぱのらま館\",\n        \"panorama tsuushinkyoku\": \"パノラマ通信局\",\n        \"panteitei\": \"PanTei亭\",\n        \"pantie party project\": \"Pantie Party Project\",\n        \"pantsu kakumei.\": \"パンツ革命。\",\n        \"pantsu koubou\": \"ぱんつ工房\",\n        \"pantwo\": \"pantwo\",\n        \"panty stocking\": \"Panty Stocking\",\n        \"panya no enzo\": \"パン屋のエンツォ\",\n        \"pao pao\": \"PAO・PAO\",\n        \"paopaship\": \"ぱぉぱしっぷ\",\n        \"papamilk\": \"Papamilk\",\n        \"papaya milk\": \"ぱぱいや・みるく\",\n        \"papepox2\": \"PAPEPOX2\",\n        \"paper cup and adult key\": \"Paper Cup and Adult Key\",\n        \"paper-doll\": \"Paper-Doll\",\n        \"papercrown\": \"ぺぱくら\",\n        \"papered armor\": \"紙装甲\",\n        \"parade\": \"Parade\",\n        \"paradigm conflict\": \"PARADIGM CONFLICT\",\n        \"paradis\": \"PaRaDis\",\n        \"paradise city\": \"ぱらだいすCity\",\n        \"paradise d products\": \"PARADISED PRODUCTS\",\n        \"paradise jack\": \"パラダイスジャック\",\n        \"paradise lost\": \"パラダイス・ロスト\",\n        \"paradisegom\": \"ParadiseGom\",\n        \"paraiso\": \"ぱらいそ\",\n        \"paraiso saigu\": \"ぱらゐそ祭具\",\n        \"paraiso shugi\": \"パライソ主義\",\n        \"parallel area\": \"パラレルエリア\",\n        \"parameter\": \"パラミター\",\n        \"parasol\": \"Parasol\",\n        \"paret\": \"paret\",\n        \"parin to wareru\": \"パリンと割れる\",\n        \"pariparicandy\": \"ぱりぱりきゃんでぃー\",\n        \"parity nyuu\": \"ぱりてぃー・にゅー\",\n        \"park popcorn\": \"パークポップコーン\",\n        \"part k\": \"Part K\",\n        \"parthenon\": \"パルテノン\",\n        \"particle\": \"ぱーてぃくる\",\n        \"party nights\": \"パーリィナイツ\",\n        \"parukusu\": \"ぱるくす\",\n        \"parupunte\": \"ぱるぷんて\",\n        \"passing shower\": \"ぱっしんぐしゃわー\",\n        \"past\": \"Past\",\n        \"pastel bitch\": \"パステルビッチ\",\n        \"patio canvas\": \"ぱてぃお☆きゃんばす\",\n        \"patoto\": \"PATOTO\",\n        \"patricide\": \"PATRICIDE\",\n        \"pavington\": \"Pavington\",\n        \"pazooka\": \"Pazooka\",\n        \"pazzo s.p.\": \"Pazzo S.P.\",\n        \"pe theta\": \"Peθ\",\n        \"pe.\": \"ぺ。\",\n        \"peach cat\": \"PEACH CAT\",\n        \"peach fox\": \"peach fox\",\n        \"peach kupaa\": \"ピーチクパァ\",\n        \"peach palette\": \"ぴーちパレット\",\n        \"peach store\": \"ぴーちストア\",\n        \"peachbooks hachinohe-ten\": \"PEACHBOOKS八戸店\",\n        \"peachbreath\": \"PeachBreath\",\n        \"peachpulsar\": \"peachpulsar\",\n        \"peaky\": \"ピーキー\",\n        \"pecan\": \"ピーカン\",\n        \"peco poco\": \"ぺこぽこ\",\n        \"peeping phantom\": \"Peeping Phantom\",\n        \"pegasisters\": \"ペガシスターズ\",\n        \"peke no hima\": \"ぺけの閑\",\n        \"peko renmei\": \"ぺこ連盟\",\n        \"pekoe\": \"Pekoe\",\n        \"pell-mell works\": \"PELL-MELL WORKS\",\n        \"pelpan omt\": \"ぺるぱんOMT\",\n        \"peneya\": \"ぺね屋\",\n        \"penguin teikoku\": \"ペンギン帝国\",\n        \"penguindou\": \"筆吟堂\",\n        \"penpen mushi no koucha\": \"ぺんぺん虫の紅茶\",\n        \"penpengusa club\": \"ペンペン草くらぶ\",\n        \"penteru kohboh\": \"ぺんてる工房\",\n        \"peony\": \"ピオニー\",\n        \"peperoncino\": \"ぺぺろんちーの\",\n        \"perceptron\": \"ぱーせぷとろん\",\n        \"perestroika\": \"ピリストローイカ\",\n        \"perfect sea\": \"PERFECT SEA\",\n        \"performance\": \"パーフォーマンス\",\n        \"perilab\": \"ぺりラボ\",\n        \"pero\": \"Pero\",\n        \"peromuji-ya\": \"ぺろむじ屋\",\n        \"perosikos\": \"ペロシコス\",\n        \"persicaria eater\": \"persicaria eater\",\n        \"personal color\": \"PERSONAL COLOR\",\n        \"personal space\": \"personal space\",\n        \"pervert\": \"pervert\",\n        \"petapan\": \"ぺたパン\",\n        \"petica\": \"ペチカ\",\n        \"petit bunny\": \"Petit Bunny\",\n        \"petit ego\": \"ぷちえご!\",\n        \"petit machiya\": \"ぷち町屋\",\n        \"petite x cerisier\": \"Petite＊Cerisier\",\n        \"petit pack\": \"Petit Pack\",\n        \"peto-ya\": \"ぺと屋\",\n        \"pets\": \"PETS\",\n        \"pettanko\": \"ペッたんコっ!\",\n        \"pez.\": \"pez.\",\n        \"pfactory\": \"Pfactory\",\n        \"phantom vibration syndrome\": \"幻想振動症候群\",\n        \"phantomcross\": \"ファントムクロス\",\n        \"phantomsoft\": \"ファントムソフト\",\n        \"phase nine\": \"PHASE NINE\",\n        \"phenomena\": \"PHENOMENA\",\n        \"pheromone lover 358\": \"フェロモンラバー358\",\n        \"philippiana honpo\": \"フィリピアナ本舗\",\n        \"phlodexy\": \"Phlodexy\",\n        \"phoenix project\": \"PHOENIX PROJECT\",\n        \"photonix\": \"PHOTONIX\",\n        \"physalis\": \"PHYSALIS\",\n        \"pi o 2\": \"πO2\",\n        \"pianissimo\": \"ピアニッシモ\",\n        \"piccalilli\": \"ピッカリリ\",\n        \"piccolo studio\": \"ピッコロ工房\",\n        \"pichi pichi garou r\": \"ぴちぴち画廊R\",\n        \"pickled teishoku\": \"ピクルス定食\",\n        \"pico pico labyrinth\": \"ピコピコ★ラビリンス\",\n        \"picopicosoft\": \"PICOPICOSOFT\",\n        \"picosolenodon\": \"ピコソレノドン\",\n        \"picotama.\": \"ぴこたま。\",\n        \"picricacid\": \"ぴくりんさん\",\n        \"pictlier\": \"ぴくとりえ\",\n        \"piepillow\": \"ピエピロー\",\n        \"pierre\": \"PIERRE\",\n        \"pierrot\": \"Pierrot\",\n        \"pigeon blood\": \"鳩血\",\n        \"piggstar\": \"PIGGSTAR\",\n        \"pignon\": \"pignon\",\n        \"pihii shobou\": \"ぴひー書房\",\n        \"pikopiko saber\": \"ピコピコサーベル\",\n        \"pikopikotei\": \"ぴこぴこ亭\",\n        \"pil-vamp\": \"PIL-VAMP\",\n        \"pile driver\": \"PILE DRIVER\",\n        \"pilen\": \"PileN\",\n        \"pillow works\": \"PILLOW WORKS\",\n        \"pilotstar\": \"Pilotstar\",\n        \"pin-13\": \"ピンのワンスリー\",\n        \"pin-point\": \"ピンポイント\",\n        \"pinacotheca\": \"Pinacotheca\",\n        \"pine\": \"ぱいん\",\n        \"pine candy\": \"PINE CANDY\",\n        \"pineapple candy\": \"パイナップルキャンディ\",\n        \"pinpoint\": \"ピンポイント\",\n        \"pink bat\": \"ピンクバット\",\n        \"pink cherry cocktail\": \"Pink Cherry Cocktail\",\n        \"pink chuchu\": \"PINK CHUCHU\",\n        \"pink cloud\": \"ピンククラウド\",\n        \"pink december\": \"Pink December\",\n        \"pink kitten\": \"ぴんくのこねこ\",\n        \"pink no chao\": \"PINKのCHAO!\",\n        \"pink no jaguchi\": \"ピンクの蛇口\",\n        \"pink pepper\": \"Pink pepper\",\n        \"pink pineapple\": \"ピンクパイナップル\",\n        \"pink poison\": \"PINK POISON\",\n        \"pink revolver\": \"ピンクリボルバー\",\n        \"pink rose\": \"PINK ROSE\",\n        \"pink thin cellophane\": \"pink thin cellophane\",\n        \"pink tissue\": \"Pink Tissue\",\n        \"pink-noise\": \"pink-noise\",\n        \"pink.in black\": \"PINK.in BLACK\",\n        \"pinkbell software\": \"PINKBELL SOFTWARE\",\n        \"pinke\": \"ぴんけ\",\n        \"pinkharlem\": \"PinkHarlem\",\n        \"pinkjoe\": \"pinkjoe\",\n        \"pinktips.info\": \"pinktips.info\",\n        \"pinky girl\": \"PINKY GIRL\",\n        \"pintsize\": \"ぱいんとさいず\",\n        \"pipapipa9\": \"pipapipa9\",\n        \"pipasuta\": \"ぴぱスタ\",\n        \"pipiya\": \"ぴぴや\",\n        \"pirates patrol\": \"パイレーツパトロール\",\n        \"pirisyuga\": \"ぴりしゅが\",\n        \"piropiro\": \"PIROPIRO\",\n        \"piropiro-go\": \"ぴろぴろごー\",\n        \"pirorunchi\": \"ぴろるんち\",\n        \"piruporo\": \"ぴるぽろー\",\n        \"pisces\": \"ぴすけす\",\n        \"pish lover\": \"ピシュ☆ラバ\",\n        \"piss\": \"PISS\",\n        \"pistonpower\": \"Pistonpower\",\n        \"pit\": \"PiT\",\n        \"pit.ra.bit\": \"pit.ra.bit\",\n        \"pixel cot.\": \"Pixel Cot.\",\n        \"pixel mint\": \"PIXEL MINT\",\n        \"pixel works\": \"Pixel Works\",\n        \"pixy bell\": \"ピクシーベル\",\n        \"piyo project\": \"ぴよぷろじぇくと\",\n        \"piyokoya\": \"ぴよこ屋\",\n        \"piyopit\": \"PiyoPit\",\n        \"piyopiyo teikoku\": \"ピヨピヨ帝国\",\n        \"piyotama\": \"ぴよたま\",\n        \"pizzaizm\": \"PIZZAIZM\",\n        \"placre\": \"プラクリ\",\n        \"plain ghost\": \"Plain Ghost\",\n        \"planariatei\": \"ぷらなりあ亭\",\n        \"planet\": \"プラネット\",\n        \"planet maris\": \"PLANET MARIS\",\n        \"planet matier\": \"Planet Matier\",\n        \"planet piece\": \"PLANET PIECE\",\n        \"planetary\": \"Planetary\",\n        \"plantain\": \"plantain\",\n        \"plastics\": \"plastics\",\n        \"plato.\": \"plato.\",\n        \"platonica\": \"PLATONiCA\",\n        \"please continue\": \"please continue\",\n        \"pleats time\": \"プリーツたいむ\",\n        \"pleco\": \"PLECO\",\n        \"pleiades fortune\": \"PLEIADES☆FORTUNE\",\n        \"plott\": \"Plott\",\n        \"plum factory\": \"Plum Factory\",\n        \"plume works\": \"PLUME WORKS\",\n        \"plumzero\": \"PlumZERO\",\n        \"plus donburi\": \"+丼\",\n        \"plus elegy\": \"+Elegy\",\n        \"plus house\": \"Plus house\",\n        \"plus10\": \"Plus Ten\",\n        \"plus810\": \"+810\",\n        \"pluto\": \"プルート\",\n        \"pm02 colon 00\": \"pm02:20\",\n        \"pno group\": \"PNO グループ\",\n        \"pno.\": \"PNO.\",\n        \"pnp\": \"ピィーエヌピィー\",\n        \"pocket\": \"POCKET\",\n        \"pocket drop\": \"ポケットドロップ\",\n        \"poco\": \"!POCO\",\n        \"poco poco\": \"POCO POCO\",\n        \"pocorit\": \"ぽこりっと\",\n        \"poga\": \"Poga*\",\n        \"poifull\": \"ぽいふる\",\n        \"point m\": \"Point M\",\n        \"points\": \"Points\",\n        \"poison\": \"POISON\",\n        \"poison breath\": \"ポイズンブレス\",\n        \"poison gray\": \"Poison Gray\",\n        \"poison squid\": \"ポイズンスクイッド\",\n        \"poisonblues\": \"POISONBLUES\",\n        \"poiyo dimension\": \"ポイヨディメンション\",\n        \"pokopen-honpo\": \"ぽこぺん本舗\",\n        \"pokotou\": \"ぽことう\",\n        \"polaris\": \"POLARIS\",\n        \"polbockle\": \"polbockle\",\n        \"pollinosis\": \"ぽりのしす\",\n        \"polorinken\": \"ポロリン軒\",\n        \"pom\": \"PoM\",\n        \"pomato-ya\": \"ぽまと屋\",\n        \"pomegranate\": \"ぽめぐら\",\n        \"pomelanian\": \"Pomelanian\",\n        \"pometeor\": \"ぽメテオ\",\n        \"pon de ushi\": \"ポン・デ・ウシ\",\n        \"poncho mojah\": \"PONCHO MOJAH\",\n        \"pondemix\": \"PONDEMIX\",\n        \"poniponi\": \"poniponi\",\n        \"poniteke zoku\": \"ポニテケ族\",\n        \"ponkotsu box\": \"ぽんこつ×ぼっくす\",\n        \"ponkotsu damashii\": \"ポンコツ魂\",\n        \"ponkotsu teikoku\": \"ポンコツ帝国\",\n        \"ponkotsu-ki\": \"ぽんこつ紀\",\n        \"ponkotsudou\": \"凡骨道\",\n        \"ponkotuna potunoya\": \"ぽんこつなぽつの屋\",\n        \"ponpon-o\": \"ぽんぽんお\",\n        \"ponte\": \"Ponte\",\n        \"pony farm\": \"仔马牧场\",\n        \"pony roll\": \"PONY ROLL\",\n        \"ponyfarm\": \"ポニー牧場\",\n        \"ponys bridle\": \"PONY'S BRIDLE\",\n        \"ponz.info\": \"ponz.info\",\n        \"ponzoom\": \"ぽんずーむ\",\n        \"ponzu ame\": \"ぽんずアメ\",\n        \"pooca\": \"pooca\",\n        \"popcorn koujou\": \"ポップコーン工場\",\n        \"popcorn lamp\": \"にゃじらんぷ\",\n        \"popeo\": \"ぽぺお\",\n        \"popin rabbit\": \"popin'rabbit\",\n        \"popo candy\": \"ぽぽきゃんでぃ\",\n        \"popo doctrine\": \"ポポドクトリン\",\n        \"popoin\": \"ぽぽいん\",\n        \"poppozu\": \"ポッポーズ\",\n        \"popship\": \"ポップシップ\",\n        \"popshot\": \"POPSHOT\",\n        \"popularplus\": \"popularplus\",\n        \"porika\": \"ポリカ\",\n        \"poritabe.\": \"ポリたべ。\",\n        \"porno maker\": \"ぽるのめーかー\",\n        \"pornostar\": \"ポルノ★スター\",\n        \"portion\": \"Portion\",\n        \"porygon137\": \"PORYGON137\",\n        \"potage\": \"Potage\",\n        \"potato salad\": \"ぽてとさらだ\",\n        \"potato seikatsu\": \"ポテト生活\",\n        \"potch pocket\": \"ぽっちぽけっと\",\n        \"poteto-chips\": \"poteto-chips\",\n        \"potosu koubou\": \"ポトス工房\",\n        \"poulain\": \"poulain\",\n        \"powderskin\": \"PowderSkin\",\n        \"power gradation\": \"パワーグラデイション\",\n        \"power of maca\": \"power of maca\",\n        \"power skill\": \"パワースキル\",\n        \"power slide\": \"パワースライド\",\n        \"power step\": \"Power Step\",\n        \"powerful soft\": \"ぱわふるソフト\",\n        \"powerplay\": \"POWERPLAY\",\n        \"praetorium-somnus\": \"プラエトーリウム=ソムヌス\",\n        \"prahapripa\": \"ぷらはぷりぱ\",\n        \"pravo713\": \"PRAVO713\",\n        \"prekano\": \"プレカノ\",\n        \"pretty maids\": \"PRETTY☆MAIDS\",\n        \"pretty penis\": \"プリティペニス\",\n        \"prettydolls\": \"prettydolls\",\n        \"prick\": \"PRICK\",\n        \"prickly ash\": \"プリックリーアッシュ\",\n        \"pride zero\": \"プライドZERO\",\n        \"prima stella\": \"Prima Stella\",\n        \"primal gleam\": \"Primal Gleam\",\n        \"primal gym\": \"Primal Gym\",\n        \"primavista\": \"Primavista\",\n        \"prime-f\": \"Prime-F\",\n        \"princess cage\": \"Princess Cage\",\n        \"princess heart\": \"Princess Heart\",\n        \"princess sugar\": \"Princess Sugar\",\n        \"princia\": \"プリンシア\",\n        \"prism eye\": \"Prism eye\",\n        \"prism silhouette\": \"ぷりずむ しるえっと\",\n        \"prism store\": \"Prism Store\",\n        \"prismatic\": \"PRISMATIC\",\n        \"pritannia\": \"ぷりたにあ\",\n        \"pro-tec\": \"Pro-tec\",\n        \"prodrug\": \"PRODRUG\",\n        \"production n.g\": \"PRODUCTION N.G\",\n        \"progretrance\": \"プログレトランス\",\n        \"project 345\": \"Project 345\",\n        \"project d\": \"ぷろじぇくとD\",\n        \"project freaks\": \"project フリークス\",\n        \"project fw\": \"プロジェクトFW\",\n        \"project harakiri\": \"PROJECTハラキリ\",\n        \"project of dr.q\": \"Project of Dr.Q\",\n        \"project-11\": \"Project-11\",\n        \"projectgs\": \"ProjectGS\",\n        \"proom\": \"Proom\",\n        \"propeller\": \"propeller\",\n        \"protmind\": \"PROTMIND\",\n        \"prymary\": \"prymary\",\n        \"przm star\": \"Przm Star\",\n        \"psy-chs\": \"Psy-chs\",\n        \"psy-force-project\": \"Psy-Force-Project\",\n        \"psy-walken\": \"Psy-Walken\",\n        \"psychetangle\": \"サイケタングル\",\n        \"psycho\": \"Psycho\",\n        \"psychosteak\": \"PSYCHOSTEAK\",\n        \"psycodelicious\": \"PSYCODELICIOUS\",\n        \"ptd\": \"PTD\",\n        \"ptislands\": \"ptislands\",\n        \"public planet\": \"ぱぶりっくぷらねっと\",\n        \"pucchies\": \"ぷっち~ず\",\n        \"pucchu\": \"ぷっちゅ\",\n        \"puchi momo club\": \"ぷちもも倶楽部\",\n        \"puchi parfait\": \"ぷちぱるふぇ\",\n        \"puchi-ya\": \"ぷち屋\",\n        \"pudding delices\": \"プディングデリス\",\n        \"pukupukumanbow\": \"PUKUPUKUMANBOW\",\n        \"pulin nabe\": \"PULIN Nabe\",\n        \"pulltop\": \"PULLTOP\",\n        \"pulltop latte\": \"PULLTOP LATTE\",\n        \"pulp sector\": \"パルプセクタ\",\n        \"pulpox\": \"Pulpox\",\n        \"pulupulu punch\": \"pulupulu punch\",\n        \"pumpkin\": \"ぱんぷきん\",\n        \"pumpkin freaks\": \"PUMPKIN FREAKS\",\n        \"puni puni kikaku\": \"ぷにぷに企画\",\n        \"puni-douraku\": \"ぷに道楽\",\n        \"puni-soft\": \"ぷにソフト\",\n        \"puniiyu\": \"ぷにいゆ\",\n        \"puniponya\": \"ぷにぽんや\",\n        \"punipuni doka-n\": \"ぷにぷにどか～ん♪\",\n        \"punipunikan\": \"ぷにぷに館\",\n        \"punisher punishment\": \"ぱにっしゃーぱにっしゅめんと\",\n        \"punyanica\": \"ぷにゃニカ\",\n        \"puppy biscuit\": \"ぱぴービスケット\",\n        \"puralinedou\": \"puraline堂\",\n        \"puratina no sakana\": \"プラチナのサカナ\",\n        \"pure cruel\": \"PureCruel\",\n        \"pure light\": \"ぴゅあらいと\",\n        \"pure more\": \"pure more\",\n        \"pure-liquid\": \"Pure-Liquid\",\n        \"purehime\": \"PUREHIME\",\n        \"pureskip\": \"PureSkip\",\n        \"pureslider\": \"PureSlider\",\n        \"purge\": \"purge\",\n        \"purgic i.m.o\": \"Purgic I.M.O\",\n        \"purikura\": \"プリクラ\",\n        \"purimomo\": \"ぷり桃\",\n        \"purin dou\": \"ぷりん堂\",\n        \"purin house\": \"ぷりんはうす\",\n        \"purin yokochou\": \"ぷりん横丁\",\n        \"purincho.\": \"ぷりんちょ。\",\n        \"puripoyo pudding\": \"ぷりぽょぷりん\",\n        \"purple dream\": \"パープルドリーム\",\n        \"purple haze\": \"PURPLE HAZE\",\n        \"purple kiss\": \"ぱーぷるきっす\",\n        \"purple sky\": \"パープルスカイ\",\n        \"purple software\": \"パープルソフトウェア\",\n        \"purpleclover\": \"PurpleClover\",\n        \"purumetal\": \"ぷるめたる\",\n        \"purupuru finale\": \"ぷるぷるフィナーレ!!\",\n        \"pururun\": \"ぷるるん\",\n        \"push pop\": \"ぷっしゅぽっぷ\",\n        \"pussy cat\": \"Pussy・CAT\",\n        \"pussy.cat seisaku iinkai\": \"Pussy・CAT制作委員会\",\n        \"pussymark\": \"Pussymark\",\n        \"puzzle74\": \"PUZZLE74\",\n        \"puzzlebox\": \"パズルボックス\",\n        \"px-real\": \"PX-REAL\",\n        \"pyonpyororin\": \"ぴょんぴょろりん\",\n        \"pyramid house\": \"ピラミッドハウス\",\n        \"q kikaku ankoku kiheidan\": \"Q企画暗黒奇兵団\",\n        \"q.o.n\": \"Q.O.N\",\n        \"qcumber\": \"QCUMBER\",\n        \"qlapz\": \"クラプス\",\n        \"qoobrand\": \"Qoobrand\",\n        \"qqq\": \"QQQ\",\n        \"qross\": \"QRoss\",\n        \"quad prime\": \"Quad Prime\",\n        \"qualia\": \"qualia\",\n        \"qualia cheese\": \"くおりあちーず\",\n        \"quarter.\": \"QUARTER.\",\n        \"quartierlatin\": \"カルチェラタン\",\n        \"quartzshow\": \"晶\",\n        \"quda\": \"Q.U.D.A.\",\n        \"queen of vanilla\": \"Queen Of VANILLA\",\n        \"queen soft\": \"クィーンソフト\",\n        \"question\": \"QUESTION?\",\n        \"quick kick lee\": \"Quick kick Lee\",\n        \"quintallagosta\": \"QuintalLagosta\",\n        \"quo vadis\": \"Quo Vadis\",\n        \"quotation\": \"Quotation\",\n        \"qureate\": \"qureate\",\n        \"r equals birth\": \"R=birth\",\n        \"r style\": \"R*style\",\n        \"r-blue\": \"R・blue\",\n        \"r-deco\": \"R-Deco\",\n        \"r-type nirvana\": \"R-Type Nirvana\",\n        \"r-works\": \"R-WORKS\",\n        \"r.a.n.software\": \"ランソフトウェア\",\n        \"r.c.i\": \"R.C.I\",\n        \"r.c.w.d\": \"R.c.W.d\",\n        \"r.e.c\": \"R.E.C\",\n        \"r.h.d\": \"R・H・D\",\n        \"r.i.s factory\": \"r.i.s factory\",\n        \"r.o.c\": \"R.O.C\",\n        \"r1\": \"r;1\",\n        \"r18\": \"R18\",\n        \"r2\": \"R2\",\n        \"r2a\": \"r2A\",\n        \"r55 kyouwakoku\": \"R55共和国\",\n        \"ra-raradan\": \"らーらら団\",\n        \"rabbit beat\": \"Rabbit Beat\",\n        \"rabbit company\": \"ラビットカンパニー\",\n        \"rabbit house\": \"ラビットハウス\",\n        \"rabbit hutch\": \"Rabbit Hutch\",\n        \"rabbit kuukan\": \"ラビット空間\",\n        \"rabbit sniper\": \"ラビットスナイパー\",\n        \"rabbit syndrome\": \"rabbit syndrome\",\n        \"rabbits\": \"らびっつ\",\n        \"rabbits foot\": \"ラビッツフット\",\n        \"raccoon\": \"ラクーン\",\n        \"ractica\": \"RACTICA\",\n        \"radial engine\": \"ラジアルエンジン\",\n        \"radiant slash h plus\": \"radiant/H+\",\n        \"radical dash\": \"RADICAL DASH\",\n        \"rafflesia\": \"らふれしあ\",\n        \"rafoguramu\": \"裸フォグラ夢\",\n        \"ragho\": \"らぐほ\",\n        \"rahue kojo\": \"らふ絵工場\",\n        \"raiden labo\": \"らいでんらぼ\",\n        \"raigekitai\": \"らいげきたい\",\n        \"raijinoh\": \"雷迅皇\",\n        \"raijuu shoujo\": \"雷獣少女\",\n        \"rain drop\": \"Rain*drop\",\n        \"rain rainbow\": \"Rain Rainbow\",\n        \"rain shot\": \"Rain Shot\",\n        \"rainbow cyc\": \"Rainbow Cyc\",\n        \"rainbow force\": \"RAINBOW FORCE\",\n        \"rairai rakuraku\": \"らいらいらくらく\",\n        \"raising staff\": \"Raising Staff\",\n        \"rakdo\": \"落童\",\n        \"rakka sokudo 2.5\": \"落下速度2.5\",\n        \"rakkasei\": \"ラッカセイ\",\n        \"rakubi\": \"楽日\",\n        \"rakuen koubou\": \"楽園工房\",\n        \"rakuen no sora\": \"楽園の空\",\n        \"rakuen tiramisu\": \"楽園ティラミス\",\n        \"rakugaki drops\": \"RAKUGAKI DROPS\",\n        \"rakugaki evo\": \"らくがきEVO\",\n        \"rakugaki ippentou\": \"らくがき一辺倒\",\n        \"rakugaki omochabako\": \"らくがきおもちゃばこ\",\n        \"rakugaki switch\": \"らくがきスイッチ\",\n        \"rakuichimonji\": \"楽一文字\",\n        \"rakukisa\": \"ラクキサ\",\n        \"rakutoa\": \"ラクトア\",\n        \"ramble cat\": \"Ramble Cat\",\n        \"rame\": \"ラメ\",\n        \"ramen half price 280 yen\": \"ラーメン半額280円\",\n        \"ramen rice\": \"らーめんらいす\",\n        \"rampancy\": \"Rampancy\",\n        \"rampant\": \"Rampant\",\n        \"ramubi koubou\": \"らむびー工房\",\n        \"ramune button\": \"ラムネボタン\",\n        \"random parts\": \"ランダムパーツ\",\n        \"ranmado\": \"乱馬堂\",\n        \"ranranpop\": \"らんらんぽっぷ\",\n        \"ranshi to kimi to.\": \"乱視と君と。\",\n        \"rapurando\": \"らぷらんど\",\n        \"rare okowa\": \"レアおこわ\",\n        \"rasa house\": \"らさはうす\",\n        \"rascou\": \"らすこう\",\n        \"rasen kyuuri\": \"螺旋きゅうり\",\n        \"rasinban\": \"Rasinban\",\n        \"rask\": \"RASK\",\n        \"raspberry\": \"Raspberry\",\n        \"raspberry galette\": \"raspberry galette\",\n        \"rat tail\": \"RAT TAIL\",\n        \"ratio1\": \"レシオ1\",\n        \"rauhreif\": \"ラウライフ\",\n        \"raving phantom\": \"RAVING PHANTOM\",\n        \"rayroh\": \"玲瓏\",\n        \"raytrec\": \"RAYTREC\",\n        \"razchoco\": \"RazChoco\",\n        \"rbooks\": \"rbooks\",\n        \"re clel\": \"Re_Clel\",\n        \"re cre at tors\": \"Re:Cre@tors\",\n        \"re set\": \"Re:Set\",\n        \"re-bidou\": \"Re-BI堂\",\n        \"re-fire\": \"リファイア\",\n        \"re-tale\": \"Re-tale\",\n        \"re-vival\": \"Re-vival\",\n        \"real\": \"real\",\n        \"reason\": \"Reason\",\n        \"rebecca\": \"REBECCA\",\n        \"rebirth\": \"rebirth\",\n        \"recaroya\": \"れかろ屋\",\n        \"recette\": \"Recette\",\n        \"rectorica\": \"Rectorica\",\n        \"red\": \"RED\",\n        \"red axis\": \"Red Axis\",\n        \"red bean milk tea\": \"小豆ミルクティー\",\n        \"red chuck\": \"レッドチャック\",\n        \"red delicious\": \"レッドデリシャス\",\n        \"red etude\": \"赤のエチュード\",\n        \"red label\": \"レッドレーベル\",\n        \"red paprika\": \"RED Paprika\",\n        \"red rebel\": \"レッドレベル\",\n        \"red ribbon\": \"RED RIBBON\",\n        \"red ribbon revenger\": \"RED RIBBON REVENGER\",\n        \"red x blue\": \"Red×Blue\",\n        \"red-uguisu\": \"RED-UGUISU\",\n        \"red-zone\": \"RED-ZONE\",\n        \"redbell\": \"れっどべる\",\n        \"reds\": \"Reds!\",\n        \"redsquid\": \"REDSQUID\",\n        \"ref\": \"ref\",\n        \"reflectia\": \"Reflectia\",\n        \"reflection\": \"リフレクション\",\n        \"regnenshower\": \"Regnenshower\",\n        \"regulus\": \"レグルス\",\n        \"rei no tokoro\": \"例の所\",\n        \"reien\": \"黎en\",\n        \"reika-doh\": \"麗華堂\",\n        \"reimonya\": \"礼門屋\",\n        \"reitou cafe terrace\": \"冷凍カフェテラス\",\n        \"rekka\": \"烈火\",\n        \"reku kuukan\": \"れく空間\",\n        \"rela factory\": \"Rela Factory\",\n        \"relpam\": \"りるぱむ\",\n        \"rem9\": \"REM9\",\n        \"remagi\": \"リメイジ\",\n        \"remationmade\": \"リメーションメイド\",\n        \"remnants\": \"Remnants\",\n        \"remonsan project\": \"Remonsan Project\",\n        \"remora field\": \"remora field\",\n        \"remora works\": \"remora works\",\n        \"remorse\": \"Remorse\",\n        \"ren\": \"Ren\",\n        \"ren-ai\": \"REN-AI\",\n        \"rena koubou\": \"レナ工房\",\n        \"renainou\": \"恋愛脳\",\n        \"rengeza\": \"蓮華座\",\n        \"rennyuu aquarium\": \"練乳アクアリウム\",\n        \"renrakumou ami doujin section\": \"連絡網ＡＭＩ同人セクション\",\n        \"renrendou\": \"漣々堂\",\n        \"rensei\": \"連星\",\n        \"rensougyo\": \"蓮双魚\",\n        \"rental senkan\": \"レンタル戦艦\",\n        \"renyaa hearts\": \"レンヤーハーツ\",\n        \"reparation\": \"レパラシオン\",\n        \"replicailia\": \"レプリカイリア\",\n        \"resemble blue\": \"Resemble Blue\",\n        \"resident of iii\": \"Resident of III\",\n        \"respect\": \"リスペクト\",\n        \"ressentiment\": \"ルさんちまん\",\n        \"retasuya\": \"れたす屋\",\n        \"retro star\": \"レトロスター\",\n        \"rev3\": \"Rev3\",\n        \"reverie\": \"REVERIE\",\n        \"revoeme\": \"れぼえめ\",\n        \"revorious\": \"RevoRious\",\n        \"rh\": \"あーるえいち\",\n        \"rh minus\": \"RHまいなす\",\n        \"rhein no mamori shoukai\": \"ラインの守り商会\",\n        \"ribbon super kikaku\": \"リボンスーパー企画\",\n        \"ribons nights\": \"リボーンズナイツ\",\n        \"riboshika unit\": \"Riboshika Unit\",\n        \"rice\": \"Rice\",\n        \"rice ball\": \"らいすぼ～る\",\n        \"ricecandy\": \"RiceCandy\",\n        \"ricering\": \"RiceRing\",\n        \"ricky-tick\": \"RICKY-TICK\",\n        \"rico project\": \"リコプロジェクト\",\n        \"riddle soft\": \"リドルソフト\",\n        \"rideshion\": \"りでしおん\",\n        \"riff-racket\": \"リフラケット\",\n        \"right hand\": \"ライトハンド\",\n        \"riki\": \"RIKI\",\n        \"rikomam\": \"RIKOMAM\",\n        \"rikudou juku\": \"六道塾\",\n        \"rikudoukan\": \"六道館\",\n        \"rikudouya\": \"六道屋\",\n        \"rima cafe\": \"Rima Cafe\",\n        \"rin\": \"RIN\",\n        \"rinarina\": \"RINARINA\",\n        \"rinfin\": \"りんふぃん\",\n        \"ring a bell\": \"リングアベル\",\n        \"ring memo\": \"Ring memo\",\n        \"ringo doumei\": \"りんご同盟\",\n        \"ringo koucha\": \"りんご紅茶\",\n        \"ringo no kisetsu.\": \"りんごの季節。\",\n        \"ringoya\": \"リンゴヤ\",\n        \"rinji party\": \"臨時PT\",\n        \"rinkandou\": \"輪漢堂\",\n        \"rinkichibu\": \"りんキチぶ\",\n        \"rinne\": \"りんね\",\n        \"rinnetensei\": \"輪廻転生\",\n        \"rinrin\": \"倫鈴\",\n        \"rio grande\": \"リオグランデ\",\n        \"ripel egg\": \"らいぷるえっぐ\",\n        \"rippadou\": \"立派堂\",\n        \"ripton sabo\": \"りぷとん☆茶房\",\n        \"ririadoll\": \"リリアドール\",\n        \"ririmat\": \"りりまっと\",\n        \"riroland\": \"RIROLAND\",\n        \"rising sun\": \"らいじんぐさん\",\n        \"risoukyou\": \"理ソウ郷\",\n        \"rissuinoti\": \"立錐之地\",\n        \"ritard.a2\": \"ritard.A2\",\n        \"rivajima\": \"リバ島\",\n        \"rix\": \"RIX\",\n        \"rizaru forest.\": \"リザルフォレスト。\",\n        \"rj\": \"RJ\",\n        \"rkaffy\": \"アールカフィ\",\n        \"rm kikaku\": \"RM企画\",\n        \"road\": \"ロード\",\n        \"road equals road\": \"Road=ロード=\",\n        \"road map\": \"Road map\",\n        \"road side roman\": \"Road Side Roman\",\n        \"roam\": \"roam\",\n        \"robayan no mori\": \"ロバヤンの森\",\n        \"robazoku\": \"ロバ族\",\n        \"robo ittetsu\": \"ロボ一徹\",\n        \"robo moe kenkyuujo\": \"ロボ萌え研究所\",\n        \"roboko teikoku\": \"ろぼこ帝国\",\n        \"rocca\": \"ROCCA\",\n        \"rock clime\": \"ROCK CLIME\",\n        \"rock steady\": \"ろっくすてでぃ\",\n        \"rocket kyoudai\": \"ロケット兄弟\",\n        \"rocket nenryou 21\": \"ロケット燃料★21\",\n        \"rockinchair\": \"ROCK`inChair\",\n        \"rocomani\": \"ろこまに\",\n        \"rocoroto\": \"ロコロト\",\n        \"rodeo\": \"■RODEO\",\n        \"rodiura.\": \"ろぢうら。\",\n        \"rohgun kyoh\": \"老眼郷\",\n        \"rojiko\": \"ロジコ\",\n        \"rojiura holic\": \"路地裏Holic\",\n        \"rojiura jack\": \"路地裏JACK\",\n        \"rojiurakinema\": \"路地裏キネマ\",\n        \"rokugatsu no kashiwamochi\": \"六月の柏餅\",\n        \"rokugatsu no reizouko\": \"六月の冷蔵庫\",\n        \"rokujinchuu\": \"六人柱\",\n        \"rokumen roppi\": \"ろくめん・ろっぴ\",\n        \"rokuroku sanjuuroku\": \"ロクロクサンジューロク\",\n        \"rokusyoku mikan\": \"緑色みかん\",\n        \"rollin thunder\": \"ろーりんさんだー\",\n        \"rolling box\": \"Rolling box\",\n        \"rolling haiena\": \"Rollingハイエナ\",\n        \"romantic london\": \"Romantic London\",\n        \"romantic ren-ai mode\": \"ロマンティック恋愛モード\",\n        \"romantic shinjuu\": \"浪漫的心中\",\n        \"romeo dash\": \"ROMEO DASH\",\n        \"ronpaia\": \"ろんぱいあ\",\n        \"room guarder\": \"ルームガーダー\",\n        \"room0016\": \"Room0016\",\n        \"rope island\": \"ろーぷあいらんど\",\n        \"roppongi shinjuu\": \"六本木神獣\",\n        \"rorerore-ya\": \"ろれろれ屋\",\n        \"rorioiru\": \"ろりおいる\",\n        \"roritora\": \"ロリとら!!\",\n        \"rorororomo\": \"ロロロロモ\",\n        \"rose liese\": \"Rose Liese\",\n        \"rose tiara\": \"ローズティアラ\",\n        \"rose water\": \"ROSE WATER\",\n        \"rosebud\": \"Rosebud\",\n        \"rosemarygarden\": \"RosemaryGarden\",\n        \"roshiman\": \"ろしまん\",\n        \"rotary engine\": \"ろ～たり～Engine\",\n        \"rotten apple\": \"ろってんあっぷる\",\n        \"roubai-tei\": \"狼狽亭\",\n        \"rouge\": \"ルージュ\",\n        \"rough love\": \"ラフラブ\",\n        \"round-house\": \"ROUND-HOUSE\",\n        \"round-o\": \"round-O\",\n        \"rouseiya\": \"狼星屋\",\n        \"route08\": \"ROUTE08\",\n        \"royal\": \"ROYAL\",\n        \"royal crown\": \"ROYAL CROWN\",\n        \"royal maya\": \"Royal Maya\",\n        \"royal moon\": \"Royal Moon\",\n        \"royal.s\": \"ロイヤル・S\",\n        \"royalwatts\": \"ROYALWATTS\",\n        \"rr kenkyuukai\": \"RR研究会\",\n        \"rro\": \"RRO\",\n        \"rrr\": \"RRR\",\n        \"rsag\": \"RSAG\",\n        \"ru-vic\": \"RU-VIC\",\n        \"rubber cup boys\": \"ラバーカップボーイズ\",\n        \"rubbish selecting squad\": \"RUBBISH選別隊\",\n        \"rubens tinctura\": \"Rubens Tinctura\",\n        \"rubicon\": \"ルビコン\",\n        \"ruby eye\": \"Ruby Eye\",\n        \"ruby fruit\": \"RUBY FRUIT\",\n        \"ruf\": \"ruf\",\n        \"ruikotsu\": \"泪骨\",\n        \"ruki ruki exiss\": \"るきるきEXISS\",\n        \"rukruk\": \"RukRuk\",\n        \"ruler shot\": \"Ruler Shot\",\n        \"rumbling heart\": \"らんぶりんぐはあと\",\n        \"rune\": \"ルーン\",\n        \"runner bean\": \"runner bean\",\n        \"runway\": \"Runway\",\n        \"rupinasu touzokudan\": \"るぴなす盗賊団\",\n        \"ruri ringo\": \"瑠璃りんご\",\n        \"ruruna and nimunimu\": \"るるな＆にむにむ\",\n        \"rururairai\": \"縷々来来\",\n        \"rush\": \"RUSH\",\n        \"rush rise line\": \"Rush Rise Line\",\n        \"rushimaru dou\": \"るしまる堂\",\n        \"russia cake\": \"Russia cake\",\n        \"russian neko\": \"ロシアン猫\",\n        \"russiapan\": \"ロシアパン\",\n        \"rustic house\": \"RUSTIC HOUSE\",\n        \"rxr renmei\": \"あるある連盟\",\n        \"ryanhan shibari\": \"二飜縛り\",\n        \"rycanthropy\": \"RYCANTHROPY\",\n        \"ryokucha combo\": \"緑茶コンボ\",\n        \"ryonas station\": \"Ryona's Station\",\n        \"ryoujoku kagekidan\": \"陵辱過激団\",\n        \"ryousangata ponyta\": \"量産型ポニテ\",\n        \"ryu no abara\": \"りゅうのあばら\",\n        \"ryujya dou\": \"竜蛇道\",\n        \"ryuknigthia\": \"リュナイティア\",\n        \"ryuu no yadorigitei\": \"竜の宿り木亭\",\n        \"ryuukisha\": \"隆起社\",\n        \"ryuukotsusan\": \"龍骨山\",\n        \"ryuukuujou\": \"竜宮城\",\n        \"ryuuryokukakou.\": \"りゅうりょくかこう。\",\n        \"ryuusei koubou\": \"流星工房\",\n        \"ryuushikei\": \"粒子系\",\n        \"ryuutai rikigaku\": \"流体力学\",\n        \"ryuutai urinal\": \"流体ユリナアル\",\n        \"s shoten\": \"エス書店\",\n        \"s-14\": \"S-14\",\n        \"s-core\": \"S-Core\",\n        \"s-flake\": \"S-FLAKE\",\n        \"s-force\": \"S-FORCE\",\n        \"s-g.h.\": \"S-G.H.\",\n        \"s-ram\": \"S-Ram\",\n        \"s.\": \"S.\",\n        \"s.c.c.\": \"S.C.C\",\n        \"s.d.works\": \"S・D・Works\",\n        \"s.k.\": \"S.K\",\n        \"s.n.l\": \"S.N.L\",\n        \"s.s.l\": \"S.S.L\",\n        \"saba down\": \"鯖DOWN\",\n        \"sabai shuppan\": \"さばーい出版\",\n        \"sabakunosakura\": \"サバクノサクラ\",\n        \"sabamiso\": \"さばみそ\",\n        \"saberfish\": \"セイバーフィッシュ\",\n        \"sabo-p\": \"SABO-P\",\n        \"saboriguse syndrome\": \"サボリ癖症候群\",\n        \"saboten\": \"サボテン\",\n        \"saboten binta\": \"サボテンビンタ\",\n        \"saboten sankaku\": \"サボテンさんかく\",\n        \"saboten-dou honpo\": \"仙人掌堂本舗\",\n        \"sabusukatchi\": \"サブスカッチ\",\n        \"sadakichi-tei\": \"定吉亭\",\n        \"sadakichidou\": \"定吉堂\",\n        \"sadistic alice\": \"Sadistic Alice\",\n        \"sadistic green\": \"SADISTIC GREEN\",\n        \"sadistic mary\": \"SADISTIC MARY\",\n        \"sae\": \"冴\",\n        \"safire\": \"SAFIRE\",\n        \"saga angel\": \"SAGA Angel\",\n        \"sagamani.\": \"サガマニ。\",\n        \"sagano line\": \"さがのせん\",\n        \"sage\": \"Sage\",\n        \"saicoro chick\": \"サイコロちっく\",\n        \"saigo made anko tappuri\": \"最後まであんこたっぷり\",\n        \"saigo no rakuen -the perfect world-\": \"最後の楽園-the perfect world-\",\n        \"saihate\": \"最果て\",\n        \"saikaihatsu\": \"催開発\",\n        \"saikasou seiteki shoudou kenkyuukai\": \"最下層性的衝動研究会\",\n        \"saikawa youzyo\": \"さぃヵゎ♡ょぅι゛ょ\",\n        \"saiki industrial\": \"佐伯重工\",\n        \"saiko smiling show\": \"サイコすまいりんぐショウ\",\n        \"saikyo gakuen\": \"最強学園\",\n        \"sail-ring on\": \"Sail-ring on\",\n        \"sailor q2\": \"SAILOR Q2\",\n        \"saimin sushiya\": \"催眠すし屋\",\n        \"sainometei\": \"賽の目亭\",\n        \"saint seiya\": \"聖性屋\",\n        \"saipin\": \"さいピン\",\n        \"sairo publishing\": \"豺狼出版\",\n        \"saisons\": \"SaiSonS\",\n        \"saita tsuushin\": \"才田通信\",\n        \"saitei no butagoya\": \"最低の豚小屋\",\n        \"saito-penguin\": \"西東ペンギン\",\n        \"saitou satou\": \"斎藤さとー\",\n        \"saitou teikoku\": \"齋藤帝國\",\n        \"saitoukai\": \"斉藤会\",\n        \"saitouya\": \"斎藤屋\",\n        \"saka muke\": \"さか☆むけ\",\n        \"sakaiya\": \"境屋\",\n        \"sakamusiya\": \"さかむし屋\",\n        \"sakanahen\": \"サカナヘン\",\n        \"sakasadorirakka\": \"逆さ鳥落下\",\n        \"sakasama clover\": \"さかさまクローバー\",\n        \"sakazuki-tei\": \"さかずき亭\",\n        \"sakeitiba\": \"サケ市場\",\n        \"sake no sanran\": \"鮭の産卵\",\n        \"sakekan memorial\": \"鮭缶メモリアル\",\n        \"saketanuki no kakushigura\": \"酒たぬきの隠し蔵\",\n        \"saketoba meshi\": \"鮭とば飯\",\n        \"sakiyama bakufu\": \"sakiyama幕府\",\n        \"sakomicho\": \"さこみちょ\",\n        \"sakotsu no kuni\": \"鎖骨ノ国\",\n        \"saku saku circle\": \"さくさくさーくる\",\n        \"sakuko seisakusho\": \"作呼製作所\",\n        \"sakumaya\": \"さくま屋\",\n        \"sakura garden\": \"さくらがーでん\",\n        \"sakura koubou\": \"さくら工房\",\n        \"sakura mochi\": \"桜餅\",\n        \"sakura no hanabira\": \"桜の花びら\",\n        \"sakura prin\": \"さくらぷりん\",\n        \"sakura zensen\": \"さくら前線\",\n        \"sakuraen\": \"櫻園\",\n        \"sakurai dai energy\": \"櫻井台エネルギー\",\n        \"sakurairo etranger\": \"桜色エトランゼ\",\n        \"sakuraito\": \"サクライト\",\n        \"sakurakan\": \"さくら缶\",\n        \"sakurako\": \"さくら庫\",\n        \"sakurakusa\": \"サクラクサ\",\n        \"sakuraminto\": \"桜眠都\",\n        \"sakuramochi\": \"さくらもち\",\n        \"sakuramouse\": \"SAKURAMOUSE\",\n        \"sakuranbo\": \"桜桃\",\n        \"sakuranbo little\": \"さくらんぼりとる\",\n        \"sakurapink\": \"sakuraPINK\",\n        \"sakurasake\": \"桜鮭\",\n        \"sakurasaku koubou\": \"桜咲く工房\",\n        \"sakurautage\": \"櫻宴\",\n        \"sakurawhite\": \"SAKURAWHITE\",\n        \"sakuraya\": \"SAKURAYA\",\n        \"sakurazuki\": \"桜月\",\n        \"sakuri uchuu model\": \"サクリ宇宙モデル\",\n        \"sakusaku kangen noushuku\": \"サクサク還元濃縮\",\n        \"sakusakusakuchan\": \"さくさくさくちゃん\",\n        \"sakuya no hakoniwa\": \"昨夜の箱庭\",\n        \"sakuya17sai\": \"咲耶17歳\",\n        \"sakyuu\": \"砂丘\",\n        \"salad abura\": \"サラダ油\",\n        \"salmon daisuki club\": \"サーモンだいすきクラブ\",\n        \"salt peanuts\": \"Salt Peanuts\",\n        \"salvage kouboh\": \"サルヴェージ工房\",\n        \"samalimi\": \"samalimi\",\n        \"sameno soft cream\": \"鮫野ソフトクリーム\",\n        \"samgyetang\": \"サムゲタン\",\n        \"samonaberu\": \"サモナベール\",\n        \"samugakupetti\": \"SGPT\",\n        \"samurai\": \"侍\",\n        \"samurai shipmaru\": \"さむらいシップ丸\",\n        \"sunora\": \"さんおれ\",\n        \"sana house\": \"Sana House\",\n        \"sanazura doujinshi hakkoujo\": \"さなづら同人誌発行所\",\n        \"sanb.\": \"さんびー。\",\n        \"sanbai kaiouken\": \"3倍界王軒\",\n        \"sanban yashiki\": \"三番屋敷\",\n        \"sanchi chokusou maguro dan\": \"産地直送マグロ団\",\n        \"sancho panda\": \"さんちょぱんだ\",\n        \"sandal nyan\": \"サンダルニャン\",\n        \"sandansu\": \"sandansu\",\n        \"sandglass\": \"sandglass\",\n        \"sangatsu no lion\": \"三月のライオン\",\n        \"sangatsu no osakai\": \"三月のお茶会\",\n        \"sangenkaidou\": \"三弦回胴\",\n        \"sangenshokudou\": \"三原色堂\",\n        \"sangeriya\": \"サンゲリ屋\",\n        \"sangria\": \"さんぐりあ\",\n        \"sangria kyuuden\": \"サングリア宮殿\",\n        \"sankaku apron\": \"さんかくエプロン\",\n        \"sankaku doumei\": \"さんかく同盟\",\n        \"sanketsushuu\": \"酸欠集\",\n        \"sankyaku rasen\": \"三脚ラセン\",\n        \"sannyuutei\": \"三乳亭\",\n        \"sanolemoon\": \"Sanolemoon\",\n        \"sanryuu club\": \"三流倶楽部\",\n        \"sanryuu kaigishitsu\": \"三流会議室\",\n        \"sansei biyori\": \"賛成日和\",\n        \"sanshodou\": \"山椒堂\",\n        \"sansui\": \"泉泉泉\",\n        \"sansuisha\": \"散水社\",\n        \"santa fe radio\": \"Santa Fe Radio\",\n        \"santarose\": \"サンタローズ\",\n        \"santonana\": \"サントナナ\",\n        \"sanukiya\": \"讃岐屋\",\n        \"sanyongo\": \"三四五\",\n        \"sanzoku no uta\": \"山賊の唄\",\n        \"saomako\": \"さおまこ\",\n        \"saotome-laboratory\": \"早乙女けんきゅう所\",\n        \"saperon black\": \"さぺろんブラック\",\n        \"sardnix\": \"サードニックス\",\n        \"sardonyx\": \"sardonyx\",\n        \"sarfatation\": \"sarfatation\",\n        \"sark\": \"SARK\",\n        \"sarobetsu ginga\": \"サロベツ銀河\",\n        \"sarpaccio\": \"サルパッチョ\",\n        \"sartaiz\": \"さぁたいず\",\n        \"sarurururu\": \"サルルルル\",\n        \"sasa chaya\": \"ささ茶屋\",\n        \"sasainamono\": \"ささいなもの\",\n        \"sasakama box\": \"笹かまボックス\",\n        \"sasaki maru\": \"ささきまる\",\n        \"sasaki muu shouten\": \"佐々木無宇商店\",\n        \"sasaki yasiki\": \"佐々木屋敷\",\n        \"sasami no maruyaki\": \"ささみの丸焼き\",\n        \"sasanoha toro\": \"笹乃葉とろ\",\n        \"sasha forest\": \"サーシア・フォレスト\",\n        \"sashimi choco\": \"さしみチョコ\",\n        \"sashimi no wife\": \"サシミノワイフ\",\n        \"sasumata seven\": \"さすまたせぶん\",\n        \"sasurai no manbou\": \"さすらいのマン棒\",\n        \"sata cleaning\": \"さたクリーニング\",\n        \"satei\": \"砂亭\",\n        \"satellite na spark\": \"サテライトなスパーク\",\n        \"satellites\": \"Satellites\",\n        \"sato samitt\": \"サトサミット\",\n        \"satoimo bokujou\": \"さといも牧場\",\n        \"satomachine.\": \"satomachine.\",\n        \"satooya\": \"さとうや\",\n        \"satori gozen\": \"悟リ御膳\",\n        \"satou furo\": \"砂糖風呂\",\n        \"satou to shio\": \"砂糖と塩\",\n        \"satouseika\": \"サトウ製菓\",\n        \"satsukiimonet\": \"satsukiimonet\",\n        \"satsukinchi\": \"サツキん家\",\n        \"saturday night special\": \"Saturday Night Special\",\n        \"aurorasoft\": \"AuroraSoft\",\n        \"sausage koubou\": \"ソーセージ工房\",\n        \"savageland\": \"SavageLand\",\n        \"sawa chaya\": \"さわ茶屋\",\n        \"sawaraya shoten\": \"佐原屋書店\",\n        \"sayakata kouchakan\": \"さやかた紅茶館\",\n        \"sayonara hornet\": \"サヨナラホーネット\",\n        \"sayupot\": \"さゆぽっと\",\n        \"sayuu-hanten\": \"サユウハンテン\",\n        \"sazameki dori\": \"さざめき通り\",\n        \"sazanka no yado\": \"山茶花の宿\",\n        \"sazareito\": \"さざれいと\",\n        \"sbd\": \"SBD\",\n        \"sbi\": \"SBI\",\n        \"scale garden\": \"スケイルガーデン\",\n        \"scape alice\": \"Scape Alice\",\n        \"scarabe\": \"scarabe\",\n        \"scarlet beast\": \"Scarlet Beast\",\n        \"scarlet leaf\": \"Scarlet Leaf\",\n        \"schatz\": \"Schatz\",\n        \"schenkel union\": \"Schenkel Union\",\n        \"schoolzone\": \"schoolzone\",\n        \"schwarz libelle\": \"シュバルツ･リベレ\",\n        \"schwester\": \"しゅべすた\",\n        \"sco.labo\": \"SCO.LABO\",\n        \"score\": \"スコア\",\n        \"scotchy\": \"すこっちぃ\",\n        \"scp-mio slash\": \"SCP-MiO/\",\n        \"scramble yourouin\": \"スクランブル養老院\",\n        \"screaming dog\": \"Screaming DOG\",\n        \"scrotum\": \"scrotum\",\n        \"scrum hitori\": \"スクラムヒトリ\",\n        \"sddy\": \"SDDY\",\n        \"se-ri\": \"セーリ\",\n        \"seacloud\": \"SEACLOUD\",\n        \"seafox\": \"SeaFox\",\n        \"seamanz\": \"seamanz\",\n        \"search-light\": \"サーチライト\",\n        \"searchlight missing\": \"サーチライトミッシング\",\n        \"sebas\": \"sebas\",\n        \"sec44\": \"sec44\",\n        \"second color\": \"セカンドカラー\",\n        \"second point\": \"Second Point\",\n        \"secreder\": \"SECREDER\",\n        \"secret cure\": \"Secret Cure\",\n        \"secret dmain\": \"Secret Dmain\",\n        \"secret milk\": \"secret milk\",\n        \"secretgarden\": \"secretgarden\",\n        \"section-11\": \"SECTION-11\",\n        \"seduce\": \"SEDUCE\",\n        \"segue laboratory\": \"セグエラボラトリー\",\n        \"sei kuroneko kishidan\": \"聖クロネコ騎士団\",\n        \"seibunkaken\": \"性文化研\",\n        \"seigadou\": \"勢画堂\",\n        \"seigakukan\": \"性学館\",\n        \"seigi no chikubi\": \"正義のちくび\",\n        \"seigi no yakata\": \"セイギノヤカタ\",\n        \"seigou\": \"せいごう\",\n        \"seiheki master\": \"セイヘキマスター\",\n        \"seikan hitchhiker\": \"星間ヒッチハイカー\",\n        \"seikatsu seshishou\": \"性活窃視症\",\n        \"seikinkan\": \"星菫館\",\n        \"seinen shinshi doumei\": \"青年紳士同盟\",\n        \"seishimentai\": \"せいしめんたい\",\n        \"seishinkan eikyuu\": \"星神官永級\",\n        \"seisyun katsusand\": \"青春カツサンド\",\n        \"seisyun to strategy.\": \"青春と戦略。\",\n        \"seiteijin\": \"井庭人\",\n        \"seiwa kanmu\": \"せいわかんむ\",\n        \"seiyou tanka\": \"西洋短歌\",\n        \"seizousha\": \"性造社\",\n        \"sekai chizu wa chi no ato\": \"世界地図は血の跡\",\n        \"sekai kakumei club\": \"世界革命俱乐部\",\n        \"sekai no hate ni hanataba o.\": \"世界の果てに花束を。\",\n        \"sekai no tomizawa\": \"世界のTOMIZAWA\",\n        \"sekai saiko\": \"世界最古\",\n        \"seken no katasumi\": \"世間の片隅\",\n        \"sekichou\": \"赤蝶\",\n        \"sekidou nakama\": \"赤道仲間\",\n        \"sekigaiken\": \"赤外圏\",\n        \"sekilala\": \"せ・き・ら・ら\",\n        \"sekimen shoujo\": \"赤面少女\",\n        \"sekipan\": \"石板\",\n        \"sekishoku vanilla\": \"赤色バニラ\",\n        \"sekitan bukuro\": \"石炭袋\",\n        \"selen\": \"Selen\",\n        \"selene\": \"Selene\",\n        \"sem colon\": \"SEM;COLON\",\n        \"semakute kurai\": \"狭くて暗い\",\n        \"semedain g\": \"セメダインG\",\n        \"semimogura\": \"せみもぐら\",\n        \"sen\": \"煎\",\n        \"sen ka\": \"SEN_KA\",\n        \"sen.exe\": \"sen.exe\",\n        \"senarinko\": \"senarinko\",\n        \"senba kitchen\": \"船場きっちん\",\n        \"senbata rom\": \"せんばたROM\",\n        \"senbata-rom\": \"せんばたROM\",\n        \"senbon knock zadankai\": \"千本ノック座談会\",\n        \"senbunritsu\": \"千分率\",\n        \"sendankaisen\": \"千段櫂船\",\n        \"sengoku joketsu emaki\": \"戦国女傑絵巻\",\n        \"seniman kartun\": \"セニマンカルタン\",\n        \"senju\": \"千寿\",\n        \"senkou campanella\": \"閃光カンパネラ\",\n        \"senmatu-chaya\": \"千松茶屋\",\n        \"sennen comodo\": \"千年コモド\",\n        \"sennen ookami\": \"千年狼\",\n        \"sennohi.\": \"センノヒ.\",\n        \"senri no dou\": \"千里ノ洞\",\n        \"sentou kaiiki\": \"戦闘海域\",\n        \"sentou yousei\": \"仙桃妖星\",\n        \"senya sabou\": \"千夜茶房\",\n        \"senyen\": \"SENYEN\",\n        \"senzendou\": \"仙々堂\",\n        \"sepia\": \"SEPIA\",\n        \"sepia concerto\": \"セピアコンチェルト\",\n        \"sequence\": \"し～くえんす\",\n        \"sequence breaker\": \"シークエンスブレイカー\",\n        \"seraphim\": \"せらぴん\",\n        \"serenta\": \"Serenta\",\n        \"serious graphics\": \"serious graphics\",\n        \"sero-sero\": \"SERO-SERO\",\n        \"service boy\": \"SERVICE BOY\",\n        \"sesame\": \"セサミ\",\n        \"seseragi no machikado\": \"せせらぎの街角\",\n        \"sesso minus\": \"節操マイナス\",\n        \"setouchi pharm\": \"瀬戸内製薬\",\n        \"setsugetsuka\": \"雪月花\",\n        \"setsunasamidare\": \"せつなさみだれ\",\n        \"seven gods\": \"SEVEN GODS!\",\n        \"seven sea star\": \"SEVEN SEA STAR\",\n        \"seven wonder\": \"SEVEN WONDER\",\n        \"sevens magajin\": \"セブンズマガジン\",\n        \"seventh heaven\": \"SEVENTH HEAVEN\",\n        \"sevirey\": \"セビレィ\",\n        \"sexpet project j\": \"sexpet project J\",\n        \"sextant\": \"SEXTANT\",\n        \"sf-l\": \"SF-L\",\n        \"sg\": \"SG\",\n        \"sgsix\": \"SGsix\",\n        \"shadow garden\": \"Shadow Garden\",\n        \"shadow sorceress communication protocol\": \"影法師通訊協定\",\n        \"shagbase\": \"Shadbase\",\n        \"shagwell\": \"SHAGWELL\",\n        \"shakestyle\": \"shakestyle\",\n        \"shallow sleep plus plus\": \"Shallow Sleep++\",\n        \"shamontei\": \"沙門亭\",\n        \"shamrock.\": \"Shamrock.\",\n        \"shan maryland\": \"シャンメリーランド\",\n        \"shanghai honey bee\": \"上海蜜蜂\",\n        \"shangrila\": \"シャングリラ\",\n        \"shanhai kaijou koushi\": \"上海海上公司\",\n        \"sharuru hunter\": \"シャルルハンター\",\n        \"shay-cone\": \"SHAY-CONE\",\n        \"sheep cat\": \"しーぷきゃっと\",\n        \"sheepcloud\": \"SHEEPCLOUD\",\n        \"sherbet soft\": \"シャーベットソフト\",\n        \"shi shi shijimi\": \"SHI SHI しじみ\",\n        \"shi-kugakari saru\": \"飼育係さる\",\n        \"shian\": \"紫庵\",\n        \"shiashiya\": \"しあし屋\",\n        \"shiawase kanmiryou\": \"しあわせ甘味料\",\n        \"shiawase kyouwakoku\": \"幸せ共和国\",\n        \"shiawase manjuu\": \"しあわせまんじゅう\",\n        \"shiawase pudding dou\": \"しあわせプリン堂\",\n        \"shibafu cement\": \"芝生セメント\",\n        \"shibaneko hungry\": \"芝猫はんぐりー!\",\n        \"shibou suitei jikoku\": \"志望推定時刻\",\n        \"shibubu shibubushi\": \"しぶぶしぶぶし\",\n        \"shichirin taisha\": \"七輪大社\",\n        \"shichiyou\": \"七陽\",\n        \"shichiyou souryuujin\": \"七曜蒼龍陣\",\n        \"shigaraki ceramic\": \"シガラキセラミック\",\n        \"shigunyan\": \"しぐにゃん\",\n        \"shigure ebi\": \"しぐれえび\",\n        \"shigureya\": \"しぐれや\",\n        \"shihai shoujo\": \"支配少女\",\n        \"shiina club\": \"しいなくらぶ\",\n        \"shiinotomoshibitake\": \"しいのともしびたけ\",\n        \"shiitake\": \"椎茸\",\n        \"shijima\": \"しじま\",\n        \"shijou misaki\": \"紙上岬\",\n        \"shikaku to sankaku\": \"しかくとさんかく\",\n        \"shiki hanana\": \"紫木はなな\",\n        \"shikibu\": \"式部\",\n        \"shikimisan keiro\": \"シキミ酸経路\",\n        \"shikioriori\": \"シキオリオリ\",\n        \"shikitenshi\": \"色天使\",\n        \"shikkoku no hekireki\": \"漆黒の霹靂\",\n        \"shikkoku no tsubasa\": \"漆黒の翼\",\n        \"shikkoku no voltecker\": \"漆黒のボルテッカー\",\n        \"shikkokuno j.p.s.\": \"漆黒のJ.P.S.\",\n        \"shiko neru mix\": \"シコ寝るミックス\",\n        \"shikunikiwa\": \"しくにきわ\",\n        \"shima hitsuji\": \"しまひつじ\",\n        \"shima kneesocks tayoutai\": \"縞ニーソックス多様体\",\n        \"shimane no inugoya\": \"島根の犬小屋\",\n        \"shimanto seiryuu\": \"四万十清流\",\n        \"shimapanicecandy\": \"しまぱんアイスキャンディー\",\n        \"shimarisutei\": \"しまりす亭\",\n        \"shimashima stripe\": \"しましますとらいぷ\",\n        \"shimashima-pnt\": \"しましまPNT\",\n        \"shimeji777\": \"Shimeji777\",\n        \"shimekiri sanpunmae\": \"〆切り3分前\",\n        \"shimerike\": \"シメリケ\",\n        \"shimoboard\": \"シモボード\",\n        \"shimoda nekomaru\": \"霜田猫丸\",\n        \"shimofuri green meat\": \"しもふりグリーンミート\",\n        \"shimofuritei\": \"霜降亭\",\n        \"shimofutaketa zorome\": \"下二桁ぞろ目\",\n        \"shimokuniya\": \"シモクニヤ\",\n        \"shimotarou\": \"下太郎\",\n        \"shin-chan carnival\": \"Shin-Chan Carnival !?\",\n        \"shinachiku castella\": \"しなちくかすてぃーら\",\n        \"shinanoya\": \"信濃屋\",\n        \"shinba oolong cha\": \"神葉烏龍茶\",\n        \"shinchara\": \"しんきゃら\",\n        \"shinderarejou\": \"しんでられ城\",\n        \"shine nabyss\": \"シャイン・ナビス\",\n        \"shine no syoujyo\": \"シャインの少女\",\n        \"shinimonogurui\": \"しにものぐるい\",\n        \"shining\": \"SHINING\",\n        \"shining star\": \"Shining Star\",\n        \"shinjae iinkai\": \"死んじゃえ委員会\",\n        \"shinjuku koma gekijou\": \"新宿狛劇場\",\n        \"shinkai\": \"深海\",\n        \"shinkai hikou\": \"深海飛行\",\n        \"shinkai saboten\": \"深海サボテン\",\n        \"shinkai seizu\": \"深海星図\",\n        \"shinkan ochimashita\": \"新刊堕ちました\",\n        \"niitakayama tozantai\": \"新高山登山队\",\n        \"shinkuraiku\": \"しんくらいく\",\n        \"shinmichikai\": \"真道会\",\n        \"shinnihon pepsitou\": \"新日本ペプシ党\",\n        \"shinobi no yakata\": \"忍ノ館\",\n        \"shinobi rocket\": \"シノビロケット\",\n        \"shinohara heavy industry\": \"篠原重工営業部\",\n        \"shinpakusu teika\": \"心拍数低下\",\n        \"shinsei shoujo nyuugyou\": \"神聖少女乳業\",\n        \"shinsekai manga kenkyuukai\": \"新世界漫画研究会\",\n        \"shinsen gokuraku\": \"新鮮極楽\",\n        \"shinshi zaibatsu\": \"紳士財閥\",\n        \"shinshunshantonshou\": \"新春山東省\",\n        \"shiodome project\": \"汐留project\",\n        \"shiohama\": \"SHIOHAMA\",\n        \"shioji\": \"しおじ\",\n        \"shionoya\": \"しおのや\",\n        \"shiotsuki suien\": \"汐月水園\",\n        \"shioya\": \"塩屋\",\n        \"shioya abu tsuushin\": \"塩屋虻通信\",\n        \"sioyaki\": \"しおやき\",\n        \"sioyude\": \"しおゆで\",\n        \"shippo banchou\": \"しっぽ番長\",\n        \"shippuudotou\": \"疾風怒濤\",\n        \"shirakaba doori\": \"白樺通り\",\n        \"shiraki no kobeya\": \"白木の小部屋\",\n        \"shiranai ouchi\": \"しらないおうち\",\n        \"shirasagisou\": \"しらさぎ荘\",\n        \"shirasu an\": \"しらす庵\",\n        \"shirasugayu\": \"白子粥\",\n        \"shiratama\": \"しらたま\",\n        \"shiratamarch\": \"しらたまーち\",\n        \"shirayuki shoujodan\": \"白雪少女団\",\n        \"shirikageru taberu\": \"シリカゲルタベル\",\n        \"shiritsu sakuranbo shougakkou\": \"私立さくらんぼ小学校\",\n        \"shiro anmitsu\": \"しろあんみつ\",\n        \"shiro gas koujou\": \"白瓦斯工場\",\n        \"shiro kuro soft\": \"シロクロソフト\",\n        \"shiro no kigen\": \"白の起源\",\n        \"shiroboshi koubou\": \"白星工房\",\n        \"shiroganean\": \"白金庵\",\n        \"shiroi famicon\": \"しろいファミコン\",\n        \"shiroi kitsune no sumu yashiro\": \"白い狐の住む社\",\n        \"shiroi shinoshino\": \"しろいしのしの\",\n        \"shiroi tentoumushi\": \"白い天道虫\",\n        \"shiroi yami\": \"白い闇\",\n        \"shiroino.\": \"白いの。\",\n        \"shiroiro\": \"しろいろ\",\n        \"shiroiro ribbon\": \"しろ色りぼん\",\n        \"shirojia\": \"シロジア\",\n        \"shirokarasuya\": \"白からす屋\",\n        \"shirokuro panda\": \"白黒ぱんだ\",\n        \"shirokurofuurinkou\": \"しろくろ風鈴刻\",\n        \"shirokyuuketsuki\": \"白吸血鬼\",\n        \"shiromitsu nyuugyou\": \"白蜜乳業\",\n        \"shiromitsuya\": \"しろみつ屋\",\n        \"shironegiya\": \"白ネギ屋\",\n        \"shironeko ichizoku\": \"白猫一族\",\n        \"shirorika\": \"シロリカ\",\n        \"shirotsumekusa\": \"シロツメクサ\",\n        \"shis laboratory\": \"SHi's Laboratory\",\n        \"shishamo house\": \"ししゃもハウス\",\n        \"shishamo teikoku\": \"ししゃも帝国\",\n        \"shishamotei\": \"ししゃも亭\",\n        \"shishigami\": \"ししがみ\",\n        \"shishimaruya\": \"獅子丸屋\",\n        \"shishunki\": \"思春棄\",\n        \"shishunki paradigm\": \"思春期パラダイム\",\n        \"shisshin chuudoku\": \"失神中毒\",\n        \"shitsuji no kumaana\": \"シツジノクマアナ\",\n        \"shiwodou.\": \"しを堂。\",\n        \"shiya\": \"志屋\",\n        \"shiyou kougen\": \"四葉弘彦\",\n        \"shiyouka.\": \"しようか。\",\n        \"shizendou\": \"四然堂\",\n        \"shizuka no umi\": \"静香の海\",\n        \"shizuoka kakusei shoujo\": \"静岡覚醒少女\",\n        \"shm\": \"SHM\",\n        \"shobocon\": \"しょぼコン\",\n        \"shocoratie\": \"ショコラティエ!\",\n        \"shokkakuya\": \"食客屋\",\n        \"shokumu taiman\": \"職務タイマン\",\n        \"shokushu mind\": \"触手mind\",\n        \"shokuzai\": \"贖罪\",\n        \"shonen shojo tai\": \"少年少女隊\",\n        \"shonnaka-dou\": \"しょんなか堂\",\n        \"shore\": \"ショアー\",\n        \"shosekido\": \"硝石堂\",\n        \"shoshi magazine hitori\": \"書肆マガジンひとり\",\n        \"shoshinsha crossover\": \"初心者クロスオーバー\",\n        \"shota scratch jikkou iinkai\": \"スクラッチ実行委員会\",\n        \"shotafes junbikai\": \"ショタフェス準備会\",\n        \"shoudansha\": \"笑談者\",\n        \"shouga udon\": \"枯葉\",\n        \"shoujo aigan club\": \"少女愛玩倶楽部\",\n        \"shoujo ex\": \"少女EX\",\n        \"shoujo idenshi\": \"少女遺伝子\",\n        \"shoujo kaihatsu shitsu\": \"少女開発室\",\n        \"shoujo katharsis.\": \"少女カタルシス。\",\n        \"shoujo kousaku\": \"少女交錯\",\n        \"shoujo no dangan\": \"少女の弾丸\",\n        \"shoujo no mori\": \"少女の杜\",\n        \"shoujo no youni\": \"少女のように\",\n        \"shoujo seiyaku\": \"少女製薬\",\n        \"shoujo shumi.\": \"少女趣味。\",\n        \"shoujo zukin\": \"少女頭巾\",\n        \"shounan oshinobi club\": \"湘南おしのびCLUB\",\n        \"shounen byoukan\": \"少年病監\",\n        \"shounen x shoujo\": \"少年×少女\",\n        \"shounen yuuichirou\": \"少年ゆういちろう\",\n        \"shounen-h\": \"少年H\",\n        \"shounendan\": \"少年団\",\n        \"shounin eden\": \"聖人エデン\",\n        \"shouwa kara heisei e\": \"昭和から平成へ\",\n        \"shouwa prism\": \"昭和プリズム\",\n        \"showa saishuu sensen\": \"昭和最終戦線\",\n        \"shouyu gohan\": \"しょうゆごはん\",\n        \"syowajukou\": \"昭和重工\",\n        \"shrine\": \"SHRINE\",\n        \"shudoushiki denki jidousha\": \"手動式電気自動車\",\n        \"shukketsu kansatsu nikki\": \"出血観察日記\",\n        \"shumisen jiru\": \"シュミセンジル\",\n        \"shun shun shouten\": \"しゅん々商店\",\n        \"shungabu\": \"春画部\",\n        \"shuniku 2\": \"しゅにく2\",\n        \"shunran\": \"春蘭\",\n        \"shuraba keikaku\": \"修羅場計画\",\n        \"shuuchuugouu keihou\": \"集中豪雨警報\",\n        \"shuukan freaks\": \"収監フリークス\",\n        \"shuukyuu itsukasei\": \"週休五日制\",\n        \"shuusei patch 3gb\": \"修正パッチ3GB\",\n        \"shyness over drive\": \"SHYNESS OVER DRIVE\",\n        \"shyo chiku bai\": \"笑畜売\",\n        \"side buy side\": \"Side Buy Side\",\n        \"side m\": \"Side:M\",\n        \"side-a\": \"SIDE-A\",\n        \"sideoff\": \"サイドオフ\",\n        \"sigamitsuki mizuhiki\": \"しがみつきみずひき\",\n        \"sigma-plan\": \"∑-PLAN\",\n        \"sigmanica\": \"SIGMANICA\",\n        \"signal go\": \"SIGNaL_GO\",\n        \"signal group\": \"シグナルグループ\",\n        \"signalred\": \"SignalRed\",\n        \"signal yellow\": \"しぐなるいえろー\",\n        \"signares jigen\": \"シグナレス次元\",\n        \"signstandard\": \"サインスタンダード\",\n        \"sikosiko network\": \"SIKOSIKO NETWORK\",\n        \"sikouya\": \"試行屋\",\n        \"silent hill\": \"SILENT HILL\",\n        \"silent4\": \"サイレント4\",\n        \"silicon jichou\": \"シリコン自重\",\n        \"silky to yukai na nakama-tachi\": \"しるきーと愉快な仲間たち\",\n        \"silmaril\": \"しるまりる\",\n        \"silver bloom\": \"SILVER BLOOM\",\n        \"silver bullet\": \"Silver Bullet\",\n        \"silver way\": \"銀色宇宙(仮)\",\n        \"silverfox\": \"銀狐\",\n        \"silverrice\": \"シルバーライス\",\n        \"silverstone\": \"SilverStone\",\n        \"simasima system\": \"しましましすてむ\",\n        \"simfrill\": \"シンプリル\",\n        \"simokentarous\": \"しもケンタロス\",\n        \"simotsukekai\": \"下野会\",\n        \"simple house\": \"SIMPLE HOUSE\",\n        \"sin-maniax\": \"sin-maniax\",\n        \"singleton\": \"Singleton\",\n        \"sinistra\": \"シニストラ\",\n        \"sinizon\": \"SINIZON\",\n        \"sinkirou\": \"心輝楼\",\n        \"sinonome\": \"シノノメ\",\n        \"sinoriya\": \"しのり屋\",\n        \"sinosino\": \"しのしの\",\n        \"sion\": \"SION\",\n        \"siooninco\": \"塩おにんこ\",\n        \"siop\": \"単一統合作戦計画\",\n        \"sippo-soft\": \"SIPPO-SOFT\",\n        \"siratama nikukyuu\": \"しらたま肉球\",\n        \"siratamadon\": \"白玉井\",\n        \"sirius.\": \"SIRIUS.\",\n        \"sirojio\": \"白塩\",\n        \"siropome\": \"しろぽめ\",\n        \"sirotaruto\": \"しろたると\",\n        \"sirotateto\": \"しろたてと\",\n        \"sirousagicafe\": \"しろうさぎカフェ\",\n        \"sister screaming i die\": \"SISTER SCREAMING I DIE\",\n        \"sister soft\": \"しすたーそふと\",\n        \"sisui sisters\": \"しすいシスターズ\",\n        \"sittori oblaat\": \"しっとりオブラート\",\n        \"situation laboratory\": \"シチュラボ\",\n        \"sk01\": \"SK01\",\n        \"skeleton scape\": \"skeleton scape\",\n        \"sketch-book\": \"落描帳\",\n        \"skew\": \"SKEW\",\n        \"skirt tsuki\": \"スカートつき\",\n        \"sklabel\": \"SKlabel\",\n        \"skug\": \"SKUG\",\n        \"skunks\": \"スカンクス\",\n        \"sky daruton gyokuza\": \"天空怠豚玉座\",\n        \"sky lounge garden\": \"Sky Lounge Garden\",\n        \"sky walk\": \"Sky Walk\",\n        \"skycolours\": \"SkycolourS\",\n        \"skyworks\": \"SKYワークス\",\n        \"sl\": \"SL\",\n        \"slaman bokujou\": \"すらまん牧場\",\n        \"slamp\": \"すらんぷ\",\n        \"slap-stick\": \"スラップスティック\",\n        \"slapstickstrike\": \"SlapStickStrike\",\n        \"slavedoll\": \"SlaveDoll\",\n        \"slavenir\": \"スレイブニール\",\n        \"sledgehammerout\": \"SledgehammerOut!\",\n        \"sleeper\": \"Sleeper\",\n        \"sleeping helianthus\": \"Sleeping Helianthus\",\n        \"sleepwatch.ex\": \"寝ヲチEX\",\n        \"slice wakame\": \"スライスわかめ\",\n        \"slime eer\": \"スライムイール\",\n        \"slime mint\": \"すらいむみんと\",\n        \"slime teishoku\": \"スライム定食\",\n        \"slimy alpha\": \"スライミーアルファ\",\n        \"slip bounds\": \"Slip Bounds\",\n        \"sludge\": \"sludge\",\n        \"slump life\": \"すらんぷらいふ\",\n        \"slw\": \"SLW\",\n        \"small dog\": \"Small Dog\",\n        \"small gift\": \"Small Gift\",\n        \"smat.\": \"smat.\",\n        \"smocle\": \"smocle\",\n        \"smokin sick style\": \"Smokin' Sick Style\",\n        \"smooth\": \"smooth\",\n        \"sms\": \"SMS\",\n        \"smuggler\": \"SMUGGLER\",\n        \"smysle\": \"SMYSLE\",\n        \"snack factory\": \"スナック・ファクトリー\",\n        \"snack yoshie\": \"スナックよし江\",\n        \"snake foot\": \"Snake foot\",\n        \"sniff dogs\": \"Sniff Dogs\",\n        \"snob nerd works\": \"SNOB NERD WORKS\",\n        \"snow child\": \"Snow child\",\n        \"snow ice\": \"Snow Ice\",\n        \"snow ring\": \"Snow Ring\",\n        \"snowdance\": \"SNOWDANCE\",\n        \"snowgale\": \"SnowGale\",\n        \"snowrich\": \"すのーりっち\",\n        \"so much in luv\": \"sO mUCH iN LUV\",\n        \"so-matou\": \"そーま党\",\n        \"soar\": \"Soar\",\n        \"soba to mayo\": \"蕎麦とマヨ\",\n        \"soba udon\": \"そばうどん\",\n        \"sobabu\": \"蕎麦部\",\n        \"sobakara\": \"そばから\",\n        \"sobalabo\": \"sobalabo\",\n        \"sobaworks\": \"sobaworks\",\n        \"socarrat\": \"socarrat\",\n        \"soda batake\": \"苏打畑\",\n        \"soda rain\": \"Soda Rain\",\n        \"sodenosumi\": \"袖の墨\",\n        \"sodomutogomora\": \"ソドムトゴモラ\",\n        \"soft circle courreges\": \"ソフトさ～くるクレージュ\",\n        \"soft on omanko\": \"SOFT ON OMANKO\",\n        \"soft thigh\": \"Soft Thigh\",\n        \"soitsu wa yabee\": \"そいつはヤベェ!\",\n        \"soket equals pocket\": \"そけっと=ぽけっと\",\n        \"soko\": \"倉庫\",\n        \"sokotsuya baker\": \"粗忽屋ベイカー\",\n        \"sokuochi neurosis\": \"即堕ちノイローゼ\",\n        \"solala\": \"solala\",\n        \"solar milk soft\": \"そらみるソフト\",\n        \"solarray\": \"ソーラレイ\",\n        \"soleil\": \"Soleil\",\n        \"solex\": \"SOLEX\",\n        \"solid air\": \"SOLID AIR\",\n        \"soloistick\": \"ソリスティック\",\n        \"soloship\": \"ソロシップ\",\n        \"some leaves\": \"SOME LEAVES\",\n        \"somnia\": \"somnia\",\n        \"sondake.\": \"そんだけ。\",\n        \"sonei danchi\": \"村営団地\",\n        \"sonflower\": \"sonflower\",\n        \"sonic\": \"そにっく\",\n        \"sonic star\": \"SONIC STAR\",\n        \"sonic winter\": \"SONIC WINTER\",\n        \"sonnet\": \"Sonnet\",\n        \"sonograph\": \"sonograph\",\n        \"sonohigurashi\": \"その日ぐらし\",\n        \"sonotaozey\": \"その他大勢\",\n        \"sora mint\": \"ソラミント\",\n        \"sora no colors\": \"空のCOLORS\",\n        \"sora no sakura\": \"そらのさくら\",\n        \"sora osen nantai neko\": \"空汚染軟体猫\",\n        \"sora wa chimidoro\": \"空は血みどろ\",\n        \"sorabatake\": \"そらばたけ\",\n        \"soragokoro\": \"そらごころ\",\n        \"soragoto\": \"空言\",\n        \"sorahima\": \"そらひま\",\n        \"sorairo march\": \"空色まーち\",\n        \"sorairo panda\": \"空色パンダ\",\n        \"sorairo telephone\": \"ソライロテレフォン\",\n        \"soramimi\": \"そらみみ\",\n        \"soramune\": \"そらむね\",\n        \"sorasore\": \"そらそれ\",\n        \"soratobu mighty python\": \"空飛ぶマイティ・パイソン\",\n        \"soratobu umeboshi\": \"空飛ぶうめぼし\",\n        \"sorekara\": \"それから\",\n        \"soreya\": \"其レ屋\",\n        \"soronosanchi\": \"そろのさん家\",\n        \"sorudeia\": \"そるでいあ\",\n        \"soseidoh\": \"想成堂\",\n        \"sosl\": \"SOSL\",\n        \"sou soul\": \"Sou Soul\",\n        \"souchou bazooka\": \"早朝バズーカ\",\n        \"souchou no koubou\": \"曹長の工房\",\n        \"sougetsutei\": \"双月亭\",\n        \"souju\": \"蒼樹\",\n        \"souka sentou\": \"双花仙桃\",\n        \"soukai fusso\": \"蒼海☆フッ素\",\n        \"soukentyaya\": \"想見茶屋\",\n        \"souko\": \"倉庫\",\n        \"soukuu\": \"蒼空\",\n        \"soukyuutendou\": \"蒼穹天堂\",\n        \"soul magic\": \"そうるまぢっく\",\n        \"soulfly\": \"SOULFLY\",\n        \"soulsonic\": \"soulsonic\",\n        \"souma books\": \"SOUMA BOOKS\",\n        \"sound milk\": \"SOUND MILK\",\n        \"sounds good\": \"Sounds Good\",\n        \"soundvillage\": \"SoundVillage\",\n        \"sousaku sekkei benran\": \"創作設計便覧\",\n        \"souseiji\": \"創精児\",\n        \"southern blue sky\": \"サザンブルースカイ\",\n        \"souzai soft\": \"そうざいそふと\",\n        \"soy-darake\": \"SOYだらけ\",\n        \"soyoking\": \"ソヨキング\",\n        \"space baron\": \"宇宙男爵\",\n        \"space cat\": \"スペースキャット\",\n        \"space whale\": \"スペースくじら\",\n        \"special action force\": \"SPECIAL ACTION FORCE\",\n        \"speed\": \"SPEED\",\n        \"speed of sound\": \"Speed of Sound\",\n        \"spelflare\": \"すぺるふれあ\",\n        \"spellcaster.\": \"spellcaster.\",\n        \"spermagic\": \"スペルマジック\",\n        \"spermaniax\": \"スペルマニアックス\",\n        \"spermation\": \"スペルメーション\",\n        \"sphere garden\": \"SPHERE GARDEN\",\n        \"spica\": \"♡Spica\",\n        \"spicia\": \"すぱぃしあ\",\n        \"spiciacrow\": \"SpiciaCrow\",\n        \"spicy daisakusen\": \"スパイシー大作戦\",\n        \"spicy loves heaven\": \"スパイシーラブスヘブン\",\n        \"spiel\": \"spiel\",\n        \"spika07\": \"spika07\",\n        \"spinergy\": \"SPINERGY\",\n        \"spira mirabilis\": \"スピラ・ミラビリス\",\n        \"spiral\": \"すぱいらる\",\n        \"spirit-edge\": \"Spirit-Edge\",\n        \"splush wave\": \"SPLUSH WAVE\",\n        \"spongehead\": \"スポンジヘッド\",\n        \"spookyhouse\": \"spookyhouse\",\n        \"spread happiness\": \"Spread Happiness\",\n        \"sprechchor\": \"シュプレヒコール\",\n        \"spring castle\": \"spring castle\",\n        \"springlove\": \"SpringLOVE\",\n        \"sprinkler of calpis\": \"Sprinkler of かるぴす\",\n        \"sprout\": \"SPROUT\",\n        \"spt\": \"SPT\",\n        \"spunk\": \"Spunk!\",\n        \"sputnik\": \"すぷーとにく\",\n        \"spy\": \"SPY\",\n        \"squall\": \"Squall\",\n        \"sr inma no mori\": \"SR 淫魔ノ森\",\n        \"srats\": \"SRATS\",\n        \"ssb\": \"SSB\",\n        \"ssc\": \"SSC\",\n        \"ssdl\": \"SSDL\",\n        \"ssize\": \"Ssize\",\n        \"sst\": \"SST\",\n        \"st 3point\": \"St 3point\",\n        \"st. different\": \"St. Different\",\n        \"st. ochappa\": \"St.おちゃっぱ\",\n        \"st. rio\": \"聖＝リオ\",\n        \"staffing\": \"スタッフィング\",\n        \"stain.\": \"Stain.\",\n        \"stakhanovite movement\": \"スタハノフ運動\",\n        \"stametch\": \"STAMETCH!\",\n        \"stand erection\": \"スタンドエレクション\",\n        \"stand play\": \"STAND PLAY\",\n        \"star berry\": \"STAR BERRY\",\n        \"star fall\": \"STAR FALL\",\n        \"star parlor\": \"STAR PARLOR\",\n        \"stargazer\": \"STARGAZER\",\n        \"starlit sky\": \"Starlit Sky\",\n        \"starmine18\": \"Starmine18\",\n        \"starry sky\": \"Starry Sky\",\n        \"starworks\": \"STARWORKS\",\n        \"stasis\": \"ステイシス\",\n        \"state of see\": \"ステートオブシー\",\n        \"statice\": \"スターチス\",\n        \"status doku\": \"ステータスどく\",\n        \"stay gold\": \"STAY GOLD\",\n        \"steam bread factory\": \"すちーむぶれっどふぁくとりー\",\n        \"steel mayonnaise\": \"Steel Mayonnaise\",\n        \"steelact\": \"STEELACT\",\n        \"stellar\": \"STELLAR\",\n        \"stencil step\": \"ステンシルステップ\",\n        \"steppen wolf\": \"STEPPEN WOLF\",\n        \"stew ni gohan\": \"シチューにごはん\",\n        \"stick number\": \"ステック なんばー\",\n        \"still\": \"Still\",\n        \"stk\": \"STK\",\n        \"stm\": \"STM\",\n        \"stoic romance\": \"Stoic Romance\",\n        \"stone heads\": \"STONE HEADS\",\n        \"stonecake\": \"stonecake\",\n        \"stonemason\": \"stonemason\",\n        \"stop-ten\": \"STOP店\",\n        \"storm\": \"STORM\",\n        \"storm hammer\": \"STORM HAMMER\",\n        \"straight\": \"Straight\",\n        \"strand kyokusen gai\": \"ストランド曲線街\",\n        \"strange beast\": \"ストレンジビースト\",\n        \"strange coquetry\": \"ストレンジコケットリー\",\n        \"strange pop\": \"STRANGE POP\",\n        \"strangesagittarius\": \"StrangeSagittarius\",\n        \"stratos\": \"STRATOS\",\n        \"stratosphere\": \"ストラトスフィア\",\n        \"strawberry\": \"すとろべりー\",\n        \"strawberry and tea\": \"いちごと紅茶\",\n        \"strawberry nipple\": \"ストロベリーにっぷる\",\n        \"strawberry shower\": \"すとろべりーシャワー\",\n        \"straymoon\": \"StrayMoon\",\n        \"stream of creek\": \"STREAM OF CREEK\",\n        \"strega\": \"STREGA\",\n        \"stripe orange\": \"stripe orange\",\n        \"stripeg\": \"stripeg\",\n        \"stroll in the woods\": \"STROLL IN THE WOODS !! -森林浴-\",\n        \"strong7\": \"STRONG7\",\n        \"sts\": \"宇宙旅行協会\",\n        \"studio 7\": \"Studio 7\",\n        \"studio americ\": \"スタジオアメリック\",\n        \"studio anshin\": \"STUDIOあんしん\",\n        \"studio anteros\": \"スタジオ・アンテロス\",\n        \"studio aqa\": \"Studio AQA\",\n        \"studio awake\": \"スタジオ★アオーク\",\n        \"studio b9\": \"Studio B9\",\n        \"studio baki\": \"STUDIO BAKI\",\n        \"studio bass line\": \"STUDIO BASS LINE\",\n        \"studio berserk\": \"Studioベルセック\",\n        \"studio boto-master\": \"すたじおぼとますたあ\",\n        \"studio cardamom\": \"STUDIO カルダモン\",\n        \"studio charen\": \"すたじおちゃれん\",\n        \"studio claim\": \"STUDIO CLAIM\",\n        \"studio cute\": \"Studio Cute\",\n        \"studio d-suke\": \"STUDIO D-Suke\",\n        \"studio daiya\": \"スタジオ・ダイヤ\",\n        \"studio daiya alt\": \"スタジオ・ダイヤ・オルタ\",\n        \"studio dellforce\": \"STUDIOデルフォース\",\n        \"studio dia\": \"スタジオ・ダイア\",\n        \"studio diamond\": \"スタジオ・ダイヤ\",\n        \"studio dimple\": \"スタジオDimple\",\n        \"studio erohouse\": \"スタジオエロハウス\",\n        \"studio f\": \"スタジオ・エフ\",\n        \"studio fatality\": \"STUDiO FATALITY\",\n        \"studio fng\": \"studio FNG\",\n        \"studio fuck\": \"STUDIO FUCK\",\n        \"studio gaudi\": \"Studio Gaudi\",\n        \"studio gomasenbe\": \"STUDIO GOMASENBE\",\n        \"studio gorenuke\": \"スタジオGORENUKE\",\n        \"studio hamachigumi\": \"STUDIOはまち組\",\n        \"studio hamburg\": \"すたじおはんばーぐ\",\n        \"studio hofu-na kaihou sen2\": \"STUDIOホフーナ解放戦線\",\n        \"studio hoshiwatari\": \"Studio 星渡\",\n        \"studio hp plus\": \"STUDIO HP+\",\n        \"studio implant\": \"Studio Implant\",\n        \"studio insane\": \"Studio Insane\",\n        \"studio ipponzeoi\": \"スタジオ一本背負い\",\n        \"studio jam\": \"STUDIO JAM\",\n        \"studio jaren\": \"STUDIO 邪恋\",\n        \"studio jibeta\": \"studio jibeta\",\n        \"studio jikkenshitsu\": \"すたじお実験室\",\n        \"studio k\": \"すたぢおK\",\n        \"studio kakinoha-zaka\": \"STUDIO柿ノ葉坂\",\n        \"studio kame\": \"スタジオ カメ\",\n        \"studio katsudon\": \"スタジオかつ丼\",\n        \"studio kimigabuchi\": \"スタジオKIMIGABUCHI\",\n        \"studio kom\": \"スタジオコム\",\n        \"studio kyawn\": \"スタジオきゃうん\",\n        \"studio lood\": \"STUDIO LOOD\",\n        \"studio loud in school\": \"STUDIO LOUD IN SCHOOL\",\n        \"studio m nda pon\": \"スタジオMんだPON\",\n        \"studio mark ii\": \"スタジオMARKII\",\n        \"studio min\": \"STUDIO Min\",\n        \"studio miris\": \"すたじおみりす\",\n        \"studio mukon\": \"スタジオ夢魂\",\n        \"studio n.ball\": \"スタジオN・BALL\",\n        \"studio nadeshiko\": \"スタジオナデシコ\",\n        \"studio narazuke\": \"スタジオ奈良漬\",\n        \"studio naze\": \"スタジオ名瀬\",\n        \"studio neko kick\": \"スタジオねこキック\",\n        \"studio neko punch\": \"スタジオねこぱんち\",\n        \"studio neo black\": \"Studio Neo Black\",\n        \"studio nunchaku\": \"スタジオヌンチャク\",\n        \"studio omg\": \"スタジオOMG\",\n        \"studio orca\": \"studioオルカ\",\n        \"studio p.m.y\": \"Studio P.M.Y\",\n        \"studio pakira\": \"Studio PAKIRA\",\n        \"studio paradise\": \"STUDIO PARADISE\",\n        \"studio parfe\": \"すたじおぱふぇ\",\n        \"studio parm\": \"Studio★ParM\",\n        \"studio pastel\": \"Studio Pastel\",\n        \"studio pelqurappe\": \"STUDIOぺるくらっぺ\",\n        \"studio pork\": \"スタジオポーク\",\n        \"studio q\": \"すたぢおQ\",\n        \"studio r\": \"すたじおあ～る\",\n        \"studio rakkyou\": \"スタジオらっきょう\",\n        \"studio retake\": \"スタジオリテイク\",\n        \"studio runaway wolf\": \"STUDIO RUNAWAY WOLF\",\n        \"studio ryokucha\": \"すたじお緑茶\",\n        \"studio-sakura\": \"Studio-Sakura\",\n        \"studio sample\": \"Studio SAMPLE\",\n        \"studio sepia\": \"スタジオセピア\",\n        \"studio sfc\": \"スタジオSFC\",\n        \"studio sharaku\": \"STUDIO写裸苦\",\n        \"studio skb\": \"スタジオSKB\",\n        \"studio southpaw\": \"スタジオサウスポー\",\n        \"studio strike\": \"スタジオストライク\",\n        \"studio sunadokei\": \"studio砂時計\",\n        \"studio sushi kui-ne\": \"すたじお寿司くいねぇ\",\n        \"studio tagata\": \"studio TAGATA\",\n        \"studio tamo\": \"スタジオTAMO\",\n        \"studio tapa tapa\": \"すたじお☆たぱたぱ\",\n        \"studio tar\": \"スタジオた～\",\n        \"studio the devil\": \"Studio The DEVIL\",\n        \"studio tiamat\": \"STUDIO TIAMAT\",\n        \"studio triumph\": \"STUDIO TRIUMPH\",\n        \"studio ubai\": \"スタジオ奪\",\n        \"studio walk\": \"studio WALK\",\n        \"studio woruto\": \"すたぢおヲルト\",\n        \"studio z-agnam\": \"スタジオZ-AGNAM\",\n        \"studio z.m\": \"STUDIO Z.M\",\n        \"studio zonzai\": \"STUDIOぞんざい\",\n        \"studio-74\": \"Studio-74\",\n        \"studio.h.a.o\": \"Studio.好\",\n        \"studio187\": \"studio187\",\n        \"studio309\": \"Studio309\",\n        \"studio30neko\": \"Studio30NEKO\",\n        \"studios\": \"StudioS\",\n        \"stuntmans\": \"スタントマンズ\",\n        \"style-c3\": \"スタイルシースリー\",\n        \"stylish marunage\": \"スタイリッシュ丸投げ\",\n        \"styworks\": \"STYworks\",\n        \"subachikyu\": \"すばちきゅ!\",\n        \"subapai-jigyobu\": \"すばパイ事業部\",\n        \"subaruen himawarigumi\": \"すばる園ひまわり組\",\n        \"subcontract studio\": \"SUBCONTRACT STUDIO\",\n        \"subesube tsukiyo\": \"すべすべ月夜\",\n        \"subesube1kg\": \"すべすべ1kg\",\n        \"subliminal daikaiten\": \"サブリミナル大回転\",\n        \"subsonic factor\": \"Subsonic Factor\",\n        \"succubus\": \"Succubus\",\n        \"sucharaka knight\": \"すちゃらか騎士!\",\n        \"suck drop bambies\": \"Suck Drop Bambies\",\n        \"sudachic\": \"すだちっく\",\n        \"sudou factory\": \"すどーファクトリー\",\n        \"suedama\": \"スヱダマ\",\n        \"suezen\": \"据えZEN\",\n        \"sugahouse\": \"スガハウス\",\n        \"sugar house\": \"シュガーハウス\",\n        \"sugar maple\": \"SUGAR MAPLE\",\n        \"sugar star\": \"Sugar Star\",\n        \"sugareya shouten\": \"すがれや商店\",\n        \"sugarspot\": \"SUGAR(S)POT\",\n        \"sugiya\": \"杉屋\",\n        \"sugofire\": \"SUGOFIRE\",\n        \"sugoi ikioi de\": \"すごい勢いで\",\n        \"sugusoko\": \"すぐそこ\",\n        \"suhamaya\": \"洲浜屋\",\n        \"sui sui works\": \"スイスイワークス\",\n        \"suichuu white\": \"水中ホワイト\",\n        \"suika dokei\": \"すいか時計\",\n        \"suikanotane\": \"すいかのたね\",\n        \"suinose\": \"すいのせ\",\n        \"suiren\": \"翠憐\",\n        \"suishoku sendan\": \"翠色戦団\",\n        \"suiteibuin\": \"推定部員\",\n        \"suitekiya\": \"水滴屋\",\n        \"suizokukan\": \"睡族館\",\n        \"sukapon-do\": \"スカポン堂\",\n        \"sukaradog\": \"SUKARADOG\",\n        \"sukebe time\": \"SUKEBE TIME\",\n        \"sukerasparo\": \"SukeraSparo\",\n        \"suketamaya\": \"スケタ魔屋\",\n        \"sukidarake\": \"すきだらけ\",\n        \"sukiiro sekai\": \"スキイロセカイ\",\n        \"sukima sangyou\": \"スキマ産業\",\n        \"sukimakaze honpo\": \"スキマ風本舗\",\n        \"sukinishitai\": \"すきにし隊\",\n        \"sukoburumers\": \"すこぶるまぁズ\",\n        \"sukoyaka collagen\": \"すこやかコラーゲン\",\n        \"sukuri umu\": \"すくりうむ\",\n        \"sumeragi designs\": \"皇DESIGNS\",\n        \"sumicco.\": \"すみっこ。\",\n        \"sumikko\": \"すみっこ\",\n        \"sumire club\": \"スミレ倶楽部\",\n        \"sumisumi dou\": \"スミスミ堂\",\n        \"summer child\": \"SUMMER CHILD\",\n        \"sumomo dou\": \"すもも堂\",\n        \"sunadokei to enpitsu\": \"砂時計と鉛筆\",\n        \"sunagimo.\": \"すなぎも。\",\n        \"sunday shower\": \"SUNDAY SHOWER\",\n        \"sunezumi fauvism\": \"素鼠フォーヴィスム\",\n        \"sunomono purin\": \"すのもの☆ぷりん\",\n        \"sunroad travellers\": \"Sunroad Travellers\",\n        \"sunset dreamer\": \"サンセットドリーマー\",\n        \"sunsetmoon\": \"SunsetMoon\",\n        \"sunsun lab\": \"サンサンLAB\",\n        \"sunyiru\": \"すにぃる\",\n        \"super colorful\": \"スーパーカラフル\",\n        \"super ichigo-chan\": \"スーパーイチゴチャン\",\n        \"super sentou\": \"スーパー銭湯\",\n        \"super usagi comic\": \"スーパーウサギコミック\",\n        \"superbad\": \"スーパーバッド\",\n        \"supplement\": \"サプリメント\",\n        \"supplemental\": \"サプリメンタル\",\n        \"supposo\": \"スッポソ\",\n        \"supurabi\": \"すぷらび\",\n        \"suraimu no youna nanika\": \"すらいむのような何か\",\n        \"surface\": \"Surface\",\n        \"surface tension\": \"Surface Tension\",\n        \"suriko gi\": \"すりこギ部\",\n        \"surumenium\": \"スルメニウム\",\n        \"survive\": \"survive\",\n        \"sus\": \"SUS\",\n        \"susano arashi\": \"スサノアラシ\",\n        \"sushi-go-round\": \"回転寿司\",\n        \"sushi-ya\": \"寿司屋\",\n        \"sushiya.\": \"スシヤ。\",\n        \"sutaco rider\": \"スタコライダー\",\n        \"suteiburus\": \"すていぶるず\",\n        \"suvwave\": \"SUVWAVE\",\n        \"suwatteru\": \"座ってる\",\n        \"suzome\": \"酢ぞめ\",\n        \"suzuki shouten\": \"鈴木商店\",\n        \"suzukure\": \"涼暮\",\n        \"suzume no miya\": \"雀の宮\",\n        \"suzumeno\": \"すずめの\",\n        \"suzumeya\": \"すずめや\",\n        \"suzunaridou\": \"鈴鳴堂\",\n        \"suzune rai chikashitsu\": \"鈴根らい地下室\",\n        \"suzuneiro\": \"すずねいろ\",\n        \"suzuneya ni youkoso\": \"スズネ屋にようこそ\",\n        \"suzupony\": \"すずぽに\",\n        \"suzuran\": \"鈴蘭\",\n        \"suzushirodou\": \"蘿蔔堂\",\n        \"swan\": \"スワン\",\n        \"swan mania\": \"スワンマニア\",\n        \"swastika\": \"SWASTIKA\",\n        \"sweet candle\": \"Sweet Candle\",\n        \"sweet devil\": \"すいーとでびる\",\n        \"sweet girls\": \"Sweet Girls\",\n        \"sweet jasmine\": \"sweet☆jasmine\",\n        \"sweet pea\": \"スイートピー\",\n        \"sweet princess\": \"Sweet Princess\",\n        \"sweet raspberry\": \"スウィートラズベリー\",\n        \"sweet taste\": \"SWEET TASTE\",\n        \"sweetedda\": \"SweetEdda\",\n        \"sweets spaghetti\": \"スイーツスパゲティ\",\n        \"sweetsprite\": \"SweetSprite\",\n        \"swims\": \"SwimS\",\n        \"sxs\": \"SXS\",\n        \"syamisen koubou\": \"三味線工房\",\n        \"sylphian ruby\": \"Sylphian Ruby\",\n        \"sylvia\": \"SYLVIA\",\n        \"symphony\": \"シンフォニー\",\n        \"synchrose\": \"シンクローズ\",\n        \"synthetic garden\": \"Synthetic Garden\",\n        \"syoku\": \"SYOKU\",\n        \"syosyo yakkyoku\": \"処々薬局\",\n        \"syoujyo complete\": \"少女コンプリート\",\n        \"syounen heroine\": \"少年Heroine\",\n        \"syouryu yasui-kai\": \"昇竜安井会\",\n        \"sys3.6.3.\": \"sys3.6.3.\",\n        \"system gzzy\": \"SYSTEM GZZY\",\n        \"syukurin\": \"シュクリーン\",\n        \"syunkasyuutou iinkai\": \"春夏秋冬委員会\",\n        \"syuntyu\": \"春昼\",\n        \"t-court\": \"T-court\",\n        \"t-north\": \"T-NORTH\",\n        \"t-press\": \"T-Press\",\n        \"t-project\": \"T-Project\",\n        \"t-zone\": \"T-ZONE\",\n        \"t.a.k.k.\": \"T.A.K.K.\",\n        \"t.cop\": \"T.cop\",\n        \"t.k.h.k\": \"T・K・H・K\",\n        \"t2 unit\": \"T2 UNIT\",\n        \"t2000\": \"T2000\",\n        \"tabidori\": \"旅鳥\",\n        \"tabisuke to panda\": \"旅輔とパンダ\",\n        \"tabito\": \"旅人\",\n        \"tabitoya\": \"旅人屋\",\n        \"tablet\": \"TABLET\",\n        \"tachikawa juukougyou\": \"タチカワ重工業\",\n        \"tachimukau\": \"タチムカウ\",\n        \"tachineko miya\": \"タチネコ宮\",\n        \"tachinomi-ya\": \"立呑屋\",\n        \"tackle box\": \"たっくるぼっくす\",\n        \"tactical notes\": \"タクティカルノーツ\",\n        \"tadaichidono\": \"ただ一度の\",\n        \"tagamesou\": \"タガメ槽\",\n        \"tai kamaboko\": \"鯛かまぼこ\",\n        \"tai no okashira\": \"鯛のおかしら\",\n        \"taifuu biyori\": \"台風日和\",\n        \"taikan kyohougumi\": \"大鑑巨砲組\",\n        \"taiki ken club\": \"たいけん部!\",\n        \"taiko no tsuki\": \"太古の月\",\n        \"taiku yamori\": \"対空ヤモリ\",\n        \"taikuu works\": \"滞空ワークス\",\n        \"tail\": \"tail\",\n        \"tail of nearly\": \"てーるおぶにやりー\",\n        \"tail spot\": \"ているすぽっと\",\n        \"tailbell\": \"TailBell\",\n        \"tainaikaiki\": \"tainaikaiki\",\n        \"tainone takikomi gohan\": \"たいのね炊き込みご飯\",\n        \"taira mune suki iinkai\": \"平胸好き委員会\",\n        \"tairagi\": \"TAIRAGI\",\n        \"tairyo-tei\": \"大呂亭\",\n        \"taisenshadou kenkyuukai\": \"対戦車道研究会\",\n        \"taishokukannoirowze\": \"大食漢のいろうぜ\",\n        \"taiwan shuppan\": \"タイワン出版\",\n        \"taiyaki\": \"たいやき\",\n        \"taiyaki yaketa\": \"たいやきやけた\",\n        \"taiyako takoyaki\": \"たいやこタコヤキ\",\n        \"taiyosin\": \"太陽神\",\n        \"taiyou no megumi\": \"太陽の恵み\",\n        \"taiyoukei kaihatsu kikou\": \"太陽系開発機構\",\n        \"tak in wonderland\": \"Tak In Wonderland\",\n        \"taka no dan\": \"鷹ノ団\",\n        \"takadoya-tei\": \"たかどや亭\",\n        \"takahamaya\": \"高浜屋\",\n        \"takahashi record-ten\": \"高橋レコード店\",\n        \"takaiwerks\": \"TAKAIWERKS\",\n        \"takamagaharahouraku\": \"高天ヶ原崩落\",\n        \"takane no hanazono\": \"たかねの花園\",\n        \"takaneko\": \"たかねこ\",\n        \"takanicle\": \"てかにくる\",\n        \"takashita-ya\": \"たかした屋\",\n        \"takatans waffen-ss\": \"Takatan's Waffen-SS\",\n        \"takatobiya\": \"タカトビヤ\",\n        \"takaya\": \"たか屋\",\n        \"takayashiki kaihatsu\": \"高屋敷開発\",\n        \"take-chan island\": \"タケチャンアイランド\",\n        \"take-dake\": \"TAKE-DAKE\",\n        \"take3\": \"TAKE3\",\n        \"takeda syouten\": \"武田商店\",\n        \"takedake\": \"武田家\",\n        \"takemaruya\": \"竹○屋\",\n        \"takeout\": \"Takeout!\",\n        \"takeritake daishuukakusai\": \"猛茸大収穫祭\",\n        \"takesatorispa\": \"たけさとりすぱ\",\n        \"taketombo\": \"竹とんぼ\",\n        \"takeuma no tomo\": \"竹馬の友\",\n        \"takeya\": \"たけ家\",\n        \"takeyabu\": \"タケヤブ\",\n        \"takeyamaya\": \"茸山屋\",\n        \"takimoto doujou\": \"滝本道場\",\n        \"takion melo\": \"瀧音MELO\",\n        \"takitate\": \"炊きたて\",\n        \"takkyudou\": \"達急堂\",\n        \"takotsubo club\": \"たこつぼ倶楽部\",\n        \"takotsuboya\": \"蛸壷屋\",\n        \"takoya honpo\": \"多胡屋本舗\",\n        \"takoyaki-batake\": \"たこ焼き畑\",\n        \"taku-tama\": \"たくたま\",\n        \"takuan\": \"たくあん\",\n        \"takumi na muchi\": \"たくみなむち\",\n        \"takumiya\": \"匠屋\",\n        \"tama center\": \"たまセンター\",\n        \"tamafull\": \"tamaFull\",\n        \"tamafuwa\": \"たまふわ\",\n        \"tamagawa enema\": \"多摩川エネマ\",\n        \"tamagobou\": \"玉子房\",\n        \"tamagomura\": \"タマゴ村\",\n        \"tamakakeya\": \"たまかけ屋\",\n        \"tamakiya\": \"環屋\",\n        \"tamakuraya\": \"玖蔵屋\",\n        \"tamamo soft\": \"玉藻ソフト\",\n        \"tamaran koujou\": \"たまらん工場\",\n        \"tamarun\": \"タマラン\",\n        \"tamashii max\": \"魂MAX\",\n        \"tamashu\": \"珠秋\",\n        \"tamatebako\": \"珠手箱\",\n        \"tameshigaki\": \"ためしがき\",\n        \"tamokuteki hall\": \"たもくてきほーる\",\n        \"tamokuteki kuukan\": \"多目的空間\",\n        \"tanaka shouten\": \"田中商店\",\n        \"tanakana\": \"たなかな\",\n        \"tanaura honpo\": \"棚裏本舗\",\n        \"tanbo\": \"田圃\",\n        \"tanden shuzou\": \"丹田酒蔵\",\n        \"tanetsuke ichinengo\": \"種付け一年後\",\n        \"tange kentou club\": \"丹下拳闘倶楽部\",\n        \"tangerine\": \"Tangerine\",\n        \"tangerine ward\": \"Tangerine Ward\",\n        \"tanmatsu ijou\": \"端末異常\",\n        \"tanoma-project\": \"たのまーproject\",\n        \"tanoshiitake\": \"たのしいたけ\",\n        \"tanpanizm\": \"タンパニズム\",\n        \"tanpatsu kikaku\": \"短髪企画\",\n        \"tanpatsuism\": \"短髪イズム\",\n        \"tanpopo\": \"■■■たんぽぽ■■■\",\n        \"tanpopo suisan\": \"たんぽぽ水産\",\n        \"tansan senbei\": \"タンサンセンベイ\",\n        \"tanuki ichiba\": \"たぬき市場\",\n        \"tanuki no sato\": \"狸の里\",\n        \"tanuki no takarabako\": \"たぬきの宝箱\",\n        \"tanuki riot\": \"たぬき・らいおっと\",\n        \"tanukian\": \"たぬき庵\",\n        \"tanuking sleep\": \"たぬきんぐすりーぷ\",\n        \"taob\": \"TAOB\",\n        \"tapioca box\": \"タピオカボックス\",\n        \"tarako cream\": \"たらこクリーム\",\n        \"tarako koubou\": \"たらこ工房\",\n        \"tarakospa\": \"タラコスパ\",\n        \"taranbo\": \"タランボ\",\n        \"tarapo\": \"TARAPO\",\n        \"tarchi\": \"Tarchi\",\n        \"taromochian\": \"太呂餅庵\",\n        \"tarots\": \"TAROTS\",\n        \"tarugun\": \"たるぐん\",\n        \"tata\": \"TATA\",\n        \"tatazumai\": \"タタズマイ\",\n        \"tate\": \"殺陣\",\n        \"tate-a-tate\": \"tate-A-tate\",\n        \"tateana juukyo\": \"竪穴住居\",\n        \"tategami 5tyoume\": \"たてがみ5丁目\",\n        \"tatesima.\": \"タテシマ。\",\n        \"tateyama engineering\": \"館山エンジニアリング\",\n        \"tatintotarte\": \"たたんとたると\",\n        \"tatsu no otoshigo\": \"たつのおとしご\",\n        \"tatsumaki koutei\": \"たつまき皇帝\",\n        \"tatsunoyorozuya\": \"辰ノ万屋\",\n        \"taurin 1 oku\": \"タウリン1億\",\n        \"tax inn\": \"Tax inn\",\n        \"tayo\": \"たよ\",\n        \"tayutaya\": \"たゆた屋\",\n        \"tbk\": \"TBK\",\n        \"tcl art 178-2\": \"TCL ART 178-2\",\n        \"tcnc\": \"tcnc\",\n        \"tdtk\": \"TDTK\",\n        \"tea bullet\": \"TEA BULLET\",\n        \"teabreak scriptea\": \"混沌レディースタジオ\",\n        \"team almond\": \"Team Almond\",\n        \"team crepe sucre\": \"Team Crepe Sucre\",\n        \"team harenchi\": \"Teamはれんち\",\n        \"team ibm\": \"Team IBM\",\n        \"team inazuma\": \"Team Inazuma\",\n        \"team kihara\": \"チームキハラ\",\n        \"team oto deli\": \"Teamおと♂デリ\",\n        \"team plus-y\": \"チームプラスY\",\n        \"team princess\": \"TEAM PRINCESS\",\n        \"team sazandora\": \"チームサザンドラ\",\n        \"team shuffle\": \"TEAM SHUFFLE\",\n        \"team tanabe\": \"田辺組\",\n        \"team twin devils\": \"Team Twin Devils\",\n        \"team zero\": \"TEAM ZERO\",\n        \"team-weak tail\": \"Team-weak tail\",\n        \"team.mk\": \"Team.MK\",\n        \"teamjoker\": \"TeamJOKER\",\n        \"teamtgs\": \"teamTGs\",\n        \"tecchitecchi\": \"テッチテッチ\",\n        \"technibuster\": \"TECHNIBUSTER\",\n        \"techno break izonshou\": \"テクノブレイク依存症\",\n        \"technobrake\": \"TechnoBrake\",\n        \"technomics.\": \"てくのみくす。\",\n        \"technos a\": \"テクノスA\",\n        \"tecmet\": \"TECMET\",\n        \"tedaingu\": \"てだいんぐ\",\n        \"teddy-plaza\": \"TEDDY-PLAZA\",\n        \"teemonk\": \"てえもんく\",\n        \"tei hanpatsu purin\": \"低反発ぷりん\",\n        \"teihatu syouzyo titai\": \"剃髪少女地帯\",\n        \"teikoku uchugun\": \"帝国宇宙軍\",\n        \"teiltype\": \"TEILTYPE\",\n        \"teionyakedo\": \"低音火傷\",\n        \"teisoku sonic\": \"低速ソニック\",\n        \"teito bouei ryodan\": \"帝都防衛旅団\",\n        \"teketo\": \"TEKETO\",\n        \"tekireiki ni shokuchuudoku\": \"適齢期に食中毒\",\n        \"tekitou\": \"適当\",\n        \"tekkamaki\": \"鉄華巻\",\n        \"tekken dynamite\": \"鉄拳ダイナマイト\",\n        \"tekken neko gourmet\": \"鉄拳ねこグルメ\",\n        \"tekkou girls\": \"鉄甲ガールズ\",\n        \"tekokids\": \"てこきっず\",\n        \"telenet japan\": \"日本テレネット\",\n        \"telluru\": \"telluru\",\n        \"telomerena\": \"てろめあな\",\n        \"temaemiso-koubou\": \"手前みそ工房\",\n        \"temari cat\": \"てまりきゃっと\",\n        \"temparing\": \"テンパりんぐ\",\n        \"tempest\": \"てんぺすと\",\n        \"temple\": \"TEMPLE\",\n        \"ten\": \"TEN\",\n        \"ten no katsuraya\": \"天のカツラ屋\",\n        \"ten plus aku\": \"てん+あく\",\n        \"tenburi\": \"てんぶり\",\n        \"tenchuugumi\": \"天誅組\",\n        \"tenda\": \"TENDA\",\n        \"tendou\": \"てん堂\",\n        \"tendou kikaku\": \"天童企画\",\n        \"tendoushi\": \"天堂紙\",\n        \"tengai aku juumonji\": \"天外悪十文字\",\n        \"tengallonhat\": \"Tengallonhat\",\n        \"tengohambre\": \"tengohambre\",\n        \"tengu kotengu\": \"テングコテング\",\n        \"tengu no tsuzura\": \"天狗のつづら\",\n        \"tengu syoukougun\": \"天狗症候群\",\n        \"tengudou\": \"テング堂\",\n        \"tenguren\": \"天愚連\",\n        \"tengusa\": \"テングサ\",\n        \"tengsten\": \"テングステン\",\n        \"tenhaii\": \"天海一\",\n        \"tenjo kakuhen\": \"天井確変\",\n        \"tenjou renge\": \"天上蓮華\",\n        \"tenju-rengoku\": \"天樹恋獄\",\n        \"tenkafubu rengou\": \"天下布武連合\",\n        \"tenkigumi\": \"てんきぐみ\",\n        \"tenku-dou\": \"纏苦堂\",\n        \"tenkuu bokujou\": \"天空牧場\",\n        \"tennen doumei\": \"天然同盟\",\n        \"tennen menbou\": \"てんねん綿棒\",\n        \"tennentagayasan\": \"天然たがやさん\",\n        \"tenny le tai\": \"テニーレ隊\",\n        \"tenohira tambourine\": \"てのひらタンバリン\",\n        \"tenotsukyu\": \"天乙宮\",\n        \"tenpura kobo\": \"てんぷら工房\",\n        \"tenrake chaya\": \"てんらけ茶屋\",\n        \"tenshi syndrome\": \"天子震度籠娘\",\n        \"tenshindo\": \"天津堂\",\n        \"tentendou\": \"てんてん堂\",\n        \"tenya wanya\": \"てんやわんや\",\n        \"tenyati\": \"TenYati\",\n        \"tenzan koubou\": \"天山工房\",\n        \"terada naoko\": \"寺田尚子\",\n        \"teraoka digital works\": \"寺岡デジタルワークス\",\n        \"terebi-san\": \"てれびさん\",\n        \"terios\": \"テリオス\",\n        \"teriyaki-sabo\": \"てりやき茶房\",\n        \"terminus aqua\": \"ターミナスアクア\",\n        \"ternotte\": \"ternotte\",\n        \"terolin soft\": \"てろりんソフト\",\n        \"terralunar\": \"テラルナ\",\n        \"terrarium\": \"Terrarium\",\n        \"terrorize\": \"てららいず\",\n        \"teruo haruo\": \"てるおはるお\",\n        \"teruterubocchi\": \"てるてるぼっち\",\n        \"tesla pod\": \"てすらpod\",\n        \"tesuri no post\": \"手すりのポスト\",\n        \"tetchan hato\": \"てっちゃんハト\",\n        \"tete a tete fragile\": \"tete a tete fragile\",\n        \"tete-a-tete\": \"tete-a-tete\",\n        \"tetrapod\": \"Tetrapod\",\n        \"tetrara\": \"TETRARA\",\n        \"tetrascope\": \"TetraScope\",\n        \"tetratech\": \"テトラテック\",\n        \"tetravortex\": \"テトラボルテックス\",\n        \"tetrodotoxin\": \"TETRODOTOXIN\",\n        \"tetsu no otoshigo\": \"てつのおとしご\",\n        \"tetsugakuteki zombie\": \"哲学的ゾンビ\",\n        \"tetsukazuno ao.\": \"手つかずの青。\",\n        \"tetsukuzuya\": \"鉄屑屋\",\n        \"tex-mex\": \"TEX-MEX\",\n        \"tga\": \"TGA\",\n        \"th4\": \"Throttle/4\",\n        \"the flyers\": \"THE FLYERS\",\n        \"the fuckin toyzaras\": \"The Fuckin Toyzaras\",\n        \"the gentry\": \"The Gentry\",\n        \"the giveup pose\": \"もうだめぽ\",\n        \"the horizon\": \"The HORIZON\",\n        \"the hyperman\": \"THE HYPERMAN\",\n        \"the knight of the pants\": \"パンツ騎士団\",\n        \"the latest engine\": \"fujiyama takashi\",\n        \"the mistress of the adriatic\": \"アドリア海の女王\",\n        \"the monthly istanbul\": \"月刊イスタンブール\",\n        \"the rettoukan\": \"THE 劣等感\",\n        \"the saturn\": \"THE SATURN\",\n        \"the seventh sign\": \"The Seventh Sign\",\n        \"theeshakya\": \"ザ借家\",\n        \"the super dimension dirty empire\": \"超時空猥褻帝国\",\n        \"the world\": \"The World\",\n        \"the-franken\": \"THE・FRANKEN\",\n        \"the-paper\": \"THE-PAPER\",\n        \"theory of heaven\": \"Theory of HEAVEN\",\n        \"third brand\": \"THIRD BRAND\",\n        \"third foot\": \"サードフット\",\n        \"thisarmor\": \"ThisArmor\",\n        \"thompon\": \"とむぽん\",\n        \"three m\": \"すりーえむ\",\n        \"threecords\": \"スリーコーズ\",\n        \"threshold\": \"スレッショルド\",\n        \"thrylos\": \"Thrylos\",\n        \"thw.jp\": \"THW.jp\",\n        \"tiare\": \"ティアラ\",\n        \"tick\": \"擽—Tick—\",\n        \"tico tico\": \"TICO TICO\",\n        \"ticotico\": \"TICOTICO\",\n        \"tiger 79\": \"Tiger☆79\",\n        \"tiger roman\": \"タイガーロマン\",\n        \"timatima\": \"ちまちま\",\n        \"time-leap\": \"time-leap\",\n        \"timplu\": \"ティンプラ\",\n        \"tinkerbell\": \"てぃんかーべる\",\n        \"tinkle position\": \"Tinkle Position\",\n        \"tiny potato\": \"Tiny potato\",\n        \"tinyking\": \"TinyKing\",\n        \"tipoplaza\": \"ティポプラーザ\",\n        \"tiramisu\": \"Tiramisu\",\n        \"tiramisu tart\": \"てぃらみすたると\",\n        \"tirolcat\": \"TirolCat\",\n        \"tistrya\": \"ティシュトリ屋\",\n        \"titancolor brand\": \"チタンカラーブランド\",\n        \"titania\": \"てぃたーにあ\",\n        \"titano-makhia\": \"ティタノマキア\",\n        \"tiusan kingdom\": \"ちうさんキングダム\",\n        \"tk jesus\": \"TKジーザス\",\n        \"tk-brand\": \"TK-Brand\",\n        \"tk-bros\": \"TK-BROS\",\n        \"tkciao\": \"tkciao\",\n        \"tkspower\": \"TKSpower\",\n        \"tlg\": \"ねこのこね\",\n        \"tmg\": \"TMG\",\n        \"tmtkdou\": \"TMTK堂\",\n        \"tnc.\": \"TNC.\",\n        \"toaster\": \"トースター\",\n        \"tobatya2ke\": \"とばちゃづけ\",\n        \"tobihizageri\": \"とびひざげり\",\n        \"tobuchikara\": \"飛ぶちから\",\n        \"toculitoc\": \"とくりとっこ\",\n        \"todd special\": \"トッドスペシャル\",\n        \"tofu on fire\": \"Tofu On Fire\",\n        \"tofu soft\": \"TOFU SOFT\",\n        \"togijiru\": \"とぎじる\",\n        \"toha spiral\": \"とーはスパイラル\",\n        \"tohoippun\": \"徒歩一分\",\n        \"tohoorin\": \"TOHOORIN\",\n        \"toiro no iro\": \"といろのいろ\",\n        \"toitoikai\": \"対々会\",\n        \"tojora-men\": \"東条らーめん\",\n        \"tokachi no kuni\": \"とかちのくに\",\n        \"tokaeshina koubou\": \"トカエシナ工房\",\n        \"tokage 3gou\": \"とかげ3号\",\n        \"tokage juukou\": \"蜥蜴重工\",\n        \"tokage mori\": \"トカゲ森\",\n        \"tokage no shippo\": \"トカゲのしっぽ\",\n        \"tokei to kan co-hi-\": \"時計と缶コーヒー\",\n        \"tokemashita.\": \"とけました。\",\n        \"toketou no bansan\": \"とけとうの晩餐\",\n        \"toki nokogiri\": \"トキノコギリ\",\n        \"tokimigumi\": \"時美組\",\n        \"tokinochaya\": \"時乃茶屋\",\n        \"tokinoseisyo\": \"トキノセイショ\",\n        \"tokkuriya\": \"徳利屋\",\n        \"toko-ya\": \"床子屋\",\n        \"tokohana\": \"とこはな\",\n        \"tokonoma\": \"トコノマ\",\n        \"tokoroten\": \"ところてん\",\n        \"tokoroten house\": \"トコロテンハウス\",\n        \"toku yakusou\": \"特薬草\",\n        \"tokuda\": \"とくだ\",\n        \"tokumei tentai\": \"匿名天体\",\n        \"tokusen ohinasama\": \"特選おひなさま\",\n        \"tokyo bungeling bay yokohama\": \"東京バンゲリングベイ横浜\",\n        \"tokyo circuit\": \"Tokyoサーキット\",\n        \"tokyo continent\": \"東京大陸\",\n        \"tokyo gamachannel\": \"東京ガマチャンネル\",\n        \"tokyo glider\": \"東京グライダー\",\n        \"tokyo lemon\": \"東京檸檬\",\n        \"tokyo ponpon dou\": \"東京ポンポン堂\",\n        \"tokyo tomodachi kouen\": \"東京友達公園\",\n        \"tokyo tsunamushi land\": \"東京つなむしランド\",\n        \"tokyo-rozewomond club\": \"東京ロゼヲモンド倶楽部\",\n        \"tokyusen\": \"東九線\",\n        \"tololinco\": \"とろりんこ\",\n        \"toluene ittokan\": \"トルエン一斗缶\",\n        \"tomas\": \"TOMAS\",\n        \"tomato company\": \"TOMATO COMPANY\",\n        \"tomato kanzume\": \"トマト缶詰\",\n        \"tomato namaashi\": \"トマト生足\",\n        \"tomaya no taki\": \"苫屋の滝\",\n        \"tombstone\": \"Tombstone\",\n        \"tomcat\": \"TomCat\",\n        \"tomofuku\": \"とも福\",\n        \"ton toro\": \"とんとろ\",\n        \"tonari no dagashiya-san\": \"となりの駄菓子屋さん\",\n        \"tondemo awabihime\": \"とんでもあわび姫\",\n        \"tondesu\": \"トンデス\",\n        \"tonkotsu fuumi\": \"とんこつふうみ\",\n        \"tonkotsu yama\": \"トンコツ山\",\n        \"tonnerre gakuen\": \"トネール学園\",\n        \"tonoya\": \"との屋\",\n        \"tonpuuratei\": \"とんぷぅら亭\",\n        \"tonteki teishoku\": \"トンテキ定食\",\n        \"tonten\": \"トンテン\",\n        \"tonton byoushi\": \"とんとんびょーし\",\n        \"tontoro daiyokujou\": \"豚トロ大浴場\",\n        \"tooku no sora\": \"とおくのそら\",\n        \"toon worker\": \"トゥーンワーカー\",\n        \"tooya\": \"十矢\",\n        \"top\": \"TOP\",\n        \"topcat\": \"トップキャット\",\n        \"topgun\": \"TOPGUN\",\n        \"tora koubou\": \"寅工房\",\n        \"tora tamatama\": \"とらたまたま\",\n        \"toragoyashiki\": \"虎小屋敷\",\n        \"toraisix\": \"とらいしっくす\",\n        \"torajima-shi kouhouka\": \"寅島市広報課\",\n        \"torano ori\": \"寅乃檻\",\n        \"toranoe no makimono\": \"とらのえのまきもの\",\n        \"torara studio\": \"トララスタジオ\",\n        \"toratanuza\": \"とらたぬ座\",\n        \"toratepotto\": \"とらてぽっと\",\n        \"toraya\": \"トラ屋\",\n        \"tore\": \"蕩れ\",\n        \"torenia\": \"torenia\",\n        \"tori no oishii tokoro\": \"とりのおいしいところ\",\n        \"tori no sanpomichi\": \"トリの散歩道\",\n        \"tori no ya\": \"鳥の屋\",\n        \"toriaezu kari\": \"とりあえず(仮)\",\n        \"toriaezu nama\": \"とりあえず、生!\",\n        \"toriaridou\": \"トリ有リ堂\",\n        \"toribako\": \"toribako\",\n        \"toriihime\": \"鳥居姫\",\n        \"torimeshi\": \"とり飯\",\n        \"torinabe\": \"Tori鍋\",\n        \"toriniku seikatsu\": \"鶏肉生活\",\n        \"toriwasabi\": \"とりわさび\",\n        \"toriya\": \"トリ屋\",\n        \"toro toro resistance\": \"とろとろレジスタンス\",\n        \"torochidan\": \"とろーち団\",\n        \"toromilk\": \"トロみるく\",\n        \"toroniku yukke\": \"とろにくゆっけ\",\n        \"tororoimo\": \"とろろいも\",\n        \"tortesoft\": \"とるてそふと\",\n        \"toruneko chaya\": \"獲る猫茶屋\",\n        \"torya\": \"TORYA!\",\n        \"tosyoen\": \"凍傷炎\",\n        \"totem pole\": \"トーテムポール\",\n        \"totemo zako\": \"とても雑魚\",\n        \"toto max\": \"toto MAX\",\n        \"toto-taste\": \"ととていすと\",\n        \"totocal land\": \"ととかるLAND\",\n        \"totoki kikaku\": \"十時企画\",\n        \"totonishi\": \"ととにし\",\n        \"totoya\": \"トト屋\",\n        \"totsugasa\": \"凸傘\",\n        \"totsugeki tonarino jo-galbi\": \"突撃!となりの上カルビ\",\n        \"totsugeki wolf\": \"突撃ウルフ\",\n        \"tottemodaiji\": \"とってもだいじ\",\n        \"tottorou\": \"totto廊\",\n        \"tottototomekichi\": \"とっとととめきち\",\n        \"touch\": \"TOUCH\",\n        \"touchable\": \"TOUCHABLE\",\n        \"touchin hanten\": \"東珍飯店\",\n        \"toudori no su\": \"トウドリの巣\",\n        \"touenketsu\": \"桃园结\",\n        \"toufuya\": \"燈風屋\",\n        \"tougall kai\": \"東ガル会\",\n        \"touge mine\": \"峠峰\",\n        \"tougechaya\": \"峠茶屋\",\n        \"tougenkyo\": \"桃源郷\",\n        \"tougesakuraya\": \"峠桜屋\",\n        \"touhi kuukan\": \"逃避空間\",\n        \"touhou marupondou\": \"当方丸宝堂\",\n        \"touka biyori\": \"桃花日和\",\n        \"toukaidou\": \"東海堂\",\n        \"toumei kousoku\": \"透明光速\",\n        \"toumei tsuushin\": \"透明通信\",\n        \"tousoku chokusen undou\": \"等速直線運動\",\n        \"toutaku tuyagadou\": \"董卓艶画堂\",\n        \"touyoko surfrider\": \"東横サーフライダー\",\n        \"touyou zatsugidan\": \"東洋雑技団\",\n        \"toxic\": \"toxic\",\n        \"toxic love\": \"ときしっくらぶ\",\n        \"toxic store\": \"Toxic Store\",\n        \"toybox\": \"といぼっくす\",\n        \"tozan bu\": \"TOZAN:BU\",\n        \"tp\": \"tp!\",\n        \"tra-tama ry\": \"トラたま(略)\",\n        \"tracklisko\": \"とらっくりすこ\",\n        \"trample rigger\": \"Trample Rigger\",\n        \"tranceg\": \"TRANCEG\",\n        \"tranquility\": \"Tranquility\",\n        \"trans\": \"トランス\",\n        \"trans soft\": \"トランスソフト\",\n        \"trans tribune\": \"トランス・トリビューン\",\n        \"transgenics.\": \"遺伝子組換え\",\n        \"transient melody\": \"Transient Melody\",\n        \"transistor angel\": \"Transistor Angel\",\n        \"transistor baby\": \"トランジスタベイビィ\",\n        \"transonic\": \"TRANSONIC\",\n        \"transpot\": \"TranSpot\",\n        \"trap\": \"TRAP\",\n        \"trauma\": \"虎馬\",\n        \"trauma2g\": \"trauma2g\",\n        \"traumatize\": \"Traumatize\",\n        \"treat me nice\": \"Treat me nice\",\n        \"tree ga muttsu\": \"ツリーがむっつ\",\n        \"treetop helper\": \"TREETOP Helper\",\n        \"tremolo works\": \"トレモロワークス\",\n        \"trend kill\": \"TREND KILL\",\n        \"tri-k soft\": \"tri-k soft\",\n        \"triad\": \"TRAID\",\n        \"triage tag\": \"TRIAGE TAG\",\n        \"trial3\": \"TriaL3\",\n        \"tribo\": \"TRIBO\",\n        \"trick dream\": \"Trick Dream\",\n        \"trick-color\": \"Trick-Color\",\n        \"tricklot\": \"TrickLot\",\n        \"tridisaster\": \"Tridisaster\",\n        \"trifle\": \"とらいふる\",\n        \"triflehouse\": \"とらいフルハウス\",\n        \"triflingbook\": \"TriflingBook\",\n        \"trigger.m\": \"trigger.m\",\n        \"trinitron cg\": \"トリニトロンCG\",\n        \"trinity kyoudan\": \"トリニティ教団\",\n        \"trinitysaber\": \"トリニティセイバー\",\n        \"trip dancer\": \"TRIP DANCER\",\n        \"trip drip\": \"trip drip\",\n        \"triple luck\": \"Triple Luck\",\n        \"triple n\": \"TRIPLE N\",\n        \"triple pinch\": \"とりぷるぴんち!\",\n        \"triplebunny\": \"TripleBunny\",\n        \"troid-oh\": \"トロイ堂\",\n        \"trok\": \"TRoK\",\n        \"trompeloeil\": \"TROMPELOEILL\",\n        \"troopingout\": \"TROOPINGOUT\",\n        \"tropical sudachi\": \"トロピカルすだち\",\n        \"trough-bird\": \"Trough-Bird\",\n        \"trubka\": \"trubka\",\n        \"true ride\": \"True RIDE\",\n        \"true-bell\": \"True-Bell\",\n        \"trueblue\": \"trueblue\",\n        \"trush\": \"トラッシュ\",\n        \"truth child\": \"Truth Child\",\n        \"tryset break\": \"TRYSET Break\",\n        \"ts naienki\": \"TS内燃機\",\n        \"ts revolver\": \"TSリボルバー\",\n        \"ts-complex2nd\": \"ts-complex2nd\",\n        \"tsk\": \"TSK\",\n        \"tsk-bar\": \"TSK-BAR\",\n        \"tsm\": \"TSM\",\n        \"tsu ga mittsu.\": \"「つ」がみっつ。\",\n        \"tsubo\": \"TSUBO\",\n        \"tsubo r\": \"つぼR\",\n        \"tsuboya\": \"つぼや\",\n        \"tsubuan doumei\": \"つぶあん同盟\",\n        \"tsuchinoko bokujou\": \"つちのこ牧場\",\n        \"tsuinte\": \"ついんて!\",\n        \"tsujigiri cross chop\": \"辻斬りクロスチョップ\",\n        \"tsujikaidou\": \"辻街道\",\n        \"tsukareno\": \"つかれの\",\n        \"tsukasa bullet\": \"司弾\",\n        \"tsuki no kurai bubun\": \"霸\",\n        \"tsuki no mizu kikaku\": \"月の水企画\",\n        \"tsuki to koori no\": \"ツキトコオリノ\",\n        \"tsuki wa koyoi mo kurikaesu\": \"つきはこよいもくりかえす\",\n        \"tsukigami zukan\": \"月神図鑑\",\n        \"tsukiguni\": \"月国\",\n        \"tsukikusa koubou\": \"月草工房\",\n        \"tsukimachi soft\": \"つきまちそふと\",\n        \"tsukimigusa\": \"月見草\",\n        \"tsukimitake\": \"つきみたけ\",\n        \"tsukino chikake ikoku\": \"つきのちかけいこく\",\n        \"tsukinoyuki\": \"つきのゆき\",\n        \"tsukisame koubou\": \"月鮫工房\",\n        \"tsukitake\": \"Tsukitake\",\n        \"tsukiyo no yume\": \"ツキヨノユメ\",\n        \"tsukiyogarasu\": \"月夜鴉\",\n        \"tsukkumo mattoron\": \"つっくもまっとろん!\",\n        \"tsukudani no sato\": \"つくだにの里\",\n        \"tsukune-ya\": \"つくね屋\",\n        \"tsukupare\": \"つくぱれ\",\n        \"tsumarimashita\": \"詰まりました\",\n        \"tsumasaki label\": \"ツマサキレーベル\",\n        \"tsumayoji\": \"つまようじ\",\n        \"tsundere oniku\": \"ツンデレお肉\",\n        \"tsuniverse\": \"tsuniverse\",\n        \"tsunken\": \"ツン研\",\n        \"tsupan\": \"ツパン\",\n        \"tsurezurezuki\": \"徒然月\",\n        \"tsurimura\": \"ツリムラ\",\n        \"tsurugashima heights\": \"鶴ヶ島ハイツ\",\n        \"tsurumachi\": \"鶴町\",\n        \"tsurumiku\": \"つるみく\",\n        \"tsurupeta kenkyuusho\": \"つるぺた研究所\",\n        \"tsurutsuru ippai\": \"つるつるいっぱい\",\n        \"tsurutsuru pain\": \"つるつるぱいん\",\n        \"tsutakazura mau mau\": \"ツタカズラまうまう\",\n        \"tsutsumorien\": \"筒森園\",\n        \"tsxy\": \"tsxy\",\n        \"ttsy\": \"TTSY\",\n        \"tubasa\": \"翼\",\n        \"tuck cross\": \"Tuck Cross\",\n        \"tuiteyukenuyo\": \"ついてゆけぬよ\",\n        \"tukamori club\": \"ツカモリ倶楽部\",\n        \"tukibuto\": \"TUKIBUTO\",\n        \"tukimi atelier\": \"ツキミアトリエ\",\n        \"tumble weed\": \"TUMBLE WEED\",\n        \"tuned by aiu\": \"Tuned by AIU\",\n        \"tunnel\": \"とんねる\",\n        \"tunnel love letter\": \"Tunnel Love Letter\",\n        \"turbanist\": \"たーばにすと\",\n        \"turing game\": \"Turing Game\",\n        \"turning point\": \"Turning Point\",\n        \"turtle cookies\": \"Turtle Cookies\",\n        \"twin heart\": \"TWIN HEART\",\n        \"twin magnet\": \"ツインマグネット\",\n        \"twin tail\": \"TWIN TAIL\",\n        \"twinbunny\": \"Twinbunny\",\n        \"twinkle hearts\": \"twinkle hearts\",\n        \"twinkle snows\": \"twinkle snows\",\n        \"twinkle teacher\": \"てぃんくる☆ティーチャー\",\n        \"twinklestar\": \"ティンクルスター\",\n        \"twinscatear\": \"ついんずかてぃあ\",\n        \"twintel\": \"TWINTEL\",\n        \"two tone color\": \"－・～\",\n        \"two-handed axe\": \"Two-handed Axe\",\n        \"twocraft\": \"TwoCraft\",\n        \"tyatsune\": \"茶常\",\n        \"tyongera kenkyuujo\": \"ちょんげら研究所\",\n        \"type-57\": \"TYPE-57\",\n        \"type-g\": \"Type-G\",\n        \"type-spare\": \"TYPE-SPARE\",\n        \"u-me soft\": \"U・Me SOFT\",\n        \"u-ral\": \"うーらる\",\n        \"u-room\": \"U-ROOM\",\n        \"u-type\": \"U-Type\",\n        \"u.m.e.project\": \"U.M.E.Project\",\n        \"u.r.c\": \"U.R.C\",\n        \"u.zoo\": \"U.ZOO\",\n        \"ua\": \"UA\",\n        \"ub\": \"UB\",\n        \"ubiquitous\": \"ユビキタス\",\n        \"uchinon\": \"うちのん\",\n        \"uchiwa ryou nagon\": \"団扇涼納言\",\n        \"uchizum\": \"UCHIZUM\",\n        \"uchoten\": \"有頂天\",\n        \"uchu\": \"Uchu\",\n        \"uchuu neko-juu kougyou\": \"宇宙猫獣工業\",\n        \"uchuu porta\": \"宇宙☆ポルタ\",\n        \"uchuusen shoujigou\": \"宇宙船庄司号\",\n        \"ucyu-kago\": \"宇宙カゴ\",\n        \"udon-ya\": \"うどんや\",\n        \"uzukikan\": \"卯月館\",\n        \"ueda-san.\": \"ウエダさん。\",\n        \"ugaya 74th\": \"ウガヤ74th\",\n        \"uge connection\": \"UGEコネクション\",\n        \"ugeman\": \"うげ漫\",\n        \"ugokuna pharmacy theta\": \"うごくな薬局θ\",\n        \"ugou no shuu\": \"烏合ノ衆\",\n        \"uguisu kagura\": \"ウグイスカグラ\",\n        \"uguisuya\": \"莺屋\",\n        \"uhii\": \"うひい\",\n        \"uirokai\": \"ういろうかい\",\n        \"uji\": \"蛆\",\n        \"uk-works\": \"UK-WORKS\",\n        \"ukikusaya\": \"うきくさ屋\",\n        \"ultimania\": \"アルティマニア\",\n        \"ultimate works\": \"アルティメットワークス\",\n        \"ultra one\": \"ULTRA ○NE\",\n        \"ultra siccative\": \"ウルトラシッカチーフ\",\n        \"ultra violet\": \"ULTRA Violet\",\n        \"ululun\": \"UluluN\",\n        \"uma goya\": \"UMA小屋\",\n        \"uma no are\": \"うまのあれ\",\n        \"uma no hone\": \"うまのほね\",\n        \"umakatei\": \"うまか亭\",\n        \"umami zeitaku dashi\": \"うまみ贅沢出汁\",\n        \"umanori kishidan\": \"うまのり騎士団\",\n        \"umari-ya\": \"埋まり屋\",\n        \"umasugiyu\": \"うますぎゆ\",\n        \"umaya\": \"厩\",\n        \"umbrella.corp\": \"UMBRELLA.CORP\",\n        \"ume-nyan-tei\": \"うめにゃん亭\",\n        \"umeboshi\": \"梅ぼし\",\n        \"umehimeden\": \"梅姫殿\",\n        \"umekkodo\": \"うめっこ堂\",\n        \"umenonukaduke\": \"うめのぬかづけ\",\n        \"umesuke\": \"梅助\",\n        \"umigarasu madoushi dan\": \"海烏魔道士団\",\n        \"umihan\": \"うみはん\",\n        \"umikaidou\": \"海貝堂\",\n        \"uminari\": \"ウミナリ\",\n        \"uminekotei\": \"うみねこ亭\",\n        \"uminoie hamanasu\": \"海の家はまなす\",\n        \"uminouie\": \"海納家\",\n        \"umipro\": \"umiプロ\",\n        \"un gallo\": \"Un gallo\",\n        \"un-moto shoko\": \"云元書庫\",\n        \"unagi no nedoko\": \"うなぎの寝床\",\n        \"unaginobori\": \"うなぎのぼり\",\n        \"uncats\": \"UNCATS\",\n        \"unceder\": \"アンシーダー\",\n        \"undead\": \"Undead\",\n        \"undel\": \"あんでる\",\n        \"under colony\": \"Under Colony\",\n        \"under control\": \"UNDER CONTROL\",\n        \"underground campaign\": \"Underground Campaign\",\n        \"undermoon\": \"アンダームーン\",\n        \"underwhite\": \"Underwhite\",\n        \"undouken\": \"雲洞軒\",\n        \"uneune-kissa\": \"うねうね喫茶\",\n        \"unfixed\": \"UNFIXED\",\n        \"ungrofish\": \"地下魚!\",\n        \"unholy production\": \"アンホリ☆プロダクション\",\n        \"uni\": \"UNI\",\n        \"unicorn-a\": \"unicorn-a\",\n        \"unimayo chuubou\": \"ウニマヨ厨房\",\n        \"union of the snake\": \"Union of the Snake\",\n        \"unique\": \"ゆにきゅう\",\n        \"unisonshift\": \"ユニゾンシフト\",\n        \"unit cheese\": \"ゆにっとちーず\",\n        \"unitonasubi\": \"うにとなすび\",\n        \"uniuni\": \"uniuni\",\n        \"uniya\": \"雲丹屋\",\n        \"uniyaa\": \"うに屋あ\",\n        \"unizo\": \"うに蔵\",\n        \"unknown\": \"アンノウン\",\n        \"unlucky strike\": \"アンラッキーストライク\",\n        \"unmei no ikasumi\": \"運命のイカスミ\",\n        \"unnunkannun\": \"うんぬんかんぬん\",\n        \"unreal\": \"UNreal\",\n        \"unshuu sakuramochi\": \"温州桜餅\",\n        \"unyarara daihanten\": \"うにゃらら大飯店\",\n        \"uohaman\": \"魚歯満\",\n        \"uotatsu18kinshiten\": \"魚辰一八金支店\",\n        \"uozanoko\": \"うお座の子\",\n        \"upsp\": \"UPSP\",\n        \"ura fmo\": \"裏FMO\",\n        \"ura kent no himitsu kichi\": \"裏KENTの秘密基地\",\n        \"ura makura\": \"裏まくら\",\n        \"ura meshiya\": \"裏飯屋\",\n        \"ura no hikidashi\": \"うらのひきだし\",\n        \"ura no kami\": \"裏のカミ\",\n        \"ura urethan\": \"裏ウレタン\",\n        \"ura.\": \"URA.\",\n        \"urabashi seisaku\": \"裏橋製作\",\n        \"urabb28 gou\": \"uraBB28号\",\n        \"uradoori no nukemichi\": \"裏通りの抜け道\",\n        \"uradora mangan\": \"裏ドラ満貫\",\n        \"uragiri no doukutsu\": \"うらぎりのどうくつ\",\n        \"urahushigi\": \"裏不思議\",\n        \"urainutei\": \"裏イヌ亭\",\n        \"urakaryuu\": \"裏火竜\",\n        \"uraken\": \"うらけん\",\n        \"urakusog\": \"urakusoG\",\n        \"urama mejirushi\": \"裏間目印\",\n        \"uramac\": \"うらまっく\",\n        \"uraniwa\": \"ウラニワ\",\n        \"uraroji\": \"ウラロジ\",\n        \"uraryon kikaku\": \"うらりょん企画\",\n        \"urasazan\": \"うらさざん\",\n        \"urawa anime festa\": \"浦和アニメフェスタ\",\n        \"uraya\": \"ura屋\",\n        \"urban doujin magazine\": \"街中同人誌會\",\n        \"uresen\": \"熟れ専\",\n        \"uresuji awabi\": \"熟レ筋アワビ\",\n        \"ureure kaikai\": \"嬉嬉怪怪\",\n        \"uribox\": \"ウリボックス\",\n        \"urimarutei\": \"うりまる亭\",\n        \"uritz\": \"Uritz\",\n        \"uro\": \"URO\",\n        \"uropyon\": \"うろぴょん☆\",\n        \"urumin\": \"うるみん\",\n        \"ururuc\": \"URURUC\",\n        \"urusai kokuen\": \"うるさい黒鉛\",\n        \"urushiya seitai jikkenshitsu\": \"漆屋生態実験室\",\n        \"us\": \"US\",\n        \"usa gunbu\": \"USA軍部\",\n        \"usaburo\": \"うさブロ！\",\n        \"usacastle\": \"Usacastle\",\n        \"usaden\": \"うさでん\",\n        \"usagi ame\": \"うさぎあめ\",\n        \"usagi no ana\": \"ウサギの穴\",\n        \"usagi no shippo\": \"うさぎのしっぽ\",\n        \"usagi paradise\": \"うさぎパラダイス\",\n        \"usagi purin\": \"うさぎプリン\",\n        \"usagi to kame\": \"うさぎとかめ\",\n        \"usagi youchien\": \"うさぎ幼稚園\",\n        \"usagi youjinbou\": \"うさぎ用心棒\",\n        \"usagigoya\": \"うさぎ小屋\",\n        \"usagijiru\": \"うさぎじる\",\n        \"usagizadou\": \"兎座堂\",\n        \"usamimi syndrome\": \"うさみみしんどろーむ\",\n        \"usanamaco\": \"うさなまこ\",\n        \"usaneri island\": \"うさねり★アイランド\",\n        \"usendou plus 1\": \"優先度+1\",\n        \"ushichichi bokujou\": \"うしちち牧場\",\n        \"ushinokokumairi\": \"ウシノコクマイリ\",\n        \"ushitora-dou\": \"丑寅堂\",\n        \"uso\": \"噓\",\n        \"uso kara makoto\": \"うそからまこと\",\n        \"uso seisakusho\": \"うそ製作所\",\n        \"usoppu land\": \"ウソップランド\",\n        \"usotsuki honey\": \"うそつきHONEY\",\n        \"usui hon hitori roudoku kai\": \"薄い本一人朗読会\",\n        \"usukawa kintsuba\": \"薄皮きんつば\",\n        \"usume sanchi\": \"うすめ産地\",\n        \"utachan honpo\": \"ウタチャンホンポ\",\n        \"utadokei\": \"ウタドケイ\",\n        \"utage\": \"宴\",\n        \"utahime\": \"うたひめ\",\n        \"utakata gentou-ya\": \"泡沫幻燈屋\",\n        \"utakata.\": \"うたかた。\",\n        \"utaneya\": \"うたね屋\",\n        \"utanone dou\": \"うたのね堂\",\n        \"utataneyashiki\": \"転寝屋敷\",\n        \"utinotyutai\": \"ウチの中隊\",\n        \"utsumuki garden\": \"うつむきガーデン\",\n        \"utsusemi shuu\": \"空蝉衆\",\n        \"utsutsutsutsu.\": \"うつつつつ。\",\n        \"uu-zone\": \"UU-ZONE\",\n        \"uwasa no ero radiohead\": \"噂のエロレディオヘッド\",\n        \"uwd\": \"UWD\",\n        \"uxmal\": \"Uxmal\",\n        \"uzigaya\": \"氏賀屋\",\n        \"uzomzo\": \"UZOMZO\",\n        \"uzumaki shikenkan\": \"うずまき試験管\",\n        \"v. hercules\": \"V・ヘラクレス\",\n        \"v muscle\": \"Vまっする\",\n        \"v112cr\": \"ぶい112CR\",\n        \"vachicalist\": \"Vachicalist\",\n        \"vadass\": \"Vadass\",\n        \"vagina dentata\": \"有齒女陰\",\n        \"valiant\": \"VALIAN党\",\n        \"valkyria\": \"わるきゅ～れ\",\n        \"valrhona\": \"VALRHONA\",\n        \"valssu\": \"valssu\",\n        \"vampire berry\": \"Vampire*Berry\",\n        \"vanadis\": \"Vanadis\",\n        \"vanilla sky\": \"VANILLA SKY\",\n        \"vanilla tenrankai\": \"バニラ展覧会\",\n        \"vanilla type\": \"バニラタイプ\",\n        \"vanilla-dou max\": \"バニラ堂MAX\",\n        \"vanishing point.\": \"Vanishing Point.\",\n        \"vanity press\": \"Vanity Press\",\n        \"vashadow\": \"VASHADOW\",\n        \"vegas project\": \"VEGAS PROJECT\",\n        \"velvet rose\": \"Velvet Rose\",\n        \"venus\": \"VENUS\",\n        \"venuspunk\": \"VENUSPUNK\",\n        \"ver.mimizuk\": \"Ver.みみずく\",\n        \"ver9\": \"Ver9\",\n        \"verdant force\": \"Verdant Force\",\n        \"vermiculite\": \"ばーみきゅらいと\",\n        \"vermilion\": \"ばみりおん\",\n        \"verydrop\": \"Verydrop\",\n        \"veto\": \"VETO\",\n        \"viento campanilla\": \"Viento Campanilla\",\n        \"viewness\": \"Viewness\",\n        \"vincent\": \"ヴィンセント\",\n        \"vinegar mackerel\": \"Vinegar Mackerel\",\n        \"violence club\": \"ばいおれんす倶楽部\",\n        \"violet order\": \"VIOLET ORDER\",\n        \"violetstar\": \"Violetstar\",\n        \"vip games\": \"VIP Games\",\n        \"virginal\": \"VIRGINAL\",\n        \"virophilia\": \"virophilia\",\n        \"viscaria\": \"VISCARIA\",\n        \"vista\": \"VISTA\",\n        \"visual biscuits\": \"Visual Biscuits\",\n        \"vitamin gohan\": \"ビタミンごはん\",\n        \"vitamin soft\": \"ビタミン\",\n        \"viva mikinosuke\": \"ビバ・みきのすけ\",\n        \"vivid dot\": \"vivid_dot\",\n        \"vivid flag\": \"Vivid Flag\",\n        \"vivido\": \"ヴィヴィ堂\",\n        \"vm500\": \"VM500\",\n        \"vogelschwein\": \"フォーゲルシュヴァイン\",\n        \"vogue\": \"VOGUE\",\n        \"voice of flower\": \"Voice of flower\",\n        \"voisin\": \"VOISIN\",\n        \"vollmond\": \"VOLLMOND\",\n        \"voltcompany.\": \"VOLTCOMPANY.\",\n        \"volutes\": \"VOLUTES\",\n        \"volvox\": \"VOLVOX\",\n        \"vpans extasy\": \"Vパン'sエクスタシー\",\n        \"vulcannu\": \"ヴぁるかん濡\",\n        \"vulgar bull\": \"VULGAR BULL\",\n        \"vyowolf\": \"vyowolf\",\n        \"w-room\": \"W-ROOM\",\n        \"waage\": \"Waage\",\n        \"wabi sabi wasabi\": \"ワビサビワサビ\",\n        \"wag the dog\": \"Wag The Dog\",\n        \"wagamama dou\": \"我儘堂\",\n        \"wagarashiya\": \"和がらし屋\",\n        \"wagashi-ya\": \"わがし屋\",\n        \"wagaya no kurorekishi\": \"我が家の黒歴史\",\n        \"wainable\": \"ワイナブル\",\n        \"wakamaker\": \"wakamaker\",\n        \"wakayotareso\": \"わかよたれそ\",\n        \"waki waki koubou\": \"わきわき工房\",\n        \"wakusei nostalgia\": \"惑星ノスタルジー\",\n        \"wakusei-teki shukou\": \"惑星的趣向\",\n        \"wakuseiburo\": \"ワクセイブロ\",\n        \"wakuwaku shotaland\": \"わくわくショタランド\",\n        \"walpurgisnacht\": \"Walpurgisnacht\",\n        \"wamusho\": \"わむショ\",\n        \"wando wando\": \"ワンドワンド\",\n        \"wanko-tei\": \"わんこ亭\",\n        \"wankoroya\": \"わんころ屋\",\n        \"wannyan club\": \"ワンニャン倶楽部\",\n        \"wanpaku brothers\": \"わんぱくブラザーズ\",\n        \"wanpaku shoujo\": \"腕白少女\",\n        \"wanton land kumiai\": \"とわんとんランド組合\",\n        \"wanwan oukoku\": \"わんわん王国\",\n        \"wanwan teikoku\": \"わんわん帝国\",\n        \"wanwanhouse\": \"わんわんはうす\",\n        \"wanwano\": \"わんわんお\",\n        \"wappoi\": \"わっぽい\",\n        \"warainaki festa\": \"ワライナキフェスタ\",\n        \"ware pon\": \"われPON\",\n        \"wareago\": \"ワレアゴ\",\n        \"waribashi kouka\": \"割り箸効果\",\n        \"warukuriya\": \"ワルクリ屋\",\n        \"wasabi mochi\": \"わさびもち\",\n        \"wasabiberry jam\": \"Wasabiberry JAM\",\n        \"wasei nekohime\": \"和製猫姫\",\n        \"wasre kaban\": \"忘れカバン\",\n        \"wasshoi koubou\": \"ワッショイ☆工房\",\n        \"waste\": \"Waste\",\n        \"wastepapermarket\": \"WastePaperMarket\",\n        \"wasukoro\": \"わすころ\",\n        \"wasuraruru tegami\": \"忘らるる手紙\",\n        \"watanuki shinguten\": \"綿貫寝具店\",\n        \"watanuki tanuki\": \"わたぬきたぬき\",\n        \"wataridori\": \"わたりどり\",\n        \"wataridori no rakuen\": \"渡り鳥の楽園\",\n        \"watashinchi\": \"わたしンち\",\n        \"water beryl\": \"ウォーターベリル\",\n        \"water closet\": \"water closet\",\n        \"water garden\": \"水の庭\",\n        \"water valley\": \"うぉ～た～ばれ～\",\n        \"watosato\": \"ワトサト\",\n        \"wave\": \"うぇ～ぶ\",\n        \"wawomidasu\": \"和を乱su\",\n        \"wchees\": \"Wchees\",\n        \"web knight\": \"ウェブ乃藤\",\n        \"webstudioofflimits\": \"WebStudioOffLimits\",\n        \"wechselhaft\": \"ヴェクセルハフト\",\n        \"wednesday\": \"Wednesday\",\n        \"wendybell\": \"ウェンディベル\",\n        \"west island\": \"ウエストアイランド\",\n        \"west vision\": \"ウエストビジョン\",\n        \"wheel\": \"ホイール\",\n        \"whirl pool\": \"WHIRL POOL\",\n        \"white clover\": \"ほわいとくろーばー\",\n        \"white croaker\": \"White croaker\",\n        \"white cross\": \"ホワイトクロス\",\n        \"white elephant\": \"WHITE ELEPHANT\",\n        \"white garden\": \"WHITE GARDEN\",\n        \"white heart\": \"WHITE HEART\",\n        \"white identity\": \"White Identity\",\n        \"white lolita\": \"White Lolita\",\n        \"white moon\": \"WHITE MOON\",\n        \"white note\": \"ホワイトノート\",\n        \"white out\": \"WHITE OUT\",\n        \"white roots\": \"white roots\",\n        \"white sail\": \"ホワイトセイル\",\n        \"white spring\": \"White Spring\",\n        \"whiteapple\": \"whiteapple\",\n        \"whitecheese\": \"ほわいとちぃず\",\n        \"whitecute\": \"WhiteCute\",\n        \"whitemoor\": \"WhiteMoor\",\n        \"whitepink\": \"ホワイトピンク\",\n        \"whitewill\": \"WHITEWILL\",\n        \"wi-fe hacker\": \"Wi-Fe hacker\",\n        \"wild duck\": \"WILD DUCK\",\n        \"wild heart\": \"ワイルドハート\",\n        \"will be well\": \"WILL BE WELL\",\n        \"will tame\": \"ウィルテイム\",\n        \"win win\": \"win win\",\n        \"wind mail\": \"WIND MAIL\",\n        \"windfall\": \"WINDFALL\",\n        \"windmill\": \"ういんどみる\",\n        \"windmill oasis\": \"ういんどみるOasis\",\n        \"windtone\": \"うぃんどとーん\",\n        \"windwave\": \"WINDWAVE\",\n        \"windy wing\": \"WiNDY WiNG\",\n        \"wing hero\": \"ウィングヒーロー\",\n        \"wing kyanite\": \"Wing Kyanite\",\n        \"wingbinta\": \"ウイングビンタ\",\n        \"winsuka.\": \"うぃんすか。\",\n        \"winter garden\": \"Winter Garden\",\n        \"wishdou\": \"うぃっしゅ堂\",\n        \"wisteria\": \"Wisteria\",\n        \"witchflame\": \"WitchFlame\",\n        \"withdrop\": \"ウィズドロップ\",\n        \"withsoda\": \"withsoda\",\n        \"wizaldx\": \"WizaldX\",\n        \"wlc soft\": \"WLCソフト\",\n        \"wolfs tail radio station\": \"Wolf's Tail Radio Station\",\n        \"wolkenkratzer\": \"Wolkenkratzer\",\n        \"wonder fool\": \"Wonder Fool\",\n        \"wonderful life\": \"Wonderful Life\",\n        \"wonderful one\": \"WONDERFUL ONE\",\n        \"wonderia\": \"わんだりあ\",\n        \"wordgear\": \"WordGear\",\n        \"words worth\": \"ワーズワース\",\n        \"works makes evolution\": \"Works makes evolution\",\n        \"workstation r\": \"ワークステーションR\",\n        \"world box\": \"WORLD BOX\",\n        \"world lover\": \"world lover\",\n        \"woshiro\": \"をしろ\",\n        \"wotona no namae\": \"をとなのなまえ\",\n        \"woyoyo\": \"ヲヨヨ\",\n        \"wrench studio\": \"WRENCH STUDIO\",\n        \"wriggle souzeme tomonokai\": \"リグル総攻め友の会\",\n        \"ws.\": \"WS.\",\n        \"wxy comics\": \"WXY COMICS\",\n        \"x model\": \"X∞MODEL\",\n        \"x-10sion\": \"X-10SION\",\n        \"x-bangbang\": \"X-bangbang\",\n        \"x-tei\": \"えっくす亭\",\n        \"x-toys\": \"X-TOYS\",\n        \"x.t.c\": \"X.T.C\",\n        \"xain\": \"XAIN\",\n        \"xenoms\": \"Xenoms\",\n        \"xephs artwork\": \"Xeph's Artwork\",\n        \"xikyougumi\": \"賽響組\",\n        \"xpanda\": \"Xpanda\",\n        \"xration\": \"Xration\",\n        \"xuse\": \"ザウス\",\n        \"xxkorori\": \"××コロリ\",\n        \"xxx\": \"トリプルエックス\",\n        \"xyzyroh\": \"朱儒楼\",\n        \"y no shokutaku\": \"Yの食卓\",\n        \"y-nrg system\": \"Y-NRG SYSTEM\",\n        \"ya-ho-games\": \"ya-ho-games\",\n        \"ya-zy\": \"YA-ZY\",\n        \"yaboudo project\": \"野望堂PROJECT\",\n        \"yabougumi\": \"野望組\",\n        \"yabuno seisakusho\": \"やぶの製作所\",\n        \"yabure kabure\": \"やぶれかぶれ\",\n        \"yaburi dokoro\": \"破り処\",\n        \"yachan coffee\": \"やちゃん珈琲\",\n        \"yachu onsen\": \"やちゅ温泉\",\n        \"yadapot\": \"やだぽっと\",\n        \"yadokani daikaiten\": \"やどかに大回転\",\n        \"yagami hyakka\": \"八神百科\",\n        \"yagezawa bunko\": \"やげざわ文庫\",\n        \"yagiya\": \"山羊屋\",\n        \"yah-yah-doh\": \"YAH-YAH-DOH\",\n        \"yajinsei ra-men\": \"野人性ラーメン\",\n        \"yajirushi key\": \"矢印キー\",\n        \"yajiya\": \"八至屋\",\n        \"yajuu kazoku\": \"野獣家族\",\n        \"yakan hikou\": \"夜間飛行\",\n        \"yakan honpo\": \"薬缶本舗\",\n        \"yakata\": \"館\",\n        \"yaki lemon\": \"焼きレモン\",\n        \"yaki tomahawk steak\": \"烧きトマホークステーキ\",\n        \"yakihata nyuugyou\": \"焼畑乳業\",\n        \"yakihebi\": \"やきへび\",\n        \"yakimisomura\": \"ヤキミソ村\",\n        \"yakimorokoshi\": \"やきもろこし\",\n        \"yakinasu teishoku\": \"焼き茄子定食\",\n        \"yakiniku teishoku\": \"焼肉定食\",\n        \"yakinikuya yusi\": \"焼肉屋由史\",\n        \"yakisaba teishoku\": \"焼鯖定食\",\n        \"yakisaketeishoku\": \"焼鮭定食\",\n        \"yakisoba rengo\": \"やきそば連合\",\n        \"yakitate jamaica\": \"焼きたてジャマイカ\",\n        \"yakou chaofan\": \"夜光チャーハン\",\n        \"yakousei fan club\": \"夜行性ファンクラブ\",\n        \"yakouyousei\": \"夜光幼性\",\n        \"yakusoku no kaigansen\": \"約束の海岸線\",\n        \"yakutsk tokkoutai\": \"ヤクーツク特攻隊\",\n        \"yama momo kajitsu\": \"山桃果実\",\n        \"yamaboshike\": \"山星家\",\n        \"yamaburoya\": \"やまぶろ屋\",\n        \"yamada air base\": \"YAMADA AIR BASE\",\n        \"yamada factory\": \"山田ファクトリー\",\n        \"yamada ichizoku.\": \"山田一族。\",\n        \"yamada koubou\": \"山田工房\",\n        \"yamadake\": \"山田家\",\n        \"yamadaya\": \"山田屋\",\n        \"yamagarasu\": \"やまガラス\",\n        \"yamagiwa art cg studio\": \"ヤマギワアート CG STUDIO\",\n        \"yamago house\": \"山後ハウス\",\n        \"yamaguchi print\": \"やまぐちぷりんと\",\n        \"yamaguchirou\": \"やまぐち楼\",\n        \"yamakawa denenhuukei\": \"山川田園風景\",\n        \"yamami no yado\": \"やまみの宿\",\n        \"yamaori\": \"YAMAORI\",\n        \"yamato nadeshiko tei\": \"大和なでしこ亭\",\n        \"yamato soft\": \"大和ソフト\",\n        \"yamazakura\": \"山櫻\",\n        \"yami kaiten zushi\": \"闇回転寿司\",\n        \"yami ni ugomeku\": \"闇に蠢く\",\n        \"yami no naka\": \"闇の中\",\n        \"yaminabe daiichi kantai\": \"闇鍋第一艦隊\",\n        \"yamotodou rakugakiichi\": \"矢本堂落書市\",\n        \"yanagi-tei\": \"やなぎ亭\",\n        \"yanagigaeru\": \"ヤナギガエル\",\n        \"yanagisegawa\": \"柳瀬川\",\n        \"yancha club\": \"やんちゃ倶楽部\",\n        \"yaneura tv\": \"屋根裏TV\",\n        \"yanonoshiya\": \"やののし屋\",\n        \"yaoya\": \"やお屋\",\n        \"yapis company\": \"YAPIS COMPANY\",\n        \"yappari ao ga suki\": \"やっぱり青が好き\",\n        \"yappy-yappy\": \"ヤッピーヤッピー\",\n        \"yarakashidan\": \"やらかし団\",\n        \"yareba dekiru ko.\": \"やればできる娘。\",\n        \"yariiya\": \"枪衣屋\",\n        \"yaritaihodai.\": \"やりたいほうだい。\",\n        \"yasakanomagatama\": \"八坂の勾玉\",\n        \"yashiromori\": \"ヤシロモリ\",\n        \"yashiroya\": \"やしろ屋\",\n        \"yasrin-do\": \"やすりん堂\",\n        \"yasudanchi\": \"ヤスダンチ\",\n        \"yasunaoz\": \"安直Z\",\n        \"yasuomi-craft\": \"Yasuomi-Craft\",\n        \"yasutakeya\": \"ヤスタケ屋\",\n        \"yasyokutei\": \"夜食亭\",\n        \"yatagarasu\": \"八咫烏\",\n        \"yatsufusa koubou\": \"八房工房\",\n        \"yatsugami ryouriten\": \"八ツ神料理店\",\n        \"yatsukaan\": \"夜束庵\",\n        \"yawaragi bin\": \"やわらぎ瓶\",\n        \"yawaraka gate\": \"やわらかGATE\",\n        \"yawaraka kougyou\": \"やわらか工業\",\n        \"yawaraka okashiya\": \"やわらか御菓子屋\",\n        \"yawaraka taiyou\": \"やわらか太陽\",\n        \"yaya hinata-ya\": \"稍日向屋\",\n        \"yayoi fantasy zone\": \"やよいファンタジーゾーン\",\n        \"yayui\": \"やゆい\",\n        \"yeast house\": \"いーすとはうす\",\n        \"yellow apple\": \"YELLOW☆APPLE\",\n        \"yellow tag\": \"YELLOW TAG\",\n        \"yellowcotton\": \"yellowcotton\",\n        \"yes sir.\": \"Yes sir.\",\n        \"yggdrasil\": \"イグドラシル\",\n        \"ylang-ylang\": \"イランイラン\",\n        \"ymc\": \"YMC\",\n        \"ymi factory\": \"YMI factory\",\n        \"yo wa okazu wo shomou shiteoru\": \"余はおかずを所望しておる\",\n        \"yoake andon\": \"ヨアケ行燈\",\n        \"yoban left\": \"よばんれふと\",\n        \"yogurt\": \"yogurt\",\n        \"yohanemu\": \"よはねむ\",\n        \"yohitama\": \"Yohitama\",\n        \"yoidore rodeo\": \"酔いどれロデオ\",\n        \"yoidore usagitei\": \"酔いどれ兎亭\",\n        \"yoiko books\": \"よい子ブックス\",\n        \"yojouhan\": \"四畳半\",\n        \"yojouhan factory\": \"四畳半ファクトリー\",\n        \"yojouhan toshi\": \"四畳半都市\",\n        \"yokainosu\": \"ヨーカイノス\",\n        \"yokazetei\": \"夜風亭\",\n        \"yoke\": \"Yoke\",\n        \"yokohama junky\": \"Yokohama Junky\",\n        \"yokohama zza koubou\": \"横浜ZZA工房\",\n        \"yokoshima\": \"ヨコシーマ\",\n        \"yokoshimanchi.\": \"横島んち。\",\n        \"yokoyamagumi\": \"横山組\",\n        \"yokubou no tou\": \"欲望の塔\",\n        \"yolki palki\": \"ヨールキ・パールキ\",\n        \"yomamagoto\": \"夜ままごと\",\n        \"yomiji hyakki yakou\": \"黄泉路百鬼夜行\",\n        \"yomo zakkaten\": \"四方雑貨店\",\n        \"yomoda yomo japan\": \"よもだよもJAPAN\",\n        \"yomogi\": \"よもぎ\",\n        \"yomogiya\": \"よもぎや\",\n        \"yomosue doukoukai\": \"ヨモスエ同好会\",\n        \"yomosugara\": \"よもすがら\",\n        \"yomothuhirasaka\": \"黄泉比良坂\",\n        \"yomoyama sand\": \"よもやまサンド\",\n        \"yonakiya\": \"よなきや\",\n        \"yonmasuya\": \"四桝屋\",\n        \"yorimichi\": \"よりみち\",\n        \"yorozuya miyakotei\": \"よろず屋みやこ亭\",\n        \"yoru no benkyoukai\": \"夜の勉強会\",\n        \"yorugumi\": \"よるぐみ。\",\n        \"yoruyama no kyuukeijo\": \"夜山の休憩所\",\n        \"yosei yumeshiko\": \"酔セイ夢シコ\",\n        \"yoshida gorou shoukai\": \"吉田悟郎商會\",\n        \"yoshida kingdom\": \"ヨシダキングダム\",\n        \"yoshiga dokoro\": \"吉賀所\",\n        \"yoshii tech sha\": \"吉井テック社\",\n        \"yoshitakashi athletic\": \"吉丘アスレチック\",\n        \"yotayota honpo\": \"よたよた本舗\",\n        \"yotogizousi\": \"夜伽草紙\",\n        \"yotsumi works\": \"よつみわーくす\",\n        \"yottanchi\": \"よったんち\",\n        \"you you tsuushin\": \"遊遊通信\",\n        \"you2hp\": \"YOU2HP\",\n        \"youchien\": \"妖痴艶\",\n        \"yougekisya\": \"幼撃舎\",\n        \"youjo sentai loliconger\": \"幼女戦隊口リコンジャー\",\n        \"youjo teishoku\": \"Youjo定食\",\n        \"youkai ankake\": \"妖怪あんかけ\",\n        \"youmu no shio\": \"ようむのしお\",\n        \"youmusya\": \"遥夢社\",\n        \"yousei allergen\": \"幼性アレルゲン\",\n        \"yousei imagination\": \"幼性Imagination\",\n        \"youseimangasya\": \"妖精漫画社\",\n        \"youtou oniku\": \"妖刀お肉\",\n        \"youtoujirushi\": \"洋燈印\",\n        \"youtsuu rock\": \"腰痛ROCK\",\n        \"youyoumu\": \"妖幼夢\",\n        \"yozorairodrops\": \"夜空色ドロップ\",\n        \"ytoh2\": \"YtoH2\",\n        \"yu-gure yane\": \"ゆうぐれ屋根\",\n        \"yu-ta.18\": \"YU-TA.18\",\n        \"yu-topia\": \"佑とぴあ\",\n        \"yu-yake spectrum\": \"夕焼スペクトル\",\n        \"yu-yu tei\": \"YU-YU TEI\",\n        \"yu.\": \"ゆ。\",\n        \"yuasa rengou\": \"ゆあさ連合\",\n        \"yubeshi\": \"甘菓子\",\n        \"yude tamago\": \"ゆで卵\",\n        \"yudenakya nama-beer\": \"ゆでなきゃ生ビール\",\n        \"yudenonno\": \"ゆでのんの\",\n        \"yuga\": \"yuga\",\n        \"yuiumiya\": \"結海屋\",\n        \"yukagenikaga\": \"湯加減いかが?\",\n        \"yukan high zakura\": \"有閑high桜\",\n        \"yukari\": \"縁 -yukari-\",\n        \"yukarita\": \"ゆかりた\",\n        \"yukemuri froster\": \"ゆけむりフロスター\",\n        \"yukemuri inferno\": \"湯けむりインフェルノ\",\n        \"yuki mango\": \"ゆきマンゴー\",\n        \"yuki no hitohira\": \"ユキノヒトヒラ\",\n        \"yuki no iori\": \"ユキノ庵\",\n        \"yuki sumi iori\": \"雪墨庵\",\n        \"yuki-iro\": \"YuKi-IRo\",\n        \"yukidaruma kumiai\": \"ゆきだるま組合\",\n        \"yukima honpo\": \"雪間本舗\",\n        \"yukimi honpo\": \"ゆきみ本舗\",\n        \"yukimi onsen\": \"雪見温泉\",\n        \"yukirins\": \"YUKIRINS\",\n        \"yukisizuku\": \"ゆきしずく\",\n        \"yukisora\": \"ユキソラ\",\n        \"yukitenkan\": \"雪天館\",\n        \"yukyou\": \"ゆきょう\",\n        \"yukyu-kyuka\": \"悠久休暇\",\n        \"yume no kakera\": \"ユメノカケラ\",\n        \"yume no manimani\": \"夢のまにまに\",\n        \"yume no niwatori goya\": \"夢のニワトリ小屋\",\n        \"yumeiro-goromo\": \"ゆめいろごろも\",\n        \"yumeizukosya\": \"夢何処社\",\n        \"yumekakiya\": \"夢かき屋\",\n        \"yumemi\": \"yumemi\",\n        \"yumemigaoka\": \"ユメミガオカ\",\n        \"yumemigokoti\": \"夢見ごこち\",\n        \"yumemushi\": \"ユメムシ\",\n        \"yumenamakon\": \"ゆめなまこん\",\n        \"yumenekoya\": \"夢ねこ屋\",\n        \"yumeno miya\": \"夢乃宮\",\n        \"yumeoikyounouta\": \"夢追狂の謳\",\n        \"yumetoki\": \"ユメトキ\",\n        \"yumeya honpo\": \"夢屋本舗\",\n        \"yumiharizuki\": \"弓張月\",\n        \"yunomata\": \"♨ゆのまた\",\n        \"yunte\": \"yunte\",\n        \"yuraraka koubou\": \"ゆららか工房\",\n        \"yurari biyori\": \"ゆらり日和\",\n        \"yurei yashiki\": \"ゆーれーやしき\",\n        \"yureika\": \"ゆれいか\",\n        \"yurerutikuwabu\": \"ゆれるちくわぶ\",\n        \"yuri equal 18l\": \"百合=18L\",\n        \"yuririn no moto\": \"ゆりりんの素\",\n        \"yurufuwa megane\": \"ゆるふわ☆めがね\",\n        \"yuruhuwa-kinniku\": \"ゆるふわ筋肉\",\n        \"yururuka-dou\": \"ゆるるか堂\",\n        \"yurusu\": \"許す\",\n        \"yurutto pocket\": \"ゆるっとポケット\",\n        \"yusuzumi\": \"夕涼み\",\n        \"yutakadou\": \"豊堂\",\n        \"yutori-nu\": \"ゆとりーぬ\",\n        \"yuu adashino suisan\": \"(有)化野水産\",\n        \"yuu heya\": \"ゆう部屋\",\n        \"yuubeno gakuensai\": \"ユウベノ学園祭\",\n        \"yuuen floor\": \"遊園ふろあ\",\n        \"yuugai tosho kikaku\": \"有害図書企画\",\n        \"yuugatou\": \"誘蛾党\",\n        \"yuugen jikkou\": \"有言実行\",\n        \"yuugengaisha mach spin\": \"有限会社マッハスピン\",\n        \"yuugensangyou sukimakaze\": \"有限産業すきま風\",\n        \"yuuhodou\": \"遊歩堂\",\n        \"yuuhoku.\": \"ゆーほく。\",\n        \"yuuji wonder\": \"ゆうじワンダー\",\n        \"yuujiro\": \"遊字路\",\n        \"yuuk web\": \"yuuk web\",\n        \"yuukai kinshi\": \"誘拐禁止\",\n        \"yuukakumin\": \"遊廓民\",\n        \"yuukan madam\": \"勇敢マダム\",\n        \"yuukari soft\": \"ゆ～かりそふと\",\n        \"yuuki nyuugyou\": \"ゆーき乳業\",\n        \"yuuki ryu\": \"結城流\",\n        \"yuukyuu shinden\": \"悠久神殿\",\n        \"yuunagisou\": \"夕凪荘\",\n        \"yuuriko\": \"ユウリコ\",\n        \"yuusei honpo\": \"遊星本舗\",\n        \"yuuseian\": \"遊星庵\",\n        \"yuusha kandenchi\": \"勇者乾電池\",\n        \"yuusha-sama go-ikkou\": \"勇者様御一行\",\n        \"yuhshiki\": \"憂式\",\n        \"yuuyami sabou\": \"夕闇茶房\",\n        \"yuuyami tokeidai\": \"ゆうやみとけいだい\",\n        \"yuuyaminabe club\": \"夕闇鍋倶楽部\",\n        \"yuuzen animal dou\": \"友禅あにまる堂\",\n        \"yuyake box\": \"ゆうやけボックス\",\n        \"yuzucha\": \"ゆず茶\",\n        \"yuzucha biyori\": \"柚子茶日和\",\n        \"yuzuen\": \"柚子苑\",\n        \"yuzuhoge.\": \"Yuzuhoge.\",\n        \"yuzumikan\": \"ゆずみかん\",\n        \"yuzumonaka\": \"ゆずもなか\",\n        \"yuzupon\": \"YUZUPON\",\n        \"yuzuriha\": \"譲葉\",\n        \"yuzurihaya\": \"譲葉屋\",\n        \"yuzuya\": \"ゆずや\",\n        \"yuzuyu\": \"ゆず湯\",\n        \"yz plus\": \"YZ+\",\n        \"z jirushi\": \"Z印\",\n        \"z-front\": \"Z-FRONT\",\n        \"z-less\": \"Z-Less\",\n        \"z-s-e\": \"z-s-e\",\n        \"z-tabukuroneko house\": \"Zた袋猫はうす\",\n        \"zabuton makura\": \"ざぶとんまくら\",\n        \"zaclock\": \"ZacLock\",\n        \"zahhatorute\": \"ざっはとるて\",\n        \"zakkin heiki seizou koujou\": \"雑菌兵器製造工場\",\n        \"zakogoya\": \"ざこ小屋\",\n        \"zakuro an\": \"柘榴庵\",\n        \"zandaka-77yen\": \"残高77円\",\n        \"zangyaku koui teate\": \"残虐行為手当\",\n        \"zankirow\": \"斬鬼楼\",\n        \"zankoku doumei\": \"残酷同盟\",\n        \"zankoku ondo\": \"残酷音頭\",\n        \"zanmai\": \"三昧-zanmai-\",\n        \"zarigani arms\": \"ザリガニARMS\",\n        \"zashiki-neco\": \"ざしきねこ\",\n        \"zassou\": \"雑草\",\n        \"zassoubatake\": \"雑草畑\",\n        \"zatouichi\": \"座頭市\",\n        \"zatsunen koubou\": \"雑念工房\",\n        \"zatsuyou elixir\": \"雑用エリクサー\",\n        \"zattou keshiki\": \"雑踏景色\",\n        \"zawameki jambo\": \"ざわめきじゃんぼ\",\n        \"zeiniku shoujotai\": \"ぜいにく少女隊\",\n        \"zenmai-shiki kouchuusen\": \"ゼンマイ式航宙船\",\n        \"zenmain\": \"ZENMAIN\",\n        \"zennihon haeteru kai\": \"全日本生えてる會\",\n        \"zenos\": \"Zenos\",\n        \"zenpou chuugaeri kick\": \"前方宙返りキック\",\n        \"zenpou fuchuui\": \"前方不注意\",\n        \"zenpou kouenhun\": \"前方後円墳\",\n        \"zenryoku back dash\": \"全力バックダッシュ\",\n        \"zensekai yakenohara doumei\": \"全世界焼野原同盟\",\n        \"zenshuu bougyo\": \"ゼンシュウボウギョ\",\n        \"zensoku punks\": \"喘息パンクス\",\n        \"zensoku zenkai.\": \"喘息全快。\",\n        \"zensyuui\": \"全周囲\",\n        \"zero\": \"ゼロ\",\n        \"zero calorie\": \"ゼロカロリ\",\n        \"zero-sen\": \"zero戦\",\n        \"zero-xx\": \"ZERO・XX\",\n        \"zeroinfinityone\": \"0∞1\",\n        \"zeros factory\": \"零’sふぁくとりー\",\n        \"zetonpoison\": \"ゼトンポイソン\",\n        \"zettai bluenoid\": \"絶対ブルーノイド\",\n        \"zettai yarumoni\": \"絶対やるもに\",\n        \"zetubou\": \"zetubou\",\n        \"zi\": \"Zi\",\n        \"zi0topia\": \"ジ○トピア\",\n        \"ziggy star dust\": \"Ziggy STAR Dust\",\n        \"zigzag\": \"ZIGZAG\",\n        \"zigzag company\": \"ジグザグカンパニー\",\n        \"zinzin\": \"ジンジン\",\n        \"zion\": \"ZION\",\n        \"ziploc\": \"Ziploc\",\n        \"zipper wrist\": \"ジッパリスト\",\n        \"zircon prime\": \"じるこんプライム\",\n        \"zitadelle\": \"Zitadelle\",\n        \"zmey no soukutsu\": \"ズメイの巣窟\",\n        \"zng\": \"ZNG\",\n        \"znn\": \"ZNN\",\n        \"zoal\": \"ZOAL\",\n        \"zokubutsu.zip\": \"俗物.zip\",\n        \"zombie team\": \"Zombie Team\",\n        \"zooerastia\": \"ZOOERASTIA\",\n        \"zooko\": \"Zooko\",\n        \"zou no ran\": \"象の檻\",\n        \"zouri no sato\": \"ゾウリの里\",\n        \"zozalist\": \"ゾザリスト\",\n        \"zubunure lab\": \"ずぶ濡れラボ\",\n        \"zugaikotsu marudashi\": \"ズガイコツマルダシ\",\n        \"zukaishiki\": \"ずかいしき\",\n        \"zuukoku shoukai\": \"ずぅこく商会\",\n        \"zuwaigani beam\": \"ズワイガニビーム\",\n        \"zweidrei\": \"zweidrei\",\n        \"zyulokuya\": \"十録屋\",\n        \"zyx\": \"ジックス\",\n        \"ajito529\": \"アジト529\",\n        \"miomix\": \"miomix;\",\n        \"hinobashi seifukukan\": \"日野橋制服館\",\n        \"hoshii koubou\": \"星井工房\",\n        \"ascii media works\": \"ASCII Media Works\",\n        \"mitsume no mitsumame\": \"みつ目のみつ豆\",\n        \"rhf migite no tomo sha\": \"RHF=右手の友社\",\n        \"jurei no mori\": \"呪霊の杜\",\n        \"tsukitate-koubou\": \"つきたて工房\",\n        \"aramaa\": \"あらまあ\",\n        \"kazamidori\": \"かざみどり\",\n        \"m3\": \"M3\",\n        \"hiwa izumo taisha\": \"秘話出雲大社\",\n        \"caisson\": \"CAISSON\",\n        \"tuberose\": \"月化香\",\n        \"naga to yappari yukai na nakama-tachi\": \"nagaとやっぱり愉快な仲間たち\",\n        \"attakai inu no yoru de\": \"暖かい淫雨の夜で\",\n        \"nikoushikou\": \"に向思考\",\n        \"anata wa onaka ga suiteiru\": \"あなたはお腹がすいている\",\n        \"yurushite ochinti kyo\": \"許しておちんち教\",\n        \"seiheki kenkyuujo bravo han\": \"性癖研究所 ブラボー班\",\n        \"icchao murasakiimoren new\": \"いっちゃお♪紫芋れんnew\",\n        \"otokonoko de asobou\": \"男の子で遊ぼう\",\n        \"babaa no mitsuboshi restaurant\": \"ババアの三ツ星レストラン\",\n        \"mugisabou\": \"麦茶房\",\n        \"dessert soft\": \"DESSERT Soft\",\n        \"akatukiya\": \"赤月屋\",\n        \"metacorapusu\": \"めたこらぷす\",\n        \"hana q studio\": \"花Qスタジオ\",\n        \"shinsen shiboritate nama gyuunyuu.\": \"新鮮、搾りたて生牛乳。\",\n        \"shota mangaya-san\": \"ショタ漫画屋さん\",\n        \"kana note\": \"Kana Note\",\n        \"pirio destruction\": \"ピリオデストラクション\",\n        \"mauve\": \"mauve\",\n        \"tiguhagu metronome\": \"ちぐはぐメトロノーム\",\n        \"daisan-keitai\": \"第3形態\",\n        \"ray n maker\": \"Ray N' Maker\",\n        \"ijou higan sensen\": \"异常彼岸战线\",\n        \"shinkaihuyu\": \"深海浮遊\",\n        \"dull zodesadehai\": \"ダル・ゾデサデハーイ\",\n        \"fetishism pocket\": \"フェチズムポケット\",\n        \"kantou dougakai\": \"关东动画会\",\n        \"fusuma cafe\": \"ふすま喫茶\",\n        \"platinum kinoko\": \"プラチナきのこ\",\n        \"lunaberry\": \"Lunaberry\",\n        \"sakura no tomoru hie\": \"桜の灯る日へ\",\n        \"xx koubou\": \"××工房\",\n        \"hengen monogatari\": \"変幻物語\",\n        \"straight lemon kajuu 100\": \"ストレートレモン果汁100\",\n        \"gekidan 375\": \"劇団375\",\n        \"ryuuka hanten\": \"龍華飯店\",\n        \"hakumaidokoro\": \"白米所\",\n        \"dandakadan\": \"ダンダカダン\",\n        \"shikoshiko biyori\": \"しこしこ日和\",\n        \"ohige no shishimai\": \"お髭の獅子舞\",\n        \"damenahidou\": \"だめなひ堂\",\n        \"petanko bokujo\": \"ぺたんこ牧場\",\n        \"chanbara kishidan\": \"ちゃんばら騎士団\",\n        \"gensou kagetourou\": \"幻想影燈籠\",\n        \"chou rojiura gasshuukoku\": \"超路地裏合衆国\",\n        \"random footwork\": \"ランダムフットワーク\",\n        \"chabatake ni haeta takenoko\": \"茶畑に生えた筍\",\n        \"mizuyakinko\": \"水屋金库\",\n        \"namagaki\": \"生牡蛎\",\n        \"chouzankai\": \"超斩开\",\n        \"kirin planet\": \"キリンプラネット\",\n        \"sonpuushi\": \"村夫子\",\n        \"koushoku na reichourui\": \"好色な霊長類\",\n        \"yukinko okeya\": \"雪ん娘おけ屋\",\n        \"momonomi plus\": \"もものみプラス\",\n        \"metsuki warui kyoudan\": \"目つき悪い教団\",\n        \"chinpan-bu\": \"チンパン部\",\n        \"mondomura tomo no kai\": \"蒙德村友会\",\n        \"pirori kingdom\": \"PiRORI KINGDOM\",\n        \"kinomiki no mama\": \"木の幹のまま\",\n        \"raise wa futanari bishoujo\": \"来世是扶她美少女\",\n        \"kakuzatou\": \"角砂糖\",\n        \"gyuunyuu shoujo seisakusho\": \"牛乳少女制作所\",\n        \"abukumadou\": \"阿武隈堂\",\n        \"hakutamayu\": \"白玉汤\",\n        \"nodomaru biyori\": \"のどまる日和\",\n        \"itabira yasai\": \"イタビラ野菜\",\n        \"maria planet\": \"マリアプラネット\",\n        \"uishiro\": \"初代\",\n        \"140km slash h\": \"140km/h\",\n        \"shirokuma terepasu\": \"白熊テレパス\",\n        \"nipa nipa company\": \"NIPA NIPA COMPANY\",\n        \"omochi box\": \"OMOCHI BOX\",\n        \"kinokko\": \"きのっ子\",\n        \"dark horse comics\": \"黑马漫画\",\n        \"mt.sushi\": \"Mt.Sushi\",\n        \"milk lamp\": \"ミルクランプ\",\n        \"germanium detroit\": \"ゲルマニウム・デトロイト\",\n        \"suiren no yado\": \"水莲之宿\",\n        \"tariki honganji\": \"他力本愿寺\",\n        \"ebisujima misato\": \"戎島実里\",\n        \"jikahatsudensho\": \"自家発電処\",\n        \"signal violet\": \"Signal:Violet\",\n        \"me no sato\": \"芽の里\",\n        \"shuukyuu 8-ka\": \"週休8日\",\n        \"sagamiokiva\": \"さがみおきば\",\n        \"bochi bochi no ki\": \"ぼちぼちの木\",\n        \"pham\": \"PHAM!\",\n        \"henry plaza\": \"半里プラザー\",\n        \"shirokuroino\": \"白黒いの\",\n        \"riku no kotoutei\": \"陆の孤岛亭\",\n        \"kuniku no saku\": \"狗肉の策\",\n        \"taipeijin\": \"台北人\",\n        \"shinya koujou\": \"深夜工場\",\n        \"alpaca bokujou\": \"里アルパカ牧场\",\n        \"pink sakuhin okiba\": \"ピンク作品置き場\",\n        \"oden usagi\": \"おでんうさぎ\",\n        \"omochiya-san\": \"おもちやさん\",\n        \"shitsuren restaurant for men\": \"失恋レストラン FOR MEN\",\n        \"makuragi zabuton\": \"枕木ざぶとん\",\n        \"koko de chikubi o hitotsumami\": \"ここで乳首をひとつまみ\",\n        \"noumusai\": \"浓雾菜\",\n        \"nyoroman shouji\": \"にょろまん商事\",\n        \"praha keisanki\": \"プラハ計算機\",\n        \"mosoya\": \"毛想屋\",\n        \"mikamishi juukou\": \"三神氏重工\",\n        \"kudamonoichizu\": \"果物一途\",\n        \"mimitako seijin\": \"耳タコ星人\",\n        \"nukunuku jima\": \"ぬくぬく島\",\n        \"amagami honpo\": \"甘啮本铺\",\n        \"jyuu sensya usagitai\": \"重战车兔队\",\n        \"lv426\": \"LV426\",\n        \"circle mizusane\": \"サークルみづさね\",\n        \"milk farm tanaka\": \"ミルクファーム田中\",\n        \"agartha houeikyoku\": \"アガルタ放映局\",\n        \"menbou renpou\": \"めんぼーれんぽー\",\n        \"dukeyushimagurodon\": \"漬けゆしまぐろ丼\",\n        \"solo play\": \"そろぷれい\",\n        \"niji-teru\": \"虹照\",\n        \"kokumaro chousei tounyuu\": \"こくまろちょうせい豆乳\",\n        \"noya\": \"乃屋\",\n        \"touhikou\": \"陶惹好\",\n        \"yorunobando\": \"夜のバンド\",\n        \"shiba no shippo\": \"しばのしっぽ\",\n        \"futsu-no-tapioca-yasan\": \"ふつうのタピオカやさん\",\n        \"ushinomaruyaki\": \"ウシノマルヤキ\",\n        \"silver dog\": \"シルバードッグ\",\n        \"aburanabeshiki\": \"油锅式\",\n        \"gahahahahahaha\": \"がはははははは!\",\n        \"marshmalloya\": \"ましゅまろや\",\n        \"nanadou\": \"七堂\",\n        \"ayawasuca\": \"文忘蚊\",\n        \"sugomori bird\": \"巣ごもりバード\",\n        \"gensou pump\": \"幻想ポンプ\",\n        \"elizabeth collar\": \"エリザベスカラー\",\n        \"toropucchi\": \"とろぷっち\",\n        \"satou mitsu\": \"さとうみつ\",\n        \"mannen dokodoko dondodoko\": \"まんねんドコドコドンドドコ\",\n        \"uruudoki\": \"うるうどき\",\n        \"shironekoya\": \"白猫屋\",\n        \"mugen karaage\": \"無限からあげ\",\n        \"yonaka works\": \"ヨナカWorks\",\n        \"touketsu shamen\": \"卜ウケツ斜面\",\n        \"koutetsu shabon dama\": \"钢铁しゃぼん玉\",\n        \"hogeramu\": \"ほげらむ\",\n        \"mizushirazu\": \"みずしらず\",\n        \"yakitori teishoku\": \"焼きトリ定食\",\n        \"dakkoku kidoutai s.a.c\": \"脱壳机动队 S.A.C\",\n        \"mitsumitsuniku\": \"ミツミツにく\",\n        \"akirerushoujo\": \"アキレルショウジョ\",\n        \"fuzume\": \"ふずめ\",\n        \"hitakamoya\": \"ひたかもや\",\n        \"kasokuiki\": \"過疎区域\",\n        \"khaos distance\": \"カオス距離\",\n        \"tohosanhun\": \"徒歩三分\",\n        \"morunchi\": \"モルチ\",\n        \"gutsutoma\": \"ぐつとま\",\n        \"kaiten paradogs\": \"回転ParaDOGs\",\n        \"umi no sachi teishoku\": \"海の幸定食\",\n        \"tennensuidousui\": \"天然水道水\",\n        \"sorairo koubou\": \"空色工房\",\n        \"kakuran operetta\": \"攪乱オペレッタ\",\n        \"hikoushiki\": \"飞行式\",\n        \"toyoko daisyouten\": \"东横大赏典\",\n        \"maimu maimu\": \"まいむ～まいむ\",\n        \"yakimeshi modoki\": \"やきめしもどき\",\n        \"nananto\": \"ななんと\",\n        \"gogatsu souzaiten\": \"五月惣菜店\",\n        \"syunichi kansuu\": \"しゅにち関数\",\n        \"edamametei\": \"えだまめ亭\",\n        \"texteater\": \"Texteater\",\n        \"evolment tycoon\": \"EVOLMENT TYCOON\",\n        \"utsusumi onsen\": \"うつすみおんせん\",\n        \"dorayakiya\": \"どらやきや\",\n        \"kazumiya\": \"かずみ屋\",\n        \"high land\": \"HIGH:LAND\",\n        \"shibasaki shouji\": \"柴崎障子\",\n        \"ecchi ecchi daifuku\": \"えちえち大福\",\n        \"hoyhoy colo\": \"ホイホイこーろ\",\n        \"higashinodou\": \"東ノ堂\",\n        \"imagescript\": \"イメージscript\",\n        \"kawaiso nanoha nukeru\": \"かわいそうなのは抜ける\",\n        \"jinsei saboribu\": \"人生サボり部\",\n        \"mori no michi\": \"森の道\",\n        \"studio yama roman\": \"スタジオ山ロマン\",\n        \"inu ha sakana\": \"犬は鱼\",\n        \"mizukani\": \"みずかに\",\n        \"one hit wonder\": \"ONE HIT WONDER\",\n        \"fuwafuwa palette\": \"ふわふわパレット\",\n        \"marble dog\": \"MARBLE DOG\",\n        \"annbrellahouse\": \"あんぶれらはうす\",\n        \"citric acid1350\": \"クエン酸1750\",\n        \"tissue bako\": \"ティッシュ箱\",\n        \"mushoku muho\": \"無色ムホ\",\n        \"kushidatelier\": \"クシダトリエ\",\n        \"shiono room\": \"SHIONO ROOM\",\n        \"nanao heavy industries\": \"七尾重工\",\n        \"hoshoku shoujo\": \"捕食少女\",\n        \"mirakoku\": \"みら国\",\n        \"usonoki\": \"ウソノキ\",\n        \"tuyuiri kakinotane\": \"梅雨入り柿の種\",\n        \"ueshita\": \"UESHITA\",\n        \"minmintaro\": \"みんみんたろう\",\n        \"haimitsutou\": \"廃蜜灯\",\n        \"mrm lab\": \"MRMラボ\",\n        \"monkees\": \"モンキーズ\",\n        \"jalapeno chips\": \"ハラペーニョチップス\",\n        \"yattemiyou\": \"ヤッてみよう!\",\n        \"nekonokarintou\": \"ねこのかりんとう\",\n        \"chikara koso power\": \"力こそパワー\",\n        \"chachanako\": \"茶茶ナコ\",\n        \"shiro no ie\": \"シロの家\",\n        \"sankaku button\": \"三角ボタン\",\n        \"geppei bunchou\": \"月餅文蝶\",\n        \"nullspace\": \"NULLSPACE\",\n        \"sys-lila\": \"シスリラ\",\n        \"kaisendon\": \"カイセンドン\",\n        \"dandan dango\": \"段々団子\",\n        \"mobumomu ntr\": \"モブモムNTR\",\n        \"ice to choco\": \"あいすとちょこ\",\n        \"sakura suishou\": \"桜水晶\",\n        \"nekomimi to kuro mask\": \"猫耳と黒マスク\",\n        \"champion soft\": \"Champion Soft\",\n        \"dojiro books\": \"どじろーブックス\",\n        \"alwayshp1\": \"いつも死にかけ\",\n        \"shurashushushu\": \"しゅらしゅしゅしゅ\",\n        \"channel zakuro\": \"チャンネルざくろ\",\n        \"kitsune komachi\": \"きつねこまち\",\n        \"kaitendon\": \"海転丼\",\n        \"cre no monookiba\": \"シーレの物置場\",\n        \"studio park\": \"スタジオぱーく\",\n        \"donut church\": \"ドーナツ教会\",\n        \"netsuko\": \"ネツ湖\",\n        \"milkdou shoukai\": \"みるく堂商会\",\n        \"airimiash\": \"アイリミアーシュ\",\n        \"mokkorihan\": \"もっこりはん\",\n        \"zenjidou shimoneta seizou machine\": \"全自动下ネタ制造マシーン\",\n        \"shachi\": \"しゃち\",\n        \"mittsuman\": \"みっつまん\",\n        \"zyougesayuu\": \"上下左右\",\n        \"rakuenya\": \"乐园屋\",\n        \"torinoya\": \"とりの屋\",\n        \"gomikasu tarou\": \"五味滓太郎\",\n        \"kaoinshou zero\": \"顔印象零\",\n        \"yasudajuku\": \"保田塾\",\n        \"mahou no kinoko\": \"魔法のキノコ\",\n        \"suihanya\": \"炊飯屋\",\n        \"climbcrown\": \"クライムクラウン\",\n        \"takahiro no ie\": \"たかひろの家\",\n        \"shiosai\": \"潮騒\",\n        \"touzainanboku\": \"とうざいなんぼく\",\n        \"arijigoku\": \"蚁地狱\",\n        \"tianoblue\": \"ティアノブルー\",\n        \"nerimono koujou\": \"練り物工場\",\n        \"marosaan\": \"まろ茶庵\",\n        \"pachypodium\": \"ぱきぽぢうむ\",\n        \"europia\": \"ゆーろぴあ\",\n        \"iinchou no yabai yatsu\": \"委員長のやばいヤツ\",\n        \"gotarou no all night fuck\": \"ゴ太郎\",\n        \"ruri-iro special room\": \"瑠璃色特別室\",\n        \"harmonear\": \"HarmoNeaR\",\n        \"higedokoro\": \"ひげどころ\",\n        \"shinjiroya\": \"信じろや\",\n        \"pontaroya\": \"ぽんたろ家\",\n        \"watochip melonpan\": \"わとちっぷめろんぱん\",\n        \"miraiha kireini\": \"ミライハキレイニ\",\n        \"otonagokko iinkai\": \"おとなごっこ委員会\",\n        \"elica\": \"ELICA\",\n        \"gojihan\": \"五时半\",\n        \"netorare no tami\": \"ネトラレの民\",\n        \"7 rensa\": \"7连锁\",\n        \"citrusniper\": \"シトラスナイパー\",\n        \"unadon\": \"うなどぅーむ\",\n        \"torii-za\": \"鳥居座\",\n        \"sokuochi shoujo\": \"即オチ少女\",\n        \"nora nee-sama\": \"Nora姉様\",\n        \"ochaban\": \"お茶番\",\n        \"shaft\": \"SHAFT\",\n        \"kagayaku hoshizuna\": \"輝く星砂\",\n        \"chikyuujin\": \"ちきゅうじん\",\n        \"nyum production\": \"にゅむproduction\",\n        \"heppoko usagi cafe\": \"へっぽこうさぎ＊cafe\",\n        \"asakasha doujin\": \"朝花社同人\",\n        \"maisou no soko\": \"埋葬ノ底\",\n        \"kyuryo koen\": \"丘陵公園\",\n        \"chairoiyatsu\": \"ちゃいろいやつ\",\n        \"surudoiman no irutokoro\": \"するどいマンのいるところ\",\n        \"kinkai 100 kg\": \"金塊100kg\",\n        \"mukyou no utopia\": \"梦境的\",\n        \"nomiyagumi\": \"ノミヤ組\",\n        \"manaita koujou\": \"まな板工場\",\n        \"choukenkouya\": \"超健康屋\",\n        \"namekuzu\": \"なめくず\",\n        \"yuujikouji\": \"ゆうじこうじ\",\n        \"kuwaiya\": \"くわい屋\"\n    },\n    \"artist\": {\n        \"2\": \"2\",\n        \"7\": \"7\",\n        \"8\": \"8\",\n        \"13\": \"13\",\n        \"20\": \"廿\",\n        \"23\": \"23\",\n        \"24\": \"24\",\n        \"41\": \"41\",\n        \"66\": \"66\",\n        \"68\": \"68\",\n        \"76\": \"七六\",\n        \"88\": \"88\",\n        \"144\": \"144\",\n        \"222\": \"222\",\n        \"254\": \"254\",\n        \"346\": \"346\",\n        \"445\": \"445\",\n        \"543\": \"543\",\n        \"581\": \"581\",\n        \"691\": \"ムクイ\",\n        \"892\": \"八9二\",\n        \"961\": \"𝟡𝟞𝟙\",\n        \"1103\": \"1103\",\n        \"3104\": \"3104\",\n        \"7010\": \"7010\",\n        \"8000\": \"8000\",\n        \"33297\": \"33297\",\n        \"pop\": \"POP\",\n        \"oouso\": \"大嘘\",\n        \"peko\": \"ぺこ（かにビーム）\",\n        \"akaza\": \"あかざ\",\n        \"ishikei\": \"石惠\",\n        \"endou hiroto\": \"远藤弘土\",\n        \"happoubi jin\": \"八宝备仁\",\n        \"fujisaki hikari\": \"藤崎ひかり\",\n        \"ichiri\": \"イチリ\",\n        \"satou kibi\": \"さとうきび\",\n        \"nanpuu\": \"なんぷぅ\",\n        \"yukiu con\": \"雪雨こん\",\n        \"land sale\": \"兰户せる\",\n        \"emily\": \"emily\",\n        \"chiri\": \"ちり\",\n        \"kantoku\": \"监督\",\n        \"sayori\": \"Sayori\",\n        \"ideolo\": \"ideolo\",\n        \"sky\": \"SKY | Sky-FreeDom\",\n        \"m.vv\": \"M.vv\",\n        \"miyahara ayumu\": \"宫原步\",\n        \"nishikawa kou\": \"西川康\",\n        \"narusawa kei\": \"なるさわ景\",\n        \"akatsuki myuuto\": \"赤月みゅうと\",\n        \"kisaragi gunma\": \"如月群真\",\n        \"ohtomo takuji\": \"大友卓二\",\n        \"yamada no seikatu ga daiichi\": \"山田の性活が第一\",\n        \"asamura hiori\": \"朝丛志描\",\n        \"matsukawa\": \"松河\",\n        \"mmm\": \"暗黑えむ将军\",\n        \"facominn\": \"ふぁこみん\",\n        \"great mosu\": \"ぐれーともす\",\n        \"ringo sui\": \"りんご水\",\n        \"kanzaki muyu\": \"神崎むゆ\",\n        \"mizuyan\": \"みずやん\",\n        \"ranyues\": \"仴\",\n        \"horonamin\": \"ホロナミン\",\n        \"chiyami\": \"ちやみ\",\n        \"hanahanamaki\": \"花花卷\",\n        \"sousouman\": \"草草馒\",\n        \"muk\": \"MUK\",\n        \"ore p 1-gou\": \"俺P1号\",\n        \"menyoujan\": \"めんようじゃん\",\n        \"hodumi kaoru\": \"八月朔日珈瑠\",\n        \"watsuki rumi\": \"わつきるみ\",\n        \"soramoti\": \"そらモチ\",\n        \"blastbeat\": \"BLASTBEAT\",\n        \"takashina at masato\": \"高阶@圣人\",\n        \"shibayuki\": \"しばゆき\",\n        \"newmen\": \"NeWMeN\",\n        \"miyasaka miyu\": \"宫坂みゆ\",\n        \"miyasaka naco\": \"宫坂なこ\",\n        \"shimahara\": \"40原\",\n        \"hayakawa akari\": \"早川あかり\",\n        \"masaharu\": \"まさはる\",\n        \"ail\": \"あいる\",\n        \"saigado\": \"彩画堂\",\n        \"nanase meruchi\": \"ななせめるち\",\n        \"marushin\": \"丸新\",\n        \"amamiya mizuki\": \"雨宫ミズキ\",\n        \"mibu natsuki\": \"みぶなつき\",\n        \"ogata zen\": \"尾形全\",\n        \"himura kiseki\": \"比村奇石\",\n        \"cle masahiro\": \"吴マサヒロ\",\n        \"nakajima yuka\": \"なかじまゆか\",\n        \"fujima takuya\": \"藤真拓哉\",\n        \"hisasi\": \"Hisasi\",\n        \"akizora momidi\": \"秋空もみぢ\",\n        \"yuunagi sesina\": \"夕凪セシナ\",\n        \"ippongui\": \"一本杭\",\n        \"sekine hajime\": \"咳寝はじめ\",\n        \"mura osamu\": \"ムラオサム\",\n        \"sody\": \"Sody\",\n        \"fujiwara shunichi\": \"藤原俊一\",\n        \"ohigetan\": \"尾髭丹\",\n        \"kisaragi-mic\": \"如月みっく\",\n        \"kisaragi-ice\": \"如月あいす\",\n        \"takanashi rei\": \"小鸟游レイ\",\n        \"kawakami rokkaku\": \"川上六角\",\n        \"niro\": \"にろ\",\n        \"okuri banto\": \"送り万都\",\n        \"runrun\": \"るんるん\",\n        \"zonda\": \"ぞんだ\",\n        \"bekkankou\": \"べっかんこう\",\n        \"santa matsuri\": \"さんた茉莉\",\n        \"quick wiper\": \"クイック賄派\",\n        \"jigoku ouji\": \"地狱王子\",\n        \"kobayashi youkoh\": \"小林由高\",\n        \"saeki tatsuya\": \"佐伯达也\",\n        \"mamo williams\": \"まもウィリアムズ\",\n        \"koga nozomu\": \"古我望\",\n        \"shinokawa arumi\": \"篠川あるみ\",\n        \"ichio\": \"イチオ\",\n        \"shimada fumikane\": \"岛田文金\",\n        \"ryohka\": \"凉香\",\n        \"shinkai makoto\": \"新海诚\",\n        \"benet\": \"ベネット\",\n        \"ponpon\": \"ぽんぽん\",\n        \"tetsujin\": \"铁人\",\n        \"hiyoko\": \"ひよさん\",\n        \"syukurin\": \"シュクリーン\",\n        \"araki kanao\": \"あらきかなお\",\n        \"nagiyama\": \"那岐山\",\n        \"kittsu\": \"キッツ\",\n        \"neko toufu\": \"猫豆腐\",\n        \"nagare hyo-go\": \"流ひょうご\",\n        \"mizuki gyokuran\": \"瑞姬玉兰\",\n        \"tenchisouha\": \"天地争霸\",\n        \"arui ryou\": \"あるい椋\",\n        \"sasamori tomoe\": \"笹森トモエ\",\n        \"sasai saji\": \"笹井さじ\",\n        \"okazaki takeshi\": \"岡崎武士\",\n        \"harukaze soyogu\": \"春风ソヨグ\",\n        \"kasi\": \"华师\",\n        \"cheru\": \"ちぇる\",\n        \"umedama nabu\": \"梅玉奈部\",\n        \"aranmaru\": \"亚兰丸\",\n        \"tachibana omina\": \"立花オミナ\",\n        \"ibuki ren\": \"伊吹莲\",\n        \"uran\": \"URAN | 雨兰\",\n        \"billion\": \"Billion\",\n        \"nanao\": \"ななお\",\n        \"pirontan\": \"ピロンタン\",\n        \"tokyo yamane\": \"东京0ヤマネ\",\n        \"yuki higasinakano\": \"ゆーき東中野\",\n        \"nosada\": \"乃定\",\n        \"yukibuster z\": \"ユキバスターZ\",\n        \"roga\": \"RoGa\",\n        \"bonnari\": \"ぼんなり\",\n        \"komone ushio\": \"相音うしお\",\n        \"yuriko\": \"白河子\",\n        \"nanno koto\": \"南野琴\",\n        \"minazuki mikka\": \"水无月三日\",\n        \"minazuki juuzou\": \"水无月十三\",\n        \"minazuki tooru\": \"水无月彻\",\n        \"minazuki no-mu\": \"水无月のーむ\",\n        \"minazuki satoshi\": \"水无月サトシ\",\n        \"minazuki futago\": \"みなづきふたご\",\n        \"minazuki tsuyuha\": \"水无月露叶\",\n        \"minaduki kanna\": \"水无月神奈\",\n        \"karaage tarou\": \"からあげ太郎\",\n        \"okumori boy\": \"奥森ボウイ\",\n        \"sahara wataru\": \"砂原涉\",\n        \"amano kazumi\": \"天乃一水\",\n        \"ichiyo moka\": \"一叶モカ\",\n        \"naturalton\": \"なちゅらるとん\",\n        \"aono ribbon\": \"青野りぼん\",\n        \"hidaka toworu\": \"ヒダカトヲル\",\n        \"rara8\": \"らら8\",\n        \"medaka kenichi\": \"目高健一\",\n        \"kanna\": \"かん奈\",\n        \"kazabuki poni\": \"风吹ぽに\",\n        \"ouma tokiichi\": \"逢魔刻壹\",\n        \"momonoki fum\": \"百乃木富梦\",\n        \"miito shido\": \"三糸シド\",\n        \"motomiya mitsuki\": \"もとみやみつき\",\n        \"interstellar\": \"Interstellar\",\n        \"mikeou\": \"みけおう\",\n        \"hinata nao\": \"日向奈尾\",\n        \"sakurazaka tsuchiyu\": \"樱坂つちゆ\",\n        \"yamakaze ran\": \"やまかぜ嵐\",\n        \"anko\": \"あん子 | あんこ\",\n        \"kohaku.\": \"こはく。\",\n        \"kousaka jun\": \"香坂纯\",\n        \"gerotan\": \"げろたん\",\n        \"kozakura kumaneko\": \"小樱クマネコ\",\n        \"distance\": \"DISTANCE\",\n        \"kawaraya a-ta\": \"瓦屋A太\",\n        \"usou\": \"雨草\",\n        \"awayume\": \"淡梦\",\n        \"shiroo\": \"しろー\",\n        \"ryokucha\": \"绿茶\",\n        \"niimaru yuu\": \"ニイマルユウ\",\n        \"simon\": \"さいもん\",\n        \"tanaka aji\": \"田中あじ\",\n        \"unadon\": \"うな井\",\n        \"otakumin\": \"オタクミン\",\n        \"muneshiro\": \"むねしろ\",\n        \"haruki genia\": \"はるきゲにあ\",\n        \"ikegami tatsuya\": \"池上龙矢\",\n        \"pony r\": \"ポニーR\",\n        \"sakura yuu\": \"さくら★ゆう\",\n        \"yan-yam\": \"Yan-Yam\",\n        \"watanabe kenpo\": \"渡边宪法\",\n        \"kamiya zuzu\": \"神谷ズズ\",\n        \"tsumumaru hifu\": \"纺丸ひふ\",\n        \"yasakani an\": \"ヤサカニ·アン\",\n        \"ayachi\": \"あやち\",\n        \"kurori\": \"くろり\",\n        \"suwa izumo\": \"诹访出云\",\n        \"ishigami kazui\": \"石神一威\",\n        \"kamogawa tanuki\": \"鸭川狸\",\n        \"shiruka bakaudon\": \"知るかバカうどん\",\n        \"amekosame\": \"雨小雨\",\n        \"kiira\": \"きぃら～☆\",\n        \"kanoe\": \"庚\",\n        \"daichi kouta\": \"大地巧太\",\n        \"kylin\": \"Kylin\",\n        \"morishima kon\": \"森岛コン\",\n        \"mdo-h\": \"无道睿智\",\n        \"ginyou haru\": \"银曜晴\",\n        \"shiina\": \"シイナ\",\n        \"mikuta\": \"みくた\",\n        \"shibasaki syouzi\": \"柴崎しょうじ（柴崎ショージ）\",\n        \"tempo gensui\": \"天蓬元帅\",\n        \"mafuyu\": \"真冬\",\n        \"kakugari kyoudai\": \"カクガリ兄弟\",\n        \"matsumomo mahiru\": \"松百まひる\",\n        \"aoi masami\": \"苍海\",\n        \"itou life\": \"伊东life\",\n        \"taniguchi-san\": \"谷口さん\",\n        \"amou mari\": \"天羽真理\",\n        \"tsuttsu\": \"つっつ\",\n        \"minarai zouhyou\": \"见习杂兵\",\n        \"aya\": \"AYA | 蓝夜\",\n        \"oi shibako\": \"しばこ（司马淳子）\",\n        \"sato-satoru\": \"さとーさとる\",\n        \"gengorou\": \"源五郎\",\n        \"rokuyo ten\": \"六曜テン\",\n        \"mitsuru\": \"みつる\",\n        \"rage\": \"らげ\",\n        \"chouzetsu bishoujo mine\": \"超绝美少女mine\",\n        \"fried\": \"ふりいど\",\n        \"kouji\": \"孝治\",\n        \"sanada\": \"さなだ\",\n        \"shikei\": \"しけー\",\n        \"ruri\": \"ルリ | るり | 瑠璃\",\n        \"kohata tsunechika\": \"小旗つねちか\",\n        \"carn\": \"夏庵\",\n        \"okada kou\": \"冈田コウ\",\n        \"neko pantsu\": \"ねこパンツ\",\n        \"suzunone rena\": \"铃音れな\",\n        \"miyabi\": \"美矢火\",\n        \"pochi.\": \"ぽち。\",\n        \"hayami jun\": \"早见纯\",\n        \"katou chakichi\": \"加藤茶吉\",\n        \"taono kinoko\": \"汰尾乃きのこ\",\n        \"aikawa monako\": \"あいかわモナコ\",\n        \"tenma femio\": \"天马ふぇみお\",\n        \"kurusumin\": \"来须眠\",\n        \"chobi\": \"ちょび\",\n        \"norakuro nero\": \"野良黑ネロ\",\n        \"izumi yuujiro\": \"泉ゆうじろ～\",\n        \"itameshi\": \"炒饭\",\n        \"hiraoka ryuichi\": \"平冈龙一\",\n        \"maguro teikoku\": \"まぐろ帝国\",\n        \"pote\": \"ぽて\",\n        \"karakuchi choucream\": \"辛口しゅーくりーむ\",\n        \"mafen\": \"マフェン\",\n        \"kuroda kuro\": \"黑田クロ\",\n        \"ooooalikui\": \"おおおおありくい\",\n        \"juna juna juice\": \"ジュナジュナジュース\",\n        \"hiro hiroki\": \"ひろひろき\",\n        \"yone kinji\": \"与根金次\",\n        \"zankuro\": \"ザンクロー\",\n        \"wa\": \"WA\",\n        \"satou kuuki\": \"左藤空气\",\n        \"kouzuki hajime\": \"香月一花\",\n        \"furukawa remon\": \"古川れもん\",\n        \"nukunuku batten\": \"ぬくぬくばってん\",\n        \"sadokko\": \"さどっこ\",\n        \"izumi\": \"和泉\",\n        \"reizei\": \"冷泉\",\n        \"petenshi\": \"ペテン师\",\n        \"maruwa tarou\": \"丸和太郎\",\n        \"fujishima sei1go\": \"藤岛制1号\",\n        \"nanotsuki\": \"なのつき\",\n        \"norutaru\": \"のるたる\",\n        \"koi\": \"Koi\",\n        \"koishi chikasa\": \"小石ちかさ\",\n        \"koikawa minoru\": \"恋河ミノル\",\n        \"koiko irori\": \"恋小いろり\",\n        \"koi nobori\": \"Koiのぼり\",\n        \"koiken\": \"こいけん\",\n        \"koizumi hitsuji\": \"小泉ひつじ\",\n        \"hormone koijirou\": \"ホルモン恋次郎\",\n        \"koinu\": \"こいぬ\",\n        \"kinnotama\": \"またのんき▼\",\n        \"suka\": \"すか\",\n        \"amazon\": \"雨存\",\n        \"milk jam\": \"みるくジャム\",\n        \"isami nozomi\": \"伊佐美ノゾミ\",\n        \"souryuu\": \"双龙\",\n        \"umi suzume\": \"雨美すずめ\",\n        \"michiking\": \"米奇王\",\n        \"otabe sakura\": \"おたべさくら\",\n        \"ryo\": \"RYO\",\n        \"minori kenshirou\": \"实验四郎\",\n        \"umemura\": \"梅村\",\n        \"peter mitsuru\": \"ペーター・ミツル\",\n        \"tennouji kitsune\": \"天王寺狐\",\n        \"shikishima tenki\": \"敷岛天气\",\n        \"shikishima shoutarou\": \"敷岛昭太郎\",\n        \"siina yuuki\": \"椎名悠輝\",\n        \"manami tatsuya\": \"真未たつや\",\n        \"miharu\": \"美春 | ミハル\",\n        \"mush\": \"むっしゅ\",\n        \"haneinu\": \"跳犬\",\n        \"misaki takahiro\": \"三崎高博\",\n        \"sada ko-ji\": \"さだこーじ\",\n        \"mikami mika\": \"三上ミカ\",\n        \"nagare ippon\": \"流一本\",\n        \"hicoromo kyouichi\": \"绯衣响一\",\n        \"akaze kidai\": \"亚风纪代\",\n        \"yuuki\": \"悠宇树\",\n        \"ohkami ryosuke\": \"狼亮辅\",\n        \"jitsuma\": \"儿妻\",\n        \"kawaisaw\": \"可哀想\",\n        \"alpha alf layla\": \"α・アルフライラ\",\n        \"tori hrami\": \"鳥ハラミ\",\n        \"mori marimo\": \"もりまりも\",\n        \"fujisaka lyric\": \"藤坂リリック\",\n        \"mori kouichirou\": \"杜講一郎\",\n        \"sakura akami\": \"さくらあかみ\",\n        \"hatomugi munmun\": \"鳩麦月々\",\n        \"gegera toshikazu\": \"げげら俊和\",\n        \"eromame\": \"えろ豆\",\n        \"momoya chika\": \"桃屋チカ\",\n        \"ooshima tomo\": \"大岛智\",\n        \"hinemosu notari\": \"ひねもすのたり\",\n        \"kurasawa makoto\": \"倉澤まこと\",\n        \"bokujou nushi k\": \"牧场主K\",\n        \"youta\": \"夜歌 | よう太\",\n        \"tsumugi kyuuta\": \"紬きゅうた\",\n        \"minaga tsukune\": \"水賀つくね\",\n        \"cha mirai\": \"茶みらい\",\n        \"serizawa\": \"芹泽\",\n        \"toono suika\": \"远野西瓜\",\n        \"pierre yoshio\": \"ピエ～ル☆よしお\",\n        \"shinji mao\": \"真慈真雄\",\n        \"aoi manabu\": \"あおいまなぶ\",\n        \"izumi tsubasu\": \"和泉つばす\",\n        \"sakai hamachi\": \"堺はまち\",\n        \"kannazuki nem\": \"神無月ねむ\",\n        \"sakurabe notos\": \"桜部のとす\",\n        \"misaki kurehito\": \"深崎暮人\",\n        \"kuroya shinobu\": \"黑谷忍\",\n        \"san sheng wan\": \"三生万\",\n        \"el\": \"える\",\n        \"mango pudding\": \"まんごープリン\",\n        \"wakamiya santa\": \"若宫参太\",\n        \"shungiku tenudon\": \"春菊天うどん\",\n        \"mikaduki neko\": \"三日月ネコ\",\n        \"aihara shouta\": \"相原翔太\",\n        \"mimofu\": \"みもふ\",\n        \"takatuki nato\": \"鷹月ナト\",\n        \"shiratama\": \"白玉\",\n        \"nohara hiromi\": \"野原ひろみ\",\n        \"higashino mikan\": \"東野みかん\",\n        \"dr.bug\": \"Dr.阿虫\",\n        \"ameto yuki\": \"あめとゆき\",\n        \"kenkou cross\": \"健康クロス\",\n        \"yanagawa rio\": \"やながわ理央\",\n        \"kakuzatou\": \"核座头\",\n        \"kaminagi\": \"神凪\",\n        \"twinbox\": \"TwinBox\",\n        \"izuminoaru\": \"イズミノアル\",\n        \"nora shinji\": \"白野じん\",\n        \"shihachiro\": \"しはちろ\",\n        \"daikoukoku shinbun\": \"大広告新聞\",\n        \"yuuki hagure\": \"憂姫はぐれ\",\n        \"paru\": \"パル\",\n        \"rikatan\": \"利华炭☆\",\n        \"jackdempa\": \"弱电波\",\n        \"hiyama izumi\": \"火山一角\",\n        \"kazuma muramasa\": \"和马村政\",\n        \"amatsuka china\": \"天使ちな\",\n        \"denki shougun\": \"电气将军\",\n        \"gibuchoko\": \"ぎヴちょこ\",\n        \"sinbo tamaran\": \"神保玉兰\",\n        \"kaenuco\": \"かえぬこ\",\n        \"arikawa satoru\": \"有河サトル\",\n        \"yui toshiki\": \"唯登诗树\",\n        \"kitahara tomoe\": \"北原朋萌。\",\n        \"kizaki yuuri\": \"树崎祐里\",\n        \"shio kazunoko\": \"塩かずのこ\",\n        \"muska\": \"むすか\",\n        \"amaduyu tatsuki\": \"甘露树\",\n        \"kawata hisashi\": \"カワタヒサシ\",\n        \"mitsumi misato\": \"みつみ美里\",\n        \"nakamura takeshi\": \"なかむらたけし\",\n        \"minase syu\": \"水濑修\",\n        \"yoshiura kazuya\": \"由浦カズヤ\",\n        \"erect sawaru\": \"エレクトさわる\",\n        \"katsurai yoshiaki\": \"桂井よしあき\",\n        \"sanazura hiroyuki\": \"さなづらひろゆき\",\n        \"takamura wamu\": \"高村わむ\",\n        \"menoko\": \"めの子\",\n        \"tamon\": \"たもん\",\n        \"haruaki\": \"明彰\",\n        \"oomori yoshiharu\": \"おおもりよしはる\",\n        \"amedamacon\": \"飴玉コン\",\n        \"eisen\": \"英战\",\n        \"harigane shinshi\": \"针金绅士\",\n        \"kazuhiro\": \"一弘\",\n        \"lobster\": \"ロブ☆スター\",\n        \"magifuro konnyaku\": \"magifuro蒟蒻\",\n        \"ueda john\": \"うえだジョン\",\n        \"wenajii\": \"ヱナジー\",\n        \"zeno\": \"是乃\",\n        \"imizu\": \"威未図\",\n        \"shindou hajime\": \"新道一\",\n        \"type.90\": \"TYPE.90\",\n        \"bu-chan\": \"ぶーちゃん\",\n        \"sasahiro\": \"笹弘\",\n        \"haikawa hemlen\": \"灰川ヘムレン\",\n        \"harasho\": \"はらしょ\",\n        \"nishimu\": \"にしむ\",\n        \"narita koh\": \"成田コウ\",\n        \"shiden\": \"しでん\",\n        \"mira\": \"みら | 未镜\",\n        \"fuusen club\": \"風船クラブ\",\n        \"shioroku\": \"シオロク\",\n        \"kaname aomame\": \"要青豆\",\n        \"kouno yukiyo\": \"こうのゆきよ\",\n        \"seno fumiki\": \"濑野文希\",\n        \"shimuu\": \"しゃむ\",\n        \"rie-chan 14-sai\": \"りえちゃん14歳\",\n        \"fukori\": \"フコリ\",\n        \"shinyashiki\": \"新屋敷\",\n        \"kanzume\": \"KANZUME\",\n        \"kishimen\": \"きしめん\",\n        \"ken-1\": \"Ken-1\",\n        \"midoh tsukasa\": \"御堂つかさ\",\n        \"oyama yasunaga\": \"尾山泰永\",\n        \"kino hitoshi\": \"鬼ノ仁\",\n        \"tam-u\": \"Tam-U\",\n        \"lunaluku\": \"るなるく\",\n        \"shiokonbu\": \"しおこんぶ\",\n        \"mon-mon\": \"MON-MON\",\n        \"kohoshi moe\": \"小星萌\",\n        \"kurumiko\": \"胡桃子\",\n        \"hirari\": \"ひらり\",\n        \"aoi nagisa\": \"葵渚\",\n        \"alde hyde\": \"アルデヒド\",\n        \"mutsuno hexa\": \"六ツ野へきさ\",\n        \"takenokoya\": \"筍屋\",\n        \"ankoku tiger\": \"暗黒タイガー\",\n        \"kakkii\": \"かっきー\",\n        \"shizuki shuya\": \"紫月秋夜\",\n        \"himukai kyousuke\": \"日向恭介\",\n        \"fuyutugu\": \"冬嗣\",\n        \"mogudan\": \"モグダン\",\n        \"100yen locker\": \"100円ロッカー\",\n        \"hana hook\": \"华フック\",\n        \"taki minashika\": \"滝美梨香\",\n        \"hirame\": \"ヒラメ | 比目鱼\",\n        \"minakami rinka\": \"水上凛香\",\n        \"andou shuki\": \"安藤周记\",\n        \"nakata shunpei\": \"中田春平\",\n        \"kurun\": \"くるん\",\n        \"inuzumi masaki\": \"戌角柾\",\n        \"kurashima tomoyasu\": \"仓岛丈康\",\n        \"hanamo daiou\": \"はなも大王\",\n        \"mizu gokiburi\": \"水ゴキブリ\",\n        \"kazumu\": \"一梦\",\n        \"rentb\": \"Rentb\",\n        \"ren\": \"REN\",\n        \"kotera\": \"コテラ\",\n        \"fei\": \"飞燕\",\n        \"miyano kintarou\": \"宫野金太郎\",\n        \"sumino yuuji\": \"速野悠二\",\n        \"shouji ayumu\": \"小路步\",\n        \"maka fushigi\": \"魔訶不思議\",\n        \"draw2\": \"土狼弐\",\n        \"muronaga chaashuu\": \"室永叉烧\",\n        \"sawao\": \"さわお\",\n        \"kudou hiroshi\": \"工藤洋\",\n        \"tsurui\": \"鹤井\",\n        \"okiraku nic\": \"お気楽ニック\",\n        \"kanten\": \"寒天\",\n        \"usubeni sakurako\": \"うすべに桜子\",\n        \"nori\": \"糊\",\n        \"mitsugi\": \"ミツギ\",\n        \"seura isago\": \"濑浦沙悟\",\n        \"tsukudani norio\": \"佃煮のりお\",\n        \"kasugano tobari\": \"春日野トバリ\",\n        \"hisaka hazara\": \"檜坂はざら\",\n        \"sumiyao\": \"すみやお\",\n        \"ikkyuu\": \"一休\",\n        \"hasemi ryo\": \"长谷见亮\",\n        \"summer\": \"サマー\",\n        \"tokitsu mika\": \"都月十佳\",\n        \"arigase shinji\": \"ありがせしんじ\",\n        \"arisaka k\": \"有坂K\",\n        \"asakaze abyss\": \"朝風あびす\",\n        \"youki akira\": \"优希辉\",\n        \"matsuda k\": \"マツダK\",\n        \"amanatsu aki\": \"甘夏あき\",\n        \"magukappu\": \"马克杯\",\n        \"michiyon\": \"みちよん\",\n        \"hijiri tsukasa\": \"圣☆司\",\n        \"tsukino jyogi\": \"月野定规\",\n        \"gotou junji\": \"后藤润二\",\n        \"nogi makoto\": \"のぎまこと\",\n        \"shinonome ryu\": \"东云龙\",\n        \"nikusyo\": \"弐駆緒\",\n        \"shimanto youta\": \"四万十曜太\",\n        \"sugou hiroyuki\": \"菅生博倖\",\n        \"bow rei\": \"某零\",\n        \"inochi wazuka\": \"命わずか\",\n        \"hiduki yayoi\": \"ひづき夜宵\",\n        \"komori kei\": \"こもりけい\",\n        \"toyama teiji\": \"戸山テイジ\",\n        \"komiya hitoma\": \"こみやひとま\",\n        \"hitsuji takako\": \"ひつじたかこ\",\n        \"mizoro tadashi\": \"深泥正\",\n        \"q-gaku\": \"Q-Gaku\",\n        \"kemigawa mondo\": \"検見川もんど\",\n        \"tadano akira\": \"只野あきら\",\n        \"kaisen chuui\": \"开栓注意\",\n        \"ozy\": \"オジィ\",\n        \"sakurai shizuku\": \"桜井雫\",\n        \"kokutou nikke\": \"黒糖ニッケ\",\n        \"makuwauni\": \"まくわうに\",\n        \"seki\": \"赤\",\n        \"monorino\": \"モノリノ\",\n        \"tomohiro kai\": \"智弘カイ\",\n        \"kuribayashi chris\": \"栗林クリス\",\n        \"nagai wataru\": \"长井わたる\",\n        \"suzuhane suzu\": \"すずはねすず\",\n        \"tanaka decilitre\": \"田中竕\",\n        \"yahiro\": \"黑小枝\",\n        \"sabamu\": \"鲭梦\",\n        \"fujise akira\": \"藤瀬あきら\",\n        \"shouryuu\": \"升龙\",\n        \"kisaragi wataru\": \"如月わたる\",\n        \"mizone\": \"みぞね\",\n        \"herokey\": \"ヒーローキィ\",\n        \"mikanuji\": \"みかん氏\",\n        \"honda arima\": \"ほんだありま\",\n        \"oshiki hitoshi\": \"御敷仁\",\n        \"shimaji\": \"しまじ\",\n        \"tenro aya\": \"天路あや\",\n        \"meme50\": \"メメ50\",\n        \"menea the dog\": \"メネア・ザ・ドッグ\",\n        \"makibe kataru\": \"牧部かたる\",\n        \"ikeshita maue\": \"池下真上\",\n        \"ikuhana niro\": \"几花にいろ\",\n        \"c.r\": \"しーあーる\",\n        \"chimosaku\": \"ちもさく\",\n        \"otoo\": \"ぉとぉ\",\n        \"belu\": \"BeLu\",\n        \"yotsuba chika\": \"四葉チカ\",\n        \"hashimoto takashi\": \"桥本隆\",\n        \"suzuhira hiro\": \"铃平广\",\n        \"nishimata aoi\": \"西又葵\",\n        \"hadumi rio\": \"羽純りお\",\n        \"matsushita makako\": \"松下まかこ\",\n        \"sakura hanpen\": \"桜はんぺん\",\n        \"hatori piyoko\": \"羽鳥ぴよこ\",\n        \"naenae\": \"なえなえ\",\n        \"takayaki\": \"たかやKi\",\n        \"uonuma yuu\": \"うおぬまゆう\",\n        \"amamine\": \"あまみね\",\n        \"niki\": \"にき\",\n        \"rokudou itsuki\": \"六九導イツキ\",\n        \"rubi-sama\": \"るび様\",\n        \"wori\": \"ヲリ\",\n        \"mura\": \"むら\",\n        \"tsurusaki takahiro\": \"鹤崎贵大\",\n        \"fusataka sikibu\": \"ふさたか式部\",\n        \"kutani\": \"九手児\",\n        \"takei masaki\": \"竹井正树\",\n        \"yamaki rin\": \"山木铃\",\n        \"shokushu-san\": \"触手さん\",\n        \"wazakita\": \"わざきた\",\n        \"erodezain koubou\": \"エロデザイン工房\",\n        \"coffee-kizoku\": \"咖啡贵族\",\n        \"rindou\": \"龙胆\",\n        \"iruma kamiri\": \"いるまかみり\",\n        \"zakkin\": \"杂菌\",\n        \"aotsu umihito\": \"蒼津ウミヒト\",\n        \"shiina soutyou\": \"椎名总长\",\n        \"hikage eiji\": \"日阴影次\",\n        \"amakura\": \"アマクラ\",\n        \"ebi193\": \"えび193\",\n        \"shinama\": \"しなま\",\n        \"mars\": \"Mars\",\n        \"yuran\": \"ゆらん\",\n        \"toumi haruka\": \"遠海ハルカ\",\n        \"chris\": \"CHRIS\",\n        \"shiromaki mizuga\": \"みずが\",\n        \"alpine\": \"あるぴーぬ\",\n        \"yuuka nonoko\": \"夕華ののこ\",\n        \"hakuho\": \"白凤\",\n        \"ooshima ryou\": \"大嶋亮\",\n        \"aeba fuchi\": \"飨庭渊\",\n        \"hakka yuki\": \"薄荷ゆき\",\n        \"derauea\": \"でらうえあ\",\n        \"rurukichi\": \"るるキチ\",\n        \"unasaka\": \"うなさか\",\n        \"anmi\": \"Anmi\",\n        \"kishizuka kenji\": \"木静谦二\",\n        \"kanenomori sentarou\": \"金ノ森銭太郎\",\n        \"hazuki kaoru\": \"八月薫\",\n        \"kenzaki mikuri\": \"犬崎みくり\",\n        \"kofunami\": \"こふなみ\",\n        \"touma itsuki\": \"东磨树\",\n        \"asaba yuu\": \"浅葉ゆう\",\n        \"akizuki ryou\": \"秋月亮\",\n        \"nanigawa rui\": \"名仁川るい\",\n        \"ohkura kazuya\": \"大藏一也\",\n        \"psycocko\": \"碎骨子\",\n        \"hanainu\": \"花犬\",\n        \"madoutei\": \"魔童贞\",\n        \"ra\": \"RA\",\n        \"yohane\": \"ヨハネ\",\n        \"akiduki tsukasa\": \"秋月つかさ\",\n        \"hanamiya natsuka\": \"花宮なつか\",\n        \"nagayama yuunon\": \"永山ゆうのん\",\n        \"sakura denbu\": \"樱田麸\",\n        \"sin-go\": \"Sin-Go\",\n        \"tsunagami\": \"つながみ\",\n        \"yassy\": \"YASSY\",\n        \"rokuwata tomoe\": \"六羽田トモエ\",\n        \"souma\": \"相马\",\n        \"annekuma\": \"ANNEKUMA\",\n        \"108 gou\": \"108号\",\n        \"akazawa red\": \"あかざわRED\",\n        \"r-koga\": \"あ～る・こが\",\n        \"ashimoto yoika\": \"あしもと☆よいか\",\n        \"awaji himeji\": \"あわじひめじ\",\n        \"itou\": \"いトう\",\n        \"usashiro mani\": \"うさ城まに\",\n        \"ookami uo\": \"オオカミうお\",\n        \"kawady max\": \"カワディMAX\",\n        \"kimio tamako\": \"きみおたまこ\",\n        \"quzilax\": \"クジラックス\",\n        \"gorgeous takarada\": \"ゴージャス宝田\",\n        \"zaki zaraki\": \"ザキザラキ\",\n        \"tamachi yuki\": \"たまちゆき\",\n        \"bar peachpit\": \"バー・ぴぃちぴっと\",\n        \"higashiyama show\": \"东山翔\",\n        \"yoshino\": \"よしの\",\n        \"minion\": \"みにおん\",\n        \"nishikibasami\": \"二式鋏\",\n        \"onizuka naoshi\": \"鬼束直\",\n        \"hayashibara hikari\": \"林原ひかり\",\n        \"suzuki kyoutarou\": \"铃木狂太郎\",\n        \"nekogen\": \"猫玄\",\n        \"kiya shii\": \"木谷椎\",\n        \"molokonomi\": \"平屋のぼり\",\n        \"maeshima ryou\": \"前岛龙\",\n        \"yamazaki kazuma\": \"山崎かずま\",\n        \"momonosuke\": \"桃之助\",\n        \"murian\": \"无有利安\",\n        \"mutou mato\": \"武藤まと\",\n        \"kobayashi oukei\": \"小林王桂\",\n        \"tanabe kyou\": \"田边京\",\n        \"kiai neko\": \"樺島あきら\",\n        \"charu\": \"茶琉\",\n        \"tamahagane\": \"たまはがね\",\n        \"nakani\": \"なかに\",\n        \"mizuryu kei\": \"水龙敬\",\n        \"oyari ashito\": \"大枪苇人\",\n        \"hagiya masakage\": \"はぎやまさかげ\",\n        \"siina tai\": \"椎名鲷\",\n        \"greenteaneko\": \"GreenTeaNeko\",\n        \"kuroshiro neko\": \"黑白音子\",\n        \"dean\": \"ディーン\",\n        \"mizutani rin\": \"みずたにりん\",\n        \"ayakase chiyoko\": \"綾枷ちよこ\",\n        \"ayakase riberi\": \"綾枷りべり\",\n        \"yuasa\": \"ゆあさ\",\n        \"genzaburoh\": \"Genzaburoh\",\n        \"smac\": \"SMAC\",\n        \"hie himiko\": \"日枝御子\",\n        \"hisakawa tinn\": \"久川ちん\",\n        \"mizuhara yuu\": \"水原优\",\n        \"hasumi milk\": \"はすみみるく\",\n        \"karasu\": \"空巢\",\n        \"akiha at\": \"あきは@\",\n        \"amagiri mio\": \"雨雾MIO\",\n        \"bifidus\": \"ビフィダス\",\n        \"ice\": \"ICE\",\n        \"kumoemon\": \"くもえもん\",\n        \"kuro fn\": \"クロFn\",\n        \"lorica\": \"Lorica\",\n        \"nakayama tetsugaku\": \"中山哲学\",\n        \"nisepakuman-san\": \"偽パクマンさん\",\n        \"oobayashi mori\": \"大林森\",\n        \"piero\": \"PIえろ\",\n        \"saida kazuaki\": \"さいだ一明\",\n        \"sayryu\": \"性龙\",\n        \"tsukasawa\": \"塚泽\",\n        \"yukiguni omaru\": \"雪國おまる\",\n        \"asakura mitsuru\": \"朝仓满\",\n        \"hase tsubura\": \"长谷圆\",\n        \"herohero tom\": \"へろへろTom\",\n        \"hoshino ryuichi\": \"星野龙一\",\n        \"inoue nanaki\": \"井上七树\",\n        \"macaroni and cheese\": \"マカロニandチーズ\",\n        \"mozu k\": \"もずK\",\n        \"natsuka q-ya\": \"奈塚Q弥\",\n        \"sakaki utamaru\": \"榊歌丸\",\n        \"yontarou\": \"よんたろう\",\n        \"hamada yoshikadu\": \"浜田よしかづ\",\n        \"meowwithme\": \"MeowWithMe\",\n        \"nishizaki eimu\": \"西崎えいむ\",\n        \"mutsumi masato\": \"むつみまさと\",\n        \"samerupa\": \"さめるぱ\",\n        \"yumemi\": \"ゆめみ\",\n        \"watsuki ayamo\": \"わつき彩雲\",\n        \"yataro\": \"やたろー\",\n        \"poco\": \"ポコ\",\n        \"mucha\": \"むちゃ\",\n        \"fujimaru\": \"藤丸\",\n        \"gechu\": \"ゲッチュ\",\n        \"owanta\": \"Owanta\",\n        \"mikan\": \"みかん\",\n        \"amanatsu mero\": \"甘夏メロ\",\n        \"sayika\": \"Sayika\",\n        \"rihito akane\": \"りひと茜\",\n        \"abe inori\": \"阿部いのり\",\n        \"akuochisukii sensei\": \"アクオチスキー先生\",\n        \"ameyama denshin\": \"雨山电信\",\n        \"aoyama mayama\": \"青山まやま\",\n        \"bitch goigostar\": \"ビッチ☆ゴイゴスター\",\n        \"danbo\": \"ダンボ\",\n        \"dunga\": \"ドゥンガ\",\n        \"musashi daichi\": \"武蔵ダイチ\",\n        \"nukunuku orange\": \"ヌクヌクオレンジ\",\n        \"onikubo hirohisa\": \"鬼窪浩久\",\n        \"sagattoru\": \"サカッとる\",\n        \"tamaki\": \"TAMAKI\",\n        \"ahemaru\": \"アヘ丸\",\n        \"akikusa peperon\": \"秋草ぺぺろん\",\n        \"drachef\": \"ドラチェフ\",\n        \"hikage hinata\": \"日陰ひなた\",\n        \"kijima daisyarin\": \"鬼岛大车轮\",\n        \"minikoara\": \"瑞稀樱花\",\n        \"nanairo\": \"ナナイロ\",\n        \"ryuuta\": \"竜太\",\n        \"shomu\": \"しょむ\",\n        \"sunagawa tara\": \"砂川多良\",\n        \"amahara\": \"天原\",\n        \"arino hiroshi\": \"ありのひろし\",\n        \"cheewts\": \"ちいうつ\",\n        \"katsura airi\": \"桂あいり\",\n        \"koori\": \"粉织\",\n        \"red-rum\": \"RED-RUM\",\n        \"ryoh-zoh\": \"椋藏\",\n        \"shouji nigou\": \"庄司二号\",\n        \"henrybird\": \"半里バード9\",\n        \"homing\": \"ホーミング\",\n        \"kageno illyss\": \"影乃いりす\",\n        \"katou jun\": \"加藤じゅん\",\n        \"kuroda ariake\": \"黑田有明\",\n        \"miyabi tatsuto\": \"みやびたつと\",\n        \"mizuki eimu\": \"みずきえいむ\",\n        \"momon kooji\": \"ももんこーじ\",\n        \"monogusa wolf\": \"ものぐさうるふ\",\n        \"moroha\": \"乙\",\n        \"naitou satoshi\": \"乃藤悟志\",\n        \"oonuki makuri\": \"大貫まくり\",\n        \"sabashi renya\": \"左桥レンヤ\",\n        \"t.k-1\": \"T.K-1\",\n        \"tachibana surimu\": \"橘すりむ\",\n        \"takahashi kobato\": \"高橋こばと\",\n        \"takashita takashi\": \"たかしたたかし\",\n        \"yokoi rego\": \"横井レゴ\",\n        \"amayumi\": \"あまゆみ\",\n        \"ameya kirica\": \"飴屋きりか\",\n        \"arsenal\": \"アーセナル\",\n        \"asagi ryu\": \"あさぎ龍\",\n        \"hayano rinta\": \"早野りんた\",\n        \"jenigata\": \"ジェニガタ\",\n        \"mita kurumi\": \"みたくるみ\",\n        \"mutsuki\": \"睦月\",\n        \"shinobu tanei\": \"志乃武丹英\",\n        \"cuzukago\": \"くずかご\",\n        \"kojima miu\": \"儿岛未生\",\n        \"kokudakaya\": \"こくだかや\",\n        \"kuroishi ringo\": \"黒石りんご\",\n        \"mokuzou\": \"杢臓\",\n        \"suitekiya yuumin\": \"水滴家悠民\",\n        \"takasugi kou\": \"タカスギコウ\",\n        \"uramac\": \"うらまっく\",\n        \"isawa nohri\": \"いさわのーり\",\n        \"kinomoto anzu\": \"木之本杏\",\n        \"misumi tsubaki\": \"三澄ツバキ\",\n        \"nekodanshaku\": \"猫男爵\",\n        \"oosawa ofuda\": \"大沢おふだ\",\n        \"ryoumoto hatsumi\": \"岭本八美\",\n        \"salad\": \"さらだ\",\n        \"sawayaka samehada\": \"さわやか鮫肌\",\n        \"ueda yuu\": \"上田裕\",\n        \"usakun\": \"兔君\",\n        \"chiguchi miri\": \"チグチミリ\",\n        \"fuyuno mikan\": \"冬野みかん\",\n        \"hikoma hiroyuki\": \"彦馬ヒロユキ\",\n        \"imotoka tsuyuki\": \"芋とか露木\",\n        \"natsuki kiyohito\": \"夏木きよひと\",\n        \"noise\": \"Noise\",\n        \"nukkoru\": \"ぬっこる\",\n        \"ponsuke\": \"ポンスケ\",\n        \"satuyo\": \"さつよ\",\n        \"soine\": \"添い寝\",\n        \"takaoka motofumi\": \"高冈基文\",\n        \"sink\": \"SINK\",\n        \"warabino matsuri\": \"蕨野まつり\",\n        \"nandz\": \"NandZ\",\n        \"urakan\": \"U罗汉\",\n        \"shiwasu horio\": \"師走ほりお\",\n        \"pokachu\": \"ぽかちゅ\",\n        \"wasabi\": \"わさび | 和錆\",\n        \"naruko hanaharu\": \"鸣子花春\",\n        \"bosshi\": \"ぼっしぃ\",\n        \"inu\": \"犬\",\n        \"takeda hiromitsu\": \"武田弘光\",\n        \"shiwasu no okina\": \"师走之翁\",\n        \"shindol\": \"新堂エル\",\n        \"otono natsu\": \"音乃夏\",\n        \"yasui riosuke\": \"ヤスイリオスケ\",\n        \"kizuki aruchu\": \"鬼月あるちゅ\",\n        \"sameda koban\": \"さめだ小判\",\n        \"koume keito\": \"小梅京人\",\n        \"thomas\": \"藤ます\",\n        \"mutsutake\": \"睦茸\",\n        \"midori no rupe\": \"绿のルーペ\",\n        \"homunculus\": \"ホムンクルス\",\n        \"lunch\": \"らんち\",\n        \"inoue kiyoshirou\": \"胃之上奇嘉郎\",\n        \"namonashi\": \"无望菜志\",\n        \"oda non\": \"织田non\",\n        \"nemunemu\": \"ネムネム\",\n        \"makita masaki\": \"莳田真记\",\n        \"hoshiai hilo\": \"星逢ひろ\",\n        \"takase yuu\": \"鹰势优\",\n        \"hiiragi masaki\": \"柊柾葵\",\n        \"po-ju\": \"ぽ～じゅ\",\n        \"abu hyaku\": \"あぶひゃく\",\n        \"suehirogari\": \"末广雅里\",\n        \"kuritsu yoshihiro\": \"くりつよしひろ\",\n        \"guglielmo\": \"ぐりえるも\",\n        \"kusano yuu\": \"草野ゆぅ\",\n        \"matsuno susumu\": \"松野进\",\n        \"murasaki syu\": \"むらさき朱\",\n        \"nishi iori\": \"西安\",\n        \"ohara tometa\": \"小原トメ太\",\n        \"sakura koharu\": \"さくら小春\",\n        \"junkos\": \"淳子\",\n        \"hoshino lily\": \"星野リリィ\",\n        \"heriyama\": \"缘山\",\n        \"nasuyama\": \"茄子山\",\n        \"misasagi task\": \"陵たすく\",\n        \"oyu no kaori\": \"お湯の香り\",\n        \"kojima saya\": \"小岛纱\",\n        \"mitsuki sakura\": \"美月樱\",\n        \"tmzf\": \"TMZF\",\n        \"kamikaze makoto\": \"神风诚\",\n        \"saikawa akoya\": \"斎川あこや\",\n        \"saikawa yusa\": \"さいかわゆさ\",\n        \"kita kaduki\": \"北かづき\",\n        \"mach ii\": \"まぁくII\",\n        \"tatsunami youtoku\": \"辰波要徳\",\n        \"tinkle\": \"Tinkle\",\n        \"kiriyama\": \"桐山\",\n        \"takatsu\": \"高津\",\n        \"gekkoji\": \"激昂寺\",\n        \"monety\": \"もねてぃ\",\n        \"hyji\": \"灰司\",\n        \"rokuichi\": \"六壹\",\n        \"yakumi benishouga\": \"药味红生姜\",\n        \"takeyuu\": \"タケユウ\",\n        \"pokka\": \"ぽっか\",\n        \"hiroshiki\": \"宏式\",\n        \"tonda\": \"Tonda\",\n        \"matsu takeshi\": \"松武\",\n        \"matsuzaki tsukasa\": \"松崎司\",\n        \"zootan\": \"ZooTAN\",\n        \"redlight\": \"REDLIGHT\",\n        \"yukie\": \"ゆき恵\",\n        \"raven\": \"RAVEN\",\n        \"sujoyushi\": \"酢醤油氏\",\n        \"date\": \"DATE\",\n        \"kase daiki\": \"加濑大辉\",\n        \"nakamura kumarin\": \"中村くまりん\",\n        \"masago\": \"まさご\",\n        \"ron\": \"RON\",\n        \"zounose\": \"ゾウノセ\",\n        \"suzuka sakito\": \"凉加早希兔\",\n        \"sugi g\": \"すぎぢー\",\n        \"kanzaki maguro\": \"潤咲まぐろ\",\n        \"sakagaki\": \"サカガキ\",\n        \"leslie brown\": \"Leslie Brown\",\n        \"satsuki imonet\": \"皋月芋网\",\n        \"chiyoko\": \"ちよこ\",\n        \"marui maru\": \"丸居まる\",\n        \"asuhiro\": \"アスヒロ\",\n        \"bomb\": \"ボム\",\n        \"eguchi jaws\": \"江口ジョーズ\",\n        \"eno yukimi\": \"榎ゆきみ\",\n        \"esuke\": \"えーすけ\",\n        \"gintarou\": \"ぎん太郎\",\n        \"hardboiled yoshiko\": \"ハードボイルドよし子\",\n        \"hinahara emi\": \"雛原えみ\",\n        \"hitori\": \"火鸟\",\n        \"karasuma yayoi\": \"乌丸弥生\",\n        \"napata\": \"なぱた\",\n        \"nokin\": \"のきん\",\n        \"savan\": \"SAVAN\",\n        \"sugaishi\": \"すがいし\",\n        \"sumiya\": \"スミヤ\",\n        \"takashi\": \"タカシ\",\n        \"ushino kandume\": \"牛野缶诘\",\n        \"yahiro pochi\": \"八寻ぽち\",\n        \"yanyo\": \"やんよ\",\n        \"yuzuha\": \"ユズハ\",\n        \"yamagara tasuku\": \"山雀たすく\",\n        \"zumikuni\": \"ズミクニ\",\n        \"juder\": \"Juder\",\n        \"nagase yutaka\": \"长濑ゆたか\",\n        \"yumeno owari\": \"ユメのオワリ\",\n        \"kamimiya kozue\": \"神宫梢\",\n        \"anzu\": \"庵ズ\",\n        \"lu renbing\": \"路人丙\",\n        \"takei ooki\": \"タケイオーキ\",\n        \"azuma tesshin\": \"东铁神\",\n        \"akagi asahito\": \"赤城あさひと\",\n        \"benimura karu\": \"红村かる\",\n        \"bota mochito\": \"牡丹もちと\",\n        \"cuvie\": \"Cuvie\",\n        \"hazuki yuto\": \"羽月ユウト\",\n        \"hinasaki yo\": \"雏咲叶\",\n        \"naruko\": \"鸣湖（平间ひろかず）\",\n        \"hishigata tomaru\": \"ひし形とまる\",\n        \"mokufu\": \"もくふう\",\n        \"okumoto yuuta\": \"オクモト悠太\",\n        \"regdic\": \"れぐでく\",\n        \"shiba nanasei\": \"柴七世\",\n        \"shimetta seiya\": \"湿った星夜\",\n        \"tsukitokage\": \"月蜥蜴\",\n        \"izumi yuhina\": \"いずみゆひな\",\n        \"akino sora\": \"あきのそら\",\n        \"yumeno tanuki\": \"梦乃狸\",\n        \"ichinomiya\": \"一ノ宮\",\n        \"kikuchi seiji\": \"菊池政治\",\n        \"yabuki gou\": \"矢吹豪\",\n        \"sanbun kyoden\": \"山文京传\",\n        \"takunomi\": \"たくのみ\",\n        \"1-gou\": \"1号\",\n        \"kadoi aya\": \"门井亚矢\",\n        \"doumeki bararou\": \"百目鬼蔷薇郎\",\n        \"umiushi\": \"うみうし\",\n        \"samidare setsuna\": \"五月雨せつな\",\n        \"shinobe\": \"しのべ\",\n        \"kamiya\": \"Kamiya | かみや\",\n        \"aduma ren\": \"あづま煉\",\n        \"akiya akira\": \"秋谷昭\",\n        \"ashiomi masato\": \"アシオミマサト\",\n        \"hamao\": \"Hamao\",\n        \"hyocorou\": \"ひょころー\",\n        \"ichimatsu\": \"いちまつ\",\n        \"ishikawa shisuke\": \"石川シスケ\",\n        \"itou ei\": \"いとうえい\",\n        \"karma tatsurou\": \"かるま龍狼\",\n        \"kizuka kazuki\": \"きづかかずき\",\n        \"koppori nama beer\": \"こっぽり生ビール\",\n        \"mojarin\": \"もじゃりん\",\n        \"momoko\": \"ももこ\",\n        \"netoromorikon\": \"ねとろもりこん\",\n        \"okara\": \"おから\",\n        \"reco\": \"Reco\",\n        \"zanzi\": \"暂时\",\n        \"hozumi kenji\": \"ほずみけんじ\",\n        \"mel\": \"Mel\",\n        \"getty\": \"Getty\",\n        \"ramjak\": \"Ramjak\",\n        \"the jinshan\": \"The Jinshan\",\n        \"yu-ta\": \"YU-TA\",\n        \"ooba nii\": \"大庭新\",\n        \"yuuki sei\": \"结城成\",\n        \"natsume eri\": \"なつめえり\",\n        \"kuroinu juu\": \"黑犬兽\",\n        \"bakutaso\": \"爆タソ\",\n        \"mda starou\": \"MだSたろう\",\n        \"tsuchigayu\": \"土粥\",\n        \"myu-po\": \"myu-po\",\n        \"nase\": \"名濑\",\n        \"noba\": \"の歯\",\n        \"shiki takuto\": \"史鬼匠人\",\n        \"sakagami umi\": \"坂上海\",\n        \"kuno touya\": \"九野十弥\",\n        \"sakurasawa yukino\": \"さくらさわゆきの\",\n        \"inomoto rikako\": \"井之本理佳子\",\n        \"mikemono yuu\": \"神毛物由宇\",\n        \"tsukioka kirio\": \"ツキオカキリオ\",\n        \"nishi\": \"弐肆 | にし | 西\",\n        \"chachaki noriyuki\": \"清山昌\",\n        \"abe morioka\": \"あべもりおか\",\n        \"akishima shun\": \"昭嶋しゅん\",\n        \"alexi laiho\": \"荒岸来步\",\n        \"dobato\": \"ドバト\",\n        \"fuyu mikan\": \"冬みかん\",\n        \"hatch\": \"ハッチ\",\n        \"inoue yoshihisa\": \"井上よしひさ\",\n        \"ken\": \"KEN | けん\",\n        \"kimura neito\": \"木村宁都\",\n        \"kir-rin\": \"きりりん\",\n        \"ootori ryuuji\": \"おおとりりゅうじ\",\n        \"suzunone kanata\": \"音々かなた\",\n        \"terada nuki\": \"寺田ぬき\",\n        \"wakana hanabi\": \"わかなはなび\",\n        \"amecha\": \"アメちゃ\",\n        \"tamano nae\": \"珠乃なえ\",\n        \"caviar\": \"きゃびあ\",\n        \"mojyako\": \"モジャコ\",\n        \"hammer\": \"ハマー\",\n        \"sugiyuu\": \"スギユウ\",\n        \"wox yang\": \"沃克羊\",\n        \"garland\": \"があらんど\",\n        \"homare\": \"ほまれ | 誉\",\n        \"amadume ryuuta\": \"甘诘留太（A・浪漫・我慢）\",\n        \"blade\": \"BLADE\",\n        \"itou seto\": \"イトウせと\",\n        \"tanno ran\": \"タンノらん\",\n        \"junk kameyoko\": \"JUNK龟横\",\n        \"mizutenka\": \"水点下\",\n        \"maro\": \"MARO\",\n        \"eb110ss\": \"EB110SS\",\n        \"equal\": \"イコール\",\n        \"hippopotamus\": \"ひぽぽたます\",\n        \"mikan r\": \"みかんR\",\n        \"sanezaki tsukiuo\": \"志崎月鱼\",\n        \"wang-pac\": \"わんぱく\",\n        \"arai taiki\": \"新井大器\",\n        \"ayano rena\": \"綾乃れな\",\n        \"chuunen\": \"中年\",\n        \"hanafuda sakurano\": \"花札さくらの\",\n        \"kaponco taroh\": \"かぽんこたろう\",\n        \"lockheart\": \"ロックハート\",\n        \"nasipasuta\": \"なしぱすた\",\n        \"poccora\": \"ぽっこら\",\n        \"puyocha\": \"ぷよちゃ\",\n        \"rakujin\": \"らくじん\",\n        \"syuuen\": \"终焉\",\n        \"harazaki takuma\": \"はらざきたくま\",\n        \"hashimura aoki\": \"桥村青树\",\n        \"malcorond\": \"まるころんど\",\n        \"marugari santarou\": \"丸刈参太郎\",\n        \"poncocchan\": \"ぽんこっちゃん\",\n        \"tetsuna\": \"テツナ\",\n        \"kazan no you\": \"火山の楊\",\n        \"mtu\": \"MtU\",\n        \"alp\": \"あるぷ\",\n        \"chiba toshirou\": \"チバトシロウ\",\n        \"choco pahe\": \"チョコぱへ\",\n        \"hal\": \"HAL\",\n        \"haruhisky\": \"春日喜欢\",\n        \"ichinomiya yuu\": \"一宫夕羽\",\n        \"inago\": \"INAGO\",\n        \"maki daikichi\": \"牧だいきち\",\n        \"raita\": \"来太\",\n        \"sasachinn\": \"ささちん\",\n        \"soushamoku\": \"桑柘木\",\n        \"suzuki akoni\": \"鈴月あこに\",\n        \"tachibana yuu\": \"橘由宇\",\n        \"takeda aranobu\": \"武田あらのぶ\",\n        \"jinnai\": \"ジンナイ\",\n        \"dhibi\": \"ディビ\",\n        \"fuuga\": \"枫牙\",\n        \"yoshimura tatsumaki\": \"吉村龙卷\",\n        \"hinokawa jun\": \"火の川純\",\n        \"womi\": \"WOMI\",\n        \"otsumami\": \"おつまみ\",\n        \"shiramayumi\": \"白真弓\",\n        \"chiro\": \"CHIRO | チろ\",\n        \"junny\": \"JUNNY\",\n        \"wakino keibun\": \"胁乃敬文\",\n        \"suzuneco\": \"Suzu猫。\",\n        \"utakata\": \"泡沫\",\n        \"yakou\": \"夜光\",\n        \"lambda\": \"Lambda\",\n        \"pon takahanada\": \"ポン贵花田\",\n        \"kazakura\": \"夏樱\",\n        \"rikka kai\": \"リッカー改\",\n        \"matsuryu\": \"松龙\",\n        \"suzutsuki kurara\": \"涼月くらら\",\n        \"naruhodo\": \"なるほど\",\n        \"hb\": \"HB\",\n        \"yamatogawa\": \"大和川\",\n        \"obiwan\": \"obiwan\",\n        \"xin\": \"xin\",\n        \"aratamaru\": \"改多丸\",\n        \"7zu7\": \"7zu7\",\n        \"atage\": \"あたげ\",\n        \"ebina ebi\": \"海老名えび\",\n        \"kisen\": \"奇仙\",\n        \"kyockcho\": \"局长\",\n        \"maumen\": \"まうめん\",\n        \"nukunuku\": \"ぬくぬく\",\n        \"sumiyoshi\": \"すみよし\",\n        \"umeko\": \"うめ子\",\n        \"yamada yuuya\": \"ヤマダユウヤ\",\n        \"yumoteliuce\": \"ユモテリウス\",\n        \"ichihaya\": \"いちはや\",\n        \"oboro\": \"胧\",\n        \"takayanagi katsuya\": \"高柳カツヤ\",\n        \"hori hiroaki\": \"堀博昭\",\n        \"yuugiri\": \"夕雾\",\n        \"eba\": \"EBA\",\n        \"kutibue\": \"くちぶえ\",\n        \"aoi shou\": \"葵抄\",\n        \"myougi kulaganosuke\": \"妙義倉賀ノ助\",\n        \"karatakewari\": \"からたけわり\",\n        \"mifune seijirou\": \"三船诚二郎\",\n        \"natsu no oyatsu\": \"夏のおやつ\",\n        \"homura subaru\": \"焰すばる\",\n        \"dakouin saburou\": \"蛇光院三郎\",\n        \"gura nyuutou\": \"ぐら乳頭\",\n        \"inomaru\": \"いのまる\",\n        \"iori yuzuru\": \"庵让\",\n        \"itaba hiroshi\": \"板场广志\",\n        \"james hotate\": \"ジェームスほたて\",\n        \"jamming\": \"じゃみんぐ\",\n        \"mitsuki rintarou\": \"水月林太郎\",\n        \"n.o. chachamaru\": \"N.O-茶々丸\",\n        \"naga\": \"な～が\",\n        \"nakamura nishiki\": \"中村锦\",\n        \"noq\": \"NOQ（下月重吾）\",\n        \"otonashi kyousuke\": \"音无响介\",\n        \"saki urara\": \"さきうらら\",\n        \"shinogi a-suke\": \"しのぎ鋭介\",\n        \"tonami satoshi\": \"となみさとし\",\n        \"yajima index\": \"矢岛Index\",\n        \"amano yoshitaka\": \"天野喜孝\",\n        \"aoba hachi\": \"青葉はち\",\n        \"minami\": \"みなみ\",\n        \"ouji hiyoko\": \"桜路ひよこ（ひなづか凉）\",\n        \"yoshiro\": \"夜士郎\",\n        \"urushihara satoshi\": \"漆原智志\",\n        \"yukijirushi\": \"逝印\",\n        \"riichu\": \"りいちゅ\",\n        \"momo no suidousui\": \"モモの水道水\",\n        \"kamitsurugi ouka\": \"神剑樱花\",\n        \"kantaka\": \"かんたか\",\n        \"katagiri hinata\": \"片桐雏太\",\n        \"kinosaki reisui\": \"城崎冷水\",\n        \"kuwada yuuki\": \"くわだゆうき\",\n        \"mayusaki yuu\": \"茧咲悠\",\n        \"natsuhiko\": \"夏彦\",\n        \"reita\": \"rei太\",\n        \"saeki hokuto\": \"さえき北都\",\n        \"shinozuka atsuto\": \"しのづかあつと\",\n        \"yatsuha kanan\": \"八叶香南\",\n        \"hashibiro kou\": \"桥广こう\",\n        \"koutarou\": \"こうたろう\",\n        \"piririnegi\": \"ぴりりねぎ\",\n        \"spiritus tarou\": \"スピリタス太郎\",\n        \"tel\": \"朝峰テル\",\n        \"tomomimi shimon\": \"ともみみしもん\",\n        \"mitsumomo mam\": \"蜜桃まむ\",\n        \"lolisin\": \"ろりしn\",\n        \"miyako hito\": \"ミヤコヒト\",\n        \"sola bozu\": \"空坊主\",\n        \"mimonel\": \"ミモネル\",\n        \"kloah\": \"Kloah\",\n        \"chirumakuro\": \"ちるまくろ\",\n        \"fumihiko\": \"ふみひこ\",\n        \"gustav\": \"ぐすたふ\",\n        \"matsuna hitoshi\": \"松名一\",\n        \"uekan\": \"うえかん\",\n        \"koga ryouichi\": \"古贺亮一\",\n        \"sakai nayuta\": \"坂井なゆ太\",\n        \"fan no hitori\": \"煌野一人\",\n        \"yuuzu tsushiro\": \"ゆうづつしろ\",\n        \"sendou hachi\": \"仙道八\",\n        \"saeki\": \"佐伯\",\n        \"cool kyou shinja\": \"クール教信者\",\n        \"hirasaka fuyu\": \"比良坂冬\",\n        \"joy\": \"じょい\",\n        \"kasuga souichi\": \"カスガソウイチ\",\n        \"kemonono\": \"けものの★\",\n        \"mameko\": \"まめこ\",\n        \"miyoshi\": \"みよし\",\n        \"neriume\": \"ねりうめ\",\n        \"odd\": \"Odd\",\n        \"otone\": \"音音\",\n        \"sakujirou\": \"咲次朗\",\n        \"torimushi\": \"鸟莉蒸师\",\n        \"ai ha muteki\": \"愛は無敵\",\n        \"kazetani yasunari\": \"风谷安成\",\n        \"amatarou\": \"天太郎\",\n        \"aoi hitori\": \"葵ヒトリ\",\n        \"aoten\": \"青点\",\n        \"clone ningen\": \"clone人間\",\n        \"dowman sayman\": \"道满晴明\",\n        \"kagura moromi\": \"神楽もろみ\",\n        \"mikaze takashi\": \"水风天\",\n        \"kurogane kenn\": \"玄铁绚\",\n        \"momo youkan\": \"ももようかん\",\n        \"musashimaru\": \"ムサシマル\",\n        \"nixinamo lens\": \"にびなも凸面体\",\n        \"osomatsu\": \"おそまつ\",\n        \"sanagi torajirou\": \"蛹虎次郎\",\n        \"eiichirou\": \"瑛一朗\",\n        \"izawa shinichi\": \"伊泽慎壹\",\n        \"kurumiya mashimin\": \"胡桃屋ましみん\",\n        \"miura takehiro\": \"みうらたけひろ\",\n        \"sena youtarou\": \"濑奈阳太郎\",\n        \"yumesaki sanjuro\": \"夢咲三十郎\",\n        \"sakomae aichi\": \"佐古前あいち\",\n        \"bakuya\": \"ばくや\",\n        \"c.meiko\": \"C.みーこ\",\n        \"eightman\": \"えいとまん\",\n        \"henoeno\": \"へのえの\",\n        \"kurofood\": \"くろふーど\",\n        \"momozukuku\": \"ももずくく\",\n        \"pija\": \"ピジャ\",\n        \"psycho\": \"さいこ\",\n        \"rico\": \"Rico\",\n        \"tomonaga kenji\": \"友永ケンジ\",\n        \"fukuyama naoto\": \"复八磨直兔\",\n        \"kurokawa otogi\": \"黒川おとぎ\",\n        \"satou takumi\": \"佐藤匠\",\n        \"shino\": \"シノ\",\n        \"shousan bouzu\": \"しょうさん坊主\",\n        \"yamabuki zarame\": \"山吹ざらめ\",\n        \"magatama\": \"マガタマ\",\n        \"mako kujira\": \"まこくじら\",\n        \"uesugi kyoushirou\": \"上杉响士郎\",\n        \"kai hiroyuki\": \"甲斐ひろゆき\",\n        \"kihiru\": \"きひる\",\n        \"kogaku kazuya\": \"虎顎かずや\",\n        \"kokonoki nao\": \"ここのき奈緒\",\n        \"naz\": \"NAZ\",\n        \"neriwasabi\": \"ねりわさび\",\n        \"yonyon\": \"よんよん\",\n        \"yugami goosyu\": \"由上ゴーシュ\",\n        \"pedocchi\": \"ぺどっち\",\n        \"hokou kikai\": \"补讲机械\",\n        \"papermania\": \"奴隶妇人\",\n        \"kawahagitei\": \"かわはぎ亭\",\n        \"kirieppa\": \"キリエっぱ\",\n        \"shohei\": \"将兵\",\n        \"kiyose\": \"KIYOSE\",\n        \"u-tom\": \"う~とむ\",\n        \"shiramori yuse\": \"白森ゆせ\",\n        \"bak hyeong jun\": \"朴亨濬\",\n        \"yanagihara mitsuki\": \"柳原ミツキ\",\n        \"ponkotsu works\": \"ぽんこつわーくす\",\n        \"nibo\": \"にぼ\",\n        \"mightyhonk\": \"MightyHonk\",\n        \"goldendawn\": \"Goldendawn\",\n        \"fatke\": \"FatKE\",\n        \"satsuki neko\": \"五月猫\",\n        \"akinashi yuu\": \"春夏冬ゆう\",\n        \"jakou nezumi\": \"じゃこうねずみ\",\n        \"nagi yuki\": \"凪居ユキ\",\n        \"kusui aruta\": \"久水あるた\",\n        \"tamanosuke\": \"たまのすけ\",\n        \"minamihama yoriko\": \"南浜よりこ\",\n        \"butcha-u\": \"ブッチャーU\",\n        \"nekomata naomi\": \"ねこまたなおみ\",\n        \"kiichi\": \"きいち\",\n        \"norve watanabe\": \"なーべ渡辺\",\n        \"jin\": \"Jin\",\n        \"luv p\": \"Luv P\",\n        \"rozer\": \"ROZER\",\n        \"mame danuki\": \"まめだぬき\",\n        \"lolicept\": \"Belko（LOLICEPT）\",\n        \"shiduki michiru\": \"しづきみちる\",\n        \"jet yowatari\": \"ジェット世渡り\",\n        \"jigeum\": \"지금\",\n        \"oyster\": \"オイスター\",\n        \"imachi\": \"いまち\",\n        \"momiyama\": \"もみやま\",\n        \"shimantogawa\": \"四万十川\",\n        \"zhen lu\": \"珍绿\",\n        \"devilhs\": \"Devil_HS\",\n        \"aina nana\": \"愛菜奈々\",\n        \"yokoshima takemaru\": \"邪武丸\",\n        \"hawa\": \"はわ\",\n        \"tomose shunsaku\": \"トモセシュンサク\",\n        \"reiha\": \"零覇\",\n        \"chimaq\": \"チマQ\",\n        \"magaki ryouta\": \"間垣りょうた\",\n        \"yukino minato\": \"雪野みなと\",\n        \"maruchang\": \"丸ちゃん。\",\n        \"sukiyo\": \"スキヨ\",\n        \"aiue oka\": \"爱上陆\",\n        \"rustle\": \"らする\",\n        \"calipur\": \"ｶﾘﾊﾟ−\",\n        \"dokurosan\": \"どくろさん\",\n        \"rebis\": \"Rebis\",\n        \"taihei tengoku\": \"太平天极\",\n        \"hitomaru\": \"人丸\",\n        \"kurozu\": \"くろず\",\n        \"unagimaru\": \"鳗丸\",\n        \"decarabia\": \"デカラビア\",\n        \"takurou\": \"たくろう\",\n        \"tsukimoto kizuki\": \"月本筑希\",\n        \"taigiakira\": \"タイギアキラ\",\n        \"ishikawa naoya\": \"石川直哉\",\n        \"takaku nozomu\": \"高玖のぞむ\",\n        \"oni-noboru\": \"Oni-noboru\",\n        \"hamo\": \"はも\",\n        \"satsumaage\": \"さつま揚げ\",\n        \"abu\": \"アブ | ABU\",\n        \"sinntarou\": \"心太朗\",\n        \"kotoba ai\": \"コトバアイ\",\n        \"strong bana\": \"Strong Bana\",\n        \"kuroadam\": \"黒葉だむ\",\n        \"midoriiro no shinzou\": \"緑色の心臓\",\n        \"kujou danbo\": \"九条だんぼ\",\n        \"kagiyama pandora\": \"鍵山ぱんどら\",\n        \"shitto mask\": \"嫉妬マスク\",\n        \"umitsubame\": \"うみつばめ\",\n        \"nanappe\": \"七っぺ\",\n        \"akeyama kitsune\": \"绯山狐\",\n        \"sakura\": \"樱\",\n        \"yakiniku king\": \"烧肉キング\",\n        \"nekoi hikaru\": \"猫伊光\",\n        \"inanaki shiki\": \"稻鸣四季\",\n        \"tohgarashi hideyu\": \"唐辛子ひでゆ\",\n        \"shinjinkun\": \"新人君\",\n        \"barlun\": \"ばーるん\",\n        \"kiyomiya ryo\": \"清宫凉\",\n        \"higata\": \"HIGATA\",\n        \"outou chieri\": \"无洗米\",\n        \"hoshizaki hikaru\": \"星崎ひかる\",\n        \"shinoda sanjuurou\": \"篠田参重郎\",\n        \"mimi mimizu\": \"実々みみず\",\n        \"takemura sesshu\": \"竹村雪秀\",\n        \"ishigami hajime\": \"石纸一\",\n        \"kawamori misaki\": \"かわもりみさき\",\n        \"nagashima chosuke\": \"ながしま超助\",\n        \"ozaki akira\": \"尾崎晶\",\n        \"shiomaneki\": \"シオマネキ\",\n        \"takebayashi takeshi\": \"武林武士\",\n        \"umemaru\": \"うめ丸\",\n        \"eo masaka\": \"EOまさか\",\n        \"hanabi\": \"HANABi\",\n        \"kakizaki kousei\": \"垣崎コウセイ\",\n        \"miyamoto issa\": \"宫元一佐\",\n        \"murasaki nyaa\": \"紫☆にゃ～\",\n        \"okyuuri\": \"おきゅうり\",\n        \"parabola\": \"ぱらボら\",\n        \"sugar milk\": \"シュガーミルク\",\n        \"tachibana aruto\": \"橘アルト\",\n        \"yamahata rian\": \"山畑璃杏\",\n        \"muoto\": \"むおと\",\n        \"emyo\": \"えみょ\",\n        \"nazuna\": \"ナズナ\",\n        \"mitsui jun\": \"三井纯\",\n        \"tsurugi hagane\": \"蔓木钢音\",\n        \"worin\": \"Worin\",\n        \"haeilian\": \"Haeilian\",\n        \"mayui yukisaki\": \"Mayui Yukisaki\",\n        \"asan\": \"あさん\",\n        \"akahige\": \"赤髭\",\n        \"nangou jingeru\": \"南郷じんげる\",\n        \"mitsurugi aoi\": \"能都くるみ\",\n        \"kuuchuu yousai\": \"空中幼彩\",\n        \"kotomi yo-ji\": \"ことみようじ\",\n        \"hirowa nagi\": \"广轮凪\",\n        \"kanehira morihito\": \"金平守人\",\n        \"kii takashi\": \"キイタカシ\",\n        \"kouzuki rio\": \"香月りお\",\n        \"matsusaka takeshi\": \"松阪刚志\",\n        \"nagai michinori\": \"永井道纪\",\n        \"nagisa minami\": \"渚ミナミ\",\n        \"alexi\": \"アレキシ\",\n        \"benantoka\": \"Beなんとか\",\n        \"dynamite moca\": \"ダイナマイトmoca\",\n        \"sakurafubuki nel\": \"桜吹雪ねる\",\n        \"urai tami\": \"浦井民\",\n        \"yusa\": \"ゆさ\",\n        \"gyuunyuu rinda\": \"牛乳リンダ\",\n        \"usagi nagomu\": \"うさぎなごむ\",\n        \"oohira sunset\": \"太平さんせっと\",\n        \"obui\": \"おぶい\",\n        \"amazeroth\": \"Amazeroth\",\n        \"batsu\": \"ばつ\",\n        \"campbell gichou\": \"キャンベル議長\",\n        \"hinotsuki neko\": \"日月ネコ\",\n        \"jake\": \"じぇいく\",\n        \"kamaboko red\": \"かまぼこRED\",\n        \"koharu nanakusa\": \"小春七草\",\n        \"kousuke\": \"交介\",\n        \"kuronomiki\": \"黒ノ樹\",\n        \"kurosawa kiyotaka\": \"黒澤清崇\",\n        \"misaki kaho.\": \"ミサキカホ。\",\n        \"ogura shuuichi\": \"小仓修一\",\n        \"yuuki homura\": \"结城焰\",\n        \"yamamoto\": \"山本\",\n        \"yamamoto yammy\": \"山本やみー\",\n        \"murakami maki\": \"村上真纪\",\n        \"ditama bow\": \"ぢたま(某)\",\n        \"yabuki kentarou\": \"矢吹健太朗\",\n        \"clamp\": \"CLAMP\",\n        \"kinoshita rei\": \"きのした黎\",\n        \"waero\": \"西野\",\n        \"modaetei anetarou\": \"闷亭姉太郎\",\n        \"modaetei imojirou\": \"闷亭妹次郎\",\n        \"fuckuma\": \"ふぁっ熊\",\n        \"itou daiku\": \"伊藤第九\",\n        \"kaiduka\": \"かいづか\",\n        \"moketa\": \"もけ太\",\n        \"nodame\": \"nod饴\",\n        \"sage joh\": \"sage・ジョー\",\n        \"utsutsu minoru\": \"うつつ＊みのる\",\n        \"isou doubaku\": \"位相同爆\",\n        \"kenshou izanamu\": \"剣匠イザナム\",\n        \"kotobuki kazuki\": \"琴吹かづき\",\n        \"mayumi daisuke\": \"真弓大介\",\n        \"nagano noriko\": \"永野のりこ\",\n        \"protonsaurus\": \"プロトンザウルス\",\n        \"sabe\": \"SABE\",\n        \"shibata masahiro\": \"柴田昌弘\",\n        \"youkihi\": \"阳气婢\",\n        \"kinoshita ichi\": \"木下壹\",\n        \"92m\": \"92M\",\n        \"kasukabe taro\": \"春日部太郎\",\n        \"zucchini\": \"ズッキーニ\",\n        \"shirane taito\": \"白根戴斗\",\n        \"morimi ashita\": \"森见明日\",\n        \"upanishi.\": \"うぱ西。\",\n        \"shimazu isami\": \"島津いさみ\",\n        \"arumajiki\": \"或真じき\",\n        \"uru\": \"Uru\",\n        \"higashitotsuka raisuta\": \"東戸塚らいすた\",\n        \"nizimoto hirok\": \"虹元ひろk\",\n        \"kinnikku\": \"キンニック\",\n        \"takepen\": \"タケペン\",\n        \"taikou\": \"タイコウ\",\n        \"aikawa touma\": \"藍川とうま\",\n        \"tamanoi peromekuri\": \"玉乃井ぺろめくり\",\n        \"shinozuka george\": \"筱塚酿二\",\n        \"miotama\": \"みおたま\",\n        \"kido keiji\": \"城户敬司\",\n        \"terada ochiko\": \"寺田落子\",\n        \"chimi\": \"ちみ\",\n        \"haruyukiko\": \"はるゆきこ\",\n        \"horitomo\": \"ほりとも\",\n        \"jun\": \"Jun\",\n        \"marneko\": \"まる寝子\",\n        \"miyamoto liz\": \"宮本りず\",\n        \"nanase mizuho\": \"七濑瑞穗\",\n        \"satou souji\": \"佐藤想次\",\n        \"shiina kazuki\": \"しいなかずき\",\n        \"sumisuzu\": \"すみすず\",\n        \"take\": \"タケ\",\n        \"yukiusagi.\": \"ゆきうさぎ。\",\n        \"clearite\": \"くれりて\",\n        \"makuro\": \"まくろ\",\n        \"bakugatou\": \"麦芽糖\",\n        \"nekohane ryou\": \"猫羽燎\",\n        \"gamang\": \"Gamang\",\n        \"kiryu reihou\": \"桐生玲峰\",\n        \"koutaro\": \"こうたろ\",\n        \"sasaoka gungu\": \"笹岡ぐんぐ\",\n        \"mikazuki akira\": \"みかづきあきら!\",\n        \"mikoshiro honnin\": \"みこしろ本人\",\n        \"ariko youichi\": \"有子瑶一\",\n        \"taira tsukune\": \"平つくね\",\n        \"monikano\": \"モニカノ\",\n        \"kayama rim\": \"香山リム\",\n        \"tomokichi\": \"友吉\",\n        \"nagi ichi\": \"凪市\",\n        \"ponz\": \"ぽん酢\",\n        \"arekusa mahone\": \"荒草まほん\",\n        \"akasa ai\": \"あかさあい\",\n        \"mizu umi\": \"瑞海\",\n        \"hisato\": \"ひさと\",\n        \"gyuunyuu nomio\": \"牛乳乃澪\",\n        \"konkichi\": \"绀吉\",\n        \"butcherboy\": \"ButcherBOY\",\n        \"aim\": \"AIM\",\n        \"sasakuma kyouta\": \"ささくまきょうた\",\n        \"tsujizen\": \"辻善\",\n        \"mizukoshi mayu\": \"水越まゆ\",\n        \"mitaonsya\": \"MITAONSYA\",\n        \"tokumi yuiko\": \"笃见唯子\",\n        \"dantetsu\": \"断铁（干支門三十四，〇タ）\",\n        \"inuboshi\": \"犬星\",\n        \"saitou tsukasa\": \"さいとうつかさ\",\n        \"shinkaida tetsuyarou\": \"新贝田铁也郎\",\n        \"sorimura youji\": \"そりむらようじ\",\n        \"yamamoto kazue\": \"山本和枝\",\n        \"natsuo monaka\": \"なつおもなか\",\n        \"binkan argento\": \"びんかんargento\",\n        \"minagiku\": \"みなぎく\",\n        \"landolt tamaki\": \"ランドルトたまき\",\n        \"kisaragi miyu\": \"如月みゆ\",\n        \"igumox\": \"井雲くす\",\n        \"kuune rin\": \"くうねりん\",\n        \"goto-beido\": \"ゴト・ベイドー\",\n        \"morikura en\": \"森仓圆\",\n        \"af kuro\": \"アフ黒\",\n        \"kaguyuzu\": \"カグユヅ\",\n        \"dsmile\": \"DSマイル\",\n        \"monoto\": \"ものと\",\n        \"snowmi\": \"すのみ\",\n        \"dozamura\": \"どざむら\",\n        \"kiryu\": \"Kiryu\",\n        \"kozakura nanane\": \"小桜菜々音\",\n        \"hazakura momo\": \"葉桜もも\",\n        \"sakura syoji\": \"咲良将司\",\n        \"hidiri rei\": \"ヒヂリレイ\",\n        \"nadeara bukichi\": \"抚荒武吉\",\n        \"qoopie\": \"Qoopie\",\n        \"kanbe chuji\": \"かんべ忠治\",\n        \"shuten douji\": \"酒呑童子\",\n        \"murlachrot\": \"みうらっは\",\n        \"tanaha\": \"棚叶\",\n        \"sakai minato\": \"坂井みなと\",\n        \"ijima yuu\": \"伊島ユウ\",\n        \"inari\": \"稻荷\",\n        \"momo-deary\": \"Momo-Deary\",\n        \"nonaka tama\": \"のなかたま\",\n        \"chinbotsu\": \"沈没\",\n        \"teterun\": \"ててるん\",\n        \"fuetakishi\": \"フエタキシ\",\n        \"purukogi\": \"プルコギ\",\n        \"sawaki koma\": \"沢木コマ\",\n        \"ohtsuki tohru\": \"大槻とおる\",\n        \"hidebou\": \"ひでぼう\",\n        \"kiyose kaoru\": \"キヨセ薫\",\n        \"asanagi\": \"朝凪\",\n        \"kikunyi\": \"菊にぃ\",\n        \"lasto\": \"らすと～\",\n        \"yoroduya hyakuhachi\": \"万屋百八\",\n        \"takapiko\": \"たかぴこ\",\n        \"kobayashi chisato\": \"小林ちさと\",\n        \"siomidu\": \"しおみづ\",\n        \"fudou ran\": \"不动乱\",\n        \"ikuya daikokudou\": \"几夜大黑堂\",\n        \"kaduchi\": \"カヅチ\",\n        \"sakurazuki masaru\": \"桜月マサル\",\n        \"uchuu teiou\": \"宇宙帝王\",\n        \"zundarepon\": \"ズンダレぽん\",\n        \"chokoboll mukakoi.\": \"チョコボール向囲。\",\n        \"majirou\": \"まじろー\",\n        \"nemui neru\": \"眠井ねる\",\n        \"takato kurosuke\": \"高遠くろ助\",\n        \"adachi takumi\": \"安达拓实\",\n        \"asamori mizuki\": \"朝森瑞季\",\n        \"azuma taira\": \"東タイラ\",\n        \"enoki tomoyuki\": \"榎木知之\",\n        \"fujisaka kuuki\": \"藤坂空树\",\n        \"grace ishikawa\": \"グレイス石川\",\n        \"harumi chihiro\": \"ハルミチヒロ\",\n        \"hiyama shuri\": \"ヒヤマシュリ\",\n        \"izumi yoshiki\": \"いづみよしき\",\n        \"maakou\": \"雅亚公\",\n        \"tsukioka reitarou\": \"月冈丽太朗\",\n        \"kurokawa kei\": \"くろかわ京\",\n        \"itachi\": \"いたち\",\n        \"aya shachou\": \"彩社长\",\n        \"fukumaaya\": \"ふくまーや\",\n        \"higashide irodori\": \"东出彩\",\n        \"hiura r\": \"火浦R\",\n        \"karube guri\": \"軽部ぐり\",\n        \"kusatsu terunyo\": \"草津てるにょ\",\n        \"mario\": \"まりお\",\n        \"puniiyu\": \"ぷにいゆ\",\n        \"kotengu\": \"コテング\",\n        \"otare mayu\": \"おたれまゆ\",\n        \"shirouzu myuuta\": \"白水ミュウタ\",\n        \"dosent\": \"Dosent\",\n        \"fuun daiki\": \"風雲だいき\",\n        \"satou saori\": \"佐藤沙绪理\",\n        \"takashina asahi\": \"たかしな浅妃\",\n        \"bkub\": \"Bkub\",\n        \"gemu555\": \"Gemu555\",\n        \"ichiren takushou\": \"一炼托生\",\n        \"katase minami\": \"カタセミナミ\",\n        \"masamune shirow\": \"士郎正宗\",\n        \"nikusoukyuu\": \"肉そうきゅー。\",\n        \"nimu\": \"ニム\",\n        \"okayusan\": \"おかゆさん\",\n        \"wakai ikuo\": \"若井いくお\",\n        \"z-ton\": \"Zトン\",\n        \"hanpera\": \"はんぺら\",\n        \"hirono azuma\": \"広乃あずま\",\n        \"ikeda matamune\": \"池田又心\",\n        \"kon-kit\": \"蒟吉人\",\n        \"ohsaka minami\": \"逢坂ミナミ\",\n        \"raymon\": \"RAYMON\",\n        \"shiroie mika\": \"白家ミカ\",\n        \"tes-mel\": \"tes_mel\",\n        \"toba yuga\": \"跳马游鹿\",\n        \"yoshida tobio\": \"吉田鸢牡\",\n        \"zero no mono\": \"ゼロの者\",\n        \"hige masamune\": \"ひげ政宗\",\n        \"h2o\": \"H2O\",\n        \"kekemotsu\": \"けけもつ\",\n        \"yom\": \"よむ\",\n        \"yuzugin\": \"柚银\",\n        \"akatsuki hiziri\": \"あかつき聖\",\n        \"chig\": \"Chig\",\n        \"tsumugie\": \"つむじぃ\",\n        \"maimu-maimu\": \"舞六まいむ\",\n        \"kotoyoshi yumisuke\": \"琴义弓介\",\n        \"mctek\": \"MCtek\",\n        \"hidaka sora\": \"日高空\",\n        \"mamabe mami\": \"眞々部まみ\",\n        \"sakusyaaya\": \"作者文\",\n        \"ruschuto\": \"るしゅーと\",\n        \"murata range\": \"村田莲尔\",\n        \"haguhagu\": \"はぐはぐ\",\n        \"reitou mikan\": \"れいとうみかん\",\n        \"ruuen rouga\": \"龙炎狼牙\",\n        \"kisaragi nana\": \"如月なな\",\n        \"adumi kazuki\": \"あづみ一樹\",\n        \"sasagawa iko\": \"佐々川いこ\",\n        \"wancho\": \"わんちょ\",\n        \"kajishima masaki\": \"梶岛正树\",\n        \"muririn\": \"梦璃凛\",\n        \"lilithlauda\": \"リリスラウダ\",\n        \"miyase mahiro\": \"宮瀬まひろ\",\n        \"tajima yuki\": \"田岛有纪\",\n        \"nyaito\": \"にゃいと\",\n        \"hitsuka no tsukimiko\": \"ひつかのつきみこ\",\n        \"nagami yuu\": \"永深ゆう\",\n        \"oda kenichi\": \"おだけんいち\",\n        \"toranoe\": \"トラノエ\",\n        \"kinoebi\": \"KinoeBi\",\n        \"nanashi\": \"774\",\n        \"yokoyama lynch\": \"横山私刑\",\n        \"tamposa\": \"たむポ～サ（TAM）\",\n        \"tatami\": \"叠\",\n        \"hoozuki shia\": \"鬼灯しあ\",\n        \"samantha whitten\": \"Samantha Whitten\",\n        \"romi\": \"ろみ\",\n        \"kamiya maneki\": \"かみやまねき\",\n        \"rella\": \"Rella\",\n        \"apaman\": \"あぱまん\",\n        \"takamin\": \"たかみん\",\n        \"pink taro\": \"ピンク太郎\",\n        \"tendou masae\": \"天道まさえ\",\n        \"numahana\": \"ヌマハナ\",\n        \"hino toshiyuki\": \"飞野俊之\",\n        \"yokkora\": \"ヨッコラ\",\n        \"ahen\": \"AHEN\",\n        \"kirishima satoshi\": \"桐島サトシ\",\n        \"kuroiwa madoka\": \"黒磐まどか\",\n        \"nanaroba hana\": \"ななろば華\",\n        \"ouma\": \"OUMA\",\n        \"irie jyunn\": \"入江jyunn\",\n        \"komeshiro kasu\": \"米白粕\",\n        \"gotou suzuna\": \"後藤スズナ\",\n        \"pettanp\": \"ペッタンP\",\n        \"nanashi noizi\": \"ななしのいぢ\",\n        \"koori nezumi\": \"冰鼠\",\n        \"fluff kevlar\": \"Fluff-Kevlar\",\n        \"mukka\": \"Mukka\",\n        \"harenchi tomeko\": \"はれんちとめこ\",\n        \"yukiji shia\": \"雪路时爱\",\n        \"mirin fu-ka\": \"味燐ふーか\",\n        \"toroshio\": \"とろしお\",\n        \"yuzuki\": \"柚木\",\n        \"kusaka souji\": \"久坂宗次\",\n        \"izumi banya\": \"和泉万夜\",\n        \"katzchen\": \"Kätzchen\",\n        \"kanden sky\": \"感电数寄\",\n        \"heiqing langjun\": \"黑青郎君\",\n        \"darkmaya\": \"Darkmaya\",\n        \"unini seven\": \"うにに☆せぶん\",\n        \"nekometaru\": \"ねこめたる\",\n        \"naoya\": \"直哉\",\n        \"sansyoku amido.\": \"三色网户。\",\n        \"yukiyanagi\": \"ゆきやなぎ\",\n        \"fujimoto ikura\": \"藤本いくら\",\n        \"ramiya ryou\": \"兰宫凉\",\n        \"tamiya akito\": \"田宫秋人\",\n        \"joy ride\": \"JOY RIDE\",\n        \"arima natsubon\": \"ありまなつぼん\",\n        \"ebi ebi\": \"エビエビ\",\n        \"gabyonuno\": \"ガビョ布\",\n        \"heppokokun\": \"へっぽこくん\",\n        \"honda aru\": \"翻田亚流\",\n        \"hoshino fuuta\": \"ほしのふうた\",\n        \"kani kani\": \"かにかに\",\n        \"katsumata kazuki\": \"かつまたかずき\",\n        \"kirihara kotori\": \"桐原小鸟\",\n        \"kokekokko coma\": \"こけこっこ☆こま\",\n        \"nagareboshi hikaru\": \"流星ひかる\",\n        \"mihara jun\": \"みはらじゅん\",\n        \"dpc\": \"DPC\",\n        \"urase shioji\": \"浦瀬しおじ\",\n        \"yakusho\": \"やくしょ\",\n        \"kedama keito\": \"毛玉ケヰト\",\n        \"kurai nao\": \"仓井尚\",\n        \"narutaki shin\": \"鳴滝しん\",\n        \"matasabu yarou\": \"またさぶ野郎\",\n        \"kagutsuchi\": \"カグツチ\",\n        \"nyuu\": \"にゅう\",\n        \"kani club\": \"蟹俱乐部\",\n        \"tabuchi\": \"たぶち\",\n        \"nora higuma\": \"野良ヒグマ\",\n        \"tohyama eight\": \"东山エイト\",\n        \"shakuhachi nameko\": \"尺八ナメコ\",\n        \"bai asuka\": \"呗飞鸟\",\n        \"bttamako\": \"豚たま子\",\n        \"eggplantex\": \"茄子EX\",\n        \"kouno aya\": \"煌乃あや\",\n        \"uzuki haruka\": \"卯月遥佳\",\n        \"rokudenashi\": \"ロクデナシ\",\n        \"mukoujima tenro\": \"むこうじまてんろ\",\n        \"kamitsuki manmaru\": \"上月まんまる\",\n        \"kaitou yuuhi\": \"快刀雄飞\",\n        \"danevan\": \"丹·艾凡\",\n        \"kakifly\": \"kakifly\",\n        \"go-it\": \"Go-It\",\n        \"ibuki haruhi\": \"一颯はるひ\",\n        \"beauty hair\": \"ビューティ・ヘア\",\n        \"yamamoto yoshifumi\": \"山本善文\",\n        \"yamano kitsune\": \"矢间野狐\",\n        \"yamanobe kitta\": \"やまのべきった\",\n        \"shishoku gankou\": \"紫色雁行\",\n        \"nakagawa you\": \"中川优\",\n        \"matsutou tomoki\": \"松任知基\",\n        \"kamakiri\": \"カマキリ\",\n        \"kurikara\": \"倶梨伽罗\",\n        \"lazy club\": \"LAZYCLUB\",\n        \"amano koyo\": \"天乃红叶\",\n        \"hindenburg\": \"ひんでんブルグ\",\n        \"kamidera chizu\": \"神寺千寿\",\n        \"kanou soukyuu\": \"狩野苍穹\",\n        \"kurokawa mio\": \"黒河澪\",\n        \"mizukami ranmaru\": \"水上兰丸\",\n        \"ogawa kanran\": \"小川甘蓝\",\n        \"orizumeda nyoizou\": \"折诘田如意三\",\n        \"tanaka juice\": \"田中十酢\",\n        \"tom tamio\": \"都夢たみお\",\n        \"tsukamoto miei\": \"塚本ミエイ\",\n        \"unno hotaru\": \"海野萤\",\n        \"watanabe wataru\": \"わたなべわたる\",\n        \"ikegami akane\": \"池上茜\",\n        \"gujira\": \"ぐじら\",\n        \"xierra099\": \"Xierra099\",\n        \"inazuma\": \"INAZUMA\",\n        \"tomatto\": \"とまっと\",\n        \"gabri-l\": \"雅舞罹-L\",\n        \"amagaeru\": \"あまがえる\",\n        \"batta\": \"Batta\",\n        \"cyocyo\": \"ちょちょ\",\n        \"emons\": \"えもんず\",\n        \"saryuu\": \"沙流\",\n        \"tamano kedama\": \"毛玉牛乳\",\n        \"yumano yuuki\": \"有間乃ユウキ\",\n        \"kink\": \"きんく\",\n        \"kamen no hito\": \"仮面之人\",\n        \"hakuyagen\": \"白夜弦\",\n        \"kugami angning\": \"九神杏仁\",\n        \"yanagi asahi\": \"夜凪朝妃\",\n        \"tanaka shoutarou\": \"田中松太郎\",\n        \"nuko yarou\": \"ぬこやろう\",\n        \"kaniya shiku\": \"蟹屋しく\",\n        \"suzushiro atsushi\": \"铃城敦\",\n        \"denjarasu yamada\": \"やまだ\",\n        \"sakura puchilo\": \"さくらぷちろー\",\n        \"shuko\": \"SHUKO\",\n        \"todoroki\": \"轰\",\n        \"kitamura kouichi\": \"奇田村光一\",\n        \"jabara tornado\": \"蛇腹トルネード\",\n        \"kuroda mutu\": \"黑田陆奥\",\n        \"hoyoyo\": \"ほよよ\",\n        \"aoi tiduru\": \"葵井ちづる\",\n        \"agawa ryo\": \"阿川椋\",\n        \"nise kurosaki\": \"偽くろさき\",\n        \"catapult\": \"かたぱると\",\n        \"kizuki akizuki\": \"きづきあきづき\",\n        \"low\": \"Low\",\n        \"murakami takashi\": \"村上隆史\",\n        \"natsukawa fuyu\": \"夏川冬\",\n        \"tetsu\": \"てつ\",\n        \"fuji shinobu\": \"藤忍\",\n        \"himehachi\": \"ひめはち\",\n        \"kurita yuugo\": \"栗田勇午\",\n        \"mihoshi kurage\": \"海星海月\",\n        \"mikage baku\": \"御影獏\",\n        \"sakurai uta\": \"樱井U太\",\n        \"ayase mai\": \"あやせまい\",\n        \"kishibe\": \"岸边\",\n        \"sake\": \"鲑\",\n        \"takizawa naia\": \"滝沢ナイア\",\n        \"hirugohan\": \"昼ごはん\",\n        \"izumi rin\": \"和泉凛\",\n        \"kamijou noboru\": \"上上上\",\n        \"matsutaka zon\": \"松鷹ぞん\",\n        \"mukaibi aoi\": \"向井弥・葵\",\n        \"takane nohana\": \"たかねのはな\",\n        \"yokoyama chicha\": \"よこやまちちゃ\",\n        \"yuuma\": \"祐马 | ゆーま\",\n        \"koide nao\": \"小出奈央\",\n        \"ueyama you\": \"Ueyama You\",\n        \"umino luka\": \"海野留珈\",\n        \"kabocha\": \"南瓜\",\n        \"kaidou kazuki\": \"海道阔毅\",\n        \"nishikawa kouto\": \"西川孔人\",\n        \"torosawa\": \"とろさわ\",\n        \"sekira ame\": \"せきらあめ\",\n        \"koayako\": \"コアヤアコ\",\n        \"yagami shuuichi\": \"八神秋一\",\n        \"aimaitei umami\": \"愛昧亭うまみ\",\n        \"ohara hiroki\": \"绪原博绮\",\n        \"hanaduka ryouji\": \"华塚良治\",\n        \"komine tsubasa\": \"小峯つばさ\",\n        \"arikawa katokichi\": \"ありかわかときち\",\n        \"branshea\": \"ブランシェア\",\n        \"hiruma kouji\": \"ひるまこうじ\",\n        \"kyon\": \"きょん\",\n        \"minami tomoko\": \"南智子\",\n        \"misaki yukihiro\": \"岬ゆきひろ\",\n        \"ajishio\": \"アジシオ\",\n        \"basara\": \"バサラ\",\n        \"terada zukeo\": \"寺田ヅケ夫\",\n        \"nekomaru\": \"猫丸\",\n        \"yuzumiya mono\": \"柚宫MoNo\",\n        \"ginhaha\": \"ぎんハハ\",\n        \"kiken shisou\": \"危险思想\",\n        \"dokokano aitsu\": \"何処乃アイツ\",\n        \"ginyoku screw\": \"銀欲スクリュー\",\n        \"hg chagawa\": \"HG茶川\",\n        \"john sitch-oh\": \"ジョン湿地王\",\n        \"kamitani\": \"カミタニ\",\n        \"nico pun nise\": \"笑花伪\",\n        \"okina saina\": \"冲那彩菜\",\n        \"sonomiya ponta\": \"想乃宮ぽん太\",\n        \"uziga waita\": \"氏賀Y太\",\n        \"araki kyouya\": \"荒木京也\",\n        \"bunchin\": \"ぶんちん\",\n        \"don shigeru\": \"DON繁\",\n        \"dorei jackie\": \"奴隷ジャッキー\",\n        \"drill murata\": \"ドリルムラタ\",\n        \"kira hiroyoshi\": \"吉良广义\",\n        \"koshow showshow\": \"故障少将\",\n        \"shiromi kazuhisa\": \"しろみかずひさ\",\n        \"yukarigawa yumiya\": \"紫川弓夜\",\n        \"eric w. schwartz\": \"Eric W. Schwartz\",\n        \"x pierrot\": \"Xぴえろ\",\n        \"minust\": \"minusT\",\n        \"irohakaede\": \"イロハカエデ\",\n        \"miwatari renge\": \"美渡れんげ\",\n        \"satofuji masato\": \"了藤诚仁\",\n        \"yoshi hyuuma\": \"吉飞雄马\",\n        \"yuri ai\": \"悠理爱\",\n        \"yamakumo\": \"山云\",\n        \"purin purin\": \"プリンプリン\",\n        \"aoki ume\": \"蒼樹うめ\",\n        \"nekosawaritai\": \"猫泽鲤鲷\",\n        \"raidon\": \"来钝\",\n        \"namaniku atk\": \"なまにくATK\",\n        \"kumaco\": \"くまこ\",\n        \"kuroshibe\": \"クロシベ\",\n        \"akise\": \"秋濑\",\n        \"fukuguri yuuto\": \"福栗悠斗\",\n        \"futaba yae\": \"双叶八重\",\n        \"koorizu\": \"コオリズ\",\n        \"kumataro\": \"隈太郎\",\n        \"mokkouyou bond\": \"木工用ボンド\",\n        \"mustang r\": \"マスタングR\",\n        \"nanakagi satoshi\": \"七键智志\",\n        \"saba ibaru\": \"佐羽いばる\",\n        \"takuwan\": \"たくわん\",\n        \"tsukiwani\": \"月わに\",\n        \"jyun\": \"JYUN\",\n        \"nokoppa\": \"のこっぱ\",\n        \"aru ra une\": \"アル・ラ・ウネ\",\n        \"aranasi\": \"新良梨\",\n        \"maki yoshitaka\": \"真木佳刚\",\n        \"kazuma g-version\": \"カズマ・G-VERSION\",\n        \"fangcat\": \"FangCat\",\n        \"wtk\": \"WTK\",\n        \"as109\": \"As109\",\n        \"jm\": \"JM\",\n        \"breakrabbit\": \"Breakrabbit\",\n        \"farg\": \"Farg\",\n        \"yamamoto zenzen\": \"山本善々\",\n        \"miyata ichimi\": \"宫田一海\",\n        \"kumak\": \"KUMAK\",\n        \"neneru\": \"ねねる\",\n        \"orange bull\": \"牛橘\",\n        \"ipuu\": \"伊菩\",\n        \"ohayou-san\": \"翁さい\",\n        \"nadeneko ponia\": \"撫狸ぽにあ\",\n        \"harukoubou norimaki\": \"春工房のりまき\",\n        \"forester\": \"ふぉれすた\",\n        \"metal owl\": \"Metal Owl\",\n        \"ozaki miray\": \"尾崎未来\",\n        \"madcat\": \"Madcat\",\n        \"shinooka homare\": \"篠岡ほまれ\",\n        \"uruujima call\": \"うるう島呼音\",\n        \"koizumi amane\": \"恋泉天音\",\n        \"stikyfinkaz\": \"StikyfinkaZ\",\n        \"shirasagi rokuwa\": \"白鹭六羽\",\n        \"sato daiji\": \"大慈\",\n        \"akeno minato\": \"绯野湊\",\n        \"hanabana tsubomi\": \"華々つぼみ\",\n        \"soyosoyo\": \"SOYOSOYO\",\n        \"sasorigatame\": \"さそりがため\",\n        \"chong wuxin\": \"虫无心\",\n        \"shiitakemiya donco\": \"椎茸宮どんこ\",\n        \"minase kuru\": \"水瀬くうる\",\n        \"miwa futaba\": \"三輪フタバ\",\n        \"arano oki\": \"荒野冲\",\n        \"nekotewi\": \"ねこてゐ\",\n        \"ohisashiburi\": \"お久しぶり\",\n        \"tsushima zan\": \"津嶋ザン\",\n        \"tsuda nanafushi\": \"津田七节\",\n        \"tokuni mirashichi\": \"戸国みらしち\",\n        \"ganari ryu\": \"がなり龍\",\n        \"ayuya\": \"あゆや\",\n        \"kagato\": \"加画都\",\n        \"ki-you\": \"贵勇\",\n        \"koujima tenro\": \"向島てんろ\",\n        \"natsume fumika\": \"夏目文花\",\n        \"potekoro\": \"ぽてころ\",\n        \"yukawa asami\": \"由河朝巳\",\n        \"alto seneka\": \"或十せねか\",\n        \"doi sakazaki\": \"土居坂崎\",\n        \"dowarukofu\": \"どわるこふ\",\n        \"isono toshiaki\": \"磯野としあき\",\n        \"kakogawa tarou\": \"加古川太郎\",\n        \"kokoromi shingon\": \"こころみ真言\",\n        \"komori ei\": \"古森詠\",\n        \"mashue\": \"Mashue\",\n        \"matsuzawa kei\": \"松沢慧\",\n        \"oohashi takayuki\": \"オオハシタカユキ\",\n        \"rollpan2\": \"Roll-Pants\",\n        \"rusty soul\": \"ラスティソウル\",\n        \"sakaki shiori\": \"さかき栞\",\n        \"shibahara gotyo\": \"しばはらごちょ\",\n        \"uyuu atsuno\": \"烏有あつの\",\n        \"iguchi sentarou\": \"井口千太郎\",\n        \"oborogumo takamitsu\": \"朧雲たかみつ\",\n        \"aoi kumiko\": \"葵久美子\",\n        \"noripachi\": \"のりパチ\",\n        \"hatokonro\": \"鳩こんろ\",\n        \"abe yoshitoshi\": \"安倍吉俊\",\n        \"son hee-joon\": \"손희준\",\n        \"herurun\": \"へるるん\",\n        \"hoshino\": \"星乃\",\n        \"zyugoya\": \"十五夜\",\n        \"yamaoka koutetsurou\": \"山冈钢铁郎\",\n        \"henreader\": \"へんりいだ\",\n        \"47agdragon\": \"47AgDragon\",\n        \"josho isamu\": \"城所委佐武\",\n        \"ogipote\": \"荻pote\",\n        \"marimofu\": \"まりもふ\",\n        \"alison\": \"ALISON\",\n        \"shimajirou\": \"岛次郎\",\n        \"kazuharu kina\": \"和遥キナ\",\n        \"ponta\": \"PoN太\",\n        \"akisora\": \"秋穹\",\n        \"tanishi mitsuru\": \"タニシミツル\",\n        \"mizuno koori\": \"水乃コオリ\",\n        \"akaiguppy\": \"全红白子\",\n        \"etuzan jakusui\": \"越山弱衰\",\n        \"eiji\": \"Eiジ\",\n        \"oryou\": \"おりょう\",\n        \"waguchi shouka\": \"和口昇火\",\n        \"tenzen miyabi\": \"天渐雅\",\n        \"windart\": \"WindArt\",\n        \"masaki kei\": \"真崎ケイ\",\n        \"mousou-kun\": \"もうそうくん\",\n        \"ooishi chuuni\": \"大石中二\",\n        \"mitsudoue\": \"みつどうえ\",\n        \"watanabe akio\": \"渡边明夫\",\n        \"kiyokawa nijiko\": \"虚川二次子\",\n        \"himuro serika\": \"冰室芹夏\",\n        \"nachisuke\": \"なちすけ\",\n        \"kasuga mayu\": \"春日まゆ\",\n        \"kirimoto yuuji\": \"桐下悠司\",\n        \"suihei sen\": \"水平线\",\n        \"yuunagi\": \"ユウナギ\",\n        \"jadenkaiba\": \"Jadenkaiba\",\n        \"legoman\": \"Legoman\",\n        \"staryume\": \"星遥ゆめ\",\n        \"kamifuji mikeko\": \"神藤みけこ\",\n        \"hekicha\": \"碧茶\",\n        \"nrr\": \"Nrr\",\n        \"inue shinsuke\": \"犬江しんすけ\",\n        \"onigirikun\": \"おにぎり君\",\n        \"nekosu\": \"ねこす\",\n        \"akahito\": \"赤人\",\n        \"hanada yanochi\": \"花田やのち\",\n        \"kinokomushi\": \"きのこむし\",\n        \"ichimura\": \"イチムラ\",\n        \"crimson\": \"クリムゾン\",\n        \"tanishi\": \"たにし\",\n        \"akizora sawayaka\": \"秋空さわやか\",\n        \"izumiya otoha\": \"いづみやおとは\",\n        \"minamida usuke\": \"南田U助\",\n        \"mizuyuki\": \"みずゆき\",\n        \"nise\": \"似せ\",\n        \"kojirou\": \"KOJIROU!\",\n        \"hidemaru\": \"英丸\",\n        \"hakkyou daioujou\": \"发狂大往生\",\n        \"blackshirtboy\": \"Blackshirtboy\",\n        \"xpray\": \"Xpray\",\n        \"shika yuno\": \"椎架ゆの\",\n        \"azarashi\": \"アザラシ\",\n        \"syamonabe\": \"シャモナベ\",\n        \"tyagama\": \"茶釜\",\n        \"tkp\": \"TKP\",\n        \"yakumo ginjirou\": \"八云银次郎\",\n        \"namamo nanase\": \"なまもななせ\",\n        \"pyon-kti\": \"ぴょん吉\",\n        \"azuki yui\": \"阿月唯\",\n        \"minato itoya\": \"ミナトイトヤ\",\n        \"shiraishinsuke\": \"白石Nスケ\",\n        \"soramame-san\": \"そら豆さん\",\n        \"wabara hiro\": \"羽原ヒロ\",\n        \"synchroaki\": \"しんくろあき\",\n        \"kin no tamamushi\": \"金ノ玉虫\",\n        \"yamamoto hyugo\": \"山本ひゅーご\",\n        \"lithium\": \"Lithium\",\n        \"athu\": \"Athu\",\n        \"kawarajima koh\": \"かわらじま晃\",\n        \"focke wolf\": \"ほっけうるふ\",\n        \"rukitsura.\": \"るきつら。\",\n        \"tsuchinoshita kaeru\": \"土ノ下かえる\",\n        \"nokobeya\": \"のこべや\",\n        \"ponfaz\": \"ぽんふぁーず\",\n        \"hihumi hajime\": \"一二三始\",\n        \"momoyama jirou\": \"桃山ジロウ\",\n        \"r5\": \"R5\",\n        \"c2\": \"C2\",\n        \"shitappa\": \"したっぱ\",\n        \"kanbayashi takaki\": \"神林タカキ\",\n        \"nyx\": \"にゅくす\",\n        \"akashia\": \"アカシア\",\n        \"shigeta\": \"しげた\",\n        \"uminori\": \"うみのり\",\n        \"yopparai oni\": \"酔っ払い鬼?\",\n        \"alpaca club\": \"あるぱかくらぶ\",\n        \"berosu\": \"べろす\",\n        \"silly\": \"しりー\",\n        \"sekiri\": \"せきり\",\n        \"midorino tanuki\": \"翠野タヌキ\",\n        \"kanna hisashi\": \"かんな久\",\n        \"kitahara eiji\": \"北原エイジ\",\n        \"aoi miharu\": \"蒼井ミハル\",\n        \"arinotowatari\": \"ありのとわたり\",\n        \"dagashi\": \"駄菓子\",\n        \"e-musu aki\": \"いーむす・アキ\",\n        \"himeno komomo\": \"姫野こもも\",\n        \"kamisiro ryu\": \"神代龙\",\n        \"kerorin\": \"けろりん\",\n        \"kenji\": \"けんじ\",\n        \"knuckle curve\": \"ナックルカーブ\",\n        \"koumo\": \"コーモ\",\n        \"mikarin\": \"ミカリン\",\n        \"minagiri\": \"ミナギリ\",\n        \"nijou katame\": \"二条かため\",\n        \"ouchi kaeru\": \"楝蛙\",\n        \"sexyturkey\": \"すたーきー\",\n        \"shikkarimono no takashi-kun\": \"しっかり者のタカシくん\",\n        \"survival knife\": \"サバイバル刃\",\n        \"kishiri toworu\": \"ヲルト\",\n        \"yakitomato\": \"八木户マト\",\n        \"ban kazuyasu\": \"伴カズヤス\",\n        \"kaneko toshiaki\": \"かねことしあき\",\n        \"labui\": \"羅ぶい\",\n        \"tanaka ginji\": \"田中银二\",\n        \"tetsuyama kaya\": \"鉄山かや\",\n        \"oota takeshi\": \"大田武志\",\n        \"sora inoue\": \"いのうえ空\",\n        \"tan jiu\": \"坛九\",\n        \"shigeru\": \"しげる\",\n        \"akata izuki\": \"亚方逸树\",\n        \"matsumori shou\": \"茉森晶\",\n        \"datarou\": \"だたろう\",\n        \"miso tya\": \"みそ茶\",\n        \"eirizo\": \"エイリゾ\",\n        \"ootomo yuuki\": \"大友ゆうき\",\n        \"sorai shinya\": \"空维深夜\",\n        \"muuba\": \"梦生场\",\n        \"orukaniumu\": \"おるかにうむ\",\n        \"izayoi no kiki\": \"十六夜のキキ\",\n        \"wada rco\": \"ワダアルコ\",\n        \"agobitch nee-san\": \"アゴビッチ姉さん\",\n        \"kito sakeru\": \"鬼头サケル\",\n        \"misa wasabi\": \"三左わさび\",\n        \"momoduki suzu\": \"桃月すず\",\n        \"picao\": \"ぴかお\",\n        \"girls number\": \"Girl's Number\",\n        \"asazuki norito\": \"浅月のりと\",\n        \"nodoka\": \"长闲\",\n        \"ajiichi\": \"アジイチ\",\n        \"aoihito\": \"蒼い人\",\n        \"namusoubyou\": \"名无双描\",\n        \"marushamo\": \"まるしゃも\",\n        \"haruhonya\": \"はるほんや\",\n        \"shinya\": \"しんや\",\n        \"yonban\": \"よんばん\",\n        \"nori-haru\": \"のりはる\",\n        \"neko totora\": \"ねこトトラ\",\n        \"wulazula\": \"うらずら\",\n        \"aian\": \"あいあん\",\n        \"nmo ezago\": \"ンモ=エザゴ\",\n        \"mikuni atsuko\": \"三国あつ子\",\n        \"nekousa\": \"猫兔\",\n        \"shown\": \"ショーン\",\n        \"shimakaze\": \"岛风\",\n        \"hamatyonn\": \"ハマちょん\",\n        \"fukufukuan\": \"福々餡\",\n        \"aikawa an\": \"愛川あん\",\n        \"nao takami\": \"尚たかみ\",\n        \"okuni yoshinobu\": \"小国由喜\",\n        \"oreiro\": \"オレイロ\",\n        \"ndc\": \"NDC\",\n        \"rocket monkey\": \"ロケットモンキー\",\n        \"a-teru haito\": \"A辉废都\",\n        \"kusumoto toka\": \"楠元とうか\",\n        \"utatane hiroyuki\": \"うたたねひろゆき\",\n        \"chuuka naruto\": \"中華なると\",\n        \"area\": \"Area\",\n        \"kruth666\": \"Kruth666\",\n        \"f4u\": \"F4U\",\n        \"higenamuchi\": \"ひげなむち\",\n        \"honryo hanaru\": \"本領はなる\",\n        \"ichigain\": \"一概\",\n        \"konchiki\": \"こんちき\",\n        \"namboku\": \"南北\",\n        \"tohzai\": \"东西\",\n        \"ogadenmon\": \"オガデンモン\",\n        \"sakuma tsukasa\": \"さくま司\",\n        \"arai togami\": \"荒居栂美\",\n        \"fujitsuna\": \"フジツナ\",\n        \"fukuroumori\": \"枭森\",\n        \"yukino koreyuki\": \"之之之之\",\n        \"momio\": \"もみお\",\n        \"vivian tian zong\": \"Vivian天纵\",\n        \"sugihara\": \"すぎはら\",\n        \"minagi umihito\": \"深凪ウミヒト\",\n        \"natsu no koucha\": \"夏の紅茶\",\n        \"prime\": \"Prime\",\n        \"tatekawa mako\": \"館川まこ\",\n        \"hrd\": \"hr津\",\n        \"choco-chip\": \"チョコ・チップ\",\n        \"sakurai makoto\": \"櫻井マコト\",\n        \"kuronyan\": \"くろニャン\",\n        \"moriyama yusuke\": \"森山雄介\",\n        \"son yohsyu\": \"孙阳州\",\n        \"ray-kbys\": \"Ray-Kbys\",\n        \"potato\": \"POTATO\",\n        \"ichihara hikari z\": \"位置原光Z\",\n        \"komezawa\": \"こめざわ\",\n        \"mozu\": \"もず\",\n        \"aoiro ichigou\": \"あお色一号\",\n        \"futamine kobito\": \"二峰跨人\",\n        \"gennari\": \"ゲンナリ\",\n        \"inukami\": \"いぬかみ\",\n        \"narumiya akira\": \"成宫亨\",\n        \"oosawara sadao\": \"大童贞男\",\n        \"sugarbt\": \"sugarBt\",\n        \"sunahama nosame\": \"砂浜のさめ\",\n        \"zakotsu\": \"佐骨\",\n        \"nidy-2d-\": \"Nidy-2D-\",\n        \"urico take\": \"瓜子たけ\",\n        \"tanohito\": \"たのひと\",\n        \"kouki kuu\": \"こうきくう\",\n        \"engawa suguru\": \"エンガワ卓\",\n        \"fuji-han\": \"ふじはん\",\n        \"hayashida toranosuke\": \"林田虎之助\",\n        \"buchou chinke\": \"部長ちんけ\",\n        \"asakura kukuri\": \"アサクラククリ\",\n        \"nanao naru\": \"七尾奈留\",\n        \"kirishima ayu\": \"雾岛鲇\",\n        \"keita naruzawa\": \"Keita Naruzawa\",\n        \"amami sen\": \"天观仙\",\n        \"juujou tatami\": \"十畳たたみ\",\n        \"ermuzibu\": \"Ermuzibu\",\n        \"gingami\": \"银河味\",\n        \"makino tomoe\": \"槇野ともえ\",\n        \"teppeki kyojin\": \"铁壁巨人\",\n        \"mimiyoshi\": \"みみよし\",\n        \"jinsuke\": \"甚助\",\n        \"mushoku santaro\": \"无色三太郎\",\n        \"tawara hiryuu\": \"俵绯龙\",\n        \"marugoshi\": \"まるごし\",\n        \"missbehaviour\": \"MissBehaviour\",\n        \"funsexydragonball\": \"Funsexydragonball\",\n        \"badonion\": \"BadOnion\",\n        \"hazuki ruka\": \"羽月るか\",\n        \"eno tato\": \"江野たと\",\n        \"daiaru\": \"ダイアル\",\n        \"mokusei zaijuu\": \"木星在住\",\n        \"kaga akuru\": \"加賀あくる\",\n        \"nekoaruko\": \"ねこ＠るこ\",\n        \"hari senbon\": \"针千本\",\n        \"bang-you\": \"BANG-YOU\",\n        \"bubuzuke\": \"ぶぶづけ\",\n        \"gentle sasaki\": \"ジェントル佐々木\",\n        \"kamina koharu\": \"神无小春\",\n        \"kei.\": \"刑。\",\n        \"mikoyan\": \"みこやん\",\n        \"nuezou\": \"ヌエゾウ\",\n        \"ribyuhki\": \"リブユウキ\",\n        \"sgk\": \"SGK\",\n        \"shinkuu tatsuya\": \"しんくうたつや\",\n        \"unou\": \"右脑\",\n        \"yuuki shin\": \"悠木しん\",\n        \"harumi\": \"春海\",\n        \"mirei\": \"みれい\",\n        \"miwa yoshikazu\": \"美和美和\",\n        \"wildcat\": \"ワイルドキャット\",\n        \"fujita yukihisa\": \"藤田幸久\",\n        \"l axe\": \"L Axe\",\n        \"s.m.o.k.e.\": \"S.M.O.K.E.\",\n        \"samurai\": \"さむらい\",\n        \"kureyon\": \"くれよん\",\n        \"broccoli takeda\": \"ブロッコリーたけだ\",\n        \"maatsu\": \"ま～つ\",\n        \"toumasu\": \"とーます\",\n        \"ishikawa sae\": \"石川沙绘\",\n        \"nagihashi coko\": \"なぎはしここ\",\n        \"u-jin\": \"游人\",\n        \"piripun\": \"ぴりぷん\",\n        \"akabashi\": \"アカバシ\",\n        \"mataro\": \"魔太郎\",\n        \"kekocha\": \"けこちゃ\",\n        \"mogiki hayami\": \"十はやみ\",\n        \"the amanoja9\": \"The Amanoja9\",\n        \"fumitsuki sou\": \"二三月そう\",\n        \"fuji hyorone\": \"藤ひょろね\",\n        \"hibimegane\": \"ヒビメガネ\",\n        \"dekosuke 18gou\": \"デコ助18号\",\n        \"geso smith\": \"ゲソスミス\",\n        \"hidarite tarou\": \"左手太郎\",\n        \"jagayamatarawo\": \"じゃが山たらヲ\",\n        \"kasei\": \"かせい\",\n        \"kayanoi ino\": \"茅乃井いの\",\n        \"kiiroi tamago\": \"黄色的蛋\",\n        \"kirihara you\": \"桐原湧\",\n        \"mdakoki\": \"M田K樹\",\n        \"ooyoko yamaame\": \"大横山饴\",\n        \"ryokuchaism\": \"緑茶イズム\",\n        \"shiden akira\": \"しでん晶\",\n        \"soborogo\": \"ソボロゴ\",\n        \"syoukaki\": \"消火器\",\n        \"1 equals 2\": \"1=2\",\n        \"zouo-san\": \"憎恶产\",\n        \"machida hiraku\": \"町田ひらく\",\n        \"mamezou\": \"まめぞう\",\n        \"yamaya oowemon\": \"山家大右卫门\",\n        \"yuizaki kazuya\": \"ユイザキカズヤ\",\n        \"shichimenchou\": \"しちめんちょう\",\n        \"bigshine\": \"ビッグシャイン\",\n        \"apoidea\": \"Apoidea\",\n        \"randou\": \"乱道\",\n        \"midoriiro\": \"緑いろ\",\n        \"koukou punch\": \"高校パンチ\",\n        \"arai kogane\": \"新井コガネ\",\n        \"aoin\": \"AOIN\",\n        \"takase asagiri\": \"鷹瀬あさぎり\",\n        \"ugaromix\": \"Ugaromix\",\n        \"aizawa hiroshi\": \"あいざわひろし\",\n        \"b-ginga\": \"B-银河\",\n        \"nanami\": \"七弥\",\n        \"narumi cristear note\": \"成海クリスティアーノート\",\n        \"saku usako\": \"佐久うさこ\",\n        \"aotsu karin\": \"蒼都かりん\",\n        \"mori airi\": \"森あいり\",\n        \"mimura zaja\": \"三村ざじゃ\",\n        \"itomugi-kun\": \"糸麦くん\",\n        \"aru urara\": \"あるうらら\",\n        \"sakura saku sakura\": \"佐倉さくさくら\",\n        \"akinaro\": \"あきなろ\",\n        \"hanakawa sugar\": \"花川シュガー\",\n        \"urabi\": \"紅吊うらび\",\n        \"kichirock\": \"キチロク\",\n        \"wes heartland smith\": \"ウェス·ハートランド·スミス\",\n        \"pochincoff\": \"ポチンコフ\",\n        \"shimeji nameko\": \"しめじなめこ\",\n        \"sakibashiri jiru\": \"先走汁\",\n        \"hayashi tugumi\": \"林つぐみ\",\n        \"tamura chii\": \"田村ちい\",\n        \"jagausa\": \"じゃがうさ\",\n        \"misuroma\": \"みすろま\",\n        \"kabe umari-ko\": \"壁埋まり子\",\n        \"crowly\": \"くろうり\",\n        \"sekiya asami\": \"关谷あさみ\",\n        \"nananana\": \"ナナナナ\",\n        \"cafekun\": \"cafekun\",\n        \"hataraki ari\": \"ハタラキ有\",\n        \"kilesha\": \"きれゐしゃ\",\n        \"spec\": \"SPEC\",\n        \"gogocherry\": \"GOGOCHERRY\",\n        \"kitajima yuuki\": \"北嶋ゆうき\",\n        \"renji\": \"练慈\",\n        \"wise speak\": \"ワイズスピーク\",\n        \"ayamy\": \"あやみ\",\n        \"cekonikova\": \"Cekonikova（ぐらら）\",\n        \"ke-ta\": \"ke-ta\",\n        \"roteri\": \"ろてり\",\n        \"kannaduki kanna\": \"神無月かんな\",\n        \"endou okito\": \"袁藤沖人\",\n        \"messy\": \"メッシィ\",\n        \"aomushi\": \"あおむし\",\n        \"zheng\": \"Zheng\",\n        \"yukimoto shuuji\": \"雪本愁二\",\n        \"omaru gyuunyuu\": \"牛乳うまお\",\n        \"futami paran\": \"二見パラン\",\n        \"torajima tao\": \"虎島タオ\",\n        \"mr.takealook\": \"Mr.takealook\",\n        \"isobe maki\": \"イソベマキ\",\n        \"sensouji kinoto\": \"浅草寺きのと\",\n        \"shinozuka yuuji\": \"篠塚裕志\",\n        \"shikishiro konomi\": \"色白好\",\n        \"sakurayu hal\": \"樱汤ハル\",\n        \"nanao yukiji\": \"七尾ゆきじ\",\n        \"herio\": \"ヘリを\",\n        \"aikawa arisa\": \"相川亚利砂\",\n        \"yamaishi juhachi\": \"山石18\",\n        \"rokkaku yasosuke\": \"六角八十助\",\n        \"tomono hiro\": \"友野ヒロ\",\n        \"yonekura kengo\": \"米倉けんご\",\n        \"yosuteinu\": \"世棄犬\",\n        \"hiyoshi hana\": \"日吉ハナ\",\n        \"tabigarasu\": \"旅乌\",\n        \"tsuge yasuna\": \"つげ安奈\",\n        \"hissatsukun\": \"ひっさつくん\",\n        \"ayakawa riku\": \"あやかわりく\",\n        \"yoshida inuhito\": \"吉田犬人\",\n        \"yuyama chika\": \"湯山チカ\",\n        \"kumakiti\": \"隈吉\",\n        \"umakuchi syouyu\": \"うまくち酱油\",\n        \"tokie hirohito\": \"刻江寻人\",\n        \"yuzuki n dash\": \"柚木N’\",\n        \"itou nanami\": \"井藤ななみ\",\n        \"porutan\": \"ぽるたん\",\n        \"kaitenfude\": \"回转笔\",\n        \"tachikawa negoro\": \"立川ねごろ\",\n        \"emine kendama\": \"遠峰犬玉\",\n        \"masami chie\": \"柾见ちえ\",\n        \"ryuuki yumi\": \"りゅうき夕海\",\n        \"nakano sora\": \"中乃空\",\n        \"napo\": \"ナポ\",\n        \"kazuki misaki\": \"数木美咲\",\n        \"nakata modem\": \"中田モデム\",\n        \"anzaki moral\": \"杏咲モラル\",\n        \"brother pierrot\": \"ブラザーピエロ\",\n        \"oltlo\": \"おるとろ\",\n        \"piromizu\": \"ピロ水\",\n        \"jorori\": \"じょろり\",\n        \"abe manabu\": \"安部マナブ\",\n        \"matsunami rumi\": \"松波留美\",\n        \"narita kyousha\": \"成田香車\",\n        \"arakure\": \"あらくれ\",\n        \"seto yuuki\": \"世徒ゆうき\",\n        \"yami kota\": \"やみこた\",\n        \"kakumayu\": \"カクマユ\",\n        \"sorairo len\": \"空色れん\",\n        \"yamiochi umekichi\": \"闇堕ち梅吉\",\n        \"namaribou nayonayo\": \"铅棒なよなよ\",\n        \"amasaka takashi\": \"天坂隆志\",\n        \"kazuma\": \"和真\",\n        \"uni8\": \"うにあはと\",\n        \"denchi\": \"电池\",\n        \"ono no imoko\": \"小野妹子\",\n        \"nishieda\": \"西E田\",\n        \"gomennasai\": \"御免なさい\",\n        \"ame arare\": \"雨あられ\",\n        \"abi kamesennin\": \"俺正读\",\n        \"futayami\": \"双暗\",\n        \"deadflow\": \"Deadflow（Б）\",\n        \"yukishizuku\": \"ユキシズク\",\n        \"mappa ninatta\": \"マッパニナッタ\",\n        \"ryuuto hisashi\": \"りゅうとひさし\",\n        \"tamazatou\": \"玉砂糖\",\n        \"tanaka yuuichi\": \"田中雄一\",\n        \"nakamura kuzuyu\": \"中村葛汤\",\n        \"bekotarou\": \"ベコ太郎\",\n        \"ayuma sayu\": \"あゆま紗由\",\n        \"fumi miyabi\": \"文雅\",\n        \"masuda\": \"枡田\",\n        \"nunnu\": \"ぬんぬ\",\n        \"shimanto shisakugata\": \"40010试作型\",\n        \"yuzuna hiyo\": \"柚子奈ひよ\",\n        \"kojiki ohji\": \"古事记王子\",\n        \"tamakake\": \"たまかけ\",\n        \"shiromochi sakura\": \"白もち桜\",\n        \"shimao kazu\": \"嶋尾和\",\n        \"kanou ryuuji\": \"叶竜児\",\n        \"yatanukikey\": \"やたぬき圭\",\n        \"maihara matsuge\": \"舞原マツゲ\",\n        \"genzou kokuto\": \"幻像黒兎\",\n        \"yamashita kurowo\": \"山下クロヲ\",\n        \"yanagi yuu\": \"ヤナギユウ\",\n        \"ponite korosuke\": \"ポニテコロ介\",\n        \"azuse\": \"あずせ\",\n        \"mameojitan\": \"まめおじたん\",\n        \"giuniu\": \"ぎうにう\",\n        \"sabusuka\": \"サブスカ\",\n        \"senji\": \"煎路\",\n        \"komowata haruka\": \"こもわた遥華\",\n        \"murakami suigun\": \"村上水軍\",\n        \"takanae kyourin\": \"高苗京鈴\",\n        \"shirabe shiki\": \"調四季\",\n        \"kobuichi\": \"小舞一\",\n        \"yaneko uta\": \"弥猫うた\",\n        \"kirisaki byakko\": \"雾咲白狐\",\n        \"bareisho\": \"马铃薯\",\n        \"wakadori nikomi\": \"若鶏にこみ\",\n        \"shikitani asuka\": \"色谷あすか\",\n        \"furisuku\": \"ふりすく\",\n        \"kosuke haruhito\": \"虎助遥人\",\n        \"tomoe yousuke\": \"巴八丞\",\n        \"tokita alumi\": \"鴇田アルミ\",\n        \"poshi\": \"ぽし\",\n        \"haguruma\": \"歯車\",\n        \"kanekiyo miwa\": \"兼清みわ\",\n        \"gayarou\": \"☆画野朗\",\n        \"yashiro seika\": \"八城惺架\",\n        \"tokiwa midori\": \"常磐緑\",\n        \"tsubaki jushirou\": \"椿十四郎\",\n        \"tukinowagamo\": \"月ノ輪ガモ\",\n        \"uron rei\": \"ウーロン・レイ\",\n        \"mushanokouji shizuka\": \"武者小路静香\",\n        \"emori uki\": \"江森うき\",\n        \"shindou\": \"しんどう\",\n        \"kikurage\": \"きくらげ\",\n        \"sanom\": \"鎖ノム\",\n        \"amagasa ikuta\": \"雨暈郁太\",\n        \"sukesaburou\": \"助三郎\",\n        \"jiraiya\": \"児雷也\",\n        \"kuromotokun\": \"黑本君\",\n        \"gomano lio\": \"胡麻乃りお\",\n        \"shiratama moti\": \"白玉もち\",\n        \"shiratama yomogi\": \"しらたま よもぎ\",\n        \"yoshida iyo\": \"吉田 依世\",\n        \"sakura oriko\": \"佐倉おりこ\",\n        \"hinata yuu\": \"ひなた悠\",\n        \"odawara hakone\": \"オダワラハコネ\",\n        \"ikari\": \"いかり\",\n        \"humuyun\": \"ふむゆん\",\n        \"watagashi yui\": \"わたがしゆい\",\n        \"kohinata hoshimi\": \"小日向ほしみ\",\n        \"yudzuki hina\": \"遊月ひな\",\n        \"sakura ani\": \"桜あに\",\n        \"tsukishima yuuko\": \"月嶋ゆうこ\",\n        \"tomoshibi hidekazu\": \"赤提灯\",\n        \"kamisyakujii yubeshi\": \"紙石神井ゆべし\",\n        \"kurosu gatari\": \"黑巢ガタリ\",\n        \"doku denpa\": \"毒でんぱ\",\n        \"dokiyuri\": \"どきゆり\",\n        \"tamagoro\": \"たまごろー\",\n        \"mizore\": \"みぞれ\",\n        \"akure ekuto\": \"吾暮えくと\",\n        \"chacharan\": \"茶々らん\",\n        \"isuwie\": \"イスィ\",\n        \"misaoka\": \"みさおか\",\n        \"ootori mahiro\": \"鳳まひろ\",\n        \"yaya hinata\": \"稍日向\",\n        \"koeda shiro\": \"こえだしろ\",\n        \"honjou hideaki\": \"本条秀明\",\n        \"notzackforwork\": \"NotZackForWork\",\n        \"hayashizaki fumihiro\": \"林崎文博\",\n        \"hatomizu\": \"ハト水\",\n        \"hiroya\": \"广弥\",\n        \"amamiya\": \"アマミヤ\",\n        \"nedia\": \"ねでぃあ\",\n        \"aiki\": \"Aiki\",\n        \"mumei\": \"Mumei\",\n        \"tefun\": \"てふん\",\n        \"shikoripa\": \"しこりぱ\",\n        \"tani takuya\": \"谷拓也\",\n        \"maron\": \"魔龙\",\n        \"yomoyama takashi\": \"四方山贵史\",\n        \"fuji tarawi\": \"藤たらゐ\",\n        \"mousou\": \"妄想\",\n        \"yokohama inka\": \"よこはまインカ\",\n        \"hoshi\": \"ほし\",\n        \"nanamatsu kenji\": \"七松建司\",\n        \"fuumi\": \"ふーみ\",\n        \"shacho\": \"社ちょ\",\n        \"toito\": \"トイト\",\n        \"toketou\": \"とけとう\",\n        \"shisyo\": \"ししょー\",\n        \"whistlerx\": \"WhistlerX\",\n        \"hagiwara asami\": \"萩原あさ美\",\n        \"itose ikuto\": \"爱濑郁人\",\n        \"osaru\": \"御猿\",\n        \"etori yuuya\": \"江鸟\",\n        \"ootsuka kotora\": \"大塚子虎\",\n        \"testa\": \"てすた\",\n        \"butachang\": \"ぶたちゃんぐ\",\n        \"sahara gensei\": \"佐原玄清\",\n        \"hino hino\": \"緋乃ひの\",\n        \"tsukuru\": \"作\",\n        \"habara meguru\": \"羽原メグル\",\n        \"hanabusa satoshi\": \"はなぶささとし\",\n        \"hado\": \"はあど\",\n        \"takemasa takeshi\": \"武将武\",\n        \"akabeko\": \"あかべこ\",\n        \"hisui\": \"翡翠石\",\n        \"sakura yuki\": \"咲良ゆき\",\n        \"suga hideo\": \"スガヒデオ\",\n        \"nadaka harutsugu\": \"南高春告（梅干）\",\n        \"hatori you\": \"葉鳥侑\",\n        \"byougaku\": \"猫額\",\n        \"yoshu ohepe\": \"養酒オヘペ\",\n        \"amanagi seiji\": \"天凪青磁\",\n        \"tsukako\": \"つかこ\",\n        \"mochi\": \"モチ\",\n        \"araiguma\": \"あらいぐま\",\n        \"2-g\": \"2-G\",\n        \"sukoyaka gyuunyuu\": \"健やか牛乳\",\n        \"saeki nao\": \"彩季なお\",\n        \"endori\": \"えんどり\",\n        \"fukuoka tarou\": \"福冈太朗\",\n        \"mafuyu hemp\": \"麻冬HEMP\",\n        \"kanno takanori\": \"南乃さざん\",\n        \"takehana note\": \"竹花ノート\",\n        \"sakuraba hikaru\": \"桜庭光\",\n        \"wolflong\": \"╰狼龍\",\n        \"toyosaki shu\": \"豊咲\",\n        \"mutou koucha\": \"无糖红茶\",\n        \"kurihara kenshirou\": \"栗原ケンシロウ\",\n        \"matsumotoke\": \"松本家御愛用\",\n        \"utamaro\": \"歌麿\",\n        \"tadima yoshikadu\": \"たぢまよしかづ\",\n        \"puuakachan\": \"プーアカちゃん\",\n        \"wataame\": \"わたあめ\",\n        \"aduki\": \"あづき\",\n        \"inui waon\": \"乾和音\",\n        \"majima shiroyuki\": \"间岛白幸\",\n        \"sougetsu nonono\": \"草月野々乃\",\n        \"wantan meo\": \"云吞めお\",\n        \"kemuri haku\": \"煙ハク\",\n        \"kani biimu\": \"かにビーム\",\n        \"watanohara\": \"わたのはら\",\n        \"kawasaki tadataka\": \"川崎直孝\",\n        \"shiraishi nagisa\": \"白石なぎさ\",\n        \"kurikimaru\": \"くりきまる\",\n        \"hinohara fuki\": \"檜原フキ\",\n        \"kobayashi kina\": \"小林キナ\",\n        \"takemitsu\": \"たけみつ\",\n        \"shiki\": \"四季\",\n        \"deyuyama\": \"でゆ山\",\n        \"namidame\": \"泪目\",\n        \"higata akatsuki\": \"阳方晶月\",\n        \"kayumidome\": \"かゆみ止め\",\n        \"naha 78\": \"ナハ78\",\n        \"getsuyou yasumi.\": \"月曜休み。\",\n        \"arumamai ayuka plus\": \"在誠舞あゆか+\",\n        \"take calcium\": \"竹刈シウム\",\n        \"aritsuno\": \"有角\",\n        \"shinova\": \"シノバ\",\n        \"mahito\": \"真人\",\n        \"anon 2-okunen\": \"あのん2億年\",\n        \"zikataro\": \"自家太郎\",\n        \"footaro\": \"辻風太郎\",\n        \"mokuzu\": \"もくず\",\n        \"mizuno kurage\": \"水乃くらげ\",\n        \"aoi\": \"あおい\",\n        \"uguisu mochi\": \"うぐいす餅\",\n        \"kirero\": \"kirero\",\n        \"hyura3\": \"ひゅらさん\",\n        \"fumituki\": \"ふみつき\",\n        \"mimi\": \"魅未\",\n        \"doru\": \"$\",\n        \"mikagami hiyori\": \"水鏡ひより\",\n        \"hisaka tooru\": \"氷坂透\",\n        \"eseneko\": \"えせねこ\",\n        \"oinari\": \"おいなり\",\n        \"kata k\": \"カタケイ\",\n        \"miisha\": \"みーしゃ\",\n        \"ichiba youichi\": \"市葉葉市\",\n        \"beni shake\": \"べにしゃけ\",\n        \"megumiya\": \"megumiya\",\n        \"aiu\": \"蓝兔\",\n        \"kobato neneko\": \"小鳩ねねこ\",\n        \"marota\": \"麻吕太\",\n        \"maineko ruru\": \"舞猫ルル\",\n        \"kanroame\": \"甘露アメ\",\n        \"shaa\": \"しゃあ\",\n        \"aka shio\": \"朱シオ\",\n        \"tomobe kinuko\": \"友部キヌコ\",\n        \"hirasaka makoto\": \"比良坂真琴\",\n        \"matsuriuta\": \"祭唄（松竜太）\",\n        \"momizi-kei\": \"紅葉-K\",\n        \"nagayori\": \"长赖\",\n        \"toosaka asagi\": \"遠坂あさぎ\",\n        \"momoco\": \"ももこ\",\n        \"ashima\": \"アシマ\",\n        \"suzumori\": \"铃森\",\n        \"kimishima ao\": \"君岛青\",\n        \"motiduki siina\": \"望月椎那\",\n        \"kino\": \"kino\",\n        \"mitha\": \"Mitha\",\n        \"tateha\": \"立羽\",\n        \"yano mitsuki\": \"夜ノみつき\",\n        \"fukahire\": \"フカヒレ\",\n        \"takano yuki\": \"鷹乃ゆき\",\n        \"suimya\": \"すいみゃ\",\n        \"shirokuma a\": \"シロクマA\",\n        \"karory\": \"karory\",\n        \"tomo\": \"ともー\",\n        \"kiba satoshi\": \"木場智士\",\n        \"ziko\": \"ziko\",\n        \"techi\": \"てち\",\n        \"koza\": \"コザ\",\n        \"mame denkyuu\": \"まめでんきゅう\",\n        \"mocha\": \"Mocha\",\n        \"teitetsu\": \"蹄铁\",\n        \"sugiura sen\": \"杉浦线\",\n        \"izumi nanase\": \"いずみななせ\",\n        \"moekibara fumitake\": \"萌木原文武\",\n        \"mizuki takehito\": \"みづきたけひと\",\n        \"takahashi tetsuya\": \"高桥哲哉\",\n        \"hiten\": \"Hiten\",\n        \"inugami kira\": \"狗神煌\",\n        \"korie riko\": \"梱枝莉子\",\n        \"hasune\": \"はすね\",\n        \"muku\": \"muku\",\n        \"kurou\": \"九郎\",\n        \"natsuki yuu\": \"なつきゆう\",\n        \"pan\": \"ぱん\",\n        \"yaman\": \"yaman**\",\n        \"anapon\": \"あなぽん\",\n        \"mashiro shirako\": \"真白しらこ\",\n        \"yagi the goat\": \"ヤギの人\",\n        \"morimiya masayuki\": \"森宫正幸\",\n        \"airandou\": \"あいらんどう\",\n        \"nishizawa 5mm\": \"西沢5ミリ\",\n        \"ninoko\": \"にの子\",\n        \"kibii mocha\": \"きびぃもか\",\n        \"ohnaka ito\": \"大仲いと\",\n        \"anzuame\": \"杏飴\",\n        \"takaharu\": \"タカハル\",\n        \"asanoha\": \"麻の葉\",\n        \"sasaki akira\": \"ささきあきら\",\n        \"asahina hikage\": \"アサヒナヒカゲ\",\n        \"piyodera mucha\": \"ぴよ寺むちゃ\",\n        \"daichi\": \"矢座だいち\",\n        \"ramchi\": \"らむち\",\n        \"mignon\": \"mignon\",\n        \"natsuki marina\": \"夏月まりな\",\n        \"watanon\": \"わたのん\",\n        \"amami mikihiro\": \"甘味みきひろ\",\n        \"mikage\": \"未影\",\n        \"mk\": \"MK\",\n        \"aria.\": \"ありあ。\",\n        \"kago\": \"加护\",\n        \"akashi rokuro\": \"明石六露\",\n        \"kuon\": \"久遠\",\n        \"miyasu risa\": \"ミヤスリサ\",\n        \"konomi\": \"konomi\",\n        \"bokkun\": \"ぼっくん\",\n        \"ikura nagisa\": \"伊倉ナギサ\",\n        \"furukawa odoro\": \"古河おどろ\",\n        \"nishiki chizu\": \"西木地図\",\n        \"konka\": \"绀菓\",\n        \"hakomaru\": \"箱。\",\n        \"makoto\": \"MAKOTO\",\n        \"iori\": \"ゐおり\",\n        \"chocoan\": \"ちょこ庵\",\n        \"hisagi\": \"ひさぎ\",\n        \"arato asato\": \"あらと安里\",\n        \"caigen\": \"菜★梗\",\n        \"maple\": \"まぷる\",\n        \"kon\": \"紺\",\n        \"shibi\": \"ShiBi\",\n        \"yamu\": \"やむっ\",\n        \"senyuu\": \"戦友\",\n        \"noukatu\": \"noukatu\",\n        \"yoyomura\": \"夜々村\",\n        \"yuhi\": \"ゆーひ\",\n        \"katase aoko\": \"片瀬蒼子\",\n        \"yuzuri ai\": \"ゆずりあい\",\n        \"tony taka\": \"Tony\",\n        \"fal maro\": \"ファルまろ\",\n        \"hiru okita\": \"昼沖太\",\n        \"marumie\": \"まるミエ\",\n        \"hiyashi mirano\": \"ひやしみらの\",\n        \"kageyama kuroto\": \"景山玄都\",\n        \"netarou\": \"ねたろう\",\n        \"itou eight\": \"伊藤エイト\",\n        \"sajipen\": \"さじペん\",\n        \"dam\": \"だむ\",\n        \"ko-yahu\": \"こーやふ\",\n        \"toufu\": \"とうふ\",\n        \"kuriyuzu kuryuu\": \"栗柚くりゅー\",\n        \"homu\": \"homu\",\n        \"kamelie\": \"Kamelie\",\n        \"nicoby\": \"にこびぃ\",\n        \"mitsuba choco\": \"三つ葉ちょこ\",\n        \"miyama\": \"箕山\",\n        \"ayagi daifuku\": \"綾城大福\",\n        \"taruhi\": \"たるひ\",\n        \"kikunosukemaru\": \"菊のすけまる\",\n        \"hamaken.\": \"はまけん。\",\n        \"konohana\": \"此花\",\n        \"hirotti\": \"ひろっち\",\n        \"rogobo\": \"ろごぼ\",\n        \"momoya show-neko\": \"桃屋しょう猫\",\n        \"mashiro yukiya\": \"真白雪夜\",\n        \"hikagi tatsuhiko\": \"绯键龙彦\",\n        \"tekehiro\": \"てけひろ\",\n        \"marumikan\": \"丸美甘\",\n        \"yamato bambies\": \"ヤマトバンビーズ\",\n        \"azuma sawayoshi\": \"アズマサワヨシ\",\n        \"oyabe ryo\": \"小矢部亮\",\n        \"naoharu\": \"直晴\",\n        \"tamashii carnival botamochi\": \"魂カーニバルぼたもち\",\n        \"arima kouichi\": \"有马纮一\",\n        \"kamochome\": \"かもちょめ\",\n        \"horny-oni\": \"Horny-Oni\",\n        \"sora ni tori ga\": \"空に鳥が\",\n        \"serebi ryousangata\": \"セレビィ量産型\",\n        \"abara heiki\": \"肋兵器\",\n        \"ukami\": \"うかみ\",\n        \"itou hachi\": \"伊藤ハチ\",\n        \"nishihata kei\": \"西畑けい\",\n        \"bon\": \"凡\",\n        \"john\": \"じょん\",\n        \"tamaki kurou\": \"鐶九朗\",\n        \"haiba\": \"灰叶\",\n        \"makita yoshiharu\": \"卷田佳春\",\n        \"asahiru yuu\": \"浅ひるゆう\",\n        \"rokumaru inami\": \"六丸いなみ\",\n        \"mogu\": \"モグ\",\n        \"cbgb\": \"CBGB\",\n        \"eretto\": \"えれっと\",\n        \"ken hultgren\": \"赓·赫尔脱格仑\",\n        \"senmu\": \"SeNMU\",\n        \"arito arayuru\": \"有都あらゆる\",\n        \"9so\": \"9SO\",\n        \"haruba negi\": \"春场葱\",\n        \"maki komura\": \"真木こむら\",\n        \"sakamata nerimono\": \"逆又练物\",\n        \"nagata maria\": \"永田まりあ\",\n        \"kinona\": \"紀奈\",\n        \"hano haruka\": \"葉乃はるか\",\n        \"shiden hiro\": \"四電ヒロ\",\n        \"kyabetsuka\": \"篝町狐懐\",\n        \"midoriha mint\": \"緑葉みんと | 洗面きぬ子\",\n        \"scott robertson\": \"斯科特·罗伯逊\",\n        \"andrew loomis\": \"安德鲁·路米斯\",\n        \"bert dodson\": \"伯特·多德森\",\n        \"kuzuya ramurin\": \"葛谷らむりん\",\n        \"taka\": \"タカ\",\n        \"sw\": \"Sw（すぅ）\",\n        \"piro\": \"Piro\",\n        \"itou noizi\": \"いとうのいぢ\",\n        \"hirose madoka\": \"広瀬まどか\",\n        \"nabe wataru\": \"名部渉\",\n        \"gaou\": \"がおう\",\n        \"umekiti\": \"うめきち\",\n        \"onaka emi\": \"小中えみ\",\n        \"bobobo\": \"ボボボ\",\n        \"okinaga umanosuke\": \"翁贺马乃助\",\n        \"yoikono tt\": \"ヨイコノtt\",\n        \"gosaiji\": \"ごさいじ\",\n        \"rokkotsu\": \"肋骨\",\n        \"akino komichi\": \"秋乃こみち\",\n        \"ido\": \"いど\",\n        \"asaki takayuki\": \"朝木贵行\",\n        \"koyanagi royal\": \"小柳ロイヤル\",\n        \"iketaki ganguten\": \"池泷玩具店\",\n        \"akagi kuro\": \"赤木クロ\",\n        \"ash yokoshima\": \"Ash横島\",\n        \"haitokukan\": \"背德汉\",\n        \"henkuma\": \"变熊\",\n        \"kawashima yoshio\": \"川島よしお\",\n        \"kanari tokusaku\": \"鹿成トクサク\",\n        \"onigiri unicorn\": \"鬼斬ゆにこーん\",\n        \"namae renraku\": \"なまえ れんらく\",\n        \"kouda tomohiro\": \"幸田朋弘\",\n        \"senbei\": \"煎饼\",\n        \"corundum\": \"こらんだむ\",\n        \"miyabe kiwi\": \"宮部キウイ\",\n        \"dendenbotch\": \"でんでんぼっち\",\n        \"redash\": \"RedAsh\",\n        \"kuroha reiji\": \"九郎\",\n        \"kirekawa\": \"きれかわ\",\n        \"taro oimo\": \"たろおいも\",\n        \"akimoto dai\": \"あきもと大\",\n        \"kumada\": \"くまのとおる（くまだ）\",\n        \"nipi\": \"nipi\",\n        \"misakana\": \"みさかな\",\n        \"cru\": \"Cru\",\n        \"garana\": \"ガラナ\",\n        \"muraimura\": \"村井村\",\n        \"murasakio\": \"紫御\",\n        \"itohana\": \"イトハナ\",\n        \"shirogane hina\": \"シロガネヒナ\",\n        \"chikuwa.\": \"ちくわ。\",\n        \"naka\": \"なか\",\n        \"midorino haru\": \"緑野はる\",\n        \"ma-sa\": \"MA-SA\",\n        \"ameno usari\": \"飴乃うさり\",\n        \"mizukaga syou\": \"水利硝\",\n        \"kudo\": \"９℃\",\n        \"sumii\": \"すみい\",\n        \"ai takurou\": \"安威拓郎\",\n        \"nagisora riku\": \"凪空りく\",\n        \"minase\": \"御奈瀬\",\n        \"niwacho\": \"niwacho\",\n        \"yasaka syu\": \"矢坂しゅう\",\n        \"nimuno\": \"にむの\",\n        \"watanore\": \"わたのれ\",\n        \"qblade\": \"blade\",\n        \"mugen no sudadokei\": \"無限の須田時計\",\n        \"omimo\": \"おみも\",\n        \"minami aomori\": \"南森\",\n        \"uo denim\": \"魚デニム\",\n        \"mitsuba minoru\": \"三叶稔\",\n        \"zeros\": \"是露巣\",\n        \"necomi\": \"necömi\",\n        \"cona kinaco\": \"小奈きなこ\",\n        \"kamioka chirol\": \"神岡ちろる\",\n        \"mikoma sanagi\": \"美驹沙名希\",\n        \"nanashiki fuka\": \"七色風香\",\n        \"ashita\": \"アシタ\",\n        \"midorinocha\": \"みどりのちゃ\",\n        \"tsurukawa yashiro\": \"鶴川社\",\n        \"samizu gumi\": \"さみずぐみ\",\n        \"seijin\": \"せーじん\",\n        \"yukisaki miale\": \"雪咲MIALE\",\n        \"shennai misha\": \"神奈弥莎\",\n        \"tsunano\": \"つなの\",\n        \"eizan\": \"影斩\",\n        \"akino kabocha\": \"秋野かぼちゃ\",\n        \"kiyu fuyuki\": \"季結ふゆき\",\n        \"ankoman\": \"あんこまん\",\n        \"highlow\": \"废狼\",\n        \"hanao.\": \"熊尾もふもふ\",\n        \"otokura ringo\": \"乙倉りんご\",\n        \"rougetu\": \"胧月\",\n        \"ryuga syo\": \"龍牙翔\",\n        \"kurage modoki\": \"くらげもどき\",\n        \"oozora wakaba\": \"大空若叶\",\n        \"nigirimeshi\": \"にぎりめし\",\n        \"minami chisato\": \"南ちさと（有澤司）\",\n        \"aotsuki shinobu\": \"蒼月しのぶ\",\n        \"oshima aki\": \"大岛あき\",\n        \"kimino tomonari\": \"君野朋成\",\n        \"sune\": \"sune\",\n        \"molgen\": \"モルゲン\",\n        \"skylader\": \"すかいれーだー\",\n        \"topia\": \"とぴあ\",\n        \"nakamura regura\": \"仲村レグラ\",\n        \"narumiya\": \"鳴海也\",\n        \"ekakibit\": \"えかきびと\",\n        \"yuki\": \"雪\",\n        \"tadano mezashi\": \"只野めざし\",\n        \"ojo\": \"おじょ\",\n        \"himino\": \"ひみの\",\n        \"6u\": \"6U☆\",\n        \"nagioka\": \"凪丘\",\n        \"yukiguni yuu\": \"雪国裕\",\n        \"jairou\": \"ジャイロウ\",\n        \"hirune\": \"昼寝\",\n        \"nanatsuda\": \"七ツ田\",\n        \"fun bo\": \"ふんぼ\",\n        \"siseki hirame\": \"芝石\",\n        \"nattou mazeo\": \"納豆まぜお\",\n        \"yamago\": \"山后\",\n        \"hamon ai\": \"波纹爱\",\n        \"misaka12003\": \"御坂12003\",\n        \"mayafufu -kakko- kashikoi\": \"まやふふ(賢)\",\n        \"yamanashi yuuya\": \"山梨ユウヤ\",\n        \"ashinoue futomomo\": \"苇上太桃\",\n        \"echigoya takeru\": \"越後屋タケル\",\n        \"kawauchi\": \"川内\",\n        \"aoi yun\": \"蒼井ゆん\",\n        \"nimoshi\": \"にもし\",\n        \"ennorei\": \"円之怜\",\n        \"yuuki sonisuke\": \"ゆうきそにすけ\",\n        \"kurororo rororo\": \"くろろろろろろ\",\n        \"junsui na fujunbutsu\": \"純粋な不純物\",\n        \"takano saku\": \"嵩乃朔\",\n        \"sikusiku\": \"シクシク\",\n        \"shiguma\": \"しぐま\",\n        \"hisona\": \"ひそな\",\n        \"nakatani nio\": \"仲谷鳰\",\n        \"crerp\": \"くれ～ぷ\",\n        \"indozou\": \"インド僧\",\n        \"itou yuuji\": \"イトウゆーじ\",\n        \"yu-ki\": \"ユーキ\",\n        \"gotoh juan\": \"后藤寿庵\",\n        \"binto\": \"瓶人\",\n        \"itaru\": \"至る\",\n        \"wasavi 8\": \"wasavi_8\",\n        \"kitahara aki\": \"北原亚希\",\n        \"satsuki itsuka\": \"五月五日\",\n        \"kawaraya\": \"瓦爺\",\n        \"kamizuki shiki\": \"守月史贵\",\n        \"ponekusan\": \"ポネクサン\",\n        \"akasa tanu\": \"赤佐たぬ\",\n        \"takeya\": \"竹や\",\n        \"makihitsuji\": \"巻羊\",\n        \"jimmy\": \"jimmy\",\n        \"healthyman\": \"ヘルシーマン\",\n        \"aokoji\": \"青こじ\",\n        \"miginohito mitsuru\": \"右の人みつる\",\n        \"hidari kagetora\": \"左カゲトラ\",\n        \"suruga kuroitsu\": \"駿河クロイツ\",\n        \"mauve\": \"Mauve\",\n        \"saeki sola\": \"佐伯ソラ\",\n        \"tange suzuki\": \"丹下スズキ\",\n        \"neji\": \"寝路\",\n        \"negom\": \"ネゴム\",\n        \"opanchu\": \"おぱんちゅ\",\n        \"xion\": \"Xion\",\n        \"tomoki tomonori\": \"ともきとものり\",\n        \"pistonring nishizawa\": \"西泽みずき\",\n        \"kokuryuugan\": \"黑龙眼\",\n        \"kazakami sudare\": \"かざかみすだれ\",\n        \"paryi\": \"帕里\",\n        \"satoh\": \"砂糖\",\n        \"amatake akewo\": \"甘竹朱郎\",\n        \"jikasei\": \"自家製\",\n        \"sakura hiyori\": \"桜ひより\",\n        \"mukyu\": \"無休\",\n        \"h2so4\": \"H2SO4\",\n        \"yamada konayuki\": \"山田コナユキ\",\n        \"mizushima sorahiko\": \"水岛空彦\",\n        \"taneno nakami\": \"種乃なかみ\",\n        \"mgmee\": \"MGMEE\",\n        \"nathaniel pennel\": \"Pennel\",\n        \"hadron9\": \"HADRON9\",\n        \"supu\": \"すぷ\",\n        \"kitaku\": \"きたく\",\n        \"shirota dai\": \"白田太\",\n        \"moyazou\": \"もや造\",\n        \"kuguri oimo\": \"九栗おいも\",\n        \"namio.h.ryuudou\": \"NAMIO.H.龍堂\",\n        \"kazawa\": \"かざわ\",\n        \"nukaji\": \"ぬかじ（wizakun）\",\n        \"negresco\": \"Negresco\",\n        \"navia\": \"なびあ\",\n        \"sagaraten\": \"纱柄天\",\n        \"naoto\": \"naoto\",\n        \"green\": \"GreeN\",\n        \"wakured\": \"和紅\",\n        \"mankai kaika\": \"满开开花\",\n        \"kumatora\": \"天空太一\",\n        \"teshima nari.\": \"手島nari\",\n        \"amashiro natsuki\": \"甘城なつき\",\n        \"tumiki akeno\": \"積木あけの\",\n        \"miwano rag\": \"美和野らぐ\",\n        \"shigure ui\": \"しぐれうい\",\n        \"nanahara fuyuki\": \"七原冬雪\",\n        \"fukuinu\": \"福犬\",\n        \"shotan\": \"しょたん\",\n        \"ezoshika\": \"エゾシカ\",\n        \"taketori zaiku\": \"竹取细工\",\n        \"harada shoutarou\": \"原田将太郎\",\n        \"kyougoku shin\": \"京極しん\",\n        \"yamamori\": \"山森\",\n        \"daki makura\": \"滝まくら\",\n        \"nagishiro mito\": \"凪白みと\",\n        \"minase nagi\": \"みなせなぎ\",\n        \"nii manabu\": \"仁井学\",\n        \"o-zicha\": \"おーじ茶\",\n        \"p19\": \"p19\",\n        \"sakuragi ren\": \"桜木蓮\",\n        \"poruno ibuki\": \"はるのいぶき\",\n        \"kenichi\": \"ケンイチ\",\n        \"mashu\": \"ましゅー\",\n        \"na-ga\": \"Na-Ga\",\n        \"sakurazawa izumi\": \"桜沢いづみ\",\n        \"hinayuki usa\": \"ヒナユキウサ\",\n        \"amamitu kousuke\": \"甘蜜こうすけ\",\n        \"atiki\": \"Aちき\",\n        \"masaru.jp\": \"まさる.jp\",\n        \"kizuki rei\": \"傷希レイ\",\n        \"arisu kazumi\": \"有栖かずみ\",\n        \"nanashiki\": \"七色\",\n        \"tokuno yuika\": \"徳之ゆいか\",\n        \"cut\": \"カット\",\n        \"taya\": \"TAYA\",\n        \"kamaboko\": \"釜ボコ\",\n        \"mountainhan\": \"山含\",\n        \"ahugan sugita\": \"アフガン杉田\",\n        \"kurebayashi asami\": \"暮林あさ美\",\n        \"oshiro\": \"阿白\",\n        \"hakaishin\": \"破坏神\",\n        \"muryotaro\": \"むりょたろ\",\n        \"stealyy\": \"すてりい\",\n        \"yamabukiiro\": \"山吹色\",\n        \"gotoh\": \"ごとー\",\n        \"casino\": \"カジノ\",\n        \"hanekoto\": \"はねこと\",\n        \"kanzaki hiro\": \"かんざきひろ\",\n        \"saki chisuzu\": \"さき千鈴\",\n        \"fujoujoshi\": \"不嬢女子\",\n        \"mikuni saho\": \"御国纱帆\",\n        \"tatsuse yumino\": \"龙濑弓乃\",\n        \"ma-kurou\": \"まー九郎\",\n        \"maitaimu\": \"舞大梦\",\n        \"kyozip\": \"狂zip\",\n        \"nishi yoshiyuki\": \"西义之\",\n        \"momonosukebe\": \"腿之助兵卫\",\n        \"torichamaru\": \"鸟茶丸\",\n        \"uonome beji\": \"魚目ベジ\",\n        \"j-kisarazu\": \"JK更津\",\n        \"greco roman\": \"暮古浪漫\",\n        \"shugao\": \"しゅがお\",\n        \"andoryu\": \"安堂流\",\n        \"commamion\": \"狐狸恩\",\n        \"numa\": \"numa | 沼\",\n        \"amagappa shoujogun\": \"雨がっぱ少女群\",\n        \"suzumi raika\": \"凉海来夏\",\n        \"aramaki echizen\": \"荒卷越前\",\n        \"nakada rumi\": \"中田瑠美\",\n        \"yuzuto sen\": \"柚十扇\",\n        \"hayashi kewi\": \"林けゐ\",\n        \"tadano saboten\": \"ただのサボテン\",\n        \"hara yui\": \"原悠衣\",\n        \"ibuki notsu\": \"伊吹のつ\",\n        \"kinako\": \"木なこ\",\n        \"shiino sera\": \"椎野せら\",\n        \"kusakabe\": \"草壁\",\n        \"kaiware\": \"かいわれ\",\n        \"nakyo\": \"なきょ\",\n        \"kutori panya\": \"九鳥ぱんや\",\n        \"chiica\": \"ちぃか\",\n        \"ushiro\": \"う白\",\n        \"yuyumatsu\": \"ゆゆまつ\",\n        \"sakura shiho\": \"紗倉シホ\",\n        \"gomzi\": \"gomzi\",\n        \"amamitsuki\": \"天三月\",\n        \"xenon\": \"世音\",\n        \"gyozanuko\": \"餃子ぬこ\",\n        \"raptor7\": \"ラプトル７\",\n        \"toshi\": \"toshi\",\n        \"taishinkokuoh anton\": \"大秦国王安敦\",\n        \"wanyanaguda\": \"完颜阿骨打\",\n        \"kaede\": \"ゆか\",\n        \"fummy\": \"ふみー\",\n        \"shobu\": \"菖蒲\",\n        \"sakayama shinta\": \"茶化山心太\",\n        \"takasaki keisuke\": \"高咲圭介\",\n        \"ushino naka\": \"うしの菜夏\",\n        \"doskoinpo\": \"doskoinpo\",\n        \"rin yuu\": \"リン☆ユウ\",\n        \"mushi\": \"小虫\",\n        \"trigger\": \"TRIGGER\",\n        \"miwabe sakura\": \"みわべさくら\",\n        \"shirisensha\": \"尻戦車\",\n        \"makabe gorou\": \"真壁吾郎\",\n        \"kakuninii\": \"角煮煮\",\n        \"tukimi daifuku\": \"月見大福\",\n        \"satou chagashi\": \"佐藤茶菓子\",\n        \"touno itsuki\": \"桐野いつき\",\n        \"gekka kaguya\": \"月下火愚夜\",\n        \"maguro shining\": \"まぐろシャイニング\",\n        \"santa\": \"santa\",\n        \"togi\": \"とぎ\",\n        \"akizuki mac\": \"秋月まく\",\n        \"fujii jun\": \"藤伊洵\",\n        \"morino bambi\": \"森乃ばんび\",\n        \"nekoi mie\": \"猫井ミィ\",\n        \"ikujinashi no fetishist\": \"いくじなしのフェティシスト\",\n        \"chomikuplus\": \"Chomikuplus\",\n        \"fuzui\": \"不随\",\n        \"tokomaya keita\": \"とこまやけいた\",\n        \"holiday yasumi\": \"堀出井靖水\",\n        \"ronrinri ronri\": \"論倫理ろんり\",\n        \"tsukueno elf\": \"机野エルフ\",\n        \"hiiragi popura\": \"柊ぽぷら\",\n        \"nogiwa kaede\": \"野際かえで\",\n        \"hitoi\": \"灯問\",\n        \"bouen\": \"ぼうえん\",\n        \"tsukudani\": \"佃煮\",\n        \"shigemiya kyouhei\": \"樹宮匡平\",\n        \"roshin\": \"炉心\",\n        \"mamemametama\": \"まめまめたま\",\n        \"nakagami takashi\": \"中上たかし\",\n        \"ukanmuri\": \"うかんむり\",\n        \"momotomato\": \"桃とまと\",\n        \"muchin\": \"むーちん\",\n        \"hou\": \"蜂様 (ほう)\",\n        \"nakamura b-ta\": \"中村べーた\",\n        \"lengsediaokafei\": \"冷色调咖啡\",\n        \"naruse hirofumi\": \"鸣濑ひろふみ\",\n        \"momose sumomo\": \"桃瀬すもも\",\n        \"nukuo\": \"ヌク男\",\n        \"sindoll\": \"シンドール\",\n        \"horikawa gorou\": \"堀川悟郎\",\n        \"kandenki\": \"感电器\",\n        \"tsukimi ruko\": \"月見ルコ\",\n        \"kameyama shiruko\": \"亀山しるこ\",\n        \"takimoto yukari\": \"瀧本ゆかり\",\n        \"sakamoto kafka\": \"阪本KAFKA\",\n        \"itsutsuse\": \"古川五势（いつつせ）\",\n        \"chiyingzai\": \"帜瑛\",\n        \"isako rokuroh\": \"井硲六郎\",\n        \"nigiri usagi\": \"にぎりうさぎ\",\n        \"mizumizuni\": \"見ず水煮\",\n        \"shinagawa mikuzu\": \"品川ミクズ\",\n        \"wakamatsu\": \"わかまつ\",\n        \"geko\": \"GEKO\",\n        \"yatosaki haru\": \"やとさきはる\",\n        \"ootsuka mahiro\": \"大塚まひろ\",\n        \"fuyuichi monme\": \"冬壱もんめ\",\n        \"momosawa\": \"ももさわ\",\n        \"sangatsu sanichi\": \"三月さんいち\",\n        \"konnyaku\": \"蒟蒻\",\n        \"yaminabe\": \"やみなべ\",\n        \"tenjo ryuka\": \"天壌りゅか\",\n        \"nekoya\": \"猫夜\",\n        \"muninshiki\": \"むにんしき\",\n        \"masayo\": \"まさよ\",\n        \"momozu komamochi\": \"桃豆こまもち\",\n        \"hoshii nasake\": \"星井情\",\n        \"amezawa koma\": \"飴沢狛\",\n        \"kanda dan\": \"館田ダン\",\n        \"mikuni mizuki\": \"みくに瑞貴\",\n        \"yamamoto naoki\": \"山本直树\",\n        \"neromashin\": \"ねろましん\",\n        \"yuugen\": \"ゆーげん\",\n        \"oshio\": \"おしお\",\n        \"torotarou\": \"トロ太郎\",\n        \"mishima kurone\": \"三岛黑音\",\n        \"himuro shunsuke\": \"氷室しゅんすけ\",\n        \"haikome\": \"灰米\",\n        \"bizen dorobune\": \"備前泥舟\",\n        \"kagura nanaki\": \"神楽七姫\",\n        \"nozomi tsubame\": \"希望つばめ\",\n        \"saba satoru\": \"佐波サトル\",\n        \"nagashiro rouge\": \"長代ルージュ\",\n        \"kuroiwa menou\": \"黑岩玛瑙\",\n        \"isorashi\": \"五十嵐唱乃\",\n        \"minato fumi\": \"三巷文\",\n        \"hashida mamoru\": \"桥田镇\",\n        \"hiryuu ran\": \"飞龙乱\",\n        \"nyoro nyorozou\": \"清炭ハリケーン\",\n        \"denkichi\": \"でん吉\",\n        \"qdou kei\": \"Q堂恵\",\n        \"hisen kaede\": \"緋仙カエデ\",\n        \"kazushiki midori\": \"一色緑\",\n        \"someoka yusura\": \"染岡ゆすら\",\n        \"haruse hiroki\": \"晴瀬ひろき\",\n        \"tenmu shinryuusai\": \"天夢森流彩\",\n        \"anza yuu\": \"あんざゆう\",\n        \"amane ruri\": \"天音るり\",\n        \"dytm\": \"DYTM\",\n        \"gentsuki\": \"ゲンツキ\",\n        \"iwasaki yuuki\": \"岩崎ユウキ\",\n        \"mashiraga aki\": \"猿駕アキ\",\n        \"midori aoi\": \"みどり葵\",\n        \"musha sabu\": \"武者サブ\",\n        \"sanjuurou\": \"三十郎\",\n        \"souji hougu\": \"扫除朋具\",\n        \"uousaoh\": \"鱼ウサ王\",\n        \"kuroharuto\": \"くろはると\",\n        \"oomori\": \"大盛り\",\n        \"yasson yoshiyuki\": \"やっそん義之\",\n        \"hiyori mizuki\": \"陽寄瑞貴\",\n        \"fushoku\": \"腐蝕\",\n        \"coupe\": \"こっぺ\",\n        \"panchira steak\": \"ぱんちらステーキ\",\n        \"saizu nitou gunsou\": \"才津二等軍曹\",\n        \"nakamura rohane\": \"中村六翅\",\n        \"nohito\": \"nohito\",\n        \"turiganesou\": \"釣鐘草\",\n        \"kyo1\": \"響樹はじめ\",\n        \"shimimaru\": \"纸鱼丸\",\n        \"arai kei\": \"荒井启\",\n        \"suzudama renri\": \"鈴玉レンリ\",\n        \"kurokoshi you\": \"黑越阳\",\n        \"inato serere\": \"稲戸せれれ\",\n        \"akitsuki itsuki\": \"秋月伊槻\",\n        \"yd\": \"yd\",\n        \"azuma yuki\": \"东由希\",\n        \"enokido\": \"エノキドォ\",\n        \"gokubuto mayuge\": \"极太眉毛\",\n        \"hakaba\": \"墓場\",\n        \"hitotsuba\": \"ひとつば\",\n        \"furyouhin\": \"不良品\",\n        \"gesundheit\": \"ゲズンタイト\",\n        \"takamichi\": \"たかみち\",\n        \"aki99\": \"aki99\",\n        \"rensyu\": \"Rensyu\",\n        \"himitsu\": \"蜜酱（ひみつ）\",\n        \"tooo\": \"tooo\",\n        \"abubu\": \"あぶぶ\",\n        \"red romanov\": \"はだぱるか\",\n        \"bubukka\": \"ぶぶっか\",\n        \"itosugi masahiro\": \"糸杉柾宏\",\n        \"a-801\": \"アニメ8OI\",\n        \"araki akira\": \"あらきあきら\",\n        \"haregama shiina\": \"晴釜椎名\",\n        \"misao.\": \"みさお。\",\n        \"yamazaki kana\": \"山崎かな\",\n        \"kanyapyi\": \"かにゃぴぃ\",\n        \"maruta\": \"MARUTA\",\n        \"ichiichi yuuna\": \"一市裕納\",\n        \"rinrin\": \"RINRIN\",\n        \"meramera jealousy\": \"メラメラジェラシー\",\n        \"miyazaki maya\": \"宫崎摩耶\",\n        \"sasakura ayato\": \"笹仓绫人\",\n        \"mori guruta\": \"森ぐる太\",\n        \"mayonnaise.\": \"まよねーず。\",\n        \"broiler\": \"broiler\",\n        \"zukiki\": \"ZUKI树\",\n        \"urute\": \"urute\",\n        \"anyanko\": \"あにゃんこ\",\n        \"inuarasi\": \"犬嵐\",\n        \"sasahara yuuki\": \"佐佐原忧树\",\n        \"wakaba kaoru\": \"わかばかおる\",\n        \"teruki kuma\": \"てるき熊\",\n        \"shitou\": \"四头\",\n        \"ryunnu\": \"りゅんぬ\",\n        \"sage\": \"Sage（りゅんぬ ）\",\n        \"hikami izuto\": \"ひかみいずと\",\n        \"e10\": \"e10\",\n        \"tawawaringo\": \"たわわりんご\",\n        \"ujiie moku\": \"氏家もく\",\n        \"urotan\": \"うろたん\",\n        \"kaishinshi\": \"怪绅士\",\n        \"kakkuu\": \"滑空\",\n        \"urajirou\": \"杉浦次郎\",\n        \"chuushin kuranosuke\": \"忠臣藏之介\",\n        \"tsukiyoshi hiroki\": \"月吉ヒロキ\",\n        \"tomozawa shou\": \"智泽渚优\",\n        \"nakamura mizumo\": \"中村みずも\",\n        \"nendo.\": \"ねんど。\",\n        \"hokama mitsuri\": \"ほかまみつり\",\n        \"horihone saizou\": \"掘骨碎三\",\n        \"toruneko\": \"获る猫\",\n        \"sirokuma shake\": \"白クマシェイク\",\n        \"mizui kaou\": \"瑞井鹿央\",\n        \"minasuki popuri\": \"みなすきぽぷり\",\n        \"hoshino shiho\": \"星野志保\",\n        \"miyashita miki\": \"宫下未纪\",\n        \"yamamoto kumoi\": \"山本云居\",\n        \"marcy dog\": \"MARCYどっぐ\",\n        \"asahina makoto\": \"朝比奈诚\",\n        \"majoccoid\": \"majoccoid\",\n        \"aogiri penta\": \"あおぎりぺんた\",\n        \"mitsuba\": \"三叶 | みつば\",\n        \"ppshex\": \"芝士糖\",\n        \"misakamitoko0903\": \"电磁炮二期\",\n        \"kimimaru\": \"きみまる（东毅）\",\n        \"softcharm\": \"SOFTCHARM\",\n        \"tsuruyama mito\": \"鶴山ミト\",\n        \"tanimachi maid\": \"谷町女仆\",\n        \"bookmoun10\": \"ぶっくまうんten\",\n        \"ogataaz\": \"OgataAz\",\n        \"ayato ayari\": \"あやとあやり\",\n        \"rangetsu\": \"岚月\",\n        \"misakura nankotsu\": \"御樱软骨\",\n        \"kio seiji\": \"きお誠児\",\n        \"riyo\": \"リヨ\",\n        \"hanamaki kaeru\": \"花巻かえる\",\n        \"bennys\": \"BENNY'S\",\n        \"inaba cozy\": \"稻叶COZY\",\n        \"oie kaeru\": \"御家かえる\",\n        \"chinzurena\": \"チンズリーナ\",\n        \"palco nagashima\": \"パルコ長嶋\",\n        \"ponpon itai\": \"ぽんぽんイタイ\",\n        \"takeuchi takashi\": \"武内崇\",\n        \"takahashi keitarou\": \"高桥庆太郎\",\n        \"shima drill\": \"しまどりる\",\n        \"bunbun\": \"BUNBUN\",\n        \"abec\": \"abec\",\n        \"a-10\": \"A-10（不破大辅）\",\n        \"atori k\": \"秋尚\",\n        \"umashika\": \"うましか\",\n        \"ebifly\": \"えびふらい\",\n        \"azumawari\": \"あずまわり\",\n        \"namori\": \"Namori\",\n        \"hata kenjirou\": \"畑健二郎\",\n        \"gelatin\": \"沟口明胶\",\n        \"utahane w\": \"うたはね\",\n        \"kusano kouichi\": \"草野红壹\",\n        \"konata hyuura\": \"虎向Hyuura\",\n        \"konno azure\": \"紺野あずれ\",\n        \"sawano akira\": \"泽野明\",\n        \"shiran takashi\": \"しらんたかし\",\n        \"matra milan\": \"的良米兰\",\n        \"morisaki kurumi\": \"森崎胡桃\",\n        \"todoroki shin\": \"轰真\",\n        \"hirotake awataka\": \"粟岳高弘\",\n        \"hayake\": \"はやけ\",\n        \"hasblow cream\": \"はすぶろくりーむ\",\n        \"kagami fumio\": \"加賀美ふみを\",\n        \"kamirenjaku sanpei\": \"上连雀三平\",\n        \"kyaradain\": \"きゃらだいん\",\n        \"minna daisuki\": \"みんなだいすき\",\n        \"cloba.u\": \"Cloba・U\",\n        \"binsen\": \"びんせん\",\n        \"koari\": \"小蚁\",\n        \"toriburi\": \"トリブリ\",\n        \"osanpo suisou\": \"おさんぽ水槽\",\n        \"ohaguro dobu\": \"御歯黒溝（桜シロウ）\",\n        \"makio\": \"マキオ\",\n        \"mikaduchi\": \"みかづち\",\n        \"ogu\": \"おぐ\",\n        \"aoki kanji\": \"青木干治\",\n        \"amagi kei\": \"亚麻木硅\",\n        \"ikumo taisuke\": \"井云泰助\",\n        \"mana\": \"MANA\",\n        \"hanpen\": \"はんぺん\",\n        \"zeroshiki kouichi\": \"ぷぅ崎ぷぅ奈\",\n        \"kagono tori\": \"かごのとり\",\n        \"haga yui\": \"叶贺唯\",\n        \"shinichirou otsuka\": \"大冢真一郎\",\n        \"haniwa hao\": \"はにわはお\",\n        \"akitaka mika\": \"明贵美加\",\n        \"kanabun\": \"kanabun\",\n        \"miyasaka takaji\": \"ミヤサカタカジ\",\n        \"crowe\": \"クロエ\",\n        \"ruhika\": \"ルヒカ\",\n        \"oobanburumai\": \"オオバンブルマイ\",\n        \"shin fuzen\": \"シン 普禅\",\n        \"magekichi\": \"まげきち\",\n        \"juna\": \"JUNA\",\n        \"kotokane hajime\": \"ことかねはじめ\",\n        \"yoshitani ganjitsu\": \"义谷元日\",\n        \"kawai masaki\": \"川合正起\",\n        \"wada wau\": \"和田羽烏\",\n        \"rondonko\": \"ろんどんこ\",\n        \"pirason\": \"ぴらそん\",\n        \"zettai yarumoni\": \"絶対やるもに\",\n        \"shishi senmaru\": \"狮子千丸\",\n        \"kameyoshi ichiko\": \"亀吉いちこ\",\n        \"leonardo 16sei\": \"れオナるド16世\",\n        \"funwari rice\": \"ふんわり☆らいす\",\n        \"akao\": \"朱尾\",\n        \"omecho\": \"おめちょ\",\n        \"chicken\": \"チキン\",\n        \"uba yoshiyuki\": \"宇场义行\",\n        \"syokuyou-mogura\": \"Syokuyou-Mogura\",\n        \"nanjou asuka\": \"南条飞鸟\",\n        \"kurenai yuuji\": \"紅ゆーじ\",\n        \"kohsaka novak\": \"高坂のばく\",\n        \"osisio\": \"osisio\",\n        \"kazune haka\": \"和音ハカ\",\n        \"yatomi\": \"やとみ\",\n        \"karaage3\": \"からあげ3\",\n        \"gibachan\": \"ぎばちゃん\",\n        \"takitarou\": \"滝太郎\",\n        \"yangcong chaodasuan\": \"洋葱炒大蒜\",\n        \"tokunou shoutarou\": \"得能正太郎\",\n        \"tsugumi suzuma\": \"亚美寿真\",\n        \"kakao\": \"kakao\",\n        \"akabane\": \"アカバネ\",\n        \"miyashiro ryuutarou\": \"三夜代龙太郎\",\n        \"meganei\": \"メガねぃ\",\n        \"tamatanuki\": \"たまたぬき\",\n        \"asabi miho\": \"山葵美保\",\n        \"matsumiya kiseri\": \"茉宮祈芹\",\n        \"hirokawa\": \"広川\",\n        \"kamiya yuu\": \"榎宮祐\",\n        \"imigimuru\": \"いみぎむる\",\n        \"kise itsuki\": \"木濑树\",\n        \"shono kotaro\": \"宵野小太郎\",\n        \"rurudo\": \"rurudo\",\n        \"ashima takumi\": \"芦間拓海\",\n        \"nishigori atsushi\": \"锦织敦史\",\n        \"nanashimushi\": \"ななし虫\",\n        \"ippo\": \"ippo\",\n        \"smomo\": \"smomo\",\n        \"madoromi\": \"まどろみ\",\n        \"nishiyama yuichi\": \"にしやまゆーいち\",\n        \"azumi akitake\": \"安曇アキタケ\",\n        \"dondakei\": \"どんだけい\",\n        \"imaishi hiroyuki\": \"今石洋之\",\n        \"gilse\": \"Gilse\",\n        \"junkie\": \"千要よゆち\",\n        \"nibiirokaden\": \"鈍色家電\",\n        \"migihaji\": \"右端\",\n        \"miyoshino\": \"みよしの\",\n        \"omochi monaka\": \"おもち もなか\",\n        \"ootsuka reika\": \"大塚麗夏\",\n        \"zanka\": \"ざんか\",\n        \"ashizuki\": \"アシズキ\",\n        \"abe nattou\": \"あべなっつ\",\n        \"yuushi tessen\": \"柚子铁线\",\n        \"hitsujino\": \"羊乃\",\n        \"ancotaku\": \"餡こたく\",\n        \"shirokimochi\": \"白生もち\",\n        \"nagatukiin\": \"长月院\",\n        \"tanuma\": \"たぬま\",\n        \"chihiro\": \"Chihiro\",\n        \"soba\": \"soba\",\n        \"kaneko\": \"華猫\",\n        \"sekai saisoku no panda\": \"世界最速のパンダ\",\n        \"ayame iro\": \"絢芽いろ\",\n        \"kaiduka akuta\": \"貝塚芥\",\n        \"katsuten\": \"かつてん\",\n        \"waterring\": \"WaterRing\",\n        \"gwegwe\": \"gweda\",\n        \"nehani\": \"ねはに\",\n        \"juukyuu\": \"じゅうきゅう\",\n        \"chobipero\": \"ちょびぺろ\",\n        \"takama\": \"高天\",\n        \"pesshin\": \"ペッシン\",\n        \"tomatojigoku\": \"とまとじごく\",\n        \"midori\": \"みどり\",\n        \"ponponmaru\": \"ぽんぽんまる\",\n        \"hame dragon\": \"ハメドラゴン\",\n        \"ziran\": \"ZIRAN\",\n        \"hinamo\": \"ひなも🍀\",\n        \"keso shirou\": \"けそシロウ\",\n        \"nishimura nike\": \"西村にけ\",\n        \"ererep\": \"エレレ🌸\",\n        \"mammoth\": \"ドロンタビ\",\n        \"yonemochi akihiko\": \"米餅昭彦\",\n        \"momikocu\": \"籾殻\",\n        \"danimaru\": \"だにまる\",\n        \"reba\": \"れば☆\",\n        \"chifuyu\": \"千冬\",\n        \"itsuki kuro\": \"伊月クロ\",\n        \"tonari\": \"隣\",\n        \"sawaragi\": \"沢良宜\",\n        \"sanrokumaru\": \"さんろく丸\",\n        \"kuga mayuri\": \"久我茧莉\",\n        \"jiyu2\": \"磁油2\",\n        \"yoshida\": \"吉田\",\n        \"dokukinokozin\": \"毒茸人\",\n        \"danrenji\": \"だんれんじ\",\n        \"kiri-kiri mai\": \"ギリギリ舞\",\n        \"oshino\": \"推乃\",\n        \"shiramizu mizuchi\": \"白瑞みずち\",\n        \"majima tetsurou\": \"真島てつろー\",\n        \"super zombie\": \"すーぱーぞんび\",\n        \"seuma\": \"せうま\",\n        \"ryoma\": \"きただりょうま\",\n        \"kannko\": \"缶子\",\n        \"sencha\": \"せんちゃ\",\n        \"miyazaki hayao\": \"宫崎骏\",\n        \"amatou\": \"甘党\",\n        \"aki akane\": \"秋赤音\",\n        \"lack\": \"lack\",\n        \"morikoke\": \"もり苔\",\n        \"tansuiken\": \"淡水犬\",\n        \"yamakonbu\": \"やまこんぶ\",\n        \"crew\": \"クルー\",\n        \"toujou tsukushi\": \"東條土筆\",\n        \"yamada gogogo\": \"山田ゴゴゴ\",\n        \"g-wara\": \"爺わら\",\n        \"ibarame hisa\": \"茨芽ヒサ\",\n        \"aoyama kiiro.\": \"あおやまきいろ。\",\n        \"ushiro muki\": \"丑露ムキ\",\n        \"uono shinome\": \"魚野シノメ\",\n        \"igedoaha\": \"イゲドアハ\",\n        \"tachibana nagon\": \"立花なごん\",\n        \"takoyaki rock\": \"タコヤキロック\",\n        \"yuruchin kyouso\": \"ゆるちん教祖\",\n        \"mitsuki\": \"ミツ季\",\n        \"momono yuuca\": \"もものユーカ\",\n        \"oyama kina\": \"大山树奈\",\n        \"ronna\": \"ろんな\",\n        \"uranokyuu\": \"ウラノキュウ\",\n        \"7x2\": \"7×2\",\n        \"kurowa\": \"黒輪\",\n        \"pei\": \"ぺい\",\n        \"shimazu tekko\": \"島津鉄甲（raikoh）\",\n        \"enoki\": \"えのき\",\n        \"mizuno cho\": \"みずのちょう\",\n        \"rca\": \"rca\",\n        \"satotuki tiyo\": \"里月ちよ\",\n        \"gar\": \"ガー\",\n        \"shibaken goro\": \"柴犬五郎\",\n        \"tachibana roku\": \"タチロク（MegaPantS）\",\n        \"tang-pong\": \"Tang-Pong★\",\n        \"yamaimo tororo\": \"山芋とろろ\",\n        \"furumoto takeru\": \"降本孟\",\n        \"kayama kifumi\": \"加山きふみ（樹八ウロ）\",\n        \"tobari saru\": \"トバリ猿\",\n        \"utsusumi kio\": \"空住キオ\",\n        \"eshimoto\": \"Eシモト\",\n        \"shingo.\": \"Shingo.\",\n        \"nedokoro mitsuki\": \"ねどころみつき\",\n        \"hoshi to lucky\": \"ほしとラッキー\",\n        \"fuzichoco\": \"藤原\",\n        \"yuiga naoha\": \"由雅なおは\",\n        \"tousen\": \"冬扇\",\n        \"edogawa roman\": \"江戸川浪漫\",\n        \"kurimoti tiduru\": \"栗餅ちづる\",\n        \"the-sinner\": \"The-Sinner\",\n        \"nochanzero\": \"Nochanzero\",\n        \"10eki\": \"10駅\",\n        \"voidmaki\": \"Voidmaki\",\n        \"star chaser\": \"STAR☆CHASER\",\n        \"greko\": \"Greko🔞\",\n        \"onikun\": \"おにくん\",\n        \"c ice\": \"C_ICE\",\n        \"saitom\": \"斋藤将嗣\",\n        \"komi zumiko\": \"コミズミコ\",\n        \"kawakami masaki\": \"川上真树\",\n        \"hizuki akira\": \"绯月Akira\",\n        \"cream cod\": \"奶油鳕鱼\",\n        \"yasuyuki\": \"やすゆき\",\n        \"hisama kumako\": \"ひさまくまこ\",\n        \"mikisai\": \"みきさい\",\n        \"kisaragi yuri\": \"きさらぎゆり\",\n        \"ichikawa halu\": \"いちかわはる\",\n        \"betm\": \"杯面\",\n        \"bttn\": \"bttn\",\n        \"hao\": \"はお\",\n        \"wool\": \"うーる\",\n        \"dainyu\": \"代入\",\n        \"koshino\": \"こしの\",\n        \"haiki\": \"はいき\",\n        \"50 percent off\": \"50%OFF\",\n        \"shiba kumiko\": \"柴くみこ\",\n        \"tousaki shiina\": \"凍咲しいな\",\n        \"shiba yuuji\": \"司馬ゆうじ\",\n        \"ruki\": \"琉希\",\n        \"longbow flintlock\": \"长弓燧龙\",\n        \"milkybot\": \"Milkybot\",\n        \"kyougoku touya\": \"京极灯弥\",\n        \"ikutsuki\": \"イクツキ\",\n        \"mitarou\": \"ミタロウ\",\n        \"higuchi isami\": \"ひぐちいさみ\",\n        \"yuuki rika\": \"結城リカ\",\n        \"meicha\": \"冥茶\",\n        \"shinoda kazuhiro\": \"篠田一宏\",\n        \"cure slum\": \"キュアスラム\",\n        \"nanakichi\": \"七吉\",\n        \"yoshitama ichirou\": \"吉玉一楼\",\n        \"rifuru\": \"りふる\",\n        \"oniharigusa\": \"鬼针草\",\n        \"komota\": \"こもた\",\n        \"akamoku\": \"あかもく\",\n        \"hiyama yuki\": \"檜山ユキ\",\n        \"izumi kirifu\": \"和泉キリフ\",\n        \"suzuki nago\": \"铃木和\",\n        \"ito fleda\": \"伊藤達哉Tatsuya Ito\",\n        \"namatsui\": \"なまつい\",\n        \"mimamoriencyo\": \"みまもり園長\",\n        \"yukiyoshi mamizu\": \"ゆきよし真水\",\n        \"miyashiro sousuke\": \"宮社惣恭\",\n        \"sasaki bullet\": \"佐々木バレット\",\n        \"kuroki hidehiko\": \"黑木秀彦\",\n        \"agemo agm\": \"阿戈魔AGM\",\n        \"jackasss\": \"空蜂ミドロ（テラダ・ジャッカス）\",\n        \"izayoi seishin\": \"十六夜清心\",\n        \"dancyo\": \"だんちょ\",\n        \"ame\": \"雨\",\n        \"jp06\": \"JP06\",\n        \"kazepana\": \"かぜぱな\",\n        \"gyouza teishoku\": \"ギョウザテイショク\",\n        \"kyouichirou\": \"狂一郎\",\n        \"kuon michiyoshi\": \"久远道义\",\n        \"gorgeous mushroom\": \"绚烂的蘑菇\",\n        \"samneco\": \"寒猫\",\n        \"yakuhina\": \"yakuhina\",\n        \"kawayoi\": \"かわよい\",\n        \"nishida megane\": \"仁志田メガネ\",\n        \"furuya nagisa\": \"古矢渚\",\n        \"chouchin ankou\": \"提灯暗光\",\n        \"kantamaki yui\": \"環々唯\",\n        \"emu emuo\": \"えむえむお\",\n        \"yanagi hareta\": \"晴太\",\n        \"houkisei\": \"ほうき星\",\n        \"takahama tarou\": \"高浜太郎\",\n        \"ikezaki misa\": \"池咲弥撒\",\n        \"ikameshi\": \"乌贼饭\",\n        \"sakura romako\": \"桜ロマ子\",\n        \"moejin\": \"萌尽\",\n        \"shinjitsu\": \"真实\",\n        \"yoshiie\": \"由家\",\n        \"nikubou maranoshin\": \"肉棒魔罗之进\",\n        \"goya\": \"蜜姫モカ\",\n        \"doji ro\": \"どじろー\",\n        \"hiro\": \"博\",\n        \"inokuma shinobu\": \"猪熊忍\",\n        \"kusayarou\": \"草野郎\",\n        \"eufoniuz\": \"Eufoniuz\",\n        \"chaoroushi\": \"炒肉师\",\n        \"nikujiruc\": \"肉汁uc\",\n        \"nakadera akira\": \"中寺明良\",\n        \"kushida\": \"くしだ\",\n        \"ono kenuji\": \"尾野けぬじ\",\n        \"gotoh akira\": \"後藤晶\",\n        \"niko\": \"ニコ\",\n        \"hcwj\": \"心味觉\",\n        \"kunimoto takashi\": \"国本隆史\",\n        \"okyou\": \"おきょう\",\n        \"testame\": \"ツリサス\",\n        \"jj\": \"jj\",\n        \"sesena yau\": \"せせなやう\",\n        \"cai pi jun\": \"菜さん\",\n        \"hara\": \"へら\",\n        \"nenobi\": \"子野日\",\n        \"maki hideto\": \"牧秀人\",\n        \"sahara ikkou\": \"佐原一光\",\n        \"izumi mahiru\": \"泉まひる\",\n        \"ranou\": \"卵の黄身\",\n        \"abso lu\": \"あぶそる\",\n        \"kyuusuikei\": \"給水係\",\n        \"sr\": \"SR\",\n        \"azure\": \"あずーる\",\n        \"ishimura\": \"石村\",\n        \"random\": \"兰田梦\",\n        \"hamadamiku\": \"浜田みく\",\n        \"nanasaki\": \"七崎\",\n        \"satsuki misuzu\": \"皐月深鈴\",\n        \"haneru\": \"HaneRu\",\n        \"manbou\": \"マンボー\",\n        \"mokuseirokku\": \"木星ろっく\",\n        \"ment\": \"ment\",\n        \"nardack\": \"Nardack\",\n        \"borisu\": \"ボリス\",\n        \"kunisaki kei\": \"国崎蛍\",\n        \"torimogura\": \"とりもぐら\",\n        \"ihara asta\": \"伊原あす太\",\n        \"yasu\": \"yasu\",\n        \"akadama\": \"红玉\",\n        \"shiranami kouki\": \"白波航希\",\n        \"asaga aoi\": \"浅賀葵\",\n        \"camonome\": \"かものめ\",\n        \"shikigami kuroko\": \"式神くろ子\",\n        \"coburaco\": \"コブラノヲヤツ\",\n        \"nemu\": \"ネム\",\n        \"yoshika\": \"ヨシカ\",\n        \"uduki takeru\": \"卯月たける\",\n        \"yunagi amane\": \"憂凪あまね\",\n        \"nusmusbim\": \"ナスムスビム\",\n        \"tatsu tairagi\": \"燵成\",\n        \"doemutan\": \"どえむたん\",\n        \"ooshima towa\": \"大島永遠\",\n        \"posuimianju\": \"破碎面具\",\n        \"suzuki hinomi\": \"鈴木ひのみ\",\n        \"minamo\": \"みなも\",\n        \"ka-9\": \"ないん\",\n        \"shinjima saki\": \"心岛咲\",\n        \"riko\": \"利行\",\n        \"shinozaki rei\": \"しのざき嶺\",\n        \"mei ichi\": \"名一\",\n        \"sadakage\": \"貞影\",\n        \"akako\": \"AKAKO\",\n        \"momokumo\": \"桃云\",\n        \"umiyamasoze\": \"海山そぜ\",\n        \"cailin020\": \"Cailin020\",\n        \"yuzhou\": \"宇宙\",\n        \"tantan\": \"たん旦\",\n        \"rana yume\": \"らな夢\",\n        \"sen\": \"Sen\",\n        \"oumikun\": \"近江训\",\n        \"fukai ryousuke\": \"深井涼介\",\n        \"hmongt\": \"hmongt\",\n        \"saber01\": \"saber_01\",\n        \"tripleq\": \"TripleQ\",\n        \"kashieda subaru\": \"貸江田昴\",\n        \"uranoa\": \"うらのあ\",\n        \"tisen\": \"撥撥 (Tisen)\",\n        \"chamu\": \"雅茶木HZ\",\n        \"owari\": \"おわり\",\n        \"zoharwolf\": \"Zoharwolf\",\n        \"ushi no shita\": \"牛の舌\",\n        \"dikk0\": \"ディッコ\",\n        \"nanamoto\": \"ななもと\",\n        \"naidong\": \"奶凍\",\n        \"karan\": \"からん\",\n        \"hetaren\": \"へたれん\",\n        \"ginger shuka\": \"姜糖\",\n        \"sazaemu\": \"さざえむ\",\n        \"gunjou\": \"群青\",\n        \"takaman\": \"高馒\",\n        \"xiaoxi\": \"小西0619\",\n        \"arimura daikon\": \"有村大根\",\n        \"toyama burin\": \"遠山ブリン\",\n        \"tsukai you\": \"塚井ヨウ\",\n        \"botan m\": \"牡丹M\",\n        \"syouwaru\": \"性悪\",\n        \"indo curry\": \"印度咖喱\",\n        \"hirasawa zen\": \"平沢Zen\",\n        \"shimuro itaru\": \"至室\",\n        \"mishiro shizuku\": \"水白しずく\",\n        \"gedou danshaku\": \"外道男爵\",\n        \"nero augustus\": \"尼禄奥古斯都\",\n        \"sarena\": \"百花星彩メメちゃん\",\n        \"makari tohru\": \"魔狩十织\",\n        \"mizoguchi keiji\": \"沟口凯吉\",\n        \"bing gong asylum\": \"冰宫Asylum\",\n        \"mikimoto haruhiko\": \"美树本晴彦\",\n        \"asakura ryosuke\": \"朝仓亮介\",\n        \"b-river\": \"B-RIVER\",\n        \"katakura mikki\": \"片倉みっき\",\n        \"chichan54\": \"ちーちゃん54\",\n        \"midori niku\": \"绿肉\",\n        \"oko yomiko\": \"小神よみ子\",\n        \"umemotsuzou\": \"梅モツ蔵\",\n        \"nori gorou\": \"のり伍郎\",\n        \"0-g\": \"0-G\",\n        \"0bake\": \"0BAKE\",\n        \"0k0j0\": \"0k0j0\",\n        \"10-shion\": \"10-Shion\",\n        \"10mo\": \"10mo\",\n        \"10nin\": \"10nin\",\n        \"13.\": \"13.\",\n        \"2 equals 8\": \"2=8\",\n        \"286c\": \"286c\",\n        \"2gou\": \"2号\",\n        \"2t\": \"2T\",\n        \"322g\": \"322g\",\n        \"360mb yano\": \"360MB矢野\",\n        \"38kb\": \"38kb\",\n        \"3e\": \"さんい\",\n        \"3u\": \"3u\",\n        \"4 coulomb\": \"よんくーろん\",\n        \"45acp\": \"45ACP\",\n        \"4shi\": \"4氏\",\n        \"4why\": \"4why\",\n        \"5jack\": \"5jack\",\n        \"666zarike\": \"Contact\",\n        \"77gl\": \"77gl\",\n        \"78rr\": \"だぶるあーる\",\n        \"7c\": \"7c\",\n        \"7ten paoki\": \"7点ぱおき\",\n        \"846gou\": \"846号\",\n        \"94plum\": \"94Plum\",\n        \"9chibiru\": \"九千ビノレ\",\n        \"9law\": \"9LAW\",\n        \"a toshi\": \"Aとし\",\n        \"a-loveru\": \"A・Loveる\",\n        \"a-lucky murashige\": \"アラーキー村重\",\n        \"a-s\": \"A-S\",\n        \"a-tak\": \"A-tak\",\n        \"a.k.a.nyarot\": \"a.k.a.にゃろっと\",\n        \"a.s. hermes\": \"A.S.ヘルメス\",\n        \"a1\": \"A1\",\n        \"ababari\": \"ababari\",\n        \"abara\": \"アバラ\",\n        \"abazu red\": \"あばずRed\",\n        \"abc-pauler\": \"abc-pauler\",\n        \"abe\": \"ABE\",\n        \"abe aiko\": \"安部愛コ\",\n        \"abe ryu\": \"悪部瑠\",\n        \"abe tsukumo\": \"あべつくも\",\n        \"abeno chaco\": \"阿倍野ちゃこ\",\n        \"abi\": \"あび\",\n        \"abio\": \"あびお\",\n        \"abmayo\": \"abmayo\",\n        \"abo\": \"ABO\",\n        \"abo manten\": \"阿保満天\",\n        \"abu4\": \"あぶ4\",\n        \"aburaage\": \"柳瀬敬之\",\n        \"aburi\": \"あぶり\",\n        \"aburidashi zakuro\": \"あぶりだしざくろ\",\n        \"abutomato\": \"アブトマト\",\n        \"abzome\": \"エビゾメ\",\n        \"acbins\": \"あくびんす\",\n        \"accio\": \"あっちょ\",\n        \"ace\": \"エース\",\n        \"acht\": \"アハト\",\n        \"achumuchi\": \"あちゅむち\",\n        \"aco\": \"Aco\",\n        \"adon no aniki\": \"アドンの兄貴\",\n        \"aduma kei\": \"あづま京\",\n        \"afuro\": \"あふろ\",\n        \"agata\": \"アガタ\",\n        \"agata akira\": \"県晶\",\n        \"agemon\": \"アゲモン\",\n        \"agetama\": \"あげたま\",\n        \"ago\": \"顎\",\n        \"agro bio\": \"阿黒バイオ\",\n        \"agu\": \"あぐ\",\n        \"agumen\": \"アグ麺\",\n        \"agurecchi\": \"アグれっち\",\n        \"aguri\": \"あぐり\",\n        \"ahaha\": \"あはは\",\n        \"ahchi\": \"あぁち\",\n        \"ahe\": \"あへ\",\n        \"aheen\": \"あへーん\",\n        \"ahiru\": \"あひる\",\n        \"ahobaka\": \"AHOBAKA\",\n        \"ahorobo\": \"ahorobo\",\n        \"ahou miya\": \"阿呆宮\",\n        \"ahru.\": \"あーる。\",\n        \"ai\": \"あぃ\",\n        \"ai ni shisu\": \"愛に死す\",\n        \"aiu kaho\": \"相羽翔穂\",\n        \"aibu yue\": \"相武ゆえ\",\n        \"aichi shiho\": \"あいち志保\",\n        \"aida mai\": \"英田舞\",\n        \"aida maki\": \"あいだまき\",\n        \"aida takanobu\": \"会田孝信\",\n        \"aiiro danchi\": \"藍色団地\",\n        \"aika\": \"Aika\",\n        \"aikawa\": \"愛川\",\n        \"aikawa ruru\": \"藍川琉々\",\n        \"aikawa ryou\": \"相川りょう\",\n        \"aikawa tatsuki\": \"相川たつき\",\n        \"aikura mahiru\": \"藍倉真昼\",\n        \"aikura shuuya\": \"藍倉秋夜\",\n        \"aikuri\": \"あいくり\",\n        \"aimirucha\": \"藍海松茶\",\n        \"aimitsu\": \"あいみつ\",\n        \"aimo\": \"アイモ\",\n        \"aimy\": \"あいみ*\",\n        \"ainaryumu\": \"藍那りゅむ\",\n        \"aino\": \"あいの\",\n        \"ainu mania\": \"アイヌマニア\",\n        \"aioi aoi\": \"相生青唯\",\n        \"air\": \"air\",\n        \"aira\": \"姶良\",\n        \"aitanikov\": \"あいたにこふ\",\n        \"aito matoko\": \"あいとまとこ\",\n        \"aiuchi yoshiki\": \"あいうちよしき\",\n        \"aiueou\": \"愛飢王\",\n        \"aiyama toshikazu\": \"愛山寿一\",\n        \"aiyoshi hazuki\": \"藍吉はづき\",\n        \"aizawa\": \"相沢\",\n        \"aizawa chihiro\": \"藍沢ちひろ\",\n        \"aizawa moe\": \"相澤萌\",\n        \"aizawa sanae\": \"相沢早苗\",\n        \"aizawa shin\": \"あいざわしん\",\n        \"aizawa tetora\": \"アイザワテトラ\",\n        \"aizima atsushi\": \"相嶋敦\",\n        \"aizome gorou\": \"愛染五郎\",\n        \"aji\": \"鯵\",\n        \"aji pontarou\": \"安治ぽん太郎\",\n        \"ajino\": \"あじの\",\n        \"ajoea\": \"あじょぁ\",\n        \"aju\": \"アジュ\",\n        \"aka\": \"亚果\",\n        \"aka marl\": \"赤Marl\",\n        \"aka p\": \"赤P\",\n        \"aka satanan\": \"赤さたなん\",\n        \"aka seiryuu\": \"赤セイリュウ\",\n        \"akaboshi rika\": \"赤星りか\",\n        \"akabur\": \"Akabur\",\n        \"akadume\": \"朱爪\",\n        \"akae neo\": \"赤絵ねお\",\n        \"akae shirou\": \"朱江士朗\",\n        \"akaga hirotaka\": \"赤賀博隆\",\n        \"akage no un\": \"赤毛のUN\",\n        \"akagi gisho\": \"アカギギショウ\",\n        \"akagi rio\": \"赤木リオ\",\n        \"akaguchi yuuda\": \"赤口ユウダ\",\n        \"akahira kirin\": \"あかひらきりん\",\n        \"akai hoya\": \"赤井ほや\",\n        \"akai kagerou\": \"あかいかげろう\",\n        \"akai mato\": \"紅唯まと\",\n        \"akaiken\": \"あかいけん\",\n        \"akainu pochi\": \"赤犬ポチ\",\n        \"akairo\": \"あかゐろ\",\n        \"akaishi shiroishi\": \"あかいししろいし\",\n        \"akame\": \"あかめ\",\n        \"akamichi\": \"朱道\",\n        \"akan tare\": \"阿寒たれ\",\n        \"akanagi\": \"AKANAGI\",\n        \"akanagi youto\": \"紅薙遥兎\",\n        \"akane\": \"あかね\",\n        \"akane shuuhei\": \"茜しゅうへい\",\n        \"akane souichi\": \"明音そーいち\",\n        \"akaneman\": \"明寝マン\",\n        \"akaou\": \"赤王\",\n        \"akari\": \"アカリ\",\n        \"akari seisuke\": \"明誠助\",\n        \"akarin\": \"あかりん\",\n        \"akasaka kazuhiro\": \"赤坂かずひろ\",\n        \"akasode\": \"赤袖\",\n        \"akasya botan\": \"朱赦ぼたん\",\n        \"akatsuki\": \"あかつき\",\n        \"akatsuki akane\": \"あかつき茜\",\n        \"akatsuki johnny reitou\": \"紅月ジョニー冷凍\",\n        \"akatsuki katsuie\": \"暁勝家\",\n        \"akatsuki kochi\": \"暁月こち\",\n        \"akatsuki yakyou\": \"暁夜響\",\n        \"akatu bon\": \"赤津梵\",\n        \"akatuki\": \"アカツキ\",\n        \"akatuki tetora\": \"暁てとら\",\n        \"akaume\": \"あかうめ\",\n        \"akayoshi hajime\": \"赤善元\",\n        \"akazaki yasuma\": \"赤崎やすま\",\n        \"akazawa fuyuki\": \"赤沢冬希\",\n        \"akazukin\": \"赤ZUKIN\",\n        \"akchu\": \"akchu\",\n        \"akechi shizuku\": \"明地雫\",\n        \"akemi\": \"明美\",\n        \"aken\": \"あけん\",\n        \"akenami yasutaka\": \"明波康孝\",\n        \"akenotsuki renya\": \"朱乃月蓮夜\",\n        \"aki\": \"あき\",\n        \"aki eda\": \"秋★枝\",\n        \"aki kyouma\": \"秋恭摩\",\n        \"aki matsuri\": \"亜木・祭\",\n        \"aki suzuki\": \"秋鈴木\",\n        \"aki yuuto\": \"秋遊兎\",\n        \"akiba monaka\": \"秋葉もなか\",\n        \"akiba nagi\": \"秋葉凪樹\",\n        \"akiba ryu\": \"暁葉龍\",\n        \"akiba wataru\": \"秋葉わたる\",\n        \"akichin\": \"あきちん\",\n        \"akiduki akina\": \"秋月秋名\",\n        \"akiduki touya\": \"秋月十夜\",\n        \"akiha chiaki\": \"秋葉千秋\",\n        \"akihazama\": \"akihazama\",\n        \"akihiro\": \"旭洋\",\n        \"akishiro kiko\": \"秋城鬼子\",\n        \"akikan\": \"あきかん\",\n        \"akikaze shirakumo\": \"秋風白雲\",\n        \"akimbo\": \"Akimbo\",\n        \"akimoto akio\": \"あきもとあきお\",\n        \"akimoto kei\": \"秋元けい\",\n        \"akimoto youichi\": \"あきもとよういち\",\n        \"akimura yafumi\": \"秋村八二三\",\n        \"akina\": \"秋凪\",\n        \"akina rei\": \"秋奈伶\",\n        \"akinaie\": \"アキナイエ\",\n        \"akino hidefumi\": \"秋乃秀文\",\n        \"akino konomi\": \"秋乃このみ\",\n        \"akino melpa\": \"秋乃めるぱ\",\n        \"akino nagaame\": \"秋乃長雨\",\n        \"akino nonomi\": \"秋乃ののみ\",\n        \"akino shin\": \"あきのしん\",\n        \"akino takehiko\": \"秋乃武彦\",\n        \"akira\": \"アキラ\",\n        \"akira hajime\": \"あきら肇\",\n        \"akiru\": \"秋留\",\n        \"akisa\": \"アキサ\",\n        \"akisame ruu\": \"秋雨ルウ\",\n        \"akisamo\": \"アキサモ\",\n        \"akisawa yusi\": \"秋沢由史\",\n        \"akishima\": \"秋島\",\n        \"akisoba\": \"秋蕎麦\",\n        \"akita hika\": \"晃田ヒカ\",\n        \"akita seito\": \"秋田成都\",\n        \"akitaka\": \"あきたか\",\n        \"akitani\": \"明谷\",\n        \"akito\": \"あきと\",\n        \"akitsuki hirozumi\": \"秋月ひろずみ\",\n        \"akitsuki karasu\": \"榎本ひでひら\",\n        \"akiyama\": \"あきやま\",\n        \"akiyama kenta\": \"あきやまけんた\",\n        \"akiyama yuuzi\": \"秋山裕治\",\n        \"akiyoshi yoshiaki\": \"あきよしよしあき\",\n        \"akizuki takahiro\": \"秋月たかひろ\",\n        \"akki\": \"あっきー\",\n        \"akki gedoumaru\": \"惡鬼外導丸\",\n        \"akkii\": \"あっきー\",\n        \"ako\": \"A子\",\n        \"akoko.\": \"あここ。\",\n        \"akow kazumi\": \"亜神和美\",\n        \"aku\": \"あく\",\n        \"akuma\": \"あくま\",\n        \"akuno toujou\": \"悪の東丈\",\n        \"akushizu\": \"あくしず\",\n        \"akuta\": \"アクタ\",\n        \"akuta noe\": \"阿久多のえ\",\n        \"akutabin\": \"アクタビン\",\n        \"akutabone\": \"芥骨\",\n        \"akutagawa manbou\": \"芥川まんぼう\",\n        \"akutenkou\": \"悪天候\",\n        \"akuto\": \"あくと\",\n        \"al eas\": \"アル・イース\",\n        \"alapi\": \"あらぴ\",\n        \"alber\": \"Alber\",\n        \"albert-aet\": \"Contact\",\n        \"ganassa\": \"Ganassa\",\n        \"alex\": \"あれっくす\",\n        \"alfabravo\": \"アルファブラボー\",\n        \"ali\": \"ALI\",\n        \"alimika satomi\": \"ありみかさとみ\",\n        \"allegro\": \"アレグロ\",\n        \"alpacaeater\": \"アルパカイーター\",\n        \"alpha\": \"有葉\",\n        \"alphe\": \"あるふぇ\",\n        \"alpini\": \"あるぴに\",\n        \"alroune\": \"アルラウネ\",\n        \"alt bayern\": \"あるとばいえるん\",\n        \"alto\": \"あると\",\n        \"amaama\": \"いちこ\",\n        \"amadeusky\": \"アマデウスキー\",\n        \"amado nageru\": \"雨戸ナゲル\",\n        \"amagasa higasa\": \"雨傘日傘\",\n        \"amagi michihito\": \"あまぎみちひと\",\n        \"amagi yuuru\": \"あまぎゆうる\",\n        \"amaguri aniko\": \"甘栗あに子\",\n        \"amahara mizuho\": \"あまはらみずほ\",\n        \"amai choco\": \"甘伊ちょこ\",\n        \"amakara surume\": \"あまからするめ\",\n        \"amakase masaki\": \"天枷雅樹\",\n        \"amakawa ginga\": \"天川銀河\",\n        \"amagi kazuko\": \"天城一子\",\n        \"amakuchi\": \"甘口\",\n        \"amama\": \"あまま\",\n        \"amami fuu\": \"天海ふう\",\n        \"amami ryouko\": \"あまみりょうこ\",\n        \"amamiya iria\": \"雨宮杁亜\",\n        \"amamiya tsumugi\": \"雨宮ツムギ\",\n        \"amamiya yuki\": \"雨宮結鬼\",\n        \"amamizu\": \"amamizu\",\n        \"amamori tsuruha\": \"天森つるは\",\n        \"amanai uni\": \"天内うに\",\n        \"amanatsu\": \"あまなつ\",\n        \"amane\": \"Amane\",\n        \"amane hasuhito\": \"天音蓮人\",\n        \"amane mari\": \"天音真理\",\n        \"amane shirou\": \"あまね紫狼\",\n        \"amaniji\": \"天虹\",\n        \"amano ameno\": \"天野雨乃\",\n        \"amano chiharu\": \"天乃ちはる\",\n        \"amano hidemi\": \"天野英美\",\n        \"amano jack\": \"尼野じゃっく\",\n        \"amano kanehisa\": \"アマノカネヒサ\",\n        \"amano koori\": \"桑折二号\",\n        \"amano mitsurugi\": \"天乃御剣\",\n        \"amano ribbon\": \"天野りぼん\",\n        \"amano taiki\": \"天野大気\",\n        \"amano yosora\": \"天野よそら\",\n        \"amano youki\": \"あまの・よ～き\",\n        \"amano yuu\": \"天之有\",\n        \"amanogami dai\": \"あまのがみだい\",\n        \"amanomiya haruka\": \"天宮遥\",\n        \"amaro tamaro\": \"あまろたまろ\",\n        \"amasawa natsuhisa\": \"天沢夏久\",\n        \"amashoku\": \"あましょく\",\n        \"amassa hikae\": \"あまさひかえ\",\n        \"amasyoku jiro\": \"甘食次郎\",\n        \"amato yuuki\": \"天戸祐輝\",\n        \"amaya kan\": \"あまやかん\",\n        \"amaya kyo\": \"雨耶恭\",\n        \"amayu\": \"あまゆ\",\n        \"amazing\": \"飴井神具\",\n        \"amedama akihito\": \"雨珠秋比人\",\n        \"amedori\": \"飴鳥\",\n        \"amei sumeru\": \"あめいすめる\",\n        \"amelie\": \"amelie\",\n        \"amemiya luky\": \"雨宮ルキ\",\n        \"amemiya nyanko\": \"飴宮にゃんこ\",\n        \"ameno ringo\": \"飴乃苹果\",\n        \"ameotoko\": \"雨男\",\n        \"amesawa yagi\": \"飴沢やぎ\",\n        \"ameya kyo\": \"雨矢恭\",\n        \"amhoo\": \"amhoo!!\",\n        \"ami\": \"阿見\",\n        \"ami hideto\": \"弥舞秀人\",\n        \"ami2\": \"ami2\",\n        \"amida murasaki\": \"あみだむらさき\",\n        \"amin\": \"あみん\",\n        \"amino\": \"あみ野\",\n        \"amu\": \"あむ\",\n        \"amum\": \"amum\",\n        \"amury\": \"あむりー\",\n        \"amyuchan\": \"アミュちゃん\",\n        \"an2a\": \"An2A\",\n        \"ana\": \"穴\",\n        \"ana-chan s\": \"穴ちゃんS\",\n        \"anachans\": \"穴ちゃんS\",\n        \"anago\": \"Anago\",\n        \"anakuro\": \"あなくろ\",\n        \"anan yutaka\": \"阿南ゆたか\",\n        \"anapom\": \"あなぽん\",\n        \"anchors\": \"Anchors\",\n        \"hamaburicchi\": \"ハマブリッチ\",\n        \"andoriyu\": \"あんどりゅ～\",\n        \"andou hiroyuki\": \"安藤裕行\",\n        \"andou tomoya\": \"安藤智也\",\n        \"andouyou\": \"アンドウユウ\",\n        \"andrew\": \"Andrew\",\n        \"andy\": \"ANDY\",\n        \"ane\": \"姉\",\n        \"angel dust\": \"エンジェルダスト\",\n        \"angelica\": \"アンジェリカ\",\n        \"angie nishikawa\": \"アンジー西川\",\n        \"aniki\": \"アニキ\",\n        \"anji\": \"杏二\",\n        \"ankoromochi\": \"あんころもち\",\n        \"anma\": \"安間\",\n        \"anmitsu sou\": \"あんみつ草\",\n        \"ann\": \"Ann\",\n        \"annie\": \"あにぃ\",\n        \"annin\": \"杏仁\",\n        \"annjeria\": \"あんじぇりあ\",\n        \"annkoku daimaou\": \"暗黒大魔王\",\n        \"anohito\": \"あのひと\",\n        \"anoshabu\": \"アノシャブ\",\n        \"anparu98\": \"anparu98\",\n        \"anshin mama\": \"あんしんママ\",\n        \"anyakunin\": \"暗躍人\",\n        \"anyama takemi\": \"案山たけみ\",\n        \"anzu hime\": \"あんず姫\",\n        \"ao\": \"蒼\",\n        \"ao banana\": \"青ばなな\",\n        \"ao madousi\": \"蒼惑う子\",\n        \"aogen genda\": \"青木ゲンダ\",\n        \"aohashi ame\": \"青橋雨\",\n        \"aohashi yutaka\": \"青橋由高\",\n        \"aoi chiro\": \"碧井チロ\",\n        \"aoi hiro\": \"葵比呂\",\n        \"aoi itigo\": \"葵イチゴ\",\n        \"aoi levin\": \"あおいれびん\",\n        \"aoi mikan\": \"葵蜜柑\",\n        \"aoi mikku\": \"アオイみっく\",\n        \"aoi mizuki\": \"蒼居観月\",\n        \"aoi muramasa\": \"蒼井村正\",\n        \"aoi remi\": \"青井レミ\",\n        \"aoi runa\": \"蒼井るな\",\n        \"aoi shinji\": \"葵信次\",\n        \"aoi taishi\": \"蒼井タイシ\",\n        \"aoi takayuki\": \"蒼隆行\",\n        \"aoi tsuyukusa\": \"蒼井露草\",\n        \"aoi yumi\": \"蒼井遊美\",\n        \"aojiru\": \"あおじる\",\n        \"aoki eichi\": \"蒼木えいち\",\n        \"aoki reimu\": \"青樹零夢\",\n        \"aoko\": \"Aoko\",\n        \"aokura shou\": \"青倉ショウ\",\n        \"aomeyuu\": \"アオメユウ\",\n        \"aonaga heri\": \"青永HERI\",\n        \"aonatsusu\": \"蒼夏酢\",\n        \"aono\": \"あおの\",\n        \"aono akira\": \"蒼野アキラ\",\n        \"aono keita\": \"青野圭太\",\n        \"aono yami\": \"蒼野矢美\",\n        \"aonuma shizuma\": \"蒼沼シズマ\",\n        \"aoreyo\": \"あおれよ\",\n        \"aosusuki dakuna\": \"青薄 だくな\",\n        \"aotsuki hirotada\": \"蒼月裕忠\",\n        \"aotsuki kakka\": \"蒼月かっか\",\n        \"aotsuki ren\": \"蒼月蓮\",\n        \"aoume kaito\": \"青梅街人\",\n        \"aox\": \"あおっくす\",\n        \"aoyama reo\": \"青山怜央\",\n        \"aozame takao\": \"青雨高夫\",\n        \"aozuki ran\": \"蒼月蘭\",\n        \"apacchi\": \"アパッチ\",\n        \"apart\": \"おだねるapart\",\n        \"apita\": \"あぴ太\",\n        \"apophis str\": \"アポフィス★STR\",\n        \"aporon\": \"Aporon\",\n        \"apostle\": \"apostle\",\n        \"apple13\": \"apple13\",\n        \"apploute\": \"あっぷるーと\",\n        \"appuri ko\": \"あっぷり子\",\n        \"appyalpie\": \"あぴゃるぴえ\",\n        \"aqu\": \"亜空\",\n        \"aqua vit\": \"アクアビット\",\n        \"kosuke poke\": \"こーすけぽけ\",\n        \"aqui\": \"AQUI\",\n        \"ar-mai\": \"ar-mai\",\n        \"arabiki koshou\": \"あらびき故障\",\n        \"araco\": \"あらこー\",\n        \"aragishi\": \"あらぎし\",\n        \"arai kazuki\": \"新井和崎\",\n        \"arai nobu\": \"アライノブ\",\n        \"arai yuu\": \"新居佑\",\n        \"araki akihito\": \"荒木アキヒト\",\n        \"araki hiroaki\": \"あらきひろあき\",\n        \"araki jeccy\": \"Araki Jeccy\",\n        \"araki mitsuru\": \"荒木みつる\",\n        \"aramaki shake\": \"荒巻しゃけ\",\n        \"arami taito\": \"荒海泰人\",\n        \"arao masaki\": \"荒尾マサキ\",\n        \"araragi ayune\": \"あららぎあゆね\",\n        \"araruck\": \"あららっく\",\n        \"arashi-d-akira\": \"嵐-D-悪鬼羅\",\n        \"arashiyama tsugumoto\": \"嵐山次元\",\n        \"arata mai\": \"新米\",\n        \"aratagawa nikei\": \"荒田川にけい\",\n        \"arbuzbudesh\": \"Contact\",\n        \"arcana rude\": \"あるかな(るど)\",\n        \"arch enemy\": \"あーちえねみー\",\n        \"arciealbano\": \"arciealbano\",\n        \"arctic char\": \"Arctic char\",\n        \"are\": \"ARE\",\n        \"ari\": \"蟻\",\n        \"aria\": \"Aria\",\n        \"ariesu watanabe\": \"ありえす渡辺\",\n        \"ariga tou\": \"有賀冬\",\n        \"ariichi kyuu\": \"有一九\",\n        \"ariike tomosane\": \"有池智実\",\n        \"arikawa koba\": \"有川古葉\",\n        \"ariko\": \"亜璃子\",\n        \"arima\": \"ありま\",\n        \"arima jun\": \"有马纯\",\n        \"arima keitarou\": \"有马启太郎\",\n        \"arima you\": \"有马有\",\n        \"arima yutaka\": \"有马ゆたか\",\n        \"arimori haru\": \"在森 晴\",\n        \"arimura ario\": \"有村ありお\",\n        \"arimura shinobu\": \"有村しのぶ\",\n        \"arimura yuu\": \"有村悠\",\n        \"arinko\": \"蟻ん子\",\n        \"arisaka ako\": \"有坂あこ\",\n        \"arisato natsuki\": \"ありさと奈月\",\n        \"arisawa masaharu\": \"有沢柾春\",\n        \"arisue tsukasa\": \"有末つかさ\",\n        \"ariyas honda\": \"本田有保\",\n        \"ariyoshi gen\": \"蟻吉げん\",\n        \"ark waver\": \"あるくでんぱ\",\n        \"arkas\": \"Arkas\",\n        \"aro\": \"あろ\",\n        \"art jam\": \"Art Jam\",\n        \"afro\": \"あふろ\",\n        \"akagi\": \"赤木\",\n        \"pastel\": \"ぱすてる\",\n        \"aru\": \"ある\",\n        \"aruma\": \"あるま\",\n        \"andou jirou\": \"安藤慈朗\",\n        \"arumi\": \"あるみ\",\n        \"aruse yuuji\": \"有瀬祐志\",\n        \"aruta\": \"あるた\",\n        \"arutan\": \"あるたん\",\n        \"aruva\": \"aruva\",\n        \"as-special\": \"As-Special\",\n        \"asa\": \"あさ\",\n        \"asaba hideaki\": \"あさばひであき\",\n        \"asagi\": \"浅戯\",\n        \"asagi aya\": \"あさぎあや\",\n        \"asagi hiroshi\": \"浅葱洋\",\n        \"asagi shion\": \"浅葱しおん\",\n        \"asagi yoshimitsu\": \"あさぎよしみつ\",\n        \"asagi yukia\": \"浅樹ゆきあ\",\n        \"asagiri\": \"あさぎり\",\n        \"asagiri miyabi\": \"朝霧雅\",\n        \"asagiri rira\": \"あさぎりりら\",\n        \"asagiri tendou\": \"朝霧天道\",\n        \"asagiri.\": \"ASAGIRI.\",\n        \"asahi\": \"アサヒ\",\n        \"asahi uta\": \"あさひウタ\",\n        \"asahikawa\": \"旭川\",\n        \"asahimaru\": \"旭丸\",\n        \"asai yuuri\": \"浅井ユウリ\",\n        \"asakai mocchinu\": \"浅貝もっちぬ\",\n        \"asakawa yuki\": \"麻川由貴\",\n        \"asako\": \"あさこ\",\n        \"asakura\": \"麻倉\",\n        \"asakura blue\": \"朝倉ブルー\",\n        \"asakura gin\": \"浅倉ギン\",\n        \"asakura hina\": \"朝倉妃那\",\n        \"asakura kazuki\": \"あさくらかずき\",\n        \"asakura nao\": \"明桜なお\",\n        \"asakura ryou\": \"朝倉亮\",\n        \"asakura sakura\": \"麻倉桜\",\n        \"asama\": \"あさま\",\n        \"asamaki\": \"あさマキ\",\n        \"asamashi masashi\": \"浅増マサシ\",\n        \"asami asami\": \"浅海朝美\",\n        \"asami waka\": \"浅見わか\",\n        \"asami yumesuke\": \"朝見ユメスケ\",\n        \"asami yurumu\": \"浅湖葵天\",\n        \"asano\": \"朝野\",\n        \"asano akira\": \"浅野晃\",\n        \"asano keigo\": \"浅野けいご\",\n        \"asano maya\": \"麻野まや\",\n        \"asano shimon\": \"麻乃史門\",\n        \"asano yukino\": \"あさのゆきの\",\n        \"asanuma katsuaki\": \"浅沼克明\",\n        \"asari yoshitoo\": \"あさりよしとお\",\n        \"asaroku\": \"あさろく\",\n        \"asatsuki madoka\": \"朝月円\",\n        \"asazaki\": \"アサザキ\",\n        \"asazuki\": \"アサヅキ\",\n        \"ase\": \"汗\",\n        \"ashi o\": \"Ashi_O\",\n        \"ashiashi\": \"あしあし\",\n        \"ashisyun\": \"芦俊\",\n        \"ashita cha\": \"明日茶\",\n        \"ashling\": \"あしゅりんぐ\",\n        \"ashura kumo\": \"阿修羅クモ\",\n        \"asio\": \"アシオ\",\n        \"asitaba tomorou\": \"明日葉友婁\",\n        \"aska takuya\": \"飛鳥拓哉\",\n        \"asou\": \"阿宗\",\n        \"asou shin\": \"麻生シン\",\n        \"aspara daisuke\": \"アスパラダイスケ\",\n        \"assteka\": \"あずてか\",\n        \"asterisk\": \"＊\",\n        \"astre\": \"ASTRE\",\n        \"astroguy2\": \"ASTROGUY2\",\n        \"asu\": \"asu\",\n        \"asu oikiru\": \"明日追斬\",\n        \"asuka\": \"アスカ\",\n        \"asuka nashina\": \"飛鳥梨菜\",\n        \"asuma omi\": \"遊馬臣\",\n        \"asumi jinta\": \"明澄迅汰\",\n        \"asuoi kiru\": \"明日追斬\",\n        \"asupaka\": \"あすぱか\",\n        \"asurai masaki\": \"明日頼真咲\",\n        \"asya\": \"亞沙\",\n        \"at\": \"AT\",\n        \"atagawa\": \"あたがわ\",\n        \"atahuta\": \"atahuta\",\n        \"atai\": \"A太\",\n        \"atarime\": \"当たり目\",\n        \"ataru\": \"あたる\",\n        \"atera\": \"アテラ\",\n        \"ather birochi\": \"アザービロチ\",\n        \"atoki\": \"あとき\",\n        \"atono matsuri\": \"後野祭\",\n        \"atono maturi\": \"亜斗乃茉利\",\n        \"atori rei\": \"あとり玲\",\n        \"atp\": \"ATP\",\n        \"atsyu\": \"亞つゅ\",\n        \"atte nanakusa\": \"あって七草\",\n        \"atunabe\": \"圧鍋\",\n        \"aturn\": \"ATURN\",\n        \"atutoku\": \"あつとく\",\n        \"atyuto\": \"あちゅと\",\n        \"auauun\": \"あうあうーん\",\n        \"aula\": \"あうら\",\n        \"autumm\": \"秋\",\n        \"awa\": \"AwA\",\n        \"awamori ichitarou\": \"泡盛一太郎\",\n        \"awata mokane\": \"粟田もかね\",\n        \"aweida\": \"アウェイ田\",\n        \"aya shiina\": \"彩しーな\",\n        \"aya-cis\": \"AYA-cis\",\n        \"ayakashi\": \"アヤカシ\",\n        \"hatakeyama tohya\": \"畠山桃哉\",\n        \"ayakaze ryuushou\": \"綾風柳晶\",\n        \"ayakumo\": \"ayakumo\",\n        \"ayame\": \"アヤメ\",\n        \"ayame riyo\": \"あやめりよ\",\n        \"ayame sino\": \"彩恵紫乃\",\n        \"ayana mizuki\": \"綾那瑞奇\",\n        \"ayana rio\": \"彩奈りお\",\n        \"ayanagi gumimi\": \"彩柳グミミ\",\n        \"ayane\": \"あやね\",\n        \"ayano naoto\": \"綾野なおと\",\n        \"ayano rumi\": \"綾乃るみ\",\n        \"ayanokouji haruka\": \"綾小路はるか\",\n        \"ayasaka mitsune\": \"綾阪みつね\",\n        \"ayase\": \"綾瀬\",\n        \"ayase hazuki\": \"綾瀬はづき\",\n        \"ayase jun\": \"綾瀬純\",\n        \"ayase mako\": \"綾瀬真子\",\n        \"ayase shinomu\": \"綾瀬しのむ\",\n        \"ayase suitento\": \"綾瀬水天戸\",\n        \"ayase totsuki\": \"彩瀬とつき\",\n        \"ayase yura\": \"綾瀬ゆら\",\n        \"ayashi ayashibe\": \"妖部あやし\",\n        \"ayasugi tsubaki\": \"綾杉つばき\",\n        \"ayato\": \"綺人\",\n        \"ayatsuri-doll\": \"文釣遠瑠\",\n        \"ayu\": \"あゆ\",\n        \"ayuka\": \"あゆか\",\n        \"ayukisa\": \"アユキサ\",\n        \"azasuke\": \"AZASUKE\",\n        \"azmodan\": \"Azmodan\",\n        \"azu\": \"Azu\",\n        \"azuki\": \"アズキ\",\n        \"azuki kurenai\": \"あずき紅\",\n        \"azukiko\": \"あずきこ\",\n        \"azuma\": \"あずま\",\n        \"azuma aya\": \"あずまあや\",\n        \"azuma hirota\": \"東ひろた\",\n        \"azuma kyouto\": \"東京都\",\n        \"azuma minatu\": \"東みなつ\",\n        \"azuma seiya\": \"東聖夜\",\n        \"azumi kyohei\": \"あずみ京平\",\n        \"azusa norihee\": \"あずさのりへー\",\n        \"azuteru.\": \"あずてる。\",\n        \"b.tarou\": \"B.たろう\",\n        \"b1h\": \"B1H\",\n        \"bach\": \"Bach\",\n        \"backfischalter\": \"伸長に関する考察\",\n        \"bacon\": \"ベーコン\",\n        \"badbamboo\": \"badbamboo\",\n        \"badhand\": \"BadHanD\",\n        \"badman bastich\": \"Deceased.\",\n        \"baerun\": \"ばえるん\",\n        \"bajou takurou\": \"馬乗拓郎\",\n        \"bakedanuki\": \"バケダヌキ\",\n        \"bakko\": \"跋扈\",\n        \"bakkon tamago\": \"バッコンたまご\",\n        \"bakuchin\": \"ばくちん\",\n        \"bakudanbonbon\": \"ばくだんぼんぼん\",\n        \"bakuretsu chichihirosu\": \"爆裂チチヒロス.\",\n        \"bakusai\": \"爆砕\",\n        \"baldie\": \"BALDIE\",\n        \"balpanther\": \"ばるぱんさー\",\n        \"baltan\": \"Baltan\",\n        \"baltika\": \"ばるてぃか\",\n        \"ban\": \"ばん!\",\n        \"bancha\": \"番茶\",\n        \"bangetsu setsuka\": \"晩月雪加\",\n        \"banjaku\": \"ばんじゃく\",\n        \"bankokudou\": \"ばんこく堂\",\n        \"barbachos\": \"ばるばちょす\",\n        \"baron mori\": \"バロン森\",\n        \"baron.m\": \"BARON.M\",\n        \"bash\": \"BASH\",\n        \"bazaar\": \"ばざーる\",\n        \"bb\": \"BB\",\n        \"bbsacon\": \"bbsacon\",\n        \"bbwh\": \"bbwH\",\n        \"bea\": \"bea\",\n        \"beat-kun\": \"びーとくん\",\n        \"beater\": \"Beater\",\n        \"bebebe\": \"べべべ\",\n        \"beco\": \"Beco\",\n        \"bee\": \"bee\",\n        \"beijuu\": \"米獸\",\n        \"bekko.\": \"べっ子。\",\n        \"bekkou megane buchiko\": \"べっこうめがねぶち子\",\n        \"bell\": \"ベル\",\n        \"bells\": \"Bell’s\",\n        \"bellsuke\": \"ベル助\",\n        \"belmond uozumi\": \"ベルモンド魚住\",\n        \"ben\": \"BEN\",\n        \"ben237\": \"BEN237\",\n        \"beni bana\": \"紅花\",\n        \"benikawa akito\": \"紅川アキト\",\n        \"benimashiko\": \"べにましこ\",\n        \"benzou\": \"ベンゾウ\",\n        \"berggold\": \"バーゴ\",\n        \"berose\": \"べろせ\",\n        \"berukko\": \"べるっこ\",\n        \"beti\": \"べてぃ\",\n        \"betty\": \"べってぃ\",\n        \"bibandamu\": \"びばんだむ\",\n        \"bibi\": \"ビビ\",\n        \"big.g\": \"big.g\",\n        \"bikkle\": \"ビックル\",\n        \"binbi\": \"びん美\",\n        \"binf\": \"ななし\",\n        \"biozs\": \"バイオ前線\",\n        \"birobon\": \"ビロボン\",\n        \"bisco\": \"ビスコ\",\n        \"bismarcho\": \"ビスマルチョ\",\n        \"bitaro\": \"ビ太郎\",\n        \"bitibiti\": \"bitibiti\",\n        \"bitou\": \"微糖\",\n        \"bittsu\": \"びっつ\",\n        \"biwa\": \"枇杷\",\n        \"bizen\": \"備前\",\n        \"bkyu\": \"bkyu\",\n        \"black\": \"ぶらっく\",\n        \"blackbaka\": \"ブラック馬鹿\",\n        \"blackheart\": \"BLACKHEART\",\n        \"blacksaw\": \"BLACKSAW\",\n        \"blast\": \"Blast\",\n        \"blind\": \"ブラインド\",\n        \"blmanian\": \"ぶるまにあん\",\n        \"bloomer hogero\": \"ぶるマほげろー\",\n        \"blue blood\": \"BLUE BLOOD\",\n        \"blue gk\": \"Blue_Gk\",\n        \"blue impulse\": \"ブルーインパルス\",\n        \"blz\": \"BLZ\",\n        \"bmg\": \"bmg\",\n        \"bnr\": \"BNR\",\n        \"bob jr\": \"ボブJr\",\n        \"bob kosugi\": \"ボブ小杉\",\n        \"bob r\": \"暴武R\",\n        \"bobca\": \"ボブキャ\",\n        \"bocha\": \"ぼちゃ\",\n        \"bojore\": \"ボジョレ\",\n        \"bol\": \"bol\",\n        \"boljoy-kun\": \"ぼりじょいくん\",\n        \"boltack\": \"ぼるたっく\",\n        \"bom\": \"BOM\",\n        \"bomber grape\": \"ボンバーグレープ\",\n        \"bon-3000\": \"BON_3000\",\n        \"bond\": \"ボンド\",\n        \"bondo\": \"ぼんど\",\n        \"bonehead\": \"Bonehead\",\n        \"bonnie\": \"ぼに～\",\n        \"bono\": \"ぼの\",\n        \"bonske\": \"ぼんすけ\",\n        \"bonten\": \"梵典\",\n        \"bontenkarasu\": \"梵天鴉\",\n        \"bonyuu cheese no natsu\": \"母乳ち～ずの夏\",\n        \"bonzakashi\": \"盆座\",\n        \"booch\": \"Booch\",\n        \"boots\": \"物\",\n        \"borurun\": \"ぼるるん\",\n        \"bose\": \"bose\",\n        \"boss chin\": \"BOSS珍\",\n        \"botan\": \"牡丹\",\n        \"bottomline\": \"Bottomline\",\n        \"boudan nyuugyuu\": \"防弾乳牛\",\n        \"bouko\": \"bouko\",\n        \"bourne\": \"ボーン\",\n        \"bouto\": \"帽都\",\n        \"bov\": \"bov\",\n        \"bowalia\": \"タケユウ\",\n        \"bowcan\": \"ぼーかん\",\n        \"bowieknife\": \"ボウイナイフ\",\n        \"brave\": \"brave\",\n        \"brewstar\": \"ぶりすた\",\n        \"brilliant jijii\": \"ブリリアントじじい\",\n        \"brll\": \"BRLL\",\n        \"brokao\": \"BroKao\",\n        \"brother bob\": \"ブラザーボブ\",\n        \"bt\": \"BT\",\n        \"btk\": \"BTK\",\n        \"buaisou\": \"無愛想\",\n        \"bubonic\": \"ぶぼにっく\",\n        \"buccho\": \"ぶっちょ\",\n        \"buchimaru\": \"ぶちマル\",\n        \"buhi\": \"ぶひ\",\n        \"bukatsu\": \"ぶかつ\",\n        \"bullion\": \"ばるらいおん\",\n        \"bun\": \"ぶん\",\n        \"bun150\": \"Bun150\",\n        \"bunapi 397 yen\": \"ぶなぴー397円\",\n        \"bunbon\": \"ぶんぼん\",\n        \"bunny\": \"バニー\",\n        \"buri\": \"ブリ\",\n        \"buriki\": \"ブリキ\",\n        \"bushi\": \"BUSHI\",\n        \"butajiman\": \"豚じまん\",\n        \"butao\": \"ブタ男\",\n        \"buthikireta\": \"ぶっちぃ\",\n        \"butsuri neko\": \"物理猫\",\n        \"butter\": \"butter\",\n        \"bwell\": \"bwell\",\n        \"byoin\": \"びょーいん\",\n        \"byte\": \"Byte\",\n        \"bzsk.\": \"Bzsk.\",\n        \"c\": \"C\",\n        \"c-cake\": \"C-Cake\",\n        \"c-low\": \"C-Low\",\n        \"c-taro\": \"C-taro\",\n        \"cabayaki\": \"Cabayaki\",\n        \"caburi\": \"caburi\",\n        \"cacao\": \"cacao\",\n        \"cai\": \"cai\",\n        \"cait\": \"Cait\",\n        \"calpara\": \"calpara\",\n        \"calpish\": \"かるぴ\",\n        \"can\": \"CAN\",\n        \"canadazin\": \"カナダ人\",\n        \"canvas solaris\": \"カンバスそらりす\",\n        \"capriccio\": \"かぷりっちょ\",\n        \"capriccyo\": \"カプリッチョ\",\n        \"cara subato\": \"空すばと\",\n        \"caramel dow\": \"きゃらめる堂\",\n        \"carbon rice\": \"カーボン飯\",\n        \"carlos toshiki\": \"カルロスとしき\",\n        \"carnelian\": \"CARNELIAN\",\n        \"carrot\": \"きゃろっと\",\n        \"caruta\": \"caruta\",\n        \"cashew\": \"かしゅう\",\n        \"cashue\": \"香愁\",\n        \"cassandra\": \"かっさんどら\",\n        \"castella\": \"カステラ\",\n        \"caterpillar\": \"キャタピラ\",\n        \"cccpo\": \"cccpo\",\n        \"cel\": \"Cel\",\n        \"cesar\": \"しーざー\",\n        \"cevoy\": \"せぼい\",\n        \"chaa\": \"ちゃあ\",\n        \"chabashira tatsukichi\": \"茶柱立吉\",\n        \"chabin\": \"茶瓶\",\n        \"chabo\": \"茶鳥\",\n        \"chaccu\": \"chaccu\",\n        \"chado\": \"茶戸\",\n        \"chagata\": \"ちゃがた\",\n        \"chagu\": \"ちゃぐ\",\n        \"chaigidhiell\": \"カイギディエル\",\n        \"chakkaman\": \"チャッカマン\",\n        \"chamame\": \"茶豆\",\n        \"chameleon\": \"かめれおん\",\n        \"chan shin han\": \"chan shin han\",\n        \"chanary\": \"Chanary\",\n        \"chane\": \"ちゃね\",\n        \"chano mina\": \"茶野みな\",\n        \"chanta\": \"チャン太\",\n        \"chaos 2nd\": \"かおす二号\",\n        \"charlie nishinaka\": \"チャーリーにしなか\",\n        \"chasaracha\": \"茶皿茶\",\n        \"chataro\": \"ちゃたろー\",\n        \"chatsune\": \"ちゃつね\",\n        \"chawa\": \"ちゃわ\",\n        \"chazutsu sayu\": \"茶筒さゆ\",\n        \"cheko\": \"ちぇこ\",\n        \"chemical flow\": \"けみかるふろう\",\n        \"cherry\": \"CHERRY\",\n        \"cheruno\": \"ちぇるの\",\n        \"chesuka\": \"チェスカ\",\n        \"chiba chibasa\": \"千葉ちばさ\",\n        \"chiba dirou\": \"ちば・ぢろう\",\n        \"chiba shinji\": \"千葉進司\",\n        \"chiba shuusaku\": \"千葉秀作\",\n        \"chiba tetsutarou\": \"千葉哲太郎\",\n        \"chibibibi\": \"ちびびび\",\n        \"chibineco master\": \"ちびねこマスター\",\n        \"chibinon\": \"チビのん☆\",\n        \"chibou\": \"ちーぼう\",\n        \"chicago\": \"シカゴ\",\n        \"chicke iii\": \"Chicke III\",\n        \"chidori\": \"ちどり\",\n        \"chidori nekoro\": \"千鳥ねころ\",\n        \"chidorinu\": \"チドリヌ\",\n        \"chiebukuro ichiban\": \"知恵袋一番\",\n        \"chief\": \"ちーふ\",\n        \"chiei\": \"智英\",\n        \"chieko\": \"ちえこ\",\n        \"chigiri maru\": \"ちぎりまる\",\n        \"chihi\": \"ちひ\",\n        \"chihiro aoi\": \"葵千尋\",\n        \"chihuri\": \"ちふり\",\n        \"chii\": \"地井\",\n        \"chijiwa sawa\": \"千々石さわ\",\n        \"chika\": \"千翔\",\n        \"chikado\": \"ちかど\",\n        \"chikahii\": \"ちかひー\",\n        \"chikake\": \"ちかけー\",\n        \"chikane\": \"千鐘\",\n        \"chikasato michiru\": \"近里みちる\",\n        \"chikaya\": \"ちかや\",\n        \"chikijima\": \"ちきじま\",\n        \"chikiko\": \"チキコ\",\n        \"chikomayo\": \"ちこマヨ\",\n        \"chikotam\": \"ちこたむ\",\n        \"chiku\": \"築\",\n        \"chikubai\": \"竹梅\",\n        \"chikugen\": \"竹玄\",\n        \"chilt\": \"ちると\",\n        \"chimaro\": \"ちまろ\",\n        \"chimo\": \"チモ\",\n        \"chimple hotter\": \"チンプル堀田\",\n        \"chin\": \"chin\",\n        \"chin tokusyu\": \"珍・特集\",\n        \"china\": \"茶否\",\n        \"chinhou\": \"珍步\",\n        \"chinjao roosu\": \"ちんじゃおろおす\",\n        \"chino fumiyu\": \"稚乃ふみゆ\",\n        \"chinyoko\": \"ちんよこ\",\n        \"chipa\": \"薙派\",\n        \"chirorian\": \"ちろり庵\",\n        \"chiroru\": \"ちろる\",\n        \"chisato\": \"チサト\",\n        \"chisato kirin\": \"千里きりん\",\n        \"chisato reiri\": \"チサトレイリ\",\n        \"chita arihiro\": \"知多有洋\",\n        \"chitose\": \"ちとせ\",\n        \"chitosezaka suzu\": \"千歳坂すず\",\n        \"chiune\": \"ちうね\",\n        \"chiyo\": \"千代\",\n        \"chiyoda mikurou\": \"千代多みく郎\",\n        \"chiyomi\": \"chiYOMI\",\n        \"chizakya\": \"ちざきゃ\",\n        \"chizu\": \"ちず\",\n        \"chizuru\": \"ちづる\",\n        \"chocco coronetto\": \"チョココロネット\",\n        \"chocho\": \"チョチョ\",\n        \"choco\": \"CHOCO\",\n        \"choco coronet\": \"チョココロネット\",\n        \"chocomint\": \"ちょこみんと\",\n        \"chocore\": \"ちょこれ\",\n        \"choko yarou\": \"ちょこ野郎\",\n        \"chomes\": \"Chomes\",\n        \"chomo\": \"ちょも\",\n        \"chonko\": \"ちよんこ\",\n        \"chou creme\": \"シュークリーム\",\n        \"chou shippaisaku\": \"超失敗作\",\n        \"chouniku\": \"超肉\",\n        \"chourui\": \"鳥類\",\n        \"chouzetsu yarou\": \"超絶野朗\",\n        \"chro\": \"chro\",\n        \"chun\": \"CHuN\",\n        \"chunko\": \"ちゅんこ\",\n        \"chunrouzan\": \"春籠漸\",\n        \"chupimaro\": \"ちゅぴまろ\",\n        \"chuusuu kairo\": \"中枢回路\",\n        \"chuuta\": \"ちゅー太\",\n        \"ci\": \"Ci\",\n        \"cian yo\": \"Cian yo\",\n        \"cilica\": \"CILICA\",\n        \"cindy\": \"cindy\",\n        \"circussion\": \"circussion\",\n        \"ck j\": \"Ckj\",\n        \"ckj\": \"ckj\",\n        \"cl\": \"シーエル\",\n        \"cla\": \"Cla\",\n        \"clappy\": \"くらっぴ\",\n        \"clarin\": \"くらりん\",\n        \"clip\": \"くりっぷ\",\n        \"cloire clover\": \"Cloire Clover\",\n        \"cloth tsugutoshi\": \"黒須嗣載\",\n        \"clover\": \"clover\",\n        \"co ma\": \"Co_Ma\",\n        \"coara\": \"coara\",\n        \"coaster\": \"コースター\",\n        \"cobo\": \"こぼ\",\n        \"cock robin\": \"クックロビン\",\n        \"cocoa\": \"ここあ\",\n        \"cocolog\": \"ココローグ\",\n        \"coconoe ricoco\": \"九重リココ\",\n        \"coconoha mikage\": \"心葉御影\",\n        \"cocorono arika\": \"心野ありか\",\n        \"cocounco\": \"cocounco\",\n        \"cocoyama\": \"ココ山\",\n        \"coelacanth\": \"しーらかんす\",\n        \"cohen\": \"cohen\",\n        \"coin rand\": \"コインRAND\",\n        \"colin\": \"COLIN\",\n        \"collagen\": \"コラーゲン\",\n        \"colonel aki\": \"Colonel AKI\",\n        \"color\": \"COLOR\",\n        \"colulun\": \"こるるん\",\n        \"combat ecchu\": \"戦闘的越中\",\n        \"comeon showme\": \"花門初海\",\n        \"comizuk\": \"こみずく\",\n        \"comord\": \"コモード\",\n        \"comugico\": \"comugico\",\n        \"condessa\": \"Condessa\",\n        \"coo\": \"くー\",\n        \"copo copo\": \"こぽこぽ\",\n        \"core-suke\": \"コア助\",\n        \"cosine\": \"COSiNE\",\n        \"cosmashiva\": \"COSMASHIVA\",\n        \"cotoba\": \"COTOBA\",\n        \"cotoji\": \"琴慈\",\n        \"couch potato\": \"かうちぽてと\",\n        \"cozy\": \"コージー\",\n        \"cpk418\": \"CPK418\",\n        \"cpu\": \"CPU\",\n        \"cr-r\": \"Cr-R\",\n        \"craft\": \"くらふと\",\n        \"crataegus\": \"Crataegus\",\n        \"crazy nirin\": \"クレイジー二厘\",\n        \"crazy white\": \"クレイジーホワイト\",\n        \"cream\": \"Cream\",\n        \"creek\": \"CREEK\",\n        \"crepix\": \"シーレ\",\n        \"cross\": \"クロス\",\n        \"crossco\": \"くろすこ\",\n        \"crow\": \"CROW\",\n        \"crozu\": \"黒酢\",\n        \"crystal shoujo\": \"クリスタル少女\",\n        \"ctk\": \"CTK\",\n        \"cube\": \"キューブ\",\n        \"cube85\": \"Cube85\",\n        \"cumasyo\": \"くましょう\",\n        \"cup-chan\": \"カップちゃん\",\n        \"cura\": \"cura\",\n        \"cureryuta\": \"キュアリュータ\",\n        \"custom\": \"カスタム\",\n        \"cuteg\": \"CUTEG\",\n        \"cv1115\": \"cv1115\",\n        \"cylia-the-antelope\": \"Cylia-The-Antelope\",\n        \"cyorisuke\": \"ちょりすけ\",\n        \"cyoro suke\": \"チョロ助\",\n        \"d-2\": \"D-2\",\n        \"d-suke\": \"D-Suke\",\n        \"d.hiranuma\": \"D.HIRANUMA\",\n        \"da\": \"だ\",\n        \"daga shikashi\": \"だがしかし\",\n        \"dagasi\": \"DAGASI\",\n        \"dai\": \"Dai\",\n        \"dai pippy\": \"大ピッピ\",\n        \"daidai\": \"大々\",\n        \"daidokoro\": \"台所\",\n        \"daifuku keiji\": \"大福けーじ\",\n        \"daigo\": \"DAIGO\",\n        \"daihuku\": \"大福\",\n        \"daiji\": \"だいじ\",\n        \"daiki\": \"だいき\",\n        \"daikyojin\": \"大巨神\",\n        \"daimon\": \"大門\",\n        \"dainakishin\": \"ダイナキシン\",\n        \"dairoku tenmaou great\": \"第六天魔王グレート\",\n        \"daisaku\": \"大作\",\n        \"daitou\": \"だい唐\",\n        \"daitouchi runoru\": \"大灯地ルノル\",\n        \"dakara\": \"だかラ\",\n        \"dame neko\": \"ダメ猫\",\n        \"nakao hamu\": \"仲尾ハム\",\n        \"damii\": \"駄みぃ\",\n        \"dan\": \"ダン\",\n        \"danchino\": \"団地の\",\n        \"dandy\": \"だんでぃ\",\n        \"dangan\": \"DANGAN\",\n        \"dango\": \"団子\",\n        \"dango.\": \"だんご。\",\n        \"danna\": \"ダンナ\",\n        \"danshaku\": \"男爵\",\n        \"dantou\": \"暖冬\",\n        \"dantyo neko\": \"だんちょねこ\",\n        \"dara\": \"だら\",\n        \"darabuchi\": \"だらぶち\",\n        \"darius-kun\": \"ダライアスくん\",\n        \"darkilow\": \"DarkⅠlow\",\n        \"darkside-g\": \"DARKSIDE-G\",\n        \"darren\": \"だれん\",\n        \"daru.\": \"だる。\",\n        \"daruton\": \"怠豚\",\n        \"dash\": \"DASH\",\n        \"dashio\": \"だしお\",\n        \"dastar\": \"ダスター\",\n        \"date kazuki\": \"伊達和騎\",\n        \"date naoto\": \"ダテナオト\",\n        \"date natsuku\": \"伊達なつく\",\n        \"dawy\": \"DAWY\",\n        \"dd\": \"DD\",\n        \"ddal\": \"ddal\",\n        \"ddg160\": \"DDG160\",\n        \"de\": \"De\",\n        \"deadnoodles\": \"ゴミョン\",\n        \"dear\": \"dear\",\n        \"dearonnus\": \"Dearonnus\",\n        \"deburasu\": \"でぶらす\",\n        \"decko\": \"でっこ\",\n        \"decosuke\": \"デコスケ\",\n        \"deego\": \"ディーゴ\",\n        \"deep purple 72\": \"深紫'72\",\n        \"deep valley\": \"ディープバレー\",\n        \"dei\": \"dei\",\n        \"deibara\": \"泥原\",\n        \"dekochin hammer\": \"でこちんハンマー\",\n        \"dekoisu\": \"デコいす\",\n        \"dekosen takuji\": \"デコセンタクジ\",\n        \"delf\": \"DELF\",\n        \"delta-tsf\": \"delta-TSF\",\n        \"deme\": \"DEME\",\n        \"demio\": \"デミオ\",\n        \"den\": \"デン\",\n        \"den meka\": \"電メカ\",\n        \"denden\": \"でんでん\",\n        \"denki\": \"電鬼\",\n        \"denki biribiri\": \"電気びりびり\",\n        \"denkousekka gou\": \"電光石火轟\",\n        \"denpanic\": \"デンぱにっく\",\n        \"densetsu no shimi\": \"伝説のシミ\",\n        \"densuke\": \"電SUKE\",\n        \"deo\": \"deo\",\n        \"deshima shin\": \"出縞臣\",\n        \"detritus\": \"デトリタス掘込\",\n        \"deusa\": \"でうさ\",\n        \"devilob\": \"デビロブ\",\n        \"dha\": \"DHA\",\n        \"digdug\": \"DigDug\",\n        \"diisuke\": \"ヂイスケ\",\n        \"din\": \"DIN\",\n        \"dining\": \"ダイニング\",\n        \"diru\": \"ぢる\",\n        \"dit\": \"DIT\",\n        \"jnnkleche\": \"じんにくれーちぇ\",\n        \"dmpn\": \"dmpn\",\n        \"doburocky\": \"ドブロッキィ\",\n        \"doctor rei\": \"ドクトル零\",\n        \"dodai shouji\": \"土代昭治\",\n        \"dodomeiro mayonnaise\": \"どどめ色マヨネーズ\",\n        \"dodomori\": \"ドドもり\",\n        \"dodorian suzuki\": \"ドドリアン鈴木\",\n        \"dofib\": \"dofib\",\n        \"doga\": \"DOGA\",\n        \"doguu\": \"どぐう\",\n        \"dohi kensuke\": \"土肥けんすけ\",\n        \"doki\": \"フリピク\",\n        \"doko tetora\": \"何処テトラ\",\n        \"doku corne\": \"毒コロネ\",\n        \"doll\": \"DOLL\",\n        \"doluta\": \"ドルタ\",\n        \"dom danshaku\": \"ドM男爵\",\n        \"domoshipette\": \"どもしペッテ\",\n        \"don\": \"Don\",\n        \"jt dong-agyoku\": \"ドン・アギョク\",\n        \"donan\": \"どなん\",\n        \"donburako\": \"丼ﾌﾞﾗｺ\",\n        \"donburi\": \"丼\",\n        \"done\": \"どね\",\n        \"donguri\": \"団栗\",\n        \"donkey\": \"DONKEY\",\n        \"donki\": \"どんき\",\n        \"donson\": \"鈍村\",\n        \"dora\": \"どら\",\n        \"dorabmon\": \"DoraBmon\",\n        \"dori rumoi\": \"どり留萌\",\n        \"doro doneru\": \"泥どねる\",\n        \"doromiez\": \"泥水\",\n        \"doru riheko\": \"ドルリヘコ\",\n        \"dos\": \"どす\",\n        \"dosu\": \"どす\",\n        \"dot-r\": \"どっとあーる\",\n        \"dote kabocha\": \"どてかぼちゃ\",\n        \"dotsuco\": \"dotsuco\",\n        \"dou yutaka\": \"堂豊\",\n        \"double deck\": \"だぶるでっく\",\n        \"doudantsutsuji\": \"満天星\",\n        \"doug winger\": \"Deceased.\",\n        \"douman ao\": \"道満青\",\n        \"doumou\": \"ドウモウ\",\n        \"dousai\": \"百斎\",\n        \"dova\": \"DOVA\",\n        \"dowabako\": \"童話箱\",\n        \"dpg\": \"DPg\",\n        \"dr-man\": \"Dr-Man\",\n        \"dr. ten\": \"Dr.天\",\n        \"dr. vu\": \"ヴー博士\",\n        \"dr.momo\": \"毒桃\",\n        \"dr.p\": \"Dr.P\",\n        \"dr.q\": \"Dr.Q\",\n        \"dra\": \"Dra\",\n        \"drain\": \"drain\",\n        \"dre\": \"DRE\",\n        \"drill jill\": \"ドリル汁\",\n        \"drossel\": \"泥っせる\",\n        \"dry\": \"DRY\",\n        \"dt hone\": \"DT骨\",\n        \"dulce-q\": \"ダルシー研Q所\",\n        \"dune\": \"でゅーん\",\n        \"dura\": \"でゅら\",\n        \"dy\": \"Dy\",\n        \"dynamite kantou\": \"ダイナマイト関東\",\n        \"dyne equals gallon\": \"ダイン=ガロン\",\n        \"dyon\": \"ぢょん\",\n        \"e\": \"E\",\n        \"e-noy\": \"E-noy\",\n        \"e.snow\": \"E.Snow\",\n        \"ebgr\": \"エビグラ\",\n        \"ebi blue\": \"海老ブルー\",\n        \"ebidou\": \"えびどー\",\n        \"ebifry akita\": \"えびふらい秋田\",\n        \"ebifurya\": \"えびふりゃ\",\n        \"ebikichi\": \"えび吉\",\n        \"ebiko\": \"えびこ\",\n        \"ebimayo\": \"えびまよ\",\n        \"ebisu\": \"えびす\",\n        \"ebisubashi seizou\": \"戎橋政造\",\n        \"ebisuyu nogi\": \"戎湯のぎ\",\n        \"ebiwantan\": \"えびわんたん\",\n        \"eboshi\": \"え★\",\n        \"ech\": \"エイチ\",\n        \"echigawa ryuuka\": \"越川リューカ\",\n        \"echo jiro\": \"江高次郎\",\n        \"ed\": \"ED\",\n        \"edih\": \"Edih\",\n        \"edo\": \"い～どぅ～\",\n        \"edo shigezu\": \"江戸しげズ\",\n        \"edoya pochi\": \"江戸屋ぽち\",\n        \"efink\": \"EFINK\",\n        \"egami\": \"エガミ\",\n        \"eguchi\": \"江口\",\n        \"eguchi chibi\": \"江口ちび\",\n        \"ehime mikan\": \"江姫蜜柑\",\n        \"eho\": \"会帆\",\n        \"eigetu\": \"eigetu\",\n        \"eight\": \"エイト\",\n        \"eikichi\": \"エーキチ\",\n        \"eiko\": \"エイコ\",\n        \"eikokukan momoha\": \"英国館桃葉\",\n        \"eimu yuu\": \"影夢優\",\n        \"eiri\": \"嬰里\",\n        \"eitaisa\": \"ぇぃたいさ\",\n        \"eitarou\": \"えーたろー\",\n        \"eixen\": \"EIXIN\",\n        \"eixin\": \"Eixen\",\n        \"ekimae\": \"駅前\",\n        \"eko\": \"絵虎\",\n        \"ekz\": \"EKZ\",\n        \"electric sheep\": \"Electric Sheep\",\n        \"elf\": \"ELF\",\n        \"elf.k\": \"elf.k\",\n        \"elia\": \"Elia\",\n        \"elijah\": \"エリヤ\",\n        \"elimiko\": \"えりみこ\",\n        \"elis 120 percent\": \"エリス120%\",\n        \"eltole\": \"eltole\",\n        \"em\": \"em\",\n        \"ema20\": \"ema20\",\n        \"eman\": \"eman\",\n        \"emanon123\": \"emanon123\",\n        \"emi\": \"えみ\",\n        \"emilio\": \"えみりお\",\n        \"emina\": \"emina\",\n        \"emino\": \"えみの\",\n        \"emit\": \"えみっと\",\n        \"emori misaki\": \"江森美沙樹\",\n        \"emote\": \"えもて\",\n        \"emu\": \"ゑむ\",\n        \"emua\": \"えむあ\",\n        \"emya\": \"emya\",\n        \"en\": \"袁\",\n        \"enamizawa\": \"江波沢\",\n        \"end\": \"えんど\",\n        \"endles\": \"炎℃れす\",\n        \"endou\": \"えんどう\",\n        \"endou marin\": \"遠藤真理ん\",\n        \"endou tatsumi\": \"遠藤辰己\",\n        \"engo\": \"えんご\",\n        \"enigma\": \"えにぐま\",\n        \"enikuma\": \"えにくま\",\n        \"enishi nasa\": \"縁なさ\",\n        \"enji\": \"エンジ\",\n        \"enma koorogi\": \"エンマコオロギ\",\n        \"enno syouta\": \"縁乃生多\",\n        \"eno\": \"eno\",\n        \"enokifu\": \"えのきふ\",\n        \"enokitake yuniku\": \"榎茸ゆにく\",\n        \"enoma shinji\": \"江之間真次\",\n        \"enomoto heights\": \"榎本ハイツ\",\n        \"enomoto hidehira\": \"榎本ひでひら\",\n        \"enomoto hina\": \"榎本ひな\",\n        \"enoshima iki\": \"江ノ島行き\",\n        \"enotou\": \"えのとう\",\n        \"enoughmin\": \"イナフミン\",\n        \"enu\": \"エヌ\",\n        \"enu-yamayama\": \"えぬーやまやま\",\n        \"epuko\": \"えぷ子\",\n        \"era\": \"Era\",\n        \"ere 2 earo\": \"えれ2エアロ\",\n        \"erika\": \"えりか\",\n        \"ero kojiki\": \"エロ乞食\",\n        \"ero koutei\": \"エロ皇帝\",\n        \"ero murasaki\": \"エロムラサキ\",\n        \"erobaldo\": \"エロバルド\",\n        \"erutasuku\": \"えるたすく\",\n        \"escape\": \"えすけーぷ!\",\n        \"esora koto\": \"絵空コト\",\n        \"esukichizuru\": \"S木チズリ\",\n        \"esuo\": \"えすお\",\n        \"esupu\": \"えすぷ\",\n        \"esureki\": \"えすれき\",\n        \"et alors\": \"Et alors\",\n        \"ether\": \"ether\",\n        \"eto\": \"えと\",\n        \"etosei\": \"干支政\",\n        \"eud\": \"euD\",\n        \"eugene batten\": \"ユージン・バートン\",\n        \"eunos\": \"ゆ～のす\",\n        \"euphonia\": \"Euphonia\",\n        \"eve\": \"eve\",\n        \"exabyte\": \"Exabyte\",\n        \"excel\": \"EXCEL\",\n        \"exeter\": \"エクゼター\",\n        \"exp\": \"EXP\",\n        \"ezo renge\": \"えぞれんげ\",\n        \"f\": \"f\",\n        \"faith\": \"faith\",\n        \"fan\": \"FAN\",\n        \"fana\": \"ふぁな\",\n        \"faust\": \"FAUST\",\n        \"fct\": \"FCT\",\n        \"fe\": \"Fe\",\n        \"feccso\": \"ふぇっくそ\",\n        \"fechi\": \"ふぇっちー\",\n        \"feiren\": \"feiren\",\n        \"femto\": \"ふぇむと\",\n        \"fence 14\": \"フェンス14\",\n        \"ferdinand\": \"フェルディナン\",\n        \"feriko\": \"フェリコ\",\n        \"fes\": \"ふぇす\",\n        \"fey tas\": \"Fey Tas\",\n        \"fi-san\": \"Fi-san\",\n        \"figaro\": \"ふぃがろ\",\n        \"fight fight chiharu\": \"ファイトファイトチハル\",\n        \"fin no uta\": \"フィンの詩\",\n        \"final\": \"Final\",\n        \"fireyuki\": \"フィレユキ\",\n        \"fk696\": \"fk696\",\n        \"flanvia\": \"Flanvia\",\n        \"flat\": \"FLAT\",\n        \"flipper\": \"FLIPPER\",\n        \"flowerchild\": \"FLOWERCHILD\",\n        \"flugel\": \"Flugel\",\n        \"flyking\": \"Flyking\",\n        \"follet\": \"Follet\",\n        \"fondue\": \"フォンデュ\",\n        \"fontin\": \"ふぉんてぃん\",\n        \"foolest\": \"ふぅすりと\",\n        \"foosnow\": \"ふーすのー\",\n        \"fortythree\": \"fortythree\",\n        \"loic foster\": \"Loic Foster\",\n        \"franken n\": \"Franken N\",\n        \"frapowa\": \"ふらぽわ\",\n        \"fred kelly\": \"フレッドケリー\",\n        \"free style\": \"Free style\",\n        \"friday\": \"フライデイ\",\n        \"fried.\": \"ふらいど。\",\n        \"frunbell\": \"ふらんべる\",\n        \"fu\": \"ふぅ\",\n        \"fu-ta\": \"Fu-ta\",\n        \"fuchi\": \"fuchi\",\n        \"fudematsuri kyousuke\": \"筆祭競介\",\n        \"fudou shin\": \"不動心\",\n        \"fue\": \"Fue\",\n        \"fugetsu taku\": \"浮月たく\",\n        \"fugo\": \"FUGO\",\n        \"fuhatsu\": \"ふはつ\",\n        \"fuji fujino\": \"富士フジノ\",\n        \"fuji sangou\": \"富士参號\",\n        \"fuji yoshida\": \"藤吉田\",\n        \"fujibayashi haru\": \"フジバヤシ春\",\n        \"fujihara gacho\": \"藤原がちょ\",\n        \"fujii aya\": \"藤井あや\",\n        \"fujii chifumi\": \"藤井ちふみ\",\n        \"fujii mochi\": \"藤井もち\",\n        \"fujii rino\": \"藤井理乃\",\n        \"fujikawa daichi\": \"藤川大智\",\n        \"fujikawa riko\": \"藤川梨子\",\n        \"fujikawa satoshi\": \"不二河聡\",\n        \"fujiko\": \"ふじこ\",\n        \"fujiku yuima\": \"藤久ゆいま\",\n        \"fujikura ryune\": \"藤倉琉音\",\n        \"fujimaru arikui\": \"ふぢまるありくい\",\n        \"fujimi\": \"藤味\",\n        \"fujimi gaku\": \"富士見ガク\",\n        \"fujimiya akane\": \"藤宮茜\",\n        \"fujimiya midori\": \"藤宮緑\",\n        \"fujimiya siryu\": \"フジミヤ子龍\",\n        \"fujimiya yahiro\": \"藤宮やひろ\",\n        \"fujimon\": \"ふじもん\",\n        \"fujimori saya\": \"ふじもり沙耶\",\n        \"fujimoto gou\": \"藤本郷\",\n        \"fujimoto hideaki\": \"藤本秀明\",\n        \"fujimoto sei\": \"ふじもとせい\",\n        \"fujimura erika\": \"藤村えりか\",\n        \"fujinami arisa\": \"藤浪有沙\",\n        \"fujinari ayako\": \"藤成アヤコ\",\n        \"fujinari takumi\": \"藤也卓巳\",\n        \"fujino yoshika\": \"ふじの芳夏\",\n        \"fujinomiya yuu\": \"藤ノ宮悠\",\n        \"fujioka toki\": \"藤岡とき\",\n        \"fujirin\": \"ふじりん\",\n        \"fujisaki kou\": \"藤崎こう\",\n        \"fujisaki makoto\": \"藤咲真\",\n        \"fujisaki rei\": \"ふじさき怜\",\n        \"fujisawa tatsurou\": \"ふじさわたつろー\",\n        \"fujishima\": \"フジシマ\",\n        \"fujishiro seiki\": \"藤城成騎\",\n        \"fujita hidetoshi\": \"藤田秀俊\",\n        \"fujiwara\": \"藤原\",\n        \"fujiwara hisashi\": \"藤原ひさし\",\n        \"fujiwara warawara\": \"藤原々々\",\n        \"fujiwara yumi\": \"藤原結実\",\n        \"fujiya\": \"ふじや\",\n        \"fujiya apota\": \"不二家あぽ太\",\n        \"fujiyama\": \"富士やま\",\n        \"fujiyama takashi\": \"フジヤマタカシ\",\n        \"fuka\": \"FUKA\",\n        \"fukada takushi\": \"深田拓士\",\n        \"fukai maro\": \"ふかぃまろ\",\n        \"fukai miyabi\": \"深井雅\",\n        \"fukami naoyuki\": \"深水直行\",\n        \"fukami otoha\": \"フカミオトハ\",\n        \"fukami ryou\": \"深海リョウ\",\n        \"fukao toriko\": \"深生とり子\",\n        \"fukase ayaka\": \"深瀬アヤカ\",\n        \"fukashiba\": \"深シバ\",\n        \"fukazume\": \"ふかづめ\",\n        \"fukiko\": \"フキコ\",\n        \"fukin\": \"布巾\",\n        \"fukudahda\": \"フクダーダ\",\n        \"fukui sora\": \"福井空\",\n        \"fukumimi\": \"ふくみみ\",\n        \"fukunaga yukito\": \"福永ゆきと\",\n        \"fukunotsukuribe\": \"ふくのつくりべ\",\n        \"fukuoka kisara\": \"福岡きさら\",\n        \"fukurokouji\": \"袋小路\",\n        \"fukurou\": \"フクロウ\",\n        \"fukutarou\": \"ふくたろう\",\n        \"fukutoku saori\": \"福徳紗織\",\n        \"fukuzawa yukine\": \"福沢ゆきね\",\n        \"fume\": \"fume\",\n        \"fumi\": \"ふみ\",\n        \"fumi haru\": \"ふみはる\",\n        \"fumicha\": \"史茶\",\n        \"fumihiro\": \"ふみひろ\",\n        \"fumikage\": \"文影\",\n        \"fumikiri\": \"ふみきり\",\n        \"fumio\": \"ふみお\",\n        \"fumitani yasunori\": \"フミタニヤスノリ\",\n        \"fumiya\": \"文哉\",\n        \"fumizuki misoka\": \"文月みそか\",\n        \"fumotono mikoto\": \"梺乃みこと\",\n        \"funabori nariaki\": \"船堀斉晃\",\n        \"funakura\": \"ふなくら\",\n        \"funamushi\": \"船虫\",\n        \"funan\": \"ふなん\",\n        \"funato hitoshi\": \"船戸ひとし\",\n        \"funatsu kazuki\": \"ふなつかずき\",\n        \"funaya sakichi\": \"船弥さ吉\",\n        \"fundoshi\": \"褌\",\n        \"funeral\": \"Funeral\",\n        \"funiai riko\": \"不似合りこ\",\n        \"funky function\": \"ファンキーファンクション\",\n        \"fupe\": \"ふぺ\",\n        \"furafura\": \"ふらふら\",\n        \"furanshisu\": \"フランシス\",\n        \"furari\": \"フラリ\",\n        \"furiri\": \"ふりり\",\n        \"furo\": \"ふろ\",\n        \"furuta a.\": \"ふる太・A\",\n        \"fusa\": \"房\",\n        \"fushimori tonkatsu\": \"不死森トンカツ\",\n        \"fusisya o\": \"不死者O\",\n        \"futaba\": \"ふたば\",\n        \"futaba miwa\": \"ふたば実和\",\n        \"futaba841\": \"双葉841\",\n        \"futago\": \"双子\",\n        \"futamaro\": \"ふうたまろ\",\n        \"futami kazuha\": \"ふたみかずは\",\n        \"futami shihen\": \"双視使翩\",\n        \"futamura futon\": \"ふたむらふとん\",\n        \"futase hijiri\": \"双瀬聖\",\n        \"futase hikaru\": \"二瀬ひかる\",\n        \"futatsuki hisame\": \"双月氷雨\",\n        \"futatsuki kazuo\": \"2月かずお\",\n        \"futee\": \"ふてー\",\n        \"futomaki tamamo.\": \"太巻多摩も。\",\n        \"futoo\": \"フトー\",\n        \"futou ryouko\": \"不透りょうこ\",\n        \"fuuga utsura\": \"風雅うつら\",\n        \"fuurai\": \"風籟\",\n        \"fuurin\": \"ふぅりん\",\n        \"fuyo\": \"ふよ\",\n        \"fuyube rion\": \"冬部李穏\",\n        \"fuyukaze tsubasa\": \"冬風つばさ\",\n        \"fuyuki masato\": \"冬木真人\",\n        \"fuyunagi reku\": \"冬凪れく\",\n        \"fuyuno hitsuji\": \"冬野ひつじ\",\n        \"fuyuno yuno\": \"冬野由乃\",\n        \"fuyutarou\": \"ふゆたろう\",\n        \"fuyuwa kotatsu\": \"冬和こたつ\",\n        \"fuzai yumoto\": \"不在ゆもと\",\n        \"g zero\": \"Gゼロ\",\n        \"g-co\": \"G-co\",\n        \"g.g. kakeru\": \"G.G.翔\",\n        \"ga015\": \"ga015\",\n        \"gabagobogebe\": \"ガバゴボゲベ\",\n        \"gaburi\": \"ガブリ\",\n        \"gachonjirou\": \"がちょん次郎\",\n        \"gaden\": \"GADEN\",\n        \"gagarin kichi\": \"ガガーリン吉\",\n        \"gaiseisya\": \"凱聖者\",\n        \"gajirabute\": \"ガジラビュート\",\n        \"gakimagari\": \"ガキマガリ\",\n        \"gakugaku\": \"楽々\",\n        \"gamako\": \"ガマ子\",\n        \"gamma\": \"gamma\",\n        \"gamma chaos\": \"ガンマカオス\",\n        \"gamu\": \"がむ\",\n        \"gangi mari\": \"雁木麻理\",\n        \"ganmarei\": \"眼魔礼\",\n        \"gao\": \"gao\",\n        \"gara ayuri\": \"柄あゆり\",\n        \"garakuta sochi\": \"瓦落多装置\",\n        \"garou damenade\": \"画廊ダメナデ\",\n        \"garyou\": \"臥龍\",\n        \"gatari\": \"Gatari\",\n        \"gatling a\": \"ガトリングA\",\n        \"gattai soutou\": \"合体総統\",\n        \"gazeru\": \"GAZERU\",\n        \"gazetta masuda\": \"ガゼッタ増田\",\n        \"gb\": \"GB\",\n        \"ge-b\": \"ゲB\",\n        \"geboku\": \"下僕\",\n        \"gedo\": \"外道\",\n        \"gekato\": \"ゲカト\",\n        \"gekoge satoru\": \"ゲコゲさとる\",\n        \"gemuo\": \"げむお\",\n        \"gemurax\": \"じぇーむら\",\n        \"gemuta\": \"げむた\",\n        \"gen\": \"GEN | 源 | 舷\",\n        \"gengetsu\": \"玄月\",\n        \"genjirou\": \"言示弄\",\n        \"genjuroh\": \"元十郎\",\n        \"genka ichien\": \"原価壱円\",\n        \"genki tarou\": \"元気太郎\",\n        \"genkung\": \"Genkung\",\n        \"gennosuke\": \"源之助\",\n        \"genshi\": \"GENSHI\",\n        \"george\": \"ジョージ\",\n        \"geppei\": \"月餅\",\n        \"gero\": \"げろ\",\n        \"shimaki ika\": \"風巻いか\",\n        \"gesho ichirou\": \"げしょ一郎\",\n        \"geshop\": \"げしょぷ\",\n        \"gggg\": \"GGGG\",\n        \"ggrn\": \"GGRN\",\n        \"gia\": \"ギア\",\n        \"gida\": \"ぎだ\",\n        \"gigokku\": \"疑獄\",\n        \"gimako\": \"ぎまこ\",\n        \"gin\": \"ぎん\",\n        \"gin jyuji\": \"銀十字\",\n        \"gincha\": \"銀茶\",\n        \"ginga azuma\": \"銀河アズマ\",\n        \"gingitsune\": \"宇宙戦艦ヤマト\",\n        \"ginichi\": \"銀一\",\n        \"ginkamen\": \"銀仮面\",\n        \"ginko\": \"ginko\",\n        \"ginmugi\": \"銀麦\",\n        \"ginnosuke\": \"銀ノ助\",\n        \"gino\": \"Gino\",\n        \"ginseiou\": \"銀星王\",\n        \"ginta\": \"ぎん太\",\n        \"ginto\": \"吟人\",\n        \"ginzake\": \"ギンザケ\",\n        \"giro chinko-chan\": \"ギロ・チン子ちゃん\",\n        \"gisyo\": \"gisyo\",\n        \"giu\": \"ぎう\",\n        \"glastonbury1966\": \"グラストンベリー1966\",\n        \"glycerol takeru\": \"グリセリンたける\",\n        \"glyserin\": \"グリセ麟\",\n        \"gmkj\": \"GMKJ\",\n        \"go-1\": \"Go-1\",\n        \"goban\": \"ごばん\",\n        \"goblin\": \"ゴブリン\",\n        \"goblinboy\": \"kronn\",\n        \"gochou\": \"伍长\",\n        \"gody\": \"Gody\",\n        \"goggles\": \"goggles\",\n        \"gohan no otomo\": \"ごはんのおとも\",\n        \"goji\": \"ゴジ\",\n        \"gojou kurota\": \"五條くろた\",\n        \"gojou shino\": \"ごじょう忍\",\n        \"gokuraku jouko\": \"極楽浄子\",\n        \"gokurou\": \"ごくろう\",\n        \"golden\": \"ゴールデン\",\n        \"golgi bon\": \"ゴルジイ本\",\n        \"goma\": \"ごま\",\n        \"goma satoshi\": \"ごまさとし\",\n        \"gomabura\": \"ごまぶら\",\n        \"gomashi\": \"ごまし\",\n        \"gomatamago\": \"ゴマタマゴ\",\n        \"gomoku tsukune\": \"ごもくつくね\",\n        \"gomtang\": \"GomTang\",\n        \"gomu\": \"ゴム\",\n        \"gon\": \"ごん\",\n        \"gon heihachi\": \"ゴン平八\",\n        \"gonbuto\": \"ごんぶと\",\n        \"gonta\": \"ゴンタ\",\n        \"gonza\": \"gonza\",\n        \"gonzaburo-\": \"ゴンざぶろー\",\n        \"gorgon\": \"ゴルゴン\",\n        \"golgonzola\": \"ごるごんぞーら\",\n        \"goriyaku\": \"ごりやく\",\n        \"goro\": \"ごろ\",\n        \"gorogoro\": \"ゴロごろ\",\n        \"gorohati\": \"ごろはち\",\n        \"goro ichi\": \"五六壱\",\n        \"goroumaru\": \"五郎丸\",\n        \"gotakichi\": \"誤汰吉\",\n        \"goto-p\": \"ごとP\",\n        \"gotou\": \"ゴトウ\",\n        \"gotou sakaaki\": \"ごとうさかあき\",\n        \"gouda hakase\": \"ｺﾞｳﾀﾞﾊｶｾ\",\n        \"gouda nagi\": \"剛田ナギ\",\n        \"gouguru\": \"ゴーグル\",\n        \"goyac\": \"ごやっち\",\n        \"gozaemon\": \"御座衛門\",\n        \"gozaru\": \"ござる\",\n        \"gozen\": \"午前\",\n        \"gozen reiji\": \"御前零士\",\n        \"gozz\": \"gozz\",\n        \"gram\": \"グラム\",\n        \"great daikon\": \"グレイト大根\",\n        \"great magami\": \"グレート魔神\",\n        \"grey fisher\": \"グレイ・フィッシャー\",\n        \"grifon\": \"GRIFON\",\n        \"grimmelkin\": \"グリムメルキン\",\n        \"ground\": \"GROUND\",\n        \"grune\": \"Grune\",\n        \"gt\": \"GT\",\n        \"guchi wota\": \"愚痴ヲタ\",\n        \"gum\": \"ガム\",\n        \"gumbat\": \"Gumbat\",\n        \"gumi\": \"ぐみ\",\n        \"gun ryuusei\": \"群りゅうせい\",\n        \"gunnousa\": \"ぐんのうさ\",\n        \"gura\": \"ぐら\",\n        \"gure\": \"ぐれ\",\n        \"gurekan\": \"ぐれ缶\",\n        \"guri\": \"ぐり\",\n        \"guriko\": \"Guriko\",\n        \"guriko-san\": \"ぐりこ・さん\",\n        \"gushigushi maru\": \"ぐしぐし丸\",\n        \"gussan\": \"ぐっさん\",\n        \"gust-san\": \"ガストさん\",\n        \"guy\": \"GUY\",\n        \"gyakushuu takeshi\": \"逆襲武士\",\n        \"gyarin\": \"ぎゃりん\",\n        \"gyoko\": \"漁港\",\n        \"gyokro\": \"ぎょくろ\",\n        \"gyonikun\": \"魚肉ん\",\n        \"gyony\": \"Gyony\",\n        \"akatsuki kanten\": \"暁寒天\",\n        \"gyro amarume\": \"ジャイロ余目\",\n        \"gyunyu\": \"牛乳\",\n        \"gyuunyuuzaemon\": \"牛乳左卫门\",\n        \"gyuutei\": \"牛帝\",\n        \"h-h\": \"H・H\",\n        \"h9\": \"H9\",\n        \"ha-ru\": \"ha-ru\",\n        \"haba hirokazu\": \"幅ヒロカズ\",\n        \"habatakuhituji\": \"羽ばたく羊\",\n        \"habezamurai\": \"侍侍\",\n        \"habutae kyusetsu\": \"羽双重 毬雪\",\n        \"hacchake tarou\": \"はっちゃけ太郎\",\n        \"hachi\": \"はち\",\n        \"hachi duchi\": \"hachi_duchi\",\n        \"hachiko\": \"ハチコ\",\n        \"hachimitsu\": \"はちみつ\",\n        \"hachimitsu cute\": \"ハチミツキュート\",\n        \"hachiro\": \"ハチロ\",\n        \"hachiya mitsu\": \"蜂屋みつ\",\n        \"hacho\": \"はちょ\",\n        \"had\": \"ハディ\",\n        \"hadacra\": \"羽田暮\",\n        \"hafu\": \"HaFu\",\n        \"hagane soushi\": \"羽鐘そうし\",\n        \"hagane tetsu\": \"鋼鉄\",\n        \"haganemaru kennosuke\": \"鋼丸剣ノ介\",\n        \"hage\": \"はげ\",\n        \"hagetaka\": \"ハゲたか\",\n        \"hagure kedama\": \"はぐれけだま\",\n        \"hagure metal\": \"はぐれメタル\",\n        \"haiboku\": \"敗北\",\n        \"haida nanako\": \"灰田 ナナコ\",\n        \"haiiroguma\": \"はいいろぐま\",\n        \"haineken\": \"はいねけん\",\n        \"hairaito\": \"灰雷兎\",\n        \"haison\": \"haison\",\n        \"haito mitori\": \"灰都みとり\",\n        \"haitukun\": \"Haitukun\",\n        \"haizaki mejiro\": \"灰崎めじろ\",\n        \"haji\": \"ﾊｼﾞ\",\n        \"hajime\": \"創\",\n        \"hajime-san.\": \"はじめさん。\",\n        \"hajin\": \"Hajin\",\n        \"hakaba yodomu\": \"墓場淀夢\",\n        \"hakai taitei\": \"破坏大帝\",\n        \"hakano shinshi\": \"ハカノシンシ\",\n        \"hakiata\": \"はきあた\",\n        \"hakika\": \"はきか\",\n        \"hakkaku shikimi\": \"八角シキミ\",\n        \"hakoiri nekohime\": \"箱入猫姫\",\n        \"hakojima akane\": \"ハコジマアカネ\",\n        \"haku\": \"白\",\n        \"hakua ugetsu\": \"白亜右月\",\n        \"hakubun.\": \"はくぶん.\",\n        \"hakugi\": \"白義\",\n        \"hakui ami\": \"羽咋あみ\",\n        \"hakuma\": \"HAKUMA\",\n        \"hakumai gen\": \"白米玄\",\n        \"hakusui riko\": \"白水リコ\",\n        \"hakuto\": \"ハクト\",\n        \"hakutou\": \"白桃\",\n        \"hakuun\": \"はく雲\",\n        \"hakuzen\": \"白髯\",\n        \"halcachanel\": \"ハルカチャンネル\",\n        \"halco\": \"ハルコ\",\n        \"halcon\": \"はるこん\",\n        \"halfpricecelebr\": \"半額セレブ\",\n        \"hallelujah\": \"晴屋\",\n        \"halo\": \"HALO\",\n        \"halogen\": \"halogen\",\n        \"ham\": \"HAM\",\n        \"ham sausage\": \"公双誠二\",\n        \"hama\": \"はま\",\n        \"hama machisu\": \"濱まちす\",\n        \"hamada mari\": \"濱田麻里\",\n        \"hamahara yoshio\": \"浜原義雄\",\n        \"hamalu\": \"hamalu\",\n        \"hamanasu\": \"はまなす\",\n        \"hamano makoto\": \"ハマノマコト\",\n        \"hamaoka ponta\": \"浜岡ポン太\",\n        \"hamashima shigeo\": \"はましま薫夫\",\n        \"hamigaki shinji\": \"はみがきしんぢ\",\n        \"hamihe\": \"はみへ\",\n        \"hamiltan\": \"ハミルタン\",\n        \"hamuhamu\": \"ハムハム\",\n        \"hamunohito\": \"ハムの人\",\n        \"hamuta\": \"公タ\",\n        \"han\": \"HAN\",\n        \"hana\": \"花\",\n        \"hanabi21\": \"花火21\",\n        \"hanada hyou\": \"はなだひょう\",\n        \"hanada ranmaru\": \"花田蘭丸\",\n        \"hanamizawa q-tarou\": \"花見沢Q太郎\",\n        \"hanamoto ari\": \"花本アリ\",\n        \"hanamura shikika\": \"華村色花\",\n        \"hanamura shuuzou\": \"花村しゅーぞー\",\n        \"hanao\": \"はなぉ。\",\n        \"hanapin\": \"はなぴん\",\n        \"hanasaki\": \"華咲\",\n        \"hanasaku mahiru\": \"花咲まひる\",\n        \"hanataka retomo\": \"はなたかれとも\",\n        \"hanauna\": \"はなうな\",\n        \"hanazawa suou\": \"花澤すおう\",\n        \"hanchou\": \"班長\",\n        \"handa\": \"handa\",\n        \"handsofmidaz\": \"handsofmidaz\",\n        \"hane\": \"HANE\",\n        \"haneda ikao\": \"羽田いかお\",\n        \"hanee\": \"HANEE\",\n        \"hanekumo\": \"羽雲\",\n        \"hanemikakko\": \"ハネミカッコ\",\n        \"hanetsuki tokei\": \"羽月とけい\",\n        \"hanibi\": \"hanibi\",\n        \"hanikura un\": \"羽仁倉雲\",\n        \"hanini\": \"はにーに\",\n        \"haniwa pao\": \"埴輪ぱお\",\n        \"hankkwo\": \"H@nk²wo\",\n        \"hankotsu max\": \"反骨MAX\",\n        \"hanma akira\": \"範馬アキラ\",\n        \"hans\": \"hans\",\n        \"hansharu\": \"半しゃる\",\n        \"hanya\": \"Hanya\",\n        \"hanyw\": \"ハニュー\",\n        \"hanzaki jirou\": \"はんざきじろう\",\n        \"hanzawa 821\": \"半澤821\",\n        \"happamushi\": \"はっぱむし\",\n        \"hara sakeru\": \"はらさける\",\n        \"hara shigeyuki\": \"原茂之\",\n        \"hara-peco\": \"腹ペ娘\",\n        \"harada\": \"はらだ\",\n        \"haraita\": \"はらいた\",\n        \"harano\": \"原野\",\n        \"harasaki\": \"原崎\",\n        \"hardcrom\": \"hardcrom\",\n        \"harenochiame\": \"ハレノチアメ\",\n        \"hareya umako\": \"晴屋うまこ\",\n        \"hari\": \"hari\",\n        \"hariken hanna\": \"はりけんはんな\",\n        \"harimoji\": \"はりもじ\",\n        \"harino646\": \"harino646\",\n        \"haritama hiroki\": \"針玉ヒロキ\",\n        \"hariyu\": \"はりゆ\",\n        \"harry\": \"ハリー\",\n        \"haru\": \"春\",\n        \"haru z\": \"はるZ\",\n        \"haru.\": \"はる。\",\n        \"haruchika\": \"ハルチカ\",\n        \"haruemon\": \"ハルゑもん\",\n        \"harufumi\": \"ハルフミ\",\n        \"haruharu haruto\": \"春々春兎\",\n        \"haruhina murasaki\": \"春雛紫\",\n        \"haruichigo\": \"はるいちご\",\n        \"haruka\": \"はるか\",\n        \"harukami rio\": \"春上里央\",\n        \"harukaze do-jin\": \"春風道人\",\n        \"harukaze koucha\": \"春風紅茶\",\n        \"harukaze unipo\": \"春風うにぽ\",\n        \"haruken\": \"ハル犬\",\n        \"haruki\": \"春辉\",\n        \"haruma tokihiko\": \"ハルマ刻彦\",\n        \"harumari\": \"はるまり\",\n        \"kasane haruo\": \"かさね春緒\",\n        \"harumi jun\": \"春海潤\",\n        \"harumi zyun\": \"春海淳\",\n        \"haruna mao\": \"榛名まお\",\n        \"harunaga makito\": \"晴永牧兎\",\n        \"haruno yomogi\": \"春野蓬\",\n        \"harunori\": \"はるのり\",\n        \"harura\": \"はるら\",\n        \"harurun\": \"はるるん\",\n        \"haruruyuco\": \"はるるゆこ\",\n        \"harusame\": \"春雨\",\n        \"harusame kiruke\": \"榛雨きるけ\",\n        \"harusawa\": \"ハルサワ\",\n        \"harusuke\": \"春助\",\n        \"haruyoshi\": \"はるよし\",\n        \"haruyuki\": \"はるゆき\",\n        \"haryu\": \"ハリュー\",\n        \"hase yuu\": \"はせ☆裕\",\n        \"hasebe kazunari\": \"长谷部一成\",\n        \"hasebe mitsuhiro\": \"长谷部臣丈\",\n        \"hasebe souutsu\": \"はせべso鬱\",\n        \"hasegawa daisuke\": \"ハセガワダイスケ\",\n        \"hasegawa keita\": \"はせがわけいた\",\n        \"hasegawa yukino\": \"長谷川ユキノ\",\n        \"hasei agana\": \"ハセイアガナ\",\n        \"hasekura\": \"支倉\",\n        \"hasekura chiaki\": \"支倉ちあき\",\n        \"hasekura noise\": \"支倉ノイズ\",\n        \"hash\": \"hash\",\n        \"hashi cube\": \"土師キューブ\",\n        \"hashiba yachi\": \"端葉やち\",\n        \"hashikure\": \"はしくれ\",\n        \"hashimo yuki\": \"羽霜ゆき\",\n        \"hashimoto\": \"橋本\",\n        \"hashinoha\": \"はしのは\",\n        \"hasuke\": \"葉助\",\n        \"hasumi elan\": \"蓮見江蘭\",\n        \"hasumi hana\": \"羽純ハナ\",\n        \"hasumi hiro\": \"ハスミヒロ\",\n        \"hasumi tsuina\": \"蓮見ついな\",\n        \"hasuno\": \"ハスノ\",\n        \"hasunoue baitsu\": \"はすの上梅津\",\n        \"hata\": \"ハタ\",\n        \"hata jinshichi\": \"湊甚七\",\n        \"hatachi\": \"はたち\",\n        \"ekataraf\": \"エカタラフ\",\n        \"hatara\": \"HATARA\",\n        \"hatimoto\": \"鉢本\",\n        \"hato\": \"hato\",\n        \"hato no suisou\": \"ハトの水槽\",\n        \"hatoba\": \"はとば\",\n        \"hatoko\": \"ハトこ\",\n        \"hatomugi\": \"鳩むぎ\",\n        \"hatoya kobayashi\": \"ハトヤ小林\",\n        \"hatoya mameshichi\": \"鳩矢豆七\",\n        \"hatsuki kyou\": \"葉月京\",\n        \"hatsushio\": \"ハツ塩\",\n        \"kuzunoha hiroshi\": \"葛葉洋志\",\n        \"hattori\": \"ハットリ\",\n        \"hattori gorou\": \"はっとりゴロー\",\n        \"hattori masaki\": \"はっとりまさき\",\n        \"hattori mitsuka\": \"服部ミツカ\",\n        \"hatty\": \"はてぃ\",\n        \"haura shouhei\": \"葉浦昌平\",\n        \"hawkear\": \"ハウケア\",\n        \"hayabusa shingo\": \"はやぶさ真吾\",\n        \"hayahide\": \"ハヤヒデ\",\n        \"hayakawa halui\": \"早川ハルイ\",\n        \"hayakawa torinone\": \"はやかわトリノネ\",\n        \"hayama yuu\": \"羽山悠\",\n        \"hayami aya\": \"はやみあや\",\n        \"hayami kuro\": \"速水くろ\",\n        \"hayami osamu\": \"速水オサム\",\n        \"hayami rokusichi\": \"速水ろくしち\",\n        \"hayami sakura\": \"速水桜\",\n        \"hayasaka mebawe\": \"はやさかめばゑ\",\n        \"hayashi\": \"はやし\",\n        \"hayashi custom\": \"はやしけ\",\n        \"hayashi mario\": \"林マリオ\",\n        \"hayashi tsukasa\": \"はやしつかさ\",\n        \"hayuta\": \"はゆた\",\n        \"hazaka mau\": \"羽坂まう\",\n        \"hazaki\": \"ハザキ\",\n        \"hazio\": \"ハジオ\",\n        \"hazuki\": \"はづき\",\n        \"hazuki kyou\": \"葉月梗\",\n        \"hazuki shishimaru\": \"葉月獅子丸\",\n        \"hazuki yuu\": \"葉月祐\",\n        \"hazumi yae\": \"羽純やえ\",\n        \"hcwr\": \"HCWR\",\n        \"heat one\": \"ヒートワン\",\n        \"hebereke black\": \"へべれけBLACK\",\n        \"hechi\": \"へち\",\n        \"hechimabushi\": \"ヘチマ節\",\n        \"hechiumu\": \"ヘチウム\",\n        \"heguri\": \"へぐり\",\n        \"heibon kaeru\": \"平凡蛙\",\n        \"heigani\": \"兵蟹\",\n        \"heika\": \"HEIKA\",\n        \"heiya\": \"へぃや\",\n        \"heizo\": \"HEIZO\",\n        \"hekyu\": \"碧宇\",\n        \"hemachi\": \"hemachi\",\n        \"hemoglobina1c\": \"へもぐろびんA1C\",\n        \"henichi\": \"ヘンイチ\",\n        \"henshako\": \"ヘンシャコ\",\n        \"heppoko taro\": \"へっぽこ太郎\",\n        \"herahera\": \"へらへら\",\n        \"hermmy\": \"Hermmy\",\n        \"hertro\": \"Hertro\",\n        \"herunia ninja\": \"ヘルニア忍者\",\n        \"heshi\": \"HESHI\",\n        \"hews\": \"Hews\",\n        \"hhh\": \"HHH\",\n        \"hi-mosu\": \"ひ～もす\",\n        \"hiatari shin\": \"日辺しん\",\n        \"hibakichi\": \"ひばきち\",\n        \"hibiiro\": \"日々色\",\n        \"hibiki jun\": \"ひびき純\",\n        \"hibiki seiya\": \"響星哉\",\n        \"hibiki wataru\": \"響ワタル\",\n        \"hibino tomoki\": \"日比野友輝\",\n        \"hida\": \"火田\",\n        \"hida mari\": \"妃田マリ\",\n        \"hida tatsuo\": \"飛田竜夫\",\n        \"hidaka ryou\": \"ヒダカリョウ\",\n        \"hidari pory5n\": \"左ポリ5ン\",\n        \"hidarikiki\": \"左利き\",\n        \"hide\": \"___hide___\",\n        \"hidori\": \"日鳥\",\n        \"higashiyama sion\": \"東山しをん\",\n        \"higashizukihi sei\": \"東月陽西\",\n        \"hige\": \"ひげ\",\n        \"hige ojisan\": \"ヒゲおじさん\",\n        \"higemorigen\": \"ヒゲモリゲン\",\n        \"higetora\": \"髭寅\",\n        \"higuchi tsuyuhito\": \"樋口露仁\",\n        \"higure samon\": \"日暮さもん\",\n        \"hihiyama yokikana\": \"比比山よきかな\",\n        \"hiiaru\": \"ひいある\",\n        \"hiichan\": \"ひぃちゃん\",\n        \"hiiragi azato\": \"柊アザト\",\n        \"hiiragi hajime\": \"柊はじめ\",\n        \"hiiragi yuki\": \"柊ゆき\",\n        \"hiiro yuki\": \"緋色雪\",\n        \"hijikawa\": \"Hijikawa\",\n        \"hijiki\": \"ひじき\",\n        \"hijiri\": \"聖\",\n        \"hijiribashi chaki\": \"聖橋茶紀\",\n        \"hikabe sakuho\": \"ひかべさくほ\",\n        \"hikanyan\": \"ひかにゃん\",\n        \"hikari\": \"ひかり\",\n        \"hikawa hekiru\": \"氷川へきる\",\n        \"hikawa yuuki\": \"斐川悠希\",\n        \"hikeshi no kaze zimbabwe\": \"火消しの風ジンバブエ\",\n        \"hikitogu\": \"ひきとぐ\",\n        \"hiko\": \"ヒコ\",\n        \"hikou nabe\": \"飛行鍋\",\n        \"hima\": \"HIMA\",\n        \"himadara\": \"ひまだら\",\n        \"hime hajime\": \"ひめ はじめ\",\n        \"himei yoru\": \"ひめいよる\",\n        \"himekawa akira\": \"姫川明月\",\n        \"himekuri\": \"ヒめくり\",\n        \"himemiya aoi\": \"姫宮葵\",\n        \"himemiya aya\": \"姫宮あや\",\n        \"himemiya nina\": \"ひめみやにいな\",\n        \"himeno\": \"ひめの\",\n        \"himeoka yuki\": \"姫岡幸忌\",\n        \"himori tsukineko\": \"妃杜つきねこ\",\n        \"himukai yuji\": \"日向悠二\",\n        \"himura eiji\": \"緋村えいじ\",\n        \"himuro kouichi\": \"氷室光一\",\n        \"hina miruku\": \"未来みるく\",\n        \"hinadori\": \"雛鳥\",\n        \"hinagi rion\": \"緋凪りおん\",\n        \"hinaki\": \"ヒナキ\",\n        \"hinako yui\": \"比奈子惟\",\n        \"hinakuma\": \"ひなくま\",\n        \"hinamatsuri touko\": \"雛祭桃子\",\n        \"hinami\": \"ひなみ\",\n        \"hinamori yui\": \"ひなもりゆい\",\n        \"hinapo\": \"ヒナポ\",\n        \"hinase aya\": \"雛瀬あや\",\n        \"hinase kazusa\": \"ヒナセカズサ\",\n        \"hinata aimi\": \"日向アイミ\",\n        \"hinata aoi\": \"日向あおい\",\n        \"hinata karin\": \"ひなた夏鈴\",\n        \"hinata momo\": \"ひなたもも\",\n        \"hinata mutsuki\": \"ひなた睦月\",\n        \"hinata neru\": \"ひなたねる\",\n        \"hinata yagaki\": \"日向野牙樹\",\n        \"hinayori\": \"ヒナヨリ\",\n        \"hino\": \"ひの\",\n        \"hinoakimitu\": \"ヒノアキミツ\",\n        \"hinoe nami\": \"ヒノエナミ\",\n        \"hinoki\": \"ひのき\",\n        \"hinooka shuuji\": \"緋ノ丘シュウジ\",\n        \"hinori\": \"ひのり\",\n        \"hinoshima sora\": \"緋乃島空\",\n        \"hinoue itaru\": \"樋上いたる\",\n        \"hir\": \"Hir\",\n        \"hira\": \"平\",\n        \"hira taira\": \"ひらたいら\",\n        \"hiraizumi\": \"比良泉\",\n        \"hiraizumi kou\": \"ひらいずみこう\",\n        \"hiraki naori\": \"平木直利\",\n        \"hirame guard\": \"ひらめがーど\",\n        \"hirano kana\": \"平野かな\",\n        \"hirano kawajuu\": \"平野河重\",\n        \"hirano kouta\": \"平野耕太\",\n        \"hirano tsukiko\": \"平野月子\",\n        \"hiraru\": \"ヒラル\",\n        \"hirasato\": \"ヒラサト\",\n        \"hirase yuu\": \"平瀬ゆう\",\n        \"hiratsura masaru\": \"ひらつらまさる\",\n        \"hirayan\": \"ひらやん\",\n        \"hirno\": \"Hirno\",\n        \"hiro kari\": \"ひろ(仮)\",\n        \"hiro kazuki\": \"比呂カズキ\",\n        \"hirob816\": \"HiRoB816\",\n        \"hiroe rei\": \"広江礼威\",\n        \"hirogoori akio\": \"広郡明生\",\n        \"hiroichi\": \"ヒロイチ\",\n        \"hirokawa kouichirou\": \"広川浩一郎\",\n        \"hirokawa tomo\": \"緋呂河とも\",\n        \"hirokazukine\": \"HirokazuKine\",\n        \"hiroko\": \"ヒロ子\",\n        \"hiromaji\": \"ひろまじ\",\n        \"hirome\": \"ひろめ\",\n        \"hironii\": \"ひろにい\",\n        \"hirono\": \"Hirono\",\n        \"hirooki\": \"博海城\",\n        \"hiroshi\": \"ヒロシ\",\n        \"hirosue maron\": \"広末まろん\",\n        \"hirota masatane\": \"廣田眞胤\",\n        \"hiroto\": \"启人\",\n        \"hiroyama hiroshi\": \"广山弘\",\n        \"hiroyoshi\": \"ヒロヨシ\",\n        \"hiroyuki\": \"ヒロユキ\",\n        \"hiroyuki koto\": \"比呂之\",\n        \"hiryuu takahiro\": \"緋龍高弘\",\n        \"hisa\": \"ひさ\",\n        \"hisahiko\": \"久彦\",\n        \"hisakabe oto\": \"久壁おと\",\n        \"hisame\": \"氷雨\",\n        \"hisame genta\": \"氷雨げんた\",\n        \"hisano\": \"ひさの\",\n        \"hisaya\": \"久夜\",\n        \"hisayakiq\": \"ひさやききゅう\",\n        \"hishimori\": \"菱守\",\n        \"histamine c\": \"ヒスタミンC\",\n        \"hiten onee-ryuu\": \"飛天御姉流\",\n        \"hitohako\": \"人箱\",\n        \"hitokko\": \"ひとっこ\",\n        \"hitomasu modoru\": \"ヒトマスモドル\",\n        \"hitomi\": \"人見\",\n        \"hitomi aki\": \"人見あき\",\n        \"hitori jozu\": \"日盗りジョーズ\",\n        \"hitotose rin\": \"春夏秋冬鈴\",\n        \"hits\": \"ひっつ\",\n        \"hitsuji\": \"HITSUJI\",\n        \"hitsuji hako\": \"日辻ハコ\",\n        \"hitsujibane shinobu\": \"羊羽 忍\",\n        \"hitsujiko\": \"羊子\",\n        \"hitsujin\": \"ひつじん\",\n        \"hitsujinx\": \"ヒツジンクス\",\n        \"hitsuki\": \"ひつき\",\n        \"hiviki.n\": \"Hiviki.N\",\n        \"hiwatari rin\": \"樋渡りん\",\n        \"hiya\": \"Hiya\",\n        \"hiyama chiaki\": \"桧山千秋\",\n        \"hiyo hiyo\": \"ひよひよ\",\n        \"hiyocco\": \"hiyocco\",\n        \"hiyoko daiou\": \"ひよこ大王\",\n        \"hiyoko.\": \"ひよこ。\",\n        \"hiyokomame\": \"ひよこまめ\",\n        \"hiyou\": \"飛熊\",\n        \"hiyozakura\": \"ひよざくら\",\n        \"hizaka\": \"ひざか\",\n        \"hizaki ryuuta\": \"ひざきりゅうた\",\n        \"hjb\": \"HJB\",\n        \"hobilo\": \"Hobilo\",\n        \"hobo3\": \"ほぼ3\",\n        \"hohehohe\": \"ほへほへ\",\n        \"hoihoi\": \"hoihoi\",\n        \"hoimin\": \"ホイミン\",\n        \"hojo\": \"hojo\",\n        \"hokage\": \"ほかげ\",\n        \"hokagemio\": \"ホカゲミオ\",\n        \"hokku\": \"ホック\",\n        \"hokuna rin\": \"北那リン\",\n        \"hokuro ryuseigun\": \"ホクロ流星群\",\n        \"hokuto\": \"北斗\",\n        \"homaderi\": \"ほまでり\",\n        \"homra\": \"homra\",\n        \"honda formalin\": \"本田ホルマリン\",\n        \"honda hajime\": \"本田基\",\n        \"honda mitsuru\": \"本多みつる\",\n        \"honda naoki\": \"本田直樹\",\n        \"honda negi\": \"本田ねぎ\",\n        \"honda opon\": \"本田おぽん\",\n        \"hone\": \"ホネ\",\n        \"honebuto danshaku\": \"骨太男爵\",\n        \"honewo arukemita\": \"ホネヲ・アルケミタ\",\n        \"honey-usako\": \"はにいうさこ\",\n        \"honjou masato\": \"本庄マサト\",\n        \"honmachi keisuke\": \"本町圭祐\",\n        \"honnori\": \"ほんのり\",\n        \"honnouchi honoji\": \"本能血ホノジ\",\n        \"honoka\": \"萌香\",\n        \"honokun\": \"ほのくん\",\n        \"honoutsukai\": \"炎使\",\n        \"hontai bai\": \"本体売\",\n        \"hontoku\": \"ホン・トク\",\n        \"honya\": \"ほにゃー\",\n        \"hoono yurumu\": \"頬乃ゆるむ\",\n        \"hoosaku\": \"ほ～さく\",\n        \"hoppege\": \"ほっぺげ\",\n        \"hora\": \"法螺\",\n        \"hori hiraki\": \"堀ヒラキ\",\n        \"horie\": \"ホリエ\",\n        \"horie tankei\": \"堀江耽閨\",\n        \"horiguchi\": \"ホリグチ\",\n        \"horikawa kyo\": \"堀川◆キョウ\",\n        \"horikiri haruto\": \"堀切ハルト\",\n        \"horimoto akira\": \"ほりもとあきら\",\n        \"hormone\": \"ホルモン\",\n        \"horo makoto\": \"幌真人\",\n        \"horosuke\": \"ホロすけ\",\n        \"hosaka takemaru\": \"保坂たけまる\",\n        \"hosaka yuuichi\": \"ほさかゆーいち\",\n        \"hoshi nohara\": \"ほしのはら\",\n        \"hoshiduki akira\": \"星月晃\",\n        \"hoshiduki melon\": \"星月めろん\",\n        \"hoshieda\": \"ほしえだ\",\n        \"hoshifuri\": \"ホシフリ\",\n        \"hoshikawa atsuki\": \"星河あつき\",\n        \"hoshikawa kirara\": \"ほしかわきらら\",\n        \"hoshimoto piero\": \"星本ピエロ\",\n        \"hoshina\": \"ほしな\",\n        \"hoshino cobato\": \"星野小鳩\",\n        \"hoshino kabi\": \"ホシノカビ\",\n        \"hoshino lala\": \"星野ララ\",\n        \"hoshino nia\": \"星野ニア\",\n        \"hoshioki\": \"ホシオキ\",\n        \"hoshizaki ryuu\": \"星崎龍\",\n        \"hoshizora\": \"星空\",\n        \"hosikawa tukimi\": \"星川月海\",\n        \"hosizora mikoto\": \"星空ミコト\",\n        \"hosoi kouzou\": \"細井コウゾウ\",\n        \"hosokawa fuziemon\": \"細川ふじえもん\",\n        \"hot\": \"HOT\",\n        \"hot melon\": \"Hot Melon\",\n        \"hota.\": \"ほた。\",\n        \"hotaru\": \"蛍\",\n        \"hotarugusa\": \"ほたる草\",\n        \"hotei kazuha\": \"保汀一葉\",\n        \"hotori\": \"歩鳥\",\n        \"houga\": \"芳芽\",\n        \"houhokekiyo\": \"ホウホケキヨ\",\n        \"houmitsu\": \"方密\",\n        \"houou-tan\": \"鳳凰たん\",\n        \"houruri\": \"蓬瑠璃\",\n        \"housubaru\": \"鳳スバル\",\n        \"houtei kara\": \"法廷から\",\n        \"hozumi takashi\": \"Hozumi Takashi\",\n        \"hozumi touzi\": \"八月一日冬至\",\n        \"hplay\": \"Hplay\",\n        \"hroz\": \"ふろず\",\n        \"htg\": \"htg\",\n        \"huet\": \"Huet\",\n        \"hujinon\": \"ふじのん\",\n        \"hukidamari\": \"吹溜\",\n        \"hukokukyohei\": \"腐国狂兵\",\n        \"hukuhukuan\": \"福々餡\",\n        \"humei\": \"フメイ\",\n        \"humi\": \"ふみ\",\n        \"humiu\": \"ふみぅ\",\n        \"humizuki\": \"Humizuki\",\n        \"huracan\": \"うらかん\",\n        \"hutoshi\": \"ふとし\",\n        \"huupo\": \"フーポ\",\n        \"huyukiti\": \"冬吉\",\n        \"huzinami kaoru\": \"藤波薫\",\n        \"hyaku\": \"ヒャク\",\n        \"hyakuen\": \"hyakuen\",\n        \"hyakuhachi\": \"ひゃくはち\",\n        \"hyakushiki cheerio\": \"百式テリヲ\",\n        \"hydrant\": \"HYDRANT\",\n        \"hyouga.\": \"ひょうが。\",\n        \"hyouju issei\": \"氷樹一世\",\n        \"hyoukai\": \"氷海\",\n        \"hypar\": \"Hypar\",\n        \"hyper unko cannon\": \"ハイパーウンコキャノン\",\n        \"hypno sushi\": \"ひぷの寿司\",\n        \"hyudora\": \"ヒュドラ\",\n        \"hyung tae kim\": \"김형태\",\n        \"hyuuga azuri\": \"日向あずり\",\n        \"iapoc\": \"IAPOC\",\n        \"ibn\": \"Ibn\",\n        \"ibonnu\": \"イボンヌ\",\n        \"ibu hidekichi\": \"伊武秀吉\",\n        \"ibuki pon\": \"息吹ポン\",\n        \"ibukichi\": \"いぶきち\",\n        \"iburo.\": \"いぶろー。\",\n        \"ica\": \"ica\",\n        \"icelee\": \"IceLee\",\n        \"ichi\": \"ichi\",\n        \"ichi ume\": \"いちうめ\",\n        \"ichi-san\": \"いち\",\n        \"ichiboshi\": \"イチボシ\",\n        \"ichie ryouko\": \"一恵りょうこ\",\n        \"ichiei\": \"一栄\",\n        \"ichifuji nitaka\": \"壱藤弐鷹\",\n        \"ichigo\": \"いちご\",\n        \"ichigo mark\": \"いちごまぁく\",\n        \"ichigo.\": \"いちご。\",\n        \"ichiha\": \"いちは\",\n        \"ichihara kazuma\": \"市原和真\",\n        \"ichii akira\": \"いちい瑛\",\n        \"ichika\": \"いちか\",\n        \"ichikawa\": \"市川\",\n        \"ichikawa ichiko\": \"市川いちこ\",\n        \"ichikawa kazuhide\": \"市川和秀\",\n        \"ichikawa ryuunosuke\": \"壱河柳乃助\",\n        \"ichikawa yayoi\": \"イチカワヤヨイ\",\n        \"ichiki tomoe\": \"壱樹ともえ\",\n        \"ichimai ugou\": \"一枚烏合\",\n        \"ichimedou\": \"いちめどー\",\n        \"ichimi\": \"いちみ\",\n        \"ichimi tougarashi\": \"いちみとうがらし\",\n        \"ichimonji mutsuki\": \"一文字睦月\",\n        \"ichinashi kimi\": \"市梨きみ\",\n        \"ichino\": \"いちの\",\n        \"ichinomiya kazusa\": \"一ノ宮かずさ\",\n        \"ichinose\": \"イチノセ\",\n        \"ichiokunen wakusei\": \"1億年惑星\",\n        \"ichiro\": \"一滝\",\n        \"ichitaka\": \"いちたか\",\n        \"ichiya\": \"一夜\",\n        \"ichiya koutei\": \"いちや皇帝\",\n        \"icica\": \"いちか\",\n        \"id-ed\": \"ID-ED\",\n        \"idogawa\": \"井戸川\",\n        \"iduki\": \"いづき\",\n        \"idumi minami\": \"いづみみなみ\",\n        \"ie gami\": \"いえがみ\",\n        \"ieda kirizen\": \"家田キリゼン\",\n        \"ifnil\": \"IFNIL\",\n        \"ifpark\": \"ifpark\",\n        \"ifuji shinsen\": \"いふじシンセン\",\n        \"igakino agenasu\": \"井垣野あげなす\",\n        \"igan seijin\": \"胃がん星人\",\n        \"iganseijin\": \"胃がん星人\",\n        \"ignica\": \"ignica\",\n        \"iguchi takajin\": \"井口たかじん\",\n        \"igusa shunrou\": \"井草春朗\",\n        \"ihara tatsuya\": \"伊原達矢\",\n        \"iida toyoyuki\": \"いいだ豊雪\",\n        \"iihama daka\": \"飯浜ダカ\",\n        \"iinano\": \"いいなの\",\n        \"iino haseru\": \"イイノ　ハセル\",\n        \"iio tetsuaki\": \"飯尾鉄明\",\n        \"iio tetsuomi\": \"飯尾哲臣\",\n        \"mesiyama\": \"飯山\",\n        \"iiyo koiyo\": \"伊々代恋夜\",\n        \"iiyon\": \"いいよん\",\n        \"iizuki tasuku\": \"唯々月たすく\",\n        \"ijiro suika\": \"居城スイカ\",\n        \"ika\": \"いか\",\n        \"ikagawa shirou\": \"いかがわ四郎\",\n        \"ikanomaru\": \"イカノマル\",\n        \"ikasumi bokuju\": \"イカスミぼくじゅー\",\n        \"ikeda jun\": \"池田淳\",\n        \"ikeda shuuko\": \"池田秀子\",\n        \"ikeda usao\": \"イケダウサオ\",\n        \"ikeda yasuhiro\": \"池田靖宏\",\n        \"ikeden\": \"いけでん\",\n        \"ikelag\": \"ikelag\",\n        \"iken\": \"イケン\",\n        \"ikoma ippei\": \"伊駒一平\",\n        \"iktk\": \"イキテク\",\n        \"iku\": \"郁\",\n        \"ikue fuji\": \"幾枝風児\",\n        \"ikuhashi muiko\": \"郁橋むいこ\",\n        \"ikuma satsuki\": \"伊久間さつき\",\n        \"ikuno harusame\": \"生野ハルサメ\",\n        \"ikura gunkan\": \"いくら軍艦\",\n        \"ikurumi bill\": \"生王ビル\",\n        \"ikuta takanon\": \"いくたたかのん\",\n        \"ikuwiron\": \"イクヰロン\",\n        \"ikuyoan\": \"ikuyoan\",\n        \"illi\": \"ILLI\",\n        \"imacchi\": \"いまっち\",\n        \"imachi reki\": \"居待暦\",\n        \"imaden\": \"いまでん\",\n        \"imagawa akira\": \"今川あきら\",\n        \"imai hanako\": \"イマイ\",\n        \"imai riho\": \"今井里穂\",\n        \"imaichi\": \"居妹治\",\n        \"imaima sayuki\": \"今々沙雪\",\n        \"imaizumi atsushi\": \"いまいずみあつし\",\n        \"imaka hideki\": \"いまかひでき\",\n        \"imaki hitotose\": \"春夏秋冬\",\n        \"imari\": \"伊万里\",\n        \"imawano lem\": \"忌野Lem\",\n        \"imazon\": \"今ゾン\",\n        \"imiju\": \"寒天\",\n        \"imotarei\": \"イモタレ\",\n        \"imozuka panikuru\": \"芋塚ぱにくる\",\n        \"imperial boy\": \"帝国少年\",\n        \"inaba fuyuki\": \"稲場冬樹\",\n        \"inaba sunimi\": \"いなばすにみ\",\n        \"inaho\": \"稲穂\",\n        \"inai\": \"居内\",\n        \"iname\": \"稲芽\",\n        \"inami heil\": \"伊波ハイル\",\n        \"inari kinzou\": \"稲荷金蔵\",\n        \"inari.\": \"ゐなり。\",\n        \"inasaki shirau\": \"稲咲しらう\",\n        \"inase shinya\": \"稲瀬信也\",\n        \"inax\": \"INAX\",\n        \"inayama\": \"稲山\",\n        \"infraton\": \"インフラトン\",\n        \"ingamorugu\": \"いんがもるぐ\",\n        \"ingram 97\": \"いんぐらむ'97\",\n        \"ini\": \"イニ\",\n        \"initsukkii\": \"いにつっきー\",\n        \"inkey\": \"inkey\",\n        \"ino-ki\": \"ino-ki\",\n        \"ino.\": \"ino.\",\n        \"inode\": \"いので\",\n        \"inoino\": \"inoino\",\n        \"inono\": \"inono\",\n        \"inori\": \"いのり\",\n        \"inoshita\": \"いのした\",\n        \"inoue junichi\": \"井上純一\",\n        \"inoue kiyoshi\": \"井上清\",\n        \"inoue mitan\": \"いのうえみたん\",\n        \"inoue takuya\": \"いのうえたくや\",\n        \"inoue tommy\": \"いのうえとみい\",\n        \"inoue yuki\": \"イノウエユキ\",\n        \"inseki 3gou\": \"隕石3号\",\n        \"inu g\": \"犬G\",\n        \"inu-blade\": \"犬ブレード\",\n        \"inuboe\": \"狗吠\",\n        \"yoshino hodaka\": \"吉野ホダカ\",\n        \"inuburo\": \"いぬぶろ\",\n        \"inucreamice\": \"いぬくりぃむあいす\",\n        \"inuduka takeru\": \"犬塚毅\",\n        \"inufuro\": \"いぬふろ\",\n        \"inugahora an\": \"犬洞あん\",\n        \"inugai shin\": \"犬凱新\",\n        \"inugami johnny\": \"犬神じょにー\",\n        \"inugami naoyuki\": \"犬神尚雪\",\n        \"inugami nepia\": \"犬上ねぴあ\",\n        \"inui haruka\": \"乾はるか\",\n        \"inui nui\": \"乾ぬい\",\n        \"inui sekihiko\": \"犬威赤彦\",\n        \"inukai\": \"犬飼\",\n        \"inukkoro\": \"いぬっころ\",\n        \"inukon geek.\": \"いぬこんぎーく。\",\n        \"inumaru\": \"犬丸\",\n        \"inumimi moeta\": \"犬耳もえ太\",\n        \"inumori sayaka\": \"犬森サヤカ\",\n        \"inunare\": \"inunare\",\n        \"inuyashiki\": \"犬屋敷\",\n        \"inuzuka bouru\": \"犬塚ボウル\",\n        \"inyucchi\": \"いにゅっち\",\n        \"io takuya\": \"射尾卓弥\",\n        \"iogi juichi\": \"井荻寿一\",\n        \"ippachi\": \"いっぱち\",\n        \"ippon\": \"一本\",\n        \"iri\": \"イリ\",\n        \"irie\": \"IRIE\",\n        \"irie yamazaki\": \"IRIE YAMAZAKI\",\n        \"iripyon\": \"いりぴょん\",\n        \"iroen\": \"いろえん\",\n        \"iroha\": \"いろは\",\n        \"irohane sui\": \"彩羽スイ\",\n        \"iroito\": \"色糸\",\n        \"irotsuya\": \"いろつや\",\n        \"irua\": \"irua\",\n        \"iruka\": \"Iruka\",\n        \"isada\": \"伊佐田\",\n        \"isaki\": \"伊佐木\",\n        \"isaki uta\": \"伊咲ウタ\",\n        \"isao\": \"isao\",\n        \"isato\": \"イサト\",\n        \"ise.\": \"いせ。\",\n        \"iseki\": \"いせき\",\n        \"isemagu\": \"いせマグ\",\n        \"iseno yajin\": \"いせのやじん\",\n        \"ishibashi shingo\": \"石橋シンゴ\",\n        \"ishida masayuki\": \"石田麻茶行\",\n        \"ishigaki takashi\": \"イシガキタカシ\",\n        \"ishigana\": \"いしがな\",\n        \"ishihara kouhei\": \"石原浩平\",\n        \"ishihara souka\": \"石原そうか\",\n        \"ishikawa kingyo\": \"石川きんぎょ\",\n        \"ishikkoro\": \"石っころ\",\n        \"ishimu\": \"イシム\",\n        \"ishino kanon\": \"石野鐘音\",\n        \"ishioto\": \"Ishioto\",\n        \"ishitoku\": \"イシトク\",\n        \"ishitomo ren\": \"いしとも蓮\",\n        \"ishizuchi ginko\": \"石鎚ぎんこ\",\n        \"isiyama kosuke\": \"石山コースケ\",\n        \"island\": \"あいらんど\",\n        \"isna\": \"イスナ\",\n        \"iso nogi\": \"磯乃木\",\n        \"isogani\": \"イソガニ\",\n        \"isoroku\": \"いそろく\",\n        \"isoya kashi\": \"磯谷かし\",\n        \"isshi taira\": \"いっしたいら\",\n        \"isshiki nishiki\": \"一敷錦\",\n        \"issi-13\": \"イッシー13\",\n        \"isuke gratanity\": \"イスケ・グラタニティー\",\n        \"isutasshu\": \"イスタッシュ\",\n        \"isutoshi\": \"ISUTOSHI\",\n        \"isya\": \"isya\",\n        \"it\": \"イット\",\n        \"itachou\": \"いたちょう\",\n        \"itaku\": \"イタク\",\n        \"itami\": \"伊丹\",\n        \"itamochi\": \"板餅\",\n        \"itaya satoruno\": \"板谷さとるの\",\n        \"ithino li\": \"一ノらい\",\n        \"ito\": \"いとう\",\n        \"ito ichizo\": \"伊藤一蔵\",\n        \"ito katsumi\": \"いとう克巳\",\n        \"ito ryusei\": \"伊藤隆生\",\n        \"itoh kani\": \"伊藤蟹\",\n        \"itome\": \"糸目\",\n        \"itotin\": \"itotin\",\n        \"itou ben\": \"伊藤ベン\",\n        \"itou hiromine\": \"伊東聖峰\",\n        \"itou jin\": \"イトウヂン\",\n        \"itou makoto\": \"伊藤誠\",\n        \"itou puriso\": \"伊藤プリソ\",\n        \"itou satera\": \"伊藤サテラ\",\n        \"itou souichi\": \"伊藤宗一\",\n        \"itoyoko\": \"ITOYOKO\",\n        \"itsuki\": \"いつき\",\n        \"itsuki kousuke\": \"いつきこうすけ\",\n        \"itsuki mai\": \"イツキ舞\",\n        \"itsuki makoto\": \"いつきまこと\",\n        \"itsuki tsukune\": \"樹つくね\",\n        \"itto\": \"一十\",\n        \"iuro\": \"ゆうろ\",\n        \"iwai takeshi\": \"祝たけし\",\n        \"iwaki amami\": \"磐城あまみ\",\n        \"iwama yoshiki\": \"いわまよしき\",\n        \"iwami shouko\": \"石見翔子\",\n        \"iwano\": \"いわの\",\n        \"iwanori\": \"いわのり\",\n        \"iwao naoto\": \"岩尾尚人\",\n        \"iwasaki hiromasa\": \"岩崎啓眞\",\n        \"iwasaki takashi\": \"いわさきたかし\",\n        \"iwashita\": \"いわした\",\n        \"iwatsuki aware\": \"岩月あわれ\",\n        \"iyoda mato\": \"伊与田まと\",\n        \"iyohara kansuke\": \"伊予原勘助\",\n        \"iyutani\": \"iyutani\",\n        \"izuki jirou\": \"戌月ジロウ\",\n        \"izumi aki\": \"和泉あき\",\n        \"izumi kyouta\": \"いずみきょうた\",\n        \"izumi masashi\": \"和泉まさし\",\n        \"izumi rion\": \"和泉リオン\",\n        \"izumi tomoki\": \"泉ともき\",\n        \"izumi yakumo\": \"和泉八雲\",\n        \"izumi yayoi\": \"和泉弥生\",\n        \"izumi yoshikazu\": \"和泉美和\",\n        \"izumi yukiru\": \"和泉ゆきる\",\n        \"izumikado kou\": \"泉門コウ\",\n        \"izumimipu\": \"いずみみぷ\",\n        \"izumo kuutarou\": \"出雲空太郎\",\n        \"izumo ryo\": \"出雲りょう\",\n        \"izuna kazuki\": \"Izuna Kazuki\",\n        \"izuna masaru\": \"飯綱まさる\",\n        \"izure\": \"いづれ\",\n        \"izurumi\": \"いづるみ\",\n        \"izushi juunin\": \"出石十人\",\n        \"j\": \"ジェイ\",\n        \"j kakeru\": \"ジョウ・カケル\",\n        \"j-max japan\": \"J-MAX JAPAN\",\n        \"j.c.pandam\": \"J・C・パンダム\",\n        \"j.sairo\": \"J・さいろー\",\n        \"jack\": \"ジャック\",\n        \"jack auber\": \"ジャック・アウバー\",\n        \"rapscallion\": \"Rapscallion\",\n        \"jack hamster\": \"ジャック・ハムスター\",\n        \"jacky\": \"Jacky\",\n        \"jacky knee-san\": \"ジャッキーニーさん\",\n        \"jaguar imoko\": \"ジャガー芋子\",\n        \"jajala\": \"ジャジャラ\",\n        \"jakko\": \"じゃっこ\",\n        \"jakomaru\": \"じゃこまる\",\n        \"jakoten\": \"じゃこてん\",\n        \"jakuwa\": \"邪鍬\",\n        \"jam ouji\": \"ジャム王子\",\n        \"jambread\": \"Jambread\",\n        \"james\": \"ジェームス\",\n        \"james hardiman\": \"skunkworks\",\n        \"jas\": \"JAS\",\n        \"jason\": \"J村\",\n        \"jax2o\": \"じゃじゃお\",\n        \"jd\": \"jd\",\n        \"jean louis\": \"ジャン・ルイ\",\n        \"jellytits7\": \"JellyTits7\",\n        \"jema\": \"jema\",\n        \"jet\": \"JET\",\n        \"jeter\": \"ジーター\",\n        \"ji yuuyuu\": \"じゆうゆう\",\n        \"jiba tenko\": \"じばてんこ\",\n        \"jigoku\": \"jigoku\",\n        \"jigoku sensei hirobe\": \"地獄先生ひろべ～\",\n        \"jii\": \"ぢぃ\",\n        \"jii jii sachira\": \"じーじー☆さちら\",\n        \"jiji\": \"じじ\",\n        \"jils\": \"JILS\",\n        \"jimi sakita\": \"ジミサキタ\",\n        \"jimo\": \"じも\",\n        \"jinbaku-ryuoh\": \"神爆龍王\",\n        \"jingai modoki\": \"人外モドキ\",\n        \"jingo kajiki\": \"神護カジキ\",\n        \"jingrock\": \"甚六\",\n        \"jinkennashi tarou\": \"人権なし太郎\",\n        \"jinmu hirohito\": \"神武裕仁\",\n        \"jinnai jun\": \"陣内潤\",\n        \"jino\": \"じーの\",\n        \"jiro\": \"JIRO\",\n        \"jirou\": \"ジロウ\",\n        \"jiseki\": \"ジセキ\",\n        \"jita\": \"爺太\",\n        \"jitsuyou shinshiki\": \"実用新式\",\n        \"jjj\": \"JJJ\",\n        \"jjune\": \"JJune\",\n        \"joey hentai\": \"Contact\",\n        \"john k. pe-ta\": \"ジョン・K・ペー太\",\n        \"johnnie\": \"じょにぃ\",\n        \"johnny\": \"じょにー\",\n        \"johnson\": \"ジョンソン\",\n        \"jomae\": \"錠間江\",\n        \"jomo\": \"じょも\",\n        \"jon\": \"じょん\",\n        \"jon ozaki\": \"ジョン尾崎\",\n        \"jordi\": \"じょるでぃ\",\n        \"joumu\": \"条夢\",\n        \"jovejun.\": \"じょぶじゅん。\",\n        \"jude\": \"jude\",\n        \"jumping dogeza\": \"ジャンピング土下座\",\n        \"jungfrau\": \"Jungfrau\",\n        \"junji\": \"じゅんじぃ\",\n        \"junko\": \"淳子\",\n        \"jura\": \"樹羅\",\n        \"juri reiqa\": \"樹莉麗華\",\n        \"jusc0\": \"jusc0\",\n        \"justy\": \"Justy\",\n        \"juubaori mashumaro\": \"十羽織ましゅまろ\",\n        \"juugatsu\": \"十月\",\n        \"juuji\": \"拾次\",\n        \"juunigatsu shoujo\": \"十二月少女\",\n        \"juurouta\": \"十郎太\",\n        \"juusangatsu\": \"拾参月\",\n        \"jyom\": \"jyom\",\n        \"jyouden\": \"ジョウデン\",\n        \"jyujyo\": \"銃丈\",\n        \"jyunintoiro\": \"獣人といろ\",\n        \"jyura\": \"じゅら\",\n        \"jyuuji\": \"拾次\",\n        \"k no ji\": \"Kの字\",\n        \"k-nattou\": \"K‐なっとう\",\n        \"k-you\": \"K-you\",\n        \"k-zima\": \"圭島瞬里\",\n        \"k. k usako\": \"k.kうさこ\",\n        \"k2 dorachan\": \"K2ドラちゃん\",\n        \"k2isu\": \"ケィス\",\n        \"k3\": \"K3\",\n        \"kabaki\": \"kabaki\",\n        \"kabane\": \"カバネ\",\n        \"kabaya kosuke\": \"樺矢耕助\",\n        \"kabayaki unagi\": \"蒲焼鰻\",\n        \"kabocha head\": \"かぼちゃヘッド\",\n        \"kabocya torute\": \"南瓜とるて\",\n        \"kabotyausagi\": \"かぼちゃ兎\",\n        \"kabuki shigeyuki\": \"香吹茂之\",\n        \"kaburaya seiden\": \"鏑矢正伝\",\n        \"kachoufuugetsu\": \"花鳥風月\",\n        \"kadita\": \"かぢ太\",\n        \"kadokura tomomi\": \"門倉ともみ\",\n        \"kadomaki shinnosuke\": \"門巻森乃介\",\n        \"kadomaru tsubura\": \"角丸つぶら\",\n        \"kadota hisashi\": \"角田ひさし\",\n        \"kadou\": \"カドウ\",\n        \"kaduki\": \"かづき\",\n        \"kaduki ryo\": \"香月稜\",\n        \"kaede kaeru\": \"楓蛙\",\n        \"kaede minoru\": \"カエデミノル\",\n        \"kaen miso\": \"火炎味噌\",\n        \"kaeru\": \"小松菜屋\",\n        \"kaeru neko\": \"かえるねこ\",\n        \"kaerudon\": \"カエル丼\",\n        \"kaeruyama yoshitaka\": \"蛙山芳隆\",\n        \"kagajou hiroki\": \"加賀城ヒロキ\",\n        \"kagami\": \"嘉臥深\",\n        \"kagami mochi\": \"かがみもち\",\n        \"kagami uekusa\": \"鏡植草\",\n        \"kagari\": \"kagari\",\n        \"kagari touya\": \"篝とうや\",\n        \"kagawa tomonobu\": \"矢野たくみ\",\n        \"kage oi\": \"影追い\",\n        \"kagehara hanzou\": \"影原半蔵\",\n        \"kageira\": \"カゲイラ\",\n        \"daigaijin\": \"Daigaijin\",\n        \"kagemusya\": \"KAGEMUSYA\",\n        \"kagerou1991\": \"陽炎1991\",\n        \"kagesaki yuna\": \"影崎由那\",\n        \"kageshio\": \"カゲシオ\",\n        \"kageusu gokuto\": \"影薄獄人\",\n        \"kagiana\": \"鍵穴\",\n        \"kagimushi\": \"かぎむし\",\n        \"kagiyama ryuta\": \"鍵山りゅうた\",\n        \"kagome\": \"籠目\",\n        \"kagura\": \"神楽\",\n        \"kagura kazuto\": \"神楽一刀\",\n        \"kagura momiji\": \"神楽紅葉\",\n        \"kagura nisiki\": \"神楽弐式\",\n        \"kagura takeshi\": \"神楽武志\",\n        \"kagura tsukune\": \"神楽つくね\",\n        \"kagura yutakamaru\": \"神楽雄隆丸\",\n        \"kagura yuuki\": \"かぐらゆうき\",\n        \"kagura yuuto\": \"神楽優人\",\n        \"kagurazaka nagu\": \"神楽坂なぐ\",\n        \"kagurazaka saki\": \"神楽坂沙希\",\n        \"kahasina\": \"川科\",\n        \"kahlua suzuki\": \"カルーア鈴木\",\n        \"kai\": \"改\",\n        \"kai makoto\": \"櫂まこと\",\n        \"kaibara keiya\": \"海原圭哉\",\n        \"kaibara you\": \"海原由布\",\n        \"kaibutsu o koeta kaibutsu\": \"怪物を超えた怪物\",\n        \"kaida michi\": \"海田路\",\n        \"kaidiu\": \"かいぢう\",\n        \"kaidou\": \"海道\",\n        \"kaidou j1\": \"蚕堂j1\",\n        \"kaidou mizuki\": \"海棠深月\",\n        \"kaiga\": \"kaiga\",\n        \"kaigun santouhei\": \"怪軍三等兵\",\n        \"kaika\": \"Kaika\",\n        \"kaiko\": \"初音\",\n        \"kaim\": \"kaim\",\n        \"kaiou\": \"悔王\",\n        \"kairakuen umeka\": \"快楽園梅香\",\n        \"kairi\": \"魁李\",\n        \"kaishaku\": \"介錯\",\n        \"kaishundou\": \"回春堂\",\n        \"kaisoku babangita\": \"快足ババンギタ\",\n        \"kaito shirou\": \"海都しろー\",\n        \"kaitou pink\": \"かいとうぴんく\",\n        \"kaizu\": \"かいず\",\n        \"kaji naoki\": \"梶なおき\",\n        \"kajimura kajima\": \"かじむらカジマ\",\n        \"kajitsu\": \"果実\",\n        \"kajiura\": \"かじうら\",\n        \"kajiwara chihaya\": \"梶原千早\",\n        \"kajiyama hiroshi\": \"梶山浩\",\n        \"kaka otoko\": \"カカ男\",\n        \"kakashi asahiro\": \"かかし朝浩\",\n        \"kakei asato\": \"筧あさと\",\n        \"kakenari\": \"kakenari\",\n        \"kakenashi\": \"かけなし\",\n        \"kakeru\": \"KAKERU\",\n        \"kakiemon\": \"カキえもん\",\n        \"kakino nashiko\": \"柿野なしこ\",\n        \"kakinomoto utamaro\": \"柿ノ本歌麿\",\n        \"kakitamajiru\": \"かきたま汁\",\n        \"kakitsubata kanae\": \"杜若かなえ\",\n        \"kakitsubata tsukune\": \"杜若つくね\",\n        \"kakizaki\": \"柿崎\",\n        \"kakka hideto\": \"活火秀人\",\n        \"kakudai\": \"カクダイ\",\n        \"kakugari ani\": \"カクガリ兄\",\n        \"kakuka\": \"かくか\",\n        \"kakutou oukoku\": \"格闘王国\",\n        \"kakuzato yun\": \"角砂糖ゆん\",\n        \"kakyouin chiroru\": \"華京院ちろる\",\n        \"kamado\": \"かまど\",\n        \"kamata\": \"かまた\",\n        \"kamatori pokari\": \"かまとりぽかり\",\n        \"kame\": \"かめ\",\n        \"kamehama takeshi\": \"亀浜たけし\",\n        \"kamei\": \"仮名\",\n        \"kamei kaori\": \"亀井香里\",\n        \"kamekichi\": \"かめ吉\",\n        \"kameponde\": \"カメポンデ\",\n        \"kami\": \"kami\",\n        \"kamimiya\": \"神宮\",\n        \"kamidou haruki\": \"神堂ハルキ\",\n        \"kamiishi nyny\": \"上石ニーニー\",\n        \"kamiishi sono\": \"神石その\",\n        \"kamikaze\": \"Kamikaze\",\n        \"kamikaze miyabi\": \"神風雅\",\n        \"kamimaki enpitsu\": \"紙巻エンピツ\",\n        \"kaminaru fuyu\": \"神鳴る冬\",\n        \"kamino ryu-ya\": \"上乃龙也\",\n        \"kamio 96\": \"神尾96\",\n        \"kamiryou kaduki\": \"上嶺榎月\",\n        \"kamisae ryouya\": \"上冴良夜\",\n        \"kamisato takeharu\": \"上里竹春\",\n        \"kamishima akira\": \"剃嶋章\",\n        \"kamishima tatsuya\": \"神嶋龍矢\",\n        \"kamishima yu\": \"神島悠\",\n        \"kamishiro midorimaru\": \"カミシロ緑マル\",\n        \"kamisori\": \"かみそり\",\n        \"kamita\": \"かみ田\",\n        \"kamitou masaki\": \"上藤政樹\",\n        \"kamitsuki shion\": \"神月紫苑\",\n        \"kamiya karin sakurako\": \"神谷迦麟桜子\",\n        \"kamiya naoya\": \"神谷尚哉\",\n        \"kamiya ogawa\": \"神宮小川\",\n        \"kamiya tomoe\": \"神谷ともえ\",\n        \"kamiyama aya\": \"神山彩\",\n        \"kamiyoshi\": \"神吉\",\n        \"kamizaki yotsuba\": \"上崎よつば\",\n        \"kamizawa reiji\": \"神沢零司\",\n        \"kamizono\": \"かみぞの\",\n        \"kamotama\": \"かもたま\",\n        \"kamui aya\": \"神居あや\",\n        \"kan\": \"環\",\n        \"kan da chi\": \"かん(だ)ち\",\n        \"kan koromoya\": \"寒衣屋\",\n        \"kana\": \"カナ\",\n        \"kanade sou\": \"奏奏\",\n        \"kanae\": \"かなえ\",\n        \"kanahito\": \"かなひと\",\n        \"kanaisei jitenshasougyou\": \"家内制自転車操業\",\n        \"kaname\": \"kaname\",\n        \"kaname nagi\": \"かなめ\",\n        \"kaname.\": \"かなめ。\",\n        \"kanan asuka\": \"河南あすか\",\n        \"kanano ayu\": \"奏乃あゆ\",\n        \"kanaru\": \"かなる\",\n        \"kanbayashi chico\": \"神林ちこ\",\n        \"kanbayashi makoto\": \"上林眞\",\n        \"kanbe\": \"kanbe\",\n        \"kanchela\": \"Kanchela\",\n        \"kanda\": \"神田\",\n        \"kandagawa\": \"神田川\",\n        \"kanduki kamibukuro\": \"環月紙袋\",\n        \"kandume\": \"かんづめ\",\n        \"kaneda asao\": \"金田麻生\",\n        \"kaneda shotaro\": \"金田正太郎\",\n        \"kanei yoh\": \"鐘井楊\",\n        \"kaneko ako\": \"金子アコ\",\n        \"kaneko rin\": \"金子鈴\",\n        \"kaneneko\": \"カネ-ネコ\",\n        \"kanesada keishi\": \"兼処敬士\",\n        \"kaneta\": \"かねた\",\n        \"kanetsuki masayoshi\": \"カネツキマサヨシ\",\n        \"kangaechuu\": \"考え中\",\n        \"kani\": \"かに\",\n        \"kanibasami\": \"かにばさみ\",\n        \"kanichiri\": \"かにちり\",\n        \"kanie\": \"鹿贄\",\n        \"kanif\": \"Kanif\",\n        \"kanikama\": \"カニカマ\",\n        \"kanikoro\": \"KANIKORO\",\n        \"kanimaru\": \"かにまる\",\n        \"kanimura ebio\": \"かに村えびお\",\n        \"kanitaro\": \"かに太郎\",\n        \"kanitoon\": \"蟹丹\",\n        \"kanju\": \"kanju\",\n        \"kanka\": \"カンカ\",\n        \"kanko\": \"かんこ\",\n        \"kanmimitsu\": \"甘味みつ\",\n        \"kanmuri\": \"かんむり\",\n        \"kanna asuke\": \"神無あすけ\",\n        \"kanna satsuki\": \"神無さつき\",\n        \"kanna tetsuboku\": \"かんな鉄木\",\n        \"kannagi kyouichi\": \"巫杏壱\",\n        \"kannatsuki noboru\": \"神奈月昇\",\n        \"kannazuki akira\": \"神無月アキラ\",\n        \"kannazuki motofumi\": \"神無月元史\",\n        \"kannazuki sakyou\": \"神名月紗香\",\n        \"kanno izuka\": \"かんのいずか\",\n        \"kanno kei\": \"神乃啓\",\n        \"kannon ouji\": \"観音王子\",\n        \"kano\": \"カノ\",\n        \"kanon\": \"花音\",\n        \"kanosamu\": \"KANOSAMU\",\n        \"kanri kokka semashi\": \"管理国家せまし\",\n        \"kansuke\": \"カンスケ\",\n        \"kantarou\": \"燗汰朗\",\n        \"kantori\": \"かんとり\",\n        \"kanu\": \"カヌ\",\n        \"kanzaki gorou\": \"かんざき五郎\",\n        \"kanzaki katsumi\": \"神崎かつみ\",\n        \"kanzaki misora\": \"神崎美宙\",\n        \"kanzaki shirou\": \"神崎四郎\",\n        \"kao\": \"Kao\",\n        \"kaori\": \"かおり\",\n        \"kapa\": \"かぱ\",\n        \"kapo\": \"カポ\",\n        \"kappa\": \"かっぱ\",\n        \"kappipe\": \"かっぴぺ\",\n        \"kara\": \"から\",\n        \"karaage muchio\": \"からあげむちお\",\n        \"karaage-chan\": \"からあげチャン\",\n        \"karakuri\": \"からくり\",\n        \"karakuribee\": \"カラくりべえ\",\n        \"karakuriusagi\": \"からくりうさぎ\",\n        \"karamai\": \"空舞\",\n        \"karasawa yonjuu\": \"唐沢四十\",\n        \"karasu chan\": \"カラスちゃん\",\n        \"karasuke d\": \"カラスケD\",\n        \"karasuma amiru\": \"烏丸あみる\",\n        \"karasuma nishiki\": \"からすま弐式\",\n        \"karasuma pink\": \"烏丸ぴんく\",\n        \"karasuma renya\": \"烏丸蓮耶\",\n        \"karasumaru\": \"烏間ル\",\n        \"karateka value\": \"カラテカ・バリュー\",\n        \"karatekikku\": \"karatekikku\",\n        \"karen kyuu\": \"華蓮きゅう\",\n        \"kari\": \"かり\",\n        \"kari paku\": \"かりぱく\",\n        \"karin\": \"かりん\",\n        \"karin akira\": \"花琳晶\",\n        \"karitaka akira\": \"狩鷹明\",\n        \"karo\": \"カロ\",\n        \"karoti\": \"かろちー\",\n        \"karucho\": \"カルチョ\",\n        \"karukanko\": \"カルカン子\",\n        \"karura jun\": \"迦楼羅淳\",\n        \"karura syou\": \"華瑠羅翔\",\n        \"karutamo\": \"かるたも\",\n        \"kasai ema\": \"葛西えま\",\n        \"kasaiya\": \"カサイ屋\",\n        \"kasaran\": \"kasaran\",\n        \"kashi\": \"華師\",\n        \"kashiba toshizou\": \"樫葉歳三\",\n        \"kashimi masao\": \"樫見正央\",\n        \"kashipam\": \"仮死パン\",\n        \"kashiwamochi june\": \"柏餅ジュン\",\n        \"kashou uta\": \"嘉咲ウタ\",\n        \"kasose\": \"風合瀬\",\n        \"kasuga\": \"春日\",\n        \"kasuga naoka\": \"春日直加\",\n        \"kasuga sunao\": \"春日沙生\",\n        \"kasuga tousen\": \"春日冬扇\",\n        \"kasugai\": \"春日井\",\n        \"kasukabe akira\": \"カスカベアキラ\",\n        \"kasuki masato\": \"春日木雅人\",\n        \"kasumi ryo\": \"かすみりょう\",\n        \"kasumi\": \"カスミ\",\n        \"kat\": \"KAT\",\n        \"katagiri\": \"カタギリ\",\n        \"katagiri atsuko\": \"かたぎりあつこ、牛乳リンダ\",\n        \"katagiri chisato\": \"片桐ちさと\",\n        \"katagiri hinoka\": \"片桐火華\",\n        \"katakana\": \"カタカナ\",\n        \"katakuri komeko\": \"片栗こめこ\",\n        \"katakuri-ko\": \"片栗子\",\n        \"katanbina\": \"かたんびな\",\n        \"katari\": \"かたり\",\n        \"katase yuu\": \"片瀬ゆう\",\n        \"katatuka kouji\": \"片塚工司\",\n        \"katazaki miki\": \"かたざきみき\",\n        \"katita\": \"Katita\",\n        \"kato cobayashi\": \"カトーコバヤシ\",\n        \"kato sig\": \"加藤シグ\",\n        \"katori youichi\": \"鹿取葉一\",\n        \"katou\": \"加藤\",\n        \"katou fuguo\": \"加藤フグオ\",\n        \"katou kakashi\": \"かとうかかし\",\n        \"katou koban\": \"加藤小判\",\n        \"katou takaaki\": \"加藤天秋\",\n        \"katou teppei\": \"加藤徹平\",\n        \"katou tetsuya\": \"加糖哲哉\",\n        \"katsudansou\": \"活断層\",\n        \"katsuma rei\": \"かつまれい\",\n        \"katsuo\": \"かつお\",\n        \"katsura 24 gou\": \"桂24號\",\n        \"katsuragi maya\": \"桂騎魔夜\",\n        \"katsuragi you\": \"葛城ゆう\",\n        \"katsuto\": \"かつと\",\n        \"katte ni kappa\": \"勝手に河童\",\n        \"katutoshi\": \"かつとし\",\n        \"katuu\": \"KATUU\",\n        \"katydid keeeta\": \"KATYDID KEEETA\",\n        \"kauti\": \"かーうち\",\n        \"kawa\": \"Kawa\",\n        \"kawacchi hirohiro\": \"かわっちひろひろ\",\n        \"kawachi izumi\": \"河内和泉\",\n        \"kawachi yuki\": \"かわち雪\",\n        \"kawada shougo\": \"かわだ章吾\",\n        \"kawadu\": \"カワヅ\",\n        \"kawagishi keitarou\": \"カワギシケイタロウ\",\n        \"kawahara\": \"カワハラ\",\n        \"kawahara shin\": \"かわはらしん\",\n        \"kawai\": \"カワイ\",\n        \"kawai kenji\": \"河合健司\",\n        \"kawakami ioru\": \"川上イオル\",\n        \"kawakami kou\": \"河上康\",\n        \"kawakami takashi\": \"川上聖\",\n        \"kawamoto hiroshi\": \"河本ひろし\",\n        \"kawamoto yutsuki\": \"河本ゆつき\",\n        \"kawamura tsukasa\": \"川邑司\",\n        \"kawana\": \"かわな\",\n        \"kawanakajima\": \"川中島\",\n        \"kawanishi yuuji\": \"かわにしゆうじ\",\n        \"kawano masatoshi\": \"川乃雅慧\",\n        \"kawanuma uotsuri\": \"川沼魚釣\",\n        \"kawase marimo\": \"川瀬まりも\",\n        \"kawase seiki\": \"カワセセイキ\",\n        \"kawasemi makiko\": \"かわせみまきこ\",\n        \"kawatare\": \"かわたれ\",\n        \"kawatsu kenjiro\": \"川津健二郎\",\n        \"kawazu kento\": \"河津ケント\",\n        \"kawazuko chouji\": \"蛙子丁字\",\n        \"kaya\": \"加耶\",\n        \"kaya rio\": \"夏谷リオ\",\n        \"kayabanashi\": \"かやばなし\",\n        \"kayako\": \"かやこ\",\n        \"kayama harumizu\": \"加山春水\",\n        \"kayama ikkaku\": \"加山一角\",\n        \"kayanagi takahiro\": \"芽薙隆裕\",\n        \"kayano\": \"茅乃\",\n        \"kayanoyuki\": \"kayanoyuki\",\n        \"kayura yuka\": \"かゆらゆか\",\n        \"kaz\": \"kaz\",\n        \"kazami aki\": \"風海聡\",\n        \"kazami rei\": \"KAZAMI澪\",\n        \"kazami ruk\": \"風見るく\",\n        \"kazamik\": \"風見圭\",\n        \"kazamitiu\": \"かざみちう\",\n        \"kazasuzu\": \"風鈴\",\n        \"kaze\": \"カゼ\",\n        \"kazekawa nagi\": \"風川なぎ\",\n        \"kazet\": \"かぜっと\",\n        \"kazeya\": \"風夜\",\n        \"kazu\": \"和\",\n        \"kazuboh\": \"KAZUBOH\",\n        \"kazuha\": \"kazuha\",\n        \"kazuhito\": \"かづひと\",\n        \"kazuki hiyori\": \"かずきひより\",\n        \"kazuki kaho\": \"香月かほ\",\n        \"kazuki yuu\": \"霞月由羽\",\n        \"kazum\": \"kazum\",\n        \"kazurasui\": \"かずらすい\",\n        \"kazushi\": \"一志\",\n        \"kazushirononko\": \"カズシロノンコ\",\n        \"kazutaro\": \"かずたろ\",\n        \"kazuto\": \"和斗\",\n        \"kazuwo daisuke\": \"カズヲダイスケ\",\n        \"kazuya\": \"カズヤ\",\n        \"kcccc\": \"kcccc\",\n        \"kebabuta\": \"けばブタ\",\n        \"kedai no kokoro\": \"懈怠の心\",\n        \"kedama\": \"けだま\",\n        \"kei\": \"慧\",\n        \"kei jiei\": \"けいじえい\",\n        \"kei kei\": \"啓々\",\n        \"kei natsu\": \"景夏\",\n        \"matumoto kei\": \"松本痙\",\n        \"keigen asuka\": \"蛍幻飛鳥\",\n        \"keiji\": \"けいじ\",\n        \"keijoh ayano\": \"圭条あやの\",\n        \"keiki\": \"けーき\",\n        \"keiko\": \"K子\",\n        \"keimi\": \"けいみ\",\n        \"keiryu\": \"keiryu\",\n        \"keishiki\": \"系式\",\n        \"keisuke\": \"Keisuke\",\n        \"keita\": \"蛍汰\",\n        \"keito\": \"圭斗\",\n        \"keke\": \"ケケ\",\n        \"kemoribbon\": \"けもりぼん\",\n        \"kemukemuke\": \"けむけむけ\",\n        \"kemushi\": \"けむし\",\n        \"ken tatuki\": \"剣辰輝\",\n        \"ken tsukikage\": \"ケン月影\",\n        \"ken-sya\": \"ken-sya\",\n        \"kenbouka\": \"KENBOUKA\",\n        \"kenmochi ena\": \"剣持えな\",\n        \"kenmomen\": \"けんもめん\",\n        \"kenpi\": \"けんぴ\",\n        \"kensuke\": \"拳介\",\n        \"kent\": \"KENT\",\n        \"kenta\": \"犬太\",\n        \"kentarou\": \"けんたろう\",\n        \"keny\": \"keny\",\n        \"kenzi\": \"kenzi\",\n        \"keoko\": \"けおこ\",\n        \"keraton\": \"ケラトン\",\n        \"kereno\": \"けれの\",\n        \"keroko\": \"けろこ\",\n        \"keso\": \"keso\",\n        \"kesupu\": \"ケスープ\",\n        \"ket\": \"KET\",\n        \"keta\": \"ケタ\",\n        \"ketama\": \"けたま\",\n        \"ketarou\": \"毛太郎\",\n        \"ketsudrum\": \"ケツドラム\",\n        \"keuma\": \"希有马\",\n        \"key\": \"きい\",\n        \"keyneq\": \"きーねく\",\n        \"kh\": \"KH\",\n        \"ki equals yuu\": \"キ=ユウ\",\n        \"ki-51\": \"ki-51\",\n        \"kiasa\": \"kiasa\",\n        \"kibimoca\": \"きびもか\",\n        \"kicchan\": \"きっちゃん\",\n        \"kichihachi\": \"きちはち\",\n        \"kichijouji kitashirou\": \"吉祥寺北四郎\",\n        \"kichiku hiroshi\": \"鬼畜広子\",\n        \"kidmo\": \"Kidmo\",\n        \"kidou muichi\": \"綺堂無一\",\n        \"kidouchi kon\": \"Kidouchi_Kon\",\n        \"kiduki erika\": \"季月えりか\",\n        \"kieyza\": \"喜栄座\",\n        \"kigetu miya\": \"キゲツミヤ\",\n        \"kigisuke\": \"木々助\",\n        \"kiguchi\": \"木口\",\n        \"kihinata hiroki\": \"希日向ひろき\",\n        \"kiiro\": \"きいろ\",\n        \"kiiro kurumi\": \"きいろくるみ\",\n        \"kijima hyougo\": \"鬼嶋兵伍\",\n        \"kijinaka mahiro\": \"雉中真裕\",\n        \"kijirushi\": \"キジルシ\",\n        \"kika\": \"きか\",\n        \"kiki\": \"kiki\",\n        \"kiki ryu\": \"貴騎琉\",\n        \"kikira\": \"ききら\",\n        \"kikkawa kabao\": \"吉川かば夫\",\n        \"kikkawa ryounei\": \"季川良寧\",\n        \"kikuchi tsutomu\": \"キクチツトム\",\n        \"kikuduki taro\": \"菊月太朗\",\n        \"kikuichi monji\": \"菊一もんじ\",\n        \"kikuno\": \"きくの\",\n        \"kikusui\": \"菊水\",\n        \"kikuta kouji\": \"菊田高次\",\n        \"kilie\": \"切絵\",\n        \"kiliu\": \"きぃう\",\n        \"killcy\": \"きるし\",\n        \"kim chii\": \"KIMちー\",\n        \"kima azusa\": \"鬼魔あづさ\",\n        \"kima-gray\": \"Kima-gray\",\n        \"kimagu\": \"きまぐ\",\n        \"kimakura\": \"きまくら\",\n        \"kimarin\": \"きまりん\",\n        \"kimi\": \"黄身\",\n        \"kimidori\": \"きみどり\",\n        \"kimidori iro\": \"樹碧唯旅\",\n        \"kimino yume\": \"君乃遊女\",\n        \"kimizuka aoi\": \"きみづか葵\",\n        \"kimobusa-j\": \"KIMOBUSA-J\",\n        \"kimotani\": \"胆谷\",\n        \"kimoto kanata\": \"きもとかなた\",\n        \"kimoto rai\": \"木本らい\",\n        \"kimrin\": \"機夢倫\",\n        \"kimura naoki\": \"樹村ナオキ\",\n        \"kimuraya izumi\": \"木村屋いづみi\",\n        \"kimuti\": \"きむち\",\n        \"kimuti-g\": \"KIMUTI-G\",\n        \"kinari\": \"きなり\",\n        \"kinata\": \"葵奈太\",\n        \"kinbakuman\": \"緊縛魔\",\n        \"kindatsu\": \"きんだつ\",\n        \"kine\": \"杵\",\n        \"kingindou yumeji\": \"琴吟どう夢路\",\n        \"kinka\": \"金夏\",\n        \"kinkoumori\": \"きんこうもり\",\n        \"kinniku shinkou\": \"筋肉信仰\",\n        \"kinntarou\": \"kinntarou\",\n        \"kino ayuri\": \"きのアユリ\",\n        \"kinohara hikaru\": \"きのはらひかる\",\n        \"kinoko\": \"Kinoko\",\n        \"kinoko dake\": \"きのこダケ\",\n        \"kinokuniya kanoko\": \"キノクニヤカノコ\",\n        \"kinosaki yuki\": \"木ノ崎由貴\",\n        \"kinoshita junichi\": \"きのした順市\",\n        \"kinoshita shashinkan\": \"木下写真館\",\n        \"kinouchi ai\": \"生之内あい\",\n        \"kinryuu\": \"禽竜\",\n        \"kinta\": \"金太\",\n        \"kinta mawaru\": \"きんたまわる\",\n        \"kintarou\": \"金たロウ\",\n        \"kintoki\": \"公時\",\n        \"kinuta kouji\": \"絹田コウジ\",\n        \"kippow\": \"キッポウ\",\n        \"kira boshi\": \"綺羅星\",\n        \"kira maru\": \"綺羅丸\",\n        \"kirara\": \"きらら\",\n        \"kirara moe\": \"きらら萌\",\n        \"kiri\": \"桐\",\n        \"kirigakure takaya\": \"きりがくれたかや\",\n        \"kirigirisu\": \"きりぎりす\",\n        \"kirihara futaha\": \"桐原ふたは\",\n        \"kirihara subako\": \"霧原すばこ\",\n        \"kirii nao\": \"桐井ナオ\",\n        \"kirikaze\": \"霧風\",\n        \"kirikiriya\": \"きりきりや\",\n        \"kirimia\": \"きりみあ\",\n        \"kirimoro\": \"きりもろ\",\n        \"kirin\": \"きりん\",\n        \"kirin kakeru\": \"木铃カケル\",\n        \"kirino kyousuke\": \"桐野キョウスケ\",\n        \"kiriri takanori\": \"霧李孝徳\",\n        \"kirisaki akihito\": \"霧咲空人\",\n        \"kirisaki mocori\": \"切裂モコリ\",\n        \"kirisawa shinji\": \"桐沢しんじ\",\n        \"kirisawa tokito\": \"きりさわときと\",\n        \"kirise\": \"キリセ\",\n        \"kirise mitsuru\": \"霧瀬ミツル\",\n        \"kirishima fuuki\": \"霧島ふうき\",\n        \"kirishima riona\": \"桐島りおな\",\n        \"kirishima shiroo\": \"霧島シロー\",\n        \"kiritachi\": \"キリタチ\",\n        \"kiritomo koroha\": \"霧巴ころは\",\n        \"kiriya\": \"霧也\",\n        \"kiriyama machi\": \"桐山マチ\",\n        \"kiriyama taichi\": \"キリヤマ太一\",\n        \"kirome\": \"きろめ\",\n        \"kirsi\": \"キルシー\",\n        \"kiryuu makoto\": \"騎竜まこと\",\n        \"kiryu masumi\": \"桐生真澄\",\n        \"kiryuu mina\": \"霧生実奈\",\n        \"kisa\": \"キサ\",\n        \"kisaki\": \"后\",\n        \"kisaki nana\": \"木崎七\",\n        \"kisaki noah\": \"希咲のあ\",\n        \"kisaki saki\": \"きさきさき\",\n        \"kisamu\": \"キサム\",\n        \"kisara ai\": \"きさら藍\",\n        \"kisara shi-\": \"キサラしぃ\",\n        \"kisaradu\": \"木更津\",\n        \"kisaragi\": \"如月\",\n        \"kisaragi kanata\": \"如月かなた\",\n        \"kisaragi mizu\": \"如月水\",\n        \"kisaragi mizuka\": \"如月瑞香\",\n        \"kisaragi moyu\": \"如月モユ\",\n        \"kisaragi neon\": \"如月ねおん\",\n        \"kisaragi sara\": \"如月沙良\",\n        \"kisaragi zwei\": \"如月ツヴァヰ\",\n        \"kishi kaisei\": \"旗幟灰星\",\n        \"kishi nisen\": \"騎士二千\",\n        \"kishida mel\": \"岸田メル\",\n        \"kishiguma toragorou\": \"岸熊虎五郎\",\n        \"kishikino\": \"きしきの\",\n        \"kishimasa\": \"きしまさ\",\n        \"kishimoto daisuke\": \"岸本大介\",\n        \"kishinosato satoshi\": \"岸里さとし\",\n        \"kisia\": \"きしあ\",\n        \"kisin juki\": \"姫心重機\",\n        \"kisirian\": \"kisirian\",\n        \"kisu yoshimitsu\": \"貴須ヨシミツ\",\n        \"kisugi\": \"きすぎ\",\n        \"kisunka\": \"kisunka\",\n        \"kisyuu naoyuki\": \"紀州直行\",\n        \"kitagawa kei\": \"きたがわけい\",\n        \"kitagawa ryuu\": \"きたがわ竜\",\n        \"kitakaze tsukasa\": \"北風つかさ\",\n        \"kitamiya genbu\": \"北宮弦武\",\n        \"kitamura hato\": \"北村鳩\",\n        \"kitamura tooru\": \"きたむらとおる\",\n        \"kitani ikari\": \"希谷一光\",\n        \"kitani sai\": \"木谷さい\",\n        \"kitao taki\": \"北尾タキ\",\n        \"kitaohji guranosuke\": \"北大路倉之介\",\n        \"kitatani uni\": \"北谷うに\",\n        \"kitayori minami\": \"きたよりみなみ\",\n        \"kitazato nawoki\": \"北里ナヲキ\",\n        \"kitoen\": \"鬼頭えん\",\n        \"kitoha\": \"きとは\",\n        \"kitsune\": \"きつね\",\n        \"kitsune tsuki\": \"狐憑き\",\n        \"kitsuneko anko\": \"狐古あんこ\",\n        \"kitto shibaru\": \"吉都しばる\",\n        \"kitty\": \"キ帝ィ\",\n        \"kiu\": \"希憂\",\n        \"kiwa\": \"きわ\",\n        \"kiwata\": \"木綿\",\n        \"kiyama shiro\": \"キヤマシロ\",\n        \"kiyan\": \"喜屋武\",\n        \"kiyo mori\": \"紀世盛\",\n        \"kiyokiba miyo\": \"清木場みよ\",\n        \"kizaki\": \"キザキ\",\n        \"kizaru\": \"黄猿\",\n        \"kizoku\": \"貴族\",\n        \"kkyz13\": \"Kkyz13\",\n        \"km\": \"KM\",\n        \"kni-droid\": \"Kにぃー\",\n        \"knight\": \"ナイト\",\n        \"knsk\": \"knsk\",\n        \"ko\": \"ko\",\n        \"ko tora\": \"小虎\",\n        \"ko-ri azuki\": \"氷あずき\",\n        \"ko.darts\": \"ko.darts\",\n        \"koala\": \"こあら\",\n        \"kobaji\": \"こばじ\",\n        \"kobako\": \"KOBAKO\",\n        \"kobanya koban\": \"孤蛮屋こばん\",\n        \"kobayashi hiyoko\": \"こばやしひよこ\",\n        \"kobayashi masakazu\": \"小林正和\",\n        \"kobayashi tetsuya\": \"コバヤシテツヤ\",\n        \"kobenza\": \"コベンザ\",\n        \"kobiyuun\": \"こびゆうん\",\n        \"kobucha\": \"昆布茶\",\n        \"kobuta no shinai\": \"こぶたのしない\",\n        \"koda masanov\": \"コダマサノブ\",\n        \"kodai heiki\": \"古代兵器\",\n        \"kodamashi\": \"kodamashi\",\n        \"kodeida\": \"こでぃだ\",\n        \"kodou\": \"コドウ\",\n        \"kodou kuji\": \"巨道空二\",\n        \"kodukue\": \"こづくえ\",\n        \"koe\": \"声\",\n        \"koga chiharu\": \"古蛾千春\",\n        \"koga rejini\": \"古賀れじに\",\n        \"koga yoshihisa\": \"胡河義久\",\n        \"kogakunama itohiro\": \"こがくなまイトヒロ\",\n        \"koganemushi\": \"こがねむし\",\n        \"kogawa masayoshi\": \"こがわまさよし\",\n        \"niiyama takashi\": \"古川やすし\",\n        \"koge neko\": \"こげねこ\",\n        \"kogma pierre\": \"こぐまピエール\",\n        \"koguma no joey\": \"こぐまのジョーイ\",\n        \"koguro masami\": \"小黒正巳\",\n        \"kohachi\": \"こはち\",\n        \"kohaku q\": \"こはくQ\",\n        \"koharu\": \"小春\",\n        \"koharuko\": \"こはるこ\",\n        \"kohinata ryou\": \"小日向 諒\",\n        \"kohitsuji\": \"こひつじ\",\n        \"kohri ms\": \"こおりみず\",\n        \"koike sadaji\": \"小池定路\",\n        \"koishikawa\": \"小石川\",\n        \"koishikawa hibiki\": \"小石川響\",\n        \"kojika\": \"こじか\",\n        \"kojima\": \"kojima\",\n        \"kojima aya\": \"こじまあや\",\n        \"kojima shoutarou\": \"小島祥太朗\",\n        \"kojiro izuta\": \"神代イヅタ\",\n        \"kojou\": \"kojou\",\n        \"koke\": \"こけ\",\n        \"koken\": \"こけん\",\n        \"kokeshi men\": \"こけし☆メン\",\n        \"kokiri\": \"コキリ\",\n        \"kokka\": \"こっか\",\n        \"koko\": \"呱呱\",\n        \"kokonoe yomogi\": \"ここのえ蓬\",\n        \"kokonoka\": \"ここのか\",\n        \"kokori\": \"ここり\",\n        \"kokujin\": \"黒人\",\n        \"kokumaro\": \"こくまろ\",\n        \"kokuu rikishi\": \"虚空力士\",\n        \"kolgha\": \"コルガー\",\n        \"kom\": \"Kom\",\n        \"koma\": \"KOMA\",\n        \"komac\": \"鼓膜\",\n        \"komagata\": \"狛形\",\n        \"komaki ren\": \"小巻恋\",\n        \"komaki tamotsu\": \"小牧保\",\n        \"komakichi\": \"こまきち\",\n        \"komame\": \"こまめ\",\n        \"komamemaru\": \"こまめ丸\",\n        \"komano mako\": \"狛野まこ\",\n        \"komaru\": \"こまる\",\n        \"kome\": \"こめ\",\n        \"kome dorobou\": \"米泥棒\",\n        \"kome tsubu\": \"こめつぶ\",\n        \"komechu\": \"こめちゅー\",\n        \"komeko\": \"komeko\",\n        \"kometanuki\": \"米たぬき\",\n        \"komichi\": \"こみち\",\n        \"komihisa\": \"こみひさ\",\n        \"kominato takuya\": \"小湊拓也\",\n        \"komon\": \"コモン\",\n        \"komori kaeru\": \"小森かえる\",\n        \"komori kiyoka\": \"小森キヨカ\",\n        \"komotoda emai\": \"小本田絵舞\",\n        \"komugi\": \"こむぎ\",\n        \"komura keita\": \"こむらけいた\",\n        \"komura saki\": \"小邑紗希\",\n        \"komuro\": \"コムロ\",\n        \"komusou\": \"こむそう\",\n        \"kona\": \"KONA\",\n        \"kona matsu\": \"粉末\",\n        \"konako\": \"こなこ\",\n        \"konata gazel\": \"此方がぜる\",\n        \"konayama kata\": \"粉山カタ\",\n        \"konboi\": \"KONBOI\",\n        \"kondom\": \"昆童虫\",\n        \"konecha\": \"こね茶\",\n        \"konkon\": \"KON-KON\",\n        \"konmori\": \"こんもり\",\n        \"konno chikata\": \"紺野チカ太\",\n        \"konnyaku yukko\": \"蒟蒻ゆっこ\",\n        \"kono\": \"河野\",\n        \"konode minoru\": \"このでみのる\",\n        \"konoi iko\": \"木井いこ\",\n        \"konoma waho\": \"このま和歩\",\n        \"konshin\": \"魂神\",\n        \"konsome\": \"コンソメ\",\n        \"koohii inu\": \"珈琲犬\",\n        \"koorogi\": \"コオロギ\",\n        \"koppamu\": \"こっぱむ\",\n        \"korikku\": \"コリック\",\n        \"korikori takeya\": \"こりこりタケヤ\",\n        \"korisei\": \"孤裡精\",\n        \"korisu\": \"こりす\",\n        \"koro\": \"ころ\",\n        \"koromia\": \"ころみあ\",\n        \"koromo\": \"衣\",\n        \"korone shousa\": \"コロね少佐\",\n        \"korotasuke\": \"コロ太助\",\n        \"korotsuke\": \"コロツケ\",\n        \"koruri\": \"こるり\",\n        \"koryu misato\": \"湖竜美里\",\n        \"kosa\": \"こさ\",\n        \"kosakai\": \"kosakai\",\n        \"koshika rina\": \"小鹿りな\",\n        \"koshimura\": \"越村\",\n        \"kosuge yuutarou\": \"小菅勇太郎\",\n        \"kosugi koutarou\": \"小杉光太郎\",\n        \"kosuke\": \"小助\",\n        \"kosuzu\": \"小鈴\",\n        \"kota\": \"耕太 | コタ | こた(炬太郎) | kota´\",\n        \"kotaru\": \"瑚樽\",\n        \"kotatsu\": \"虎龍\",\n        \"kotatsu tomodachi\": \"コタツトモダチ\",\n        \"koto\": \"koto\",\n        \"kotobuki\": \"kotobuki\",\n        \"kotobuki hajime\": \"ことぶきはじめ\",\n        \"kotobuki maimu\": \"ことぶきまいむ\",\n        \"kotobuki ringo\": \"寿りんご\",\n        \"kotobuki utage\": \"寿宴\",\n        \"kotoduki z\": \"琴月絶人\",\n        \"kotoeri iroha\": \"ことえりいろは\",\n        \"kotogi raura\": \"虎兎木蘭浦\",\n        \"kotojima motoki\": \"琴島もとき\",\n        \"kotomuke fuurin\": \"平国風鈴\",\n        \"kotono wakako\": \"琴の若子\",\n        \"kotori aiko\": \"コトリアイコ\",\n        \"kotou ichigou\": \"小嶌一豪\",\n        \"kotowari\": \"理\",\n        \"kotsumudi\": \"こつむぢ\",\n        \"kou\": \"孝\",\n        \"kou1\": \"こう1\",\n        \"kouba\": \"こうば\",\n        \"kouduki miyabi\": \"神月みやび\",\n        \"koudzuki shinobu\": \"たまご\",\n        \"kouenji marimo\": \"高円寺まりも\",\n        \"kouenji rei\": \"紅園寺麗\",\n        \"kougami\": \"鴻上\",\n        \"kougi\": \"KOUGI\",\n        \"kouguchi moto\": \"工口本\",\n        \"kouhaku\": \"紅白\",\n        \"kouma hidehito\": \"慌麻秀仁\",\n        \"koume satsuki\": \"小梅さつき\",\n        \"koumorikaizin\": \"こうもり貝人\",\n        \"koumoto nami\": \"河本那美\",\n        \"kouno kei\": \"光野けい\",\n        \"kouno mai\": \"香野舞\",\n        \"kouno mizuho\": \"紅野瑞穂\",\n        \"kouno you\": \"河野曜\",\n        \"kounose akara\": \"神瀬あから\",\n        \"kounosu\": \"こうのす\",\n        \"kouri\": \"木鈴カケル\",\n        \"kousaka donten\": \"高坂曇天\",\n        \"kousaki\": \"光崎\",\n        \"kou siryou\": \"黄支亮\",\n        \"kousoku\": \"光燭\",\n        \"koutarosu\": \"コウタロス\",\n        \"koutei\": \"皇帝\",\n        \"koutei penko\": \"校庭ぺん子\",\n        \"kouyou sakaki\": \"后謡榊\",\n        \"kouzaka kouhei\": \"神坂公平\",\n        \"koyama ichi\": \"こやまいち\",\n        \"koyama tomosato\": \"こやまともさと\",\n        \"koyama unkaku\": \"小山雲鶴\",\n        \"koyasu kazu\": \"子安和\",\n        \"koyomisa\": \"こよみさ\",\n        \"kozakura botan\": \"小桜ぼたん\",\n        \"kozakura ryou\": \"小桜りょう\",\n        \"kozara\": \"小皿\",\n        \"kozi\": \"kozi\",\n        \"kozirow\": \"Kozirow\",\n        \"kozou\": \"小僧\",\n        \"kozue akari\": \"こずえあかり\",\n        \"kozy\": \"kozy\",\n        \"krohudeanna\": \"黒筆ANnA\",\n        \"ksg\": \"ksg\",\n        \"ksheera\": \"ksheera\",\n        \"kso\": \"けそ\",\n        \"kswazza\": \"くすわZZA\",\n        \"kty\": \"KTY\",\n        \"ktzw\": \"ktzw\",\n        \"ku-ba\": \"ku-ba\",\n        \"kubota chihiro\": \"久保田チヒロ\",\n        \"kubyou azami\": \"九猫あざみ\",\n        \"kudou\": \"クドウ\",\n        \"kudou shino\": \"工藤詩乃\",\n        \"kudou taizou\": \"工藤大蔵\",\n        \"kuga mingo\": \"久我みんご\",\n        \"kugayama hodai\": \"久我山砲台\",\n        \"kugelschreiber\": \"くーげるしゅれいばー\",\n        \"kujira sanbiki\": \"くじら三匹\",\n        \"kujiran\": \"くぢらん\",\n        \"kujou shirei\": \"九条志玲\",\n        \"kuju shikuro\": \"苦渋しくろ\",\n        \"kukuru\": \"KKR\",\n        \"kuloamaki\": \"黒天姫\",\n        \"kuma\": \"くま\",\n        \"kumacchi\": \"くまっち\",\n        \"kumada kazushi\": \"熊田一司\",\n        \"kumagai hachi\": \"くまがいはち\",\n        \"kumagaya nerico\": \"熊谷ネリコ\",\n        \"kumagaya shin\": \"熊谷しん\",\n        \"kumaki toshikazu\": \"熊木十志和\",\n        \"kumakichi\": \"熊吉\",\n        \"kumano kotaro\": \"くまのこたろ\",\n        \"kumao\": \"く魔王\",\n        \"kumasaku tamizou\": \"クマ作民三\",\n        \"kumashiro\": \"くましろ\",\n        \"kumatora tatsumi\": \"熊虎たつみ\",\n        \"kumatyu\": \"クマチュウ\",\n        \"kumicho\": \"くみちょー\",\n        \"kumimon\": \"kumimon\",\n        \"kumisan\": \"くみさん\",\n        \"kumoi takashi\": \"菅野タカシ\",\n        \"kunaboto\": \"クナボト\",\n        \"kuni\": \"クニ\",\n        \"kunifuto\": \"くにふと\",\n        \"kunoichi\": \"くノ壱\",\n        \"kawahara reki\": \"川原砾\",\n        \"kuonji hodaka\": \"久遠路火鷹\",\n        \"kupala\": \"Kupala\",\n        \"kura oh\": \"蔵王\",\n        \"kurabayashi\": \"倉林\",\n        \"kurada\": \"蔵田\",\n        \"kuragari\": \"くらがり\",\n        \"kuragi\": \"蔵儀\",\n        \"kuraki hiro\": \"椋木尋\",\n        \"kurakino issiki\": \"椋木野一式\",\n        \"kurakumo nue\": \"黒雲鵺\",\n        \"kuramachi bun\": \"蔵街ぶん\",\n        \"kurami\": \"蔵見\",\n        \"kuramoto keizou\": \"蔵本鶏蔵\",\n        \"kurano yuuichi\": \"倉野ユウイチ\",\n        \"kuraoka aki\": \"倉岡亜妃\",\n        \"kurasaki aya\": \"倉崎あや\",\n        \"kurasawa kyosyo\": \"倉澤京章\",\n        \"kurata ichiro\": \"倉田いち朗\",\n        \"kurata muto\": \"倉田むと\",\n        \"kurata shinji\": \"倉田シンジ\",\n        \"kuratsuka riko\": \"倉塚りこ\",\n        \"kuraya\": \"蔵屋\",\n        \"kure\": \"くれ\",\n        \"kure ichirou\": \"くれいちろう\",\n        \"kure shikure\": \"久澪しくれ\",\n        \"kureha mitsushige\": \"自遊本舗「宇」\",\n        \"kureha yosho\": \"くれは洋書\",\n        \"kurei daisuke\": \"暮井大助\",\n        \"kurenami yuuji\": \"暮浪夕時\",\n        \"kuresato yoshiaki\": \"暮里良昭\",\n        \"kureta fumiaki\": \"呉田文明\",\n        \"kureura keita\": \"暮浦鶏太\",\n        \"kuri\": \"栗\",\n        \"kurikama\": \"くりかま\",\n        \"kuriki\": \"kuriki\",\n        \"kurisu\": \"くりす\",\n        \"chris tina\": \"栗栖ティナ\",\n        \"kuro\": \"KURO\",\n        \"kuro hiyoko\": \"黒ひよこ\",\n        \"kuro itachi\": \"黒イタチ\",\n        \"kuro koshou\": \"黒胡椒\",\n        \"kuro oolong\": \"黒烏龍\",\n        \"kuro tengu\": \"黒てんぐ\",\n        \"kuro yorozu\": \"くろよろず\",\n        \"kuroama\": \"黒甘\",\n        \"kuroarama soukai\": \"黒荒馬双海\",\n        \"kurocastle\": \"黒城\",\n        \"kurocazenosora\": \"黒風ノ空\",\n        \"kuroda\": \"黒田\",\n        \"kuroda akimi\": \"黒田晶見\",\n        \"kurodou katana\": \"黒堂カタナ\",\n        \"kurogane\": \"くろがね\",\n        \"kurogane riku\": \"鐵陸\",\n        \"kurogane satsuki\": \"黒金さつき\",\n        \"kuroha nue\": \"クロハぬえ\",\n        \"kuroha rapid\": \"黒羽ラピッド\",\n        \"kurohagane\": \"クロハガネ\",\n        \"kurohekiten\": \"黒碧天\",\n        \"kuroi inu\": \"黒い犬\",\n        \"kuroi kingyo\": \"黒井きんぎょ\",\n        \"kuroi moyamoya\": \"黒井もやもや\",\n        \"kuroichiba\": \"くろいちば\",\n        \"kuroie\": \"黒家\",\n        \"kuroihi\": \"くろいひ\",\n        \"kuroinu\": \"くろ犬\",\n        \"kurokari nigou\": \"黒狩弐号\",\n        \"kurokawa girito\": \"黒川ギリト\",\n        \"kurokawa izumi\": \"黒川 IZUMI\",\n        \"kurokawa juso\": \"黒川呪詛\",\n        \"kurokawa rikuu\": \"黒川律空\",\n        \"kurokawa ryu\": \"黒川竜\",\n        \"kurokawa tasuku\": \"黒川たすく\",\n        \"kurokaze hanare\": \"黒風離零\",\n        \"kuroki bicoco\": \"黒木ビココ\",\n        \"kuroki masahiro\": \"黒木雅弘\",\n        \"kurokishi\": \"黒騎士\",\n        \"kuroko\": \"クロ子\",\n        \"kurokura eri\": \"黒倉エリ\",\n        \"kurokuro\": \"くろくろ\",\n        \"kurokuroku\": \"黒九六\",\n        \"kuromame\": \"クロマメ\",\n        \"kuromame mugicha\": \"黑豆麦茶\",\n        \"kuromi\": \"kuromi\",\n        \"kuromitu\": \"kuromitu\",\n        \"kuromiya sakana\": \"黒宮魚\",\n        \"kuromogu\": \"黒モグ\",\n        \"kuromoinu no kemono\": \"黒藻犬の獣\",\n        \"kurona\": \"くろな\",\n        \"kuroneko nigou\": \"黒猫弐号\",\n        \"kuroneko reigou\": \"黒猫零号\",\n        \"kuronezumi\": \"くろねズみ\",\n        \"kurono masakado\": \"黒乃マサカド\",\n        \"kurono rokurou\": \"黒野六郎\",\n        \"kuroore\": \"黒俺\",\n        \"kurosai\": \"黒齋\",\n        \"kurosaki bunta\": \"黒崎文太\",\n        \"kurosaki kotora\": \"黒崎仔虎\",\n        \"kurosaki mairi\": \"黒崎まいり\",\n        \"kurosaki yuuri\": \"黒崎 百利\",\n        \"kurosawa\": \"クロサワ\",\n        \"kurosawa shouhei\": \"黒沢庄平\",\n        \"kuroshiki\": \"玄式\",\n        \"kurosirogurei\": \"黒白ぐれい\",\n        \"kurosu\": \"黒須\",\n        \"kurosuke\": \"黒すけ\",\n        \"kurota\": \"くろた\",\n        \"kurota nichiru\": \"黒田にちる\",\n        \"kurotama\": \"くろたま\",\n        \"kuroto\": \"黑斗\",\n        \"kurotsuki\": \"黑月\",\n        \"kurotsuki kyouto\": \"黒月京都\",\n        \"kurouku\": \"くろーく\",\n        \"kuroya kenji\": \"黒谷賢志\",\n        \"kuroyume naoto\": \"黒夢奈音\",\n        \"kurozako\": \"くろざこ\",\n        \"kurukuru\": \"クルクル\",\n        \"kuruma\": \"くるま\",\n        \"kurumai\": \"くるまい\",\n        \"kurumi moka\": \"胡桃もか\",\n        \"kurumi riko\": \"胡桃りこ\",\n        \"kurushima\": \"くるしま\",\n        \"kurusu kanon\": \"来栖かのん\",\n        \"kurutsuki\": \"KURUTSUKI\",\n        \"kuruwa aki\": \"くるわ亜希\",\n        \"kusabi keri\": \"楔ケリ\",\n        \"kusahara kuuki\": \"草原空貴\",\n        \"kusairo kaede\": \"草色楓\",\n        \"kusaka maichi\": \"駆坂真一\",\n        \"kusakabe tsukasa\": \"日下部つかさ\",\n        \"kusakami akira\": \"草上明\",\n        \"kusanagi ryuuiti\": \"草薙龍一\",\n        \"kusanagi tonbo\": \"草凪蜻蛉\",\n        \"kusano houki\": \"草野ほうき\",\n        \"kusano tsuyuri\": \"草野つゆり\",\n        \"kushida ashura\": \"くしだあしゅら\",\n        \"kushikatsu koumei\": \"串カツ孔明\",\n        \"kushinada iruwe\": \"櫛灘ゐるゑ\",\n        \"kusnoha kaede\": \"くすのは楓\",\n        \"kusugano\": \"我野\",\n        \"kusunoki hina\": \"楠木ひな\",\n        \"kusunoki rin\": \"楠木りん\",\n        \"kusurin\": \"くすりん\",\n        \"kutsugen kanna\": \"屈原神無\",\n        \"kuurin\": \"空輪\",\n        \"kuusou\": \"空想\",\n        \"kuuya\": \"空也\",\n        \"kuwabara\": \"くわばら\",\n        \"kuwabatake kajuen\": \"桑畑果樹園\",\n        \"kuzirazio\": \"くじらジオ\",\n        \"kuzu\": \"屑\",\n        \"kuzukow\": \"屑コウ\",\n        \"kuzuya\": \"くずや\",\n        \"kuzuyama mememe\": \"屑山めめめ\",\n        \"kuzuyu\": \"葛湯\",\n        \"kuzzy\": \"くっじー\",\n        \"ky.\": \"ky.\",\n        \"kyanite\": \"Kyanite\",\n        \"kyantama\": \"きゃんたま\",\n        \"kyantaman\": \"きゃんたマン\",\n        \"kyarine\": \"きゃりね\",\n        \"kyawashuku\": \"きゃわしゅく\",\n        \"kyohei\": \"KYOHEI\",\n        \"kyokkai\": \"曲解\",\n        \"kyoko\": \"響胡\",\n        \"kyokugeiteki jiisha\": \"曲芸的自慰者\",\n        \"kyokutyo\": \"kyokutyo\",\n        \"kyolnov\": \"キョルノフ\",\n        \"kyoro\": \"きょろ\",\n        \"kyosu\": \"キョス\",\n        \"kyou\": \"kyou\",\n        \"kyou konogoro\": \"kyouこの頃\",\n        \"kyouan\": \"狭暗\",\n        \"kyouka\": \"狂華\",\n        \"kyouno aki\": \"京野秋\",\n        \"kyouta\": \"きょう太\",\n        \"kyouyuu kei\": \"叫遊佳\",\n        \"kyuri\": \"kyuri\",\n        \"kyusui\": \"吸水\",\n        \"kyuun\": \"きゅうん\",\n        \"kyuunosuke\": \"きゅうのすけ\",\n        \"kyuuri\": \"kyuuri\",\n        \"kyuuryuujousai\": \"九龍城砦\",\n        \"kyuusho tarou\": \"急所太郎\",\n        \"kyuushoku\": \"給食\",\n        \"l apple\": \"Lアップル\",\n        \"l-road\": \"エルロード\",\n        \"l-s\": \"L-S\",\n        \"la-men\": \"LA-MEN\",\n        \"lact mangan\": \"楽人満願\",\n        \"lakuhito\": \"lakuhito\",\n        \"lamb\": \"Lamb\",\n        \"lamcha\": \"ラム茶\",\n        \"langerhans\": \"ランゲルハンス\",\n        \"lantana\": \"ランタナ\",\n        \"laomeng\": \"LaoMeng\",\n        \"lapiness\": \"lapiness\",\n        \"larua\": \"ラルア\",\n        \"laserflip\": \"Laserflip\",\n        \"lassie\": \"らっしー\",\n        \"laut 2-sei\": \"ラウト2世\",\n        \"lay dragon\": \"零龍\",\n        \"lazu\": \"Lazu\",\n        \"lazuli\": \"らずり\",\n        \"lbl\": \"LBL\",\n        \"leaf\": \"Leaf\",\n        \"leafy\": \"リーフィ\",\n        \"lee\": \"LEE\",\n        \"lefleau\": \"ルフレ王\",\n        \"lefthand\": \"レフトハンド\",\n        \"leli\": \"レリ\",\n        \"lem\": \"LEM\",\n        \"lemon jiru\": \"レモン汁\",\n        \"lena a-7\": \"LENA[A-7]\",\n        \"lento\": \"蓮斗\",\n        \"leonardo\": \"れオナるド\",\n        \"leonat\": \"レオナト\",\n        \"leopard\": \"レオパルド\",\n        \"leopon\": \"れおぽん\",\n        \"level.21\": \"Level.21\",\n        \"lew\": \"レゥ\",\n        \"lewis\": \"ルイス\",\n        \"lewis mclaren\": \"るいす・まくられん\",\n        \"leymei\": \"LEYMEI\",\n        \"liang xing\": \"狼星\",\n        \"libonzu\": \"吉啓\",\n        \"lielos\": \"ゆいれそ\",\n        \"lien\": \"Lien\",\n        \"like\": \"Like\",\n        \"lilish\": \"lilish\",\n        \"lime\": \"Lime\",\n        \"lina\": \"Lina\",\n        \"lionel\": \"ライオネル\",\n        \"littlemare\": \"リトルメア\",\n        \"liveis watanabe\": \"リーバイス渡辺\",\n        \"llm\": \"LLM\",\n        \"locon\": \"locon\",\n        \"locos\": \"ろこす\",\n        \"lod\": \"Lod\",\n        \"logie\": \"路地\",\n        \"lolee\": \"炉LEE\",\n        \"loliconder\": \"ロリコンダー\",\n        \"lolie\": \"ろりえ\",\n        \"lolimoyashi\": \"ろりもやし\",\n        \"lond\": \"ろんど\",\n        \"lopez hakkinen\": \"ロペス・ハッキネン\",\n        \"loriko\": \"Loriko\",\n        \"lowhide\": \"ろーはいど\",\n        \"luchi\": \"ルーチ\",\n        \"lucie\": \"ルーシー\",\n        \"luck\": \"らっく\",\n        \"lucknight\": \"Lucknight\",\n        \"luka\": \"ルカ\",\n        \"luku\": \"る～く\",\n        \"lummy\": \"Lummy\",\n        \"lumper sheider\": \"LumperSheider\",\n        \"luphis\": \"luphis\",\n        \"lurkergg\": \"Contact\",\n        \"lutein\": \"Lutein\",\n        \"luu\": \"Luu\",\n        \"lux\": \"Lux\",\n        \"luxianne\": \"Contact\",\n        \"lvi\": \"LVI\",\n        \"m\": \"M\",\n        \"m-max\": \"M-MAX\",\n        \"m2go\": \"M2号\",\n        \"m9kndi\": \"m9kndi\",\n        \"ma-yu\": \"ma-yu\",\n        \"mabo\": \"マボ\",\n        \"maboku\": \"魔ボク\",\n        \"mabuchoko m\": \"マブチョコ M\",\n        \"mac-v\": \"MAC-V\",\n        \"macanoka\": \"マカノカ\",\n        \"macaroni\": \"まかろに\",\n        \"maccha\": \"抹茶\",\n        \"maccha chamomo\": \"抹茶ちゃもも\",\n        \"maccha neji\": \"抹茶ねじ\",\n        \"maccha vanilla\": \"抹茶バニラ\",\n        \"macchaume\": \"抹茶梅\",\n        \"macchi\": \"まっち\",\n        \"macchuu\": \"まっちゅう\",\n        \"machi\": \"マチ\",\n        \"machi gaita\": \"街凱太\",\n        \"machi machiko\": \"町マチコ\",\n        \"machigi ruru\": \"街樹るる\",\n        \"machimura komori\": \"町村こもり\",\n        \"machine head\": \"Machine Head\",\n        \"machino henmaru\": \"町野変丸\",\n        \"macho.\": \"マッチョ。\",\n        \"maclo\": \"まっ黒\",\n        \"macop\": \"Macop\",\n        \"madae thor\": \"未江達\",\n        \"madara\": \"まだら\",\n        \"madara sai\": \"まだらさい\",\n        \"mado\": \"まど\",\n        \"madohan\": \"まどはん\",\n        \"madoka hifumi\": \"まどかひふみ\",\n        \"mae\": \"前\",\n        \"maeda\": \"まえだ\",\n        \"maeda momo\": \"まえだもも\",\n        \"maeguchi syunzou\": \"前口俊三\",\n        \"maekawa hayato\": \"前川ハヤト\",\n        \"mag\": \"MAG\",\n        \"mage\": \"mage\",\n        \"magic xiang\": \"Magic_Xiang\",\n        \"magiko\": \"マギコ\",\n        \"magokoro kurage\": \"まごころくらげ\",\n        \"magorona\": \"まごろな\",\n        \"magpoppo\": \"まぐぽっぽ\",\n        \"magtan\": \"まぐたん\",\n        \"magu\": \"マグ\",\n        \"maguro ouji\": \"真黒皇子\",\n        \"maguro taishi\": \"マグロ大使\",\n        \"mahan.\": \"まはん。\",\n        \"mahimaru\": \"まひまる\",\n        \"mahiruno kagerou\": \"まひるの影郎\",\n        \"maho\": \"真秀\",\n        \"mahouya\": \"魔法屋\",\n        \"mai\": \"MAI\",\n        \"myrage\": \"舞麗辞\",\n        \"mai renjie\": \"麥人杰\",\n        \"maihara\": \"まいはら\",\n        \"maihime\": \"舞姫\",\n        \"maino\": \"マイノ\",\n        \"maino umi\": \"まいのうみ\",\n        \"maitake\": \"まいたけ\",\n        \"maji\": \"マジ\",\n        \"majiyoko\": \"まじよこ\",\n        \"maka kiseki\": \"マカキセキ\",\n        \"makano mucchi\": \"摩訶乃ムッチ\",\n        \"makarou\": \"まかろー\",\n        \"suta furachina\": \"スター不埒な＠まかそに\",\n        \"make\": \"make\",\n        \"makedon\": \"まけどん\",\n        \"maki\": \"まき\",\n        \"maki katsuya\": \"勝生真菜美\",\n        \"maki miyuki\": \"牧美雪\",\n        \"maki morun\": \"槙モルン\",\n        \"makiavery\": \"牧亜べりぃ\",\n        \"makigai ikko\": \"巻貝一ヶ\",\n        \"makimaru\": \"巻丸\",\n        \"makinaru\": \"まきなる\",\n        \"makinon tm\": \"まきのんTM\",\n        \"makinosaka shinichi\": \"牧野坂シンイチ\",\n        \"makirin\": \"まきリン\",\n        \"makishi miya\": \"槇志未夜\",\n        \"makita aoi\": \"魔北葵\",\n        \"makita miki\": \"蒔田ミキ\",\n        \"makka\": \"makka\",\n        \"makka na kedamono\": \"真っ赤なケダモノ\",\n        \"makko reader\": \"maッコ・リーダー\",\n        \"makkuro\": \"まっ黒\",\n        \"makomo ashino\": \"まこも葦乃\",\n        \"makoni\": \"makoni\",\n        \"makoto daikichi\": \"まこと大吉\",\n        \"makoushi\": \"魔公子\",\n        \"makpower\": \"Makpower\",\n        \"makui\": \"幕井\",\n        \"makuma ikeru\": \"マ熊イケル\",\n        \"makunouchi\": \"幕野内\",\n        \"makunouchi isami\": \"幕の内勇\",\n        \"makura cover\": \"枕河馬亜\",\n        \"makura no doushi\": \"まくらの同士\",\n        \"makuwa\": \"ま・くわ\",\n        \"malaia\": \"マライぁ\",\n        \"malino\": \"MALINO\",\n        \"maluball\": \"毛玉丸\",\n        \"mam melon\": \"まむめろん\",\n        \"mamaka\": \"麻々花\",\n        \"mame\": \"豆\",\n        \"mame-p\": \"まめP\",\n        \"mamedanuki\": \"まめだぬき\",\n        \"mami\": \"まみ\",\n        \"mamiya\": \"マミヤ\",\n        \"mamiya noriko\": \"間宮法子\",\n        \"mamiya poko\": \"まみやぽこ\",\n        \"mamiya shouko\": \"間宮庄子\",\n        \"mamo\": \"MAMO\",\n        \"mamoi\": \"まもぃ\",\n        \"mamono karin\": \"まものかりん\",\n        \"mamoribito\": \"守り人\",\n        \"mamuru\": \"mamuru\",\n        \"man\": \"mAn\",\n        \"manabe jouji\": \"真鍋譲治\",\n        \"manaka mizuki\": \"マナカミズキ\",\n        \"manao\": \"まなお\",\n        \"manarou\": \"まなろう\",\n        \"manatsu roco\": \"真夏ろこ\",\n        \"manboren\": \"まんぼん練\",\n        \"mance\": \"まんす\",\n        \"manekineko\": \"マネキ猫\",\n        \"mangetsu pon\": \"満月ポン\",\n        \"mangosteen\": \"マンゴスチン\",\n        \"manjiro\": \"まんじろー\",\n        \"manjuurou\": \"まんじゅうろう\",\n        \"manle\": \"マンル\",\n        \"manmosu marimo\": \"マンモスまりも\",\n        \"mao\": \"真尾\",\n        \"mao fabao\": \"猫法宝\",\n        \"mao no\": \"MAOの\",\n        \"maomi leon\": \"真臣レオン\",\n        \"map\": \"まっぷ\",\n        \"maple-go\": \"maple号\",\n        \"mappa\": \"まっぱ\",\n        \"mapputatsu\": \"マップタツ\",\n        \"marble\": \"マーブル\",\n        \"mare halberd eye\": \"メアー・ハルベルト・アイ\",\n        \"mareo\": \"まれお\",\n        \"margamoid\": \"まーがもいど\",\n        \"maria\": \"まりあ\",\n        \"marianne hanako\": \"マリアンヌ花子\",\n        \"marika\": \"まりか\",\n        \"marimo\": \"マリモ\",\n        \"marin\": \"まりる\",\n        \"marinade vinegar\": \"マリネ・ビネガー\",\n        \"mario kaneda\": \"まりお金田\",\n        \"maripyon\": \"まりぴょん\",\n        \"maririn\": \"まりりん\",\n        \"maririn anaka\": \"マリリンあなか\",\n        \"marlin\": \"まーりん\",\n        \"marron\": \"魔龍\",\n        \"martan\": \"まあたん\",\n        \"maru\": \"マル\",\n        \"maru dasshu\": \"まるだっしゅ\",\n        \"maru mary\": \"墨丸まり\",\n        \"maru mikan\": \"○蜜柑\",\n        \"maru sun\": \"まるサン\",\n        \"maru.\": \"まる。\",\n        \"marubayashi shumaru\": \"○林修○\",\n        \"marugoto ringo\": \"まるごと林檎\",\n        \"maruhage p\": \"丸禿P\",\n        \"marui\": \"まるい\",\n        \"marui ryuu\": \"まるいりゅう\",\n        \"marukidou\": \"まるキ堂\",\n        \"marukome\": \"まるこめ\",\n        \"maruma\": \"まるま\",\n        \"marumarusuke\": \"まる丸介\",\n        \"marumi\": \"丸美\",\n        \"marumu\": \"まるむ\",\n        \"maruna\": \"まるな\",\n        \"marunosuke\": \"まるのすけ\",\n        \"marupuni\": \"まるぷに\",\n        \"marurou\": \"まるろう\",\n        \"marurumi\": \"まるるみ\",\n        \"maruto\": \"Maruto!\",\n        \"maruyama kaori\": \"まるやま香里\",\n        \"maruyama kei\": \"丸山圭\",\n        \"masa\": \"将\",\n        \"masa-nii\": \"マサ兄\",\n        \"masaki\": \"MASAKI\",\n        \"masaki shisari\": \"真咲シサリ\",\n        \"masakichi\": \"まさきち\",\n        \"masama\": \"まさma\",\n        \"masamu\": \"マサムー\",\n        \"masanaga\": \"政长\",\n        \"masara\": \"まさら\",\n        \"masaya ichika\": \"磨鞘一佳\",\n        \"masayoshi tomoko\": \"まさよしともこ\",\n        \"masbe akyto\": \"まそべ晶磨\",\n        \"masha\": \"masha\",\n        \"mashikodori\": \"ましこどり\",\n        \"mashiro\": \"ましろ\",\n        \"mashitaka\": \"ましたか\",\n        \"mashu maro\": \"真朱麻呂\",\n        \"mashune\": \"MASHUNE\",\n        \"mask the j\": \"マスクザJ\",\n        \"massan\": \"まっさん\",\n        \"masuda tsuyoshi\": \"増田剛\",\n        \"masuishi kinoto\": \"桝石きのと\",\n        \"masujima kensue\": \"ますじまけんすー\",\n        \"masumasu\": \"ますます\",\n        \"masurao\": \"ますらお\",\n        \"matashita kintama\": \"股下金珠\",\n        \"matatabi\": \"またたび\",\n        \"match\": \"マッチ\",\n        \"matetsu\": \"まてつ\",\n        \"mato\": \"まと\",\n        \"matoba\": \"的場\",\n        \"maton\": \"マトン\",\n        \"matou\": \"まとう\",\n        \"matra-mica\": \"MATRA-MICA\",\n        \"matrix one\": \"ロジャー・マンゴー\",\n        \"matsubara kanabun\": \"松原かなぶん\",\n        \"matsubayashi nagana\": \"松林ながな\",\n        \"matsubayashi satoru\": \"松林悟\",\n        \"matsuda eine\": \"松田えいね\",\n        \"matsue\": \"まつえー\",\n        \"matsuka\": \"松果\",\n        \"matsukura nemu\": \"松倉ねむ\",\n        \"matsumoto akira\": \"松本英\",\n        \"matsumoto himiko\": \"松本姫美子\",\n        \"matsumoto inaki\": \"松本いなき\",\n        \"matsumoto katsuya\": \"まつもとかつや\",\n        \"matsumoto mimiko\": \"松本耳子\",\n        \"matsumoto mitohi.\": \"松本ミトヒ。\",\n        \"matsunaga garana\": \"松永がらな\",\n        \"matsunaga hijiri\": \"松永ヒジリ\",\n        \"matsunoan\": \"松之庵\",\n        \"matsuo\": \"松雄\",\n        \"matsuri\": \"まつり\",\n        \"matsuri miko\": \"まつりみこ\",\n        \"matsurino naginata\": \"祭野薙刀\",\n        \"matsurioka hideyuki\": \"祭丘ヒデユキ\",\n        \"matsushima namio\": \"松島ナオミ\",\n        \"matsuyama hayate\": \"松山はやて\",\n        \"matsuyama seiji\": \"松山せいじ\",\n        \"matsuyoshi ako\": \"松吉アコ\",\n        \"matsuyuki kabun\": \"松足嘉分\",\n        \"matsuzaka reia\": \"まつざかれいあ\",\n        \"matsuzono\": \"松園\",\n        \"matui you\": \"末井夕\",\n        \"maverick\": \"まーべりっく\",\n        \"mawaru\": \"きんたまわる\",\n        \"may\": \"MAY\",\n        \"maya gorou\": \"まゃ～吾郎\",\n        \"maya temple\": \"真夜テンプル\",\n        \"mayag\": \"MayaG\",\n        \"mayama haruji\": \"真山春二\",\n        \"mayamura aki\": \"真矢村明\",\n        \"mayao\": \"まやお\",\n        \"mayashinya\": \"真夜真夜\",\n        \"maybe\": \"めいびい\",\n        \"mayofun\": \"まよふん\",\n        \"mayohara-san\": \"マヨハラさん\",\n        \"mayu\": \"まゆ\",\n        \"mayugeyama\": \"眉毛山\",\n        \"mayuki\": \"マユキ\",\n        \"mazaki katsumi\": \"まざきかつみ\",\n        \"maze\": \"maze*\",\n        \"mcqueen\": \"mcqueen\",\n        \"mebachi maguro\": \"目鉢鮪\",\n        \"mebae\": \"mebae\",\n        \"mebura\": \"めぶら\",\n        \"mee\": \"めー\",\n        \"meem\": \"MEEM!\",\n        \"megi\": \"めぎ\",\n        \"mego\": \"めご\",\n        \"meguo\": \"メグオ\",\n        \"meguro\": \"目黒\",\n        \"meguro linu\": \"目黒霖雨\",\n        \"meguro sankichi\": \"目黒三吉\",\n        \"mei\": \"芽唯\",\n        \"meido sushi\": \"冥土すし\",\n        \"meido yomi\": \"冥土黄泉\",\n        \"meiji\": \"めいじ\",\n        \"meiji michiru\": \"明治ミチル\",\n        \"meika\": \"めいか\",\n        \"meiko\": \"めい子\",\n        \"meito\": \"星名めいと | めいと\",\n        \"meiya\": \"メイヤ\",\n        \"mekabu aji max\": \"めかぶ味MAX\",\n        \"mekuri\": \"めくり\",\n        \"romulo mancin\": \"Romulo Mancin\",\n        \"melodic core.\": \"石月めろこあ\",\n        \"melon22\": \"めろん22\",\n        \"melonleaf\": \"メロソリーフ\",\n        \"melu\": \"Melu\",\n        \"meme\": \"めめ\",\n        \"memeo\": \"女々男\",\n        \"menbo\": \"めんぼ\",\n        \"menimo\": \"めにも\",\n        \"meno\": \"meno\",\n        \"menosuke\": \"メノスケ\",\n        \"mens\": \"Men's\",\n        \"mennsuke\": \"めんスケ\",\n        \"menteiyakuna\": \"めんていやくな\",\n        \"menu.\": \"めぬ。\",\n        \"mepikari\": \"メピカリ\",\n        \"mercy rabbit\": \"マーシーラビット\",\n        \"meri\": \"めり\",\n        \"meria\": \"メリア\",\n        \"meridier\": \"Meridier\",\n        \"meriko\": \"めりこ\",\n        \"merkonig\": \"Merkonig\",\n        \"merry luna\": \"めりぃるな\",\n        \"meshi\": \"めし\",\n        \"mesousan\": \"めそうさん\",\n        \"metabond\": \"めたぼんど\",\n        \"metal gummo\": \"めたるがんも\",\n        \"meten\": \"めてん\",\n        \"meto\": \"Meto\",\n        \"mevius9\": \"mevius9\",\n        \"mezashi gohan\": \"めざしごはん\",\n        \"mhs\": \"MHS\",\n        \"mia\": \"みあ\",\n        \"mibry\": \"MIBRY\",\n        \"micchan\": \"みっちゃん\",\n        \"michael f91\": \"マイコーF91\",\n        \"michairu\": \"ミ茶いる\",\n        \"michikusa akimichi\": \"道草閑道\",\n        \"michinoku atami\": \"みちのくアタミ\",\n        \"michiyoshi\": \"ミチヨシ\",\n        \"mico\": \"蜜co\",\n        \"micopp\": \"micopp\",\n        \"midarin\": \"midarin\",\n        \"midoh torako\": \"水堂とらこ\",\n        \"midorigi mura\": \"緑木邑\",\n        \"midoriko\": \"ミドリコ\",\n        \"midou midori\": \"御堂みどり\",\n        \"midou ren\": \"御堂廉\",\n        \"midou shin\": \"魅堂真\",\n        \"miduki aki\": \"観月あき\",\n        \"miduki sho\": \"みづき翔\",\n        \"miduno kenshi\": \"みづの剣士\",\n        \"miel\": \"Miel\",\n        \"mifune yatsune\": \"三船八音\",\n        \"miga\": \"美雅\",\n        \"migchip\": \"MIGCHIP\",\n        \"migi tonari\": \"みぎ隣\",\n        \"migio moto\": \"右雄基留\",\n        \"migiwa\": \"みぎわ\",\n        \"migiyori\": \"右頼\",\n        \"migu\": \"みぐ\",\n        \"migumigu\": \"みぐみぐ\",\n        \"mihara\": \"みはら\",\n        \"mihara nori\": \"三原のり\",\n        \"miho rei\": \"御歩れい\",\n        \"mii akira\": \"美衣暁\",\n        \"miicho\": \"みーちょ\",\n        \"miiru\": \"みいる\",\n        \"miitoban\": \"みぃとばん\",\n        \"mika pikazo\": \"Mika Pikazo\",\n        \"mika sayaki\": \"みかさやき\",\n        \"mikagami mamizu\": \"水鏡まみず\",\n        \"mikagami sou\": \"水鏡想\",\n        \"mikage kirino\": \"神影霧乃\",\n        \"mikage nao\": \"みかげ尚\",\n        \"mikage sekizai\": \"御影石材\",\n        \"mikagura\": \"みかぐら\",\n        \"mikami cannon\": \"三上キャノン\",\n        \"mikami hokuto\": \"箕神北都\",\n        \"mikami sasara\": \"みかみ沙更\",\n        \"mikamikan\": \"みかみかん\",\n        \"mikan gyuunyuu\": \"みかん牛乳\",\n        \"mikan no kawa houchikai no shinsei\": \"みかんの皮放置界の新星\",\n        \"mikan.\": \"みかん。\",\n        \"mikawa\": \"み皮\",\n        \"mikawa no yummy\": \"三河のヤミー\",\n        \"mikawaya\": \"みかわや\",\n        \"mikaze\": \"みかぜ\",\n        \"mike\": \"ミケ\",\n        \"mikeko\": \"みけこ\",\n        \"mikepon\": \"みけぽん\",\n        \"miketa miekichi\": \"みけ田みい吉\",\n        \"mikihime\": \"みき姫\",\n        \"mikkoukun\": \"ミッコウクン\",\n        \"miko\": \"みこ\",\n        \"mikoita\": \"みこいた\",\n        \"mikokuno homare\": \"みこくのほまれ\",\n        \"mikorin\": \"みこりん\",\n        \"mikoto kei\": \"未琴圭\",\n        \"miku\": \"みく\",\n        \"mikuni hadzime\": \"三国ハヂメ\",\n        \"mil\": \"mil\",\n        \"milcara\": \"ミルキャラ\",\n        \"milda7\": \"Milda7\",\n        \"milele\": \"Milele\",\n        \"militia\": \"みりしゃ\",\n        \"milk panda\": \"みるくぱんだ\",\n        \"milkcow\": \"MILKCOW\",\n        \"milkexplorer\": \"MilkExplorer\",\n        \"milkshake\": \"奶昔\",\n        \"millefeuille\": \"ミル・フィーユ\",\n        \"milli\": \"ミリ\",\n        \"milts\": \"みるつ\",\n        \"mima\": \"みま\",\n        \"mimamui\": \"みまむぃ\",\n        \"mimasaka hideaki\": \"美作英明\",\n        \"mimasaka yorozu\": \"みまさかよろず\",\n        \"mimikaki\": \"みみかき\",\n        \"mimimaru\": \"耳丸\",\n        \"mimishiki\": \"耳式\",\n        \"mimisuke\": \"みみすけ\",\n        \"mimizu\": \"蚯蚓\",\n        \"mimori nahda\": \"水護難陀\",\n        \"mimoton\": \"みもとん\",\n        \"mimoza\": \"みもざ\",\n        \"mimuda ryouzou\": \"みむだ良雑\",\n        \"min\": \"ミン\",\n        \"min-naraken\": \"MIN-NARAKEN\",\n        \"minaduki haruka\": \"水月悠\",\n        \"minaduki nanana\": \"皆月ななな\",\n        \"minagata\": \"ミナガタ\",\n        \"minagi ruiji\": \"ミナギルイジ\",\n        \"minai\": \"ミナイ\",\n        \"minakami hiroki\": \"水上広樹\",\n        \"minakami kurena\": \"水上暮菜\",\n        \"minakami riku\": \"ミナカミ理久\",\n        \"minakawa haruhisa\": \"皆川晴久\",\n        \"minako nami\": \"みなこなみ\",\n        \"minakuchi takashi\": \"水口鷹志\",\n        \"minami funi.\": \"南ふに。\",\n        \"minami kohto\": \"南狡兎\",\n        \"minami kunimusu\": \"南邦結\",\n        \"minami sei\": \"みなみせい\",\n        \"minami star\": \"南☆\",\n        \"minamichou naname\": \"南町ななめ\",\n        \"minamino hazuki\": \"南乃映月\",\n        \"minamishi\": \"南嗣\",\n        \"minamoto\": \"みな本\",\n        \"minamoto jin\": \"皆素人\",\n        \"minamura haruki\": \"皆村春樹\",\n        \"minarai\": \"美奈來\",\n        \"minari\": \"minari\",\n        \"minase kaya\": \"水瀬佳也\",\n        \"minase norihiko\": \"みなせのりひこ\",\n        \"minase ruruu\": \"水瀬るるう\",\n        \"minase sizuku\": \"水瀬雫\",\n        \"minase tamaki\": \"皆瀬たまき\",\n        \"minase taruhi\": \"水無瀬たるひ\",\n        \"minase yowkow\": \"水瀬揺光\",\n        \"minase yuu\": \"水瀬結宇\",\n        \"minato akira\": \"湊晶\",\n        \"minato yoshihiro\": \"湊良弘\",\n        \"minatoya shunsaku\": \"湊谷俊作\",\n        \"minatsuki alumi\": \"水月あるみ\",\n        \"minatsuki hina\": \"みなつきひな\",\n        \"minazoi kuina\": \"水添水鶏\",\n        \"minazuki akira\": \"水無月あきら\",\n        \"minazuki ayu\": \"水無月愛勇\",\n        \"mineyuki\": \"峰之\",\n        \"mingaru\": \"ミンガル\",\n        \"miniru\": \"miniru\",\n        \"minna no haipe\": \"みんなのハイペ\",\n        \"mino kureha\": \"美濃紅葉\",\n        \"minobu gentle\": \"身延ジェントル\",\n        \"minoda kenichi\": \"みのだけんいち\",\n        \"minoh rom\": \"水尾ろむ\",\n        \"ojigi\": \"箕吉\",\n        \"minomushi\": \"みのむし\",\n        \"minor boy\": \"まいなぁぼぉい\",\n        \"minori\": \"みのり\",\n        \"minority\": \"マイノリティ\",\n        \"minpei ichigo\": \"民兵一号\",\n        \"mintice\": \"みんとあいす\",\n        \"minto\": \"みんと\",\n        \"minus a\": \"-A\",\n        \"minutati\": \"みぬたち\",\n        \"mio\": \"MIO\",\n        \"mioki koeru\": \"みおき超\",\n        \"mirai denki\": \"未来電機\",\n        \"miri\": \"ミリ\",\n        \"mirino\": \"みりの\",\n        \"miromiro mumu\": \"みろみろ☆むむ\",\n        \"miru\": \"MIRU\",\n        \"mirun\": \"ミルン\",\n        \"misa\": \"美沙\",\n        \"misagi nagomu\": \"みさぎ和\",\n        \"misaka\": \"御坂\",\n        \"misaka niumu\": \"三坂ニウム\",\n        \"misaka nyuumen\": \"みさかにゅうめん\",\n        \"misaka shou\": \"三坂晶\",\n        \"misaki\": \"御崎\",\n        \"misaki ren\": \"美咲恋\",\n        \"misaki ryo\": \"御前伶\",\n        \"misaki tou\": \"ミサキ闘 | ミサキ糖\",\n        \"misana\": \"みさな\",\n        \"misao\": \"小野ミサオ\",\n        \"misaragi\": \"みさらぎ\",\n        \"misasagi yuuya\": \"ミササギユウヤ\",\n        \"misato nana\": \"三郷なな\",\n        \"miseo\": \"みせお\",\n        \"mishibe hamata\": \"みしべハマタ\",\n        \"mishima hiroji\": \"みしまひろじ\",\n        \"misnon the great\": \"ミスノン・ザ・グレート\",\n        \"miso oden\": \"みそおでん\",\n        \"miso panda\": \"みそパンダ\",\n        \"miso poteto\": \"みそぽてと\",\n        \"misoiri\": \"味噌入り\",\n        \"misono denpachi\": \"みそのデンパ\",\n        \"misonou\": \"みそのう\",\n        \"misooden\": \"みそおでん\",\n        \"misril\": \"Misril\",\n        \"miss black\": \"MISS BLACK\",\n        \"missile228\": \"MISSILE228\",\n        \"mister\": \"ミスター\",\n        \"mister ochitsu\": \"ミスターおちつ\",\n        \"misumi natsuki\": \"水澄夏希\",\n        \"mita kazuo\": \"三田和夫\",\n        \"mita satomi\": \"みたさとみ\",\n        \"mitaka\": \"美岳\",\n        \"mitamori tatsuya\": \"みた森たつや\",\n        \"mitarai\": \"御手洗\",\n        \"mitarai yuuki\": \"御手洗佑樹\",\n        \"mitarashi kousei\": \"みたらし侯成\",\n        \"mitei\": \"未定\",\n        \"mito\": \"ミト\",\n        \"miton\": \"みとん\",\n        \"mitsu king\": \"蜜キング\",\n        \"mitsufuji kouichi\": \"みつふじこういち\",\n        \"mitsui mana\": \"みついまな\",\n        \"mitsuie\": \"みついえ\",\n        \"mitsukazu\": \"みつかず\",\n        \"mitsuki kisara\": \"観月きさら\",\n        \"mitsuki mantarou\": \"光姫満太郎\",\n        \"mitsuki ponz\": \"蜜葵ぽんず\",\n        \"mitsuki yuuya\": \"御月ユウヤ\",\n        \"mitsumaro\": \"みつまろ\",\n        \"mitsurugi tsurugi\": \"御剱剣\",\n        \"mitsuya\": \"みつや\",\n        \"mitsuyama hajime\": \"みつやまはじめ\",\n        \"mitty\": \"Mitty\",\n        \"miu\": \"みU\",\n        \"miumi\": \"みうみ\",\n        \"miura\": \"miura\",\n        \"miura jota\": \"三浦いお太\",\n        \"miya\": \"みや\",\n        \"miya9\": \"miya9\",\n        \"miyabe makoto\": \"みやべまこと\",\n        \"miyabi tsuzuru\": \"みやびつづる\",\n        \"miyabi yutaka\": \"ミヤビユタカ\",\n        \"miyabikawa sakura\": \"雅川佐倉\",\n        \"esaki tamotsu\": \"江崎惟\",\n        \"miyagi yasutomo\": \"宮城靖朋\",\n        \"miyagoe yoshitsuki\": \"宮越良月\",\n        \"miyahara mimikaki\": \"みやはらみみかき\",\n        \"miyakawa hajime\": \"美夜川はじめ\",\n        \"kyou no gohan\": \"京のごはん\",\n        \"miyama rima\": \"宮馬りま\",\n        \"miyama zero\": \"美山零\",\n        \"miyamoto ikusa\": \"みやもといくさ\",\n        \"miyamoto yuu\": \"みやもとゆう\",\n        \"miyamu\": \"みやむ\",\n        \"miyamura\": \"みやむら\",\n        \"miyane aki\": \"みやねあき\",\n        \"miyanogi jiji\": \"宮野木ジジ\",\n        \"miyanoyuki\": \"みやのゆき\",\n        \"miyashita kitsune\": \"宮下キツネ\",\n        \"miyatsuki itsuka\": \"美弥月いつか\",\n        \"miyauchi yuka\": \"宮内由香\",\n        \"miyazaki yuki\": \"宮崎ユウキ\",\n        \"miyazawa riewo\": \"宮沢りえを\",\n        \"miyoichi\": \"みよいち\",\n        \"miyu\": \"MIYU\",\n        \"miyuki\": \"深雪\",\n        \"miyuki yaya\": \"御幸やや\",\n        \"miyuma subaru\": \"未由間すばる\",\n        \"miyuu\": \"未柚\",\n        \"mizinnkosutinn\": \"みじんこすちん\",\n        \"mizo\": \"原人\",\n        \"mizoguchi kou\": \"ミゾグチコウ\",\n        \"mizu\": \"mizu\",\n        \"mizu asato\": \"水あさと\",\n        \"mizuha\": \"みずは\",\n        \"mizuhara mei\": \"水原明\",\n        \"mizuhati saru\": \"水八申\",\n        \"mizui\": \"みずい\",\n        \"mizuiro megane\": \"みずいろ めがね\",\n        \"mizujouyu\": \"水醤油\",\n        \"mizuki\": \"みずき\",\n        \"mizuki gai\": \"水樹凱\",\n        \"mizuki haruto\": \"みづき春人\",\n        \"mizuki hitoshi\": \"みずきひとし\",\n        \"miduki honey\": \"水月ハニー\",\n        \"mizuki loose\": \"みづきるうず\",\n        \"mizuki makoto\": \"観月真\",\n        \"mizuki yuu\": \"瑞紀悠\",\n        \"mizuki yuuma\": \"みずき佑真\",\n        \"mizukimaru\": \"満月◯\",\n        \"mizumidori\": \"水緑\",\n        \"mizumori omizu\": \"水森おみず\",\n        \"mizumura kaoru\": \"水村かおる\",\n        \"mizuna\": \"みづな\",\n        \"mizunashi\": \"みずなし\",\n        \"mizunezumi\": \"水鼠\",\n        \"mizuno\": \"みずの\",\n        \"mizuno haruyoshi\": \"水野珍\",\n        \"mizuno kei\": \"水野慧\",\n        \"mizuno makoto\": \"みずのまこと\",\n        \"mizuno mumomo\": \"水野むもも\",\n        \"mizuno poppo\": \"水翠野ポッポ\",\n        \"mizuno sao\": \"水野早桜\",\n        \"mizunoe nemone\": \"壬星ねもね\",\n        \"mizusaka saki\": \"水坂早希\",\n        \"mizusawa\": \"水澤\",\n        \"mizusawa mimori\": \"水沢深森\",\n        \"mizusawa nagi\": \"水沢凪\",\n        \"mizushima aru\": \"みづしま亜留\",\n        \"mizushima kero\": \"水島ケロ\",\n        \"mizushima sei\": \"みずしま聖\",\n        \"mizushina minato\": \"水科湊\",\n        \"mizushiro takuya\": \"水城たくや\",\n        \"mizutama\": \"みずたま\",\n        \"mizutani tooru\": \"水谷とおる\",\n        \"mizuto\": \"水兎\",\n        \"mizuya tiharu\": \"水夜ちはる\",\n        \"mizuyoukan\": \"水ようかん\",\n        \"mko\": \"マキオ\",\n        \"ml\": \"ML\",\n        \"mm\": \"えむえむ\",\n        \"mmmnomu\": \"むむむのム\",\n        \"mnk\": \"MNK\",\n        \"mo\": \"もっさん\",\n        \"moai tentyou\": \"モアイ店長\",\n        \"moccyi\": \"モッチィー\",\n        \"mochi ice\": \"もちアイス\",\n        \"mochi sensee\": \"もちせんせぇ\",\n        \"mochiduki nano\": \"モチヅキナノ\",\n        \"mochiji tada\": \"餅持唯\",\n        \"mochikuu usagi\": \"もちくううさぎ\",\n        \"mochimako\": \"モチマコ\",\n        \"mochinosora\": \"もちのそら\",\n        \"mochizuki nao\": \"望月なお\",\n        \"mochizuki tooya\": \"望月とーや\",\n        \"mockmock\": \"MockMock\",\n        \"moech\": \"moech\",\n        \"moeda kazukichi\": \"萌田かずきち\",\n        \"moeki yuta\": \"萌木雄太\",\n        \"moekichi.\": \"もえきち。\",\n        \"mofuriru\": \"もふりる\",\n        \"mogg\": \"mogg\",\n        \"mogi\": \"モギ\",\n        \"mogi yasunobu\": \"茂木康信\",\n        \"mogiri\": \"もぎり\",\n        \"mogo-721\": \"mogO-721\",\n        \"mogunosukes\": \"モグ乃助\",\n        \"mogupuchi.\": \"もぐぷち。\",\n        \"moiky\": \"Moiky\",\n        \"moizumi shipon\": \"茂泉しぽん\",\n        \"moja\": \"MOJA\",\n        \"mokamoka\": \"モカモカ\",\n        \"moke\": \"もけ\",\n        \"mokei\": \"百景\",\n        \"mokeke\": \"mokeke\",\n        \"mokichi\": \"茂吉\",\n        \"mokke\": \"もっけ\",\n        \"mokki\": \"もっき\",\n        \"moko\": \"もこ\",\n        \"mokokee\": \"もこけ\",\n        \"mokomoko yanakku\": \"モコモコヤナック\",\n        \"mokumokuren\": \"目目蓮\",\n        \"mokushi\": \"もくし\",\n        \"mokyu\": \"もきゅ\",\n        \"momi\": \"もみ\",\n        \"momiji\": \"もみじ\",\n        \"momiji mao\": \"もみじ真魚\",\n        \"momijizuki luna\": \"紅葉月るな\",\n        \"momizi inori\": \"紅葉いのり\",\n        \"momo\": \"もも\",\n        \"momo inu\": \"ももいぬ\",\n        \"momo iwao\": \"百々巌\",\n        \"momo no kanzume\": \"桃の缶詰\",\n        \"momoda yasuhito\": \"百田やすひと\",\n        \"momoe\": \"ももえ\",\n        \"momofuki rio\": \"桃吹リオ\",\n        \"momohime shibuki\": \"桃姫しぶき\",\n        \"momoiro retas\": \"桃色レタス\",\n        \"momokan85\": \"momokan85\",\n        \"momomitsu kinako\": \"桃蜜きなこ\",\n        \"momomo\": \"ももも\",\n        \"momonashi potato\": \"桃梨ぽてと\",\n        \"momonga\": \"桃ん画\",\n        \"momosaki\": \"桃咲\",\n        \"momose\": \"ももせ\",\n        \"momose sei\": \"百瀬せー\",\n        \"momoshiro\": \"モモシロ\",\n        \"momota momo\": \"モモタ モモ\",\n        \"mon-petit\": \"もんぷち\",\n        \"monaka\": \"最中\",\n        \"monatsu\": \"もなつ\",\n        \"monchan rev3\": \"もんちゃんrev3\",\n        \"monchy\": \"もんちぃ\",\n        \"monimitto\": \"もにみっと\",\n        \"monin\": \"もにん\",\n        \"moninna\": \"もにんな\",\n        \"monio\": \"もにお\",\n        \"monkey ni-gou\": \"悶鬼威弐号\",\n        \"monkeycandy\": \"MonkeyCandy\",\n        \"monme\": \"monme\",\n        \"monodevil\": \"ものっち\",\n        \"monou natsuki\": \"桃生夏綺\",\n        \"monsuke\": \"MONSUKE\",\n        \"monvasa\": \"モンヴァサ\",\n        \"moonlight\": \"むーんらいと\",\n        \"mor.\": \"モル\",\n        \"more\": \"モレ\",\n        \"mori\": \"森\",\n        \"mori takuya\": \"杜拓哉\",\n        \"moribell\": \"モリーベル\",\n        \"moricocco\": \"もりこっこ\",\n        \"morii\": \"MORII\",\n        \"morii fuzuki\": \"森井文月\",\n        \"morii shizuki\": \"森井しづき\",\n        \"morikawa\": \"もりかわ\",\n        \"morikawa narumi\": \"森川鳴海\",\n        \"morikurousagi\": \"森黑兎\",\n        \"warabi mochi\": \"わらびモチ\",\n        \"morina masayuki\": \"森菜雅雪\",\n        \"morinaga milk\": \"森永みるく\",\n        \"morinaga ramune\": \"森永らむね\",\n        \"morino hon\": \"もりのほん\",\n        \"morino kinoco\": \"森乃きの子\",\n        \"morino kinoko\": \"森乃きのこ\",\n        \"morino muck\": \"森野ムック\",\n        \"morinomiya maachi\": \"森ノ宮まあち\",\n        \"morisaki tirol\": \"森崎ちろる\",\n        \"morisaki yoshino\": \"杜崎淑乃\",\n        \"morishige\": \"もりしげ\",\n        \"morishima petit\": \"森嶋プチ\",\n        \"morishita kaoru\": \"モリシタカオル\",\n        \"morisoba\": \"もりそば\",\n        \"morisova\": \"morisova\",\n        \"morisugi\": \"morisugi\",\n        \"moritaka takashi\": \"もりたかたかし\",\n        \"moritake\": \"モリタケ\",\n        \"moritan\": \"もりたん\",\n        \"moriyama rikka\": \"森山六花\",\n        \"moriyama shijimi\": \"森山しじみ\",\n        \"morochin-san\": \"もろちんさん\",\n        \"morokoshitaroh\": \"morokoshitaroh\",\n        \"morota\": \"もろた\",\n        \"morozumi junka\": \"両角潤香\",\n        \"morpheus\": \"モルペウス\",\n        \"morris\": \"モリス\",\n        \"moruda\": \"もる田\",\n        \"moruga\": \"MORUGA\",\n        \"mos\": \"Mos\",\n        \"mosa\": \"モサ\",\n        \"moscow\": \"モスクワ\",\n        \"mosha\": \"もしゃ\",\n        \"mosuke\": \"mosuke\",\n        \"motchie\": \"もっちー\",\n        \"moti moti omoti\": \"餅もちお餅\",\n        \"mothica\": \"モティカ\",\n        \"moto\": \"MoTo\",\n        \"motobi\": \"もとび\",\n        \"motoe hiroya\": \"元永尋也\",\n        \"motoichi\": \"素壱\",\n        \"motomushi\": \"元虫\",\n        \"motoyon\": \"基4\",\n        \"motsu\": \"もつ\",\n        \"motsuaki\": \"もつあき\",\n        \"motti\": \"モッチー\",\n        \"mou\": \"もう\",\n        \"moukin punch\": \"猛禽パンチ\",\n        \"mountain pukuichi\": \"マウンテンプクイチ\",\n        \"moup\": \"もうぴい\",\n        \"moya\": \"moya\",\n        \"moyashi\": \"もやし\",\n        \"moyasibasto\": \"もやしばーすと\",\n        \"moyomoto lv48\": \"もょもとLV48\",\n        \"moyori\": \"moyori\",\n        \"moyuru-n\": \"MOYURU/n\",\n        \"moza\": \"もざ\",\n        \"mozuku\": \"もずく\",\n        \"mozuya murasaki\": \"もずや紫\",\n        \"mr.lostman\": \"Mr.Lostman\",\n        \"mr.sugar\": \"MR.sugar\",\n        \"mr.way\": \"Mr.way\",\n        \"mt\": \"mt\",\n        \"mt.somo\": \"Mt.somo\",\n        \"mtd\": \"mtd\",\n        \"mu mu munou\": \"66-夢王\",\n        \"mu-min\": \"夢～眠\",\n        \"mucc\": \"ムック\",\n        \"muchabou\": \"無茶坊\",\n        \"mufuru\": \"ムフル\",\n        \"mugen no ossan\": \"無限のおっさん\",\n        \"mugendai\": \"無限大\",\n        \"mugenkidou\": \"無限軌道\",\n        \"mugi\": \"MUGI\",\n        \"mugicha\": \"麦茶\",\n        \"mugichoko\": \"むぎちょこ\",\n        \"mugimaru\": \"麦丸\",\n        \"mugino hotaru\": \"麦野ほたる\",\n        \"muichimon\": \"無一文\",\n        \"mujiko\": \"むじこ\",\n        \"mujin\": \"霧迅\",\n        \"mujina\": \"むじな\",\n        \"mukai kiyoharu\": \"むかいきよはる\",\n        \"mukai masayoshi\": \"向正義\",\n        \"mukasa kouki\": \"六笠洸季\",\n        \"mukaunosato isuke\": \"イスケ・グラタニティー\",\n        \"mukeikaku\": \"夢計画\",\n        \"mukku\": \"MUKKU\",\n        \"mukouhara shiryu\": \"むこうはらしりゅう\",\n        \"mukuge\": \"毳\",\n        \"mukyuu\": \"むきゅう☆\",\n        \"mumin\": \"むみん\",\n        \"mumu\": \"MUMU\",\n        \"mumumu\": \"むむむ\",\n        \"munashimujou\": \"むなしむじょう\",\n        \"munitin\": \"むにちん\",\n        \"munomerikun\": \"ミネむら\",\n        \"munoshishi\": \"むのしし\",\n        \"munyuu\": \"むにゅう\",\n        \"murai g\": \"村井Ｇ\",\n        \"murai kei\": \"ムライケイ\",\n        \"murakami\": \"村上\",\n        \"murakami masaki\": \"村上雅貴\",\n        \"murakumo\": \"村雲\",\n        \"muramurabito\": \"村々村\",\n        \"muranako\": \"ムラナコ\",\n        \"murasaki\": \"むらさき\",\n        \"murasaki akari\": \"むらさきあかり\",\n        \"murasaki orange\": \"紫オレンジ\",\n        \"murasaki tohka\": \"村崎とーか\",\n        \"murasakiiro orange\": \"むらさきいろオレンジ\",\n        \"murasame chiaki\": \"村雨知秋\",\n        \"murasame ha\": \"村雨刃\",\n        \"murasame maru\": \"村雨丸\",\n        \"murata denji\": \"村田電磁\",\n        \"murata.\": \"ムラタ。\",\n        \"muren\": \"ムウレン\",\n        \"muro\": \"むろ\",\n        \"muryou myakudou\": \"無料脈動\",\n        \"musashino sekai\": \"ムサシノセカイ\",\n        \"musasiya chogenbo\": \"武蔵屋長元坊\",\n        \"muscleman\": \"マッスルマン\",\n        \"mushanokouji atsune\": \"武者小路あつね\",\n        \"mushiboy\": \"MUSHIBOY\",\n        \"musouduki\": \"梦双月\",\n        \"muteki soda\": \"无敌苏打\",\n        \"muten\": \"武天\",\n        \"mutou\": \"無糖\",\n        \"mutou hiroki\": \"武藤裕樹\",\n        \"mutou keiji\": \"むとうけいじ\",\n        \"mutou kurihito\": \"武藤此史\",\n        \"mutou rei\": \"武藤礼恵\",\n        \"mutsu\": \"ムツ\",\n        \"mutsu nagare\": \"陸奥流\",\n        \"mutsuki aya\": \"睦月綾\",\n        \"mutsuki ginji\": \"睦月ぎんじ\",\n        \"mutsuki haru\": \"睦月はる\",\n        \"mutsuki hiiro\": \"睦月緋色\",\n        \"mutsuki kei\": \"睦月圭\",\n        \"mutsuki lime\": \"むつき来夢\",\n        \"mutsumi\": \"むつみ\",\n        \"mutuki shin\": \"六樹しん\",\n        \"mutumi\": \"MuTuMi\",\n        \"mutunari\": \"むつなり\",\n        \"muumuu\": \"ムームー\",\n        \"muuna\": \"むーな\",\n        \"muunyan\": \"むーにゃん\",\n        \"muya\": \"むや\",\n        \"myaa\": \"みゃー\",\n        \"myake\": \"みゃけ\",\n        \"myanie\": \"宮兄\",\n        \"myouga\": \"茗荷\",\n        \"myouji namae\": \"苗字なまゑ\",\n        \"mytyl\": \"Mytyl\",\n        \"myuratch\": \"Myuratch\",\n        \"myv\": \"myv\",\n        \"mzk\": \"MZK\",\n        \"mzne\": \"mzne\",\n        \"n\": \"ん\",\n        \"n-p-katou\": \"N・P・KATOU\",\n        \"n820\": \"n820\",\n        \"na\": \"な\",\n        \"naba\": \"菜葉\",\n        \"nabe\": \"Nabe\",\n        \"nabenco\": \"なべんこ\",\n        \"nabeshiki\": \"ナベシキ\",\n        \"nabeshima mike\": \"鍋島ミケ\",\n        \"nabeya sakihana\": \"鍋谷咲花\",\n        \"nabeyu\": \"なべゆ\",\n        \"nabuu\": \"なぶぅ\",\n        \"nac\": \"Nac\",\n        \"nacha\": \"NACHA\",\n        \"nachiku\": \"なちく\",\n        \"naco\": \"なこ\",\n        \"nada haruka\": \"灘遥歌\",\n        \"nadzuka\": \"ナヅカ\",\n        \"nae\": \"なえ\",\n        \"nagai kao\": \"永井佳緒\",\n        \"nagai momiage\": \"长井もみあげ\",\n        \"nagaikusa\": \"長い草\",\n        \"nagamatsu heizo\": \"永松平蔵\",\n        \"nagami mairu\": \"長海まいる\",\n        \"nagana sayui\": \"ながな坂結\",\n        \"naganeko\": \"ながねこ\",\n        \"naganohara nis\": \"長野原にす\",\n        \"naganoon\": \"ながの～ん\",\n        \"naganoro\": \"ながのろ\",\n        \"nagare\": \"nagare\",\n        \"nagareboshi\": \"流れ星\",\n        \"nagareboshi purin\": \"流れ星☆プリン\",\n        \"nagaro\": \"ながろ\",\n        \"nagase yuuki\": \"长濑佑希\",\n        \"nagasode\": \"长そで\",\n        \"nagata tsubasa\": \"永田翼\",\n        \"nagatsuki rio\": \"长月莉绪\",\n        \"nagi mayuko\": \"凪まゆこ\",\n        \"nagi wataru\": \"那木渡\",\n        \"nagisa manoa\": \"渚まのあ\",\n        \"nagisano usagi\": \"渚乃兎\",\n        \"nagisawa you\": \"なぎさわゆう\",\n        \"naglfar\": \"なぐるふぁる\",\n        \"nago.k\": \"NAGO.K\",\n        \"nagoshi\": \"夏越\",\n        \"nagoya shachihachi\": \"名古屋鯱八\",\n        \"naguu\": \"なぐう\",\n        \"nagy\": \"ナギー\",\n        \"nagyo\": \"なぎょ\",\n        \"naha ryou\": \"那覇了\",\n        \"naik\": \"NAiK\",\n        \"naipeta\": \"ないぺた\",\n        \"naisho\": \"内緒\",\n        \"naito loveca\": \"内藤らぶか\",\n        \"naitou gura\": \"内東ぐら\",\n        \"naitou haruto\": \"内藤春人\",\n        \"naitou ryuu\": \"内藤隆\",\n        \"naizou chimuko\": \"内蔵チムコ\",\n        \"nakabe e\": \"なかべ江\",\n        \"nakafusa momo\": \"中総もも\",\n        \"nakagawa\": \"中川\",\n        \"nakagawa kei\": \"中川けい\",\n        \"nakagawa ryna\": \"中川リィナ\",\n        \"nakahata izuru\": \"仲畑いづる\",\n        \"nakai\": \"ナカイ\",\n        \"nakai kana\": \"なかいかな\",\n        \"nakajima akihiko\": \"中島秋彦\",\n        \"nakajima kotoko\": \"中島ことこ\",\n        \"nakajima rei\": \"中島零\",\n        \"nakajima tomoki\": \"なかじまともき\",\n        \"nakajou\": \"ナカジョー\",\n        \"nakami yoshikage\": \"中海美影\",\n        \"nakamura hirofumi\": \"中村博文\",\n        \"nakamura kanko\": \"中村カンコ\",\n        \"nakamura koutarou\": \"中村紅太郎\",\n        \"nakamura morris\": \"中村モリス\",\n        \"nakamura osawari kun\": \"中村おさわり君\",\n        \"nakamura rumi\": \"仲村留海\",\n        \"nakamura subaru\": \"なかむらすばる\",\n        \"nakamura syumitto\": \"中村趣味人\",\n        \"nakamura uzuki\": \"中村卯月\",\n        \"nakamura zeus\": \"中村天神\",\n        \"nakano\": \"中野\",\n        \"nakano yuu\": \"中野ゆう\",\n        \"nakanoku kurochan\": \"中野区くろちゃん\",\n        \"nakaore porkbits\": \"中折れポークビッツ\",\n        \"nakasone haiji\": \"中曽根ハイジ\",\n        \"nakasumi\": \"なかすみ\",\n        \"nakata hana\": \"なかた華\",\n        \"nakatsugawa minoru\": \"中津川みのる\",\n        \"nakaya\": \"なかや\",\n        \"nakayama miyuki\": \"中山みゆき\",\n        \"nakayuki\": \"仲雪\",\n        \"nakazawa hinoto\": \"なかざわひのと\",\n        \"nakika\": \"鳴華\",\n        \"nako\": \"なこ\",\n        \"nako mameta\": \"なこ豆太\",\n        \"nakuma meika\": \"なくま冥架\",\n        \"nakura\": \"なくら\",\n        \"nakura yumari\": \"奈倉ゆまり\",\n        \"nalvas\": \"nalvas\",\n        \"nalzo\": \"nalzo\",\n        \"namaki\": \"奈慎\",\n        \"namakura\": \"なまくら\",\n        \"namakura makibishi\": \"鈍撒菱\",\n        \"namanie\": \"生煮え\",\n        \"namao\": \"なまお\",\n        \"namazu\": \"なまず\",\n        \"name\": \"なめ\",\n        \"name john\": \"なめジョン\",\n        \"namekata fumiaki\": \"行方ふみあき\",\n        \"nametake\": \"なめ茸\",\n        \"namiri\": \"なみり\",\n        \"namita\": \"浪田\",\n        \"namusan\": \"南無三\",\n        \"nana\": \"奈々\",\n        \"nana shinshi\": \"七紳士\",\n        \"nanaca mai\": \"ななかまい\",\n        \"nanae\": \"Nanae\",\n        \"nanae juu\": \"七影愁\",\n        \"nanagami you\": \"七神優\",\n        \"nanahachi\": \"ななはち\",\n        \"nanahi tosi\": \"七比とし\",\n        \"nanahime\": \"ななひめ\",\n        \"nanahoshi nas\": \"七星なす\",\n        \"nanahoshi tento\": \"七星てんと\",\n        \"nanakawa roduka\": \"七川楼塚\",\n        \"nanaki nana\": \"ナナキナナ\",\n        \"nanaki seijyu\": \"七輝静樹\",\n        \"nanako\": \"ナナコ\",\n        \"nanakoro\": \"七転\",\n        \"nanakura nanane\": \"七座菜々音\",\n        \"nanakusa amane\": \"七草天音\",\n        \"nanakusa mutsuki\": \"七草むつき\",\n        \"nanamaru\": \"菜々丸\",\n        \"nanami ayane\": \"七海綾音\",\n        \"nanami natuki\": \"七海夏樹\",\n        \"nanami shizuka\": \"ななみ静\",\n        \"nanami yasuna\": \"ナナミヤスナ\",\n        \"nanamiya rin\": \"ななみやりん\",\n        \"nanamiya tsugumi\": \"七宫つぐ实\",\n        \"nanamo\": \"ななも\",\n        \"nanamomo rio\": \"七桃りお\",\n        \"nanana nana\": \"七名菜奈\",\n        \"nananana nanana\": \"七々ななな\",\n        \"nanao mizuho\": \"七尾瑞穂\",\n        \"nanao-kun\": \"ななおくん\",\n        \"nanase aoi\": \"七瀬葵\",\n        \"nanase masato\": \"七瀬雅人\",\n        \"nanase michiru\": \"七瀬みちる\",\n        \"nanasiro\": \"ななしろ\",\n        \"nanasumi\": \"奈々澄\",\n        \"nanatsu nemu\": \"七夏ねむ\",\n        \"nanbu arata\": \"南部新\",\n        \"nandaba\": \"ナンダバ\",\n        \"naniwadou matatabi\": \"浪花道またたび\",\n        \"nankai no sizimi\": \"南海のしぢみ\",\n        \"nankakureman\": \"なんかくれまん\",\n        \"nankin maachan\": \"南京まーちゃん\",\n        \"nannal\": \"なんなる\",\n        \"nano\": \"nano\",\n        \"nanotaro\": \"なのたろ\",\n        \"nantetsu\": \"軟鉄\",\n        \"nantomo anison\": \"なんともアニソン\",\n        \"nanzaki iku\": \"南崎いく\",\n        \"nao\": \"なお\",\n        \"nao hiren\": \"緋蓮尚\",\n        \"nao michi\": \"直通\",\n        \"naochi\": \"naochi\",\n        \"naohiro\": \"NAOHIRO\",\n        \"naokame\": \"直かめ\",\n        \"naoki\": \"なおき\",\n        \"naokichi.\": \"なおきち。\",\n        \"naoko\": \"なお子\",\n        \"naonao\": \"尚尚\",\n        \"naop\": \"naop\",\n        \"narashino zoe\": \"習志野ゾーイ\",\n        \"narcisse noir\": \"なるしすのあ～る\",\n        \"narinatsu machi\": \"成夏万智\",\n        \"nario\": \"ナリヲ\",\n        \"narita riuku\": \"成田りうく\",\n        \"narita rumi\": \"成田るみ\",\n        \"narita suguru\": \"成田すぐる\",\n        \"narukami\": \"なるかみ\",\n        \"narukami ginryu\": \"鳴神銀龍\",\n        \"narukami x\": \"鳴神X\",\n        \"narumi\": \"ナルみ\",\n        \"narumi meiko\": \"鳴海鳴子\",\n        \"narumi yuu\": \"鳴海ゆう\",\n        \"narusawa aya\": \"鳴沢綾\",\n        \"narusawa sora\": \"成沢 空\",\n        \"naruse\": \"なるせ\",\n        \"naruse makoto\": \"成瀬真琴\",\n        \"naruse mamoru\": \"成瀬守\",\n        \"naruse michi\": \"成瀬みち\",\n        \"narushima godou\": \"成岛ゴドー\",\n        \"nas\": \"NAS\",\n        \"nas-o\": \"NAS-O\",\n        \"nasake muyou\": \"なさけむよう\",\n        \"nash\": \"nash\",\n        \"nashie\": \"なしえ\",\n        \"nashinori tunnel\": \"梨憲タヌル\",\n        \"nashiru\": \"なしる\",\n        \"nassukun\": \"ナッス君\",\n        \"nasu\": \"茄子\",\n        \"nasu hanahana\": \"那須花花\",\n        \"nasukichi\": \"茄子吉\",\n        \"nasuo\": \"なすお\",\n        \"natin\": \"なてぃん\",\n        \"nato\": \"NATO\",\n        \"natsu\": \"捺\",\n        \"natsu kirin\": \"ナツキリン\",\n        \"natsufuyu denki\": \"夏冬伝季\",\n        \"natsuhara saike\": \"夏原サイケ\",\n        \"natsuhime yuran\": \"夏媛柚蘭\",\n        \"natsukawa sarasa\": \"なつかわさらさ\",\n        \"natsuki\": \"奈月\",\n        \"natsuki coco\": \"奈月ここ\",\n        \"natsuki hajime\": \"夏生一\",\n        \"natsuki shuri\": \"なつきしゅり\",\n        \"natsuki takatora\": \"なつきたかとら\",\n        \"natsume\": \"夏目\",\n        \"natsume kei\": \"夏目系\",\n        \"natsumezaka sorekara\": \"夏目坂それから\",\n        \"natsumi\": \"Natsumi\",\n        \"natsumi akira\": \"夏海あきら\",\n        \"natsumi chiharu\": \"ナツミチハル\",\n        \"natsumi kansai\": \"なつみかんさい\",\n        \"natsumikan\": \"なつみかん\",\n        \"natsumin\": \"なつみん\",\n        \"natsunagi\": \"なつなぎ\",\n        \"natsuno hareruya\": \"ナツノハレルヤ\",\n        \"natsuno maki\": \"夏野槙\",\n        \"natsuno suika\": \"なつのすいか\",\n        \"natsuo\": \"夏尾\",\n        \"natsuta kousuke\": \"夏田コウスケ\",\n        \"natsuyo\": \"ナツヨ\",\n        \"natsuzora haduki\": \"夏空葉月\",\n        \"nattaka\": \"なったか\",\n        \"nattsu\": \"なっつ\",\n        \"natumyun\": \"なつみゅん♪\",\n        \"nayoshi\": \"なよし\",\n        \"nayuta daichi\": \"那由他大地\",\n        \"nayuzaki natsumi\": \"ナユザキナツミ\",\n        \"nazca\": \"ナスカ\",\n        \"nazumi kei\": \"菜澄桂\",\n        \"neco\": \"neco\",\n        \"nectar\": \"ねくたー\",\n        \"nedoko\": \"ネドコ\",\n        \"neet\": \"にぃと\",\n        \"negitama\": \"ねぎたま\",\n        \"negitoroko\": \"ネギトロ子\",\n        \"negoya\": \"ねご屋\",\n        \"negura nao\": \"ねぐら☆なお\",\n        \"negurie\": \"ねぐりえ\",\n        \"nei chi\": \"ねいちー\",\n        \"neji-pan\": \"ネジ\",\n        \"nejiro\": \"ねじろ\",\n        \"neko bus\": \"ねこばす\",\n        \"neko denryoku\": \"ねこ電力\",\n        \"neko gohan\": \"猫御飯\",\n        \"neko manma\": \"猫御飯\",\n        \"neko maru rentarou\": \"猫丸恋太郎\",\n        \"neko na yasai\": \"猫な野菜\",\n        \"neko samurai\": \"猫サム雷\",\n        \"neko sensei\": \"猫センセイ\",\n        \"nekobuton\": \"猫布団\",\n        \"nekodel\": \"ねこでる\",\n        \"nekoga yoshiki\": \"猫賀好樹\",\n        \"nekohige\": \"ねこひげ\",\n        \"nekojima lei\": \"猫島礼\",\n        \"nekojima myu\": \"猫島みゅう\",\n        \"nekokan\": \"ねこかん\",\n        \"nekokokazuma\": \"ねここかずま\",\n        \"nekokyuu\": \"ねこきゅう\",\n        \"nekomajin\": \"ねこまじん\",\n        \"nekomanma\": \"ねこまんま\",\n        \"nekomata\": \"ねこまた\",\n        \"nekomatsuri\": \"猫祭\",\n        \"nekomi haruto\": \"猫見春人\",\n        \"nekomimi kanon\": \"猫耳花音\",\n        \"nekomura\": \"猫村\",\n        \"nekomushi\": \"ねこむし\",\n        \"nekoneko\": \"ねこねこ\",\n        \"nekoneko panchu\": \"ねこねこぱんちゅっ\",\n        \"nekonin\": \"猫忍\",\n        \"nekono lonmiy\": \"猫乃ろんみい\",\n        \"nekono matatabi\": \"猫乃またたび\",\n        \"nekono shiro\": \"ねこのしろ\",\n        \"nekono tamami\": \"猫野たまみ\",\n        \"nekonomori maririn\": \"猫守麻里鈴\",\n        \"nekonose hajime\": \"猫ノ瀬はじめ\",\n        \"nekonso\": \"ねこんそ\",\n        \"nekonta\": \"ねこんた\",\n        \"nekonyan\": \"猫にゃん\",\n        \"nekookaji tayo\": \"猫岡寺多代\",\n        \"nekoro tanuki\": \"ねころたぬき\",\n        \"nekota chihiro\": \"猫田ちひろ\",\n        \"nekota kojirow\": \"猫田小次郎\",\n        \"nekota nanami\": \"ねこたななみ\",\n        \"nekota nigra\": \"猫多にぐら\",\n        \"nekotasou\": \"ねこたそう\",\n        \"nekotsuki naoya\": \"猫月なおや\",\n        \"nekou izuru\": \"猫生いづる\",\n        \"nekoume\": \"ねこうめ\",\n        \"nekoya marble\": \"猫屋まぁぶる\",\n        \"nekoyashiki nekomaru\": \"猫屋敷ねこ丸\",\n        \"nekozawa yukari\": \"猫沢ゆかり\",\n        \"nekubila\": \"ねくびぁ\",\n        \"nelo angelo\": \"Nelo安十朗\",\n        \"nemachizuki inesu\": \"寝待月いねすー\",\n        \"nemigi tsukasa\": \"ねみぎつかさ\",\n        \"nemo\": \"ネモ\",\n        \"nemokuge\": \"ねもくげ\",\n        \"nemoto\": \"ネモト\",\n        \"nemui\": \"tintin\",\n        \"nenchi\": \"ねんち\",\n        \"nene\": \"nene\",\n        \"nenemaru\": \"音音丸\",\n        \"neno\": \"ねの\",\n        \"neo black\": \"Neo Black\",\n        \"neo kusano\": \"NEO草野\",\n        \"neon ui\": \"音遠うい\",\n        \"neoneet\": \"寝起新人\",\n        \"nepuka\": \"根深\",\n        \"nerima marine\": \"ねりままりね\",\n        \"nerio\": \"ねりお\",\n        \"nero\": \"nero\",\n        \"neropaso\": \"neropaso\",\n        \"nerotarou\": \"ねろたろう\",\n        \"nerune\": \"ねるね\",\n        \"nesuo\": \"ねすお\",\n        \"net\": \"NET\",\n        \"new\": \"新\",\n        \"new ab\": \"にゅーAB\",\n        \"neyonsan\": \"ねよんさん\",\n        \"neyuki rei\": \"根雪れい\",\n        \"nezumeta\": \"ねずメーター\",\n        \"nezumidosi\": \"ねづみどし\",\n        \"nezumin\": \"ネズミン\",\n        \"nf4\": \"nf4\",\n        \"ngng\": \"ngng\",\n        \"nibi\": \"nibi\",\n        \"nicchi sangyou\": \"ニッチサンギョウ\",\n        \"nice tack\": \"ナイスタック\",\n        \"niche\": \"ニッチ\",\n        \"nichii\": \"ニチヰ\",\n        \"nick\": \"NICK\",\n        \"nico\": \"にこ\",\n        \"nico-momo\": \"にこもも\",\n        \"nicoco\": \"nicoco\",\n        \"nicutoka\": \"nicutoka\",\n        \"nidoro\": \"nidoro\",\n        \"niea\": \"にえあ\",\n        \"nietagiru\": \"にえたぎる\",\n        \"nigakuri takeshi\": \"ニガクリタケシ\",\n        \"nigane\": \"煮鐘\",\n        \"nigesapo\": \"にげサポ\",\n        \"nightjoy\": \"Nightjoy\",\n        \"nigo\": \"にご\",\n        \"niiruma kenji\": \"にいるまけんじ\",\n        \"niisan\": \"にーさん\",\n        \"nijiden\": \"ニジデン\",\n        \"nijihashi sola\": \"にじはしそら\",\n        \"nijiru\": \"煮汁\",\n        \"nijou tayun\": \"二条たゆん\",\n        \"nijyou makoto\": \"二条マコト\",\n        \"nikaido kai\": \"二階堂改\",\n        \"nikami\": \"にかみ\",\n        \"niku\": \"にく\",\n        \"niku jill\": \"肉Jill\",\n        \"nikudanmaru\": \"肉弾丸\",\n        \"nikuname\": \"肉ネーム\",\n        \"nikuyaki\": \"ニクヤキ\",\n        \"nikyu\": \"にきゅ\",\n        \"nilitsu\": \"ニリツ\",\n        \"nilo\": \"にろ\",\n        \"nina\": \"丹娜\",\n        \"nina ryo\": \"新和涼\",\n        \"ningen\": \"にんげん\",\n        \"ninniku\": \"にんにく\",\n        \"ninnin\": \"にんにん\",\n        \"nino paru\": \"にのパル\",\n        \"ninomae kazuichi\": \"二ノ前和市\",\n        \"ninomiya hitomi\": \"二宮仁巳\",\n        \"ninomotoko\": \"ニノモトコ\",\n        \"ninroku\": \"認六\",\n        \"nio\": \"nio\",\n        \"nioti\": \"におち\",\n        \"nippa takahide\": \"新羽隆秀\",\n        \"nippori\": \"にっぽり\",\n        \"nirapii\": \"にらぴー\",\n        \"niryuu tkys\": \"にりゅうtkys\",\n        \"nishi tagame\": \"西タガメ\",\n        \"nishida\": \"西田\",\n        \"nishifuji\": \"西藤\",\n        \"nishihara atsuko\": \"弐士原あつこ\",\n        \"nishikawa coto\": \"ニシカワコト\",\n        \"nishiki meyu\": \"西樹めゆ\",\n        \"nishiki yoshimune\": \"にしき義統\",\n        \"nishimaki tohru\": \"にしまきとおる\",\n        \"nishimo\": \"にしも\",\n        \"nishimura arimi\": \"西村有未\",\n        \"nishimura takashi\": \"にしむらたかし\",\n        \"nishin\": \"ニシン\",\n        \"nishino\": \"西野\",\n        \"nishino hikodge\": \"西野彦二\",\n        \"nishinozawa kaorisuke\": \"西野沢かおり介\",\n        \"nishitsuki tsutomu\": \"西月力\",\n        \"nisin\": \"ニシン\",\n        \"nisson\": \"nisson\",\n        \"nitiba rokusaburou\": \"にちばろくさぶろう\",\n        \"nitta jun\": \"にったじゅん\",\n        \"nittakumi\": \"新匠\",\n        \"niu\": \"丹雨\",\n        \"niwa\": \"にわ\",\n        \"niwa yukari\": \"丹羽ユカリ\",\n        \"niwaka yuan\": \"丹羽香ゆあん\",\n        \"niwakaame\": \"俄雨\",\n        \"niwasane\": \"にわさね\",\n        \"niwatori gunsou\": \"にわとり軍曹\",\n        \"niyama\": \"にやま\",\n        \"nkedoshita\": \"んけどした\",\n        \"nken\": \"NKEN\",\n        \"nmasse\": \"ンマッセ\",\n        \"nme\": \"んめ\",\n        \"nmi\": \"Nみ\",\n        \"nno\": \"nno\",\n        \"no.gomes\": \"NO.ゴメス\",\n        \"noa\": \"noa\",\n        \"noah\": \"のあ\",\n        \"nobi nobita\": \"野火ノビタ\",\n        \"nobita\": \"ノビタ\",\n        \"nobu\": \"NOBU\",\n        \"nobuki chihiro\": \"のぶきちひろ\",\n        \"nobuyuki\": \"信行\",\n        \"nochita sin\": \"のちた紳\",\n        \"nogami takeshi\": \"野上武志\",\n        \"nogod\": \"NOGOD\",\n        \"noguchi masatsu\": \"野口摩擦\",\n        \"nohara monyoral\": \"野原もにょらる\",\n        \"noi\": \"のい\",\n        \"noibara kou\": \"野茨杏\",\n        \"noji\": \"ノジ\",\n        \"nokishita negio\": \"軒下ネギヲ\",\n        \"noko\": \"乃子\",\n        \"nolia\": \"NOLIA\",\n        \"nomady mao\": \"のまでぃMAO\",\n        \"nomayo\": \"野マヨ\",\n        \"nomu\": \"NOMU\",\n        \"nomura teruya\": \"野村輝弥\",\n        \"non\": \"のん\",\n        \"nonaff\": \"のんアフ\",\n        \"noname\": \"NONAME\",\n        \"noneto\": \"ノネト\",\n        \"nonnon\": \"のんのん\",\n        \"nonohachi\": \"ノノはち\",\n        \"nonoki\": \"乃軒\",\n        \"nonoko\": \"ののこ\",\n        \"nonomura hideki\": \"野々村秀樹\",\n        \"nononono\": \"のののの\",\n        \"nonta\": \"のんた\",\n        \"nooca\": \"nooca\",\n        \"noran\": \"noran\",\n        \"norasuko\": \"ノラスコ\",\n        \"nori heita\": \"海苔餅太\",\n        \"nori senbei\": \"海苔せんべい\",\n        \"norikara\": \"のりから\",\n        \"norikin\": \"海苔規\",\n        \"noriko\": \"NORIKO\",\n        \"norimatsu nanami\": \"のりまつななみ\",\n        \"norinko\": \"のりんこ\",\n        \"norio\": \"のりお\",\n        \"norita\": \"のり太\",\n        \"noritama\": \"のりたま\",\n        \"norizi\": \"のりじ\",\n        \"norte\": \"Norte\",\n        \"noruriri\": \"ノルリリ\",\n        \"nosa\": \"NOSA\",\n        \"nosekichiku\": \"野石竹\",\n        \"noshi\": \"ノシ\",\n        \"noshigami\": \"のしがみ\",\n        \"nosuke\": \"のすけ\",\n        \"noto\": \"能戸\",\n        \"noumen\": \"ノウメン\",\n        \"noumiso\": \"脳みそ\",\n        \"noumitsu\": \"のうみつ\",\n        \"nov\": \"nov\",\n        \"noyomi dx\": \"ノヨミDX\",\n        \"nozarashi satoru\": \"秋神サトル\",\n        \"nozawa yukiko\": \"野澤ゆき子\",\n        \"nozomi ayaka\": \"希望あやか\",\n        \"nozomu\": \"のぞむ\",\n        \"np\": \"NP\",\n        \"npo\": \"んぽ\",\n        \"ns\": \"NS\",\n        \"nt robo\": \"NTロボ\",\n        \"nt00\": \"NT00\",\n        \"nu-\": \"ぬー\",\n        \"nucomas\": \"ぬこマス\",\n        \"nue\": \"鵺\",\n        \"nui\": \"ぬい\",\n        \"nukiyama gaisei\": \"拔山蓋世\",\n        \"nukobao\": \"ぬこばお\",\n        \"nukoko\": \"ぬここ\",\n        \"nukui lususu\": \"ぬくい味汐\",\n        \"numada\": \"沼田\",\n        \"numata chihiro\": \"ぬまたちひろ\",\n        \"number 55\": \"number_55\",\n        \"numeko\": \"Numeko\",\n        \"numeri\": \"ぬめり\",\n        \"nun\": \"ぬん\",\n        \"nunohechima\": \"ヌノヘチマ\",\n        \"nupuryu\": \"ぬぷ竜\",\n        \"nurikabe\": \"ぬり壁\",\n        \"nuruken\": \"ぬるけん\",\n        \"nurumu\": \"ぬるむ\",\n        \"nutro\": \"nutro\",\n        \"nuu\": \"ヌゥ\",\n        \"nuyakana\": \"ぬャカな\",\n        \"nwonyo\": \"んをんよ\",\n        \"ny-o-ph\": \"NY-O-PH\",\n        \"nyagomaru\": \"にゃご丸\",\n        \"nyahu\": \"にゃふ\",\n        \"nyakaaki\": \"にゃかあき\",\n        \"nyake\": \"にゃけ\",\n        \"nyakki\": \"にゃっき\",\n        \"nyakkuru\": \"ニャックル\",\n        \"nyamal\": \"にゃまる\",\n        \"nyamota\": \"にゃもた\",\n        \"nyamu\": \"にゃむ\",\n        \"nyanbii\": \"にゃんびぃ\",\n        \"nyangorou\": \"にゃんごろー\",\n        \"nyanko\": \"猫狐\",\n        \"nyanko mic\": \"にゃんこMIC\",\n        \"nyantarou\": \"にゃん太郎\",\n        \"nyanya\": \"nyanya\",\n        \"nyanzo\": \"にゃんぞー\",\n        \"nyara\": \"nyara\",\n        \"nyarosu\": \"にゃろす\",\n        \"nylon\": \"ナイロン\",\n        \"nyoichi\": \"にょいち\",\n        \"nyonyonba tarou\": \"にょにょんば太郎\",\n        \"nyoriko\": \"にょりこ\",\n        \"nyorori\": \"にょろり\",\n        \"nyorutarou\": \"にょる太郎\",\n        \"nyu\": \"nyu\",\n        \"nyuuhin\": \"にゅーひん\",\n        \"o-bow\": \"O-bow\",\n        \"o-ji\": \"おーじ\",\n        \"o.p com\": \"おぽこむ\",\n        \"o.ri\": \"O.RI\",\n        \"oasis\": \"オアシス\",\n        \"oba yoshifumi\": \"大庭佳文\",\n        \"obakyu-taro\": \"089タロー\",\n        \"obata hiroyuki\": \"小幡寛之\",\n        \"obata yayoi\": \"おばたやよい\",\n        \"obmas\": \"obmas\",\n        \"oboroduki yamiya\": \"朧月闇夜\",\n        \"oborotsuki kakeru\": \"朧月カケル\",\n        \"obyaa\": \"おびゃー\",\n        \"ocha\": \"おちゃ\",\n        \"ochatan\": \"おちゃたん\",\n        \"ochatsumi\": \"オチャツミ\",\n        \"ochi ai\": \"越智愛\",\n        \"ochi gento\": \"越智源斗\",\n        \"ochita taiji\": \"越智多たいじ\",\n        \"ocodo\": \"おこど\",\n        \"octotaco\": \"奥藤た子\",\n        \"oda\": \"oda\",\n        \"oda akira\": \"おだ あきら\",\n        \"oda haiji\": \"織田灰至\",\n        \"oda natsuki\": \"織田夏樹\",\n        \"odabutsu\": \"おだぶつ\",\n        \"oden\": \"おデン\",\n        \"oden no shima\": \"おでんno島\",\n        \"oden70\": \"おでん70\",\n        \"oekakizuki\": \"oekakizuki\",\n        \"og\": \"Og\",\n        \"ogami kazuki\": \"拝一樹\",\n        \"ogami wolf\": \"拝狼\",\n        \"ogata\": \"Ogata\",\n        \"ogata gatarou\": \"オガタガタロー\",\n        \"ogata hiro\": \"御形紘\",\n        \"ogata mamimi\": \"緒方マミ美\",\n        \"ogata satomi\": \"緒方賢美\",\n        \"ogawa hidari\": \"小川ひだり\",\n        \"ogawa mashiro\": \"オガワマシロ\",\n        \"ogawa renji\": \"小河レンジ\",\n        \"ogiara\": \"オギアラ\",\n        \"ogino\": \"オギノ\",\n        \"oguma\": \"oguma\",\n        \"ogura anko\": \"おぐらあん子\",\n        \"oguramansai\": \"小倉萬采\",\n        \"ohakotome\": \"おはことめ\",\n        \"ohanabatake run\": \"御花畑るん\",\n        \"ohara makoto\": \"おはら誠\",\n        \"ohiensis\": \"オヒエンシス\",\n        \"ohio-shuu riki\": \"オハイオ州力\",\n        \"ohiru\": \"電SUKE\",\n        \"ohiya\": \"お冷\",\n        \"ohka\": \"おーか\",\n        \"ohma\": \"謳馬\",\n        \"ohmi\": \"近江\",\n        \"ohmi takeshi\": \"大見武士\",\n        \"ohno kanae\": \"大野かなえ\",\n        \"ohrin\": \"王林\",\n        \"ohsima kouichi\": \"大島洸一\",\n        \"ohsugi yukihiro\": \"大杉 ゆきひろ\",\n        \"ohtsuki suzuki\": \"大槻涼樹\",\n        \"oimo\": \"おいも\",\n        \"oimori yura\": \"及森ゆうら\",\n        \"oimoto jirou\": \"おいもとじろう\",\n        \"ojii\": \"おじい\",\n        \"ojii-chan\": \"おじいちゃん\",\n        \"okabayashi beru\": \"岡林べる\",\n        \"okada kojiko\": \"冈田こじ子\",\n        \"okada reimi\": \"冈田れいみ\",\n        \"okagiri shou\": \"岡霧硝\",\n        \"okama\": \"OKAMA\",\n        \"okamoto\": \"オカモト\",\n        \"okamoto fujio\": \"おかもとふじお\",\n        \"okamura hijiki\": \"岡村ひじき\",\n        \"okamura takahiro\": \"岡村孝公\",\n        \"okashira\": \"おかしら\",\n        \"okashita makoto\": \"岡下誠\",\n        \"okatora\": \"岡虎\",\n        \"okawa wataru\": \"大河渡\",\n        \"okawari\": \"OKAWARI\",\n        \"okawari jiyuu\": \"おかわり児遊\",\n        \"okaya hitsuji\": \"ヲカヤヒツジ\",\n        \"okayado\": \"オカヤド\",\n        \"okayu\": \"Okayu\",\n        \"okazaki mituki\": \"おかざきみつき\",\n        \"okazaki nao\": \"岡崎那緒\",\n        \"okazu yuuichi\": \"オカズゆういち\",\n        \"oke\": \"桶\",\n        \"okeashi chiyoko\": \"桶葭千夜子\",\n        \"oki yukao\": \"沖由佳雄\",\n        \"okidaka yuu\": \"沖高有\",\n        \"okina\": \"OKINA\",\n        \"okina naoki\": \"沖名なおき\",\n        \"okino matsushiro\": \"沖の松城\",\n        \"okino ryuuto\": \"沖野琉人\",\n        \"okita ababa\": \"沖田あばば\",\n        \"okiura\": \"okiura\",\n        \"okiyo\": \"おきよ\",\n        \"okki\": \"okki\",\n        \"okoge senbei\": \"おこげ煎餅\",\n        \"okome\": \"お米\",\n        \"okowa\": \"おこわ\",\n        \"okumura\": \"おくむら\",\n        \"okuva\": \"奥ヴぁ\",\n        \"okusan\": \"奥さん\",\n        \"okuse saki\": \"奥瀬サキ\",\n        \"om\": \"om\",\n        \"omangarl\": \"オマンガール\",\n        \"omega destroyer\": \"オメ～ガ・デストロイヤー\",\n        \"omegane\": \"御眼鏡\",\n        \"omi\": \"おみ\",\n        \"omizu\": \"おみず\",\n        \"omizu chihiro\": \"お水ちひろ\",\n        \"omochi\": \"おもち\",\n        \"omoutubo\": \"思うつぼ\",\n        \"onamaru\": \"おな丸\",\n        \"onapan\": \"おなぱん\",\n        \"onetouch\": \"わんたっち\",\n        \"onguuchi\": \"御宮内\",\n        \"oni japu\": \"鬼 ジャプ\",\n        \"oniben katze\": \"鬼遍かっつぇ\",\n        \"oniku\": \"お肉\",\n        \"oniku.\": \"お肉。\",\n        \"onineko\": \"おにねこ\",\n        \"onita\": \"歐尼鬼\",\n        \"oniyama\": \"鬼山\",\n        \"oniyuri\": \"オニユリ\",\n        \"onizuka takuto\": \"鬼塚たくと\",\n        \"onna\": \"onna\",\n        \"onnami chiyu\": \"御並千侑\",\n        \"ono misao\": \"小野ミサオ\",\n        \"ono nui\": \"小野ぬい\",\n        \"onoda sachi\": \"おのださち\",\n        \"onodera\": \"おのでら\",\n        \"onodera kazumi\": \"小野寺和海\",\n        \"onoderasan\": \"おのでらさん\",\n        \"onogawa kiwi\": \"小野川キウイ\",\n        \"onomesin\": \"オノメシン\",\n        \"onomichi\": \"Onomichi\",\n        \"onsen nakaya\": \"おんせんなかや\",\n        \"onsen no tubuyaki\": \"おんせんなかや\",\n        \"onsoku zekuu\": \"己即是空\",\n        \"onyo\": \"Onyo\",\n        \"ooba jun\": \"大刃じゅん\",\n        \"oofuji reiichirou\": \"大藤玲一郎\",\n        \"oogane\": \"大金\",\n        \"oohashi kaoru\": \"大橋薫\",\n        \"ooi hanimaru\": \"大井はに丸\",\n        \"ooi masakazu\": \"大井昌和\",\n        \"ooi sakae\": \"大井栄\",\n        \"ooiwa kenzi\": \"大岩ケンヂ\",\n        \"ooizumi daisaku\": \"大泉だいさく\",\n        \"ookami\": \"狼\",\n        \"ookami yuuki\": \"大神ゆうき\",\n        \"ooki bonta\": \"おおきぼん太\",\n        \"ookido karo\": \"大城戸カロ\",\n        \"ookubo matagi\": \"おおくぼマタギ\",\n        \"ookuma tanuki\": \"大熊狸喜\",\n        \"oomori harusame\": \"大守春雨\",\n        \"oomori makoto\": \"大森誠\",\n        \"oona mitsutoshi\": \"おおなみつとし\",\n        \"oonami youko\": \"大波耀子\",\n        \"oonita hiroyuki\": \"大仁田ヒロユキ\",\n        \"oono\": \"オオノ\",\n        \"oono tetsuya\": \"大野哲也\",\n        \"oonuma shinichi\": \"大沼信一\",\n        \"oosaka hananoko\": \"大阪花之呼\",\n        \"oosawa\": \"大沢\",\n        \"oose tsunami\": \"大瀬津波\",\n        \"oosugi kazuma\": \"大杉和馬\",\n        \"oota yuuichi\": \"大田優一\",\n        \"ootake pashio\": \"大竹パシ夫\",\n        \"ootani mikoto\": \"大谷みこと\",\n        \"ootsuka potato\": \"大塚ぽてと\",\n        \"ootsuka shirou\": \"大塚志郎\",\n        \"ootsuki wataru\": \"大月渉\",\n        \"oowada tomari\": \"大輪田泊\",\n        \"ooyake\": \"公\",\n        \"ooyama chiroru\": \"おおやまちろる\",\n        \"opaisukii\": \"オパイスキー\",\n        \"orange manbou\": \"おれんじまんぼう\",\n        \"ore\": \"ore\",\n        \"ore ebis\": \"俺エビス\",\n        \"orenchin\": \"おれんちん\",\n        \"orenuma tooko\": \"オレヌマトオコ\",\n        \"oretto\": \"おれっと\",\n        \"organico\": \"おるがにこ\",\n        \"orico\": \"オリコ\",\n        \"orihara kotone\": \"折原琴音\",\n        \"orihi chihiro\": \"織日ちひろ\",\n        \"orikawa\": \"折川\",\n        \"orikuchi hirata\": \"折口ヒラタ\",\n        \"orima inaka\": \"織間いなか\",\n        \"orimiya mai\": \"おりみや舞\",\n        \"orimoto mimana\": \"おりもとみなま\",\n        \"oris\": \"織栖\",\n        \"orishima yupopo\": \"織島ユポポ\",\n        \"orita\": \"オリタ\",\n        \"oriue wato\": \"織上ワト\",\n        \"orizen\": \"おりぜん\",\n        \"orizuru bros\": \"折鶴兄弟\",\n        \"oroneko\": \"おろねこ\",\n        \"oruna\": \"オルナ\",\n        \"oryoku\": \"おーりょく\",\n        \"os\": \"OS\",\n        \"osafune\": \"オサフネ\",\n        \"osagashi\": \"オサガシ\",\n        \"osakana\": \"ヲさかな\",\n        \"osana sumika\": \"幼菜すみか\",\n        \"osanai mujica\": \"小山内ムジカ\",\n        \"osato\": \"おさとう\",\n        \"oseron\": \"オセロン\",\n        \"oshimugi\": \"押麦\",\n        \"oshousui\": \"和尚吹\",\n        \"osora\": \"緒空\",\n        \"osterei\": \"OSTEREi\",\n        \"osuzu akiomi\": \"尾铃明臣\",\n        \"osyakana\": \"おしゃかな\",\n        \"otakehiko\": \"雄竹彦\",\n        \"othello\": \"オセロ\",\n        \"otochichi\": \"音乳\",\n        \"otogi\": \"おとぎ\",\n        \"otogi tetsurou\": \"おとぎてつろう\",\n        \"otohiko\": \"音彦\",\n        \"otohuke bonne\": \"音更ボンヌ\",\n        \"otokam\": \"オトカム\",\n        \"otokawa kazuki\": \"乙川カヅキ\",\n        \"otori\": \"おとり\",\n        \"ototo\": \"おとと\",\n        \"otou\": \"尾刀\",\n        \"otsuki miharu\": \"鳴月みはる\",\n        \"ottoman turks\": \"オスマントル子\",\n        \"otumaru\": \"乙丸\",\n        \"otyawan\": \"オチャワン\",\n        \"ou\": \"おぅ\",\n        \"oudon\": \"おうどん\",\n        \"ougi hina\": \"扇城ひな\",\n        \"ougi nozomi\": \"扇希実\",\n        \"ougon dokuro\": \"黄金髑髏\",\n        \"ouhashi\": \"おうはし\",\n        \"oujano kaze\": \"王者之風\",\n        \"ouji tsukino\": \"王子月乃\",\n        \"ouka\": \"オウカ\",\n        \"ouka sushi\": \"桜花すし\",\n        \"oukawa shiya\": \"桜川シヤ\",\n        \"ouma bunshichirou\": \"逢摩文七郎\",\n        \"oshiume nyora\": \"押梅にょら\",\n        \"oumi noe\": \"近江のえ\",\n        \"ouno\": \"奥之\",\n        \"ounwm\": \"ounwm\",\n        \"ousawa kanata\": \"桜沢かなた\",\n        \"ouse riruka\": \"桜瀬りるか\",\n        \"over line\": \"オーバーライン\",\n        \"owa\": \"尾和\",\n        \"owahu\": \"おわふ\",\n        \"owal\": \"おわる\",\n        \"oxideengine\": \"OXIDEENGINE\",\n        \"oxxo\": \"OXXO\",\n        \"oxy\": \"おきし\",\n        \"oyaji\": \"オヤジ\",\n        \"oyama robi\": \"御山ロビ\",\n        \"oyuki\": \"おゆき\",\n        \"ozaki\": \"おざき\",\n        \"ozawa akifumi\": \"織澤あきふみ\",\n        \"ozawa aoi\": \"オザワアオイ\",\n        \"ozawa hiyori\": \"小沢ひより\",\n        \"ozawa manabu\": \"緒沢まなぶ\",\n        \"ozawa reido\": \"小泽零人\",\n        \"ozawa you\": \"小沢悠\",\n        \"ozora ituki\": \"大空樹\",\n        \"ozuno mahou\": \"緒図乃真朋\",\n        \"p no ji\": \"pの字\",\n        \"p senpuki\": \"P せんぷき\",\n        \"p tag\": \"Pタグ\",\n        \"pageratta\": \"ぱげらった\",\n        \"painpa\": \"パインパ\",\n        \"paintmusume\": \"ペイント娘\",\n        \"pal maison\": \"パルめぞん\",\n        \"paleatus\": \"paleatus\",\n        \"pan koojo\": \"パン☆工場\",\n        \"pana\": \"PANA\",\n        \"panbai\": \"PANBAI 旁白\",\n        \"panda\": \"ぱんだ\",\n        \"pandacorya\": \"ぱんだこりゃ\",\n        \"pandain\": \"パンダィン\",\n        \"pandatyama\": \"ぱんだちゃま\",\n        \"pang9943\": \"pang9943\",\n        \"panimi\": \"ぱに魅\",\n        \"panpa\": \"ぱんぱー\",\n        \"panta\": \"ぱん太\",\n        \"pao\": \"パオ\",\n        \"papa papan\": \"ぱぱ・ぱぱん\",\n        \"papepoxx\": \"PAPEPOX2\",\n        \"paper\": \"ぱぺる\",\n        \"pappa\": \"パッパ\",\n        \"paprika cider\": \"パプリカサイダー\",\n        \"paradise d\": \"PARADISE“D”\",\n        \"pararan\": \"ぱららん\",\n        \"parfait\": \"ぱふぇ\",\n        \"parins\": \"Parins\",\n        \"parmiria\": \"パーミリア\",\n        \"parua\": \"ぱるあ\",\n        \"paruparu\": \"ぱるぱる\",\n        \"pasdar\": \"pasdar\",\n        \"pasera\": \"ぱせら\",\n        \"pastachin\": \"パスタチン\",\n        \"pato-chan\": \"パトちゃん\",\n        \"patori\": \"ぱとり\",\n        \"patricia\": \"パトリシア\",\n        \"patrick hateman\": \"Patrick Hateman\",\n        \"pd\": \"Pd\",\n        \"peach\": \"Peach\",\n        \"peat lock\": \"ぴーと・ろっく\",\n        \"peke\": \"ぺけ\",\n        \"pekeko\": \"ペケこ\",\n        \"penguindou\": \"筆吟堂\",\n        \"peniken\": \"ぺに健\",\n        \"pensuke\": \"ぺんすけ\",\n        \"pepe\": \"ぺぺ\",\n        \"pepo\": \"ぺぽ\",\n        \"perimaru\": \"ぺり丸\",\n        \"permille\": \"permille\",\n        \"pero\": \"ぺろ\",\n        \"personality\": \"personality\",\n        \"peruri\": \"ぺるり\",\n        \"peso\": \"ペソ\",\n        \"petag2\": \"petaG2\",\n        \"pgb\": \"pgb\",\n        \"phantom\": \"ふぁんとむ\",\n        \"philan\": \"Philan\",\n        \"philly\": \"Philly\",\n        \"phoenicia masako\": \"フェニキア雅子\",\n        \"pi-ko\": \"ぴーこ\",\n        \"pia pia\": \"Pia☆Pia\",\n        \"piano\": \"ぴあの\",\n        \"piaroo\": \"Piaroo\",\n        \"pickles\": \"ピクルス\",\n        \"picpicgram\": \"ぴこぴこぐらむ\",\n        \"pide\": \"Piで\",\n        \"pierre norano\": \"ピエールのらの\",\n        \"pihii\": \"ぴひー\",\n        \"pikachi\": \"ぴかち\",\n        \"pikachurin\": \"ピカチュリン\",\n        \"pikaichi\": \"ぴかいち\",\n        \"pikath\": \"ぴかっち\",\n        \"pikazo\": \"Pikazo\",\n        \"pikeru\": \"ピケル\",\n        \"piku star cell\": \"ぴく☆せる\",\n        \"pikupikun\": \"ピクピクン\",\n        \"pilky\": \"ぴるきー\",\n        \"pimoco\": \"pimoco\",\n        \"pin vice\": \"PIN・VICE\",\n        \"pinakes\": \"ピナケス\",\n        \"pingure\": \"ピングレ\",\n        \"pinksel\": \"Pinksel\",\n        \"pino\": \"ぴの\",\n        \"pinta\": \"PINTA\",\n        \"pip\": \"PIP\",\n        \"pipa\": \"ぴぱ\",\n        \"pira\": \"ぴら\",\n        \"pirikara syuga\": \"ピリ辛シュガー\",\n        \"pirorun\": \"ぴろるん\",\n        \"pistanya\": \"ピスターニャ\",\n        \"piston\": \"ぴすとん\",\n        \"piyo\": \"PiYo\",\n        \"piyopiyo\": \"ぴよぴよ\",\n        \"pizanuko\": \"ぴざぬこ\",\n        \"pizi2 gou\": \"pizi2号\",\n        \"pj-1\": \"PJ-1\",\n        \"plasma beach\": \"プラズマビーチ\",\n        \"plum\": \"ぷらむ\",\n        \"plus\": \"プラス\",\n        \"pocchi\": \"ぽっち\",\n        \"poin\": \"ぽいん\",\n        \"poison needle\": \"Poison Needle\",\n        \"pokke\": \"ぽっけ\",\n        \"pokochin\": \"ぽこちん\",\n        \"pokota\": \"ぽこた\",\n        \"pokurouta\": \"ポクロウタ\",\n        \"pole\": \"ポール\",\n        \"polorinken\": \"ポロリン軒\",\n        \"poma\": \"poma\",\n        \"pomimiko\": \"ぽみみ子\",\n        \"pomupomu\": \"ぽむぽむ\",\n        \"ponchi\": \"ぽんち\",\n        \"ponde\": \"ぽんで\",\n        \"ponhosikotu\": \"PON☆骨\",\n        \"poni.\": \"ぽに。\",\n        \"ponkan 8\": \"ぽんかん⑧\",\n        \"ponkichi\": \"ぽんきち\",\n        \"ponkotsu\": \"ぽんこつ\",\n        \"ponpe matkachi\": \"尾形全\",\n        \"ponyuzu\": \"ぽんゆず\",\n        \"ponzu\": \"ぽん酢\",\n        \"popo\": \"popo\",\n        \"poponko\": \"ぽぽんこ\",\n        \"popopalt\": \"ぽぽぱると\",\n        \"nishi shizumu\": \"西しずむ\",\n        \"poriko\": \"ポリ子\",\n        \"poriuretan\": \"ぽりうれたん\",\n        \"poron\": \"ぽろん\",\n        \"poronatsu\": \"ポロなつ\",\n        \"porosuke\": \"ぽろすけ\",\n        \"porurin\": \"ポルリン\",\n        \"poshushi\": \"ぽしゅ氏\",\n        \"potsu\": \"ぽつ\",\n        \"potu\": \"ぽつ\",\n        \"powaito\": \"ぽわいと\",\n        \"poyamu\": \"ぽやむ\",\n        \"poyo equals namaste\": \"ポヨ=ナマステ\",\n        \"pozesuke\": \"ポゼ助\",\n        \"ppoint\": \"Pポイント\",\n        \"preggypenny\": \"PreggyPenny\",\n        \"president-p\": \"president-p\",\n        \"prhs\": \"Prhs\",\n        \"pri\": \"ぷり\",\n        \"princess lemanko\": \"プリンセスレマン子\",\n        \"project bellerophon\": \"Project Bellerophon\",\n        \"prophecy\": \"ぷろへしぃ\",\n        \"propolisee\": \"プロポリスEE\",\n        \"psohatten\": \"psohatten\",\n        \"ptai\": \"ptai\",\n        \"pu-en\": \"pu-en\",\n        \"pu2\": \"pu2\",\n        \"pua\": \"Pua\",\n        \"pucca\": \"ぷっか\",\n        \"puchida\": \"ぷちだ\",\n        \"puchii puuchii\": \"ぷーちぃ・ぷぅちぃ\",\n        \"pukara\": \"PUKARA\",\n        \"pukkunn\": \"ぷっくん\",\n        \"punita\": \"ぷにた\",\n        \"puniyama meroro\": \"ぷにやまめろろ\",\n        \"punyon\": \"プニョン\",\n        \"puranpuman\": \"ぷらんぷまん\",\n        \"purapa\": \"ぷらぱ\",\n        \"pureinn\": \"pureinn\",\n        \"puriko\": \"プリ子\",\n        \"purin\": \"ぷりん\",\n        \"puripuri jet\": \"プリプリJET\",\n        \"puripuri kikou shidan\": \"ぷりぷり機甲師団\",\n        \"puripuri uemon\": \"ぷりぷり大佐\",\n        \"purisa\": \"purisa\",\n        \"puritei\": \"ぷりてゐ\",\n        \"purplecroudhill\": \"紫雲山頂\",\n        \"puti\": \"ぷち\",\n        \"pyouryuu\": \"彪竜\",\n        \"pyz\": \"pyz\",\n        \"q1\": \"究一\",\n        \"qiqo\": \"qiqo\",\n        \"qko\": \"Q子\",\n        \"qoom\": \"くーム\",\n        \"quanxing\": \"光星\",\n        \"qudamomo\": \"Qudamomo\",\n        \"qunami himehiko\": \"九波ヒメヒコ\",\n        \"qutouten\": \"句読点\",\n        \"quu\": \"Quu\",\n        \"qzna\": \"qzna\",\n        \"r\": \"あーる\",\n        \"r-ex\": \"R-Ex\",\n        \"ra-men\": \"らーめん\",\n        \"rabbi\": \"らび\",\n        \"rabbit\": \"Rabbit\",\n        \"racer\": \"racer\",\n        \"racket\": \"らけっと\",\n        \"radio\": \"ラジオ\",\n        \"radiohead\": \"ラヂヲヘッド\",\n        \"raemz\": \"Raemz\",\n        \"rafuro\": \"ラフロ\",\n        \"ragetsu\": \"裸月\",\n        \"rai\": \"ライ\",\n        \"raiden\": \"らいでん\",\n        \"raijin maru\": \"雷神丸\",\n        \"raika\": \"ライカ\",\n        \"raimu\": \"莱夢\",\n        \"raipa zrx\": \"雷覇ZRX\",\n        \"rairarai\": \"らいらライ\",\n        \"raitei\": \"雷丁\",\n        \"raiun\": \"らいうん\",\n        \"rajii\": \"らじー\",\n        \"rakia\": \"rakiA\",\n        \"rakko\": \"らっこ\",\n        \"rakkyo\": \"ラッキョ\",\n        \"rakuda torino\": \"楽田トリノ\",\n        \"rakuji tarahi\": \"楽時たらひ\",\n        \"rakuria\": \"ラクリア\",\n        \"rama\": \"らま\",\n        \"ramble\": \"RAMBLE\",\n        \"ramdac 300\": \"RAMDAC 300\",\n        \"ramen-penguin\": \"拉麵企鵝\",\n        \"rami\": \"らみ\",\n        \"ramii\": \"らみぃ\",\n        \"ramototu\": \"ラモトツ\",\n        \"rampant404\": \"Contact\",\n        \"ramu\": \"らむ\",\n        \"ran\": \"RAN\",\n        \"ranaecho\": \"ranaECHO\",\n        \"ranke\": \"らんけ\",\n        \"rannero\": \"RanneRo\",\n        \"rarana\": \"ららな\",\n        \"rasahan\": \"ラサハン\",\n        \"rasson\": \"らっそん\",\n        \"rasukaru\": \"らすかる\",\n        \"rate\": \"RaTe\",\n        \"rati\": \"ラティ\",\n        \"rayze\": \"瑞氏\",\n        \"razy\": \"らじー\",\n        \"razz\": \"らず\",\n        \"recaro\": \"れかろ\",\n        \"red.d\": \"Red.D\",\n        \"redhair\": \"RedHair\",\n        \"redking\": \"れっどきんぐ\",\n        \"rei\": \"REI\",\n        \"rei park\": \"れいぱぁく\",\n        \"reigamk2\": \"麗牙Mk-2\",\n        \"reiji\": \"れゐぢ\",\n        \"reika\": \"零花\",\n        \"reimei\": \"黎明\",\n        \"reine\": \"レーヌ\",\n        \"reishiki aria\": \"零式アリア\",\n        \"rekisitaihoonoji\": \"レキシタイふのじ\",\n        \"reku\": \"れく\",\n        \"rela\": \"Rela\",\n        \"relm\": \"りるむ\",\n        \"remora\": \"remora\",\n        \"remu\": \"れむ\",\n        \"ren mizuha\": \"蓮みづは\",\n        \"ren suru\": \"れんする\",\n        \"rena\": \"れな\",\n        \"renge\": \"れんげ\",\n        \"rentaichou\": \"连队长\",\n        \"rentan\": \"煉丹\",\n        \"rescar\": \"れすか\",\n        \"reso\": \"れーそ\",\n        \"retasu\": \"れたすー\",\n        \"reto\": \"れと\",\n        \"retota\": \"れと太\",\n        \"ri-ru-\": \"りーるー\",\n        \"ri.\": \"ri.\",\n        \"tajima ria\": \"立嶋りあ\",\n        \"rian\": \"りあん\",\n        \"riboshika\": \"リボシカ\",\n        \"ricca\": \"りっか\",\n        \"ricchy\": \"ricchy\",\n        \"rice oomori\": \"ライスおおもり\",\n        \"rie\": \"RiE\",\n        \"rihi\": \"りひ\",\n        \"rihitozoire\": \"リヒトゾイレ\",\n        \"rii\": \"りい\",\n        \"rikamarika\": \"rikamarika\",\n        \"rikazu\": \"rikazu\",\n        \"riki\": \"利木\",\n        \"rikka\": \"立夏\",\n        \"rikoko\": \"りここ\",\n        \"rikomaru\": \"りこ丸\",\n        \"rikose\": \"リコセ\",\n        \"riku maru\": \"りくまる\",\n        \"rikudo inuhiko\": \"六堂犬彦\",\n        \"rikudou\": \"六道\",\n        \"rikudou koushi\": \"六道神士\",\n        \"rikume\": \"rikume\",\n        \"rikusu\": \"リクス\",\n        \"rikuto\": \"六兎\",\n        \"rimukoro\": \"リムコロ\",\n        \"rimviolet\": \"rimviolet\",\n        \"rin\": \"rin\",\n        \"rindoh\": \"竜瞳\",\n        \"rindou akira\": \"りんどうあきら\",\n        \"ringo\": \"りんご\",\n        \"ringo amee\": \"林檎あめぇ\",\n        \"ringo anu\": \"りんごあぬ\",\n        \"ringo no kisetsu.\": \"りんごの季節。\",\n        \"rinku\": \"りんく\",\n        \"rinno arara\": \"りんのあらら\",\n        \"rino nymphet\": \"Rino nymphet\",\n        \"rinoko\": \"リノコ\",\n        \"rinri kazuki\": \"倫理一輝\",\n        \"rinsun\": \"リンスン\",\n        \"rinta\": \"りんた\",\n        \"rinunu\": \"りぬぬ\",\n        \"rioemon\": \"緋良雪リオ\",\n        \"rioka\": \"rioka\",\n        \"rioko\": \"りおこ\",\n        \"ripton\": \"りぷとん\",\n        \"rir\": \"RIR\",\n        \"ririmat tsuruegar\": \"リリマット・ツルーガー\",\n        \"risa.\": \"りさ。\",\n        \"risei\": \"李星\",\n        \"risuou\": \"李子昴\",\n        \"risupu\": \"risupu\",\n        \"rit.\": \"rit.\",\n        \"rittiri\": \"リッティリ\",\n        \"rityou\": \"リチョウ\",\n        \"riumu\": \"りうむ\",\n        \"riuta gao\": \"りうたがお\",\n        \"rivale\": \"RIVALE\",\n        \"riyun\": \"RiYUN\",\n        \"ro\": \"ro\",\n        \"roche\": \"Roche\",\n        \"rocket kyoudai\": \"ロケット兄弟\",\n        \"rocket okaboshi\": \"ロケット岡星\",\n        \"rockmanwjh\": \"rockmanwjh\",\n        \"roco\": \"ロコ\",\n        \"rohgun\": \"老眼\",\n        \"rojione\": \"ロジオネ\",\n        \"roki\": \"Roki\",\n        \"rokko\": \"ロッコ\",\n        \"rokomaru\": \"ロコ丸\",\n        \"roku\": \"ロク\",\n        \"rokudou ashura\": \"六道阿修羅\",\n        \"rokujyou\": \"六畳\",\n        \"rokuku\": \"ろくく\",\n        \"rokumei kanau\": \"鹿鳴叶\",\n        \"rokumonsen kako\": \"六文銭カコ\",\n        \"rokuroichi\": \"ロクロイチ\",\n        \"rokusiru\": \"六汁\",\n        \"rokusuke\": \"ろくすけ\",\n        \"rokusyou kokuu\": \"緑青黒羽\",\n        \"rollei\": \"ローライ\",\n        \"rontan\": \"ろんたん\",\n        \"root001\": \"root001\",\n        \"roreru\": \"ろれる\",\n        \"roro\": \"ロロ\",\n        \"rorochannel\": \"ろろちゃんねる\",\n        \"roromo\": \"ろろも\",\n        \"rororogi mogera\": \"露々々木もげら\",\n        \"ros\": \"ROS\",\n        \"roshuu takehiro\": \"浪州建博\",\n        \"rou\": \"rou\",\n        \"rouka\": \"ろうか\",\n        \"route39\": \"Route39\",\n        \"roy tong-koh\": \"瑞東航\",\n        \"roze\": \"ロゼ\",\n        \"rozen\": \"ロゼン\",\n        \"rq\": \"RQ\",\n        \"rt.\": \"RT.\",\n        \"rubaka\": \"Rubaka\",\n        \"rucu\": \"るく\",\n        \"rucuk\": \"るく\",\n        \"rudo\": \"Rudo\",\n        \"rudoni\": \"ルドーニ\",\n        \"ruha69\": \"ruha69\",\n        \"rui\": \"RUI\",\n        \"ruiko\": \"RUIKO\",\n        \"ruirui\": \"るいるい\",\n        \"rukichi\": \"るきち\",\n        \"rumina\": \"るみな\",\n        \"rumiya\": \"るみや\",\n        \"rumiya isasa\": \"流宮いささ\",\n        \"run\": \"ルン\",\n        \"runa\": \"runa\",\n        \"rune\": \"るね\",\n        \"ruratto\": \"るらっと\",\n        \"ruri erika\": \"瑠璃えりか\",\n        \"ruri rarako\": \"瑠璃ららこ\",\n        \"ruri tsubame\": \"瑠璃燕\",\n        \"rurimaru\": \"瑠璃丸\",\n        \"ruroo\": \"るろお\",\n        \"rururu\": \"流×3♪\",\n        \"rusher verak\": \"ラッシャーヴェラク\",\n        \"rushi\": \"るし\",\n        \"rushsoldier\": \"RushSoldier\",\n        \"russia no dassouhei\": \"ロシヤの脱走兵\",\n        \"rutubo\": \"るつぼ\",\n        \"rux\": \"rux\",\n        \"rxjx\": \"RxJx\",\n        \"ryo.k\": \"りょう・K\",\n        \"ryoattoryo\": \"りょう@涼\",\n        \"ryoji\": \"Ryoji\",\n        \"ryokunyo\": \"りょうくんよ\",\n        \"ryokuoushoku\": \"緑黄色\",\n        \"ryokusiki\": \"緑式\",\n        \"ryokutya\": \"ryokutya\",\n        \"ryomaru\": \"りょまる\",\n        \"ryome gantai\": \"両目眼帯\",\n        \"ryosuke.\": \"涼助。\",\n        \"ryouei\": \"諒英\",\n        \"ryu\": \"RYU\",\n        \"ryu shou\": \"劉祥\",\n        \"ryu-akt\": \"Ryu-Akt\",\n        \"ryujin\": \"RYUJIN\",\n        \"ryuki\": \"リュウキ\",\n        \"ryumage\": \"りう☆めいじ\",\n        \"ryuno\": \"ryuno\",\n        \"ryunosuke\": \"龍之介\",\n        \"ryutou\": \"竜湯\",\n        \"ryuudou hiromi\": \"龍堂ひろみ\",\n        \"ryuuka ryou\": \"りゅうか綾\",\n        \"konoshige\": \"コノシゲ\",\n        \"ryuuna\": \"りゅうな\",\n        \"ryuutai niku\": \"流体肉\",\n        \"s\": \"S\",\n        \"s parameter\": \"S・パラミター\",\n        \"s-ram\": \"エスラム\",\n        \"s.kosugi\": \"S.濃すぎ\",\n        \"s.shimizu\": \"S.SHIMIZU\",\n        \"s73d\": \"s73d\",\n        \"saaya\": \"さあや\",\n        \"sabahito\": \"鯖人\",\n        \"sabaku\": \"砂漠\",\n        \"sabakui\": \"食鯖獣\",\n        \"sabaneko\": \"さばねこ\",\n        \"sabanoniwatori\": \"さばのにわとり\",\n        \"sabawo\": \"サバヲ\",\n        \"sabbath\": \"Sabbath\",\n        \"sabi wasabi\": \"錆わさび\",\n        \"sabuko\": \"サブコ\",\n        \"saburou\": \"サブロー\",\n        \"sacchi\": \"さっち\",\n        \"sachito\": \"サチト\",\n        \"sachuma\": \"さちゅま\",\n        \"saco\": \"saco\",\n        \"sad\": \"SAD\",\n        \"sadagorou\": \"貞五郎\",\n        \"sadahiro\": \"定宏\",\n        \"sadakichi\": \"さだ吉\",\n        \"sado\": \"さど\",\n        \"saebashi\": \"さえばし\",\n        \"saegusa kohaku\": \"冴草こはく\",\n        \"saegusa mutsumi\": \"さえぐさ睦\",\n        \"saeki kura\": \"佐伯倉\",\n        \"saeki takao\": \"冴樹高雄\",\n        \"saemon\": \"サエモン\",\n        \"safi\": \"さふぃ\",\n        \"sagakichi\": \"さがきち\",\n        \"sagami inumaru\": \"佐上犬丸\",\n        \"sagami rin\": \"相模琳\",\n        \"sagami yoshitsune\": \"沙神よしつね\",\n        \"sagano hellmer\": \"サガノヘルマー\",\n        \"sagano yuuji\": \"サガノユウジ\",\n        \"sahara\": \"サハラ\",\n        \"sai-go\": \"sai-go\",\n        \"saiga mayu\": \"栖賀まゆ\",\n        \"saigi\": \"サイギ\",\n        \"saijo satoru\": \"西條サトル\",\n        \"saika\": \"彩霞\",\n        \"saiki\": \"斉木\",\n        \"saiki efu\": \"彩樹衛生\",\n        \"saiki makiko\": \"斉木マキコ\",\n        \"saikirider\": \"サイキライダー\",\n        \"saikyo pink\": \"才京ぴんく\",\n        \"saint shiro\": \"聖シロー\",\n        \"sainyan\": \"さいにゃん\",\n        \"saipin\": \"さいピン\",\n        \"sairi\": \"サイリ\",\n        \"saita masataka\": \"才田雅孝\",\n        \"saito\": \"才斗\",\n        \"saito sakae\": \"さいとー栄\",\n        \"saito yahu\": \"サイトウヤフ\",\n        \"saitou\": \"斎藤\",\n        \"saitou natsuki\": \"斎藤なつき\",\n        \"saitou tomoyuki\": \"斉藤友之\",\n        \"saitou yamashironokami yukihiko\": \"齋藤山城守之彦\",\n        \"saitou yuuichi\": \"斉藤祐一\",\n        \"saizuka mio\": \"祭塚澪\",\n        \"saji\": \"さじ\",\n        \"saka\": \"さか\",\n        \"sakae\": \"サカエ\",\n        \"sakai hitoshi\": \"酒井仁\",\n        \"sakai meri\": \"境メリ\",\n        \"sakai ringo\": \"坂井リンゴ\",\n        \"sakaki imasato\": \"さかきいまさと\",\n        \"sakaki maki\": \"榊MAKI\",\n        \"sakaki naomoto\": \"さかきなおもと\",\n        \"sakaki shigeru\": \"榊しげる\",\n        \"sakaki tsui\": \"さかきツイ\",\n        \"sakaki yuino\": \"榊ゆいの\",\n        \"sakakibara kaorunaoko\": \"榊原薫奈緒子\",\n        \"sakakibara keisuke\": \"榊原圭介\",\n        \"sakamoto sarutomunto nerima\": \"坂本サルトムント練馬\",\n        \"sakana\": \"魚\",\n        \"sakana tomomi\": \"魚ともみ\",\n        \"sakasana\": \"さかさな\",\n        \"sakata kintoki\": \"坂田金時\",\n        \"sakawaki herodai\": \"サカワキヒロ太\",\n        \"sakayaki\": \"月代\",\n        \"sakazuki homare\": \"酒月ほまれ\",\n        \"sakemasu\": \"サケマス\",\n        \"saketanuki\": \"酒たぬき\",\n        \"saki\": \"saki\",\n        \"saki meguru\": \"咲巡留\",\n        \"sakida saki\": \"さきだ咲紀\",\n        \"sakifox\": \"sakifox\",\n        \"sakimi\": \"さきみ\",\n        \"sakimiya\": \"sakimiya\",\n        \"sakishita senmu\": \"さきしたせんむ\",\n        \"sakisita\": \"さきした\",\n        \"sakiyamama\": \"sakiyamama\",\n        \"sakiyo cake\": \"崎由けぇき\",\n        \"sako\": \"サコ\",\n        \"sakofu\": \"さこふ\",\n        \"sakokichi\": \"さこきち\",\n        \"saku\": \"saku\",\n        \"sakuganki\": \"削顔鬼\",\n        \"sakula\": \"SAKULA\",\n        \"sakumi\": \"サクミ\",\n        \"sakumichi\": \"さくみち\",\n        \"sakuna\": \"さくな\",\n        \"sakura alta\": \"桜あるた\",\n        \"sakura ashika\": \"さくらあしか\",\n        \"sakura bunchou\": \"桜文鳥\",\n        \"sakura hanatsumi\": \"佐倉はなつみ\",\n        \"sakura hiiro\": \"さくらひいろ\",\n        \"sakura ichika\": \"桜イチカ\",\n        \"sakura kotetsu\": \"桜小鉄\",\n        \"sakura mafumi\": \"佐倉まふみ\",\n        \"sakura masachi\": \"佐倉まさち\",\n        \"sakura mkii\": \"SAKURA・mkII\",\n        \"sakura moyon\": \"桜もよん\",\n        \"sakura pino\": \"咲楽ぴの\",\n        \"sakura pochi\": \"桜ポチ\",\n        \"sakura rio\": \"佐倉りお\",\n        \"sakura ryuuken\": \"桜りゅうけん\",\n        \"sakura sawa\": \"紗久楽さわ\",\n        \"sakura yukimi\": \"桜ゆきみ\",\n        \"sakuraba yuuki\": \"桜庭友紀\",\n        \"sakuragi rian\": \"桜木李杏\",\n        \"sakurai\": \"サクライ\",\n        \"sakurai aya\": \"桜井綾\",\n        \"sakurai energy\": \"櫻井エネルギー\",\n        \"sakurai kouki\": \"桜井コウキ\",\n        \"sakuraizumi yuu\": \"桜泉ゆう\",\n        \"sakuramaru\": \"さくらまる\",\n        \"sakuramochi\": \"桜餅\",\n        \"sakurano hinako\": \"桜乃ひな子\",\n        \"sakurano ru\": \"櫻野露\",\n        \"sakurazari hotori\": \"桜去ほとり\",\n        \"sakusaku\": \"sakusaku\",\n        \"sakusha fushou\": \"作者不詳\",\n        \"sakuya tsuitachi\": \"さくやついたち\",\n        \"sakw\": \"sakw\",\n        \"salamander\": \"サラマンダ\",\n        \"salmon\": \"サーモン\",\n        \"salty\": \"ソルティ\",\n        \"salty dog\": \"ソルティドッグ\",\n        \"sam\": \"Sam\",\n        \"same\": \"さめ\",\n        \"same kamaboko\": \"鮫かまぼこ\",\n        \"samejima minoru\": \"鮫島実\",\n        \"samoko\": \"さもこ\",\n        \"samozumo tooru\": \"さもずも融\",\n        \"sanada kana\": \"真田カナ\",\n        \"sanada mike\": \"真田ミケ\",\n        \"sanada rin\": \"真田鈴\",\n        \"sanada sin-ichi\": \"真田真壱\",\n        \"sanami\": \"さなみ\",\n        \"sanase nasa\": \"真世那沙\",\n        \"sanbasou\": \"さんば挿\",\n        \"sanbu kousaku\": \"三部耕作\",\n        \"sangatsu\": \"三月\",\n        \"sangou\": \"さんごう\",\n        \"sanjou tomomi\": \"三条友美\",\n        \"sanku\": \"三九\",\n        \"sankuro\": \"三九呂\",\n        \"sannyuutei shinta\": \"三乳亭しん太\",\n        \"sano lemon\": \"さのレモン\",\n        \"sano toshihide\": \"佐野俊英\",\n        \"sanomako\": \"さのまこ\",\n        \"sanpaku\": \"三泊\",\n        \"sanpatisiki\": \"38式\",\n        \"sansyouo\": \"山椒魚\",\n        \"santos\": \"サントス\",\n        \"sanuki ami\": \"さぬき亜美\",\n        \"sanukinokami takakage\": \"讃岐守隆影\",\n        \"sanwaribiki\": \"三割引\",\n        \"sanzo\": \"三三\",\n        \"sanzui\": \"酸水\",\n        \"saogokushi\": \"さおごくし\",\n        \"saotome mokono\": \"早乙女もこ乃\",\n        \"sape\": \"さぺ\",\n        \"sapphire\": \"サファイア\",\n        \"saraki\": \"saraki\",\n        \"saranaru takami\": \"皿成高味\",\n        \"saranoki chikara\": \"沙羅木力\",\n        \"sarashina ryouichi\": \"更科了一\",\n        \"sarfata\": \"さふぁ太\",\n        \"sarikyou\": \"サリキョウ\",\n        \"saru\": \"saru\",\n        \"saru pikkoro\": \"サル・ピッコロ\",\n        \"sarujie\": \"さるぢえ\",\n        \"saruno ikigimo\": \"さるのいきぎも\",\n        \"sas\": \"SAS\",\n        \"sasa\": \"ささ\",\n        \"sasa sakuno\": \"佐々さくの\",\n        \"sasagawa nagaru\": \"笹川ながる\",\n        \"sasai\": \"些細\",\n        \"sasaki\": \"ササキ\",\n        \"sasaki kuro\": \"ささきくろ\",\n        \"sasaki maru\": \"笹木まる\",\n        \"sasaki muu\": \"佐々木無宇\",\n        \"sasaki saki\": \"ササキ サキ\",\n        \"sasaki sasa\": \"笹木ささ\",\n        \"sasaki sasasa\": \"ささき笹々\",\n        \"sasaki shinpei\": \"佐々木慎平\",\n        \"sasaki tamaru\": \"佐々木珠流\",\n        \"sasaki teron\": \"佐々木てろん\",\n        \"sasakichi\": \"ささきち\",\n        \"sasamaru\": \"笹丸\",\n        \"sasamashin\": \"ササマシン\",\n        \"sasana\": \"sasana\",\n        \"sasanoha toro\": \"笹乃葉とろ\",\n        \"sasara\": \"ささら\",\n        \"sasato\": \"笹徒\",\n        \"sasayuki\": \"SASAYUKi\",\n        \"sashimi\": \"さしみ\",\n        \"sasizume soutarou\": \"差詰そうたろう\",\n        \"sasori butter\": \"さそりバター\",\n        \"sataken\": \"佐竹犬\",\n        \"satetsu\": \"サテツ\",\n        \"sato\": \"sato\",\n        \"sato seila\": \"佐藤せいら\",\n        \"satomi\": \"里美\",\n        \"satomi hidefumi\": \"さとみひでふみ\",\n        \"satomi hinako\": \"里海ひなこ\",\n        \"satomi hiroyuki\": \"里見ひろゆき\",\n        \"satomi sato\": \"里見サト\",\n        \"satonaka chora\": \"さとなか樗良\",\n        \"satonishi\": \"サトニシ\",\n        \"satoo aki\": \"さとうあき\",\n        \"satosi\": \"Satosi\",\n        \"satou\": \"佐藤\",\n        \"satou hagane\": \"佐藤はがね\",\n        \"satou iori\": \"佐藤イオリ\",\n        \"satou kana\": \"佐藤カナ\",\n        \"satou kimiatsu\": \"さとうきみあつ\",\n        \"satou makura\": \"さとう枕\",\n        \"satou masa\": \"沙藤昌\",\n        \"satou memeko\": \"さとうメメ子\",\n        \"satou rima\": \"佐藤りま\",\n        \"satou samu\": \"佐藤36\",\n        \"satou santouhei\": \"さとう三等兵\",\n        \"satou shouji\": \"佐藤想次\",\n        \"satou tomoyuki\": \"佐藤知行\",\n        \"satou toshio\": \"佐藤登志夫\",\n        \"satouori\": \"さとうおり\",\n        \"satozaki\": \"里崎\",\n        \"satsuki\": \"朔月\",\n        \"satsuki fumi\": \"皐月フミ\",\n        \"satsuki gen\": \"皐月幻\",\n        \"satsuki haru\": \"皐月ハル\",\n        \"satsuki mikazu\": \"皐月みかず\",\n        \"satsuki suzuran\": \"皐月すずらん\",\n        \"satsuki usagi\": \"皐月ウサギ\",\n        \"satsuki yuni\": \"佐月由仁\",\n        \"sattol\": \"さっとる\",\n        \"sattsu\": \"さっつ\",\n        \"sawa\": \"さわ\",\n        \"sawada daisuke\": \"沢田大介\",\n        \"sawai delta\": \"澤井デルタ\",\n        \"sawaki saki\": \"澤木沙樹\",\n        \"sawako\": \"サワコ\",\n        \"sawamura\": \"澤村\",\n        \"sawamura ao\": \"沢村青\",\n        \"sawamura kina\": \"さわむらきな\",\n        \"sawarano goan\": \"さわらの五庵\",\n        \"sawasaki\": \"沢崎\",\n        \"sawashiro kei\": \"沢城ケイ\",\n        \"sawatari hitoshi\": \"沢渡仁司\",\n        \"sawatei\": \"さわてぃ\",\n        \"sawori\": \"サヲリ\",\n        \"sayaka\": \"紗弥香\",\n        \"sayakata katsumi\": \"茶館カツミ\",\n        \"sayoshi ayumi\": \"作吉歩允\",\n        \"sayossa\": \"さよっさ\",\n        \"sayousuke\": \"さようすけ\",\n        \"sayun\": \"さゆん\",\n        \"sazanami kazuto\": \"漣一人\",\n        \"sazanami mio\": \"さざなみみぉ\",\n        \"scarlet\": \"スカーレット\",\n        \"sch-mit\": \"シューミット\",\n        \"school izumi\": \"すくーるいずみ\",\n        \"scope cat\": \"すこぉぷCAT\",\n        \"scotch\": \"スコチ\",\n        \"sdwing\": \"SDwing\",\n        \"seanji sariel\": \"セアンジ・サリエル\",\n        \"secco\": \"Secco\",\n        \"sedra cicir\": \"sedra・cicir\",\n        \"segami daisuke\": \"瀬上大輔\",\n        \"segawa\": \"瀬川\",\n        \"seguchi takahiro\": \"瀬口たかひろ\",\n        \"sei torao\": \"瀬井虎男\",\n        \"seidenki\": \"seidenki\",\n        \"seigo\": \"せいご\",\n        \"seiha\": \"Seiha\",\n        \"seihoukei\": \"せいほうけい\",\n        \"seiichi\": \"清一\",\n        \"seijirou kagechika\": \"せいじろうかげちか\",\n        \"seiju\": \"セイジュ\",\n        \"seiryou touya\": \"青凌とうや\",\n        \"seishinja\": \"精子ンジャ\",\n        \"seito a\": \"生徒A\",\n        \"sekiguchi hiroki\": \"セキグチヒロキ\",\n        \"sekihan\": \"せきはん\",\n        \"sekihara\": \"せきはら\",\n        \"sekino takehiro\": \"関野武弘\",\n        \"sekiyu\": \"石油\",\n        \"sella\": \"せら\",\n        \"semahiro\": \"せまひろ\",\n        \"semimaru semi\": \"蝉丸せみ\",\n        \"semino yuu\": \"蝉のゆう\",\n        \"sena chifuyu\": \"瀬奈茅冬*\",\n        \"sena monaco\": \"瀬菜モナコ\",\n        \"sena rinko\": \"瀬名鈴子\",\n        \"senakagashiri\": \"背中が尻\",\n        \"senba\": \"千羽\",\n        \"senbata roh\": \"せんばた楼\",\n        \"senbon torii\": \"千本トリイ\",\n        \"senda kouji\": \"千田耕司\",\n        \"sendorikun\": \"せんどりくん\",\n        \"senga migiri\": \"旋牙闇霧\",\n        \"sengoku aky\": \"千国AKY\",\n        \"sengoku-kun\": \"戦国くん\",\n        \"senju rion\": \"千樹りおん\",\n        \"senkan yamatoni\": \"戦艦大和煮\",\n        \"senke kagero\": \"千家カゲロー\",\n        \"senkou hanabi\": \"閃光花火\",\n        \"sennomori maitake\": \"千ノ森まいたけ\",\n        \"senomoto hisashi\": \"瀬之本久史\",\n        \"senor daietsu\": \"セニョール大悦\",\n        \"senpuyaro\": \"旋風野郎\",\n        \"senrabanshou\": \"千羅万象\",\n        \"senwa\": \"センワ\",\n        \"senya yomi\": \"千夜詠\",\n        \"seo haruto\": \"瀬尾春人\",\n        \"seo tatsuya\": \"瀬尾辰也\",\n        \"sera tooru\": \"瀬良透\",\n        \"serakichi.\": \"世羅吉。\",\n        \"seres ryu\": \"セレス龍\",\n        \"seresu\": \"せれす\",\n        \"seri nazuna\": \"せりなずな\",\n        \"serika\": \"セリカ\",\n        \"serikawa kazumi\": \"芹川一海\",\n        \"serikawa saki\": \"芹川沙樹\",\n        \"serimiya ransu\": \"芹宮らんす\",\n        \"serino itsuki\": \"芹野いつき\",\n        \"serizawa anne\": \"芹沢あんね\",\n        \"serizawa katsumi\": \"芹沢克己\",\n        \"serizawa nae\": \"芹澤ナエ\",\n        \"serizawa yuuji\": \"芹沢ゆーじ\",\n        \"sesame surigoma\": \"セサミすりごま\",\n        \"seseri\": \"せせり\",\n        \"sessa takuma\": \"浙佐拓馬\",\n        \"sesso nashiko\": \"節操なし子\",\n        \"sethxzoe\": \"sethxzoe\",\n        \"setouchi\": \"瀬戸内\",\n        \"setouchi kurage\": \"瀬戸内くらげ\",\n        \"setouchi sumako\": \"せとうちすま子\",\n        \"setsuna\": \"刹那\",\n        \"setsuna yui\": \"せつな唯\",\n        \"setuna rio\": \"刹那莉織\",\n        \"sezan\": \"sezan\",\n        \"sezoku\": \"セゾク\",\n        \"shaa peipei\": \"西北々\",\n        \"shachi\": \"しゃち\",\n        \"shadow\": \"Shadow\",\n        \"shaian\": \"しゃいあん\",\n        \"shain a\": \"社員A\",\n        \"shake\": \"しゃけ\",\n        \"samon shiu\": \"左門しう\",\n        \"shakeko\": \"しゃけこ\",\n        \"shamon\": \"沙門\",\n        \"shamorock heart\": \"シャモロックハート\",\n        \"shamp samurai\": \"SHAMP侍\",\n        \"sharaku seiya\": \"写裸苦聖也\",\n        \"shark yaminabe\": \"シャーク闇鍋\",\n        \"sharpffffff\": \"sharpFFFFFF\",\n        \"shayo\": \"しゃよー\",\n        \"shen yan\": \"哂言\",\n        \"shena excel\": \"椎名エクセル\",\n        \"shian\": \"しあん\",\n        \"shiawase 1500\": \"幸せ1500\",\n        \"shiawase ninaru\": \"幸瀬になる\",\n        \"shiawase no katachi\": \"幸せのかたち\",\n        \"shiba\": \"柴\",\n        \"shibainu\": \"柴犬\",\n        \"shibame\": \"しばあめ\",\n        \"shibari kana\": \"縛夏奈\",\n        \"shibaya\": \"しばや\",\n        \"shibire hitsuji\": \"シビレヒツジ\",\n        \"shibuki oroshi\": \"飛沫おろし\",\n        \"shibusawa hayato\": \"渋沢隼人\",\n        \"shichoson\": \"市町村\",\n        \"shidaka akikuni\": \"しだかあきくに\",\n        \"shidatsu takayuki\": \"紫妲たかゆき\",\n        \"shieko\": \"しえこ\",\n        \"shift\": \"shift\",\n        \"shigaoka touki\": \"志峨丘トウキ\",\n        \"shigatake\": \"シガタケ\",\n        \"shigatsu sekito\": \"卯月赤人\",\n        \"shigehira\": \"茂平\",\n        \"shigekix\": \"しげきっくす\",\n        \"shigi azusa\": \"鴫あずさ\",\n        \"shiguchi satoshi\": \"シグチサトシ\",\n        \"shigunyan\": \"しぐにゃん\",\n        \"shigure kyou\": \"しぐれ卿\",\n        \"shigure ryuunosuke\": \"時雨龍之介\",\n        \"shihou\": \"志方\",\n        \"shii\": \"しぃ\",\n        \"shiigetsu yuu\": \"詩月雄\",\n        \"shiina nami\": \"椎名波\",\n        \"shiino yuy\": \"椎野唯\",\n        \"shijima\": \"しじま\",\n        \"shijima kiri\": \"しじま嬉吏\",\n        \"shijima yukio\": \"四島由紀夫\",\n        \"shijimi\": \"しじみ\",\n        \"shijokko\": \"しじょっこ\",\n        \"shijou mako\": \"士嬢マコ(・c_・ )\",\n        \"shijou sadafumi\": \"四条定史\",\n        \"shikage nagi\": \"しかげなぎ\",\n        \"shikanari\": \"シカナリ\",\n        \"shikata haru\": \"志方ハル\",\n        \"shikato miyo\": \"しかとみよ\",\n        \"shiki satoshi\": \"土贵智志\",\n        \"shikigami azuma\": \"しきがみあずま\",\n        \"shikimura\": \"しきむら\",\n        \"shikino\": \"シキノ\",\n        \"shikniful\": \"shikniful\",\n        \"shikojo\": \"シコジョー\",\n        \"shikunikiwa\": \"しくにきわ\",\n        \"shikuta maru\": \"シクタ丸\",\n        \"shima\": \"シマ\",\n        \"shima kyousuke\": \"志摩京佑\",\n        \"shima mitsuru\": \"志摩みつる\",\n        \"shima seiryuu\": \"嶋成龍\",\n        \"shima syu\": \"しまシュー\",\n        \"shima takashi\": \"嶌隆\",\n        \"shimachiyo\": \"しまちよ\",\n        \"shimada kazuma\": \"島田和真\",\n        \"shimada robin\": \"嶋田ロビン\",\n        \"shimagarasu\": \"嶋鴉\",\n        \"shimamoto chise\": \"しまもとちせ\",\n        \"shimamoto harumi\": \"島本晴海。\",\n        \"shimamoto utsumi\": \"嶋元うつみ\",\n        \"shimano natsume\": \"しまのなつめ\",\n        \"shimataka\": \"しまたか\",\n        \"shimazaki lem\": \"島崎れむ\",\n        \"shimeji\": \"しめじ\",\n        \"shimeko\": \"しめ子\",\n        \"shimesaba\": \"しめさば\",\n        \"shimizu kiyoshi\": \"清水清\",\n        \"shimizu naotaka\": \"志水なおたか\",\n        \"shimo yamashi\": \"下やまし\",\n        \"shimoda\": \"下田\",\n        \"shimodaira tooko\": \"下平十子\",\n        \"shimofuri oniku\": \"しもふりおにく\",\n        \"shimokata kouzou\": \"霜方降造\",\n        \"shimomura\": \"シモムラ\",\n        \"shimomura keiko\": \"シモムラ\",\n        \"shimosan\": \"シモサン\",\n        \"shimotsuka\": \"しもつか\",\n        \"shimotsuki ria\": \"しもつきりあ\",\n        \"shimoyake\": \"しもやけ\",\n        \"shimoyama giruko\": \"下山ギルコ\",\n        \"shin\": \"真\",\n        \"shin en\": \"新苑\",\n        \"shin-go\": \"シンゴ\",\n        \"shinachiku\": \"しなちく\",\n        \"shinade kuro\": \"科手黒\",\n        \"shinano yura\": \"しなのゆら\",\n        \"shinda mane\": \"Shinda Mane\",\n        \"shindoro mondoro\": \"新泥もんどろー\",\n        \"shindou mayumi\": \"シンドウマユミ\",\n        \"shindou naoto\": \"新堂なおと\",\n        \"shingata juukidou mecha\": \"新型重機動メカ\",\n        \"shingo\": \"SHINGO\",\n        \"shinichi\": \"しんいち\",\n        \"shinjiro\": \"信じろ\",\n        \"shinkai\": \"真海\",\n        \"shinma mei\": \"シンマメイ\",\n        \"shinme\": \"新芽\",\n        \"shinno kei\": \"神野けい\",\n        \"shinnosuke\": \"慎之介\",\n        \"shinobu\": \"シノブ\",\n        \"shinobu akira\": \"篠部秋良\",\n        \"ninbyo nin\": \"忍猫\",\n        \"shinobu shou\": \"哀側翔\",\n        \"shinocco\": \"しのっこ\",\n        \"shinogi kei\": \"しのぎけい\",\n        \"shinonome tarou\": \"東雲太郎\",\n        \"shinonome yuu\": \"東雲優\",\n        \"shinozaki mizu\": \"シノザキミズ\",\n        \"shinozuki kou\": \"しのづき巧\",\n        \"shinshin\": \"しんしん\",\n        \"shinsou comachi\": \"深窓小町\",\n        \"shinta\": \"シン太\",\n        \"shintani\": \"森谷\",\n        \"shio\": \"しお\",\n        \"shio604\": \"塩604\",\n        \"shiogochi\": \"シオゴチ\",\n        \"shioiri numa\": \"汐入ぬま\",\n        \"shioji miduho\": \"汐路ミヅホ\",\n        \"shioko shou\": \"塩胡しょう\",\n        \"shiomeshi\": \"塩飯\",\n        \"shiomi yuusuke\": \"士臣佑介\",\n        \"shion\": \"しおん\",\n        \"shiono etorouji\": \"塩野干支郎次\",\n        \"shiono maki\": \"塩野まき\",\n        \"shiory\": \"shiory\",\n        \"shiosaba\": \"塩鯖ッ\",\n        \"shioya maico\": \"塩屋舞子\",\n        \"shiragiku\": \"白菊\",\n        \"shiraha mato\": \"白羽まと\",\n        \"shirahata\": \"白旗\",\n        \"shiraichigo\": \"しらいちご\",\n        \"shiraishi mamim\": \"白石まみむ\",\n        \"shirakaba\": \"shirakaba\",\n        \"shirakaba masara\": \"白樺まさら\",\n        \"shirakawa yoka\": \"白河桜花\",\n        \"shirane shiratsuki\": \"白嶺白月\",\n        \"shirasagi ug\": \"しらさぎゆうじ\",\n        \"shirasaka rio\": \"白坂りお\",\n        \"shirasaki sana\": \"しらさきさな\",\n        \"shiraso\": \"しらそ\",\n        \"shirasu reiji\": \"白州礼二\",\n        \"shirasu youichi\": \"白須遙一\",\n        \"shiratama azuki\": \"白玉アズキ\",\n        \"shiratama dango\": \"白玉团子\",\n        \"shiratama1gou\": \"白玉一号\",\n        \"shiratsuki shiori\": \"白月しおり\",\n        \"shirihito\": \"尻人\",\n        \"shiritani\": \"尻谷\",\n        \"shirizou\": \"シリ蔵\",\n        \"shiro\": \"しろ\",\n        \"shiroa urang\": \"白亜卯蘭\",\n        \"shirogane\": \"城兼\",\n        \"shirogisu\": \"シロギス\",\n        \"shirogoma rai\": \"白駒らい\",\n        \"shiroi\": \"シロイ\",\n        \"shiroi gunpan\": \"白井薫範\",\n        \"shiroi hakuto\": \"しろいはくと\",\n        \"shiroi kuroneko\": \"白い黒猫\",\n        \"shiroi noria\": \"城井のりあ\",\n        \"shiroishi gatta\": \"白石ガッタ\",\n        \"shirokai mua\": \"白貝みゅあ\",\n        \"shirokarasu\": \"白からす\",\n        \"shirokitsune\": \"しろきつね\",\n        \"shiroku mako\": \"しろくまこ\",\n        \"shirokuro\": \"いれぐ白黒\",\n        \"shiromitsu daiya\": \"白蜜ダイヤ\",\n        \"shiromitsu suzaku\": \"しろみつスザク\",\n        \"shiromuu\": \"しろむー\",\n        \"shirona mikoto\": \"白奈美琴\",\n        \"shironeko haru\": \"白猫ハル\",\n        \"shironeko sanbou\": \"白猫参謀\",\n        \"shirono jia\": \"白野ジア\",\n        \"shirony\": \"しろにい\",\n        \"shiroobi\": \"しろおび\",\n        \"shiroshi\": \"しろし\",\n        \"shirosuzu\": \"しろすず\",\n        \"shirota\": \"代田\",\n        \"shirota kuronosuke\": \"白田クロノスケ\",\n        \"shirota kurota\": \"シロタクロタ\",\n        \"shirotsumekusa\": \"城爪草\",\n        \"shiroya\": \"白弥\",\n        \"shiru\": \"汁\",\n        \"shiruko jiru\": \"しるこ汁\",\n        \"shishido kurou\": \"宍戸くろう\",\n        \"shishigai\": \"シシガイ\",\n        \"shishiji\": \"ししじ\",\n        \"shishimaru\": \"獅子丸\",\n        \"shishimaru kenya\": \"ししまるけんや\",\n        \"shishiotome\": \"ししおとめ\",\n        \"shiso\": \"SHISO\",\n        \"shisui\": \"シスイ\",\n        \"shisui ao\": \"シスイ青\",\n        \"shisuka\": \"シスカ\",\n        \"shitaji mochimochi\": \"下地もちもち\",\n        \"shitori\": \"Shitori\",\n        \"shitou fumiaki\": \"志藤ふみあき\",\n        \"shitsuji kuma\": \"執事クマ\",\n        \"shiun\": \"紫雲陽\",\n        \"shiva\": \"shiva\",\n        \"shivharu\": \"シブハル\",\n        \"shiwo.\": \"しを。\",\n        \"shizaki masayuki\": \"士崎雅雪\",\n        \"shizuki shinra\": \"獅月しんら\",\n        \"shizuku\": \"しずく\",\n        \"shizuna miyuri\": \"しずなみゆり\",\n        \"shizuru\": \"シズル\",\n        \"sho-tan\": \"sho-tan\",\n        \"sho-yan\": \"しょーやん\",\n        \"shocco\": \"しょこ\",\n        \"shoco\": \"shoco\",\n        \"shocora\": \"ショコラ\",\n        \"shoda norihiro\": \"しょうだのりひろ\",\n        \"shogo\": \"shogo\",\n        \"shokora\": \"ショコラ\",\n        \"shotenin matori\": \"書店院まとり\",\n        \"shougeki no hirayama\": \"衝撃の平山\",\n        \"shouhei\": \"しょーへー\",\n        \"shouji bc\": \"庄司BC\",\n        \"shouji haruzo\": \"障子張蔵\",\n        \"shouki\": \"しょうき\",\n        \"shourin kiyoshi\": \"松林清\",\n        \"shoutarou\": \"ショウタロウ\",\n        \"show\": \"Show\",\n        \"showronpopy\": \"しょうろんぽぴー\",\n        \"shozo\": \"SHOZO\",\n        \"shri\": \"shri\",\n        \"shrine\": \"シュライン\",\n        \"shu cream\": \"シュクリム\",\n        \"shuffle\": \"shuffle\",\n        \"shuga\": \"しゅがぁ\",\n        \"shuma\": \"しゅま\",\n        \"shunjou shuusuke\": \"春城秋介\",\n        \"shunzou\": \"しゅんぞう\",\n        \"shuragyoku mami\": \"珠羅玉魔魅\",\n        \"shuu\": \"じゅう\",\n        \"shuui takahiro\": \"しゅうい☆たかひろ\",\n        \"shuurin\": \"シュウリン\",\n        \"shuuto\": \"シュウト\",\n        \"shuz\": \"shuz\",\n        \"sian\": \"しあん\",\n        \"sibamura\": \"しばむら\",\n        \"sibusawa eiki\": \"澁澤鋭樹\",\n        \"sid alice\": \"獅童ありす\",\n        \"sid daisuke\": \"士土大介\",\n        \"sieles\": \"しーるず\",\n        \"sigma rio\": \"しぐまりお\",\n        \"sigmarion\": \"シグマリオン\",\n        \"silinder\": \"silinder\",\n        \"silky\": \"しるきー\",\n        \"simama\": \"simama\",\n        \"sin\": \"sin\",\n        \"sin iti\": \"シン・イチ\",\n        \"sindo aoi\": \"新堂葵\",\n        \"sinensian\": \"Sinensian\",\n        \"sinohara sinome\": \"しのはらしのめ\",\n        \"sinori\": \"しのり\",\n        \"sinzan\": \"sinzan\",\n        \"sippufx\": \"しっぷfx\",\n        \"siratama nikukyuu\": \"しらたま肉球\",\n        \"sirazawa kousi\": \"白沢宏志\",\n        \"sirofugu\": \"白フグ\",\n        \"sirokoma\": \"白狛\",\n        \"sirokuma\": \"しろくま\",\n        \"sirou\": \"Sirou\",\n        \"siroyuki\": \"しろゆき\",\n        \"sirpent\": \"さあぺんと\",\n        \"sisakugata\": \"試咲型\",\n        \"sisei\": \"しせい\",\n        \"sisochair\": \"sisochair\",\n        \"sisui kyouko\": \"しすいきょうこ\",\n        \"siva.\": \"シヴァ。\",\n        \"sizma\": \"SIZMA\",\n        \"skemaid\": \"スケメイド\",\n        \"sknr\": \"SKNR\",\n        \"skpresents\": \"skpresents\",\n        \"sl8-all\": \"SL8-all\",\n        \"smile yuu\": \"スマイル幽\",\n        \"so-ma\": \"そーま\",\n        \"sob\": \"Sob\",\n        \"soda\": \"soda\",\n        \"soda lychee\": \"曹田らいち\",\n        \"softoof\": \"ソフトーフ\",\n        \"soga\": \"Soga\",\n        \"sohya\": \"そーや\",\n        \"soi\": \"Soi\",\n        \"soket\": \"そけっと\",\n        \"soko wa miwaku no lemon kyou\": \"そこは魅惑の檸檬郷\",\n        \"sol\": \"そる\",\n        \"sola\": \"sola\",\n        \"solar milk\": \"そらみる\",\n        \"solid lum\": \"SOLID LUM\",\n        \"solomon k\": \"そろもんK\",\n        \"solopipb\": \"ソロピップB\",\n        \"some sumiko\": \"染墨子\",\n        \"somejima\": \"ソメジマ\",\n        \"somemaru\": \"染マル\",\n        \"someya miho\": \"染谷みほ\",\n        \"son\": \"SoN\",\n        \"son palace\": \"ソンパレス\",\n        \"sonnano ari\": \"村菜野有梨\",\n        \"sono chiyoko\": \"園千代子\",\n        \"sono.\": \"その。\",\n        \"sonobe kazuaki\": \"園部一晶\",\n        \"sonohen no zako\": \"その辺のザコ\",\n        \"sonokawa sono\": \"園河ソノ\",\n        \"sonote\": \"sonote\",\n        \"sora\": \"ソラ\",\n        \"sora mame\": \"そら豆\",\n        \"zegga\": \"絶牙\",\n        \"sora tokumo\": \"空十雲\",\n        \"soraga-\": \"そらがー\",\n        \"sorami\": \"そらみ\",\n        \"sorami sio\": \"そらみしお\",\n        \"sorane miki\": \"空音美樹\",\n        \"sorani\": \"sorani\",\n        \"sorano kanata\": \"空乃カナタ\",\n        \"sorano natsumi\": \"ソラノ夏実\",\n        \"sorano umi\": \"空野海\",\n        \"soranona\": \"ソラノナ\",\n        \"sorano suzume\": \"天ノ雀\",\n        \"sorato\": \"そらと\",\n        \"sorawa reo\": \"そらわれお\",\n        \"sorono\": \"sorono\",\n        \"soso\": \"そそ\",\n        \"soso-zagri\": \"そそざぐり\",\n        \"sot\": \"sot\",\n        \"sou\": \"そう\",\n        \"sou akiko\": \"奏亜希子\",\n        \"soubi\": \"そーび\",\n        \"souchou\": \"曹长\",\n        \"souda gumi\": \"創田ぐみ\",\n        \"souen hiro\": \"蒼鉛ヒロ\",\n        \"souichi\": \"そういち\",\n        \"souko souji\": \"倉子倉次\",\n        \"soukoban\": \"倉庫番\",\n        \"soukurou\": \"双九朗\",\n        \"soul\": \"Soul\",\n        \"souma tatsuya\": \"そうま竜也\",\n        \"souma monooki2tsu tokage\": \"双馬・物置2つ・蜥蜴\",\n        \"souseiou\": \"創世王\",\n        \"sousen\": \"Sousen\",\n        \"soushin souma\": \"創神蒼魔\",\n        \"souto\": \"草人\",\n        \"soutome emu\": \"五月女えむ\",\n        \"sovayu\": \"そば湯\",\n        \"sowjun\": \"宗純\",\n        \"soyane\": \"そやね\",\n        \"soyoki\": \"そよき\",\n        \"sparrow\": \"雀\",\n        \"special g\": \"すぺしゃるじー\",\n        \"speed\": \"speed\",\n        \"squarewave29\": \"矩形波\",\n        \"ssz\": \"SSZ\",\n        \"st.germain-sal\": \"さんぢぇるまん・猿\",\n        \"st.retcher\": \"ST.レッチャー\",\n        \"stain\": \"STAIN\",\n        \"stealth changing line\": \"ステルス改行\",\n        \"stealth moko\": \"ステルスもこ\",\n        \"stem\": \"stem\",\n        \"stereotype\": \"stereotype\",\n        \"stiel\": \"すてぃえる\",\n        \"stigaya\": \"チガヤ\",\n        \"stir\": \"ステア\",\n        \"subachi\": \"すばち\",\n        \"subaru\": \"スバル\",\n        \"subuina 81r\": \"スブイナ81R\",\n        \"sudoo kaoru\": \"すどおかおる\",\n        \"sudou\": \"すどー\",\n        \"suehiro yoshiyuki\": \"末廣よしゆき\",\n        \"suemitsu dicca\": \"すえみつぢっか\",\n        \"sueyuu\": \"すえゆう\",\n        \"sugai\": \"スガイ\",\n        \"sugaleon\": \"スガレオン\",\n        \"sugamon\": \"すがもん\",\n        \"sugar picola\": \"しゅがーピコラ\",\n        \"sugata uri\": \"菅田うり\",\n        \"sugawara miyako\": \"菅原ミヤコ\",\n        \"sugayama\": \"菅山\",\n        \"sugii tsukasa\": \"すぎいつかさ\",\n        \"sugimura tomokazu\": \"杉村友和\",\n        \"sugita ranpaku\": \"過ぎた卵白\",\n        \"sugitomo kazuhiro\": \"杉友カヅヒロ\",\n        \"sugiyama genshou\": \"すぎやま現象\",\n        \"sugiyama yuzuki\": \"杉山ゆずき\",\n        \"sugoi hi\": \"すごい火\",\n        \"sugoi kinniku\": \"すごいきんにく\",\n        \"sugoku zako\": \"すごく雑魚\",\n        \"suhara shiina\": \"須原シイナ\",\n        \"suhoi\": \"すほい\",\n        \"sui\": \"sui\",\n        \"suien\": \"翠燕\",\n        \"suihei kiki\": \"水兵きき\",\n        \"suihi\": \"すいひ\",\n        \"suika\": \"酔花\",\n        \"suika koron\": \"酔花ころん\",\n        \"suika soda\": \"すいかソーダ\",\n        \"suiren\": \"睡蓮\",\n        \"suiren touru\": \"水簾藤流\",\n        \"suirenka\": \"翠錬華\",\n        \"suisen toilet\": \"水洗トイレ\",\n        \"suishin tenra\": \"水心天羅\",\n        \"suisui\": \"すいすい\",\n        \"sukage\": \"須影\",\n        \"suke6\": \"スケ6\",\n        \"sukedai\": \"すけだい\",\n        \"sukeichi\": \"すけいち\",\n        \"sukeya kurov\": \"助谷クロウ\",\n        \"suki na mono wa yakiniku\": \"好きなものは焼肉\",\n        \"sukima man\": \"すきま満\",\n        \"sukiyoshi shinji\": \"好善信士\",\n        \"sukumizu\": \"すくみづ\",\n        \"sukumo\": \"すくも\",\n        \"sukunahiko\": \"少名彦\",\n        \"sumeragi bron\": \"スメラギバロン\",\n        \"sumeragi kohaku\": \"すめらぎ琥珀\",\n        \"sumeragi kou\": \"すめらぎこう\",\n        \"sumeragi seisuke\": \"皇征介\",\n        \"sumeragi yuusuke\": \"皇裕介\",\n        \"sumeshi\": \"酢飯\",\n        \"sumihey\": \"すみ兵\",\n        \"sumio\": \"すみおー\",\n        \"sumisaki yuduna\": \"住咲ゆづな\",\n        \"sumisumi\": \"スミスミ\",\n        \"sumitomo\": \"すみとも\",\n        \"sumizaki\": \"炭崎\",\n        \"sumomo ex\": \"すももEX\",\n        \"sumomo pink\": \"すももぴんく\",\n        \"suna\": \"すな\",\n        \"sunahara izuko\": \"砂原何処\",\n        \"sunameri\": \"すなめり\",\n        \"sunao\": \"スナオ\",\n        \"sundomeya\": \"すんどめ屋\",\n        \"sunshow\": \"さんしょう\",\n        \"sunson\": \"SUNSON\",\n        \"supopo\": \"すぽぽ\",\n        \"suppy\": \"スッピー\",\n        \"supurai\": \"すぷらい\",\n        \"suradora\": \"すらドラ\",\n        \"suruga rinu\": \"駿河りぬ\",\n        \"susuanpan\": \"煤あんぱん\",\n        \"susugu\": \"ススグ\",\n        \"suto\": \"すと\",\n        \"suu\": \"すう\",\n        \"suv\": \"SUV\",\n        \"suzu\": \"すず\",\n        \"suzu kazumi\": \"寿杜缶住\",\n        \"suzuhara kouki\": \"鈴原考樹\",\n        \"suzuho hotaru\": \"鈴穗ほたる\",\n        \"suzui narumi\": \"鈴井ナルミ\",\n        \"suzukawa rino\": \"鈴川梨乃\",\n        \"suzuki address\": \"木あどれす\",\n        \"suzuki amaharu\": \"涼樹天晴\",\n        \"suzuki ganma\": \"鈴木がんま\",\n        \"suzuki kimuchi\": \"鈴木キムチ\",\n        \"suzuki metal\": \"鈴木メタル\",\n        \"suzuki mey\": \"すずきめい\",\n        \"suzuki nene\": \"鈴樹ねね\",\n        \"suzuki sakura\": \"鈴輝 桜\",\n        \"suzuki shina\": \"鈴木志奈\",\n        \"suzuki sinobu\": \"鈴木忍\",\n        \"suzuki takeo\": \"鈴木岳生\",\n        \"suzuki toto\": \"すずきとと\",\n        \"suzumaru\": \"すずまる\",\n        \"suzumiya\": \"涼御夜\",\n        \"suzumiya kazuki\": \"涼宮和貴\",\n        \"suzumiya kiriha\": \"鈴宮きりは\",\n        \"suzumori uina\": \"鈴森ういな\",\n        \"suzune rai\": \"鈴根らい\",\n        \"suzune yuuji\": \"鈴音ゆうじ\",\n        \"suzunokei\": \"スズノケイ\",\n        \"suzunomoku\": \"すずのもく\",\n        \"suzurame\": \"スズラメ\",\n        \"suzuri\": \"石見すずり\",\n        \"suzusato rinka\": \"鈴里厘花\",\n        \"suzusawa aki\": \"鈴沢秋\",\n        \"suzuse\": \"涼瀬\",\n        \"suzushiro nazuna\": \"蘿蔔なずな\",\n        \"suzushiro yutaka\": \"すずしろゆたか\",\n        \"suzushiro\": \"すずしろ\",\n        \"suzuta yume\": \"鈴田ゆめ\",\n        \"swa\": \"SWA\",\n        \"swakichi\": \"すわきち\",\n        \"syanal\": \"しゃーなる\",\n        \"syaneko\": \"しゃねこ\",\n        \"syaraku\": \"しゃらく\",\n        \"sync\": \"sync\",\n        \"syou\": \"syou\",\n        \"syougo kota\": \"省吾こた\",\n        \"syouji\": \"将司\",\n        \"syouryuupen\": \"しょーりゅーぺん\",\n        \"syowmaru\": \"翔丸\",\n        \"syoyu\": \"しょーゆ\",\n        \"syu\": \"川上修一\",\n        \"syunichi\": \"しゅにち\",\n        \"syunzo\": \"しゅんぞう\",\n        \"syutaro\": \"秋太郎\",\n        \"t\": \"T\",\n        \"t-factory\": \"T factory\",\n        \"t-hiko\": \"T彦\",\n        \"t-zok\": \"T-ZOK\",\n        \"t.cylinder\": \"円柱\",\n        \"ta\": \"ta\",\n        \"ta and a\": \"TA&A\",\n        \"ta152\": \"Ta152\",\n        \"taankee\": \"た～んけー\",\n        \"tabe koji\": \"たべ・こーじ\",\n        \"tabo\": \"tabo\",\n        \"taca\": \"taca\",\n        \"tachi tsubaki\": \"太刀椿\",\n        \"tachibana\": \"たちばな\",\n        \"tachibana chata\": \"橘チャタ\",\n        \"tachibana hisui\": \"橘ヒスイ\",\n        \"tachibana naoki\": \"断華ナオキ\",\n        \"tachibana riuta\": \"橘りうた\",\n        \"tachibana sakuya\": \"たちばなさくや\",\n        \"tachibana satsuki\": \"橘颯希\",\n        \"tachibanaei\": \"たちばなえい\",\n        \"koyama shigeru\": \"こやま滋\",\n        \"tachitsu teto\": \"舘津テト\",\n        \"tacky\": \"tacky\",\n        \"tada atsunori\": \"ただ☆あつのり\",\n        \"tadano happa\": \"ただのはっぱ\",\n        \"tadano kagekichi\": \"唯野影吉\",\n        \"tadano kushami\": \"唯乃くしゃみ\",\n        \"tadano myoushi\": \"忠之みょうし\",\n        \"tagame gengoroh\": \"田亀源五郎\",\n        \"tagro\": \"TAGRO\",\n        \"taguchi\": \"たグち\",\n        \"taguchi kirei\": \"田口綺麗\",\n        \"taguchi makoto\": \"田口まこと\",\n        \"tahara anco\": \"田原あんこ\",\n        \"tahibo\": \"誰罷慕\",\n        \"tai\": \"泰\",\n        \"tai0201\": \"帯\",\n        \"taiki\": \"大気\",\n        \"taiki ken\": \"大気KEN\",\n        \"taikuu jikan\": \"滞空時間\",\n        \"taira\": \"たいら\",\n        \"taira hajime\": \"たいらはじめ\",\n        \"taira kosaka\": \"平こさか\",\n        \"taira kouichirou\": \"平光一郎\",\n        \"tairame\": \"タイラメ\",\n        \"taireru\": \"たいれる\",\n        \"tairyo ryou\": \"大呂亮\",\n        \"taishi\": \"たいし\",\n        \"taishow tanaka\": \"たいしょう田中\",\n        \"taiyaki\": \"たいやき\",\n        \"taji\": \"たじ\",\n        \"tajima ryuushi\": \"タジマ粒子\",\n        \"tajima yasue\": \"田嶋安恵\",\n        \"tak\": \"T@k\",\n        \"tak-u\": \"TAK-U\",\n        \"taka pon\": \"タカ☆ぽん\",\n        \"taka sena\": \"嵩世菜\",\n        \"takabatake enaga\": \"高畠エナガ\",\n        \"takadoya akira\": \"たかどやあきら\",\n        \"takagari mitsuru\": \"鷹狩みつる\",\n        \"takagi kyou\": \"高木喬\",\n        \"takahagi kemono\": \"タカハギケモノ\",\n        \"takahan\": \"タカはん\",\n        \"takaha momo\": \"高羽もも\",\n        \"takahara sea-gull\": \"高原シーガル\",\n        \"takahashi\": \"多花ハシ\",\n        \"takahashi konnyaku\": \"高橋こんにゃく\",\n        \"takahashi mako\": \"タカハシマコ\",\n        \"takahashi note\": \"タカハシノヲト\",\n        \"takahashi record\": \"高橋レコード\",\n        \"takahashi yoshiki\": \"高橋良喜\",\n        \"takahashikun\": \"高橋君\",\n        \"takahiko\": \"たかひこ\",\n        \"takahirou ringu\": \"たかひろーりんぐ\",\n        \"takahisa kunihiro\": \"鷹久邦弘\",\n        \"takai biki\": \"高井美姫\",\n        \"takaishi fuu\": \"高石ふう\",\n        \"takako\": \"タカコ\",\n        \"takaku shouko\": \"高久尚子\",\n        \"takaku toshihiko\": \"高久としひこ\",\n        \"takaku tubby\": \"高句タビー\",\n        \"takamiya\": \"たかみや\",\n        \"takamiya sakura\": \"鷹宮沙玖羅\",\n        \"takamori3\": \"たかもり3\",\n        \"takamoto akisa\": \"上下右左\",\n        \"takamura tabisuke\": \"高村旅輔\",\n        \"takana yu-ki\": \"鷹那優輝\",\n        \"takanabe chitose\": \"高鍋千歳\",\n        \"takanaru\": \"たかなる\",\n        \"takanashi ayumu\": \"小鳥遊\",\n        \"takanashi china\": \"たかなし知那\",\n        \"takanashi haruto\": \"たかなしはると\",\n        \"takanashi kei\": \"小鳥遊啓\",\n        \"takanashi nozomi\": \"高梨のぞみ\",\n        \"takanashi shiro\": \"高梨志郎\",\n        \"takano hayato\": \"たかのはやと\",\n        \"takano iori\": \"高野庵\",\n        \"takano masayuki\": \"高野真之\",\n        \"takano uaka\": \"たかのうあか\",\n        \"takano yuu\": \"高野有\",\n        \"takanotume\": \"たかのつめ\",\n        \"takao hiroi\": \"高緒拾\",\n        \"takao ukyou\": \"高雄右京\",\n        \"takao yori\": \"高尾鷹浬\",\n        \"takaoka chikara\": \"高岡智空\",\n        \"takapi\": \"たかぴ\",\n        \"takara akihito\": \"宝あきひと\",\n        \"takaryoo\": \"たかりょー\",\n        \"takasaki akira\": \"高崎晶\",\n        \"takasaki karin\": \"高崎かりん\",\n        \"takasaki maco\": \"高崎まこ\",\n        \"takasaki ryo\": \"貴崎涼\",\n        \"takasaki takemaru\": \"高崎たけまる\",\n        \"takase hiroe\": \"貴瀬博恵\",\n        \"takase muh\": \"高瀬むぅ\",\n        \"takashina urara\": \"高階麗\",\n        \"takasumi miduki\": \"貴澄美月\",\n        \"takatora\": \"タカトラ\",\n        \"takatsuki ichi\": \"タカツキイチ\",\n        \"takatsuki nagy\": \"高槻ナギー\",\n        \"takatsuki shuuya\": \"高月柊也\",\n        \"takatuka ramune\": \"鷹柄ラムネ\",\n        \"takaya yoshiyuki\": \"鷹屋ヨシユキ\",\n        \"takayama chihiro\": \"高山千尋\",\n        \"takayamanon\": \"タカヤマノン\",\n        \"takayuki hiyori\": \"Evo.R.B\",\n        \"take takeshi\": \"武猛\",\n        \"take toshiaki\": \"武俊彰\",\n        \"takea saki\": \"たけあ崎\",\n        \"takeashiro\": \"たけあしろ\",\n        \"takeda\": \"たけだ\",\n        \"takeda sora\": \"武田空\",\n        \"takedake\": \"タケダケ\",\n        \"takei tsukasa\": \"タケイツカサ\",\n        \"takemaru\": \"タケマル\",\n        \"takemitz\": \"たけみつ\",\n        \"takemori shintarou\": \"竹森真太郎\",\n        \"takenaka hideo\": \"武中英雄\",\n        \"takenoko\": \"takenoko\",\n        \"takenoko maru\": \"たけのこ丸\",\n        \"takenoko seijin\": \"たけのこ星人\",\n        \"takenouchi suama\": \"竹之内すあま\",\n        \"takepon\": \"たけぽん\",\n        \"takeponian\": \"たけぽにあん\",\n        \"takese nono\": \"高瀬乃々\",\n        \"takeshima eku\": \"竹嶋えく\",\n        \"takeshisu\": \"タケシス\",\n        \"takeshita kenjirou\": \"竹下けんじろう\",\n        \"taketora suzume\": \"竹虎スズメ\",\n        \"takeu\": \"たけう\",\n        \"takeuchi reona\": \"竹内玲于奈\",\n        \"takeuma\": \"たけうま\",\n        \"takewakamaru\": \"武若丸\",\n        \"takewan\": \"たけわん\",\n        \"takeyama kaki\": \"たけやまかき\",\n        \"takeyama shimeji\": \"茸山しめじ\",\n        \"taki re-ki\": \"滝れーき\",\n        \"takimoto satoru\": \"滝本悟\",\n        \"takineko\": \"タキ猫\",\n        \"takizawa hajime\": \"瀧澤春\",\n        \"takkii\": \"たっきぃ\",\n        \"takku\": \"たっく\",\n        \"tako\": \"たこ\",\n        \"tako kuboh\": \"蛸公方\",\n        \"takorice\": \"たこらいす\",\n        \"takotyu\": \"たこちゅう\",\n        \"takoya kiki\": \"多胡屋きき\",\n        \"takoyaki\": \"たこ焼き\",\n        \"takto\": \"TAKTO\",\n        \"taku\": \"タク\",\n        \"taku hiraku\": \"拓ヒラク\",\n        \"takuji yuusaku\": \"卓二雄作\",\n        \"takuma\": \"琢磨\",\n        \"takuma tomomasa\": \"たくま朋正\",\n        \"takumi na muchi\": \"たくみな無知\",\n        \"takumi rohan\": \"たくみ露伴\",\n        \"takura mahiro\": \"田倉まひろ\",\n        \"takuteks\": \"TAKUTEKS\",\n        \"tama\": \"tama\",\n        \"tama ii\": \"たまつー\",\n        \"tama kifuyu\": \"たまきふゆ\",\n        \"tamachi\": \"たまち\",\n        \"tamachie\": \"たまちえ\",\n        \"tamaco\": \"tamaco\",\n        \"tamagawa chiruru\": \"多摩川ちるる\",\n        \"tamagawa yakkyou\": \"多摩川やっきょう\",\n        \"tamagawa yukimaru\": \"多摩川雪丸\",\n        \"tamago\": \"煌月忍\",\n        \"tamago meshi\": \"たまごめし\",\n        \"tamahiro\": \"たまひろ\",\n        \"tamahiyo\": \"たまひよ\",\n        \"tamaki kaoru\": \"環かおる\",\n        \"tamaki nozomu\": \"環望\",\n        \"tamaki yayoi\": \"珠樹やよい\",\n        \"tamaki yui\": \"タマキ結\",\n        \"tamamo ozen\": \"たまも御前\",\n        \"tamanegi\": \"たまねぎ\",\n        \"tamaoki benkyo\": \"玉置勉強\",\n        \"tamaran niisan\": \"たまらん兄さん\",\n        \"tamaru\": \"たまる\",\n        \"tamaru makoto\": \"田丸まこと\",\n        \"tamarun\": \"タマラン\",\n        \"tamatsuyada\": \"たまつやだ\",\n        \"tame\": \"ため\",\n        \"tamekou\": \"ためこう\",\n        \"tami-k\": \"TAMI-K\",\n        \"tamifull\": \"たみふる\",\n        \"tamiko\": \"たみこ\",\n        \"tamineko\": \"タミネコ\",\n        \"tamo\": \"たも\",\n        \"tamochi\": \"田持\",\n        \"tamon ketsuyuki\": \"多門結之\",\n        \"tamori tadaji\": \"たもりただぢ\",\n        \"tamu\": \"たむ\",\n        \"tamuhi\": \"タムヒ\",\n        \"tamura searchlight\": \"田村サーチライト\",\n        \"tamura shimeji\": \"田村シメジ\",\n        \"tana\": \"TANA\",\n        \"tanabe\": \"TANABE\",\n        \"tanaka keigo\": \"たなかけいご\",\n        \"tanaka kumubou\": \"田中伍某\",\n        \"tanaka penta\": \"田中ペン太\",\n        \"tanaka rin\": \"田中琳\",\n        \"tanaka sei\": \"田中セイ\",\n        \"tanaka tarou\": \"田中太郎\",\n        \"tanakamori yokota\": \"田中森よこた\",\n        \"tanakana\": \"たなかな\",\n        \"tanba kuromame\": \"丹波KURO豆\",\n        \"tanemura arina\": \"種村有菜\",\n        \"tanenashi kuribo\": \"たねなしくりぼ\",\n        \"tanenashi miya\": \"種梨みや\",\n        \"tange rin\": \"丹下凛\",\n        \"tango-tango\": \"tango-tango\",\n        \"taniguchi daisuke\": \"谷口大介\",\n        \"tanihara natsuki\": \"たにはらなつき\",\n        \"tanimura marika\": \"谷村まりか\",\n        \"tanizakura shidare\": \"谷桜しだれ\",\n        \"tanken harahara\": \"探検はらはら\",\n        \"tankslayer equals san\": \"タンクスレイヤー=サン\",\n        \"tano\": \"たの\",\n        \"tanoma suzume\": \"たのますずめ\",\n        \"tanpopo shunmaru\": \"たんぽぽ隼丸\",\n        \"tansui shirasu\": \"淡水シラス\",\n        \"tanufude\": \"たぬふで\",\n        \"tanuki\": \"たぬき\",\n        \"tanuma yuuichirou\": \"田沼雄一郎\",\n        \"tanunosuke\": \"たぬ之助\",\n        \"tanutan\": \"たぬたん\",\n        \"tanzi\": \"丹治\",\n        \"tao\": \"たお\",\n        \"tapisuke\": \"たぴすけ\",\n        \"tappa\": \"たっぱ\",\n        \"tar\": \"TAR\",\n        \"tarakan\": \"たらかん\",\n        \"tarazoo\": \"たらぞお\",\n        \"tare\": \"たれ\",\n        \"tare mayuzou\": \"タレ眉ぞう\",\n        \"tarekatsu\": \"TARE活\",\n        \"tarihou\": \"タリホウ\",\n        \"tarinu\": \"足りぬ\",\n        \"tariyoshi\": \"たりよし\",\n        \"taro\": \"taro\",\n        \"taro-san\": \"たろさん\",\n        \"taropun\": \"たろプン\",\n        \"taroro\": \"たろろ\",\n        \"tarte\": \"タルト\",\n        \"tarutarugungun\": \"たるたるぐんぐん\",\n        \"taryl.\": \"たりる｡\",\n        \"tasa urara\": \"たさうらら\",\n        \"tasuku\": \"助\",\n        \"tasuro kuzuha\": \"たすろくずは\",\n        \"tataru\": \"タタル\",\n        \"tatejima.\": \"縦縞。\",\n        \"tateno tomoki\": \"タテノトモキ\",\n        \"sennohito.\": \"線の人。\",\n        \"tatsuhiko\": \"たつひこ\",\n        \"tatsumiya motokazu\": \"たつみやもとかず\",\n        \"tatsumu kyou\": \"龍武京\",\n        \"tatsuneko\": \"たつねこ\",\n        \"tatsunosuke yukiya\": \"逹之介ユキヤ\",\n        \"tatsuoka miyoshi\": \"龍岡巳葦\",\n        \"tatsuya\": \"tatsuya\",\n        \"tatunokosso\": \"タツノコッソ\",\n        \"tau\": \"tau\",\n        \"tavor\": \"Tavor\",\n        \"taya takashi\": \"たやたかし\",\n        \"tayuta yuu\": \"たゆた☆ゆう\",\n        \"teaindian\": \"紅茶インディアン\",\n        \"tear\": \"Tear\",\n        \"tec\": \"TEC\",\n        \"tecchan\": \"てっちゃん\",\n        \"techizou\": \"てちぞう\",\n        \"techno\": \"てくの\",\n        \"teckei\": \"TEcKei\",\n        \"tedain\": \"てだいん\",\n        \"tegdor\": \"てぐどら\",\n        \"tegura yuuki\": \"テグラユウキ\",\n        \"tehen\": \"てへん\",\n        \"tei-oh-k-takamuro\": \"TEI-OH-K-TAKAMURO\",\n        \"teil\": \"teil\",\n        \"teitaraku\": \"ていた楽\",\n        \"teka\": \"てか\",\n        \"tekkyuu\": \"鉄球\",\n        \"teko\": \"てこ\",\n        \"tekuteku\": \"てくてく\",\n        \"teltelhousi\": \"てるてる法師\",\n        \"ten\": \"貂\",\n        \"ten ga\": \"天駕\",\n        \"ten no hoshi\": \"天ノ星\",\n        \"tenamaru\": \"テナマル\",\n        \"tenchuumaru\": \"天誅丸\",\n        \"tenchuunan\": \"天誅男\",\n        \"tendou itsuki\": \"天堂樹\",\n        \"tendou kuon\": \"天童久遠\",\n        \"tendou makura\": \"天童まくら\",\n        \"tengudake\": \"テングダケ\",\n        \"tenji\": \"てんじ\",\n        \"tenjiku rounin\": \"天竺浪人\",\n        \"tenju\": \"天咒\",\n        \"tenkawa ai\": \"天河藍\",\n        \"tenken\": \"てんけん\",\n        \"tenma\": \"天馬\",\n        \"tenmaso\": \"てんまそ\",\n        \"tenori\": \"てのり\",\n        \"tenrai\": \"天籟\",\n        \"tenshou akira\": \"天祥輝\",\n        \"tenteko\": \"てんてこ\",\n        \"tentenkingyo\": \"てんてんきんぎょ\",\n        \"tenyati\": \"TenYati\",\n        \"tenyuu\": \"てんゆ～\",\n        \"tenzaki kanna\": \"天崎かんな\",\n        \"tera\": \"TERA\",\n        \"terada\": \"寺田\",\n        \"terada tera\": \"寺田てら\",\n        \"terai daikichi\": \"寺イ大吉\",\n        \"teramoto kaoru\": \"寺本薫\",\n        \"terashi\": \"てらし\",\n        \"terasu mc\": \"テラスmc\",\n        \"terazip\": \"テラzip\",\n        \"teri terio\": \"てりてりお\",\n        \"terry hijiri\": \"照井聖\",\n        \"teru\": \"てる\",\n        \"terufuu\": \"てるふう\",\n        \"terujirou\": \"晃次郎\",\n        \"teruwi\": \"てるうぃ\",\n        \"teruyama momiji\": \"照山紅葉\",\n        \"tes\": \"tes\",\n        \"teshio\": \"てしお\",\n        \"tete\": \"tete\",\n        \"tetoga\": \"てとが\",\n        \"tetora\": \"てとら\",\n        \"tetramax\": \"てとらまっくす\",\n        \"tetsu kazuna\": \"鉄カズナ\",\n        \"tetsubirei\": \"てつびれい\",\n        \"tetsukui\": \"鐡喰\",\n        \"tetsumi\": \"哲美\",\n        \"tetsunohiji\": \"てつのひじ\",\n        \"tetsuya\": \"テツヤ\",\n        \"tetubuta\": \"鉄豚\",\n        \"tetujin momoko\": \"鉄人桃子\",\n        \"tetumiya\": \"鉄宮\",\n        \"thanat\": \"たなと\",\n        \"the fall guy\": \"フォール・ガイ\",\n        \"the orz\": \"the_orz\",\n        \"thor\": \"THOR\",\n        \"tickzou\": \"てぃくぞー\",\n        \"tid\": \"TID\",\n        \"tief\": \"Tief\",\n        \"tiger\": \"タイガー\",\n        \"tiger shark\": \"大牙射悪\",\n        \"tigusa suzume\": \"千草雀\",\n        \"tilm\": \"ティルム\",\n        \"tim\": \"TIM\",\n        \"tima\": \"ちぃま\",\n        \"timato\": \"ちまと\",\n        \"timuni\": \"チムニ\",\n        \"ting\": \"Ting\",\n        \"tipo\": \"ティーポ\",\n        \"tira\": \"Tira\",\n        \"tirotata\": \"ちろたた\",\n        \"titiduki\": \"チチヅキ\",\n        \"tiv\": \"Tiv\",\n        \"tj-type1\": \"TJ-type1\",\n        \"tk\": \"TK\",\n        \"tkdash\": \"TKDASH\",\n        \"tks\": \"TKS\",\n        \"tnsk\": \"TNSK\",\n        \"tobari\": \"とばり\",\n        \"tobimura\": \"鳶村\",\n        \"tobunda jet\": \"飛ぶんだジェット\",\n        \"toby\": \"だぶるあーる\",\n        \"tocky\": \"Tocky\",\n        \"toda kaduki\": \"とだかづき\",\n        \"todd oyamada\": \"トッド小山田\",\n        \"todoroki shusei\": \"等々力秋声\",\n        \"tofu\": \"とうふ\",\n        \"togame\": \"とがめ\",\n        \"togashi\": \"トガシ\",\n        \"toge toge\": \"棘棘\",\n        \"togo\": \"とーご\",\n        \"toguchi masaya\": \"トグチマサヤ\",\n        \"tohani\": \"とーはに\",\n        \"tohno tatsuki\": \"遠野タツキ\",\n        \"toi\": \"Toi\",\n        \"toi amatsu\": \"とい天津\",\n        \"toichi\": \"トイチ\",\n        \"toilet\": \"といれ\",\n        \"toilet komoru\": \"トイレ籠\",\n        \"toine hoko\": \"樋音歩琥\",\n        \"toitoi\": \"といとい\",\n        \"toka\": \"toka\",\n        \"tokachi genjuurou\": \"十勝源十郎\",\n        \"tokei\": \"時計\",\n        \"tokei usagi\": \"とけーうさぎ\",\n        \"tokeiya-san\": \"時計屋さん\",\n        \"toki\": \"トキ\",\n        \"tokiai haya\": \"伽藍快\",\n        \"tokihama jiro\": \"時浜次郎\",\n        \"tokimachi eisei\": \"トキマチ★エイセイ\",\n        \"tokimal yoshihisa\": \"時丸佳久\",\n        \"tokino\": \"時乃\",\n        \"tokinobutt\": \"ときのぶっと\",\n        \"tokinon\": \"ときのん\",\n        \"tokio\": \"ときお\",\n        \"tokisaka mugi\": \"時坂夢戲\",\n        \"tokisana\": \"トキサナ\",\n        \"tokita monta\": \"刻田門大\",\n        \"tokitoki\": \"ときとき\",\n        \"tokiwa kanenari\": \"常磐兼成\",\n        \"tokiwa wako\": \"ときわようこ\",\n        \"tokiwa youko\": \"常葉ヨウコ\",\n        \"tokiwa yutaka\": \"ときわゆたか\",\n        \"tokizumi emishi\": \"時積恵美之\",\n        \"tokkou kujira\": \"特攻くじら\",\n        \"tokonaru\": \"トコナル\",\n        \"tokonone\": \"床音\",\n        \"tokorot\": \"tokorot\",\n        \"tokorotenf\": \"ところてんf\",\n        \"tokoyo\": \"常世\",\n        \"tokoyo akashi\": \"常夜あかし\",\n        \"tokoyon\": \"tokoyon\",\n        \"toku\": \"特\",\n        \"toku soncho\": \"とく村長\",\n        \"tokuda shinnosuke\": \"徳田しんのすけ\",\n        \"tokugawa miyo\": \"徳川みよ\",\n        \"tokui supermarket\": \"徳井スーパーマーケット\",\n        \"tokumei hero\": \"匿名ヒーロー\",\n        \"tokunaga\": \"とくなが\",\n        \"tokunomura\": \"とおくのむら\",\n        \"tokurito\": \"とくりと\",\n        \"tokusa lico\": \"砥草りこ\",\n        \"tokutan\": \"とくたん\",\n        \"tokyo\": \"tokyo\",\n        \"tokyokyoto\": \"東京京都\",\n        \"tololi\": \"とろり\",\n        \"tom\": \"トム\",\n        \"tom keith\": \"とむ・きーす\",\n        \"toma\": \"TOMA\",\n        \"tomakomai\": \"とまこまい\",\n        \"tomatomato\": \"トマトマト\",\n        \"tome\": \"トメ\",\n        \"tomekichi\": \"とめきち\",\n        \"tometo\": \"とめと\",\n        \"tomihero\": \"トミヒロ\",\n        \"tomisawa chinatsu\": \"とみさわ千夏\",\n        \"tomite\": \"とみて\",\n        \"tomiyama akiji\": \"兎耳山アキジ\",\n        \"tomiyoshi\": \"トミヨシ\",\n        \"tomneko\": \"吐夢猫\",\n        \"tomo takino\": \"智タキノ\",\n        \"tomoe\": \"巴萌\",\n        \"tomoe kiko\": \"トモエキコ\",\n        \"tomoe tenbu\": \"巴天舞\",\n        \"tomohara michiya\": \"友原道哉\",\n        \"tomoharu\": \"トモハル\",\n        \"tomohiro\": \"ともひろ\",\n        \"tomojo\": \"ともじょー\",\n        \"tomoki shikata\": \"志方朋季\",\n        \"tomomaya\": \"tomomaya\",\n        \"tomona\": \"tomona\",\n        \"tomosuke\": \"ともすけ\",\n        \"tomotsuka haruomi\": \"ともつか治臣\",\n        \"tomoya\": \"ともや\",\n        \"tomoya kankurou\": \"友屋勘九郎\",\n        \"tomto\": \"Tomto\",\n        \"tomu\": \"tomu\",\n        \"tonbo\": \"トンボ\",\n        \"tonchan\": \"とんちゃん\",\n        \"tonikaku\": \"兎に角\",\n        \"tonnosuke\": \"とんのすけ\",\n        \"tonotani\": \"とのたに\",\n        \"tonpu\": \"とんぷ\",\n        \"tonsuke\": \"とんすけ\",\n        \"tonten\": \"トンテン\",\n        \"tooco\": \"Tooco\",\n        \"tooda shunkei\": \"遠田春景\",\n        \"tooka\": \"とーか\",\n        \"toono yayoi\": \"十野弥生\",\n        \"tooya\": \"十矢\",\n        \"tooya daisuke\": \"遠矢大介\",\n        \"topo\": \"とぽ\",\n        \"tora\": \"虎\",\n        \"torai ryuu\": \"虎井 龍\",\n        \"toraisi666\": \"とらいし666\",\n        \"torajimaneko\": \"とらじまねこ\",\n        \"torakichi\": \"とらきち\",\n        \"toran\": \"とらん\",\n        \"toraneko\": \"トラ猫\",\n        \"kyukyutto\": \"キュキュット\",\n        \"tori\": \"トリ◯\",\n        \"tori hikari\": \"とりひかり\",\n        \"tori mogura\": \"鳥土竜\",\n        \"tori nice par\": \"とりナイスパー\",\n        \"toria\": \"とりあ\",\n        \"toribami sasami\": \"鳥喰ささみ\",\n        \"torigoshi yayoi\": \"鳥越やよい\",\n        \"torikawa\": \"鳥皮\",\n        \"toriki cooya\": \"とりきくーや\",\n        \"torimaki\": \"鳥巻\",\n        \"torimaru\": \"トリ○\",\n        \"torino munenik\": \"トリノ宗肉\",\n        \"torisan\": \"鳥三\",\n        \"torisana\": \"トリサナ\",\n        \"torishimo\": \"とりしも\",\n        \"toritora\": \"酉寅\",\n        \"toriumi kapiko\": \"鳥海かぴこ\",\n        \"toroi\": \"toroi\",\n        \"tororo\": \"とろろ\",\n        \"torque\": \"トルク\",\n        \"toryuu\": \"十竜\",\n        \"tos-tos-f-ski\": \"とすとすFスキー\",\n        \"tosa\": \"トサ\",\n        \"tosh\": \"tosh\",\n        \"toshihiro\": \"トシヒロ\",\n        \"toshiki yuuji\": \"としきゆうぢ\",\n        \"toshio\": \"としお\",\n        \"toshizo\": \"トシぞー\",\n        \"toto nemigi\": \"ととねみぎ\",\n        \"totofumi\": \"ととふみ\",\n        \"totoki kikaku\": \"十時企画\",\n        \"totokichi\": \"トトキチ\",\n        \"totto\": \"totto\",\n        \"tottori sakyuu\": \"鳥取砂丘\",\n        \"toudori\": \"トウドリ\",\n        \"toudou fumika\": \"藤堂冬美香\",\n        \"toufu majin\": \"とうふ魔神\",\n        \"touga kotobuki\": \"塔河寿\",\n        \"touge hiro\": \"峠比呂\",\n        \"toujou\": \"東條\",\n        \"touko\": \"東子\",\n        \"touma nao\": \"藤馬奈緒\",\n        \"tourou\": \"灯籠\",\n        \"touta\": \"淘汰\",\n        \"toutaku\": \"董卓\",\n        \"touya\": \"と～や\",\n        \"touya tsuduru\": \"塔夜綴\",\n        \"tow\": \"tow\",\n        \"towa\": \"とわ\",\n        \"towai raito\": \"問合来人\",\n        \"towamin\": \"とわみん\",\n        \"tower\": \"ToWeR\",\n        \"toya hayato\": \"トヤハヤト\",\n        \"toyama jigoku\": \"外山じごく\",\n        \"toyama nanao\": \"とやま七生\",\n        \"toyo\": \"とよ\",\n        \"toyoman\": \"TOYOMAN\",\n        \"toyomaru\": \"十夜丸\",\n        \"toyoshima yuusaku\": \"豊島ゆーさく\",\n        \"tozakura nagomi\": \"都桜和\",\n        \"transition\": \"transition\",\n        \"trickster\": \"TrickSter\",\n        \"trident\": \"トライデント\",\n        \"trista\": \"トリスタ\",\n        \"trump\": \"Trump\",\n        \"try\": \"TRY\",\n        \"tsubaki hara\": \"ツバキハラ\",\n        \"tsubaki metasu\": \"椿めたす\",\n        \"tsubakiya meguru\": \"椿屋めぐる\",\n        \"tsubakiyama parry\": \"椿山パリィ\",\n        \"tsubasa\": \"ツバサ\",\n        \"tsucaco\": \"tsucaco\",\n        \"tsuchiya tarou\": \"土屋太郎\",\n        \"tsuda akira\": \"津田 晶\",\n        \"tsugaru\": \"Tsugaru\",\n        \"tsugu\": \"つぐ\",\n        \"tsugumi\": \"tsugumi\",\n        \"tsugumi nagisa\": \"ツグミ渚\",\n        \"tsuina\": \"tsuina\",\n        \"tsuino sumika\": \"終野すみか\",\n        \"tsuizi\": \"ついじ\",\n        \"tsuji\": \"ツジ\",\n        \"tsuji takeshi\": \"辻武司\",\n        \"tsujigiri\": \"つじぎり\",\n        \"tsujimaru\": \"辻丸\",\n        \"tsukadama\": \"つかだま\",\n        \"tsukasa jun\": \"司淳\",\n        \"tsukasa ningyou\": \"司人形\",\n        \"tsuki neko\": \"月猫\",\n        \"tsuki yoshimi\": \"月嘉\",\n        \"tsukigami\": \"月咬\",\n        \"tsukigami chronica\": \"月上クロニカ\",\n        \"tsukiji\": \"月路\",\n        \"tsukikage hisashi\": \"月影久\",\n        \"tsukikage manmaru\": \"月影満丸\",\n        \"tsukimi kirara\": \"月見キララ\",\n        \"tsukinami kousuke\": \"月並甲介\",\n        \"tsukino\": \"月野\",\n        \"tsukino wakuma\": \"月野輪熊\",\n        \"tsukino yuuya\": \"月野悠也\",\n        \"tsukinose maro\": \"月之瀬まろ\",\n        \"tsukishima kai\": \"月島改\",\n        \"tsukishima mist\": \"月島ミスト\",\n        \"tsukishima takafuyu\": \"月島隆冬\",\n        \"tsukuba kensuu\": \"つくばケンスウ\",\n        \"tsukumizu yuu\": \"月水憂\",\n        \"tsukumo\": \"九十九\",\n        \"tsukumo gou\": \"19号\",\n        \"tsukumo kazuki\": \"ツクモカヅキ\",\n        \"tsukumo matoro\": \"月雲まとろ\",\n        \"tsukushino makoto\": \"つくしの真琴\",\n        \"tsukuyomi sazin\": \"月読さじん\",\n        \"tsumetoro\": \"つめとろ\",\n        \"tsumitani daisuke\": \"罪谷死輔\",\n        \"tsumugi\": \"つむぎ\",\n        \"tsumumi\": \"つむみ\",\n        \"tsuna\": \"ツナ\",\n        \"tsuna onigiri\": \"ツナおにぎり\",\n        \"tsunami\": \"ツナミ\",\n        \"tsunamushi\": \"つなむし\",\n        \"tsunapiko\": \"TSUNAPIKO\",\n        \"tsunbeji\": \"つんべじ\",\n        \"tsune yoshi\": \"常好し\",\n        \"tsuneyoshi\": \"つねよし\",\n        \"tsuno\": \"つの\",\n        \"tsunoame kazuya\": \"角雨和八\",\n        \"tsunoda mag\": \"つのだ★まぐ\",\n        \"tsunoda saburoo\": \"つのだサブロー\",\n        \"tsunomiya katsuki\": \"津宮伽月\",\n        \"tsunsuki\": \"ツンスキ\",\n        \"tsurimiya gen\": \"釣宮弦\",\n        \"tsuru\": \"つる\",\n        \"tsurugi\": \"Tsurugi\",\n        \"tsurugi ai\": \"剑城蓝\",\n        \"tsurugi hikaru\": \"つるぎ輝\",\n        \"tsurugi wakarou\": \"鶴亀ワカロー\",\n        \"tsurugi yasuyuki\": \"剣康之\",\n        \"tsurukame\": \"ツルKAME\",\n        \"tsuruma megumi\": \"つるまめぐみ\",\n        \"tsurumaki kazuya\": \"鶴巻和哉\",\n        \"tsusauto\": \"津差宇土\",\n        \"tsutsumi\": \"包\",\n        \"tsutsumi akari\": \"つつみあかり\",\n        \"tsutsumori\": \"筒森\",\n        \"tsuwabuki raishi\": \"石蕗らいし\",\n        \"tsuyoshi\": \"津義\",\n        \"tsuzuki kazuhiko\": \"都築和彦\",\n        \"tsuzuki masumi\": \"つづきますみ\",\n        \"tsuzura\": \"つづら\",\n        \"tsuzurao kaya\": \"九尾かや\",\n        \"tsuzuri\": \"水瀬修\",\n        \"tt\": \"tt\",\n        \"ttl\": \"ttl\",\n        \"ttomm\": \"TTOMM\",\n        \"ttuunn\": \"つん\",\n        \"tukamori syuuji\": \"ツカモリシュウジ\",\n        \"tukazi\": \"つかぢ\",\n        \"tukii yasiro\": \"月井やしろ\",\n        \"tukikage nemu\": \"月影ネム\",\n        \"tukise mizuna\": \"月瀬水無\",\n        \"tukisiro saya\": \"月白沙耶\",\n        \"tukito\": \"月兎\",\n        \"tukumo keiichi\": \"九十九K1\",\n        \"tukusi hirokazu\": \"土筆ヒロカズ\",\n        \"tulip\": \"ちゅーりっふ。\",\n        \"tuna milk\": \"つなみるく\",\n        \"tuyo\": \"tuyo\",\n        \"twilight\": \"TWILIGHT\",\n        \"tyanaka\": \"てぃゃなか\",\n        \"tyatubo\": \"ちゃつぼ\",\n        \"tyauke\": \"茶請\",\n        \"tyke\": \"たいく\",\n        \"tyongera.\": \"ちょんげら。\",\n        \"typehatena\": \"たいぷはてな\",\n        \"tyrant sugawara\": \"タイラント菅原\",\n        \"tyranu\": \"ティラヌー\",\n        \"tyuda\": \"ちゅだ\",\n        \"tyuuten\": \"蟲天\",\n        \"u\": \"う\",\n        \"u nitro\": \"うにとろ\",\n        \"u-1\": \"U-1\",\n        \"u-hi\": \"U-hi\",\n        \"u-k\": \"U-K\",\n        \"u-ko\": \"U子\",\n        \"u-ring\": \"うーりん\",\n        \"u-ta\": \"u-ta\",\n        \"u35\": \"U35\",\n        \"ubanis\": \"うばにす\",\n        \"uchi-uchi keyaki\": \"内々欅\",\n        \"uchida shou\": \"内田翔\",\n        \"uchiga\": \"ウチガ\",\n        \"uchikura\": \"内座\",\n        \"uchiyan\": \"ウチやん\",\n        \"uchoten\": \"有頂天\",\n        \"uchuu ika\": \"宇宙烏賊\",\n        \"udon\": \"うどん\",\n        \"uduki sonowo\": \"空月苑生\",\n        \"ueda rieko\": \"上田リエコ\",\n        \"ueda ryou\": \"植田亮\",\n        \"uehara ari\": \"上原あり\",\n        \"uehasu\": \"上蓮\",\n        \"uehiro\": \"うえひろ\",\n        \"uemukai dai\": \"上向だい\",\n        \"ueno ebisen\": \"上野えびせん\",\n        \"ueno juubai\": \"上野十倍\",\n        \"ueno meguru\": \"植野メグル\",\n        \"ueno naoya\": \"ウエノ直哉\",\n        \"ueshima haruki\": \"上嶋ハルキ\",\n        \"uesugi shingo\": \"上杉信五\",\n        \"uetake\": \"植竹\",\n        \"ueto seri\": \"上戸セリ\",\n        \"ugatsu matsuki\": \"うがつ末期\",\n        \"ugeppa\": \"うげっぱ\",\n        \"ugetsu\": \"ウゲツ\",\n        \"ugo\": \"ゆうご\",\n        \"ugou gou\": \"うごうゴウ\",\n        \"uguisu kagura\": \"莺神乐\",\n        \"uhhii\": \"うっひー\",\n        \"uin\": \"uin\",\n        \"uirotuzi yumihiko\": \"外郎辻ゆみ彦\",\n        \"uirou\": \"うぃろう\",\n        \"ukatu jyuzou\": \"迂闊十臓\",\n        \"ukikotatsu\": \"うきこたつ\",\n        \"ukita tougo\": \"宇岐多冬梧\",\n        \"uku\": \"uku\",\n        \"ukyo rst\": \"ukyo_rst\",\n        \"ukyochu\": \"うきょちゅう\",\n        \"ulrich\": \"うるりひ\",\n        \"ultone\": \"うるとん\",\n        \"ultrabuster\": \"ウルトラバスター\",\n        \"uma\": \"UMA\",\n        \"umadura grenouille\": \"馬面グルヌイユ\",\n        \"umanosuke\": \"馬の助\",\n        \"umayadono ohji\": \"厩戸王子\",\n        \"ume\": \"うめ\",\n        \"umehara suzuko\": \"梅原スズコ\",\n        \"umekichi\": \"ウメ吉\",\n        \"umekko\": \"うめっこ\",\n        \"umemachi syouji\": \"梅町将二\",\n        \"umeran\": \"うめらん\",\n        \"umetarou\": \"梅太郎\",\n        \"umezo\": \"うめ蔵\",\n        \"umezu yoko\": \"梅津葉子\",\n        \"umi kurage\": \"海海月\",\n        \"umi tamako\": \"うみたまこ\",\n        \"umiazuma kakeru\": \"うみあずまかける\",\n        \"umibouzu\": \"うみぼうず\",\n        \"umichika\": \"うみちか\",\n        \"umihoshi minori\": \"海星みのり\",\n        \"umihotaru harumare\": \"海蛍はるまれ\",\n        \"umineko akira\": \"海猫明\",\n        \"umino haine\": \"海野灰猫\",\n        \"umino sachi\": \"海野幸\",\n        \"umino yayoi\": \"海野やよい\",\n        \"uminya\": \"うみにゃ\",\n        \"umipro\": \"umiプロ\",\n        \"umiyama misaki\": \"宇美山ミサキ\",\n        \"umiyume\": \"紅壱\",\n        \"umu rahi\": \"有無らひ\",\n        \"umuga yasusi\": \"U無我仁\",\n        \"un-moto\": \"云元\",\n        \"una\": \"うな\",\n        \"unacchi\": \"うなっち\",\n        \"unadare\": \"うなだれ\",\n        \"unamu\": \"うなむ\",\n        \"unazuki\": \"うなづき\",\n        \"unbalance\": \"UnBaLanCE\",\n        \"unepon\": \"うねぱん\",\n        \"uneta\": \"うねた\",\n        \"uni\": \"うに\",\n        \"uni-corn\": \"Uni-corn\",\n        \"unico kasumi\": \"ゆにこかすみ\",\n        \"unikura\": \"うに蔵\",\n        \"uniskie seagal\": \"ウニスキー・セガール\",\n        \"unknown\": \"春香\",\n        \"uno ryoku\": \"温野りょく\",\n        \"unohanat\": \"うのはな透\",\n        \"unomi\": \"うのみ\",\n        \"unoqlo\": \"UNOQLO\",\n        \"unoshima kanaka\": \"卯ノ島カナカ\",\n        \"unp\": \"UNp\",\n        \"untue\": \"ウンツエ\",\n        \"unwikkii\": \"うぃっきい\",\n        \"unyo\": \"うにょ\",\n        \"uona telepin\": \"うおなてれぴん\",\n        \"ura\": \"URA\",\n        \"ura dramatic\": \"裏ドラマチック\",\n        \"ura ichiko\": \"裏一子\",\n        \"uradoori nukemichi\": \"裏通抜道\",\n        \"uraharukon\": \"うらはるこん\",\n        \"urakami sosogi\": \"浦上そそぎ\",\n        \"urakawa opera\": \"浦河おぺら\",\n        \"urakuso\": \"うらくそ\",\n        \"urakusog\": \"有楽そG\",\n        \"uranfu\": \"うらんふ\",\n        \"urano mami\": \"浦乃まみ\",\n        \"urashima yuuhi\": \"浦島ゆうひ\",\n        \"uraura\": \"uraura\",\n        \"urayama\": \"うらやま\",\n        \"urec\": \"UREC\",\n        \"urekemo lala\": \"熟獣LaLa\",\n        \"ureshino megumi\": \"嬉野めぐみ\",\n        \"ureup\": \"うれあっぷ\",\n        \"uriboh\": \"ウリ坊\",\n        \"urin\": \"卯林\",\n        \"urivo\": \"ウリボぅ\",\n        \"uro\": \"ウロ | 雨露\",\n        \"uro-g\": \"Uro-G\",\n        \"urokozuki\": \"ウロコヅキ\",\n        \"uron\": \"うろん\",\n        \"urotsuki\": \"うろつき\",\n        \"urozuki akira\": \"宇路月\",\n        \"urushi\": \"ウルシ\",\n        \"urutsu\": \"ウルツ\",\n        \"uruu\": \"うるう\",\n        \"uryu sango\": \"瓜生珊瑚\",\n        \"us them\": \"あすぜむ\",\n        \"usa\": \"ウサ\",\n        \"usa usagi\": \"うさうさぎ\",\n        \"usagi ink\": \"うさぎいンく\",\n        \"usagi kei\": \"宇佐木恵\",\n        \"usaki\": \"うさき\",\n        \"usako\": \"ウサ小\",\n        \"usami rui\": \"ウサミルイ\",\n        \"usami suruga\": \"うさみするが\",\n        \"usano riko\": \"兎野りこ\",\n        \"usen\": \"ユウセン\",\n        \"ushi\": \"うし\",\n        \"ushi mochi\": \"うしもち\",\n        \"ushitora tatsumi\": \"丑寅たつみ\",\n        \"usi\": \"usi\",\n        \"usimanu\": \"うしまぬ\",\n        \"usoneko\": \"うそねこ\",\n        \"usso\": \"USSO\",\n        \"usuchi.\": \"うすちー。\",\n        \"usui\": \"薄\",\n        \"usuke bou\": \"うすけ坊\",\n        \"usuki\": \"薄稀\",\n        \"usurai\": \"うすら氷\",\n        \"usyuuri\": \"白ぅ～凪ぃ\",\n        \"uta\": \"唄\",\n        \"utage\": \"宴\",\n        \"utahara\": \"ウタハラ\",\n        \"utakata nagi\": \"UTAKATA凪\",\n        \"utako\": \"うた子\",\n        \"utana\": \"うたな\",\n        \"utano\": \"うた乃\",\n        \"utanone sion\": \"うたのねしおん\",\n        \"utase yui\": \"うたせゆい\",\n        \"utida k\": \"ウチダケイ\",\n        \"utsubo kazura\": \"うつぼかずら\",\n        \"utsugi tsuguha\": \"空木次葉\",\n        \"utsuki\": \"うー☆月\",\n        \"utsurogi angu\": \"空木あんぐ\",\n        \"uttorikun\": \"うっとりくん\",\n        \"utu\": \"utu\",\n        \"uwano sora\": \"ウワノソラ\",\n        \"uzukinoko\": \"うづきのこ\",\n        \"uzunoki tamaki\": \"渦の木環\",\n        \"uzura no tamago\": \"うずらのたまご\",\n        \"v-mag\": \"v-mag\",\n        \"vae\": \"ヴァエ\",\n        \"val\": \"val\",\n        \"valero\": \"ヴァレロ\",\n        \"valiant\": \"ばりあんと\",\n        \"vanadium\": \"Vanadium\",\n        \"vancho\": \"ばんちょー\",\n        \"vanilla\": \"vanilla\",\n        \"vanilla coke\": \"ヴァニラコーク\",\n        \"vanilla cream\": \"ヴァニラCREAM\",\n        \"vanity\": \"VANITY\",\n        \"varein\": \"Varein\",\n        \"velfro\": \"べるふろ\",\n        \"velzhe\": \"ベルゼ\",\n        \"ven\": \"ヴェン\",\n        \"venomlin\": \"venomlin\",\n        \"vice\": \"vice\",\n        \"vinny\": \"vinny\",\n        \"virth\": \"ばぁす\",\n        \"vivi\": \"びび\",\n        \"vogue\": \"vogue\",\n        \"volcano shigeru\": \"ボルケーノ滋\",\n        \"vt\": \"VT\",\n        \"vulcan nure\": \"ヴぁるかん濡\",\n        \"vyo\": \"べぃお\",\n        \"walzrj erorider\": \"W18\",\n        \"wabuki\": \"わぶき\",\n        \"wacoco waco\": \"輪子湖わこ\",\n        \"wada erika\": \"和田エリカ\",\n        \"wadachi kururu\": \"わだちくるる\",\n        \"wadanaka\": \"ワダナカ\",\n        \"wadatsumi\": \"わだつみ\",\n        \"waga na wa masamichi\": \"我が名は正道\",\n        \"wagahai hakushaku\": \"ワガハイ伯爵\",\n        \"waira\": \"猥裸\",\n        \"waka\": \"わか\",\n        \"wakachiko\": \"わかちこ\",\n        \"wakaki tamiki\": \"若木民喜\",\n        \"wakamesan\": \"ワカメさん\",\n        \"wakamiya teresa\": \"我宮てれさ\",\n        \"wakatsuki\": \"若月\",\n        \"wako\": \"わこ\",\n        \"wakura\": \"わくら\",\n        \"wakyo\": \"Wakyo\",\n        \"wamuko\": \"わむこ\",\n        \"wamusato haru\": \"和六里ハル\",\n        \"wan-pyo\": \"王彪\",\n        \"wanaata\": \"わなあた\",\n        \"wanao\": \"わなお\",\n        \"wanashiro giovanna\": \"和南城ジョアンナ\",\n        \"wanderer\": \"Wanderer\",\n        \"wanie digital\": \"ワニデジタル\",\n        \"wanriky\": \"腕力\",\n        \"wantaro\": \"ワン夕口\",\n        \"wap\": \"WaP\",\n        \"wapokichi\": \"わぽ吉\",\n        \"warabi yuuzou\": \"わらびゆうぞう\",\n        \"warashibe\": \"わらしべ\",\n        \"warashina mama\": \"わらしなママ\",\n        \"waroko\": \"ワロコ\",\n        \"warp mind\": \"warp_mind\",\n        \"wasa beef\": \"わさビーフ\",\n        \"wasabi yuuma\": \"わさび悠馬\",\n        \"wasamo\": \"わさも\",\n        \"wase rin\": \"早生リン\",\n        \"washima\": \"washima\",\n        \"washimi yu-ko\": \"わしみゆーこ\",\n        \"washimori\": \"鷲森\",\n        \"washizuka sho\": \"鷲塚翔\",\n        \"wasizuu\": \"わしず\",\n        \"wassyoi\": \"WASSYOI\",\n        \"wasu\": \"ワス\",\n        \"wata motsu\": \"綿もつ\",\n        \"wata-ruh\": \"わた・るぅー\",\n        \"wataichi meko\": \"綿市めこ\",\n        \"watanabe ignica\": \"渡辺イグニカ\",\n        \"watanabe yoshimasa\": \"わたなべよしまさ\",\n        \"watanabe yuuna\": \"渡辺ゆうな\",\n        \"watanuki kaname\": \"四月朔日要\",\n        \"watanuki lon\": \"綿貫ろん\",\n        \"watao\": \"わたお\",\n        \"watarai\": \"度会\",\n        \"wataru\": \"渉\",\n        \"watase rei\": \"渡瀬玲\",\n        \"watase sakana\": \"渡瀬さかな\",\n        \"wataya\": \"綿谷\",\n        \"watayoshi\": \"わたよし\",\n        \"watchie\": \"わっちー\",\n        \"watts\": \"Watts\",\n        \"wave\": \"WAVE\",\n        \"waves\": \"waves\",\n        \"wawa\": \"和々\",\n        \"wawon\": \"ワヲン\",\n        \"waysin\": \"Waysin\",\n        \"wazuka\": \"ワズカ\",\n        \"we53\": \"we53\",\n        \"wedge\": \"WEDGE\",\n        \"wemu\": \"ゑむ\",\n        \"white\": \"ほわいと\",\n        \"who are you\": \"風亜 ゆう\",\n        \"wing bird\": \"WING☆BIRD\",\n        \"winopz\": \"WinOPZ\",\n        \"winte\": \"winte\",\n        \"winter\": \"うぃんたぁ\",\n        \"wk.\": \"wk.\",\n        \"wkar\": \"WKAR\",\n        \"wm\": \"wm\",\n        \"wokasiya\": \"ヲカシヤ\",\n        \"woody\": \"WOODY\",\n        \"woof\": \"woof\",\n        \"workaholic\": \"若堀久\",\n        \"woza\": \"うぉざ\",\n        \"wtwinmk2nd\": \"WTwinMkⅡ2nd\",\n        \"www\": \"www\",\n        \"wx\": \"WX\",\n        \"x6suke\": \"X6suke\",\n        \"xain\": \"ザイン\",\n        \"xanadu\": \"Xanadu\",\n        \"xe\": \"Xe\",\n        \"xelvy\": \"xelvy\",\n        \"xeph\": \"Xeph\",\n        \"xi daisei\": \"クスィー大誠\",\n        \"xiaohua\": \"消化\",\n        \"xiaowoo\": \"小武\",\n        \"xiarobo\": \"しあろぼ\",\n        \"xii\": \"イニ\",\n        \"xiin\": \"xiin\",\n        \"xopc\": \"XOPC\",\n        \"xxzero\": \"xxzero\",\n        \"y\": \"Y\",\n        \"ya\": \"ヤッ\",\n        \"yabuki mao\": \"矢吹マオ\",\n        \"yabuno uguisu\": \"やぶのうぐいす\",\n        \"yaburebouki akuta\": \"破箒芥\",\n        \"yac\": \"YAC\",\n        \"yace\": \"YAce\",\n        \"yachan\": \"やちゃん\",\n        \"yachi\": \"ヤチ\",\n        \"yada masaka\": \"やだ！まさかっ\",\n        \"yadapoteto\": \"やだぽてと\",\n        \"yadokari genpachirou\": \"宿借り源八郎\",\n        \"yadoroku 7\": \"やどろく7\",\n        \"yae\": \"八重\",\n        \"yaeba\": \"やえば\",\n        \"yaebane\": \"八重羽根\",\n        \"yaeda nagumo\": \"八重田なぐも\",\n        \"yaegashi nan\": \"八重樫南\",\n        \"yaeto\": \"yaeto\",\n        \"yagami dai\": \"八神大\",\n        \"yagami sanjin\": \"矢上参仁\",\n        \"yagami shimei\": \"八神士明\",\n        \"yagezawa tetsuyuki\": \"やげざわてつゆき\",\n        \"yagi yuu\": \"山羊ゆう\",\n        \"yagumo kengou\": \"八雲剣豪\",\n        \"yahakin\": \"やはきん\",\n        \"yajiro masaru\": \"野城まさる\",\n        \"yajuu\": \"野獣\",\n        \"yakata soukei\": \"屋形宗慶\",\n        \"yaki ohagi\": \"やきおはぎ\",\n        \"yakisoba ohmori\": \"やきそばおおもり\",\n        \"yakisobapantarou\": \"ヤキソバぱん太郎\",\n        \"yakob\": \"やこぶ\",\n        \"yakuta tetsuya\": \"やくたてつや\",\n        \"yakuwa ken\": \"八鍬健\",\n        \"yakuzaishi\": \"薬剤師\",\n        \"yam\": \"yam\",\n        \"yama\": \"YAMA\",\n        \"pokoten\": \"ぽこてん\",\n        \"yamabatake\": \"山場岳\",\n        \"yamaboshi-kun\": \"やまぼしくん\",\n        \"yamabuki mook\": \"山吹ムック\",\n        \"yamaburo\": \"やまぶろ\",\n        \"yamachan\": \"やまちゃん\",\n        \"yamada\": \"ヤマダ\",\n        \"yamada ako\": \"山田あこ\",\n        \"yamada enako\": \"山田エナ子\",\n        \"yamada kou\": \"山田こう\",\n        \"yamada non\": \"やまだノン\",\n        \"yamada satoshi\": \"山田サトシ\",\n        \"yamada shiguma\": \"山田シグ魔\",\n        \"yamada shuutarou\": \"山田秋太郎\",\n        \"yamada takashi\": \"山田高嗣\",\n        \"yamada yuumi\": \"やまだゆうみ\",\n        \"yamadori\": \"山鳥\",\n        \"yamadori kodi\": \"山鳥こぢ\",\n        \"yamagiwa yuusuke\": \"山際悠介\",\n        \"yamaguchi\": \"ヤマグチ\",\n        \"yamaguchi nao\": \"やまぐち なお\",\n        \"yamaguchi shinji\": \"やまぐちしんじ\",\n        \"yamaguchi shunichi\": \"山口俊一\",\n        \"yamaguchi ugou\": \"やまぐち羽轟\",\n        \"yamai\": \"山井\",\n        \"yamai sakatarou\": \"山井坂太郎 or 山井逆太郎\",\n        \"yamaimo torotoro\": \"山いもとろとろ\",\n        \"yamaishi\": \"山石\",\n        \"yamaishi joe\": \"山石ジョウ\",\n        \"yamaiso\": \"やまいそ\",\n        \"yamakawa yuu\": \"山河勇\",\n        \"yamako\": \"やまこ\",\n        \"yamamoh\": \"やまもー\",\n        \"yamamoto atsuji\": \"山本貴嗣\",\n        \"yamamoto canponi\": \"やまもと かんぽに\",\n        \"yamamoto johanne\": \"山本夜羽音\",\n        \"yamamoto kaori\": \"山本佳織\",\n        \"yamamoto ryuusuke\": \"はせ☆裕\",\n        \"yamamoto tomomitsu\": \"山本ともみつ\",\n        \"yamamura natsuru\": \"山村なつる\",\n        \"yamane masahiro\": \"やまねまさひろ\",\n        \"yamaneko suzume\": \"山猫スズメ\",\n        \"yamano\": \"やまの\",\n        \"yamano konzaburo\": \"山野紺三郎\",\n        \"yamaori\": \"yamaori\",\n        \"yamashita masahiro\": \"山下正浩\",\n        \"yamashita woory\": \"山下うり\",\n        \"yamato\": \"YAMATO\",\n        \"yamato akami\": \"大和あかみ\",\n        \"yamato masaomi\": \"やまと将臣\",\n        \"yamato nadeshiko\": \"大和なでしこ\",\n        \"yamato nyaon\": \"ヤマトにゃ音\",\n        \"yamato osamushi\": \"大和乃 史\",\n        \"yamato techno\": \"大和テクノ\",\n        \"yamatodanuki\": \"大和狸\",\n        \"yamaura shou\": \"山浦章\",\n        \"yamazaki show\": \"夜魔咲翔\",\n        \"yameru doushi\": \"病める同志\",\n        \"yameta takashi\": \"止田卓史\",\n        \"yami no naka\": \"闇の中\",\n        \"yamikage missa\": \"闇影みさ\",\n        \"yaminoki\": \"やみのき\",\n        \"yamisupi\": \"やみすぴ\",\n        \"yamizawa\": \"ヤミザワ\",\n        \"yamizora hikari\": \"闇空光\",\n        \"yamome\": \"ヤモメ\",\n        \"yamoto\": \"yamoto\",\n        \"yan\": \"ヤン\",\n        \"yana\": \"也な\",\n        \"yanagi\": \"柳\",\n        \"yanagi hirohiko\": \"柳ひろひこ\",\n        \"yanagida fumita\": \"柳田史太\",\n        \"yanagie\": \"やなぎー\",\n        \"yanagise\": \"やなぎせ\",\n        \"yanase kotatsu\": \"柳瀬こたつ\",\n        \"yanasegawabeya\": \"柳瀬川部屋\",\n        \"yaneura meteor impact\": \"屋根裏メテオインパクト\",\n        \"yang\": \"ヤン\",\n        \"yankopi\": \"やんこぴ\",\n        \"yano\": \"Yano\",\n        \"yano rahna\": \"夜乃らあな\",\n        \"yano takumi\": \"香川友信\",\n        \"yano toshinori\": \"矢野トシノリ\",\n        \"yanokake\": \"やのかけ\",\n        \"yanonoshin\": \"やののしん\",\n        \"yao.\": \"YaO.\",\n        \"yaomai\": \"やおまい\",\n        \"yappen\": \"ヤッペン\",\n        \"yappy\": \"yappy\",\n        \"yarii shimeta\": \"枪衣七五三太\",\n        \"yas\": \"yas\",\n        \"yasaka\": \"弥栄\",\n        \"yasaka minato\": \"八坂ミナト\",\n        \"yasha\": \"yasha\",\n        \"yashai\": \"やしゃい\",\n        \"yashichii\": \"やしちぃ\",\n        \"yashiki third\": \"屋敷さーど\",\n        \"yashima koto\": \"屋嶋コト\",\n        \"yashio taiga\": \"八潮タイガー\",\n        \"yashiro\": \"社\",\n        \"yashiro ryo\": \"八代涼\",\n        \"yason shain\": \"ヤソン社員\",\n        \"yass\": \"yass\",\n        \"yasu rintarou\": \"安麟太郎\",\n        \"yasuaki\": \"ヤスアキ\",\n        \"yasuda\": \"YASUDA\",\n        \"yasuda katsunori\": \"安田かつのり\",\n        \"yasuhara tsukasa\": \"安原司\",\n        \"yasumon\": \"yasumon\",\n        \"yasumori zen\": \"安森然\",\n        \"yasunaga kouichirou\": \"安永航一郎\",\n        \"yasunao\": \"やすなお\",\n        \"yasuto\": \"泰斗\",\n        \"yat\": \"yat\",\n        \"yata\": \"yata\",\n        \"yataneko\": \"ヤタネコ\",\n        \"yatano\": \"やたの\",\n        \"yatengetu\": \"夜天月\",\n        \"yato hikaru\": \"八仁ヒカル\",\n        \"yatsuashi matomo\": \"ヤツアシマトモ\",\n        \"yatsufusa hajime\": \"八房一\",\n        \"yatsugami tenchou\": \"八ツ神店長\",\n        \"yatsuka yuhata\": \"夜束ユハタ\",\n        \"yatsushima tetsuya\": \"八嶋テツヤ\",\n        \"yatsuzaki\": \"八咲\",\n        \"yatuzaki\": \"やつざき\",\n        \"yautsuro\": \"ヤウツロ\",\n        \"yawaraka concrete\": \"やわらかコンクリート\",\n        \"yawaraka midori\": \"やわらかみどり\",\n        \"yayo\": \"夜与\",\n        \"yayoi kotoyuki\": \"弥生ことゆき\",\n        \"yayoichi\": \"夜よいち\",\n        \"yazawa oke\": \"矢澤おけ\",\n        \"yazawa owl\": \"Yazawa Owl\",\n        \"yazuki aoi\": \"野月あおい\",\n        \"yellowseeds\": \"YellowSeeds\",\n        \"yequo\": \"イエクオ\",\n        \"yf studio\": \"YF Studio\",\n        \"yk\": \"yk\",\n        \"yo-jin\": \"YO-JIN\",\n        \"yo-suke\": \"yo-suke\",\n        \"yo2\": \"YO2\",\n        \"yoban\": \"よばん\",\n        \"yocchi\": \"よっち\",\n        \"yodare\": \"よだれ\",\n        \"yodori\": \"よどり\",\n        \"yoekosukii\": \"ヨエコスキー\",\n        \"yofukashi\": \"夜ふかし\",\n        \"yogiri neo\": \"夜霧音緒\",\n        \"yohi\": \"よひ\",\n        \"yohinori\": \"ヨヒノリ\",\n        \"yoichi\": \"よいち\",\n        \"yoihoshi hikari\": \"宵星ヒカリ\",\n        \"yoikuma\": \"酔\",\n        \"yoki\": \"よーき\",\n        \"yokko\": \"よっこ～\",\n        \"yokkyun\": \"よっきゅん\",\n        \"yoko\": \"yoko\",\n        \"yoko juusuke\": \"横十輔\",\n        \"yoko mawatari\": \"馬渡ようこ\",\n        \"yokohachi\": \"よこはち\",\n        \"yokosima\": \"横縞\",\n        \"yokota mamoru\": \"横田守\",\n        \"yokoyama kouji\": \"横山コウジ\",\n        \"yokoyama michiru\": \"横山ミチル\",\n        \"yokoyama naoki\": \"よこやまなおき\",\n        \"yokoyama negi\": \"横山葱\",\n        \"yoku\": \"ヨク\",\n        \"yokuran\": \"翼卵\",\n        \"yomiclone\": \"yomiclone\",\n        \"yomoda yomo\": \"よもだよも\",\n        \"yomogi\": \"よもぎ\",\n        \"yomogi ringo\": \"よもぎりんご\",\n        \"yomogiya keita\": \"よもぎや敬太\",\n        \"yomosaka\": \"よもさか\",\n        \"yomotsuka tsukasa\": \"四方塚ツカサ\",\n        \"yomoyama akira\": \"四方山哲\",\n        \"yonaga\": \"よなが\",\n        \"yonbangai\": \"4番街\",\n        \"yone\": \"ヨネ\",\n        \"yonekura\": \"米蔵\",\n        \"yonekura hisaki\": \"米倉久記\",\n        \"yonekura kihiro\": \"米倉きひろ\",\n        \"yonemaru\": \"よねまる\",\n        \"yonezou\": \"よねぞう\",\n        \"yonige-ya no kyou\": \"夜逃げ屋の恭\",\n        \"yonu\": \"よる\",\n        \"yoo oona\": \"よーな\",\n        \"yorihito\": \"頼一\",\n        \"yoriko\": \"よりこ\",\n        \"yorisuke\": \"よりすけ\",\n        \"yoriu mushi\": \"寄生虫\",\n        \"yoroshiku tarou\": \"夜露死苦汰楼\",\n        \"yorozu\": \"よろづ\",\n        \"yoru yoru\": \"ヨルヨル\",\n        \"yorutori\": \"よるとり\",\n        \"yosage yoshikazu\": \"よさげよしかず\",\n        \"yosai\": \"葉才\",\n        \"yoshi\": \"yoshi\",\n        \"yoshi keto\": \"よしけ～と\",\n        \"yoshi-puu\": \"よしぷー\",\n        \"yoshida gorou\": \"吉田悟郎\",\n        \"yoshida goten\": \"吉田御殿\",\n        \"yoshida hajime\": \"吉田創\",\n        \"yoshida masahiko\": \"吉田正彦\",\n        \"yoshida nami\": \"吉田浪\",\n        \"yoshida negi\": \"よしだねぎ\",\n        \"yoshida yoshimi\": \"よしだよしみ\",\n        \"yoshiga fuumi\": \"吉賀ふうみ\",\n        \"yoshihara maito\": \"芳原舞人\",\n        \"kasaki yoshihiko\": \"加崎善彦\",\n        \"yoshii toshinari\": \"由衣利成\",\n        \"yoshiizumi hana\": \"よしいずみはな\",\n        \"yoshijima ataru\": \"よしじまあたる\",\n        \"yoshiki\": \"YOSHIKI\",\n        \"yoshimiya chitose\": \"義宮ちとせ\",\n        \"yoshimoto ayumu\": \"芳本あゆむ\",\n        \"yoshimune\": \"よしむね\",\n        \"yoshimura\": \"吉村\",\n        \"yoshimura kentaro\": \"よしむらけんたろー\",\n        \"yoshinaga eikichi\": \"吉永えいきち\",\n        \"yoshinari ayaka\": \"吉成綾加\",\n        \"yoshino kasa\": \"よしのかさ\",\n        \"yoshino sora\": \"吉乃そら\",\n        \"yoshino.\": \"よしの。\",\n        \"yoshiragi\": \"ヨシラギ\",\n        \"yoshiron\": \"よしろん\",\n        \"yoshiten\": \"よし天\",\n        \"yoshitora\": \"YOSHITORA\",\n        \"momomo momo\": \"桃萌 百\",\n        \"yoshiwo\": \"よしを\",\n        \"yoshiyuki\": \"ヨシユキ\",\n        \"yoshizane akihiro\": \"好実昭博\",\n        \"yoshizawa kei\": \"吉沢蛍\",\n        \"yoshizawa mayu\": \"よしざわ真由\",\n        \"yoshizawa megane\": \"吉沢メガネ\",\n        \"yoshizawa miyabi\": \"吉沢雅\",\n        \"yoshizawa tomoaki\": \"吉澤友章\",\n        \"yoshizawa vanilla\": \"芳澤ばにら\",\n        \"yositama\": \"英戦\",\n        \"yosomono\": \"よそ者\",\n        \"yosuke\": \"ヨースケ\",\n        \"yosyo-\": \"ヨショー\",\n        \"yotaka\": \"yotaka\",\n        \"yotarou\": \"夜太弄\",\n        \"yotsuba yuiko\": \"四葉ゆいこ\",\n        \"yotsura\": \"寄弦\",\n        \"yotsuya mika\": \"よつやみか\",\n        \"yottan\": \"ヨッタン\",\n        \"you2\": \"YOU2\",\n        \"you3.\": \"you3｡\",\n        \"youdou\": \"謡堂\",\n        \"youichirou w\": \"よーいちろーW\",\n        \"youjomodoki\": \"ヨウジョモドキ\",\n        \"youka\": \"よーか\",\n        \"youkan\": \"ようかん\",\n        \"youma kachie\": \"夜馬勝絵\",\n        \"youtou sadamitsu\": \"妖刀定光\",\n        \"yowashi\": \"よわし\",\n        \"yoyo\": \"YoYo\",\n        \"yoyoyoyou\": \"よよよよう\",\n        \"yozi\": \"YoZi\",\n        \"yozo\": \"yozo\",\n        \"yts takana\": \"YTS 鷹那\",\n        \"yu\": \"YU\",\n        \"yu-ri\": \"YU-RI\",\n        \"yu-ya\": \"熊耶\",\n        \"yua\": \"夕海\",\n        \"yuam\": \"ゆあま\",\n        \"yucchris\": \"ゆっ栗栖\",\n        \"yuchi\": \"ゆち\",\n        \"yuchitose\": \"ゆうちとせ\",\n        \"yuda-chan\": \"湯田ちゃん\",\n        \"yude pea\": \"茹でピー\",\n        \"yuduki kei\": \"雪月佳\",\n        \"yuduki kisa\": \"柚希妃紗\",\n        \"yuge\": \"ゆげ\",\n        \"yui-7\": \"YUI_7\",\n        \"yuika\": \"ゆいか\",\n        \"yuima yutaka\": \"ゆいまゆたか\",\n        \"yuisaki takumi\": \"結崎拓海\",\n        \"yuitsu\": \"ゆいつ\",\n        \"yukagen tenyu\": \"湯加減てんゆ～\",\n        \"yukako\": \"ゆかこ\",\n        \"yukaran nosuke\": \"ゆからんのすけ\",\n        \"yukatama\": \"ゆかたま\",\n        \"yukataro\": \"ゆかたろ\",\n        \"yukawa mario\": \"湯川まりお\",\n        \"yuki mau\": \"有希まう\",\n        \"yuki seriya\": \"yuki seriya\",\n        \"yuki tomoshi\": \"幸灯\",\n        \"yukia\": \"ゆきあ\",\n        \"yukian\": \"Yukian\",\n        \"yukibana\": \"雪華\",\n        \"yukichi-san\": \"ゆきちさん\",\n        \"yukiguni eringi\": \"雪国エリンギ\",\n        \"yukiharu\": \"にゃわて荘\",\n        \"yukihime haruka\": \"雪姫はるか\",\n        \"yukihoshi kokoro\": \"雪星こころ\",\n        \"yukimachi tounosuke\": \"雪町灯之助\",\n        \"yukimai\": \"ゆきまい\",\n        \"yukimaro yukky\": \"ゆきまろゆっきー\",\n        \"yukimaru.\": \"雪丸。\",\n        \"yukimi\": \"由木彌\",\n        \"yukimi iris\": \"雪味あいりす\",\n        \"yukimino yukio\": \"雪見野ユキオ\",\n        \"yukimitsu\": \"ゆきみつ\",\n        \"yukimura hajime\": \"雪村一\",\n        \"yukimura tsugumi\": \"ゆきむらつぐみ\",\n        \"yukina\": \"ゆきな\",\n        \"yukina funa\": \"幸奈ふな\",\n        \"yukino\": \"ゆきの\",\n        \"yukino yukikaze\": \"ゆきのゆきかぜ\",\n        \"yukiri takashi\": \"結桐たかし\",\n        \"yukishiro yima\": \"雪白イマ\",\n        \"yukisiro arte\": \"雪代あるて\",\n        \"yukitaka\": \"柚木貴\",\n        \"yukito\": \"雪人\",\n        \"yukitsuka tsukasa\": \"ゆきつかつかさ\",\n        \"yukiusagi\": \"ゆきうさぎ\",\n        \"yukiwo\": \"ユキヲ\",\n        \"yukiya\": \"雪哉\",\n        \"yukiyanagi yui\": \"雪柳唯依\",\n        \"yukizuki chikuba\": \"雪月竹馬\",\n        \"yukke-ani\": \"ゆっけ兄\",\n        \"yukke.\": \"ゆっけ。\",\n        \"yukki\": \"ゆっき\",\n        \"yukko\": \"ゆっこ\",\n        \"yukkyun\": \"ユッキュン\",\n        \"yuku\": \"ゆく\",\n        \"yukyu ponzu\": \"悠久ポン酢\",\n        \"yuma\": \"ゆーま\",\n        \"yuma ryouhei\": \"ゆま亮平\",\n        \"yumaman\": \"ゆままん\",\n        \"yumbo anahoru\": \"ゆんぼあなほる\",\n        \"yume\": \"夢\",\n        \"yumegi\": \"ユメギ\",\n        \"yumegi atsuki\": \"ゆめぎあつき\",\n        \"yumemiya subaru\": \"夢宮すばる\",\n        \"yumeno shiya\": \"夢ノ紫也\",\n        \"yumesato makura\": \"夢里まくら\",\n        \"yumeutsutsu hideki\": \"夢現ひでき\",\n        \"yumi ichirou\": \"友美イチロウ\",\n        \"yumiya\": \"ゆみや\",\n        \"yuna\": \"由那\",\n        \"yunagi kahoru\": \"夕凪薫\",\n        \"yuniba\": \"ゆにば\",\n        \"yunioshi\": \"ゆにおし\",\n        \"yuno shigure\": \"雪乃時雨\",\n        \"yunodon\": \"ゆのどん\",\n        \"yunoka gashuu\": \"ゆのか雅愁\",\n        \"yunokawa yosomi\": \"温泉川よそ見\",\n        \"yunoki yu\": \"柚木ユウ\",\n        \"yunopanchako\": \"ゆのぱんちゃこ\",\n        \"yunosuke\": \"ゆのすけ\",\n        \"yurarin\": \"yurarin\",\n        \"yurei\": \"ゆーれー\",\n        \"yuri kamome\": \"友梨かもめ\",\n        \"yuri tamashii\": \"百合魂\",\n        \"yuri tohru\": \"百合融\",\n        \"yuriaki\": \"ユリアキ\",\n        \"yurige\": \"ゆりげ\",\n        \"yurihara aki\": \"百合原明\",\n        \"yurikawa\": \"ゆりかわ\",\n        \"yuririn\": \"ゆりりん\",\n        \"yuriwhale\": \"Yuriwhale\",\n        \"yusa ikuyoshi\": \"遊佐育美\",\n        \"yusui\": \"ゆすい\",\n        \"yusura\": \"山桜桃\",\n        \"yutakame\": \"ゆたかめ\",\n        \"yuto\": \"yuto\",\n        \"yutori-nu\": \"ゆとりーぬ\",\n        \"yutsuki tsuzuri\": \"愉月綴\",\n        \"yuu\": \"由宇\",\n        \"yuu sagi\": \"ユウサギ\",\n        \"yuuga\": \"遊賀\",\n        \"yuuga momiji\": \"夕雅紅葉\",\n        \"yuuge\": \"夕餉\",\n        \"yuugo\": \"ユーゴ\",\n        \"ariuo\": \"有魚\",\n        \"yuuhi\": \"雄飛\",\n        \"yuuhi alpha\": \"悠飛あるふぁ\",\n        \"yuuichi\": \"ゆういち\",\n        \"yuuk\": \"yuuk\",\n        \"yuuka rei\": \"優華麗\",\n        \"yuuki alice\": \"夕姫ありす\",\n        \"yuuki haruka\": \"結城遥\",\n        \"yuuki hb\": \"ユウキHB\",\n        \"yuuki hide\": \"悠希ヒデ\",\n        \"yuuki mia\": \"結城みあ\",\n        \"yuuki mitsuru\": \"結城みつる\",\n        \"yuuki miya\": \"結城美夜\",\n        \"yuuki miyabi\": \"結城みやび\",\n        \"yuuki noco\": \"悠樹ノコ\",\n        \"yuuki ray\": \"ユウキレイ\",\n        \"yuuki ryo\": \"結城稜\",\n        \"yuuki satoru\": \"結城さとる\",\n        \"yuuki tomoka\": \"ゆうきともか\",\n        \"yuuki tsumugi\": \"ゆうきつむぎ\",\n        \"yuuki yu\": \"結城結\",\n        \"yuumazume\": \"ゆうまずめ\",\n        \"yuumi takako\": \"夕海たかこ\",\n        \"yuumyago\": \"ゆうみゃご\",\n        \"yuunagi show\": \"夕凪ショウ\",\n        \"yuuno\": \"ゆうの\",\n        \"yuunyan\": \"ゆうにゃん\",\n        \"yuuri\": \"遊離\",\n        \"yuurin\": \"佑りん\",\n        \"yuusa riki\": \"ゆうさ理姫\",\n        \"yuusei iori\": \"遊星庵\",\n        \"yuusuke asazume\": \"麻爪佑助\",\n        \"yuuta\": \"湯唄\",\n        \"yuuyake roji\": \"夕焼け路地\",\n        \"yuya\": \"悠夜\",\n        \"yuyu\": \"ゆゆ\",\n        \"yuzaki\": \"ユウザキ\",\n        \"yuzco\": \"ゆずこ\",\n        \"yuzn\": \"ゆずん\",\n        \"yuzu ramune\": \"柚子ラムネ\",\n        \"yuzu syrup\": \"ゆずしろっぷ\",\n        \"yuzucky\": \"ゆずっきー\",\n        \"yuzuka\": \"柚夏\",\n        \"yuzuki makii\": \"柚木まき\",\n        \"yuzuki rin\": \"柚木鈴\",\n        \"yuzuki ruri\": \"柚木ルリ\",\n        \"yuzuki suzu\": \"柚木鈴\",\n        \"yuzuki yu\": \"柚木ゆう\",\n        \"yuzuki yua\": \"柚月ゆあ\",\n        \"yuzuki yuno\": \"柚木ゆの\",\n        \"yuzuko syou\": \"ゆずこしょう\",\n        \"yuzupon\": \"ゆずぽん\",\n        \"yuzuriha\": \"杠\",\n        \"yuzushiko\": \"ゆずしこ\",\n        \"yuzuyoukan\": \"ゆずようかん\",\n        \"z-s-e\": \"z-s-e\",\n        \"z26\": \"Z26\",\n        \"zacro\": \"柘榴\",\n        \"zakiko\": \"ザキコ\",\n        \"zakkunpoppu\": \"雑君保プ\",\n        \"zakotv\": \"ZakoTV\",\n        \"zakuro\": \"ざくろ\",\n        \"zama shouji\": \"座間翔二\",\n        \"zan\": \"ZAN\",\n        \"zaneri\": \"ザネリ\",\n        \"zangi\": \"ざんぎ\",\n        \"zarasi\": \"ざらし\",\n        \"zariya ranmaru\": \"座裏屋蘭丸\",\n        \"zasan\": \"ざさん\",\n        \"zasha\": \"ザシャ\",\n        \"zashiki ushi\": \"座敷牛\",\n        \"zassyu\": \"ザッシュ\",\n        \"zawa\": \"ざわ\",\n        \"zawameki\": \"ざわめき\",\n        \"zawar\": \"ZawarC\",\n        \"zax\": \"Zax\",\n        \"zekkyosyu\": \"絶巨主\",\n        \"zekkyou\": \"絶叫\",\n        \"zeku\": \"ゼク\",\n        \"zen\": \"ZEN\",\n        \"zen.\": \"ぜん。\",\n        \"zen33n\": \"Zen33n\",\n        \"zen9\": \"zen9\",\n        \"zengo\": \"前後\",\n        \"zenki\": \"ぜんき\",\n        \"zenra\": \"全裸\",\n        \"zenra yashiki\": \"全裸屋敷\",\n        \"zentam\": \"ゼンタム\",\n        \"zephi\": \"ゼフィ\",\n        \"zephid\": \"ゼフィド\",\n        \"raianonzika\": \"RaianOnzika\",\n        \"zero\": \"zero\",\n        \"zero punch\": \"ぜろぽんち\",\n        \"zero tanuki\": \"零狸\",\n        \"zessekaishonen\": \"絶世界少年\",\n        \"zest\": \"ゼスト\",\n        \"zettaizetumei\": \"絶対絶命\",\n        \"zetz\": \"ぜっつ\",\n        \"zima\": \"Zima\",\n        \"zin\": \"ZiN\",\n        \"zinan\": \"ジナン\",\n        \"zinno\": \"zinno\",\n        \"zion\": \"ZION\",\n        \"ziz\": \"ziz\",\n        \"zo\": \"ぞ\",\n        \"zol\": \"ZOL\",\n        \"zono\": \"ぞの\",\n        \"zonta\": \"ぞん太\",\n        \"zorane\": \"ぞらね\",\n        \"zourion\": \"ゾウリオン\",\n        \"zukky\": \"Zukky\",\n        \"zummy\": \"Zummy\",\n        \"zumo8\": \"ずも8\",\n        \"zun nyannyan\": \"ズンにゃんにゃん\",\n        \"zundamochi\": \"ずんだ餅\",\n        \"zundarinda\": \"ズンダリンダ\",\n        \"zunta\": \"Zunta\",\n        \"zuru\": \"ズル\",\n        \"zutta\": \"Zutta\",\n        \"zuzu\": \"ズズ\",\n        \"zyaroh akira\": \"邪琅明\",\n        \"zyougen\": \"上弦\",\n        \"zyulokuya\": \"十録屋\",\n        \"zzinzinz\": \"なめジョン\",\n        \"zzz\": \"zzz\",\n        \"1up\": \"1UP\",\n        \"6zo\": \"6zo\",\n        \"anzheli\": \"Anzheli\",\n        \"cfr\": \"CFR\",\n        \"inagita\": \"INAGITA\",\n        \"inside\": \"Inside\",\n        \"kashiko akira\": \"かしこ村\",\n        \"kururururu\": \"くるるるる\",\n        \"murayamamon\": \"村山門\",\n        \"nanohana800\": \"なのはな800\",\n        \"nns\": \"nnS\",\n        \"norainu\": \"野良犬\",\n        \"noysca\": \"noysca\",\n        \"styx\": \"STYX\",\n        \"takamiya hairi\": \"たかみやはいり\",\n        \"tinmeshi\": \"珍飯\",\n        \"utatane\": \"うたたね\",\n        \"tomodachi\": \"Tomodachi\",\n        \"puracotte\": \"Puracotte＊ぷらこ\",\n        \"tsuyuhisa fumi\": \"露久ふみ\",\n        \"hinoshita akame\": \"日之下あかめ\",\n        \"ryokuchamichi\": \"緑茶みち\",\n        \"mamimi\": \"Mamimi\",\n        \"mujin bensin\": \"無人\",\n        \"jima\": \"じま\",\n        \"miyama tsubakime\": \"美山椿芽\",\n        \"haku89\": \"haku89\",\n        \"shengtian\": \"升天\",\n        \"tezuka osamu\": \"手冢治虫\",\n        \"oyuyu\": \"おゆゆ\",\n        \"mo oku\": \"MO:OKU\",\n        \"rounds chen\": \"RoundsChen\",\n        \"tsubame\": \"つばめ\",\n        \"ushinomiya\": \"うしのみや\",\n        \"yoikorogashi\": \"よいころがし\",\n        \"natsu jam\": \"夏ジャム\",\n        \"aosawa yuki\": \"青沢由紀\",\n        \"inui nuinu\": \"犬居ぬいぬ\",\n        \"2no.\": \"2no.\",\n        \"h.carrrrrrot\": \"カロロット\",\n        \"toriattogununu\": \"とりあっとぐぬぬ\",\n        \"harrishero\": \"ハリスヒロ\",\n        \"potatorinrin\": \"孟達\",\n        \"hotter daimon\": \"掘多大門\",\n        \"cirilla\": \"CIRILLA\",\n        \"tsunakama\": \"ツナかま\",\n        \"yoshida ninn\": \"吉田にん\",\n        \"yukimura yukio\": \"雪村雪緒\",\n        \"akiyoshi amelie\": \"秋芳あめり\",\n        \"shikibe tsuko\": \"色辺つこ\",\n        \"yusha-m\": \"Yusha-M\",\n        \"kuroboshi kouhaku\": \"黑星红白（饭冢武史）\",\n        \"aji taro\": \"AJ/鯵太郎\",\n        \"aizen pochi\": \"愛染ぽち\",\n        \"nagatsuki hatsuka\": \"長月はつか\",\n        \"kotobuki haruki\": \"琴吹はるき\",\n        \"kou kou ax\": \"口口AX\",\n        \"madoka tsukumo\": \"円つくも\",\n        \"takeda hinata\": \"武田日向\",\n        \"tsuyuri inu\": \"栗花落淫雨\",\n        \"minagi koh\": \"海凪コウ\",\n        \"mumumu seijin\": \"むむむ星人\",\n        \"redchicken\": \"붉은닭\",\n        \"shirai bebe\": \"白井べべ\",\n        \"nekosaki aoi\": \"猫崎葵\",\n        \"kakuchou no okina\": \"拡張の翁\",\n        \"shiawase na choshoku.\": \"幸せな朝食。\",\n        \"cenangam\": \"CeNanGam\",\n        \"tabasco pasta\": \"タバスコパスタ\",\n        \"gin eiji\": \"銀エイジ\",\n        \"yan-baru\": \"やんBARU\",\n        \"hanasaka houcha\": \"花咲方茶\",\n        \"fallen-leaves\": \"Fallen落叶\",\n        \"hanayama\": \"はなやま\",\n        \"kusoniku yokichi\": \"糞肉与吉\",\n        \"hatoba akane\": \"波止場茜\",\n        \"hachi no hachihachi\": \"はちの八八\",\n        \"rhasta\": \"牛乳重工\",\n        \"melailai\": \"么赖赖\",\n        \"da mao banlangen\": \"大猫板蓝根\",\n        \"touwa nikuman\": \"空72色\",\n        \"yushi quetzalli\": \"羽蛇Quetzalli\",\n        \"fukuro daizi\": \"Fukuro袋子\",\n        \"tsukumo nikyu\": \"九十九弐級\",\n        \"uten ameka\": \"雨天あめか\",\n        \"sakuraba rokusuke\": \"樱庭六辅\",\n        \"aoyama akira\": \"苍山哲\",\n        \"kamitake\": \"鱗物\",\n        \"k-ko\": \"K子\",\n        \"sisyamo 2 percent\": \"sisyamo2%\",\n        \"metacora\": \"めたこら\",\n        \"kangoku meika\": \"監獄銘菓\",\n        \"souseki\": \"層積\",\n        \"manno\": \"まんの\",\n        \"tamada heijun\": \"玉田平准\",\n        \"nagai go\": \"永井豪\",\n        \"takamaru\": \"鷹丸\",\n        \"nidaime\": \"二代目\",\n        \"minato ojitan\": \"湊おじたん\",\n        \"orukoa\": \"orukoa\",\n        \"karakuri musha\": \"からくり武者\",\n        \"neisan\": \"ねいさん\",\n        \"takekawa sin\": \"武川慎\",\n        \"galbany denryuu\": \"ガルバニー電流\",\n        \"utsunomiya ukatsu\": \"郁之宫迂阔\",\n        \"suito\": \"すいと\",\n        \"kura\": \"倉\",\n        \"ayasaka\": \"綾坂\",\n        \"akusema\": \"あくせま\",\n        \"takumichi\": \"Taku道\",\n        \"ramanda\": \"ラマンダ\",\n        \"suimi\": \"水深\",\n        \"totoyama keiji\": \"魚山ケイジ\",\n        \"konery\": \"ｺﾈﾘｨ＠(ヽ'ω`)\",\n        \"cocomachi\": \"ここまち\",\n        \"mizuse kiseki\": \"星の紅茶\",\n        \"momomo gasshuukoku\": \"ももも合衆国\",\n        \"nameless peasant\": \"皮三豆\",\n        \"minamoto kosada\": \"源康定\",\n        \"mukatsuku\": \"ム菓ツク（むか）\",\n        \"akiamare\": \"あきあまれ\",\n        \"sakuragi yomi\": \"樱木黄泉\",\n        \"suichuu hanabi\": \"水中花火\",\n        \"enmanuelart\": \"enmanuelart\",\n        \"shirosaba\": \"白サバ\",\n        \"cslucaris\": \"CSLucaris\",\n        \"4riasensei\": \"フォリア\",\n        \"matsuda\": \"ユウスケ\",\n        \"rasen kyofu kaku\": \"ラセン恐怖閣\",\n        \"damenahito\": \"だめなひと\",\n        \"satou teruhito\": \"佐藤辉人\",\n        \"yamada tahichi\": \"山田タヒチ\",\n        \"nijiiro tyahantei\": \"虹色チャーハン亭\",\n        \"ikemura hiroichi\": \"池村ヒロイチ\",\n        \"kizaki masuta\": \"季崎ますた\",\n        \"komera\": \"こめら\",\n        \"kurotane\": \"くろたね\",\n        \"toushiki yubune\": \"橙織ゆぶね\",\n        \"shimada panda\": \"しま田ぱんだ\",\n        \"kakei kei\": \"花兄けい\",\n        \"kudou hisashi\": \"くどうひさし\",\n        \"yuuzuki hijiri\": \"夕月ひじり\",\n        \"koumashiro\": \"こうましろ\",\n        \"denpouya chamaru\": \"伝法谷ちゃまる\",\n        \"miazi\": \"miazi\",\n        \"namagome negi\": \"瑠川ねぎ\",\n        \"ebi fry teishoku\": \"ぐえー/エビフライ定食\",\n        \"shishido sakura\": \"宍戸沙玖来\",\n        \"pontaro\": \"ぽんたろ\",\n        \"ikawa waki\": \"わき\",\n        \"aizawa marimo\": \"愛沢 まりも\",\n        \"moyamoya\": \"モヤモヤ\",\n        \"okabe gyoza\": \"尾壁餃子\",\n        \"shizuhime\": \"静姬\",\n        \"kagawa yusaku\": \"香川悠作\",\n        \"daito\": \"daito\",\n        \"nakamura asumiko\": \"中村明日美子\",\n        \"muto\": \"醤油エビ\",\n        \"dokuneko noil\": \"毒猫ノイル\",\n        \"urabe katsuto\": \"浦辺克斗\",\n        \"minakami rin\": \"ミナカミ\",\n        \"koyomania\": \"Koyomania\",\n        \"magowasabi\": \"magowasabi\",\n        \"kurigami\": \"kurigamiin\",\n        \"renetan\": \"レネタン\",\n        \"hi\": \"Hi\",\n        \"kitsune choukan\": \"きつね長官\",\n        \"kagura kurumi\": \"神楽くるみ\",\n        \"yaemugura\": \"八重葎\",\n        \"pottsness\": \"pottsness\",\n        \"kimyou chourui\": \"奇妙鸟类\",\n        \"kawakami minoru\": \"川上稔\",\n        \"omulet tomato\": \"オムレットマト\",\n        \"hyouta\": \"俵太\",\n        \"asaomi shimura\": \"アサオミ志群\",\n        \"ooban yaki\": \"大伴ヤキ\",\n        \"yoshida killy\": \"吉田Killy\",\n        \"tou\": \"トウ\",\n        \"natsusaka\": \"夏坂\",\n        \"tempura dozaemon\": \"天妇罗土左卫门\",\n        \"furatsu\": \"ふらつ\",\n        \"matsui yasutsugu\": \"松井康治（郁那和なにろ）\",\n        \"inari bancha\": \"稻荷ばん茶\",\n        \"pumpkinspicelatte\": \"pumpkinspice\",\n        \"sca-ji\": \"SCA-自\",\n        \"shichi ouji\": \"七王子\",\n        \"mankai beesuke\": \"満開べえスケ\",\n        \"hiiragi yuichi\": \"柊裕一\",\n        \"mukaino kei\": \"向野圭衣\",\n        \"sogom\": \"裕珍\",\n        \"bk-mita\": \"灰濁クロム\",\n        \"sanjiro\": \"さんじろ♨\",\n        \"atelier30\": \"Atelier30\",\n        \"magnificent sexy gals\": \"Magnificent\",\n        \"yoshinari you\": \"吉成曜\",\n        \"sirosoil\": \"白土\",\n        \"chinpan\": \"チンパン\",\n        \"chocoro\": \"チョコロ\",\n        \"sasaki shounen\": \"佐佐木少年\",\n        \"haruno tomoya\": \"春野友矢\",\n        \"pirorikin\": \"ピロリ菌\",\n        \"hayama junichi\": \"羽山淳一\",\n        \"kureha\": \"クレハ\",\n        \"kinomiki\": \"きのみき\",\n        \"ao plus beni\": \"青十紅\",\n        \"ruzhai\": \"儒宅\",\n        \"hukairi botan\": \"深煎り牡丹\",\n        \"katano chika\": \"片野ちか\",\n        \"shirai samoedo\": \"白井サモエド\",\n        \"madana\": \"まだな\",\n        \"squchan\": \"SquChan\",\n        \"mikamin\": \"みかみん\",\n        \"nakamori\": \"なかもり\",\n        \"gittangittan\": \"ギッタンギッタン\",\n        \"kuroda kurota\": \"黒田くろた\",\n        \"inui hana\": \"犬居葉菜\",\n        \"yukai na factory\": \"愉快なFactory\",\n        \"otsunosuke\": \"乙の助\",\n        \"sada sadao\": \"佐田さだお\",\n        \"asakura clock\": \"朝倉クロック\",\n        \"koromotake\": \"ころもたけ\",\n        \"hashina tamaki\": \"葉科たまき\",\n        \"kusogaki\": \"くそガキ\",\n        \"aestheticc-meme\": \"ミームクリーム\",\n        \"denkou nyako\": \"電光にゃコ\",\n        \"hamico\": \"はみこ\",\n        \"takeru\": \"たける\",\n        \"yamoge\": \"やもげ\",\n        \"taguchi monyata\": \"田口もにゃ太\",\n        \"sushiyama\": \"寿司山\",\n        \"kaminari doon\": \"カミナリ・ドーン\",\n        \"ayanakitori\": \"アヤナキトリ\",\n        \"yukoring\": \"優子鈴\",\n        \"fjsmu\": \"fjsmu（ふじしむ）\",\n        \"tomari\": \"トマリ\",\n        \"miso tanuki inka teikoku\": \"みそたぬきインカ帝国\",\n        \"asakawa\": \"浅川\",\n        \"fellatrix\": \"fellatrix\",\n        \"bone hiko\": \"骨彦\",\n        \"yuzuhara moke\": \"柚原もけ\",\n        \"eryu\": \"えりゅ\",\n        \"micosivaa\": \"神輿葉\",\n        \"doritoru\": \"どりとる\",\n        \"nagina\": \"なぎな\",\n        \"ura kaizokudan\": \"裏海俗団\",\n        \"tsuda hitokuchi\": \"津田ヒトクチ\",\n        \"sakura ab\": \"さくらAB\",\n        \"sevengar\": \"せぶんがー\",\n        \"jagi iwa\": \"ジャギ岩\",\n        \"seneto\": \"セネト\",\n        \"unosero\": \"うのせろ\",\n        \"murasaki shingou\": \"紫信号\",\n        \"meriibe\": \"めりーべ\",\n        \"hoshina mimiwo\": \"星奈みみヲ\",\n        \"sakauchi waka\": \"坂内若\",\n        \"sagami yuki\": \"さがみおきば\",\n        \"miyanose you\": \"宮ノ瀬陽\",\n        \"tsukiyo\": \"月夜\",\n        \"nakkar\": \"Nakkar\",\n        \"bippew\": \"Bippew\",\n        \"omegazero01\": \"Omegazero01\",\n        \"diesel\": \"でーぜる\",\n        \"sincos\": \"サインこす\",\n        \"lshiki\": \"Lshiki\",\n        \"asahina yoshitosi\": \"朝比奈吉利（420号高速道路）\",\n        \"mithril rim\": \"みすりるリム\",\n        \"matsunaga kouyou\": \"松永紅葉\",\n        \"muta no yoi oniku\": \"mutaの良いお肉\",\n        \"hokkyoku hotaru\": \"北極ホタル\",\n        \"sunhyun\": \"そんひょん\",\n        \"mizuno yukimi\": \"みずの雪見\",\n        \"greem bang\": \"GreemBang\",\n        \"bibimbub\": \"Bibimbub\",\n        \"kuni-kun\": \"クニくん\",\n        \"mushihara\": \"虫原\",\n        \"momomomo hakushaku\": \"モモモーモー伯爵\",\n        \"takaoka sui\": \"高岡彗\",\n        \"gatoh ganaha\": \"我藤がなは\",\n        \"shirasu\": \"しらす\",\n        \"kandata nijou\": \"神多二丞\",\n        \"saipaco.\": \"SAIPACo.\",\n        \"jj.jj\": \"JJ.JJ\",\n        \"ringo club\": \"りんごくらぶ\",\n        \"usatsuka eiji\": \"兔冢英志\",\n        \"ishii takamori\": \"石井高森\",\n        \"coro fae\": \"Coro Fae\",\n        \"piuta\": \"piuta\",\n        \"meeko\": \"めえこ（めえお）\",\n        \"kuroni bokujou\": \"クロニ\",\n        \"himiya zyo-zu\": \"比宮じょーず\",\n        \"hinageshi\": \"雏罂粟\",\n        \"unknown showhey\": \"马岛祥平\",\n        \"saito naoki\": \"斋藤直葵\",\n        \"yoshiku\": \"四々九\",\n        \"kakage\": \"かかげ\",\n        \"nibiiro shizuka\": \"鈍色玄\",\n        \"kousaka tohru\": \"香坂透\",\n        \"aikolik\": \"AIKOlik\",\n        \"2bls\": \"2bls\",\n        \"utagawa yosiero\": \"歌川芳江呂\",\n        \"allenes\": \"ALLENES\",\n        \"haiironpada\": \"灰色ンパダ\",\n        \"hanamaluo\": \"ハナマルオ\",\n        \"kuroto yu\": \"黒兎ゆう\",\n        \"sugue tetto\": \"スグエ鉄塔\",\n        \"sorayama hajime\": \"空山基\",\n        \"hotate-chan\": \"ほたてちゃん\",\n        \"akai same\": \"かふぇいん中毒\",\n        \"takano tomohiro\": \"高野友宏\",\n        \"ameno shigure\": \"雨野时雨\",\n        \"ushi kousen\": \"牛工船\",\n        \"eroi-roe\": \"エロ井ロエ\",\n        \"camekirin\": \"かめきりん\",\n        \"mayonaka taroupho\": \"真夜中足穗\",\n        \"sharekoube\": \"メカしゃれこうべ\",\n        \"mizusane\": \"みづさね\",\n        \"ninda hayo\": \"忍田波葉\",\n        \"delta chimaki\": \"▲ちまき\",\n        \"menbou\": \"めんぼー\",\n        \"uishi poru\": \"羽衣石ぽる\",\n        \"momoyama hato\": \"モモヤマハト\",\n        \"inukami inoji\": \"犬上いの字\",\n        \"ichikawa noa\": \"一河のあ\",\n        \"mary-san\": \"メリサン\",\n        \"auman zureedus\": \"オーマンズリーダス\",\n        \"maeshima shigeki\": \"前嶋重機\",\n        \"nanquanzl\": \"南拳蟑狼\",\n        \"janggun\": \"jeneral\",\n        \"eros o gutsugutsu nikonda megane\": \"エロスをぐつぐつ煮込んだメガネ\",\n        \"sekkei\": \"雪景\",\n        \"mouja\": \"モウじゃ\",\n        \"hararame\": \"はららめ\",\n        \"shiba aya\": \"柴あや\",\n        \"kiyoshi\": \"キヨシ\",\n        \"shiworiita\": \"シヲリイタ\",\n        \"kitakawa touta\": \"北河トウタ\",\n        \"okiha\": \"沖葉\",\n        \"uekura eku\": \"上倉エク\",\n        \"dendoro kakariya\": \"澱泥カカリヤ\",\n        \"cucchiore\": \"くっきおーれ\",\n        \"konbu wakame\": \"昆布わかめ\",\n        \"omusubi korori\": \"緒結ころり\",\n        \"memeyu\": \"めめゆ\",\n        \"onokana\": \"斧カナ\",\n        \"masuda miyaka\": \"枠田ちさき\",\n        \"arima zin\": \"有马侭\",\n        \"silver dog\": \"シルバードッグ\",\n        \"shihira tatsuya\": \"四平龙也\",\n        \"aoki seishin\": \"碧木诚心\",\n        \"tachibana takashi\": \"橘孝志\",\n        \"sekai ichii\": \"世界一位\",\n        \"maroya kayo\": \"まろや伽夜\",\n        \"kobayashi ritz\": \"小林立\",\n        \"hiroki\": \"宏き\",\n        \"emoto shikeko\": \"えもと しけこ\",\n        \"gogopanda\": \"ごーごーぱんだ\",\n        \"naminori kamome\": \"波乗かもめ\",\n        \"tyontyon\": \"てょんてょん\",\n        \"soejima shigenori\": \"副岛成记\",\n        \"chisunosuke\": \"ちすの助\",\n        \"sakurayashiki tonkotsu\": \"桜屋敷とんこつ\",\n        \"fukumoto masahisa\": \"福本真久\",\n        \"signo mandara\": \"シグノマンダラ\",\n        \"tobiume sayu\": \"飞梅さゆ\",\n        \"omitsu\": \"えびおみつ\",\n        \"hangetsuban sonshou\": \"半月板损伤\",\n        \"tottotonero tarou.\": \"とっととねろ太郎。\",\n        \"nakagomi\": \"中込\",\n        \"d.\": \"D.\",\n        \"oyu\": \"おゆ\",\n        \"pononozo\": \"ぽののぞ\",\n        \"hirota shimaguni\": \"浩田岛国\",\n        \"mutou tetsu\": \"武藤铁\",\n        \"agachi\": \"あがち\",\n        \"shiina shinya\": \"椎名深夜\",\n        \"touketsu\": \"卜ウケツ\",\n        \"hoshina meito\": \"星名めいと\",\n        \"nanonanno\": \"なのなんの\",\n        \"kuroseimu\": \"クロセイム\",\n        \"teppo\": \"鉄歩\",\n        \"mochio\": \"白蜜モチ\",\n        \"kitagawa zayaku\": \"北川ざやく\",\n        \"saito tsubame\": \"齋藤燕\",\n        \"aohonoo\": \"蒼炎\",\n        \"tamayura banko\": \"玉ぼん\",\n        \"tamaki nao\": \"玉姫なお\",\n        \"inonaka kawazu\": \"胃ノ中かわず\",\n        \"saiogauma\": \"塞翁が马\",\n        \"usui yui\": \"碓氷汐泉\",\n        \"raiou\": \"raiou\",\n        \"yokoyari mengo\": \"横枪萌果\",\n        \"alexanderdinh\": \"Alexanderdinh\",\n        \"toubaru rairu\": \"桃原らいる\",\n        \"murao mio\": \"村生未央\",\n        \"toriyaro\": \"トリヤロウ\",\n        \"umeda nautilus\": \"梅田ノーチラス\",\n        \"komura\": \"コムラ\",\n        \"dakkoku jiro\": \"脱壳次郎\",\n        \"futatsuno-peanuts\": \"ふたつのピーナツ\",\n        \"kanzarin\": \"カンザリン\",\n        \"nemurinemu\": \"ねむりねむ\",\n        \"wusui yangcong\": \"五岁洋葱\",\n        \"yuga\": \"ゆがー\",\n        \"akadashi\": \"赤だし\",\n        \"hitakamo\": \"ひたかも\",\n        \"osaki\": \"オオサキ\",\n        \"usa otome\": \"うさおとめ\",\n        \"hatsuuni ikura\": \"初雲丹いくら\",\n        \"asano yomichi\": \"朝野よみち\",\n        \"fuguta-ke\": \"フグタ家\",\n        \"namahiyu\": \"なまひゆ\",\n        \"keise.\": \"慧瀬。\",\n        \"zandoro\": \"ざんどろ\",\n        \"rinaka moruchi\": \"モルんち\",\n        \"tachi\": \"タチ\",\n        \"metsubushi\": \"メツブシ\",\n        \"iuui\": \"イウウイ\",\n        \"cham22\": \"cham22\",\n        \"ie\": \"ie\",\n        \"kokushi\": \"黑司\",\n        \"matsuri seishiro\": \"マツリセイシロウ\",\n        \"mameroku\": \"豆六\",\n        \"chigusa minori\": \"千種みのり\",\n        \"xiaomu\": \"筱牧\",\n        \"petra\": \"佩城\",\n        \"akano murasaki\": \"アカノムラサキ\",\n        \"wood cube\": \"小木蹬子\",\n        \"pentagon\": \"ぺんたごん\",\n        \"radio sensei\": \"ラジオ先生\",\n        \"suitshark\": \"Suitshark\",\n        \"honashi\": \"Honashi\",\n        \"hayanye r\": \"はやにぇR\",\n        \"awamiku\": \"あわこと\",\n        \"barakey\": \"バラキー\",\n        \"ricerice\": \"飯桶君\",\n        \"ahbai\": \"阿白\",\n        \"parsley\": \"パセリ\",\n        \"ochin-sama\": \"おちんさま\",\n        \"takafumi\": \"たかふみ\",\n        \"rkrk12\": \"rkrk12\",\n        \"yurishima shiro\": \"ゆりしましろ\",\n        \"purumetal\": \"ぷるめたる\",\n        \"nicolai no yome\": \"ニコライの嫁（nicolai）\",\n        \"sukusan\": \"SukuSan\",\n        \"noya macoto\": \"ノヤマコト\",\n        \"ryouta\": \"りょうた\",\n        \"shijiu\": \"いけめる\",\n        \"sorimachi toufu\": \"反町豆腐\",\n        \"shibatora\": \"柴寅\",\n        \"cowbow\": \"矼房\",\n        \"yamada kintetsu\": \"山田金铁\",\n        \"kudou maimu\": \"九童まいむ\",\n        \"iwamoto kuyo\": \"いーなん\",\n        \"pilaf modoki\": \"ぴらふもどき\",\n        \"uenosuke\": \"↑野介\",\n        \"inoue makito\": \"井植莳人\",\n        \"mudoochi\": \"むどおち\",\n        \"mori manpei\": \"森万平\",\n        \"frogsnake\": \"蛙记\",\n        \"tearontaron\": \"てぃーろんたろん\",\n        \"tonee\": \"Tonee\",\n        \"rangu\": \"らんぐ\",\n        \"icomochi\": \"イコモチ\",\n        \"hongshi\": \"紅世\",\n        \"shibori kasu\": \"搾り課す\",\n        \"sensiya\": \"千氏夜\",\n        \"aruto naruto\": \"有人成徒\",\n        \"denbu momo\": \"でんぶ腿\",\n        \"gogatsu unagi\": \"五月うなぎ\",\n        \"uko\": \"うこ\",\n        \"ishimari yuuya\": \"イシマリユウヤ\",\n        \"mannen junyuuki\": \"万年授乳期(ジュニー)\",\n        \"putama\": \"ぷ玉\",\n        \"waka mochi ta\": \"わかもち太\",\n        \"mmchair\": \"MM\",\n        \"arisugawa kotone\": \"有栖川琴音\",\n        \"hitonitati\": \"ひとにたち\",\n        \"ryou\": \"涼\",\n        \"ono elle\": \"える\",\n        \"usitora tatumi\": \"牛虎たつみ\",\n        \"takashima shoa\": \"高嶋しょあ\",\n        \"half horse hanma\": \"半馬ハンマ\",\n        \"ekimae machinaka\": \"駅前街中\",\n        \"hoyhoy colo\": \"ホイホイこーろ\",\n        \"noyama\": \"のやま\",\n        \"araizumi rui\": \"新泉留衣\",\n        \"hui yin\": \"慧骃\",\n        \"pineapple panda\": \"鳳梨ぱんだ\",\n        \"qiandai yiyu\": \"Qiandai以宇\",\n        \"kacyu\": \"卡丘\",\n        \"bagelbomb\": \"Bagelbomb\",\n        \"kitano yukito\": \"北乃ゆきと\",\n        \"haruri\": \"HARURI\",\n        \"sumina en\": \"澄名エン\",\n        \"jinja eru\": \"神社えーる\",\n        \"nukeru\": \"ヌケル\",\n        \"musui ethanol\": \"無水エタノール\",\n        \"mori sinrisk\": \"森シンリスク\",\n        \"moegi\": \"萌黄おじさん\",\n        \"kikomuhito\": \"着込む人\",\n        \"elegant\": \"えれがんと\",\n        \"tonyman plus\": \"トニーマン+\",\n        \"shimetsuki tanki\": \"湿月タンキ\",\n        \"yuukey\": \"ゆーきぃ\",\n        \"wu qing yan hui gang\": \"无情烟灰缸\",\n        \"yoshimura bitchmotor\": \"吉村ビッチモーター\",\n        \"mochimoon curry\": \"餅月カレン\",\n        \"yukimochi kinako\": \"幸餅きなこ\",\n        \"houraku\": \"HOURAKU\",\n        \"nagatsuki misoka\": \"长月みそか\",\n        \"wosushi\": \"をすし\",\n        \"kiyohara hiro\": \"清原纮\",\n        \"yakiuni\": \"烧きうに\",\n        \"inui ayu\": \"犬井あゆ\",\n        \"osanai shiina\": \"小山内しいな\",\n        \"umino ryo\": \"海野りょう\",\n        \"daruma jd\": \"だるまJD\",\n        \"gsus\": \"GSUS\",\n        \"gucchian\": \"ぐっち庵\",\n        \"uekura ryona\": \"上倉RyoNA\",\n        \"kusothumu\": \"くそつむ\",\n        \"ashitaba mofu\": \"明日葉もふ\",\n        \"yoshitomi akihito\": \"吉富昭仁\",\n        \"lestart\": \"lestart\",\n        \"shiono\": \"しおの\",\n        \"semino hazuki\": \"セミノハヅキ\",\n        \"yasumi mirakichi\": \"やすみみらきち\",\n        \"tsukunendo\": \"つくねんど\",\n        \"okachimachi tamachi\": \"御徒町たまち\",\n        \"jmg\": \"JMG\",\n        \"ueshita\": \"うえした\",\n        \"mintaro\": \"みんたろう\",\n        \"bergyb\": \"博哥\",\n        \"yukimochi\": \"ゆきもち\",\n        \"jury\": \"じゅらい\",\n        \"yandama\": \"やんだま\",\n        \"youngjijii\": \"ヤングじじい\",\n        \"kawazoe taichi\": \"河添太一\",\n        \"mochikushi\": \"もちくし\",\n        \"shaggy susu\": \"Shaggy SUSU\",\n        \"xiao bai tian\": \"小白天\",\n        \"suzukawa\": \"凉河\",\n        \"kizuna\": \"絆\",\n        \"natsume yochiki\": \"よちき\",\n        \"modare\": \"モ誰\",\n        \"momoshiki\": \"ももしき\",\n        \"momochi chia\": \"桃稚 ちあ\",\n        \"skai kun\": \"Skai_kun\",\n        \"tsuyatsuya\": \"艶々\",\n        \"star shadow magician\": \"STAR影法师\",\n        \"sakai\": \"坂井\",\n        \"reiichi\": \"零壱\",\n        \"akichi\": \"空き地\",\n        \"kouzu sousuke\": \"兴津惣介\",\n        \"lemon snail\": \"Lemon Snail\",\n        \"zirba\": \"Zirba\",\n        \"fyxfd\": \"肥油小分队\",\n        \"karei\": \"かれい\",\n        \"arashiya\": \"嵐屋\",\n        \"yamamoto yumiko\": \"山本由美子\",\n        \"zurikishi\": \"ずり騎士\",\n        \"himeno mikan\": \"姫野蜜柑\",\n        \"fujimura q\": \"藤村久\",\n        \"kaneko naoya\": \"カネコナオヤ\",\n        \"grimgrim\": \"grimgrim\",\n        \"makochan42\": \"まこちあ\",\n        \"wagashi\": \"和菓子\",\n        \"kayama yuichiro\": \"鹿山裕一郎\",\n        \"iranon\": \"冬灯\",\n        \"takanaga kouhei\": \"高永浩平\",\n        \"shuru-ban\": \"しゅる版\",\n        \"yoongonji\": \"尹坤志\",\n        \"mobuta\": \"モブ太\",\n        \"xiaozi xiao\": \"笑笑饺子\",\n        \"shura\": \"朱雷\",\n        \"kokonobi\": \"九尾\",\n        \"pooh\": \"ぷぅ\",\n        \"irono\": \"ゐろの\",\n        \"isshi pyuma\": \"一志ピューマ\",\n        \"mamerakko\": \"豆ラッコニキ\",\n        \"amakusa tobari\": \"天草帳\",\n        \"sasaki mutsumi\": \"ささきむつみ\",\n        \"murabito toufuten\": \"村人豆腐店\",\n        \"kuma ashi s\": \"熊足S\",\n        \"sasai nakoto\": \"茶彩なこと\",\n        \"hina\": \"氷菜\",\n        \"yozakura souki\": \"夜桜ソウキ\",\n        \"susukumo nagi\": \"煤雲なぎ\",\n        \"cielo\": \"CIELO\",\n        \"hekoman\": \"へこまん\",\n        \"ichinosono yui\": \"一之园唯\",\n        \"rindow masaki\": \"あるでぃ\",\n        \"orihika\": \"おりひか\",\n        \"scottie\": \"スコッティ\",\n        \"makin\": \"まきん\",\n        \"myamo\": \"ミャモ\",\n        \"pedopetton\": \"ぺどぺっとん\",\n        \"mikozin\": \"ミコジン\",\n        \"imajin kouji\": \"イマジン孝二\",\n        \"meisuke\": \"めーすけ\",\n        \"kotobuki mairo\": \"寿まいろ\",\n        \"minato yuu\": \"湊ゆう\",\n        \"ameko\": \"あめこ\",\n        \"senda hisamaru\": \"せんだ寿丸\",\n        \"fujiwara noa\": \"藤原のあ\",\n        \"ryoutani kana\": \"両谷哉\",\n        \"hoshino rao\": \"星野らお\",\n        \"jankey\": \"ジャンキー\",\n        \"nettsuu\": \"ねっつー\",\n        \"point takashi\": \"みるく工房\",\n        \"wakatake\": \"わかたけ\",\n        \"aak\": \"aak\",\n        \"rabu\": \"ラブ\",\n        \"uni toshiki\": \"ウニトシキ\",\n        \"teikuuhikou\": \"低空飞行\",\n        \"iwami yasoya\": \"石见やそや\",\n        \"mittsuman\": \"みっつまん\",\n        \"chinetsu\": \"ちねつ\",\n        \"akausu ko\": \"赤薄红\",\n        \"otona no sexy ehon\": \"大人のSEXY絵本\",\n        \"hogeramu\": \"ほげらむ\",\n        \"raikou\": \"らい公\",\n        \"raku\": \"乐\",\n        \"karaage\": \"唐扬\",\n        \"jinze\": \"今沢\",\n        \"hosigarasu\": \"干しガラス\",\n        \"koyama harutarou\": \"コヤマハルタロウ\",\n        \"iketatsu shizuru\": \"池竜静留\",\n        \"kogara tsugumi\": \"小雀つぐみ\",\n        \"papipukepo\": \"ぱぴぷけぽ\",\n        \"yomogi mametaro\": \"よもぎ豆太郎\",\n        \"yasuda yasuhiro\": \"保田やすひろ\",\n        \"minazuki miyabi\": \"水無月雅\",\n        \"okome taberu\": \"おこめタベル\",\n        \"nagase tooru\": \"長瀬 徹\",\n        \"az slash hybrid\": \"をん（AZ/HYBRID）\",\n        \"shirabii\": \"しらび\",\n        \"ushio kiyoshi\": \"潮汐きよし\",\n        \"yumemi teer\": \"夢見てぇる\",\n        \"kisaragi sonami\": \"生肉\",\n        \"nishi yasuaki\": \"西ヤスアキ\",\n        \"higashi taishi\": \"東太子\",\n        \"kokudou juunigou\": \"国道12号\",\n        \"sushi yuusha toro\": \"寿司勇者トロ\",\n        \"sandbox\": \"砂场\",\n        \"yunamaro\": \"ゆなまろ\",\n        \"810eru\": \"草葉える\",\n        \"mochiduki riku\": \"望月りく\",\n        \"asoka\": \"あそか\",\n        \"komiya yuuta\": \"小宮裕太\",\n        \"inchou no naka no hito\": \"いんちょ～の中の人\",\n        \"asakura hayate\": \"朝倉はやて\",\n        \"yutaka izubuchi\": \"出渕裕\",\n        \"tachibana-ko\": \"橘子\",\n        \"toridamono\": \"トリダモノ\",\n        \"yoshimura takuya\": \"吉村拓哉\",\n        \"yuki no arashi\": \"雪之岚\",\n        \"yiduan\": \"异端\",\n        \"kii kanna\": \"紀伊カンナ\",\n        \"watosu mama\": \"わとす\",\n        \"wodae\": \"ヲダエ\",\n        \"nagoyaka jirou\": \"なごやか次郎\",\n        \"kyonta\": \"きょんた\",\n        \"amakawa gumi\": \"甘皮ぐみ\",\n        \"blvefo9\": \"blvefo9\",\n        \"nyaon\": \"にゃおん\",\n        \"fuugetsu makoto\": \"楓月誠\",\n        \"rebutsu\": \"りぶつ\",\n        \"choi moz\": \"ちょいもず\",\n        \"miyazaki usagi\": \"みやざきうさぎ\",\n        \"touchuu kasou\": \"冬虫夏草\",\n        \"cbmus\": \"cbmus\",\n        \"torii yoshitsuna\": \"鳥居ヨシツナ\",\n        \"mannack\": \"まんなく\",\n        \"miwerjooggetser\": \"無名老圖\",\n        \"shimohara\": \"しもはら\",\n        \"kazutake hazano\": \"和武はざの\",\n        \"kanpancake\": \"kanpancake\",\n        \"satoh sugar\": \"砂藤シュガー\",\n        \"okura-chan\": \"おくらちゃん\",\n        \"bannou\": \"万能\",\n        \"rokita\": \"ろきた\",\n        \"naruya shin\": \"なるやしん\",\n        \"tamura-chan\": \"田村ちゃん\",\n        \"nyum\": \"にゅむ\",\n        \"tsunako\": \"つなこ\",\n        \"amagai tarou\": \"おるだん\",\n        \"takota konu\": \"蛸田こぬ\",\n        \"made rokuri\": \"迄ロクリ\",\n        \"charin\": \"チャリン\",\n        \"usodi\": \"ウソヂ\",\n        \"chairoino\": \"茶色いの\",\n        \"sugiyama\": \"杉山\",\n        \"antifreez3\": \"天凉多喝防冻液\",\n        \"norihito\": \"仁人\",\n        \"ogatatei\": \"緒方てい\",\n        \"aota sora\": \"あおたそら\",\n        \"4uu\": \"4UU\",\n        \"miginer\": \"みぎなー\",\n        \"kenko shindan-chan\": \"健康診断ちゃん\",\n        \"hibari\": \"雲雀ひな\",\n        \"neko no youchuu\": \"猫の幼虫\",\n        \"to hegemonikon\": \"ト！ヘーゲモニコン\",\n        \"agagaga\": \"あがががが\",\n        \"namekuji\": \"なめくじ\",\n        \"bonnou obaa-chan\": \"煩悩おばあちゃん\"\n    },\n    \"cosplayer\": {\n        \"otohara an\": \"乙原あん\",\n        \"rioko\": \"涼涼子\",\n        \"atsuki\": \"あつき\",\n        \"hane ame\": \"雨波\",\n        \"chunmomo\": \"蠢沫沫\",\n        \"kalinka fox\": \"Kalynka Fox\",\n        \"nora fawn\": \"Nora Fawn\",\n        \"saku\": \"サク\",\n        \"arty huang\": \"Arty亞緹\",\n        \"carry key\": \"Carry Key\",\n        \"valery himera\": \"Valery Himera\",\n        \"vinnegal\": \"Vinnegal\",\n        \"nath sokolova\": \"Nath Sokolova\",\n        \"virtual geisha\": \"Virtual Geisha\",\n        \"kaya huang\": \"KaYa 萱\",\n        \"sayako\": \"さやこ\",\n        \"mikomi hokina\": \"Mikomi Hokina\",\n        \"akane araragi\": \"Akane Araragi\",\n        \"lenfried\": \"lenfried\",\n        \"xidaidai\": \"習呆呆\",\n        \"senluo caituan\": \"森蘿財團\",\n        \"pigma\": \"Pigman\",\n        \"abaoyeshituniang\": \"阿包也是兔娘\",\n        \"kimmie mi\": \"蜜蜜子\",\n        \"aqua area\": \"水淼Aqua\",\n        \"erzuo nisa\": \"二佐nisa\",\n        \"sola\": \"Sola\",\n        \"tsuki desu\": \"Tsuki Desu\",\n        \"kokura chiyo\": \"小倉ちよ\",\n        \"g44 wa kizutsukanai\": \"G44不會受傷\",\n        \"okita rinka\": \"沖田凜花\",\n        \"nekokoyoshi\": \"爆機少女喵小吉\",\n        \"akemi101xoxo\": \"Akemi101xoxo\",\n        \"hoshilily\": \"星之遲遲\",\n        \"yurikodxd\": \"YurikoDxD\",\n        \"yuuforia\": \"Yuuforia\",\n        \"lovelyspacekitten\": \"LovelySpaceKitten\",\n        \"uyuy\": \"UyUy\",\n        \"alicekyo\": \"Alicekyo\",\n        \"baoer mysterial\": \"寶兒Mysterial\",\n        \"menmentan\": \"燜燜碳\",\n        \"rio-chan\": \"愛瀬りおな\",\n        \"siao ding\": \"小丁\",\n        \"franxcos\": \"FranXcos\",\n        \"junkenstein\": \"Junkenstein\",\n        \"helly von valentine\": \"Helly von Valentine\",\n        \"penkarui\": \"Penkarui\",\n        \"mizhimaoqiu\": \"蜜汁貓裘\",\n        \"refeen\": \"Refeen\",\n        \"ely cosplay\": \"ElyEE子\",\n        \"azami\": \"Azami\",\n        \"mercurylamp\": \"水銀燈\",\n        \"niyeye\": \"你燁燁\",\n        \"yaoyaoqwq\": \"軟妹搖搖樂\",\n        \"maria desu\": \"Maria Desu\",\n        \"hidori rose\": \"Hidori Rose\",\n        \"ai lei jiang\": \"少女映畫\",\n        \"shimotsuki\": \"霜月shimo\",\n        \"hua qi hana\": \"花柒Hana\",\n        \"lostwind10\": \"貓と爪呸羅呸羅\",\n        \"xue qi-sama\": \"雪琪SAMA\",\n        \"larissa rochefort\": \"Larissa Rochefort\",\n        \"kitaro\": \"Kitaro綺太郎\",\n        \"banbanko\": \"半半子\",\n        \"aninnyan\": \"桜井甯甯\",\n        \"nagisa\": \"NAGISA魔物喵\",\n        \"katiecakey\": \"Katie Cakey\",\n        \"linzi jiang\": \"凜子醬\",\n        \"cherry neko\": \"桜桃喵\",\n        \"kuuko w\": \"Kuuko W\",\n        \"luo xiaoli miao\": \"洛璃LoLiSAMA\",\n        \"yaokoututu\": \"咬一口兔娘\",\n        \"yuki astra\": \"雪晴Astra\",\n        \"niannian d\": \"念念_D\",\n        \"tyouduki maryou\": \"蝶月真綾\",\n        \"ringo mitsuki\": \"林檎蜜紀\",\n        \"tokar\": \"浵卡Tokar\",\n        \"saotome love\": \"早乙女らぶ\",\n        \"tsubomin\": \"つぼみん\",\n        \"omimi\": \"おみみ\",\n        \"sakura noa\": \"桜のぁ\",\n        \"yuricha\": \"YURICHA\",\n        \"na-san\": \"なーさん\",\n        \"mashiro yuki\": \"真白ゆき\",\n        \"alina becker\": \"Alina Becker\",\n        \"shizuku honami\": \"穂南しずく\",\n        \"lmusicl\": \"lMusicl\",\n        \"masako yume\": \"Masako Yume\",\n        \"ain nguyen\": \"Ain Nguyễn\",\n        \"oniksiya sofinikum\": \"Oniksiya Sofinikum\"\n    },\n    \"male\": {\n        \"age progression\": \"年齡增長\",\n        \"age regression\": \"返老還童\",\n        \"dilf\": \"熟男\",\n        \"infantilism\": \"幼稚型\",\n        \"old man\": \"老人\",\n        \"shotacon\": \"正太\",\n        \"toddlercon\": \"幼兒\",\n        \"amputee\": \"截肢\",\n        \"big muscles\": \"大肌肉\",\n        \"body modification\": \"身體改造\",\n        \"conjoined\": \"連體\",\n        \"doll joints\": \"關節娃娃\",\n        \"gijinka\": \"擬人化\",\n        \"inflation\": \"腹部膨脹\",\n        \"invisible\": \"透明\",\n        \"multiple arms\": \"多臂\",\n        \"muscle\": \"肌肉\",\n        \"muscle growth\": \"肌肉成長\",\n        \"stretching\": \"拉伸\",\n        \"tailjob\": \"尾交\",\n        \"wings\": \"翅膀\",\n        \"absorption\": \"吸收\",\n        \"petrification\": \"石化\",\n        \"transformation\": \"變身\",\n        \"alien\": \"外星人👽\",\n        \"angel\": \"天使\",\n        \"bat boy\": \"蝙蝠男\",\n        \"bear boy\": \"狗熊男\",\n        \"bee boy\": \"蜂男\",\n        \"bird boy\": \"鳥男\",\n        \"bunny boy\": \"兔子男孩\",\n        \"catboy\": \"貓男\",\n        \"centaur\": \"半人馬\",\n        \"cowman\": \"牛男\",\n        \"deer boy\": \"鹿男孩\",\n        \"demon\": \"惡魔\",\n        \"dog boy\": \"狗男孩\",\n        \"draenei\": \"德萊尼\",\n        \"elephant boy\": \"象男孩\",\n        \"fairy\": \"仙子🧚‍♂️\",\n        \"fox boy\": \"狐男\",\n        \"frog boy\": \"青蛙男孩\",\n        \"furry\": \"毛茸茸\",\n        \"giraffe boy\": \"長頸鹿男\",\n        \"ghost\": \"幽靈👻\",\n        \"goblin\": \"哥布林\",\n        \"harpy\": \"鳥人\",\n        \"horse boy\": \"馬男孩\",\n        \"human on furry\": \"人毛\",\n        \"hyena boy\": \"鬣狗男孩\",\n        \"insect boy\": \"昆蟲男孩\",\n        \"kappa\": \"河童\",\n        \"lizard guy\": \"蜥蜴男孩\",\n        \"merman\": \"人魚🧜‍♂️\",\n        \"minotaur\": \"牛頭人\",\n        \"monkey boy\": \"猴男孩\",\n        \"monster\": \"怪物\",\n        \"mouse boy\": \"鼠男孩\",\n        \"necrophilia\": \"姦屍\",\n        \"oni\": \"鬼\",\n        \"orc\": \"半獸人\",\n        \"otter boy\": \"水獺男孩\",\n        \"panda boy\": \"熊貓男\",\n        \"pig man\": \"豬男\",\n        \"plant boy\": \"植物男孩\",\n        \"raccoon boy\": \"浣熊男孩\",\n        \"robot\": \"機器人🤖\",\n        \"shark boy\": \"鯊男孩\",\n        \"sheep boy\": \"羊男孩\",\n        \"slime\": \"史萊姆\",\n        \"slime boy\": \"史萊姆男孩\",\n        \"snake boy\": \"蛇男\",\n        \"spider boy\": \"蜘蛛男\",\n        \"squid boy\": \"烏賊男\",\n        \"squirrel boy\": \"松鼠男\",\n        \"skunk boy\": \"臭鼬男\",\n        \"tentacles\": \"觸手\",\n        \"vampire\": \"吸血鬼🧛‍♂️\",\n        \"wolf boy\": \"狼男孩\",\n        \"zombie\": \"殭屍🧟‍♂️\",\n        \"animal on animal\": \"獸獸\",\n        \"animal on furry\": \"獸毛\",\n        \"bear\": \"熊🐻\",\n        \"bestiality\": \"獸交\",\n        \"bull\": \"牛🐂\",\n        \"camel\": \"駱駝🐫\",\n        \"cat\": \"貓🐈\",\n        \"crab\": \"螃蟹🦀\",\n        \"deer\": \"鹿🦌\",\n        \"dinosaur\": \"恐龍🦖\",\n        \"dog\": \"狗🐕\",\n        \"dolphin\": \"海豚🐬\",\n        \"donkey\": \"驢\",\n        \"dragon\": \"龍🐉\",\n        \"eel\": \"鰻魚\",\n        \"elephant\": \"象🐘\",\n        \"fish\": \"魚🐟\",\n        \"fox\": \"狐狸🦊\",\n        \"frog\": \"青蛙🐸\",\n        \"goat\": \"山羊🐐\",\n        \"gorilla\": \"猩猩🦍\",\n        \"horse\": \"馬🐎\",\n        \"insect\": \"昆蟲🐜\",\n        \"kangaroo\": \"袋鼠\",\n        \"lion\": \"獅🦁\",\n        \"maggot\": \"蛆🐛\",\n        \"monkey\": \"猴🐒\",\n        \"mouse\": \"鼠🐀\",\n        \"octopus\": \"章魚🐙\",\n        \"ostrich\": \"鴕鳥\",\n        \"panther\": \"豹🐆\",\n        \"pegasus\": \"天馬\",\n        \"pig\": \"豬🐖\",\n        \"rabbit\": \"兔🐇\",\n        \"reptile\": \"爬蟲\",\n        \"rhinoceros\": \"犀牛🦏\",\n        \"sheep\": \"綿羊🐏\",\n        \"shark\": \"鯊🦈\",\n        \"slug\": \"蛞蝓\",\n        \"snake\": \"蛇🐍\",\n        \"spider\": \"蜘蛛🕷\",\n        \"tiger\": \"虎🐅\",\n        \"turtle\": \"龜🐢\",\n        \"unicorn\": \"獨角獸🦄\",\n        \"whale\": \"鯨🐋\",\n        \"wolf\": \"狼🐺\",\n        \"worm\": \"蠕蟲\",\n        \"zebra\": \"斑馬🦓\",\n        \"giant\": \"巨人\",\n        \"growth\": \"巨大化\",\n        \"midget\": \"侏儒\",\n        \"miniguy\": \"迷你男孩\",\n        \"shrinking\": \"縮小\",\n        \"tall man\": \"高個男\",\n        \"albino\": \"白化\",\n        \"body writing\": \"身體寫作\",\n        \"body painting\": \"身體繪畫\",\n        \"dark skin\": \"黑皮\",\n        \"freckles\": \"雀斑\",\n        \"gyaru-oh\": \"黃毛\",\n        \"large tattoo\": \"全身紋身\",\n        \"lipstick mark\": \"口紅印\",\n        \"scar\": \"疤痕\",\n        \"skinsuit\": \"人皮衣\",\n        \"tanlines\": \"曬痕\",\n        \"anorexic\": \"厭食症\",\n        \"bbm\": \"胖男人\",\n        \"ssbbm\": \"超級胖男人\",\n        \"weight gain\": \"體重增加\",\n        \"ahegao\": \"阿黑顏\",\n        \"beauty mark\": \"美人痣\",\n        \"brain fuck\": \"腦交🧠\",\n        \"cockslapping\": \"屌打耳光\",\n        \"crown\": \"王冠👑\",\n        \"elf\": \"精靈🧝‍♂️\",\n        \"facesitting\": \"坐臉\",\n        \"facial hair\": \"鬍子\",\n        \"gasmask\": \"防毒面具\",\n        \"halo\": \"光環\",\n        \"hood\": \"帽兜\",\n        \"horns\": \"角\",\n        \"kemonomimi\": \"獸耳\",\n        \"kigurumi pajama\": \"動物連體睡衣\",\n        \"makeup\": \"化妝\",\n        \"masked face\": \"假面\",\n        \"mouth mask\": \"口罩\",\n        \"thick eyebrows\": \"濃眉\",\n        \"afro\": \"爆炸頭\",\n        \"bald\": \"禿頂\",\n        \"drill hair\": \"螺旋辮\",\n        \"eye-covering bang\": \"長劉海\",\n        \"hair buns\": \"丸子頭\",\n        \"hairjob\": \"髮交\",\n        \"pixie cut\": \"精靈頭\",\n        \"ponytail\": \"馬尾辮\",\n        \"prehensile hair\": \"抓頭髮\",\n        \"shaved head\": \"光頭\",\n        \"twintails\": \"雙馬尾\",\n        \"very long hair\": \"超長髮\",\n        \"body swap\": \"換身\",\n        \"chloroform\": \"迷藥\",\n        \"corruption\": \"墮落\",\n        \"drugs\": \"藥物\",\n        \"drunk\": \"醉酒\",\n        \"emotionless sex\": \"性冷淡\",\n        \"mind break\": \"洗腦\",\n        \"mind control\": \"催眠\",\n        \"moral degeneration\": \"道德退化\",\n        \"parasite\": \"寄生\",\n        \"personality excretion\": \"人格排洩\",\n        \"possession\": \"附身\",\n        \"shared senses\": \"感官共享\",\n        \"sleeping\": \"睡覺\",\n        \"blindfold\": \"遮眼布\",\n        \"closed eyes\": \"閉眼\",\n        \"crying\": \"流淚\",\n        \"dark sclera\": \"黑眼白\",\n        \"eye penetration\": \"插入眼睛\",\n        \"eyemask\": \"眼部面具\",\n        \"eyepatch\": \"眼罩\",\n        \"glasses\": \"眼鏡👓\",\n        \"heterochromia\": \"異色瞳\",\n        \"monoeye\": \"獨眼\",\n        \"sunglasses\": \"太陽鏡🕶\",\n        \"unusual pupils\": \"異瞳\",\n        \"nose fuck\": \"鼻交\",\n        \"nose hook\": \"鼻吊鉤\",\n        \"smell\": \"氣味\",\n        \"big lips\": \"大嘴唇💋\",\n        \"blowjob\": \"口交\",\n        \"blowjob face\": \"口交顏\",\n        \"braces\": \"牙套\",\n        \"burping\": \"打嗝\",\n        \"coprophagia\": \"食糞\",\n        \"deepthroat\": \"深喉\",\n        \"double blowjob\": \"一口二鳥\",\n        \"foot licking\": \"舔足\",\n        \"gag\": \"口塞\",\n        \"gokkun\": \"飲精\",\n        \"kissing\": \"接吻💏\",\n        \"long tongue\": \"長舌👅\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"piss drinking\": \"飲尿\",\n        \"rimjob\": \"舔肛\",\n        \"saliva\": \"唾液\",\n        \"smoking\": \"吸菸🚬\",\n        \"tooth brushing\": \"刷牙\",\n        \"unusual teeth\": \"異齒\",\n        \"vomit\": \"嘔吐🤮\",\n        \"vore\": \"吞食\",\n        \"asphyxiation\": \"窒息\",\n        \"collar\": \"項圈\",\n        \"hanging\": \"絞刑\",\n        \"leash\": \"狗鏈\",\n        \"armpit licking\": \"腋下舔\",\n        \"armpit sex\": \"腋交\",\n        \"hairy armpits\": \"腋毛\",\n        \"fisting\": \"拳交💪\",\n        \"gloves\": \"手套\",\n        \"handjob\": \"打手槍\",\n        \"multiple handjob\": \"多重打手槍\",\n        \"big areolae\": \"大乳暈\",\n        \"big breasts\": \"巨乳\",\n        \"breast expansion\": \"乳房膨脹\",\n        \"breast feeding\": \"哺乳\",\n        \"lactation\": \"母乳\",\n        \"milking\": \"擠奶\",\n        \"paizuri\": \"乳交\",\n        \"big nipples\": \"大乳頭\",\n        \"dark nipples\": \"黑乳頭\",\n        \"dicknipples\": \"陰莖乳頭\",\n        \"inverted nipples\": \"乳頭內陷\",\n        \"nipple birth\": \"乳頭出產\",\n        \"nipple fuck\": \"乳穴性交\",\n        \"nipple piercing\": \"乳頭穿孔\",\n        \"nipple stimulation\": \"乳頭刺激\",\n        \"cumflation\": \"精液膨脹\",\n        \"navel fuck\": \"肚臍奸\",\n        \"pregnant\": \"懷孕\",\n        \"stomach deformation\": \"腹部變形\",\n        \"chastity belt\": \"貞操帶\",\n        \"crotch tattoo\": \"淫紋\",\n        \"genital piercing\": \"性器穿孔\",\n        \"hairy\": \"多毛\",\n        \"mesuiki\": \"幹高潮\",\n        \"multiple orgasms\": \"連續高潮\",\n        \"no balls\": \"無蛋\",\n        \"pantyjob\": \"內褲交\",\n        \"pubic stubble\": \"陰毛渣\",\n        \"urethra insertion\": \"尿道插入\",\n        \"adventitious penis\": \"畸位陰莖\",\n        \"ball caressing\": \"揉蛋\",\n        \"balls expansion\": \"睪丸生長\",\n        \"ball sucking\": \"吸球\",\n        \"balljob\": \"球交\",\n        \"big balls\": \"大睪丸\",\n        \"big penis\": \"大根\",\n        \"cloaca insertion\": \"泄殖腔插入\",\n        \"cockphagia\": \"陰莖吞食\",\n        \"cock ring\": \"鎖精環\",\n        \"frottage\": \"陰莖摩擦🤺\",\n        \"horse cock\": \"馬根\",\n        \"huge penis\": \"巨根\",\n        \"multiple penises\": \"多種雞雞\",\n        \"penis birth\": \"陰莖出產\",\n        \"penis enlargement\": \"陰莖生長\",\n        \"phimosis\": \"包莖\",\n        \"prostate massage\": \"前列腺按摩\",\n        \"retractable penis\": \"可伸縮陰莖\",\n        \"smegma\": \"陰垢\",\n        \"cervix prolapse\": \"宮頸脫垂\",\n        \"clit insertion\": \"陰蒂插入\",\n        \"clit stimulation\": \"陰蒂刺激\",\n        \"cunnilingus\": \"舔陰\",\n        \"unbirth\": \"入陰\",\n        \"vaginal birth\": \"陰道出產\",\n        \"anal\": \"爆肛\",\n        \"anal birth\": \"肛門出產\",\n        \"anal intercourse\": \"肛交\",\n        \"analphagia\": \"肛門吞食\",\n        \"anal prolapse\": \"脫肛\",\n        \"ass expansion\": \"臀部膨脹\",\n        \"assjob\": \"尻交\",\n        \"big ass\": \"大屁股\",\n        \"enema\": \"灌腸\",\n        \"farting\": \"放屁\",\n        \"multiple assjob\": \"多重尻交\",\n        \"pegging\": \"爆菊\",\n        \"spanking\": \"打屁股\",\n        \"tail\": \"尾巴\",\n        \"tailphagia\": \"尾巴吞食\",\n        \"eggs\": \"產卵\",\n        \"gaping\": \"敞口\",\n        \"large insertions\": \"大玩具\",\n        \"nakadashi\": \"中出\",\n        \"prolapse\": \"脫垂\",\n        \"leg lock\": \"勾腿\",\n        \"sumata\": \"股間性交\",\n        \"denki anma\": \"電氣按摩\",\n        \"foot insertion\": \"足插入\",\n        \"footjob\": \"足交\",\n        \"multiple footjob\": \"多重足交\",\n        \"sockjob\": \"襪交🧦\",\n        \"animegao\": \"頭殼\",\n        \"apron\": \"圍裙\",\n        \"bandages\": \"繃帶\",\n        \"bike shorts\": \"腳踏車短褲\",\n        \"bikini\": \"比基尼👙\",\n        \"bloomers\": \"裙褲\",\n        \"bodystocking\": \"連身襪\",\n        \"bodysuit\": \"緊身衣褲\",\n        \"bride\": \"婚紗\",\n        \"business suit\": \"西裝\",\n        \"butler\": \"管家\",\n        \"cashier\": \"收銀員\",\n        \"cheerleader\": \"啦啦隊員\",\n        \"chinese dress\": \"旗袍\",\n        \"christmas\": \"聖誕裝🎅\",\n        \"clothed female nude male\": \"裸男\",\n        \"clown\": \"小丑🤡\",\n        \"condom\": \"避孕套\",\n        \"corset\": \"緊身胸衣\",\n        \"cosplaying\": \"Cosplay\",\n        \"crossdressing\": \"異性裝\",\n        \"detached sleeves\": \"分離袖子\",\n        \"diaper\": \"尿布\",\n        \"dougi\": \"練功服🥋\",\n        \"exposed clothing\": \"開洞裝\",\n        \"fishnets\": \"漁網\",\n        \"fundoshi\": \"六尺褌\",\n        \"garter belt\": \"吊襪帶\",\n        \"gothic lolita\": \"哥特蘿莉裝\",\n        \"gymshorts\": \"運動短褲\",\n        \"haigure\": \"高叉裝\",\n        \"headphones\": \"頭戴式耳機\",\n        \"high heels\": \"高跟鞋\",\n        \"hijab\": \"頭巾\",\n        \"hotpants\": \"熱褲\",\n        \"kimono\": \"和服👘\",\n        \"kindergarten uniform\": \"幼兒園制服\",\n        \"kunoichi\": \"女忍裝\",\n        \"lab coat\": \"白大褂\",\n        \"latex\": \"乳膠緊身衣\",\n        \"leotard\": \"緊身衣\",\n        \"lingerie\": \"情趣內衣\",\n        \"living clothes\": \"生物衣\",\n        \"magical girl\": \"魔法少女\",\n        \"maid\": \"女僕裝\",\n        \"mecha boy\": \"機男\",\n        \"metal armor\": \"金屬盔甲\",\n        \"miko\": \"巫女裝\",\n        \"military\": \"軍裝\",\n        \"nazi\": \"納粹軍裝\",\n        \"ninja\": \"忍者裝\",\n        \"nun\": \"修女服\",\n        \"nurse\": \"護士裝\",\n        \"painted nails\": \"美甲\",\n        \"pantyhose\": \"連褲襪\",\n        \"pasties\": \"乳貼\",\n        \"piercing\": \"穿孔\",\n        \"pirate\": \"海盜服\",\n        \"policeman\": \"警服\",\n        \"priest\": \"牧師服\",\n        \"randoseru\": \"書包\",\n        \"schoolboy uniform\": \"男生制服\",\n        \"schoolgirl uniform\": \"女生制服\",\n        \"school gym uniform\": \"學校體操服\",\n        \"school swimsuit\": \"死庫水\",\n        \"scrotal lingerie\": \"陰囊袋\",\n        \"small penis\": \"小小鳥\",\n        \"shimapan\": \"條紋胖次\",\n        \"stewardess\": \"空姐服\",\n        \"steward\": \"男空乘服\",\n        \"stirrup legwear\": \"襪蹬\",\n        \"stockings\": \"長筒襪\",\n        \"straitjacket\": \"拘束衣\",\n        \"sundress\": \"夏裝\",\n        \"swimsuit\": \"泳裝\",\n        \"tabi socks\": \"足袋\",\n        \"thigh high boots\": \"高筒靴\",\n        \"tiara\": \"寶冠\",\n        \"tights\": \"厚連褲襪\",\n        \"tracksuit\": \"運動服\",\n        \"waiter\": \"男侍者裝\",\n        \"waitress\": \"女侍者裝\",\n        \"wet clothes\": \"溼身\",\n        \"witch\": \"女巫裝\",\n        \"double anal\": \"雙插肛門\",\n        \"gang rape\": \"輪姦\",\n        \"group\": \"亂交\",\n        \"harem\": \"後宮\",\n        \"layer cake\": \"夾心蛋糕\",\n        \"mmm threesome\": \"男3P\",\n        \"multiple straddling\": \"多人跨騎\",\n        \"oyakodon\": \"父子丼\",\n        \"shimaidon\": \"兄弟丼\",\n        \"triple anal\": \"三插肛門\",\n        \"twins\": \"雙胞胎\",\n        \"all the way through\": \"消化道貫穿\",\n        \"double penetration\": \"雙重插入\",\n        \"triple penetration\": \"三重插入\",\n        \"clamp\": \"夾具\",\n        \"glory hole\": \"尋歡洞\",\n        \"machine\": \"機械奸\",\n        \"onahole\": \"飛機杯\",\n        \"pillory\": \"枷具\",\n        \"pole dancing\": \"鋼管舞\",\n        \"sex toys\": \"性玩具\",\n        \"speculum\": \"擴張器\",\n        \"strap-on\": \"穿戴式陽具\",\n        \"syringe\": \"注射器\",\n        \"tail plug\": \"尾塞\",\n        \"tube\": \"插管\",\n        \"unusual insertions\": \"異物插入\",\n        \"vacbed\": \"真空床\",\n        \"whip\": \"鞭打\",\n        \"wooden horse\": \"木馬\",\n        \"wormhole\": \"蟲洞\",\n        \"oil\": \"油\",\n        \"underwater\": \"水下\",\n        \"blood\": \"血液\",\n        \"apparel bukkake\": \"穿衣顏射\",\n        \"bukkake\": \"顏射\",\n        \"cum bath\": \"精液浴\",\n        \"giant sperm\": \"巨大精子\",\n        \"internal urination\": \"內部排尿\",\n        \"omorashi\": \"漏尿\",\n        \"public use\": \"肉便器\",\n        \"scat\": \"糞便💩\",\n        \"sweating\": \"出汗\",\n        \"urination\": \"排尿\",\n        \"chikan\": \"痴漢\",\n        \"rape\": \"強姦\",\n        \"bdsm\": \"調教\",\n        \"domination loss\": \"統治丟失\",\n        \"food on body\": \"男體盛\",\n        \"forniphilia\": \"人體傢俱\",\n        \"human cattle\": \"人類飼養\",\n        \"josou seme\": \"女裝攻\",\n        \"orgasm denial\": \"高潮禁止\",\n        \"petplay\": \"人寵\",\n        \"slave\": \"奴隸\",\n        \"smalldom\": \"逆體格差\",\n        \"tickling\": \"撓癢\",\n        \"bondage\": \"束縛\",\n        \"fanny packing\": \"人肉腰包\",\n        \"harness\": \"挽具\",\n        \"shibari\": \"捆綁\",\n        \"stuck in wall\": \"卡在牆上\",\n        \"abortion\": \"墮胎\",\n        \"cannibalism\": \"食人\",\n        \"cbt\": \"虐屌\",\n        \"dismantling\": \"拆解\",\n        \"guro\": \"獵奇\",\n        \"electric shocks\": \"電擊\",\n        \"ryona\": \"凌虐\",\n        \"snuff\": \"殺害\",\n        \"torture\": \"拷打\",\n        \"trampling\": \"踐踏\",\n        \"wrestling\": \"摔角\",\n        \"autofellatio\": \"自吹\",\n        \"clone\": \"克隆\",\n        \"masturbation\": \"自慰\",\n        \"phone sex\": \"電話性愛\",\n        \"selfcest\": \"自交\",\n        \"solo action\": \"自摸\",\n        \"table masturbation\": \"桌角自慰\",\n        \"blind\": \"失明\",\n        \"handicapped\": \"身障\",\n        \"mute\": \"啞巴\",\n        \"full tour\": \"消化道遊覽\",\n        \"cuntboy\": \"人妖♀\",\n        \"feminization\": \"女性化\",\n        \"gender change\": \"性轉換\",\n        \"gender morph\": \"女體化\",\n        \"otokofutanari\": \"扶他\",\n        \"bisexual\": \"雙性戀\",\n        \"dickgirl on male\": \"扶上男\",\n        \"first person perspective\": \"第一人稱視角\",\n        \"x-ray\": \"透視\",\n        \"blackmail\": \"要挾\",\n        \"coach\": \"教練\",\n        \"impregnation\": \"受孕\",\n        \"mesugaki\": \"雄小鬼\",\n        \"prostitution\": \"賣淫\",\n        \"teacher\": \"教師\",\n        \"tomgirl\": \"偽娘\",\n        \"tutor\": \"家庭教師\",\n        \"virginity\": \"喪失童貞\",\n        \"vtuber\": \"虛擬主播\",\n        \"widower\": \"鰥夫\",\n        \"yandere\": \"病嬌\",\n        \"yaoi\": \"男同\",\n        \"males only\": \"純男性⚣\",\n        \"pussyboys only\": \"純扶他\",\n        \"sole male\": \"單男主\",\n        \"sole pussyboy\": \"單扶他\",\n        \"cheating\": \"出軌\",\n        \"netorare\": \"NTR\",\n        \"netorase\": \"綠帽癖\",\n        \"swinging\": \"換夫\",\n        \"brother\": \"兄弟\",\n        \"cousin\": \"表兄弟\",\n        \"father\": \"父親\",\n        \"grandfather\": \"祖父\",\n        \"incest\": \"亂倫\",\n        \"inseki\": \"姻戚\",\n        \"uncle\": \"叔叔\",\n        \"exhibitionism\": \"露陰癖\",\n        \"filming\": \"攝像\",\n        \"forced exposure\": \"強制暴露\",\n        \"hidden sex\": \"隱蔽性交\",\n        \"humiliation\": \"屈辱\",\n        \"voyeurism\": \"偷窺\",\n        \"low bestiality\": \"低存在獸交\",\n        \"low guro\": \"低存在獵奇\",\n        \"low scat\": \"低存在排便\",\n        \"low shotacon\": \"低存在正太\",\n        \"low smegma\": \"低存在陰垢\",\n        \"focus anal\": \"高存在肛交\",\n        \"focus blowjob\": \"高存在口交\",\n        \"focus paizuri\": \"高存在乳交\"\n    },\n    \"female\": {\n        \"age progression\": \"年齡增長\",\n        \"age regression\": \"返老還童\",\n        \"infantilism\": \"幼稚型\",\n        \"lolicon\": \"蘿莉\",\n        \"milf\": \"熟女\",\n        \"old lady\": \"老女人\",\n        \"toddlercon\": \"幼女\",\n        \"amputee\": \"截肢\",\n        \"big muscles\": \"大肌肉\",\n        \"body modification\": \"身體改造\",\n        \"conjoined\": \"連體\",\n        \"doll joints\": \"關節娃娃\",\n        \"gijinka\": \"擬人化\",\n        \"inflation\": \"腹部膨脹\",\n        \"invisible\": \"透明\",\n        \"multiple arms\": \"多臂\",\n        \"multiple breasts\": \"多乳房\",\n        \"muscle\": \"肌肉\",\n        \"muscle growth\": \"肌肉成長\",\n        \"shapening\": \"平面化\",\n        \"stretching\": \"拉伸\",\n        \"tailjob\": \"尾交\",\n        \"wingjob\": \"翼交\",\n        \"wings\": \"翅膀\",\n        \"absorption\": \"吸收\",\n        \"futanarization\": \"扶她化\",\n        \"petrification\": \"石化\",\n        \"transformation\": \"變身\",\n        \"alien girl\": \"外星女👽\",\n        \"angel\": \"天使\",\n        \"bat girl\": \"蝙蝠娘\",\n        \"bear girl\": \"狗熊娘\",\n        \"bee girl\": \"蜂女\",\n        \"bird girl\": \"鳥娘\",\n        \"bunny girl\": \"兔女郎\",\n        \"catgirl\": \"貓女\",\n        \"centaur\": \"半人馬\",\n        \"cowgirl\": \"牛女孩\",\n        \"deer girl\": \"鹿女孩\",\n        \"demon girl\": \"惡魔女孩\",\n        \"dog girl\": \"狗女孩\",\n        \"draenei\": \"德萊尼\",\n        \"elephant girl\": \"象女孩\",\n        \"fairy\": \"仙女🧚‍♀️\",\n        \"frog girl\": \"青蛙女孩\",\n        \"fox girl\": \"狐女\",\n        \"furry\": \"毛茸茸\",\n        \"giraffe girl\": \"長頸鹿娘\",\n        \"ghost\": \"幽靈👻\",\n        \"goblin\": \"哥布林\",\n        \"harpy\": \"鳥人\",\n        \"horse girl\": \"馬女孩\",\n        \"human on furry\": \"人毛\",\n        \"hyena girl\": \"鬣狗女孩\",\n        \"insect girl\": \"昆蟲女孩\",\n        \"kappa\": \"河童\",\n        \"lizard girl\": \"蜥蜴女孩\",\n        \"mermaid\": \"美人魚🧜‍♀️\",\n        \"monkey girl\": \"猴女孩\",\n        \"monster girl\": \"魔物娘\",\n        \"mouse girl\": \"鼠女孩\",\n        \"necrophilia\": \"姦屍\",\n        \"oni\": \"鬼\",\n        \"orc\": \"半獸人\",\n        \"otter girl\": \"水獺女孩\",\n        \"panda girl\": \"熊貓娘\",\n        \"pig girl\": \"豬女\",\n        \"plant girl\": \"植物女孩\",\n        \"raccoon girl\": \"浣熊女孩\",\n        \"robot\": \"機器人🤖\",\n        \"shark girl\": \"鯊女孩\",\n        \"sheep girl\": \"羊女孩\",\n        \"slime\": \"史萊姆\",\n        \"slime girl\": \"史萊姆女孩\",\n        \"snail girl\": \"蝸牛女孩\",\n        \"snake girl\": \"蛇女\",\n        \"spider girl\": \"蜘蛛娘\",\n        \"squid girl\": \"烏賊娘\",\n        \"squirrel girl\": \"松鼠娘\",\n        \"skunk girl\": \"臭鼬娘\",\n        \"tentacles\": \"觸手\",\n        \"vampire\": \"吸血鬼🧛‍♀️\",\n        \"wolf girl\": \"狼女孩\",\n        \"zombie\": \"僵屍🧟‍♀️\",\n        \"animal on animal\": \"獸獸\",\n        \"animal on furry\": \"獸毛\",\n        \"bear\": \"熊🐻\",\n        \"bestiality\": \"獸交\",\n        \"cat\": \"貓🐈\",\n        \"cow\": \"牛🐄\",\n        \"crab\": \"螃蟹🦀\",\n        \"deer\": \"鹿🦌\",\n        \"dinosaur\": \"恐龍🦕\",\n        \"dog\": \"狗🐩\",\n        \"dolphin\": \"海豚🐬\",\n        \"donkey\": \"驢\",\n        \"dragon\": \"龍🐉\",\n        \"eel\": \"鰻魚\",\n        \"elephant\": \"象🐘\",\n        \"fish\": \"魚🐟\",\n        \"fox\": \"狐狸🦊\",\n        \"frog\": \"青蛙🐸\",\n        \"goat\": \"山羊🐐\",\n        \"horse\": \"馬🐎\",\n        \"insect\": \"昆蟲🐜\",\n        \"kangaroo\": \"袋鼠\",\n        \"lioness\": \"獅🦁\",\n        \"maggot\": \"蛆🐛\",\n        \"monkey\": \"猴🐒\",\n        \"mouse\": \"鼠🐁\",\n        \"octopus\": \"章魚🦑\",\n        \"pegasus\": \"天馬\",\n        \"pig\": \"豬🐖\",\n        \"rabbit\": \"兔🐇\",\n        \"reptile\": \"爬蟲\",\n        \"rhinoceros\": \"犀牛🦏\",\n        \"sheep\": \"綿羊🐑\",\n        \"shark\": \"鯊🦈\",\n        \"slug\": \"蛞蝓\",\n        \"snake\": \"蛇🐍\",\n        \"spider\": \"蜘蛛🕷\",\n        \"tiger\": \"虎🐅\",\n        \"turtle\": \"龜🐢\",\n        \"unicorn\": \"獨角獸🦄\",\n        \"whale\": \"鯨🐋\",\n        \"wolf\": \"狼🐺\",\n        \"worm\": \"蠕蟲\",\n        \"zebra\": \"斑馬🦓\",\n        \"giantess\": \"女巨人\",\n        \"growth\": \"巨大化\",\n        \"midget\": \"侏儒\",\n        \"minigirl\": \"迷你女孩\",\n        \"shrinking\": \"縮小\",\n        \"tall girl\": \"高個女\",\n        \"albino\": \"白化\",\n        \"body writing\": \"身體寫作\",\n        \"body painting\": \"身體繪畫\",\n        \"dark skin\": \"黑皮\",\n        \"freckles\": \"雀斑\",\n        \"gyaru\": \"辣妹\",\n        \"large tattoo\": \"全身紋身\",\n        \"lipstick mark\": \"口紅印\",\n        \"scar\": \"瘢痕\",\n        \"skinsuit\": \"人皮衣\",\n        \"tanlines\": \"曬痕\",\n        \"anorexic\": \"瘦骨嶙峋\",\n        \"bbw\": \"胖女人\",\n        \"ssbbw\": \"超級胖女人\",\n        \"weight gain\": \"體重增加\",\n        \"ahegao\": \"阿黑顏\",\n        \"beauty mark\": \"美人痣\",\n        \"brain fuck\": \"腦交🧠\",\n        \"cockslapping\": \"屌打耳光\",\n        \"crown\": \"王冠👑\",\n        \"ear fuck\": \"耳交👂\",\n        \"elf\": \"精靈🧝‍♀️\",\n        \"facesitting\": \"坐臉\",\n        \"facial hair\": \"鬍子\",\n        \"gasmask\": \"防毒面具\",\n        \"halo\": \"光環\",\n        \"headless\": \"無頭\",\n        \"hood\": \"帽兜\",\n        \"horns\": \"角\",\n        \"kemonomimi\": \"獸耳\",\n        \"kigurumi pajama\": \"動物連體睡衣\",\n        \"makeup\": \"化妝\",\n        \"masked face\": \"假面\",\n        \"mouth mask\": \"口罩\",\n        \"thick eyebrows\": \"濃眉\",\n        \"afro\": \"爆炸頭\",\n        \"bald\": \"禿頭\",\n        \"drill hair\": \"螺旋辮\",\n        \"eye-covering bang\": \"長瀏海\",\n        \"hair buns\": \"丸子頭\",\n        \"hairjob\": \"髮交\",\n        \"pixie cut\": \"精靈頭\",\n        \"ponytail\": \"馬尾辮\",\n        \"prehensile hair\": \"抓頭髮\",\n        \"shaved head\": \"光頭\",\n        \"twintails\": \"雙馬尾\",\n        \"very long hair\": \"超長髮\",\n        \"body swap\": \"換身\",\n        \"chloroform\": \"迷藥\",\n        \"corruption\": \"墮落\",\n        \"drugs\": \"藥物\",\n        \"drunk\": \"醉酒\",\n        \"emotionless sex\": \"性冷淡\",\n        \"mind break\": \"洗腦\",\n        \"mind control\": \"催眠\",\n        \"moral degeneration\": \"道德退化\",\n        \"parasite\": \"寄生\",\n        \"personality excretion\": \"人格排泄\",\n        \"possession\": \"附身\",\n        \"shared senses\": \"感官共享\",\n        \"sleeping\": \"睡覺\",\n        \"blindfold\": \"遮眼布\",\n        \"closed eyes\": \"閉眼\",\n        \"crying\": \"流淚\",\n        \"cum in eye\": \"眼射\",\n        \"dark sclera\": \"黑眼白\",\n        \"eye penetration\": \"插入眼睛\",\n        \"eyemask\": \"眼部面具\",\n        \"eyepatch\": \"眼罩\",\n        \"glasses\": \"眼鏡👓\",\n        \"heterochromia\": \"異色瞳\",\n        \"monoeye\": \"獨眼\",\n        \"sunglasses\": \"太陽眼鏡🕶\",\n        \"unusual pupils\": \"異瞳\",\n        \"nose fuck\": \"鼻交\",\n        \"nose hook\": \"鼻吊鉤\",\n        \"smell\": \"氣味\",\n        \"adventitious mouth\": \"畸位口\",\n        \"big lips\": \"大嘴唇💋\",\n        \"blowjob\": \"口交\",\n        \"blowjob face\": \"口交顏\",\n        \"braces\": \"牙套\",\n        \"burping\": \"打嗝\",\n        \"coprophagia\": \"食糞\",\n        \"deepthroat\": \"深喉\",\n        \"double blowjob\": \"一口二鳥\",\n        \"foot licking\": \"舔足\",\n        \"gag\": \"口塞\",\n        \"gokkun\": \"飲精\",\n        \"kissing\": \"接吻💏\",\n        \"long tongue\": \"長舌👅\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"piss drinking\": \"飲尿\",\n        \"rimjob\": \"舔肛\",\n        \"saliva\": \"唾液\",\n        \"smoking\": \"吸菸🚬\",\n        \"tooth brushing\": \"刷牙\",\n        \"unusual teeth\": \"異齒\",\n        \"vomit\": \"嘔吐🤮\",\n        \"vore\": \"吞食\",\n        \"asphyxiation\": \"窒息\",\n        \"collar\": \"項圈\",\n        \"hanging\": \"絞刑\",\n        \"leash\": \"狗鏈\",\n        \"armpit licking\": \"腋下舔\",\n        \"armpit sex\": \"腋交\",\n        \"hairy armpits\": \"腋毛\",\n        \"fingering\": \"指法\",\n        \"fisting\": \"拳交💪\",\n        \"gloves\": \"手套\",\n        \"handjob\": \"打手槍\",\n        \"multiple handjob\": \"多重打手槍\",\n        \"big areolae\": \"大乳暈\",\n        \"big breasts\": \"巨乳\",\n        \"breast expansion\": \"乳房膨脹\",\n        \"breast feeding\": \"哺乳\",\n        \"breast reduction\": \"乳房縮小\",\n        \"gigantic breasts\": \"極乳\",\n        \"huge breasts\": \"超乳\",\n        \"lactation\": \"母乳\",\n        \"milking\": \"擠奶\",\n        \"multiple paizuri\": \"多重乳交\",\n        \"oppai loli\": \"巨乳蘿莉\",\n        \"paizuri\": \"乳交\",\n        \"clothed paizuri\": \"穿衣乳交\",\n        \"small breasts\": \"貧乳\",\n        \"big nipples\": \"大乳頭\",\n        \"dark nipples\": \"暗色乳頭\",\n        \"dicknipples\": \"陰莖乳頭\",\n        \"inverted nipples\": \"乳頭內陷\",\n        \"multiple nipples\": \"多乳頭\",\n        \"nipple birth\": \"乳頭出產\",\n        \"nipple expansion\": \"乳頭膨脹\",\n        \"nipple fuck\": \"乳穴性交\",\n        \"nipple piercing\": \"乳頭穿孔\",\n        \"nipple stimulation\": \"乳頭刺激\",\n        \"cumflation\": \"精液膨脹\",\n        \"navel fuck\": \"肚臍奸\",\n        \"pregnant\": \"懷孕\",\n        \"stomach deformation\": \"腹部變形\",\n        \"ball-less shemale\": \"無蛋人妖\",\n        \"chastity belt\": \"貞操帶\",\n        \"crotch tattoo\": \"淫紋\",\n        \"full-packaged futanari\": \"有蛋扶她\",\n        \"genital piercing\": \"性器穿孔\",\n        \"hairy\": \"多毛\",\n        \"mesuiki\": \"干高潮\",\n        \"multiple orgasms\": \"連續高潮\",\n        \"pantyjob\": \"內褲交\",\n        \"pubic stubble\": \"陰毛渣\",\n        \"urethra insertion\": \"尿道插入\",\n        \"adventitious penis\": \"畸位陰莖\",\n        \"ball caressing\": \"揉蛋\",\n        \"balls expansion\": \"睪丸生長\",\n        \"ball sucking\": \"吸球\",\n        \"balljob\": \"球交\",\n        \"big balls\": \"大睪丸\",\n        \"big penis\": \"大根\",\n        \"cockphagia\": \"陰莖吞食\",\n        \"cock ring\": \"鎖精環\",\n        \"frottage\": \"陰莖摩擦🤺\",\n        \"horse cock\": \"馬根\",\n        \"huge penis\": \"巨根\",\n        \"multiple penises\": \"多種雞雞\",\n        \"penis birth\": \"陰莖出產\",\n        \"penis enlargement\": \"陰莖生長\",\n        \"phimosis\": \"包莖\",\n        \"prostate massage\": \"前列腺按摩\",\n        \"retractable penis\": \"可伸縮陰莖\",\n        \"smegma\": \"陰垢\",\n        \"adventitious vagina\": \"畸位陰道\",\n        \"big clit\": \"大陰蒂\",\n        \"big vagina\": \"大陰道\",\n        \"cervix penetration\": \"宮頸穿透\",\n        \"cervix prolapse\": \"宮頸脫垂\",\n        \"clit growth\": \"陰蒂生長\",\n        \"clit insertion\": \"陰蒂插入\",\n        \"clit stimulation\": \"陰蒂刺激\",\n        \"cunnilingus\": \"舔陰\",\n        \"defloration\": \"破處\",\n        \"multiple vaginas\": \"多陰道\",\n        \"tribadism\": \"磨豆腐\",\n        \"unbirth\": \"入陰\",\n        \"vaginal birth\": \"陰道出產\",\n        \"anal\": \"爆肛\",\n        \"anal birth\": \"肛門出產\",\n        \"anal intercourse\": \"肛交\",\n        \"analphagia\": \"肛門吞食\",\n        \"anal prolapse\": \"脫肛\",\n        \"ass expansion\": \"臀部膨脹\",\n        \"assjob\": \"尻交\",\n        \"big ass\": \"大屁股\",\n        \"enema\": \"灌腸\",\n        \"farting\": \"放屁\",\n        \"multiple assjob\": \"多重尻交\",\n        \"spanking\": \"打屁股\",\n        \"tail\": \"尾巴\",\n        \"tailphagia\": \"尾巴吞食\",\n        \"eggs\": \"產卵\",\n        \"gaping\": \"敞口\",\n        \"large insertions\": \"大玩具\",\n        \"nakadashi\": \"中出\",\n        \"prolapse\": \"脫垂\",\n        \"kneepit sex\": \"膝下性交\",\n        \"leg lock\": \"勾腿\",\n        \"legjob\": \"腿交\",\n        \"sumata\": \"股間性交\",\n        \"denki anma\": \"電氣按摩\",\n        \"foot insertion\": \"足插入\",\n        \"footjob\": \"足交\",\n        \"multiple footjob\": \"多重足交\",\n        \"sockjob\": \"襪交🧦\",\n        \"animegao\": \"頭殼\",\n        \"apron\": \"圍裙\",\n        \"bandages\": \"繃帶\",\n        \"vaginal sticker\": \"陰貼\",\n        \"bandaid\": \"OK繃\",\n        \"bike shorts\": \"自行車短褲\",\n        \"bikini\": \"比基尼👙\",\n        \"bloomers\": \"燈籠褲\",\n        \"bodystocking\": \"連身襪\",\n        \"bodysuit\": \"緊身衣褲\",\n        \"bride\": \"婚紗\",\n        \"business suit\": \"西裝\",\n        \"butler\": \"管家\",\n        \"cashier\": \"收銀員\",\n        \"cheerleader\": \"啦啦隊員\",\n        \"chinese dress\": \"旗袍\",\n        \"christmas\": \"聖誕裝🤶\",\n        \"clothed male nude female\": \"裸女\",\n        \"clown\": \"小丑🤡\",\n        \"condom\": \"保險套\",\n        \"corset\": \"緊身胸衣\",\n        \"cosplaying\": \"Cosplay\",\n        \"crossdressing\": \"異性裝\",\n        \"detached sleeves\": \"分離袖子\",\n        \"diaper\": \"尿布\",\n        \"dougi\": \"練功服🥋\",\n        \"exposed clothing\": \"開洞裝\",\n        \"fishnets\": \"漁網\",\n        \"fundoshi\": \"六尺褌\",\n        \"garter belt\": \"吊襪帶\",\n        \"gothic lolita\": \"哥德蘿莉裝\",\n        \"gymshorts\": \"運動短褲\",\n        \"haigure\": \"高叉裝\",\n        \"headphones\": \"頭戴式耳機\",\n        \"high heels\": \"高跟鞋\",\n        \"hijab\": \"頭巾\",\n        \"hotpants\": \"熱褲\",\n        \"kimono\": \"和服👘\",\n        \"kindergarten uniform\": \"幼兒園制服\",\n        \"kunoichi\": \"女忍裝\",\n        \"lab coat\": \"白袍\",\n        \"latex\": \"乳膠緊身衣\",\n        \"leotard\": \"緊身衣\",\n        \"lingerie\": \"情趣內衣\",\n        \"living clothes\": \"生物衣\",\n        \"magical girl\": \"魔法少女\",\n        \"maid\": \"女僕裝\",\n        \"mecha girl\": \"機娘\",\n        \"metal armor\": \"金屬盔甲\",\n        \"miko\": \"巫女裝\",\n        \"military\": \"軍裝\",\n        \"nazi\": \"納粹軍裝\",\n        \"nun\": \"修女服\",\n        \"nurse\": \"護士裝\",\n        \"painted nails\": \"美甲\",\n        \"pantyhose\": \"褲襪\",\n        \"pasties\": \"乳貼\",\n        \"piercing\": \"穿孔\",\n        \"pirate\": \"海盜服\",\n        \"policewoman\": \"警服\",\n        \"ponygirl\": \"小馬女\",\n        \"race queen\": \"賽車女郎\",\n        \"randoseru\": \"書包\",\n        \"sarashi\": \"纏胸布\",\n        \"schoolboy uniform\": \"男生制服\",\n        \"schoolgirl uniform\": \"女生制服\",\n        \"school gym uniform\": \"學校體操服\",\n        \"school swimsuit\": \"死庫水\",\n        \"scrotal lingerie\": \"陰囊袋\",\n        \"small penis\": \"小小鳥\",\n        \"shimapan\": \"條紋胖次\",\n        \"stewardess\": \"空姐服\",\n        \"stirrup legwear\": \"馬鐙褲\",\n        \"stockings\": \"長筒襪\",\n        \"straitjacket\": \"拘束衣\",\n        \"sundress\": \"夏裝\",\n        \"swimsuit\": \"泳裝\",\n        \"tabi socks\": \"足袋\",\n        \"thigh high boots\": \"高筒靴\",\n        \"tiara\": \"寶冠\",\n        \"tights\": \"厚褲襪\",\n        \"tracksuit\": \"運動服\",\n        \"transparent clothing\": \"透明服裝\",\n        \"waiter\": \"男侍者裝\",\n        \"waitress\": \"女侍者裝\",\n        \"wet clothes\": \"濕身\",\n        \"witch\": \"女巫裝\",\n        \"double anal\": \"雙插肛門\",\n        \"double vaginal\": \"雙插陰道\",\n        \"fff threesome\": \"女3P\",\n        \"fft threesome\": \"女扶女3P\",\n        \"gang rape\": \"輪姦\",\n        \"group\": \"亂交\",\n        \"harem\": \"後宮\",\n        \"layer cake\": \"夾心蛋糕\",\n        \"multiple straddling\": \"多人跨騎\",\n        \"oyakodon\": \"母女丼\",\n        \"shimaidon\": \"姐妹丼\",\n        \"triple anal\": \"三插肛門\",\n        \"triple vaginal\": \"三插陰道\",\n        \"ttf threesome\": \"扶女扶3P\",\n        \"ttt threesome\": \"扶3P\",\n        \"twins\": \"雙胞胎\",\n        \"all the way through\": \"消化道貫穿\",\n        \"double penetration\": \"雙重插入\",\n        \"triple penetration\": \"三重插入\",\n        \"clamp\": \"夾具\",\n        \"glory hole\": \"尋歡洞\",\n        \"machine\": \"機械姦\",\n        \"onahole\": \"飛機杯\",\n        \"pillory\": \"枷具\",\n        \"pole dancing\": \"鋼管舞\",\n        \"real doll\": \"充氣娃娃\",\n        \"sex toys\": \"性玩具\",\n        \"speculum\": \"擴張器\",\n        \"strap-on\": \"穿戴式陽具\",\n        \"syringe\": \"注射器\",\n        \"tail plug\": \"尾塞\",\n        \"tube\": \"插管\",\n        \"unusual insertions\": \"異物插入\",\n        \"vacbed\": \"真空床\",\n        \"whip\": \"鞭打\",\n        \"wooden horse\": \"木馬\",\n        \"wormhole\": \"蟲洞\",\n        \"oil\": \"油\",\n        \"underwater\": \"水下\",\n        \"blood\": \"血液\",\n        \"squirting\": \"潮吹\",\n        \"apparel bukkake\": \"穿衣顏射\",\n        \"bukkake\": \"顏射\",\n        \"cum bath\": \"精液浴\",\n        \"cum swap\": \"交換精液\",\n        \"giant sperm\": \"巨大精子\",\n        \"internal urination\": \"內部排尿\",\n        \"menstruation\": \"經血\",\n        \"omorashi\": \"漏尿\",\n        \"public use\": \"肉便器\",\n        \"scat\": \"糞便💩\",\n        \"scat insertion\": \"糞便插入\",\n        \"sweating\": \"出汗\",\n        \"urination\": \"排尿\",\n        \"chikan\": \"痴漢\",\n        \"rape\": \"強姦\",\n        \"bdsm\": \"調教\",\n        \"femdom\": \"女性主導\",\n        \"domination loss\": \"統治 失\",\n        \"food on body\": \"女體盛\",\n        \"forniphilia\": \"人體家具\",\n        \"human cattle\": \"人類飼養\",\n        \"orgasm denial\": \"高潮禁止\",\n        \"petplay\": \"人寵\",\n        \"slave\": \"奴隸\",\n        \"smalldom\": \"逆體格差\",\n        \"tickling\": \"抓癢\",\n        \"bondage\": \"束縛\",\n        \"fanny packing\": \"人肉腰包\",\n        \"harness\": \"挽具\",\n        \"shibari\": \"捆綁\",\n        \"stuck in wall\": \"卡在牆上\",\n        \"abortion\": \"墮胎\",\n        \"cannibalism\": \"食人\",\n        \"catfight\": \"貓斗\",\n        \"cbt\": \"虐屌\",\n        \"cuntbusting\": \"陰道破壞\",\n        \"dismantling\": \"拆解\",\n        \"guro\": \"獵奇\",\n        \"electric shocks\": \"電擊\",\n        \"ryona\": \"凌虐\",\n        \"snuff\": \"殺害\",\n        \"torture\": \"拷打\",\n        \"trampling\": \"踐踏\",\n        \"wrestling\": \"摔角\",\n        \"autofellatio\": \"自吹\",\n        \"autopaizuri\": \"自乳交\",\n        \"clone\": \"複製\",\n        \"masturbation\": \"自慰\",\n        \"phone sex\": \"電話性愛\",\n        \"selfcest\": \"自交\",\n        \"solo action\": \"自摸\",\n        \"table masturbation\": \"桌角自慰\",\n        \"blind\": \"失明\",\n        \"handicapped\": \"身障\",\n        \"mute\": \"啞巴\",\n        \"full tour\": \"消化道遊覽\",\n        \"futanari\": \"扶她\",\n        \"gender change\": \"性轉換\",\n        \"gender morph\": \"男體化\",\n        \"shemale\": \"人妖♂\",\n        \"bisexual\": \"雙性戀\",\n        \"dickgirl on dickgirl\": \"扶上扶\",\n        \"dickgirl on female\": \"扶上女\",\n        \"male on dickgirl\": \"男上扶\",\n        \"first person perspective\": \"第一人稱視角\",\n        \"x-ray\": \"透視\",\n        \"blackmail\": \"要挾\",\n        \"coach\": \"教練\",\n        \"impregnation\": \"受孕\",\n        \"mesugaki\": \"雌小鬼\",\n        \"prostitution\": \"賣淫\",\n        \"teacher\": \"教師\",\n        \"tomboy\": \"假小子\",\n        \"tutor\": \"家庭教師\",\n        \"vtuber\": \"虛擬主播\",\n        \"widow\": \"寡婦\",\n        \"yandere\": \"病嬌\",\n        \"yuri\": \"百合\",\n        \"dickgirls only\": \"純扶她\",\n        \"females only\": \"純女性⚢\",\n        \"sole dickgirl\": \"單扶她\",\n        \"sole female\": \"單女主\",\n        \"cheating\": \"出軌\",\n        \"netorare\": \"NTR\",\n        \"netorase\": \"綠帽癖\",\n        \"swinging\": \"換妻\",\n        \"aunt\": \"阿姨\",\n        \"cousin\": \"表姐妹\",\n        \"daughter\": \"女兒\",\n        \"granddaughter\": \"孫女\",\n        \"grandmother\": \"祖母\",\n        \"incest\": \"亂倫\",\n        \"inseki\": \"姻戚\",\n        \"mother\": \"母親\",\n        \"niece\": \"侄女\",\n        \"sister\": \"姐妹\",\n        \"exhibitionism\": \"露陰癖\",\n        \"filming\": \"攝影\",\n        \"forced exposure\": \"強制暴露\",\n        \"hidden sex\": \"隱蔽性交\",\n        \"humiliation\": \"屈辱\",\n        \"voyeurism\": \"偷窺\",\n        \"low bestiality\": \"低存在獸交\",\n        \"low guro\": \"低存在獵奇\",\n        \"low lolicon\": \"低存在蘿莉\",\n        \"low scat\": \"低存在排便\",\n        \"low smegma\": \"低存在陰垢\",\n        \"focus anal\": \"高存在肛交\",\n        \"focus blowjob\": \"高存在口交\",\n        \"focus paizuri\": \"高存在乳交\"\n    },\n    \"mixed\": {\n        \"animal on animal\": \"獸獸\",\n        \"body swap\": \"換身\",\n        \"multimouth blowjob\": \"多口口交\",\n        \"multiple handjob\": \"多重打手槍\",\n        \"frottage\": \"陰莖摩擦🤺\",\n        \"multiple assjob\": \"多重尻交\",\n        \"multiple footjob\": \"多重足交\",\n        \"nudism\": \"裸體主義\",\n        \"ffm threesome\": \"女男女3P\",\n        \"gang rape\": \"輪姦\",\n        \"group\": \"亂交\",\n        \"mmf threesome\": \"男女男3P\",\n        \"mmt threesome\": \"男扶男3P\",\n        \"mtf threesome\": \"男扶女3P\",\n        \"oyakodon\": \"親子丼\",\n        \"shimaidon\": \"手足丼\",\n        \"ttm threesome\": \"扶扶男3P\",\n        \"twins\": \"雙胞胎\",\n        \"incest\": \"亂倫\",\n        \"inseki\": \"姻戚\"\n    },\n    \"other\": {\n        \"yukkuri\": \"放輕鬆\",\n        \"dakimakura\": \"抱枕\",\n        \"time stop\": \"時間停止⏱️\",\n        \"3d\": \"3D\",\n        \"3d imageset\": \"3D圖片集\",\n        \"ai generated\": \"AI生成\",\n        \"anaglyph\": \"紅藍3D\",\n        \"animated\": \"動圖\",\n        \"comic\": \"西方漫畫\",\n        \"extraneous ads\": \"外部廣告\",\n        \"figure\": \"手辦\",\n        \"full color\": \"全彩\",\n        \"game manual\": \"遊戲手冊\",\n        \"game sprite\": \"像素畫\",\n        \"how to\": \"教程\",\n        \"multipanel sequence\": \"多格序列\",\n        \"multi-work series\": \"系列作品\",\n        \"non-h imageset\": \"無H圖片集\",\n        \"paperchild\": \"紙片人\",\n        \"redraw\": \"重繪\",\n        \"screenshots\": \"截圖\",\n        \"sketch lines\": \"線稿\",\n        \"stereoscopic\": \"立體圖\",\n        \"story arc\": \"故事線\",\n        \"themeless\": \"無主題\",\n        \"western cg\": \"西方CG\",\n        \"western non-h\": \"西方無H\",\n        \"western imageset\": \"西方圖集\",\n        \"uncensored\": \"無修正\",\n        \"mosaic censorship\": \"馬賽克修正\",\n        \"full censorship\": \"完全修正\",\n        \"hardcore\": \"硬核\",\n        \"non-nude\": \"無露點\",\n        \"already uploaded\": \"已上傳\",\n        \"defaced\": \"汙損\",\n        \"forbidden content\": \"禁止內容\",\n        \"realporn\": \"真人色情\",\n        \"replaced\": \"已替換\",\n        \"compilation\": \"彙編\",\n        \"incomplete\": \"缺頁\",\n        \"missing cover\": \"缺封面\",\n        \"out of order\": \"順序錯亂\",\n        \"sample\": \"樣本\",\n        \"scanmark\": \"掃描水印\",\n        \"watermarked\": \"水印\",\n        \"anthology\": \"選集\",\n        \"artbook\": \"畫集\",\n        \"goudoushi\": \"合作本\",\n        \"novel\": \"小說\",\n        \"soushuuhen\": \"總集篇\",\n        \"tankoubon\": \"單行本\",\n        \"variant set\": \"變體集\",\n        \"webtoon\": \"條漫\",\n        \"caption\": \"說明文字\",\n        \"rough grammar\": \"語法差\",\n        \"rough translation\": \"渣翻\",\n        \"nudity only\": \"僅裸體\",\n        \"no penetration\": \"無插入\"\n    }\n}\n"
  },
  {
    "path": "assets/translation.json",
    "content": "{\n  \"zh_CN\": {\n    \"Home\": \"主页\",\n    \"Favorites\": \"收藏\",\n    \"Explore\": \"发现\",\n    \"Categories\": \"分类\",\n    \"Settings\": \"设置\",\n    \"Search\": \"搜索\",\n    \"History\": \"历史\",\n    \"Local\": \"本地\",\n    \"Import\": \"导入\",\n    \"Comic Source\": \"漫画源\",\n    \"Accounts\": \"账户\",\n    \"Select a directory which contains the comic files.\": \"选择一个包含漫画文件的目录\",\n    \"Import Comics\": \"导入漫画\",\n    \"Single Comic\": \"单个漫画\",\n    \"Multiple Comics\": \"多个漫画\",\n    \"help\": \"帮助\",\n    \"Select\": \"选择\",\n    \"Selected @a comics\": \"已选择 @a 部漫画\",\n    \"Imported @a comics, loaded @b pages, received @c comics\": \"已导入 @a 部漫画, 加载 @b 页, 接收到 @c 部漫画\",\n    \"Downloading\": \"下载中\",\n    \"Back\": \"后退\",\n    \"Delete\": \"删除\",\n    \"Full Screen\": \"全屏\",\n    \"Auto Page Turning\": \"自动翻页\",\n    \"Chapters\": \"章节\",\n    \"Save Image\": \"保存图片\",\n    \"Share\": \"分享\",\n    \"Details\": \"详情\",\n    \"Copy Title\": \"复制标题\",\n    \"Add to favorites\": \"添加到收藏\",\n    \"Error\": \"错误\",\n    \"Retry\": \"重试\",\n    \"Folders\": \"文件夹\",\n    \"Delete Folder\": \"删除文件夹\",\n    \"Rename\": \"重命名\",\n    \"Reorder\": \"重新排序\",\n    \"Network\": \"网络\",\n    \"more\": \"更多\",\n    \"Select a folder\": \"选择一个文件夹\",\n    \"Folder\": \"文件夹\",\n    \"Confirm\": \"确认\",\n    \"Reversed successfully\": \"反转成功\",\n    \"Remove comic from favorite?\": \"从收藏中移除漫画？\",\n    \"Move\": \"移动\",\n    \"Move to folder\": \"移动到文件夹\",\n    \"Copy to folder\": \"复制到文件夹\",\n    \"Delete Comic\": \"删除漫画\",\n    \"Jump to Detail\": \"跳转详情\",\n    \"Delete @c comics?\": \"删除 @c 本漫画？\",\n    \"Add comic source\": \"添加漫画源\",\n    \"Delete comic source '@n' ?\": \"删除漫画源 '@n' ？\",\n    \"Select file\": \"选择文件\",\n    \"View list\": \"查看列表\",\n    \"Open help\": \"打开帮助\",\n    \"Open in Browser\": \"打开网页\",\n    \"Check updates\": \"检查更新\",\n    \"Edit\": \"编辑\",\n    \"Update\": \"更新\",\n    \"Log in\": \"登录\",\n    \"Log out\": \"注销\",\n    \"Re-login\": \"重新登录\",\n    \"Click if login expired\": \"点击此处如果登录已过期\",\n    \"Login\": \"登录\",\n    \"Username\": \"用户名\",\n    \"Password\": \"密码\",\n    \"Continue\": \"继续\",\n    \"Create Account\": \"创建账户\",\n    \"Next\": \"前进\",\n    \"Login with webview\": \"通过网页登录\",\n    \"Read\": \"阅读\",\n    \"Completed\": \"已完成\",\n    \"UnCompleted\": \"未完成\",\n    \"Filter reading status\": \"过滤阅读状态\",\n    \"Download\": \"下载\",\n    \"Favorite\": \"收藏\",\n    \"Comments\": \"评论\",\n    \"Information\": \"信息\",\n    \"Uploader\": \"上传者\",\n    \"Upload Time\": \"上传时间\",\n    \"Preview\": \"预览\",\n    \"Comment\": \"评论\",\n    \"Submit\": \"提交\",\n    \"Add\": \"添加\",\n    \"Related\": \"相关\",\n    \"New Folder\": \"新建文件夹\",\n    \"Reading\": \"阅读中\",\n    \"Appearance\": \"外观\",\n    \"Network Favorites\": \"网络收藏\",\n    \"Local Favorites\": \"本地收藏\",\n    \"Show local favorites before network favorites\": \"在网络收藏之前显示本地收藏\",\n    \"Auto close favorite panel after operation\": \"自动关闭收藏面板\",\n    \"APP\": \"应用\",\n    \"About\": \"关于\",\n    \"Display mode of comic tile\": \"漫画缩略图的显示模式\",\n    \"Detailed\": \"详细\",\n    \"Description\": \"描述\",\n    \"Brief\": \"简洁\",\n    \"Size of comic tile\": \"漫画缩略图的大小\",\n    \"Explore Pages\": \"探索页面\",\n    \"Category Pages\": \"分类页面\",\n    \"Show favorite status on comic tile\": \"在漫画缩略图上显示收藏状态\",\n    \"Show history on comic tile\": \"在漫画缩略图上显示历史记录\",\n    \"Keyword blocking\": \"关键词屏蔽\",\n    \"Comment keyword blocking\": \"评论关键词屏蔽\",\n    \"Tap to turn Pages\": \"点击翻页\",\n    \"Page animation\": \"页面动画\",\n    \"Reading mode\": \"阅读模式\",\n    \"Gallery (Left to Right)\": \"画廊（从左到右）\",\n    \"Gallery (Right to Left)\": \"画廊（从右到左）\",\n    \"Gallery (Top to Bottom)\": \"画廊（从上到下）\",\n    \"Continuous (Left to Right)\": \"连续（从左到右）\",\n    \"Continuous (Right to Left)\": \"连续（从右到左）\",\n    \"Continuous (Top to Bottom)\": \"连续（从上到下）\",\n    \"Auto page turning interval\": \"自动翻页间隔\",\n    \"The number of pic in screen for landscape (Only Gallery Mode)\": \"横屏同屏幕图片数量(仅画廊模式)\",\n    \"The number of pic in screen for portrait (Only Gallery Mode)\": \"竖屏同屏幕图片数量(仅画廊模式)\",\n    \"Theme Mode\": \"主题模式\",\n    \"System\": \"系统\",\n    \"Light\": \"浅色\",\n    \"Dark\": \"深色\",\n    \"Theme Color\": \"主题颜色\",\n    \"Red\": \"红色\",\n    \"Pink\": \"粉色\",\n    \"Purple\": \"紫色\",\n    \"Green\": \"绿色\",\n    \"Orange\": \"橙色\",\n    \"Blue\": \"蓝色\",\n    \"App\": \"应用\",\n    \"Data\": \"数据\",\n    \"Storage Path for local comics\": \"本地漫画的存储路径\",\n    \"Set New Storage Path\": \"设置新的存储路径\",\n    \"Set\": \"设置\",\n    \"Cache Size\": \"缓存大小\",\n    \"Clear Cache\": \"清除缓存\",\n    \"Clear\": \"清除\",\n    \"Log\": \"日志\",\n    \"Open Log\": \"打开日志\",\n    \"Open\": \"打开\",\n    \"User\": \"用户\",\n    \"Language\": \"语言\",\n    \"Proxy\": \"代理\",\n    \"Venera is a free and open-source app for comic reading.\": \"Venera是一个免费的开源漫画阅读应用。\",\n    \"Check for updates\": \"检查更新\",\n    \"Check\": \"检查\",\n    \"Network Favorite Pages\": \"网络收藏页面\",\n    \"Block\": \"屏蔽\",\n    \"Add new favorite to\": \"添加新收藏到\",\n    \"Move favorite after reading\": \"阅读后移动收藏\",\n    \"Delete folder?\": \"删除文件夹?\",\n    \"Delete folder '@f' ?\": \"删除文件夹 '@f' ?\",\n    \"Import from file\": \"从文件导入\",\n    \"Failed to import\": \"导入失败\",\n    \"Cache Limit\": \"缓存限制\",\n    \"Set Cache Limit\": \"设置缓存限制\",\n    \"Size in MB\": \"大小（MB）\",\n    \"Select a directory which contains the comic directories.\": \"选择一个包含漫画文件夹的目录\",\n    \"Help\": \"帮助\",\n    \"Export as cbz\": \"导出为cbz\",\n    \"Select an archive file (cbz, zip, 7z, cb7)\": \"选择一个归档文件 (cbz, zip, 7z, cb7)\",\n    \"An archive file\": \"一个归档文件\",\n    \"Fullscreen\": \"全屏\",\n    \"Exit\": \"退出\",\n    \"View more\": \"查看更多\",\n    \"Sort\": \"排序\",\n    \"Name\": \"名称\",\n    \"Date\": \"日期\",\n    \"Date Desc\": \"日期降序\",\n    \"Start\": \"开始\",\n    \"Export App Data\": \"导出应用数据\",\n    \"Import App Data\": \"导入应用数据\",\n    \"Export\": \"导出\",\n    \"Download Threads\": \"下载线程数\",\n    \"Update Time\": \"更新时间\",\n    \"Copy ID\": \"复制ID\",\n    \"Copy URL\": \"复制URL\",\n    \"Create\": \"创建\",\n    \"Folder Name\": \"文件夹名称\",\n    \"Ranking\": \"排行\",\n    \"Download Selected\": \"下载选中\",\n    \"Download All\": \"下载全部\",\n    \"Order\": \"顺序\",\n    \"minAppVersion @version is required\": \"需要最低App版本 @version\",\n    \"Remove\": \"移除\",\n    \"Long press to zoom\": \"长按缩放\",\n    \"Updates Available\": \"更新可用\",\n    \"Unselected\": \"未选择\",\n    \"Long press and drag to reorder.\": \"长按并拖动以重新排序。\",\n    \"Limit image width\": \"限制图片宽度\",\n    \"When using Continuous(Top to Bottom) mode\": \"当使用连续（从上到下）模式\",\n    \"Open link\": \"打开链接\",\n    \"Open comic\": \"打开漫画\",\n    \"Move To First\": \"移动到最前\",\n    \"Cancel\": \"取消\",\n    \"Paused\": \"已暂停\",\n    \"Pause\": \"暂停\",\n    \"Operation\": \"操作\",\n    \"Upload\": \"上传\",\n    \"Saved\": \"已保存\",\n    \"Saved Failed\": \"保存失败\",\n    \"Sync Data\": \"同步数据\",\n    \"Syncing Data\": \"正在同步数据\",\n    \"Data Sync\": \"数据同步\",\n    \"Skip Setting Fields\": \"跳过设置项\",\n    \"Skip Setting Fields (Optional)\": \"跳过设置项（可选）\",\n    \"When sync data, skip certain setting fields, which means these won't be uploaded / override.\": \"同步时跳过指定设置项，这些项不会被上传或覆盖。\",\n    \"See source code for available fields.\": \"可用的设置项名称详见源码。\",\n    \"Quick Favorite\": \"快速收藏\",\n    \"Long press on the favorite button to quickly add to this folder\": \"长按收藏按钮快速添加到这个文件夹\",\n    \"Added\": \"已添加\",\n    \"Turn page by volume keys\": \"使用音量键翻页\",\n    \"Display time & battery info in reader\": \"在阅读器中显示时间和电量信息\",\n    \"EhViewer downloads\": \"EhViewer下载\",\n    \"Select an EhViewer database and a download folder.\": \"选择EhViewer的下载数据（导出的db文件）与存放下载内容的目录\",\n    \"(EhViewer)Default\": \"(EhViewer)默认\",\n    \"If you import an EhViewer's database, program will automatically create folders according to the download label in that database.\": \"若通过EhViewer数据库导入漫画，程序将会按其中的下载标签自动创建收藏文件夹。\",\n    \"Restore local downloads\": \"恢复本地下载\",\n    \"Scan the current local path and restore the local database.\": \"扫描当前本地路径并恢复本地数据库。\",\n    \"Local path not found\": \"未找到本地路径\",\n    \"Multi-Select\": \"进入多选模式\",\n    \"Exit Multi-Select\": \"退出多选模式\",\n    \"Selected @c comics\": \"已选择 @c 本漫画\",\n    \"Select All\": \"全选\",\n    \"Deselect\": \"取消选择\",\n    \"Invert Selection\": \"反选\",\n    \"Select in range\": \"区间选择\",\n    \"Finished\": \"已完成\",\n    \"Updating\": \"更新中\",\n    \"Update Comics Info\": \"更新漫画信息\",\n    \"Create Folder\": \"新建文件夹\",\n    \"Select an image on screen\": \"选择屏幕上的图片\",\n    \"Added @count comics to download queue.\": \"已添加 @count 本漫画到下载队列\",\n    \"Authorization Required\": \"需要身份验证\",\n    \"Sync\": \"同步\",\n    \"The folder is Linked to @source\": \"文件夹已关联到 @source\",\n    \"Source Folder\": \"源文件夹\",\n    \"Use a config file\": \"使用配置文件\",\n    \"Comic Source list\": \"漫画源列表\",\n    \"View\": \"查看\",\n    \"Copy\": \"复制\",\n    \"Copied\": \"已复制\",\n    \"Search History\": \"搜索历史\",\n    \"Clear Search History\": \"清除搜索历史\",\n    \"Search in\": \"搜索于\",\n    \"Clear History\": \"清除历史\",\n    \"Are you sure you want to clear your history?\": \"确定要清除您的历史记录吗？\",\n    \"No Explore Pages\": \"没有探索页面\",\n    \"Please add some sources\": \"请添加一些源\",\n    \"Please check your settings\": \"请检查您的设置\",\n    \"No Category Pages\": \"没有分类页面\",\n    \"Group @group\": \"第 @group 组\",\n    \"Chapter @ep\": \"第 @ep 章\",\n    \"Page @page\": \"第 @page 页\",\n    \"Remove local favorite and history\": \"删除本地收藏和历史记录\",\n    \"Also remove files on disk\": \"同时删除磁盘上的文件\",\n    \"Copy to app local path\": \"将漫画复制到本地存储目录中\",\n    \"Delete all unavailable local favorite items\": \"删除所有无效的本地收藏\",\n    \"Deleted @a favorite items.\": \"已删除 @a 条无效收藏\",\n    \"New version available\": \"有新版本可用\",\n    \"A new version is available. Do you want to update now?\": \"有新版本可用。您要现在更新吗？\",\n    \"No new version available\": \"没有新版本可用\",\n    \"Export as pdf\": \"导出为pdf\",\n    \"Export as epub\": \"导出为epub\",\n    \"Aggregated Search\": \"聚合搜索\",\n    \"Local comic collection is not supported at present\": \"本地收藏暂不支持\",\n    \"The cover cannot be uncollected here\": \"封面不能在此取消收藏\",\n    \"Uncollected the image\": \"取消收藏图片\",\n    \"Successfully collected\": \"收藏成功\",\n    \"Collect the image\": \"收藏图片\",\n    \"Quick collect image\": \"快速收藏图片\",\n    \"Not enable\": \"不启用\",\n    \"Double Tap\": \"双击\",\n    \"Swipe\": \"滑动\",\n    \"On the image browsing page, you can quickly collect images by sliding horizontally or vertically according to your reading mode\": \"在图片浏览页面, 你可以根据你的阅读模式横滑或者竖滑快速收藏图片\",\n    \"Calculate your favorite from @a comics and @b images\": \"从 @a 本漫画和 @b 张图片中, 计算你最喜欢的\",\n    \"After the parentheses are the number of pictures or the number of pictures compared to the number of comic pages\": \"括号后是图片数量或图片数比漫画页数\",\n    \"The chapter order of the comic may have changed, temporarily not supported for collection\": \"漫画的章节顺序可能发生了变化, 暂不支持收藏此章节\",\n    \"Author: \": \"作者: \",\n    \"Tags: \": \"标签: \",\n    \"Comics(number): \": \"漫画(数量): \",\n    \"Comics(percentage): \": \"漫画(比例): \",\n    \"Time Filter\": \"时间筛选\",\n    \"Image Favorites Greater Than\": \"图片收藏数大于\",\n    \"Collection time\": \"收藏时间\",\n    \"favoritesCompareComicPages\": \"收藏数与漫画页数比较\",\n    \"Cover\": \"封面\",\n    \"Page @a\": \"第 @a 页\",\n    \"Time Asc\": \"时间升序\",\n    \"Time Desc\": \"时间降序\",\n    \"Favorite Num\": \"收藏数\",\n    \"Favorite Num Compare Comic Pages\": \"收藏数比漫画页数\",\n    \"All\": \"全部\",\n    \"Last Week\": \"上周\",\n    \"Last Month\": \"上月\",\n    \"Last Half Year\": \"半年\",\n    \"Last Year\": \"一年\",\n    \"Filter\": \"筛选\",\n    \"Image Favorites\": \"图片收藏\",\n    \"Title\": \"标题\",\n    \"@a Cover\": \"@a 封面\",\n    \"Photo View\": \"图片浏览\",\n    \"Delete @a images\": \"删除 @a 张图片\",\n    \"Update the page number by the latest collection\": \"按最新收藏更新页数\",\n    \"Copy the title successfully\": \"复制标题成功\",\n    \"The comic is invalid, please long press to delete, you can double click the title to copy\": \"该漫画已失效, 请长按删除, 可以双击标题进行复制\",\n    \"No search results found\": \"未找到搜索结果\",\n    \"Added @c comics to download queue.\": \"已添加 @c 本漫画到下载队列\",\n    \"Download started\": \"下载已开始\",\n    \"Click favorite\": \"点击收藏\",\n    \"End\": \"末尾\",\n    \"None\": \"无\",\n    \"View Detail\": \"查看详情\",\n    \"Select a directory which contains multiple archive files.\": \"选择一个包含多个归档文件的目录\",\n    \"Multiple archive files\": \"多个归档文件\",\n    \"No valid comics found\": \"未找到有效的漫画\",\n    \"Enable DNS Overrides\": \"启用DNS覆写\",\n    \"DNS Overrides\": \"DNS覆写\",\n    \"Custom Image Processing\": \"自定义图片处理\",\n    \"Enable\": \"启用\",\n    \"Aggregated\": \"聚合\",\n    \"Default Search Target\": \"默认搜索目标\",\n    \"Auto Language Filters\": \"自动语言筛选\",\n    \"Check for updates on startup\": \"启动时检查更新\",\n    \"Start Time\": \"开始时间\",\n    \"End Time\": \"结束时间\",\n    \"Custom\": \"自定义\",\n    \"Reset\": \"重置\",\n    \"Tags\": \"标签\",\n    \"Authors\": \"作者\",\n    \"Comics\": \"漫画\",\n    \"Imported @a comics\": \"已导入 @a 本漫画\",\n    \"New Version\": \"新版本\",\n    \"@c updates\": \"@c 项更新\",\n    \"No updates\": \"无更新\",\n    \"Set comic source list url\": \"设置漫画源列表URL\",\n    \"Deselect All\": \"取消全选\",\n    \"Add keyword\": \"添加关键词\",\n    \"Keyword\": \"关键词\",\n    \"Manage\": \"管理\",\n    \"Verify\": \"验证\",\n    \"Cloudflare verification required\": \"需要Cloudflare验证\",\n    \"Success\": \"成功\",\n    \"Compressing\": \"压缩中\",\n    \"Exporting\": \"导出中\",\n    \"Search Sources\": \"搜索源\",\n    \"Removed\": \"已移除\",\n    \"Added to favorites\": \"已添加到收藏\",\n    \"Not added\": \"未添加\",\n    \"Create a folder\": \"新建收藏夹\",\n    \"Created successfully\": \"创建成功\",\n    \"name\": \"名称\",\n    \"Reverse tap to turn Pages\": \"反转点击翻页\",\n    \"Show all\": \"显示全部\",\n    \"Number of images preloaded\": \"预加载图片数量\",\n    \"Ascending\": \"升序\",\n    \"Descending\": \"降序\",\n    \"Last Reading\": \"上次阅读\",\n    \"Replies\": \"回复\",\n    \"Follow Updates\": \"追更\",\n    \"Not Configured\": \"未配置\",\n    \"Choose a folder to follow updates.\": \"选择一个文件夹以追更\",\n    \"Choose Folder\": \"选择文件夹\",\n    \"No folders available\": \"没有可用的文件夹\",\n    \"Updating comics...\": \"更新漫画中...\",\n    \"Automatic update checking enabled.\": \"已启用自动更新检查\",\n    \"The app will check for updates at most once a day.\": \"APP将每天最多检查一次更新\",\n    \"Change Folder\": \"更改文件夹\",\n    \"Check Now\": \"立即检查\",\n    \"Updates\": \"更新\",\n    \"No updates found\": \"未找到更新\",\n    \"All Comics\": \"全部漫画\",\n    \"The comic will be marked as no updates as soon as you read it.\": \"漫画将在您阅读后立即标记为无更新\",\n    \"Disable\": \"禁用\",\n    \"Once the operation is successful, app will automatically sync data with the server.\": \"操作成功后, APP将自动与服务器同步数据\",\n    \"Cache cleared\": \"缓存已清除\",\n    \"Disabled\": \"已禁用\",\n    \"Auto Sync Data\": \"自动同步数据\",\n    \"Mark all as read\": \"全部标记为已读\",\n    \"Do you want to mark all as read?\": \"您要全部标记为已读吗？\",\n    \"Swipe down for previous chapter\": \"向下滑动查看上一章\",\n    \"Swipe up for next chapter\": \"向上滑动查看下一章\",\n    \"Initial Page\": \"初始页面\",\n    \"Home Page\": \"主页\",\n    \"Favorites Page\": \"收藏页面\",\n    \"Explore Page\": \"探索页面\",\n    \"Categories Page\": \"分类页面\",\n    \"Convert to local\": \"转换为本地\",\n    \"Refresh\": \"刷新\",\n    \"Refresh Info\": \"刷新信息\",\n    \"Refresh Success\": \"刷新成功\",\n    \"Refresh Failed\": \"刷新失败\",\n    \"Refresh All Histories\": \"刷新所有历史记录\",\n    \"Refreshing Histories\": \"正在刷新历史记录\",\n    \"Refresh Completed: Success @success, Failed @failed, Skipped @skipped\": \"刷新完成: 成功 @success, 失败 @failed, 跳过 @skipped\",\n    \"Close\": \"关闭\",\n    \"Paging\": \"分页\",\n    \"Continuous\": \"连续\",\n    \"Display mode of comic list\": \"漫画列表的显示模式\",\n    \"Show Page Number\": \"显示页码\",\n    \"Show Chapter Comments\": \"显示章节评论\",\n    \"Show Comments at Chapter End\": \"章节末尾显示评论\",\n    \"No comments yet\": \"暂无评论\",\n    \"Chapter Comments\": \"章节评论\",\n    \"Jump to page\": \"跳转到页面\",\n    \"Page\": \"页面\",\n    \"Jump\": \"跳转\",\n    \"Copy Image\": \"复制图片\",\n    \"A valid WebDav directory URL\": \"有效的WebDav目录URL\",\n    \"Shut Down\": \"关闭\",\n    \"Uploading data...\": \"正在上传数据...\",\n    \"Pages\": \"页数\",\n    \"Long press zoom position\": \"长按缩放位置\",\n    \"Press position\": \"按压位置\",\n    \"Screen center\": \"屏幕中心\",\n    \"Suggestions\": \"建议\",\n    \"Do not report any issues related to sources to App repo.\": \"请不要向App仓库报告任何与源相关的问题\",\n    \"Show single image on first page\": \"在首页显示单张图片\",\n    \"Show system status bar\": \"显示系统状态栏\",\n    \"Click to select an image\": \"点击选择一张图片\",\n    \"Repo URL\": \"仓库地址\",\n    \"The URL should point to a 'index.json' file\": \"该URL应指向一个'index.json'文件\",\n    \"Double tap to zoom\": \"双击缩放\",\n    \"Clear Unfavorited\": \"清除未收藏\",\n    \"Reverse\": \"反转\",\n    \"Delete Chapters\": \"删除章节\",\n    \"Open Folder\": \"打开文件夹\",\n    \"Path copied to clipboard\": \"路径已复制到剪贴板\",\n    \"Reverse default chapter order\": \"反转默认章节顺序\",\n    \"Reload Configs\": \"重新加载配置文件\",\n    \"Reload\": \"重载\",\n    \"Disable Length Limitation\": \"禁用长度限制\",\n    \"Only valid for this run\": \"仅对本次运行有效\",\n    \"Logs\": \"日志\",\n    \"Export logs\": \"导出日志\",\n    \"Clear specific reader settings for all comics\": \"清除所有漫画的特殊阅读设置\",\n    \"Clear specific reader settings for this comic\": \"清除该漫画的特殊阅读设置\",\n    \"Enable comic specific settings\": \"启用此漫画特定设置\",\n    \"Clear specific reader settings for this device\": \"清除该设备的特殊阅读设置\",\n    \"Enable device specific settings\": \"启用此设备特定设置\",\n    \"Ignore Certificate Errors\": \"忽略证书错误\",\n    \"Mouse scroll speed\": \"鼠标滚动速度\"\n  },\n  \"zh_TW\": {\n    \"Home\": \"首頁\",\n    \"Favorites\": \"收藏\",\n    \"Explore\": \"探索\",\n    \"Categories\": \"分類\",\n    \"Settings\": \"設定\",\n    \"Search\": \"搜尋\",\n    \"History\": \"歷史\",\n    \"Local\": \"本機\",\n    \"Import\": \"匯入\",\n    \"Comic Source\": \"漫畫源\",\n    \"Accounts\": \"帳戶\",\n    \"Related\": \"相關\",\n    \"Select a directory which contains the comic files.\": \"選擇一個包含漫畫文件的目錄\",\n    \"Import Comics\": \"匯入漫畫\",\n    \"Single Comic\": \"單部漫畫\",\n    \"Multiple Comics\": \"多部漫畫\",\n    \"help\": \"幫助\",\n    \"Select\": \"選擇\",\n    \"Selected @a comics\": \"已選擇 @a 部漫畫\",\n    \"Imported @a comics, loaded @b pages, received @c comics\": \"已匯入 @a 部漫畫, 載入 @b 頁, 接收到 @c 部漫畫\",\n    \"Downloading\": \"下載中\",\n    \"Back\": \"後退\",\n    \"Delete\": \"刪除\",\n    \"Full Screen\": \"全螢幕\",\n    \"Auto Page Turning\": \"自動翻頁\",\n    \"Chapters\": \"章節\",\n    \"Save Image\": \"儲存圖片\",\n    \"Share\": \"分享\",\n    \"Details\": \"詳情\",\n    \"Description\": \"描述\",\n    \"Copy Title\": \"複製標題\",\n    \"Add to favorites\": \"加入收藏\",\n    \"Error\": \"錯誤\",\n    \"Retry\": \"重試\",\n    \"Folders\": \"資料夾\",\n    \"Delete Folder\": \"刪除資料夾\",\n    \"Rename\": \"重新命名\",\n    \"Reorder\": \"重新排序\",\n    \"Network\": \"網路\",\n    \"more\": \"更多\",\n    \"Select a folder\": \"選擇一個資料夾\",\n    \"Folder\": \"資料夾\",\n    \"Confirm\": \"確認\",\n    \"Remove comic from favorite?\": \"從收藏中移除漫畫？\",\n    \"Move\": \"移動\",\n    \"Move to folder\": \"移動到資料夾\",\n    \"Copy to folder\": \"複製到資料夾\",\n    \"Jump to Detail\": \"跳轉詳情​​\",\n    \"Delete Comic\": \"刪除漫畫\",\n    \"Delete @c comics?\": \"刪除 @c 本漫畫？\",\n    \"Add comic source\": \"添加漫畫源\",\n    \"Delete comic source '@n' ?\": \"刪除漫畫源 '@n' ？\",\n    \"Select file\": \"選擇文件\",\n    \"View list\": \"查看列表\",\n    \"Open help\": \"打開幫助\",\n    \"Open in Browser\": \"打開網頁\",\n    \"Check updates\": \"檢查更新\",\n    \"Edit\": \"編輯\",\n    \"Update\": \"更新\",\n    \"Log in\": \"登入\",\n    \"Log out\": \"登出\",\n    \"Re-login\": \"重新登入\",\n    \"Click if login expired\": \"點擊此處如果登入已過期\",\n    \"Login\": \"登入\",\n    \"Username\": \"使用者名稱\",\n    \"Password\": \"密碼\",\n    \"Continue\": \"繼續\",\n    \"Create Account\": \"建立帳戶\",\n    \"Next\": \"前進\",\n    \"Login with webview\": \"透過網頁登入\",\n    \"Read\": \"閱讀\",\n    \"Completed\": \"已完成\",\n    \"UnCompleted\": \"未完成\",\n    \"Filter reading status\": \"過濾閱讀狀態\",\n    \"Download\": \"下載\",\n    \"Favorite\": \"收藏\",\n    \"Comments\": \"評論\",\n    \"Information\": \"資訊\",\n    \"Uploader\": \"上傳者\",\n    \"Upload Time\": \"上傳時間\",\n    \"Preview\": \"預覽\",\n    \"Comment\": \"評論\",\n    \"Submit\": \"提交\",\n    \"Add\": \"添加\",\n    \"New Folder\": \"建立資料夾\",\n    \"Reading\": \"閱讀中\",\n    \"Appearance\": \"外觀\",\n    \"Network Favorites\": \"網路收藏\",\n    \"Local Favorites\": \"本機收藏\",\n    \"Show local favorites before network favorites\": \"在網路收藏之前顯示本機收藏\",\n    \"Auto close favorite panel after operation\": \"自動關閉收藏面板\",\n    \"APP\": \"應用\",\n    \"About\": \"關於\",\n    \"Display mode of comic tile\": \"漫畫縮圖的顯示模式\",\n    \"Detailed\": \"詳細\",\n    \"Brief\": \"簡潔\",\n    \"Size of comic tile\": \"漫畫縮圖的大小\",\n    \"Explore Pages\": \"探索頁面\",\n    \"Category Pages\": \"分類頁面\",\n    \"Show favorite status on comic tile\": \"在漫畫縮圖上顯示收藏狀態\",\n    \"Show history on comic tile\": \"在漫畫縮圖上顯示歷史記錄\",\n    \"Keyword blocking\": \"關鍵字封鎖\",\n    \"Comment keyword blocking\": \"評論關鍵字封鎖\",\n    \"Tap to turn Pages\": \"點擊翻頁\",\n    \"Page animation\": \"頁面動畫\",\n    \"Reading mode\": \"閱讀模式\",\n    \"Gallery (Left to Right)\": \"畫廊（從左到右）\",\n    \"Gallery (Right to Left)\": \"畫廊（從右到左）\",\n    \"Gallery (Top to Bottom)\": \"畫廊（從上到下）\",\n    \"Continuous (Left to Right)\": \"連續（從左到右）\",\n    \"Continuous (Right to Left)\": \"連續（從右到左）\",\n    \"Continuous (Top to Bottom)\": \"連續（從上到下）\",\n    \"Auto page turning interval\": \"自動翻頁間隔\",\n    \"The number of pic in screen for landscape (Only Gallery Mode)\": \"橫向同螢幕圖片數量(僅畫廊模式)\",\n    \"The number of pic in screen for portrait (Only Gallery Mode)\": \"直向同螢幕圖片數量(僅畫廊模式)\",\n    \"Theme Mode\": \"主題模式\",\n    \"System\": \"系統\",\n    \"Light\": \"淺色\",\n    \"Dark\": \"深色\",\n    \"Theme Color\": \"主題顏色\",\n    \"Red\": \"紅色\",\n    \"Pink\": \"粉色\",\n    \"Purple\": \"紫色\",\n    \"Green\": \"綠色\",\n    \"Orange\": \"橙色\",\n    \"Blue\": \"藍色\",\n    \"App\": \"應用\",\n    \"Data\": \"資料\",\n    \"Storage Path for local comics\": \"本機漫畫的儲存路徑\",\n    \"Set New Storage Path\": \"設定新的儲存路徑\",\n    \"Set\": \"設定\",\n    \"Cache Size\": \"快取大小\",\n    \"Clear Cache\": \"清除快取\",\n    \"Clear\": \"清除\",\n    \"Log\": \"日誌\",\n    \"Open Log\": \"打開日誌\",\n    \"Open\": \"打開\",\n    \"User\": \"使用者\",\n    \"Language\": \"語言\",\n    \"Proxy\": \"代理\",\n    \"Venera is a free and open-source app for comic reading.\": \"Venera是一個免費的開源漫畫閱讀應用。\",\n    \"Check for updates\": \"檢查更新\",\n    \"Check\": \"檢查\",\n    \"Network Favorite Pages\": \"網路收藏頁面\",\n    \"Block\": \"封鎖\",\n    \"Add new favorite to\": \"添加新收藏到\",\n    \"Move favorite after reading\": \"閱讀後移動收藏\",\n    \"Delete folder?\": \"刪除資料夾？\",\n    \"Delete folder '@f' ?\": \"刪除資料夾 '@f' ？\",\n    \"Import from file\": \"從文件匯入\",\n    \"Failed to import\": \"匯入失敗\",\n    \"Cache Limit\": \"快取限制\",\n    \"Set Cache Limit\": \"設定快取限制\",\n    \"Size in MB\": \"大小（MB）\",\n    \"Select a directory which contains the comic directories.\": \"選擇一個包含漫畫資料夾的目錄\",\n    \"Help\": \"幫助\",\n    \"Export as cbz\": \"匯出為cbz\",\n    \"Select an archive file (cbz, zip, 7z, cb7)\": \"選擇一個歸檔文件 (cbz, zip, 7z, cb7)\",\n    \"An archive file\": \"一個歸檔文件\",\n    \"Fullscreen\": \"全螢幕\",\n    \"Exit\": \"退出\",\n    \"View more\": \"查看更多\",\n    \"Sort\": \"排序\",\n    \"Name\": \"名稱\",\n    \"Date\": \"日期\",\n    \"Date Desc\": \"日期降序\",\n    \"Start\": \"開始\",\n    \"Reversed successfully\": \"反轉成功\",\n    \"Export App Data\": \"匯出應用資料\",\n    \"Import App Data\": \"匯入應用資料\",\n    \"Export\": \"匯出\",\n    \"Download Threads\": \"下載執行緒數\",\n    \"Update Time\": \"更新時間\",\n    \"Copy ID\": \"複製ID\",\n    \"Copy URL\": \"複製URL\",\n    \"Create\": \"建立\",\n    \"Folder Name\": \"資料夾名稱\",\n    \"Ranking\": \"排行\",\n    \"Download Selected\": \"下載選中\",\n    \"Download All\": \"下載全部\",\n    \"Order\": \"順序\",\n    \"minAppVersion @version is required\": \"需要最低App版本 @version\",\n    \"Remove\": \"移除\",\n    \"Long press to zoom\": \"長按縮放\",\n    \"Updates Available\": \"更新可用\",\n    \"Unselected\": \"未選擇\",\n    \"Long press and drag to reorder.\": \"長按並拖動以重新排序。\",\n    \"Limit image width\": \"限製圖片寬度\",\n    \"When using Continuous(Top to Bottom) mode\": \"當使用連續（從上到下）模式\",\n    \"Open link\": \"打開連結\",\n    \"Open comic\": \"打開漫畫\",\n    \"Move To First\": \"移動到最前\",\n    \"Cancel\": \"取消\",\n    \"Paused\": \"已暫停\",\n    \"Pause\": \"暫停\",\n    \"Operation\": \"操作\",\n    \"Upload\": \"上傳\",\n    \"Saved\": \"已儲存\",\n    \"Saved Failed\": \"儲存失敗\",\n    \"Sync Data\": \"同步資料\",\n    \"Syncing Data\": \"正在同步資料\",\n    \"Data Sync\": \"資料同步\",\n    \"Skip Setting Fields\": \"跳過設定項\",\n    \"Skip Setting Fields (Optional)\": \"跳過設定項（可選）\",\n    \"When sync data, skip certain setting fields, which means these won't be uploaded / override.\": \"同步時跳過指定設定項，這些項不會被上傳或覆寫。\",\n    \"See source code for available fields.\": \"可用的設定項名稱詳見源碼。\",\n    \"Quick Favorite\": \"快速收藏\",\n    \"Long press on the favorite button to quickly add to this folder\": \"長按收藏按鈕快速添加到這個資料夾\",\n    \"Added\": \"已添加\",\n    \"Turn page by volume keys\": \"使用音量鍵翻頁\",\n    \"Display time & battery info in reader\": \"在閱讀器中顯示時間和電量資訊\",\n    \"EhViewer downloads\": \"EhViewer下載\",\n    \"Select an EhViewer database and a download folder.\": \"選擇EhViewer的下載資料（匯出的db檔案）與存放下載內容的目錄\",\n    \"(EhViewer)Default\": \"(EhViewer)預設\",\n    \"If you import an EhViewer's database, program will automatically create folders according to the download label in that database.\": \"若透過EhViewer資料庫匯入漫畫，程式將會按其中的下載標籤自動建立收藏資料夾。\",\n    \"Restore local downloads\": \"恢復本機下載\",\n    \"Scan the current local path and restore the local database.\": \"掃描目前本機路徑並恢復本機資料庫。\",\n    \"Local path not found\": \"找不到本機路徑\",\n    \"Multi-Select\": \"進入多選模式\",\n    \"Exit Multi-Select\": \"退出多選模式\",\n    \"Selected @c comics\": \"已選擇 @c 本漫畫\",\n    \"Select All\": \"全選\",\n    \"Deselect\": \"取消選擇\",\n    \"Invert Selection\": \"反選\",\n    \"Select in range\": \"區間選擇\",\n    \"Finished\": \"已完成\",\n    \"Updating\": \"更新中\",\n    \"Update Comics Info\": \"更新漫畫資訊\",\n    \"Create Folder\": \"建立資料夾\",\n    \"Select an image on screen\": \"選擇螢幕上的圖片\",\n    \"Added @count comics to download queue.\": \"已添加 @count 本漫畫到下載佇列\",\n    \"Authorization Required\": \"需要身份驗證\",\n    \"Sync\": \"同步\",\n    \"The folder is Linked to @source\": \"資料夾已關聯到 @source\",\n    \"Source Folder\": \"來源資料夾\",\n    \"Use a config file\": \"使用設定檔\",\n    \"Comic Source list\": \"漫畫源列表\",\n    \"View\": \"查看\",\n    \"Copy\": \"複製\",\n    \"Copied\": \"已複製\",\n    \"Search History\": \"搜尋歷史\",\n    \"Clear Search History\": \"清除搜尋歷史\",\n    \"Search in\": \"搜尋於\",\n    \"Clear History\": \"清除歷史\",\n    \"Are you sure you want to clear your history?\": \"確定要清除您的歷史記錄嗎？\",\n    \"No Explore Pages\": \"沒有探索頁面\",\n    \"Please add some sources\": \"請添加一些源\",\n    \"Please check your settings\": \"請檢查您的設定\",\n    \"No Category Pages\": \"沒有分類頁面\",\n    \"Group @group\": \"第 @group 組\",\n    \"Chapter @ep\": \"第 @ep 章\",\n    \"Page @page\": \"第 @page 頁\",\n    \"Remove local favorite and history\": \"刪除本機收藏和歷史記錄\",\n    \"Also remove files on disk\": \"同時刪除磁碟上的文件\",\n    \"Copy to app local path\": \"將漫畫複製到本機儲存目錄中\",\n    \"Delete all unavailable local favorite items\": \"刪除所有無效的本機收藏\",\n    \"Deleted @a favorite items.\": \"已刪除 @a 條無效收藏\",\n    \"New version available\": \"有新版本可用\",\n    \"A new version is available. Do you want to update now?\": \"有新版本可用。您要現在更新嗎？\",\n    \"No new version available\": \"沒有新版本可用\",\n    \"Export as pdf\": \"匯出為pdf\",\n    \"Export as epub\": \"匯出為epub\",\n    \"Aggregated Search\": \"聚合搜尋\",\n    \"No search results found\": \"未找到搜尋結果\",\n    \"Added @c comics to download queue.\": \"已添加 @c 本漫畫到下載佇列\",\n    \"Download started\": \"下載已開始\",\n    \"Click favorite\": \"點擊收藏\",\n    \"Local comic collection is not supported at present\": \"本機收藏暫不支援\",\n    \"The cover cannot be uncollected here\": \"封面不能在此取消收藏\",\n    \"Uncollected the image\": \"取消收藏圖片\",\n    \"Successfully collected\": \"收藏成功\",\n    \"Collect the image\": \"收藏圖片\",\n    \"Quick collect image\": \"快速收藏圖片\",\n    \"On the image browsing page, you can quickly collect images by sliding horizontally or vertically according to your reading mode\": \"在圖片瀏覽頁面, 你可以根據你的閱讀模式橫向或者縱向滑動快速收藏圖片\",\n    \"Calculate your favorite from @a comics and @b images\": \"從 @a 本漫畫和 @b 張圖片中, 計算你最喜歡的\",\n    \"After the parentheses are the number of pictures or the number of pictures compared to the number of comic pages\": \"括號後是圖片數量或圖片數比漫畫頁數\",\n    \"The chapter order of the comic may have changed, temporarily not supported for collection\": \"漫畫的章節順序可能發生了變化, 暫不支援收藏此章節\",\n    \"Author: \": \"作者: \",\n    \"Tags: \": \"標籤: \",\n    \"Comics(number): \": \"漫畫(數量): \",\n    \"Comics(percentage): \": \"漫畫(比例): \",\n    \"Time Filter\": \"時間篩選\",\n    \"Image Favorites Greater Than\": \"圖片收藏數大於\",\n    \"Collection time\": \"收藏時間\",\n    \"Not enable\": \"不啟用\",\n    \"Double Tap\": \"雙擊\",\n    \"Swipe\": \"滑動\",\n    \"favoritesCompareComicPages\": \"收藏數與漫畫頁數比較\",\n    \"Cover\": \"封面\",\n    \"Page @a\": \"第 @a 頁\",\n    \"Time Asc\": \"時間升序\",\n    \"Time Desc\": \"時間降序\",\n    \"Favorite Num\": \"收藏數\",\n    \"Favorite Num Compare Comic Pages\": \"收藏數比漫畫頁數\",\n    \"All\": \"全部\",\n    \"Last Week\": \"上週\",\n    \"Last Month\": \"上月\",\n    \"Last Half Year\": \"半年\",\n    \"Last Year\": \"一年\",\n    \"Filter\": \"篩選\",\n    \"Image Favorites\": \"圖片收藏\",\n    \"Title\": \"標題\",\n    \"@a Cover\": \"@a 封面\",\n    \"Photo View\": \"圖片瀏覽\",\n    \"Delete @a images\": \"刪除 @a 張圖片\",\n    \"Update the page number by the latest collection\": \"按最新收藏更新頁數\",\n    \"Copy the title successfully\": \"複製標題成功\",\n    \"The comic is invalid, please long press to delete, you can double click the title to copy\": \"該漫畫已失效, 請長按刪除, 可以雙擊標題進行複製\",\n    \"End\": \"末尾\",\n    \"None\": \"無\",\n    \"View Detail\": \"查看詳情\",\n    \"Select a directory which contains multiple archive files.\": \"選擇一個包含多個歸檔文件的目錄\",\n    \"Multiple archive files\": \"多個歸檔文件\",\n    \"No valid comics found\": \"未找到有效的漫畫\",\n    \"Enable DNS Overrides\": \"啟用DNS覆寫\",\n    \"DNS Overrides\": \"DNS覆寫\",\n    \"Custom Image Processing\": \"自訂圖片處理\",\n    \"Enable\": \"啟用\",\n    \"Aggregated\": \"聚合\",\n    \"Default Search Target\": \"預設搜尋目標\",\n    \"Auto Language Filters\": \"自動語言篩選\",\n    \"Check for updates on startup\": \"啟動時檢查更新\",\n    \"Start Time\": \"開始時間\",\n    \"End Time\": \"結束時間\",\n    \"Custom\": \"自訂\",\n    \"Reset\": \"重設\",\n    \"Tags\": \"標籤\",\n    \"Authors\": \"作者\",\n    \"Comics\": \"漫畫\",\n    \"Imported @a comics\": \"已匯入 @a 部漫畫\",\n    \"New Version\": \"新版本\",\n    \"@c updates\": \"@c 項更新\",\n    \"No updates\": \"無更新\",\n    \"Set comic source list url\": \"設定漫畫源列表URL\",\n    \"Deselect All\": \"取消全選\",\n    \"Add keyword\": \"添加關鍵字\",\n    \"Keyword\": \"關鍵字\",\n    \"Manage\": \"管理\",\n    \"Verify\": \"驗證\",\n    \"Cloudflare verification required\": \"需要Cloudflare驗證\",\n    \"Success\": \"成功\",\n    \"Compressing\": \"壓縮中\",\n    \"Exporting\": \"匯出中\",\n    \"Search Sources\": \"搜尋源\",\n    \"Removed\": \"已移除\",\n    \"Added to favorites\": \"已添加到收藏\",\n    \"Not added\": \"未添加\",\n    \"Create a folder\": \"建立收藏夾\",\n    \"Created successfully\": \"建立成功\",\n    \"name\": \"名稱\",\n    \"Reverse tap to turn Pages\": \"反轉點擊翻頁\",\n    \"Show all\": \"顯示全部\",\n    \"Number of images preloaded\": \"預載入圖片數量\",\n    \"Ascending\": \"升序\",\n    \"Descending\": \"降序\",\n    \"Last Reading\": \"上次閱讀\",\n    \"Replies\": \"回覆\",\n    \"Follow Updates\": \"追更\",\n    \"Not Configured\": \"未配置\",\n    \"Choose a folder to follow updates.\": \"選擇一個資料夾以追更\",\n    \"Choose Folder\": \"選擇資料夾\",\n    \"No folders available\": \"沒有可用的資料夾\",\n    \"Updating comics...\": \"更新漫畫中...\",\n    \"Automatic update checking enabled.\": \"已啟用自動更新檢查\",\n    \"The app will check for updates at most once a day.\": \"APP將每天最多檢查一次更新\",\n    \"Change Folder\": \"更改資料夾\",\n    \"Check Now\": \"立即檢查\",\n    \"Updates\": \"更新\",\n    \"No updates found\": \"未找到更新\",\n    \"All Comics\": \"全部漫畫\",\n    \"The comic will be marked as no updates as soon as you read it.\": \"漫畫將在您閱讀後立即標記為無更新\",\n    \"Disable\": \"停用\",\n    \"Once the operation is successful, app will automatically sync data with the server.\": \"操作成功後, APP將自動與伺服器同步資料\",\n    \"Cache cleared\": \"快取已清除\",\n    \"Disabled\": \"已停用\",\n    \"Auto Sync Data\": \"自動同步資料\",\n    \"Mark all as read\": \"全部標記為已讀\",\n    \"Do you want to mark all as read?\": \"您要全部標記為已讀嗎？\",\n    \"Swipe down for previous chapter\": \"向下滑動查看上一章\",\n    \"Swipe up for next chapter\": \"向上滑動查看下一章\",\n    \"Initial Page\": \"初始頁面\",\n    \"Home Page\": \"首頁\",\n    \"Favorites Page\": \"收藏頁面\",\n    \"Explore Page\": \"探索頁面\",\n    \"Categories Page\": \"分類頁面\",\n    \"Convert to local\": \"轉換為本地\",\n    \"Refresh\": \"刷新\",\n    \"Refresh Info\": \"刷新資訊\",\n    \"Refresh Success\": \"刷新成功\",\n    \"Refresh Failed\": \"刷新失敗\",\n    \"Refresh All Histories\": \"刷新所有歷史記錄\",\n    \"Refreshing Histories\": \"正在刷新歷史記錄\",\n    \"Refresh Completed: Success @success, Failed @failed, Skipped @skipped\": \"刷新完成: 成功 @success, 失敗 @failed, 跳過 @skipped\",\n    \"Close\": \"關閉\",\n    \"Paging\": \"分頁\",\n    \"Continuous\": \"連續\",\n    \"Display mode of comic list\": \"漫畫列表的顯示模式\",\n    \"Show Page Number\": \"顯示頁碼\",\n    \"Show Chapter Comments\": \"顯示章節評論\",\n    \"Show Comments at Chapter End\": \"章節末尾顯示評論\",\n    \"No comments yet\": \"暫無評論\",\n    \"Chapter Comments\": \"章節評論\",\n    \"Jump to page\": \"跳轉到頁面\",\n    \"Page\": \"頁面\",\n    \"Jump\": \"跳轉\",\n    \"Copy Image\": \"複製圖片\",\n    \"A valid WebDav directory URL\": \"有效的WebDav目錄URL\",\n    \"Shut Down\": \"關閉\",\n    \"Uploading data...\": \"正在上傳數據...\",\n    \"Pages\": \"頁數\",\n    \"Long press zoom position\": \"長按縮放位置\",\n    \"Press position\": \"按壓位置\",\n    \"Screen center\": \"螢幕中心\",\n    \"Suggestions\": \"建議\",\n    \"Do not report any issues related to sources to App repo.\": \"請不要向App倉庫報告任何與源相關的問題\",\n    \"Show single image on first page\": \"在首頁顯示單張圖片\",\n    \"Show system status bar\": \"顯示系統狀態欄\",\n    \"Click to select an image\": \"點擊選擇一張圖片\",\n    \"Repo URL\": \"倉庫地址\",\n    \"The URL should point to a 'index.json' file\": \"該URL應指向一個'index.json'文件\",\n    \"Double tap to zoom\": \"雙擊縮放\",\n    \"Clear Unfavorited\": \"清除未收藏\",\n    \"Reverse\": \"反轉\",\n    \"Delete Chapters\": \"刪除章節\",\n    \"Open Folder\": \"打開資料夾\",\n    \"Path copied to clipboard\": \"路徑已複製到剪貼簿\",\n    \"Reverse default chapter order\": \"反轉預設章節順序\",\n    \"Reload Configs\": \"重新載入設定檔\",\n    \"Reload\": \"重載\",\n    \"Disable Length Limitation\": \"禁用長度限制\",\n    \"Only valid for this run\": \"僅對本次運行有效\",\n    \"Logs\": \"日誌\",\n    \"Export logs\": \"匯出日誌\",\n    \"Clear specific reader settings for all comics\": \"清除所有漫畫的特殊閱讀設定\",\n    \"Clear specific reader settings for this comic\": \"清除該漫畫的特殊閱讀設定\",\n    \"Enable comic specific settings\": \"啟用此漫畫特定設定\",\n    \"Clear specific reader settings for this device\": \"清除該裝置的特殊閱讀設定\",\n    \"Enable device specific settings\": \"啟用此裝置特定設定\",\n    \"Ignore Certificate Errors\": \"忽略證書錯誤\",\n    \"Mouse scroll speed\": \"滑鼠滾動速度\"\n  }\n}\n"
  },
  {
    "path": "debian/build.py",
    "content": "import subprocess\nimport sys\n\narch = sys.argv[1]\ndebianContent = ''\ndesktopContent = ''\nversion = ''\n\nwith open('debian/debian.yaml', 'r') as f:\n    debianContent = f.read()\nwith open('debian/gui/venera.desktop', 'r') as f:\n    desktopContent = f.read()\nwith open('pubspec.yaml', 'r') as f:\n    version = str.split(str.split(f.read(), 'version: ')[1], '+')[0]\n\nwith open('debian/debian.yaml', 'w') as f:\n    content = debianContent.replace('{{Version}}', version)\n    if arch == 'x64':\n        content = content.replace('{{Arch}}', 'x64')\n        content = content.replace('{{Architecture}}', 'amd64')\n    elif arch == 'arm64':\n        content = content.replace('{{Arch}}', 'arm64')\n        content = content.replace('{{Architecture}}', 'arm64')\n    f.write(content)\nwith open('debian/gui/venera.desktop', 'w') as f:\n    f.write(desktopContent.replace('{{Version}}', version))\n\nsubprocess.run([\"flutter\", \"build\", \"linux\"])\n\nsubprocess.run([\"$HOME/.pub-cache/bin/flutter_to_debian\"], shell=True)\n\nwith open('debian/debian.yaml', 'w') as f:\n    f.write(debianContent)\nwith open('debian/gui/venera.desktop', 'w') as f:\n    f.write(desktopContent)\n"
  },
  {
    "path": "debian/debian.yaml",
    "content": "flutter_app: \n  command: venera\n  arch: {{Arch}}\n  parent: /usr/local/lib\n  nonInteractive: true\n\ncontrol:\n  Package: venera\n  Version: {{Version}}\n  Architecture: {{Architecture}}\n  Priority: optional\n  Depends: libwebkit2gtk-4.1-0, libgtk-3-0\n  Maintainer: nyne\n  Description: venera\n  \n#options:\n#  exec_out_dir: debian/packages"
  },
  {
    "path": "debian/gui/venera.desktop",
    "content": "[Desktop Entry]\nName=Venera\nGenericName=Venera\nComment=venera\nTerminal=false\nType=Application\nCategories=Utility\nKeywords=Flutter;comic;images;\nIcon=venera"
  },
  {
    "path": "doc/comic_source.md",
    "content": "# Comic Source\n\n## Introduction\n\nVenera is a comic reader that can read comics from various sources. \n\nAll comic sources are written in javascript. \nVenera uses [flutter_qjs](https://github.com/wgh136/flutter_qjs) as js engine which is forked from [ekibun](https://github.com/ekibun/flutter_qjs).\n\nThis document will describe how to write a comic source for Venera.\n\n## Comic Source List\n\nVenera can display a list of comic sources in the app.\n\nYou can use the following repo url:\n```\nhttps://cdn.jsdelivr.net/gh/venera-app/venera-configs@main/index.json\n```\nThe repo is maintained by the Venera team.\n\n> The link is a mirror of the original repo. To contribute your comic source, please visit the [original repo](https://github.com/venera-app/venera-configs)\n\nYou should provide a repository url to let the app load the comic source list.\nThe url should point to a JSON file that contains the list of comic sources.\n\nThe JSON file should have the following format:\n\n```json\n[\n  {\n    \"name\": \"Source Name\",\n    \"url\": \"https://example.com/source.js\",\n    \"filename\": \"Relative path to the source file\",\n    \"version\": \"1.0.0\",\n    \"description\": \"A brief description of the source\"\n  }\n]\n```\n\nOnly one of `url` and `filename` should be provided.\nThe description field is optional.\n\n## Create a Comic Source\n\n### Preparation\n\n- Install Venera. Using flutter to run the project is recommended since it's easier to debug.\n- An editor that supports javascript.\n- Download template and venera javascript api from [here](https://github.com/venera-app/venera-configs).\n\n### Start Writing\n\nThe template contains detailed comments and examples. You can refer to it when writing your own comic source.\n\nHere is a brief introduction to the template:\n\n> Note: Javascript api document is [here](js_api.md).\n\n#### Write basic information\n\n```javascript\nclass NewComicSource extends ComicSource {\n    // Note: The fields which are marked as [Optional] should be removed if not used\n\n    // name of the source\n    name = \"\"\n\n    // unique id of the source\n    key = \"\"\n\n    version = \"1.0.0\"\n\n    minAppVersion = \"1.0.0\"\n\n    // update url\n    url = \"\"\n// ...\n}\n```\n\nIn this part, you need to do the following:\n- Change the class name to your source name.\n- Fill in the name, key, version, minAppVersion, and url fields.\n\n#### init function\n\n```javascript\n    /**\n     * [Optional] init function\n     */\n    init() {\n\n    }\n```\n\nThe function will be called when the source is initialized. You can do some initialization work here.\n\nRemove this function if not used.\n\n#### Account\n\n```javascript\n// [Optional] account related\n    account = {\n        /**\n         * [Optional] login with account and password, return any value to indicate success\n         * @param account {string}\n         * @param pwd {string}\n         * @returns {Promise<any>}\n         */\n        login: async (account, pwd) => {\n\n        },\n\n        /**\n         * [Optional] login with webview\n         */\n        loginWithWebview: {\n            url: \"\",\n            /**\n             * check login status\n             * @param url {string} - current url\n             * @param title {string} - current title\n             * @returns {boolean} - return true if login success\n             */\n            checkStatus: (url, title) => {\n\n            },\n            /**\n             * [Optional] Callback when login success\n             */\n            onLoginSuccess: () => {\n\n            },\n        },\n\n        /**\n         * [Optional] login with cookies\n         * Note: If `this.account.login` is implemented, this will be ignored\n         */\n        loginWithCookies: {\n            fields: [\n                \"ipb_member_id\",\n                \"ipb_pass_hash\",\n                \"igneous\",\n                \"star\",\n            ],\n            /**\n             * Validate cookies, return false if cookies are invalid.\n             *\n             * Use `Network.setCookies` to set cookies before validate.\n             * @param values {string[]} - same order as `fields`\n             * @returns {Promise<boolean>}\n             */\n            validate: async (values) => {\n\n            },\n        },\n\n        /**\n         * logout function, clear account related data\n         */\n        logout: () => {\n\n        },\n\n        // {string?} - register url\n        registerWebsite: null\n    }\n```\n\nIn this part, you can implement login, logout, and register functions.\n\nRemove this part if not used.\n\n#### Explore page\n\n```javascript\n    // explore page list\n    explore = [\n        {\n            // title of the page.\n            // title is used to identify the page, it should be unique\n            title: \"\",\n\n            /// multiPartPage or multiPageComicList or mixed\n            type: \"multiPartPage\",\n\n            /**\n             * load function\n             * @param page {number | null} - page number, null for `singlePageWithMultiPart` type\n             * @returns {{}}\n             * - for `multiPartPage` type, return {title: string, comics: Comic[], viewMore: string?}[]\n             * - for `multiPageComicList` type, for each page(1-based), return {comics: Comic[], maxPage: number}\n             * - for `mixed` type, use param `page` as index. for each index(0-based), return {data: [], maxPage: number?}, data is an array contains Comic[] or {title: string, comics: Comic[], viewMore: string?}\n             */\n            load: async (page) => {\n\n            },\n\n            /**\n             * Only use for `multiPageComicList` type.\n             * `loadNext` would be ignored if `load` function is implemented.\n             * @param next {string | null} - next page token, null if first page\n             * @returns {Promise<{comics: Comic[], next: string?}>} - next is null if no next page.\n             */\n            loadNext(next) {},\n        }\n    ]\n```\n\nIn this part, you can implement the explore page.\n\nA comic source can have multiple explore pages.\n\nThere are three types of explore pages:\n- multiPartPage: An explore page contains multiple parts, each part contains multiple comics.\n- multiPageComicList: An explore page contains multiple comics, the comics are loaded page by page.\n- mixed: An explore page contains multiple parts, each part can be a list of comics or a block of comics which have a title and a view more button.\n\n#### Category Page\n\n```javascript\n    // categories\n    category = {\n        /// title of the category page, used to identify the page, it should be unique\n        title: \"\",\n        parts: [\n            {\n                // title of the part\n                name: \"Theme\",\n\n                // fixed or random\n                // if random, need to provide `randomNumber` field, which indicates the number of comics to display at the same time\n                type: \"fixed\",\n\n                // number of comics to display at the same time\n                // randomNumber: 5,\n\n                categories: [\"All\", \"Adventure\", \"School\"],\n\n                // category or search\n                // if `category`, use categoryComics.load to load comics\n                // if `search`, use search.load to load comics\n                itemType: \"category\",\n\n                // [Optional] {string[]?} must have same length as categories, used to provide loading param for each category\n                categoryParams: [\"all\", \"adventure\", \"school\"],\n\n                // [Optional] {string} cannot be used with `categoryParams`, set all category params to this value\n                groupParam: null,\n            }\n        ],\n        // enable ranking page\n        enableRankingPage: false,\n    }\n```\n\nCategory page is a static page that contains multiple parts, each part contains multiple categories.\n\nA comic source can only have one category page.\n\n#### Category Comics Page\n\n```javascript\n    /// category comic loading related\n    categoryComics = {\n        /**\n         * load comics of a category\n         * @param category {string} - category name\n         * @param param {string?} - category param\n         * @param options {string[]} - options from optionList\n         * @param page {number} - page number\n         * @returns {Promise<{comics: Comic[], maxPage: number}>}\n         */\n        load: async (category, param, options, page) => {\n\n        },\n        // provide options for category comic loading\n        optionList: [\n            {\n                // For a single option, use `-` to separate the value and text, left for value, right for text\n                options: [\n                    \"newToOld-New to Old\",\n                    \"oldToNew-Old to New\"\n                ],\n                // [Optional] {string[]} - show this option only when the value not in the list\n                notShowWhen: null,\n                // [Optional] {string[]} - show this option only when the value in the list\n                showWhen: null\n            }\n        ],\n        ranking: {\n            // For a single option, use `-` to separate the value and text, left for value, right for text\n            options: [\n                \"day-Day\",\n                \"week-Week\"\n            ],\n            /**\n             * load ranking comics\n             * @param option {string} - option from optionList\n             * @param page {number} - page number\n             * @returns {Promise<{comics: Comic[], maxPage: number}>}\n             */\n            load: async (option, page) => {\n\n            }\n        }\n    }\n```\n\nWhen user clicks on a category, the category comics page will be displayed.\n\nThis part is used to load comics of a category.\n\n#### Search\n\n```javascript\n    /// search related\n    search = {\n        /**\n         * load search result\n         * @param keyword {string}\n         * @param options {(string | null)[]} - options from optionList\n         * @param page {number}\n         * @returns {Promise<{comics: Comic[], maxPage: number}>}\n         */\n        load: async (keyword, options, page) => {\n\n        },\n\n        /**\n         * load search result with next page token.\n         * The field will be ignored if `load` function is implemented.\n         * @param keyword {string}\n         * @param options {(string)[]} - options from optionList\n         * @param next {string | null}\n         * @returns {Promise<{comics: Comic[], maxPage: number}>}\n         */\n        loadNext: async (keyword, options, next) => {\n\n        },\n\n        // provide options for search\n        optionList: [\n            {\n                // [Optional] default is `select`\n                // type: select, multi-select, dropdown\n                // For select, there is only one selected value\n                // For multi-select, there are multiple selected values or none. The `load` function will receive a json string which is an array of selected values\n                // For dropdown, there is one selected value at most. If no selected value, the `load` function will receive a null\n                type: \"select\",\n                // For a single option, use `-` to separate the value and text, left for value, right for text\n                options: [\n                    \"0-time\",\n                    \"1-popular\"\n                ],\n                // option label\n                label: \"sort\",\n                // default selected options\n                default: null,\n            }\n        ],\n\n        // enable tags suggestions\n        enableTagsSuggestions: false,\n        // [Optional] handle tag suggestion click\n        onTagSuggestionSelected: (namespace, tag) => {\n            // return the text to insert into search box\n            return `${namespace}:${tag}`\n        },\n    }\n```\n\nThis part is used to load search results.\n\n`load` and `loadNext` functions are used to load search results. \nIf `load` function is implemented, `loadNext` function will be ignored.\n\n#### Favorites\n\n```javascript\n    // favorite related\n    favorites = {\n        // whether support multi folders\n        multiFolder: false,\n        /**\n         * add or delete favorite.\n         * throw `Login expired` to indicate login expired, App will automatically re-login and re-add/delete favorite\n         * @param comicId {string}\n         * @param folderId {string}\n         * @param isAdding {boolean} - true for add, false for delete\n         * @param favoriteId {string?} - [Comic.favoriteId]\n         * @returns {Promise<any>} - return any value to indicate success\n         */\n        addOrDelFavorite: async (comicId, folderId, isAdding, favoriteId) => {\n            \n        },\n        /**\n         * load favorite folders.\n         * throw `Login expired` to indicate login expired, App will automatically re-login retry.\n         * if comicId is not null, return favorite folders which contains the comic.\n         * @param comicId {string?}\n         * @returns {Promise<{folders: {[p: string]: string}, favorited: string[]}>} - `folders` is a map of folder id to folder name, `favorited` is a list of folder id which contains the comic\n         */\n        loadFolders: async (comicId) => {\n\n        },\n        /**\n         * add a folder\n         * @param name {string}\n         * @returns {Promise<any>} - return any value to indicate success\n         */\n        addFolder: async (name) => {\n\n        },\n        /**\n         * delete a folder\n         * @param folderId {string}\n         * @returns {Promise<void>} - return any value to indicate success\n         */\n        deleteFolder: async (folderId) => {\n\n        },\n        /**\n         * load comics in a folder\n         * throw `Login expired` to indicate login expired, App will automatically re-login retry.\n         * @param page {number}\n         * @param folder {string?} - folder id, null for non-multi-folder\n         * @returns {Promise<{comics: Comic[], maxPage: number}>}\n         */\n        loadComics: async (page, folder) => {\n\n        },\n        /**\n         * load comics with next page token\n         * @param next {string | null} - next page token, null for first page\n         * @param folder {string}\n         * @returns {Promise<{comics: Comic[], next: string?}>}\n         */\n        loadNext: async (next, folder) => {\n\n        },\n    }\n```\n\nThis part is used to manage network favorites of the source.\n\n`load` and `loadNext` functions are used to load search results.\nIf `load` function is implemented, `loadNext` function will be ignored.\n\n#### Comic Details\n\n```javascript\n    /// single comic related\n    comic = {\n        /**\n         * load comic info\n         * @param id {string}\n         * @returns {Promise<ComicDetails>}\n         */\n        loadInfo: async (id) => {\n\n        },\n        /**\n         * [Optional] load thumbnails of a comic\n         *\n         * To render a part of an image as thumbnail, return `${url}@x=${start}-${end}&y=${start}-${end}`\n         * - If width is not provided, use full width\n         * - If height is not provided, use full height\n         * @param id {string}\n         * @param next {string?} - next page token, null for first page\n         * @returns {Promise<{thumbnails: string[], next: string?}>} - `next` is next page token, null for no more\n         */\n        loadThumbnails: async (id, next) => {\n\n        },\n\n        /**\n         * rate a comic\n         * @param id\n         * @param rating {number} - [0-10] app use 5 stars, 1 rating = 0.5 stars,\n         * @returns {Promise<any>} - return any value to indicate success\n         */\n        starRating: async (id, rating) => {\n\n        },\n\n        /**\n         * load images of a chapter\n         * @param comicId {string}\n         * @param epId {string?}\n         * @returns {Promise<{images: string[]}>}\n         */\n        loadEp: async (comicId, epId) => {\n\n        },\n        /**\n         * [Optional] provide configs for an image loading\n         * @param url\n         * @param comicId\n         * @param epId\n         * @returns {ImageLoadingConfig | Promise<ImageLoadingConfig>}\n         */\n        onImageLoad: (url, comicId, epId) => {\n            return {}\n        },\n        /**\n         * [Optional] provide configs for a thumbnail loading\n         * @param url {string}\n         * @returns {ImageLoadingConfig | Promise<ImageLoadingConfig>}\n         *\n         * `ImageLoadingConfig.modifyImage` and `ImageLoadingConfig.onLoadFailed` will be ignored.\n         * They are not supported for thumbnails.\n         */\n        onThumbnailLoad: (url) => {\n            return {}\n        },\n        /**\n         * [Optional] like or unlike a comic\n         * @param id {string}\n         * @param isLike {boolean} - true for like, false for unlike\n         * @returns {Promise<void>}\n         */\n        likeComic: async (id, isLike) =>  {\n\n        },\n        /**\n         * [Optional] load comments\n         *\n         * Since app version 1.0.6, rich text is supported in comments.\n         * Following html tags are supported: ['a', 'b', 'i', 'u', 's', 'br', 'span', 'img'].\n         * span tag supports style attribute, but only support font-weight, font-style, text-decoration.\n         * All images will be placed at the end of the comment.\n         * Auto link detection is enabled, but only http/https links are supported.\n         * @param comicId {string}\n         * @param subId {string?} - ComicDetails.subId\n         * @param page {number}\n         * @param replyTo {string?} - commentId to reply, not null when reply to a comment\n         * @returns {Promise<{comments: Comment[], maxPage: number?}>}\n         */\n        loadComments: async (comicId, subId, page, replyTo) => {\n\n        },\n        /**\n         * [Optional] send a comment, return any value to indicate success\n         * @param comicId {string}\n         * @param subId {string?} - ComicDetails.subId\n         * @param content {string}\n         * @param replyTo {string?} - commentId to reply, not null when reply to a comment\n         * @returns {Promise<any>}\n         */\n        sendComment: async (comicId, subId, content, replyTo) => {\n\n        },\n        /**\n         * [Optional] load chapter comments\n         * \n         * Chapter comments are displayed in the reader.\n         * Same rich text support as loadComments.\n         * \n         * Note: To control reply functionality:\n         * - If a comment does not support replies, set its `id` to null/undefined\n         * - Or set its `replyCount` to null/undefined\n         * - The reply button will only show when both `id` and `replyCount` are present\n         * \n         * @param comicId {string}\n         * @param epId {string} - chapter id\n         * @param page {number}\n         * @param replyTo {string?} - commentId to reply, not null when reply to a comment\n         * @returns {Promise<{comments: Comment[], maxPage: number?}>}\n         * \n         * @example\n         * // Example for comments without reply support:\n         * return {\n         *   comments: data.list.map(e => ({\n         *     userName: e.user_name,\n         *     avatar: e.user_avatar,\n         *     content: e.comment,\n         *     time: e.create_at,\n         *     replyCount: null,  // or undefined - no reply support\n         *     id: null,          // or undefined - no reply support\n         *   })),\n         *   maxPage: Math.ceil(total / 20)\n         * }\n         */\n        loadChapterComments: async (comicId, epId, page, replyTo) => {\n\n        },\n        /**\n         * [Optional] send a chapter comment, return any value to indicate success\n         * @param comicId {string}\n         * @param epId {string} - chapter id\n         * @param content {string}\n         * @param replyTo {string?} - commentId to reply, not null when reply to a comment\n         * @returns {Promise<any>}\n         */\n        sendChapterComment: async (comicId, epId, content, replyTo) => {\n\n        },\n        /**\n         * [Optional] like or unlike a comment\n         * @param comicId {string}\n         * @param subId {string?} - ComicDetails.subId\n         * @param commentId {string}\n         * @param isLike {boolean} - true for like, false for unlike\n         * @returns {Promise<void>}\n         */\n        likeComment: async (comicId, subId, commentId, isLike) => {\n\n        },\n        /**\n         * [Optional] vote a comment\n         * @param id {string} - comicId\n         * @param subId {string?} - ComicDetails.subId\n         * @param commentId {string} - commentId\n         * @param isUp {boolean} - true for up, false for down\n         * @param isCancel {boolean} - true for cancel, false for vote\n         * @returns {Promise<number>} - new score\n         */\n        voteComment: async (id, subId, commentId, isUp, isCancel) => {\n\n        },\n        // {string?} - regex string, used to identify comic id from user input\n        idMatch: null,\n        /**\n         * [Optional] Handle tag click event\n         * @param namespace {string}\n         * @param tag {string}\n         * @returns {{action: string, keyword: string, param: string?}}\n         */\n        onClickTag: (namespace, tag) => {\n\n        },\n        /**\n         * [Optional] Handle links\n         */\n        link: {\n            /**\n             * set accepted domains\n             */\n            domains: [\n                'example.com'\n            ],\n            /**\n             * parse url to comic id\n             * @param url {string}\n             * @returns {string | null}\n             */\n            linkToId: (url) => {\n\n            }\n        },\n        // enable tags translate\n        enableTagsTranslate: false,\n    }\n\n```\n\nThis part is used to load comic details.\n\n#### Settings\n\n```javascript\n    /*\n    [Optional] settings related\n    Use this.loadSetting to load setting\n    ```\n    let setting1Value = this.loadSetting('setting1')\n    console.log(setting1Value)\n    ```\n     */\n    settings = {\n        setting1: {\n            // title\n            title: \"Setting1\",\n            // type: input, select, switch\n            type: \"select\",\n            // options\n            options: [\n                {\n                    // value\n                    value: 'o1',\n                    // [Optional] text, if not set, use value as text\n                    text: 'Option 1',\n                },\n            ],\n            default: 'o1',\n        },\n        setting2: {\n            title: \"Setting2\",\n            type: \"switch\",\n            default: true,\n        },\n        setting3: {\n            title: \"Setting3\",\n            type: \"input\",\n            validator: null, // string | null, regex string\n            default: '',\n        },\n        setting4: {\n            title: \"Setting4\",\n            type: \"callback\",\n            buttonText: \"Click me\",\n            /**\n             * callback function\n             *\n             * If the callback function returns a Promise, the button will show a loading indicator until the promise is resolved.\n             * @returns {void | Promise<any>}\n             */\n            callback: () => {\n                // do something\n            }\n        }\n    }\n```\n\nThis part is used to provide settings for the source.\n\n\n#### Translations\n\n```javascript\n    // [Optional] translations for the strings in this config\n    translation = {\n        'zh_CN': {\n            'Setting1': '设置1',\n            'Setting2': '设置2',\n            'Setting3': '设置3',\n        },\n        'zh_TW': {},\n        'en': {}\n    }\n```\n\nThis part is used to provide translations for the source.\n\n> Note: strings in the UI api will not be translated automatically. You need to translate them manually.\n"
  },
  {
    "path": "doc/headless_doc.md",
    "content": "# Venera Headless Mode\n\nVenera's headless mode allows you to run key features from the command line, making it easy to automate tasks and integrate with other tools. This document outlines the available commands and their usage.\n\n## How to Use\n\nTo activate headless mode, use the `--headless` flag when running the Venera executable, followed by the desired command.\n\n```bash\nvenera --headless <command> [subcommand] [options]\n```\n\n## Global Options\n\n- **`--ignore-disheadless-log`**: Suppresses log output, providing a cleaner output for scripting.\n\n## Commands\n\n### `webdav`\n\nManage WebDAV data synchronization.\n\n- **`webdav up`**: Uploads your local configuration to the WebDAV server.\n- **`webdav down`**: Downloads and applies the remote configuration from the WebDAV server.\n\n**Example:**\n\n```bash\nvenera --headless webdav up\n```\n\n### `updatescript`\n\nUpdate comic source scripts.\n\n- **`updatescript all`**: Checks for and applies all available updates for your comic source scripts.\n\n**Example:**\n\n```bash\nvenera --headless updatescript all\n```\n\n**Output Format:**\n\nThe `updatescript` command provides detailed progress and a final summary.\n\n**Progress Logs:**\n\n- **`Progress`**: Indicates a successful update for a single script.\n- **`ProgressError`**: Indicates a failure during a script update.\n\n**Example `Progress` Log:**\n\n```json\n{\n  \"status\": \"running\",\n  \"message\": \"Progress\",\n  \"data\": {\n    \"current\": 1,\n    \"total\": 5,\n    \"source\": {\n      \"key\": \"source-key\",\n      \"name\": \"Source Name\",\n      \"version\": \"1.0.0\",\n      \"url\": \"https://example.com/source.js\"\n    }\n  }\n}\n```\n\n**Final Summary:**\n\nA summary is provided at the end, detailing the total number of scripts, how many were updated, and how many failed.\n\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"All scripts updated.\",\n  \"data\": {\n    \"total\": 5,\n    \"updated\": 4,\n    \"errors\": 1\n  }\n}\n```\n\n### `updatesubscribe`\n\nUpdate your subscribed comics and retrieve a list of updated comics.\n\n- **`updatesubscribe`**: Checks all subscribed comics for updates.\n- **`updatesubscribe --update-comic-by-id-type <id> <type>`**: Updates a single comic specified by its `id` and `type`.\n\n**Example:**\n\n```bash\n# Update all subscriptions\nvenera --headless updatesubscribe\n\n# Update a single comic\nvenera --headless updatesubscribe --update-comic-by-id-type \"comic-id\" \"source-key\"\n```\n\n## Output Format\n\nAll headless commands output JSON objects prefixed with `[CLI PRINT]`. This structured format allows for easy parsing in automated scripts. The JSON object always contains a `status` and a `message`. For commands that return data, a `data` field will also be present.\n\n### `updatesubscribe` Output\n\nThe `updatesubscribe` command provides detailed progress and final results in JSON format.\n\n**Progress Logs:**\n\nDuring an update, you will receive `Progress` or `ProgressError` messages.\n\n- **`Progress`**: Indicates a successful step in the update process.\n- **`ProgressError`**: Indicates an error occurred while updating a specific comic.\n\n**Example `Progress` Log:**\n\n```json\n{\n  \"status\": \"running\",\n  \"message\": \"Progress\",\n  \"data\": {\n    \"current\": 1,\n    \"total\": 10,\n    \"comic\": {\n      \"id\": \"some-comic-id\",\n      \"name\": \"Some Comic Name\",\n      \"coverUrl\": \"https://example.com/cover.jpg\",\n      \"author\": \"Author Name\",\n      \"type\": \"source-key\",\n      \"updateTime\": \"2023-10-27T12:00:00Z\",\n      \"tags\": [\"tag1\", \"tag2\"]\n    }\n  }\n}\n```\n\n**Example `ProgressError` Log:**\n\n```json\n{\n  \"status\": \"running\",\n  \"message\": \"ProgressError\",\n  \"data\": {\n    \"current\": 2,\n    \"total\": 10,\n    \"comic\": {\n      \"id\": \"another-comic-id\",\n      \"name\": \"Another Comic Name\",\n      ...\n    },\n    \"error\": \"Error message here\"\n  }\n}\n```\n\n**Final Output:**\n\nOnce the update process is complete, a final JSON object is returned with a list of all comics that have been updated.\n\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Updated comics list.\",\n  \"data\": [\n    {\n      \"id\": \"some-comic-id\",\n      \"name\": \"Some Comic Name\",\n      \"coverUrl\": \"https://example.com/cover.jpg\",\n      \"author\": \"Author Name\",\n      \"type\": \"source-key\",\n      \"updateTime\": \"2023-10-27T12:00:00Z\",\n      \"tags\": [\"tag1\", \"tag2\"]\n    }\n  ]\n}\n"
  },
  {
    "path": "doc/import_comic.md",
    "content": "# Import Comic\n\n## Introduction\n\nVenera supports importing comics from local files.\nHowever, the comic files must be in a specific format.\n\n## Restore Local Downloads\n\nIf you migrated the app and kept the local download folder but lost `local.db`,\nyou can restore the local database by scanning the current local path.\n\n- Open `Local` -> `Import` -> `Restore local downloads`.\n- The app scans the current local storage path and rebuilds entries.\n- It does not copy files or add favorites.\n- Duplicates (same title or directory) are skipped.\n\nMake sure the local storage path in Settings points to the folder that contains\nthe downloaded comics before running this.\n\n## Comic Directory\n\nA directory considered as a comic directory only if it follows one of the following two types of structure:\n\n**Without Chapter**\n\n```\ncomic_directory\n├── cover.[ext]\n├── img1.[ext]\n├── img2.[ext]\n├── img3.[ext]\n├── ...\n```\n\n**With Chapter**\n\n```\ncomic_directory\n├── cover.[ext]\n├── chapter1\n│   ├── img1.[ext]\n│   ├── img2.[ext]\n│   ├── img3.[ext]\n│   ├── ...\n├── chapter2\n│   ├── img1.[ext]\n│   ├── img2.[ext]\n│   ├── img3.[ext]\n│   ├── ...\n├── ...\n```\n\nThe file name can be anything, but the extension must be a valid image extension.\n\nThe page order is determined by the file name. App will sort the files by name and display them in that order.\n\nCover image is optional. \nIf there is a file named `cover.[ext]` in the directory, it will be considered as the cover image.\nOtherwise, the first image will be considered as the cover image.\n\nThe name of directory will be used as comic title. And the name of chapter directory will be used as chapter title.\n\n## Archive\n\nVenera supports importing comics from archive files.\n\nThe archive file must follow [Comic Book Archive](https://en.wikipedia.org/wiki/Comic_book_archive_file) format.\n\nCurrently, Venera supports the following archive formats:\n- `.cbz`\n- `.cb7`\n- `.zip`\n- `.7z`\n"
  },
  {
    "path": "doc/js_api.md",
    "content": "# Javascript API\n\n## Overview\n\nThe Javascript API is a set of functions that used to interact application.\n\nThere are following parts in the API:\n- [Convert](#Convert)\n- [Network](#Network)\n- [Html](#Html)\n- [UI](#UI)\n- [Utils](#Utils)\n- [Types](#Types)\n\n\n## Convert\n\nConvert is a set of functions that used to convert data between different types.\n\n### `Convert.encodeUtf8(str: string): ArrayBuffer`\n\nConvert a string to an ArrayBuffer.\n\n### `Convert.decodeUtf8(value: ArrayBuffer): string`\n\nConvert an ArrayBuffer to a string.\n\n### `Convert.encodeBase64(value: ArrayBuffer): string`\n\nConvert an ArrayBuffer to a base64 string.\n\n### `Convert.decodeBase64(value: string): ArrayBuffer`\n\nConvert a base64 string to an ArrayBuffer.\n\n### `Convert.md5(value: ArrayBuffer): ArrayBuffer`\n\nCalculate the md5 hash of an ArrayBuffer.\n\n### `Convert.sha1(value: ArrayBuffer): ArrayBuffer`\n\nCalculate the sha1 hash of an ArrayBuffer.\n\n### `Convert.sha256(value: ArrayBuffer): ArrayBuffer`\n\nCalculate the sha256 hash of an ArrayBuffer.\n\n### `Convert.sha512(value: ArrayBuffer): ArrayBuffer`\n\nCalculate the sha512 hash of an ArrayBuffer.\n\n### `Convert.hmac(key: ArrayBuffer, value: ArrayBuffer, hash: string): ArrayBuffer`\n\nCalculate the hmac hash of an ArrayBuffer.\n\n### `Convert.hmacString(key: ArrayBuffer, value: ArrayBuffer, hash: string): string`\n\nCalculate the hmac hash of an ArrayBuffer and return a string.\n\n### `Convert.decryptAesEcb(value: ArrayBuffer, key: ArrayBuffer): ArrayBuffer`\n\nDecrypt an ArrayBuffer with AES ECB mode.\n\n### `Convert.decryptAesCbc(value: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): ArrayBuffer`\n\nDecrypt an ArrayBuffer with AES CBC mode.\n\n### `Convert.decryptAesCfb(value: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): ArrayBuffer`\n\nDecrypt an ArrayBuffer with AES CFB mode.\n\n### `Convert.decryptAesOfb(value: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): ArrayBuffer`\n\nDecrypt an ArrayBuffer with AES OFB mode.\n\n### `Convert.decryptRsa(value: ArrayBuffer, key: ArrayBuffer): ArrayBuffer`\n\nDecrypt an ArrayBuffer with RSA.\n\n### `Convert.hexEncode(value: ArrayBuffer): string`\n\nConvert an ArrayBuffer to a hex string.\n\n## Network\n\nNetwork is a set of functions that used to send network requests and manage network resources.\n\n### `Network.fetchBytes(method: string, url: string, headers: object, data: ArrayBuffer): Promise<{status: number, headers: object, body: ArrayBuffer}>`\n\nSend a network request and return the response as an ArrayBuffer.\n\n### `Network.sendRequest(method: string, url: string, headers: object, data: ArrayBuffer): Promise<{status: number, headers: object, body: string}>`\n\nSend a network request and return the response as a string.\n\n### `Network.get(url: string, headers: object): Promise<{status: number, headers: object, body: string}>`\n\nSend a GET request and return the response as a string.\n\n### `Network.post(url: string, headers: object, data: ArrayBuffer): Promise<{status: number, headers: object, body: string}>`\n\nSend a POST request and return the response as a string.\n\n### `Network.put(url: string, headers: object, data: ArrayBuffer): Promise<{status: number, headers: object, body: string}>`\n\nSend a PUT request and return the response as a string.\n\n### `Network.delete(url: string, headers: object): Promise<{status: number, headers: object, body: string}>`\n\nSend a DELETE request and return the response as a string.\n\n### `Network.patch(url: string, headers: object, data: ArrayBuffer): Promise<{status: number, headers: object, body: string}>`\n\nSend a PATCH request and return the response as a string.\n\n### `Network.setCookies(url: string, cookies: Cookie[]): void`\n\nSet cookies for a specific url.\n\n### `Network.getCookies(url: string): Cookie[]`\n\nGet cookies for a specific url.\n\n### `Network.deleteCookies(url: string): void`\n\nDelete cookies for a specific url.\n\n### `fetch`\n\nThe fetch function is a wrapper of the `Network.fetchBytes` function. Same as the `fetch` function in the browser.\n\n## Html\n\nApi for parsing HTML.\n\n### `new HtmlDocument(html: string): HtmlDocument`\n\nCreate a HtmlDocument object from a html string.\n\n### `HtmlDocument.querySelector(selector: string): HtmlElement`\n\nFind the first element that matches the selector.\n\n### `HtmlDocument.querySelectorAll(selector: string): HtmlElement[]`\n\nFind all elements that match the selector.\n\n### `HtmlDocument.getElementById(id: string): HtmlElement`\n\nFind the element with the id.\n\n### `HtmlDocument.dispose(): void`\n\nDispose the HtmlDocument object.\n\n### `HtmlElement.querySelector(selector: string): HtmlElement`\n\nFind the first element that matches the selector.\n\n### `HtmlElement.querySelectorAll(selector: string): HtmlElement[]`\n\nFind all elements that match the selector.\n\n### `HtmlElement.getElementById(id: string): HtmlElement`\n\nFind the element with the id.\n\n### `get HtmlElement.text(): string`\n\nGet the text content of the element.\n\n### `get HtmlElement.attributes(): object`\n\nGet the attributes of the element.\n\n### `get HtmlElement.children(): HtmlElement[]`\n\nGet the children\n\n### `get HtmlElement.nodes(): HtmlNode[]`\n\nGet the child nodes\n\n### `get HtmlElement.parent(): HtmlElement | null`\n\nGet the parent element\n\n### `get HtmlElement.innerHtml(): string`\n\nGet the inner html\n\n### `get HtmlElement.classNames(): string[]`\n\nGet the class names\n\n### `get HtmlElement.id(): string | null`\n\nGet the id\n\n### `get HtmlElement.localName(): string`\n\nGet the local name\n\n### `get HtmlElement.previousSibling(): HtmlElement | null`\n\nGet the previous sibling\n\n### `get HtmlElement.nextSibling(): HtmlElement | null`\n\nGet the next sibling\n\n### `get HtmlNode.type(): string`\n\nGet the node type (\"text\", \"element\", \"comment\", \"document\", \"unknown\")\n\n### `HtmlNode.toElement(): HtmlElement | null`\n\nConvert the node to an element\n\n### `get HtmlNode.text(): string`\n\nGet the text content of the node\n\n## UI\n\n### `UI.showMessage(message: string): void`\n\nShow a message.\n\n### `UI.showDialog(title: string, content: string, actions: {text: string, callback: () => void | Promise<void>, style: \"text\"|\"filled\"|\"danger\"}[]): void`\n\nShow a dialog. Any action will close the dialog.\n\n### `UI.launchUrl(url: string): void`\n\nOpen a url in external browser.\n\n### `UI.showLoading(onCancel: () => void | null | undefined): number`\n\nShow a loading dialog.\n\n### `UI.cancelLoading(id: number): void`\n\nCancel a loading dialog.\n\n### `UI.showInputDialog(title: string, validator: (string) => string | null | undefined): string | null`\n\nShow an input dialog.\n\n### `UI.showSelectDialog(title: string, options: string[], initialIndex?: number): number | null`\n\nShow a select dialog.\n\n## Utils\n\n### `createUuid(): string`\n\ncreate a time-based uuid.\n\n### `randomInt(min: number, max: number): number`\n\nGenerate a random integer between min and max.\n\n### `randomDouble(min: number, max: number): number`\n\nGenerate a random double between min and max.\n\n### console\n\nSend log to application console. Same api as the browser console.\n\n## Types\n\n### `Cookie`\n\n```javascript\n/**\n * Create a cookie object.\n * @param name {string}\n * @param value {string}\n * @param domain {string}\n * @constructor\n */\nfunction Cookie({name, value, domain}) {\n    this.name = name;\n    this.value = value;\n    this.domain = domain;\n}\n```\n\n### `Comic`\n\n```javascript\n/**\n * Create a comic object\n * @param id {string}\n * @param title {string}\n * @param subtitle {string}\n * @param subTitle {string} - equal to subtitle\n * @param cover {string}\n * @param tags {string[]}\n * @param description {string}\n * @param maxPage {number?}\n * @param language {string?}\n * @param favoriteId {string?} - Only set this field if the comic is from favorites page\n * @param stars {number?} - 0-5, double\n * @constructor\n */\nfunction Comic({id, title, subtitle, subTitle, cover, tags, description, maxPage, language, favoriteId, stars}) {\n    this.id = id;\n    this.title = title;\n    this.subtitle = subtitle;\n    this.subTitle = subTitle;\n    this.cover = cover;\n    this.tags = tags;\n    this.description = description;\n    this.maxPage = maxPage;\n    this.language = language;\n    this.favoriteId = favoriteId;\n    this.stars = stars;\n}\n```\n\n### `ComicDetails`\n```javascript\n/**\n * Create a comic details object\n * @param title {string}\n * @param subtitle {string}\n * @param subTitle {string} - equal to subtitle\n * @param cover {string}\n * @param description {string?}\n * @param tags {Map<string, string[]> | {} | null | undefined}\n * @param chapters {Map<string, string> | {} | null | undefined} - key: chapter id, value: chapter title\n * @param isFavorite {boolean | null | undefined} - favorite status. If the comic source supports multiple folders, this field should be null\n * @param subId {string?} - a param which is passed to comments api\n * @param thumbnails {string[]?} - for multiple page thumbnails, set this to null, and use `loadThumbnails` api to load thumbnails\n * @param recommend {Comic[]?} - related comics\n * @param commentCount {number?}\n * @param likesCount {number?}\n * @param isLiked {boolean?}\n * @param uploader {string?}\n * @param updateTime {string?}\n * @param uploadTime {string?}\n * @param url {string?}\n * @param stars {number?} - 0-5, double\n * @param maxPage {number?}\n * @param comments {Comment[]?}- `since 1.0.7` App will display comments in the details page.\n * @constructor\n */\nfunction ComicDetails({title, subtitle, subTitle, cover, description, tags, chapters, isFavorite, subId, thumbnails, recommend, commentCount, likesCount, isLiked, uploader, updateTime, uploadTime, url, stars, maxPage, comments}) {\n    this.title = title;\n    this.subtitle = subtitle ?? subTitle;\n    this.cover = cover;\n    this.description = description;\n    this.tags = tags;\n    this.chapters = chapters;\n    this.isFavorite = isFavorite;\n    this.subId = subId;\n    this.thumbnails = thumbnails;\n    this.recommend = recommend;\n    this.commentCount = commentCount;\n    this.likesCount = likesCount;\n    this.isLiked = isLiked;\n    this.uploader = uploader;\n    this.updateTime = updateTime;\n    this.uploadTime = uploadTime;\n    this.url = url;\n    this.stars = stars;\n    this.maxPage = maxPage;\n    this.comments = comments;\n}\n```\n\n### `Comment`\n```javascript\n/**\n * Create a comment object\n * @param userName {string}\n * @param avatar {string?}\n * @param content {string}\n * @param time {string?}\n * @param replyCount {number?}\n * @param id {string?}\n * @param isLiked {boolean?}\n * @param score {number?}\n * @param voteStatus {number?} - 1: upvote, -1: downvote, 0: none\n * @constructor\n */\nfunction Comment({userName, avatar, content, time, replyCount, id, isLiked, score, voteStatus}) {\n    this.userName = userName;\n    this.avatar = avatar;\n    this.content = content;\n    this.time = time;\n    this.replyCount = replyCount;\n    this.id = id;\n    this.isLiked = isLiked;\n    this.score = score;\n    this.voteStatus = voteStatus;\n}\n```\n\n### `ImageLoadingConfig`\n```javascript\n/**\n * Create image loading config\n * @param url {string?}\n * @param method {string?} - http method, uppercase\n * @param data {any} - request data, may be null\n * @param headers {Object?} - request headers\n * @param onResponse {((ArrayBuffer) => ArrayBuffer)?} - modify response data\n * @param modifyImage {string?}\n *  A js script string.\n *  The script will be executed in a new Isolate.\n *  A function named `modifyImage` should be defined in the script, which receives an [Image] as the only argument, and returns an [Image]..\n * @param onLoadFailed {(() => ImageLoadingConfig)?} - called when the image loading failed\n * @constructor\n * @since 1.0.5\n *\n * To keep the compatibility with the old version, do not use the constructor. Consider creating a new object with the properties directly.\n */\nfunction ImageLoadingConfig({url, method, data, headers, onResponse, modifyImage, onLoadFailed}) {\n    this.url = url;\n    this.method = method;\n    this.data = data;\n    this.headers = headers;\n    this.onResponse = onResponse;\n    this.modifyImage = modifyImage;\n    this.onLoadFailed = onLoadFailed;\n}\n```\n\n### `ComicSource`\n```javascript\nclass ComicSource {\n    name = \"\"\n\n    key = \"\"\n\n    version = \"\"\n\n    minAppVersion = \"\"\n\n    url = \"\"\n\n    /**\n     * load data with its key\n     * @param {string} dataKey\n     * @returns {any}\n     */\n    loadData(dataKey) {\n        return sendMessage({\n            method: 'load_data',\n            key: this.key,\n            data_key: dataKey\n        })\n    }\n\n    /**\n     * load a setting with its key\n     * @param key {string}\n     * @returns {any}\n     */\n    loadSetting(key) {\n        return sendMessage({\n            method: 'load_setting',\n            key: this.key,\n            setting_key: key\n        })\n    }\n\n    /**\n     * save data\n     * @param {string} dataKey\n     * @param data\n     */\n    saveData(dataKey, data) {\n        return sendMessage({\n            method: 'save_data',\n            key: this.key,\n            data_key: dataKey,\n            data: data\n        })\n    }\n\n    /**\n     * delete data\n     * @param {string} dataKey\n     */\n    deleteData(dataKey) {\n        return sendMessage({\n            method: 'delete_data',\n            key: this.key,\n            data_key: dataKey,\n        })\n    }\n\n    /**\n     *\n     * @returns {boolean}\n     */\n    get isLogged() {\n        return sendMessage({\n            method: 'isLogged',\n            key: this.key,\n        });\n    }\n\n    init() { }\n\n    static sources = {}\n}\n```"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "<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<li>Use javascript to create comic sources</li>\n<li>Read comics from network sources</li>\n<li>Manage favorite comics</li>\n<li>Download comics</li>\n<li>View comments, tags, and other information of comics if the source supports</li>\n<li>Login to comment, rate, and other operations if the source supports</li>\n</ul>\n<h3>Thanks</h3>\n<h4>Tags Translation</h4>\n<li><a href=\"https://github.com/EhTagTranslation/Database\">github.com/EhTagTranslation/Database</a></li>\n<p>The Chinese translation of the manga tags is from this project.</p>\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "A comic reader that support reading local and network comics.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "content": "venera\n"
  },
  {
    "path": "ios/.gitignore",
    "content": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/ephemeral/\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>14.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\nplatform :ios, '13.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\n  #target 'RunnerTests' do\n  #  inherit! :search_paths\n  #end\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import Flutter\nimport UIKit\nimport UniformTypeIdentifiers\nimport Foundation // 添加此行\n\n@main\n@objc class AppDelegate: FlutterAppDelegate, UIDocumentPickerDelegate {\n  var flutterResult: FlutterResult?\n  var directoryPath: URL!\n\n  // 定义插件通道名称\n  private var directoryPicker: DirectoryPicker?\n\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n\n    guard let controller = window?.rootViewController as? FlutterViewController else {\n          fatalError(\"rootViewController is not of type FlutterViewController\")\n    }\n\n    let methodChannel = FlutterMethodChannel(name: \"venera/method_channel\", binaryMessenger: controller.binaryMessenger)\n    methodChannel.setMethodCallHandler { (call, result) in\n      if call.method == \"getProxy\" {\n        if let proxySettings = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as NSDictionary?,\n          let dict = proxySettings.object(forKey: kCFNetworkProxiesHTTPProxy) as? NSDictionary,\n          let host = dict.object(forKey: kCFNetworkProxiesHTTPProxy) as? String,\n          let port = dict.object(forKey: kCFNetworkProxiesHTTPPort) as? Int {\n          let proxyConfig = \"\\(host):\\(port)\"\n          result(proxyConfig)\n        } else {\n          result(\"\")\n        }\n      } else if call.method == \"setScreenOn\" {\n        if let arguments = call.arguments as? Bool {\n          let screenOn = arguments\n          UIApplication.shared.isIdleTimerDisabled = screenOn\n        }\n        result(nil)\n      } else if call.method == \"getDirectoryPath\" {\n        self.flutterResult = result\n        self.getDirectoryPath()\n      } else if call.method == \"stopAccessingSecurityScopedResource\" {\n        self.directoryPath?.stopAccessingSecurityScopedResource()\n        self.directoryPath = nil\n        result(nil)\n      } else if call.method == \"selectDirectory\" {\n        self.directoryPicker = DirectoryPicker()\n        self.directoryPicker?.selectDirectory(result: result)\n      } else {\n        result(FlutterMethodNotImplemented)\n      }\n    }\n\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n\n  func getDirectoryPath() {\n    let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.folder], asCopy: false)\n    documentPicker.delegate = self\n    documentPicker.allowsMultipleSelection = false\n    documentPicker.directoryURL = nil\n    documentPicker.modalPresentationStyle = .formSheet\n\n    if let rootViewController = window?.rootViewController {\n      rootViewController.present(documentPicker, animated: true, completion: nil)\n    }\n  }\n\n  func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {\n    self.directoryPath = urls.first\n    if self.directoryPath == nil {\n      flutterResult?(nil)\n      return\n    }\n\n    let success = self.directoryPath.startAccessingSecurityScopedResource()\n\n    if success {\n      flutterResult?(self.directoryPath.path)\n    } else {\n      flutterResult?(nil)\n    }\n  }\n\n  func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {\n    flutterResult?(nil)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\": [\n    {\n      \"filename\": \"AppIcon@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"76x76\"\n    },\n    {\n      \"filename\": \"AppIcon@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"76x76\"\n    },\n    {\n      \"filename\": \"AppIcon-83.5@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"83.5x83.5\"\n    },\n    {\n      \"filename\": \"AppIcon-40@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-40@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-40~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-40@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"40x40\"\n    },\n    {\n      \"filename\": \"AppIcon-20@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-20@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-20~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-20@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"20x20\"\n    },\n    {\n      \"filename\": \"AppIcon-29.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"1x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29@2x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"2x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29@3x.png\",\n      \"idiom\": \"iphone\",\n      \"scale\": \"3x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"1x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-29@2x~ipad.png\",\n      \"idiom\": \"ipad\",\n      \"scale\": \"2x\",\n      \"size\": \"29x29\"\n    },\n    {\n      \"filename\": \"AppIcon-60@2x~car.png\",\n      \"idiom\": \"car\",\n      \"scale\": \"2x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon-60@3x~car.png\",\n      \"idiom\": \"car\",\n      \"scale\": \"3x\",\n      \"size\": \"60x60\"\n    },\n    {\n      \"filename\": \"AppIcon~ios-marketing.png\",\n      \"idiom\": \"ios-marketing\",\n      \"scale\": \"1x\",\n      \"size\": \"1024x1024\"\n    }\n  ],\n  \"info\": {\n    \"author\": \"iconkitchen\",\n    \"version\": 1\n  }\n}"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/DirectoryPicker.swift",
    "content": "import UIKit\nimport Flutter\n\nclass DirectoryPicker: NSObject, UIDocumentPickerDelegate {\n    private var result: FlutterResult?\n\n    // 初始化选择目录方法\n    func selectDirectory(result: @escaping FlutterResult) {\n        self.result = result\n\n        // 配置 UIDocumentPicker 为目录选择模式\n        let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: [.folder])\n        documentPicker.delegate = self\n        documentPicker.allowsMultipleSelection = false\n\n        // 获取根视图控制器并显示选择器\n        if let rootViewController = UIApplication.shared.keyWindow?.rootViewController {\n            rootViewController.present(documentPicker, animated: true, completion: nil)\n        }\n    }\n\n    // 处理选择完成后的结果\n    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {\n        // 获取选中的路径\n        if let url = urls.first {\n            result?(url.path)\n        } else {\n            result?(nil)\n        }\n    }\n\n    // 处理取消选择情况\n    func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {\n        result?(nil)\n    }\n}\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>Venera</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>venera</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>NSPhotoLibraryUsageDescription</key>\n  <string>Choose images</string>\n\t<key>UIFileSharingEnabled</key>\n\t<true/>\n\t<key>LSSupportsOpeningDocumentsInPlace</key>\n\t<true/>\n\t<key>NSFaceIDUsageDescription</key>\n  <string>Ensure that the operation is being performed by the user themselves.</string>\n  <key>LSApplicationCategoryType</key>\n  <string>public.app-category.books</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t47AE655A2DB9680FFCD76428 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2780BF8CDC503135B465B554 /* Pods_Runner.framework */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n\t\tC0086D072CDEFE6E004596D9 /* DirectoryPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0086D062CDEFE64004596D9 /* DirectoryPicker.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 97C146E61CF9000F007C117D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 97C146ED1CF9000F007C117D;\n\t\t\tremoteInfo = Runner;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t2780BF8CDC503135B465B554 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t29B89F848F26E839605E1D88 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = \"<group>\"; };\n\t\t331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t730F73FE38E23FCF3E461640 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tC0086D062CDEFE64004596D9 /* DirectoryPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryPicker.swift; sourceTree = \"<group>\"; };\n\t\tC22B8A9F3177D4A68EB8F66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47AE655A2DB9680FFCD76428 /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t331C8082294A63A400263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t331C807B294A618700263BE5 /* RunnerTests.swift */,\n\t\t\t);\n\t\t\tpath = RunnerTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t338054802FDBAEE0548900A8 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2780BF8CDC503135B465B554 /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\t331C8082294A63A400263BE5 /* RunnerTests */,\n\t\t\t\t9C8AA19AD676ED6191F93C1C /* Pods */,\n\t\t\t\t338054802FDBAEE0548900A8 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t\t331C8081294A63A400263BE5 /* RunnerTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t\tC0086D062CDEFE64004596D9 /* DirectoryPicker.swift */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9C8AA19AD676ED6191F93C1C /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC22B8A9F3177D4A68EB8F66B /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t730F73FE38E23FCF3E461640 /* Pods-Runner.release.xcconfig */,\n\t\t\t\t29B89F848F26E839605E1D88 /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t331C8080294A63A400263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t331C807D294A63A400263BE5 /* Sources */,\n\t\t\t\t331C807F294A63A400263BE5 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t331C8086294A63A400263BE5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RunnerTests;\n\t\t\tproductName = RunnerTests;\n\t\t\tproductReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB87B6CE9C9F95FAFD9996EFB /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t\t6F6EF49660EAFC03D24BD1B3 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastUpgradeCheck = 1510;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t331C8080294A63A400263BE5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.0;\n\t\t\t\t\t\tTestTargetID = 97C146ED1CF9000F007C117D;\n\t\t\t\t\t};\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t\t331C8080294A63A400263BE5 /* RunnerTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t331C807F294A63A400263BE5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\",\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t6F6EF49660EAFC03D24BD1B3 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n\t\tB87B6CE9C9F95FAFD9996EFB /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t331C807D294A63A400263BE5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC0086D072CDEFE6E004596D9 /* DirectoryPicker.swift in Sources */,\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t331C8086294A63A400263BE5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 97C146ED1CF9000F007C117D /* Runner */;\n\t\t\ttargetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t331C8088294A63A400263BE5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t331C8089294A63A400263BE5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t331C808A294A63A400263BE5 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t331C8088294A63A400263BE5 /* Debug */,\n\t\t\t\t331C8089294A63A400263BE5 /* Release */,\n\t\t\t\t331C808A294A63A400263BE5 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\"\n            parallelizable = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"331C8080294A63A400263BE5\"\n               BuildableName = \"RunnerTests.xctest\"\n               BlueprintName = \"RunnerTests\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/RunnerTests/RunnerTests.swift",
    "content": "import Flutter\nimport UIKit\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n  func testExample() {\n    // If you add code to the Runner application, consider adding tests here.\n    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.\n  }\n\n}\n"
  },
  {
    "path": "lib/components/appbar.dart",
    "content": "part of 'components.dart';\n\nclass Appbar extends StatefulWidget implements PreferredSizeWidget {\n  const Appbar({\n    required this.title,\n    this.leading,\n    this.actions,\n    this.backgroundColor,\n    this.style = AppbarStyle.blur,\n    super.key,\n  });\n\n  final Widget title;\n\n  final Widget? leading;\n\n  final List<Widget>? actions;\n\n  final Color? backgroundColor;\n\n  final AppbarStyle style;\n\n  @override\n  State<Appbar> createState() => _AppbarState();\n\n  @override\n  Size get preferredSize => const Size.fromHeight(56);\n}\n\nclass _AppbarState extends State<Appbar> {\n  ScrollNotificationObserverState? _scrollNotificationObserver;\n  bool _scrolledUnder = false;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _scrollNotificationObserver?.removeListener(_handleScrollNotification);\n    _scrollNotificationObserver = ScrollNotificationObserver.maybeOf(context);\n    _scrollNotificationObserver?.addListener(_handleScrollNotification);\n  }\n\n  @override\n  void dispose() {\n    if (_scrollNotificationObserver != null) {\n      _scrollNotificationObserver!.removeListener(_handleScrollNotification);\n      _scrollNotificationObserver = null;\n    }\n    super.dispose();\n  }\n\n  void _handleScrollNotification(ScrollNotification notification) {\n    if (notification is ScrollUpdateNotification &&\n        defaultScrollNotificationPredicate(notification)) {\n      final bool oldScrolledUnder = _scrolledUnder;\n      final ScrollMetrics metrics = notification.metrics;\n      switch (metrics.axisDirection) {\n        case AxisDirection.up:\n          // Scroll view is reversed\n          _scrolledUnder = metrics.extentAfter > 0;\n        case AxisDirection.down:\n          _scrolledUnder = metrics.extentBefore > 0;\n        case AxisDirection.right:\n        case AxisDirection.left:\n          // Scrolled under is only supported in the vertical axis, and should\n          // not be altered based on horizontal notifications of the same\n          // predicate since it could be a 2D scroller.\n          break;\n      }\n\n      if (_scrolledUnder != oldScrolledUnder) {\n        setState(() {\n          // React to a change in MaterialState.scrolledUnder\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var content = Container(\n      decoration: BoxDecoration(\n        color: widget.backgroundColor ??\n            context.colorScheme.surface.toOpacity(0.86),\n      ),\n      height: _kAppBarHeight + context.padding.top,\n      child: Row(\n        children: [\n          const SizedBox(width: 8),\n          widget.leading ??\n              Tooltip(\n                message: \"Back\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.arrow_back),\n                  onPressed: () => Navigator.maybePop(context),\n                ),\n              ),\n          const SizedBox(\n            width: 16,\n          ),\n          Expanded(\n            child: DefaultTextStyle(\n              style: DefaultTextStyle.of(context).style.copyWith(fontSize: 20),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n              child: widget.title,\n            ),\n          ),\n          ...?widget.actions,\n          const SizedBox(\n            width: 8,\n          )\n        ],\n      ).paddingTop(context.padding.top),\n    );\n    if (widget.style == AppbarStyle.shadow) {\n      return Material(\n        color: context.colorScheme.surface,\n        elevation: _scrolledUnder ? 2 : 0,\n        child: content,\n      );\n    } else {\n      return BlurEffect(\n        blur: _scrolledUnder ? 15 : 0,\n        child: content,\n      );\n    }\n  }\n}\n\nenum AppbarStyle {\n  blur,\n  shadow,\n}\n\nclass SliverAppbar extends StatelessWidget {\n  const SliverAppbar({\n    super.key,\n    required this.title,\n    this.leading,\n    this.actions,\n    this.radius = 0,\n    this.style = AppbarStyle.blur,\n  });\n\n  final Widget? leading;\n\n  final Widget title;\n\n  final List<Widget>? actions;\n\n  final double radius;\n\n  final AppbarStyle style;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverPersistentHeader(\n      pinned: true,\n      delegate: _MySliverAppBarDelegate(\n        leading: leading,\n        title: title,\n        actions: actions,\n        topPadding: MediaQuery.of(context).padding.top,\n        radius: radius,\n        style: style,\n      ),\n    );\n  }\n}\n\nconst _kAppBarHeight = 52.0;\n\nclass _MySliverAppBarDelegate extends SliverPersistentHeaderDelegate {\n  final Widget? leading;\n\n  final Widget title;\n\n  final List<Widget>? actions;\n\n  final double topPadding;\n\n  final double radius;\n\n  final AppbarStyle style;\n\n  _MySliverAppBarDelegate({\n    this.leading,\n    required this.title,\n    this.actions,\n    required this.topPadding,\n    this.radius = 0,\n    this.style = AppbarStyle.blur,\n  });\n\n  @override\n  Widget build(\n      BuildContext context, double shrinkOffset, bool overlapsContent) {\n    var body = Row(\n      children: [\n        const SizedBox(width: 8),\n        leading ??\n            (Navigator.of(context).canPop()\n                ? Tooltip(\n                    message: \"Back\".tl,\n                    child: IconButton(\n                      icon: const Icon(Icons.arrow_back),\n                      onPressed: () => Navigator.maybePop(context),\n                    ),\n                  )\n                : const SizedBox()),\n        const SizedBox(\n          width: 16,\n        ),\n        Expanded(\n          child: DefaultTextStyle(\n            style: DefaultTextStyle.of(context).style.copyWith(fontSize: 20),\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n            child: title,\n          ),\n        ),\n        ...?actions,\n        const SizedBox(\n          width: 8,\n        )\n      ],\n    ).paddingTop(topPadding);\n\n    if (style == AppbarStyle.blur) {\n      return SizedBox.expand(\n        child: BlurEffect(\n          blur: 15,\n          child: Material(\n            color: context.colorScheme.surface.toOpacity(0.86),\n            elevation: 0,\n            borderRadius: BorderRadius.circular(radius),\n            child: body,\n          ),\n        ),\n      );\n    } else {\n      return SizedBox.expand(\n        child: Material(\n          color: context.colorScheme.surface,\n          elevation: shrinkOffset == 0 ? 0 : 2,\n          borderRadius: BorderRadius.circular(radius),\n          child: body,\n        ),\n      );\n    }\n  }\n\n  @override\n  double get maxExtent => _kAppBarHeight + topPadding;\n\n  @override\n  double get minExtent => _kAppBarHeight + topPadding;\n\n  @override\n  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {\n    return oldDelegate is! _MySliverAppBarDelegate ||\n        leading != oldDelegate.leading ||\n        title != oldDelegate.title ||\n        actions != oldDelegate.actions ||\n        topPadding != oldDelegate.topPadding ||\n        radius != oldDelegate.radius ||\n        style != oldDelegate.style;\n  }\n}\n\nclass AppTabBar extends StatefulWidget {\n  const AppTabBar({\n    super.key,\n    this.controller,\n    required this.tabs,\n    this.actionButton,\n    this.withUnderLine = true,\n  });\n\n  final TabController? controller;\n\n  final List<Tab> tabs;\n\n  final Widget? actionButton;\n\n  final bool withUnderLine;\n\n  @override\n  State<AppTabBar> createState() => _AppTabBarState();\n}\n\nclass _AppTabBarState extends State<AppTabBar> {\n  late TabController _controller;\n\n  late List<GlobalKey> keys;\n\n  static const _kTabHeight = 48.0;\n\n  static const tabPadding = EdgeInsets.symmetric(horizontal: 6, vertical: 6);\n\n  static const tabRadius = 8.0;\n\n  _IndicatorPainter? painter;\n\n  var scrollController = ScrollController();\n\n  var tabBarKey = GlobalKey();\n\n  var offsets = <double>[];\n\n  @override\n  void initState() {\n    keys = widget.tabs.map((e) => GlobalKey()).toList();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n  }\n\n  PageStorageBucket get bucket => PageStorage.of(context);\n\n  @override\n  void didChangeDependencies() {\n    _controller = widget.controller ?? DefaultTabController.of(context);\n    initPainter();\n    super.didChangeDependencies();\n    var prevIndex = bucket.readState(context) as int?;\n    if (prevIndex != null &&\n        prevIndex != _controller.index &&\n        prevIndex >= 0 &&\n        prevIndex < widget.tabs.length) {\n      _controller.index = prevIndex;\n    }\n    _controller.animation!.addListener(onTabChanged);\n  }\n\n  @override\n  void didUpdateWidget(covariant AppTabBar oldWidget) {\n    if (widget.controller != oldWidget.controller) {\n      _controller = widget.controller ?? DefaultTabController.of(context);\n      _controller.animation!.addListener(onTabChanged);\n      initPainter();\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  void initPainter() {\n    var old = painter;\n    painter = _IndicatorPainter(\n      controller: _controller,\n      color: context.colorScheme.primary,\n      padding: tabPadding,\n      radius: tabRadius,\n    );\n    if (old != null && old.offsets != null && old.itemHeight != null) {\n      painter!.update(old.offsets!, old.itemHeight!);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: _controller.animation ?? _controller,\n      builder: buildTabBar,\n    );\n  }\n\n  void _tabLayoutCallback(List<double> offsets, double itemHeight) {\n    painter!.update(offsets, itemHeight);\n    this.offsets = offsets;\n  }\n\n  Widget buildTabBar(BuildContext context, Widget? _) {\n    var child = SmoothScrollProvider(\n      controller: scrollController,\n      builder: (context, controller, physics) {\n        return SingleChildScrollView(\n          key: const PageStorageKey('scroll'),\n          scrollDirection: Axis.horizontal,\n          padding: EdgeInsets.zero,\n          controller: controller,\n          physics: physics is BouncingScrollPhysics\n              ? const ClampingScrollPhysics()\n              : physics,\n          child: CustomPaint(\n            painter: painter,\n            child: _TabRow(\n              callback: _tabLayoutCallback,\n              children: List.generate(widget.tabs.length, buildTab)\n                ..addIfNotNull(widget.actionButton?.padding(tabPadding)),\n            ),\n          ).paddingHorizontal(4),\n        );\n      },\n    );\n    return Container(\n      key: tabBarKey,\n      height: _kTabHeight,\n      width: double.infinity,\n      decoration: widget.withUnderLine\n          ? BoxDecoration(\n              border: Border(\n                bottom: BorderSide(\n                  color: context.colorScheme.outlineVariant,\n                  width: 0.6,\n                ),\n              ),\n            )\n          : null,\n      child: widget.tabs.isEmpty ? const SizedBox() : child,\n    );\n  }\n\n  int? previousIndex;\n\n  void onTabChanged() {\n    final int i = _controller.index;\n    if (i == previousIndex) {\n      return;\n    }\n    updateScrollOffset(i);\n    previousIndex = i;\n    bucket.writeState(context, i);\n  }\n\n  void updateScrollOffset(int i) {\n    // try to scroll to center the tab\n    final RenderBox tabBarBox =\n        tabBarKey.currentContext!.findRenderObject() as RenderBox;\n    final double tabLeft = offsets[i];\n    final double tabRight = offsets[i + 1];\n    final double tabWidth = tabRight - tabLeft;\n    final double tabCenter = tabLeft + tabWidth / 2;\n    final double tabBarWidth = tabBarBox.size.width;\n    double scrollOffset = tabCenter - tabBarWidth / 2;\n    if (scrollOffset == scrollController.offset) {\n      return;\n    }\n    scrollOffset = scrollOffset.clamp(\n      0.0,\n      scrollController.position.maxScrollExtent,\n    );\n    scrollController.animateTo(\n      scrollOffset,\n      duration: const Duration(milliseconds: 200),\n      curve: Curves.easeInOut,\n    );\n  }\n\n  void onTabClicked(int i) {\n    _controller.animateTo(i);\n  }\n\n  Widget buildTab(int i) {\n    return InkWell(\n      onTap: () => onTabClicked(i),\n      borderRadius: BorderRadius.circular(tabRadius),\n      child: KeyedSubtree(\n        key: keys[i],\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 16),\n          child: DefaultTextStyle(\n            style: DefaultTextStyle.of(context).style.copyWith(\n                  color: i == _controller.animation?.value.round()\n                      ? context.colorScheme.primary\n                      : context.colorScheme.onSurface,\n                  fontWeight: FontWeight.w500,\n                ),\n            child: widget.tabs[i],\n          ),\n        ),\n      ),\n    ).padding(tabPadding);\n  }\n}\n\ntypedef _TabRenderCallback = void Function(\n  List<double> offsets,\n  double itemHeight,\n);\n\nclass _TabRow extends Row {\n  const _TabRow({required this.callback, required super.children});\n\n  final _TabRenderCallback callback;\n\n  @override\n  RenderFlex createRenderObject(BuildContext context) {\n    return _RenderTabFlex(\n        direction: Axis.horizontal,\n        mainAxisSize: MainAxisSize.min,\n        mainAxisAlignment: MainAxisAlignment.start,\n        crossAxisAlignment: CrossAxisAlignment.center,\n        textDirection: Directionality.of(context),\n        verticalDirection: VerticalDirection.down,\n        callback: callback);\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, _RenderTabFlex renderObject) {\n    super.updateRenderObject(context, renderObject);\n    renderObject.callback = callback;\n  }\n}\n\nclass _RenderTabFlex extends RenderFlex {\n  _RenderTabFlex({\n    required super.direction,\n    required super.mainAxisSize,\n    required super.mainAxisAlignment,\n    required super.crossAxisAlignment,\n    required TextDirection super.textDirection,\n    required super.verticalDirection,\n    required this.callback,\n  });\n\n  _TabRenderCallback callback;\n\n  @override\n  void performLayout() {\n    super.performLayout();\n    RenderBox? child = firstChild;\n    final List<double> xOffsets = <double>[];\n    while (child != null) {\n      final FlexParentData childParentData =\n          child.parentData! as FlexParentData;\n      xOffsets.add(childParentData.offset.dx);\n      assert(child.parentData == childParentData);\n      child = childParentData.nextSibling;\n    }\n    xOffsets.add(size.width);\n    callback(xOffsets, firstChild!.size.height);\n  }\n}\n\nclass _IndicatorPainter extends CustomPainter {\n  _IndicatorPainter({\n    required this.controller,\n    required this.color,\n    required this.padding,\n    this.radius = 4.0,\n  }) : super(repaint: controller.animation);\n\n  final TabController controller;\n  final Color color;\n  final EdgeInsets padding;\n  final double radius;\n\n  List<double>? offsets;\n  double? itemHeight;\n  Rect? _currentRect;\n\n  void update(List<double> offsets, double itemHeight) {\n    this.offsets = offsets;\n    this.itemHeight = itemHeight;\n  }\n\n  int get maxTabIndex => offsets!.length - 2;\n\n  Rect indicatorRect(Size tabBarSize, int tabIndex) {\n    assert(offsets != null);\n    assert(offsets!.isNotEmpty);\n    assert(tabIndex >= 0);\n    assert(tabIndex <= maxTabIndex);\n    var (tabLeft, tabRight) = (offsets![tabIndex], offsets![tabIndex + 1]);\n\n    const horizontalPadding = 12.0;\n\n    var rect = Rect.fromLTWH(\n      tabLeft + padding.left + horizontalPadding,\n      _AppTabBarState._kTabHeight - 3.6,\n      tabRight - tabLeft - padding.horizontal - horizontalPadding * 2,\n      3,\n    );\n\n    return rect;\n  }\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    if (offsets == null || itemHeight == null) {\n      return;\n    }\n    final double index = controller.index.toDouble();\n    final double value = controller.animation!.value;\n    final bool ltr = index > value;\n    final int from = (ltr ? value.floor() : value.ceil()).clamp(0, maxTabIndex);\n    final int to = (ltr ? from + 1 : from - 1).clamp(0, maxTabIndex);\n    final Rect fromRect = indicatorRect(size, from);\n    final Rect toRect = indicatorRect(size, to);\n    _currentRect = Rect.lerp(fromRect, toRect, (value - from).abs());\n    final Paint paint = Paint()..color = color;\n    final RRect rrect = RRect.fromRectAndCorners(_currentRect!,\n        topLeft: Radius.circular(radius), topRight: Radius.circular(radius));\n    canvas.drawRRect(rrect, paint);\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return false;\n  }\n}\n\nclass TabViewBody extends StatefulWidget {\n  /// Create a tab view body, which will show the child at the current tab index.\n  const TabViewBody({super.key, required this.children, this.controller});\n\n  final List<Widget> children;\n\n  final TabController? controller;\n\n  @override\n  State<TabViewBody> createState() => _TabViewBodyState();\n}\n\nclass _TabViewBodyState extends State<TabViewBody> {\n  late TabController _controller;\n\n  int _currentIndex = 0;\n\n  void updateIndex() {\n    if (_controller.index != _currentIndex) {\n      setState(() {\n        _currentIndex = _controller.index;\n      });\n    }\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _controller = widget.controller ?? DefaultTabController.of(context);\n    _currentIndex = _controller.index;\n    _controller.addListener(updateIndex);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    _controller.removeListener(updateIndex);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return widget.children[_currentIndex];\n  }\n}\n\nclass SearchBarController {\n  _SearchBarMixin? _state;\n\n  final void Function(String text)? onSearch;\n\n  String currentText;\n\n  void setText(String text) {\n    _state?.setText(text);\n  }\n\n  String get text => _state?.getText() ?? '';\n\n  set text(String text) {\n    setText(text);\n  }\n\n  SearchBarController({this.onSearch, this.currentText = ''});\n}\n\nabstract mixin class _SearchBarMixin {\n  void setText(String text);\n\n  String getText();\n}\n\nclass SliverSearchBar extends StatefulWidget {\n  const SliverSearchBar({\n    super.key,\n    required this.controller,\n    this.onChanged,\n    this.action,\n    this.focusNode,\n  });\n\n  final SearchBarController controller;\n\n  final void Function(String)? onChanged;\n\n  final Widget? action;\n\n  final FocusNode? focusNode;\n\n  @override\n  State<SliverSearchBar> createState() => _SliverSearchBarState();\n}\n\nclass _SliverSearchBarState extends State<SliverSearchBar>\n    with _SearchBarMixin {\n  late TextEditingController _editingController;\n\n  late SearchBarController _controller;\n\n  @override\n  void initState() {\n    _controller = widget.controller;\n    _controller._state = this;\n    _editingController = TextEditingController(text: _controller.currentText);\n    super.initState();\n  }\n\n  @override\n  void setText(String text) {\n    _editingController.text = text;\n  }\n\n  @override\n  String getText() {\n    return _editingController.text;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverPersistentHeader(\n      pinned: true,\n      delegate: _SliverSearchBarDelegate(\n        editingController: _editingController,\n        controller: _controller,\n        topPadding: MediaQuery.of(context).padding.top,\n        onChanged: widget.onChanged,\n        action: widget.action,\n        focusNode: widget.focusNode,\n      ),\n    );\n  }\n}\n\nclass _SliverSearchBarDelegate extends SliverPersistentHeaderDelegate {\n  final TextEditingController editingController;\n\n  final SearchBarController controller;\n\n  final double topPadding;\n\n  final void Function(String)? onChanged;\n\n  final Widget? action;\n\n  final FocusNode? focusNode;\n\n  const _SliverSearchBarDelegate({\n    required this.editingController,\n    required this.controller,\n    required this.topPadding,\n    this.onChanged,\n    this.action,\n    this.focusNode,\n  });\n\n  static const _kAppBarHeight = 52.0;\n\n  @override\n  Widget build(\n      BuildContext context, double shrinkOffset, bool overlapsContent) {\n    return Container(\n      height: _kAppBarHeight + topPadding,\n      width: double.infinity,\n      padding: EdgeInsets.only(top: topPadding),\n      decoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surface,\n        border: Border(\n          bottom: BorderSide(\n            color: Theme.of(context).colorScheme.outlineVariant,\n          ),\n        ),\n      ),\n      child: Row(\n        children: [\n          const SizedBox(width: 8),\n          const BackButton(),\n          Expanded(\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 8),\n              child: TextField(\n                focusNode: focusNode,\n                controller: editingController,\n                decoration: InputDecoration(\n                  hintText: \"Search\".tl,\n                  border: InputBorder.none,\n                ),\n                onSubmitted: (text) {\n                  controller.onSearch?.call(text);\n                },\n                onChanged: onChanged,\n              ),\n            ),\n          ),\n          ListenableBuilder(\n            listenable: editingController,\n            builder: (context, child) {\n              return editingController.text.isEmpty\n                  ? const SizedBox()\n                  : IconButton(\n                      iconSize: 20,\n                      icon: const Icon(Icons.clear),\n                      onPressed: () {\n                        editingController.clear();\n                        onChanged?.call(\"\");\n                      },\n                    );\n            },\n          ),\n          if (action != null) action!,\n          const SizedBox(width: 8),\n        ],\n      ),\n    );\n  }\n\n  @override\n  double get maxExtent => _kAppBarHeight + topPadding;\n\n  @override\n  double get minExtent => _kAppBarHeight + topPadding;\n\n  @override\n  bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {\n    return oldDelegate is! _SliverSearchBarDelegate ||\n        editingController != oldDelegate.editingController ||\n        controller != oldDelegate.controller ||\n        topPadding != oldDelegate.topPadding;\n  }\n}\n\nclass AppSearchBar extends StatefulWidget {\n  const AppSearchBar({super.key, required this.controller, this.action});\n\n  final SearchBarController controller;\n\n  final Widget? action;\n\n  @override\n  State<AppSearchBar> createState() => _SearchBarState();\n}\n\nclass _SearchBarState extends State<AppSearchBar> with _SearchBarMixin {\n  late TextEditingController _editingController;\n\n  late SearchBarController _controller;\n\n  @override\n  void setText(String text) {\n    _editingController.text = text;\n  }\n\n  @override\n  String getText() {\n    return _editingController.text;\n  }\n\n  @override\n  void initState() {\n    _controller = widget.controller;\n    _controller._state = this;\n    _editingController = TextEditingController(text: _controller.currentText);\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final topPadding = MediaQuery.of(context).padding.top;\n    return Container(\n      height: _kAppBarHeight + topPadding,\n      width: double.infinity,\n      padding: EdgeInsets.only(top: topPadding),\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            color: Theme.of(context).colorScheme.outlineVariant,\n          ),\n        ),\n      ),\n      child: Row(\n        children: [\n          const SizedBox(width: 8),\n          const BackButton(),\n          Expanded(\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 8),\n              child: TextField(\n                controller: _editingController,\n                decoration: InputDecoration(\n                  hintText: \"Search\".tl,\n                  border: InputBorder.none,\n                ),\n                onSubmitted: (text) {\n                  _controller.onSearch?.call(text);\n                },\n              ),\n            ),\n          ),\n          ListenableBuilder(\n            listenable: _editingController,\n            builder: (context, child) {\n              return _editingController.text.isEmpty\n                  ? const SizedBox()\n                  : IconButton(\n                      iconSize: 20,\n                      icon: const Icon(Icons.clear),\n                      onPressed: () {\n                        _editingController.clear();\n                      },\n                    );\n            },\n          ),\n          if (widget.action != null) widget.action!,\n          const SizedBox(width: 8),\n        ],\n      ),\n    );\n  }\n}\n\nclass TabActionButton extends StatelessWidget {\n  const TabActionButton({\n    super.key,\n    required this.icon,\n    required this.text,\n    required this.onPressed,\n  });\n\n  final Icon icon;\n\n  final String text;\n\n  final void Function() onPressed;\n\n  static const _kTabHeight = 46.0;\n\n  @override\n  Widget build(BuildContext context) {\n    return InkWell(\n      onTap: onPressed,\n      borderRadius: BorderRadius.circular(8),\n      child: Container(\n        height: _kTabHeight,\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        child: IconTheme(\n          data: IconThemeData(size: 20, color: context.colorScheme.primary),\n          child: Row(\n            children: [\n              icon,\n              const SizedBox(width: 8),\n              Text(text, style: ts.withColor(context.colorScheme.primary)),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/button.dart",
    "content": "part of 'components.dart';\n\nclass HoverBox extends StatefulWidget {\n  const HoverBox(\n      {super.key, required this.child, this.borderRadius = BorderRadius.zero});\n\n  final Widget child;\n\n  final BorderRadius borderRadius;\n\n  @override\n  State<HoverBox> createState() => _HoverBoxState();\n}\n\nclass _HoverBoxState extends State<HoverBox> {\n  bool isHover = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: SystemMouseCursors.click,\n      child: AnimatedContainer(\n        duration: const Duration(milliseconds: 200),\n        decoration: BoxDecoration(\n            color: isHover\n                ? Theme.of(context).colorScheme.surfaceContainerLow\n                : null,\n            borderRadius: widget.borderRadius),\n        child: widget.child,\n      ),\n    );\n  }\n}\n\nenum ButtonType { filled, outlined, text, normal }\n\nclass Button extends StatefulWidget {\n  const Button(\n      {super.key,\n      required this.type,\n      required this.child,\n      this.isLoading = false,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      required this.onPressed});\n\n  const Button.filled(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.isLoading = false})\n      : type = ButtonType.filled;\n\n  const Button.outlined(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.isLoading = false})\n      : type = ButtonType.outlined;\n\n  const Button.text(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.isLoading = false})\n      : type = ButtonType.text;\n\n  const Button.normal(\n      {super.key,\n      required this.child,\n      required this.onPressed,\n      this.width,\n      this.height,\n      this.padding,\n      this.color,\n      this.onPressedAt,\n      this.isLoading = false})\n      : type = ButtonType.normal;\n\n  static Widget icon(\n      {Key? key,\n        required Widget icon,\n        required VoidCallback onPressed,\n        double? size,\n        Color? color,\n        String? tooltip,\n        bool isLoading = false,\n        HitTestBehavior behavior = HitTestBehavior.deferToChild}) {\n    return _IconButton(\n      key: key,\n      icon: icon,\n      onPressed: onPressed,\n      size: size,\n      color: color,\n      tooltip: tooltip,\n      behavior: behavior,\n      isLoading: isLoading,\n    );\n  }\n\n  final ButtonType type;\n\n  final Widget child;\n\n  final bool isLoading;\n\n  final void Function() onPressed;\n\n  final void Function(Offset location)? onPressedAt;\n\n  final double? width;\n\n  final double? height;\n\n  final EdgeInsets? padding;\n\n  final Color? color;\n\n  @override\n  State<Button> createState() => _ButtonState();\n}\n\nclass _ButtonState extends State<Button> {\n  bool isHover = false;\n\n  bool isLoading = false;\n\n  @override\n  void didUpdateWidget(covariant Button oldWidget) {\n    if (oldWidget.isLoading != widget.isLoading) {\n      setState(() => isLoading = widget.isLoading);\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var padding = widget.padding ??\n        const EdgeInsets.symmetric(horizontal: 16);\n    var width = widget.width;\n    if (width != null) {\n      width = width - padding.horizontal;\n    }\n    var height = widget.height;\n    if (height != null) {\n      height = height - padding.vertical;\n    }\n    Widget child = IconTheme(\n      data: IconThemeData(\n        color: textColor,\n      ),\n      child: DefaultTextStyle(\n        style: TextStyle(\n          color: textColor,\n          fontSize: 14,\n        ),\n        child: isLoading\n            ? CircularProgressIndicator(\n          color: widget.type == ButtonType.filled\n              ? context.colorScheme.inversePrimary\n              : context.colorScheme.primary,\n          strokeWidth: 1.8,\n        ).fixWidth(16).fixHeight(16)\n            : widget.child,\n      ),\n    );\n    if (width != null || height != null) {\n      child = child.toCenter();\n    }\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: SystemMouseCursors.click,\n      child: GestureDetector(\n        onTap: () {\n          if (isLoading) return;\n          widget.onPressed();\n          if (widget.onPressedAt != null) {\n            var renderBox = context.findRenderObject() as RenderBox;\n            var offset = renderBox.localToGlobal(Offset.zero);\n            widget.onPressedAt!(offset);\n          }\n        },\n        child: AnimatedContainer(\n          duration: const Duration(milliseconds: 160),\n          padding: padding,\n          constraints: const BoxConstraints(\n            minWidth: 76,\n            minHeight: 32,\n          ),\n          decoration: BoxDecoration(\n            color: buttonColor,\n            borderRadius: BorderRadius.circular(16),\n            boxShadow: (isHover && !isLoading && (widget.type == ButtonType.filled || widget.type == ButtonType.normal))\n                ? [\n                    BoxShadow(\n                      color: Colors.black.toOpacity(0.1),\n                      blurRadius: 2,\n                      offset: const Offset(0, 1),\n                    )\n                  ]\n                : null,\n            border: widget.type == ButtonType.outlined\n                ? Border.all(\n                    color: widget.color ??\n                        Theme.of(context).colorScheme.outlineVariant,\n                    width: 0.6,\n                  )\n                : null,\n          ),\n          child: AnimatedSize(\n            duration: const Duration(milliseconds: 160),\n            child: SizedBox(\n              width: width,\n              height: height,\n              child: Center(\n                widthFactor: 1,\n                child: child,\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Color get buttonColor {\n    if (widget.type == ButtonType.filled) {\n      var color = widget.color ?? context.colorScheme.primary;\n      if (isHover) {\n        return color.toOpacity(0.9);\n      } else {\n        return color;\n      }\n    }\n    if (widget.type == ButtonType.normal) {\n      var color = widget.color ?? context.colorScheme.surfaceContainer;\n      if (isHover) {\n        return color.toOpacity(0.9);\n      } else {\n        return color;\n      }\n    }\n    if (isHover) {\n      return context.colorScheme.outline.toOpacity(0.2);\n    }\n    return Colors.transparent;\n  }\n\n  Color get textColor {\n    if (widget.type == ButtonType.outlined) {\n      return widget.color ?? context.colorScheme.primary;\n    }\n    return widget.type == ButtonType.filled\n        ? context.colorScheme.onPrimary\n        : (widget.type == ButtonType.text\n            ? widget.color ?? context.colorScheme.primary\n            : context.colorScheme.onSurface);\n  }\n}\n\nclass _IconButton extends StatefulWidget {\n  const _IconButton({\n    super.key,\n    required this.icon,\n    required this.onPressed,\n    this.size,\n    this.color,\n    this.tooltip,\n    this.isLoading = false,\n    this.behavior = HitTestBehavior.deferToChild,\n  });\n\n  final Widget icon;\n\n  final VoidCallback onPressed;\n\n  final double? size;\n\n  final String? tooltip;\n\n  final Color? color;\n\n  final HitTestBehavior behavior;\n\n  final bool isLoading;\n\n  @override\n  State<_IconButton> createState() => _IconButtonState();\n}\n\nclass _IconButtonState extends State<_IconButton> {\n  bool isHover = false;\n\n  @override\n  Widget build(BuildContext context) {\n    var iconSize = widget.size ?? 24;\n    Widget icon = IconTheme(\n      data: IconThemeData(\n        size: iconSize,\n        color: widget.color ?? context.colorScheme.primary,\n      ),\n      child: widget.icon,\n    );\n    if (widget.isLoading) {\n      icon = const CircularProgressIndicator(\n        strokeWidth: 1.5,\n      ).paddingAll(2).fixWidth(iconSize).fixHeight(iconSize);\n    }\n    return MouseRegion(\n      onEnter: (_) => setState(() => isHover = true),\n      onExit: (_) => setState(() => isHover = false),\n      cursor: SystemMouseCursors.click,\n      child: GestureDetector(\n        behavior: widget.behavior,\n        onTap: () {\n          if (widget.isLoading) return;\n          widget.onPressed();\n        },\n        child: Tooltip(\n          message: widget.tooltip ?? \"\",\n          child: Container(\n            decoration: BoxDecoration(\n              color: isHover\n                  ? Theme.of(context)\n                  .colorScheme\n                  .outlineVariant\n                  .toOpacity(0.4)\n                  : null,\n              borderRadius: BorderRadius.circular((iconSize + 12) / 2),\n            ),\n            padding: const EdgeInsets.all(6),\n            child: icon,\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass MenuButton extends StatefulWidget {\n  const MenuButton({super.key, required this.entries});\n\n  final List<MenuEntry> entries;\n\n  @override\n  State<MenuButton> createState() => _MenuButtonState();\n}\n\nclass _MenuButtonState extends State<MenuButton> {\n  @override\n  Widget build(BuildContext context) {\n    return Tooltip(\n      message: 'more'.tl,\n      child: Button.icon(\n        icon: const Icon(Icons.more_horiz),\n        onPressed: () {\n          var renderBox = context.findRenderObject() as RenderBox;\n          var offset = renderBox.localToGlobal(Offset.zero);\n          showMenuX(\n            context,\n            offset,\n            widget.entries,\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/code.dart",
    "content": "part of 'components.dart';\n\nclass CodeEditor extends StatefulWidget {\n  const CodeEditor({super.key, this.initialValue, this.onChanged});\n\n  final String? initialValue;\n\n  final void Function(String value)? onChanged;\n\n  @override\n  State<CodeEditor> createState() => _CodeEditorState();\n}\n\nclass _CodeEditorState extends State<CodeEditor> {\n  late _CodeTextEditingController _controller;\n  late FocusNode _focusNode;\n  var horizontalScrollController = ScrollController();\n  var verticalScrollController = ScrollController();\n  int lineCount = 1;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = _CodeTextEditingController(text: widget.initialValue);\n    _focusNode = FocusNode()\n      ..onKeyEvent = (node, event) {\n        if (event.logicalKey == LogicalKeyboardKey.tab) {\n          if (event is KeyDownEvent) {\n            handleTab();\n          }\n          return KeyEventResult.handled;\n        }\n        return KeyEventResult.ignored;\n      };\n    lineCount = calculateLineCount(widget.initialValue ?? '');\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    future = _controller.init(context.brightness);\n  }\n\n  void handleTab() {\n    var text = _controller.text;\n    var start = _controller.selection.start;\n    var end = _controller.selection.end;\n    _controller.text = '${text.substring(0, start)}    ${text.substring(end)}';\n    _controller.selection = TextSelection.collapsed(offset: start + 4);\n  }\n\n  int calculateLineCount(String text) {\n    return text.split('\\n').length;\n  }\n\n  Widget buildLineNumbers() {\n    return SizedBox(\n      width: 36,\n      child: Column(\n        children: [\n          for (var i = 1; i <= lineCount; i++)\n            SizedBox(\n              height: 14 * 1.5,\n              child: Center(\n                child: Text(\n                  i.toString(),\n                  style: TextStyle(\n                    color: context.colorScheme.outline,\n                    fontSize: 13,\n                    height: 1.0,\n                    fontFamily: 'Consolas',\n                    fontFamilyFallback: ['Courier New', 'monospace'],\n                  ),\n                ),\n              ),\n            ),\n        ],\n      ),\n    ).paddingVertical(8);\n  }\n\n  late Future future;\n\n  @override\n  Widget build(BuildContext context) {\n    return FutureBuilder(\n      future: future,\n      builder: (context, value) {\n        if (value.connectionState == ConnectionState.waiting) {\n          return const SizedBox();\n        }\n        return GestureDetector(\n          onTap: () {\n            _controller.selection = TextSelection.collapsed(\n              offset: _controller.text.length,\n            );\n            _focusNode.requestFocus();\n          },\n          child: Scrollbar(\n            thumbVisibility: true,\n            controller: verticalScrollController,\n            notificationPredicate: (notif) =>\n                notif.metrics.axis == Axis.vertical,\n            child: Scrollbar(\n              thumbVisibility: true,\n              controller: horizontalScrollController,\n              notificationPredicate: (notif) =>\n                  notif.metrics.axis == Axis.horizontal,\n              child: SizedBox.expand(\n                child: ScrollConfiguration(\n                  behavior: _CustomScrollBehavior(),\n                  child: SingleChildScrollView(\n                    scrollDirection: Axis.horizontal,\n                    controller: horizontalScrollController,\n                    child: SingleChildScrollView(\n                      scrollDirection: Axis.vertical,\n                      controller: verticalScrollController,\n                      child: Row(\n                        children: [\n                          buildLineNumbers(),\n                          IntrinsicWidth(\n                            stepWidth: 100,\n                            child: TextField(\n                              controller: _controller,\n                              focusNode: _focusNode,\n                              maxLines: null,\n                              cursorHeight: 1.5 * 14,\n                              style: TextStyle(height: 1.5, fontSize: 14),\n                              decoration: InputDecoration(\n                                border: InputBorder.none,\n                                contentPadding: EdgeInsets.all(8),\n                              ),\n                              onChanged: (value) {\n                                widget.onChanged?.call(value);\n                                if (lineCount != calculateLineCount(value)) {\n                                  setState(() {\n                                    lineCount = calculateLineCount(value);\n                                  });\n                                }\n                              },\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n\nclass _CustomScrollBehavior extends MaterialScrollBehavior {\n  const _CustomScrollBehavior();\n  @override\n  Widget buildScrollbar(\n      BuildContext context, Widget child, ScrollableDetails details) {\n    return child;\n  }\n}\n\nclass _CodeTextEditingController extends TextEditingController {\n  _CodeTextEditingController({super.text});\n\n  HighlighterTheme? _theme;\n\n  Future<void> init(Brightness brightness) async {\n    Highlighter.addLanguage('js', _jsGrammer);\n    _theme = await HighlighterTheme.loadForBrightness(brightness);\n  }\n\n  @override\n  TextSpan buildTextSpan(\n      {required BuildContext context,\n      TextStyle? style,\n      required bool withComposing}) {\n    var highlighter = Highlighter(\n      language: 'js',\n      theme: _theme!,\n    );\n    var result = highlighter.highlight(text);\n    style = TextStyle(\n      height: 1.5,\n      fontSize: 14,\n      fontFamily: 'Consolas',\n      fontFamilyFallback: ['Courier New', 'Roboto Mono', 'monospace'],\n    );\n\n    return mergeTextStyle(result, style);\n  }\n\n  TextSpan mergeTextStyle(TextSpan span, TextStyle style) {\n    var result = TextSpan(\n      style: style.merge(span.style),\n      children: span.children\n          ?.whereType()\n          .map((e) => mergeTextStyle(e, style))\n          .toList(),\n      text: span.text,\n    );\n    return result;\n  }\n}\n\nconst _jsGrammer = r'''\n{\n  \"name\": \"JavaScript\",\n  \"version\": \"1.0.0\",\n  \"fileTypes\": [\"js\", \"mjs\", \"cjs\"],\n  \"scopeName\": \"source.js\",\n\n  \"foldingStartMarker\": \"\\\\{\\\\s*$\",\n  \"foldingStopMarker\": \"^\\\\s*\\\\}\",\n\n  \"patterns\": [\n    {\n      \"name\": \"meta.preprocessor.script.js\",\n      \"match\": \"^(#!.*)$\"\n    },\n    {\n      \"name\": \"meta.import-export.js\",\n      \"begin\": \"\\\\b(import|export)\\\\b\",\n      \"beginCaptures\": {\n        \"0\": {\n          \"name\": \"keyword.control.import.js\"\n        }\n      },\n      \"end\": \";\",\n      \"endCaptures\": {\n        \"0\": {\n          \"name\": \"punctuation.terminator.js\"\n        }\n      },\n      \"patterns\": [\n        {\n          \"include\": \"#strings\"\n        },\n        {\n          \"include\": \"#comments\"\n        },\n        {\n          \"name\": \"keyword.control.import.js\",\n          \"match\": \"\\\\b(as|from)\\\\b\"\n        }\n      ]\n    },\n    {\n      \"include\": \"#comments\"\n    },\n    {\n      \"include\": \"#keywords\"\n    },\n    {\n      \"include\": \"#constants-and-special-vars\"\n    },\n    {\n      \"include\": \"#operators\"\n    },\n    {\n      \"include\": \"#strings\"\n    }\n  ],\n\n  \"repository\": {\n    \"comments\": {\n      \"patterns\": [\n        {\n          \"name\": \"comment.block.js\",\n          \"begin\": \"/\\\\*\",\n          \"end\": \"\\\\*/\"\n        },\n        {\n          \"name\": \"comment.line.double-slash.js\",\n          \"match\": \"//.*$\"\n        }\n      ]\n    },\n    \"keywords\": {\n      \"patterns\": [\n        {\n          \"name\": \"keyword.control.js\",\n          \"match\": \"\\\\b(if|else|for|while|do|switch|case|default|break|continue|return|throw|try|catch|finally)\\\\b\"\n        },\n        {\n          \"name\": \"keyword.operator.js\",\n          \"match\": \"\\\\b(instanceof|typeof|new|delete|in|void)\\\\b\"\n        },\n        {\n          \"name\": \"storage.type.js\",\n          \"match\": \"\\\\b(var|let|const|function|class|extends)\\\\b\"\n        },\n        {\n          \"name\": \"keyword.declaration.js\",\n          \"match\": \"\\\\b(export|import|default)\\\\b\"\n        }\n      ]\n    },\n    \"constants-and-special-vars\": {\n      \"patterns\": [\n        {\n          \"name\": \"constant.language.js\",\n          \"match\": \"\\\\b(true|false|null|undefined|NaN|Infinity)\\\\b\"\n        },\n        {\n          \"name\": \"constant.numeric.js\",\n          \"match\": \"\\\\b(0x[0-9A-Fa-f]+|[0-9]+\\\\.?[0-9]*(e[+-]?[0-9]+)?)\\\\b\"\n        }\n      ]\n    },\n    \"operators\": {\n      \"patterns\": [\n        {\n          \"name\": \"keyword.operator.assignment.js\",\n          \"match\": \"(=|\\\\+=|-=|\\\\*=|/=|%=|\\\\|=|&=|\\\\^=|<<=|>>=|>>>=)\"\n        },\n        {\n          \"name\": \"keyword.operator.comparison.js\",\n          \"match\": \"(==|!=|===|!==|<|<=|>|>=)\"\n        },\n        {\n          \"name\": \"keyword.operator.logical.js\",\n          \"match\": \"(&&|\\\\|\\\\||!)\"\n        },\n        {\n          \"name\": \"keyword.operator.arithmetic.js\",\n          \"match\": \"(-|\\\\+|\\\\*|/|%)\"\n        },\n        {\n          \"name\": \"keyword.operator.bitwise.js\",\n          \"match\": \"(\\\\||&|\\\\^|~|<<|>>|>>>)\"\n        }\n      ]\n    },\n    \"strings\": {\n      \"patterns\": [\n        {\n          \"name\": \"string.quoted.double.js\",\n          \"begin\": \"\\\"\",\n          \"end\": \"\\\"\",\n          \"patterns\": [\n            {\n              \"include\": \"#string-interpolation\"\n            }\n          ]\n        },\n        {\n          \"name\": \"string.quoted.single.js\",\n          \"begin\": \"'\",\n          \"end\": \"'\",\n          \"patterns\": [\n            {\n              \"include\": \"#string-interpolation\"\n            }\n          ]\n        },\n        {\n          \"name\": \"string.template.js\",\n          \"begin\": \"`\",\n          \"end\": \"`\",\n          \"patterns\": [\n            {\n              \"include\": \"#string-interpolation\"\n            }\n          ]\n        }\n      ]\n    },\n    \"string-interpolation\": {\n      \"patterns\": [\n        {\n          \"name\": \"variable.parameter.js\",\n          \"begin\": \"\\\\$\\\\{\",\n          \"end\": \"\\\\}\"\n        }\n      ]\n    }\n  }\n}\n''';\n"
  },
  {
    "path": "lib/components/comic.dart",
    "content": "part of 'components.dart';\n\nImageProvider? _findImageProvider(Comic comic) {\n  ImageProvider image;\n  if (comic is LocalComic) {\n    image = LocalComicImageProvider(comic);\n  } else if (comic is History) {\n    image = HistoryImageProvider(comic);\n  } else if (comic.sourceKey == 'local') {\n    var localComic = LocalManager().find(comic.id, ComicType.local);\n    if (localComic == null) {\n      return null;\n    }\n    image = FileImage(localComic.coverFile);\n  } else {\n    image = CachedImageProvider(\n      comic.cover,\n      sourceKey: comic.sourceKey,\n      cid: comic.id,\n      fallbackToLocalCover: comic is FavoriteItem,\n    );\n  }\n  return image;\n}\n\nclass ComicTile extends StatelessWidget {\n  const ComicTile({\n    super.key,\n    required this.comic,\n    this.enableLongPressed = true,\n    this.badge,\n    this.menuOptions,\n    this.onTap,\n    this.onLongPressed,\n    this.heroID,\n  });\n\n  final Comic comic;\n\n  final bool enableLongPressed;\n\n  final String? badge;\n\n  final List<MenuEntry>? menuOptions;\n\n  final VoidCallback? onTap;\n\n  final VoidCallback? onLongPressed;\n\n  final int? heroID;\n\n  void _onTap() {\n    if (onTap != null) {\n      onTap!();\n      return;\n    }\n    App.mainNavigatorKey?.currentContext?.to(\n      () => ComicPage(\n        id: comic.id,\n        sourceKey: comic.sourceKey,\n        cover: comic.cover,\n        title: comic.title,\n        heroID: heroID,\n      ),\n    );\n  }\n\n  void _onLongPressed(context) {\n    if (onLongPressed != null) {\n      onLongPressed!();\n      return;\n    }\n    onLongPress(context);\n  }\n\n  void onLongPress(BuildContext context) {\n    var renderBox = context.findRenderObject() as RenderBox;\n    var size = renderBox.size;\n    var location = renderBox.localToGlobal(\n      Offset((size.width - 242) / 2, size.height / 2),\n    );\n    showMenu(location, context);\n  }\n\n  void onSecondaryTap(TapDownDetails details, BuildContext context) {\n    showMenu(details.globalPosition, context);\n  }\n\n  void showMenu(Offset location, BuildContext context) {\n    showMenuX(\n      App.rootContext,\n      location,\n      [\n        MenuEntry(\n          icon: Icons.chrome_reader_mode_outlined,\n          text: 'Details'.tl,\n          onClick: () {\n            App.mainNavigatorKey?.currentContext?.to(\n              () => ComicPage(\n                id: comic.id,\n                sourceKey: comic.sourceKey,\n                cover: comic.cover,\n                title: comic.title,\n              ),\n            );\n          },\n        ),\n        MenuEntry(\n          icon: Icons.copy,\n          text: 'Copy Title'.tl,\n          onClick: () {\n            Clipboard.setData(ClipboardData(text: comic.title));\n            App.rootContext.showMessage(message: 'Title copied'.tl);\n          },\n        ),\n        MenuEntry(\n          icon: Icons.stars_outlined,\n          text: 'Add to favorites'.tl,\n          onClick: () {\n            addFavorite([comic]);\n          },\n        ),\n        MenuEntry(\n          icon: Icons.block,\n          text: 'Block'.tl,\n          onClick: () => block(context),\n        ),\n        ...?menuOptions,\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var type = appdata.settings['comicDisplayMode'];\n\n    Widget child = type == 'detailed'\n        ? _buildDetailedMode(context)\n        : _buildBriefMode(context);\n\n    var isFavorite = appdata.settings['showFavoriteStatusOnTile']\n        ? LocalFavoritesManager()\n            .isExist(comic.id, ComicType(comic.sourceKey.hashCode))\n        : false;\n    var history = appdata.settings['showHistoryStatusOnTile']\n        ? HistoryManager().find(comic.id, ComicType(comic.sourceKey.hashCode))\n        : null;\n    if (history?.page == 0) {\n      history!.page = 1;\n    }\n\n    if (!isFavorite && history == null) {\n      return child;\n    }\n\n    return Stack(\n      children: [\n        Positioned.fill(\n          child: child,\n        ),\n        Positioned(\n          left: type == 'detailed' ? 16 : 6,\n          top: 8,\n          child: Container(\n            height: 24,\n            decoration: BoxDecoration(\n              borderRadius: BorderRadius.circular(4),\n            ),\n            clipBehavior: Clip.antiAlias,\n            child: Row(\n              children: [\n                if (isFavorite)\n                  Container(\n                    height: 24,\n                    width: 24,\n                    color: Colors.green,\n                    child: const Icon(\n                      Icons.bookmark_rounded,\n                      size: 16,\n                      color: Colors.white,\n                    ),\n                  ),\n                if (history != null)\n                  Container(\n                    height: 24,\n                    color: Colors.blue.toOpacity(0.9),\n                    constraints: const BoxConstraints(minWidth: 24),\n                    padding: const EdgeInsets.symmetric(horizontal: 4),\n                    child: CustomPaint(\n                      painter:\n                          _ReadingHistoryPainter(history.page, history.maxPage),\n                    ),\n                  )\n              ],\n            ),\n          ),\n        )\n      ],\n    );\n  }\n\n  Widget buildImage(BuildContext context) {\n    var image = _findImageProvider(comic);\n    if (image == null) {\n      return const SizedBox();\n    }\n    return AnimatedImage(\n      image: image,\n      fit: BoxFit.cover,\n      width: double.infinity,\n      height: double.infinity,\n    );\n  }\n\n  Widget _buildDetailedMode(BuildContext context) {\n    return LayoutBuilder(builder: (context, constrains) {\n      final height = constrains.maxHeight - 16;\n\n      Widget image = Container(\n        width: height * 0.68,\n        height: double.infinity,\n        decoration: BoxDecoration(\n          color: Theme.of(context).colorScheme.secondaryContainer,\n          borderRadius: BorderRadius.circular(8),\n          boxShadow: [\n            BoxShadow(\n              color: context.colorScheme.outlineVariant,\n              blurRadius: 1,\n              offset: const Offset(0, 1),\n            ),\n          ],\n        ),\n        clipBehavior: Clip.antiAlias,\n        child: buildImage(context),\n      );\n\n      if (heroID != null) {\n        image = Hero(\n          tag: \"cover$heroID\",\n          child: image,\n        );\n      }\n\n      return InkWell(\n        borderRadius: BorderRadius.circular(12),\n        onTap: _onTap,\n        onLongPress: enableLongPressed ? () => _onLongPressed(context) : null,\n        onSecondaryTapDown: (detail) => onSecondaryTap(detail, context),\n        child: Padding(\n          padding: const EdgeInsets.fromLTRB(16, 8, 24, 8),\n          child: Row(\n            children: [\n              image,\n              SizedBox.fromSize(\n                size: const Size(16, 5),\n              ),\n              Expanded(\n                child: _ComicDescription(\n                  title: comic.maxPage == null\n                      ? comic.title.replaceAll(\"\\n\", \"\")\n                      : \"[${comic.maxPage}P]${comic.title.replaceAll(\"\\n\", \"\")}\",\n                  subtitle: comic.subtitle ?? '',\n                  description: comic.description,\n                  badge: badge ?? comic.language,\n                  tags: comic.tags,\n                  maxLines: 2,\n                  enableTranslate:\n                      ComicSource.find(comic.sourceKey)?.enableTagsTranslate ??\n                          false,\n                  rating: comic.stars,\n                ),\n              ),\n            ],\n          ),\n        ),\n      );\n    });\n  }\n\n  Widget _buildBriefMode(BuildContext context) {\n    return LayoutBuilder(\n      builder: (context, constraints) {\n        Widget image = Container(\n          decoration: BoxDecoration(\n            color: context.colorScheme.secondaryContainer,\n            borderRadius: BorderRadius.circular(8),\n            boxShadow: [\n              BoxShadow(\n                color: Colors.black.toOpacity(0.2),\n                blurRadius: 2,\n                offset: const Offset(0, 2),\n              ),\n            ],\n          ),\n          clipBehavior: Clip.antiAlias,\n          child: buildImage(context),\n        );\n\n        if (heroID != null) {\n          image = Hero(\n            tag: \"cover$heroID\",\n            child: image,\n          );\n        }\n\n        return InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: _onTap,\n          onLongPress: enableLongPressed ? () => _onLongPressed(context) : null,\n          onSecondaryTapDown: (detail) => onSecondaryTap(detail, context),\n          child: Column(\n            children: [\n              Expanded(\n                child: Stack(\n                  children: [\n                    Positioned.fill(\n                      child: image,\n                    ),\n                    Align(\n                      alignment: Alignment.bottomRight,\n                      child: (() {\n                        final subtitle =\n                            comic.subtitle?.replaceAll('\\n', '').trim();\n                        final text = comic.description.isNotEmpty\n                            ? comic.description.split('|').join('\\n')\n                            : (subtitle?.isNotEmpty == true ? subtitle : null);\n                        final fortSize = constraints.maxWidth < 80\n                            ? 8.0\n                            : constraints.maxWidth < 150\n                                ? 10.0\n                                : 12.0;\n\n                        if (text == null) {\n                          return const SizedBox();\n                        }\n\n                        var children = <Widget>[];\n                        var lines = text.split('\\n');\n                        lines.removeWhere((e) => e.trim().isEmpty);\n                        if (lines.length > 3) {\n                          lines = lines.sublist(0, 3);\n                        }\n                        for (var line in lines) {\n                          children.add(Container(\n                            margin: const EdgeInsets.fromLTRB(2, 0, 2, 2),\n                            padding: constraints.maxWidth < 80\n                                ? const EdgeInsets.fromLTRB(3, 1, 3, 1)\n                                : constraints.maxWidth < 150\n                                    ? const EdgeInsets.fromLTRB(4, 2, 4, 2)\n                                    : const EdgeInsets.fromLTRB(5, 2, 5, 2),\n                            decoration: BoxDecoration(\n                              borderRadius: BorderRadius.circular(8),\n                              color: Colors.black.toOpacity(0.5),\n                            ),\n                            constraints: BoxConstraints(\n                              maxWidth: constraints.maxWidth,\n                            ),\n                            child: Text(\n                              line,\n                              style: TextStyle(\n                                fontWeight: FontWeight.w500,\n                                fontSize: fortSize,\n                                color: Colors.white,\n                              ),\n                              textAlign: TextAlign.right,\n                              maxLines: 1,\n                              overflow: TextOverflow.ellipsis,\n                            ),\n                          ));\n                        }\n                        return Column(\n                          mainAxisSize: MainAxisSize.min,\n                          crossAxisAlignment: CrossAxisAlignment.end,\n                          children: children,\n                        );\n                      })(),\n                    ),\n                  ],\n                ),\n              ),\n              Padding(\n                padding: const EdgeInsets.fromLTRB(4, 4, 4, 0),\n                child: Text(\n                  comic.title.replaceAll('\\n', ''),\n                  maxLines: 1,\n                  overflow: TextOverflow.clip,\n                  style: const TextStyle(\n                    fontWeight: FontWeight.w500,\n                  ),\n                ),\n              ),\n            ],\n          ).paddingHorizontal(6).paddingVertical(8),\n        );\n      },\n    );\n  }\n\n  List<String> _splitText(String text) {\n    // split text by comma, brackets\n    var words = <String>[];\n    var buffer = StringBuffer();\n    var inBracket = false;\n    String? prevBracket;\n    for (var i = 0; i < text.length; i++) {\n      var c = text[i];\n      if (c == '[' || c == '(') {\n        if (inBracket) {\n          buffer.write(c);\n        } else {\n          if (buffer.isNotEmpty) {\n            words.add(buffer.toString().trim());\n            buffer.clear();\n          }\n          inBracket = true;\n          prevBracket = c;\n        }\n      } else if (c == ']' || c == ')') {\n        if (prevBracket == '[' && c == ']' || prevBracket == '(' && c == ')') {\n          if (buffer.isNotEmpty) {\n            words.add(buffer.toString().trim());\n            buffer.clear();\n          }\n          inBracket = false;\n        } else {\n          buffer.write(c);\n        }\n      } else if (c == ',') {\n        if (inBracket) {\n          buffer.write(c);\n        } else {\n          words.add(buffer.toString().trim());\n          buffer.clear();\n        }\n      } else {\n        buffer.write(c);\n      }\n    }\n    if (buffer.isNotEmpty) {\n      words.add(buffer.toString().trim());\n    }\n    words.removeWhere((element) => element == \"\");\n    words = words.toSet().toList();\n    return words;\n  }\n\n  void block(BuildContext comicTileContext) {\n    showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        var words = <String>[];\n        var all = <String>[];\n        all.addAll(_splitText(comic.title));\n        if (comic.subtitle != null && comic.subtitle != \"\") {\n          all.add(comic.subtitle!);\n        }\n        all.addAll(comic.tags ?? []);\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: 'Block'.tl,\n            content: ConstrainedBox(\n              constraints: BoxConstraints(\n                maxHeight: math.min(400, context.height - 136),\n              ),\n              child: SingleChildScrollView(\n                child: Wrap(\n                  runSpacing: 8,\n                  spacing: 8,\n                  children: [\n                    for (var word in all)\n                      OptionChip(\n                        text: (comic.tags?.contains(word) ?? false)\n                            ? word.translateTagIfNeed\n                            : word,\n                        isSelected: words.contains(word),\n                        onTap: () {\n                          setState(() {\n                            if (!words.contains(word)) {\n                              words.add(word);\n                            } else {\n                              words.remove(word);\n                            }\n                          });\n                        },\n                      ),\n                  ],\n                ),\n              ).paddingHorizontal(16),\n            ),\n            actions: [\n              Button.filled(\n                onPressed: () {\n                  context.pop();\n                  for (var word in words) {\n                    appdata.settings['blockedWords'].add(word);\n                  }\n                  appdata.saveData();\n                  context.showMessage(message: 'Blocked'.tl);\n                  comicTileContext\n                      .findAncestorStateOfType<_SliverGridComicsState>()!\n                      .update();\n                },\n                child: Text('Block'.tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n  }\n}\n\nclass _ComicDescription extends StatelessWidget {\n  const _ComicDescription({\n    required this.title,\n    required this.subtitle,\n    required this.description,\n    required this.enableTranslate,\n    this.badge,\n    this.maxLines = 2,\n    this.tags,\n    this.rating,\n  });\n\n  final String title;\n  final String subtitle;\n  final String description;\n  final String? badge;\n  final List<String>? tags;\n  final int maxLines;\n  final bool enableTranslate;\n  final double? rating;\n\n  @override\n  Widget build(BuildContext context) {\n    if (tags != null) {\n      tags!.removeWhere((element) => element.removeAllBlank == \"\");\n      for (var s in tags!) {\n        s = s.replaceAll(\"\\n\", \" \");\n      }\n    }\n    var enableTranslate =\n        App.locale.languageCode == 'zh' && this.enableTranslate;\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: <Widget>[\n        Text(\n          title.trim(),\n          style: const TextStyle(\n            fontWeight: FontWeight.w500,\n            fontSize: 14.0,\n          ),\n          maxLines: maxLines,\n          overflow: TextOverflow.ellipsis,\n          softWrap: true,\n        ),\n        if (subtitle != \"\")\n          Text(\n            subtitle,\n            style: TextStyle(\n                fontSize: 10.0,\n                color: context.colorScheme.onSurface.toOpacity(0.7)),\n            maxLines: 1,\n            softWrap: true,\n            overflow: TextOverflow.ellipsis,\n          ),\n        const SizedBox(height: 4),\n        if (tags != null && tags!.isNotEmpty)\n          Expanded(\n            child: LayoutBuilder(builder: (context, constraints) {\n              if (constraints.maxHeight < 22) {\n                return Container();\n              }\n              int cnt = (constraints.maxHeight - 22).toInt() ~/ 25;\n              return Container(\n                clipBehavior: Clip.antiAlias,\n                height: 21 + cnt * 24,\n                width: double.infinity,\n                decoration: const BoxDecoration(),\n                child: Wrap(\n                  runAlignment: WrapAlignment.start,\n                  clipBehavior: Clip.antiAlias,\n                  crossAxisAlignment: WrapCrossAlignment.end,\n                  spacing: 4,\n                  runSpacing: 3,\n                  children: [\n                    for (var s in tags!)\n                      Container(\n                        height: 21,\n                        padding: const EdgeInsets.symmetric(horizontal: 4),\n                        constraints: BoxConstraints(\n                          maxWidth: constraints.maxWidth * 0.45,\n                        ),\n                        decoration: BoxDecoration(\n                          color: s == \"Unavailable\"\n                              ? context.colorScheme.errorContainer\n                              : context.colorScheme.secondaryContainer,\n                          borderRadius: BorderRadius.circular(8),\n                        ),\n                        child: Center(\n                          widthFactor: 1,\n                          child: Text(\n                            enableTranslate\n                                ? TagsTranslation.translateTag(s)\n                                : s.split(':').last,\n                            style: const TextStyle(fontSize: 12),\n                            softWrap: true,\n                            overflow: TextOverflow.ellipsis,\n                            maxLines: 1,\n                          ),\n                        ),\n                      ),\n                  ],\n                ),\n              ).toAlign(Alignment.topCenter);\n            }),\n          )\n        else\n          const Spacer(),\n        Row(\n          crossAxisAlignment: CrossAxisAlignment.end,\n          children: [\n            Expanded(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  if (rating != null) StarRating(value: rating!, size: 18),\n                  Text(\n                    description,\n                    style: const TextStyle(\n                      fontSize: 12.0,\n                    ),\n                    maxLines: (tags == null || tags!.isEmpty) ? 3 : 2,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ],\n              ),\n            ),\n            if (badge != null)\n              Container(\n                padding: const EdgeInsets.fromLTRB(6, 4, 6, 4),\n                decoration: BoxDecoration(\n                  color: Theme.of(context).colorScheme.tertiaryContainer,\n                  borderRadius: const BorderRadius.all(Radius.circular(8)),\n                ),\n                child: Center(\n                  child: Text(\n                    \"${badge![0].toUpperCase()}${badge!.substring(1).toLowerCase()}\",\n                    style: const TextStyle(fontSize: 12),\n                  ),\n                ),\n              ),\n          ],\n        )\n      ],\n    );\n  }\n}\n\nclass _ReadingHistoryPainter extends CustomPainter {\n  final int page;\n  final int? maxPage;\n\n  const _ReadingHistoryPainter(this.page, this.maxPage);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    if (maxPage == null) {\n      // 在中央绘制page\n      final textPainter = TextPainter(\n        text: TextSpan(\n          text: \"$page\",\n          style: TextStyle(\n            fontSize: size.width * 0.8,\n            color: Colors.white,\n          ),\n        ),\n        textDirection: TextDirection.ltr,\n      );\n      textPainter.layout();\n      textPainter.paint(\n          canvas,\n          Offset((size.width - textPainter.width) / 2,\n              (size.height - textPainter.height) / 2));\n    } else if (page == maxPage) {\n      // 在中央绘制勾\n      final paint = Paint()\n        ..color = Colors.white\n        ..strokeWidth = 2\n        ..style = PaintingStyle.stroke;\n      canvas.drawLine(Offset(size.width * 0.2, size.height * 0.5),\n          Offset(size.width * 0.45, size.height * 0.75), paint);\n      canvas.drawLine(Offset(size.width * 0.45, size.height * 0.75),\n          Offset(size.width * 0.85, size.height * 0.3), paint);\n    } else {\n      // 在左上角绘制page, 在右下角绘制maxPage\n      final textPainter = TextPainter(\n        text: TextSpan(\n          text: \"$page\",\n          style: TextStyle(\n            fontSize: size.width * 0.8,\n            color: Colors.white,\n          ),\n        ),\n        textDirection: TextDirection.ltr,\n      );\n      textPainter.layout();\n      textPainter.paint(canvas, const Offset(0, 0));\n      final textPainter2 = TextPainter(\n        text: TextSpan(\n          text: \"/$maxPage\",\n          style: TextStyle(\n            fontSize: size.width * 0.5,\n            color: Colors.white,\n          ),\n        ),\n        textDirection: TextDirection.ltr,\n      );\n      textPainter2.layout();\n      textPainter2.paint(\n          canvas,\n          Offset(size.width - textPainter2.width,\n              size.height - textPainter2.height));\n    }\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return oldDelegate is! _ReadingHistoryPainter ||\n        oldDelegate.page != page ||\n        oldDelegate.maxPage != maxPage;\n  }\n}\n\nclass SliverGridComics extends StatefulWidget {\n  const SliverGridComics(\n      {super.key,\n      required this.comics,\n      this.onLastItemBuild,\n      this.badgeBuilder,\n      this.menuBuilder,\n      this.onTap,\n      this.onLongPressed,\n      this.selections});\n\n  final List<Comic> comics;\n\n  final Map<Comic, bool>? selections;\n\n  final void Function()? onLastItemBuild;\n\n  final String? Function(Comic)? badgeBuilder;\n\n  final List<MenuEntry> Function(Comic)? menuBuilder;\n\n  final void Function(Comic, int heroID)? onTap;\n\n  final void Function(Comic, int heroID)? onLongPressed;\n\n  @override\n  State<SliverGridComics> createState() => _SliverGridComicsState();\n}\n\nclass _SliverGridComicsState extends State<SliverGridComics> {\n  List<Comic> comics = [];\n  List<int> heroIDs = [];\n\n  static int _nextHeroID = 0;\n\n  void generateHeroID() {\n    heroIDs.clear();\n    for (var i = 0; i < comics.length; i++) {\n      heroIDs.add(_nextHeroID++);\n    }\n  }\n\n  @override\n  void didUpdateWidget(covariant SliverGridComics oldWidget) {\n    if (!comics.isEqualTo(widget.comics)) {\n      comics.clear();\n      for (var comic in widget.comics) {\n        if (isBlocked(comic) == null) {\n          comics.add(comic);\n        }\n      }\n      generateHeroID();\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  @override\n  void initState() {\n    for (var comic in widget.comics) {\n      if (isBlocked(comic) == null) {\n        comics.add(comic);\n      }\n    }\n    generateHeroID();\n    HistoryManager().addListener(update);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    HistoryManager().removeListener(update);\n    super.dispose();\n  }\n\n  void update() {\n    setState(() {\n      comics.clear();\n      for (var comic in widget.comics) {\n        if (isBlocked(comic) == null) {\n          comics.add(comic);\n        }\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return _SliverGridComics(\n      comics: comics,\n      heroIDs: heroIDs,\n      selection: widget.selections,\n      onLastItemBuild: widget.onLastItemBuild,\n      badgeBuilder: widget.badgeBuilder,\n      menuBuilder: widget.menuBuilder,\n      onTap: widget.onTap,\n      onLongPressed: widget.onLongPressed,\n    );\n  }\n}\n\nclass _SliverGridComics extends StatelessWidget {\n  const _SliverGridComics({\n    required this.comics,\n    required this.heroIDs,\n    this.onLastItemBuild,\n    this.badgeBuilder,\n    this.menuBuilder,\n    this.onTap,\n    this.onLongPressed,\n    this.selection,\n  });\n\n  final List<Comic> comics;\n\n  final List<int> heroIDs;\n\n  final Map<Comic, bool>? selection;\n\n  final void Function()? onLastItemBuild;\n\n  final String? Function(Comic)? badgeBuilder;\n\n  final List<MenuEntry> Function(Comic)? menuBuilder;\n\n  final void Function(Comic, int heroID)? onTap;\n\n  final void Function(Comic, int heroID)? onLongPressed;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverGrid(\n      delegate: SliverChildBuilderDelegate((context, index) {\n        if (index == comics.length - 1) {\n          onLastItemBuild?.call();\n        }\n        var badge = badgeBuilder?.call(comics[index]);\n        var isSelected = selection == null\n            ? false\n            : selection![comics[index]] ?? false;\n        var comic = ComicTile(\n          comic: comics[index],\n          badge: badge,\n          menuOptions: menuBuilder?.call(comics[index]),\n          onTap: onTap != null\n              ? () => onTap!(comics[index], heroIDs[index])\n              : null,\n          onLongPressed: onLongPressed != null\n              ? () => onLongPressed!(comics[index], heroIDs[index])\n              : null,\n          heroID: heroIDs[index],\n        );\n        if (selection == null) {\n          return comic;\n        }\n        return AnimatedContainer(\n          key: ValueKey(comics[index].id),\n          duration: const Duration(milliseconds: 150),\n          decoration: BoxDecoration(\n            color: isSelected\n                ? Theme.of(\n                    context,\n                  ).colorScheme.secondaryContainer.toOpacity(0.72)\n                : null,\n            borderRadius: BorderRadius.circular(12),\n          ),\n          margin: const EdgeInsets.all(4),\n          child: comic,\n        );\n      }, childCount: comics.length),\n      gridDelegate: SliverGridDelegateWithComics(),\n    );\n  }\n}\n\n/// return the first blocked keyword, or null if not blocked\nString? isBlocked(Comic item) {\n  for (var word in appdata.settings['blockedWords']) {\n    if (item.title.contains(word)) {\n      return word;\n    }\n    if (item.subtitle?.contains(word) ?? false) {\n      return word;\n    }\n    if (item.description.contains(word)) {\n      return word;\n    }\n    for (var tag in item.tags ?? <String>[]) {\n      if (tag == word) {\n        return word;\n      }\n      if (tag.contains(':')) {\n        tag = tag.split(':')[1];\n        if (tag == word) {\n          return word;\n        }\n      }\n    }\n  }\n  return null;\n}\n\nclass ComicList extends StatefulWidget {\n  const ComicList({\n    super.key,\n    this.loadPage,\n    this.loadNext,\n    this.leadingSliver,\n    this.trailingSliver,\n    this.errorLeading,\n    this.menuBuilder,\n    this.controller,\n    this.refreshHandlerCallback,\n    this.enablePageStorage = false,\n  });\n\n  final Future<Res<List<Comic>>> Function(int page)? loadPage;\n\n  final Future<Res<List<Comic>>> Function(String? next)? loadNext;\n\n  final Widget? leadingSliver;\n\n  final Widget? trailingSliver;\n\n  final Widget? errorLeading;\n\n  final List<MenuEntry> Function(Comic)? menuBuilder;\n\n  final ScrollController? controller;\n\n  final void Function(VoidCallback c)? refreshHandlerCallback;\n\n  final bool enablePageStorage;\n\n  @override\n  State<ComicList> createState() => ComicListState();\n}\n\nclass ComicListState extends State<ComicList> {\n  int? _maxPage;\n\n  final Map<int, List<Comic>> _data = {};\n\n  int _page = 1;\n\n  String? _error;\n\n  final Map<int, bool> _loading = {};\n\n  String? _nextUrl;\n\n  late bool enablePageStorage = widget.enablePageStorage;\n\n  Map<String, dynamic> get state => {\n        'maxPage': _maxPage,\n        'data': _data,\n        'page': _page,\n        'error': _error,\n        'loading': _loading,\n        'nextUrl': _nextUrl,\n      };\n\n  void restoreState(Map<String, dynamic>? state) {\n    if (state == null || !enablePageStorage) {\n      return;\n    }\n    _maxPage = state['maxPage'];\n    _data.clear();\n    _data.addAll(state['data']);\n    _page = state['page'];\n    _error = state['error'];\n    _loading.clear();\n    _loading.addAll(state['loading']);\n    _nextUrl = state['nextUrl'];\n  }\n\n  void storeState() {\n    if (enablePageStorage) {\n      PageStorage.of(context).writeState(context, state);\n    }\n  }\n\n  void refresh() {\n    _data.clear();\n    _page = 1;\n    _maxPage = null;\n    _error = null;\n    _nextUrl = null;\n    _loading.clear();\n    storeState();\n    setState(() {});\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    restoreState(PageStorage.of(context).readState(context));\n    widget.refreshHandlerCallback?.call(refresh);\n  }\n\n  void remove(Comic c) {\n    if (_data[_page] == null || !_data[_page]!.remove(c)) {\n      for (var page in _data.values) {\n        if (page.remove(c)) {\n          break;\n        }\n      }\n    }\n    setState(() {});\n  }\n\n  Widget _buildPageSelector() {\n    return Row(\n      children: [\n        FilledButton(\n          onPressed: _page > 1\n              ? () {\n                  setState(() {\n                    _error = null;\n                    _page--;\n                  });\n                }\n              : null,\n          child: Text(\"Back\".tl),\n        ).fixWidth(84),\n        Expanded(\n          child: Center(\n            child: Material(\n              color: Theme.of(context).colorScheme.surfaceContainer,\n              borderRadius: BorderRadius.circular(8),\n              child: InkWell(\n                borderRadius: BorderRadius.circular(8),\n                onTap: () {\n                  String value = '';\n                  showDialog(\n                    context: App.rootContext,\n                    builder: (context) {\n                      return ContentDialog(\n                        title: \"Jump to page\".tl,\n                        content: TextField(\n                          keyboardType: TextInputType.number,\n                          decoration: InputDecoration(\n                            labelText: \"Page\".tl,\n                          ),\n                          inputFormatters: <TextInputFormatter>[\n                            FilteringTextInputFormatter.digitsOnly\n                          ],\n                          onChanged: (v) {\n                            value = v;\n                          },\n                        ).paddingHorizontal(16),\n                        actions: [\n                          Button.filled(\n                            onPressed: () {\n                              Navigator.of(context).pop();\n                              var page = int.tryParse(value);\n                              if (page == null) {\n                                context.showMessage(message: \"Invalid page\".tl);\n                              } else {\n                                if (page > 0 &&\n                                    (_maxPage == null || page <= _maxPage!)) {\n                                  setState(() {\n                                    _error = null;\n                                    _page = page;\n                                  });\n                                } else {\n                                  context.showMessage(\n                                      message: \"Invalid page\".tl);\n                                }\n                              }\n                            },\n                            child: Text(\"Jump\".tl),\n                          ),\n                        ],\n                      );\n                    },\n                  );\n                },\n                child: Padding(\n                  padding:\n                      const EdgeInsets.symmetric(horizontal: 16, vertical: 6),\n                  child: Text(\"Page $_page / ${_maxPage ?? '?'}\"),\n                ),\n              ),\n            ),\n          ),\n        ),\n        FilledButton(\n          onPressed: _page < (_maxPage ?? (_page + 1))\n              ? () {\n                  setState(() {\n                    _error = null;\n                    _page++;\n                  });\n                }\n              : null,\n          child: Text(\"Next\".tl),\n        ).fixWidth(84),\n      ],\n    ).paddingVertical(8).paddingHorizontal(16);\n  }\n\n  Widget _buildSliverPageSelector() {\n    return SliverToBoxAdapter(\n      child: _buildPageSelector(),\n    );\n  }\n\n  Future<void> _loadPage(int page) async {\n    if (widget.loadPage == null && widget.loadNext == null) {\n      _error = \"loadPage and loadNext can't be null at the same time\";\n      Future.microtask(() {\n        setState(() {});\n      });\n    }\n    if (_data[page] != null || _loading[page] == true) {\n      return;\n    }\n    _loading[page] = true;\n    try {\n      if (widget.loadPage != null) {\n        var res = await widget.loadPage!(page);\n        if (!mounted) return;\n        if (res.success) {\n          if (res.data.isEmpty) {\n            setState(() {\n              _data[page] = const [];\n              _maxPage ??= page;\n            });\n          } else {\n            setState(() {\n              _data[page] = res.data;\n              if (res.subData != null && res.subData is int) {\n                _maxPage = res.subData;\n              }\n            });\n          }\n        } else {\n          setState(() {\n            _error = res.errorMessage ?? \"Unknown error\".tl;\n          });\n        }\n      } else {\n        try {\n          while (_data[page] == null) {\n            await _fetchNext();\n          }\n          if (mounted) {\n            setState(() {});\n          }\n        } catch (e) {\n          if (mounted) {\n            setState(() {\n              _error = e.toString();\n            });\n          }\n        }\n      }\n    } finally {\n      _loading[page] = false;\n      storeState();\n    }\n  }\n\n  Future<void> _fetchNext() async {\n    var res = await widget.loadNext!(_nextUrl);\n    _data[_data.length + 1] = res.data;\n    if (res.subData == null) {\n      _maxPage = _data.length;\n    } else {\n      _nextUrl = res.subData;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var type = appdata.settings['comicListDisplayMode'];\n    return type == 'paging' ? buildPagingMode() : buildContinuousMode();\n  }\n\n  Widget buildPagingMode() {\n    if (_error != null) {\n      return Column(\n        children: [\n          if (widget.errorLeading != null) widget.errorLeading!,\n          _buildPageSelector(),\n          Expanded(\n            child: NetworkError(\n              withAppbar: false,\n              message: _error!,\n              retry: () {\n                setState(() {\n                  _error = null;\n                });\n              },\n            ),\n          ),\n        ],\n      );\n    }\n    if (_data[_page] == null) {\n      _loadPage(_page);\n      return Column(\n        children: [\n          if (widget.errorLeading != null) widget.errorLeading!,\n          const Expanded(\n            child: Center(\n              child: CircularProgressIndicator(),\n            ),\n          ),\n        ],\n      );\n    }\n    return SmoothCustomScrollView(\n      key: enablePageStorage ? PageStorageKey('scroll$_page') : null,\n      controller: widget.controller,\n      slivers: [\n        if (widget.leadingSliver != null) widget.leadingSliver!,\n        if (_maxPage != 1) _buildSliverPageSelector(),\n        SliverGridComics(\n          comics: _data[_page] ?? const [],\n          menuBuilder: widget.menuBuilder,\n        ),\n        if (_data[_page]!.length > 6 && _maxPage != 1)\n          _buildSliverPageSelector(),\n        if (widget.trailingSliver != null) widget.trailingSliver!,\n      ],\n    );\n  }\n\n  Widget buildContinuousMode() {\n    if (_error != null && _data.isEmpty) {\n      return Column(\n        children: [\n          if (widget.errorLeading != null) widget.errorLeading!,\n          _buildPageSelector(),\n          Expanded(\n            child: NetworkError(\n              withAppbar: false,\n              message: _error!,\n              retry: () {\n                setState(() {\n                  _error = null;\n                });\n              },\n            ),\n          ),\n        ],\n      );\n    }\n    if (_data[1] == null) {\n      _loadPage(1);\n      return Column(\n        children: [\n          if (widget.errorLeading != null) widget.errorLeading!,\n          const Expanded(\n            child: Center(\n              child: CircularProgressIndicator(),\n            ),\n          ),\n        ],\n      );\n    }\n    return SmoothCustomScrollView(\n      key: enablePageStorage ? PageStorageKey('scroll$_page') : null,\n      controller: widget.controller,\n      slivers: [\n        if (widget.leadingSliver != null) widget.leadingSliver!,\n        SliverGridComics(\n          comics: _data.values.expand((element) => element).toList(),\n          menuBuilder: widget.menuBuilder,\n          onLastItemBuild: () {\n            if (_error == null && (_maxPage == null || _data.length < _maxPage!)) {\n              _loadPage(_data.length + 1);\n            }\n          },\n        ),\n        if (_error != null)\n          SliverToBoxAdapter(\n            child: Column(\n              children: [\n                Row(\n                  children: [\n                    const Icon(Icons.error_outline),\n                    const SizedBox(width: 8),\n                    Expanded(child: Text(_error!, maxLines: 3)),\n                  ],\n                ),\n                const SizedBox(height: 8),\n                Center(\n                  child: OutlinedButton(\n                    onPressed: () {\n                      setState(() {\n                        _error = null;\n                      });\n                    },\n                    child: Text(\"Retry\".tl),\n                  ),\n                ),\n              ],\n            ).paddingHorizontal(16).paddingVertical(8),\n          )\n        else if (_maxPage == null || _data.length < _maxPage!)\n          const SliverListLoadingIndicator(),\n        if (widget.trailingSliver != null) widget.trailingSliver!,\n      ],\n    );\n  }\n}\n\nclass StarRating extends StatelessWidget {\n  const StarRating({\n    super.key,\n    required this.value,\n    this.onTap,\n    this.size = 20,\n  });\n\n  final double value; // 0-5\n\n  final VoidCallback? onTap;\n\n  final double size;\n\n  @override\n  Widget build(BuildContext context) {\n    var interval = size * 0.1;\n    var value = this.value;\n    if (value.isNaN) {\n      value = 0;\n    }\n    var child = SizedBox(\n      height: size,\n      width: size * 5 + interval * 4,\n      child: Row(\n        children: [\n          for (var i = 0; i < 5; i++)\n            _Star(\n              value: (value - i).clamp(0.0, 1.0),\n              size: size,\n            ).paddingRight(i == 4 ? 0 : interval),\n        ],\n      ),\n    );\n    return onTap == null\n        ? child\n        : GestureDetector(\n            onTap: onTap,\n            child: child,\n          );\n  }\n}\n\nclass _Star extends StatelessWidget {\n  const _Star({required this.value, required this.size});\n\n  final double value; // 0-1\n\n  final double size;\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      width: size,\n      height: size,\n      child: Stack(\n        children: [\n          Icon(\n            Icons.star_outline,\n            size: size,\n            color: context.colorScheme.secondary,\n          ),\n          ClipRect(\n            clipper: _StarClipper(value),\n            child: Icon(\n              Icons.star,\n              size: size,\n              color: context.colorScheme.secondary,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _StarClipper extends CustomClipper<Rect> {\n  final double value;\n\n  _StarClipper(this.value);\n\n  @override\n  Rect getClip(Size size) {\n    return Rect.fromLTWH(0, 0, size.width * value, size.height);\n  }\n\n  @override\n  bool shouldReclip(covariant CustomClipper<Rect> oldClipper) {\n    return oldClipper is! _StarClipper || oldClipper.value != value;\n  }\n}\n\nclass RatingWidget extends StatefulWidget {\n  /// star number\n  final int count;\n\n  /// Max score\n  final double maxRating;\n\n  /// Current score value\n  final double value;\n\n  /// Star size\n  final double size;\n\n  /// Space between the stars\n  final double padding;\n\n  /// Whether the score can be modified by sliding\n  final bool selectable;\n\n  /// Callbacks when ratings change\n  final ValueChanged<double> onRatingUpdate;\n\n  const RatingWidget(\n      {super.key,\n      this.maxRating = 10.0,\n      this.count = 5,\n      this.value = 10.0,\n      this.size = 20,\n      required this.padding,\n      this.selectable = false,\n      required this.onRatingUpdate});\n\n  @override\n  State<RatingWidget> createState() => _RatingWidgetState();\n}\n\nclass _RatingWidgetState extends State<RatingWidget> {\n  double value = 10;\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      onPointerDown: (PointerDownEvent event) {\n        double x = event.localPosition.dx;\n        if (x < 0) x = 0;\n        pointValue(x);\n      },\n      onPointerMove: (PointerMoveEvent event) {\n        double x = event.localPosition.dx;\n        if (x < 0) x = 0;\n        pointValue(x);\n      },\n      onPointerUp: (_) {},\n      behavior: HitTestBehavior.deferToChild,\n      child: buildRowRating(),\n    );\n  }\n\n  pointValue(double dx) {\n    if (!widget.selectable) {\n      return;\n    }\n    if (dx >=\n        widget.size * widget.count + widget.padding * (widget.count - 1)) {\n      value = widget.maxRating;\n    } else {\n      for (double i = 1; i < widget.count + 1; i++) {\n        if (dx > widget.size * i + widget.padding * (i - 1) &&\n            dx < widget.size * i + widget.padding * i) {\n          value = i * (widget.maxRating / widget.count);\n          break;\n        } else if (dx > widget.size * (i - 1) + widget.padding * (i - 1) &&\n            dx < widget.size * i + widget.padding * i) {\n          value = (dx - widget.padding * (i - 1)) /\n              (widget.size * widget.count) *\n              widget.maxRating;\n          break;\n        }\n      }\n    }\n    if (value % 1 >= 0.5) {\n      value = value ~/ 1 + 1;\n    } else {\n      value = (value ~/ 1).toDouble();\n    }\n    if (value < 0) {\n      value = 0;\n    } else if (value > 10) {\n      value = 10;\n    }\n    setState(() {\n      widget.onRatingUpdate(value);\n    });\n  }\n\n  int fullStars() {\n    return (value / (widget.maxRating / widget.count)).floor();\n  }\n\n  double star() {\n    if (widget.count / fullStars() == widget.maxRating / value) {\n      return 0;\n    }\n    return (value % (widget.maxRating / widget.count)) /\n        (widget.maxRating / widget.count);\n  }\n\n  List<Widget> buildRow() {\n    int full = fullStars();\n    List<Widget> children = [];\n    for (int i = 0; i < full; i++) {\n      children.add(Icon(\n        Icons.star,\n        size: widget.size,\n        color: context.colorScheme.secondary,\n      ));\n      if (i < widget.count - 1) {\n        children.add(\n          SizedBox(\n            width: widget.padding,\n          ),\n        );\n      }\n    }\n    if (full < widget.count) {\n      children.add(ClipRect(\n        clipper: _SMClipper(rating: star() * widget.size),\n        child: Icon(\n          Icons.star,\n          size: widget.size,\n          color: context.colorScheme.secondary,\n        ),\n      ));\n    }\n\n    return children;\n  }\n\n  List<Widget> buildNormalRow() {\n    List<Widget> children = [];\n    for (int i = 0; i < widget.count; i++) {\n      children.add(Icon(\n        Icons.star_border,\n        size: widget.size,\n        color: context.colorScheme.secondary,\n      ));\n      if (i < widget.count - 1) {\n        children.add(SizedBox(\n          width: widget.padding,\n        ));\n      }\n    }\n    return children;\n  }\n\n  Widget buildRowRating() {\n    return Stack(\n      children: <Widget>[\n        Row(\n          children: buildNormalRow(),\n        ),\n        Row(\n          children: buildRow(),\n        )\n      ],\n    );\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    value = widget.value;\n  }\n}\n\nclass _SMClipper extends CustomClipper<Rect> {\n  final double rating;\n\n  _SMClipper({required this.rating});\n\n  @override\n  Rect getClip(Size size) {\n    return Rect.fromLTRB(0.0, 0.0, rating, size.height);\n  }\n\n  @override\n  bool shouldReclip(_SMClipper oldClipper) {\n    return rating != oldClipper.rating;\n  }\n}\n\nclass SimpleComicTile extends StatelessWidget {\n  const SimpleComicTile(\n      {super.key, required this.comic, this.onTap, this.withTitle = false, this.heroID});\n\n  final Comic comic;\n\n  final void Function()? onTap;\n\n  final bool withTitle;\n\n  final int? heroID;\n\n  @override\n  Widget build(BuildContext context) {\n    var image = _findImageProvider(comic);\n\n    Widget child = image == null\n        ? const SizedBox()\n        : AnimatedImage(\n            image: image,\n            width: double.infinity,\n            height: double.infinity,\n            fit: BoxFit.cover,\n            filterQuality: FilterQuality.medium,\n          );\n\n    child = Container(\n      width: 98,\n      height: 136,\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(8),\n        color: Theme.of(context).colorScheme.secondaryContainer,\n      ),\n      clipBehavior: Clip.antiAlias,\n      child: child,\n    );\n\n    if (heroID != null) {\n      child = Hero(\n        tag: \"cover$heroID\",\n        child: child,\n      );\n    }\n\n    child = AnimatedTapRegion(\n      borderRadius: 8,\n      onTap: onTap ??\n          () {\n            context.to(\n              () => ComicPage(\n                id: comic.id,\n                sourceKey: comic.sourceKey,\n                cover: comic.cover,\n                title: comic.title,\n                heroID: heroID,\n              ),\n            );\n          },\n      child: child,\n    );\n\n    if (withTitle) {\n      child = Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          child,\n          const SizedBox(height: 4),\n          SizedBox(\n            width: 92,\n            child: Center(\n              child: Text(\n                comic.title.replaceAll('\\n', ''),\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/components/components.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:math' as math;\nimport 'dart:ui' as ui;\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:syntax_highlight/syntax_highlight.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/app_page_route.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/image_provider/cached_image.dart';\nimport 'package:venera/foundation/image_provider/history_image_provider.dart';\nimport 'package:venera/foundation/image_provider/local_comic_image.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/network/cloudflare.dart';\nimport 'package:venera/pages/comic_details_page/comic_page.dart';\nimport 'package:venera/pages/favorites/favorites_page.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\n\npart 'image.dart';\npart 'appbar.dart';\npart 'button.dart';\npart 'consts.dart';\npart 'flyout.dart';\npart 'layout.dart';\npart 'loading.dart';\npart 'menu.dart';\npart 'message.dart';\npart 'navigation_bar.dart';\npart 'pop_up_widget.dart';\npart 'scroll.dart';\npart 'select.dart';\npart 'side_bar.dart';\npart 'comic.dart';\npart 'effects.dart';\npart 'gesture.dart';\npart 'code.dart';"
  },
  {
    "path": "lib/components/consts.dart",
    "content": "part of 'components.dart';\n\nconst _fastAnimationDuration = Duration(milliseconds: 160);"
  },
  {
    "path": "lib/components/custom_slider.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/foundation/app.dart';\n\n/// patched slider.dart with RtL support\nclass _SliderDefaultsM3 extends SliderThemeData {\n  _SliderDefaultsM3(this.context)\n      : super(trackHeight: 4.0);\n\n  final BuildContext context;\n  late final ColorScheme _colors = Theme.of(context).colorScheme;\n\n  @override\n  Color? get activeTrackColor => _colors.primary;\n\n  @override\n  Color? get inactiveTrackColor => _colors.surfaceContainerHighest;\n\n  @override\n  Color? get secondaryActiveTrackColor => _colors.primary.toOpacity(0.54);\n\n  @override\n  Color? get disabledActiveTrackColor => _colors.onSurface.toOpacity(0.38);\n\n  @override\n  Color? get disabledInactiveTrackColor => _colors.onSurface.toOpacity(0.12);\n\n  @override\n  Color? get disabledSecondaryActiveTrackColor => _colors.onSurface.toOpacity(0.12);\n\n  @override\n  Color? get activeTickMarkColor => _colors.onPrimary.toOpacity(0.38);\n\n  @override\n  Color? get inactiveTickMarkColor => _colors.onSurfaceVariant.toOpacity(0.38);\n\n  @override\n  Color? get disabledActiveTickMarkColor => _colors.onSurface.toOpacity(0.38);\n\n  @override\n  Color? get disabledInactiveTickMarkColor => _colors.onSurface.toOpacity(0.38);\n\n  @override\n  Color? get thumbColor => _colors.primary;\n\n  @override\n  Color? get disabledThumbColor => Color.alphaBlend(_colors.onSurface.toOpacity(0.38), _colors.surface);\n\n  @override\n  Color? get overlayColor => WidgetStateColor.resolveWith((Set<WidgetState> states) {\n    if (states.contains(WidgetState.dragged)) {\n      return _colors.primary.toOpacity(0.1);\n    }\n    if (states.contains(WidgetState.hovered)) {\n      return _colors.primary.toOpacity(0.08);\n    }\n    if (states.contains(WidgetState.focused)) {\n      return _colors.primary.toOpacity(0.1);\n    }\n\n    return Colors.transparent;\n  });\n\n  @override\n  TextStyle? get valueIndicatorTextStyle => Theme.of(context).textTheme.labelMedium!.copyWith(\n    color: _colors.onPrimary,\n  );\n\n  @override\n  SliderComponentShape? get valueIndicatorShape => const DropSliderValueIndicatorShape();\n}\n\nclass CustomSlider extends StatefulWidget {\n  const CustomSlider({required this.min, required this.max, required this.value, required this.divisions, required this.onChanged, required this.focusNode, this.reversed = false, super.key});\n\n  final double min;\n\n  final double max;\n\n  final double value;\n\n  final int divisions;\n\n  final void Function(double) onChanged;\n\n  final FocusNode? focusNode;\n\n  final bool reversed;\n\n  @override\n  State<CustomSlider> createState() => _CustomSliderState();\n}\n\nclass _CustomSliderState extends State<CustomSlider> {\n  late double value;\n\n  @override\n  void initState() {\n    super.initState();\n    value = widget.value;\n  }\n\n  @override\n  void didUpdateWidget(CustomSlider oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.value != oldWidget.value) {\n      setState(() {\n        value = widget.value;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final theme = _SliderDefaultsM3(context);\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(24, 12, 24, 12),\n      child: widget.max - widget.min > 0 ? LayoutBuilder(\n        builder: (context, constraints) => MouseRegion(\n          cursor: SystemMouseCursors.click,\n          child: GestureDetector(\n            behavior: HitTestBehavior.translucent,\n            onTapDown: (details){\n              var dx = details.localPosition.dx;\n              if(widget.reversed){\n                dx = constraints.maxWidth - dx;\n              }\n              var gap = constraints.maxWidth / widget.divisions;\n              var gapValue = (widget.max - widget.min)  / widget.divisions;\n              widget.onChanged.call((dx / gap).round() * gapValue + widget.min);\n            },\n            onVerticalDragUpdate: (details){\n              var dx = details.localPosition.dx;\n              if(dx > constraints.maxWidth || dx < 0)  return;\n              if(widget.reversed){\n                dx = constraints.maxWidth - dx;\n              }\n              var gap = constraints.maxWidth / widget.divisions;\n              var gapValue = (widget.max - widget.min)  / widget.divisions;\n              widget.onChanged.call((dx / gap).round() * gapValue + widget.min);\n            },\n            child: SizedBox(\n              height: 24,\n              child: Center(\n                child: SizedBox(\n                  height: 24,\n                  child: Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      Positioned.fill(\n                        child: Center(\n                          child: Container(\n                            width: double.infinity,\n                            height: 6,\n                            decoration: BoxDecoration(\n                                color: theme.inactiveTrackColor,\n                                borderRadius: const BorderRadius.all(Radius.circular(10))\n                            ),\n                          ),\n                        ),\n                      ),\n                      if(constraints.maxWidth / widget.divisions > 10)\n                        Positioned.fill(\n                          child: Row(\n                            children: (){\n                              var res = <Widget>[];\n                              for(int i = 0; i<widget.divisions-1; i++){\n                                res.add(const Spacer());\n                                res.add(Container(\n                                  width: 4,\n                                  height: 4,\n                                  decoration: BoxDecoration(\n                                    color: colorScheme.surface.withRed(10),\n                                    shape: BoxShape.circle,\n                                  ),\n                                ));\n                              }\n                              res.add(const Spacer());\n                              return res;\n                            }.call(),\n                          ),\n                        ),\n                        Positioned(\n                          top: 0,\n                          bottom: 0,\n                          left: widget.reversed ? null : 0,\n                          right: widget.reversed ? 0 : null,\n                          child: Center(\n                            child: Container(\n                              width: constraints.maxWidth * ((value - widget.min) / (widget.max - widget.min)),\n                              height: 8,\n                              decoration: BoxDecoration(\n                                  color: theme.activeTrackColor,\n                                  borderRadius: const BorderRadius.all(Radius.circular(10))\n                              ),\n                            ),\n                          )\n                        ),\n                      Positioned(\n                        top: 0,\n                        bottom: 0,\n                        left: widget.reversed ? null : constraints.maxWidth * ((value - widget.min) / (widget.max - widget.min))-11,\n                        right: !widget.reversed ? null : constraints.maxWidth * ((value - widget.min) / (widget.max - widget.min))-11,\n                        child: Center(\n                          child: Container(\n                            width: 22,\n                            height: 22,\n                            decoration: BoxDecoration(\n                              color: theme.activeTrackColor,\n                              shape: BoxShape.circle,\n                            ),\n                          ),\n                        ),\n                      )\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n      ) : null,\n    );\n  }\n}"
  },
  {
    "path": "lib/components/effects.dart",
    "content": "part of 'components.dart';\n\nclass BlurEffect extends StatelessWidget {\n  final Widget child;\n\n  final double blur;\n\n  final BorderRadius? borderRadius;\n\n  const BlurEffect({\n    required this.child,\n    this.borderRadius,\n    this.blur = 15,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return ClipRRect(\n      borderRadius: borderRadius ?? BorderRadius.zero,\n      child: BackdropFilter(\n        filter: ui.ImageFilter.blur(\n          sigmaX: blur,\n          sigmaY: blur,\n          tileMode: TileMode.mirror,\n        ),\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/flyout.dart",
    "content": "part of \"components.dart\";\n\nconst minFlyoutWidth = 256.0;\nconst minFlyoutHeight = 128.0;\n\nclass FlyoutController {\n  Function? _show;\n\n  void show() {\n    if (_show == null) {\n      throw \"FlyoutController is not attached to a Flyout\";\n    }\n    _show!();\n  }\n}\n\nclass Flyout extends StatefulWidget {\n  const Flyout({\n    super.key,\n    required this.flyoutBuilder,\n    required this.child,\n    this.enableTap = false,\n    this.enableDoubleTap = false,\n    this.enableLongPress = false,\n    this.enableSecondaryTap = false,\n    this.withInkWell = false,\n    this.borderRadius = 0,\n    this.controller,\n    this.navigator,\n  });\n\n  final WidgetBuilder flyoutBuilder;\n\n  final Widget child;\n\n  final bool enableTap;\n\n  final bool enableDoubleTap;\n\n  final bool enableLongPress;\n\n  final bool enableSecondaryTap;\n\n  final bool withInkWell;\n\n  final double borderRadius;\n\n  final NavigatorState? navigator;\n\n  final FlyoutController? controller;\n\n  @override\n  State<Flyout> createState() => FlyoutState();\n\n  static FlyoutState of(BuildContext context) {\n    return context.findAncestorStateOfType<FlyoutState>()!;\n  }\n}\n\nclass FlyoutState extends State<Flyout> {\n  @override\n  void initState() {\n    if (widget.controller != null) {\n      widget.controller?._show = show;\n    }\n    super.initState();\n  }\n\n  @override\n  void didChangeDependencies() {\n    if (widget.controller != null) {\n      widget.controller?._show = show;\n    }\n    super.didChangeDependencies();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (widget.withInkWell) {\n      return InkWell(\n        borderRadius: BorderRadius.circular(widget.borderRadius),\n        onTap: widget.enableTap ? show : null,\n        onDoubleTap: widget.enableDoubleTap ? show : null,\n        onLongPress: widget.enableLongPress ? show : null,\n        onSecondaryTap: widget.enableSecondaryTap ? show : null,\n        child: widget.child,\n      );\n    }\n    return GestureDetector(\n      onTap: widget.enableTap ? show : null,\n      onDoubleTap: widget.enableDoubleTap ? show : null,\n      onLongPress: widget.enableLongPress ? show : null,\n      onSecondaryTap: widget.enableSecondaryTap ? show : null,\n      child: widget.child,\n    );\n  }\n\n  void show() {\n    var renderBox = context.findRenderObject() as RenderBox;\n    var rect = renderBox.localToGlobal(Offset.zero) & renderBox.size;\n    var navigator = widget.navigator ??\n        Navigator.of(\n          context,\n          rootNavigator: true,\n        );\n    navigator.push(PageRouteBuilder(\n        fullscreenDialog: true,\n        barrierDismissible: true,\n        opaque: false,\n        transitionDuration: _fastAnimationDuration,\n        reverseTransitionDuration: _fastAnimationDuration,\n        pageBuilder: (context, animation, secondaryAnimation) {\n          var left = rect.left;\n          var top = rect.bottom;\n\n          if (left + minFlyoutWidth > MediaQuery.of(context).size.width) {\n            left = MediaQuery.of(context).size.width - minFlyoutWidth;\n          }\n          if (top + minFlyoutHeight > MediaQuery.of(context).size.height) {\n            top = MediaQuery.of(context).size.height - minFlyoutHeight;\n          }\n\n          Widget transition(BuildContext context, Animation<double> animation,\n              Animation<double> secondaryAnimation, Widget flyout) {\n            return SlideTransition(\n              position: Tween<Offset>(\n                begin: const Offset(0, -0.05),\n                end: const Offset(0, 0),\n              ).animate(animation),\n              child: flyout,\n            );\n          }\n\n          return Stack(\n            children: [\n              Positioned.fill(\n                child: GestureDetector(\n                  behavior: HitTestBehavior.opaque,\n                  onTap: navigator.pop,\n                  child: AnimatedBuilder(\n                    animation: animation,\n                    builder: (context, builder) {\n                      return ColoredBox(\n                        color: Colors.black.toOpacity(0.3 * animation.value),\n                      );\n                    },\n                  ),\n                ),\n              ),\n              Positioned(\n                left: left,\n                right: 0,\n                top: top,\n                bottom: 0,\n                child: transition(\n                    context,\n                    animation,\n                    secondaryAnimation,\n                    Align(\n                      alignment: Alignment.topLeft,\n                      child: widget.flyoutBuilder(context),\n                    )),\n              )\n            ],\n          );\n        }));\n  }\n}\n\nclass FlyoutContent extends StatelessWidget {\n  const FlyoutContent(\n      {super.key, required this.title, required this.actions, this.content});\n\n  final String title;\n\n  final Widget? content;\n\n  final List<Widget> actions;\n\n  @override\n  Widget build(BuildContext context) {\n    return IntrinsicWidth(\n      child: BlurEffect(\n        borderRadius: BorderRadius.circular(8),\n        child: Material(\n          borderRadius: BorderRadius.circular(8),\n          type: MaterialType.card,\n          color: context.colorScheme.surface.toOpacity(0.82),\n          child: Container(\n            constraints: const BoxConstraints(\n              minWidth: minFlyoutWidth,\n            ),\n            padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n            decoration: BoxDecoration(\n              borderRadius: BorderRadius.circular(8),\n              border: context.brightness == ui.Brightness.dark\n                  ? Border.all(color: context.colorScheme.outlineVariant)\n                  : null,\n            ),\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Text(title,\n                    style: const TextStyle(\n                        fontWeight: FontWeight.bold, fontSize: 16)),\n                if (content != null) content!,\n                const SizedBox(\n                  height: 12,\n                ),\n                Row(\n                  mainAxisSize: MainAxisSize.min,\n                  mainAxisAlignment: MainAxisAlignment.end,\n                  children: [const Spacer(), ...actions],\n                ),\n              ],\n            ),\n          ),\n        ).paddingAll(4),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/gesture.dart",
    "content": "part of 'components.dart';\n\nclass MouseBackDetector extends StatelessWidget {\n  const MouseBackDetector(\n      {super.key, required this.onTapDown, required this.child});\n\n  final Widget child;\n\n  final void Function() onTapDown;\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      onPointerDown: (event) {\n        if (event.buttons == kBackMouseButton) {\n          onTapDown();\n        }\n      },\n      behavior: HitTestBehavior.translucent,\n      child: child,\n    );\n  }\n}\n\nclass AnimatedTapRegion extends StatefulWidget {\n  const AnimatedTapRegion({\n    super.key,\n    required this.child,\n    required this.onTap,\n    this.borderRadius = 0,\n  });\n\n  final Widget child;\n\n  final void Function() onTap;\n\n  final double borderRadius;\n\n  @override\n  State<AnimatedTapRegion> createState() => _AnimatedTapRegionState();\n}\n\nclass _AnimatedTapRegionState extends State<AnimatedTapRegion> {\n  bool isHovered = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return MouseRegion(\n      onEnter: (_) {\n        setState(() {\n          isHovered = true;\n        });\n      },\n      onExit: (_) {\n        setState(() {\n          isHovered = false;\n        });\n      },\n      child: GestureDetector(\n        onTap: widget.onTap,\n        child: AnimatedPhysicalModel(\n          duration: _fastAnimationDuration,\n          elevation: isHovered ? 3 : 1,\n          color: context.colorScheme.surface,\n          shadowColor: context.colorScheme.shadow,\n          borderRadius: BorderRadius.circular(widget.borderRadius),\n          child: widget.child,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/image.dart",
    "content": "part of 'components.dart';\n\nclass AnimatedImage extends StatefulWidget {\n  /// show animation when loading is complete.\n  AnimatedImage({\n    required ImageProvider image,\n    super.key,\n    double scale = 1.0,\n    this.semanticLabel,\n    this.excludeFromSemantics = false,\n    this.width,\n    this.height,\n    this.color,\n    this.opacity,\n    this.colorBlendMode,\n    this.fit,\n    this.alignment = Alignment.center,\n    this.repeat = ImageRepeat.noRepeat,\n    this.centerSlice,\n    this.matchTextDirection = false,\n    this.gaplessPlayback = false,\n    this.filterQuality = FilterQuality.medium,\n    this.isAntiAlias = false,\n    this.part,\n    this.onError,\n    Map<String, String>? headers,\n    int? cacheWidth,\n    int? cacheHeight,\n  })  : image = ResizeImage.resizeIfNeeded(cacheWidth, cacheHeight, image),\n        assert(cacheWidth == null || cacheWidth > 0),\n        assert(cacheHeight == null || cacheHeight > 0);\n\n  final ImageProvider image;\n\n  final String? semanticLabel;\n\n  final bool excludeFromSemantics;\n\n  final double? width;\n\n  final double? height;\n\n  final bool gaplessPlayback;\n\n  final bool matchTextDirection;\n\n  final Rect? centerSlice;\n\n  final ImageRepeat repeat;\n\n  final AlignmentGeometry alignment;\n\n  final BoxFit? fit;\n\n  final BlendMode? colorBlendMode;\n\n  final FilterQuality filterQuality;\n\n  final Animation<double>? opacity;\n\n  final Color? color;\n\n  final bool isAntiAlias;\n\n  final ImagePart? part;\n\n  final Function? onError;\n\n  static void clear() => _AnimatedImageState.clear();\n\n  @override\n  State<AnimatedImage> createState() => _AnimatedImageState();\n}\n\nclass _AnimatedImageState extends State<AnimatedImage>\n    with WidgetsBindingObserver {\n  ImageStream? _imageStream;\n  ImageInfo? _imageInfo;\n  ImageChunkEvent? _loadingProgress;\n  bool _isListeningToStream = false;\n  late bool _invertColors;\n  int? _frameNumber;\n  bool _wasSynchronouslyLoaded = false;\n  late DisposableBuildContext<State<AnimatedImage>> _scrollAwareContext;\n  Object? _lastException;\n  ImageStreamCompleterHandle? _completerHandle;\n\n  static final Map<int, Size> _cache = {};\n\n  static clear() => _cache.clear();\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _scrollAwareContext = DisposableBuildContext<State<AnimatedImage>>(this);\n  }\n\n  @override\n  void dispose() {\n    assert(_imageStream != null);\n    WidgetsBinding.instance.removeObserver(this);\n    _stopListeningToStream();\n    _completerHandle?.dispose();\n    _scrollAwareContext.dispose();\n    _replaceImage(info: null);\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    _updateInvertColors();\n    _resolveImage();\n\n    if (TickerMode.of(context)) {\n      _listenToStream();\n    } else {\n      _stopListeningToStream(keepStreamAlive: true);\n    }\n\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(AnimatedImage oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.image != oldWidget.image) {\n      _resolveImage();\n    }\n  }\n\n  @override\n  void didChangeAccessibilityFeatures() {\n    super.didChangeAccessibilityFeatures();\n    setState(() {\n      _updateInvertColors();\n    });\n  }\n\n  @override\n  void reassemble() {\n    _resolveImage(); // in case the image cache was flushed\n    super.reassemble();\n  }\n\n  void _updateInvertColors() {\n    _invertColors = MediaQuery.maybeInvertColorsOf(context) ??\n        SemanticsBinding.instance.accessibilityFeatures.invertColors;\n  }\n\n  void _resolveImage() {\n    final ScrollAwareImageProvider provider = ScrollAwareImageProvider<Object>(\n      context: _scrollAwareContext,\n      imageProvider: widget.image,\n    );\n    final ImageStream newStream =\n        provider.resolve(createLocalImageConfiguration(\n      context,\n      size: widget.width != null && widget.height != null\n          ? Size(widget.width!, widget.height!)\n          : null,\n    ));\n    _updateSourceStream(newStream);\n  }\n\n  ImageStreamListener? _imageStreamListener;\n\n  ImageStreamListener _getListener({bool recreateListener = false}) {\n    if (_imageStreamListener == null || recreateListener) {\n      _lastException = null;\n      _imageStreamListener = ImageStreamListener(\n        _handleImageFrame,\n        onChunk: _handleImageChunk,\n        onError: (Object error, StackTrace? stackTrace) {\n          // 图片加错错误回调\n          widget.onError?.call(error, stackTrace);\n          setState(() {\n            _lastException = error;\n          });\n        },\n      );\n    }\n    return _imageStreamListener!;\n  }\n\n  void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {\n    setState(() {\n      _replaceImage(info: imageInfo);\n      _loadingProgress = null;\n      _lastException = null;\n      _frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;\n      _wasSynchronouslyLoaded = _wasSynchronouslyLoaded | synchronousCall;\n    });\n  }\n\n  void _handleImageChunk(ImageChunkEvent event) {\n    setState(() {\n      _loadingProgress = event;\n      _lastException = null;\n    });\n  }\n\n  void _replaceImage({required ImageInfo? info}) {\n    final ImageInfo? oldImageInfo = _imageInfo;\n    SchedulerBinding.instance\n        .addPostFrameCallback((_) => oldImageInfo?.dispose());\n    _imageInfo = info;\n  }\n\n  // Updates _imageStream to newStream, and moves the stream listener\n  // registration from the old stream to the new stream (if a listener was\n  // registered).\n  void _updateSourceStream(ImageStream newStream) {\n    if (_imageStream?.key == newStream.key) {\n      return;\n    }\n\n    if (_isListeningToStream) {\n      _imageStream!.removeListener(_getListener());\n    }\n\n    if (!widget.gaplessPlayback) {\n      setState(() {\n        _replaceImage(info: null);\n      });\n    }\n\n    setState(() {\n      _loadingProgress = null;\n      _frameNumber = null;\n      _wasSynchronouslyLoaded = false;\n    });\n\n    _imageStream = newStream;\n    if (_isListeningToStream) {\n      _imageStream!.addListener(_getListener());\n    }\n  }\n\n  void _listenToStream() {\n    if (_isListeningToStream) {\n      return;\n    }\n\n    _imageStream!.addListener(_getListener());\n    _completerHandle?.dispose();\n    _completerHandle = null;\n\n    _isListeningToStream = true;\n  }\n\n  /// Stops listening to the image stream, if this state object has attached a\n  /// listener.\n  ///\n  /// If the listener from this state is the last listener on the stream, the\n  /// stream will be disposed. To keep the stream alive, set `keepStreamAlive`\n  /// to true, which create [ImageStreamCompleterHandle] to keep the completer\n  /// alive and is compatible with the [TickerMode] being off.\n  void _stopListeningToStream({bool keepStreamAlive = false}) {\n    if (!_isListeningToStream) {\n      return;\n    }\n\n    if (keepStreamAlive &&\n        _completerHandle == null &&\n        _imageStream?.completer != null) {\n      _completerHandle = _imageStream!.completer!.keepAlive();\n    }\n\n    _imageStream!.removeListener(_getListener());\n    _isListeningToStream = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget result;\n\n    if (_imageInfo != null) {\n      if (widget.part != null) {\n        result =  CustomPaint(\n          isComplex: true,\n          painter: ImagePainter(\n            image: _imageInfo!.image,\n            part: widget.part!,\n            fit: widget.fit ?? BoxFit.cover,\n          ),\n          child: SizedBox(\n            width: widget.width,\n            height: widget.height,\n          ),\n        );\n      } else {\n        result = RawImage(\n          image: _imageInfo?.image,\n          width: widget.width,\n          height: widget.height,\n          debugImageLabel: _imageInfo?.debugLabel,\n          scale: _imageInfo?.scale ?? 1.0,\n          color: widget.color,\n          opacity: widget.opacity,\n          colorBlendMode: widget.colorBlendMode,\n          fit: BoxFit.cover,\n          alignment: widget.alignment,\n          repeat: widget.repeat,\n          centerSlice: widget.centerSlice,\n          matchTextDirection: widget.matchTextDirection,\n          invertColors: _invertColors,\n          isAntiAlias: widget.isAntiAlias,\n          filterQuality: widget.filterQuality,\n        );\n      }\n    } else if (_lastException != null) {\n      result = const Center(\n        child: Icon(Icons.error),\n      );\n\n      if (!widget.excludeFromSemantics) {\n        result = Semantics(\n          container: widget.semanticLabel != null,\n          image: true,\n          label: widget.semanticLabel ?? '',\n          child: result,\n        );\n      }\n    } else {\n      result = const Center();\n    }\n\n    return AnimatedSwitcher(\n      duration: const Duration(milliseconds: 200),\n      reverseDuration: const Duration(milliseconds: 200),\n      child: result,\n    );\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder description) {\n    super.debugFillProperties(description);\n    description.add(DiagnosticsProperty<ImageStream>('stream', _imageStream));\n    description.add(DiagnosticsProperty<ImageInfo>('pixels', _imageInfo));\n    description.add(DiagnosticsProperty<ImageChunkEvent>(\n        'loadingProgress', _loadingProgress));\n    description.add(DiagnosticsProperty<int>('frameNumber', _frameNumber));\n    description.add(DiagnosticsProperty<bool>(\n        'wasSynchronouslyLoaded', _wasSynchronouslyLoaded));\n  }\n}\n\nclass ImagePart {\n  final double? x1;\n  final double? y1;\n  final double? x2;\n  final double? y2;\n\n  const ImagePart({\n    this.x1,\n    this.y1,\n    this.x2,\n    this.y2,\n  });\n}\n\nclass ImagePainter extends CustomPainter {\n  final ui.Image image;\n\n  final ImagePart part;\n\n  final BoxFit fit;\n\n  /// Render a part of the image.\n  const ImagePainter({\n    required this.image,\n    this.part = const ImagePart(),\n    this.fit = BoxFit.cover,\n  });\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    final Rect src = Rect.fromPoints(\n      Offset(part.x1 ?? 0, part.y1 ?? 0),\n      Offset(\n        part.x2 ?? image.width.toDouble(),\n        part.y2 ?? image.height.toDouble(),\n      ),\n    );\n    var fitted = applyBoxFit(fit, Size(src.width, src.height), size).destination;\n    var dst = Alignment.center.inscribe(fitted, Offset.zero & size);\n    canvas.drawImageRect(image, src, dst, Paint());\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return oldDelegate is! ImagePainter ||\n        oldDelegate.image != image ||\n        oldDelegate.part.x1 != part.x1 ||\n        oldDelegate.part.y1 != part.y1 ||\n        oldDelegate.part.x2 != part.x2 ||\n        oldDelegate.part.y2 != part.y2;\n  }\n}\n"
  },
  {
    "path": "lib/components/js_ui.dart",
    "content": "import 'dart:typed_data';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/js_engine.dart';\n\nimport 'components.dart';\n\nmixin class JsUiApi {\n  final Map<int, LoadingDialogController> _loadingDialogControllers = {};\n\n  dynamic handleUIMessage(Map<String, dynamic> message) {\n    switch (message['function']) {\n      case 'showMessage':\n        var m = message['message'];\n        if (m.toString().isNotEmpty) {\n          App.rootContext.showMessage(message: m.toString());\n        }\n      case 'showDialog':\n        return _showDialog(message);\n      case 'launchUrl':\n        var url = message['url'];\n        if (url.toString().isNotEmpty) {\n          launchUrlString(url.toString());\n        }\n      case 'showLoading':\n        var onCancel = message['onCancel'];\n        if (onCancel != null && onCancel is! JSInvokable) {\n          return;\n        }\n        return _showLoading(onCancel);\n      case 'cancelLoading':\n        var id = message['id'];\n        if (id is int) {\n          _cancelLoading(id);\n        }\n      case 'showInputDialog':\n        var title = message['title'];\n        var validator = message['validator'];\n        var image = message['image'];\n        if (title is! String) return;\n        if (validator != null && validator is! JSInvokable) return;\n        return _showInputDialog(title, validator, image);\n      case 'showSelectDialog':\n        var title = message['title'];\n        var options = message['options'];\n        var initialIndex = message['initialIndex'];\n        if (title is! String) return;\n        if (options is! List) return;\n        if (initialIndex != null && initialIndex is! int) return;\n        return _showSelectDialog(\n          title,\n          options.whereType<String>().toList(),\n          initialIndex,\n        );\n    }\n  }\n\n  Future<void> _showDialog(Map<String, dynamic> message) {\n    BuildContext? dialogContext;\n    var title = message['title'];\n    var content = message['content'];\n    var actions = <Widget>[];\n    for (var action in message['actions']) {\n      if (action['callback'] is! JSInvokable) {\n        continue;\n      }\n      var callback = action['callback'] as JSInvokable;\n      var text = action['text'].toString();\n      var style = (action['style'] ?? 'text').toString();\n      actions.add(_JSCallbackButton(\n        text: text,\n        callback: JSAutoFreeFunction(callback),\n        style: style,\n        onCallbackFinished: () {\n          dialogContext?.pop();\n        },\n      ));\n    }\n    if (actions.isEmpty) {\n      actions.add(TextButton(\n        onPressed: () {\n          dialogContext?.pop();\n        },\n        child: Text('OK'),\n      ));\n    }\n    return showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        dialogContext = context;\n        return ContentDialog(\n          title: title,\n          content: Text(content).paddingHorizontal(16),\n          actions: actions,\n        );\n      },\n    ).then((value) {\n      dialogContext = null;\n    });\n  }\n\n  int _showLoading(JSInvokable? onCancel) {\n    var func = onCancel == null ? null : JSAutoFreeFunction(onCancel);\n    var controller = showLoadingDialog(\n      App.rootContext,\n      barrierDismissible: onCancel != null,\n      allowCancel: onCancel != null,\n      onCancel: onCancel == null\n          ? null\n          : () {\n              func?.call([]);\n            },\n    );\n    var i = 0;\n    while (_loadingDialogControllers.containsKey(i)) {\n      i++;\n    }\n    _loadingDialogControllers[i] = controller;\n    return i;\n  }\n\n  void _cancelLoading(int id) {\n    var controller = _loadingDialogControllers.remove(id);\n    controller?.close();\n  }\n\n  Future<String?> _showInputDialog(String title, JSInvokable? validator, dynamic image) async {\n    String? result;\n    var func = validator == null ? null : JSAutoFreeFunction(validator);\n    String? imageUrl;\n    Uint8List? imageData;\n    if (image != null) {\n      if (image is String) {\n        imageUrl = image;\n      } else if (image is Uint8List) {\n        imageData = image;\n      } else if (image is List<int>) {\n        imageData = Uint8List.fromList(image);\n      }\n    }\n    await showInputDialog(\n      context: App.rootContext,\n      title: title,\n      image: imageUrl,\n      imageData: imageData,\n      onConfirm: (v) {\n        if (func != null) {\n          var res = func.call([v]);\n          if (res != null) {\n            return res.toString();\n          } else {\n            result = v;\n          }\n        } else {\n          result = v;\n        }\n        return null;\n      },\n    );\n    return result;\n  }\n\n  Future<int?> _showSelectDialog(\n    String title,\n    List<String> options,\n    int? initialIndex,\n  ) {\n    if (options.isEmpty) {\n      return Future.value(null);\n    }\n    if (initialIndex != null &&\n        (initialIndex >= options.length || initialIndex < 0)) {\n      initialIndex = null;\n    }\n    return showSelectDialog(\n      title: title,\n      options: options,\n      initialIndex: initialIndex,\n    );\n  }\n}\n\nclass _JSCallbackButton extends StatefulWidget {\n  const _JSCallbackButton({\n    required this.text,\n    required this.callback,\n    required this.style,\n    this.onCallbackFinished,\n  });\n\n  final JSAutoFreeFunction callback;\n\n  final String text;\n\n  final String style;\n\n  final void Function()? onCallbackFinished;\n\n  @override\n  State<_JSCallbackButton> createState() => _JSCallbackButtonState();\n}\n\nclass _JSCallbackButtonState extends State<_JSCallbackButton> {\n  bool isLoading = false;\n\n  void onClick() async {\n    if (isLoading) {\n      return;\n    }\n    var res = widget.callback.call([]);\n    if (res is Future) {\n      setState(() {\n        isLoading = true;\n      });\n      await res;\n      setState(() {\n        isLoading = false;\n      });\n    }\n    widget.onCallbackFinished?.call();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return switch (widget.style) {\n      \"filled\" => FilledButton(\n          onPressed: onClick,\n          child: isLoading\n              ? CircularProgressIndicator(strokeWidth: 1.4)\n                  .fixWidth(18)\n                  .fixHeight(18)\n              : Text(widget.text),\n        ),\n      \"danger\" => FilledButton(\n          onPressed: onClick,\n          style: ButtonStyle(\n            backgroundColor: WidgetStateProperty.all(context.colorScheme.error),\n          ),\n          child: isLoading\n              ? CircularProgressIndicator(strokeWidth: 1.4)\n                  .fixWidth(18)\n                  .fixHeight(18)\n              : Text(widget.text),\n        ),\n      _ => TextButton(\n          onPressed: onClick,\n          child: isLoading\n              ? CircularProgressIndicator(strokeWidth: 1.4)\n                  .fixWidth(18)\n                  .fixHeight(18)\n              : Text(widget.text),\n        ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/components/layout.dart",
    "content": "part of 'components.dart';\n\nclass SliverGridViewWithFixedItemHeight extends StatelessWidget {\n  const SliverGridViewWithFixedItemHeight(\n      {required this.delegate,\n      required this.maxCrossAxisExtent,\n      required this.itemHeight,\n      super.key});\n\n  final SliverChildDelegate delegate;\n\n  final double maxCrossAxisExtent;\n\n  final double itemHeight;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverLayoutBuilder(\n      builder: (context, constraints) => SliverGrid(\n        delegate: delegate,\n        gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(\n          maxCrossAxisExtent: maxCrossAxisExtent,\n          childAspectRatio: calcChildAspectRatio(constraints.crossAxisExtent),\n        ),\n      ),\n    );\n  }\n\n  double calcChildAspectRatio(double width) {\n    var crossItems = width ~/ maxCrossAxisExtent;\n    if (width % maxCrossAxisExtent != 0) {\n      crossItems += 1;\n    }\n    final itemWidth = width / crossItems;\n    return itemWidth / itemHeight;\n  }\n}\n\nclass SliverGridDelegateWithFixedHeight extends SliverGridDelegate {\n  const SliverGridDelegateWithFixedHeight({\n    required this.maxCrossAxisExtent,\n    required this.itemHeight,\n  });\n\n  final double maxCrossAxisExtent;\n\n  final double itemHeight;\n\n  @override\n  SliverGridLayout getLayout(SliverConstraints constraints) {\n    final width = constraints.crossAxisExtent;\n    var crossItems = width ~/ maxCrossAxisExtent;\n    if (width % maxCrossAxisExtent != 0) {\n      crossItems += 1;\n    }\n    return SliverGridRegularTileLayout(\n        crossAxisCount: crossItems,\n        mainAxisStride: itemHeight,\n        crossAxisStride: width / crossItems,\n        childMainAxisExtent: itemHeight,\n        childCrossAxisExtent: width / crossItems,\n        reverseCrossAxis: false);\n  }\n\n  @override\n  bool shouldRelayout(covariant SliverGridDelegate oldDelegate) {\n    if (oldDelegate is! SliverGridDelegateWithFixedHeight) return true;\n    if (oldDelegate.maxCrossAxisExtent != maxCrossAxisExtent ||\n        oldDelegate.itemHeight != itemHeight) {\n      return true;\n    }\n    return false;\n  }\n}\n\nclass SliverGridDelegateWithComics extends SliverGridDelegate {\n  SliverGridDelegateWithComics();\n\n  final bool useBriefMode = appdata.settings['comicDisplayMode'] == 'brief';\n\n  final double scale = (appdata.settings['comicTileScale'] as num).toDouble();\n\n  @override\n  SliverGridLayout getLayout(SliverConstraints constraints) {\n    if (useBriefMode) {\n      return getBriefModeLayout(\n        constraints,\n        scale,\n      );\n    } else {\n      return getDetailedModeLayout(\n        constraints,\n        scale,\n      );\n    }\n  }\n\n  SliverGridLayout getDetailedModeLayout(\n      SliverConstraints constraints, double scale) {\n    const minCrossAxisExtent = 360;\n    final itemHeight = 152 * scale;\n    final width = constraints.crossAxisExtent;\n    var crossItems = width ~/ minCrossAxisExtent;\n    crossItems = math.max(1, crossItems);\n    return SliverGridRegularTileLayout(\n        crossAxisCount: crossItems,\n        mainAxisStride: itemHeight,\n        crossAxisStride: width / crossItems,\n        childMainAxisExtent: itemHeight,\n        childCrossAxisExtent: width / crossItems,\n        reverseCrossAxis: false);\n  }\n\n  SliverGridLayout getBriefModeLayout(\n      SliverConstraints constraints, double scale) {\n    final maxCrossAxisExtent = 192.0 * scale;\n    const childAspectRatio = 0.64;\n    const crossAxisSpacing = 0.0;\n    int crossAxisCount =\n        (constraints.crossAxisExtent / (maxCrossAxisExtent + crossAxisSpacing))\n            .ceil();\n    // Ensure a minimum count of 1, can be zero and result in an infinite extent\n    // below when the window size is 0.\n    crossAxisCount = math.max(1, crossAxisCount);\n    final double usableCrossAxisExtent = math.max(\n      0.0,\n      constraints.crossAxisExtent - crossAxisSpacing * (crossAxisCount - 1),\n    );\n    final double childCrossAxisExtent = usableCrossAxisExtent / crossAxisCount;\n    final double childMainAxisExtent = childCrossAxisExtent / childAspectRatio;\n    return SliverGridRegularTileLayout(\n      crossAxisCount: crossAxisCount,\n      mainAxisStride: childMainAxisExtent,\n      crossAxisStride: childCrossAxisExtent + crossAxisSpacing,\n      childMainAxisExtent: childMainAxisExtent,\n      childCrossAxisExtent: childCrossAxisExtent,\n      reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection),\n    );\n  }\n\n  @override\n  bool shouldRelayout(covariant SliverGridDelegate oldDelegate) {\n    if (oldDelegate is! SliverGridDelegateWithComics) return true;\n    if (oldDelegate.scale != scale ||\n        oldDelegate.useBriefMode != useBriefMode) {\n      return true;\n    }\n    return false;\n  }\n}\n\nclass SliverLazyToBoxAdapter extends StatelessWidget {\n  /// Creates a sliver that contains a single box widget which can be lazy loaded.\n  const SliverLazyToBoxAdapter({super.key, required this.child});\n\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverList.list(children: [\n      SizedBox(),\n      child,\n    ]);\n  }\n}\n\nclass SliverAnimatedVisibility extends StatelessWidget {\n  const SliverAnimatedVisibility({\n    super.key,\n    required this.visible,\n    required this.child,\n  });\n\n  final bool visible;\n\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    var child = visible ? this.child : const SizedBox.shrink();\n\n    return SliverToBoxAdapter(\n      child: AnimatedSize(\n        duration: const Duration(milliseconds: 200),\n        curve: Curves.easeInOut,\n        alignment: Alignment.topCenter,\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/loading.dart",
    "content": "part of 'components.dart';\n\nclass NetworkError extends StatelessWidget {\n  const NetworkError({\n    super.key,\n    required this.message,\n    this.retry,\n    this.withAppbar = true,\n    this.buttonText,\n    this.action,\n  });\n\n  final String message;\n\n  final void Function()? retry;\n\n  final bool withAppbar;\n\n  final String? buttonText;\n\n  final Widget? action;\n\n  @override\n  Widget build(BuildContext context) {\n    var cfe = CloudflareException.fromString(message);\n    Widget body = Center(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Center(\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Icon(\n                  Icons.error_outline,\n                  size: 28,\n                  color: context.colorScheme.error,\n                ),\n                const SizedBox(width: 8),\n                Text(\n                  \"Error\".tl,\n                  style: ts.withColor(context.colorScheme.error).s16,\n                ),\n              ],\n            ),\n          ),\n          const SizedBox(height: 8),\n          Text(\n            cfe == null ? message : \"Cloudflare verification required\".tl,\n            textAlign: TextAlign.center,\n            maxLines: 3,\n          ),\n          TextButton(\n            onPressed: () {\n              saveFile(\n                data: utf8.encode(Log().toString()),\n                filename: 'log.txt',\n              );\n            },\n            child: Text(\"Export logs\".tl),\n          ),\n          const SizedBox(height: 8),\n          if (retry != null)\n            if (cfe != null)\n              FilledButton(\n                onPressed: () => passCloudflare(\n                  CloudflareException.fromString(message)!,\n                  retry!,\n                ),\n                child: Text('Verify'.tl),\n              )\n            else\n              Row(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [\n                  if (action != null)\n                    action!.paddingRight(8),\n                  FilledButton(\n                    onPressed: retry,\n                    child: Text(buttonText ?? 'Retry'.tl),\n                  ),\n                ],\n              ),\n        ],\n      ),\n    );\n    if (withAppbar) {\n      body = Column(\n        children: [\n          const Appbar(title: Text(\"\")),\n          Expanded(child: body),\n        ],\n      );\n    }\n    return Material(child: body);\n  }\n}\n\nclass ListLoadingIndicator extends StatelessWidget {\n  const ListLoadingIndicator({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return const SizedBox(\n      width: double.infinity,\n      height: 80,\n      child: Center(child: FiveDotLoadingAnimation()),\n    );\n  }\n}\n\nclass SliverListLoadingIndicator extends StatelessWidget {\n  const SliverListLoadingIndicator({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    // SliverToBoxAdapter can not been lazy loaded.\n    // Use SliverList to make sure the animation can be lazy loaded.\n    return SliverList.list(\n      children: const [SizedBox(), ListLoadingIndicator()],\n    );\n  }\n}\n\nabstract class LoadingState<T extends StatefulWidget, S extends Object>\n    extends State<T> {\n  bool isLoading = false;\n\n  S? data;\n\n  String? error;\n\n  Future<Res<S>> loadData();\n\n  Future<Res<S>> loadDataWithRetry() async {\n    int retry = 0;\n    while (true) {\n      var res = await loadData();\n      if (res.success) {\n        return res;\n      } else {\n        if (!mounted) return res;\n        if (retry >= 3) {\n          return res;\n        }\n        retry++;\n        await Future.delayed(const Duration(milliseconds: 200));\n      }\n    }\n  }\n\n  FutureOr<void> onDataLoaded() {}\n\n  Widget buildContent(BuildContext context, S data);\n\n  Widget? buildFrame(BuildContext context, Widget child) => null;\n\n  Widget buildLoading() {\n    return Center(\n      child: const CircularProgressIndicator(\n        strokeWidth: 2,\n      ).fixWidth(32).fixHeight(32),\n    );\n  }\n\n  void retry() {\n    setState(() {\n      isLoading = true;\n      error = null;\n    });\n    loadDataWithRetry().then((value) async {\n      if (value.success) {\n        data = value.data;\n        await onDataLoaded();\n        setState(() {\n          isLoading = false;\n        });\n      } else {\n        setState(() {\n          isLoading = false;\n          error = value.errorMessage!;\n        });\n      }\n    });\n  }\n\n  Widget buildError() {\n    return NetworkError(message: error!, retry: retry);\n  }\n\n  @override\n  @mustCallSuper\n  void initState() {\n    isLoading = true;\n    Future.microtask(() {\n      loadDataWithRetry().then((value) async {\n        if (!mounted) return;\n        if (value.success) {\n          data = value.data;\n          await onDataLoaded();\n          setState(() {\n            isLoading = false;\n          });\n        } else {\n          setState(() {\n            isLoading = false;\n            error = value.errorMessage!;\n          });\n        }\n      });\n    });\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n\n    if (isLoading) {\n      child = buildLoading();\n    } else if (error != null) {\n      child = buildError();\n    } else {\n      child = buildContent(context, data!);\n    }\n\n    return buildFrame(context, child) ?? child;\n  }\n}\n\nabstract class MultiPageLoadingState<T extends StatefulWidget, S extends Object>\n    extends State<T> {\n  bool _isFirstLoading = true;\n\n  bool _isLoading = false;\n\n  List<S>? data;\n\n  String? _error;\n\n  int _page = 1;\n\n  int? _maxPage;\n\n  Future<Res<List<S>>> loadData(int page);\n\n  Widget? buildFrame(BuildContext context, Widget child) => null;\n\n  Widget buildContent(BuildContext context, List<S> data);\n\n  bool get isLoading => _isLoading || _isFirstLoading;\n\n  bool get isFirstLoading => _isFirstLoading;\n\n  bool get haveNextPage => _maxPage == null || _page <= _maxPage!;\n\n  void nextPage() {\n    if (_maxPage != null && _page > _maxPage!) return;\n    if (_isLoading) return;\n    _isLoading = true;\n    loadData(_page).then((value) {\n      _isLoading = false;\n      if (mounted) {\n        if (value.success) {\n          _page++;\n          if (value.subData is int) {\n            _maxPage = value.subData as int;\n          }\n          setState(() {\n            data!.addAll(value.data);\n          });\n        } else {\n          var message = value.errorMessage ?? \"Network Error\";\n          if (message.length > 20) {\n            message = \"${message.substring(0, 20)}...\";\n          }\n          context.showMessage(message: message);\n        }\n      }\n    });\n  }\n\n  void reset() {\n    setState(() {\n      _isFirstLoading = true;\n      _isLoading = false;\n      data = null;\n      _error = null;\n      _page = 1;\n    });\n    firstLoad();\n  }\n\n  void firstLoad() {\n    Future.microtask(() {\n      loadData(_page).then((value) {\n        if (!mounted) return;\n        if (value.success) {\n          _page++;\n          if (value.subData is int) {\n            _maxPage = value.subData as int;\n          }\n          setState(() {\n            _isFirstLoading = false;\n            data = value.data;\n          });\n        } else {\n          setState(() {\n            _isFirstLoading = false;\n            _error = value.errorMessage!;\n          });\n        }\n      });\n    });\n  }\n\n  @override\n  void initState() {\n    firstLoad();\n    super.initState();\n  }\n\n  Widget buildLoading(BuildContext context) {\n    return Center(\n      child: const CircularProgressIndicator().fixWidth(32).fixHeight(32),\n    );\n  }\n\n  Widget buildError(BuildContext context, String error) {\n    return NetworkError(withAppbar: false, message: error, retry: reset);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n\n    if (_isFirstLoading) {\n      child = buildLoading(context);\n    } else if (_error != null) {\n      child = buildError(context, _error!);\n    } else {\n      child = NotificationListener<ScrollNotification>(\n        onNotification: (notification) {\n          if (notification.metrics.pixels ==\n              notification.metrics.maxScrollExtent) {\n            nextPage();\n          }\n          return false;\n        },\n        child: buildContent(context, data!),\n      );\n    }\n\n    return buildFrame(context, child) ?? child;\n  }\n}\n\nclass FiveDotLoadingAnimation extends StatefulWidget {\n  const FiveDotLoadingAnimation({super.key});\n\n  @override\n  State<FiveDotLoadingAnimation> createState() =>\n      _FiveDotLoadingAnimationState();\n}\n\nclass _FiveDotLoadingAnimationState extends State<FiveDotLoadingAnimation>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 1200),\n      upperBound: 6,\n    )..repeat(min: 0, max: 5.2, period: const Duration(milliseconds: 1200));\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  static const _colors = [\n    Colors.red,\n    Colors.green,\n    Colors.blue,\n    Colors.yellow,\n    Colors.purple,\n  ];\n\n  static const _padding = 12.0;\n\n  static const _dotSize = 12.0;\n\n  static const _height = 24.0;\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: _controller,\n      builder: (context, child) {\n        return SizedBox(\n          width: _dotSize * 5 + _padding * 6,\n          height: _height,\n          child: Stack(children: List.generate(5, (index) => buildDot(index))),\n        );\n      },\n    );\n  }\n\n  Widget buildDot(int index) {\n    var value = _controller.value;\n    var startValue = index * 0.8;\n    return Positioned(\n      left: index * _dotSize + (index + 1) * _padding,\n      bottom:\n          (math.sin(math.pi / 2 * (value - startValue).clamp(0, 2))) *\n          (_height - _dotSize),\n      child: Container(\n        width: _dotSize,\n        height: _dotSize,\n        decoration: BoxDecoration(\n          color: _colors[index],\n          shape: BoxShape.circle,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/menu.dart",
    "content": "part of \"components.dart\";\n\nvoid showMenuX(BuildContext context, Offset location, List<MenuEntry> entries) {\n  Navigator.of(context, rootNavigator: true).push(_MenuRoute(entries, location));\n}\n\nclass _MenuRoute<T> extends PopupRoute<T> {\n  final List<MenuEntry> entries;\n\n  final Offset location;\n\n  _MenuRoute(this.entries, this.location);\n\n  @override\n  Color? get barrierColor => Colors.transparent;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  String? get barrierLabel => \"menu\";\n\n  double get entryHeight => App.isMobile ? 42 : 36;\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    var width = entries.first.icon == null ? 216.0 : 242.0;\n    final size = MediaQuery.of(context).size;\n    var left = location.dx;\n    if (left < 10) {\n      left = 10;\n    } \n    if (left + width > size.width - 10) {\n      left = size.width - width - 10;\n    }\n    var top = location.dy;\n    var height = 16 + entryHeight * entries.length;\n    if (top + height > size.height - 15) {\n      top = size.height - height - 15;\n    }\n    return Stack(\n      children: [\n        Positioned(\n          left: left,\n          top: top,\n          child: Container(\n            decoration: BoxDecoration(\n              borderRadius: BorderRadius.circular(4),\n              border: context.brightness == Brightness.dark\n                  ? Border.all(color: context.colorScheme.outlineVariant)\n                  : null,\n              boxShadow: [\n                BoxShadow(\n                  color: context.colorScheme.shadow.toOpacity(0.2),\n                  blurRadius: 8,\n                  blurStyle: BlurStyle.outer,\n                ),\n              ],\n            ),\n            child: BlurEffect(\n              borderRadius: BorderRadius.circular(4),\n              child: Material(\n                color: context.colorScheme.surface.toOpacity(0.92),\n                borderRadius: BorderRadius.circular(4),\n                child: Container(\n                  width: width,\n                  padding:\n                      const EdgeInsets.symmetric(vertical: 12, horizontal: 6),\n                  child: Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children:\n                        entries.map((e) => buildEntry(e, context)).toList(),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        )\n      ],\n    );\n  }\n\n  Widget buildEntry(MenuEntry entry, BuildContext context) {\n    return InkWell(\n      borderRadius: BorderRadius.circular(4),\n      onTap: () {\n        Navigator.of(context).pop();\n        entry.onClick();\n      },\n      child: SizedBox(\n        height: entryHeight,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 12),\n          child: Row(\n            children: [\n              if (entry.icon != null)\n                Icon(\n                  entry.icon,\n                  size: 18,\n                  color: entry.color\n                ),\n              const SizedBox(width: 12),\n              Text(\n                  entry.text,\n                  style: TextStyle(color: entry.color)\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 200);\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation, Widget child) {\n    return FadeTransition(\n      opacity: animation.drive(Tween<double>(begin: 0, end: 1)\n          .chain(CurveTween(curve: Curves.ease))),\n      child: child,\n    );\n  }\n}\n\nclass MenuEntry {\n  final String text;\n  final IconData? icon;\n  final Color? color;\n  final void Function() onClick;\n\n  MenuEntry({required this.text, this.icon, this.color, required this.onClick});\n}\n"
  },
  {
    "path": "lib/components/message.dart",
    "content": "part of \"components.dart\";\n\nvoid showToast({\n  required String message,\n  required BuildContext context,\n  Widget? icon,\n  Widget? trailing,\n  int? seconds,\n}) {\n  var newEntry = OverlayEntry(\n      builder: (context) => _ToastOverlay(\n            message: message,\n            icon: icon,\n            trailing: trailing,\n          ));\n\n  var state = context.findAncestorStateOfType<OverlayWidgetState>();\n\n  state?.addOverlay(newEntry);\n\n  Timer(Duration(seconds: seconds ?? 2), () => state?.remove(newEntry));\n}\n\nclass _ToastOverlay extends StatelessWidget {\n  const _ToastOverlay({required this.message, this.icon, this.trailing});\n\n  final String message;\n\n  final Widget? icon;\n\n  final Widget? trailing;\n\n  @override\n  Widget build(BuildContext context) {\n    return Positioned(\n      bottom: 24 + MediaQuery.of(context).viewInsets.bottom,\n      left: 0,\n      right: 0,\n      child: Align(\n        alignment: Alignment.bottomCenter,\n        child: Material(\n          color: Theme.of(context).colorScheme.inverseSurface,\n          borderRadius: BorderRadius.circular(8),\n          elevation: 2,\n          textStyle:\n              ts.withColor(Theme.of(context).colorScheme.onInverseSurface),\n          child: IconTheme(\n            data: IconThemeData(\n                color: Theme.of(context).colorScheme.onInverseSurface),\n            child: IntrinsicWidth(\n              child: Container(\n                padding:\n                    const EdgeInsets.symmetric(vertical: 6, horizontal: 16),\n                constraints: BoxConstraints(\n                  maxWidth: context.width - 32,\n                ),\n                child: Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    if (icon != null) icon!.paddingRight(8),\n                    Expanded(\n                      child: Text(\n                        message,\n                        style: const TextStyle(\n                            fontSize: 16, fontWeight: FontWeight.w500),\n                        maxLines: 3,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    ),\n                    if (trailing != null) trailing!.paddingLeft(8)\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass OverlayWidget extends StatefulWidget {\n  const OverlayWidget(this.child, {super.key});\n\n  final Widget child;\n\n  @override\n  State<OverlayWidget> createState() => OverlayWidgetState();\n}\n\nclass OverlayWidgetState extends State<OverlayWidget> {\n  final overlayKey = GlobalKey<OverlayState>();\n\n  var entries = <OverlayEntry>[];\n\n  void addOverlay(OverlayEntry entry) {\n    if (overlayKey.currentState != null) {\n      overlayKey.currentState!.insert(entry);\n      entries.add(entry);\n    }\n  }\n\n  void remove(OverlayEntry entry) {\n    if (entries.remove(entry)) {\n      entry.remove();\n    }\n  }\n\n  void removeAll() {\n    for (var entry in entries) {\n      entry.remove();\n    }\n    entries.clear();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Overlay(\n      key: overlayKey,\n      initialEntries: [OverlayEntry(builder: (context) => widget.child)],\n    );\n  }\n}\n\nvoid showDialogMessage(BuildContext context, String title, String message) {\n  showDialog(\n    context: context,\n    builder: (context) => ContentDialog(\n      title: title,\n      content: Text(message).paddingHorizontal(16),\n      actions: [\n        FilledButton(\n          onPressed: context.pop,\n          child: Text(\"OK\".tl),\n        )\n      ],\n    ),\n  );\n}\n\nFuture<void> showConfirmDialog({\n  required BuildContext context,\n  required String title,\n  required String content,\n  required void Function() onConfirm,\n  String confirmText = \"Confirm\",\n  Color? btnColor,\n}) {\n  return showDialog(\n    context: context,\n    builder: (context) => ContentDialog(\n      title: title,\n      content: Text(content).paddingHorizontal(16).paddingVertical(8),\n      actions: [\n        FilledButton(\n          onPressed: () {\n            context.pop();\n            onConfirm();\n          },\n          style: FilledButton.styleFrom(\n            backgroundColor: btnColor,\n          ),\n          child: Text(confirmText.tl),\n        ),\n      ],\n    ),\n  );\n}\n\nclass LoadingDialogController {\n  double? _progress;\n\n  String? _message;\n\n  void Function()? _closeDialog;\n\n  void Function(double? value)? _serProgress;\n\n  void Function(String message)? _setMessage;\n\n  bool closed = false;\n\n  void close() {\n    if (closed) {\n      return;\n    }\n    closed = true;\n    if (_closeDialog == null) {\n      Future.microtask(_closeDialog!);\n    } else {\n      _closeDialog!();\n    }\n  }\n\n  void setProgress(double? value) {\n    if (closed) {\n      return;\n    }\n    _serProgress?.call(value);\n  }\n\n  void setMessage(String message) {\n    if (closed) {\n      return;\n    }\n    _setMessage?.call(message);\n  }\n}\n\nLoadingDialogController showLoadingDialog(\n  BuildContext context, {\n  void Function()? onCancel,\n  bool barrierDismissible = true,\n  bool allowCancel = true,\n  String? message,\n  String cancelButtonText = \"Cancel\",\n  bool withProgress = false,\n}) {\n  var controller = LoadingDialogController();\n  controller._message = message;\n\n  if (withProgress) {\n    controller._progress = 0;\n  }\n\n  var loadingDialogRoute = DialogRoute(\n    context: context,\n    barrierDismissible: barrierDismissible,\n    builder: (BuildContext context) {\n      return StatefulBuilder(builder: (context, setState) {\n        controller._serProgress = (value) {\n          setState(() {\n            controller._progress = value;\n          });\n        };\n        controller._setMessage = (message) {\n          setState(() {\n            controller._message = message;\n          });\n        };\n        return ContentDialog(\n          title: controller._message ?? 'Loading',\n          content: LinearProgressIndicator(\n            value: controller._progress,\n            backgroundColor: context.colorScheme.surfaceContainer,\n          ).paddingHorizontal(16).paddingVertical(16),\n          actions: [\n            FilledButton(\n              onPressed: allowCancel\n                  ? () {\n                      controller.close();\n                      onCancel?.call();\n                    }\n                  : null,\n              child: Text(cancelButtonText.tl),\n            )\n          ],\n        );\n      });\n    },\n  );\n\n  var navigator = Navigator.of(context, rootNavigator: true);\n\n  navigator.push(loadingDialogRoute).then((value) => controller.closed = true);\n\n  controller._closeDialog = () {\n    navigator.removeRoute(loadingDialogRoute);\n  };\n\n  return controller;\n}\n\nclass ContentDialog extends StatelessWidget {\n  const ContentDialog({\n    super.key,\n    this.title, // 如果不传 title 将不会展示\n    required this.content,\n    this.dismissible = true,\n    this.actions = const [],\n  });\n\n  final String? title;\n\n  final Widget content;\n\n  final List<Widget> actions;\n\n  final bool dismissible;\n\n  @override\n  Widget build(BuildContext context) {\n    var content = SingleChildScrollView(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          title != null\n              ? Appbar(\n            leading: IconButton(\n              icon: const Icon(Icons.close),\n              onPressed: dismissible ? context.pop : null,\n            ),\n            title: Text(title!),\n            backgroundColor: Colors.transparent,\n          )\n              : const SizedBox.shrink(),\n          this.content,\n          const SizedBox(height: 16),\n          Row(\n            mainAxisAlignment: MainAxisAlignment.end,\n            children: actions,\n          ).paddingRight(12),\n          const SizedBox(height: 16),\n        ],\n      ),\n    );\n    return Dialog(\n      shape: RoundedRectangleBorder(\n        borderRadius: BorderRadius.circular(8),\n        side: context.brightness == Brightness.dark\n            ? BorderSide(color: context.colorScheme.outlineVariant)\n            : BorderSide.none,\n      ),\n      insetPadding: context.width < 400\n          ? const EdgeInsets.symmetric(horizontal: 4)\n          : const EdgeInsets.symmetric(horizontal: 16),\n      elevation: 2,\n      shadowColor: context.colorScheme.shadow,\n      backgroundColor: context.colorScheme.surface,\n      child: AnimatedSize(\n        duration: const Duration(milliseconds: 200),\n        alignment: Alignment.topCenter,\n        child: IntrinsicWidth(\n          child: ConstrainedBox(\n            constraints: BoxConstraints(\n              maxWidth: 600,\n              minWidth: math.min(400, context.width - 16),\n            ),\n            child: MediaQuery.removePadding(\n              removeTop: true,\n              removeBottom: true,\n              context: context,\n              child: content,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nFuture<void> showInputDialog({\n  required BuildContext context,\n  required String title,\n  String? hintText,\n  required FutureOr<Object?> Function(String) onConfirm,\n  String? initialValue,\n  String confirmText = \"Confirm\",\n  String cancelText = \"Cancel\",\n  RegExp? inputValidator,\n  String? image,\n  Uint8List? imageData,\n}) {\n  var controller = TextEditingController(text: initialValue);\n  bool isLoading = false;\n  String? error;\n\n  return showDialog(\n    context: context,\n    builder: (context) {\n      return StatefulBuilder(\n        builder: (context, setState) {\n          return ContentDialog(\n            title: title,\n            content: Column(\n              children: [\n                if (image != null)\n                  SizedBox(\n                    height: 108,\n                    child: Image.network(image, fit: BoxFit.none),\n                  ).paddingBottom(8),\n                if (image == null && imageData != null)\n                  SizedBox(\n                    height: 108,\n                    child: Image.memory(imageData, fit: BoxFit.none),\n                  ).paddingBottom(8),\n                TextField(\n                  controller: controller,\n                  decoration: InputDecoration(\n                    hintText: hintText,\n                    border: const OutlineInputBorder(),\n                    errorText: error,\n                  ),\n                ).paddingHorizontal(12),\n              ],\n            ),\n            actions: [\n              Button.filled(\n                isLoading: isLoading,\n                onPressed: () async {\n                  if (inputValidator != null &&\n                      !inputValidator.hasMatch(controller.text)) {\n                    setState(() => error = \"Invalid input\");\n                    return;\n                  }\n                  var futureOr = onConfirm(controller.text);\n                  Object? result;\n                  if (futureOr is Future) {\n                    setState(() => isLoading = true);\n                    result = await futureOr;\n                    setState(() => isLoading = false);\n                  } else {\n                    result = futureOr;\n                  }\n                  if (result == null) {\n                    context.pop();\n                  } else {\n                    setState(() => error = result.toString());\n                  }\n                },\n                child: Text(confirmText.tl),\n              ),\n            ],\n          );\n        },\n      );\n    },\n  );\n}\n\nvoid showInfoDialog({\n  required BuildContext context,\n  required String title,\n  required String content,\n  String confirmText = \"OK\",\n}) {\n  showDialog(\n    context: context,\n    builder: (context) {\n      return ContentDialog(\n        title: title,\n        content: Text(content).paddingHorizontal(16).paddingVertical(8),\n        actions: [\n          Button.filled(\n            onPressed: context.pop,\n            child: Text(confirmText.tl),\n          ),\n        ],\n      );\n    },\n  );\n}\n\nFuture<int?> showSelectDialog({\n  required String title,\n  required List<String> options,\n  int? initialIndex,\n}) async {\n  int? current = initialIndex;\n\n  await showDialog(\n    context: App.rootContext,\n    builder: (context) {\n      return StatefulBuilder(\n        builder: (context, setState) {\n          return ContentDialog(\n            title: title,\n            content: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [\n                  Select(\n                    current: current == null ? \"\" : options[current!],\n                    values: options,\n                    minWidth: 156,\n                    onTap: (i) {\n                      setState(() {\n                        current = i;\n                      });\n                    },\n                  )\n                ],\n              ),\n            ),\n            actions: [\n              TextButton(\n                onPressed: () {\n                  current = null;\n                  context.pop();\n                },\n                child: Text('Cancel'.tl),\n              ),\n              FilledButton(\n                onPressed: current == null ? null : context.pop,\n                child: Text('Confirm'.tl),\n              ),\n            ],\n          );\n        },\n      );\n    },\n  );\n\n  return current;\n}\n"
  },
  {
    "path": "lib/components/navigation_bar.dart",
    "content": "part of 'components.dart';\n\nclass PaneItemEntry {\n  String label;\n\n  IconData icon;\n\n  IconData activeIcon;\n\n  PaneItemEntry({\n    required this.label,\n    required this.icon,\n    required this.activeIcon,\n  });\n}\n\nclass PaneActionEntry {\n  String label;\n\n  IconData icon;\n\n  VoidCallback onTap;\n\n  PaneActionEntry({\n    required this.label,\n    required this.icon,\n    required this.onTap,\n  });\n}\n\nclass NaviPane extends StatefulWidget {\n  const NaviPane({\n    required this.paneItems,\n    required this.paneActions,\n    required this.pageBuilder,\n    this.initialPage = 0,\n    this.onPageChanged,\n    required this.observer,\n    required this.navigatorKey,\n    super.key,\n  });\n\n  final List<PaneItemEntry> paneItems;\n\n  final List<PaneActionEntry> paneActions;\n\n  final Widget Function(int page) pageBuilder;\n\n  final void Function(int index)? onPageChanged;\n\n  final int initialPage;\n\n  final NaviObserver observer;\n\n  final GlobalKey<NavigatorState> navigatorKey;\n\n  @override\n  State<NaviPane> createState() => NaviPaneState();\n\n  static NaviPaneState of(BuildContext context) {\n    return context.findAncestorStateOfType<NaviPaneState>()!;\n  }\n}\n\ntypedef NaviItemTapListener = void Function(int);\n\nclass NaviPaneState extends State<NaviPane>\n    with SingleTickerProviderStateMixin {\n  late int _currentPage = widget.initialPage;\n\n  int get currentPage => _currentPage;\n\n  set currentPage(int value) {\n    if (value == _currentPage) return;\n    _currentPage = value;\n    widget.onPageChanged?.call(value);\n  }\n\n  void Function()? mainViewUpdateHandler;\n\n  late AnimationController controller;\n\n  final _naviItemTapListeners = <NaviItemTapListener>[];\n\n  void addNaviItemTapListener(NaviItemTapListener listener) {\n    _naviItemTapListeners.add(listener);\n  }\n\n  void removeNaviItemTapListener(NaviItemTapListener listener) {\n    _naviItemTapListeners.remove(listener);\n  }\n\n  static const _kBottomBarHeight = 58.0;\n\n  static const _kFoldedSideBarWidth = 72.0;\n\n  static const _kSideBarWidth = 224.0;\n\n  static const _kTopBarHeight = 48.0;\n\n  double get bottomBarHeight =>\n      _kBottomBarHeight + MediaQuery.of(context).padding.bottom;\n\n  void onNavigatorStateChange() {\n    onRebuild(context);\n  }\n\n  void updatePage(int index) {\n    for (var listener in _naviItemTapListeners) {\n      listener(index);\n    }\n    if (widget.observer.routes.length > 1) {\n      widget.navigatorKey.currentState!.popUntil((route) => route.isFirst);\n    }\n    if (currentPage == index) {\n      return;\n    }\n    setState(() {\n      currentPage = index;\n    });\n    mainViewUpdateHandler?.call();\n  }\n\n  @override\n  void initState() {\n    controller = AnimationController(\n      duration: const Duration(milliseconds: 250),\n      lowerBound: 0,\n      upperBound: 3,\n      vsync: this,\n    );\n    widget.observer.addListener(onNavigatorStateChange);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    controller.dispose();\n    widget.observer.removeListener(onNavigatorStateChange);\n    super.dispose();\n  }\n\n  double targetFormContext(BuildContext context) {\n    var width = MediaQuery.of(context).size.width;\n    double target = 0;\n    if (width > changePoint) {\n      target = 2;\n    }\n    if (width > changePoint2) {\n      target = 3;\n    }\n    return target;\n  }\n\n  double? animationTarget;\n\n  void onRebuild(BuildContext context) {\n    double target = targetFormContext(context);\n    if (controller.value != target || animationTarget != target) {\n      if (controller.isAnimating) {\n        if (animationTarget == target) {\n          return;\n        } else {\n          controller.stop();\n        }\n      }\n      controller.animateTo(target);\n      animationTarget = target;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    onRebuild(context);\n    final mq = MediaQuery.of(context);\n    final sideInsets =\n        (App.isMobile && mq.orientation == Orientation.landscape)\n            ? EdgeInsets.only(\n                left: math.max(\n                    mq.viewPadding.left, mq.systemGestureInsets.left),\n                right: math.max(\n                    mq.viewPadding.right, mq.systemGestureInsets.right),\n              )\n            : EdgeInsets.zero;\n    return _NaviPopScope(\n      action: () {\n        if (App.mainNavigatorKey!.currentState!.canPop()) {\n          App.mainNavigatorKey!.currentState!.maybePop();\n        } else {\n          SystemNavigator.pop();\n        }\n      },\n      popGesture: App.isIOS && context.width >= changePoint,\n      child: AnimatedBuilder(\n        animation: controller,\n        builder: (context, child) {\n          final value = controller.value;\n          Widget content = Stack(\n            children: [\n              Positioned(\n                left: _kFoldedSideBarWidth * ((value - 2.0).clamp(-1.0, 0.0)),\n                top: 0,\n                bottom: 0,\n                child: buildLeft(),\n              ),\n              Positioned.fill(\n                left:\n                    _kFoldedSideBarWidth * ((value - 1).clamp(0, 1)) +\n                    (_kSideBarWidth - _kFoldedSideBarWidth) *\n                        ((value - 2).clamp(0, 1)),\n                child: buildMainView(),\n              ),\n            ],\n          );\n          if (sideInsets != EdgeInsets.zero) {\n            content = Padding(\n              padding: sideInsets,\n              child: content,\n            );\n          }\n          return content;\n        },\n      ),\n    );\n  }\n\n  Widget buildMainView() {\n    return HeroControllerScope(\n      controller: MaterialApp.createMaterialHeroController(),\n      child: NavigatorPopHandler(\n        onPopWithResult: (result) {\n          widget.navigatorKey.currentState?.maybePop(result);\n        },\n        child: Navigator(\n          observers: [widget.observer],\n          key: widget.navigatorKey,\n          onGenerateRoute: (settings) => AppPageRoute(\n            preventRebuild: false,\n            builder: (context) {\n              return _NaviMainView(state: this);\n            },\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildMainViewContent() {\n    return widget.pageBuilder(currentPage);\n  }\n\n  Widget buildTop() {\n    return Material(\n      child: Container(\n        padding: const EdgeInsets.only(left: 16, right: 16),\n        height: _kTopBarHeight,\n        width: double.infinity,\n        child: Row(\n          children: [\n            Text(\n              widget.paneItems[currentPage].label,\n              style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),\n            ),\n            const Spacer(),\n            for (var action in widget.paneActions)\n              Tooltip(\n                message: action.label,\n                child: IconButton(\n                  icon: Icon(action.icon),\n                  onPressed: action.onTap,\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildBottom() {\n    return Material(\n      textStyle: Theme.of(context).textTheme.labelSmall,\n      elevation: 0,\n      child: Container(\n        height: _kBottomBarHeight,\n        decoration: BoxDecoration(\n          border: Border(\n            top: BorderSide(\n              color: Theme.of(context).colorScheme.outlineVariant,\n              width: 1,\n            ),\n          ),\n        ),\n        child: Row(\n          children: List<Widget>.generate(widget.paneItems.length, (index) {\n            return Expanded(\n              child: _SingleBottomNaviWidget(\n                enabled: currentPage == index,\n                entry: widget.paneItems[index],\n                onTap: () {\n                  updatePage(index);\n                },\n                key: ValueKey(index),\n              ),\n            );\n          }),\n        ),\n      ),\n    );\n  }\n\n  Widget buildLeft() {\n    final value = controller.value;\n    const paddingHorizontal = 12.0;\n    return Material(\n      child: Container(\n        width:\n            _kFoldedSideBarWidth +\n            (_kSideBarWidth - _kFoldedSideBarWidth) * ((value - 2).clamp(0, 1)),\n        height: double.infinity,\n        padding: const EdgeInsets.symmetric(horizontal: paddingHorizontal),\n        decoration: BoxDecoration(\n          border: Border(\n            right: BorderSide(\n              color: Theme.of(context).colorScheme.outlineVariant,\n              width: 1.0,\n            ),\n          ),\n        ),\n        child: Column(\n          children: [\n            const SizedBox(height: 16),\n            SizedBox(height: MediaQuery.of(context).padding.top),\n            ...List<Widget>.generate(\n              widget.paneItems.length,\n              (index) => _SideNaviWidget(\n                enabled: currentPage == index,\n                entry: widget.paneItems[index],\n                showTitle: value == 3,\n                onTap: () {\n                  updatePage(index);\n                },\n                key: ValueKey(index),\n              ),\n            ),\n            const Spacer(),\n            ...List<Widget>.generate(\n              widget.paneActions.length,\n              (index) => _PaneActionWidget(\n                entry: widget.paneActions[index],\n                showTitle: value == 3,\n                key: ValueKey(index + widget.paneItems.length),\n              ),\n            ),\n            const SizedBox(height: 16),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass _SideNaviWidget extends StatelessWidget {\n  const _SideNaviWidget({\n    required this.enabled,\n    required this.entry,\n    required this.onTap,\n    required this.showTitle,\n    super.key,\n  });\n\n  final bool enabled;\n\n  final PaneItemEntry entry;\n\n  final VoidCallback onTap;\n\n  final bool showTitle;\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final icon = Icon(enabled ? entry.activeIcon : entry.icon);\n    return InkWell(\n      borderRadius: BorderRadius.circular(12),\n      onTap: onTap,\n      child: AnimatedContainer(\n        duration: const Duration(milliseconds: 180),\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        height: 38,\n        decoration: BoxDecoration(\n          color: enabled ? colorScheme.primaryContainer : null,\n          borderRadius: BorderRadius.circular(12),\n        ),\n        child: showTitle\n            ? Row(\n                children: [icon, const SizedBox(width: 12), Text(entry.label)],\n              )\n            : Align(alignment: Alignment.centerLeft, child: icon),\n      ),\n    ).paddingVertical(4);\n  }\n}\n\nclass _PaneActionWidget extends StatelessWidget {\n  const _PaneActionWidget({\n    required this.entry,\n    required this.showTitle,\n    super.key,\n  });\n\n  final PaneActionEntry entry;\n\n  final bool showTitle;\n\n  @override\n  Widget build(BuildContext context) {\n    final icon = Icon(entry.icon);\n    return InkWell(\n      onTap: entry.onTap,\n      borderRadius: BorderRadius.circular(12),\n      child: AnimatedContainer(\n        duration: const Duration(milliseconds: 180),\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        height: 38,\n        child: showTitle\n            ? Row(\n                children: [icon, const SizedBox(width: 12), Text(entry.label)],\n              )\n            : Align(alignment: Alignment.centerLeft, child: icon),\n      ),\n    ).paddingVertical(4);\n  }\n}\n\nclass _SingleBottomNaviWidget extends StatefulWidget {\n  const _SingleBottomNaviWidget({\n    required this.enabled,\n    required this.entry,\n    required this.onTap,\n    super.key,\n  });\n\n  final bool enabled;\n\n  final PaneItemEntry entry;\n\n  final VoidCallback onTap;\n\n  @override\n  State<_SingleBottomNaviWidget> createState() =>\n      _SingleBottomNaviWidgetState();\n}\n\nclass _SingleBottomNaviWidgetState extends State<_SingleBottomNaviWidget>\n    with SingleTickerProviderStateMixin {\n  late AnimationController controller;\n\n  bool isHovering = false;\n\n  @override\n  void dispose() {\n    controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  void didUpdateWidget(covariant _SingleBottomNaviWidget oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.enabled != widget.enabled) {\n      if (widget.enabled) {\n        controller.forward(from: 0);\n      } else {\n        controller.reverse(from: 1);\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    controller = AnimationController(\n      value: widget.enabled ? 1 : 0,\n      vsync: this,\n      duration: _fastAnimationDuration,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: CurvedAnimation(parent: controller, curve: Curves.ease),\n      builder: (context, child) {\n        return MouseRegion(\n          cursor: SystemMouseCursors.click,\n          onEnter: (details) => setState(() => isHovering = true),\n          onExit: (details) => setState(() => isHovering = false),\n          child: GestureDetector(\n            behavior: HitTestBehavior.translucent,\n            onTap: widget.onTap,\n            child: buildContent(),\n          ),\n        );\n      },\n    );\n  }\n\n  Widget buildContent() {\n    final value = controller.value;\n    final colorScheme = Theme.of(context).colorScheme;\n    final icon = Icon(\n      widget.enabled ? widget.entry.activeIcon : widget.entry.icon,\n    );\n    return Center(\n      child: Container(\n        width: 64,\n        height: 28,\n        decoration: BoxDecoration(\n          borderRadius: const BorderRadius.all(Radius.circular(32)),\n          color: isHovering ? colorScheme.surfaceContainer : Colors.transparent,\n        ),\n        child: Center(\n          child: Container(\n            width: 32 + value * 32,\n            height: 28,\n            decoration: BoxDecoration(\n              borderRadius: const BorderRadius.all(Radius.circular(32)),\n              color: value != 0\n                  ? colorScheme.secondaryContainer\n                  : Colors.transparent,\n            ),\n            child: Center(child: icon),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass NaviObserver extends NavigatorObserver implements Listenable {\n  var routes = Queue<Route>();\n\n  int get pageCount {\n    int count = 0;\n    for (var route in routes) {\n      if (route is AppPageRoute) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  @override\n  void didPop(Route route, Route? previousRoute) {\n    routes.removeLast();\n    notifyListeners();\n  }\n\n  @override\n  void didPush(Route route, Route? previousRoute) {\n    routes.addLast(route);\n    notifyListeners();\n  }\n\n  @override\n  void didRemove(Route route, Route? previousRoute) {\n    routes.remove(route);\n    notifyListeners();\n  }\n\n  @override\n  void didReplace({Route? newRoute, Route? oldRoute}) {\n    routes.remove(oldRoute);\n    if (newRoute != null) {\n      routes.add(newRoute);\n    }\n    notifyListeners();\n  }\n\n  List<VoidCallback> listeners = [];\n\n  @override\n  void addListener(VoidCallback listener) {\n    listeners.add(listener);\n  }\n\n  @override\n  void removeListener(VoidCallback listener) {\n    listeners.remove(listener);\n  }\n\n  void notifyListeners() {\n    for (var listener in listeners) {\n      listener();\n    }\n  }\n}\n\nclass _NaviPopScope extends StatelessWidget {\n  const _NaviPopScope({\n    required this.child,\n    this.popGesture = false,\n    required this.action,\n  });\n\n  final Widget child;\n  final bool popGesture;\n  final VoidCallback action;\n\n  static bool panStartAtEdge = false;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget res = child;\n    if (popGesture) {\n      res = GestureDetector(\n        onPanStart: (details) {\n          if (details.globalPosition.dx < 64) {\n            panStartAtEdge = true;\n          }\n        },\n        onPanEnd: (details) {\n          if (details.velocity.pixelsPerSecond.dx < 0 ||\n              details.velocity.pixelsPerSecond.dx > 0) {\n            if (panStartAtEdge) {\n              action();\n            }\n          }\n          panStartAtEdge = false;\n        },\n        child: res,\n      );\n    }\n    return res;\n  }\n}\n\nclass _NaviMainView extends StatefulWidget {\n  const _NaviMainView({required this.state});\n\n  final NaviPaneState state;\n\n  @override\n  State<_NaviMainView> createState() => _NaviMainViewState();\n}\n\nclass _NaviMainViewState extends State<_NaviMainView> {\n  NaviPaneState get state => widget.state;\n\n  @override\n  void initState() {\n    state.mainViewUpdateHandler = () {\n      setState(() {});\n    };\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var shouldShowAppBar = state.controller.value < 2;\n    return Column(\n      children: [\n        if (shouldShowAppBar) state.buildTop().paddingTop(context.padding.top),\n        Expanded(\n          child: MediaQuery.removePadding(\n            context: context,\n            removeTop: shouldShowAppBar,\n            child: AnimatedSwitcher(\n              duration: _fastAnimationDuration,\n              child: state.buildMainViewContent(),\n            ),\n          ),\n        ),\n        if (shouldShowAppBar)\n          state.buildBottom().paddingBottom(context.padding.bottom),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/pop_up_widget.dart",
    "content": "part of 'components.dart';\n\nclass PopUpWidget<T> extends PopupRoute<T> {\n  PopUpWidget(this.widget);\n\n  final Widget widget;\n\n  @override\n  Color? get barrierColor => Colors.black54;\n\n  @override\n  bool get barrierDismissible => true;\n\n  @override\n  String? get barrierLabel => \"exit\";\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    var height = MediaQuery.of(context).size.height * 0.9;\n    bool showPopUp = MediaQuery.of(context).size.width > 500;\n    Widget body = PopupIndicatorWidget(\n      child: Container(\n        decoration: showPopUp\n            ? BoxDecoration(\n                borderRadius: BorderRadius.all(Radius.circular(12)),\n                boxShadow: context.brightness == ui.Brightness.dark ? [\n                  BoxShadow(\n                    color: Colors.white.withAlpha(50),\n                    blurRadius: 10,\n                    offset: Offset(0, 2),\n                  ),\n                ] : null,\n              )\n            : null,\n        clipBehavior: showPopUp ? Clip.antiAlias : Clip.none,\n        width: showPopUp ? 500 : double.infinity,\n        height: showPopUp ? height : double.infinity,\n        child: ClipRect(\n          child: Navigator(\n            onGenerateRoute: (settings) => MaterialPageRoute(\n              builder: (context) => widget,\n            ),\n          ),\n        ),\n      ),\n    );\n    if (App.isIOS) {\n      body = IOSBackGestureDetector(\n        enabledCallback: () => true,\n        gestureWidth: 20.0,\n        onStartPopGesture: () =>\n            IOSBackGestureController(controller!, navigator!),\n        child: body,\n      );\n    }\n    if (showPopUp) {\n      return MediaQuery.removePadding(\n        removeTop: true,\n        context: context,\n        child: Center(\n          child: body,\n        ),\n      );\n    }\n    return body;\n  }\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 350);\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation, Widget child) {\n    return FadeTransition(\n      opacity: animation.drive(\n        Tween(begin: 0.0, end: 1.0).chain(CurveTween(curve: Curves.ease)),\n      ),\n      child: child,\n    );\n  }\n}\n\nclass PopupIndicatorWidget extends InheritedWidget {\n  const PopupIndicatorWidget({super.key, required super.child});\n\n  @override\n  bool updateShouldNotify(covariant InheritedWidget oldWidget) => false;\n\n  static PopupIndicatorWidget? maybeOf(BuildContext context) {\n    return context.dependOnInheritedWidgetOfExactType<PopupIndicatorWidget>();\n  }\n}\n\nFuture<T> showPopUpWidget<T>(BuildContext context, Widget widget) async {\n  return await Navigator.of(context, rootNavigator: true)\n      .push(PopUpWidget(widget));\n}\n\nclass PopUpWidgetScaffold extends StatefulWidget {\n  const PopUpWidgetScaffold(\n      {required this.title, required this.body, this.tailing, super.key});\n\n  final Widget body;\n  final List<Widget>? tailing;\n  final String title;\n\n  @override\n  State<PopUpWidgetScaffold> createState() => _PopUpWidgetScaffoldState();\n}\n\nclass _PopUpWidgetScaffoldState extends State<PopUpWidgetScaffold> {\n  bool top = true;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      child: Column(\n        children: [\n          Container(\n            height: 56 + context.padding.top,\n            padding: EdgeInsets.only(top: context.padding.top),\n            width: double.infinity,\n            decoration: BoxDecoration(\n              color: top\n                  ? null\n                  : Theme.of(context).colorScheme.surfaceTint.withAlpha(20),\n            ),\n            child: Row(\n              children: [\n                const SizedBox(\n                  width: 8,\n                ),\n                Tooltip(\n                  message: \"Back\".tl,\n                  child: IconButton(\n                    icon: const Icon(Icons.arrow_back_sharp),\n                    onPressed: () =>\n                        context.canPop() ? context.pop() : App.pop(),\n                  ),\n                ),\n                const SizedBox(\n                  width: 16,\n                ),\n                Text(\n                  widget.title,\n                  style: const TextStyle(\n                      fontSize: 22, fontWeight: FontWeight.w500),\n                ),\n                const Spacer(),\n                if (widget.tailing != null) ...widget.tailing!,\n                const SizedBox(width: 8),\n              ],\n            ),\n          ),\n          NotificationListener<ScrollNotification>(\n            onNotification: (notifications) {\n              if (notifications.metrics.axisDirection != AxisDirection.down) {\n                return false;\n              }\n              if (notifications.metrics.pixels ==\n                      notifications.metrics.minScrollExtent &&\n                  !top) {\n                setState(() {\n                  top = true;\n                });\n              } else if (notifications.metrics.pixels !=\n                      notifications.metrics.minScrollExtent &&\n                  top) {\n                setState(() {\n                  top = false;\n                });\n              }\n              return false;\n            },\n            child: MediaQuery.removePadding(\n              removeTop: true,\n              context: context,\n              child: Expanded(child: widget.body),\n            ),\n          ),\n          SizedBox(\n            height: MediaQuery.of(context).viewInsets.bottom -\n                        0.05 * MediaQuery.of(context).size.height >\n                    0\n                ? MediaQuery.of(context).viewInsets.bottom -\n                    0.05 * MediaQuery.of(context).size.height\n                : 0,\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/rich_comment_content.dart",
    "content": "import 'dart:collection';\n\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/image_provider/cached_image.dart';\nimport 'package:venera/utils/app_links.dart';\nimport 'package:venera/utils/ext.dart';\n\n/// A widget that displays comment content with support for rich text formatting.\n///\n/// This widget intelligently decides whether to use simple text or rich formatting\n/// based on the content. It supports HTML tags and auto-linking of URLs.\nclass CommentContent extends StatelessWidget {\n  const CommentContent({super.key, required this.text});\n\n  final String text;\n\n  @override\n  Widget build(BuildContext context) {\n    if (!text.contains('<') && !text.contains('http')) {\n      return SelectableText(text);\n    } else {\n      return RichCommentContent(text: text);\n    }\n  }\n}\n\nclass _Tag {\n  final String name;\n  final Map<String, String> attributes;\n\n  const _Tag(this.name, this.attributes);\n\n  TextSpan merge(TextSpan s, BuildContext context) {\n    var style = s.style ?? ts;\n    style = switch (name) {\n      'b' => style.bold,\n      'i' => style.italic,\n      'u' => style.underline,\n      's' => style.lineThrough,\n      'a' => style.withColor(context.colorScheme.primary),\n      'strong' => style.bold,\n      'span' => () {\n        if (attributes.containsKey('style')) {\n          var s = attributes['style']!;\n          var css = s.split(';');\n          for (var c in css) {\n            var kv = c.split(':');\n            if (kv.length == 2) {\n              var key = kv[0].trim();\n              var value = kv[1].trim();\n              switch (key) {\n                case 'color':\n                  // Color is not supported, we should make text display well in light and dark mode.\n                  break;\n                case 'font-weight':\n                  if (value == 'bold') {\n                    style = style.bold;\n                  } else if (value == 'lighter') {\n                    style = style.light;\n                  }\n                  break;\n                case 'font-style':\n                  if (value == 'italic') {\n                    style = style.italic;\n                  }\n                  break;\n                case 'text-decoration':\n                  if (value == 'underline') {\n                    style = style.underline;\n                  } else if (value == 'line-through') {\n                    style = style.lineThrough;\n                  }\n                  break;\n                case 'font-size':\n                  // Font size is not supported.\n                  break;\n              }\n            }\n          }\n        }\n        return style;\n      }(),\n      _ => style,\n    };\n    if (style.color != null) {\n      style = style.copyWith(decorationColor: style.color);\n    }\n    var recognizer = s.recognizer;\n    if (name == 'a') {\n      var link = attributes['href'];\n      if (link != null && link.isURL) {\n        recognizer = TapGestureRecognizer()\n          ..onTap = () {\n            handleLink(link);\n          };\n      }\n    }\n    return TextSpan(text: s.text, style: style, recognizer: recognizer);\n  }\n\n  static void handleLink(String link) async {\n    if (link.isURL) {\n      if (await handleAppLink(Uri.parse(link))) {\n        Navigator.of(App.rootContext).maybePop();\n      } else {\n        launchUrlString(link);\n      }\n    }\n  }\n}\n\nclass _CommentImage {\n  final String url;\n  final String? link;\n\n  const _CommentImage(this.url, this.link);\n}\n\nclass RichCommentContent extends StatefulWidget {\n  const RichCommentContent({\n    super.key,\n    required this.text,\n    this.showImages = true,\n  });\n\n  final String text;\n\n  final bool showImages;\n\n  @override\n  State<RichCommentContent> createState() => _RichCommentContentState();\n}\n\nclass _RichCommentContentState extends State<RichCommentContent> {\n  var textSpan = <InlineSpan>[];\n  var images = <_CommentImage>[];\n  bool isRendered = false;\n\n  @override\n  void didChangeDependencies() {\n    if (!isRendered) {\n      render();\n      isRendered = true;\n    }\n    super.didChangeDependencies();\n  }\n\n  bool isValidUrlChar(String char) {\n    return RegExp(r'[a-zA-Z0-9%:/.@\\-_?&=#*!+;]').hasMatch(char);\n  }\n\n  void render() {\n    var s = Queue<_Tag>();\n\n    int i = 0;\n    var buffer = StringBuffer();\n    var text = widget.text;\n    text = text.replaceAll('\\r\\n', '\\n');\n    text = text.replaceAll('&amp;', '&');\n\n    void writeBuffer() {\n      if (buffer.isEmpty) return;\n      var span = TextSpan(text: buffer.toString());\n      for (var tag in s) {\n        span = tag.merge(span, context);\n      }\n      textSpan.add(span);\n      buffer.clear();\n    }\n\n    while (i < text.length) {\n      if (text[i] == '<' && i != text.length - 1) {\n        if (text[i + 1] != '/') {\n          // start tag\n          var j = text.indexOf('>', i);\n          if (j != -1) {\n            var tagContent = text.substring(i + 1, j);\n            var splits = tagContent.split(' ');\n            splits.removeWhere((element) => element.isEmpty);\n            var tagName = splits[0];\n            var attributes = <String, String>{};\n            for (var k = 1; k < splits.length; k++) {\n              var attr = splits[k];\n              var attrSplits = attr.split('=');\n              if (attrSplits.length == 2) {\n                attributes[attrSplits[0]] = attrSplits[1].replaceAll('\"', '');\n              }\n            }\n            const acceptedTags = [\n              'img',\n              'a',\n              'b',\n              'i',\n              'u',\n              's',\n              'br',\n              'span',\n              'strong',\n            ];\n            if (acceptedTags.contains(tagName)) {\n              writeBuffer();\n              if (tagName == 'img') {\n                var url = attributes['src'];\n                String? link;\n                for (var tag in s) {\n                  if (tag.name == 'a') {\n                    link = tag.attributes['href'];\n                    break;\n                  }\n                }\n                if (url != null) {\n                  images.add(_CommentImage(url, link));\n                }\n              } else if (tagName == 'br') {\n                buffer.write('\\n');\n              } else {\n                s.add(_Tag(tagName, attributes));\n              }\n              i = j + 1;\n              continue;\n            }\n          }\n        } else {\n          // end tag\n          var j = text.indexOf('>', i);\n          if (j != -1) {\n            var tagContent = text.substring(i + 2, j);\n            var splits = tagContent.split(' ');\n            splits.removeWhere((element) => element.isEmpty);\n            var tagName = splits[0];\n            if (s.isNotEmpty && s.last.name == tagName) {\n              writeBuffer();\n              s.removeLast();\n              i = j + 1;\n              continue;\n            }\n            if (tagName == 'br') {\n              i = j + 1;\n              buffer.write('\\n');\n              continue;\n            }\n          }\n        }\n      } else if (text.length - i > 8 &&\n          text.substring(i, i + 4) == 'http' &&\n          !s.any((e) => e.name == 'a')) {\n        // auto link\n        int j = i;\n        for (; j < text.length; j++) {\n          if (!isValidUrlChar(text[j])) {\n            break;\n          }\n        }\n        var url = text.substring(i, j);\n        if (url.isURL) {\n          writeBuffer();\n          textSpan.add(\n            TextSpan(\n              text: url,\n              style: ts.withColor(context.colorScheme.primary),\n              recognizer: TapGestureRecognizer()\n                ..onTap = () {\n                  _Tag.handleLink(url);\n                },\n            ),\n          );\n          i = j;\n          continue;\n        }\n      }\n      buffer.write(text[i]);\n      i++;\n    }\n    writeBuffer();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget content = SelectableText.rich(\n      TextSpan(style: DefaultTextStyle.of(context).style, children: textSpan),\n    );\n    if (images.isNotEmpty && widget.showImages) {\n      content = Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          content,\n          Wrap(\n            runSpacing: 4,\n            spacing: 4,\n            children: images.map((e) {\n              Widget image = Container(\n                decoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(8),\n                  color: Theme.of(context).colorScheme.surfaceContainerLow,\n                ),\n                width: 100,\n                height: 100,\n                child: Image(\n                  width: 100,\n                  height: 100,\n                  image: CachedImageProvider(e.url),\n                ),\n              );\n              if (e.link != null) {\n                image = InkWell(\n                  onTap: () {\n                    _Tag.handleLink(e.link!);\n                  },\n                  child: image,\n                );\n              }\n              return image;\n            }).toList(),\n          ),\n        ],\n      );\n    }\n    return content;\n  }\n}\n"
  },
  {
    "path": "lib/components/scroll.dart",
    "content": "part of 'components.dart';\n\nclass SmoothCustomScrollView extends StatelessWidget {\n  const SmoothCustomScrollView(\n      {super.key, required this.slivers, this.controller});\n\n  final ScrollController? controller;\n\n  final List<Widget> slivers;\n\n  @override\n  Widget build(BuildContext context) {\n    return SmoothScrollProvider(\n      controller: controller,\n      builder: (context, controller, physics) {\n        return CustomScrollView(\n          controller: controller,\n          physics: physics,\n          slivers: [\n            ...slivers,\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: context.padding.bottom,\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n}\n\nclass SmoothScrollProvider extends StatefulWidget {\n  const SmoothScrollProvider(\n      {super.key, this.controller, required this.builder});\n\n  final ScrollController? controller;\n\n  final Widget Function(BuildContext, ScrollController, ScrollPhysics) builder;\n\n  static bool get isMouseScroll => _SmoothScrollProviderState._isMouseScroll;\n\n  @override\n  State<SmoothScrollProvider> createState() => _SmoothScrollProviderState();\n}\n\nclass _SmoothScrollProviderState extends State<SmoothScrollProvider> {\n  late final ScrollController _controller;\n\n  double? _futurePosition;\n\n  static bool _isMouseScroll = App.isDesktop;\n\n  late int id;\n\n  static int _id = 0;\n\n  var activeChildren = <int>{};\n\n  ScrollState? parent;\n\n  @override\n  void initState() {\n    _controller = widget.controller ?? ScrollController();\n    super.initState();\n    id = _id;\n    _id++;\n  }\n\n  @override\n  void didChangeDependencies() {\n    parent = ScrollState.maybeOf(context);\n    super.didChangeDependencies();\n  }\n\n  @override\n  void dispose() {\n    parent?.onChildInactive(id);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (App.isMacOS) {\n      return widget.builder(\n        context,\n        _controller,\n        const BouncingScrollPhysics(),\n      );\n    }\n    var child = Listener(\n      onPointerDown: (event) {\n        _futurePosition = null;\n        if (_isMouseScroll) {\n          setState(() {\n            _isMouseScroll = false;\n          });\n        }\n      },\n      onPointerSignal: (pointerSignal) {\n        if (activeChildren.isNotEmpty) {\n          return;\n        }\n        if (pointerSignal is PointerScrollEvent) {\n          if (HardwareKeyboard.instance.isShiftPressed) {\n            return;\n          }\n          if (pointerSignal.kind == PointerDeviceKind.mouse &&\n              !_isMouseScroll) {\n            setState(() {\n              _isMouseScroll = true;\n            });\n          }\n          if (!_isMouseScroll) return;\n          var currentLocation = _controller.position.pixels;\n          var old = _futurePosition;\n          _futurePosition ??= currentLocation;\n          double k = (_futurePosition! - currentLocation).abs() / 1600 + 1;\n          _futurePosition = _futurePosition! + pointerSignal.scrollDelta.dy * k;\n          var beforeOffset = (_futurePosition! - currentLocation).abs();\n          _futurePosition = _futurePosition!.clamp(\n            _controller.position.minScrollExtent,\n            _controller.position.maxScrollExtent,\n          );\n          var afterOffset = (_futurePosition! - currentLocation).abs();\n          if (_futurePosition == old) return;\n          var target = _futurePosition!;\n          var duration = _fastAnimationDuration;\n          if (afterOffset < beforeOffset) {\n            duration = duration * (afterOffset / beforeOffset);\n            if (duration < Duration(milliseconds: 10)) {\n              duration = Duration(milliseconds: 10);\n            }\n          }\n          _controller\n              .animateTo(\n            _futurePosition!,\n            duration: duration,\n            curve: Curves.linear,\n          )\n              .then((_) {\n            var current = _controller.position.pixels;\n            if (current == target && current == _futurePosition) {\n              _futurePosition = null;\n            }\n          });\n        }\n      },\n      child: ScrollState._(\n        controller: _controller,\n        onChildActive: (id) {\n          activeChildren.add(id);\n        },\n        onChildInactive: (id) {\n          activeChildren.remove(id);\n        },\n        child: widget.builder(\n          context,\n          _controller,\n          _isMouseScroll\n              ? const NeverScrollableScrollPhysics()\n              : const BouncingScrollPhysics(),\n        ),\n      ),\n    );\n\n    if (parent != null) {\n      return MouseRegion(\n        onEnter: (_) {\n          parent!.onChildActive(id);\n        },\n        onExit: (_) {\n          parent!.onChildInactive(id);\n        },\n        child: child,\n      );\n    }\n\n    return child;\n  }\n}\n\nclass ScrollState extends InheritedWidget {\n  const ScrollState._({\n    required this.controller,\n    required super.child,\n    required this.onChildActive,\n    required this.onChildInactive,\n  });\n\n  final ScrollController controller;\n\n  final void Function(int id) onChildActive;\n\n  final void Function(int id) onChildInactive;\n\n  static ScrollState of(BuildContext context) {\n    final ScrollState? provider =\n        context.dependOnInheritedWidgetOfExactType<ScrollState>();\n    return provider!;\n  }\n\n  static ScrollState? maybeOf(BuildContext context) {\n    return context.dependOnInheritedWidgetOfExactType<ScrollState>();\n  }\n\n  @override\n  bool updateShouldNotify(ScrollState oldWidget) {\n    return oldWidget.controller != controller;\n  }\n}\n\nclass AppScrollBar extends StatefulWidget {\n  const AppScrollBar({\n    super.key,\n    required this.controller,\n    required this.child,\n    this.topPadding = 0,\n  });\n\n  final ScrollController controller;\n\n  final Widget child;\n\n  final double topPadding;\n\n  @override\n  State<AppScrollBar> createState() => _AppScrollBarState();\n}\n\nclass _AppScrollBarState extends State<AppScrollBar> {\n  late final ScrollController _scrollController;\n\n  double minExtent = 0;\n  double maxExtent = 0;\n  double position = 0;\n\n  double viewHeight = 0;\n\n  final _scrollIndicatorSize = App.isDesktop ? 36.0 : 54.0;\n\n  late final VerticalDragGestureRecognizer _dragGestureRecognizer;\n\n  bool _isVisible = false;\n  Timer? _hideTimer;\n  static const _hideDuration = Duration(seconds: 2);\n\n  @override\n  void initState() {\n    super.initState();\n    _scrollController = widget.controller;\n    _scrollController.addListener(onChanged);\n    Future.microtask(onChanged);\n    _dragGestureRecognizer = VerticalDragGestureRecognizer()\n      ..onUpdate = onUpdate\n      ..onStart = (_) {\n        _showScrollbar();\n      }\n      ..onEnd = (_) {\n        _scheduleHide();\n      };\n  }\n\n  @override\n  void dispose() {\n    _hideTimer?.cancel();\n    _scrollController.removeListener(onChanged);\n    _dragGestureRecognizer.dispose();\n    super.dispose();\n  }\n\n  void _showScrollbar() {\n    if (!_isVisible && mounted) {\n      setState(() {\n        _isVisible = true;\n      });\n    }\n    _hideTimer?.cancel();\n  }\n\n  void _scheduleHide() {\n    _hideTimer?.cancel();\n    _hideTimer = Timer(_hideDuration, () {\n      if (mounted && _isVisible) {\n        setState(() {\n          _isVisible = false;\n        });\n      }\n    });\n  }\n\n  void onUpdate(DragUpdateDetails details) {\n    if (maxExtent - minExtent <= 0 ||\n        viewHeight == 0 ||\n        details.primaryDelta == null) {\n      return;\n    }\n    var offset = details.primaryDelta!;\n    var positionOffset =\n        offset / (viewHeight - _scrollIndicatorSize) * (maxExtent - minExtent);\n    _scrollController.jumpTo((position + positionOffset).clamp(\n      minExtent,\n      maxExtent,\n    ));\n  }\n\n  void onChanged() {\n    if (_scrollController.positions.isEmpty) return;\n    var position = _scrollController.position;\n\n    bool hasChanged = false;\n    if (position.minScrollExtent != minExtent ||\n        position.maxScrollExtent != maxExtent ||\n        position.pixels != this.position) {\n      hasChanged = true;\n      minExtent = position.minScrollExtent;\n      maxExtent = position.maxScrollExtent;\n      this.position = position.pixels;\n    }\n\n    if (hasChanged) {\n      _showScrollbar();\n      _scheduleHide();\n    }\n\n    if (hasChanged && mounted) {\n      setState(() {});\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(\n      builder: (context, constrains) {\n        var scrollHeight = (maxExtent - minExtent);\n        var height = constrains.maxHeight - widget.topPadding;\n        viewHeight = height;\n        var top = scrollHeight == 0\n            ? 0.0\n            : (position - minExtent) /\n                scrollHeight *\n                (height - _scrollIndicatorSize);\n        return Stack(\n          children: [\n            Positioned.fill(\n              child: widget.child,\n            ),\n            Positioned(\n              top: top + widget.topPadding,\n              right: 0,\n              child: AnimatedOpacity(\n                opacity: _isVisible ? 1.0 : 0.0,\n                duration: const Duration(milliseconds: 200),\n                child: MouseRegion(\n                  cursor: SystemMouseCursors.click,\n                  onEnter: (_) => _showScrollbar(),\n                  onExit: (_) => _scheduleHide(),\n                  child: Listener(\n                    behavior: HitTestBehavior.translucent,\n                    onPointerDown: (event) {\n                      _dragGestureRecognizer.addPointer(event);\n                    },\n                    child: SizedBox(\n                      width: _scrollIndicatorSize / 2,\n                      height: _scrollIndicatorSize,\n                      child: CustomPaint(\n                        painter: _ScrollIndicatorPainter(\n                          backgroundColor: context.colorScheme.surface,\n                          shadowColor: context.colorScheme.shadow,\n                        ),\n                        child: Column(\n                          children: [\n                            const Spacer(),\n                            Icon(Icons.arrow_drop_up, size: 18),\n                            Icon(Icons.arrow_drop_down, size: 18),\n                            const Spacer(),\n                          ],\n                        ).paddingLeft(4),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n}\n\nclass _ScrollIndicatorPainter extends CustomPainter {\n  final Color backgroundColor;\n\n  final Color shadowColor;\n\n  const _ScrollIndicatorPainter({\n    required this.backgroundColor,\n    required this.shadowColor,\n  });\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    var path = Path()\n      ..moveTo(size.width, 0)\n      ..lineTo(size.width, size.height)\n      ..arcToPoint(\n        Offset(size.width, 0),\n        radius: Radius.circular(size.width),\n      );\n    canvas.drawShadow(path, shadowColor, 2, true);\n    var backgroundPaint = Paint()\n      ..color = backgroundColor\n      ..style = PaintingStyle.fill;\n    path = Path()\n      ..moveTo(size.width, 0)\n      ..lineTo(size.width, size.height)\n      ..arcToPoint(\n        Offset(size.width, 0),\n        radius: Radius.circular(size.width),\n      );\n    canvas.drawPath(path, backgroundPaint);\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return oldDelegate is! _ScrollIndicatorPainter ||\n        oldDelegate.backgroundColor != backgroundColor ||\n        oldDelegate.shadowColor != shadowColor;\n  }\n}\n"
  },
  {
    "path": "lib/components/select.dart",
    "content": "part of 'components.dart';\n\nclass Select extends StatelessWidget {\n  const Select({\n    super.key,\n    required this.current,\n    required this.values,\n    this.onTap,\n    this.minWidth,\n  });\n\n  final String? current;\n\n  final List<String> values;\n\n  final void Function(int index)? onTap;\n\n  final double? minWidth;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        border: Border.all(color: context.colorScheme.outlineVariant),\n        borderRadius: BorderRadius.circular(4),\n      ),\n      child: InkWell(\n        onTap: () {\n          var renderBox = context.findRenderObject() as RenderBox;\n          var offset = renderBox.localToGlobal(Offset.zero);\n          var size = renderBox.size;\n          showMenu(\n            elevation: 3,\n            color: context.brightness == Brightness.light\n                ? const Color(0xFFF6F6F6)\n                : const Color(0xFF1E1E1E),\n            context: context,\n            useRootNavigator: true,\n            constraints: BoxConstraints(\n              minWidth: size.width,\n              maxWidth: size.width,\n            ),\n            position: RelativeRect.fromLTRB(\n              offset.dx,\n              offset.dy + size.height + 2,\n              offset.dx + size.height + 2,\n              offset.dy,\n            ),\n            items: values\n                .map((e) => PopupMenuItem(\n                      height: App.isMobile ? 46 : 40,\n                      value: e,\n                      child: Text(e),\n                    ))\n                .toList(),\n          ).then((value) {\n            if (value != null) {\n              onTap?.call(values.indexOf(value));\n            }\n          });\n        },\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ConstrainedBox(\n              constraints: BoxConstraints(\n                minWidth: minWidth != null ? (minWidth! - 32) : 0,\n              ),\n              child: Text(current ?? ' ', style: ts.s14),\n            ),\n            const SizedBox(width: 8),\n            Icon(Icons.arrow_drop_down, color: context.colorScheme.primary),\n          ],\n        ).padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 4)),\n      ),\n    );\n  }\n}\n\nclass FilterChipFixedWidth extends StatefulWidget {\n  const FilterChipFixedWidth(\n      {required this.label,\n      required this.selected,\n      required this.onSelected,\n      super.key});\n\n  final Widget label;\n\n  final bool selected;\n\n  final void Function(bool) onSelected;\n\n  @override\n  State<FilterChipFixedWidth> createState() => _FilterChipFixedWidthState();\n}\n\nclass _FilterChipFixedWidthState extends State<FilterChipFixedWidth> {\n  get selected => widget.selected;\n\n  double? labelWidth;\n\n  double? labelHeight;\n\n  var key = GlobalKey();\n\n  @override\n  void initState() {\n    Future.microtask(measureSize);\n    super.initState();\n  }\n\n  void measureSize() {\n    final RenderBox renderBox =\n        key.currentContext!.findRenderObject() as RenderBox;\n    labelWidth = renderBox.size.width;\n    labelHeight = renderBox.size.height;\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      textStyle: Theme.of(context).textTheme.labelLarge,\n      child: InkWell(\n        onTap: () => widget.onSelected(true),\n        borderRadius: const BorderRadius.all(Radius.circular(8)),\n        child: AnimatedContainer(\n          duration: _fastAnimationDuration,\n          decoration: BoxDecoration(\n            border: Border.all(color: Theme.of(context).colorScheme.outline),\n            borderRadius: const BorderRadius.all(Radius.circular(8)),\n            color: selected\n                ? Theme.of(context).colorScheme.primaryContainer\n                : null,\n          ),\n          padding: const EdgeInsets.fromLTRB(12, 8, 12, 8),\n          child: labelWidth == null ? firstBuild() : buildContent(),\n        ),\n      ),\n    );\n  }\n\n  Widget firstBuild() {\n    return Center(\n      child: SizedBox(\n        key: key,\n        child: widget.label,\n      ),\n    );\n  }\n\n  Widget buildContent() {\n    const iconSize = 18.0;\n    const gap = 4.0;\n    return SizedBox(\n      width: iconSize + labelWidth! + gap,\n      height: math.max(iconSize, labelHeight!),\n      child: Stack(\n        children: [\n          AnimatedPositioned(\n            duration: _fastAnimationDuration,\n            left: selected ? (iconSize + gap) : (iconSize + gap) / 2,\n            child: widget.label,\n          ),\n          if (selected)\n            Positioned(\n              left: 0,\n              top: 0,\n              bottom: 0,\n              right: labelWidth! + gap,\n              child: const AnimatedCheckIcon(size: iconSize).toCenter(),\n            )\n        ],\n      ),\n    );\n  }\n}\n\nclass AnimatedCheckWidget extends AnimatedWidget {\n  const AnimatedCheckWidget({\n    super.key,\n    required Animation<double> animation,\n    this.size,\n  }) : super(listenable: animation);\n\n  final double? size;\n\n  @override\n  Widget build(BuildContext context) {\n    var iconSize = size ?? IconTheme.of(context).size ?? 25;\n    final animation = listenable as Animation<double>;\n    return SizedBox(\n      width: iconSize,\n      height: iconSize,\n      child: Align(\n        alignment: Alignment.centerLeft,\n        child: FractionallySizedBox(\n          widthFactor: animation.value,\n          child: ClipRRect(\n            child: Icon(\n              Icons.check,\n              size: iconSize,\n              color: Theme.of(context).colorScheme.primary,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass AnimatedCheckIcon extends StatefulWidget {\n  const AnimatedCheckIcon({this.size, super.key});\n\n  final double? size;\n\n  @override\n  State<AnimatedCheckIcon> createState() => _AnimatedCheckIconState();\n}\n\nclass _AnimatedCheckIconState extends State<AnimatedCheckIcon>\n    with SingleTickerProviderStateMixin {\n  late Animation<double> animation;\n  late AnimationController controller;\n\n  @override\n  void initState() {\n    controller = AnimationController(\n      vsync: this,\n      duration: _fastAnimationDuration,\n    );\n    animation = Tween<double>(begin: 0, end: 1).animate(controller)\n      ..addListener(() {\n        setState(() {});\n      });\n    controller.forward();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedCheckWidget(\n      animation: animation,\n      size: widget.size,\n    );\n  }\n}\n\nclass OptionChip extends StatelessWidget {\n  const OptionChip(\n      {super.key,\n      required this.text,\n      required this.isSelected,\n      required this.onTap});\n\n  final String text;\n\n  final bool isSelected;\n\n  final void Function() onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedContainer(\n      duration: _fastAnimationDuration,\n      decoration: BoxDecoration(\n        color: isSelected\n            ? context.colorScheme.secondaryContainer\n            : context.colorScheme.surface,\n        border: isSelected\n            ? Border.all(color: context.colorScheme.secondaryContainer)\n            : Border.all(color: context.colorScheme.outline),\n        borderRadius: BorderRadius.circular(8),\n      ),\n      child: Material(\n        color: Colors.transparent,\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: onTap,\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6),\n            child: Text(text),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/components/side_bar.dart",
    "content": "part of 'components.dart';\n\nclass SideBarRoute<T> extends PopupRoute<T> {\n  SideBarRoute(this.widget,\n      {this.showBarrier = true,\n      this.useSurfaceTintColor = false,\n      this.dismissible = true,\n      required this.width,\n      this.addBottomPadding = true,\n      this.addTopPadding = true});\n\n  final Widget widget;\n\n  final bool showBarrier;\n\n  final bool useSurfaceTintColor;\n\n  final bool dismissible;\n\n  final double width;\n\n  final bool addTopPadding;\n\n  final bool addBottomPadding;\n\n  bool _barrierSawPointerDown = false;\n\n  @override\n  Color? get barrierColor => showBarrier ? Colors.black54 : Colors.transparent;\n\n  @override\n  bool get barrierDismissible => dismissible;\n\n  @override\n  String? get barrierLabel => \"exit\";\n\n  @override\n  TickerFuture didPush() {\n    _barrierSawPointerDown = false;\n    return super.didPush();\n  }\n\n  @override\n  Widget buildModalBarrier() {\n    if (!showBarrier) {\n      return const SizedBox.shrink();\n    }\n    return Listener(\n      behavior: HitTestBehavior.opaque,\n      onPointerDown: (event) {\n        if (event.position == Offset.zero) {\n          return;\n        }\n        _barrierSawPointerDown = true;\n      },\n      child: ModalBarrier(\n        dismissible: dismissible,\n        onDismiss: dismissible\n            ? () {\n                if (!_barrierSawPointerDown) {\n                  return;\n                }\n                navigator?.maybePop();\n              }\n            : null,\n        color: barrierColor,\n        semanticsLabel: barrierLabel,\n      ),\n    );\n  }\n\n  @override\n  Widget buildPage(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation) {\n    bool showSideBar = MediaQuery.of(context).size.width > width;\n\n    Widget body = widget;\n\n    if (addTopPadding) {\n      body = Padding(\n        padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),\n        child: MediaQuery.removePadding(\n          context: context,\n          removeTop: true,\n          child: body,\n        ),\n      );\n    }\n\n    final sideBarWidth = math.min(width, MediaQuery.of(context).size.width);\n\n    body = Container(\n      decoration: BoxDecoration(\n        borderRadius: showSideBar\n            ? const BorderRadius.horizontal(left: Radius.circular(16))\n            : null,\n        color: Theme.of(context).colorScheme.surfaceTint,\n        boxShadow: context.brightness == ui.Brightness.dark ? [\n          BoxShadow(\n            color: Colors.white.withAlpha(50),\n            blurRadius: 10,\n            offset: Offset(0, 2),\n          ),\n        ] : null,\n      ),\n      clipBehavior: Clip.antiAlias,\n      constraints: BoxConstraints(maxWidth: sideBarWidth),\n      height: MediaQuery.of(context).size.height,\n      child: GestureDetector(\n        child: Material(\n          child: ClipRect(\n            clipBehavior: Clip.antiAlias,\n            child: Container(\n              padding: EdgeInsets.fromLTRB(\n                  0,\n                  0,\n                  MediaQuery.of(context).padding.right,\n                  addBottomPadding\n                      ? MediaQuery.of(context).padding.bottom +\n                          MediaQuery.of(context).viewInsets.bottom\n                      : 0),\n              color: useSurfaceTintColor\n                  ? Theme.of(context).colorScheme.surfaceTint.withAlpha(20)\n                  : null,\n              child: body,\n            ),\n          ),\n        ),\n      ),\n    );\n\n    if (App.isIOS) {\n      body = IOSBackGestureDetector(\n        enabledCallback: () => true,\n        gestureWidth: 20.0,\n        onStartPopGesture: () =>\n            IOSBackGestureController(controller!, navigator!),\n        child: body,\n      );\n    }\n\n    return Align(\n      alignment: Alignment.centerRight,\n      child: body,\n    );\n  }\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 300);\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation,\n      Animation<double> secondaryAnimation, Widget child) {\n    var offset =\n        Tween<Offset>(begin: const Offset(1, 0), end: const Offset(0, 0));\n    return SlideTransition(\n      position: offset.animate(CurvedAnimation(\n        parent: animation,\n        curve: Curves.fastOutSlowIn,\n      )),\n      child: child,\n    );\n  }\n}\n\nFuture<void> showSideBar(BuildContext context, Widget widget,\n    {bool showBarrier = true,\n    bool useSurfaceTintColor = false,\n    bool dismissible = true,\n    double width = 500,\n    bool addTopPadding = false}) {\n  return Navigator.of(context).push(\n    SideBarRoute(\n      widget,\n      showBarrier: showBarrier,\n      useSurfaceTintColor: useSurfaceTintColor,\n      dismissible: dismissible,\n      width: width,\n      addTopPadding: addTopPadding,\n      addBottomPadding: true,\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/components/window_frame.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:window_manager/window_manager.dart';\n\nconst _kTitleBarHeight = 36.0;\n\nclass WindowFrameController extends InheritedWidget {\n  /// Whether the window frame is hidden.\n  final bool isWindowFrameHidden;\n\n  /// Sets the visibility of the window frame.\n  final void Function(bool) setWindowFrame;\n\n  /// Adds a listener that will be called when close button is clicked.\n  /// The listener should return `true` to allow the window to be closed.\n  final void Function(WindowCloseListener listener) addCloseListener;\n\n  /// Removes a close listener.\n  final void Function(WindowCloseListener listener) removeCloseListener;\n\n  const WindowFrameController._create({\n    required this.isWindowFrameHidden,\n    required this.setWindowFrame,\n    required this.addCloseListener,\n    required this.removeCloseListener,\n    required super.child,\n  });\n\n  @override\n  bool updateShouldNotify(covariant InheritedWidget oldWidget) {\n    return false;\n  }\n}\n\nclass WindowFrame extends StatefulWidget {\n  const WindowFrame(this.child, {super.key});\n\n  final Widget child;\n\n  @override\n  State<WindowFrame> createState() => _WindowFrameState();\n\n  static WindowFrameController of(BuildContext context) {\n    return context.dependOnInheritedWidgetOfExactType<WindowFrameController>()!;\n  }\n}\n\ntypedef WindowCloseListener = bool Function();\n\nclass _WindowFrameState extends State<WindowFrame> {\n  bool isWindowFrameHidden = false;\n  bool useDarkTheme = false;\n  var closeListeners = <WindowCloseListener>[];\n\n  /// Sets the visibility of the window frame.\n  void setWindowFrame(bool show) {\n    setState(() {\n      isWindowFrameHidden = !show;\n    });\n  }\n\n  /// Adds a listener that will be called when close button is clicked.\n  /// The listener should return `true` to allow the window to be closed.\n  void addCloseListener(WindowCloseListener listener) {\n    closeListeners.add(listener);\n  }\n\n  /// Removes a close listener.\n  void removeCloseListener(WindowCloseListener listener) {\n    closeListeners.remove(listener);\n  }\n\n  void _onClose() {\n    for (var listener in closeListeners) {\n      if (!listener()) {\n        return;\n      }\n    }\n    exit(0);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (App.isMobile) return widget.child;\n\n    Widget body = Stack(\n      children: [\n        Positioned.fill(\n          child: MediaQuery(\n            data: MediaQuery.of(context).copyWith(\n              padding: isWindowFrameHidden\n                  ? null\n                  : const EdgeInsets.only(top: _kTitleBarHeight),\n            ),\n            child: widget.child,\n          ),\n        ),\n        if (!isWindowFrameHidden)\n          Positioned(\n            top: 0,\n            left: 0,\n            right: 0,\n            child: Material(\n              color: Colors.transparent,\n              child: Theme(\n                data: Theme.of(context).copyWith(\n                  brightness: useDarkTheme ? Brightness.dark : null,\n                ),\n                child: Builder(builder: (context) {\n                  return SizedBox(\n                    height: _kTitleBarHeight,\n                    child: Row(\n                      children: [\n                        if (App.isMacOS)\n                          const DragToMoveArea(\n                            child: SizedBox(\n                              height: double.infinity,\n                              width: 16,\n                            ),\n                          ).paddingRight(52)\n                        else\n                          const SizedBox(width: 12),\n                        Expanded(\n                          child: DragToMoveArea(\n                            child: Text(\n                              'Venera',\n                              style: TextStyle(\n                                fontSize: 13,\n                                color: (useDarkTheme ||\n                                        context.brightness == Brightness.dark)\n                                    ? Colors.white\n                                    : Colors.black,\n                              ),\n                            )\n                                .toAlign(Alignment.centerLeft)\n                                .paddingLeft(4 + (App.isMacOS ? 25 : 0)),\n                          ),\n                        ),\n                        if (kDebugMode)\n                          const TextButton(\n                            onPressed: debug,\n                            child: Text('Debug'),\n                          ),\n                        if (!App.isMacOS)\n                          _WindowButtons(\n                            onClose: _onClose,\n                          )\n                      ],\n                    ),\n                  );\n                }),\n              ),\n            ),\n          )\n      ],\n    );\n\n    if (App.isLinux) {\n      body = VirtualWindowFrame(child: body);\n    }\n\n    return WindowFrameController._create(\n      isWindowFrameHidden: isWindowFrameHidden,\n      setWindowFrame: setWindowFrame,\n      addCloseListener: addCloseListener,\n      removeCloseListener: removeCloseListener,\n      child: body,\n    );\n  }\n}\n\nclass _WindowButtons extends StatefulWidget {\n  const _WindowButtons({required this.onClose});\n\n  final void Function() onClose;\n\n  @override\n  State<_WindowButtons> createState() => _WindowButtonsState();\n}\n\nclass _WindowButtonsState extends State<_WindowButtons> with WindowListener {\n  bool isMaximized = false;\n\n  @override\n  void initState() {\n    windowManager.addListener(this);\n    windowManager.isMaximized().then((value) {\n      if (value) {\n        setState(() {\n          isMaximized = true;\n        });\n      }\n    });\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    windowManager.removeListener(this);\n    super.dispose();\n  }\n\n  @override\n  void onWindowMaximize() {\n    setState(() {\n      isMaximized = true;\n    });\n    super.onWindowMaximize();\n  }\n\n  @override\n  void onWindowUnmaximize() {\n    setState(() {\n      isMaximized = false;\n    });\n    super.onWindowUnmaximize();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final dark = Theme.of(context).brightness == Brightness.dark;\n    final color = dark ? Colors.white : Colors.black;\n    final hoverColor = dark ? Colors.white30 : Colors.black12;\n\n    return SizedBox(\n      width: 138,\n      height: _kTitleBarHeight,\n      child: Row(\n        children: [\n          WindowButton(\n            icon: MinimizeIcon(color: color),\n            hoverColor: hoverColor,\n            onPressed: () async {\n              bool isMinimized = await windowManager.isMinimized();\n              if (isMinimized) {\n                windowManager.restore();\n              } else {\n                windowManager.minimize();\n              }\n            },\n          ),\n          if (isMaximized)\n            WindowButton(\n              icon: RestoreIcon(\n                color: color,\n              ),\n              hoverColor: hoverColor,\n              onPressed: () {\n                windowManager.unmaximize();\n              },\n            )\n          else\n            WindowButton(\n              icon: MaximizeIcon(\n                color: color,\n              ),\n              hoverColor: hoverColor,\n              onPressed: () {\n                windowManager.maximize();\n              },\n            ),\n          WindowButton(\n            icon: CloseIcon(\n              color: color,\n            ),\n            hoverIcon: CloseIcon(\n              color: !dark ? Colors.white : Colors.black,\n            ),\n            hoverColor: Colors.red,\n            onPressed: widget.onClose,\n          )\n        ],\n      ),\n    );\n  }\n}\n\nclass WindowButton extends StatefulWidget {\n  const WindowButton(\n      {required this.icon,\n      required this.onPressed,\n      required this.hoverColor,\n      this.hoverIcon,\n      super.key});\n\n  final Widget icon;\n\n  final void Function() onPressed;\n\n  final Color hoverColor;\n\n  final Widget? hoverIcon;\n\n  @override\n  State<WindowButton> createState() => _WindowButtonState();\n}\n\nclass _WindowButtonState extends State<WindowButton> {\n  bool isHovering = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return MouseRegion(\n      onEnter: (event) => setState(() {\n        isHovering = true;\n      }),\n      onExit: (event) => setState(() {\n        isHovering = false;\n      }),\n      child: GestureDetector(\n        onTap: widget.onPressed,\n        child: Container(\n          width: 46,\n          height: double.infinity,\n          decoration:\n              BoxDecoration(color: isHovering ? widget.hoverColor : null),\n          child: isHovering ? widget.hoverIcon ?? widget.icon : widget.icon,\n        ),\n      ),\n    );\n  }\n}\n\n/// Close\nclass CloseIcon extends StatelessWidget {\n  final Color color;\n\n  const CloseIcon({super.key, required this.color});\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_ClosePainter(color));\n}\n\nclass _ClosePainter extends _IconPainter {\n  _ClosePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color, true);\n    canvas.drawLine(const Offset(0, 0), Offset(size.width, size.height), p);\n    canvas.drawLine(Offset(0, size.height), Offset(size.width, 0), p);\n  }\n}\n\n/// Maximize\nclass MaximizeIcon extends StatelessWidget {\n  final Color color;\n\n  const MaximizeIcon({super.key, required this.color});\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_MaximizePainter(color));\n}\n\nclass _MaximizePainter extends _IconPainter {\n  _MaximizePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color);\n    canvas.drawRect(Rect.fromLTRB(0, 0, size.width - 1, size.height - 1), p);\n  }\n}\n\n/// Restore\nclass RestoreIcon extends StatelessWidget {\n  final Color color;\n\n  const RestoreIcon({\n    super.key,\n    required this.color,\n  });\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_RestorePainter(color));\n}\n\nclass _RestorePainter extends _IconPainter {\n  _RestorePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color);\n    canvas.drawRect(Rect.fromLTRB(0, 2, size.width - 2, size.height), p);\n    canvas.drawLine(const Offset(2, 2), const Offset(2, 0), p);\n    canvas.drawLine(const Offset(2, 0), Offset(size.width, 0), p);\n    canvas.drawLine(\n        Offset(size.width, 0), Offset(size.width, size.height - 2), p);\n    canvas.drawLine(Offset(size.width, size.height - 2),\n        Offset(size.width - 2, size.height - 2), p);\n  }\n}\n\n/// Minimize\nclass MinimizeIcon extends StatelessWidget {\n  final Color color;\n\n  const MinimizeIcon({super.key, required this.color});\n\n  @override\n  Widget build(BuildContext context) => _AlignedPaint(_MinimizePainter(color));\n}\n\nclass _MinimizePainter extends _IconPainter {\n  _MinimizePainter(super.color);\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint p = getPaint(color);\n    canvas.drawLine(\n        Offset(0, size.height / 2), Offset(size.width, size.height / 2), p);\n  }\n}\n\n/// Helpers\nabstract class _IconPainter extends CustomPainter {\n  _IconPainter(this.color);\n\n  final Color color;\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;\n}\n\nclass _AlignedPaint extends StatelessWidget {\n  const _AlignedPaint(this.painter);\n\n  final CustomPainter painter;\n\n  @override\n  Widget build(BuildContext context) {\n    return Align(\n        alignment: Alignment.center,\n        child: CustomPaint(size: const Size(10, 10), painter: painter));\n  }\n}\n\nPaint getPaint(Color color, [bool isAntiAlias = false]) => Paint()\n  ..color = color\n  ..style = PaintingStyle.stroke\n  ..isAntiAlias = isAntiAlias\n  ..strokeWidth = 1;\n\nclass WindowPlacement {\n  final Rect rect;\n\n  final bool isMaximized;\n\n  const WindowPlacement(this.rect, this.isMaximized);\n\n  Future<void> applyToWindow() async {\n    await windowManager.setBounds(rect);\n\n    if (!validate(rect)) {\n      await windowManager.center();\n    }\n\n    if (isMaximized) {\n      await windowManager.maximize();\n    }\n  }\n\n  Future<void> writeToFile() async {\n    var file = File(\"${App.dataPath}/window_placement\");\n    await file.writeAsString(jsonEncode({\n      'width': rect.width,\n      'height': rect.height,\n      'x': rect.topLeft.dx,\n      'y': rect.topLeft.dy,\n      'isMaximized': isMaximized\n    }));\n  }\n\n  static Future<WindowPlacement> loadFromFile() async {\n    try {\n      var file = File(\"${App.dataPath}/window_placement\");\n      if (!file.existsSync()) {\n        return defaultPlacement;\n      }\n      var json = jsonDecode(await file.readAsString());\n      var rect =\n          Rect.fromLTWH(json['x'], json['y'], json['width'], json['height']);\n      return WindowPlacement(rect, json['isMaximized']);\n    } catch (e) {\n      return defaultPlacement;\n    }\n  }\n\n  static Rect? lastValidRect;\n\n  static Future<WindowPlacement> get current async {\n    var rect = await windowManager.getBounds();\n    if (validate(rect)) {\n      lastValidRect = rect;\n    } else {\n      rect = lastValidRect ?? defaultPlacement.rect;\n    }\n    var isMaximized = await windowManager.isMaximized();\n    return WindowPlacement(rect, isMaximized);\n  }\n\n  static const defaultPlacement =\n      WindowPlacement(Rect.fromLTWH(10, 10, 900, 600), false);\n\n  static WindowPlacement cache = defaultPlacement;\n\n  static Timer? timer;\n\n  static void loop() async {\n    timer ??= Timer.periodic(const Duration(milliseconds: 100), (timer) async {\n      var placement = await WindowPlacement.current;\n      if (placement.rect != cache.rect ||\n          placement.isMaximized != cache.isMaximized) {\n        cache = placement;\n        await placement.writeToFile();\n      }\n    });\n  }\n\n  static bool validate(Rect rect) {\n    return rect.topLeft.dx >= 0 && rect.topLeft.dy >= 0;\n  }\n}\n\nclass VirtualWindowFrame extends StatefulWidget {\n  const VirtualWindowFrame({\n    super.key,\n    required this.child,\n  });\n\n  /// The [child] contained by the VirtualWindowFrame.\n  final Widget child;\n\n  @override\n  State<StatefulWidget> createState() => _VirtualWindowFrameState();\n}\n\nclass _VirtualWindowFrameState extends State<VirtualWindowFrame>\n    with WindowListener {\n  bool _isFocused = true;\n  bool _isMaximized = false;\n  bool _isFullScreen = false;\n\n  @override\n  void initState() {\n    windowManager.addListener(this);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    windowManager.removeListener(this);\n    super.dispose();\n  }\n\n  Widget _buildVirtualWindowFrame(BuildContext context) {\n    return Container(\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(_isMaximized ? 0 : 8),\n        color: Colors.transparent,\n        boxShadow: <BoxShadow>[\n          BoxShadow(\n            color: Colors.black.toOpacity(_isFocused ? 0.4 : 0.2),\n            blurRadius: 4,\n          )\n        ],\n      ),\n      clipBehavior: Clip.antiAlias,\n      child: widget.child,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return DragToResizeArea(\n      enableResizeEdges: (_isMaximized || _isFullScreen) ? [] : null,\n      child: Padding(\n        padding: EdgeInsets.all(_isMaximized ? 0 : 4),\n        child: _buildVirtualWindowFrame(context),\n      ),\n    );\n  }\n\n  @override\n  void onWindowFocus() {\n    setState(() {\n      _isFocused = true;\n    });\n  }\n\n  @override\n  void onWindowBlur() {\n    setState(() {\n      _isFocused = false;\n    });\n  }\n\n  @override\n  void onWindowMaximize() {\n    setState(() {\n      _isMaximized = true;\n    });\n  }\n\n  @override\n  void onWindowUnmaximize() {\n    setState(() {\n      _isMaximized = false;\n    });\n  }\n\n  @override\n  void onWindowEnterFullScreen() {\n    setState(() {\n      _isFullScreen = true;\n    });\n  }\n\n  @override\n  void onWindowLeaveFullScreen() {\n    setState(() {\n      _isFullScreen = false;\n    });\n  }\n}\n\n// ignore: non_constant_identifier_names\nTransitionBuilder VirtualWindowFrameInit() {\n  return (_, Widget? child) {\n    return VirtualWindowFrame(\n      child: child!,\n    );\n  };\n}\n\nvoid debug() {\n  ComicSourceManager().reload();\n}\n"
  },
  {
    "path": "lib/foundation/app.dart",
    "content": "import 'dart:io';\nimport 'dart:ui';\n\nimport 'package:flutter/material.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:venera/foundation/history.dart';\n\nimport 'appdata.dart';\nimport 'favorites.dart';\nimport 'local.dart';\n\nexport \"widget_utils.dart\";\nexport \"context.dart\";\n\nclass _App {\n  final version = \"1.6.3\";\n\n  bool get isAndroid => Platform.isAndroid;\n\n  bool get isIOS => Platform.isIOS;\n\n  bool get isWindows => Platform.isWindows;\n\n  bool get isLinux => Platform.isLinux;\n\n  bool get isMacOS => Platform.isMacOS;\n\n  bool get isDesktop =>\n      Platform.isWindows || Platform.isLinux || Platform.isMacOS;\n\n  bool get isMobile => Platform.isAndroid || Platform.isIOS;\n\n  // Whether the app has been initialized.\n  // If current Isolate is main Isolate, this value is always true.\n  bool isInitialized = false;\n\n  Locale get locale {\n    Locale deviceLocale = PlatformDispatcher.instance.locale;\n    if (deviceLocale.languageCode == \"zh\" &&\n        deviceLocale.scriptCode == \"Hant\") {\n      deviceLocale = const Locale(\"zh\", \"TW\");\n    }\n    if (appdata.settings['language'] != 'system') {\n      return Locale(\n        appdata.settings['language'].split('-')[0],\n        appdata.settings['language'].split('-')[1],\n      );\n    }\n    return deviceLocale;\n  }\n\n  late String dataPath;\n  late String cachePath;\n  String? externalStoragePath;\n\n  final rootNavigatorKey = GlobalKey<NavigatorState>();\n\n  GlobalKey<NavigatorState>? mainNavigatorKey;\n\n  BuildContext get rootContext => rootNavigatorKey.currentContext!;\n\n  final Appdata data = appdata;\n\n  final HistoryManager history = HistoryManager();\n\n  final LocalFavoritesManager favorites = LocalFavoritesManager();\n\n  final LocalManager local = LocalManager();\n\n  void rootPop() {\n    rootNavigatorKey.currentState?.maybePop();\n  }\n\n  void pop() {\n    if (rootNavigatorKey.currentState?.canPop() ?? false) {\n      rootNavigatorKey.currentState?.pop();\n    } else if (mainNavigatorKey?.currentState?.canPop() ?? false) {\n      mainNavigatorKey?.currentState?.pop();\n    }\n  }\n\n  Future<void> init() async {\n    cachePath = (await getApplicationCacheDirectory()).path;\n    dataPath = (await getApplicationSupportDirectory()).path;\n    if (isAndroid) {\n      externalStoragePath = (await getExternalStorageDirectory())!.path;\n    }\n    isInitialized = true;\n  }\n\n  Future<void> initComponents() async {\n    await Future.wait([\n      data.init(),\n      history.init(),\n      favorites.init(),\n      local.init(),\n    ]);\n  }\n\n  Function? _forceRebuildHandler;\n\n  void registerForceRebuild(Function handler) {\n    _forceRebuildHandler = handler;\n  }\n\n  void forceRebuild() {\n    _forceRebuildHandler?.call();\n  }\n}\n\n// ignore: non_constant_identifier_names\nfinal App = _App();\n"
  },
  {
    "path": "lib/foundation/app_page_route.dart",
    "content": "import 'dart:math';\nimport 'dart:ui';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:venera/foundation/app.dart';\n\nconst double _kBackGestureWidth = 20.0;\nconst int _kMaxDroppedSwipePageForwardAnimationTime = 800;\nconst int _kMaxPageBackAnimationTime = 300;\nconst double _kMinFlingVelocity = 1.0;\n\nclass AppPageRoute<T> extends PageRoute<T> with _AppRouteTransitionMixin{\n  /// Construct a MaterialPageRoute whose contents are defined by [builder].\n  AppPageRoute({\n    required this.builder,\n    super.settings,\n    this.maintainState = true,\n    super.fullscreenDialog,\n    super.allowSnapshotting = true,\n    super.barrierDismissible = false,\n    this.enableIOSGesture = true,\n    this.preventRebuild = true,\n  }) {\n    assert(opaque);\n  }\n\n  /// Builds the primary contents of the route.\n  final WidgetBuilder builder;\n\n  String? label;\n\n  @override\n  toString() => \"/$label\";\n\n  @override\n  Widget buildContent(BuildContext context) {\n    var widget = builder(context);\n    label = widget.runtimeType.toString();\n    return widget;\n  }\n\n  @override\n  final bool maintainState;\n\n  @override\n  String get debugLabel => '${super.debugLabel}(${settings.name})';\n\n  @override\n  final bool enableIOSGesture;\n\n  @override\n  final bool preventRebuild;\n}\n\nmixin _AppRouteTransitionMixin<T> on PageRoute<T> {\n  /// Builds the primary contents of the route.\n  @protected\n  Widget buildContent(BuildContext context);\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 300);\n\n  @override\n  Color? get barrierColor => null;\n\n  @override\n  String? get barrierLabel => null;\n\n  @override\n  bool canTransitionTo(TransitionRoute<dynamic> nextRoute) {\n    // Don't perform outgoing animation if the next route is a fullscreen dialog.\n    return nextRoute is PageRoute && !nextRoute.fullscreenDialog;\n  }\n\n  bool get enableIOSGesture;\n\n  bool get preventRebuild;\n\n  Widget? _child;\n\n  @override\n  Widget buildPage(\n      BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      ) {\n    Widget result;\n\n    if(preventRebuild){\n      result = _child ?? (_child = buildContent(context));\n    } else {\n      result = buildContent(context);\n    }\n\n    return Semantics(\n      scopesRoute: true,\n      explicitChildNodes: true,\n      child: result,\n    );\n  }\n\n  static bool _isPopGestureEnabled<T>(PageRoute<T> route) {\n    if (route.isFirst ||\n        route.willHandlePopInternally ||\n        route.popDisposition == RoutePopDisposition.doNotPop ||\n        route.fullscreenDialog ||\n        route.animation!.status != AnimationStatus.completed ||\n        route.secondaryAnimation!.status != AnimationStatus.dismissed ||\n        !route.popGestureEnabled ||\n        route.navigator!.userGestureInProgress) {\n      return false;\n    }\n\n    return true;\n  }\n\n  @override\n  Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {\n    PageTransitionsBuilder builder;\n    if (App.isAndroid) {\n      builder = PredictiveBackPageTransitionsBuilder();\n    } else {\n      builder = SlidePageTransitionBuilder();\n  }\n\n  return builder.buildTransitions(\n        this,\n        context,\n        animation,\n        secondaryAnimation,\n    enableIOSGesture && App.isIOS\n      ? IOSBackGestureDetector(\n        gestureWidth: _kBackGestureWidth,\n        enabledCallback: () => _isPopGestureEnabled<T>(this),\n        onStartPopGesture: () => _startPopGesture(this),\n        child: child,\n        )\n      : child);\n  }\n\n  IOSBackGestureController _startPopGesture(PageRoute<T> route) {\n    return IOSBackGestureController(route.controller!, route.navigator!);\n  }\n}\n\nclass IOSBackGestureController {\n  final AnimationController controller;\n\n  final NavigatorState navigator;\n\n  IOSBackGestureController(this.controller, this.navigator) {\n    navigator.didStartUserGesture();\n  }\n\n  void dragEnd(double velocity) {\n    const Curve animationCurve = Curves.fastLinearToSlowEaseIn;\n    final bool animateForward;\n\n    if (velocity.abs() >= _kMinFlingVelocity) {\n      animateForward = velocity <= 0;\n    } else {\n      animateForward = controller.value > 0.5;\n    }\n\n    if (animateForward) {\n      final droppedPageForwardAnimationTime = min(\n        lerpDouble(\n                _kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!\n            .floor(),\n        _kMaxPageBackAnimationTime,\n      );\n      controller.animateTo(1.0,\n          duration: Duration(milliseconds: droppedPageForwardAnimationTime),\n          curve: animationCurve);\n    } else {\n      navigator.pop();\n      if (controller.isAnimating) {\n        final droppedPageBackAnimationTime = lerpDouble(\n                0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!\n            .floor();\n        controller.animateBack(0.0,\n            duration: Duration(milliseconds: droppedPageBackAnimationTime),\n            curve: animationCurve);\n      }\n    }\n\n    if (controller.isAnimating) {\n      late AnimationStatusListener animationStatusCallback;\n      animationStatusCallback = (status) {\n        navigator.didStopUserGesture();\n        controller.removeStatusListener(animationStatusCallback);\n      };\n      controller.addStatusListener(animationStatusCallback);\n    } else {\n      navigator.didStopUserGesture();\n    }\n  }\n\n  void dragUpdate(double delta) {\n    controller.value -= delta;\n  }\n}\n\nclass IOSBackGestureDetector extends StatefulWidget {\n  const IOSBackGestureDetector({\n    required this.enabledCallback,\n    required this.child,\n    required this.gestureWidth,\n    required this.onStartPopGesture,\n    super.key,\n  });\n\n  final double gestureWidth;\n  final bool Function() enabledCallback;\n  final IOSBackGestureController Function() onStartPopGesture;\n  final Widget child;\n\n  @override\n  State<IOSBackGestureDetector> createState() => _IOSBackGestureDetectorState();\n}\n\nclass _IOSBackGestureDetectorState extends State<IOSBackGestureDetector> {\n  IOSBackGestureController? _backGestureController;\n  late _BackSwipeRecognizer _recognizer;\n\n\n  @override\n  void initState() {\n    super.initState();\n    _recognizer = _BackSwipeRecognizer(\n      debugOwner: this,\n      gestureWidth: widget.gestureWidth,\n      isPointerInHorizontal: _isPointerInHorizontalScrollable,\n      onStart: _handleDragStart,\n      onUpdate: _handleDragUpdate,\n      onEnd: _handleDragEnd,\n      onCancel: _handleDragCancel,\n    );\n  }\n\n  @override\n  void dispose() {\n    _recognizer.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return RawGestureDetector(\n      behavior: HitTestBehavior.translucent,\n      gestures: {\n        _BackSwipeRecognizer: GestureRecognizerFactoryWithHandlers<_BackSwipeRecognizer>(\n          () => _recognizer,\n          (instance) {\n            instance.gestureWidth = widget.gestureWidth;\n          },\n        ),\n      },\n      child: widget.child,\n    );\n  }\n\n  bool _isPointerInHorizontalScrollable(Offset globalPosition) {\n    final HitTestResult result = HitTestResult();\n    final binding = WidgetsBinding.instance;\n    binding.hitTestInView(result, globalPosition, binding.platformDispatcher.implicitView!.viewId);\n\n    for (final entry in result.path) {\n      final target = entry.target;\n      if (target is RenderViewport) {\n        if (target.axisDirection == AxisDirection.left || \n            target.axisDirection == AxisDirection.right) {\n          return true;\n        }\n      } \n      else if (target is RenderSliver) {\n         if (target.constraints.axisDirection == AxisDirection.left || \n             target.constraints.axisDirection == AxisDirection.right) {\n          return true;\n        }\n      }\n      else if (target.runtimeType.toString() == '_RenderSingleChildViewport') {\n        try {\n          final dynamic renderObject = target;\n          if (renderObject.axis == Axis.horizontal) {\n            return true;\n          }\n        } catch (e) {\n          // protected\n        }\n      }\n      else if (target is RenderEditable) {\n         return true;\n      }\n    }\n    return false;\n  }\n\n  void _handleDragStart(DragStartDetails details) {\n    if (!widget.enabledCallback()) return;\n    if (mounted && _backGestureController == null) {\n      _backGestureController = widget.onStartPopGesture();\n    }\n  }\n\n  void _handleDragUpdate(DragUpdateDetails details) {\n    if (mounted && _backGestureController != null) {\n      _backGestureController!.dragUpdate(\n          _convertToLogical(details.primaryDelta! / context.size!.width));\n    }\n  }\n\n  void _handleDragEnd(DragEndDetails details) {\n    if (mounted && _backGestureController != null) {\n      _backGestureController!.dragEnd(_convertToLogical(\n          details.velocity.pixelsPerSecond.dx / context.size!.width));\n      _backGestureController = null;\n    }\n  }\n\n  void _handleDragCancel() {\n    if (mounted && _backGestureController != null) {\n      _backGestureController?.dragEnd(0.0);\n      _backGestureController = null;\n    }\n  }\n\n  double _convertToLogical(double value) {\n    switch (Directionality.of(context)) {\n      case TextDirection.rtl: return -value;\n      case TextDirection.ltr: return value;\n    }\n  }\n}\n\nclass _BackSwipeRecognizer extends OneSequenceGestureRecognizer {\n  _BackSwipeRecognizer({\n    required this.isPointerInHorizontal,\n    required this.gestureWidth,\n    required this.onStart,\n    required this.onUpdate,\n    required this.onEnd,\n    required this.onCancel,\n    super.debugOwner,\n  });\n\n  final bool Function(Offset globalPosition) isPointerInHorizontal;\n  double gestureWidth;\n  final ValueSetter<DragStartDetails> onStart;\n  final ValueSetter<DragUpdateDetails> onUpdate;\n  final ValueSetter<DragEndDetails> onEnd;\n  final VoidCallback onCancel;\n\n  Offset? _startGlobal;\n  bool _accepted = false;\n  bool _startedInHorizontal = false;\n  bool _startedNearLeftEdge = false; \n\n  VelocityTracker? _velocityTracker;\n\n  static const double _minDistance = 5.0; \n\n  @override\n  void addPointer(PointerDownEvent event) {\n    startTrackingPointer(event.pointer);\n    _startGlobal = event.position;\n    _accepted = false;\n    \n    _startedInHorizontal = isPointerInHorizontal(event.position);\n    _startedNearLeftEdge = event.position.dx <= gestureWidth;\n\n    _velocityTracker = VelocityTracker.withKind(event.kind);\n    _velocityTracker?.addPosition(event.timeStamp, event.position);\n  }\n\n  @override\n  void handleEvent(PointerEvent event) {\n    if (event is PointerMoveEvent || event is PointerUpEvent) {\n      _velocityTracker?.addPosition(event.timeStamp, event.position);\n    }\n\n    if (event is PointerMoveEvent) {\n      if (_startGlobal == null) return;\n      final delta = event.position - _startGlobal!;\n      final dx = delta.dx;\n      final dy = delta.dy.abs();\n\n      if (!_accepted) {\n        if (delta.distance < _minDistance) return;\n\n        final isRight = dx > 0;\n        final isHorizontal = dx.abs() > dy * 1.5;\n        final bool eligible = _startedNearLeftEdge || (!_startedInHorizontal);\n\n        if (isRight && isHorizontal && eligible) {\n          _accepted = true;\n          resolve(GestureDisposition.accepted);\n          onStart(DragStartDetails(\n            globalPosition: _startGlobal!, \n            localPosition: event.localPosition\n          ));\n        } else {\n          resolve(GestureDisposition.rejected);\n          stopTrackingPointer(event.pointer);\n          _startGlobal = null;\n          _velocityTracker = null;\n        }\n      }\n\n      if (_accepted) {\n        onUpdate(DragUpdateDetails(\n          globalPosition: event.position,\n          localPosition: event.localPosition,\n          primaryDelta: event.delta.dx,\n          delta: Offset(event.delta.dx, 0),\n        ));\n      }\n    } else if (event is PointerUpEvent) {\n      if (_accepted) {\n        final Velocity velocity = _velocityTracker?.getVelocity() ?? Velocity.zero;\n        \n        onEnd(DragEndDetails(\n          velocity: velocity,\n          primaryVelocity: velocity.pixelsPerSecond.dx\n        ));\n      }\n      _reset();\n    } else if (event is PointerCancelEvent) {\n      if (_accepted) {\n        onCancel();\n      }\n      _reset();\n    }\n  }\n\n  void _reset() {\n    stopTrackingPointer(0);\n    _accepted = false;\n    _startGlobal = null;\n    _startedInHorizontal = false;\n    _startedNearLeftEdge = false;\n    _velocityTracker = null;\n  }\n\n  @override\n  String get debugDescription => 'IOSBackSwipe';\n\n  @override\n  void didStopTrackingLastPointer(int pointer) {}\n}\n\nclass SlidePageTransitionBuilder extends PageTransitionsBuilder {\n  @override\n  Widget buildTransitions<T>(\n      PageRoute<T> route,\n      BuildContext context,\n      Animation<double> animation,\n      Animation<double> secondaryAnimation,\n      Widget child) {\n    final Animation<double> primaryAnimation = App.isIOS\n        ? animation\n        : CurvedAnimation(parent: animation, curve: Curves.ease);\n    final Animation<double> secondaryCurve = App.isIOS\n        ? secondaryAnimation\n        : CurvedAnimation(parent: secondaryAnimation, curve: Curves.ease);\n\n    return SlideTransition(\n      position: Tween<Offset>(\n        begin: const Offset(1, 0),\n        end: Offset.zero,\n      ).animate(primaryAnimation),\n      child: SlideTransition(\n        position: Tween<Offset>(\n          begin: Offset.zero,\n          end: const Offset(-0.4, 0),\n        ).animate(secondaryCurve),\n        child: PhysicalModel(\n          color: Colors.transparent,\n          borderRadius: BorderRadius.zero,\n          clipBehavior: Clip.hardEdge,\n          elevation: 6,\n          child: Material(child: child),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/foundation/appdata.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:uuid/uuid.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/utils/init.dart';\nimport 'package:venera/utils/io.dart';\n\nclass Appdata with Init {\n  Appdata._create();\n\n  final Settings settings = Settings._create();\n\n  var searchHistory = <String>[];\n\n  bool _isSavingData = false;\n\n  Future<void> saveData([bool sync = true]) async {\n    while (_isSavingData) {\n      await Future.delayed(const Duration(milliseconds: 20));\n    }\n    _isSavingData = true;\n    try {\n      var futures = <Future>[];\n      var json = toJson();\n      var data = jsonEncode(json);\n      var file = File(FilePath.join(App.dataPath, 'appdata.json'));\n      futures.add(file.writeAsString(data));\n\n      var disableSyncFields = json[\"settings\"][\"disableSyncFields\"] as String;\n      if (disableSyncFields.isNotEmpty) {\n        var json4sync = jsonDecode(data);\n        List<String> customDisableSync = splitField(disableSyncFields);\n        for (var field in customDisableSync) {\n          json4sync[\"settings\"].remove(field);\n        }\n        var data4sync = jsonEncode(json4sync);\n        var file4sync = File(FilePath.join(App.dataPath, 'syncdata.json'));\n        futures.add(file4sync.writeAsString(data4sync));\n      }\n\n      await Future.wait(futures);\n    } finally {\n      _isSavingData = false;\n    }\n    if (sync) {\n      DataSync().uploadData();\n    }\n  }\n\n  void addSearchHistory(String keyword) {\n    if (searchHistory.contains(keyword)) {\n      searchHistory.remove(keyword);\n    }\n    searchHistory.insert(0, keyword);\n    if (searchHistory.length > 50) {\n      searchHistory.removeLast();\n    }\n    saveData();\n  }\n\n  void removeSearchHistory(String keyword) {\n    searchHistory.remove(keyword);\n    saveData();\n  }\n\n  void clearSearchHistory() {\n    searchHistory.clear();\n    saveData();\n  }\n\n  Map<String, dynamic> toJson() {\n    return {'settings': settings._data, 'searchHistory': searchHistory};\n  }\n\n  List<String> splitField(String merged) {\n    return merged\n        .split(',')\n        .map((field) => field.trim())\n        .where((field) => field.isNotEmpty)\n        .toList();\n  }\n\n  /// Following fields are related to device-specific data and should not be synced.\n  static const _disableSync = [\n    \"proxy\",\n    \"authorizationRequired\",\n    \"customImageProcessing\",\n    \"webdav\",\n    \"disableSyncFields\",\n    \"deviceId\",\n  ];\n\n  /// Sync data from another device\n  void syncData(Map<String, dynamic> data) {\n    if (data['settings'] is Map) {\n      var settings = data['settings'] as Map<String, dynamic>;\n\n      List<String> customDisableSync = splitField(\n        this.settings[\"disableSyncFields\"] as String,\n      );\n\n      for (var key in settings.keys) {\n        if (!_disableSync.contains(key) && !customDisableSync.contains(key)) {\n          this.settings[key] = settings[key];\n        }\n      }\n    }\n    searchHistory = List.from(data['searchHistory'] ?? []);\n    saveData();\n  }\n\n  var implicitData = <String, dynamic>{};\n\n  void writeImplicitData() async {\n    while (_isSavingData) {\n      await Future.delayed(const Duration(milliseconds: 20));\n    }\n    _isSavingData = true;\n    try {\n      var file = File(FilePath.join(App.dataPath, 'implicitData.json'));\n      await file.writeAsString(jsonEncode(implicitData));\n    } finally {\n      _isSavingData = false;\n    }\n  }\n\n  @override\n  Future<void> doInit() async {\n    var dataPath = (await getApplicationSupportDirectory()).path;\n    var file = File(FilePath.join(dataPath, 'appdata.json'));\n    if (!await file.exists()) {\n      return;\n    }\n    try {\n      var json = jsonDecode(await file.readAsString());\n      for (var key in (json['settings'] as Map<String, dynamic>).keys) {\n        if (json['settings'][key] != null) {\n          settings[key] = json['settings'][key];\n        }\n      }\n      searchHistory = List.from(json['searchHistory']);\n    } catch (e) {\n      Log.error(\"Appdata\", \"Failed to load appdata\", e);\n      Log.info(\"Appdata\", \"Resetting appdata\");\n      file.deleteIgnoreError();\n    }\n    if ((settings[\"deviceId\"] as String).isEmpty) {\n      settings._data[\"deviceId\"] = const Uuid().v4();\n      await saveData(false);\n    }\n    try {\n      var implicitDataFile = File(FilePath.join(dataPath, 'implicitData.json'));\n      if (await implicitDataFile.exists()) {\n        implicitData = jsonDecode(await implicitDataFile.readAsString());\n      }\n    } catch (e) {\n      Log.error(\"Appdata\", \"Failed to load implicit data\", e);\n      Log.info(\"Appdata\", \"Resetting implicit data\");\n      var implicitDataFile = File(FilePath.join(dataPath, 'implicitData.json'));\n      implicitDataFile.deleteIgnoreError();\n    }\n  }\n}\n\nfinal appdata = Appdata._create();\n\nclass Settings with ChangeNotifier {\n  Settings._create();\n\n  final _data = <String, dynamic>{\n    'comicDisplayMode': 'detailed', // detailed, brief\n    'comicTileScale': 1.00, // 0.75-1.25\n    'color': 'system', // red, pink, purple, green, orange, blue\n    'theme_mode': 'system', // light, dark, system\n    'newFavoriteAddTo': 'end', // start, end\n    'moveFavoriteAfterRead': 'none', // none, end, start\n    'proxy': 'system', // direct, system, proxy string\n    'explore_pages': [],\n    'categories': [],\n    'favorites': [],\n    'searchSources': null,\n    'showFavoriteStatusOnTile': true,\n    'showHistoryStatusOnTile': false,\n    'blockedWords': [],\n    'blockedCommentWords': [],\n    'defaultSearchTarget': null,\n    'autoPageTurningInterval': 5, // in seconds\n    'readerMode': 'galleryLeftToRight', // values of [ReaderMode]\n    'readerScreenPicNumberForLandscape': 1, // 1 - 5\n    'readerScreenPicNumberForPortrait': 1, // 1 - 5\n    'enableTapToTurnPages': true,\n    'reverseTapToTurnPages': false,\n    'enablePageAnimation': true,\n    'language': 'system', // system, zh-CN, zh-TW, en-US\n    'cacheSize': 2048, // in MB\n    'downloadThreads': 5,\n    'enableLongPressToZoom': true,\n    'longPressZoomPosition': \"press\", // press, center\n    'checkUpdateOnStart': false,\n    'limitImageWidth': true,\n    'webdav': [], // empty means not configured\n    \"disableSyncFields\": \"\", // \"field1, field2, ...\"\n    'dataVersion': 0,\n    'quickFavorite': null,\n    'enableTurnPageByVolumeKey': true,\n    'enableClockAndBatteryInfoInReader': true,\n    'quickCollectImage': 'No', // No, DoubleTap, Swipe\n    'authorizationRequired': false,\n    'onClickFavorite': 'viewDetail', // viewDetail, read\n    'enableDnsOverrides': false,\n    'dnsOverrides': {},\n    'enableCustomImageProcessing': false,\n    'customImageProcessing': defaultCustomImageProcessing,\n    'sni': true,\n    'autoAddLanguageFilter': 'none', // none, chinese, english, japanese\n    'comicSourceListUrl': _defaultSourceListUrl,\n    'preloadImageCount': 4,\n    'followUpdatesFolder': null,\n    'initialPage': '0',\n    'comicListDisplayMode': 'paging', // paging, continuous\n    'showPageNumberInReader': true,\n    'showSingleImageOnFirstPage': false,\n    'enableDoubleTapToZoom': true,\n    'reverseChapterOrder': false,\n    'showSystemStatusBar': false,\n    'comicSpecificSettings': <String, Map<String, dynamic>>{},\n    'deviceSpecificSettings': <String, Map<String, dynamic>>{},\n    'deviceId': '',\n    'ignoreBadCertificate': false,\n    'readerScrollSpeed': 1.0, // 0.5 - 3.0\n    'localFavoritesFirst': true,\n    'autoCloseFavoritePanel': false,\n    'showChapterComments': true, // show chapter comments in reader\n    'showChapterCommentsAtEnd':\n        false, // show chapter comments at end of chapter\n  };\n\n  operator [](String key) {\n    return _data[key];\n  }\n\n  operator []=(String key, dynamic value) {\n    _data[key] = value;\n    if (key != \"dataVersion\") {\n      notifyListeners();\n    }\n  }\n\n  void setEnabledComicSpecificSettings(\n    String comicId,\n    String sourceKey,\n    bool enabled,\n  ) {\n    setReaderSetting(comicId, sourceKey, \"enabled\", enabled);\n  }\n\n  bool isComicSpecificSettingsEnabled(String? comicId, String? sourceKey) {\n    if (comicId == null || sourceKey == null) {\n      return false;\n    }\n    return _data['comicSpecificSettings'][\"$comicId@$sourceKey\"]?[\"enabled\"] ==\n        true;\n  }\n\n  dynamic getReaderSetting(String comicId, String sourceKey, String key) {\n    if (isComicSpecificSettingsEnabled(comicId, sourceKey)) {\n      var comicValue =\n          _data['comicSpecificSettings'][\"$comicId@$sourceKey\"]?[key];\n      if (comicValue != null) {\n        return comicValue;\n      }\n    }\n    return getDeviceReaderSetting(key);\n  }\n\n  void setReaderSetting(\n    String comicId,\n    String sourceKey,\n    String key,\n    dynamic value,\n  ) {\n    (_data['comicSpecificSettings'] as Map<String, dynamic>).putIfAbsent(\n      \"$comicId@$sourceKey\",\n      () => <String, dynamic>{},\n    )[key] = value;\n    notifyListeners();\n  }\n\n  void resetComicReaderSettings(String key) {\n    (_data['comicSpecificSettings'] as Map).remove(key);\n    notifyListeners();\n  }\n\n  void setEnabledDeviceSpecificSettings(bool enabled) {\n    setDeviceReaderSetting(\"enabled\", enabled);\n  }\n\n  bool isDeviceSpecificSettingsEnabled() {\n    var deviceId = _data['deviceId'] as String;\n    if (deviceId.isEmpty) {\n      return false;\n    }\n    return _data['deviceSpecificSettings'][deviceId]?[\"enabled\"] == true;\n  }\n\n  dynamic getDeviceReaderSetting(String key) {\n    if (!isDeviceSpecificSettingsEnabled()) {\n      return _data[key];\n    }\n    var deviceId = _data['deviceId'] as String;\n    return _data['deviceSpecificSettings'][deviceId]?[key] ?? _data[key];\n  }\n\n  void setDeviceReaderSetting(String key, dynamic value) {\n    var deviceId = _getOrCreateDeviceId();\n    (_data['deviceSpecificSettings'] as Map<String, dynamic>).putIfAbsent(\n      deviceId,\n      () => <String, dynamic>{},\n    )[key] = value;\n    notifyListeners();\n  }\n\n  void resetDeviceReaderSettings() {\n    var deviceId = _data['deviceId'] as String;\n    if (deviceId.isEmpty) {\n      return;\n    }\n    (_data['deviceSpecificSettings'] as Map).remove(deviceId);\n    notifyListeners();\n  }\n\n  String _getOrCreateDeviceId() {\n    var deviceId = _data['deviceId'] as String;\n    if (deviceId.isNotEmpty) {\n      return deviceId;\n    }\n    var id = const Uuid().v4();\n    _data['deviceId'] = id;\n    return id;\n  }\n\n  @override\n  String toString() {\n    return _data.toString();\n  }\n}\n\nconst defaultCustomImageProcessing = '''\n/**\n * Process an image\n * @param image {ArrayBuffer} - The image to process\n * @param cid {string} - The comic ID\n * @param eid {string} - The episode ID\n * @param page {number} - The page number\n * @param sourceKey {string} - The source key\n * @returns {Promise<ArrayBuffer> | {image: Promise<ArrayBuffer>, onCancel: () => void}} - The processed image\n */\nasync function processImage(image, cid, eid, page, sourceKey) {\n    let futureImage = new Promise((resolve, reject) => {\n        resolve(image);\n    });\n    return futureImage;\n}\n''';\n\nconst _defaultSourceListUrl =\n    \"https://cdn.jsdelivr.net/gh/venera-app/venera-configs@main/index.json\";\n"
  },
  {
    "path": "lib/foundation/cache_manager.dart",
    "content": "import 'dart:ffi';\nimport 'dart:isolate';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/utils/io.dart';\n\nimport 'app.dart';\n\nclass CacheManager {\n  static String get cachePath => '${App.cachePath}/cache';\n\n  static CacheManager? instance;\n\n  late Database _db;\n\n  int? _currentSize;\n\n  /// size in bytes\n  int get currentSize => _currentSize ?? 0;\n\n  int dir = 0;\n\n  int _limitSize = 2 * 1024 * 1024 * 1024;\n\n  static Future<int> _scanDir(Pointer<void> dbP, String dir) async {\n    var res = await Isolate.run(() async {\n      int totalSize = 0;\n      List<String> unmanagedFiles = [];\n      var db = sqlite3.fromPointer(dbP);\n      await for (var file in Directory(dir).list(recursive: true)) {\n        if (file is File) {\n          var size = await file.length();\n          var segments = file.uri.pathSegments;\n          var name = segments.last;\n          var dir = segments.elementAtOrNull(segments.length - 2) ?? \"*\";\n          var res = db.select('''\n            SELECT * FROM cache\n            WHERE dir = ? AND name = ?\n          ''', [dir, name]);\n          if (res.isEmpty) {\n            unmanagedFiles.add(file.path);\n          } else {\n            totalSize += size;\n          }\n        }\n      }\n      return {\n        'totalSize': totalSize,\n        'unmanagedFiles': unmanagedFiles,\n      };\n    });\n    // delete unmanaged files\n    // Only modify the database in the main isolate to avoid deadlock\n    for (var filePath in res['unmanagedFiles'] as List<String>) {\n      var file = File(filePath);\n      if (await file.exists()) {\n        await file.delete();\n      }\n      var segments = file.uri.pathSegments;\n      var name = segments.last;\n      var dir = segments.elementAtOrNull(segments.length - 2) ?? \"*\";\n      CacheManager()._db.execute('''\n        DELETE FROM cache\n        WHERE dir = ? AND name = ?\n      ''', [dir, name]);\n    }\n    return res['totalSize'] as int;\n  }\n\n  CacheManager._create() {\n    Directory(cachePath).createSync(recursive: true);\n    _db = sqlite3.open('${App.dataPath}/cache.db');\n    _db.execute('''\n      CREATE TABLE IF NOT EXISTS cache (\n        key TEXT PRIMARY KEY NOT NULL,\n        dir TEXT NOT NULL,\n        name TEXT NOT NULL,\n        expires INTEGER NOT NULL,\n        type TEXT\n      )\n    ''');\n    _scanDir(_db.handle, cachePath).then((value) {\n      _currentSize = value;\n      checkCache();\n    });\n  }\n\n  /// Get the singleton instance of CacheManager.\n  factory CacheManager() => instance ??= CacheManager._create();\n\n  /// set cache size limit in MB\n  void setLimitSize(int size) {\n    _limitSize = size * 1024 * 1024;\n  }\n\n  /// Write cache to disk.\n  Future<void> writeCache(String key, List<int> data,\n      [int duration = 7 * 24 * 60 * 60 * 1000]) async {\n    await delete(key);\n    this.dir++;\n    this.dir %= 100;\n    var dir = this.dir;\n    var name = md5.convert(key.codeUnits).toString();\n    var file = File('$cachePath/$dir/$name');\n    await file.create(recursive: true);\n    await file.writeAsBytes(data);\n    var expires = DateTime.now().millisecondsSinceEpoch + duration;\n    _db.execute('''\n      INSERT OR REPLACE INTO cache (key, dir, name, expires) VALUES (?, ?, ?, ?)\n    ''', [key, dir.toString(), name, expires]);\n    if (_currentSize != null) {\n      _currentSize = _currentSize! + data.length;\n    }\n    checkCacheIfRequired();\n  }\n\n  /// Find cache by key.\n  /// If cache is expired, it will be deleted and return null.\n  /// If cache is not found, it will return null.\n  /// If cache is found, it will return the file, and update the expires time.\n  Future<File?> findCache(String key) async {\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if (res.isEmpty) {\n      return null;\n    }\n    var row = res.first;\n    var dir = row[1] as String;\n    var name = row[2] as String;\n    var expires = row[3] as int;\n    var file = File('$cachePath/$dir/$name');\n    var now = DateTime.now().millisecondsSinceEpoch;\n    if (expires < now) {\n      // expired\n      _db.execute('''\n        DELETE FROM cache\n        WHERE key = ?\n      ''', [key]);\n      if (await file.exists()) {\n        await file.delete();\n      }\n      return null;\n    }\n    if (await file.exists()) {\n      // update time\n      var expires = now + 7 * 24 * 60 * 60 * 1000;\n      _db.execute('''\n        UPDATE cache\n        SET expires = ?\n        WHERE key = ?\n      ''', [expires, key]);\n      return file;\n    } else {\n      _db.execute('''\n        DELETE FROM cache\n        WHERE key = ?\n      ''', [key]);\n    }\n    return null;\n  }\n\n  bool _isChecking = false;\n\n  /// Check cache size and delete expired cache.\n  /// Only check cache if current size is greater than limit size.\n  void checkCacheIfRequired() {\n    if (_currentSize != null && _currentSize! > _limitSize) {\n      checkCache();\n    }\n  }\n\n  /// Check cache size and delete expired cache.\n  /// If current size is greater than limit size,\n  /// delete cache until current size is less than limit size.\n  Future<void> checkCache() async {\n    if (_isChecking) {\n      return;\n    }\n    _isChecking = true;\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE expires < ?\n    ''', [DateTime.now().millisecondsSinceEpoch]);\n    for (var row in res) {\n      var dir = row[1] as String;\n      var name = row[2] as String;\n      var file = File('$cachePath/$dir/$name');\n      if (await file.exists()) {\n        var size = await file.length();\n        _currentSize = _currentSize! - size;\n        await file.delete();\n      }\n    }\n    if (res.isNotEmpty) {\n      _db.execute('''\n      DELETE FROM cache\n      WHERE expires < ?\n    ''', [DateTime.now().millisecondsSinceEpoch]);\n    }\n\n    while (_currentSize != null && _currentSize! > _limitSize) {\n      var res = _db.select('''\n        SELECT * FROM cache\n        ORDER BY expires ASC\n        limit 10\n      ''');\n      if (res.isEmpty) {\n        // There are many files unmanaged by the cache manager.\n        // Clear all cache.\n        await Directory(cachePath).delete(recursive: true);\n        Directory(cachePath).createSync(recursive: true);\n        break;\n      }\n      for (var row in res) {\n        var key = row[0] as String;\n        var dir = row[1] as String;\n        var name = row[2] as String;\n        var file = File('$cachePath/$dir/$name');\n        if (await file.exists()) {\n          var size = await file.length();\n          await file.delete();\n          _db.execute('''\n            DELETE FROM cache\n            WHERE key = ?\n          ''', [key]);\n          _currentSize = _currentSize! - size;\n          if (_currentSize! <= _limitSize) {\n            break;\n          }\n        } else {\n          _db.execute('''\n            DELETE FROM cache\n            WHERE key = ?\n          ''', [key]);\n        }\n      }\n    }\n    _isChecking = false;\n  }\n\n  /// Delete cache by key.\n  Future<void> delete(String key) async {\n    var res = _db.select('''\n      SELECT * FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if (res.isEmpty) {\n      return;\n    }\n    var row = res.first;\n    var dir = row[1] as String;\n    var name = row[2] as String;\n    var file = File('$cachePath/$dir/$name');\n    var fileSize = 0;\n    if (await file.exists()) {\n      fileSize = await file.length();\n      await file.delete();\n    }\n    _db.execute('''\n      DELETE FROM cache\n      WHERE key = ?\n    ''', [key]);\n    if (_currentSize != null) {\n      _currentSize = _currentSize! - fileSize;\n    }\n  }\n\n  /// Delete all cache.\n  Future<void> clear() async {\n    await Directory(cachePath).delete(recursive: true);\n    Directory(cachePath).createSync(recursive: true);\n    _db.execute('''\n      DELETE FROM cache\n    ''');\n    _currentSize = 0;\n  }\n}\n"
  },
  {
    "path": "lib/foundation/comic_source/category.dart",
    "content": "part of 'comic_source.dart';\n\nclass CategoryData {\n  /// The title is displayed in the tab bar.\n  final String title;\n\n  /// 当使用中文语言时, 英文的分类标签将在构建页面时被翻译为中文\n  final List<BaseCategoryPart> categories;\n\n  final bool enableRankingPage;\n\n  final String key;\n\n  final List<CategoryButtonData> buttons;\n\n  /// Data class for building category page.\n  const CategoryData({\n    required this.title,\n    required this.categories,\n    required this.enableRankingPage,\n    required this.key,\n    this.buttons = const [],\n  });\n}\n\nclass CategoryButtonData {\n  final String label;\n\n  final void Function() onTap;\n\n  const CategoryButtonData({\n    required this.label,\n    required this.onTap,\n  });\n}\n\nclass CategoryItem {\n  final String label;\n\n  final PageJumpTarget target;\n\n  const CategoryItem(this.label, this.target);\n}\n\nabstract class BaseCategoryPart {\n  String get title;\n\n  List<CategoryItem> get categories;\n\n  bool get enableRandom;\n\n  /// Data class for building a part of category page.\n  const BaseCategoryPart();\n}\n\nclass FixedCategoryPart extends BaseCategoryPart {\n  @override\n  final List<CategoryItem> categories;\n\n  @override\n  bool get enableRandom => false;\n\n  @override\n  final String title;\n\n  /// A [BaseCategoryPart] that show fixed tags on category page.\n  const FixedCategoryPart(this.title, this.categories);\n}\n\nclass RandomCategoryPart extends BaseCategoryPart {\n  final List<CategoryItem> all;\n\n  final int randomNumber;\n\n  @override\n  final String title;\n\n  @override\n  bool get enableRandom => true;\n\n  List<CategoryItem> _categories() {\n    if (randomNumber >= all.length) {\n      return all;\n    }\n    var start = math.Random().nextInt(all.length - randomNumber);\n    return all.sublist(start, start + randomNumber);\n  }\n\n  @override\n  List<CategoryItem> get categories => _categories();\n\n  /// A [BaseCategoryPart] that show a part of random tags on category page.\n  const RandomCategoryPart(\n    this.title,\n    this.all,\n    this.randomNumber,\n  );\n}\n\nclass DynamicCategoryPart extends BaseCategoryPart {\n  final JSAutoFreeFunction loader;\n\n  final String sourceKey;\n\n  @override\n  List<CategoryItem> get categories {\n    var data = loader([]);\n    if (data is! List) {\n      throw \"DynamicCategoryPart loader must return a List\";\n    }\n    var res = <CategoryItem>[];\n    for (var item in data) {\n      if (item is! Map) {\n        throw \"DynamicCategoryPart loader must return a List of Map\";\n      }\n      var label = item['label'];\n      var target = PageJumpTarget.parse(sourceKey, item['target']);\n      if (label is! String) {\n        throw \"Category label must be a String\";\n      }\n      res.add(CategoryItem(label, target));\n    }\n    return res;\n  }\n\n  @override\n  bool get enableRandom => false;\n\n  @override\n  final String title;\n\n  /// A [BaseCategoryPart] that show dynamic tags on category page.\n  const DynamicCategoryPart(this.title, this.loader, this.sourceKey);\n}\n\nCategoryData getCategoryDataWithKey(String key) {\n  for (var source in ComicSource.all()) {\n    if (source.categoryData?.key == key) {\n      return source.categoryData!;\n    }\n  }\n  throw \"Unknown category key $key\";\n}\n"
  },
  {
    "path": "lib/foundation/comic_source/comic_source.dart",
    "content": "library;\n\nimport 'dart:async';\nimport 'dart:collection';\nimport 'dart:convert';\nimport 'dart:math' as math;\n\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/pages/category_comics_page.dart';\nimport 'package:venera/pages/search_result_page.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/init.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/translations.dart';\n\nimport '../js_engine.dart';\nimport '../log.dart';\n\npart 'category.dart';\n\npart 'favorites.dart';\n\npart 'parser.dart';\n\npart 'models.dart';\n\npart 'types.dart';\n\nclass ComicSourceManager with ChangeNotifier, Init {\n  final List<ComicSource> _sources = [];\n\n  static ComicSourceManager? _instance;\n\n  ComicSourceManager._create();\n\n  factory ComicSourceManager() => _instance ??= ComicSourceManager._create();\n\n  List<ComicSource> all() => List.from(_sources);\n\n  ComicSource? find(String key) =>\n      _sources.firstWhereOrNull((element) => element.key == key);\n\n  ComicSource? fromIntKey(int key) =>\n      _sources.firstWhereOrNull((element) => element.key.hashCode == key);\n\n  @override\n  @protected\n  Future<void> doInit() async {\n    await JsEngine().ensureInit();\n    final path = \"${App.dataPath}/comic_source\";\n    if (!(await Directory(path).exists())) {\n      Directory(path).create();\n      return;\n    }\n    await for (var entity in Directory(path).list()) {\n      if (entity is File && entity.path.endsWith(\".js\")) {\n        try {\n          var source = await ComicSourceParser().parse(\n            await entity.readAsString(),\n            entity.absolute.path,\n          );\n          _sources.add(source);\n        } catch (e, s) {\n          Log.error(\"ComicSource\", \"$e\\n$s\");\n        }\n      }\n    }\n  }\n\n  Future reload() async {\n    _sources.clear();\n    JsEngine().runCode(\"ComicSource.sources = {};\");\n    await doInit();\n    notifyListeners();\n  }\n\n  void add(ComicSource source) {\n    _sources.add(source);\n    notifyListeners();\n  }\n\n  void remove(String key) {\n    _sources.removeWhere((element) => element.key == key);\n    notifyListeners();\n  }\n\n  bool get isEmpty => _sources.isEmpty;\n\n  /// Key is the source key, value is the version.\n  final _availableUpdates = <String, String>{};\n\n  void updateAvailableUpdates(Map<String, String> updates) {\n    _availableUpdates.addAll(updates);\n    notifyListeners();\n  }\n\n  Map<String, String> get availableUpdates => Map.from(_availableUpdates);\n\n  void notifyStateChange() {\n    notifyListeners();\n  }\n}\n\nclass ComicSource {\n  static List<ComicSource> all() => ComicSourceManager().all();\n\n  static ComicSource? find(String key) => ComicSourceManager().find(key);\n\n  static ComicSource? fromIntKey(int key) =>\n      ComicSourceManager().fromIntKey(key);\n\n  static bool get isEmpty => ComicSourceManager().isEmpty;\n\n  /// Name of this source.\n  final String name;\n\n  /// Identifier of this source.\n  final String key;\n\n  int get intKey {\n    return key.hashCode;\n  }\n\n  /// Account config.\n  final AccountConfig? account;\n\n  /// Category data used to build a static category tags page.\n  final CategoryData? categoryData;\n\n  /// Category comics data used to build a comics page with a category tag.\n  final CategoryComicsData? categoryComicsData;\n\n  /// Favorite data used to build favorite page.\n  final FavoriteData? favoriteData;\n\n  /// Explore pages.\n  final List<ExplorePageData> explorePages;\n\n  /// Search page.\n  final SearchPageData? searchPageData;\n\n  /// Load comic info.\n  final LoadComicFunc? loadComicInfo;\n\n  final ComicThumbnailLoader? loadComicThumbnail;\n\n  /// Load comic pages.\n  final LoadComicPagesFunc? loadComicPages;\n\n  final GetImageLoadingConfigFunc? getImageLoadingConfig;\n\n  final Map<String, dynamic> Function(String imageKey)?\n  getThumbnailLoadingConfig;\n\n  var data = <String, dynamic>{};\n\n  bool get isLogged => data[\"account\"] != null;\n\n  final String filePath;\n\n  final String url;\n\n  final String version;\n\n  final CommentsLoader? commentsLoader;\n\n  final SendCommentFunc? sendCommentFunc;\n\n  final ChapterCommentsLoader? chapterCommentsLoader;\n\n  final SendChapterCommentFunc? sendChapterCommentFunc;\n\n  final RegExp? idMatcher;\n\n  final LikeOrUnlikeComicFunc? likeOrUnlikeComic;\n\n  final VoteCommentFunc? voteCommentFunc;\n\n  final LikeCommentFunc? likeCommentFunc;\n\n  final Map<String, Map<String, dynamic>>? settings;\n\n  final Map<String, Map<String, String>>? translations;\n\n  final HandleClickTagEvent? handleClickTagEvent;\n\n  /// Callback when a tag suggestion is selected in search.\n  final TagSuggestionSelectFunc? onTagSuggestionSelected;\n\n  final LinkHandler? linkHandler;\n\n  final bool enableTagsSuggestions;\n\n  final bool enableTagsTranslate;\n\n  final StarRatingFunc? starRatingFunc;\n\n  final ArchiveDownloader? archiveDownloader;\n\n  Future<void> loadData() async {\n    var file = File(\"${App.dataPath}/comic_source/$key.data\");\n    if (await file.exists()) {\n      data = Map.from(jsonDecode(await file.readAsString()));\n    }\n  }\n\n  bool _isSaving = false;\n  bool _haveWaitingTask = false;\n\n  Future<void> saveData() async {\n    if (_haveWaitingTask) return;\n    while (_isSaving) {\n      _haveWaitingTask = true;\n      await Future.delayed(const Duration(milliseconds: 20));\n      _haveWaitingTask = false;\n    }\n    _isSaving = true;\n    var file = File(\"${App.dataPath}/comic_source/$key.data\");\n    if (!await file.exists()) {\n      await file.create(recursive: true);\n    }\n    await file.writeAsString(jsonEncode(data));\n    _isSaving = false;\n    DataSync().uploadData();\n  }\n\n  Future<bool> reLogin() async {\n    if (data[\"account\"] == null) {\n      return false;\n    }\n    final List accountData = data[\"account\"];\n    var res = await account!.login!(accountData[0], accountData[1]);\n    if (res.error) {\n      Log.error(\"Failed to re-login\", res.errorMessage ?? \"Error\");\n    }\n    return !res.error;\n  }\n\n  ComicSource(\n    this.name,\n    this.key,\n    this.account,\n    this.categoryData,\n    this.categoryComicsData,\n    this.favoriteData,\n    this.explorePages,\n    this.searchPageData,\n    this.settings,\n    this.loadComicInfo,\n    this.loadComicThumbnail,\n    this.loadComicPages,\n    this.getImageLoadingConfig,\n    this.getThumbnailLoadingConfig,\n    this.filePath,\n    this.url,\n    this.version,\n    this.commentsLoader,\n    this.sendCommentFunc,\n    this.chapterCommentsLoader,\n    this.sendChapterCommentFunc,\n    this.likeOrUnlikeComic,\n    this.voteCommentFunc,\n    this.likeCommentFunc,\n    this.idMatcher,\n    this.translations,\n    this.handleClickTagEvent,\n    this.onTagSuggestionSelected,\n    this.linkHandler,\n    this.enableTagsSuggestions,\n    this.enableTagsTranslate,\n    this.starRatingFunc,\n    this.archiveDownloader,\n  );\n}\n\nclass AccountConfig {\n  final LoginFunction? login;\n\n  final String? loginWebsite;\n\n  final String? registerWebsite;\n\n  final void Function() logout;\n\n  final List<AccountInfoItem> infoItems;\n\n  final bool Function(String url, String title)? checkLoginStatus;\n\n  final void Function()? onLoginWithWebviewSuccess;\n\n  final List<String>? cookieFields;\n\n  final Future<bool> Function(List<String>)? validateCookies;\n\n  const AccountConfig(\n    this.login,\n    this.loginWebsite,\n    this.registerWebsite,\n    this.logout,\n    this.checkLoginStatus,\n    this.onLoginWithWebviewSuccess,\n    this.cookieFields,\n    this.validateCookies,\n  ) : infoItems = const [];\n}\n\nclass AccountInfoItem {\n  final String title;\n  final String Function()? data;\n  final void Function()? onTap;\n  final WidgetBuilder? builder;\n\n  AccountInfoItem({required this.title, this.data, this.onTap, this.builder});\n}\n\nclass LoadImageRequest {\n  String url;\n\n  Map<String, String> headers;\n\n  LoadImageRequest(this.url, this.headers);\n}\n\nclass ExplorePageData {\n  final String title;\n\n  final ExplorePageType type;\n\n  final ComicListBuilder? loadPage;\n\n  final ComicListBuilderWithNext? loadNext;\n\n  final Future<Res<List<ExplorePagePart>>> Function()? loadMultiPart;\n\n  /// return a `List` contains `List<Comic>` or `ExplorePagePart`\n  final Future<Res<List<Object>>> Function(int index)? loadMixed;\n\n  ExplorePageData(\n    this.title,\n    this.type,\n    this.loadPage,\n    this.loadNext,\n    this.loadMultiPart,\n    this.loadMixed,\n  );\n}\n\nclass ExplorePagePart {\n  final String title;\n\n  final List<Comic> comics;\n\n  /// If this is not null, the [ExplorePagePart] will show a button to jump to new page.\n  ///\n  /// Value of this field should match the following format:\n  ///   - search:keyword\n  ///   - category:categoryName\n  ///\n  /// End with `@`+`param` if the category has a parameter.\n  final PageJumpTarget? viewMore;\n\n  const ExplorePagePart(this.title, this.comics, this.viewMore);\n}\n\nenum ExplorePageType {\n  multiPageComicList,\n  singlePageWithMultiPart,\n  mixed,\n  override,\n}\n\ntypedef SearchFunction =\n    Future<Res<List<Comic>>> Function(\n      String keyword,\n      int page,\n      List<String> searchOption,\n    );\n\ntypedef SearchNextFunction =\n    Future<Res<List<Comic>>> Function(\n      String keyword,\n      String? next,\n      List<String> searchOption,\n    );\n\nclass SearchPageData {\n  /// If this is not null, the default value of search options will be first element.\n  final List<SearchOptions>? searchOptions;\n\n  final SearchFunction? loadPage;\n\n  final SearchNextFunction? loadNext;\n\n  const SearchPageData(this.searchOptions, this.loadPage, this.loadNext);\n}\n\nclass SearchOptions {\n  final LinkedHashMap<String, String> options;\n\n  final String label;\n\n  final String type;\n\n  final String? defaultVal;\n\n  const SearchOptions(this.options, this.label, this.type, this.defaultVal);\n\n  String get defaultValue => defaultVal ?? options.keys.firstOrNull ?? \"\";\n}\n\ntypedef CategoryComicsLoader =\n    Future<Res<List<Comic>>> Function(\n      String category,\n      String? param,\n      List<String> options,\n      int page,\n    );\n\ntypedef CategoryOptionsLoader =\n    Future<Res<List<CategoryComicsOptions>>> Function(\n      String category,\n      String? param,\n    );\n\nclass CategoryComicsData {\n  /// options\n  final List<CategoryComicsOptions>? options;\n\n  final CategoryOptionsLoader? optionsLoader;\n\n  /// [category] is the one clicked by the user on the category page.\n  ///\n  /// if [BaseCategoryPart.categoryParams] is not null, [param] will be not null.\n  ///\n  /// [Res.subData] should be maxPage or null if there is no limit.\n  final CategoryComicsLoader load;\n\n  final RankingData? rankingData;\n\n  const CategoryComicsData({\n    this.options,\n    this.optionsLoader,\n    required this.load,\n    this.rankingData,\n  });\n}\n\nclass RankingData {\n  final Map<String, String> options;\n\n  final Future<Res<List<Comic>>> Function(String option, int page)? load;\n\n  final Future<Res<List<Comic>>> Function(String option, String? next)?\n  loadWithNext;\n\n  const RankingData(this.options, this.load, this.loadWithNext);\n}\n\nclass CategoryComicsOptions {\n  // The label will not be displayed if it is empty.\n  final String label;\n\n  /// Use a [LinkedHashMap] to describe an option list.\n  /// key is for loading comics, value is the name displayed on screen.\n  /// Default value will be the first of the Map.\n  final LinkedHashMap<String, String> options;\n\n  /// If [notShowWhen] contains category's name, the option will not be shown.\n  final List<String> notShowWhen;\n\n  final List<String>? showWhen;\n\n  const CategoryComicsOptions(\n    this.label,\n    this.options,\n    this.notShowWhen,\n    this.showWhen,\n  );\n}\n\nclass LinkHandler {\n  final List<String> domains;\n\n  final String? Function(String url) linkToId;\n\n  const LinkHandler(this.domains, this.linkToId);\n}\n\nclass ArchiveDownloader {\n  final Future<Res<List<ArchiveInfo>>> Function(String cid) getArchives;\n\n  final Future<Res<String>> Function(String cid, String aid) getDownloadUrl;\n\n  const ArchiveDownloader(this.getArchives, this.getDownloadUrl);\n}\n"
  },
  {
    "path": "lib/foundation/comic_source/favorites.dart",
    "content": "part of 'comic_source.dart';\n\ntypedef AddOrDelFavFunc = Future<Res<bool>> Function(\n    String comicId, String folderId, bool isAdding, String? favId);\n\nclass FavoriteData {\n  final String key;\n\n  final String title;\n\n  final bool multiFolder;\n\n  // 这个收藏时间新旧顺序, 是为了最小成本同步远端的收藏, 只拉取远程最新收藏的漫画, 就不需要全拉取一遍了\n  // 如果为 null, 当做从新到旧\n  final bool? isOldToNewSort;\n\n  final Future<Res<List<Comic>>> Function(int page, [String? folder])?\n      loadComic;\n\n  final Future<Res<List<Comic>>> Function(String? next, [String? folder])?\n      loadNext;\n\n  /// key-id, value-name\n  ///\n  /// if comicId is not null, Res.subData is the folders that the comic is in\n  final Future<Res<Map<String, String>>> Function([String? comicId])?\n      loadFolders;\n\n  /// A value of null disables this feature\n  final Future<Res<bool>> Function(String key)? deleteFolder;\n\n  /// A value of null disables this feature\n  final Future<Res<bool>> Function(String name)? addFolder;\n\n  /// A value of null disables this feature\n  final String? allFavoritesId;\n\n  final AddOrDelFavFunc? addOrDelFavorite;\n\n  final bool singleFolderForSingleComic;\n\n  const FavoriteData({\n    required this.key,\n    required this.title,\n    required this.multiFolder,\n    required this.loadComic,\n    required this.loadNext,\n    this.loadFolders,\n    this.deleteFolder,\n    this.addFolder,\n    this.allFavoritesId,\n    this.addOrDelFavorite,\n    this.isOldToNewSort,\n    this.singleFolderForSingleComic = false,\n  });\n}\n\nFavoriteData getFavoriteData(String key) {\n  var source = ComicSource.find(key) ?? (throw \"Unknown source key: $key\");\n  return source.favoriteData!;\n}\n\nFavoriteData? getFavoriteDataOrNull(String key) {\n  var source = ComicSource.find(key);\n  return source?.favoriteData;\n}\n"
  },
  {
    "path": "lib/foundation/comic_source/models.dart",
    "content": "part of 'comic_source.dart';\n\nclass Comment {\n  final String userName;\n  final String? avatar;\n  final String content;\n  final String? time;\n  final int? replyCount;\n  final String? id;\n  int? score;\n  final bool? isLiked;\n  int? voteStatus; // 1: upvote, -1: downvote, 0: none\n\n  static String? parseTime(dynamic value) {\n    if (value == null) return null;\n    if (value is int) {\n      if (value < 10000000000) {\n        return DateTime.fromMillisecondsSinceEpoch(value * 1000)\n            .toString()\n            .substring(0, 19);\n      } else {\n        return DateTime.fromMillisecondsSinceEpoch(value)\n            .toString()\n            .substring(0, 19);\n      }\n    }\n    return value.toString();\n  }\n\n  Comment.fromJson(Map<String, dynamic> json)\n      : userName = json[\"userName\"],\n        avatar = json[\"avatar\"],\n        content = json[\"content\"],\n        time = parseTime(json[\"time\"]),\n        replyCount = json[\"replyCount\"],\n        id = json[\"id\"].toString(),\n        score = json[\"score\"],\n        isLiked = json[\"isLiked\"],\n        voteStatus = json[\"voteStatus\"];\n}\n\nclass Comic {\n  final String title;\n\n  final String cover;\n\n  final String id;\n\n  final String? subtitle;\n\n  final List<String>? tags;\n\n  final String description;\n\n  final String sourceKey;\n\n  final int? maxPage;\n\n  final String? language;\n\n  final String? favoriteId;\n\n  /// 0-5\n  final double? stars;\n\n  const Comic(\n    this.title,\n    this.cover,\n    this.id,\n    this.subtitle,\n    this.tags,\n    this.description,\n    this.sourceKey,\n    this.maxPage,\n    this.language,\n  )   : favoriteId = null,\n        stars = null;\n\n  Map<String, dynamic> toJson() {\n    return {\n      \"title\": title,\n      \"cover\": cover,\n      \"id\": id,\n      \"subTitle\": subtitle,\n      \"tags\": tags,\n      \"description\": description,\n      \"sourceKey\": sourceKey,\n      \"maxPage\": maxPage,\n      \"language\": language,\n      \"favoriteId\": favoriteId,\n    };\n  }\n\n  Comic.fromJson(Map<String, dynamic> json, this.sourceKey)\n      : title = json[\"title\"],\n        subtitle = json[\"subtitle\"] ?? json[\"subTitle\"] ?? \"\",\n        cover = json[\"cover\"],\n        id = json[\"id\"],\n        tags = List<String>.from(json[\"tags\"] ?? []),\n        description = json[\"description\"] ?? \"\",\n        maxPage = json[\"maxPage\"],\n        language = json[\"language\"],\n        favoriteId = json[\"favoriteId\"],\n        stars = (json[\"stars\"] as num?)?.toDouble();\n\n  @override\n  bool operator ==(Object other) {\n    if (other is! Comic) return false;\n    return other.id == id && other.sourceKey == sourceKey;\n  }\n\n  @override\n  int get hashCode => id.hashCode ^ sourceKey.hashCode;\n\n  @override\n  toString() => \"$sourceKey@$id\";\n}\n\nclass ComicID {\n  final ComicType type;\n\n  final String id;\n\n  const ComicID(this.type, this.id);\n\n  @override\n  bool operator ==(Object other) {\n    if (other is! ComicID) return false;\n    return other.type == type && other.id == id;\n  }\n\n  @override\n  int get hashCode => type.hashCode ^ id.hashCode;\n\n  @override\n  String toString() => \"$type@$id\";\n}\n\nclass ComicDetails with HistoryMixin {\n  @override\n  final String title;\n\n  @override\n  final String? subTitle;\n\n  @override\n  final String cover;\n\n  final String? description;\n\n  final Map<String, List<String>> tags;\n\n  /// id-name\n  final ComicChapters? chapters;\n\n  final List<String>? thumbnails;\n\n  final List<Comic>? recommend;\n\n  final String sourceKey;\n\n  final String comicId;\n\n  final bool? isFavorite;\n\n  final String? subId;\n\n  final bool? isLiked;\n\n  final int? likesCount;\n\n  final int? commentCount;\n\n  final String? uploader;\n\n  final String? uploadTime;\n\n  final String? updateTime;\n\n  final String? url;\n\n  final double? stars;\n\n  @override\n  final int? maxPage;\n\n  final List<Comment>? comments;\n\n  static Map<String, List<String>> _generateMap(Map<dynamic, dynamic> map) {\n    var res = <String, List<String>>{};\n    map.forEach((key, value) {\n      if (value is List) {\n        res[key] = List<String>.from(value);\n      }\n    });\n    return res;\n  }\n\n  ComicDetails.fromJson(Map<String, dynamic> json)\n      : title = json[\"title\"],\n        subTitle = json[\"subtitle\"],\n        cover = json[\"cover\"],\n        description = json[\"description\"],\n        tags = _generateMap(json[\"tags\"]),\n        chapters = ComicChapters.fromJsonOrNull(json[\"chapters\"]),\n        sourceKey = json[\"sourceKey\"],\n        comicId = json[\"comicId\"],\n        thumbnails = ListOrNull.from(json[\"thumbnails\"]),\n        recommend = (json[\"recommend\"] as List?)\n            ?.map((e) => Comic.fromJson(e, json[\"sourceKey\"]))\n            .toList(),\n        isFavorite = json[\"isFavorite\"],\n        subId = json[\"subId\"],\n        likesCount = json[\"likesCount\"],\n        isLiked = json[\"isLiked\"],\n        commentCount = json[\"commentCount\"],\n        uploader = json[\"uploader\"],\n        uploadTime = json[\"uploadTime\"],\n        updateTime = json[\"updateTime\"],\n        url = json[\"url\"],\n        stars = (json[\"stars\"] as num?)?.toDouble(),\n        maxPage = json[\"maxPage\"],\n        comments = (json[\"comments\"] as List?)\n            ?.map((e) => Comment.fromJson(e))\n            .toList();\n\n  Map<String, dynamic> toJson() {\n    return {\n      \"title\": title,\n      \"subTitle\": subTitle,\n      \"cover\": cover,\n      \"description\": description,\n      \"tags\": tags,\n      \"chapters\": chapters,\n      \"thumbnails\": thumbnails,\n      \"recommend\": null,\n      \"sourceKey\": sourceKey,\n      \"comicId\": comicId,\n      \"isFavorite\": isFavorite,\n      \"subId\": subId,\n      \"isLiked\": isLiked,\n      \"likesCount\": likesCount,\n      \"commentsCount\": commentCount,\n      \"uploader\": uploader,\n      \"uploadTime\": uploadTime,\n      \"updateTime\": updateTime,\n      \"url\": url,\n    };\n  }\n\n  @override\n  HistoryType get historyType => HistoryType(sourceKey.hashCode);\n\n  @override\n  String get id => comicId;\n\n  ComicType get comicType => ComicType(sourceKey.hashCode);\n\n  /// Convert tags map to plain list\n  List<String> get plainTags {\n    var res = <String>[];\n    tags.forEach((key, value) {\n      res.addAll(value.map((e) => \"$key:$e\"));\n    });\n    return res;\n  }\n\n  /// Find the first author tag\n  String? findAuthor() {\n    var authorNamespaces = [\n      \"author\",\n      \"authors\",\n      \"artist\",\n      \"artists\",\n      \"作者\",\n      \"画师\"\n    ];\n    for (var entry in tags.entries) {\n      if (authorNamespaces.contains(entry.key.toLowerCase()) &&\n          entry.value.isNotEmpty) {\n        return entry.value.first;\n      }\n    }\n    return null;\n  }\n\n  String? _validateUpdateTime(String time) {\n    time = time.split(\" \").first;\n    var segments = time.split(\"-\");\n    if (segments.length != 3) return null;\n    var year = int.tryParse(segments[0]);\n    var month = int.tryParse(segments[1]);\n    var day = int.tryParse(segments[2]);\n    if (year == null || month == null || day == null) return null;\n    if (year < 2000 || year > 3000) return null;\n    if (month < 1 || month > 12) return null;\n    if (day < 1 || day > 31) return null;\n    return \"$year-$month-$day\";\n  }\n\n  String? findUpdateTime() {\n    if (updateTime != null) {\n      return _validateUpdateTime(updateTime!);\n    }\n    const acceptedNamespaces = [\n      \"更新\",\n      \"最後更新\",\n      \"最后更新\",\n      \"update\",\n      \"last update\",\n    ];\n    for (var entry in tags.entries) {\n      if (acceptedNamespaces.contains(entry.key.toLowerCase()) &&\n          entry.value.isNotEmpty) {\n        var value = entry.value.first;\n        return _validateUpdateTime(value);\n      }\n    }\n    return null;\n  }\n}\n\nclass ArchiveInfo {\n  final String title;\n  final String description;\n  final String id;\n\n  ArchiveInfo.fromJson(Map<String, dynamic> json)\n      : title = json[\"title\"],\n        description = json[\"description\"],\n        id = json[\"id\"];\n}\n\nclass ComicChapters {\n  final Map<String, String>? _chapters;\n\n  final Map<String, Map<String, String>>? _groupedChapters;\n\n  /// Create a ComicChapters object with a flat map\n  const ComicChapters(Map<String, String> this._chapters)\n      : _groupedChapters = null;\n\n  /// Create a ComicChapters object with a grouped map\n  const ComicChapters.grouped(\n      Map<String, Map<String, String>> this._groupedChapters)\n      : _chapters = null;\n\n  factory ComicChapters.fromJson(dynamic json) {\n    if (json is! Map) throw ArgumentError(\"Invalid json type\");\n    var chapters = <String, String>{};\n    var groupedChapters = <String, Map<String, String>>{};\n    for (var entry in json.entries) {\n      var key = entry.key;\n      var value = entry.value;\n      if (key is! String) throw ArgumentError(\"Invalid key type\");\n      if (value is Map) {\n        groupedChapters[key] = Map.from(value);\n      } else {\n        chapters[key] = value.toString();\n      }\n    }\n    if (chapters.isNotEmpty) {\n      return ComicChapters(chapters);\n    } else if (groupedChapters.isNotEmpty) {\n      return ComicChapters.grouped(groupedChapters);\n    } else {\n      // return a empty list.\n      return ComicChapters(chapters);\n    }\n  }\n\n  static fromJsonOrNull(dynamic json) {\n    if (json == null) return null;\n    return ComicChapters.fromJson(json);\n  }\n\n  Map<String, dynamic> toJson() {\n    if (_chapters != null) {\n      return _chapters;\n    } else {\n      return _groupedChapters!;\n    }\n  }\n\n  /// Whether the chapters are grouped\n  bool get isGrouped => _groupedChapters != null;\n\n  /// All group names\n  Iterable<String> get groups => _groupedChapters?.keys ?? [];\n\n  /// All chapters.\n  /// If the chapters are grouped, all groups will be merged.\n  Map<String, String> get allChapters {\n    if (_chapters != null) return _chapters;\n    var res = <String, String>{};\n    for (var entry in _groupedChapters!.values) {\n      res.addAll(entry);\n    }\n    return res;\n  }\n\n  /// Get a group of chapters by name\n  Map<String, String> getGroup(String group) {\n    return _groupedChapters![group] ?? {};\n  }\n\n  /// Get a group of chapters by index(0-based)\n  Map<String, String> getGroupByIndex(int index) {\n    return _groupedChapters!.values.elementAt(index);\n  }\n\n  /// Get total number of chapters\n  int get length {\n    return isGrouped\n        ? _groupedChapters!.values.map((e) => e.length).reduce((a, b) => a + b)\n        : _chapters!.length;\n  }\n\n  /// Get the number of groups\n  int get groupCount => _groupedChapters?.length ?? 0;\n\n  /// Iterate all chapter ids\n  Iterable<String> get ids sync* {\n    if (isGrouped) {\n      for (var entry in _groupedChapters!.values) {\n        yield* entry.keys;\n      }\n    } else {\n      yield* _chapters!.keys;\n    }\n  }\n\n  /// Iterate all chapter titles\n  Iterable<String> get titles sync* {\n    if (isGrouped) {\n      for (var entry in _groupedChapters!.values) {\n        yield* entry.values;\n      }\n    } else {\n      yield* _chapters!.values;\n    }\n  }\n\n  String? operator [](String key) {\n    if (isGrouped) {\n      for (var entry in _groupedChapters!.values) {\n        if (entry.containsKey(key)) return entry[key];\n      }\n      return null;\n    } else {\n      return _chapters![key];\n    }\n  }\n}\n\nclass PageJumpTarget {\n  final String sourceKey;\n\n  final String page;\n\n  final Map<String, dynamic>? attributes;\n\n  const PageJumpTarget(this.sourceKey, this.page, this.attributes);\n\n  static PageJumpTarget parse(String sourceKey, dynamic value) {\n    if (value is Map) {\n      if (value['page'] != null) {\n        return PageJumpTarget(\n          sourceKey,\n          value[\"page\"] ?? \"search\",\n          value[\"attributes\"],\n        );\n      } else if (value[\"action\"] != null) {\n        // old version `onClickTag`\n        var page = value[\"action\"];\n        if (page == \"search\") {\n          return PageJumpTarget(\n            sourceKey,\n            \"search\",\n            {\n              \"text\": value[\"keyword\"],\n            },\n          );\n        } else if (page == \"category\") {\n          return PageJumpTarget(\n            sourceKey,\n            \"category\",\n            {\n              \"category\": value[\"keyword\"],\n              \"param\": value[\"param\"],\n            },\n          );\n        } else {\n          return PageJumpTarget(sourceKey, page, null);\n        }\n      }\n    } else if (value is String) {\n      // old version string encoding. search: `search:keyword`, category: `category:keyword` or `category:keyword@param`\n      var segments = value.split(\":\");\n      var page = segments[0];\n      if (page == \"search\") {\n        return PageJumpTarget(\n          sourceKey,\n          \"search\",\n          {\n            \"text\": segments[1],\n          },\n        );\n      } else if (page == \"category\") {\n        var c = segments[1];\n        if (c.contains('@')) {\n          var parts = c.split('@');\n          return PageJumpTarget(\n            sourceKey,\n            \"category\",\n            {\n              \"category\": parts[0],\n              \"param\": parts[1],\n            },\n          );\n        } else {\n          return PageJumpTarget(\n            sourceKey,\n            \"category\",\n            {\n              \"category\": c,\n            },\n          );\n        }\n      } else {\n        return PageJumpTarget(sourceKey, page, null);\n      }\n    }\n    return PageJumpTarget(sourceKey, \"Invalid Data\", null);\n  }\n\n  void jump(BuildContext context) {\n    if (page == \"search\") {\n      context.to(\n        () => SearchResultPage(\n          text: attributes?[\"text\"] ?? attributes?[\"keyword\"] ?? \"\",\n          sourceKey: sourceKey,\n          options: List.from(attributes?[\"options\"] ?? []),\n        )\n      );\n    } else if (page == \"category\") {\n      var key = ComicSource.find(sourceKey)!.categoryData!.key;\n      context.to(\n        () => CategoryComicsPage(\n          categoryKey: key,\n          category: attributes?[\"category\"] ??\n              (throw ArgumentError(\"Category name is required\")),\n          options: List.from(attributes?[\"options\"] ?? []),\n          param: attributes?[\"param\"],\n        ),\n      );\n    } else {\n      Log.error(\"Page Jump\", \"Unknown page: $page\");\n    }\n  }\n}\n"
  },
  {
    "path": "lib/foundation/comic_source/parser.dart",
    "content": "part of 'comic_source.dart';\n\n/// return true if ver1 > ver2\nbool compareSemVer(String ver1, String ver2) {\n  ver1 = ver1.replaceFirst(\"-\", \".\");\n  ver2 = ver2.replaceFirst(\"-\", \".\");\n  List<String> v1 = ver1.split('.');\n  List<String> v2 = ver2.split('.');\n\n  for (int i = 0; i < 3; i++) {\n    int num1 = int.parse(v1[i]);\n    int num2 = int.parse(v2[i]);\n\n    if (num1 > num2) {\n      return true;\n    } else if (num1 < num2) {\n      return false;\n    }\n  }\n\n  var v14 = v1.elementAtOrNull(3);\n  var v24 = v2.elementAtOrNull(3);\n\n  if (v14 != v24) {\n    if (v14 == null && v24 != \"hotfix\") {\n      return true;\n    } else if (v14 == null) {\n      return false;\n    }\n    if (v24 == null) {\n      if (v14 == \"hotfix\") {\n        return true;\n      }\n      return false;\n    }\n    return v14.compareTo(v24) > 0;\n  }\n\n  return false;\n}\n\nclass ComicSourceParseException implements Exception {\n  final String message;\n\n  ComicSourceParseException(this.message);\n\n  @override\n  String toString() {\n    return message;\n  }\n}\n\nclass ComicSourceParser {\n  /// comic source key\n  String? _key;\n\n  String? _name;\n\n  Future<ComicSource> createAndParse(String js, String fileName) async {\n    if (!fileName.endsWith(\"js\")) {\n      fileName = \"$fileName.js\";\n    }\n    var file = File(FilePath.join(App.dataPath, \"comic_source\", fileName));\n    if (file.existsSync()) {\n      int i = 0;\n      while (file.existsSync()) {\n        file = File(\n          FilePath.join(\n            App.dataPath,\n            \"comic_source\",\n            \"${fileName.split('.').first}($i).js\",\n          ),\n        );\n        i++;\n      }\n    }\n    await file.writeAsString(js);\n    try {\n      return await parse(js, file.path);\n    } catch (e) {\n      await file.delete();\n      rethrow;\n    }\n  }\n\n  Future<ComicSource> parse(String js, String filePath) async {\n    js = js.replaceAll(\"\\r\\n\", \"\\n\");\n    var line1 = js\n        .split('\\n')\n        .firstWhereOrNull((e) => e.trim().startsWith(\"class \"));\n    if (line1 == null ||\n        !line1.startsWith(\"class \") ||\n        !line1.contains(\"extends ComicSource\")) {\n      throw ComicSourceParseException(\"Invalid Content\");\n    }\n    var className = line1.split(\"class\")[1].split(\"extends ComicSource\").first;\n    className = className.trim();\n    JsEngine().runCode(\"\"\"(() => { $js\n        this['temp'] = new $className()\n      }).call()\n    \"\"\", className);\n    _name =\n        JsEngine().runCode(\"this['temp'].name\") ??\n        (throw ComicSourceParseException('name is required'));\n    var key =\n        JsEngine().runCode(\"this['temp'].key\") ??\n        (throw ComicSourceParseException('key is required'));\n    var version =\n        JsEngine().runCode(\"this['temp'].version\") ??\n        (throw ComicSourceParseException('version is required'));\n    var minAppVersion = JsEngine().runCode(\"this['temp'].minAppVersion\");\n    var url = JsEngine().runCode(\"this['temp'].url\");\n    if (minAppVersion != null) {\n      if (compareSemVer(minAppVersion, App.version.split('-').first)) {\n        throw ComicSourceParseException(\n          \"minAppVersion @version is required\".tlParams({\n            \"version\": minAppVersion,\n          }),\n        );\n      }\n    }\n    for (var source in ComicSource.all()) {\n      if (source.key == key) {\n        throw ComicSourceParseException(\"key($key) already exists\");\n      }\n    }\n    _key = key;\n    _checkKeyValidation();\n\n    JsEngine().runCode(\"\"\"\n      ComicSource.sources.$_key = this['temp'];\n    \"\"\");\n\n    var source = ComicSource(\n      _name!,\n      key,\n      _loadAccountConfig(),\n      _loadCategoryData(),\n      _loadCategoryComicsData(),\n      _loadFavoriteData(),\n      _loadExploreData(),\n      _loadSearchData(),\n      _parseSettings(),\n      _parseLoadComicFunc(),\n      _parseThumbnailLoader(),\n      _parseLoadComicPagesFunc(),\n      _parseImageLoadingConfigFunc(),\n      _parseThumbnailLoadingConfigFunc(),\n      filePath,\n      url ?? \"\",\n      version ?? \"1.0.0\",\n      _parseCommentsLoader(),\n      _parseSendCommentFunc(),\n      _parseChapterCommentsLoader(),\n      _parseSendChapterCommentFunc(),\n      _parseLikeFunc(),\n      _parseVoteCommentFunc(),\n      _parseLikeCommentFunc(),\n      _parseIdMatch(),\n      _parseTranslation(),\n      _parseClickTagEvent(),\n      _parseTagSuggestionSelectFunc(),\n      _parseLinkHandler(),\n      _getValue(\"search.enableTagsSuggestions\") ?? false,\n      _getValue(\"comic.enableTagsTranslate\") ?? false,\n      _parseStarRatingFunc(),\n      _parseArchiveDownloader(),\n    );\n\n    await source.loadData();\n\n    if (_checkExists(\"init\")) {\n      Future.delayed(const Duration(milliseconds: 50), () {\n        JsEngine().runCode(\"ComicSource.sources.$_key.init()\");\n      });\n    }\n\n    return source;\n  }\n\n  _checkKeyValidation() {\n    // 仅允许数字和字母以及下划线\n    if (!_key!.contains(RegExp(r\"^[a-zA-Z0-9_]+$\"))) {\n      throw ComicSourceParseException(\"key $_key is invalid\");\n    }\n  }\n\n  bool _checkExists(String index) {\n    return JsEngine().runCode(\n      \"ComicSource.sources.$_key.$index !== null \"\n      \"&& ComicSource.sources.$_key.$index !== undefined\",\n    );\n  }\n\n  dynamic _getValue(String index) {\n    return JsEngine().runCode(\"ComicSource.sources.$_key.$index\");\n  }\n\n  AccountConfig? _loadAccountConfig() {\n    if (!_checkExists(\"account\")) {\n      return null;\n    }\n\n    Future<Res<bool>> Function(String account, String pwd)? login;\n\n    if (_checkExists(\"account.login\")) {\n      login = (account, pwd) async {\n        try {\n          await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.account.login(${jsonEncode(account)},\n          ${jsonEncode(pwd)})\n        \"\"\");\n          var source = ComicSource.find(_key!)!;\n          source.data[\"account\"] = <String>[account, pwd];\n          source.saveData();\n          return const Res(true);\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      };\n    }\n\n    void logout() {\n      JsEngine().runCode(\"ComicSource.sources.$_key.account.logout()\");\n    }\n\n    bool Function(String url, String title)? checkLoginStatus;\n\n    void Function()? onLoginSuccess;\n\n    if (_checkExists('account.loginWithWebview')) {\n      checkLoginStatus = (url, title) {\n        return JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.account.loginWithWebview.checkStatus(\n              ${jsonEncode(url)}, ${jsonEncode(title)})\n          \"\"\");\n      };\n\n      if (_checkExists('account.loginWithWebview.onLoginSuccess')) {\n        onLoginSuccess = () {\n          JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.account.loginWithWebview.onLoginSuccess()\n          \"\"\");\n        };\n      }\n    }\n\n    Future<bool> Function(List<String>)? validateCookies;\n\n    if (_checkExists('account.loginWithCookies?.validate')) {\n      validateCookies = (cookies) async {\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.account.loginWithCookies.validate(${jsonEncode(cookies)})\n          \"\"\");\n          return res;\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return false;\n        }\n      };\n    }\n\n    return AccountConfig(\n      login,\n      _getValue(\"account.loginWithWebview?.url\"),\n      _getValue(\"account.registerWebsite\"),\n      logout,\n      checkLoginStatus,\n      onLoginSuccess,\n      ListOrNull.from(_getValue(\"account.loginWithCookies?.fields\")),\n      validateCookies,\n    );\n  }\n\n  List<ExplorePageData> _loadExploreData() {\n    if (!_checkExists(\"explore\")) {\n      return const [];\n    }\n    var length = JsEngine().runCode(\"ComicSource.sources.$_key.explore.length\");\n    var pages = <ExplorePageData>[];\n    for (int i = 0; i < length; i++) {\n      final String title = _getValue(\"explore[$i].title\");\n      final String type = _getValue(\"explore[$i].type\");\n      Future<Res<List<ExplorePagePart>>> Function()? loadMultiPart;\n      Future<Res<List<Comic>>> Function(int page)? loadPage;\n      Future<Res<List<Comic>>> Function(String? next)? loadNext;\n      Future<Res<List<Object>>> Function(int index)? loadMixed;\n      if (type == \"singlePageWithMultiPart\") {\n        loadMultiPart = () async {\n          try {\n            var res = await JsEngine().runCode(\n              \"ComicSource.sources.$_key.explore[$i].load()\",\n            );\n            return Res(\n              List.from(\n                res.keys\n                    .map(\n                      (e) => ExplorePagePart(\n                        e,\n                        (res[e] as List)\n                            .map<Comic>((e) => Comic.fromJson(e, _key!))\n                            .toList(),\n                        null,\n                      ),\n                    )\n                    .toList(),\n              ),\n            );\n          } catch (e, s) {\n            Log.error(\"Data Analysis\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      } else if (type == \"multiPageComicList\") {\n        if (_checkExists(\"explore[$i].load\")) {\n          loadPage = (int page) async {\n            try {\n              var res = await JsEngine().runCode(\n                \"ComicSource.sources.$_key.explore[$i].load(${jsonEncode(page)})\",\n              );\n              return Res(\n                List.generate(\n                  res[\"comics\"].length,\n                  (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n                ),\n                subData: res[\"maxPage\"],\n              );\n            } catch (e, s) {\n              Log.error(\"Network\", \"$e\\n$s\");\n              return Res.error(e.toString());\n            }\n          };\n        } else {\n          loadNext = (next) async {\n            try {\n              var res = await JsEngine().runCode(\n                \"ComicSource.sources.$_key.explore[$i].loadNext(${jsonEncode(next)})\",\n              );\n              return Res(\n                List.generate(\n                  res[\"comics\"].length,\n                  (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n                ),\n                subData: res[\"next\"],\n              );\n            } catch (e, s) {\n              Log.error(\"Network\", \"$e\\n$s\");\n              return Res.error(e.toString());\n            }\n          };\n        }\n      } else if (type == \"multiPartPage\") {\n        loadMultiPart = () async {\n          try {\n            var res = await JsEngine().runCode(\n              \"ComicSource.sources.$_key.explore[$i].load()\",\n            );\n            return Res(\n              List.from(\n                (res as List).map((e) {\n                  return ExplorePagePart(\n                    e['title'],\n                    (e['comics'] as List).map((e) {\n                      return Comic.fromJson(e, _key!);\n                    }).toList(),\n                    PageJumpTarget.parse(_key!, e['viewMore']),\n                  );\n                }),\n              ),\n            );\n          } catch (e, s) {\n            Log.error(\"Data Analysis\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      } else if (type == 'mixed') {\n        loadMixed = (index) async {\n          try {\n            var res = await JsEngine().runCode(\n              \"ComicSource.sources.$_key.explore[$i].load(${jsonEncode(index)})\",\n            );\n            var list = <Object>[];\n            for (var data in (res['data'] as List)) {\n              if (data is List) {\n                list.add(data.map((e) => Comic.fromJson(e, _key!)).toList());\n              } else if (data is Map) {\n                list.add(\n                  ExplorePagePart(\n                    data['title'],\n                    (data['comics'] as List).map((e) {\n                      return Comic.fromJson(e, _key!);\n                    }).toList(),\n                    data['viewMore'],\n                  ),\n                );\n              }\n            }\n            return Res(list, subData: res['maxPage']);\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      }\n      pages.add(\n        ExplorePageData(\n          title,\n          switch (type) {\n            \"singlePageWithMultiPart\" =>\n              ExplorePageType.singlePageWithMultiPart,\n            \"multiPartPage\" => ExplorePageType.singlePageWithMultiPart,\n            \"multiPageComicList\" => ExplorePageType.multiPageComicList,\n            \"mixed\" => ExplorePageType.mixed,\n            _ => throw ComicSourceParseException(\n              \"Unknown explore page type $type\",\n            ),\n          },\n          loadPage,\n          loadNext,\n          loadMultiPart,\n          loadMixed,\n        ),\n      );\n    }\n    return pages;\n  }\n\n  CategoryData? _loadCategoryData() {\n    var doc = _getValue(\"category\");\n\n    if (doc?[\"title\"] == null) {\n      return null;\n    }\n\n    final String title = doc[\"title\"];\n    final bool? enableRankingPage = doc[\"enableRankingPage\"];\n\n    var categoryParts = <BaseCategoryPart>[];\n\n    for (var c in doc[\"parts\"]) {\n      if (c[\"categories\"] != null && c[\"categories\"] is! List) {\n        continue;\n      }\n      List? categories = c[\"categories\"];\n      if (categories == null || categories[0] is Map) {\n        // new format\n        final String name = c[\"name\"];\n        final String type = c[\"type\"];\n        final cs = categories\n            ?.map(\n              (e) => CategoryItem(\n                e['label'],\n                PageJumpTarget.parse(_key!, e['target']),\n              ),\n            )\n            .toList();\n        if (type != \"dynamic\" && (cs == null || cs.isEmpty)) {\n          continue;\n        }\n        if (type == \"fixed\") {\n          categoryParts.add(FixedCategoryPart(name, cs!));\n        } else if (type == \"random\") {\n          categoryParts.add(\n            RandomCategoryPart(name, cs!, c[\"randomNumber\"] ?? 1),\n          );\n        } else if (type == \"dynamic\" && categories == null) {\n          var loader = c[\"loader\"];\n          if (loader is! JSInvokable) {\n            throw \"DynamicCategoryPart loader must be a function\";\n          }\n          categoryParts.add(\n            DynamicCategoryPart(name, JSAutoFreeFunction(loader), _key!),\n          );\n        }\n      } else {\n        // old format\n        final String name = c[\"name\"];\n        final String type = c[\"type\"];\n        final List<String> tags = List.from(c[\"categories\"]);\n        final String itemType = c[\"itemType\"];\n        List<String>? categoryParams = ListOrNull.from(c[\"categoryParams\"]);\n        final String? groupParam = c[\"groupParam\"];\n        if (groupParam != null) {\n          categoryParams = List.filled(tags.length, groupParam);\n        }\n        var cs = <CategoryItem>[];\n        for (int i = 0; i < tags.length; i++) {\n          PageJumpTarget target;\n          if (itemType == 'category') {\n            target = PageJumpTarget(_key!, 'category', {\n              \"category\": tags[i],\n              \"param\": categoryParams?.elementAtOrNull(i),\n            });\n          } else if (itemType == 'search') {\n            target = PageJumpTarget(_key!, 'search', {\"keyword\": tags[i]});\n          } else if (itemType == 'search_with_namespace') {\n            target = PageJumpTarget(_key!, 'search', {\n              \"keyword\": \"$name:$tags[i]\",\n            });\n          } else {\n            target = PageJumpTarget(_key!, itemType, null);\n          }\n          cs.add(CategoryItem(tags[i], target));\n        }\n        if (type == \"fixed\") {\n          categoryParts.add(FixedCategoryPart(name, cs));\n        } else if (type == \"random\") {\n          categoryParts.add(\n            RandomCategoryPart(name, cs, c[\"randomNumber\"] ?? 1),\n          );\n        }\n      }\n    }\n\n    return CategoryData(\n      title: title,\n      categories: categoryParts,\n      enableRankingPage: enableRankingPage ?? false,\n      key: title,\n    );\n  }\n\n  CategoryComicsData? _loadCategoryComicsData() {\n    if (!_checkExists(\"categoryComics\")) return null;\n\n    List<CategoryComicsOptions>? options;\n    if (_checkExists(\"categoryComics.optionList\")) {\n      options = <CategoryComicsOptions>[];\n      for (var element in _getValue(\"categoryComics.optionList\") ?? []) {\n        LinkedHashMap<String, String> map = LinkedHashMap<String, String>();\n        for (var option in element[\"options\"]) {\n          if (option.isEmpty || !option.contains(\"-\")) {\n            continue;\n          }\n          var split = option.split(\"-\");\n          var key = split.removeAt(0);\n          var value = split.join(\"-\");\n          map[key] = value;\n        }\n        options.add(\n          CategoryComicsOptions(\n            element[\"label\"] ?? \"\",\n            map,\n            List.from(element[\"notShowWhen\"] ?? []),\n            element[\"showWhen\"] == null ? null : List.from(element[\"showWhen\"]),\n          ),\n        );\n      }\n    }\n\n    CategoryOptionsLoader? optionLoader;\n    if (_checkExists(\"categoryComics.optionLoader\")) {\n      optionLoader = (category, param) async {\n        try {\n          dynamic res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.categoryComics.optionLoader(\n            ${jsonEncode(category)}, ${jsonEncode(param)})\n        \"\"\");\n          if (res is Future) {\n            res = await res;\n          }\n          if (res is! List) {\n            return Res.error(\n              \"Invalid data:\\nExpected: List\\nGot: ${res.runtimeType}\",\n            );\n          }\n          var options = <CategoryComicsOptions>[];\n          for (var element in res) {\n            if (element is! Map) {\n              return Res.error(\n                \"Invalid option data:\\nExpected: Map\\nGot: ${element.runtimeType}\",\n              );\n            }\n            LinkedHashMap<String, String> map = LinkedHashMap<String, String>();\n            for (var option in element[\"options\"] ?? []) {\n              if (option.isEmpty || !option.contains(\"-\")) {\n                continue;\n              }\n              var split = option.split(\"-\");\n              var key = split.removeAt(0);\n              var value = split.join(\"-\");\n              map[key] = value;\n            }\n            options.add(\n              CategoryComicsOptions(\n                element[\"label\"] ?? \"\",\n                map,\n                List.from(element[\"notShowWhen\"] ?? []),\n                element[\"showWhen\"] == null\n                    ? null\n                    : List.from(element[\"showWhen\"]),\n              ),\n            );\n          }\n          return Res(options);\n        } catch (e) {\n          Log.error(\"Data Analysis\", \"Failed to load category options.\\n$e\");\n          return Res.error(e.toString());\n        }\n      };\n    }\n\n    RankingData? rankingData;\n    if (_checkExists(\"categoryComics.ranking\")) {\n      var options = <String, String>{};\n      for (var option in _getValue(\"categoryComics.ranking.options\")) {\n        if (option.isEmpty || !option.contains(\"-\")) {\n          continue;\n        }\n        var split = option.split(\"-\");\n        var key = split.removeAt(0);\n        var value = split.join(\"-\");\n        options[key] = value;\n      }\n      Future<Res<List<Comic>>> Function(String option, int page)? load;\n      Future<Res<List<Comic>>> Function(String option, String? next)?\n      loadWithNext;\n      if (_checkExists(\"categoryComics.ranking.load\")) {\n        load = (option, page) async {\n          try {\n            var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.categoryComics.ranking.load(\n              ${jsonEncode(option)}, ${jsonEncode(page)})\n          \"\"\");\n            return Res(\n              List.generate(\n                res[\"comics\"].length,\n                (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n              ),\n              subData: res[\"maxPage\"],\n            );\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      } else {\n        loadWithNext = (option, next) async {\n          try {\n            var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.categoryComics.ranking.loadWithNext(\n              ${jsonEncode(option)}, ${jsonEncode(next)})\n          \"\"\");\n            return Res(\n              List.generate(\n                res[\"comics\"].length,\n                (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n              ),\n              subData: res[\"next\"],\n            );\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      }\n      rankingData = RankingData(options, load, loadWithNext);\n    }\n\n    if (options == null && optionLoader == null) {\n      options = [];\n    }\n\n    return CategoryComicsData(\n      options: options,\n      optionsLoader: optionLoader,\n      load: (category, param, options, page) async {\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n              ComicSource.sources.$_key.categoryComics.load(\n                ${jsonEncode(category)},\n                ${jsonEncode(param)},\n                ${jsonEncode(options)},\n                ${jsonEncode(page)}\n              )\n            \"\"\");\n          return Res(\n            List.generate(\n              res[\"comics\"].length,\n              (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n            ),\n            subData: res[\"maxPage\"],\n          );\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      },\n      rankingData: rankingData,\n    );\n  }\n\n  SearchPageData? _loadSearchData() {\n    if (!_checkExists(\"search\")) return null;\n    var options = <SearchOptions>[];\n    for (var element in _getValue(\"search.optionList\") ?? []) {\n      LinkedHashMap<String, String> map = LinkedHashMap<String, String>();\n      for (var option in element[\"options\"]) {\n        if (option.isEmpty || !option.contains(\"-\")) {\n          continue;\n        }\n        var split = option.split(\"-\");\n        var key = split.removeAt(0);\n        var value = split.join(\"-\");\n        map[key] = value;\n      }\n      options.add(\n        SearchOptions(\n          map,\n          element[\"label\"],\n          element['type'] ?? 'select',\n          element['default'] == null ? null : jsonEncode(element['default']),\n        ),\n      );\n    }\n\n    SearchFunction? loadPage;\n\n    SearchNextFunction? loadNext;\n\n    if (_checkExists('search.load')) {\n      loadPage = (keyword, page, searchOption) async {\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.search.load(\n            ${jsonEncode(keyword)}, ${jsonEncode(searchOption)}, ${jsonEncode(page)})\n        \"\"\");\n          return Res(\n            List.generate(\n              res[\"comics\"].length,\n              (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n            ),\n            subData: res[\"maxPage\"],\n          );\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      };\n    } else {\n      loadNext = (keyword, next, searchOption) async {\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.search.loadNext(\n            ${jsonEncode(keyword)}, ${jsonEncode(searchOption)}, ${jsonEncode(next)})\n        \"\"\");\n          return Res(\n            List.generate(\n              res[\"comics\"].length,\n              (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n            ),\n            subData: res[\"next\"],\n          );\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      };\n    }\n\n    return SearchPageData(options, loadPage, loadNext);\n  }\n\n  LoadComicFunc? _parseLoadComicFunc() {\n    return (id) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadInfo(${jsonEncode(id)})\n        \"\"\");\n        if (res is! Map<String, dynamic>) throw \"Invalid data\";\n        res['comicId'] = id;\n        res['sourceKey'] = _key;\n        return Res(ComicDetails.fromJson(res));\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  LoadComicPagesFunc? _parseLoadComicPagesFunc() {\n    return (id, ep) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadEp(${jsonEncode(id)}, ${jsonEncode(ep)})\n        \"\"\");\n        return Res(List.from(res[\"images\"]));\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  FavoriteData? _loadFavoriteData() {\n    if (!_checkExists(\"favorites\")) return null;\n\n    final bool multiFolder = _getValue(\"favorites.multiFolder\");\n    final bool? isOldToNewSort = _getValue(\"favorites.isOldToNewSort\");\n    final bool? singleFolderForSingleComic = _getValue(\n      \"favorites.singleFolderForSingleComic\",\n    );\n\n    Future<Res<T>> retryZone<T>(Future<Res<T>> Function() func) async {\n      if (!ComicSource.find(_key!)!.isLogged) {\n        return const Res.error(\"Not login\");\n      }\n      var res = await func();\n      if (res.error && res.errorMessage!.contains(\"Login expired\")) {\n        var reLoginRes = await ComicSource.find(_key!)!.reLogin();\n        if (!reLoginRes) {\n          return const Res.error(\"Login expired and re-login failed\");\n        } else {\n          return func();\n        }\n      }\n      return res;\n    }\n\n    Future<Res<bool>> addOrDelFavFunc(\n      String comicId,\n      String folderId,\n      bool isAdding,\n      String? favId,\n    ) async {\n      func() async {\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.addOrDelFavorite(\n              ${jsonEncode(comicId)}, ${jsonEncode(folderId)}, ${jsonEncode(isAdding)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res<bool>.error(e.toString());\n        }\n      }\n\n      return retryZone(func);\n    }\n\n    Future<Res<List<Comic>>> Function(int page, [String? folder])? loadComic;\n\n    Future<Res<List<Comic>>> Function(String? next, [String? folder])? loadNext;\n\n    if (_checkExists(\"favorites.loadComics\")) {\n      loadComic = (int page, [String? folder]) async {\n        Future<Res<List<Comic>>> func() async {\n          try {\n            var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.loadComics(\n              ${jsonEncode(page)}, ${jsonEncode(folder)})\n          \"\"\");\n            return Res(\n              List.generate(\n                res[\"comics\"].length,\n                (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n              ),\n              subData: res[\"maxPage\"],\n            );\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        }\n\n        return retryZone(func);\n      };\n    }\n\n    if (_checkExists(\"favorites.loadNext\")) {\n      loadNext = (String? next, [String? folder]) async {\n        Future<Res<List<Comic>>> func() async {\n          try {\n            var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.loadNext(\n              ${jsonEncode(next)}, ${jsonEncode(folder)})\n          \"\"\");\n            return Res(\n              List.generate(\n                res[\"comics\"].length,\n                (index) => Comic.fromJson(res[\"comics\"][index], _key!),\n              ),\n              subData: res[\"next\"],\n            );\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        }\n\n        return retryZone(func);\n      };\n    }\n\n    Future<Res<Map<String, String>>> Function([String? comicId])? loadFolders;\n\n    Future<Res<bool>> Function(String name)? addFolder;\n\n    Future<Res<bool>> Function(String key)? deleteFolder;\n\n    if (multiFolder) {\n      loadFolders = ([String? comicId]) async {\n        Future<Res<Map<String, String>>> func() async {\n          try {\n            var res = await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.loadFolders(${jsonEncode(comicId)})\n          \"\"\");\n            List<String>? subData;\n            if (res[\"favorited\"] != null) {\n              subData = List.from(res[\"favorited\"]);\n            }\n            return Res(Map.from(res[\"folders\"]), subData: subData);\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        }\n\n        return retryZone(func);\n      };\n      if (_checkExists(\"favorites.addFolder\")) {\n        addFolder = (name) async {\n          try {\n            await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.addFolder(${jsonEncode(name)})\n          \"\"\");\n            return const Res(true);\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      }\n      if (_checkExists(\"favorites.deleteFolder\")) {\n        deleteFolder = (key) async {\n          try {\n            await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.favorites.deleteFolder(${jsonEncode(key)})\n          \"\"\");\n            return const Res(true);\n          } catch (e, s) {\n            Log.error(\"Network\", \"$e\\n$s\");\n            return Res.error(e.toString());\n          }\n        };\n      }\n    }\n\n    return FavoriteData(\n      key: _key!,\n      title: _name!,\n      multiFolder: multiFolder,\n      loadComic: loadComic,\n      loadNext: loadNext,\n      loadFolders: loadFolders,\n      addFolder: addFolder,\n      deleteFolder: deleteFolder,\n      addOrDelFavorite: addOrDelFavFunc,\n      isOldToNewSort: isOldToNewSort,\n      singleFolderForSingleComic: singleFolderForSingleComic ?? false,\n    );\n  }\n\n  CommentsLoader? _parseCommentsLoader() {\n    if (!_checkExists(\"comic.loadComments\")) return null;\n    return (id, subId, page, replyTo) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadComments(\n            ${jsonEncode(id)}, ${jsonEncode(subId)}, ${jsonEncode(page)}, ${jsonEncode(replyTo)})\n        \"\"\");\n        return Res(\n          (res[\"comments\"] as List).map((e) => Comment.fromJson(e)).toList(),\n          subData: res[\"maxPage\"],\n        );\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  SendCommentFunc? _parseSendCommentFunc() {\n    if (!_checkExists(\"comic.sendComment\")) return null;\n    return (id, subId, content, replyTo) async {\n      Future<Res<bool>> func() async {\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.comic.sendComment(\n              ${jsonEncode(id)}, ${jsonEncode(subId)}, ${jsonEncode(content)}, ${jsonEncode(replyTo)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      }\n\n      var res = await func();\n      if (res.error && res.errorMessage!.contains(\"Login expired\")) {\n        var reLoginRes = await ComicSource.find(_key!)!.reLogin();\n        if (!reLoginRes) {\n          return const Res.error(\"Login expired and re-login failed\");\n        } else {\n          return func();\n        }\n      }\n      return res;\n    };\n  }\n\n  ChapterCommentsLoader? _parseChapterCommentsLoader() {\n    if (!_checkExists(\"comic.loadChapterComments\")) return null;\n    return (comicId, epId, page, replyTo) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadChapterComments(\n            ${jsonEncode(comicId)}, ${jsonEncode(epId)}, ${jsonEncode(page)}, ${jsonEncode(replyTo)})\n        \"\"\");\n        return Res(\n          (res[\"comments\"] as List).map((e) => Comment.fromJson(e)).toList(),\n          subData: res[\"maxPage\"],\n        );\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  SendChapterCommentFunc? _parseSendChapterCommentFunc() {\n    if (!_checkExists(\"comic.sendChapterComment\")) return null;\n    return (comicId, epId, content, replyTo) async {\n      Future<Res<bool>> func() async {\n        try {\n          await JsEngine().runCode(\"\"\"\n            ComicSource.sources.$_key.comic.sendChapterComment(\n              ${jsonEncode(comicId)}, ${jsonEncode(epId)}, ${jsonEncode(content)}, ${jsonEncode(replyTo)})\n          \"\"\");\n          return const Res(true);\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      }\n\n      var res = await func();\n      if (res.error && res.errorMessage!.contains(\"Login expired\")) {\n        var reLoginRes = await ComicSource.find(_key!)!.reLogin();\n        if (!reLoginRes) {\n          return const Res.error(\"Login expired and re-login failed\");\n        } else {\n          return func();\n        }\n      }\n      return res;\n    };\n  }\n\n  GetImageLoadingConfigFunc? _parseImageLoadingConfigFunc() {\n    if (!_checkExists(\"comic.onImageLoad\")) {\n      return null;\n    }\n    return (imageKey, comicId, ep) async {\n      var res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.onImageLoad(\n            ${jsonEncode(imageKey)}, ${jsonEncode(comicId)}, ${jsonEncode(ep)})\n        \"\"\");\n      if (res is Future) {\n        return await res;\n      }\n      return res;\n    };\n  }\n\n  GetThumbnailLoadingConfigFunc? _parseThumbnailLoadingConfigFunc() {\n    if (!_checkExists(\"comic.onThumbnailLoad\")) {\n      return null;\n    }\n    return (imageKey) {\n      var res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.onThumbnailLoad(${jsonEncode(imageKey)})\n        \"\"\");\n      if (res is! Map) {\n        Log.error(\"Network\", \"function onThumbnailLoad return invalid data\");\n        throw \"function onThumbnailLoad return invalid data\";\n      }\n      return res as Map<String, dynamic>;\n    };\n  }\n\n  ComicThumbnailLoader? _parseThumbnailLoader() {\n    if (!_checkExists(\"comic.loadThumbnails\")) {\n      return null;\n    }\n    return (id, next) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.loadThumbnails(${jsonEncode(id)}, ${jsonEncode(next)})\n        \"\"\");\n        return Res(List<String>.from(res['thumbnails']), subData: res['next']);\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  LikeOrUnlikeComicFunc? _parseLikeFunc() {\n    if (!_checkExists(\"comic.likeComic\")) {\n      return null;\n    }\n    return (id, isLiking) async {\n      try {\n        await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.likeComic(${jsonEncode(id)}, ${jsonEncode(isLiking)})\n        \"\"\");\n        return const Res(true);\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  VoteCommentFunc? _parseVoteCommentFunc() {\n    if (!_checkExists(\"comic.voteComment\")) {\n      return null;\n    }\n    return (id, subId, commentId, isUp, isCancel) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.voteComment(${jsonEncode(id)}, ${jsonEncode(subId)}, ${jsonEncode(commentId)}, ${jsonEncode(isUp)}, ${jsonEncode(isCancel)})\n        \"\"\");\n        return Res(res is num ? res.toInt() : 0);\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  LikeCommentFunc? _parseLikeCommentFunc() {\n    if (!_checkExists(\"comic.likeComment\")) {\n      return null;\n    }\n    return (id, subId, commentId, isLiking) async {\n      try {\n        var res = await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.likeComment(${jsonEncode(id)}, ${jsonEncode(subId)}, ${jsonEncode(commentId)}, ${jsonEncode(isLiking)})\n        \"\"\");\n        return Res(res is num ? res.toInt() : 0);\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  Map<String, Map<String, dynamic>> _parseSettings() {\n    var value = _getValue(\"settings\");\n    if (value is Map) {\n      var newMap = <String, Map<String, dynamic>>{};\n      for (var e in value.entries) {\n        if (e.key is! String) {\n          continue;\n        }\n        var v = <String, dynamic>{};\n        for (var e2 in e.value.entries) {\n          if (e2.key is! String) {\n            continue;\n          }\n          var v2 = e2.value;\n          if (v2 is JSInvokable) {\n            v2 = JSAutoFreeFunction(v2);\n          }\n          v[e2.key] = v2;\n        }\n        newMap[e.key] = v;\n      }\n      return newMap;\n    }\n    return {};\n  }\n\n  RegExp? _parseIdMatch() {\n    if (!_checkExists(\"comic.idMatch\")) {\n      return null;\n    }\n    return RegExp(_getValue(\"comic.idMatch\"));\n  }\n\n  Map<String, Map<String, String>>? _parseTranslation() {\n    if (!_checkExists(\"translation\")) {\n      return null;\n    }\n    var data = _getValue(\"translation\");\n    var res = <String, Map<String, String>>{};\n    for (var e in data.entries) {\n      res[e.key] = Map<String, String>.from(e.value);\n    }\n    return res;\n  }\n\n  HandleClickTagEvent? _parseClickTagEvent() {\n    if (!_checkExists(\"comic.onClickTag\")) {\n      return null;\n    }\n    return (namespace, tag) {\n      var res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.onClickTag(${jsonEncode(namespace)}, ${jsonEncode(tag)})\n        \"\"\");\n      if (res is! Map) {\n        return null;\n      }\n      var r = Map<String, dynamic>.from(res);\n      r.removeWhere((key, value) => value == null);\n      return PageJumpTarget.parse(_key!, r);\n    };\n  }\n\n  TagSuggestionSelectFunc? _parseTagSuggestionSelectFunc() {\n    if (!_checkExists(\"search.onTagSuggestionSelected\")) {\n      return null;\n    }\n    return (namespace, tag) {\n      var res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.search.onTagSuggestionSelected(\n            ${jsonEncode(namespace)}, ${jsonEncode(tag)})\n        \"\"\");\n      return res is String ? res : \"$namespace:$tag\";\n    };\n  }\n\n  LinkHandler? _parseLinkHandler() {\n    if (!_checkExists(\"comic.link\")) {\n      return null;\n    }\n    List<String> domains = List.from(_getValue(\"comic.link.domains\"));\n    linkToId(String link) {\n      var res = JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.link.linkToId(${jsonEncode(link)})\n        \"\"\");\n      return res as String?;\n    }\n\n    return LinkHandler(domains, linkToId);\n  }\n\n  StarRatingFunc? _parseStarRatingFunc() {\n    if (!_checkExists(\"comic.starRating\")) {\n      return null;\n    }\n    return (id, rating) async {\n      try {\n        await JsEngine().runCode(\"\"\"\n          ComicSource.sources.$_key.comic.starRating(${jsonEncode(id)}, ${jsonEncode(rating)})\n        \"\"\");\n        return const Res(true);\n      } catch (e, s) {\n        Log.error(\"Network\", \"$e\\n$s\");\n        return Res.error(e.toString());\n      }\n    };\n  }\n\n  ArchiveDownloader? _parseArchiveDownloader() {\n    if (!_checkExists(\"comic.archive\")) {\n      return null;\n    }\n    return ArchiveDownloader(\n      (cid) async {\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n              ComicSource.sources.$_key.comic.archive.getArchives(${jsonEncode(cid)})\n            \"\"\");\n          return Res(\n            (res as List).map((e) => ArchiveInfo.fromJson(e)).toList(),\n          );\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      },\n      (cid, aid) async {\n        try {\n          var res = await JsEngine().runCode(\"\"\"\n              ComicSource.sources.$_key.comic.archive.getDownloadUrl(${jsonEncode(cid)}, ${jsonEncode(aid)})\n            \"\"\");\n          return Res(res as String);\n        } catch (e, s) {\n          Log.error(\"Network\", \"$e\\n$s\");\n          return Res.error(e.toString());\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/foundation/comic_source/types.dart",
    "content": "part of 'comic_source.dart';\n\n/// build comic list, [Res.subData] should be maxPage or null if there is no limit.\ntypedef ComicListBuilder = Future<Res<List<Comic>>> Function(int page);\n\n/// build comic list with next param, [Res.subData] should be next page param or null if there is no next page.\ntypedef ComicListBuilderWithNext =\n    Future<Res<List<Comic>>> Function(String? next);\n\ntypedef LoginFunction = Future<Res<bool>> Function(String, String);\n\ntypedef LoadComicFunc = Future<Res<ComicDetails>> Function(String id);\n\ntypedef LoadComicPagesFunc =\n    Future<Res<List<String>>> Function(String id, String? ep);\n\ntypedef CommentsLoader =\n    Future<Res<List<Comment>>> Function(\n      String id,\n      String? subId,\n      int page,\n      String? replyTo,\n    );\n\ntypedef ChapterCommentsLoader =\n    Future<Res<List<Comment>>> Function(\n      String comicId,\n      String epId,\n      int page,\n      String? replyTo,\n    );\n\ntypedef SendCommentFunc =\n    Future<Res<bool>> Function(\n      String id,\n      String? subId,\n      String content,\n      String? replyTo,\n    );\n\ntypedef SendChapterCommentFunc =\n    Future<Res<bool>> Function(\n      String comicId,\n      String epId,\n      String content,\n      String? replyTo,\n    );\n\ntypedef GetImageLoadingConfigFunc =\n    Future<Map<String, dynamic>> Function(\n      String imageKey,\n      String comicId,\n      String epId,\n    )?;\ntypedef GetThumbnailLoadingConfigFunc =\n    Map<String, dynamic> Function(String imageKey)?;\n\ntypedef ComicThumbnailLoader =\n    Future<Res<List<String>>> Function(String comicId, String? next);\n\ntypedef LikeOrUnlikeComicFunc =\n    Future<Res<bool>> Function(String comicId, bool isLiking);\n\n/// [isLiking] is true if the user is liking the comment, false if unliking.\n/// return the new likes count or null.\ntypedef LikeCommentFunc =\n    Future<Res<int?>> Function(\n      String comicId,\n      String? subId,\n      String commentId,\n      bool isLiking,\n    );\n\n/// [isUp] is true if the user is upvoting the comment, false if downvoting.\n/// return the new vote count or null.\ntypedef VoteCommentFunc =\n    Future<Res<int?>> Function(\n      String comicId,\n      String? subId,\n      String commentId,\n      bool isUp,\n      bool isCancel,\n    );\n\ntypedef HandleClickTagEvent =\n    PageJumpTarget? Function(String namespace, String tag);\n\n/// Handle tag suggestion selection event. Should return the text to insert\n/// into the search field.\ntypedef TagSuggestionSelectFunc = String Function(String namespace, String tag);\n\n/// [rating] is the rating value, 0-10. 1 represents 0.5 star.\ntypedef StarRatingFunc = Future<Res<bool>> Function(String comicId, int rating);\n"
  },
  {
    "path": "lib/foundation/comic_type.dart",
    "content": "import 'package:venera/foundation/comic_source/comic_source.dart';\n\nclass ComicType {\n  final int value;\n\n  const ComicType(this.value);\n\n  @override\n  bool operator ==(Object other) => other is ComicType && other.value == value;\n\n  @override\n  int get hashCode => value.hashCode;\n\n  String get sourceKey {\n    if(this == local) {\n      return \"local\";\n    } else {\n      return comicSource!.key;\n    }\n  }\n\n  ComicSource? get comicSource {\n    if(this == local) {\n      return null;\n    } else {\n      return ComicSource.fromIntKey(value);\n    }\n  }\n\n  static const local = ComicType(0);\n\n  factory ComicType.fromKey(String key) {\n    if(key == \"local\") {\n      return local;\n    } else {\n      return ComicType(key.hashCode);\n    }\n  }\n}"
  },
  {
    "path": "lib/foundation/consts.dart",
    "content": "/// If window width is less than this value, it is considered as mobile.\nconst changePoint = 600;\n\n/// If window width is less than this value, it is considered as tablet.\n///\n/// If it is more than this value, it is considered as desktop.\nconst changePoint2 = 1300;\n\n/// Default user agent for http requests.\nconst webUA =\n    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36\";\n\n/// Pages for all comics is started from this value.\nconst firstPage = 1;\n\n/// Chapters for all comics is started from this value.\nconst firstChapter = 1;"
  },
  {
    "path": "lib/foundation/context.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\n\nimport 'app_page_route.dart';\n\nextension Navigation on BuildContext {\n  void pop<T>([T? result]) {\n    if(mounted) {\n      Navigator.of(this).pop(result);\n    }\n  }\n\n  bool canPop() {\n    return Navigator.of(this).canPop();\n  }\n\n  Future<T?> to<T>(Widget Function() builder,) {\n    return Navigator.of(this).push<T>(AppPageRoute(\n        builder: (context) => builder()));\n  }\n\n  Future<void> toReplacement<T>(Widget Function() builder) {\n    return Navigator.of(this).pushReplacement(AppPageRoute(\n        builder: (context) => builder()));\n  }\n\n  double get width => MediaQuery.of(this).size.width;\n\n  double get height => MediaQuery.of(this).size.height;\n\n  EdgeInsets get padding => MediaQuery.of(this).padding;\n\n  EdgeInsets get viewInsets => MediaQuery.of(this).viewInsets;\n\n  ColorScheme get colorScheme => Theme.of(this).colorScheme;\n\n  Brightness get brightness => Theme.of(this).brightness;\n\n  bool get isDarkMode => brightness == Brightness.dark;\n\n  void showMessage({required String message}) {\n    showToast(message: message, context: this);\n  }\n\n  Color useBackgroundColor(MaterialColor color) {\n    return color[brightness == Brightness.light ? 100 : 800]!;\n  }\n\n  Color useTextColor(MaterialColor color) {\n    return color[brightness == Brightness.light ? 800 : 100]!;\n  }\n}\n"
  },
  {
    "path": "lib/foundation/favorites.dart",
    "content": "import 'dart:collection';\nimport 'dart:convert';\nimport 'dart:ffi';\nimport 'dart:isolate';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/image_provider/local_favorite_image.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/pages/follow_updates_page.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'dart:io';\n\nimport 'app.dart';\nimport 'comic_source/comic_source.dart';\nimport 'comic_type.dart';\n\nString _getTimeString(DateTime time) {\n  return time.toIso8601String().replaceFirst(\"T\", \" \").substring(0, 19);\n}\n\nclass FavoriteItem implements Comic {\n  String name;\n  String author;\n  ComicType type;\n  @override\n  List<String> tags;\n  @override\n  String id;\n  String coverPath;\n  late String time;\n\n  FavoriteItem(\n      {required this.id,\n      required this.name,\n      required this.coverPath,\n      required this.author,\n      required this.type,\n      required this.tags,\n      DateTime? favoriteTime}) {\n    var t = favoriteTime ?? DateTime.now();\n    time = _getTimeString(t);\n  }\n\n  FavoriteItem.fromRow(Row row)\n      : name = row[\"name\"],\n        author = row[\"author\"],\n        type = ComicType(row[\"type\"]),\n        tags = (row[\"tags\"] as String).split(\",\"),\n        id = row[\"id\"],\n        coverPath = row[\"cover_path\"],\n        time = row[\"time\"] {\n    tags.remove(\"\");\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is FavoriteItem && other.id == id && other.type == type;\n  }\n\n  @override\n  int get hashCode => id.hashCode ^ type.hashCode;\n\n  @override\n  String toString() {\n    var s = \"FavoriteItem: $name $author $coverPath $hashCode $tags\";\n    if (s.length > 100) {\n      return s.substring(0, 100);\n    }\n    return s;\n  }\n\n  @override\n  String get cover => coverPath;\n\n  @override\n  String get description {\n    var time = this.time.substring(0, 10);\n    return appdata.settings['comicDisplayMode'] == 'detailed'\n        ? \"$time | ${type == ComicType.local ? 'local' : type.comicSource?.name ?? \"Unknown\"}\"\n        : \"${type.comicSource?.name ?? \"Unknown\"} | $time\";\n  }\n\n  @override\n  String? get favoriteId => null;\n\n  @override\n  String? get language => null;\n\n  @override\n  int? get maxPage => null;\n\n  @override\n  String get sourceKey => type == ComicType.local\n      ? 'local'\n      : type.comicSource?.key ?? \"Unknown:${type.value}\";\n\n  @override\n  double? get stars => null;\n\n  @override\n  String? get subtitle => author;\n\n  @override\n  String get title => name;\n\n  @override\n  Map<String, dynamic> toJson() {\n    return {\n      \"name\": name,\n      \"author\": author,\n      \"type\": type.value,\n      \"tags\": tags,\n      \"id\": id,\n      \"coverPath\": coverPath,\n    };\n  }\n\n  static FavoriteItem fromJson(Map<String, dynamic> json) {\n    var type = json[\"type\"] as int;\n    if (type == 0 && json['coverPath'].toString().startsWith('http')) {\n      type = 'picacg'.hashCode;\n    } else if (type == 1) {\n      type = 'ehentai'.hashCode;\n    } else if (type == 2) {\n      type = 'jm'.hashCode;\n    } else if (type == 3) {\n      type = 'hitomi'.hashCode;\n    } else if (type == 4) {\n      type = 'wnacg'.hashCode;\n    } else if (type == 6) {\n      type = 'nhentai'.hashCode;\n    }\n    return FavoriteItem(\n      id: json[\"id\"] ?? json['target'],\n      name: json[\"name\"],\n      author: json[\"author\"],\n      coverPath: json[\"coverPath\"],\n      type: ComicType(type),\n      tags: List<String>.from(json[\"tags\"] ?? []),\n    );\n  }\n}\n\nclass FavoriteItemWithFolderInfo extends FavoriteItem {\n  String folder;\n\n  FavoriteItemWithFolderInfo(FavoriteItem item, this.folder)\n      : super(\n          id: item.id,\n          name: item.name,\n          coverPath: item.coverPath,\n          author: item.author,\n          type: item.type,\n          tags: item.tags,\n        );\n}\n\nclass FavoriteItemWithUpdateInfo extends FavoriteItem {\n  String? updateTime;\n\n  DateTime? lastCheckTime;\n\n  bool hasNewUpdate;\n\n  FavoriteItemWithUpdateInfo(\n    FavoriteItem item,\n    this.updateTime,\n    this.hasNewUpdate,\n    int? lastCheckTime,\n  )   : lastCheckTime = lastCheckTime == null\n            ? null\n            : DateTime.fromMillisecondsSinceEpoch(lastCheckTime),\n        super(\n          id: item.id,\n          name: item.name,\n          coverPath: item.coverPath,\n          author: item.author,\n          type: item.type,\n          tags: item.tags,\n        );\n\n  @override\n  String get description {\n    var updateTime = this.updateTime ?? \"Unknown\";\n    var sourceName = type.comicSource?.name ?? \"Unknown\";\n    return \"$updateTime | $sourceName\";\n  }\n\n  @override\n  operator ==(Object other) {\n    return other is FavoriteItemWithUpdateInfo &&\n        other.updateTime == updateTime &&\n        other.hasNewUpdate == hasNewUpdate &&\n        super == other;\n  }\n\n  @override\n  int get hashCode =>\n      super.hashCode ^ updateTime.hashCode ^ hasNewUpdate.hashCode;\n}\n\nclass LocalFavoritesManager with ChangeNotifier {\n  factory LocalFavoritesManager() =>\n      cache ?? (cache = LocalFavoritesManager._create());\n\n  LocalFavoritesManager._create();\n\n  static LocalFavoritesManager? cache;\n\n  late Database _db;\n\n  late Map<String, int> counts;\n\n  var _hashedIds = <int, int>{};\n\n  int get totalComics {\n    return _hashedIds.length;\n  }\n\n  int folderComics(String folder) {\n    return counts[folder] ?? 0;\n  }\n\n  Future<void> init() async {\n    counts = {};\n    _db = sqlite3.open(\"${App.dataPath}/local_favorite.db\");\n    _db.execute(\"\"\"\n      create table if not exists folder_order (\n        folder_name text primary key,\n        order_value int\n      );\n    \"\"\");\n    _db.execute(\"\"\"\n      create table if not exists folder_sync (\n        folder_name text primary key,\n        source_key text,\n        source_folder text\n      );\n    \"\"\");\n    var folderNames = _getFolderNamesWithDB();\n    for (var folder in folderNames) {\n      var columns = _db.select(\"\"\"\n        pragma table_info(\"$folder\");\n      \"\"\");\n      if (!columns.any((element) => element[\"name\"] == \"translated_tags\")) {\n        _db.execute(\"\"\"\n          alter table \"$folder\"\n          add column translated_tags TEXT;\n        \"\"\");\n        var comics = getFolderComics(folder);\n        for (var comic in comics) {\n          var translatedTags = _translateTags(comic.tags);\n          _db.execute(\"\"\"\n            update \"$folder\"\n            set translated_tags = ?\n            where id == ? and type == ?;\n          \"\"\", [translatedTags, comic.id, comic.type.value]);\n        }\n      } else {\n        break;\n      }\n    }\n    await appdata.ensureInit();\n    // Make sure the follow updates folder is ready\n    var followUpdateFolder = appdata.settings['followUpdatesFolder'];\n    if (followUpdateFolder is String &&\n        folderNames.contains(followUpdateFolder)) {\n      prepareTableForFollowUpdates(followUpdateFolder, false);\n    } else {\n      appdata.settings['followUpdatesFolder'] = null;\n    }\n    initCounts();\n  }\n\n  void initCounts() {\n    for (var folder in folderNames) {\n      counts[folder] = count(folder);\n    }\n    _initHashedIds(folderNames, _db.handle).then((value) {\n      _hashedIds = value;\n      notifyListeners();\n    });\n  }\n\n  void refreshHashedIds() {\n    _initHashedIds(folderNames, _db.handle).then((value) {\n      _hashedIds = value;\n      notifyListeners();\n    });\n  }\n\n  void reduceHashedId(String id, int type) {\n    var hash = id.hashCode ^ type;\n    if (_hashedIds.containsKey(hash)) {\n      if (_hashedIds[hash]! > 1) {\n        _hashedIds[hash] = _hashedIds[hash]! - 1;\n      } else {\n        _hashedIds.remove(hash);\n      }\n    }\n  }\n\n  static Future<Map<int, int>> _initHashedIds(\n      List<String> folders, Pointer<void> p) {\n    return Isolate.run(() {\n      var db = sqlite3.fromPointer(p);\n      var hashedIds = <int, int>{};\n      for (var folder in folders) {\n        var rows = db.select(\"\"\"\n          select id, type from \"$folder\";\n        \"\"\");\n        for (var row in rows) {\n          var id = row[\"id\"] as String;\n          var type = row[\"type\"] as int;\n          var hash = id.hashCode ^ type;\n          hashedIds[hash] = (hashedIds[hash] ?? 0) + 1;\n        }\n      }\n      return hashedIds;\n    });\n  }\n\n  List<String> find(String id, ComicType type) {\n    var res = <String>[];\n    for (var folder in folderNames) {\n      var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        where id == ? and type == ?;\n      \"\"\", [id, type.value]);\n      if (rows.isNotEmpty) {\n        res.add(folder);\n      }\n    }\n    return res;\n  }\n\n  Future<List<String>> findWithModel(FavoriteItem item) async {\n    var res = <String>[];\n    for (var folder in folderNames) {\n      var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        where id == ? and type == ?;\n      \"\"\", [item.id, item.type.value]);\n      if (rows.isNotEmpty) {\n        res.add(folder);\n      }\n    }\n    return res;\n  }\n\n  List<String> _getTablesWithDB() {\n    final tables = _db\n        .select(\"SELECT name FROM sqlite_master WHERE type='table';\")\n        .map((element) => element[\"name\"] as String)\n        .toList();\n    return tables;\n  }\n\n  List<String> _getFolderNamesWithDB() {\n    final folders = _getTablesWithDB();\n    folders.remove('folder_sync');\n    folders.remove('folder_order');\n    var folderToOrder = <String, int>{};\n    for (var folder in folders) {\n      var res = _db.select(\"\"\"\n        select * from folder_order\n        where folder_name == ?;\n      \"\"\", [folder]);\n      if (res.isNotEmpty) {\n        folderToOrder[folder] = res.first[\"order_value\"];\n      } else {\n        folderToOrder[folder] = 0;\n      }\n    }\n    folders.sort((a, b) {\n      return folderToOrder[a]! - folderToOrder[b]!;\n    });\n    return folders;\n  }\n\n  void updateOrder(List<String> folders) {\n    for (int i = 0; i < folders.length; i++) {\n      _db.execute(\"\"\"\n        insert or replace into folder_order (folder_name, order_value)\n        values (?, ?);\n      \"\"\", [folders[i], i]);\n    }\n    notifyListeners();\n  }\n\n  int count(String folderName) {\n    return _db.select(\"\"\"\n      select count(*) as c\n      from \"$folderName\"\n    \"\"\").first[\"c\"];\n  }\n\n  List<String> get folderNames => _getFolderNamesWithDB();\n\n  int maxValue(String folder) {\n    return _db.select(\"\"\"\n        SELECT MAX(display_order) AS max_value\n        FROM \"$folder\";\n      \"\"\").firstOrNull?[\"max_value\"] ?? 0;\n  }\n\n  int minValue(String folder) {\n    return _db.select(\"\"\"\n        SELECT MIN(display_order) AS min_value\n        FROM \"$folder\";\n      \"\"\").firstOrNull?[\"min_value\"] ?? 0;\n  }\n\n  List<FavoriteItem> getFolderComics(String folder) {\n    var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        ORDER BY display_order;\n      \"\"\");\n    return rows.map((element) => FavoriteItem.fromRow(element)).toList();\n  }\n\n  static Future<List<FavoriteItem>> _getFolderComicsAsync(\n      String folder, Pointer<void> p) {\n    return Isolate.run(() {\n      var db = sqlite3.fromPointer(p);\n      var rows = db.select(\"\"\"\n        select * from \"$folder\"\n        ORDER BY display_order;\n      \"\"\");\n      return rows.map((element) => FavoriteItem.fromRow(element)).toList();\n    });\n  }\n\n  /// Start a new isolate to get the comics in the folder\n  Future<List<FavoriteItem>> getFolderComicsAsync(String folder) {\n    return _getFolderComicsAsync(folder, _db.handle);\n  }\n\n  List<FavoriteItem> getAllComics() {\n    var res = <FavoriteItem>{};\n    for (final folder in folderNames) {\n      var comics = _db.select(\"\"\"\n        select * from \"$folder\";\n      \"\"\");\n      res.addAll(comics.map((element) => FavoriteItem.fromRow(element)));\n    }\n    return res.toList();\n  }\n\n  static Future<List<FavoriteItem>> _getAllComicsAsync(\n      List<String> folders, Pointer<void> p) {\n    return Isolate.run(() {\n      var db = sqlite3.fromPointer(p);\n      var res = <FavoriteItem>{};\n      for (final folder in folders) {\n        var comics = db.select(\"\"\"\n          select * from \"$folder\";\n        \"\"\");\n        res.addAll(comics.map((element) => FavoriteItem.fromRow(element)));\n      }\n      return res.toList();\n    });\n  }\n\n  /// Start a new isolate to get all the comics\n  Future<List<FavoriteItem>> getAllComicsAsync() {\n    return _getAllComicsAsync(folderNames, _db.handle);\n  }\n\n  void addTagTo(String folder, String id, String tag) {\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set tags = '$tag,' || tags\n      where id == ?\n    \"\"\", [id]);\n    notifyListeners();\n  }\n\n  List<FavoriteItemWithFolderInfo> allComics() {\n    var res = <FavoriteItemWithFolderInfo>[];\n    for (final folder in folderNames) {\n      var comics = _db.select(\"\"\"\n        select * from \"$folder\";\n      \"\"\");\n      res.addAll(comics.map((element) =>\n          FavoriteItemWithFolderInfo(FavoriteItem.fromRow(element), folder)));\n    }\n    return res;\n  }\n\n  bool existsFolder(String name) {\n    return folderNames.contains(name);\n  }\n\n  /// create a folder\n  String createFolder(String name, [bool renameWhenInvalidName = false]) {\n    if (name.isEmpty) {\n      if (renameWhenInvalidName) {\n        int i = 0;\n        while (existsFolder(i.toString())) {\n          i++;\n        }\n        name = i.toString();\n      } else {\n        throw \"name is empty!\";\n      }\n    }\n    if (existsFolder(name)) {\n      if (renameWhenInvalidName) {\n        var prevName = name;\n        int i = 0;\n        while (existsFolder(i.toString())) {\n          i++;\n        }\n        name = prevName + i.toString();\n      } else {\n        throw Exception(\"Folder is existing\");\n      }\n    }\n    _db.execute(\"\"\"\n      create table \"$name\"(\n        id text,\n        name TEXT,\n        author TEXT,\n        type int,\n        tags TEXT,\n        cover_path TEXT,\n        time TEXT,\n        display_order int,\n        translated_tags TEXT,\n        primary key (id, type)\n      );\n    \"\"\");\n    notifyListeners();\n    counts[name] = 0;\n    return name;\n  }\n\n  void linkFolderToNetwork(String folder, String source, String networkFolder) {\n    _db.execute(\"\"\"\n      insert or replace into folder_sync (folder_name, source_key, source_folder)\n      values (?, ?, ?);\n    \"\"\", [folder, source, networkFolder]);\n  }\n\n  bool isLinkedToNetworkFolder(\n      String folder, String source, String networkFolder) {\n    var res = _db.select(\"\"\"\n      select * from folder_sync\n      where folder_name == ? and source_key == ? and source_folder == ?;\n    \"\"\", [folder, source, networkFolder]);\n    return res.isNotEmpty;\n  }\n\n  (String?, String?) findLinked(String folder) {\n    var res = _db.select(\"\"\"\n      select * from folder_sync\n      where folder_name == ?;\n    \"\"\", [folder]);\n    if (res.isEmpty) {\n      return (null, null);\n    }\n    return (res.first[\"source_key\"], res.first[\"source_folder\"]);\n  }\n\n  bool comicExists(String folder, String id, ComicType type) {\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]);\n    return res.isNotEmpty;\n  }\n\n  FavoriteItem getComic(String folder, String id, ComicType type) {\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]);\n    if (res.isEmpty) {\n      throw Exception(\"Comic not found\");\n    }\n    return FavoriteItem.fromRow(res.first);\n  }\n\n  String _translateTags(List<String> tags) {\n    var res = <String>[];\n    for (var tag in tags) {\n      var translated = tag.translateTagsToCN;\n      if (translated != tag) {\n        res.add(translated);\n      }\n    }\n    return res.join(\",\");\n  }\n\n  /// add comic to a folder.\n  /// return true if success, false if already exists\n  bool addComic(String folder, FavoriteItem comic,\n      [int? order, String? updateTime]) {\n    if (!existsFolder(folder)) {\n      throw Exception(\"Folder does not exists\");\n    }\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where id == ? and type == ?;\n    \"\"\", [comic.id, comic.type.value]);\n    if (res.isNotEmpty) {\n      return false;\n    }\n    var translatedTags = _translateTags(comic.tags);\n    final params = [\n      comic.id,\n      comic.name,\n      comic.author,\n      comic.type.value,\n      comic.tags.join(\",\"),\n      comic.coverPath,\n      comic.time,\n      translatedTags\n    ];\n    if (order != null) {\n      _db.execute(\"\"\"\n        insert into \"$folder\" (id, name, author, type, tags, cover_path, time, translated_tags, display_order)\n        values (?, ?, ?, ?, ?, ?, ?, ?, ?);\n      \"\"\", [...params, order]);\n    } else if (appdata.settings['newFavoriteAddTo'] == \"end\") {\n      _db.execute(\"\"\"\n        insert into \"$folder\" (id, name, author, type, tags, cover_path, time, translated_tags, display_order)\n        values (?, ?, ?, ?, ?, ?, ?, ?, ?);\n      \"\"\", [...params, maxValue(folder) + 1]);\n    } else {\n      _db.execute(\"\"\"\n        insert into \"$folder\" (id, name, author, type, tags, cover_path, time, translated_tags, display_order)\n        values (?, ?, ?, ?, ?, ?, ?, ?, ?);\n      \"\"\", [...params, minValue(folder) - 1]);\n    }\n    if (updateTime != null) {\n      var columns = _db.select(\"\"\"\n      pragma table_info(\"$folder\");\n    \"\"\");\n      if (columns.any((element) => element[\"name\"] == \"last_update_time\")) {\n        _db.execute(\"\"\"\n          update \"$folder\"\n          set last_update_time = ?\n          where id == ? and type == ?;\n        \"\"\", [updateTime, comic.id, comic.type.value]);\n      }\n    }\n    if (counts[folder] == null) {\n      counts[folder] = count(folder);\n    } else {\n      counts[folder] = counts[folder]! + 1;\n    }\n    var hash = comic.id.hashCode ^ comic.type.value;\n    _hashedIds[hash] = (_hashedIds[hash] ?? 0) + 1;\n    notifyListeners();\n    return true;\n  }\n\n  void moveFavorite(\n      String sourceFolder, String targetFolder, String id, ComicType type) {\n    if (!existsFolder(sourceFolder)) {\n      throw Exception(\"Source folder does not exist\");\n    }\n    if (!existsFolder(targetFolder)) {\n      throw Exception(\"Target folder does not exist\");\n    }\n\n    var res = _db.select(\"\"\"\n    select * from \"$targetFolder\"\n    where id == ? and type == ?;\n  \"\"\", [id, type.value]);\n\n    if (res.isNotEmpty) {\n      return;\n    }\n\n    _db.execute(\"\"\"\n      insert into \"$targetFolder\" (id, name, author, type, tags, cover_path, time, display_order)\n      select id, name, author, type, tags, cover_path, time, ?\n      from \"$sourceFolder\"\n      where id == ? and type == ?;\n    \"\"\", [minValue(targetFolder) - 1, id, type.value]);\n\n    _db.execute(\"\"\"\n    delete from \"$sourceFolder\"\n    where id == ? and type == ?;\n  \"\"\", [id, type.value]);\n\n    notifyListeners();\n  }\n\n  void batchMoveFavorites(\n      String sourceFolder, String targetFolder, List<FavoriteItem> items) {\n    if (!existsFolder(sourceFolder)) {\n      throw Exception(\"Source folder does not exist\");\n    }\n    if (!existsFolder(targetFolder)) {\n      throw Exception(\"Target folder does not exist\");\n    }\n\n    _db.execute(\"BEGIN TRANSACTION\");\n    var displayOrder = maxValue(targetFolder) + 1;\n    try {\n      for (var item in items) {\n        _db.execute(\"\"\"\n          insert or ignore into \"$targetFolder\" (id, name, author, type, tags, cover_path, time, display_order)\n          select id, name, author, type, tags, cover_path, time, ?\n          from \"$sourceFolder\"\n          where id == ? and type == ?;\n        \"\"\", [displayOrder, item.id, item.type.value]);\n\n        _db.execute(\"\"\"\n          delete from \"$sourceFolder\"\n          where id == ? and type == ?;\n        \"\"\", [item.id, item.type.value]);\n\n        displayOrder++;\n      }\n      notifyListeners();\n    } catch (e) {\n      Log.error(\"Batch Move Favorites\", e.toString());\n      _db.execute(\"ROLLBACK\");\n      return;\n    }\n    _db.execute(\"COMMIT\");\n\n    // Update counts\n    counts[targetFolder] = count(targetFolder);\n    counts[sourceFolder] = count(sourceFolder);\n    refreshHashedIds();\n\n    notifyListeners();\n  }\n\n  void batchCopyFavorites(\n      String sourceFolder, String targetFolder, List<FavoriteItem> items) {\n    if (!existsFolder(sourceFolder)) {\n      throw Exception(\"Source folder does not exist\");\n    }\n    if (!existsFolder(targetFolder)) {\n      throw Exception(\"Target folder does not exist\");\n    }\n\n    _db.execute(\"BEGIN TRANSACTION\");\n    var displayOrder = maxValue(targetFolder) + 1;\n    try {\n      for (var item in items) {\n        _db.execute(\"\"\"\n          insert or ignore into \"$targetFolder\" (id, name, author, type, tags, cover_path, time, display_order)\n          select id, name, author, type, tags, cover_path, time, ?\n          from \"$sourceFolder\"\n          where id == ? and type == ?;\n        \"\"\", [displayOrder, item.id, item.type.value]);\n\n        displayOrder++;\n      }\n      notifyListeners();\n    } catch (e) {\n      Log.error(\"Batch Copy Favorites\", e.toString());\n      _db.execute(\"ROLLBACK\");\n      return;\n    }\n\n    _db.execute(\"COMMIT\");\n\n    // Update counts\n    counts[targetFolder] = count(targetFolder);\n    refreshHashedIds();\n\n    notifyListeners();\n  }\n\n  /// delete a folder\n  void deleteFolder(String name) {\n    _db.execute(\"\"\"\n      drop table \"$name\";\n    \"\"\");\n    _db.execute(\"\"\"\n      delete from folder_order\n      where folder_name == ?;\n    \"\"\", [name]);\n    counts.remove(name);\n    refreshHashedIds();\n    notifyListeners();\n  }\n\n  void deleteComicWithId(String folder, String id, ComicType type) {\n    LocalFavoriteImageProvider.delete(id, type.value);\n    _db.execute(\"\"\"\n      delete from \"$folder\"\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]);\n    if (counts[folder] != null) {\n      counts[folder] = counts[folder]! - 1;\n    } else {\n      counts[folder] = count(folder);\n    }\n    reduceHashedId(id, type.value);\n    notifyListeners();\n  }\n\n  void batchDeleteComics(String folder, List<FavoriteItem> comics) {\n    _db.execute(\"BEGIN TRANSACTION\");\n    try {\n      for (var comic in comics) {\n        LocalFavoriteImageProvider.delete(comic.id, comic.type.value);\n        _db.execute(\"\"\"\n          delete from \"$folder\"\n          where id == ? and type == ?;\n        \"\"\", [comic.id, comic.type.value]);\n      }\n      if (counts[folder] != null) {\n        counts[folder] = counts[folder]! - comics.length;\n      } else {\n        counts[folder] = count(folder);\n      }\n    } catch (e) {\n      Log.error(\"Batch Delete Comics\", e.toString());\n      _db.execute(\"ROLLBACK\");\n      return;\n    }\n    _db.execute(\"COMMIT\");\n    for (var comic in comics) {\n      reduceHashedId(comic.id, comic.type.value);\n    }\n    notifyListeners();\n  }\n\n  void batchDeleteComicsInAllFolders(List<ComicID> comics) {\n    _db.execute(\"BEGIN TRANSACTION\");\n    var folderNames = _getFolderNamesWithDB();\n    try {\n      for (var comic in comics) {\n        LocalFavoriteImageProvider.delete(comic.id, comic.type.value);\n        for (var folder in folderNames) {\n          _db.execute(\"\"\"\n            delete from \"$folder\"\n            where id == ? and type == ?;\n          \"\"\", [comic.id, comic.type.value]);\n        }\n      }\n    } catch (e) {\n      Log.error(\"Batch Delete Comics in All Folders\", e.toString());\n      _db.execute(\"ROLLBACK\");\n      return;\n    }\n    initCounts();\n    _db.execute(\"COMMIT\");\n    for (var comic in comics) {\n      var hash = comic.id.hashCode ^ comic.type.value;\n      _hashedIds.remove(hash);\n    }\n    notifyListeners();\n  }\n\n  Future<int> removeInvalid() async {\n    int count = 0;\n    await Future.microtask(() {\n      var all = allComics();\n      for (var c in all) {\n        var comicSource = c.type.comicSource;\n        if ((c.type == ComicType.local &&\n                LocalManager().find(c.id, c.type) == null) ||\n            (c.type != ComicType.local && comicSource == null)) {\n          deleteComicWithId(c.folder, c.id, c.type);\n          count++;\n        }\n      }\n    });\n    return count;\n  }\n\n  Future<void> clearAll() async {\n    _db.dispose();\n    File(\"${App.dataPath}/local_favorite.db\").deleteSync();\n    await init();\n  }\n\n  void reorder(List<FavoriteItem> newFolder, String folder) async {\n    if (!existsFolder(folder)) {\n      throw Exception(\"Failed to reorder: folder not found\");\n    }\n    _db.execute(\"BEGIN TRANSACTION\");\n    try {\n      for (int i = 0; i < newFolder.length; i++) {\n        _db.execute(\"\"\"\n          update \"$folder\"\n          set display_order = ?\n          where id == ? and type == ?;\n        \"\"\", [\n          i,\n          newFolder[i].id,\n          newFolder[i].type.value\n        ]);\n      }\n    }\n    catch (e) {\n      Log.error(\"Reorder\", e.toString());\n      _db.execute(\"ROLLBACK\");\n      return;\n    }\n    _db.execute(\"COMMIT\");\n    notifyListeners();\n  }\n\n  void rename(String before, String after) {\n    if (existsFolder(after)) {\n      throw \"Name already exists!\";\n    }\n    if (after.contains('\"')) {\n      throw \"Invalid name\";\n    }\n    _db.execute(\"\"\"\n      ALTER TABLE \"$before\"\n      RENAME TO \"$after\";\n    \"\"\");\n    _db.execute(\"\"\"\n      update folder_order\n      set folder_name = ?\n      where folder_name == ?;\n    \"\"\", [after, before]);\n    _db.execute(\"\"\"\n      update folder_sync\n      set folder_name = ?\n      where folder_name == ?;\n    \"\"\", [after, before]);\n    counts[after] = counts[before] ?? 0;\n    counts.remove(before);\n    notifyListeners();\n  }\n\n  void onRead(String id, ComicType type) async {\n    if (appdata.settings['moveFavoriteAfterRead'] == \"none\") {\n      markAsRead(id, type);\n      return;\n    }\n    var followUpdatesFolder = appdata.settings['followUpdatesFolder'];\n    for (final folder in folderNames) {\n      var rows = _db.select(\"\"\"\n        select * from \"$folder\"\n        where id == ? and type == ?;\n      \"\"\", [id, type.value]);\n      if (rows.isNotEmpty) {\n        var newTime = DateTime.now()\n            .toIso8601String()\n            .replaceFirst(\"T\", \" \")\n            .substring(0, 19);\n        String updateLocationSql = \"\";\n        if (appdata.settings['moveFavoriteAfterRead'] == \"end\") {\n          int maxValue = _db.select(\"\"\"\n            SELECT MAX(display_order) AS max_value\n            FROM \"$folder\";\n          \"\"\").firstOrNull?[\"max_value\"] ?? 0;\n          updateLocationSql = \"display_order = ${maxValue + 1},\";\n        } else if (appdata.settings['moveFavoriteAfterRead'] == \"start\") {\n          int minValue = _db.select(\"\"\"\n            SELECT MIN(display_order) AS min_value\n            FROM \"$folder\";\n          \"\"\").firstOrNull?[\"min_value\"] ?? 0;\n          updateLocationSql = \"display_order = ${minValue - 1},\";\n        }\n        _db.execute(\"\"\"\n            UPDATE \"$folder\"\n            SET \n              $updateLocationSql\n              ${followUpdatesFolder == folder ? \"has_new_update = 0,\" : \"\"}\n              time = ?\n            WHERE id == ? and type == ?;\n          \"\"\", [newTime, id, type.value]);\n        if (followUpdatesFolder == folder) {\n          updateFollowUpdatesUI();\n        }\n      }\n    }\n    notifyListeners();\n  }\n\n  List<FavoriteItem> searchInFolder(String folder, String keyword) {\n    var keywordList = keyword.split(\" \");\n    keyword = keywordList.first;\n    keyword = \"%$keyword%\";\n    var res = _db.select(\"\"\"\n      SELECT * FROM \"$folder\" \n      WHERE name LIKE ? OR author LIKE ? OR tags LIKE ? OR translated_tags LIKE ?;\n    \"\"\", [keyword, keyword, keyword, keyword]);\n    var comics = res.map((e) => FavoriteItem.fromRow(e)).toList();\n    bool test(FavoriteItem comic, String keyword) {\n      if (comic.name.contains(keyword)) {\n        return true;\n      } else if (comic.author.contains(keyword)) {\n        return true;\n      } else if (comic.tags.any((element) => element.contains(keyword))) {\n        return true;\n      }\n      return false;\n    }\n\n    for (var i = 1; i < keywordList.length; i++) {\n      comics =\n          comics.where((element) => test(element, keywordList[i])).toList();\n    }\n    return comics;\n  }\n\n  List<FavoriteItem> search(String keyword) {\n    var keywordList = keyword.split(\" \");\n    keyword = keywordList.first;\n    var comics = <FavoriteItem>{};\n    for (var table in folderNames) {\n      keyword = \"%$keyword%\";\n      var res = _db.select(\"\"\"\n        SELECT * FROM \"$table\" \n        WHERE name LIKE ? OR author LIKE ? OR tags LIKE ? OR translated_tags LIKE ?;\n      \"\"\", [keyword, keyword, keyword, keyword]);\n      for (var comic in res) {\n        comics.add(FavoriteItem.fromRow(comic));\n      }\n      if (comics.length > 200) {\n        break;\n      }\n    }\n\n    bool test(FavoriteItem comic, String keyword) {\n      keyword = keyword.trim();\n      if (keyword.isEmpty) {\n        return true;\n      }\n      if (comic.name.contains(keyword)) {\n        return true;\n      } else if (comic.author.contains(keyword)) {\n        return true;\n      } else if (comic.tags.any((element) => element.contains(keyword))) {\n        return true;\n      }\n      return false;\n    }\n\n    return comics.where((element) {\n      for (var i = 1; i < keywordList.length; i++) {\n        if (!test(element, keywordList[i])) {\n          return false;\n        }\n      }\n      return true;\n    }).toList();\n  }\n\n  void editTags(String id, String folder, List<String> tags) {\n    _db.execute(\"\"\"\n        update \"$folder\"\n        set tags = ?\n        where id == ?;\n      \"\"\", [tags.join(\",\"), id]);\n    notifyListeners();\n  }\n\n  bool isExist(String id, ComicType type) {\n    var hash = id.hashCode ^ type.value;\n    return _hashedIds.containsKey(hash);\n  }\n\n  void updateInfo(String folder, FavoriteItem comic, [bool notify = true]) {\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set name = ?, author = ?, cover_path = ?, tags = ?\n      where id == ? and type == ?;\n    \"\"\", [\n      comic.name,\n      comic.author,\n      comic.coverPath,\n      comic.tags.join(\",\"),\n      comic.id,\n      comic.type.value\n    ]);\n    if (notify) {\n      notifyListeners();\n    }\n  }\n\n  String folderToJson(String folder) {\n    var res = _db.select(\"\"\"\n      select * from \"$folder\";\n    \"\"\");\n    return jsonEncode({\n      \"info\": \"Generated by Venera\",\n      \"name\": folder,\n      \"comics\": res.map((e) => FavoriteItem.fromRow(e).toJson()).toList(),\n    });\n  }\n\n  void fromJson(String json) {\n    var data = jsonDecode(json);\n    var folder = data[\"name\"];\n    if (folder == null || folder is! String) {\n      throw \"Invalid data\";\n    }\n    if (existsFolder(folder)) {\n      int i = 0;\n      while (existsFolder(\"$folder($i)\")) {\n        i++;\n      }\n      folder = \"$folder($i)\";\n    }\n    createFolder(folder);\n    for (var comic in data[\"comics\"]) {\n      try {\n        addComic(folder, FavoriteItem.fromJson(comic));\n      } catch (e) {\n        Log.error(\"Import Data\", e.toString());\n      }\n    }\n  }\n\n  void prepareTableForFollowUpdates(String table, [bool clearData = true]) {\n    // check if the table has the column \"last_update_time\" \"has_new_update\" \"last_check_time\"\n    var columns = _db.select(\"\"\"\n      pragma table_info(\"$table\");\n    \"\"\");\n    if (!columns.any((element) => element[\"name\"] == \"last_update_time\")) {\n      _db.execute(\"\"\"\n        alter table \"$table\"\n        add column last_update_time TEXT;\n      \"\"\");\n    }\n    if (!columns.any((element) => element[\"name\"] == \"has_new_update\")) {\n      _db.execute(\"\"\"\n        alter table \"$table\"\n        add column has_new_update int;\n      \"\"\");\n    }\n    if (clearData) {\n      _db.execute(\"\"\"\n        update \"$table\"\n        set has_new_update = 0;\n      \"\"\");\n    }\n    if (!columns.any((element) => element[\"name\"] == \"last_check_time\")) {\n      _db.execute(\"\"\"\n        alter table \"$table\"\n        add column last_check_time int;\n      \"\"\");\n    }\n  }\n\n  void updateUpdateTime(\n    String folder,\n    String id,\n    ComicType type,\n    String updateTime,\n  ) {\n    var oldTime = _db.select(\"\"\"\n      select last_update_time from \"$folder\"\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]).first['last_update_time'];\n    var hasNewUpdate = oldTime != updateTime;\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set last_update_time = ?, has_new_update = ?, last_check_time = ?\n      where id == ? and type == ?;\n    \"\"\", [\n      updateTime,\n      hasNewUpdate ? 1 : 0,\n      DateTime.now().millisecondsSinceEpoch,\n      id,\n      type.value,\n    ]);\n  }\n\n  void updateCheckTime(\n    String folder,\n    String id,\n    ComicType type,\n  ) {\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set last_check_time = ?\n      where id == ? and type == ?;\n    \"\"\", [DateTime.now().millisecondsSinceEpoch, id, type.value]);\n  }\n\n  int countUpdates(String folder) {\n    return _db.select(\"\"\"\n      select count(*) as c from \"$folder\"\n      where has_new_update == 1;\n    \"\"\").first['c'];\n  }\n\n  List<FavoriteItemWithUpdateInfo> getUpdates(String folder) {\n    if (!existsFolder(folder)) {\n      return [];\n    }\n    var res = _db.select(\"\"\"\n      select * from \"$folder\"\n      where has_new_update == 1;\n    \"\"\");\n    return res\n        .map(\n          (e) => FavoriteItemWithUpdateInfo(\n            FavoriteItem.fromRow(e),\n            e['last_update_time'],\n            e['has_new_update'] == 1,\n            e['last_check_time'],\n          ),\n        )\n        .toList();\n  }\n\n  List<FavoriteItemWithUpdateInfo> getComicsWithUpdatesInfo(String folder) {\n    if (!existsFolder(folder)) {\n      return [];\n    }\n    var res = _db.select(\"\"\"\n      select * from \"$folder\";\n    \"\"\");\n    return res\n        .map(\n          (e) => FavoriteItemWithUpdateInfo(\n            FavoriteItem.fromRow(e),\n            e['last_update_time'],\n            e['has_new_update'] == 1,\n            e['last_check_time'],\n          ),\n        )\n        .toList();\n  }\n\n  void markAsRead(String id, ComicType type) {\n    var folder = appdata.settings['followUpdatesFolder'];\n    if (!existsFolder(folder)) {\n      return;\n    }\n    _db.execute(\"\"\"\n      update \"$folder\"\n      set has_new_update = 0\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]);\n  }\n\n  void close() {\n    _db.dispose();\n  }\n\n  void notifyChanges() {\n    notifyListeners();\n  }\n}\n"
  },
  {
    "path": "lib/foundation/follow_updates.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/utils/channel.dart';\n\nclass ComicUpdateResult {\n  final bool updated;\n  final String? errorMessage;\n\n  ComicUpdateResult(this.updated, this.errorMessage);\n}\n\nFuture<ComicUpdateResult> updateComic(\n    FavoriteItemWithUpdateInfo c, String folder) async {\n  int retries = 3;\n  while (true) {\n    try {\n      var comicSource = c.type.comicSource;\n      if (comicSource == null) {\n        return ComicUpdateResult(false, \"Comic source not found\");\n      }\n      var newInfo = (await comicSource.loadComicInfo!(c.id)).data;\n\n      var newTags = <String>[];\n      for (var entry in newInfo.tags.entries) {\n        const shouldIgnore = ['author', 'artist', 'time'];\n        var namespace = entry.key;\n        if (shouldIgnore.contains(namespace.toLowerCase())) {\n          continue;\n        }\n        for (var tag in entry.value) {\n          newTags.add(\"$namespace:$tag\");\n        }\n      }\n\n      var item = FavoriteItem(\n        id: c.id,\n        name: newInfo.title,\n        coverPath: newInfo.cover,\n        author: newInfo.subTitle ??\n            newInfo.tags['author']?.firstOrNull ??\n            c.author,\n        type: c.type,\n        tags: newTags,\n      );\n\n      LocalFavoritesManager().updateInfo(folder, item, false);\n\n      var updated = false;\n      var updateTime = newInfo.findUpdateTime();\n      if (updateTime != null && updateTime != c.updateTime) {\n        LocalFavoritesManager().updateUpdateTime(\n          folder,\n          c.id,\n          c.type,\n          updateTime,\n        );\n        updated = true;\n      } else {\n        LocalFavoritesManager().updateCheckTime(folder, c.id, c.type);\n      }\n      return ComicUpdateResult(updated, null);\n    } catch (e, s) {\n      Log.error(\"Check Updates\", e, s);\n      await Future.delayed(const Duration(seconds: 2));\n      retries--;\n      if (retries == 0) {\n        return ComicUpdateResult(false, e.toString());\n      }\n    }\n  }\n}\n\nclass UpdateProgress {\n  final int total;\n  final int current;\n  final int errors;\n  final int updated;\n  final FavoriteItemWithUpdateInfo? comic;\n  final String? errorMessage;\n\n  UpdateProgress(this.total, this.current, this.errors, this.updated,\n      [this.comic, this.errorMessage]);\n}\n\nvoid updateFolderBase(\n  String folder,\n  StreamController<UpdateProgress> stream,\n  bool ignoreCheckTime,\n) async {\n  var comics = LocalFavoritesManager().getComicsWithUpdatesInfo(folder);\n  int total = comics.length;\n  int current = 0;\n  int errors = 0;\n  int updated = 0;\n\n  stream.add(UpdateProgress(total, current, errors, updated));\n\n  var comicsToUpdate = <FavoriteItemWithUpdateInfo>[];\n\n  for (var comic in comics) {\n    if (!ignoreCheckTime) {\n      var lastCheckTime = comic.lastCheckTime;\n      if (lastCheckTime != null &&\n          DateTime.now().difference(lastCheckTime).inDays < 1) {\n        current++;\n        stream.add(UpdateProgress(total, current, errors, updated));\n        continue;\n      }\n    }\n    comicsToUpdate.add(comic);\n  }\n\n  total = comicsToUpdate.length;\n  current = 0;\n  stream.add(UpdateProgress(total, current, errors, updated));\n\n  var channel = Channel<FavoriteItemWithUpdateInfo>(10);\n\n  // Producer\n  () async {\n    var c = 0;\n    for (var comic in comicsToUpdate) {\n      await channel.push(comic);\n      c++;\n      // Throttle\n      if (c % 5 == 0) {\n        var delay = c % 100 + 1;\n        if (delay > 10) {\n          delay = 10;\n        }\n        await Future.delayed(Duration(seconds: delay));\n      }\n    }\n    channel.close();\n  }();\n\n  // Consumers\n  var updateFutures = <Future>[];\n  for (var i = 0; i < 5; i++) {\n    var f = () async {\n      while (true) {\n        var comic = await channel.pop();\n        if (comic == null) {\n          break;\n        }\n        var result = await updateComic(comic, folder);\n        current++;\n        if (result.updated) {\n          updated++;\n        }\n        if (result.errorMessage != null) {\n          errors++;\n        }\n        stream.add(UpdateProgress(total, current, errors, updated, comic, result.errorMessage));\n      }\n    }();\n    updateFutures.add(f);\n  }\n\n  await Future.wait(updateFutures);\n\n  if (updated > 0) {\n    LocalFavoritesManager().notifyChanges();\n  }\n\n  stream.close();\n}\n\n\nStream<UpdateProgress> updateFolder(String folder, bool ignoreCheckTime) {\n  var stream = StreamController<UpdateProgress>();\n  updateFolderBase(folder, stream, ignoreCheckTime);\n  return stream.stream;\n}\n\nFuture<String> getUpdatedComicsAsJson(String folder) async {\n  var comics = LocalFavoritesManager().getComicsWithUpdatesInfo(folder);\n  var updatedComics = comics.where((c) => c.hasNewUpdate).toList();\n  var jsonList = updatedComics.map((c) => {\n    'id': c.id,\n    'name': c.name,\n    'coverUrl': c.coverPath,\n    'author': c.author,\n    'type': c.type.sourceKey,\n    'updateTime': c.updateTime,\n    'tags': c.tags,\n  }).toList();\n  return jsonEncode(jsonList);\n}\n"
  },
  {
    "path": "lib/foundation/global_state.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nabstract class GlobalState {\n  static final _state = <Pair<Object?, State>>[];\n\n  static void register(State state, [Object? key]) {\n    _state.add(Pair(key, state));\n  }\n\n  static T find<T extends State>([Object? key]) {\n    for (var pair in _state) {\n      if ((key == null || pair.left == key) && pair.right is T) {\n        return pair.right as T;\n      }\n    }\n    throw Exception('State not found');\n  }\n\n  static T? findOrNull<T extends State>([Object? key]) {\n    for (var pair in _state) {\n      if ((key == null || pair.left == key) && pair.right is T) {\n        return pair.right as T;\n      }\n    }\n    return null;\n  }\n\n  static void unregister(State state, [Object? key]) {\n    _state.removeWhere(\n        (pair) => (key == null || pair.left == key) && pair.right == state);\n  }\n}\n\nclass Pair<K, V> {\n  K left;\n  V right;\n\n  Pair(this.left, this.right);\n}\n\nabstract class AutomaticGlobalState<T extends StatefulWidget>\n    extends State<T> {\n  @override\n  @mustCallSuper\n  void initState() {\n    super.initState();\n    GlobalState.register(this, key);\n  }\n\n  @override\n  @mustCallSuper\n  void dispose() {\n    super.dispose();\n    GlobalState.unregister(this, key);\n  }\n\n  Object? get key;\n\n  void update() {\n    setState(() {});\n  }\n\n  void refresh() {\n    update();\n  }\n}\n"
  },
  {
    "path": "lib/foundation/history.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:isolate';\nimport 'dart:math';\nimport 'dart:ffi' as ffi;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter/widgets.dart' show ChangeNotifier;\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/image_provider/image_favorites_provider.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/utils/channel.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/translations.dart';\n\nimport 'app.dart';\nimport 'consts.dart';\n\npart \"image_favorites.dart\";\n\ntypedef HistoryType = ComicType;\n\nabstract mixin class HistoryMixin {\n  String get title;\n\n  String? get subTitle;\n\n  String get cover;\n\n  String get id;\n\n  int? get maxPage => null;\n\n  HistoryType get historyType;\n}\n\nclass History implements Comic {\n  HistoryType type;\n\n  DateTime time;\n\n  @override\n  String title;\n\n  @override\n  String subtitle;\n\n  @override\n  String cover;\n\n  /// index of chapters. 1-based.\n  int ep;\n\n  /// index of pages. 1-based.\n  int page;\n\n  /// index of chapter groups. 1-based.\n  /// If [group] is not null, [ep] is the index of chapter in the group.\n  int? group;\n\n  @override\n  String id;\n\n  /// readEpisode is a set of episode numbers that have been read.\n  /// For normal chapters, it is a set of chapter numbers.\n  /// For grouped chapters, it is a set of strings in the format of \"group_number-chapter_number\".\n  /// 1-based.\n  Set<String> readEpisode;\n\n  @override\n  int? maxPage;\n\n  History.fromModel(\n      {required HistoryMixin model,\n      required this.ep,\n      required this.page,\n      this.group,\n      Set<String>? readChapters,\n      DateTime? time})\n      : type = model.historyType,\n        title = model.title,\n        subtitle = model.subTitle ?? '',\n        cover = model.cover,\n        id = model.id,\n        readEpisode = readChapters ?? <String>{},\n        time = time ?? DateTime.now();\n\n  History.fromMap(Map<String, dynamic> map)\n      : type = HistoryType(map[\"type\"]),\n        time = DateTime.fromMillisecondsSinceEpoch(map[\"time\"]),\n        title = map[\"title\"],\n        subtitle = map[\"subtitle\"],\n        cover = map[\"cover\"],\n        ep = map[\"ep\"],\n        page = map[\"page\"],\n        id = map[\"id\"],\n        readEpisode = Set<String>.from(\n            (map[\"readEpisode\"] as List<dynamic>?)?.toSet() ??\n                const <String>{}),\n        maxPage = map[\"max_page\"];\n\n  @override\n  String toString() {\n    return 'History{type: $type, time: $time, title: $title, subtitle: $subtitle, cover: $cover, ep: $ep, page: $page, id: $id}';\n  }\n\n  History.fromRow(Row row)\n      : type = HistoryType(row[\"type\"]),\n        time = DateTime.fromMillisecondsSinceEpoch(row[\"time\"]),\n        title = row[\"title\"],\n        subtitle = row[\"subtitle\"],\n        cover = row[\"cover\"],\n        ep = row[\"ep\"],\n        page = row[\"page\"],\n        id = row[\"id\"],\n        readEpisode = Set<String>.from((row[\"readEpisode\"] as String)\n            .split(',')\n            .where((element) => element != \"\")),\n        maxPage = row[\"max_page\"],\n        group = row[\"chapter_group\"];\n\n  @override\n  bool operator ==(Object other) {\n    return other is History && type == other.type && id == other.id;\n  }\n\n  @override\n  int get hashCode => Object.hash(id, type);\n\n  @override\n  String get description {\n    var res = \"\";\n    if (group != null){\n      res += \"${\"Group @group\".tlParams({\n        \"group\": group!,\n      })} - \";\n    }\n    if (ep >= 1) {\n      res += \"Chapter @ep\".tlParams({\n        \"ep\": ep,\n      });\n    }\n    if (page >= 1) {\n      if (ep >= 1) {\n        res += \" - \";\n      }\n      res += \"Page @page\".tlParams({\n        \"page\": page,\n      });\n    }\n    return res;\n  }\n\n  @override\n  String? get favoriteId => null;\n\n  @override\n  String? get language => null;\n\n  @override\n  String get sourceKey => type == ComicType.local\n      ? 'local'\n      : type.comicSource?.key ?? \"Unknown:${type.value}\";\n\n  @override\n  double? get stars => null;\n\n  @override\n  List<String>? get tags => null;\n\n  @override\n  Map<String, dynamic> toJson() {\n    throw UnimplementedError();\n  }\n}\n\nclass HistoryManager with ChangeNotifier {\n  static HistoryManager? cache;\n\n  HistoryManager.create();\n\n  factory HistoryManager() =>\n      cache == null ? (cache = HistoryManager.create()) : cache!;\n\n  late Database _db;\n\n  int get length => _db.select(\"select count(*) from history;\").first[0] as int;\n\n  /// Cache of history ids. Improve the performance of find operation.\n  Map<String, bool>? _cachedHistoryIds;\n\n  /// Cache records recently modified by the app. Improve the performance of listeners.\n  final cachedHistories = <String, History>{};\n\n  bool isInitialized = false;\n\n  Future<void> init() async {\n    if (isInitialized) {\n      return;\n    }\n    _db = sqlite3.open(\"${App.dataPath}/history.db\");\n\n    _db.execute(\"\"\"\n        create table if not exists history  (\n          id text primary key,\n          title text,\n          subtitle text,\n          cover text,\n          time int,\n          type int,\n          ep int,\n          page int,\n          readEpisode text,\n          max_page int,\n          chapter_group int\n        );\n      \"\"\");\n\n    var columns = _db.select(\"PRAGMA table_info(history);\");\n    if (!columns.any((element) => element[\"name\"] == \"chapter_group\")) {\n      _db.execute(\"alter table history add column chapter_group int;\");\n    }\n\n    notifyListeners();\n    ImageFavoriteManager().init();\n    isInitialized = true;\n  }\n\n  static const _insertHistorySql = \"\"\"\n        insert or replace into history (id, title, subtitle, cover, time, type, ep, page, readEpisode, max_page, chapter_group)\n        values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);\n      \"\"\";\n\n  static Future<void> _addHistoryAsync(int dbAddr, History newItem) {\n    return Isolate.run(() {\n      var db = sqlite3.fromPointer(ffi.Pointer.fromAddress(dbAddr));\n      db.execute(_insertHistorySql, [\n        newItem.id,\n        newItem.title,\n        newItem.subtitle,\n        newItem.cover,\n        newItem.time.millisecondsSinceEpoch,\n        newItem.type.value,\n        newItem.ep,\n        newItem.page,\n        newItem.readEpisode.join(','),\n        newItem.maxPage,\n        newItem.group\n      ]);\n    });\n  }\n\n  bool _haveAsyncTask = false;\n\n  /// Create a isolate to add history to prevent blocking the UI thread.\n  Future<void> addHistoryAsync(History newItem) async {\n    while (_haveAsyncTask) {\n      await Future.delayed(Duration(milliseconds: 20));\n    }\n\n    _haveAsyncTask = true;\n    await _addHistoryAsync(_db.handle.address, newItem);\n    _haveAsyncTask = false;\n    if (_cachedHistoryIds == null) {\n      updateCache();\n    } else {\n      _cachedHistoryIds![newItem.id] = true;\n    }\n    cachedHistories[newItem.id] = newItem;\n    if (cachedHistories.length > 10) {\n      cachedHistories.remove(cachedHistories.keys.first);\n    }\n    notifyListeners();\n  }\n\n  /// add history. if exists, update time.\n  ///\n  /// This function would be called when user start reading.\n  void addHistory(History newItem) {\n    _db.execute(_insertHistorySql, [\n      newItem.id,\n      newItem.title,\n      newItem.subtitle,\n      newItem.cover,\n      newItem.time.millisecondsSinceEpoch,\n      newItem.type.value,\n      newItem.ep,\n      newItem.page,\n      newItem.readEpisode.join(','),\n      newItem.maxPage,\n      newItem.group\n    ]);\n    if (_cachedHistoryIds == null) {\n      updateCache();\n    } else {\n      _cachedHistoryIds![newItem.id] = true;\n    }\n    cachedHistories[newItem.id] = newItem;\n    if (cachedHistories.length > 10) {\n      cachedHistories.remove(cachedHistories.keys.first);\n    }\n    notifyListeners();\n  }\n\n  void clearHistory() {\n    _db.execute(\"delete from history;\");\n    updateCache();\n    notifyListeners();\n  }\n\nvoid clearUnfavoritedHistory() {\n  _db.execute('BEGIN TRANSACTION;');\n  try {\n    final idAndTypes = _db.select(\"\"\"\n      select id, type from history;\n    \"\"\");\n    for (var element in idAndTypes) {\n      final id = element[\"id\"] as String;\n      final type = ComicType(element[\"type\"] as int);\n      if (!LocalFavoritesManager().isExist(id, type)) {\n        _db.execute(\"\"\"\n          delete from history\n          where id == ? and type == ?;\n        \"\"\", [id, type.value]);\n      }\n    }\n    _db.execute('COMMIT;');\n  } catch (e) {\n    _db.execute('ROLLBACK;');\n    rethrow;\n  }\n  updateCache();\n  notifyListeners();\n}\n\n  void remove(String id, ComicType type) async {\n    _db.execute(\"\"\"\n      delete from history\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]);\n    updateCache();\n    notifyListeners();\n  }\n\n  void updateCache() {\n    _cachedHistoryIds = {};\n    var res = _db.select(\"\"\"\n        select id from history;\n      \"\"\");\n    for (var element in res) {\n      _cachedHistoryIds![element[\"id\"] as String] = true;\n    }\n    for (var key in cachedHistories.keys.toList()) {\n      if (!_cachedHistoryIds!.containsKey(key)) {\n        cachedHistories.remove(key);\n      }\n    }\n  }\n\n  History? find(String id, ComicType type) {\n    if (_cachedHistoryIds == null) {\n      updateCache();\n    }\n    if (!_cachedHistoryIds!.containsKey(id)) {\n      return null;\n    }\n    if (cachedHistories.containsKey(id)) {\n      return cachedHistories[id];\n    }\n\n    var res = _db.select(\"\"\"\n      select * from history\n      where id == ? and type == ?;\n    \"\"\", [id, type.value]);\n    if (res.isEmpty) {\n      return null;\n    }\n    return History.fromRow(res.first);\n  }\n\n  List<History> getAll() {\n    var res = _db.select(\"\"\"\n      select * from history\n      order by time DESC;\n    \"\"\");\n    return res.map((element) => History.fromRow(element)).toList();\n  }\n\n  /// 获取最近阅读的漫画\n  List<History> getRecent() {\n    var res = _db.select(\"\"\"\n      select * from history\n      order by time DESC\n      limit 20;\n    \"\"\");\n    return res.map((element) => History.fromRow(element)).toList();\n  }\n\n  /// 获取历史记录的数量\n  int count() {\n    var res = _db.select(\"\"\"\n      select count(*) from history;\n    \"\"\");\n    return res.first[0] as int;\n  }\n\n  void close() {\n    isInitialized = false;\n    _db.dispose();\n  }\n\n  void batchDeleteHistories(List<ComicID> histories) {\n    if (histories.isEmpty) return;\n    _db.execute('BEGIN TRANSACTION;');\n    try {\n      for (var history in histories) {\n        _db.execute(\"\"\"\n          delete from history\n          where id == ? and type == ?;\n        \"\"\", [history.id, history.type.value]);\n      }\n      _db.execute('COMMIT;');\n    } catch (e) {\n      _db.execute('ROLLBACK;');\n      rethrow;\n    }\n    updateCache();\n    notifyListeners();\n  }\n\n  /// Refresh history info from comic source.\n  /// Fetches the latest cover, title and subtitle from the source.\n  /// Keeps the reading progress (ep, page, etc.).\n  Future<bool> refreshHistoryInfo(History history) async {\n    if (history.sourceKey == 'local') {\n      // Local comics don't need refresh\n      return false;\n    }\n\n    return await _refreshSingleHistory(history);\n  }\n\n  /// Internal method to refresh a single history\n  /// Retries up to 3 times on failure with 2 second delay between retries\n  Future<bool> _refreshSingleHistory(History history) async {\n    var comicSource = ComicSource.find(history.sourceKey);\n    if (comicSource == null || comicSource.loadComicInfo == null) {\n      return false;\n    }\n\n    int retries = 3;\n    while (true) {\n      try {\n        var res = await comicSource.loadComicInfo!(history.id);\n        if (res.error) {\n          await Future.delayed(const Duration(seconds: 2));\n          retries--;\n          if (retries == 0) {\n            return false;\n          }\n          continue;\n        }\n\n        var comicDetails = res.data;\n        // Update history info while keeping reading progress\n        var updatedHistory = History.fromMap({\n          'type': history.type.value,\n          'time': history.time.millisecondsSinceEpoch,\n          'title': comicDetails.title,\n          'subtitle': comicDetails.subTitle ?? '',\n          'cover': comicDetails.cover,\n          'ep': history.ep,\n          'page': history.page,\n          'id': history.id,\n          'readEpisode': history.readEpisode.toList(),\n          'max_page': history.maxPage,\n        });\n        updatedHistory.group = history.group;\n\n        addHistory(updatedHistory);\n        return true;\n      } catch (e, s) {\n        Log.error(\"History\", \"Exception while refreshing history info: $e\\n$s\");\n        await Future.delayed(const Duration(seconds: 2));\n        retries--;\n        if (retries == 0) {\n          return false;\n        }\n      }\n    }\n  }\n\n  /// Refresh all histories from comic sources.\n  /// Returns a stream with progress updates.\n  /// From e0ea449c.\n  Stream<RefreshProgress> refreshAllHistoriesStream() {\n    var controller = StreamController<RefreshProgress>();\n    _refreshAllHistoriesBase(controller);\n    return controller.stream;\n  }\n\n  void _refreshAllHistoriesBase(\n    StreamController<RefreshProgress> controller,\n  ) async {\n    var histories = getAll();\n    int total = histories.length;\n    int current = 0;\n    int success = 0;\n    int failed = 0;\n    int skipped = 0;\n\n    controller.add(RefreshProgress(total, current, success, failed, skipped));\n\n    var historiesToRefresh = <History>[];\n    for (var history in histories) {\n      if (history.sourceKey == 'local') {\n        skipped++;\n        current++;\n        controller.add(RefreshProgress(total, current, success, failed, skipped));\n        continue;\n      }\n      historiesToRefresh.add(history);\n    }\n\n    total = historiesToRefresh.length;\n    current = 0;\n    controller.add(RefreshProgress(total, current, success, failed, skipped));\n\n    var channel = Channel<History>(10);\n\n    () async {\n      var c = 0;\n      for (var history in historiesToRefresh) {\n        await channel.push(history);\n        c++;\n        if (c % 5 == 0) {\n          var delay = c % 100 + 1;\n          if (delay > 10) {\n            delay = 10;\n          }\n          await Future.delayed(Duration(seconds: delay));\n        }\n      }\n      channel.close();\n    }();\n\n    var updateFutures = <Future>[];\n    for (var i = 0; i < 5; i++) {\n      var f = () async {\n        while (true) {\n          var history = await channel.pop();\n          if (history == null) {\n            break;\n          }\n          var result = await _refreshSingleHistory(history);\n          current++;\n          if (result) {\n            success++;\n          } else {\n            failed++;\n          }\n          controller.add(\n            RefreshProgress(total, current, success, failed, skipped),\n          );\n        }\n      }();\n      updateFutures.add(f);\n    }\n\n    await Future.wait(updateFutures);\n\n    notifyListeners();\n    controller.close();\n  }\n}\n\nclass RefreshProgress {\n  final int total;\n  final int current;\n  final int success;\n  final int failed;\n  final int skipped;\n\n  RefreshProgress(\n    this.total,\n    this.current,\n    this.success,\n    this.failed,\n    this.skipped,\n  );\n}\n"
  },
  {
    "path": "lib/foundation/image_favorites.dart",
    "content": "part of \"history.dart\";\n\nclass ImageFavorite {\n  final String eid;\n  final String id; // 漫画id\n  final int ep;\n  final String epName;\n  final String sourceKey;\n  String imageKey;\n  int page;\n  bool? isAutoFavorite;\n\n  ImageFavorite(\n    this.page,\n    this.imageKey,\n    this.isAutoFavorite,\n    this.eid,\n    this.id,\n    this.ep,\n    this.sourceKey,\n    this.epName,\n  );\n\n  Map<String, dynamic> toJson() {\n    return {\n      'page': page,\n      'imageKey': imageKey,\n      'isAutoFavorite': isAutoFavorite,\n      'eid': eid,\n      'id': id,\n      'ep': ep,\n      'sourceKey': sourceKey,\n      'epName': epName,\n    };\n  }\n\n  ImageFavorite.fromJson(Map<String, dynamic> json)\n      : page = json['page'],\n        imageKey = json['imageKey'],\n        isAutoFavorite = json['isAutoFavorite'],\n        eid = json['eid'],\n        id = json['id'],\n        ep = json['ep'],\n        sourceKey = json['sourceKey'],\n        epName = json['epName'];\n\n  ImageFavorite copyWith({\n    int? page,\n    String? imageKey,\n    bool? isAutoFavorite,\n    String? eid,\n    String? id,\n    int? ep,\n    String? sourceKey,\n    String? epName,\n  }) {\n    return ImageFavorite(\n      page ?? this.page,\n      imageKey ?? this.imageKey,\n      isAutoFavorite ?? this.isAutoFavorite,\n      eid ?? this.eid,\n      id ?? this.id,\n      ep ?? this.ep,\n      sourceKey ?? this.sourceKey,\n      epName ?? this.epName,\n    );\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is ImageFavorite &&\n        other.id == id &&\n        other.sourceKey == sourceKey &&\n        other.page == page &&\n        other.eid == eid &&\n        other.ep == ep;\n  }\n\n  @override\n  int get hashCode => Object.hash(id, sourceKey, page, eid, ep);\n}\n\nclass ImageFavoritesEp {\n  // 小心拷贝等多章节的可能更新章节顺序\n  String eid;\n  final int ep;\n  int maxPage;\n  String epName;\n  List<ImageFavorite> imageFavorites;\n\n  ImageFavoritesEp(\n      this.eid, this.ep, this.imageFavorites, this.epName, this.maxPage);\n\n  // 是否有封面\n  bool get isHasFirstPage {\n    return imageFavorites[0].page == firstPage;\n  }\n\n  // 是否都有imageKey\n  bool get isHasImageKey {\n    return imageFavorites.every((e) => e.imageKey != \"\");\n  }\n\n  Map<String, dynamic> toJson() {\n    return {\n      'eid': eid,\n      'ep': ep,\n      'maxPage': maxPage,\n      'epName': epName,\n      'imageFavorites': imageFavorites.map((e) => e.toJson()).toList(),\n    };\n  }\n}\n\nclass ImageFavoritesComic {\n  final String id;\n  final String title;\n  String subTitle;\n  String author;\n  final String sourceKey;\n\n  // 不一定是真的这本漫画的所有页数, 如果是多章节的时候\n  int maxPage;\n  List<String> tags;\n  List<String> translatedTags;\n  final DateTime time;\n  List<ImageFavoritesEp> imageFavoritesEp;\n  final Map<String, dynamic> other;\n\n  ImageFavoritesComic(\n    this.id,\n    this.imageFavoritesEp,\n    this.title,\n    this.sourceKey,\n    this.tags,\n    this.translatedTags,\n    this.time,\n    this.author,\n    this.other,\n    this.subTitle,\n    this.maxPage,\n  );\n\n  // 是否都有imageKey\n  bool get isAllHasImageKey {\n    return imageFavoritesEp\n        .every((e) => e.imageFavorites.every((j) => j.imageKey != \"\"));\n  }\n\n  int get maxPageFromEp {\n    int temp = 0;\n    for (var e in imageFavoritesEp) {\n      temp += e.maxPage;\n    }\n    return temp;\n  }\n\n  // 是否都有封面\n  bool get isAllHasFirstPage {\n    return imageFavoritesEp.every((e) => e.isHasFirstPage);\n  }\n\n  Iterable<ImageFavorite> get images sync*{\n    for (var e in imageFavoritesEp) {\n      yield* e.imageFavorites;\n    }\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is ImageFavoritesComic &&\n        other.id == id &&\n        other.sourceKey == sourceKey;\n  }\n\n  @override\n  int get hashCode => Object.hash(id, sourceKey);\n\n  factory ImageFavoritesComic.fromRow(Row r) {\n    var tempImageFavoritesEp = jsonDecode(r[\"image_favorites_ep\"]);\n    List<ImageFavoritesEp> finalImageFavoritesEp = [];\n    tempImageFavoritesEp.forEach((i) {\n      List<ImageFavorite> temp = [];\n      i[\"imageFavorites\"].forEach((j) {\n        temp.add(ImageFavorite(\n          j[\"page\"],\n          j[\"imageKey\"],\n          j[\"isAutoFavorite\"],\n          i[\"eid\"],\n          r[\"id\"],\n          i[\"ep\"],\n          r[\"source_key\"],\n          i[\"epName\"],\n        ));\n      });\n      finalImageFavoritesEp.add(ImageFavoritesEp(\n          i[\"eid\"], i[\"ep\"], temp, i[\"epName\"], i[\"maxPage\"] ?? 1));\n    });\n    return ImageFavoritesComic(\n      r[\"id\"],\n      finalImageFavoritesEp,\n      r[\"title\"],\n      r[\"source_key\"],\n      r[\"tags\"].split(\",\"),\n      r[\"translated_tags\"].split(\",\"),\n      DateTime.fromMillisecondsSinceEpoch(r[\"time\"]),\n      r[\"author\"],\n      jsonDecode(r[\"other\"]),\n      r[\"sub_title\"],\n      r[\"max_page\"],\n    );\n  }\n}\n\nclass ImageFavoriteManager with ChangeNotifier {\n  Database get _db => HistoryManager()._db;\n\n  List<ImageFavoritesComic> get comics => getAll();\n\n  static ImageFavoriteManager? _cache;\n\n  ImageFavoriteManager._();\n\n  factory ImageFavoriteManager() => (_cache ??= ImageFavoriteManager._());\n\n  /// 检查表image_favorites是否存在, 不存在则创建\n  void init() {\n    _db.execute(\"CREATE TABLE IF NOT EXISTS image_favorites (\"\n        \"id TEXT,\"\n        \"title TEXT NOT NULL,\"\n        \"sub_title TEXT,\"\n        \"author TEXT,\"\n        \"tags TEXT,\"\n        \"translated_tags TEXT,\"\n        \"time int,\"\n        \"max_page int,\"\n        \"source_key TEXT NOT NULL,\"\n        \"image_favorites_ep TEXT NOT NULL,\"\n        \"other TEXT NOT NULL,\"\n        \"PRIMARY KEY (id,source_key)\"\n        \");\");\n  }\n\n  // 做排序和去重的操作\n  void addOrUpdateOrDelete(ImageFavoritesComic favorite, [bool notify = true]) {\n    // 没有章节了就删掉\n    if (favorite.imageFavoritesEp.isEmpty) {\n      _db.execute(\"\"\"\n      delete from image_favorites\n      where id == ? and source_key == ?;\n    \"\"\", [favorite.id, favorite.sourceKey]);\n    } else {\n      // 去重章节\n      List<ImageFavoritesEp> tempImageFavoritesEp = [];\n      for (var e in favorite.imageFavoritesEp) {\n        int index = tempImageFavoritesEp.indexWhere((i) {\n          return i.ep == e.ep;\n        });\n        // 再做一层保险, 防止出现ep为0的脏数据\n        if (index == -1 && e.ep > 0) {\n          tempImageFavoritesEp.add(e);\n        }\n      }\n      tempImageFavoritesEp.sort((a, b) => a.ep.compareTo(b.ep));\n      List<dynamic> finalImageFavoritesEp =\n          jsonDecode(jsonEncode(tempImageFavoritesEp));\n      for (var e in tempImageFavoritesEp) {\n        List<Map> finalImageFavorites = [];\n        int epIndex = tempImageFavoritesEp.indexOf(e);\n        for (ImageFavorite j in e.imageFavorites) {\n          int index =\n              finalImageFavorites.indexWhere((i) => i[\"page\"] == j.page);\n          if (index == -1 && j.page > 0) {\n            // isAutoFavorite 为 null 不写入数据库, 同时只保留需要的属性, 避免增加太多重复字段在数据库里\n            if (j.isAutoFavorite != null) {\n              finalImageFavorites.add({\n                \"page\": j.page,\n                \"imageKey\": j.imageKey,\n                \"isAutoFavorite\": j.isAutoFavorite\n              });\n            } else {\n              finalImageFavorites.add({\"page\": j.page, \"imageKey\": j.imageKey});\n            }\n          }\n        }\n        finalImageFavorites.sort((a, b) => a[\"page\"].compareTo(b[\"page\"]));\n        finalImageFavoritesEp[epIndex][\"imageFavorites\"] = finalImageFavorites;\n      }\n      if (tempImageFavoritesEp.isEmpty) {\n        throw \"Error: No ImageFavoritesEp\";\n      }\n      _db.execute(\"\"\"\n      insert or replace into image_favorites(id, title, sub_title, author, tags, translated_tags, time, max_page, source_key, image_favorites_ep, other)\n      values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);\n    \"\"\", [\n        favorite.id,\n        favorite.title,\n        favorite.subTitle,\n        favorite.author,\n        favorite.tags.join(\",\"),\n        favorite.translatedTags.join(\",\"),\n        favorite.time.millisecondsSinceEpoch,\n        favorite.maxPage,\n        favorite.sourceKey,\n        jsonEncode(finalImageFavoritesEp),\n        jsonEncode(favorite.other)\n      ]);\n    }\n    if (notify) {\n      notifyListeners();\n    }\n  }\n\n  bool has(String id, String sourceKey, String eid, int page, int ep) {\n    var comic = find(id, sourceKey);\n    if (comic == null) {\n      return false;\n    }\n    var epIndex = comic.imageFavoritesEp.where((e) => e.eid == eid).firstOrNull;\n    if (epIndex == null) {\n      return false;\n    }\n    return epIndex.imageFavorites.any((e) => e.page == page && e.ep == ep);\n  }\n\n  List<ImageFavoritesComic> getAll([String? keyword]) {\n    ResultSet res;\n    if (keyword == null || keyword == \"\") {\n      res = _db.select(\"select * from image_favorites;\");\n    } else {\n      res = _db.select(\n        \"\"\"\n    select * from image_favorites\n    WHERE title LIKE ?\n    OR sub_title LIKE ?\n    OR LOWER(tags) LIKE LOWER(?)\n    OR LOWER(translated_tags) LIKE LOWER(?)\n    OR author LIKE ?;\n    \"\"\",\n        ['%$keyword%', '%$keyword%', '%$keyword%', '%$keyword%', '%$keyword%'],\n      );\n    }\n    try {\n      return res.map((e) => ImageFavoritesComic.fromRow(e)).toList();\n    } catch (e, stackTrace) {\n      Log.error(\"Unhandled Exception\", e.toString(), stackTrace);\n      return [];\n    }\n  }\n\n  void deleteImageFavorite(Iterable<ImageFavorite> imageFavoriteList) {\n    if (imageFavoriteList.isEmpty) {\n      return;\n    }\n    for (var i in imageFavoriteList) {\n      ImageFavoritesProvider.deleteFromCache(i);\n    }\n    var comics = <ImageFavoritesComic>{};\n    for (var i in imageFavoriteList) {\n      var comic = comics\n              .where((c) => c.id == i.id && c.sourceKey == i.sourceKey)\n              .firstOrNull ??\n          find(i.id, i.sourceKey);\n      if (comic == null) {\n        continue;\n      }\n      var ep = comic.imageFavoritesEp.firstWhereOrNull((e) => e.ep == i.ep);\n      if (ep == null) {\n        continue;\n      }\n      ep.imageFavorites.remove(i);\n      if (ep.imageFavorites.isEmpty) {\n        comic.imageFavoritesEp.remove(ep);\n      }\n      comics.add(comic);\n    }\n    for (var i in comics) {\n      addOrUpdateOrDelete(i, false);\n    }\n    notifyListeners();\n  }\n\n  int get length {\n    var res = _db.select(\"select count(*) from image_favorites;\");\n    return res.first.values.first! as int;\n  }\n\n  List<ImageFavoritesComic> search(String keyword) {\n    if (keyword == \"\") {\n      return [];\n    }\n    return getAll(keyword);\n  }\n\n  static Future<ImageFavoritesComputed> computeImageFavorites() {\n    var token = ServicesBinding.rootIsolateToken!;\n    var count = ImageFavoriteManager().length;\n    if (count == 0) {\n      return Future.value(ImageFavoritesComputed([], [], [], 0));\n    } else if (count > 100) {\n      return Isolate.run(() async {\n        BackgroundIsolateBinaryMessenger.ensureInitialized(token);\n        await App.init();\n        await HistoryManager().init();\n        return _computeImageFavorites();\n      });\n    } else {\n      return Future.value(_computeImageFavorites());\n    }\n  }\n\n  static ImageFavoritesComputed _computeImageFavorites() {\n    const maxLength = 20;\n\n    var comics = ImageFavoriteManager().getAll();\n    // 去掉这些没有意义的标签\n    const List<String> exceptTags = [\n      '連載中',\n      '',\n      'translated',\n      'chinese',\n      'sole male',\n      'sole female',\n      'original',\n      'doujinshi',\n      'manga',\n      'multi-work series',\n      'mosaic censorship',\n      'dilf',\n      'bbm',\n      'uncensored',\n      'full censorship'\n    ];\n\n    Map<String, int> tagCount = {};\n    Map<String, int> authorCount = {};\n    Map<ImageFavoritesComic, int> comicImageCount = {};\n    Map<ImageFavoritesComic, int> comicMaxPages = {};\n    int count = 0;\n\n    for (var comic in comics) {\n      count += comic.images.length;\n      for (var tag in comic.tags) {\n        String finalTag = tag.split(\":\").last;\n        tagCount[finalTag] = (tagCount[finalTag] ?? 0) + 1;\n      }\n\n      if (comic.author != \"\") {\n        String finalAuthor = comic.author;\n        authorCount[finalAuthor] =\n            (authorCount[finalAuthor] ?? 0) + comic.images.length;\n      }\n      // 小于10页的漫画不统计\n      if (comic.maxPageFromEp < 10) {\n        continue;\n      }\n      comicImageCount[comic] =\n          (comicImageCount[comic] ?? 0) + comic.images.length;\n      comicMaxPages[comic] = (comicMaxPages[comic] ?? 0) + comic.maxPageFromEp;\n    }\n\n    // 按数量排序标签\n    List<String> sortedTags = tagCount.keys.toList()\n      ..sort((a, b) => tagCount[b]!.compareTo(tagCount[a]!));\n\n    // 按数量排序作者\n    List<String> sortedAuthors = authorCount.keys.toList()\n      ..sort((a, b) => authorCount[b]!.compareTo(authorCount[a]!));\n\n    // 按收藏数量排序漫画\n    List<MapEntry<ImageFavoritesComic, int>> sortedComicsByNum =\n        comicImageCount.entries.toList()\n          ..sort((a, b) => b.value.compareTo(a.value));\n\n    validateTag(String tag) {\n      if (tag.startsWith(\"Category:\")) {\n        return false;\n      }\n      return !exceptTags.contains(tag.split(\":\").last.toLowerCase()) &&\n          !tag.isNum;\n    }\n\n    return ImageFavoritesComputed(\n      sortedTags\n          .where(validateTag)\n          .map((tag) => TextWithCount(tag, tagCount[tag]!))\n          .take(maxLength)\n          .toList(),\n      sortedAuthors\n          .map((author) => TextWithCount(author, authorCount[author]!))\n          .take(maxLength)\n          .toList(),\n      sortedComicsByNum\n          .map((comic) => TextWithCount(comic.key.title, comic.value))\n          .take(maxLength)\n          .toList(),\n      count,\n    );\n  }\n\n  ImageFavoritesComic? find(String id, String sourceKey) {\n    var row = _db.select(\"\"\"\n    select * from image_favorites\n    where id == ? and source_key == ?;\n    \"\"\", [id, sourceKey]);\n    if (row.isEmpty) {\n      return null;\n    }\n    return ImageFavoritesComic.fromRow(row.first);\n  }\n}\n\nclass TextWithCount {\n  final String text;\n  final int count;\n\n  const TextWithCount(this.text, this.count);\n}\n\nclass ImageFavoritesComputed {\n  /// 基于收藏的标签数排序\n  final List<TextWithCount> tags;\n\n  /// 基于收藏的作者数排序\n  final List<TextWithCount> authors;\n\n  /// 基于喜欢的图片数排序\n  final List<TextWithCount> comics;\n\n  final int count;\n\n  /// 计算后的图片收藏数据\n  const ImageFavoritesComputed(\n    this.tags,\n    this.authors,\n    this.comics,\n    this.count,\n  );\n\n  bool get isEmpty => tags.isEmpty && authors.isEmpty && comics.isEmpty;\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/base_image_provider.dart",
    "content": "import 'dart:async' show Future, StreamController, scheduleMicrotask;\nimport 'dart:convert';\nimport 'dart:math';\nimport 'dart:ui' as ui show Codec;\nimport 'dart:ui';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/cache_manager.dart';\nimport 'package:venera/foundation/log.dart';\n\nabstract class BaseImageProvider<T extends BaseImageProvider<T>>\n    extends ImageProvider<T> {\n  const BaseImageProvider();\n\n  static const int maxImagePixel = 2560 * 1440;\n\n  static TargetImageSize _getTargetSize(int width, int height) {\n    // ignore invalid size\n    if (width <= 0 || height <= 0) {\n      return TargetImageSize(width: width, height: height);\n    }\n    // ignore too wide or too tall image\n    final imageRatio = width / height;\n    if (imageRatio > 2 || imageRatio < 0.5) {\n      return TargetImageSize(width: width, height: height);\n    }\n    // resize if too large\n    if (width * height > maxImagePixel) {\n      final ratio = sqrt(maxImagePixel / (width * height));\n      return TargetImageSize(width: (width * ratio).round(), height: (height * ratio).round());\n    }\n    return TargetImageSize(width: width, height: height);\n  }\n\n  @override\n  ImageStreamCompleter loadImage(T key, ImageDecoderCallback decode) {\n    final chunkEvents = StreamController<ImageChunkEvent>();\n    return MultiFrameImageStreamCompleter(\n      codec: _loadBufferAsync(key, chunkEvents, decode),\n      chunkEvents: chunkEvents.stream,\n      scale: 1.0,\n      informationCollector: () sync* {\n        yield DiagnosticsProperty<ImageProvider>(\n          'Image provider: $this \\n Image key: $key',\n          this,\n          style: DiagnosticsTreeStyle.errorProperty,\n        );\n      },\n    );\n  }\n\n  Future<ui.Codec> _loadBufferAsync(\n    T key,\n    StreamController<ImageChunkEvent> chunkEvents,\n    ImageDecoderCallback decode,\n  ) async {\n    try {\n      int retryTime = 1;\n\n      bool stop = false;\n\n      chunkEvents.onCancel = () {\n        stop = true;\n      };\n\n      Uint8List? data;\n\n      while (data == null && !stop) {\n        try {\n          data = await load(chunkEvents, () {\n            if (stop) {\n              throw const _ImageLoadingStopException();\n            }\n          });\n        } on _ImageLoadingStopException {\n          rethrow;\n        } catch (e) {\n          if (e.toString().contains(\"Invalid Status Code: 404\")) {\n            rethrow;\n          }\n          if (e.toString().contains(\"Invalid Status Code: 403\")) {\n            rethrow;\n          }\n          if (e.toString().contains(\"handshake\")) {\n            if (retryTime < 5) {\n              retryTime = 5;\n            }\n          }\n          retryTime <<= 1;\n          if (retryTime > (1 << 3) || stop) {\n            rethrow;\n          }\n          await Future.delayed(Duration(seconds: retryTime));\n        }\n      }\n\n      if (stop) {\n        throw const _ImageLoadingStopException();\n      }\n\n      if (data!.isEmpty) {\n        throw Exception(\"Empty image data\");\n      }\n\n      try {\n        final buffer = await ImmutableBuffer.fromUint8List(data);\n        return await decode(\n          buffer,\n          getTargetSize: enableResize ? _getTargetSize : null,\n        );\n      } catch (e) {\n        await CacheManager().delete(this.key);\n        if (data.length < 2 * 1024) {\n          // data is too short, it's likely that the data is text, not image\n          try {\n            var text =\n                const Utf8Codec(allowMalformed: false).decoder.convert(data);\n            throw Exception(\"Expected image data, but got text: $text\");\n          } catch (e) {\n            // ignore\n          }\n        }\n        rethrow;\n      }\n    } on _ImageLoadingStopException {\n      rethrow;\n    } catch (e, s) {\n      scheduleMicrotask(() {\n        PaintingBinding.instance.imageCache.evict(key);\n      });\n      Log.error(\"Image Loading\", e, s);\n      rethrow;\n    } finally {\n      chunkEvents.close();\n    }\n  }\n\n  Future<Uint8List> load(\n    StreamController<ImageChunkEvent> chunkEvents,\n    void Function() checkStop,\n  );\n\n  String get key;\n\n  @override\n  bool operator ==(Object other) {\n    return other is BaseImageProvider<T> && key == other.key;\n  }\n\n  @override\n  int get hashCode => key.hashCode;\n\n  @override\n  String toString() {\n    return \"$runtimeType($key)\";\n  }\n\n  bool get enableResize => false;\n}\n\ntypedef FileDecoderCallback = Future<ui.Codec> Function(Uint8List);\n\nclass _ImageLoadingStopException implements Exception {\n  const _ImageLoadingStopException();\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/cached_image.dart",
    "content": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/network/images.dart';\nimport 'package:venera/utils/io.dart';\nimport 'base_image_provider.dart';\nimport 'cached_image.dart' as image_provider;\n\nclass CachedImageProvider\n    extends BaseImageProvider<image_provider.CachedImageProvider> {\n  /// Image provider for normal image.\n  ///\n  /// [url] is the url of the image. Local file path is also supported.\n  const CachedImageProvider(this.url, {\n    this.headers,\n    this.sourceKey,\n    this.cid,\n    this.fallbackToLocalCover = false,\n  });\n\n  final String url;\n\n  final Map<String, String>? headers;\n\n  final String? sourceKey;\n\n  final String? cid;\n\n  // Use local cover if network image fails to load.\n  final bool fallbackToLocalCover;\n\n  static int loadingCount = 0;\n\n  static const _kMaxLoadingCount = 8;\n\n  @override\n  Future<Uint8List> load(chunkEvents, checkStop) async {\n    while(loadingCount > _kMaxLoadingCount) {\n      await Future.delayed(const Duration(milliseconds: 100));\n      checkStop();\n    }\n    loadingCount++;\n    try {\n      if(url.startsWith(\"file://\")) {\n        var file = File(url.substring(7));\n        return file.readAsBytes();\n      }\n      await for (var progress in ImageDownloader.loadThumbnail(url, sourceKey, cid)) {\n        checkStop();\n        chunkEvents.add(ImageChunkEvent(\n          cumulativeBytesLoaded: progress.currentBytes,\n          expectedTotalBytes: progress.totalBytes,\n        ));\n        if(progress.imageBytes != null) {\n          return progress.imageBytes!;\n        }\n      }\n      throw \"Error: Empty response body.\";\n    }\n    catch(e) {\n      if (fallbackToLocalCover && sourceKey != null && cid != null) {\n        final localComic = LocalManager().find(\n          cid!,\n          ComicType.fromKey(sourceKey!),\n        );\n        if (localComic != null) {\n          var file = localComic.coverFile;\n          if (await file.exists()) {\n            var data = await file.readAsBytes();\n            if (data.isNotEmpty) {\n              return data;\n            }\n          }\n        }\n      }\n      rethrow;\n    }\n    finally {\n      loadingCount--;\n    }\n  }\n\n  @override\n  Future<CachedImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key => url + (sourceKey ?? \"\") + (cid ?? \"\");\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/history_image_provider.dart",
    "content": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/network/images.dart';\nimport '../history.dart';\nimport 'base_image_provider.dart';\nimport 'history_image_provider.dart' as image_provider;\n\nclass HistoryImageProvider\n    extends BaseImageProvider<image_provider.HistoryImageProvider> {\n  /// Image provider for normal image.\n  ///\n  /// [url] is the url of the image. Local file path is also supported.\n  const HistoryImageProvider(this.history);\n\n  final History history;\n\n  @override\n  Future<Uint8List> load(chunkEvents, checkStop) async {\n    var url = history.cover;\n    if (!url.contains('/')) {\n      var localComic = LocalManager().find(history.id, history.type);\n      if (localComic != null) {\n        return localComic.coverFile.readAsBytes();\n      }\n      var comicSource =\n          history.type.comicSource ?? (throw \"Comic source not found.\");\n      var comic = await comicSource.loadComicInfo!(history.id);\n      checkStop();\n      url = comic.data.cover;\n      history.cover = url;\n      HistoryManager().addHistory(history);\n    }\n    await for (var progress in ImageDownloader.loadThumbnail(\n      url,\n      history.type.sourceKey,\n      history.id,\n    )) {\n      checkStop();\n      chunkEvents.add(ImageChunkEvent(\n        cumulativeBytesLoaded: progress.currentBytes,\n        expectedTotalBytes: progress.totalBytes,\n      ));\n      if (progress.imageBytes != null) {\n        return progress.imageBytes!;\n      }\n    }\n    throw \"Error: Empty response body.\";\n  }\n\n  @override\n  Future<HistoryImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key => \"history${history.id}${history.type.value}\";\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/image_favorites_provider.dart",
    "content": "import 'dart:async' show Future, StreamController;\nimport 'package:crypto/crypto.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/network/images.dart';\nimport 'package:venera/utils/io.dart';\nimport '../history.dart';\nimport 'base_image_provider.dart';\nimport 'image_favorites_provider.dart' as image_provider;\n\nclass ImageFavoritesProvider\n    extends BaseImageProvider<image_provider.ImageFavoritesProvider> {\n  /// Image provider for imageFavorites\n  const ImageFavoritesProvider(this.imageFavorite);\n\n  final ImageFavorite imageFavorite;\n\n  int get page => imageFavorite.page;\n\n  String get sourceKey => imageFavorite.sourceKey;\n\n  String get cid => imageFavorite.id;\n\n  String get eid => imageFavorite.eid;\n\n  @override\n  Future<Uint8List> load(\n    StreamController<ImageChunkEvent>? chunkEvents,\n    void Function()? checkStop,\n  ) async {\n    var imageKey = imageFavorite.imageKey;\n    var localImage = await getImageFromLocal();\n    checkStop?.call();\n    if (localImage != null) {\n      return localImage;\n    }\n    var cacheImage = await readFromCache();\n    checkStop?.call();\n    if (cacheImage != null) {\n      return cacheImage;\n    }\n    var gotImageKey = false;\n    if (imageKey == \"\") {\n      imageKey = await getImageKey();\n      checkStop?.call();\n      gotImageKey = true;\n    }\n    Uint8List image;\n    try {\n      image = await getImageFromNetwork(imageKey, chunkEvents, checkStop);\n    } catch (e) {\n      if (gotImageKey) {\n        rethrow;\n      } else {\n        imageKey = await getImageKey();\n        image = await getImageFromNetwork(imageKey, chunkEvents, checkStop);\n      }\n    }\n    await writeToCache(image);\n    return image;\n  }\n\n  Future<void> writeToCache(Uint8List image) async {\n    var fileName = md5.convert(key.codeUnits).toString();\n    var file = File(FilePath.join(App.cachePath, 'image_favorites', fileName));\n    if (!file.existsSync()) {\n      file.createSync(recursive: true);\n    }\n    await file.writeAsBytes(image);\n  }\n\n  Future<Uint8List?> readFromCache() async {\n    var fileName = md5.convert(key.codeUnits).toString();\n    var file = File(FilePath.join(App.cachePath, 'image_favorites', fileName));\n    if (!file.existsSync()) {\n      return null;\n    }\n    return await file.readAsBytes();\n  }\n\n  /// Delete a image favorite cache\n  static Future<void> deleteFromCache(ImageFavorite imageFavorite) async {\n    var fileName = md5.convert(imageFavorite.imageKey.codeUnits).toString();\n    var file = File(FilePath.join(App.cachePath, 'image_favorites', fileName));\n    if (file.existsSync()) {\n      await file.delete();\n    }\n  }\n\n  Future<Uint8List?> getImageFromLocal() async {\n    var localComic =\n        LocalManager().find(sourceKey, ComicType.fromKey(sourceKey));\n    if (localComic == null) {\n      return null;\n    }\n    var epIndex = localComic.chapters?.ids.toList().indexOf(eid) ?? -1;\n    if (epIndex == -1 && localComic.hasChapters) {\n      return null;\n    }\n    var images = await LocalManager().getImages(\n      sourceKey,\n      ComicType.fromKey(sourceKey),\n      epIndex,\n    );\n    var data = await File(images[page]).readAsBytes();\n    return data;\n  }\n\n  Future<Uint8List> getImageFromNetwork(\n    String imageKey,\n    StreamController<ImageChunkEvent>? chunkEvents,\n    void Function()? checkStop,\n  ) async {\n    await for (var progress\n        in ImageDownloader.loadComicImage(imageKey, sourceKey, cid, eid)) {\n      checkStop?.call();\n      if (chunkEvents != null) {\n        chunkEvents.add(ImageChunkEvent(\n          cumulativeBytesLoaded: progress.currentBytes,\n          expectedTotalBytes: progress.totalBytes,\n        ));\n      }\n      if (progress.imageBytes != null) {\n        return progress.imageBytes!;\n      }\n    }\n    throw \"Error: Empty response body.\";\n  }\n\n  Future<String> getImageKey() async {\n    String sourceKey = imageFavorite.sourceKey;\n    String cid = imageFavorite.id;\n    String eid = imageFavorite.eid;\n    var page = imageFavorite.page;\n    var comicSource = ComicSource.find(sourceKey);\n    if (comicSource == null) {\n      throw \"Error: Comic source not found.\";\n    }\n    var res = await comicSource.loadComicPages!(cid, eid);\n    return res.data[page - 1];\n  }\n\n  @override\n  Future<ImageFavoritesProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key =>\n      \"ImageFavorites ${imageFavorite.imageKey}@${imageFavorite.sourceKey}@${imageFavorite.id}@${imageFavorite.eid}\";\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/local_comic_image.dart",
    "content": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/utils/io.dart';\nimport 'base_image_provider.dart';\nimport 'local_comic_image.dart' as image_provider;\n\nclass LocalComicImageProvider\n    extends BaseImageProvider<image_provider.LocalComicImageProvider> {\n  /// Image provider for normal image.\n  ///\n  /// [url] is the url of the image. Local file path is also supported.\n  const LocalComicImageProvider(this.comic);\n\n  final LocalComic comic;\n\n  @override\n  Future<Uint8List> load(chunkEvents, checkStop) async {\n    File? file = comic.coverFile;\n    if(! await file.exists()) {\n      file = null;\n      var dir = Directory(comic.directory);\n      if (! await dir.exists()) {\n        throw \"Error: Comic not found.\";\n      }\n      Directory? firstDir;\n      await for (var entity in dir.list()) {\n        if(entity is File) {\n          if([\"jpg\", \"jpeg\", \"png\", \"webp\", \"gif\", \"jpe\", \"jpeg\"].contains(entity.extension)) {\n            file = entity;\n            break;\n          }\n        } else if(entity is Directory) {\n          firstDir ??= entity;\n        }\n      }\n      if(file == null && firstDir != null) {\n        await for (var entity in firstDir.list()) {\n          if(entity is File) {\n            if([\"jpg\", \"jpeg\", \"png\", \"webp\", \"gif\", \"jpe\", \"jpeg\"].contains(entity.extension)) {\n              file = entity;\n              break;\n            }\n          }\n        }\n      }\n    }\n    if(file == null) {\n      throw \"Error: Cover not found.\";\n    }\n    checkStop();\n    var data = await file.readAsBytes();\n    if(data.isEmpty) {\n      throw \"Exception: Empty file(${file.path}).\";\n    }\n    return data;\n  }\n\n  @override\n  Future<LocalComicImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key => \"local${comic.id}${comic.comicType.value}\";\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/local_favorite_image.dart",
    "content": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/network/images.dart';\nimport 'package:venera/utils/io.dart';\nimport 'base_image_provider.dart';\nimport 'local_favorite_image.dart' as image_provider;\n\nclass LocalFavoriteImageProvider\n    extends BaseImageProvider<image_provider.LocalFavoriteImageProvider> {\n  /// Image provider for normal image.\n  const LocalFavoriteImageProvider(this.url, this.id, this.intKey);\n\n  final String url;\n\n  final String id;\n\n  final int intKey;\n\n  static void delete(String id, int intKey) {\n    var fileName = (id + intKey.toString()).hashCode.toString();\n    var file = File(FilePath.join(App.dataPath, 'favorite_cover', fileName));\n    if (file.existsSync()) {\n      file.delete();\n    }\n  }\n\n  @override\n  Future<Uint8List> load(chunkEvents, checkStop) async {\n    var sourceKey = ComicSource.fromIntKey(intKey)?.key;\n    var fileName = key.hashCode.toString();\n    var file = File(FilePath.join(App.dataPath, 'favorite_cover', fileName));\n    if (await file.exists()) {\n      return await file.readAsBytes();\n    } else {\n      await file.create(recursive: true);\n    }\n    checkStop();\n    await for (var progress in ImageDownloader.loadThumbnail(url, sourceKey)) {\n      checkStop();\n      chunkEvents.add(ImageChunkEvent(\n        cumulativeBytesLoaded: progress.currentBytes,\n        expectedTotalBytes: progress.totalBytes,\n      ));\n      if (progress.imageBytes != null) {\n        var data = progress.imageBytes!;\n        await file.writeAsBytes(data);\n        return data;\n      }\n    }\n    throw \"Error: Empty response body.\";\n  }\n\n  @override\n  Future<LocalFavoriteImageProvider> obtainKey(\n      ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key => id + intKey.toString();\n}\n"
  },
  {
    "path": "lib/foundation/image_provider/reader_image.dart",
    "content": "import 'dart:async' show Future;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:venera/foundation/js_engine.dart';\nimport 'package:venera/network/images.dart';\nimport 'package:venera/utils/io.dart';\nimport 'base_image_provider.dart';\nimport 'reader_image.dart' as image_provider;\nimport 'package:venera/foundation/appdata.dart';\n\nclass ReaderImageProvider\n    extends BaseImageProvider<image_provider.ReaderImageProvider> {\n  /// Image provider for normal image.\n  const ReaderImageProvider(this.imageKey, this.sourceKey, this.cid, this.eid, this.page, {this.enableResize = false});\n\n  final String imageKey;\n\n  final String? sourceKey;\n\n  final String cid;\n\n  final String eid;\n\n  final int page;\n\n  @override\n  final bool enableResize;\n\n  @override\n  Future<Uint8List> load(chunkEvents, checkStop) async {\n    Uint8List? imageBytes;\n    if (imageKey.startsWith('file://')) {\n      var file = File(imageKey);\n      if (await file.exists()) {\n        imageBytes = await file.readAsBytes();\n      } else {\n        throw \"Error: File not found.\";\n      }\n    } else {\n      await for (var event\n        in ImageDownloader.loadComicImage(imageKey, sourceKey, cid, eid)) {\n        checkStop();\n        chunkEvents.add(ImageChunkEvent(\n          cumulativeBytesLoaded: event.currentBytes,\n          expectedTotalBytes: event.totalBytes,\n        ));\n        if (event.imageBytes != null) {\n          imageBytes = event.imageBytes;\n          break;\n        }\n      }\n    }\n    if (imageBytes == null) {\n      throw \"Error: Empty response body.\";\n    }\n    if (appdata.settings['enableCustomImageProcessing']) {\n      var script = appdata.settings['customImageProcessing'].toString();\n      if (!script.contains('function processImage')) {\n        return imageBytes;\n      }\n      var func = JsEngine().runCode('''\n        (() => {\n          $script\n          return processImage;\n        })()\n      ''');\n      if (func is JSInvokable) {\n        var autoFreeFunc = JSAutoFreeFunction(func);\n        var result = autoFreeFunc([imageBytes, cid, eid, page, sourceKey]);\n        if (result is Uint8List) {\n          imageBytes = result;\n        } else if (result is Future) {\n          var futureResult = await result;\n          if (futureResult is Uint8List) {\n            imageBytes = futureResult;\n          }\n        } else if (result is Map) {\n          var image = result['image'];\n          if (image is Uint8List) {\n            imageBytes = image;\n          } else if (image is Future) {\n            JSAutoFreeFunction? onCancel;\n            if (result['onCancel'] is JSInvokable) {\n              onCancel = JSAutoFreeFunction(result['onCancel']);\n            }\n            if (onCancel == null) {\n              var futureImage = await image;\n              if (futureImage is Uint8List) {\n                imageBytes = futureImage;\n              }\n            } else {\n              dynamic futureImage;\n              image.then((value) {\n                futureImage = value;\n                futureImage ??= Uint8List(0);\n              });\n              while (futureImage == null) {\n                try {\n                  checkStop();\n                }\n                catch(e) {\n                  onCancel([]);\n                  rethrow;\n                }\n                await Future.delayed(Duration(milliseconds: 50));\n              }\n              if (futureImage is Uint8List) {\n                imageBytes = futureImage;\n              }\n            }\n          }\n        }\n      }\n    }\n    return imageBytes!;\n  }\n\n  @override\n  Future<ReaderImageProvider> obtainKey(ImageConfiguration configuration) {\n    return SynchronousFuture(this);\n  }\n\n  @override\n  String get key => \"$imageKey@$sourceKey@$cid@$eid@$enableResize\";\n}\n"
  },
  {
    "path": "lib/foundation/js_engine.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:math' as math;\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/io.dart';\nimport 'package:enough_convert/enough_convert.dart';\nimport 'package:flutter/foundation.dart' show protected;\nimport 'package:flutter/services.dart';\nimport 'package:html/parser.dart' as html;\nimport 'package:html/dom.dart' as dom;\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:pointycastle/api.dart';\nimport 'package:pointycastle/asn1/asn1_parser.dart';\nimport 'package:pointycastle/asn1/primitives/asn1_integer.dart';\nimport 'package:pointycastle/asn1/primitives/asn1_sequence.dart';\nimport 'package:pointycastle/asymmetric/api.dart';\nimport 'package:pointycastle/asymmetric/pkcs1.dart';\nimport 'package:pointycastle/asymmetric/rsa.dart';\nimport 'package:pointycastle/block/aes.dart';\nimport 'package:pointycastle/block/modes/cbc.dart';\nimport 'package:pointycastle/block/modes/cfb.dart';\nimport 'package:pointycastle/block/modes/ecb.dart';\nimport 'package:pointycastle/block/modes/ofb.dart';\nimport 'package:uuid/uuid.dart';\nimport 'package:venera/components/js_ui.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/js_pool.dart';\nimport 'package:venera/network/app_dio.dart';\nimport 'package:venera/network/cookie_jar.dart';\nimport 'package:venera/network/proxy.dart';\nimport 'package:venera/utils/init.dart';\n\nimport 'comic_source/comic_source.dart';\nimport 'consts.dart';\nimport 'log.dart';\n\nclass JavaScriptRuntimeException implements Exception {\n  final String message;\n\n  JavaScriptRuntimeException(this.message);\n\n  @override\n  String toString() {\n    return \"JSException: $message\";\n  }\n}\n\nclass JsEngine with _JSEngineApi, JsUiApi, Init {\n  factory JsEngine() => _cache ?? (_cache = JsEngine._create());\n\n  static JsEngine? _cache;\n\n  JsEngine._create();\n\n  FlutterQjs? _engine;\n\n  bool _closed = true;\n\n  Dio? _dio;\n\n  static void reset() {\n    _cache = null;\n    _cache?.dispose();\n    JsEngine().init();\n  }\n\n  void resetDio() {\n    _dio = AppDio(BaseOptions(\n        responseType: ResponseType.plain, validateStatus: (status) => true));\n  }\n\n  static Uint8List? _jsInitCache;\n\n  static void cacheJsInit(Uint8List jsInit) {\n    _jsInitCache = jsInit;\n  }\n\n  @override\n  @protected\n  Future<void> doInit() async {\n    if (!_closed) {\n      return;\n    }\n    try {\n      if (App.isInitialized) {\n        _cookieJar ??= await SingleInstanceCookieJar.createInstance();\n      }\n      _dio ??= AppDio(BaseOptions(\n          responseType: ResponseType.plain, validateStatus: (status) => true));\n      _closed = false;\n      _engine = FlutterQjs();\n      _engine!.dispatch();\n      var setGlobalFunc =\n          _engine!.evaluate(\"(key, value) => { this[key] = value; }\");\n      (setGlobalFunc as JSInvokable)([\"sendMessage\", _messageReceiver]);\n      setGlobalFunc([\"appVersion\", App.version]);\n      setGlobalFunc.free();\n      Uint8List jsInit;\n      if (_jsInitCache != null) {\n        jsInit = _jsInitCache!;\n      } else {\n        var buffer = await rootBundle.load(\"assets/init.js\");\n        jsInit = buffer.buffer.asUint8List();\n      }\n      _engine!\n          .evaluate(utf8.decode(jsInit), name: \"<init>\");\n    } catch (e, s) {\n      Log.error('JS Engine', 'JS Engine Init Error:\\n$e\\n$s');\n    }\n  }\n\n  Object? _messageReceiver(dynamic message) {\n    try {\n      if (message is Map<dynamic, dynamic>) {\n        if (message[\"method\"] == null) return null;\n        String method = message[\"method\"] as String;\n        switch (method) {\n          case \"log\":\n            String level = message[\"level\"];\n            Log.addLog(\n                switch (level) {\n                  \"error\" => LogLevel.error,\n                  \"warning\" => LogLevel.warning,\n                  \"info\" => LogLevel.info,\n                  _ => LogLevel.warning\n                },\n                message[\"title\"],\n                message[\"content\"].toString());\n          case 'load_data':\n            String key = message[\"key\"];\n            String dataKey = message[\"data_key\"];\n            return ComicSource.find(key)?.data[dataKey];\n          case 'save_data':\n            String key = message[\"key\"];\n            String dataKey = message[\"data_key\"];\n            if (dataKey == 'setting') {\n              throw \"setting is not allowed to be saved\";\n            }\n            var data = message[\"data\"];\n            var source = ComicSource.find(key)!;\n            source.data[dataKey] = data;\n            source.saveData();\n          case 'delete_data':\n            String key = message[\"key\"];\n            String dataKey = message[\"data_key\"];\n            var source = ComicSource.find(key);\n            source?.data.remove(dataKey);\n            source?.saveData();\n          case 'http':\n            return _http(Map.from(message));\n          case 'html':\n            return handleHtmlCallback(Map.from(message));\n          case 'convert':\n            return _convert(Map.from(message));\n          case \"random\":\n            return _random(\n              message[\"min\"] ?? 0,\n              message[\"max\"] ?? 1,\n              message[\"type\"],\n            );\n          case \"cookie\":\n            return handleCookieCallback(Map.from(message));\n          case \"uuid\":\n            return const Uuid().v1();\n          case \"load_setting\":\n            String key = message[\"key\"];\n            String settingKey = message[\"setting_key\"];\n            var source = ComicSource.find(key)!;\n            return source.data[\"settings\"]?[settingKey] ??\n                source.settings?[settingKey]!['default'] ??\n                (throw \"Setting not found: $settingKey\");\n          case \"isLogged\":\n            return ComicSource.find(message[\"key\"])!.isLogged;\n          // temporary solution for [setTimeout] function\n          // TODO: implement [setTimeout] in quickjs project\n          case \"delay\":\n            return Future.delayed(Duration(milliseconds: message[\"time\"]));\n          case \"UI\":\n            return handleUIMessage(Map.from(message));\n          case \"getLocale\":\n            return \"${App.locale.languageCode}_${App.locale.countryCode}\";\n          case \"getPlatform\":\n            return Platform.operatingSystem;\n          case \"setClipboard\":\n            return Clipboard.setData(ClipboardData(text: message[\"text\"]));\n          case \"getClipboard\":\n            return Future.sync(() async {\n              var res = await Clipboard.getData(Clipboard.kTextPlain);\n              return res?.text;\n            });\n          case \"compute\":\n            final func = message[\"function\"];\n            final args = message[\"args\"];\n            if (func is JSInvokable) {\n              func.free();\n              throw \"Function must be a string\";\n            }\n            if (func is! String) {\n              throw \"Function must be a string\";\n            }\n            if (args != null && args is! List) {\n              throw \"Args must be a list\";\n            }\n            return JSPool().execute(func, args ?? []);\n        }\n      }\n      return null;\n    } catch (e, s) {\n      Log.error(\"Failed to handle message: $message\\n$e\\n$s\", \"JsEngine\");\n      rethrow;\n    }\n  }\n\n  Future<Map<String, dynamic>> _http(Map<String, dynamic> req) async {\n    Response? response;\n    String? error;\n\n    try {\n      var headers = Map<String, dynamic>.from(req[\"headers\"] ?? {});\n      var extra = Map<String, dynamic>.from(req[\"extra\"] ?? {});\n      if (headers[\"user-agent\"] == null && headers[\"User-Agent\"] == null) {\n        headers[\"User-Agent\"] = webUA;\n      }\n      var dio = _dio;\n      if (headers['http_client'] == \"dart:io\") {\n        dio = Dio(BaseOptions(\n          responseType: ResponseType.plain,\n          validateStatus: (status) => true,\n        ));\n        var proxy = await getProxy();\n        dio.httpClientAdapter = IOHttpClientAdapter(\n          createHttpClient: () {\n            return HttpClient()\n              ..findProxy = (uri) => proxy == null ? \"DIRECT\" : \"PROXY $proxy\";\n          },\n        );\n        dio.interceptors\n            .add(CookieManagerSql(SingleInstanceCookieJar.instance!));\n        dio.interceptors.add(LogInterceptor());\n      }\n      response = await dio!.request(req[\"url\"],\n          data: req[\"data\"],\n          options: Options(\n              method: req['http_method'],\n              responseType: req[\"bytes\"] == true\n                  ? ResponseType.bytes\n                  : ResponseType.plain,\n              headers: headers,\n              extra: extra,\n          )\n      );\n    } catch (e) {\n      error = e.toString();\n    }\n\n    Map<String, String> headers = {};\n\n    response?.headers\n        .forEach((name, values) => headers[name] = values.join(','));\n\n    dynamic body = response?.data;\n    if (body is! Uint8List && body is List<int>) {\n      body = Uint8List.fromList(body);\n    }\n\n    return {\n      \"status\": response?.statusCode,\n      \"headers\": headers,\n      \"body\": body,\n      \"error\": error,\n    };\n  }\n\n  dynamic runCode(String js, [String? name]) {\n    return _engine!.evaluate(js, name: name);\n  }\n\n  void dispose() {\n    _cache = null;\n    _closed = true;\n    _engine?.close();\n    _engine?.port.close();\n  }\n}\n\nmixin class _JSEngineApi {\n  CookieJarSql? _cookieJar;\n\n  final _documents = <int, DocumentWrapper>{};\n\n  Object? handleHtmlCallback(Map<String, dynamic> data) {\n    switch (data[\"function\"]) {\n      case \"parse\":\n        if (_documents.length > 8) {\n          var shouldDelete = _documents.keys.first;\n          Log.warning(\n            \"JS Engine\",\n            \"Too many documents, deleting the oldest: $shouldDelete\\n\"\n                \"Current documents: ${_documents.keys}\",\n          );\n          _documents.remove(shouldDelete);\n        }\n        _documents[data[\"key\"]] = DocumentWrapper.parse(data[\"data\"]);\n        return null;\n      case \"querySelector\":\n        var key = data[\"key\"];\n        return _documents[key]!.querySelector(data[\"query\"]);\n      case \"querySelectorAll\":\n        var key = data[\"key\"];\n        return _documents[key]!.querySelectorAll(data[\"query\"]);\n      case \"getText\":\n        return _documents[data[\"doc\"]]!.elementGetText(data[\"key\"]);\n      case \"getAttributes\":\n        var res = _documents[data[\"doc\"]]!.elementGetAttributes(data[\"key\"]);\n        return res;\n      case \"dom_querySelector\":\n        var doc = _documents[data[\"doc\"]]!;\n        return doc.elementQuerySelector(data[\"key\"], data[\"query\"]);\n      case \"dom_querySelectorAll\":\n        var doc = _documents[data[\"doc\"]]!;\n        return doc.elementQuerySelectorAll(data[\"key\"], data[\"query\"]);\n      case \"getChildren\":\n        var doc = _documents[data[\"doc\"]]!;\n        return doc.elementGetChildren(data[\"key\"]);\n      case \"getNodes\":\n        var doc = _documents[data[\"doc\"]]!;\n        return doc.elementGetNodes(data[\"key\"]);\n      case \"getInnerHTML\":\n        var doc = _documents[data[\"doc\"]]!;\n        return doc.elementGetInnerHTML(data[\"key\"]);\n      case \"getParent\":\n        var doc = _documents[data[\"doc\"]]!;\n        return doc.elementGetParent(data[\"key\"]);\n      case \"node_text\":\n        return _documents[data[\"doc\"]]!.nodeGetText(data[\"key\"]);\n      case \"node_type\":\n        return _documents[data[\"doc\"]]!.nodeType(data[\"key\"]);\n      case \"node_to_element\":\n        return _documents[data[\"doc\"]]!.nodeToElement(data[\"key\"]);\n      case \"dispose\":\n        var docKey = data[\"key\"];\n        _documents.remove(docKey);\n        return null;\n      case \"getClassNames\":\n        return _documents[data[\"doc\"]]!.getClassNames(data[\"key\"]);\n      case \"getId\":\n        return _documents[data[\"doc\"]]!.getId(data[\"key\"]);\n      case \"getLocalName\":\n        return _documents[data[\"doc\"]]!.getLocalName(data[\"key\"]);\n      case \"getElementById\":\n        return _documents[data[\"key\"]]!.getElementById(data[\"id\"]);\n      case \"getPreviousSibling\":\n        return _documents[data[\"doc\"]]!.getPreviousSibling(data[\"key\"]);\n      case \"getNextSibling\":\n        return _documents[data[\"doc\"]]!.getNextSibling(data[\"key\"]);\n    }\n    return null;\n  }\n\n  dynamic handleCookieCallback(Map<String, dynamic> data) {\n    switch (data[\"function\"]) {\n      case \"set\":\n        _cookieJar!.saveFromResponse(\n            Uri.parse(data[\"url\"]),\n            (data[\"cookies\"] as List).map((e) {\n              var c = Cookie(e[\"name\"], e[\"value\"]);\n              if (e['domain'] != null) {\n                c.domain = e['domain'];\n              }\n              return c;\n            }).toList());\n        return null;\n      case \"get\":\n        var cookies = _cookieJar!.loadForRequest(Uri.parse(data[\"url\"]));\n        return cookies\n            .map((e) => {\n                  \"name\": e.name,\n                  \"value\": e.value,\n                  \"domain\": e.domain,\n                  \"path\": e.path,\n                  \"expires\": e.expires,\n                  \"max-age\": e.maxAge,\n                  \"secure\": e.secure,\n                  \"httpOnly\": e.httpOnly,\n                  \"session\": e.expires == null,\n                })\n            .toList();\n      case \"delete\":\n        clearCookies([data[\"url\"]]);\n        return null;\n    }\n  }\n\n  void clearCookies(List<String> domains) async {\n    for (var domain in domains) {\n      var uri = Uri.tryParse(domain);\n      if (uri == null) continue;\n      _cookieJar!.deleteUri(uri);\n    }\n  }\n\n  Object? _convert(Map<String, dynamic> data) {\n    String type = data[\"type\"];\n    var value = data[\"value\"];\n    bool isEncode = data[\"isEncode\"];\n    try {\n      switch (type) {\n        case \"utf8\":\n          return isEncode ? utf8.encode(value) : utf8.decode(value);\n        case \"gbk\":\n          final codec = const GbkCodec();\n          return isEncode\n              ? Uint8List.fromList(codec.encode(value))\n              : codec.decode(value);\n        case \"base64\":\n          return isEncode ? base64Encode(value) : base64Decode(value);\n        case \"md5\":\n          return Uint8List.fromList(md5.convert(value).bytes);\n        case \"sha1\":\n          return Uint8List.fromList(sha1.convert(value).bytes);\n        case \"sha256\":\n          return Uint8List.fromList(sha256.convert(value).bytes);\n        case \"sha512\":\n          return Uint8List.fromList(sha512.convert(value).bytes);\n        case \"hmac\":\n          var key = data[\"key\"];\n          var hash = data[\"hash\"];\n          var hmac = Hmac(\n              switch (hash) {\n                \"md5\" => md5,\n                \"sha1\" => sha1,\n                \"sha256\" => sha256,\n                \"sha512\" => sha512,\n                _ => throw \"Unsupported hash: $hash\"\n              },\n              key);\n          if (data['isString'] == true) {\n            return hmac.convert(value).toString();\n          } else {\n            return Uint8List.fromList(hmac.convert(value).bytes);\n          }\n        case \"aes-ecb\":\n          var key = data[\"key\"];\n          var cipher = ECBBlockCipher(AESEngine());\n          cipher.init(\n            isEncode,\n            KeyParameter(key),\n          );\n          var offset = 0;\n          var result = Uint8List(value.length);\n          while (offset < value.length) {\n            offset += cipher.processBlock(\n              value,\n              offset,\n              result,\n              offset,\n            );\n          }\n          return result;\n        case \"aes-cbc\":\n          var key = data[\"key\"];\n          var iv = data[\"iv\"];\n          var cipher = CBCBlockCipher(AESEngine());\n          cipher.init(isEncode, ParametersWithIV(KeyParameter(key), iv));\n          var offset = 0;\n          var result = Uint8List(value.length);\n          while (offset < value.length) {\n            offset += cipher.processBlock(\n              value,\n              offset,\n              result,\n              offset,\n            );\n          }\n          return result;\n        case \"aes-cfb\":\n          var key = data[\"key\"];\n          var iv = data[\"iv\"];\n          var blockSize = data[\"blockSize\"];\n          var cipher = CFBBlockCipher(AESEngine(), blockSize);\n          cipher.init(isEncode, ParametersWithIV(KeyParameter(key), iv));\n          var offset = 0;\n          var result = Uint8List(value.length);\n          while (offset < value.length) {\n            offset += cipher.processBlock(\n              value,\n              offset,\n              result,\n              offset,\n            );\n          }\n          return result;\n        case \"aes-ofb\":\n          var key = data[\"key\"];\n          var blockSize = data[\"blockSize\"];\n          var cipher = OFBBlockCipher(AESEngine(), blockSize);\n          cipher.init(isEncode, KeyParameter(key));\n          var offset = 0;\n          var result = Uint8List(value.length);\n          while (offset < value.length) {\n            offset += cipher.processBlock(\n              value,\n              offset,\n              result,\n              offset,\n            );\n          }\n          return result;\n        case \"rsa\":\n          if (!isEncode) {\n            var key = data[\"key\"];\n            final cipher = PKCS1Encoding(RSAEngine());\n            cipher.init(false,\n                PrivateKeyParameter<RSAPrivateKey>(_parsePrivateKey(key)));\n            return _processInBlocks(cipher, value);\n          }\n          return null;\n        default:\n          return value;\n      }\n    } catch (e, s) {\n      Log.error(\"JS Engine\", \"Failed to convert $type: $e\", s);\n      return null;\n    }\n  }\n\n  RSAPrivateKey _parsePrivateKey(String privateKeyString) {\n    List<int> privateKeyDER = base64Decode(privateKeyString);\n    var asn1Parser = ASN1Parser(privateKeyDER as Uint8List);\n    final topLevelSeq = asn1Parser.nextObject() as ASN1Sequence;\n    final privateKey = topLevelSeq.elements![2];\n\n    asn1Parser = ASN1Parser(privateKey.valueBytes!);\n    final pkSeq = asn1Parser.nextObject() as ASN1Sequence;\n\n    final modulus = pkSeq.elements![1] as ASN1Integer;\n    final privateExponent = pkSeq.elements![3] as ASN1Integer;\n    final p = pkSeq.elements![4] as ASN1Integer;\n    final q = pkSeq.elements![5] as ASN1Integer;\n\n    return RSAPrivateKey(\n        modulus.integer!, privateExponent.integer!, p.integer!, q.integer!);\n  }\n\n  Uint8List _processInBlocks(AsymmetricBlockCipher engine, Uint8List input) {\n    final numBlocks = input.length ~/ engine.inputBlockSize +\n        ((input.length % engine.inputBlockSize != 0) ? 1 : 0);\n\n    final output = Uint8List(numBlocks * engine.outputBlockSize);\n\n    var inputOffset = 0;\n    var outputOffset = 0;\n    while (inputOffset < input.length) {\n      final chunkSize = (inputOffset + engine.inputBlockSize <= input.length)\n          ? engine.inputBlockSize\n          : input.length - inputOffset;\n\n      outputOffset += engine.processBlock(\n          input, inputOffset, chunkSize, output, outputOffset);\n\n      inputOffset += chunkSize;\n    }\n\n    return (output.length == outputOffset)\n        ? output\n        : output.sublist(0, outputOffset);\n  }\n\n  num _random(num min, num max, String type) {\n    if (type == \"double\") {\n      return min + (max - min) * math.Random().nextDouble();\n    }\n    return (min + (max - min) * math.Random().nextDouble()).toInt();\n  }\n}\n\nclass DocumentWrapper {\n  final dom.Document doc;\n\n  DocumentWrapper.parse(String doc) : doc = html.parse(doc);\n\n  var elements = <dom.Element>[];\n\n  var nodes = <dom.Node>[];\n\n  int? querySelector(String query) {\n    var element = doc.querySelector(query);\n    if (element == null) return null;\n    elements.add(element);\n    return elements.length - 1;\n  }\n\n  List<int> querySelectorAll(String query) {\n    var res = doc.querySelectorAll(query);\n    var keys = <int>[];\n    for (var element in res) {\n      elements.add(element);\n      keys.add(elements.length - 1);\n    }\n    return keys;\n  }\n\n  String? elementGetText(int key) {\n    return elements[key].text;\n  }\n\n  Map<String, String> elementGetAttributes(int key) {\n    return elements[key].attributes.map(\n          (key, value) => MapEntry(\n            key.toString(),\n            value,\n          ),\n        );\n  }\n\n  String? elementGetInnerHTML(int key) {\n    return elements[key].innerHtml;\n  }\n\n  int? elementGetParent(int key) {\n    var res = elements[key].parent;\n    if (res == null) return null;\n    elements.add(res);\n    return elements.length - 1;\n  }\n\n  int? elementQuerySelector(int key, String query) {\n    var res = elements[key].querySelector(query);\n    if (res == null) return null;\n    elements.add(res);\n    return elements.length - 1;\n  }\n\n  List<int> elementQuerySelectorAll(int key, String query) {\n    var res = elements[key].querySelectorAll(query);\n    var keys = <int>[];\n    for (var element in res) {\n      elements.add(element);\n      keys.add(elements.length - 1);\n    }\n    return keys;\n  }\n\n  List<int> elementGetChildren(int key) {\n    var res = elements[key].children;\n    var keys = <int>[];\n    for (var element in res) {\n      elements.add(element);\n      keys.add(elements.length - 1);\n    }\n    return keys;\n  }\n\n  List<int> elementGetNodes(int key) {\n    var res = elements[key].nodes;\n    var keys = <int>[];\n    for (var node in res) {\n      nodes.add(node);\n      keys.add(nodes.length - 1);\n    }\n    return keys;\n  }\n\n  String? nodeGetText(int key) {\n    return nodes[key].text;\n  }\n\n  String nodeType(int key) {\n    return switch (nodes[key].nodeType) {\n      dom.Node.ELEMENT_NODE => \"element\",\n      dom.Node.TEXT_NODE => \"text\",\n      dom.Node.COMMENT_NODE => \"comment\",\n      dom.Node.DOCUMENT_NODE => \"document\",\n      _ => \"unknown\"\n    };\n  }\n\n  int? nodeToElement(int key) {\n    if (nodes[key] is dom.Element) {\n      elements.add(nodes[key] as dom.Element);\n      return elements.length - 1;\n    }\n    return null;\n  }\n\n  List<String> getClassNames(int key) {\n    return (elements[key]).classes.toList();\n  }\n\n  String? getId(int key) {\n    return (elements[key]).id;\n  }\n\n  String? getLocalName(int key) {\n    return (elements[key]).localName;\n  }\n\n  int? getElementById(String id) {\n    var element = doc.getElementById(id);\n    if (element == null) return null;\n    elements.add(element);\n    return elements.length - 1;\n  }\n\n  int? getPreviousSibling(int key) {\n    var res = elements[key].previousElementSibling;\n    if (res == null) return null;\n    elements.add(res);\n    return elements.length - 1;\n  }\n\n  int? getNextSibling(int key) {\n    var res = elements[key].nextElementSibling;\n    if (res == null) return null;\n    elements.add(res);\n    return elements.length - 1;\n  }\n}\n\nclass JSAutoFreeFunction {\n  final JSInvokable func;\n\n  /// Automatically free the function when it's not used anymore\n  JSAutoFreeFunction(this.func) {\n    func.dup();\n    finalizer.attach(this, func);\n  }\n\n  dynamic call(List<dynamic> args) {\n    return func(args);\n  }\n\n  static final finalizer = Finalizer<JSInvokable>((func) {\n    func.destroy();\n  });\n}\n"
  },
  {
    "path": "lib/foundation/js_pool.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:venera/foundation/js_engine.dart';\nimport 'package:venera/foundation/log.dart';\n\nclass JSPool {\n  static final int _maxInstances = 4;\n  final List<IsolateJsEngine> _instances = [];\n  bool _isInitializing = false;\n\n  static final JSPool _singleton = JSPool._internal();\n  factory JSPool() {\n    return _singleton;\n  }\n  JSPool._internal();\n\n  Future<void> init() async {\n    if (_isInitializing) return;\n    _isInitializing = true;\n    var jsInitBuffer = await rootBundle.load(\"assets/init.js\");\n    var jsInit = jsInitBuffer.buffer.asUint8List();\n    for (int i = 0; i < _maxInstances; i++) {\n      _instances.add(IsolateJsEngine(jsInit));\n    }\n    _isInitializing = false;\n  }\n\n  Future<dynamic> execute(String jsFunction, List<dynamic> args) async {\n    await init();\n    var selectedInstance = _instances[0];\n    for (var instance in _instances) {\n      if (instance.pendingTasks < selectedInstance.pendingTasks) {\n        selectedInstance = instance;\n      }\n    }\n    return selectedInstance.execute(jsFunction, args);\n  }\n}\n\nclass _IsolateJsEngineInitParam {\n  final SendPort sendPort;\n\n  final Uint8List jsInit;\n\n  _IsolateJsEngineInitParam(this.sendPort, this.jsInit);\n}\n\nclass IsolateJsEngine {\n  Isolate? _isolate;\n\n  SendPort? _sendPort;\n  ReceivePort? _receivePort;\n\n  int _counter = 0;\n  final Map<int, Completer<dynamic>> _tasks = {};\n\n  bool _isClosed = false;\n\n  int get pendingTasks => _tasks.length;\n\n  IsolateJsEngine(Uint8List jsInit) {\n    _receivePort = ReceivePort();\n    _receivePort!.listen(_onMessage);\n    Isolate.spawn(_run, _IsolateJsEngineInitParam(_receivePort!.sendPort, jsInit));\n  }\n\n  void _onMessage(dynamic message) {\n    if (message is SendPort) {\n      _sendPort = message;\n    } else if (message is TaskResult) {\n      final completer = _tasks.remove(message.id);\n      if (completer != null) {\n        if (message.error != null) {\n          completer.completeError(message.error!);\n        } else {\n          completer.complete(message.result);\n        }\n      }\n    } else if (message is Exception) {\n      Log.error(\"IsolateJsEngine\", message.toString());\n      for (var completer in _tasks.values) {\n        completer.completeError(message);\n      }\n      _tasks.clear();\n      close();\n    }\n  }\n\n  static void _run(_IsolateJsEngineInitParam params) async {\n    var sendPort = params.sendPort;\n    final port = ReceivePort();\n    sendPort.send(port.sendPort);\n    final engine = JsEngine();\n    try {\n      JsEngine.cacheJsInit(params.jsInit);\n      await engine.init();\n    }\n    catch(e, s) {\n      sendPort.send(Exception(\"Failed to initialize JS engine: $e\\n$s\"));\n      return;\n    }\n    await for (final message in port) {\n      if (message is Task) {\n        try {\n          final jsFunc = engine.runCode(message.jsFunction);\n          if (jsFunc is! JSInvokable) {\n            throw Exception(\"The provided code does not evaluate to a function.\");\n          }\n          final result = jsFunc.invoke(message.args);\n          jsFunc.free();\n          sendPort.send(TaskResult(message.id, result, null));\n        } catch (e) {\n          sendPort.send(TaskResult(message.id, null, e.toString()));\n        }\n      }\n    }\n  }\n\n  Future<dynamic> execute(String jsFunction, List<dynamic> args) async {\n    if (_isClosed) {\n      throw Exception(\"IsolateJsEngine is closed.\");\n    }\n    while (_sendPort == null) {\n      await Future.delayed(const Duration(milliseconds: 10));\n    }\n    final completer = Completer<dynamic>();\n    final taskId = _counter++;\n    _tasks[taskId] = completer;\n    final task = Task(taskId, jsFunction, args);\n    _sendPort?.send(task);\n    return completer.future;\n  }\n\n  void close() async {\n    if (!_isClosed) {\n      _isClosed = true;\n      while (_tasks.isNotEmpty) {\n        await Future.delayed(const Duration(milliseconds: 100));\n      }\n      _receivePort?.close();\n      _isolate?.kill(priority: Isolate.immediate);\n      _isolate = null;\n    }\n  }\n}\n\nclass Task {\n  final int id;\n  final String jsFunction;\n  final List<dynamic> args;\n\n  const Task(this.id, this.jsFunction, this.args);\n}\n\nclass TaskResult {\n  final int id;\n  final Object? result;\n  final String? error;\n\n  const TaskResult(this.id, this.result, this.error);\n}\n"
  },
  {
    "path": "lib/foundation/local.dart",
    "content": "import 'dart:convert';\nimport 'dart:isolate';\n\nimport 'package:flutter/widgets.dart' show ChangeNotifier;\nimport 'package:flutter_saf/flutter_saf.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/network/download.dart';\nimport 'package:venera/pages/reader/reader.dart';\nimport 'package:venera/utils/io.dart';\n\nimport 'app.dart';\nimport 'history.dart';\n\nclass LocalComic with HistoryMixin implements Comic {\n  @override\n  final String id;\n\n  @override\n  final String title;\n\n  @override\n  final String subtitle;\n\n  @override\n  final List<String> tags;\n\n  /// The name of the directory where the comic is stored\n  final String directory;\n\n  /// key: chapter id, value: chapter title\n  ///\n  /// chapter id is the name of the directory in `LocalManager.path/$directory`\n  final ComicChapters? chapters;\n\n  bool get hasChapters => chapters != null;\n\n  /// relative path to the cover image\n  @override\n  final String cover;\n\n  final ComicType comicType;\n\n  final List<String> downloadedChapters;\n\n  final DateTime createdAt;\n\n  const LocalComic({\n    required this.id,\n    required this.title,\n    required this.subtitle,\n    required this.tags,\n    required this.directory,\n    required this.chapters,\n    required this.cover,\n    required this.comicType,\n    required this.downloadedChapters,\n    required this.createdAt,\n  });\n\n  LocalComic.fromRow(Row row)\n      : id = row[0] as String,\n        title = row[1] as String,\n        subtitle = row[2] as String,\n        tags = List.from(jsonDecode(row[3] as String)),\n        directory = row[4] as String,\n        chapters = ComicChapters.fromJsonOrNull(jsonDecode(row[5] as String)),\n        cover = row[6] as String,\n        comicType = ComicType(row[7] as int),\n        downloadedChapters = List.from(jsonDecode(row[8] as String)),\n        createdAt = DateTime.fromMillisecondsSinceEpoch(row[9] as int);\n\n  File get coverFile => File(FilePath.join(\n        baseDir,\n        cover,\n      ));\n\n  String get baseDir => (directory.contains('/') || directory.contains('\\\\'))\n      ? directory\n      : FilePath.join(LocalManager().path, directory);\n\n  @override\n  String get description => \"\";\n\n  @override\n  String get sourceKey =>\n      comicType == ComicType.local ? \"local\" : comicType.sourceKey;\n\n  @override\n  Map<String, dynamic> toJson() {\n    return {\n      \"title\": title,\n      \"cover\": cover,\n      \"id\": id,\n      \"subTitle\": subtitle,\n      \"tags\": tags,\n      \"description\": description,\n      \"sourceKey\": sourceKey,\n      \"chapters\": chapters?.toJson(),\n    };\n  }\n\n  @override\n  int? get maxPage => null;\n\n  void read() {\n    var history = HistoryManager().find(id, comicType);\n    int? firstDownloadedChapter;\n    int? firstDownloadedChapterGroup;\n    if (downloadedChapters.isNotEmpty && chapters != null) {\n      final chapters = this.chapters!;\n      if (chapters.isGrouped) {\n        for (int i=0; i<chapters.groupCount; i++) {\n          var group = chapters.getGroupByIndex(i);\n          var keys = group.keys.toList();\n          for (int j=0; j<keys.length; j++) {\n            var chapterId = keys[j];\n            if (downloadedChapters.contains(chapterId)) {\n              firstDownloadedChapter = j + 1;\n              firstDownloadedChapterGroup = i + 1;\n              break;\n            }\n          }\n        }\n      } else {\n        var keys = chapters.allChapters.keys;\n        for (int i = 0; i < keys.length; i++) {\n          if (downloadedChapters.contains(keys.elementAt(i))) {\n            firstDownloadedChapter = i + 1;\n            break;\n          }\n        }\n      }\n    }\n    App.rootContext.to(\n      () => Reader(\n        type: comicType,\n        cid: id,\n        name: title,\n        chapters: chapters,\n        initialChapter: history?.ep ?? firstDownloadedChapter,\n        initialPage: history?.page,\n        initialChapterGroup: history?.group ?? firstDownloadedChapterGroup,\n        history: history ??\n            History.fromModel(\n              model: this,\n              ep: 0,\n              page: 0,\n            ),\n        author: subtitle,\n        tags: tags,\n      )\n    );\n  }\n\n  @override\n  HistoryType get historyType => comicType;\n\n  @override\n  String? get subTitle => subtitle;\n\n  @override\n  String? get language => null;\n\n  @override\n  String? get favoriteId => null;\n\n  @override\n  double? get stars => null;\n}\n\nclass LocalManager with ChangeNotifier {\n  static LocalManager? _instance;\n\n  LocalManager._();\n\n  factory LocalManager() {\n    return _instance ??= LocalManager._();\n  }\n\n  late Database _db;\n\n  /// path to the directory where all the comics are stored\n  late String path;\n\n  Directory get directory => Directory(path);\n\n  void _checkNoMedia() {\n    if (App.isAndroid) {\n      var file = File(FilePath.join(path, '.nomedia'));\n      if (!file.existsSync()) {\n        file.createSync();\n      }\n    }\n  }\n\n  // return error message if failed\n  Future<String?> setNewPath(String newPath) async {\n    var newDir = Directory(newPath);\n    if (!await newDir.exists()) {\n      return \"Directory does not exist\";\n    }\n    if (!await newDir.list().isEmpty) {\n      return \"Directory is not empty\";\n    }\n    try {\n      await copyDirectoryIsolate(\n        directory,\n        newDir,\n      );\n      await File(FilePath.join(App.dataPath, 'local_path'))\n          .writeAsString(newPath);\n    } catch (e, s) {\n      Log.error(\"IO\", e, s);\n      return e.toString();\n    }\n    await directory.deleteContents(recursive: true);\n    path = newPath;\n    _checkNoMedia();\n    return null;\n  }\n\n  Future<String> findDefaultPath() async {\n    if (App.isAndroid) {\n      var external = await getExternalStorageDirectories();\n      if (external != null && external.isNotEmpty) {\n        return FilePath.join(external.first.path, 'local');\n      } else {\n        return FilePath.join(App.dataPath, 'local');\n      }\n    } else if (App.isIOS) {\n      var oldPath = FilePath.join(App.dataPath, 'local');\n      if (Directory(oldPath).existsSync() &&\n          Directory(oldPath).listSync().isNotEmpty) {\n        return oldPath;\n      } else {\n        var directory = await getApplicationDocumentsDirectory();\n        return FilePath.join(directory.path, 'local');\n      }\n    } else {\n      return FilePath.join(App.dataPath, 'local');\n    }\n  }\n\n  Future<void> _checkPathValidation() async {\n    var testFile = File(FilePath.join(path, 'venera_test'));\n    try {\n      testFile.createSync();\n      testFile.deleteSync();\n    } catch (e) {\n      Log.error(\"IO\",\n          \"Failed to create test file in local path: $e\\nUsing default path instead.\");\n      path = await findDefaultPath();\n    }\n  }\n\n  Future<void> init() async {\n    _db = sqlite3.open(\n      '${App.dataPath}/local.db',\n    );\n    _db.execute('''\n      CREATE TABLE IF NOT EXISTS comics (\n        id TEXT NOT NULL,\n        title TEXT NOT NULL,\n        subtitle TEXT NOT NULL,\n        tags TEXT NOT NULL,\n        directory TEXT NOT NULL,\n        chapters TEXT NOT NULL,\n        cover TEXT NOT NULL,\n        comic_type INTEGER NOT NULL,\n        downloadedChapters TEXT NOT NULL,\n        created_at INTEGER,\n        PRIMARY KEY (id, comic_type)\n      );\n    ''');\n    if (File(FilePath.join(App.dataPath, 'local_path')).existsSync()) {\n      path = File(FilePath.join(App.dataPath, 'local_path')).readAsStringSync();\n      if (!directory.existsSync()) {\n        path = await findDefaultPath();\n      }\n    } else {\n      path = await findDefaultPath();\n    }\n    try {\n      if (!directory.existsSync()) {\n        await directory.create();\n      }\n    } catch (e, s) {\n      Log.error(\"IO\", \"Failed to create local folder: $e\", s);\n    }\n    _checkPathValidation();\n    _checkNoMedia();\n    await ComicSourceManager().ensureInit();\n    restoreDownloadingTasks();\n  }\n\n  String findValidId(ComicType type) {\n    final res = _db.select(\n      '''\n      SELECT id FROM comics WHERE comic_type = ?\n      ORDER BY CAST(id AS INTEGER) DESC\n      LIMIT 1;\n      ''',\n      [type.value],\n    );\n    if (res.isEmpty) {\n      return '1';\n    }\n    return (int.parse((res.first[0])) + 1).toString();\n  }\n\n  Future<void> add(LocalComic comic, [String? id]) async {\n    var old = find(id ?? comic.id, comic.comicType);\n    var downloaded = comic.downloadedChapters;\n    if (old != null) {\n      downloaded.addAll(old.downloadedChapters);\n    }\n    _db.execute(\n      'INSERT OR REPLACE INTO comics VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);',\n      [\n        id ?? comic.id,\n        comic.title,\n        comic.subtitle,\n        jsonEncode(comic.tags),\n        comic.directory,\n        jsonEncode(comic.chapters),\n        comic.cover,\n        comic.comicType.value,\n        jsonEncode(downloaded),\n        comic.createdAt.millisecondsSinceEpoch,\n      ],\n    );\n    notifyListeners();\n  }\n\n  void remove(String id, ComicType comicType) async {\n    _db.execute(\n      'DELETE FROM comics WHERE id = ? AND comic_type = ?;',\n      [id, comicType.value],\n    );\n    notifyListeners();\n  }\n\n  void removeComic(LocalComic comic) {\n    remove(comic.id, comic.comicType);\n    notifyListeners();\n  }\n\n  List<LocalComic> getComics(LocalSortType sortType) {\n    var res = _db.select('''\n      SELECT * FROM comics\n      ORDER BY\n        ${sortType.value == 'name' ? 'title' : 'created_at'}\n        ${sortType.value == 'time_asc' ? 'ASC' : 'DESC'}\n      ;\n    ''');\n    return res.map((row) => LocalComic.fromRow(row)).toList();\n  }\n\n  LocalComic? find(String id, ComicType comicType) {\n    final res = _db.select(\n      'SELECT * FROM comics WHERE id = ? AND comic_type = ?;',\n      [id, comicType.value],\n    );\n    if (res.isEmpty) {\n      return null;\n    }\n    return LocalComic.fromRow(res.first);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    _db.dispose();\n  }\n\n  List<LocalComic> getRecent() {\n    final res = _db.select('''\n      SELECT * FROM comics\n      ORDER BY created_at DESC\n      LIMIT 20;\n    ''');\n    return res.map((row) => LocalComic.fromRow(row)).toList();\n  }\n\n  int get count {\n    final res = _db.select('''\n      SELECT COUNT(*) FROM comics;\n    ''');\n    return res.first[0] as int;\n  }\n\n  LocalComic? findByName(String name) {\n    final res = _db.select('''\n      SELECT * FROM comics\n      WHERE title = ? OR directory = ?;\n    ''', [name, name]);\n    if (res.isEmpty) {\n      return null;\n    }\n    return LocalComic.fromRow(res.first);\n  }\n\n  List<LocalComic> search(String keyword) {\n    final res = _db.select('''\n      SELECT * FROM comics\n      WHERE title LIKE ? OR tags LIKE ? OR subtitle LIKE ?\n      ORDER BY created_at DESC;\n    ''', ['%$keyword%', '%$keyword%', '%$keyword%']);\n    return res.map((row) => LocalComic.fromRow(row)).toList();\n  }\n\n  Future<List<String>> getImages(String id, ComicType type, Object ep) async {\n    if (ep is! String && ep is! int) {\n      throw \"Invalid ep\";\n    }\n    var comic = find(id, type) ?? (throw \"Comic Not Found\");\n    var directory = Directory(comic.baseDir);\n    if (comic.hasChapters) {\n      var cid =\n          ep is int ? comic.chapters!.ids.elementAt(ep - 1) : (ep as String);\n      cid = getChapterDirectoryName(cid);\n      directory = Directory(FilePath.join(directory.path, cid));\n    }\n    var files = <File>[];\n    await for (var entity in directory.list()) {\n      if (entity is File) {\n        // Do not exclude comic.cover, since it may be the first page of the chapter.\n        // A file with name starting with 'cover.' is not a comic page.\n        if (entity.name.startsWith('cover.')) {\n          continue;\n        }\n        //Hidden file in some file system\n        if (entity.name.startsWith('.')) {\n          continue;\n        }\n        files.add(entity);\n      }\n    }\n    files.sort((a, b) {\n      var ai = int.tryParse(a.name.split('.').first);\n      var bi = int.tryParse(b.name.split('.').first);\n      if (ai != null && bi != null) {\n        return ai.compareTo(bi);\n      }\n      return a.name.compareTo(b.name);\n    });\n    return files.map((e) => \"file://${e.path}\").toList();\n  }\n\n  bool isDownloaded(String id, ComicType type,\n      [int? ep, ComicChapters? chapters]) {\n    var comic = find(id, type);\n    if (comic == null) return false;\n    if (comic.chapters == null || ep == null) return true;\n    if (chapters != null) {\n      if (comic.chapters?.length != chapters.length) {\n        // update\n        add(LocalComic(\n          id: comic.id,\n          title: comic.title,\n          subtitle: comic.subtitle,\n          tags: comic.tags,\n          directory: comic.directory,\n          chapters: chapters,\n          cover: comic.cover,\n          comicType: comic.comicType,\n          downloadedChapters: comic.downloadedChapters,\n          createdAt: comic.createdAt,\n        ));\n      }\n    }\n    return comic.downloadedChapters\n        .contains((chapters ?? comic.chapters)!.ids.elementAtOrNull(ep - 1));\n  }\n\n  List<DownloadTask> downloadingTasks = [];\n\n  bool isDownloading(String id, ComicType type) {\n    return downloadingTasks\n        .any((element) => element.id == id && element.comicType == type);\n  }\n\n  Future<Directory> findValidDirectory(\n      String id, ComicType type, String name) async {\n    var comic = find(id, type);\n    if (comic != null) {\n      return Directory(FilePath.join(path, comic.directory));\n    }\n    const comicDirectoryMaxLength = 80;\n    if (name.length > comicDirectoryMaxLength) {\n      name = name.substring(0, comicDirectoryMaxLength);\n    }\n    var dir = findValidDirectoryName(path, name);\n    return Directory(FilePath.join(path, dir)).create().then((value) => value);\n  }\n\n  void completeTask(DownloadTask task) {\n    add(task.toLocalComic());\n    downloadingTasks.remove(task);\n    notifyListeners();\n    saveCurrentDownloadingTasks();\n    downloadingTasks.firstOrNull?.resume();\n  }\n\n  void removeTask(DownloadTask task) {\n    downloadingTasks.remove(task);\n    notifyListeners();\n    saveCurrentDownloadingTasks();\n  }\n\n  void moveToFirst(DownloadTask task) {\n    if (downloadingTasks.first != task) {\n      var shouldResume = !downloadingTasks.first.isPaused;\n      downloadingTasks.first.pause();\n      downloadingTasks.remove(task);\n      downloadingTasks.insert(0, task);\n      notifyListeners();\n      saveCurrentDownloadingTasks();\n      if (shouldResume) {\n        downloadingTasks.first.resume();\n      }\n    }\n  }\n\n  Future<void> saveCurrentDownloadingTasks() async {\n    var tasks = downloadingTasks.map((e) => e.toJson()).toList();\n    await File(FilePath.join(App.dataPath, 'downloading_tasks.json'))\n        .writeAsString(jsonEncode(tasks));\n  }\n\n  void restoreDownloadingTasks() {\n    var file = File(FilePath.join(App.dataPath, 'downloading_tasks.json'));\n    if (file.existsSync()) {\n      try {\n        var tasks = jsonDecode(file.readAsStringSync());\n        for (var e in tasks) {\n          var task = DownloadTask.fromJson(e);\n          if (task != null) {\n            downloadingTasks.add(task);\n          }\n        }\n      } catch (e) {\n        file.delete();\n        Log.error(\"LocalManager\", \"Failed to restore downloading tasks: $e\");\n      }\n    }\n  }\n\n  void addTask(DownloadTask task) {\n    downloadingTasks.add(task);\n    notifyListeners();\n    saveCurrentDownloadingTasks();\n    downloadingTasks.first.resume();\n  }\n\n  void deleteComic(LocalComic c, [bool removeFileOnDisk = true]) {\n    if (removeFileOnDisk) {\n      var dir = Directory(FilePath.join(path, c.directory));\n      dir.deleteIgnoreError(recursive: true);\n    }\n    // Deleting a local comic means that it's no longer available, thus both favorite and history should be deleted.\n    if (c.comicType == ComicType.local) {\n      if (HistoryManager().find(c.id, c.comicType) != null) {\n        HistoryManager().remove(c.id, c.comicType);\n      }\n      var folders = LocalFavoritesManager().find(c.id, c.comicType);\n      for (var f in folders) {\n        LocalFavoritesManager().deleteComicWithId(f, c.id, c.comicType);\n      }\n    }\n    remove(c.id, c.comicType);\n    notifyListeners();\n  }\n\n  void deleteComicChapters(LocalComic c, List<String> chapters) {\n    if (chapters.isEmpty) {\n      return;\n    }\n    var newDownloadedChapters = c.downloadedChapters\n        .where((e) => !chapters.contains(e))\n        .toList();\n    if (newDownloadedChapters.isNotEmpty) {\n      _db.execute(\n        'UPDATE comics SET downloadedChapters = ? WHERE id = ? AND comic_type = ?;',\n        [\n          jsonEncode(newDownloadedChapters),\n          c.id,\n          c.comicType.value,\n        ],\n      );\n    } else {\n      _db.execute(\n        'DELETE FROM comics WHERE id = ? AND comic_type = ?;',\n        [c.id, c.comicType.value],\n      );\n    }\n    var shouldRemovedDirs = <Directory>[];\n    for (var chapter in chapters) {\n      var dir = Directory(FilePath.join(\n        c.baseDir,\n        getChapterDirectoryName(chapter),\n      ));\n      if (dir.existsSync()) {\n        shouldRemovedDirs.add(dir);\n      }\n    }\n    if (shouldRemovedDirs.isNotEmpty) {\n      _deleteDirectories(shouldRemovedDirs);\n    }\n    notifyListeners();\n  }\n\n  void batchDeleteComics(List<LocalComic> comics, [bool removeFileOnDisk = true, bool removeFavoriteAndHistory = true]) {\n    if (comics.isEmpty) {\n      return;\n    }\n\n    var shouldRemovedDirs = <Directory>[];\n    _db.execute('BEGIN TRANSACTION;');\n    try {\n      for (var c in comics) {\n        if (removeFileOnDisk) {\n          var dir = Directory(FilePath.join(path, c.directory));\n          if (dir.existsSync()) {\n            shouldRemovedDirs.add(dir);\n          }\n        }\n        _db.execute(\n          'DELETE FROM comics WHERE id = ? AND comic_type = ?;',\n          [c.id, c.comicType.value],\n        );\n      }\n    }\n    catch(e, s) {\n      Log.error(\"LocalManager\", \"Failed to batch delete comics: $e\", s);\n      _db.execute('ROLLBACK;');\n      return;\n    }\n    _db.execute('COMMIT;');\n\n    var comicIDs = comics.map((e) => ComicID(e.comicType, e.id)).toList();\n\n    if (removeFavoriteAndHistory) {\n      LocalFavoritesManager().batchDeleteComicsInAllFolders(comicIDs);\n      HistoryManager().batchDeleteHistories(comicIDs);\n    }\n\n    notifyListeners();\n\n    if (removeFileOnDisk) {\n      _deleteDirectories(shouldRemovedDirs);\n    }\n  }\n\n  /// Deletes the directories in a separate isolate to avoid blocking the UI thread.\n  static void _deleteDirectories(List<Directory> directories) {\n    Isolate.run(() async {\n      await SAFTaskWorker().init();\n      for (var dir in directories) {\n        try {\n          if (dir.existsSync()) {\n            await dir.delete(recursive: true);\n          }\n        } catch (e) {\n          continue;\n        }\n      }\n    });\n  }\n\n  static String getChapterDirectoryName(String name) {\n    var builder = StringBuffer();\n    for (var i = 0; i < name.length; i++) {\n      var char = name[i];\n      if (char == '/' || char == '\\\\' || char == ':' || char == '*' ||\n          char == '?'\n          || char == '\"' || char == '<' || char == '>' || char == '|') {\n        builder.write('_');\n      } else {\n        builder.write(char);\n      }\n    }\n    return builder.toString();\n  }\n}\n\nenum LocalSortType {\n  name(\"name\"),\n  timeAsc(\"time_asc\"),\n  timeDesc(\"time_desc\");\n\n  final String value;\n\n  const LocalSortType(this.value);\n\n  static LocalSortType fromString(String value) {\n    for (var type in values) {\n      if (type.value == value) {\n        return type;\n      }\n    }\n    return name;\n  }\n}\n"
  },
  {
    "path": "lib/foundation/log.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/io.dart';\n\nclass LogItem {\n  final LogLevel level;\n  final String title;\n  final String content;\n  final DateTime time = DateTime.now();\n\n  @override\n  toString() => \"${level.name} $title $time \\n$content\\n\\n\";\n\n  LogItem(this.level, this.title, this.content);\n}\n\nenum LogLevel { error, warning, info }\n\nclass Log {\n  static final List<LogItem> _logs = <LogItem>[];\n\n  static List<LogItem> get logs => _logs;\n\n  static const maxLogLength = 3000;\n\n  static const maxLogNumber = 500;\n\n  static bool ignoreLimitation = false;\n\n  static bool isMuted = false;\n\n  static void printWarning(String text) {\n    debugPrint('\\x1B[33m$text\\x1B[0m');\n  }\n\n  static void printError(String text) {\n    debugPrint('\\x1B[31m$text\\x1B[0m');\n  }\n\n  static IOSink? _file;\n\n  static void addLog(LogLevel level, String title, String content) {\n    if (isMuted) return;\n    if (_file == null && App.isInitialized) {\n      Directory dir;\n      if (App.isAndroid) {\n        dir = Directory(App.externalStoragePath!);\n      } else {\n        dir = Directory(App.dataPath);\n      }\n      var file = dir.joinFile(\"logs.txt\");\n      _file = file.openWrite();\n    }\n\n    if (!ignoreLimitation && content.length > maxLogLength) {\n      content = \"${content.substring(0, maxLogLength)}...\";\n    }\n\n    switch (level) {\n      case LogLevel.error:\n        printError(content);\n      case LogLevel.warning:\n        printWarning(content);\n      case LogLevel.info:\n        if(kDebugMode) {\n          debugPrint(content);\n        }\n    }\n\n    var newLog = LogItem(level, title, content);\n\n    if (newLog == _logs.lastOrNull) {\n      return;\n    }\n\n    _logs.add(newLog);\n    if(_file != null) {\n      _file!.write(newLog.toString());\n    }\n    if (_logs.length > maxLogNumber) {\n      var res = _logs.remove(\n          _logs.firstWhereOrNull((element) => element.level == LogLevel.info));\n      if (!res) {\n        _logs.removeAt(0);\n      }\n    }\n  }\n\n  static info(String title, String content) {\n    addLog(LogLevel.info, title, content);\n  }\n\n  static warning(String title, String content) {\n    addLog(LogLevel.warning, title, content);\n  }\n\n  static error(String title, Object content, [Object? stackTrace]) {\n    var info = content.toString();\n    if(stackTrace != null) {\n      info += \"\\n${stackTrace.toString()}\";\n    }\n    addLog(LogLevel.error, title, info);\n  }\n\n  static void clear() => _logs.clear();\n\n  @override\n  String toString() {\n    var res = \"Logs\\n\\n\";\n    for (var log in _logs) {\n      res += log.toString();\n    }\n    return res;\n  }\n}\n"
  },
  {
    "path": "lib/foundation/res.dart",
    "content": "class Res<T> {\n  /// error info\n  final String? errorMessage;\n\n  /// data\n  final T? _data;\n\n  /// is there an error\n  bool get error => errorMessage != null;\n\n  /// whether succeed\n  bool get success => !error;\n\n  /// data\n  T get data => _data ?? (throw Exception(errorMessage));\n\n  /// get data, or null if there is an error\n  T? get dataOrNull => _data;\n\n  final dynamic subData;\n\n  @override\n  String toString() => _data.toString();\n\n  Res.fromErrorRes(Res another, {this.subData})\n      : _data = null,\n        errorMessage = another.errorMessage;\n\n  /// network result\n  const Res(this._data, {this.errorMessage, this.subData});\n\n  const Res.error(String err)\n      : _data = null,\n        subData = null,\n        errorMessage = err;\n}\n"
  },
  {
    "path": "lib/foundation/widget_utils.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nextension WidgetExtension on Widget{\n  Widget padding(EdgeInsetsGeometry padding){\n    return Padding(padding: padding, child: this);\n  }\n\n  Widget paddingLeft(double padding){\n    return Padding(padding: EdgeInsets.only(left: padding), child: this);\n  }\n\n  Widget paddingRight(double padding){\n    return Padding(padding: EdgeInsets.only(right: padding), child: this);\n  }\n\n  Widget paddingTop(double padding){\n    return Padding(padding: EdgeInsets.only(top: padding), child: this);\n  }\n\n  Widget paddingBottom(double padding){\n    return Padding(padding: EdgeInsets.only(bottom: padding), child: this);\n  }\n\n  Widget paddingVertical(double padding){\n    return Padding(padding: EdgeInsets.symmetric(vertical: padding), child: this);\n  }\n\n  Widget paddingHorizontal(double padding){\n    return Padding(padding: EdgeInsets.symmetric(horizontal: padding), child: this);\n  }\n\n  Widget paddingAll(double padding){\n    return Padding(padding: EdgeInsets.all(padding), child: this);\n  }\n\n  Widget toCenter(){\n    return Center(child: this);\n  }\n\n  Widget toAlign(AlignmentGeometry alignment){\n    return Align(alignment: alignment, child: this);\n  }\n\n  Widget sliverPadding(EdgeInsetsGeometry padding){\n    return SliverPadding(padding: padding, sliver: this);\n  }\n\n  Widget sliverPaddingAll(double padding){\n    return SliverPadding(padding: EdgeInsets.all(padding), sliver: this);\n  }\n\n  Widget sliverPaddingVertical(double padding){\n    return SliverPadding(padding: EdgeInsets.symmetric(vertical: padding), sliver: this);\n  }\n\n  Widget sliverPaddingHorizontal(double padding){\n    return SliverPadding(padding: EdgeInsets.symmetric(horizontal: padding), sliver: this);\n  }\n\n  Widget fixWidth(double width){\n    return SizedBox(width: width, child: this);\n  }\n\n  Widget fixHeight(double height){\n    return SizedBox(height: height, child: this);\n  }\n\n  Widget toSliver(){\n    return SliverToBoxAdapter(child: this);\n  }\n}\n\n/// create default text style\nTextStyle get ts => const TextStyle();\n\nextension StyledText on TextStyle {\n  TextStyle get bold => copyWith(fontWeight: FontWeight.bold);\n\n  TextStyle get light => copyWith(fontWeight: FontWeight.w300);\n\n  TextStyle get italic => copyWith(fontStyle: FontStyle.italic);\n\n  TextStyle get underline => copyWith(decoration: TextDecoration.underline);\n\n  TextStyle get lineThrough => copyWith(decoration: TextDecoration.lineThrough);\n\n  TextStyle get overline => copyWith(decoration: TextDecoration.overline);\n\n  TextStyle get s8 => copyWith(fontSize: 8);\n\n  TextStyle get s10 => copyWith(fontSize: 10);\n\n  TextStyle get s12 => copyWith(fontSize: 12);\n\n  TextStyle get s14 => copyWith(fontSize: 14);\n\n  TextStyle get s16 => copyWith(fontSize: 16);\n\n  TextStyle get s18 => copyWith(fontSize: 18);\n\n  TextStyle get s20 => copyWith(fontSize: 20);\n\n  TextStyle get s24 => copyWith(fontSize: 24);\n\n  TextStyle get s28 => copyWith(fontSize: 28);\n\n  TextStyle get s32 => copyWith(fontSize: 32);\n\n  TextStyle get s36 => copyWith(fontSize: 36);\n\n  TextStyle get s40 => copyWith(fontSize: 40);\n\n  TextStyle withColor(Color? color) => copyWith(color: color);\n}\n\nextension ColorExt on Color {\n  Color toOpacity(double opacity) {\n    return withValues(alpha: opacity);\n  }\n}"
  },
  {
    "path": "lib/headless.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:flutter/widgets.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/pages/comic_source_page.dart';\nimport 'package:venera/init.dart';\nimport 'package:venera/foundation/follow_updates.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/favorites.dart';\n\nvoid cliPrint(Map<String, dynamic> data) {\n  print('[CLI PRINT] ${jsonEncode(data)}');\n}\n\nFuture<void> runHeadlessMode(List<String> args) async {\n  WidgetsFlutterBinding.ensureInitialized();\n  if (args.contains('--ignore-disheadless-log')) {\n    Log.isMuted = true;\n  }\n  if(Platform.isLinux || Platform.isMacOS){\n    Directory.current = Platform.environment['HOME']!;\n  }\n  // The first arg is '--headless', so we look at the next ones.\n  var commandIndex = args.indexOf('--headless') + 1;\n  if (commandIndex >= args.length) {\n    cliPrint({'status': 'error', 'message': 'No command provided for headless mode.'});\n    exit(1);\n  }\n\n  // Need to initialize the app for some features to work\n  await init();\n\n  var command = args[commandIndex];\n  var subCommand = (commandIndex + 1 < args.length) ? args[commandIndex + 1] : null;\n\n  switch (command) {\n    case 'webdav':\n      if (subCommand == 'up') {\n        cliPrint({'status': 'running', 'message': 'Uploading WebDAV data...'});\n        await DataSync().uploadData();\n        cliPrint({'status': 'success', 'message': 'Upload complete.'});\n      } else if (subCommand == 'down') {\n        cliPrint({'status': 'running', 'message': 'Downloading WebDAV data...'});\n        await DataSync().downloadData();\n        cliPrint({'status': 'success', 'message': 'Download complete.'});\n      } else {\n        cliPrint({'status': 'error', 'message': 'Invalid webdav command. Use \"up\" or \"down\".'});\n        exit(1);\n      }\n      break;\n    case 'updatescript':\n      if (subCommand == 'all') {\n        cliPrint({'status': 'running', 'message': 'Checking for comic source script updates...'});\n        await ComicSourcePage.checkComicSourceUpdate();\n        var updates = ComicSourceManager().availableUpdates;\n        if (updates.isEmpty) {\n          cliPrint({'status': 'success', 'message': 'No updates found.'});\n        } else {\n          var total = updates.length;\n          var current = 0;\n          var errors = 0;\n          var updated = 0;\n          cliPrint({\n            'status': 'running',\n            'message': 'Updating all comic source scripts...',\n            'data': {\n              'total': total,\n              'current': 0,\n              'updated': 0,\n              'errors': 0,\n            }\n          });\n          for (var key in updates.keys) {\n            var source = ComicSource.find(key);\n            if (source != null) {\n              current++;\n              var data = {\n                'current': current,\n                'total': total,\n                'source': {\n                  'key': source.key,\n                  'name': source.name,\n                  'version': source.version,\n                  'url': source.url,\n                }\n              };\n              try {\n                await ComicSourcePage.update(source, false);\n                updated++;\n                cliPrint({\n                  'status': 'running',\n                  'message': 'Progress',\n                  'data': data,\n                });\n              } catch (e) {\n                errors++;\n                cliPrint({\n                  'status': 'running',\n                  'message': 'ProgressError',\n                  'data': {\n                    ...data,\n                    'error': e.toString(),\n                  },\n                });\n              }\n            }\n          }\n          cliPrint({\n            'status': 'success',\n            'message': 'All scripts updated.',\n            'data': {\n              'total': total,\n              'updated': updated,\n              'errors': errors,\n            }\n          });\n        }\n      } else {\n        cliPrint({'status': 'error', 'message': 'Invalid updatescript command. Use \"all\".'});\n        exit(1);\n      }\n      break;\n    case 'updatesubscribe':\n      cliPrint({'status': 'running', 'message': 'Updating subscribed comics...'});\n      var folder = appdata.settings[\"followUpdatesFolder\"];\n      if (folder == null) {\n        cliPrint({'status': 'error', 'message': 'Follow updates folder is not configured.'});\n        exit(1);\n      }\n\n      var updateIndex = args.indexOf('--update-comic-by-id-type');\n      if (updateIndex != -1) {\n        var id = args[updateIndex + 1];\n        var type = args[updateIndex + 2];\n        var comics = LocalFavoritesManager().getComicsWithUpdatesInfo(folder);\n        var comic = comics.firstWhere((c) => c.id == id && c.type.sourceKey == type);\n        \n        var result = await updateComic(comic, folder);\n        \n        Map<String, dynamic> data = {\n          'current': 1,\n          'total': 1,\n          'comic': {\n            'id': comic.id,\n            'name': comic.name,\n            'coverUrl': comic.coverPath,\n            'author': comic.author,\n            'type': comic.type.sourceKey,\n            'updateTime': comic.updateTime,\n            'tags': comic.tags,\n          }\n        };\n\n        var message = 'Progress';\n        if (result.errorMessage != null) {\n          message = 'ProgressError';\n          data['error'] = result.errorMessage;\n        }\n\n        cliPrint({\n          'status': 'running',\n          'message': message,\n          'data': data,\n        });\n\n        cliPrint({\n          'status': 'running',\n          'message': 'Update check complete.',\n          'data': {\n            'total': 1,\n            'updated': result.updated ? 1 : 0,\n            'errors': result.errorMessage != null ? 1 : 0,\n          }\n        });\n\n        await Future.delayed(const Duration(milliseconds: 500));\n        var json = await getUpdatedComicsAsJson(folder);\n        cliPrint({\n          'status': result.errorMessage != null ? 'error' : 'success',\n          'message': 'Updated comics list.',\n          'data': jsonDecode(json),\n        });\n      } else {\n        int total = 0;\n        int updated = 0;\n        int errors = 0;\n        await for (var progress in updateFolder(folder, true)) {\n          total = progress.total;\n          updated = progress.updated;\n          errors = progress.errors;\n          Map<String, dynamic> data = {\n            'current': progress.current,\n            'total': progress.total,\n          };\n          if (progress.comic != null) {\n            data['comic'] = {\n              'id': progress.comic!.id,\n              'name': progress.comic!.name,\n              'coverUrl': progress.comic!.coverPath,\n              'author': progress.comic!.author,\n              'type': progress.comic!.type.sourceKey,\n              'updateTime': progress.comic!.updateTime,\n              'tags': progress.comic!.tags,\n            };\n          }\n          var message = 'Progress';\n          if (progress.errorMessage != null) {\n            message = 'ProgressError';\n            data['error'] = progress.errorMessage;\n          }\n          cliPrint({\n            'status': 'running',\n            'message': message,\n            'data': data,\n          });\n        }\n        cliPrint({\n          'status': 'running',\n          'message': 'Update check complete.',\n          'data': {\n            'total': total,\n            'updated': updated,\n            'errors': errors,\n          }\n        });\n        await Future.delayed(const Duration(milliseconds: 500));\n        var json = await getUpdatedComicsAsJson(folder);\n        cliPrint({\n          'status': errors > 0 ? 'error' : 'success',\n          'message': 'Updated comics list.',\n          'data': jsonDecode(json),\n        });\n      }\n      break;\n    default:\n      cliPrint({'status': 'error', 'message': 'Unknown command: $command'});\n      exit(1);\n  }\n\n  // Exit after command execution\n  exit(0);\n}\n"
  },
  {
    "path": "lib/init.dart",
    "content": "import 'dart:async';\n\nimport 'package:display_mode/display_mode.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_saf/flutter_saf.dart';\nimport 'package:rhttp/rhttp.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/cache_manager.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/js_engine.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/network/cookie_jar.dart';\nimport 'package:venera/pages/comic_source_page.dart';\nimport 'package:venera/pages/follow_updates_page.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/app_links.dart';\nimport 'package:venera/utils/handle_text_share.dart';\nimport 'package:venera/utils/opencc.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'foundation/appdata.dart';\n\nextension _FutureInit<T> on Future<T> {\n  /// Prevent unhandled exception\n  ///\n  /// A unhandled exception occurred in init() will cause the app to crash.\n  Future<void> wait() async {\n    try {\n      await this;\n    } catch (e, s) {\n      Log.error(\"init\", \"$e\\n$s\");\n    }\n  }\n}\n\nFuture<void> init() async {\n  await App.init().wait();\n  await SingleInstanceCookieJar.createInstance();\n  try {\n    var futures = [\n      Rhttp.init(),\n      App.initComponents(),\n      SAFTaskWorker().init().wait(),\n      AppTranslation.init().wait(),\n      TagsTranslation.readData().wait(),\n      JsEngine().init().wait(),\n      ComicSourceManager().init().wait(),\n      OpenCC.init(),\n    ];\n    await Future.wait(futures);\n  } catch (e, s) {\n    Log.error(\"init\", \"$e\\n$s\");\n  }\n  CacheManager().setLimitSize(appdata.settings['cacheSize']);\n  _checkOldConfigs();\n  if (App.isAndroid) {\n    handleLinks();\n    handleTextShare();\n    try {\n      await FlutterDisplayMode.setHighRefreshRate();\n    } catch(e) {\n      Log.error(\"Display Mode\", \"Failed to set high refresh rate: $e\");\n    }\n  }\n  FlutterError.onError = (details) {\n    Log.error(\"Unhandled Exception\", \"${details.exception}\\n${details.stack}\");\n  };\n  if (App.isWindows) {\n    // Report to the monitor thread that the app is running\n    // https://github.com/venera-app/venera/issues/343\n    Timer.periodic(const Duration(seconds: 1), (_) {\n      const methodChannel = MethodChannel('venera/method_channel');\n      methodChannel.invokeMethod(\"heartBeat\");\n    });\n  }\n}\n\nvoid _checkOldConfigs() {\n  if (appdata.settings['searchSources'] == null) {\n    appdata.settings['searchSources'] = ComicSource.all()\n        .where((e) => e.searchPageData != null)\n        .map((e) => e.key)\n        .toList();\n  }\n\n  if (appdata.implicitData['webdavAutoSync'] == null) {\n    var webdavConfig = appdata.settings['webdav'];\n    if (webdavConfig is List &&\n        webdavConfig.length == 3 &&\n        webdavConfig.whereType<String>().length == 3) {\n      appdata.implicitData['webdavAutoSync'] = true;\n    } else {\n      appdata.implicitData['webdavAutoSync'] = false;\n    }\n    appdata.writeImplicitData();\n  }\n\n  if (appdata.settings['comicSourceListUrl'].toString().contains(\"git.nyne.dev\")) {\n    // migrate to jsdelivr cdn\n    appdata.settings['comicSourceListUrl'] = \"https://cdn.jsdelivr.net/gh/venera-app/venera-configs@main/index.json\";\n    appdata.saveData();\n  }\n}\n\nFuture<void> _checkAppUpdates() async {\n  var lastCheck = appdata.implicitData['lastCheckUpdate'] ?? 0;\n  var now = DateTime.now().millisecondsSinceEpoch;\n  if (now - lastCheck < 24 * 60 * 60 * 1000) {\n    return;\n  }\n  appdata.implicitData['lastCheckUpdate'] = now;\n  appdata.writeImplicitData();\n  ComicSourcePage.checkComicSourceUpdate();\n  if (appdata.settings['checkUpdateOnStart']) {\n    await checkUpdateUi(false, true);\n  }\n}\n\nvoid checkUpdates() {\n  _checkAppUpdates();\n  FollowUpdatesService.initChecker();\n}\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'dart:async';\nimport 'package:desktop_webview_window/desktop_webview_window.dart';\nimport 'package:dynamic_color/dynamic_color.dart';\nimport 'package:flex_seed_scheme/flex_seed_scheme.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/pages/auth_page.dart';\nimport 'package:venera/pages/main_page.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:window_manager/window_manager.dart';\nimport 'components/components.dart';\nimport 'components/window_frame.dart';\nimport 'foundation/app.dart';\nimport 'foundation/appdata.dart';\nimport 'headless.dart';\nimport 'init.dart';\n\nvoid main(List<String> args) {\n  if (args.contains('--headless')) {\n    runHeadlessMode(args);\n    return;\n  }\n  if (runWebViewTitleBarWidget(args)) return;\n  overrideIO(() {\n    runZonedGuarded(() async {\n      WidgetsFlutterBinding.ensureInitialized();\n      await init();\n      runApp(const MyApp());\n      if (App.isDesktop) {\n        await windowManager.ensureInitialized();\n        windowManager.waitUntilReadyToShow().then((_) async {\n          await windowManager.setTitleBarStyle(\n            TitleBarStyle.hidden,\n            windowButtonVisibility: App.isMacOS,\n          );\n          if (App.isLinux) {\n            await windowManager.setBackgroundColor(Colors.transparent);\n          }\n          await windowManager.setMinimumSize(const Size(500, 600));\n          var placement = await WindowPlacement.loadFromFile();\n          if (App.isLinux) {\n            await windowManager.show();\n            await placement.applyToWindow();\n          } else {\n            await placement.applyToWindow();\n            await windowManager.show();\n          }\n\n          WindowPlacement.loop();\n        });\n      }\n    }, (error, stack) {\n      Log.error(\"Unhandled Exception\", error, stack);\n    });\n  });\n}\n\nclass MyApp extends StatefulWidget {\n  const MyApp({super.key});\n\n  @override\n  State<MyApp> createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> with WidgetsBindingObserver {\n  @override\n  void initState() {\n    App.registerForceRebuild(forceRebuild);\n    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n    WidgetsBinding.instance.addObserver(this);\n    checkUpdates();\n    super.initState();\n  }\n\n  bool isAuthPageActive = false;\n\n  OverlayEntry? hideContentOverlay;\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    if (!App.isMobile || !appdata.settings['authorizationRequired']) {\n      return;\n    }\n    if (state == AppLifecycleState.inactive && hideContentOverlay == null) {\n      hideContentOverlay = OverlayEntry(\n        builder: (context) {\n          return Positioned.fill(\n            child: Container(\n              width: double.infinity,\n              height: double.infinity,\n              color: App.rootContext.colorScheme.surface,\n            ),\n          );\n        },\n      );\n      Overlay.of(App.rootContext).insert(hideContentOverlay!);\n    } else if (hideContentOverlay != null &&\n        state == AppLifecycleState.resumed) {\n      hideContentOverlay!.remove();\n      hideContentOverlay = null;\n    }\n    if (state == AppLifecycleState.hidden &&\n        !isAuthPageActive &&\n        !IO.isSelectingFiles) {\n      isAuthPageActive = true;\n      App.rootContext.to(\n        () => AuthPage(\n          onSuccessfulAuth: () {\n            App.rootContext.pop();\n            isAuthPageActive = false;\n          },\n        ),\n      );\n    }\n    super.didChangeAppLifecycleState(state);\n  }\n\n  void forceRebuild() {\n    void rebuild(Element el) {\n      el.markNeedsBuild();\n      el.visitChildren(rebuild);\n    }\n\n    (context as Element).visitChildren(rebuild);\n    setState(() {});\n  }\n\n  Color translateColorSetting() {\n    return switch (appdata.settings['color']) {\n      'red' => Colors.red,\n      'pink' => Colors.pink,\n      'purple' => Colors.purple,\n      'green' => Colors.green,\n      'orange' => Colors.orange,\n      'blue' => Colors.blue,\n      'yellow' => Colors.yellow,\n      'cyan' => Colors.cyan,\n      _ => Colors.blue,\n    };\n  }\n\n  ThemeData getTheme(\n    Color primary,\n    Color? secondary,\n    Color? tertiary,\n    Brightness brightness,\n  ) {\n    String? font;\n    List<String>? fallback;\n    if (App.isLinux || App.isWindows) {\n      font = 'Noto Sans CJK';\n      fallback = [\n        'Segoe UI',\n        'Noto Sans SC',\n        'Noto Sans TC',\n        'Noto Sans',\n        'Microsoft YaHei',\n        'PingFang SC',\n        'Arial',\n        'sans-serif'\n      ];\n    }\n    return ThemeData(\n      colorScheme: SeedColorScheme.fromSeeds(\n        primaryKey: primary,\n        secondaryKey: secondary,\n        tertiaryKey: tertiary,\n        brightness: brightness,\n        tones: FlexTones.vividBackground(brightness),\n      ),\n      fontFamily: font,\n      fontFamilyFallback: fallback,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget home;\n    if (appdata.settings['authorizationRequired']) {\n      home = AuthPage(\n        onSuccessfulAuth: () {\n          App.rootContext.toReplacement(() => const MainPage());\n        },\n      );\n    } else {\n      home = const MainPage();\n    }\n    return DynamicColorBuilder(builder: (light, dark) {\n      Color? primary, secondary, tertiary;\n      if (appdata.settings['color'] != 'system' ||\n          light == null ||\n          dark == null) {\n        primary = translateColorSetting();\n      } else {\n        primary = light.primary;\n        secondary = light.secondary;\n        tertiary = light.tertiary;\n      }\n      return MaterialApp(\n        title: \"venera\",\n        home: home,\n        debugShowCheckedModeBanner: false,\n        theme: getTheme(primary, secondary, tertiary, Brightness.light),\n        navigatorKey: App.rootNavigatorKey,\n        darkTheme: getTheme(primary, secondary, tertiary, Brightness.dark),\n        themeMode: switch (appdata.settings['theme_mode']) {\n          'light' => ThemeMode.light,\n          'dark' => ThemeMode.dark,\n          _ => ThemeMode.system\n        },\n        color: Colors.transparent,\n        localizationsDelegates: [\n          GlobalMaterialLocalizations.delegate,\n          GlobalCupertinoLocalizations.delegate,\n        ],\n        locale: () {\n          var lang = appdata.settings['language'];\n          if (lang == 'system') {\n            return null;\n          }\n          return switch (lang) {\n            'zh-CN' => const Locale('zh', 'CN'),\n            'zh-TW' => const Locale('zh', 'TW'),\n            'en-US' => const Locale('en'),\n            _ => null\n          };\n        }(),\n        supportedLocales: const [\n          Locale('zh', 'CN'),\n          Locale('zh', 'TW'),\n          Locale('en'),\n        ],\n        builder: (context, widget) {\n          ErrorWidget.builder = (details) {\n            Log.error(\"Unhandled Exception\",\n                \"${details.exception}\\n${details.stack}\");\n            return Material(\n              child: Center(\n                child: Text(details.exception.toString()),\n              ),\n            );\n          };\n          if (widget != null) {\n            /// 如果无法检测到状态栏高度设定指定高度\n            /// https://github.com/flutter/flutter/issues/161086\n            var isPaddingCheckError =\n                MediaQuery.of(context).viewPadding.top <= 0 ||\n                MediaQuery.of(context).viewPadding.top > 200;\n\n            if (isPaddingCheckError && Platform.isAndroid) {\n              widget = MediaQuery(\n                  data: MediaQuery.of(context).copyWith(\n                    viewPadding: const EdgeInsets.only(\n                      top: 15,\n                      bottom: 15,\n                    ),\n                    padding: const EdgeInsets.only(\n                      top: 15,\n                      bottom: 15,\n                    ),\n                  ),\n                  child: widget);\n            }\n\n            widget = OverlayWidget(widget);\n            if (App.isDesktop) {\n              widget = Shortcuts(\n                shortcuts: {\n                  LogicalKeySet(LogicalKeyboardKey.escape): VoidCallbackIntent(\n                    App.pop,\n                  ),\n                },\n                child: MouseBackDetector(\n                  onTapDown: App.pop,\n                  child: WindowFrame(widget),\n                ),\n              );\n            }\n            return _SystemUiProvider(Material(\n              color: App.isLinux ? Colors.transparent : null,\n              child: widget,\n            ));\n          }\n          throw ('widget is null');\n        },\n      );\n    });\n  }\n}\n\nclass _SystemUiProvider extends StatelessWidget {\n  const _SystemUiProvider(this.child);\n\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    var brightness = Theme.of(context).brightness;\n    SystemUiOverlayStyle systemUiStyle;\n    if (brightness == Brightness.light) {\n      systemUiStyle = SystemUiOverlayStyle.dark.copyWith(\n        statusBarColor: Colors.transparent,\n        systemNavigationBarColor: Colors.transparent,\n        systemNavigationBarIconBrightness: Brightness.dark,\n      );\n    } else {\n      systemUiStyle = SystemUiOverlayStyle.light.copyWith(\n        statusBarColor: Colors.transparent,\n        systemNavigationBarColor: Colors.transparent,\n        systemNavigationBarIconBrightness: Brightness.light,\n      );\n    }\n    return AnnotatedRegion<SystemUiOverlayStyle>(\n      value: systemUiStyle,\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/network/app_dio.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:dio/dio.dart';\nimport 'package:flutter/services.dart';\nimport 'package:rhttp/rhttp.dart' as rhttp;\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/network/cache.dart';\nimport 'package:venera/network/proxy.dart';\n\nimport '../foundation/app.dart';\nimport 'cloudflare.dart';\nimport 'cookie_jar.dart';\n\nexport 'package:dio/dio.dart';\n\nclass MyLogInterceptor implements Interceptor {\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    Log.error(\"Network\",\n        \"${err.requestOptions.method} ${err.requestOptions.path}\\n$err\\n${err.response?.data.toString()}\");\n    switch (err.type) {\n      case DioExceptionType.badResponse:\n        var statusCode = err.response?.statusCode;\n        if (statusCode != null) {\n          err = err.copyWith(\n              message: \"Invalid Status Code: $statusCode. \"\n                  \"${_getStatusCodeInfo(statusCode)}\");\n        }\n      case DioExceptionType.connectionTimeout:\n        err = err.copyWith(message: \"Connection Timeout\");\n      case DioExceptionType.receiveTimeout:\n        err = err.copyWith(\n            message: \"Receive Timeout: \"\n                \"This indicates that the server is too busy to respond\");\n      case DioExceptionType.unknown:\n        if (err.toString().contains(\"Connection terminated during handshake\")) {\n          err = err.copyWith(\n              message: \"Connection terminated during handshake: \"\n                  \"This may be caused by the firewall blocking the connection \"\n                  \"or your requests are too frequent.\");\n        } else if (err.toString().contains(\"Connection reset by peer\")) {\n          err = err.copyWith(\n              message: \"Connection reset by peer: \"\n                  \"The error is unrelated to app, please check your network.\");\n        }\n      default:\n        {}\n    }\n    handler.next(err);\n  }\n\n  static const errorMessages = <int, String>{\n    400: \"The Request is invalid.\",\n    401: \"The Request is unauthorized.\",\n    403: \"No permission to access the resource. Check your account or network.\",\n    404: \"Not found.\",\n    429: \"Too many requests. Please try again later.\",\n  };\n\n  String _getStatusCodeInfo(int? statusCode) {\n    if (statusCode != null && statusCode >= 500) {\n      return \"This is server-side error, please try again later. \"\n          \"Do not report this issue.\";\n    } else {\n      return errorMessages[statusCode] ?? \"\";\n    }\n  }\n\n  @override\n  void onResponse(\n      Response<dynamic> response, ResponseInterceptorHandler handler) {\n    var headers = response.headers.map.map((key, value) => MapEntry(\n        key.toLowerCase(), value.length == 1 ? value.first : value.toString()));\n    headers.remove(\"cookie\");\n    String content;\n    if (response.data is List<int>) {\n      try {\n        content = utf8.decode(response.data, allowMalformed: false);\n      } catch (e) {\n        content = \"<Bytes>\\nlength:${response.data.length}\";\n      }\n    } else {\n      content = response.data.toString();\n    }\n    Log.addLog(\n        (response.statusCode != null && response.statusCode! < 400)\n            ? LogLevel.info\n            : LogLevel.error,\n        \"Network\",\n        \"Response ${response.realUri.toString()} ${response.statusCode}\\n\"\n            \"headers:\\n$headers\\n$content\");\n    handler.next(response);\n  }\n\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    const String headerMask = \"********\";\n    const String dataMask = \"****** DATA_PROTECTED ******\";\n    Log.info(\n        \"Network\",\n        \"${options.method} ${options.uri}\\n\"\n            \"headers:\\n${\n              options.extra.containsKey(\"maskHeadersInLog\")\n                ? options.headers.map((key, value) =>\n                  MapEntry(\n                    key,\n                    options.extra[\"maskHeadersInLog\"].contains(key)\n                      ? headerMask\n                      : value\n                  ))\n                : options.headers\n            }\\n\"\n            \"data:\\n${\n              options.extra[\"maskDataInLog\"] == true\n                ? dataMask\n                : options.data\n            }\"\n    );\n    options.connectTimeout = const Duration(seconds: 15);\n    options.receiveTimeout = const Duration(seconds: 15);\n    options.sendTimeout = const Duration(seconds: 15);\n    handler.next(options);\n  }\n}\n\nclass AppDio with DioMixin {\n  AppDio([BaseOptions? options]) {\n    this.options = options ?? BaseOptions();\n    httpClientAdapter = RHttpAdapter();\n    if (App.isInitialized) {\n      interceptors.add(CookieManagerSql(SingleInstanceCookieJar.instance!));\n      interceptors.add(NetworkCacheManager());\n      interceptors.add(CloudflareInterceptor());\n      interceptors.add(MyLogInterceptor());\n    }\n  }\n\n  static final Map<String, bool> _requests = {};\n\n  @override\n  Future<Response<T>> request<T>(\n    String path, {\n    Object? data,\n    Map<String, dynamic>? queryParameters,\n    CancelToken? cancelToken,\n    Options? options,\n    ProgressCallback? onSendProgress,\n    ProgressCallback? onReceiveProgress,\n  }) async {\n    if (options?.headers?['prevent-parallel'] == 'true') {\n      while (_requests.containsKey(path)) {\n        await Future.delayed(const Duration(milliseconds: 20));\n      }\n      _requests[path] = true;\n      options!.headers!.remove('prevent-parallel');\n    }\n    try {\n      return super.request<T>(\n        path,\n        data: data,\n        queryParameters: queryParameters,\n        cancelToken: cancelToken,\n        options: options,\n        onSendProgress: onSendProgress,\n        onReceiveProgress: onReceiveProgress,\n      );\n    } finally {\n      if (_requests.containsKey(path)) {\n        _requests.remove(path);\n      }\n    }\n  }\n}\n\nclass RHttpAdapter implements HttpClientAdapter {\n  Future<rhttp.ClientSettings> get settings async {\n    var proxy = await getProxy();\n\n    return rhttp.ClientSettings(\n      proxySettings: proxy == null\n          ? const rhttp.ProxySettings.noProxy()\n          : rhttp.ProxySettings.proxy(proxy),\n      redirectSettings: const rhttp.RedirectSettings.limited(5),\n      timeoutSettings: const rhttp.TimeoutSettings(\n        connectTimeout: Duration(seconds: 15),\n        keepAliveTimeout: Duration(seconds: 60),\n        keepAlivePing: Duration(seconds: 30),\n      ),\n      throwOnStatusCode: false,\n      dnsSettings: rhttp.DnsSettings.static(overrides: _getOverrides()),\n      tlsSettings: rhttp.TlsSettings(\n        sni: appdata.settings['sni'] != false,\n        verifyCertificates: appdata.settings['ignoreBadCertificate'] != true,\n      ),\n    );\n  }\n\n  static Map<String, List<String>> _getOverrides() {\n    if (!appdata.settings['enableDnsOverrides'] == true) {\n      return {};\n    }\n    var config = appdata.settings[\"dnsOverrides\"];\n    var result = <String, List<String>>{};\n    if (config is Map) {\n      for (var entry in config.entries) {\n        if (entry.key is String && entry.value is String) {\n          result[entry.key] = [entry.value];\n        }\n      }\n    }\n    return result;\n  }\n\n  @override\n  void close({bool force = false}) {}\n\n  @override\n  Future<ResponseBody> fetch(\n    RequestOptions options,\n    Stream<Uint8List>? requestStream,\n    Future<void>? cancelFuture,\n  ) async {\n    if (options.headers['User-Agent'] == null &&\n        options.headers['user-agent'] == null) {\n      options.headers['User-Agent'] = \"venera/v${App.version}\";\n    }\n\n    var res = await rhttp.Rhttp.request(\n      method: rhttp.HttpMethod(options.method),\n      url: options.uri.toString(),\n      settings: await settings,\n      expectBody: rhttp.HttpExpectBody.stream,\n      body: requestStream == null ? null : rhttp.HttpBody.stream(requestStream),\n      headers: rhttp.HttpHeaders.rawMap(\n        Map.fromEntries(\n          options.headers.entries.map(\n            (e) => MapEntry(e.key, e.value.toString().trim()),\n          ),\n        ),\n      ),\n    );\n    if (res is! rhttp.HttpStreamResponse) {\n      throw Exception(\"Invalid response type: ${res.runtimeType}\");\n    }\n    var headers = <String, List<String>>{};\n    for (var entry in res.headers) {\n      var key = entry.$1.toLowerCase();\n      headers[key] ??= [];\n      headers[key]!.add(entry.$2);\n    }\n    return ResponseBody(\n      res.body,\n      res.statusCode,\n      statusMessage: _getStatusMessage(res.statusCode),\n      isRedirect: false,\n      headers: headers,\n    );\n  }\n\n  static String _getStatusMessage(int statusCode) {\n    return switch (statusCode) {\n      200 => \"OK\",\n      201 => \"Created\",\n      202 => \"Accepted\",\n      204 => \"No Content\",\n      206 => \"Partial Content\",\n      301 => \"Moved Permanently\",\n      302 => \"Found\",\n      400 => \"Invalid Status Code 400: The Request is invalid.\",\n      401 => \"Invalid Status Code 401: The Request is unauthorized.\",\n      403 =>\n        \"Invalid Status Code 403: No permission to access the resource. Check your account or network.\",\n      404 => \"Invalid Status Code 404: Not found.\",\n      429 =>\n        \"Invalid Status Code 429: Too many requests. Please try again later.\",\n      _ => \"Invalid Status Code $statusCode\",\n    };\n  }\n}\n"
  },
  {
    "path": "lib/network/cache.dart",
    "content": "import 'dart:typed_data';\nimport 'package:venera/network/app_dio.dart';\n\nclass NetworkCache {\n  final Uri uri;\n\n  final Map<String, dynamic> requestHeaders;\n\n  final Map<String, List<String>> responseHeaders;\n\n  final Object? data;\n\n  final DateTime time;\n\n  final int size;\n\n  const NetworkCache({\n    required this.uri,\n    required this.requestHeaders,\n    required this.responseHeaders,\n    required this.data,\n    required this.time,\n    required this.size,\n  });\n}\n\nclass NetworkCacheManager implements Interceptor {\n  NetworkCacheManager._();\n\n  static final NetworkCacheManager instance = NetworkCacheManager._();\n\n  factory NetworkCacheManager() => instance;\n\n  final Map<Uri, NetworkCache> _cache = {};\n\n  int size = 0;\n\n  NetworkCache? getCache(Uri uri) {\n    return _cache[uri];\n  }\n\n  static const _maxCacheSize = 10 * 1024 * 1024;\n\n  void setCache(NetworkCache cache) {\n    if (_cache.containsKey(cache.uri)) {\n      size -= _cache[cache.uri]!.size;\n    }\n    while (size > _maxCacheSize) {\n      size -= _cache.values.first.size;\n      _cache.remove(_cache.keys.first);\n    }\n    _cache[cache.uri] = cache;\n    size += cache.size;\n  }\n\n  void removeCache(Uri uri) {\n    var cache = _cache[uri];\n    if (cache != null) {\n      size -= cache.size;\n    }\n    _cache.remove(uri);\n  }\n\n  void clear() {\n    _cache.clear();\n    size = 0;\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    if (err.requestOptions.method != \"GET\") {\n      return handler.next(err);\n    }\n    return handler.next(err);\n  }\n\n  @override\n  void onRequest(\n      RequestOptions options, RequestInterceptorHandler handler) async {\n    if (options.method != \"GET\") {\n      return handler.next(options);\n    }\n    var cache = getCache(options.uri);\n    if (cache == null ||\n        !compareHeaders(options.headers, cache.requestHeaders)) {\n      if (options.headers['cache-time'] != null) {\n        options.headers.remove('cache-time');\n      }\n      return handler.next(options);\n    } else {\n      if (options.headers['cache-time'] == 'no') {\n        options.headers.remove('cache-time');\n        removeCache(options.uri);\n        return handler.next(options);\n      }\n    }\n    var time = DateTime.now();\n    var diff = time.difference(cache.time);\n    if (options.headers['cache-time'] == 'long' &&\n        diff < const Duration(hours: 6)) {\n      return handler.resolve(Response(\n        requestOptions: options,\n        data: cache.data,\n        headers: Headers.fromMap(cache.responseHeaders)\n          ..set('venera-cache', 'true'),\n        statusCode: 200,\n      ));\n    } else if (diff < const Duration(seconds: 5)) {\n      return handler.resolve(Response(\n        requestOptions: options,\n        data: cache.data,\n        headers: Headers.fromMap(cache.responseHeaders)\n          ..set('venera-cache', 'true'),\n        statusCode: 200,\n      ));\n    } else if (diff < const Duration(hours: 2)) {\n      var o = options.copyWith(\n        method: \"HEAD\",\n      );\n      var dio = AppDio();\n      var response = await dio.fetch(o);\n      if (response.statusCode == 200 &&\n          compareHeaders(cache.responseHeaders, response.headers.map)) {\n        return handler.resolve(Response(\n          requestOptions: options,\n          data: cache.data,\n          headers: Headers.fromMap(cache.responseHeaders)\n            ..set('venera-cache', 'true'),\n          statusCode: 200,\n        ));\n      }\n    }\n    removeCache(options.uri);\n    handler.next(options);\n  }\n\n  static bool compareHeaders(Map<String, dynamic> a, Map<String, dynamic> b) {\n    a = Map.from(a);\n    b = Map.from(b);\n    const shouldIgnore = [\n      'cache-time',\n      'prevent-parallel',\n      'date',\n      'x-varnish',\n      'cf-ray',\n      'connection',\n      'vary',\n      'content-encoding',\n      'report-to',\n      'server-timing',\n      'token',\n      'set-cookie',\n      'cf-cache-status',\n      'cf-request-id',\n      'cf-ray',\n      'authorization',\n    ];\n    for (var key in shouldIgnore) {\n      a.remove(key);\n      b.remove(key);\n    }\n    if (a.length != b.length) {\n      return false;\n    }\n    for (var key in a.keys) {\n      if (a[key] is List && b[key] is List) {\n        if (a[key].length != b[key].length) {\n          return false;\n        }\n        for (var i = 0; i < a[key].length; i++) {\n          if (a[key][i] != b[key][i]) {\n            return false;\n          }\n        }\n      } else if (a[key] != b[key]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  @override\n  void onResponse(\n      Response<dynamic> response, ResponseInterceptorHandler handler) {\n    if (response.requestOptions.method != \"GET\") {\n      return handler.next(response);\n    }\n    if (response.statusCode != null && response.statusCode! >= 400) {\n      return handler.next(response);\n    }\n    var size = _calculateSize(response.data);\n    if (size != null && size < 1024 * 1024 && size > 0) {\n      var cache = NetworkCache(\n        uri: response.requestOptions.uri,\n        requestHeaders: response.requestOptions.headers,\n        responseHeaders: Map.from(response.headers.map),\n        data: response.data,\n        time: DateTime.now(),\n        size: size,\n      );\n      setCache(cache);\n    }\n    handler.next(response);\n  }\n\n  static int? _calculateSize(Object? data) {\n    if (data == null) {\n      return 0;\n    }\n    if (data is List<int>) {\n      return data.length;\n    }\n    if (data is Uint8List) {\n      return data.length;\n    }\n    if (data is String) {\n      if (data.trim().isEmpty) {\n        return 0;\n      }\n      if (data.length < 512 && data.contains(\"IP address\")) {\n        return 0;\n      }\n      return data.length * 4;\n    }\n    if (data is Map) {\n      return data.toString().length * 4;\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/network/cloudflare.dart",
    "content": "import 'dart:io' as io;\n\nimport 'package:dio/dio.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/pages/webview.dart';\nimport 'package:venera/utils/ext.dart';\n\nimport 'cookie_jar.dart';\n\nclass CloudflareException implements DioException {\n  final String url;\n\n  CloudflareException(this.url);\n\n  @override\n  String toString() {\n    return \"CloudflareException: $url\";\n  }\n\n  static CloudflareException? fromString(String message) {\n    var match = RegExp(r\"CloudflareException: (.+)\").firstMatch(message);\n    if (match == null) return null;\n    return CloudflareException(match.group(1)!);\n  }\n\n  @override\n  DioException copyWith(\n      {RequestOptions? requestOptions,\n      Response<dynamic>? response,\n      DioExceptionType? type,\n      Object? error,\n      StackTrace? stackTrace,\n      String? message}) {\n    return this;\n  }\n\n  @override\n  Object? get error => this;\n\n  @override\n  String? get message => toString();\n\n  @override\n  RequestOptions get requestOptions => RequestOptions();\n\n  @override\n  Response? get response => null;\n\n  @override\n  StackTrace get stackTrace => StackTrace.empty;\n\n  @override\n  DioExceptionType get type => DioExceptionType.badResponse;\n\n  @override\n  DioExceptionReadableStringBuilder? stringBuilder;\n}\n\nclass CloudflareInterceptor extends Interceptor {\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    if (options.headers['cookie'].toString().contains('cf_clearance')) {\n      options.headers['user-agent'] = appdata.implicitData['ua'] ?? webUA;\n    }\n    handler.next(options);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) async {\n    if (err.response?.statusCode == 403) {\n      handler.next(_check(err.response!) ?? err);\n    } else {\n      handler.next(err);\n    }\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    if (response.statusCode == 403) {\n      var err = _check(response);\n      if (err != null) {\n        handler.reject(err);\n        return;\n      }\n    }\n    handler.next(response);\n  }\n\n  CloudflareException? _check(Response response) {\n    if (response.headers['cf-mitigated']?.firstOrNull == \"challenge\") {\n      return CloudflareException(response.requestOptions.uri.toString());\n    }\n    return null;\n  }\n}\n\nvoid passCloudflare(CloudflareException e, void Function() onFinished) async {\n  var url = e.url;\n  var uri = Uri.parse(url);\n\n  void saveCookies(Map<String, String> cookies) {\n    var domain = uri.host;\n    var splits = domain.split('.');\n    if (splits.length > 1) {\n      domain = \".${splits[splits.length - 2]}.${splits[splits.length - 1]}\";\n    }\n    SingleInstanceCookieJar.instance!.saveFromResponse(\n      uri,\n      List<io.Cookie>.generate(cookies.length, (index) {\n        var cookie = io.Cookie(\n            cookies.keys.elementAt(index), cookies.values.elementAt(index));\n        cookie.domain = domain;\n        return cookie;\n      }),\n    );\n  }\n\n  // windows version of package `flutter_inappwebview` cannot get some cookies\n  // Using DesktopWebview instead\n  if (App.isLinux) {\n    var webview = DesktopWebview(\n      initialUrl: url,\n      onTitleChange: (title, controller) async {\n        var head =\n            await controller.evaluateJavascript(\"document.head.innerHTML\") ??\n                \"\";\n        var body =\n            await controller.evaluateJavascript(\"document.body.innerHTML\") ??\n                \"\";\n        Log.info(\"Cloudflare\", \"Checking head: $head\");\n        var isChallenging = head.contains('#challenge-success-text') ||\n            head.contains(\"#challenge-error-text\") ||\n            head.contains(\"#challenge-form\") ||\n            body.contains(\"challenge-platform\") ||\n            body.contains(\"window._cf_chl_opt\");\n        if (!isChallenging) {\n          Log.info(\n            \"Cloudflare\",\n            \"Cloudflare is passed due to there is no challenge css\",\n          );\n          var ua = controller.userAgent;\n          if (ua != null) {\n            appdata.implicitData['ua'] = ua;\n            appdata.writeImplicitData();\n          }\n          var cookiesMap = await controller.getCookies(url);\n          if (cookiesMap['cf_clearance'] == null) {\n            return;\n          }\n          saveCookies(cookiesMap);\n          controller.close();\n          onFinished();\n        }\n      },\n      onClose: onFinished,\n    );\n    webview.open();\n  } else {\n    bool success = false;\n    void check(InAppWebViewController controller) async {\n      var head = await controller.evaluateJavascript(\n          source: \"document.head.innerHTML\") as String;\n      var body = await controller.evaluateJavascript(\n          source: \"document.body.innerHTML\") as String;\n      Log.info(\"Cloudflare\", \"Checking head: $head\");\n      var isChallenging = head.contains('#challenge-success-text') ||\n          head.contains(\"#challenge-error-text\") ||\n          head.contains(\"#challenge-form\") ||\n          body.contains(\"challenge-platform\") ||\n          body.contains(\"window._cf_chl_opt\");\n      if (!isChallenging) {\n        Log.info(\n          \"Cloudflare\",\n          \"Cloudflare is passed due to there is no challenge css\",\n        );\n        var ua = await controller.getUA();\n        if (ua != null) {\n          appdata.implicitData['ua'] = ua;\n          appdata.writeImplicitData();\n        }\n        var cookies = await controller.getCookies(url) ?? [];\n        if (cookies.firstWhereOrNull(\n                (element) => element.name == 'cf_clearance') ==\n            null) {\n          return;\n        }\n        SingleInstanceCookieJar.instance?.saveFromResponse(uri, cookies);\n        if (!success) {\n          App.rootPop();\n          success = true;\n        }\n      }\n    }\n\n    await App.rootContext.to(\n      () => AppWebview(\n        initialUrl: url,\n        singlePage: true,\n        onTitleChange: (title, controller) async {\n          check(controller);\n        },\n        onLoadStop: (controller) async {\n          check(controller);\n        },\n        onStarted: (controller) async {\n          var ua = await controller.getUA();\n          if (ua != null) {\n            appdata.implicitData['ua'] = ua;\n            appdata.writeImplicitData();\n          }\n          var cookies = await controller.getCookies(url) ?? [];\n          SingleInstanceCookieJar.instance?.saveFromResponse(uri, cookies);\n        },\n      ),\n    );\n    onFinished();\n  }\n}\n"
  },
  {
    "path": "lib/network/cookie_jar.dart",
    "content": "import 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/utils/ext.dart';\n\nclass CookieJarSql {\n  late Database _db;\n\n  final String path;\n\n  CookieJarSql(this.path){\n    init();\n  }\n\n  void init() {\n    _db = sqlite3.open(path);\n    _db.execute('''\n      CREATE TABLE IF NOT EXISTS cookies (\n        name TEXT NOT NULL,\n        value TEXT NOT NULL,\n        domain TEXT NOT NULL,\n        path TEXT,\n        expires INTEGER,\n        secure INTEGER,\n        httpOnly INTEGER,\n        PRIMARY KEY (name, domain, path)\n      );\n    ''');\n  }\n\n  void saveFromResponse(Uri uri, List<Cookie> cookies) {\n    var current = loadForRequest(uri);\n    for (var cookie in cookies) {\n      var currentCookie = current.firstWhereOrNull((element) =>\n          element.name == cookie.name &&\n          (cookie.path == null || cookie.path!.startsWith(element.path!)));\n      if (currentCookie != null) {\n        cookie.domain = currentCookie.domain;\n      }\n      _db.execute('''\n        INSERT OR REPLACE INTO cookies (name, value, domain, path, expires, secure, httpOnly)\n        VALUES (?, ?, ?, ?, ?, ?, ?);\n      ''', [\n        cookie.name,\n        cookie.value,\n        cookie.domain ?? uri.host,\n        cookie.path ?? \"/\",\n        cookie.expires?.millisecondsSinceEpoch,\n        cookie.secure ? 1 : 0,\n        cookie.httpOnly ? 1 : 0\n      ]);\n    }\n  }\n\n  List<Cookie> _loadWithDomain(String domain) {\n    var rows = _db.select('''\n      SELECT name, value, domain, path, expires, secure, httpOnly\n      FROM cookies\n      WHERE domain = ?;\n    ''', [domain]);\n\n    return rows\n        .map((row) => Cookie(\n              row[\"name\"] as String,\n              row[\"value\"] as String,\n            )\n              ..domain = row[\"domain\"] as String\n              ..path = row[\"path\"] as String\n              ..expires = row[\"expires\"] == null\n                  ? null\n                  : DateTime.fromMillisecondsSinceEpoch(row[\"expires\"] as int)\n              ..secure = row[\"secure\"] == 1\n              ..httpOnly = row[\"httpOnly\"] == 1)\n        .toList();\n  }\n\n  List<String> _getAcceptedDomains(String host) {\n    var acceptedDomains = <String>[host];\n    var hostParts = host.split(\".\");\n    for (var i = 0; i < hostParts.length - 1; i++) {\n      acceptedDomains.add(\".${hostParts.sublist(i).join(\".\")}\");\n    }\n    return acceptedDomains;\n  }\n\n  List<Cookie> loadForRequest(Uri uri) {\n    // if uri.host is example.example.com, acceptedDomains will be [\".example.example.com\", \".example.com\", \"example.com\"]\n    var acceptedDomains = _getAcceptedDomains(uri.host);\n\n    var cookies = <Cookie>[];\n    for (var domain in acceptedDomains) {\n      cookies.addAll(_loadWithDomain(domain));\n    }\n\n    // check expires\n    var expires = cookies.where((cookie) =>\n        cookie.expires != null && cookie.expires!.isBefore(DateTime.now()));\n    for (var cookie in expires) {\n      _db.execute('''\n        DELETE FROM cookies\n        WHERE name = ? AND domain = ? AND path = ?;\n      ''', [cookie.name, cookie.domain, cookie.path]);\n    }\n\n    return cookies\n        .where((element) =>\n            !expires.contains(element) && _checkPathMatch(uri, element.path))\n        .toList();\n  }\n\n  bool _checkPathMatch(Uri uri, String? cookiePath) {\n    if (cookiePath == null) {\n      return true;\n    }\n\n    if (cookiePath == uri.path) {\n      return true;\n    }\n\n    if (cookiePath == \"/\") {\n      return true;\n    }\n\n    if (cookiePath.endsWith(\"/\")) {\n      return uri.path.startsWith(cookiePath);\n    }\n\n    return uri.path.startsWith(cookiePath);\n  }\n\n  void saveFromResponseCookieHeader(Uri uri, List<String> cookieHeader) {\n    var cookies = <Cookie>[];\n    for (var header in cookieHeader) {\n      try{\n        var cookie = Cookie.fromSetCookieValue(header);\n        cookies.add(cookie);\n      }\n      catch(_) {\n        Log.warning(\"Network\", \"Invalid cookie header: $header\");\n        continue;\n      }\n    }\n    saveFromResponse(uri, cookies);\n  }\n\n  String loadForRequestCookieHeader(Uri uri) {\n    var cookies = loadForRequest(uri);\n    var map = <String, Cookie>{};\n    for (var cookie in cookies) {\n      if(map.containsKey(cookie.name)) {\n        if(cookie.domain![0] != '.' && map[cookie.name]!.domain![0] == '.') {\n          map[cookie.name] = cookie;\n        } else if(cookie.domain!.length > map[cookie.name]!.domain!.length) {\n          map[cookie.name] = cookie;\n        }\n      } else {\n        map[cookie.name] = cookie;\n      }\n    }\n    return map.entries.map((cookie) => \"${cookie.value.name}=${cookie.value.value}\").join(\"; \");\n  }\n\n  void delete(Uri uri, String name) {\n    var acceptedDomains = _getAcceptedDomains(uri.host);\n    for (var domain in acceptedDomains) {\n      _db.execute('''\n        DELETE FROM cookies\n        WHERE name = ? AND domain = ? AND path = ?;\n      ''', [name, domain, uri.path]);\n    }\n  }\n\n  void deleteUri(Uri uri) {\n    var acceptedDomains = _getAcceptedDomains(uri.host);\n    for (var domain in acceptedDomains) {\n      _db.execute('''\n        DELETE FROM cookies\n        WHERE domain = ?;\n      ''', [domain]);\n    }\n  }\n\n  void deleteAll() {\n    _db.execute('''\n      DELETE FROM cookies;\n    ''');\n  }\n\n  void dispose() {\n    _db.dispose();\n  }\n}\n\nclass SingleInstanceCookieJar extends CookieJarSql {\n  factory SingleInstanceCookieJar(String path) =>\n      instance ??= SingleInstanceCookieJar._create(path);\n\n  SingleInstanceCookieJar._create(super.path);\n\n  static SingleInstanceCookieJar? instance;\n\n  static Future<SingleInstanceCookieJar> createInstance() async {\n    if (instance != null) {\n      return instance!;\n    }\n    var dataPath = (await getApplicationSupportDirectory()).path;\n    instance = SingleInstanceCookieJar(\"$dataPath/cookie.db\");\n    return instance!;\n  }\n}\n\nclass CookieManagerSql extends Interceptor {\n  final CookieJarSql cookieJar;\n\n  CookieManagerSql(this.cookieJar);\n\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    var cookies = cookieJar.loadForRequestCookieHeader(options.uri);\n    if (cookies.isNotEmpty) {\n      if(options.headers[\"cookie\"] != null) {\n        cookies = \"${options.headers[\"cookie\"]}; $cookies\";\n      }\n      options.headers[\"cookie\"] = cookies;\n    }\n    handler.next(options);\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    cookieJar.saveFromResponseCookieHeader(\n        response.requestOptions.uri, response.headers[\"set-cookie\"] ?? []);\n    handler.next(response);\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    handler.next(err);\n  }\n}\n"
  },
  {
    "path": "lib/network/download.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\n\nimport 'package:flutter/widgets.dart' show ChangeNotifier;\nimport 'package:flutter_saf/flutter_saf.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/network/images.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/file_type.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\n\nimport 'file_downloader.dart';\n\nabstract class DownloadTask with ChangeNotifier {\n  /// 0-1\n  double get progress;\n\n  bool get isError;\n\n  bool get isPaused;\n\n  /// bytes per second\n  int get speed;\n\n  void cancel();\n\n  void pause();\n\n  void resume();\n\n  String get title;\n\n  String? get cover;\n\n  String get message;\n\n  /// root path for the comic. If null, the task is not scheduled.\n  String? path;\n\n  /// convert current state to json, which can be used to restore the task\n  Map<String, dynamic> toJson();\n\n  LocalComic toLocalComic();\n\n  String get id;\n\n  ComicType get comicType;\n\n  static DownloadTask? fromJson(Map<String, dynamic> json) {\n    switch (json[\"type\"]) {\n      case \"ImagesDownloadTask\":\n        return ImagesDownloadTask.fromJson(json);\n      default:\n        return null;\n    }\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is DownloadTask &&\n        other.id == id &&\n        other.comicType == comicType;\n  }\n\n  @override\n  int get hashCode => Object.hash(id, comicType);\n}\n\nclass ImagesDownloadTask extends DownloadTask with _TransferSpeedMixin {\n  final ComicSource source;\n\n  final String comicId;\n\n  /// comic details. If null, the comic details will be fetched from the source.\n  ComicDetails? comic;\n\n  /// chapters to download. If null, all chapters will be downloaded.\n  final List<String>? chapters;\n\n  @override\n  String get id => comicId;\n\n  @override\n  ComicType get comicType => ComicType(source.key.hashCode);\n\n  String? comicTitle;\n\n  ImagesDownloadTask({\n    required this.source,\n    required this.comicId,\n    this.comic,\n    this.chapters,\n    this.comicTitle,\n  });\n\n  @override\n  void cancel() {\n    _isRunning = false;\n    LocalManager().removeTask(this);\n    var local = LocalManager().find(id, comicType);\n    if (path != null) {\n      if (local == null) {\n        Future.sync(() async {\n          var tasks = this.tasks.values.toList();\n          for (var i = 0; i < tasks.length; i++) {\n            if (!tasks[i].isComplete) {\n              tasks[i].cancel();\n              await tasks[i].wait();\n            }\n          }\n          try {\n            await Directory(path!).delete(recursive: true);\n          }\n          catch(e) {\n            Log.error(\"Download\", \"Failed to delete directory: $e\");\n          }\n        });\n      } else if (chapters != null) {\n        for (var c in chapters!) {\n          var dir = Directory(FilePath.join(path!, c));\n          if (dir.existsSync()) {\n            dir.deleteSync(recursive: true);\n          }\n        }\n      }\n    }\n  }\n\n  @override\n  String? get cover => _cover ?? comic?.cover;\n\n  @override\n  String get message => _message;\n\n  @override\n  void pause() {\n    if (isPaused) {\n      return;\n    }\n    _isRunning = false;\n    _message = \"Paused\";\n    _currentSpeed = 0;\n    var shouldMove = <int>[];\n    for (var entry in tasks.entries) {\n      if (!entry.value.isComplete) {\n        entry.value.cancel();\n        shouldMove.add(entry.key);\n      }\n    }\n    for (var i in shouldMove) {\n      tasks.remove(i);\n    }\n    stopRecorder();\n    notifyListeners();\n  }\n\n  @override\n  double get progress => _totalCount == 0 ? 0 : _downloadedCount / _totalCount;\n\n  bool _isRunning = false;\n\n  bool _isError = false;\n\n  String _message = \"Fetching comic info...\";\n\n  String? _cover;\n\n  /// All images to download, key is chapter name\n  Map<String, List<String>>? _images;\n\n  /// Downloaded image count\n  int _downloadedCount = 0;\n\n  /// Total image count\n  int _totalCount = 0;\n\n  /// Current downloading image index\n  int _index = 0;\n\n  /// Current downloading chapter, index of [_images]\n  int _chapter = 0;\n\n  var tasks = <int, _ImageDownloadWrapper>{};\n\n  int get _maxConcurrentTasks =>\n      (appdata.settings[\"downloadThreads\"] as num).toInt();\n\n  void _scheduleTasks() {\n    var images = _images![_images!.keys.elementAt(_chapter)]!;\n    var downloading = 0;\n    for (var i = _index; i < images.length; i++) {\n      if (downloading >= _maxConcurrentTasks) {\n        return;\n      }\n      if (tasks[i] != null) {\n        if (!tasks[i]!.isComplete) {\n          downloading++;\n        }\n        if (tasks[i]!.error == null) {\n          continue;\n        }\n      }\n      Directory saveTo;\n      if (comic!.chapters != null) {\n        saveTo = Directory(FilePath.join(\n          path!,\n          LocalManager.getChapterDirectoryName(\n            _images!.keys.elementAt(_chapter),\n          ),\n        ));\n        if (!saveTo.existsSync()) {\n          saveTo.createSync(recursive: true);\n        }\n      } else {\n        saveTo = Directory(path!);\n      }\n      var task = _ImageDownloadWrapper(\n        this,\n        _images!.keys.elementAt(_chapter),\n        images[i],\n        saveTo,\n        i,\n      );\n      tasks[i] = task;\n      task.wait().then((task) {\n        if (task.isComplete) {\n          _scheduleTasks();\n        }\n      });\n      downloading++;\n    }\n  }\n\n  @override\n  void resume() async {\n    if (_isRunning) return;\n    _isError = false;\n    _message = \"Resuming...\";\n    _isRunning = true;\n    notifyListeners();\n    runRecorder();\n\n    if (comic == null) {\n      _message = \"Fetching comic info...\";\n      notifyListeners();\n      var res = await _runWithRetry(() async {\n        var r = await source.loadComicInfo!(comicId);\n        if (r.error) {\n          throw r.errorMessage!;\n        } else {\n          return r.data;\n        }\n      });\n      if (!_isRunning) {\n        return;\n      }\n      if (res.error) {\n        _setError(\"Error: ${res.errorMessage}\");\n        return;\n      } else {\n        comic = res.data;\n      }\n    }\n\n    if (path == null) {\n      try {\n        var dir = await LocalManager().findValidDirectory(\n          comicId,\n          comicType,\n          comic!.title,\n        );\n        if (!(await dir.exists())) {\n          await dir.create();\n        }\n        path = dir.path;\n      } catch (e, s) {\n        Log.error(\"Download\", e.toString(), s);\n        _setError(\"Error: $e\");\n        return;\n      }\n    }\n\n    await LocalManager().saveCurrentDownloadingTasks();\n\n    if (_cover == null) {\n      _message = \"Downloading cover...\";\n      notifyListeners();\n      var res = await _runWithRetry(() async {\n        Uint8List? data;\n        await for (var progress\n            in ImageDownloader.loadThumbnail(comic!.cover, source.key)) {\n          if (progress.imageBytes != null) {\n            data = progress.imageBytes;\n          }\n        }\n        if (data == null) {\n          throw \"Failed to download cover\";\n        }\n        var fileType = detectFileType(data);\n        var file = File(FilePath.join(path!, \"cover${fileType.ext}\"));\n        file.writeAsBytesSync(data);\n        return \"file://${file.path}\";\n      });\n      if (res.error) {\n        Log.error(\"Download\", res.errorMessage!);\n        _setError(\"Error: ${res.errorMessage}\");\n        return;\n      } else {\n        _cover = res.data;\n        notifyListeners();\n      }\n      await LocalManager().saveCurrentDownloadingTasks();\n    }\n\n    if (_images == null) {\n      if (comic!.chapters == null) {\n        _message = \"Fetching image list...\";\n        notifyListeners();\n        var res = await _runWithRetry(() async {\n          var r = await source.loadComicPages!(comicId, null);\n          if (r.error) {\n            throw r.errorMessage!;\n          } else {\n            return r.data;\n          }\n        });\n        if (!_isRunning) {\n          return;\n        }\n        if (res.error) {\n          Log.error(\"Download\", res.errorMessage!);\n          _setError(\"Error: ${res.errorMessage}\");\n          return;\n        } else {\n          _images = {'': res.data};\n          _totalCount = _images!['']!.length;\n        }\n      } else {\n        _images = {};\n        _totalCount = 0;\n        int cpCount = 0;\n        int totalCpCount =\n            chapters?.length ?? comic!.chapters!.allChapters.length;\n        for (var i in comic!.chapters!.allChapters.keys) {\n          if (chapters != null && !chapters!.contains(i)) {\n            continue;\n          }\n          if (_images![i] != null) {\n            _totalCount += _images![i]!.length;\n            continue;\n          }\n          _message = \"Fetching image list ($cpCount/$totalCpCount)...\";\n          notifyListeners();\n          var res = await _runWithRetry(() async {\n            var r = await source.loadComicPages!(comicId, i);\n            if (r.error) {\n              throw r.errorMessage!;\n            } else {\n              return r.data;\n            }\n          });\n          if (!_isRunning) {\n            return;\n          }\n          if (res.error) {\n            Log.error(\"Download\", res.errorMessage!);\n            _setError(\"Error: ${res.errorMessage}\");\n            return;\n          } else {\n            _images![i] = res.data;\n            _totalCount += _images![i]!.length;\n          }\n        }\n      }\n      _message = \"$_downloadedCount/$_totalCount\";\n      notifyListeners();\n      await LocalManager().saveCurrentDownloadingTasks();\n    }\n\n    while (_chapter < _images!.length) {\n      var images = _images![_images!.keys.elementAt(_chapter)]!;\n      tasks.clear();\n      while (_index < images.length) {\n        _scheduleTasks();\n        var task = tasks[_index]!;\n        await task.wait();\n        if (isPaused) {\n          return;\n        }\n        if (task.error != null) {\n          Log.error(\"Download\", task.error.toString());\n          _setError(\"Error: ${task.error}\");\n          return;\n        }\n        _index++;\n        _downloadedCount++;\n        _message = \"$_downloadedCount/$_totalCount\";\n        await LocalManager().saveCurrentDownloadingTasks();\n      }\n      _index = 0;\n      _chapter++;\n    }\n\n    LocalManager().completeTask(this);\n    stopRecorder();\n  }\n\n  @override\n  void onNextSecond(Timer t) {\n    notifyListeners();\n    super.onNextSecond(t);\n  }\n\n  void _setError(String message) {\n    _isRunning = false;\n    _isError = true;\n    _message = message;\n    notifyListeners();\n    stopRecorder();\n  }\n\n  @override\n  int get speed => currentSpeed;\n\n  @override\n  String get title => comic?.title ?? comicTitle ?? \"Loading...\";\n\n  @override\n  Map<String, dynamic> toJson() {\n    return {\n      \"type\": \"ImagesDownloadTask\",\n      \"source\": source.key,\n      \"comicId\": comicId,\n      \"comic\": comic?.toJson(),\n      \"chapters\": chapters,\n      \"path\": path,\n      \"cover\": _cover,\n      \"images\": _images,\n      \"downloadedCount\": _downloadedCount,\n      \"totalCount\": _totalCount,\n      \"index\": _index,\n      \"chapter\": _chapter,\n    };\n  }\n\n  static ImagesDownloadTask? fromJson(Map<String, dynamic> json) {\n    if (json[\"type\"] != \"ImagesDownloadTask\") {\n      return null;\n    }\n\n    Map<String, List<String>>? images;\n    if (json[\"images\"] != null) {\n      images = {};\n      for (var entry in json[\"images\"].entries) {\n        images[entry.key] = List<String>.from(entry.value);\n      }\n    }\n\n    return ImagesDownloadTask(\n      source: ComicSource.find(json[\"source\"])!,\n      comicId: json[\"comicId\"],\n      comic:\n          json[\"comic\"] == null ? null : ComicDetails.fromJson(json[\"comic\"]),\n      chapters: ListOrNull.from(json[\"chapters\"]),\n    )\n      ..path = json[\"path\"]\n      .._cover = json[\"cover\"]\n      .._images = images\n      .._downloadedCount = json[\"downloadedCount\"]\n      .._totalCount = json[\"totalCount\"]\n      .._index = json[\"index\"]\n      .._chapter = json[\"chapter\"];\n  }\n\n  @override\n  bool get isError => _isError;\n\n  @override\n  bool get isPaused => !_isRunning;\n\n  @override\n  LocalComic toLocalComic() {\n    return LocalComic(\n      id: comic!.id,\n      title: title,\n      subtitle: comic!.subTitle ?? '',\n      tags: comic!.tags.entries.expand((e) {\n        return e.value.map((v) => \"${e.key}:$v\");\n      }).toList(),\n      directory: Directory(path!).name,\n      chapters: comic!.chapters,\n      cover: File(_cover!.split(\"file://\").last).name,\n      comicType: ComicType(source.key.hashCode),\n      downloadedChapters: chapters ?? comic?.chapters?.ids.toList() ?? [],\n      createdAt: DateTime.now(),\n    );\n  }\n\n  @override\n  bool operator ==(Object other) {\n    if (other is ImagesDownloadTask) {\n      return other.comicId == comicId && other.source.key == source.key;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => Object.hash(comicId, source.key);\n}\n\nFuture<Res<T>> _runWithRetry<T>(Future<T> Function() task,\n    {int retry = 3}) async {\n  for (var i = 0; i < retry; i++) {\n    try {\n      return Res(await task());\n    } catch (e) {\n      if (i == retry - 1) {\n        return Res.error(e.toString());\n      }\n      await Future.delayed(Duration(seconds: i + 1));\n    }\n  }\n  throw UnimplementedError();\n}\n\nclass _ImageDownloadWrapper {\n  final ImagesDownloadTask task;\n\n  final String chapter;\n\n  final int index;\n\n  final String image;\n\n  final Directory saveTo;\n\n  _ImageDownloadWrapper(\n    this.task,\n    this.chapter,\n    this.image,\n    this.saveTo,\n    this.index,\n  ) {\n    start();\n  }\n\n  bool isComplete = false;\n\n  String? error;\n\n  bool isCancelled = false;\n\n  void cancel() {\n    isCancelled = true;\n  }\n\n  var completers = <Completer<_ImageDownloadWrapper>>[];\n\n  var retry = 3;\n\n  void start() async {\n    int lastBytes = 0;\n    try {\n      await for (var p in ImageDownloader.loadComicImageUnwrapped(\n          image, task.source.key, task.comicId, chapter)) {\n        if (isCancelled) {\n          return;\n        }\n        task.onData(p.currentBytes - lastBytes);\n        lastBytes = p.currentBytes;\n        if (p.imageBytes != null) {\n          var fileType = detectFileType(p.imageBytes!);\n          var file = saveTo.joinFile(\"$index${fileType.ext}\");\n          await file.writeAsBytes(p.imageBytes!);\n          isComplete = true;\n          for (var c in completers) {\n            c.complete(this);\n          }\n          completers.clear();\n        }\n      }\n    } catch (e, s) {\n      if (isCancelled) {\n        return;\n      }\n      Log.error(\"Download\", e.toString(), s);\n      retry--;\n      if (retry > 0) {\n        start();\n        return;\n      }\n      error = e.toString();\n      for (var c in completers) {\n        if (!c.isCompleted) {\n          c.complete(this);\n        }\n      }\n    }\n  }\n\n  Future<_ImageDownloadWrapper> wait() {\n    if (isComplete) {\n      return Future.value(this);\n    }\n    var c = Completer<_ImageDownloadWrapper>();\n    completers.add(c);\n    return c.future;\n  }\n}\n\nabstract mixin class _TransferSpeedMixin {\n  int _bytesSinceLastSecond = 0;\n\n  int _currentSpeed = 0;\n\n  int get currentSpeed => _currentSpeed;\n\n  Timer? timer;\n\n  void onData(int length) {\n    if (timer == null) return;\n    if (length < 0) {\n      return;\n    }\n    _bytesSinceLastSecond += length;\n  }\n\n  void onNextSecond(Timer t) {\n    _currentSpeed = _bytesSinceLastSecond;\n    _bytesSinceLastSecond = 0;\n  }\n\n  void runRecorder() {\n    if (timer != null) {\n      timer!.cancel();\n    }\n    _bytesSinceLastSecond = 0;\n    timer = Timer.periodic(const Duration(seconds: 1), onNextSecond);\n  }\n\n  void stopRecorder() {\n    timer?.cancel();\n    timer = null;\n    _currentSpeed = 0;\n    _bytesSinceLastSecond = 0;\n  }\n}\n\nclass ArchiveDownloadTask extends DownloadTask {\n  final String archiveUrl;\n\n  final ComicDetails comic;\n\n  late ComicSource source;\n\n  /// Download comic by archive url\n  ///\n  /// Currently only support zip file and comics without chapters\n  ArchiveDownloadTask(this.archiveUrl, this.comic) {\n    source = ComicSource.find(comic.sourceKey)!;\n  }\n\n  FileDownloader? _downloader;\n\n  String _message = \"Fetching comic info...\";\n\n  bool _isRunning = false;\n\n  bool _isError = false;\n\n  void _setError(String message) {\n    _isRunning = false;\n    _isError = true;\n    _message = message;\n    notifyListeners();\n    Log.error(\"Download\", message);\n  }\n\n  @override\n  void cancel() async {\n    _isRunning = false;\n    await _downloader?.stop();\n    if (path != null) {\n      Directory(path!).deleteIgnoreError(recursive: true);\n    }\n    path = null;\n    LocalManager().removeTask(this);\n  }\n\n  @override\n  ComicType get comicType => ComicType(source.key.hashCode);\n\n  @override\n  String? get cover => comic.cover;\n\n  @override\n  String get id => comic.id;\n\n  @override\n  bool get isError => _isError;\n\n  @override\n  bool get isPaused => !_isRunning;\n\n  @override\n  String get message => _message;\n\n  int _currentBytes = 0;\n\n  int _expectedBytes = 0;\n\n  int _speed = 0;\n\n  @override\n  void pause() {\n    _isRunning = false;\n    _message = \"Paused\";\n    _downloader?.stop();\n    notifyListeners();\n  }\n\n  @override\n  double get progress =>\n      _expectedBytes == 0 ? 0 : _currentBytes / _expectedBytes;\n\n  @override\n  void resume() async {\n    if (_isRunning) {\n      return;\n    }\n    _isError = false;\n    _isRunning = true;\n    notifyListeners();\n    _message = \"Downloading...\";\n\n    if (path == null) {\n      var dir = await LocalManager().findValidDirectory(\n        comic.id,\n        comicType,\n        comic.title,\n      );\n      if (!(await dir.exists())) {\n        try {\n          await dir.create();\n        } catch (e) {\n          _setError(\"Error: $e\");\n          return;\n        }\n      }\n      path = dir.path;\n    }\n\n    var archiveFile =\n        File(FilePath.join(App.dataPath, \"archive_downloading.zip\"));\n\n    Log.info(\"Download\", \"Downloading $archiveUrl\");\n\n    _downloader = FileDownloader(archiveUrl, archiveFile.path);\n\n    bool isDownloaded = false;\n\n    try {\n      await for (var status in _downloader!.start()) {\n        _currentBytes = status.downloadedBytes;\n        _expectedBytes = status.totalBytes;\n        _message =\n            \"${bytesToReadableString(_currentBytes)}/${bytesToReadableString(_expectedBytes)}\";\n        _speed = status.bytesPerSecond;\n        isDownloaded = status.isFinished;\n        notifyListeners();\n      }\n    } catch (e) {\n      _setError(\"Error: $e\");\n      return;\n    }\n\n    if (!_isRunning) {\n      return;\n    }\n\n    if (!isDownloaded) {\n      _setError(\"Error: Download failed\");\n      return;\n    }\n\n    try {\n      await _extractArchive(archiveFile.path, path!);\n    } catch (e) {\n      _setError(\"Failed to extract archive: $e\");\n      return;\n    }\n\n    await archiveFile.deleteIgnoreError();\n\n    LocalManager().completeTask(this);\n  }\n\n  static Future<void> _extractArchive(String archive, String outDir) async {\n    var out = Directory(outDir);\n    if (out is AndroidDirectory) {\n      // Saf directory can't be accessed by native code.\n      var cacheDir = FilePath.join(App.cachePath, \"archive_downloading\");\n      Directory(cacheDir).forceCreateSync();\n      await Isolate.run(() {\n        ZipFile.openAndExtract(archive, cacheDir);\n      });\n      await copyDirectoryIsolate(Directory(cacheDir), Directory(outDir));\n      await Directory(cacheDir).deleteIgnoreError(recursive: true);\n    } else {\n      await Isolate.run(() {\n        ZipFile.openAndExtract(archive, outDir);\n      });\n    }\n  }\n\n  @override\n  int get speed => _speed;\n\n  @override\n  String get title => comic.title;\n\n  @override\n  Map<String, dynamic> toJson() {\n    return {\n      \"type\": \"ArchiveDownloadTask\",\n      \"archiveUrl\": archiveUrl,\n      \"comic\": comic.toJson(),\n      \"path\": path,\n    };\n  }\n\n  static ArchiveDownloadTask? fromJson(Map<String, dynamic> json) {\n    if (json[\"type\"] != \"ArchiveDownloadTask\") {\n      return null;\n    }\n    return ArchiveDownloadTask(\n      json[\"archiveUrl\"],\n      ComicDetails.fromJson(json[\"comic\"]),\n    )..path = json[\"path\"];\n  }\n\n  String _findCover() {\n    var files = Directory(path!).listSync();\n    for (var f in files) {\n      if (f.name.startsWith('cover')) {\n        return f.name;\n      }\n    }\n    files.sort((a, b) {\n      return a.name.compareTo(b.name);\n    });\n    return files.first.name;\n  }\n\n  @override\n  LocalComic toLocalComic() {\n    return LocalComic(\n      id: comic.id,\n      title: title,\n      subtitle: comic.subTitle ?? '',\n      tags: comic.tags.entries.expand((e) {\n        return e.value.map((v) => \"${e.key}:$v\");\n      }).toList(),\n      directory: Directory(path!).name,\n      chapters: null,\n      cover: _findCover(),\n      comicType: ComicType(source.key.hashCode),\n      downloadedChapters: [],\n      createdAt: DateTime.now(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/network/file_downloader.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:dio/io.dart';\nimport 'package:venera/network/app_dio.dart';\nimport 'package:venera/network/proxy.dart';\nimport 'package:venera/utils/ext.dart';\n\nclass FileDownloader {\n  final String url;\n  final String savePath;\n  final int maxConcurrent;\n\n  FileDownloader(this.url, this.savePath, {this.maxConcurrent = 4});\n\n  int _currentBytes = 0;\n\n  int _lastBytes = 0;\n\n  late int _fileSize;\n\n  final _dio = Dio();\n\n  RandomAccessFile? _file;\n\n  bool _isWriting = false;\n\n  int _kChunkSize = 16 * 1024 * 1024;\n\n  bool _canceled = false;\n\n  late List<_DownloadBlock> _blocks;\n\n  Future<void> _writeStatus() async {\n    var file = File(\"$savePath.download\");\n    await file.writeAsString(_blocks.map((e) => e.toString()).join(\"\\n\"));\n  }\n\n  Future<void> _readStatus() async {\n    var file = File(\"$savePath.download\");\n    if (!await file.exists()) {\n      return;\n    }\n\n    var lines = await file.readAsLines();\n    _blocks = lines.map((e) => _DownloadBlock.fromString(e)).toList();\n  }\n\n  /// create file and write empty bytes\n  Future<void> _prepareFile() async {\n    var file = File(savePath);\n    if (await file.exists()) {\n      if (file.lengthSync() == _fileSize &&\n          File(\"$savePath.download\").existsSync()) {\n        _file = await file.open(mode: FileMode.append);\n        return;\n      } else {\n        await file.delete();\n      }\n    }\n\n    await file.create(recursive: true);\n    _file = await file.open(mode: FileMode.append);\n    await _file!.truncate(_fileSize);\n  }\n\n  Future<void> _createTasks() async {\n    var res = await _dio.head(url);\n    var length = res.headers[\"content-length\"]?.first;\n    _fileSize = length == null ? 0 : int.parse(length);\n\n    await _prepareFile();\n\n    if (File(\"$savePath.download\").existsSync()) {\n      await _readStatus();\n      _currentBytes = _blocks.fold<int>(0,\n          (previousValue, element) => previousValue + element.downloadedBytes);\n    } else {\n      if (_fileSize > 1024 * 1024 * 1024) {\n        _kChunkSize = 64 * 1024 * 1024;\n      } else if (_fileSize > 512 * 1024 * 1024) {\n        _kChunkSize = 32 * 1024 * 1024;\n      }\n\n      _blocks = [];\n      for (var i = 0; i < _fileSize; i += _kChunkSize) {\n        var end = i + _kChunkSize;\n        if (end > _fileSize) {\n          _blocks.add(_DownloadBlock(i, _fileSize, 0, false));\n        } else {\n          _blocks.add(_DownloadBlock(i, i + _kChunkSize, 0, false));\n        }\n      }\n    }\n  }\n\n  Stream<DownloadingStatus> start() {\n    var stream = StreamController<DownloadingStatus>();\n    _download(stream);\n    return stream.stream;\n  }\n\n  void _reportStatus(StreamController<DownloadingStatus> stream) {\n    stream.add(DownloadingStatus(_currentBytes, _fileSize, 0));\n  }\n\n  void _download(StreamController<DownloadingStatus> resultStream) async {\n    try {\n      var proxy = await getProxy();\n      _dio.httpClientAdapter = IOHttpClientAdapter(\n        createHttpClient: () {\n          return HttpClient()\n            ..findProxy = (uri) => proxy == null ? \"DIRECT\" : \"PROXY $proxy\";\n        },\n      );\n\n      // get file size\n      await _createTasks();\n\n      if (_canceled) return;\n\n      // check if file is downloaded\n      if (_currentBytes >= _fileSize) {\n        await _file!.close();\n        _file = null;\n        _reportStatus(resultStream);\n        resultStream.close();\n        return;\n      }\n\n      _reportStatus(resultStream);\n\n      Timer.periodic(const Duration(seconds: 1), (timer) {\n        if (_canceled || _currentBytes >= _fileSize) {\n          timer.cancel();\n          return;\n        }\n        resultStream.add(DownloadingStatus(\n            _currentBytes, _fileSize, _currentBytes - _lastBytes));\n        _lastBytes = _currentBytes;\n      });\n\n      // start downloading\n      await _scheduleDownload();\n      if (_canceled) {\n        resultStream.close();\n        return;\n      }\n      await _file!.close();\n      _file = null;\n      await File(\"$savePath.download\").delete();\n\n      // check if download is finished\n      if (_currentBytes < _fileSize) {\n        resultStream\n            .addError(Exception(\"Download failed: Expected $_fileSize bytes, \"\n                \"but only $_currentBytes bytes downloaded.\"));\n        resultStream.close();\n      }\n\n      resultStream.add(DownloadingStatus(_currentBytes, _fileSize, 0, true));\n      resultStream.close();\n    } catch (e, s) {\n      await _file?.close();\n      _file = null;\n      resultStream.addError(e, s);\n      resultStream.close();\n    }\n  }\n\n  Future<void> _scheduleDownload() async {\n    var tasks = <Future>[];\n    while (true) {\n      if (_canceled) return;\n      if (tasks.length >= maxConcurrent) {\n        await Future.any(tasks);\n      }\n      final block = _blocks.firstWhereOrNull((element) =>\n          !element.downloading &&\n          element.end - element.start > element.downloadedBytes);\n      if (block == null) {\n        break;\n      }\n      block.downloading = true;\n      var task = _fetchBlock(block);\n      task.then((value) => tasks.remove(task), onError: (e) {\n        if(_canceled) return;\n        throw e;\n      });\n      tasks.add(task);\n    }\n    await Future.wait(tasks);\n  }\n\n  Future<void> _fetchBlock(_DownloadBlock block) async {\n    final start = block.start;\n    final end = block.end;\n\n    if (start > _fileSize) {\n      return;\n    }\n\n    var options = Options(\n      responseType: ResponseType.stream,\n      headers: {\n        \"Range\": \"bytes=${start + block.downloadedBytes}-${end - 1}\",\n        \"Accept\": \"*/*\",\n        \"Accept-Encoding\": \"deflate, gzip\",\n      },\n      preserveHeaderCase: true,\n    );\n    var res = await _dio.get<ResponseBody>(url, options: options);\n    if (_canceled) return;\n    if (res.data == null) {\n      throw Exception(\"Failed to block $start-$end\");\n    }\n\n    var buffer = <int>[];\n    await for (var data in res.data!.stream) {\n      if (_canceled) return;\n      buffer.addAll(data);\n      if (buffer.length > 16 * 1024) {\n        if (_isWriting) continue;\n        _currentBytes += buffer.length;\n        _isWriting = true;\n        await _file!.setPosition(start + block.downloadedBytes);\n        await _file!.writeFrom(buffer);\n        block.downloadedBytes += buffer.length;\n        buffer.clear();\n        await _writeStatus();\n        _isWriting = false;\n      }\n    }\n\n    if (buffer.isNotEmpty) {\n      while (_isWriting) {\n        await Future.delayed(const Duration(milliseconds: 10));\n      }\n      _isWriting = true;\n      _currentBytes += buffer.length;\n      await _file!.setPosition(start + block.downloadedBytes);\n      await _file!.writeFrom(buffer);\n      block.downloadedBytes += buffer.length;\n      await _writeStatus();\n      _isWriting = false;\n    }\n\n    block.downloading = false;\n  }\n\n  Future<void> stop() async {\n    _canceled = true;\n    await _file?.close();\n    _file = null;\n  }\n}\n\nclass DownloadingStatus {\n  /// The current downloaded bytes\n  final int downloadedBytes;\n\n  /// The total bytes of the file\n  final int totalBytes;\n\n  /// Whether the download is finished\n  final bool isFinished;\n\n  /// The download speed in bytes per second\n  final int bytesPerSecond;\n\n  const DownloadingStatus(\n      this.downloadedBytes, this.totalBytes, this.bytesPerSecond,\n      [this.isFinished = false]);\n\n  @override\n  String toString() {\n    return \"Downloaded: $downloadedBytes/$totalBytes ${isFinished ? \"Finished\" : \"\"}\";\n  }\n}\n\nclass _DownloadBlock {\n  final int start;\n  final int end;\n  int downloadedBytes;\n  bool downloading;\n\n  _DownloadBlock(this.start, this.end, this.downloadedBytes, this.downloading);\n\n  @override\n  String toString() {\n    return \"$start-$end-$downloadedBytes\";\n  }\n\n  _DownloadBlock.fromString(String str)\n      : start = int.parse(str.split(\"-\")[0]),\n        end = int.parse(str.split(\"-\")[1]),\n        downloadedBytes = int.parse(str.split(\"-\")[2]),\n        downloading = false;\n}\n"
  },
  {
    "path": "lib/network/images.dart",
    "content": "import 'dart:async';\nimport 'dart:typed_data';\n\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:venera/foundation/cache_manager.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/utils/image.dart';\n\nimport 'app_dio.dart';\n\nabstract class ImageDownloader {\n  static Stream<ImageDownloadProgress> loadThumbnail(\n      String url, String? sourceKey,\n      [String? cid]) async* {\n    final cacheKey = \"$url@$sourceKey${cid != null ? '@$cid' : ''}\";\n    final cache = await CacheManager().findCache(cacheKey);\n\n    if (cache != null) {\n      var data = await cache.readAsBytes();\n      yield ImageDownloadProgress(\n        currentBytes: data.length,\n        totalBytes: data.length,\n        imageBytes: data,\n      );\n    }\n\n    var configs = <String, dynamic>{};\n    if (sourceKey != null) {\n      var comicSource = ComicSource.find(sourceKey);\n      configs = comicSource?.getThumbnailLoadingConfig?.call(url) ?? {};\n    }\n    configs['headers'] ??= {};\n    if (configs['headers']['user-agent'] == null &&\n        configs['headers']['User-Agent'] == null) {\n      configs['headers']['user-agent'] = webUA;\n    }\n\n    if (((configs['url'] as String?) ?? url).startsWith('cover.') &&\n        sourceKey != null) {\n      var comicSource = ComicSource.find(sourceKey);\n      if(comicSource != null) {\n        var comicInfo = await comicSource.loadComicInfo!(cid!);\n        yield* loadThumbnail(comicInfo.data.cover, sourceKey);\n        return;\n      }\n    }\n\n    var dio = AppDio(BaseOptions(\n      headers: Map<String, dynamic>.from(configs['headers']),\n      method: configs['method'] ?? 'GET',\n      responseType: ResponseType.stream,\n    ));\n\n    String requestUrl = configs['url'] ?? url;\n    if (requestUrl.startsWith('//')) {\n      requestUrl = 'https:$requestUrl';\n    }\n    var req = await dio.request<ResponseBody>(requestUrl,\n        data: configs['data']);\n    var stream = req.data?.stream ?? (throw \"Error: Empty response body.\");\n    int? expectedBytes = req.data!.contentLength;\n    if (expectedBytes == -1) {\n      expectedBytes = null;\n    }\n    var buffer = <int>[];\n    await for (var data in stream) {\n      buffer.addAll(data);\n      if (expectedBytes != null) {\n        yield ImageDownloadProgress(\n          currentBytes: buffer.length,\n          totalBytes: expectedBytes,\n        );\n      }\n    }\n\n    if (configs['onResponse'] is JSInvokable) {\n      final uint8List = Uint8List.fromList(buffer);\n      buffer = (configs['onResponse'] as JSInvokable)([uint8List]);\n      (configs['onResponse'] as JSInvokable).free();\n    }\n\n    await CacheManager().writeCache(cacheKey, buffer);\n    yield ImageDownloadProgress(\n      currentBytes: buffer.length,\n      totalBytes: buffer.length,\n      imageBytes: Uint8List.fromList(buffer),\n    );\n  }\n\n  static final _loadingImages = <String, _StreamWrapper<ImageDownloadProgress>>{};\n\n  /// Cancel all loading images.\n  static void cancelAllLoadingImages() {\n    for (var wrapper in _loadingImages.values) {\n      wrapper.cancel();\n    }\n    _loadingImages.clear();\n  }\n\n  /// Load a comic image from the network or cache.\n  /// The function will prevent multiple requests for the same image.\n  static Stream<ImageDownloadProgress> loadComicImage(\n      String imageKey, String? sourceKey, String cid, String eid) {\n    final cacheKey = \"$imageKey@$sourceKey@$cid@$eid\";\n    if (_loadingImages.containsKey(cacheKey)) {\n      return _loadingImages[cacheKey]!.stream;\n    }\n    final stream = _StreamWrapper<ImageDownloadProgress>(\n      _loadComicImage(imageKey, sourceKey, cid, eid),\n      (wrapper) {\n        _loadingImages.remove(cacheKey);\n      },\n    );\n    _loadingImages[cacheKey] = stream;\n    return stream.stream;\n  }\n\n  static Stream<ImageDownloadProgress> loadComicImageUnwrapped(\n      String imageKey, String? sourceKey, String cid, String eid) {\n    return _loadComicImage(imageKey, sourceKey, cid, eid);\n  }\n\n  static Stream<ImageDownloadProgress> _loadComicImage(\n      String imageKey, String? sourceKey, String cid, String eid) async* {\n    final cacheKey = \"$imageKey@$sourceKey@$cid@$eid\";\n    final cache = await CacheManager().findCache(cacheKey);\n\n    if (cache != null) {\n      var data = await cache.readAsBytes();\n      yield ImageDownloadProgress(\n        currentBytes: data.length,\n        totalBytes: data.length,\n        imageBytes: data,\n      );\n    }\n\n    Future<Map<String, dynamic>?> Function()? onLoadFailed;\n\n    var configs = <String, dynamic>{};\n    if (sourceKey != null) {\n      var comicSource = ComicSource.find(sourceKey);\n      configs = (await comicSource!.getImageLoadingConfig\n              ?.call(imageKey, cid, eid)) ??\n          {};\n    }\n    var retryLimit = 5;\n    while (true) {\n      try {\n        configs['headers'] ??= {\n          'user-agent': webUA,\n        };\n\n        if (configs['onLoadFailed'] is JSInvokable) {\n          onLoadFailed = () async {\n            dynamic result = (configs['onLoadFailed'] as JSInvokable)([]);\n            if (result is Future) {\n              result = await result;\n            }\n            if (result is! Map<String, dynamic>) return null;\n            return result;\n          };\n        }\n\n        var dio = AppDio(BaseOptions(\n          headers: configs['headers'],\n          method: configs['method'] ?? 'GET',\n          responseType: ResponseType.stream,\n        ));\n\n        var req = await dio.request<ResponseBody>(configs['url'] ?? imageKey,\n            data: configs['data']);\n        var stream = req.data?.stream ?? (throw \"Error: Empty response body.\");\n        int? expectedBytes = req.data!.contentLength;\n        if (expectedBytes == -1) {\n          expectedBytes = null;\n        }\n        var buffer = <int>[];\n        await for (var data in stream) {\n          buffer.addAll(data);\n          yield ImageDownloadProgress(\n            currentBytes: buffer.length,\n            totalBytes: expectedBytes,\n          );\n        }\n\n        if (configs['onResponse'] is JSInvokable) {\n          dynamic result = (configs['onResponse'] as JSInvokable)([Uint8List.fromList(buffer)]);\n          if (result is Future) {\n            result = await result;\n          }\n          if (result is List<int>) {\n            buffer = result;\n          } else {\n            throw \"Error: Invalid onResponse result.\";\n          }\n          (configs['onResponse'] as JSInvokable).free();\n        }\n\n        Uint8List data;\n        if (buffer is Uint8List) {\n          data = buffer;\n        } else {\n          data = Uint8List.fromList(buffer);\n          buffer.clear();\n        }\n\n        if (configs['modifyImage'] != null) {\n          var newData = await modifyImageWithScript(\n            data,\n            configs['modifyImage'],\n          );\n          data = newData;\n        }\n\n        await CacheManager().writeCache(cacheKey, data);\n        yield ImageDownloadProgress(\n          currentBytes: data.length,\n          totalBytes: data.length,\n          imageBytes: data,\n        );\n        return;\n      } catch (e) {\n        if (retryLimit < 0 || onLoadFailed == null) {\n          rethrow;\n        }\n        var newConfig = await onLoadFailed();\n        (configs['onLoadFailed'] as JSInvokable).free();\n        onLoadFailed = null;\n        if (newConfig == null) {\n          rethrow;\n        }\n        configs = newConfig;\n        retryLimit--;\n      } finally {\n        if (onLoadFailed != null) {\n          (configs['onLoadFailed'] as JSInvokable).free();\n        }\n      }\n    }\n  }\n}\n\n/// A wrapper class for a stream that\n/// allows multiple listeners to listen to the same stream.\nclass _StreamWrapper<T> {\n  final Stream<T> _stream;\n\n  final List<StreamController> controllers = [];\n\n  final void Function(_StreamWrapper<T> wrapper) onClosed;\n\n  bool isClosed = false;\n\n  _StreamWrapper(this._stream, this.onClosed) {\n    _listen();\n  }\n\n  void _listen() async {\n    try {\n      await for (var data in _stream) {\n        if (isClosed) {\n          break;\n        }\n        for (var controller in controllers) {\n          if (!controller.isClosed) {\n            controller.add(data);\n          }\n        }\n      }\n    }\n    catch (e) {\n      for (var controller in controllers) {\n        if (!controller.isClosed) {\n          controller.addError(e);\n        }\n      }\n    }\n    finally {\n      for (var controller in controllers) {\n        if (!controller.isClosed) {\n          controller.close();\n        }\n      }\n    }\n    controllers.clear();\n    isClosed = true;\n    onClosed(this);\n  }\n\n  Stream<T> get stream {\n    if (isClosed) {\n      throw Exception('Stream is closed');\n    }\n    var controller = StreamController<T>();\n    controllers.add(controller);\n    controller.onCancel = () {\n      controllers.remove(controller);\n    };\n    return controller.stream;\n  }\n\n  void cancel() {\n    for (var controller in controllers) {\n      controller.close();\n    }\n    controllers.clear();\n    isClosed = true;\n  }\n}\n\nclass ImageDownloadProgress {\n  final int currentBytes;\n\n  final int? totalBytes;\n\n  final Uint8List? imageBytes;\n\n  const ImageDownloadProgress({\n    required this.currentBytes,\n    required this.totalBytes,\n    this.imageBytes,\n  });\n}\n"
  },
  {
    "path": "lib/network/proxy.dart",
    "content": "import 'package:flutter/services.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/utils/ext.dart';\n\nString? _cachedProxy;\n\nDateTime? _cachedProxyTime;\n\nFuture<String?> getProxy() async {\n  if (_cachedProxyTime != null &&\n      DateTime.now().difference(_cachedProxyTime!).inSeconds < 1) {\n    return _cachedProxy;\n  }\n  String? proxy = await _getProxy();\n  _cachedProxy = proxy;\n  _cachedProxyTime = DateTime.now();\n  return proxy;\n}\n\nFuture<String?> _getProxy() async {\n  if ((appdata.settings['proxy'] as String).removeAllBlank == \"direct\") {\n    return null;\n  }\n  if (appdata.settings['proxy'] != \"system\") return appdata.settings['proxy'];\n\n  String res;\n  if (!App.isLinux) {\n    const channel = MethodChannel(\"venera/method_channel\");\n    try {\n      res = await channel.invokeMethod(\"getProxy\");\n    } catch (e) {\n      return null;\n    }\n  } else {\n    res = \"No Proxy\";\n  }\n  if (res == \"No Proxy\") return null;\n\n  if (res.contains(\";\")) {\n    var proxies = res.split(\";\");\n    for (String proxy in proxies) {\n      proxy = proxy.removeAllBlank;\n      if (proxy.startsWith('https=')) {\n        return proxy.substring(6);\n      }\n    }\n  }\n\n  final RegExp regex = RegExp(\n    r'^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d+$',\n    caseSensitive: false,\n    multiLine: false,\n  );\n  if (!regex.hasMatch(res)) {\n    return null;\n  }\n\n  return res;\n}\n"
  },
  {
    "path": "lib/pages/aggregated_search_page.dart",
    "content": "import \"package:flutter/material.dart\";\nimport 'package:shimmer_animation/shimmer_animation.dart';\nimport \"package:venera/components/components.dart\";\nimport \"package:venera/foundation/app.dart\";\nimport \"package:venera/foundation/appdata.dart\";\nimport \"package:venera/foundation/comic_source/comic_source.dart\";\nimport \"package:venera/pages/search_result_page.dart\";\nimport \"package:venera/utils/translations.dart\";\n\nclass AggregatedSearchPage extends StatefulWidget {\n  const AggregatedSearchPage({super.key, required this.keyword});\n\n  final String keyword;\n\n  @override\n  State<AggregatedSearchPage> createState() => _AggregatedSearchPageState();\n}\n\nclass _AggregatedSearchPageState extends State<AggregatedSearchPage> {\n  late final List<ComicSource> sources;\n\n  late final SearchBarController controller;\n\n  var _keyword = \"\";\n\n  @override\n  void initState() {\n    var all = ComicSource.all()\n        .where((e) => e.searchPageData != null)\n        .map((e) => e.key)\n        .toList();\n    var settings = appdata.settings['searchSources'] as List;\n    var sources = <String>[];\n    for (var source in settings) {\n      if (all.contains(source)) {\n        sources.add(source);\n      }\n    }\n    this.sources = sources.map((e) => ComicSource.find(e)!).toList();\n    _keyword = widget.keyword;\n    controller = SearchBarController(\n      currentText: widget.keyword,\n      onSearch: (text) {\n        setState(() {\n          _keyword = text;\n        });\n      },\n    );\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(slivers: [\n      SliverSearchBar(controller: controller),\n      SliverList(\n        key: ValueKey(_keyword),\n        delegate: SliverChildBuilderDelegate(\n          (context, index) {\n            final source = sources[index];\n            return _SliverSearchResult(\n              key: ValueKey(source.key),\n              source: source,\n              keyword: _keyword,\n            );\n          },\n          childCount: sources.length,\n        ),\n      ),\n    ]);\n  }\n}\n\nclass _SliverSearchResult extends StatefulWidget {\n  const _SliverSearchResult({\n    required this.source,\n    required this.keyword,\n    super.key,\n  });\n\n  final ComicSource source;\n\n  final String keyword;\n\n  @override\n  State<_SliverSearchResult> createState() => _SliverSearchResultState();\n}\n\nclass _SliverSearchResultState extends State<_SliverSearchResult>\n    with AutomaticKeepAliveClientMixin {\n  bool isLoading = true;\n\n  static const _kComicHeight = 162.0;\n\n  get _comicWidth => _kComicHeight * 0.7;\n\n  static const _kLeftPadding = 16.0;\n\n  List<Comic>? comics;\n\n  String? error;\n\n  void load() async {\n    final data = widget.source.searchPageData!;\n    var options =\n        (data.searchOptions ?? []).map((e) => e.defaultValue).toList();\n    if (data.loadPage != null) {\n      var res = await data.loadPage!(widget.keyword, 1, options);\n      if (!res.error) {\n        setState(() {\n          comics = res.data;\n          isLoading = false;\n        });\n      } else {\n        setState(() {\n          error = res.errorMessage ?? \"Unknown error\".tl;\n          isLoading = false;\n        });\n      }\n    } else if (data.loadNext != null) {\n      var res = await data.loadNext!(widget.keyword, null, options);\n      if (!res.error) {\n        setState(() {\n          comics = res.data;\n          isLoading = false;\n        });\n      } else {\n        setState(() {\n          error = res.errorMessage ?? \"Unknown error\".tl;\n          isLoading = false;\n        });\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    load();\n  }\n\n  Widget buildPlaceHolder() {\n    return Container(\n      height: _kComicHeight,\n      width: _comicWidth,\n      margin: const EdgeInsets.only(left: _kLeftPadding),\n      decoration: BoxDecoration(\n        color: context.colorScheme.surfaceContainerLow,\n        borderRadius: BorderRadius.circular(8),\n      ),\n    );\n  }\n\n  Widget buildComic(Comic c) {\n    return SimpleComicTile(comic: c, withTitle: true)\n        .paddingLeft(_kLeftPadding)\n        .paddingBottom(2);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (error != null && error!.startsWith(\"CloudflareException\")) {\n      error = \"Cloudflare verification required\".tl;\n    }\n    super.build(context);\n    return InkWell(\n      onTap: () {\n        context.to(\n          () => SearchResultPage(\n            text: widget.keyword,\n            sourceKey: widget.source.key,\n          ),\n        );\n      },\n      child: Column(\n        children: [\n          ListTile(\n            mouseCursor: SystemMouseCursors.click,\n            title: Text(widget.source.name),\n          ),\n          if (isLoading)\n            SizedBox(\n              height: _kComicHeight,\n              width: double.infinity,\n              child: Shimmer(\n                child: LayoutBuilder(builder: (context, constrains) {\n                  var itemWidth = _comicWidth + _kLeftPadding;\n                  var items = (constrains.maxWidth / itemWidth).ceil();\n                  return Stack(\n                    children: [\n                      Positioned(\n                        left: 0,\n                        top: 0,\n                        bottom: 0,\n                        child: Row(\n                          children: List.generate(\n                            items,\n                            (index) => buildPlaceHolder(),\n                          ),\n                        ),\n                      )\n                    ],\n                  );\n                }),\n              ),\n            )\n          else if (error != null || comics == null || comics!.isEmpty)\n            SizedBox(\n              height: _kComicHeight,\n              child: Column(\n                children: [\n                  Row(\n                    children: [\n                      const Icon(Icons.error_outline),\n                      const SizedBox(width: 8),\n                      Expanded(\n                        child: Text(\n                          error ?? \"No search results found\".tl,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                      )\n                    ],\n                  ),\n                  const Spacer(),\n                ],\n              ).paddingHorizontal(16),\n            )\n          else\n            SizedBox(\n              height: _kComicHeight,\n              child: ListView(\n                scrollDirection: Axis.horizontal,\n                children: [\n                  for (var c in comics!) buildComic(c),\n                ],\n              ),\n            ),\n        ],\n      ).paddingBottom(16),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/auth_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:local_auth/local_auth.dart';\nimport 'package:venera/utils/translations.dart';\n\nclass AuthPage extends StatefulWidget {\n  const AuthPage({super.key, this.onSuccessfulAuth});\n\n  final void Function()? onSuccessfulAuth;\n\n  @override\n  State<AuthPage> createState() => _AuthPageState();\n}\n\nclass _AuthPageState extends State<AuthPage> {\n\n  @override\n  void initState() {\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      if(SchedulerBinding.instance.lifecycleState != AppLifecycleState.paused) {\n        auth();\n      }\n    });\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopScope(\n      canPop: false,\n      onPopInvokedWithResult: (didPop, result) {\n        if (!didPop) {\n          SystemNavigator.pop();\n        }\n      },\n      child: Material(\n        child: Center(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              const Icon(Icons.security, size: 36),\n              const SizedBox(height: 16),\n              Text(\"Authentication Required\".tl),\n              const SizedBox(height: 16),\n              FilledButton(\n                onPressed: auth,\n                child: Text(\"Continue\".tl),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void auth() async {\n    var localAuth = LocalAuthentication();\n    var canCheckBiometrics = await localAuth.canCheckBiometrics;\n    if (!canCheckBiometrics && !await localAuth.isDeviceSupported()) {\n      widget.onSuccessfulAuth?.call();\n      return;\n    }\n    var isAuthorized = await localAuth.authenticate(\n      localizedReason: \"Please authenticate to continue\".tl,\n    );\n    if (isAuthorized) {\n      widget.onSuccessfulAuth?.call();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/categories_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/pages/ranking_page.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/translations.dart';\n\nimport 'comic_source_page.dart';\n\nclass CategoriesPage extends StatefulWidget {\n  const CategoriesPage({super.key});\n\n  @override\n  State<CategoriesPage> createState() => _CategoriesPageState();\n}\n\nclass _CategoriesPageState extends State<CategoriesPage>\n    with\n        TickerProviderStateMixin,\n        AutomaticKeepAliveClientMixin<CategoriesPage> {\n  var categories = <String>[];\n\n  late TabController controller;\n\n  void onSettingsChanged() {\n    var categories = List.from(\n      appdata.settings[\"categories\"],\n    ).whereType<String>().toList();\n    var allCategories = ComicSource.all()\n        .map((e) => e.categoryData?.key)\n        .where((element) => element != null)\n        .map((e) => e!)\n        .toList();\n    categories = categories\n        .where((element) => allCategories.contains(element))\n        .toList();\n    if (!categories.isEqualTo(this.categories)) {\n      setState(() {\n        this.categories = categories;\n      });\n      controller = TabController(length: categories.length, vsync: this);\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    var categories = List.from(\n      appdata.settings[\"categories\"],\n    ).whereType<String>().toList();\n    var allCategories = ComicSource.all()\n        .map((e) => e.categoryData?.key)\n        .where((element) => element != null)\n        .map((e) => e!)\n        .toList();\n    this.categories = categories\n        .where((element) => allCategories.contains(element))\n        .toList();\n    appdata.settings.addListener(onSettingsChanged);\n    controller = TabController(length: categories.length, vsync: this);\n  }\n\n  void addPage() {\n    showPopUpWidget(App.rootContext, setCategoryPagesWidget());\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    controller.dispose();\n    appdata.settings.removeListener(onSettingsChanged);\n  }\n\n  Widget buildEmpty() {\n    var msg = \"No Category Pages\".tl;\n    msg += '\\n';\n    VoidCallback onTap;\n    if (ComicSource.isEmpty) {\n      msg += \"Please add some sources\".tl;\n      onTap = () {\n        context.to(() => ComicSourcePage());\n      };\n    } else {\n      msg += \"Please check your settings\".tl;\n      onTap = addPage;\n    }\n    return NetworkError(\n      message: msg,\n      retry: onTap,\n      withAppbar: false,\n      buttonText: \"Manage\".tl,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    if (categories.isEmpty) {\n      return buildEmpty();\n    }\n\n    return Material(\n      child: Column(\n        children: [\n          AppTabBar(\n            controller: controller,\n            key: PageStorageKey(categories.toString()),\n            tabs: categories.map((e) {\n              String title = e;\n              try {\n                title = getCategoryDataWithKey(e).title;\n              } catch (e) {\n                //\n              }\n              return Tab(text: title, key: Key(e));\n            }).toList(),\n            actionButton: TabActionButton(\n              icon: const Icon(Icons.add),\n              text: \"Add\".tl,\n              onPressed: addPage,\n            ),\n          ).paddingTop(context.padding.top),\n          Expanded(\n            child: TabBarView(\n              controller: controller,\n              children: categories.map((e) => _CategoryPage(e)).toList(),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n\ntypedef ClickTagCallback = void Function(String, String?);\n\nclass _CategoryPage extends StatelessWidget {\n  const _CategoryPage(this.category);\n\n  final String category;\n\n  CategoryData get data => getCategoryDataWithKey(category);\n\n  String findComicSourceKey() {\n    for (var source in ComicSource.all()) {\n      if (source.categoryData?.key == category) {\n        return source.key;\n      }\n    }\n    return \"\";\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var children = <Widget>[];\n    if (data.enableRankingPage || data.buttons.isNotEmpty) {\n      children.add(buildTitle(data.title));\n      children.add(\n        Padding(\n          padding: const EdgeInsets.fromLTRB(10, 0, 10, 16),\n          child: Wrap(\n            children: [\n              if (data.enableRankingPage)\n                buildTag(\"Ranking\".tl, () {\n                  context.to(() => RankingPage(categoryKey: data.key));\n                }),\n              for (var buttonData in data.buttons)\n                buildTag(buttonData.label.tl, buttonData.onTap),\n            ],\n          ),\n        ),\n      );\n    }\n\n    for (var part in data.categories) {\n      if (part.enableRandom) {\n        children.add(\n          StatefulBuilder(\n            builder: (context, updater) {\n              return Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  buildTitleWithRefresh(part.title, () => updater(() {})),\n                  buildTags(part.categories),\n                ],\n              );\n            },\n          ),\n        );\n      } else {\n        children.add(buildTitle(part.title));\n        children.add(buildTags(part.categories));\n      }\n    }\n    return SingleChildScrollView(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: children,\n      ),\n    );\n  }\n\n  Widget buildTitle(String title) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(16, 10, 5, 10),\n      child: Text(\n        title.tl,\n        style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500),\n      ),\n    );\n  }\n\n  Widget buildTitleWithRefresh(String title, void Function() onRefresh) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(16, 10, 5, 10),\n      child: Row(\n        children: [\n          Text(\n            title.tl,\n            style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500),\n          ),\n          const Spacer(),\n          IconButton(onPressed: onRefresh, icon: const Icon(Icons.refresh)),\n        ],\n      ),\n    );\n  }\n\n  Widget buildTags(List<CategoryItem> categories) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(10, 0, 10, 16),\n      child: Wrap(\n        children: List<Widget>.generate(\n          categories.length,\n          (index) => buildCategory(categories[index]),\n        ),\n      ),\n    );\n  }\n\n  Widget buildCategory(CategoryItem c) {\n    return buildTag(c.label, () {\n      var context = App.mainNavigatorKey!.currentContext!;\n      c.target.jump(context);\n    });\n  }\n\n  Widget buildTag(String label, VoidCallback onClick) {\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(8, 6, 8, 6),\n      child: Builder(\n        builder: (context) {\n          return Material(\n            borderRadius: const BorderRadius.all(Radius.circular(8)),\n            color: context.colorScheme.primaryContainer.toOpacity(0.72),\n            child: InkWell(\n              borderRadius: const BorderRadius.all(Radius.circular(8)),\n              onTap: onClick,\n              child: Padding(\n                padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n                child: Text(label),\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  bool get enableTranslation => App.locale.languageCode == 'zh';\n}\n"
  },
  {
    "path": "lib/pages/category_comics_page.dart",
    "content": "import \"package:flutter/material.dart\";\nimport \"package:venera/components/components.dart\";\nimport \"package:venera/foundation/app.dart\";\nimport \"package:venera/foundation/comic_source/comic_source.dart\";\nimport \"package:venera/utils/translations.dart\";\n\nclass CategoryComicsPage extends StatefulWidget {\n  const CategoryComicsPage({\n    required this.category,\n    this.param,\n    required this.categoryKey,\n    this.options,\n    super.key,\n  });\n\n  final String category;\n\n  final String? param;\n\n  final String categoryKey;\n\n  final List<String>? options;\n\n  @override\n  State<CategoryComicsPage> createState() => _CategoryComicsPageState();\n}\n\nclass _CategoryComicsPageState extends State<CategoryComicsPage> {\n  late final CategoryComicsData data;\n  late List<CategoryComicsOptions>? options;\n  late final CategoryOptionsLoader? optionsLoader;\n  late List<String> optionsValue;\n  late String sourceKey;\n  String? error;\n\n  void findData() {\n    for (final source in ComicSource.all()) {\n      if (source.categoryData?.key == widget.categoryKey) {\n        if (source.categoryComicsData == null) {\n          throw \"The comic source ${source.name} does not support category comics\";\n        }\n        data = source.categoryComicsData!;\n        if (data.options != null) {\n          options = data.options!.where((element) {\n            if (element.notShowWhen.contains(widget.category)) {\n              return false;\n            } else if (element.showWhen != null) {\n              return element.showWhen!.contains(widget.category);\n            }\n            return true;\n          }).toList();\n        } else {\n          options = null;\n        }\n        if (data.optionsLoader != null) {\n          optionsLoader = data.optionsLoader;\n          loadOptions();\n        }\n        resetOptionsValue();\n        sourceKey = source.key;\n        return;\n      }\n    }\n    throw \"${widget.categoryKey} Not found\";\n  }\n\n  void resetOptionsValue() {\n    if (options == null) return;\n    var defaultOptionsValue = options!\n        .map((e) => e.options.keys.first)\n        .toList();\n    if (optionsValue.length != options!.length) {\n      var newOptionsValue = List<String>.filled(options!.length, \"\");\n      for (var i = 0; i < options!.length; i++) {\n        newOptionsValue[i] =\n            optionsValue.elementAtOrNull(i) ?? defaultOptionsValue[i];\n      }\n      optionsValue = newOptionsValue;\n    }\n  }\n\n  void loadOptions() async {\n    final res = await optionsLoader!(widget.category, widget.param);\n    if (res.error) {\n      setState(() {\n        error = res.errorMessage;\n      });\n    } else {\n      setState(() {\n        options = res.data;\n        resetOptionsValue();\n        error = null;\n      });\n    }\n  }\n\n  @override\n  void initState() {\n    if (widget.options != null) {\n      optionsValue = widget.options!;\n    } else {\n      optionsValue = [];\n    }\n    findData();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var topPadding = context.padding.top + 56.0;\n\n    Widget body;\n\n    if (options == null) {\n      body = Center(child: CircularProgressIndicator());\n    } else if (error != null) {\n      body = NetworkError(\n        message: error!,\n        retry: () {\n          setState(() {\n            error = null;\n          });\n          loadOptions();\n        },\n      );\n    } else {\n      body = ComicList(\n        key: Key(widget.category + optionsValue.toString()),\n        errorLeading: buildOptions().paddingTop(topPadding),\n        leadingSliver: buildOptions().paddingTop(topPadding).toSliver(),\n        loadPage: (i) =>\n            data.load(widget.category, widget.param, optionsValue, i),\n      );\n    }\n\n    return Scaffold(\n      extendBodyBehindAppBar: true,\n      appBar: Appbar(title: Text(widget.category)),\n      body: body,\n    );\n  }\n\n  Widget buildOptionItem(\n    String text,\n    String value,\n    int group,\n    BuildContext context,\n  ) {\n    return OptionChip(\n      text: text.ts(sourceKey),\n      isSelected: value == optionsValue[group],\n      onTap: () {\n        if (value == optionsValue[group]) return;\n        setState(() {\n          optionsValue[group] = value;\n        });\n      },\n    );\n  }\n\n  Widget buildOptions() {\n    List<Widget> children = [];\n    var group = 0;\n    for (var optionList in options!) {\n      if (optionList.label.isNotEmpty) {\n        children.add(Padding(\n          padding: const EdgeInsets.only(\n            bottom: 8.0,\n            left: 4.0,\n          ),\n          child: Text(\n            optionList.label.ts(sourceKey),\n            style: TextStyle(\n              fontSize: 14,\n              fontWeight: FontWeight.bold,\n            ),\n          ),\n        ));\n      }\n      if (optionList.options.length <= 8) {\n        children.add(\n          Wrap(\n            spacing: 8,\n            runSpacing: 8,\n            children: [\n              for (var option in optionList.options.entries)\n                buildOptionItem(\n                  option.value.tl,\n                  option.key,\n                  group,\n                  context,\n                ),\n            ],\n          ),\n        );\n      } else {\n        var g = group;\n        children.add(Select(\n          current: optionList.options[optionsValue[g]],\n          values: optionList.options.values.toList(),\n          onTap: (i) {\n            var key = optionList.options.keys.elementAt(i);\n            if (key == optionsValue[g]) return;\n            setState(() {\n              optionsValue[g] = key;\n            });\n          },\n        ));\n      }\n      if (options!.last != optionList) {\n        children.add(const SizedBox(height: 8));\n      }\n      group++;\n    }\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [...children, const Divider()],\n    ).paddingLeft(8).paddingRight(8);\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/actions.dart",
    "content": "part of 'comic_page.dart';\n\nabstract mixin class _ComicPageActions {\n  void update();\n\n  ComicDetails get comic;\n\n  ComicSource get comicSource => ComicSource.find(comic.sourceKey)!;\n\n  History? get history;\n\n  bool isLiking = false;\n\n  bool isLiked = false;\n\n  void likeOrUnlike() async {\n    if (isLiking) return;\n    isLiking = true;\n    update();\n    var res = await comicSource.likeOrUnlikeComic!(comic.id, isLiked);\n    if (res.error) {\n      App.rootContext.showMessage(message: res.errorMessage!);\n    } else {\n      isLiked = !isLiked;\n    }\n    isLiking = false;\n    update();\n  }\n\n  /// whether the comic is added to local favorite\n  bool isAddToLocalFav = false;\n\n  /// whether the comic is favorite on the server\n  bool isFavorite = false;\n\n  FavoriteItem _toFavoriteItem() {\n    var tags = <String>[];\n    for (var e in comic.tags.entries) {\n      tags.addAll(e.value.map((tag) => '${e.key}:$tag'));\n    }\n    return FavoriteItem(\n      id: comic.id,\n      name: comic.title,\n      coverPath: comic.cover,\n      author: comic.subTitle ?? comic.uploader ?? '',\n      type: comic.comicType,\n      tags: tags,\n    );\n  }\n\n  void openFavPanel() {\n    showSideBar(\n      App.rootContext,\n      _FavoritePanel(\n        cid: comic.id,\n        type: comic.comicType,\n        isFavorite: isFavorite,\n        onFavorite: (local, network) {\n          if (network != null) {\n            isFavorite = network;\n          }\n          if (local != null) {\n            isAddToLocalFav = local;\n          }\n          update();\n        },\n        favoriteItem: _toFavoriteItem(),\n        updateTime: comic.findUpdateTime(),\n      ),\n    );\n  }\n\n  void quickFavorite() {\n    var folder = appdata.settings['quickFavorite'];\n    if (folder is! String) {\n      return;\n    }\n    LocalFavoritesManager().addComic(\n      folder,\n      _toFavoriteItem(),\n      null,\n      comic.findUpdateTime(),\n    );\n    isAddToLocalFav = true;\n    update();\n    App.rootContext.showMessage(message: \"Added\".tl);\n  }\n\n  void share() {\n    var text = comic.title;\n    if (comic.url != null) {\n      text += '\\n${comic.url}';\n    }\n    Share.shareText(text);\n  }\n\n  /// read the comic\n  ///\n  /// [ep] the episode number, start from 1\n  ///\n  /// [page] the page number, start from 1\n  ///\n  /// [group] the chapter group number, start from 1\n  void read([int? ep, int? page, int? group]) {\n    App.rootContext\n        .to(\n      () => Reader(\n        type: comic.comicType,\n        cid: comic.id,\n        name: comic.title,\n        chapters: comic.chapters,\n        initialChapter: ep,\n        initialPage: page,\n        initialChapterGroup: group,\n        history: history ?? History.fromModel(model: comic, ep: 0, page: 0),\n        author: comic.findAuthor() ?? '',\n        tags: comic.plainTags,\n      )\n    )\n        .then((_) {\n      onReadEnd();\n    });\n  }\n\n  void continueRead() {\n    var ep = history?.ep ?? 1;\n    var page = history?.page ?? 1;\n    var group = history?.group ?? 1;\n    read(ep, page, group);\n  }\n\n  void onReadEnd();\n\n  void download() async {\n    if (LocalManager().isDownloading(comic.id, comic.comicType)) {\n      App.rootContext.showMessage(message: \"The comic is downloading\".tl);\n      return;\n    }\n    if (comic.chapters == null &&\n        LocalManager().isDownloaded(comic.id, comic.comicType, 0)) {\n      App.rootContext.showMessage(message: \"The comic is downloaded\".tl);\n      return;\n    }\n\n    if (comicSource.archiveDownloader != null) {\n      bool useNormalDownload = false;\n      List<ArchiveInfo>? archives;\n      int selected = -1;\n      bool isLoading = false;\n      bool isGettingLink = false;\n      await showDialog(\n        context: App.rootContext,\n        builder: (context) {\n          return StatefulBuilder(\n            builder: (context, setState) {\n              return ContentDialog(\n                title: \"Download\".tl,\n                content: RadioGroup<int>(\n                  groupValue: selected,\n                  onChanged: (v) {\n                    setState(() {\n                      selected = v ?? selected;\n                    });\n                  },\n                  child: Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      RadioListTile<int>(\n                        value: -1,\n                        title: Text(\"Normal\".tl),\n                      ),\n                      ExpansionTile(\n                        title: Text(\"Archive\".tl),\n                        shape: const RoundedRectangleBorder(\n                          borderRadius: BorderRadius.zero,\n                        ),\n                        collapsedShape: const RoundedRectangleBorder(\n                          borderRadius: BorderRadius.zero,\n                        ),\n                        onExpansionChanged: (b) {\n                          if (!isLoading && b && archives == null) {\n                            isLoading = true;\n                            comicSource.archiveDownloader!\n                                .getArchives(comic.id)\n                                .then((value) {\n                              if (value.success) {\n                                archives = value.data;\n                              } else {\n                                App.rootContext\n                                    .showMessage(message: value.errorMessage!);\n                              }\n                              setState(() {\n                                isLoading = false;\n                              });\n                            });\n                          }\n                        },\n                        children: [\n                          if (archives == null)\n                            const ListLoadingIndicator().toCenter()\n                          else\n                            for (int i = 0; i < archives!.length; i++)\n                              RadioListTile<int>(\n                                value: i,\n                                title: Text(archives![i].title),\n                                subtitle: Text(archives![i].description),\n                              )\n                        ],\n                      )\n                    ],\n                  ),\n                ),\n                actions: [\n                  Button.filled(\n                    isLoading: isGettingLink,\n                    onPressed: () async {\n                      if (selected == -1) {\n                        useNormalDownload = true;\n                        context.pop();\n                        return;\n                      }\n                      setState(() {\n                        isGettingLink = true;\n                      });\n                      var res =\n                          await comicSource.archiveDownloader!.getDownloadUrl(\n                        comic.id,\n                        archives![selected].id,\n                      );\n                      if (res.error) {\n                        App.rootContext.showMessage(message: res.errorMessage!);\n                        setState(() {\n                          isGettingLink = false;\n                        });\n                      } else if (context.mounted) {\n                        if (res.data.isNotEmpty) {\n                          LocalManager()\n                            .addTask(ArchiveDownloadTask(res.data, comic));\n                          App.rootContext\n                            .showMessage(message: \"Download started\".tl);\n                        }\n                        context.pop();\n                      }\n                    },\n                    child: Text(\"Confirm\".tl),\n                  ),\n                ],\n              );\n            },\n          );\n        },\n      );\n      if (!useNormalDownload) {\n        return;\n      }\n    }\n\n    if (comic.chapters == null) {\n      LocalManager().addTask(ImagesDownloadTask(\n        source: comicSource,\n        comicId: comic.id,\n        comic: comic,\n      ));\n    } else {\n      List<int>? selected;\n      var downloaded = <int>[];\n      var localComic = LocalManager().find(comic.id, comic.comicType);\n      if (localComic != null) {\n        for (int i = 0; i < comic.chapters!.length; i++) {\n          if (localComic.downloadedChapters\n              .contains(comic.chapters!.ids.elementAt(i))) {\n            downloaded.add(i);\n          }\n        }\n      }\n      await showSideBar(\n        App.rootContext,\n        _SelectDownloadChapter(\n          comic.chapters!.titles.toList(),\n          (v) => selected = v,\n          downloaded,\n        ),\n      );\n      if (selected == null) return;\n      LocalManager().addTask(ImagesDownloadTask(\n        source: comicSource,\n        comicId: comic.id,\n        comic: comic,\n        chapters: selected!.map((i) {\n          return comic.chapters!.ids.elementAt(i);\n        }).toList(),\n      ));\n    }\n    App.rootContext.showMessage(message: \"Download started\".tl);\n    update();\n  }\n\n  void onTapTag(String tag, String namespace) {\n    var target = comicSource.handleClickTagEvent?.call(namespace, tag);\n    var context = App.mainNavigatorKey!.currentContext!;\n    target?.jump(context);\n  }\n\n  void showMoreActions() {\n    var context = App.rootContext;\n    showMenuX(\n        context,\n        Offset(\n          context.width - 16,\n          context.padding.top,\n        ),\n        [\n          MenuEntry(\n            icon: Icons.copy,\n            text: \"Copy Title\".tl,\n            onClick: () {\n              Clipboard.setData(ClipboardData(text: comic.title));\n              context.showMessage(message: \"Copied\".tl);\n            },\n          ),\n          MenuEntry(\n            icon: Icons.copy_rounded,\n            text: \"Copy ID\".tl,\n            onClick: () {\n              Clipboard.setData(ClipboardData(text: comic.id));\n              context.showMessage(message: \"Copied\".tl);\n            },\n          ),\n          if (comic.url != null)\n            MenuEntry(\n              icon: Icons.link,\n              text: \"Copy URL\".tl,\n              onClick: () {\n                Clipboard.setData(ClipboardData(text: comic.url!));\n                context.showMessage(message: \"Copied\".tl);\n              },\n            ),\n          if (comic.url != null)\n            MenuEntry(\n              icon: Icons.open_in_browser,\n              text: \"Open in Browser\".tl,\n              onClick: () {\n                launchUrlString(comic.url!);\n              },\n            ),\n        ]);\n  }\n\n  void showComments() {\n    showSideBar(\n      App.rootContext,\n      CommentsPage(\n        data: comic,\n        source: comicSource,\n      ),\n    );\n  }\n\n  void starRating() {\n    if (!comicSource.isLogged) {\n      return;\n    }\n    var rating = 0.0;\n    var isLoading = false;\n    showDialog(\n      context: App.rootContext,\n      builder: (dialogContext) => StatefulBuilder(\n        builder: (context, setState) => SimpleDialog(\n          title: const Text(\"Rating\"),\n          alignment: Alignment.center,\n          children: [\n            SizedBox(\n              height: 100,\n              child: Center(\n                child: SizedBox(\n                  width: 210,\n                  child: Column(\n                    children: [\n                      const SizedBox(\n                        height: 10,\n                      ),\n                      RatingWidget(\n                        padding: 2,\n                        onRatingUpdate: (value) => rating = value,\n                        value: 1,\n                        selectable: true,\n                        size: 40,\n                      ),\n                      const Spacer(),\n                      Button.filled(\n                        isLoading: isLoading,\n                        onPressed: () {\n                          setState(() {\n                            isLoading = true;\n                          });\n                          comicSource.starRatingFunc!(comic.id, rating.round())\n                              .then((value) {\n                            if (value.success) {\n                              App.rootContext\n                                  .showMessage(message: \"Success\".tl);\n                              Navigator.of(dialogContext).pop();\n                            } else {\n                              App.rootContext\n                                  .showMessage(message: value.errorMessage!);\n                              setState(() {\n                                isLoading = false;\n                              });\n                            }\n                          });\n                        },\n                        child: Text(\"Submit\".tl),\n                      )\n                    ],\n                  ),\n                ),\n              ),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/chapters.dart",
    "content": "part of 'comic_page.dart';\n\nclass _ComicChapters extends StatelessWidget {\n  const _ComicChapters({this.history, required this.groupedMode});\n\n  final History? history;\n\n  final bool groupedMode;\n\n  @override\n  Widget build(BuildContext context) {\n    return groupedMode\n        ? _GroupedComicChapters(history)\n        : _NormalComicChapters(history);\n  }\n}\n\nclass _NormalComicChapters extends StatefulWidget {\n  const _NormalComicChapters(this.history);\n\n  final History? history;\n\n  @override\n  State<_NormalComicChapters> createState() => _NormalComicChaptersState();\n}\n\nclass _NormalComicChaptersState extends State<_NormalComicChapters> {\n  late _ComicPageState state;\n\n  late bool reverse;\n\n  bool showAll = false;\n\n  late History? history;\n\n  late ComicChapters chapters;\n\n  @override\n  void initState() {\n    super.initState();\n    reverse = appdata.settings[\"reverseChapterOrder\"] ?? false;\n    history = widget.history;\n  }\n\n  @override\n  void didChangeDependencies() {\n    state = context.findAncestorStateOfType<_ComicPageState>()!;\n    chapters = state.comic.chapters!;\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(covariant _NormalComicChapters oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    setState(() {\n      history = widget.history;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverLayoutBuilder(\n      builder: (context, constrains) {\n        int length = chapters.length;\n        bool canShowAll = showAll;\n        if (!showAll) {\n          var width = constrains.crossAxisExtent - 16;\n          var crossItems = width ~/ 200;\n          if (width % 200 != 0) {\n            crossItems += 1;\n          }\n          length = math.min(length, crossItems * 8);\n          if (length == chapters.length) {\n            canShowAll = true;\n          }\n        }\n\n        return SliverMainAxisGroup(\n          slivers: [\n            SliverToBoxAdapter(\n              child: ListTile(\n                title: Text(\"Chapters\".tl),\n                trailing: Tooltip(\n                  message: \"Order\".tl,\n                  child: IconButton(\n                    icon: Icon(reverse\n                        ? Icons.vertical_align_top\n                        : Icons.vertical_align_bottom_outlined),\n                    onPressed: () {\n                      setState(() {\n                        reverse = !reverse;\n                      });\n                    },\n                  ),\n                ),\n              ),\n            ),\n            SliverGrid(\n              delegate: SliverChildBuilderDelegate(\n                childCount: length,\n                (context, i) {\n                  if (reverse) {\n                    i = chapters.length - i - 1;\n                  }\n                  var key = chapters.ids.elementAt(i);\n                  var value = chapters[key]!;\n                  bool visited = (history?.readEpisode ?? {}).contains(i + 1);\n                  return Padding(\n                    padding: const EdgeInsets.fromLTRB(4, 4, 4, 4),\n                    child: Material(\n                      color: context.colorScheme.surfaceContainer,\n                      borderRadius: BorderRadius.circular(16),\n                      child: InkWell(\n                        onTap: () => state.read(i + 1),\n                        borderRadius: BorderRadius.circular(16),\n                        child: Padding(\n                          padding: const EdgeInsets.symmetric(horizontal: 8),\n                          child: Center(\n                            child: Text(\n                              value,\n                              maxLines: 1,\n                              textAlign: TextAlign.center,\n                              overflow: TextOverflow.ellipsis,\n                              style: TextStyle(\n                                color: visited\n                                    ? context.colorScheme.outline\n                                    : null,\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                    ),\n                  );\n                },\n              ),\n              gridDelegate: const SliverGridDelegateWithFixedHeight(\n                maxCrossAxisExtent: 250,\n                itemHeight: 48,\n              ),\n            ).sliverPadding(const EdgeInsets.symmetric(horizontal: 8)),\n            if (!canShowAll)\n              SliverToBoxAdapter(\n                child: Align(\n                  alignment: Alignment.center,\n                  child: TextButton.icon(\n                    icon: const Icon(Icons.arrow_drop_down),\n                    onPressed: () {\n                      setState(() {\n                        showAll = true;\n                      });\n                    },\n                    label: Text(\"${\"Show all\".tl} (${chapters.length})\"),\n                  ).paddingTop(12),\n                ),\n              ),\n            const SliverToBoxAdapter(\n              child: Divider(),\n            ),\n          ],\n        );\n      },\n    );\n  }\n}\n\nclass _GroupedComicChapters extends StatefulWidget {\n  const _GroupedComicChapters(this.history);\n\n  final History? history;\n\n  @override\n  State<_GroupedComicChapters> createState() => _GroupedComicChaptersState();\n}\n\nclass _GroupedComicChaptersState extends State<_GroupedComicChapters>\n    with SingleTickerProviderStateMixin {\n  late _ComicPageState state;\n\n  late bool reverse;\n\n  bool showAll = false;\n\n  late History? history;\n\n  late ComicChapters chapters;\n\n  late TabController tabController;\n\n  late int index;\n\n  @override\n  void initState() {\n    super.initState();\n    reverse = appdata.settings[\"reverseChapterOrder\"] ?? false;\n    history = widget.history;\n    if (history?.group != null) {\n      index = history!.group! - 1;\n    } else {\n      index = 0;\n    }\n  }\n\n  @override\n  void didChangeDependencies() {\n    state = context.findAncestorStateOfType<_ComicPageState>()!;\n    chapters = state.comic.chapters!;\n    tabController = TabController(\n      initialIndex: index,\n      length: chapters.ids.length,\n      vsync: this,\n    );\n    tabController.addListener(onTabChange);\n    super.didChangeDependencies();\n  }\n\n  void onTabChange() {\n    if (index != tabController.index) {\n      setState(() {\n        index = tabController.index;\n      });\n    }\n  }\n\n  @override\n  void didUpdateWidget(covariant _GroupedComicChapters oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    setState(() {\n      history = widget.history;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverLayoutBuilder(\n      builder: (context, constrains) {\n        var group = chapters.getGroupByIndex(index);\n        int length = group.length;\n        bool canShowAll = showAll;\n        if (!showAll) {\n          var width = constrains.crossAxisExtent - 16;\n          var crossItems = width ~/ 200;\n          if (width % 200 != 0) {\n            crossItems += 1;\n          }\n          length = math.min(length, crossItems * 8);\n          if (length == group.length) {\n            canShowAll = true;\n          }\n        }\n\n        return SliverMainAxisGroup(\n          slivers: [\n            SliverToBoxAdapter(\n              child: ListTile(\n                title: Text(\"Chapters\".tl),\n                trailing: Tooltip(\n                  message: \"Order\".tl,\n                  child: IconButton(\n                    icon: Icon(reverse\n                        ? Icons.vertical_align_top\n                        : Icons.vertical_align_bottom_outlined),\n                    onPressed: () {\n                      setState(() {\n                        reverse = !reverse;\n                      });\n                    },\n                  ),\n                ),\n              ),\n            ),\n            SliverToBoxAdapter(\n              child: AppTabBar(\n                withUnderLine: false,\n                controller: tabController,\n                tabs: chapters.groups.map((e) => Tab(text: e)).toList(),\n              ),\n            ),\n            SliverPadding(padding: const EdgeInsets.only(top: 8)),\n            SliverGrid(\n              delegate: SliverChildBuilderDelegate(\n                childCount: length,\n                (context, i) {\n                  if (reverse) {\n                    i = group.length - i - 1;\n                  }\n                  var key = group.keys.elementAt(i);\n                  var value = group[key]!;\n                  var chapterIndex = 0;\n                  for (var j = 0; j < chapters.groupCount; j++) {\n                    if (j == index) {\n                      chapterIndex += i;\n                      break;\n                    }\n                    chapterIndex += chapters.getGroupByIndex(j).length;\n                  }\n                  String rawIndex = (chapterIndex + 1).toString();\n                  String groupedIndex = \"${index + 1}-${i + 1}\";\n                  bool visited = false;\n                  if (history != null) {\n                    visited = history!.readEpisode.contains(groupedIndex) ||\n                        history!.readEpisode.contains(rawIndex);\n                  }\n                  return Padding(\n                    padding: const EdgeInsets.fromLTRB(4, 4, 4, 4),\n                    child: Material(\n                      color: context.colorScheme.surfaceContainerLow,\n                      borderRadius: BorderRadius.circular(12),\n                      child: InkWell(\n                        onTap: () => state.read(chapterIndex + 1),\n                        borderRadius: BorderRadius.circular(12),\n                        child: Padding(\n                          padding: const EdgeInsets.symmetric(horizontal: 8),\n                          child: Center(\n                            child: Text(\n                              value,\n                              maxLines: 1,\n                              textAlign: TextAlign.center,\n                              overflow: TextOverflow.ellipsis,\n                              style: TextStyle(\n                                color: visited\n                                    ? context.colorScheme.outline\n                                    : null,\n                              ),\n                            ),\n                          ),\n                        ),\n                      ),\n                    ),\n                  );\n                },\n              ),\n              gridDelegate: const SliverGridDelegateWithFixedHeight(\n                maxCrossAxisExtent: 250,\n                itemHeight: 48,\n              ),\n            ).sliverPadding(const EdgeInsets.symmetric(horizontal: 8)),\n            if (!canShowAll)\n              SliverToBoxAdapter(\n                child: Align(\n                  alignment: Alignment.center,\n                  child: TextButton.icon(\n                    icon: const Icon(Icons.arrow_drop_down),\n                    onPressed: () {\n                      setState(() {\n                        showAll = true;\n                      });\n                    },\n                    label: Text(\"${\"Show all\".tl} (${group.length})\"),\n                  ).paddingTop(12),\n                ),\n              ),\n            const SliverToBoxAdapter(\n              child: Divider(),\n            ),\n          ],\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/comic_page.dart",
    "content": "import 'dart:async';\nimport 'dart:ui';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:photo_view/photo_view.dart';\nimport 'package:shimmer_animation/shimmer_animation.dart';\nimport 'package:sliver_tools/sliver_tools.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/components/rich_comment_content.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/image_provider/cached_image.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/network/download.dart';\nimport 'package:venera/network/cache.dart';\nimport 'package:venera/pages/favorites/favorites_page.dart';\nimport 'package:venera/pages/reader/reader.dart';\nimport 'package:venera/utils/file_type.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'dart:math' as math;\n\npart 'comments_page.dart';\n\npart 'chapters.dart';\n\npart 'thumbnails.dart';\n\npart 'favorite.dart';\n\npart 'comments_preview.dart';\n\npart 'actions.dart';\n\npart 'cover_viewer.dart';\n\nclass ComicPage extends StatefulWidget {\n  const ComicPage({\n    super.key,\n    required this.id,\n    required this.sourceKey,\n    this.cover,\n    this.title,\n    this.heroID,\n  });\n\n  final String id;\n\n  final String sourceKey;\n\n  final String? cover;\n\n  final String? title;\n\n  final int? heroID;\n\n  @override\n  State<ComicPage> createState() => _ComicPageState();\n}\n\nclass _ComicPageState extends LoadingState<ComicPage, ComicDetails>\n    with _ComicPageActions {\n  @override\n  History? history;\n\n  bool showAppbarTitle = false;\n\n  var scrollController = ScrollController();\n\n  bool isDownloaded = false;\n\n  bool showFAB = false;\n\n  @override\n  void onReadEnd() {\n    history ??= HistoryManager().find(\n      widget.id,\n      ComicType(widget.sourceKey.hashCode),\n    );\n    update();\n  }\n\n  @override\n  Widget buildLoading() {\n    return _ComicPageLoadingPlaceHolder(\n      cover: widget.cover,\n      title: widget.title,\n      sourceKey: widget.sourceKey,\n      cid: widget.id,\n      heroID: widget.heroID,\n    );\n  }\n\n  @override\n  Widget buildError() {\n    final isDownloaded = LocalManager().isDownloaded(\n      widget.id,\n      ComicType.fromKey(widget.sourceKey),\n    );\n    Widget? action;\n    if (isDownloaded) {\n      action = FilledButton.tonal(\n        child: Text(\"Read\".tl),\n        onPressed: () {\n          final localComic = LocalManager().find(\n            widget.id,\n            ComicType.fromKey(widget.sourceKey),\n          );\n          if (localComic == null) {\n            context.showMessage(message: \"Local comic not found\".tl);\n            return;\n          }\n          localComic.read();\n        },\n      );\n    }\n    return NetworkError(message: error!, retry: retry, action: action);\n  }\n\n  @override\n  void initState() {\n    scrollController.addListener(onScroll);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    scrollController.removeListener(onScroll);\n    super.dispose();\n  }\n\n  @override\n  void update() {\n    setState(() {});\n  }\n\n  @override\n  ComicDetails get comic => data!;\n\n  void onScroll() {\n    var offset =\n        scrollController.position.pixels -\n        scrollController.position.minScrollExtent;\n    var showFAB = offset > 0;\n    if (showFAB != this.showFAB) {\n      setState(() {\n        this.showFAB = showFAB;\n      });\n    }\n    if (offset > 100) {\n      if (!showAppbarTitle) {\n        setState(() {\n          showAppbarTitle = true;\n        });\n      }\n    } else {\n      if (showAppbarTitle) {\n        setState(() {\n          showAppbarTitle = false;\n        });\n      }\n    }\n  }\n\n  var isFirst = true;\n\n  @override\n  Widget buildContent(BuildContext context, ComicDetails data) {\n    return Scaffold(\n      floatingActionButton: showFAB\n          ? FloatingActionButton(\n              onPressed: () {\n                scrollController.animateTo(\n                  0,\n                  duration: const Duration(milliseconds: 200),\n                  curve: Curves.ease,\n                );\n              },\n              child: const Icon(Icons.arrow_upward),\n            )\n          : null,\n      body: SmoothCustomScrollView(\n        controller: scrollController,\n        slivers: [\n          ...buildTitle(),\n          buildActions(),\n          buildDescription(),\n          buildInfo(),\n          buildChapters(),\n          buildComments(),\n          buildThumbnails(),\n          buildRecommend(),\n          SliverPadding(\n            padding: EdgeInsets.only(\n              bottom: context.padding.bottom + 80,\n            ), // Add additional padding for FAB\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Future<Res<ComicDetails>> loadData() async {\n    if (widget.sourceKey == 'local') {\n      var localComic = LocalManager().find(widget.id, ComicType.local);\n      if (localComic == null) {\n        return const Res.error('Local comic not found');\n      }\n      var history = HistoryManager().find(widget.id, ComicType.local);\n      if (isFirst) {\n        Future.microtask(() {\n          App.rootContext.to(() {\n            return Reader(\n              type: ComicType.local,\n              cid: widget.id,\n              name: localComic.title,\n              chapters: localComic.chapters,\n              initialPage: history?.page,\n              initialChapter: history?.ep,\n              initialChapterGroup: history?.group,\n              history:\n                  history ??\n                  History.fromModel(model: localComic, ep: 0, page: 0),\n              author: localComic.subTitle ?? '',\n              tags: localComic.tags,\n            );\n          });\n          App.mainNavigatorKey!.currentContext!.pop();\n        });\n        isFirst = false;\n      }\n      await Future.delayed(const Duration(milliseconds: 200));\n      return const Res.error('Local comic');\n    }\n    var comicSource = ComicSource.find(widget.sourceKey);\n    if (comicSource == null) {\n      return const Res.error('Comic source not found');\n    }\n    isAddToLocalFav = LocalFavoritesManager().isExist(\n      widget.id,\n      ComicType(widget.sourceKey.hashCode),\n    );\n    history = HistoryManager().find(\n      widget.id,\n      ComicType(widget.sourceKey.hashCode),\n    );\n    return comicSource.loadComicInfo!(widget.id);\n  }\n\n  @override\n  Future<void> onDataLoaded() async {\n    isLiked = comic.isLiked ?? false;\n    isFavorite = comic.isFavorite ?? false;\n    // For sources with multi-folder favorites, prefer querying folders to get accurate favorite status\n    // Some sources may not set isFavorite reliably when multi-folder is enabled\n    if (comicSource.favoriteData?.loadFolders != null && comicSource.isLogged) {\n      var res = await comicSource.favoriteData!.loadFolders!(comic.id);\n      if (!res.error) {\n        if (res.subData is List) {\n          var list = List<String>.from(res.subData);\n          isFavorite = list.isNotEmpty;\n          update();\n        }\n      }\n    }\n    if (comic.chapters == null) {\n      isDownloaded = LocalManager().isDownloaded(comic.id, comic.comicType, 0);\n    }\n  }\n\n  Iterable<Widget> buildTitle() sync* {\n    yield SliverAppbar(\n      title: AnimatedOpacity(\n        opacity: showAppbarTitle ? 1.0 : 0.0,\n        duration: const Duration(milliseconds: 200),\n        child: Text(comic.title),\n      ),\n      actions: [\n        IconButton(\n          onPressed: showMoreActions,\n          icon: const Icon(Icons.more_horiz),\n        ),\n      ],\n    );\n\n    yield const SliverPadding(padding: EdgeInsets.only(top: 8));\n\n    yield SliverLazyToBoxAdapter(\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          const SizedBox(width: 16),\n          GestureDetector(\n            onTap: () => _viewCover(context),\n            onLongPress: () => _saveCover(context),\n            child: Hero(\n              tag: \"cover${widget.heroID}\",\n              child: Container(\n                decoration: BoxDecoration(\n                  color: context.colorScheme.primaryContainer,\n                  borderRadius: BorderRadius.circular(8),\n                  boxShadow: [\n                    BoxShadow(\n                      color: context.colorScheme.outlineVariant,\n                      blurRadius: 1,\n                      offset: const Offset(0, 1),\n                    ),\n                  ],\n                ),\n                height: 144,\n                width: 144 * 0.72,\n                clipBehavior: Clip.antiAlias,\n                child: AnimatedImage(\n                  image: CachedImageProvider(\n                    widget.cover ?? comic.cover,\n                    sourceKey: comic.sourceKey,\n                    cid: comic.id,\n                  ),\n                  width: double.infinity,\n                  height: double.infinity,\n                ),\n              ),\n            ),\n          ),\n          const SizedBox(width: 16),\n          Expanded(\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                SelectableText(comic.title, style: ts.s18),\n                if (comic.subTitle != null)\n                  SelectableText(\n                    comic.subTitle!,\n                    style: ts.s14,\n                  ).paddingVertical(4),\n                Text(\n                  (ComicSource.find(comic.sourceKey)?.name) ?? '',\n                  style: ts.s12,\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildActions() {\n    bool isMobile = context.width < changePoint;\n    bool hasHistory = history != null && (history!.ep > 1 || history!.page > 1);\n    return SliverLazyToBoxAdapter(\n      child: Column(\n        children: [\n          ListView(\n            scrollDirection: Axis.horizontal,\n            padding: const EdgeInsets.symmetric(horizontal: 8),\n            children: [\n              if (hasHistory && !isMobile)\n                _ActionButton(\n                  icon: const Icon(Icons.menu_book),\n                  text: 'Continue'.tl,\n                  onPressed: continueRead,\n                  iconColor: context.useTextColor(Colors.yellow),\n                ),\n              if (!isMobile || hasHistory)\n                _ActionButton(\n                  icon: const Icon(Icons.play_circle_outline),\n                  text: 'Start'.tl,\n                  onPressed: read,\n                  iconColor: context.useTextColor(Colors.orange),\n                ),\n              if (!isMobile && !isDownloaded)\n                _ActionButton(\n                  icon: const Icon(Icons.download),\n                  text: 'Download'.tl,\n                  onPressed: download,\n                  iconColor: context.useTextColor(Colors.cyan),\n                ),\n              if (data!.isLiked != null)\n                _ActionButton(\n                  icon: const Icon(Icons.favorite_border),\n                  activeIcon: const Icon(Icons.favorite),\n                  isActive: isLiked,\n                  text:\n                      ((data!.likesCount != null)\n                              ? (data!.likesCount! + (isLiked ? 1 : 0))\n                              : (isLiked ? 'Liked'.tl : 'Like'.tl))\n                          .toString(),\n                  isLoading: isLiking,\n                  onPressed: likeOrUnlike,\n                  iconColor: context.useTextColor(Colors.red),\n                ),\n              _ActionButton(\n                icon: const Icon(Icons.bookmark_outline_outlined),\n                activeIcon: const Icon(Icons.bookmark),\n                isActive: isFavorite || isAddToLocalFav,\n                text: 'Favorite'.tl,\n                onPressed: openFavPanel,\n                onLongPressed: quickFavorite,\n                iconColor: context.useTextColor(Colors.purple),\n              ),\n              if (comicSource.commentsLoader != null)\n                _ActionButton(\n                  icon: const Icon(Icons.comment),\n                  text: (comic.commentCount ?? 'Comments'.tl).toString(),\n                  onPressed: showComments,\n                  iconColor: context.useTextColor(Colors.green),\n                ),\n              _ActionButton(\n                icon: const Icon(Icons.share),\n                text: 'Share'.tl,\n                onPressed: share,\n                iconColor: context.useTextColor(Colors.blue),\n              ),\n            ],\n          ).fixHeight(48),\n          if (isMobile)\n            Row(\n              children: [\n                Expanded(\n                  child: FilledButton.tonal(\n                    onPressed: download,\n                    child: Text(\"Download\".tl),\n                  ),\n                ),\n                const SizedBox(width: 16),\n                Expanded(\n                  child: hasHistory\n                      ? FilledButton(\n                          onPressed: continueRead,\n                          child: Text(\"Continue\".tl),\n                        )\n                      : FilledButton(onPressed: read, child: Text(\"Read\".tl)),\n                ),\n              ],\n            ).paddingHorizontal(16).paddingVertical(8),\n          if (history != null)\n            Container(\n              margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n              padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),\n              decoration: BoxDecoration(\n                color: context.colorScheme.surfaceContainerLow,\n                borderRadius: BorderRadius.circular(24),\n              ),\n              child: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.history, color: context.useTextColor(Colors.teal)),\n                  const SizedBox(width: 8),\n                  Builder(\n                    builder: (context) {\n                      bool haveChapter = comic.chapters != null;\n                      var page = history!.page;\n                      var ep = history!.ep;\n                      var group = history!.group;\n                      String text;\n                      if (haveChapter) {\n                        var epName = \"E$ep\";\n                        String? groupName;\n                        try {\n                          if (group == null) {\n                            epName = comic.chapters!.titles.elementAt(\n                              math.min(ep - 1, comic.chapters!.length - 1),\n                            );\n                          } else {\n                            groupName = comic.chapters!.groups.elementAt(\n                              group - 1,\n                            );\n                            epName = comic.chapters!\n                                .getGroupByIndex(group - 1)\n                                .values\n                                .elementAt(ep - 1);\n                          }\n                        } catch (e) {\n                          // ignore\n                        }\n                        text = groupName == null\n                            ? \"${\"Last Reading\".tl}: $epName P$page\"\n                            : \"${\"Last Reading\".tl}: $groupName $epName P$page\";\n                      } else {\n                        text = \"${\"Last Reading\".tl}: P$page\";\n                      }\n                      return Text(text);\n                    },\n                  ),\n                  const SizedBox(width: 4),\n                ],\n              ),\n            ).toAlign(Alignment.centerLeft),\n          const Divider(),\n        ],\n      ).paddingTop(16),\n    );\n  }\n\n  Widget buildDescription() {\n    if (comic.description == null || comic.description!.trim().isEmpty) {\n      return const SliverPadding(padding: EdgeInsets.zero);\n    }\n    return SliverLazyToBoxAdapter(\n      child: Column(\n        children: [\n          ListTile(title: Text(\"Description\".tl)),\n          Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 16),\n            child: SelectableText(comic.description!).fixWidth(double.infinity),\n          ),\n          const SizedBox(height: 16),\n          const Divider(),\n        ],\n      ),\n    );\n  }\n\n  Widget buildInfo() {\n    if (comic.tags.isEmpty &&\n        comic.uploader == null &&\n        comic.uploadTime == null &&\n        comic.uploadTime == null &&\n        comic.maxPage == null) {\n      return const SliverPadding(padding: EdgeInsets.zero);\n    }\n\n    int i = 0;\n\n    Widget buildTag({\n      required String text,\n      VoidCallback? onTap,\n      bool isTitle = false,\n    }) {\n      Color color;\n      if (isTitle) {\n        const colors = [\n          Colors.blue,\n          Colors.cyan,\n          Colors.red,\n          Colors.pink,\n          Colors.purple,\n          Colors.indigo,\n          Colors.teal,\n          Colors.green,\n          Colors.lime,\n          Colors.yellow,\n        ];\n        color = context.useBackgroundColor(colors[(i++) % (colors.length)]);\n      } else {\n        color = context.colorScheme.surfaceContainerLow;\n      }\n\n      final borderRadius = BorderRadius.circular(12);\n\n      const padding = EdgeInsets.symmetric(horizontal: 16, vertical: 6);\n\n      if (onTap != null) {\n        return Material(\n          color: color,\n          borderRadius: borderRadius,\n          child: InkWell(\n            borderRadius: borderRadius,\n            onTap: onTap,\n            onLongPress: () {\n              Clipboard.setData(ClipboardData(text: text));\n              context.showMessage(message: \"Copied\".tl);\n            },\n            onSecondaryTapDown: (details) {\n              showMenuX(context, details.globalPosition, [\n                MenuEntry(\n                  icon: Icons.remove_red_eye,\n                  text: \"View\".tl,\n                  onClick: onTap,\n                ),\n                MenuEntry(\n                  icon: Icons.copy,\n                  text: \"Copy\".tl,\n                  onClick: () {\n                    Clipboard.setData(ClipboardData(text: text));\n                    context.showMessage(message: \"Copied\".tl);\n                  },\n                ),\n              ]);\n            },\n            child: Text(text).padding(padding),\n          ),\n        );\n      } else {\n        return Container(\n          decoration: BoxDecoration(color: color, borderRadius: borderRadius),\n          child: Text(text).padding(padding),\n        );\n      }\n    }\n\n    String formatTime(String time) {\n      if (int.tryParse(time) != null) {\n        var t = int.tryParse(time);\n        if (t! > 1000000000000) {\n          return DateTime.fromMillisecondsSinceEpoch(\n            t,\n          ).toString().substring(0, 19);\n        } else {\n          return DateTime.fromMillisecondsSinceEpoch(\n            t * 1000,\n          ).toString().substring(0, 19);\n        }\n      }\n      if (time.contains('T') || time.contains('Z')) {\n        var t = DateTime.parse(time);\n        return t.toString().substring(0, 19);\n      }\n      return time;\n    }\n\n    Widget buildWrap({required List<Widget> children}) {\n      return Wrap(\n        runSpacing: 8,\n        spacing: 8,\n        children: children,\n      ).paddingHorizontal(16).paddingBottom(8);\n    }\n\n    bool enableTranslation =\n        App.locale.languageCode == 'zh' && comicSource.enableTagsTranslate;\n\n    return SliverLazyToBoxAdapter(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          ListTile(title: Text(\"Information\".tl)),\n          if (comic.stars != null)\n            Row(\n              children: [\n                StarRating(value: comic.stars!, size: 24, onTap: starRating),\n                const SizedBox(width: 8),\n                Text(comic.stars!.toStringAsFixed(2)),\n              ],\n            ).paddingLeft(16).paddingVertical(8),\n          for (var e in comic.tags.entries)\n            buildWrap(\n              children: [\n                if (e.value.isNotEmpty)\n                  buildTag(text: e.key.ts(comicSource.key), isTitle: true),\n                for (var tag in e.value)\n                  buildTag(\n                    text: enableTranslation\n                        ? TagsTranslation.translationTagWithNamespace(\n                            tag,\n                            e.key.toLowerCase(),\n                          )\n                        : tag,\n                    onTap: () => onTapTag(tag, e.key),\n                  ),\n              ],\n            ),\n          if (comic.uploader != null)\n            buildWrap(\n              children: [\n                buildTag(text: 'Uploader'.tl, isTitle: true),\n                buildTag(text: comic.uploader!),\n              ],\n            ),\n          if (comic.uploadTime != null)\n            buildWrap(\n              children: [\n                buildTag(text: 'Upload Time'.tl, isTitle: true),\n                buildTag(text: formatTime(comic.uploadTime!)),\n              ],\n            ),\n          if (comic.updateTime != null)\n            buildWrap(\n              children: [\n                buildTag(text: 'Update Time'.tl, isTitle: true),\n                buildTag(text: formatTime(comic.updateTime!)),\n              ],\n            ),\n          if (comic.maxPage != null)\n            buildWrap(\n              children: [\n                buildTag(text: 'Pages'.tl, isTitle: true),\n                buildTag(text: comic.maxPage.toString()),\n              ],\n            ),\n          const SizedBox(height: 12),\n          const Divider(),\n        ],\n      ),\n    );\n  }\n\n  Widget buildChapters() {\n    if (comic.chapters == null) {\n      return const SliverPadding(padding: EdgeInsets.zero);\n    }\n    return _ComicChapters(\n      history: history,\n      groupedMode: comic.chapters!.isGrouped,\n    );\n  }\n\n  Widget buildThumbnails() {\n    if (comic.thumbnails == null && comicSource.loadComicThumbnail == null) {\n      return const SliverPadding(padding: EdgeInsets.zero);\n    }\n    return const _ComicThumbnails();\n  }\n\n  Widget buildRecommend() {\n    if (comic.recommend == null || comic.recommend!.isEmpty) {\n      return const SliverPadding(padding: EdgeInsets.zero);\n    }\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverToBoxAdapter(child: ListTile(title: Text(\"Related\".tl))),\n        SliverGridComics(comics: comic.recommend!),\n      ],\n    );\n  }\n\n  Widget buildComments() {\n    if (comic.comments == null || comic.comments!.isEmpty) {\n      return const SliverPadding(padding: EdgeInsets.zero);\n    }\n    return _CommentsPart(comments: comic.comments!, showMore: showComments);\n  }\n\n  void _viewCover(BuildContext context) {\n    final imageProvider = CachedImageProvider(\n      widget.cover ?? comic.cover,\n      sourceKey: comic.sourceKey,\n      cid: comic.id,\n    );\n\n    context.to(\n      () => _CoverViewer(\n        imageProvider: imageProvider,\n        title: comic.title,\n        heroTag: \"cover${widget.heroID}\",\n      ),\n    );\n  }\n\n  void _saveCover(BuildContext context) async {\n    try {\n      final imageProvider = CachedImageProvider(\n        widget.cover ?? comic.cover,\n        sourceKey: comic.sourceKey,\n        cid: comic.id,\n      );\n\n      final imageStream = imageProvider.resolve(const ImageConfiguration());\n      final completer = Completer<Uint8List>();\n\n      imageStream.addListener(\n        ImageStreamListener((ImageInfo info, bool _) async {\n          final byteData = await info.image.toByteData(\n            format: ImageByteFormat.png,\n          );\n          if (byteData != null) {\n            completer.complete(byteData.buffer.asUint8List());\n          }\n        }),\n      );\n\n      final data = await completer.future;\n      final fileType = detectFileType(data);\n      await saveFile(filename: \"cover${fileType.ext}\", data: data);\n    } catch (e) {\n      if (context.mounted) {\n        context.showMessage(message: \"Error\".tl);\n      }\n    }\n  }\n}\n\nclass _ActionButton extends StatelessWidget {\n  const _ActionButton({\n    required this.icon,\n    required this.text,\n    required this.onPressed,\n    this.onLongPressed,\n    this.activeIcon,\n    this.isActive,\n    this.isLoading,\n    this.iconColor,\n  });\n\n  final Widget icon;\n\n  final Widget? activeIcon;\n\n  final bool? isActive;\n\n  final String text;\n\n  final void Function() onPressed;\n\n  final bool? isLoading;\n\n  final Color? iconColor;\n\n  final void Function()? onLongPressed;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      margin: const EdgeInsets.symmetric(horizontal: 4, vertical: 6),\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(18),\n        border: Border.all(\n          color: context.colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n      ),\n      child: InkWell(\n        onTap: () {\n          if (!(isLoading ?? false)) {\n            onPressed();\n          }\n        },\n        onLongPress: onLongPressed,\n        borderRadius: BorderRadius.circular(18),\n        child: IconTheme.merge(\n          data: IconThemeData(size: 20, color: iconColor),\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              if (isLoading ?? false)\n                const SizedBox(\n                  width: 20,\n                  height: 20,\n                  child: CircularProgressIndicator(strokeWidth: 1.8),\n                )\n              else\n                (isActive ?? false) ? (activeIcon ?? icon) : icon,\n              const SizedBox(width: 8),\n              Text(text),\n            ],\n          ).paddingHorizontal(16),\n        ),\n      ),\n    );\n  }\n}\n\nclass _SelectDownloadChapter extends StatefulWidget {\n  const _SelectDownloadChapter(this.eps, this.finishSelect, this.downloadedEps);\n\n  final List<String> eps;\n  final void Function(List<int>) finishSelect;\n  final List<int> downloadedEps;\n\n  @override\n  State<_SelectDownloadChapter> createState() => _SelectDownloadChapterState();\n}\n\nclass _SelectDownloadChapterState extends State<_SelectDownloadChapter> {\n  List<int> selected = [];\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"Download\".tl),\n        backgroundColor: context.colorScheme.surfaceContainerLow,\n      ),\n      body: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Expanded(\n            child: ListView.builder(\n              padding: EdgeInsets.zero,\n              itemCount: widget.eps.length,\n              itemBuilder: (context, i) {\n                return CheckboxListTile(\n                  title: Text(widget.eps[i]),\n                  value:\n                      selected.contains(i) || widget.downloadedEps.contains(i),\n                  onChanged: widget.downloadedEps.contains(i)\n                      ? null\n                      : (v) {\n                          setState(() {\n                            if (selected.contains(i)) {\n                              selected.remove(i);\n                            } else {\n                              selected.add(i);\n                            }\n                          });\n                        },\n                );\n              },\n            ),\n          ),\n          Container(\n            height: 50,\n            decoration: BoxDecoration(\n              border: Border(\n                top: BorderSide(color: context.colorScheme.outlineVariant),\n              ),\n            ),\n            child: Row(\n              children: [\n                const SizedBox(width: 16),\n                Expanded(\n                  child: TextButton(\n                    onPressed: () {\n                      var res = <int>[];\n                      for (int i = 0; i < widget.eps.length; i++) {\n                        if (!widget.downloadedEps.contains(i)) {\n                          res.add(i);\n                        }\n                      }\n                      widget.finishSelect(res);\n                      context.pop();\n                    },\n                    child: Text(\"Download All\".tl),\n                  ),\n                ),\n                const SizedBox(width: 16),\n                Expanded(\n                  child: FilledButton(\n                    onPressed: selected.isEmpty\n                        ? null\n                        : () {\n                            widget.finishSelect(selected);\n                            context.pop();\n                          },\n                    child: Text(\"Download Selected\".tl),\n                  ),\n                ),\n                const SizedBox(width: 16),\n              ],\n            ),\n          ),\n          SizedBox(height: MediaQuery.of(context).padding.bottom),\n        ],\n      ),\n    );\n  }\n}\n\nclass _ComicPageLoadingPlaceHolder extends StatelessWidget {\n  const _ComicPageLoadingPlaceHolder({\n    this.cover,\n    this.title,\n    required this.sourceKey,\n    required this.cid,\n    this.heroID,\n  });\n\n  final String? cover;\n\n  final String? title;\n\n  final String sourceKey;\n\n  final String cid;\n\n  final int? heroID;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget buildContainer(\n      double? width,\n      double? height, {\n      Color? color,\n      double? radius,\n    }) {\n      return Container(\n        height: height,\n        width: width,\n        decoration: BoxDecoration(\n          color: color ?? context.colorScheme.surfaceContainerLow,\n          borderRadius: BorderRadius.circular(radius ?? 4),\n        ),\n      );\n    }\n\n    return Shimmer(\n      color: context.isDarkMode ? Colors.grey.shade700 : Colors.white,\n      child: Column(\n        children: [\n          Appbar(title: Text(\"\"), backgroundColor: context.colorScheme.surface),\n          const SizedBox(height: 8),\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              const SizedBox(width: 16),\n              buildImage(context),\n              const SizedBox(width: 16),\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    if (title != null)\n                      Text(title ?? \"\", style: ts.s18)\n                    else\n                      buildContainer(200, 25),\n                    const SizedBox(height: 8),\n                    buildContainer(80, 20),\n                  ],\n                ),\n              ),\n            ],\n          ),\n          const SizedBox(height: 8),\n          if (context.width < changePoint)\n            Row(\n              children: [\n                Expanded(child: buildContainer(null, 36, radius: 18)),\n                const SizedBox(width: 16),\n                Expanded(child: buildContainer(null, 36, radius: 18)),\n              ],\n            ).paddingHorizontal(16),\n          const Divider(),\n          const SizedBox(height: 8),\n          Center(\n            child: CircularProgressIndicator(\n              strokeWidth: 2.4,\n            ).fixHeight(24).fixWidth(24),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildImage(BuildContext context) {\n    Widget child;\n    if (cover != null) {\n      child = AnimatedImage(\n        image: CachedImageProvider(cover!, sourceKey: sourceKey, cid: cid),\n        width: double.infinity,\n        height: double.infinity,\n        fit: BoxFit.cover,\n      );\n    } else {\n      child = const SizedBox();\n    }\n\n    return Hero(\n      tag: \"cover$heroID\",\n      child: Container(\n        decoration: BoxDecoration(\n          color: context.colorScheme.primaryContainer,\n          borderRadius: BorderRadius.circular(8),\n          boxShadow: [\n            BoxShadow(\n              color: context.colorScheme.outlineVariant,\n              blurRadius: 1,\n              offset: const Offset(0, 1),\n            ),\n          ],\n        ),\n        height: 144,\n        width: 144 * 0.72,\n        clipBehavior: Clip.antiAlias,\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/comments_page.dart",
    "content": "part of 'comic_page.dart';\n\nbool _shouldBlockComment(Comment comment) {\n  var blockedWords = appdata.settings[\"blockedCommentWords\"] as List;\n  if (blockedWords.isEmpty) return false;\n  \n  var content = comment.content.toLowerCase();\n  for (var word in blockedWords) {\n    if (content.contains(word.toString().toLowerCase())) {\n      return true;\n    }\n  }\n  return false;\n}\n\nclass CommentsPage extends StatefulWidget {\n  const CommentsPage({\n    super.key,\n    required this.data,\n    required this.source,\n    this.replyComment,\n  });\n\n  final ComicDetails data;\n\n  final ComicSource source;\n\n  final Comment? replyComment;\n\n  @override\n  State<CommentsPage> createState() => _CommentsPageState();\n}\n\nclass _CommentsPageState extends State<CommentsPage> {\n  bool _loading = true;\n  List<Comment>? _comments;\n  String? _error;\n  int _page = 1;\n  int? maxPage;\n  var controller = TextEditingController();\n  bool sending = false;\n\n  void firstLoad() async {\n    var res = await widget.source.commentsLoader!(\n        widget.data.comicId, widget.data.subId, 1, widget.replyComment?.id);\n    if (res.error) {\n      setState(() {\n        _error = res.errorMessage;\n        _loading = false;\n      });\n    } else if (mounted) {\n      var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();\n      setState(() {\n        _comments = filteredComments;\n        _loading = false;\n        maxPage = res.subData;\n      });\n    }\n  }\n\n  void loadMore() async {\n    var res = await widget.source.commentsLoader!(\n      widget.data.comicId,\n      widget.data.subId,\n      _page + 1,\n      widget.replyComment?.id,\n    );\n    if (res.error) {\n      context.showMessage(message: res.errorMessage ?? \"Unknown Error\");\n    } else {\n      var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();\n      setState(() {\n        _comments!.addAll(filteredComments);\n        _page++;\n        if (maxPage == null && res.data.isEmpty) {\n          maxPage = _page;\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: Appbar(\n        title: Text(\"Comments\".tl),\n        style: AppbarStyle.shadow,\n      ),\n      body: buildBody(context),\n    );\n  }\n\n  Widget buildBody(BuildContext context) {\n    if (_loading) {\n      firstLoad();\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (_error != null) {\n      return NetworkError(\n        message: _error!,\n        retry: () {\n          setState(() {\n            _loading = true;\n          });\n        },\n        withAppbar: false,\n      );\n    } else {\n      var showAvatar =\n          _comments!.any((e) {\n            return e.avatar != null;\n          }) ||\n          (widget.replyComment?.avatar != null);\n      return Column(\n        children: [\n          Expanded(\n            child: SmoothScrollProvider(\n              builder: (context, controller, physics) {\n                return ListView.builder(\n                  controller: controller,\n                  physics: physics,\n                  primary: false,\n                  padding: EdgeInsets.zero,\n                  itemCount: _comments!.length + 2,\n                  itemBuilder: (context, index) {\n                    if (index == 0) {\n                      if (widget.replyComment != null) {\n                        return Column(\n                          children: [\n                            _CommentTile(\n                              comment: widget.replyComment!,\n                              source: widget.source,\n                              comic: widget.data,\n                              showAvatar: showAvatar,\n                              showActions: false,\n                            ),\n                            const SizedBox(height: 8),\n                            Container(\n                              alignment: Alignment.centerLeft,\n                              padding: const EdgeInsets.all(16),\n                              decoration: BoxDecoration(\n                                border: Border(\n                                  top: BorderSide(\n                                    color: context.colorScheme.outlineVariant,\n                                    width: 0.6,\n                                  ),\n                                ),\n                              ),\n                              child: Text(\n                                \"Replies\".tl,\n                                style: ts.s18,\n                              ),\n                            ),\n                          ],\n                        );\n                      } else {\n                        return const SizedBox();\n                      }\n                    }\n                    index--;\n\n                    if (index == _comments!.length) {\n                      if (_page < (maxPage ?? _page + 1)) {\n                        loadMore();\n                        return const ListLoadingIndicator();\n                      } else {\n                        return const SizedBox();\n                      }\n                    }\n\n                    return _CommentTile(\n                      comment: _comments![index],\n                      source: widget.source,\n                      comic: widget.data,\n                      showAvatar: showAvatar,\n                    );\n                  },\n                );\n              },\n            ),\n          ),\n          buildBottom(context)\n        ],\n      );\n    }\n  }\n\n  Widget buildBottom(BuildContext context) {\n    if (widget.source.sendCommentFunc == null) {\n      return const SizedBox(\n        height: 0,\n      );\n    }\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),\n      decoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surface,\n        border: Border(\n          top: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Material(\n        color: context.colorScheme.surfaceContainer,\n        borderRadius: BorderRadius.circular(24),\n        child: Row(\n          children: [\n            Expanded(\n              child: TextField(\n                controller: controller,\n                decoration: InputDecoration(\n                    border: InputBorder.none,\n                    isCollapsed: true,\n                    hintText: \"Comment\".tl),\n                minLines: 1,\n                maxLines: 5,\n              ),\n            ),\n            if (sending)\n              const Padding(\n                padding: EdgeInsets.all(8),\n                child: SizedBox(\n                  width: 24,\n                  height: 24,\n                  child: CircularProgressIndicator(\n                    strokeWidth: 2,\n                  ),\n                ),\n              )\n            else\n              IconButton(\n                onPressed: () async {\n                  if (controller.text.isEmpty) {\n                    return;\n                  }\n                  setState(() {\n                    sending = true;\n                  });\n                  var b = await widget.source.sendCommentFunc!(\n                      widget.data.comicId,\n                      widget.data.subId,\n                      controller.text,\n                      widget.replyComment?.id);\n                  if (!b.error) {\n                    controller.text = \"\";\n                    setState(() {\n                      sending = false;\n                      _loading = true;\n                      _comments?.clear();\n                      _page = 1;\n                      maxPage = null;\n                    });\n                  } else {\n                    context.showMessage(message: b.errorMessage ?? \"Error\");\n                    setState(() {\n                      sending = false;\n                    });\n                  }\n                },\n                icon: Icon(\n                  Icons.send,\n                  color: Theme.of(context).colorScheme.secondary,\n                ),\n              )\n          ],\n        ).paddingLeft(16).paddingRight(4),\n      ),\n    );\n  }\n}\n\nclass _CommentTile extends StatefulWidget {\n  const _CommentTile({\n    required this.comment,\n    required this.source,\n    required this.comic,\n    required this.showAvatar,\n    this.showActions = true,\n  });\n\n  final Comment comment;\n\n  final ComicSource source;\n\n  final ComicDetails comic;\n\n  final bool showAvatar;\n\n  final bool showActions;\n\n  @override\n  State<_CommentTile> createState() => _CommentTileState();\n}\n\nclass _CommentTileState extends State<_CommentTile> {\n  @override\n  void initState() {\n    likes = widget.comment.score ?? 0;\n    isLiked = widget.comment.isLiked ?? false;\n    voteStatus = widget.comment.voteStatus;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          if (widget.showAvatar)\n            Container(\n              width: 36,\n              height: 36,\n              clipBehavior: Clip.antiAlias,\n              decoration: BoxDecoration(\n                  borderRadius: BorderRadius.circular(18),\n                  color: Theme.of(context).colorScheme.secondaryContainer),\n              child: widget.comment.avatar == null\n                  ? null\n                  : AnimatedImage(\n                      image: CachedImageProvider(\n                        widget.comment.avatar!,\n                        sourceKey: widget.source.key,\n                      ),\n                    ),\n            ).paddingRight(8),\n          Expanded(\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Text(\n                  widget.comment.userName,\n                  style: ts.bold,\n                ),\n                if (widget.comment.time != null)\n                  Text(widget.comment.time!, style: ts.s12),\n                const SizedBox(height: 4),\n                _CommentContent(text: widget.comment.content),\n                buildActions(),\n              ],\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget buildActions() {\n    if (!widget.showActions) {\n      return const SizedBox();\n    }\n    if (widget.comment.score == null && widget.comment.replyCount == null) {\n      return const SizedBox();\n    }\n    return SizedBox(\n      height: 36,\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.end,\n        children: [\n          if (widget.comment.score != null &&\n              widget.source.voteCommentFunc != null)\n            buildVote(),\n          if (widget.comment.score != null &&\n              widget.source.likeCommentFunc != null)\n            buildLike(),\n          if (widget.comment.replyCount != null) buildReply(),\n        ],\n      ),\n    ).paddingTop(8);\n  }\n\n  Widget buildReply() {\n    return Container(\n      margin: const EdgeInsets.only(left: 8),\n      decoration: BoxDecoration(\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n        borderRadius: BorderRadius.circular(16),\n      ),\n      child: InkWell(\n        borderRadius: BorderRadius.circular(16),\n        onTap: () {\n          showSideBar(\n            context,\n            CommentsPage(\n              data: widget.comic,\n              source: widget.source,\n              replyComment: widget.comment,\n            ),\n            showBarrier: false,\n          );\n        },\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            const Icon(Icons.insert_comment_outlined, size: 16),\n            const SizedBox(width: 8),\n            Text(widget.comment.replyCount.toString()),\n          ],\n        ).padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 4)),\n      ),\n    );\n  }\n\n  bool isLiking = false;\n\n  bool isLiked = false;\n\n  var likes = 0;\n\n  Widget buildLike() {\n    return Container(\n      margin: const EdgeInsets.only(left: 8),\n      decoration: BoxDecoration(\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n        borderRadius: BorderRadius.circular(16),\n      ),\n      child: InkWell(\n        borderRadius: BorderRadius.circular(16),\n        onTap: () async {\n          if (isLiking) return;\n          setState(() {\n            isLiking = true;\n          });\n          var res = await widget.source.likeCommentFunc!(\n            widget.comic.comicId,\n            widget.comic.subId,\n            widget.comment.id!,\n            !isLiked,\n          );\n          if (res.success) {\n            isLiked = !isLiked;\n            likes += isLiked ? 1 : -1;\n          } else {\n            context.showMessage(message: res.errorMessage ?? \"Error\");\n          }\n          setState(() {\n            isLiking = false;\n          });\n        },\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            if (isLiking)\n              const SizedBox(\n                width: 16,\n                height: 16,\n                child: CircularProgressIndicator(),\n              )\n            else if (isLiked)\n              Icon(\n                Icons.favorite,\n                size: 16,\n                color: context.useTextColor(Colors.red),\n              )\n            else\n              const Icon(Icons.favorite_border, size: 16),\n            const SizedBox(width: 8),\n            Text(likes.toString()),\n          ],\n        ).padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 4)),\n      ),\n    );\n  }\n\n  int? voteStatus;\n\n  bool isVotingUp = false;\n\n  bool isVotingDown = false;\n\n  void vote(bool isUp) async {\n    if (isVotingUp || isVotingDown) return;\n    setState(() {\n      if (isUp) {\n        isVotingUp = true;\n      } else {\n        isVotingDown = true;\n      }\n    });\n    var isCancel = (isUp && voteStatus == 1) || (!isUp && voteStatus == -1);\n    var res = await widget.source.voteCommentFunc!(\n      widget.comic.comicId,\n      widget.comic.subId,\n      widget.comment.id!,\n      isUp,\n      isCancel,\n    );\n    if (res.success) {\n      if (isCancel) {\n        voteStatus = 0;\n      } else {\n        if (isUp) {\n          voteStatus = 1;\n        } else {\n          voteStatus = -1;\n        }\n      }\n      widget.comment.voteStatus = voteStatus;\n      widget.comment.score = res.data ?? widget.comment.score;\n    } else {\n      context.showMessage(message: res.errorMessage ?? \"Error\");\n    }\n    setState(() {\n      isVotingUp = false;\n      isVotingDown = false;\n    });\n  }\n\n  Widget buildVote() {\n    var upColor = context.colorScheme.outline;\n    if (voteStatus == 1) {\n      upColor = context.useTextColor(Colors.red);\n    }\n    var downColor = context.colorScheme.outline;\n    if (voteStatus == -1) {\n      downColor = context.useTextColor(Colors.blue);\n    }\n\n    return Container(\n      margin: const EdgeInsets.only(left: 8),\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(16),\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n      ),\n      child: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Button.icon(\n            isLoading: isVotingUp,\n            icon: const Icon(Icons.arrow_upward),\n            size: 18,\n            color: upColor,\n            onPressed: () => vote(true),\n          ),\n          const SizedBox(width: 4),\n          Text(widget.comment.score.toString()),\n          const SizedBox(width: 4),\n          Button.icon(\n            isLoading: isVotingDown,\n            icon: const Icon(Icons.arrow_downward),\n            size: 18,\n            color: downColor,\n            onPressed: () => vote(false),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _CommentContent extends StatelessWidget {\n  const _CommentContent({required this.text});\n\n  final String text;\n\n  @override\n  Widget build(BuildContext context) {\n    if (!text.contains('<') && !text.contains('http')) {\n      return SelectableText(text);\n    } else {\n      return RichCommentContent(text: text);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/comments_preview.dart",
    "content": "part of 'comic_page.dart';\n\nclass _CommentsPart extends StatefulWidget {\n  const _CommentsPart({\n    required this.comments,\n    required this.showMore,\n  });\n\n  final List<Comment> comments;\n\n  final void Function() showMore;\n\n  @override\n  State<_CommentsPart> createState() => _CommentsPartState();\n}\n\nclass _CommentsPartState extends State<_CommentsPart> {\n  final scrollController = ScrollController();\n\n  late List<Comment> comments;\n\n  @override\n  void initState() {\n    comments = widget.comments.where((c) => !_shouldBlockComment(c)).toList();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MultiSliver(\n      children: [\n        SliverLazyToBoxAdapter(\n          child: ListTile(\n            title: Text(\"Comments\".tl),\n            trailing: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                IconButton(\n                  icon: const Icon(Icons.chevron_left),\n                  onPressed: () {\n                    scrollController.animateTo(\n                      scrollController.position.pixels - 340,\n                      duration: const Duration(milliseconds: 200),\n                      curve: Curves.ease,\n                    );\n                  },\n                ),\n                IconButton(\n                  icon: const Icon(Icons.chevron_right),\n                  onPressed: () {\n                    scrollController.animateTo(\n                      scrollController.position.pixels + 340,\n                      duration: const Duration(milliseconds: 200),\n                      curve: Curves.ease,\n                    );\n                  },\n                ),\n              ],\n            ),\n          ),\n        ),\n        SliverToBoxAdapter(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SizedBox(\n                height: 184,\n                child: MediaQuery.removePadding(\n                  removeTop: true,\n                  context: context,\n                  child: ListView.builder(\n                    controller: scrollController,\n                    scrollDirection: Axis.horizontal,\n                    itemCount: comments.length,\n                    itemBuilder: (context, index) {\n                      return _CommentWidget(comment: comments[index]);\n                    },\n                  ),\n                ),\n              ),\n              const SizedBox(height: 8),\n              _ActionButton(\n                icon: const Icon(Icons.comment),\n                text: \"View more\".tl,\n                onPressed: widget.showMore,\n                iconColor: context.useTextColor(Colors.green),\n              ).fixHeight(48).paddingRight(8).toAlign(Alignment.centerRight),\n              const SizedBox(height: 8),\n            ],\n          ),\n        ),\n        const SliverToBoxAdapter(\n          child: Divider(),\n        ),\n      ],\n    );\n  }\n}\n\nclass _CommentWidget extends StatelessWidget {\n  const _CommentWidget({required this.comment});\n\n  final Comment comment;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      height: double.infinity,\n      margin: const EdgeInsets.fromLTRB(16, 8, 0, 8),\n      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n      width: 324,\n      decoration: BoxDecoration(\n        color: context.colorScheme.surfaceContainerLow,\n        borderRadius: BorderRadius.circular(12),\n      ),\n      child: Column(\n        children: [\n          Row(\n            children: [\n              if (comment.avatar != null)\n                Container(\n                  width: 36,\n                  height: 36,\n                  decoration: BoxDecoration(\n                    borderRadius: BorderRadius.circular(18),\n                    color: context.colorScheme.surfaceContainer,\n                  ),\n                  clipBehavior: Clip.antiAlias,\n                  child: Image(\n                    image: CachedImageProvider(comment.avatar!),\n                    width: 36,\n                    height: 36,\n                    fit: BoxFit.cover,\n                  ),\n                ).paddingRight(8),\n              Text(comment.userName, style: ts.bold),\n            ],\n          ),\n          const SizedBox(height: 4),\n          Expanded(\n            child: RichCommentContent(\n              text: comment.content,\n              showImages: false,\n            ).fixWidth(324),\n          ),\n          const SizedBox(height: 4),\n          if (comment.time != null)\n            Text(comment.time!, style: ts.s12).toAlign(Alignment.centerLeft),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/cover_viewer.dart",
    "content": "part of 'comic_page.dart';\n\nclass _CoverViewer extends StatefulWidget {\n  const _CoverViewer({\n    required this.imageProvider,\n    required this.title,\n    required this.heroTag,\n  });\n\n  final ImageProvider imageProvider;\n  final String title;\n  final String heroTag;\n\n  @override\n  State<_CoverViewer> createState() => _CoverViewerState();\n}\n\nclass _CoverViewerState extends State<_CoverViewer> {\n  bool isAppBarShow = true;\n\n  @override\n  Widget build(BuildContext context) {\n    return PopScope(\n      canPop: true,\n      child: Scaffold(\n        backgroundColor: context.colorScheme.surface,\n        body: Stack(\n          children: [\n            Positioned.fill(\n              child: PhotoView(\n                imageProvider: widget.imageProvider,\n                minScale: PhotoViewComputedScale.contained * 1.0,\n                maxScale: PhotoViewComputedScale.covered * 3.0,\n                backgroundDecoration: BoxDecoration(\n                  color: context.colorScheme.surface,\n                ),\n                loadingBuilder: (context, event) => Center(\n                  child: SizedBox(\n                    width: 24.0,\n                    height: 24.0,\n                    child: CircularProgressIndicator(\n                      value: event == null || event.expectedTotalBytes == null\n                          ? null\n                          : event.cumulativeBytesLoaded /\n                                event.expectedTotalBytes!,\n                    ),\n                  ),\n                ),\n                onTapUp: (context, details, controllerValue) {\n                  setState(() {\n                    isAppBarShow = !isAppBarShow;\n                  });\n                },\n                heroAttributes: PhotoViewHeroAttributes(tag: widget.heroTag),\n              ),\n            ),\n            AnimatedPositioned(\n              top: isAppBarShow ? 0 : -(context.padding.top + 52),\n              left: 0,\n              right: 0,\n              duration: const Duration(milliseconds: 180),\n              child: _buildAppBar(),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildAppBar() {\n    return Material(\n      color: context.colorScheme.surface.toOpacity(0.72),\n      child: BlurEffect(\n        child: Container(\n          decoration: BoxDecoration(\n            border: Border(\n              bottom: BorderSide(\n                color: context.colorScheme.outlineVariant,\n                width: 0.5,\n              ),\n            ),\n          ),\n          height: 52,\n          child: Row(\n            children: [\n              const SizedBox(width: 8),\n              IconButton(\n                icon: const Icon(Icons.close),\n                onPressed: () {\n                  Navigator.of(context).pop();\n                },\n              ),\n              const SizedBox(width: 8),\n              Expanded(\n                child: Text(\n                  widget.title,\n                  style: const TextStyle(fontSize: 18),\n                  overflow: TextOverflow.ellipsis,\n                ),\n              ),\n              IconButton(\n                icon: const Icon(Icons.save_alt),\n                onPressed: _saveCover,\n              ),\n              const SizedBox(width: 8),\n            ],\n          ),\n        ).paddingTop(context.padding.top),\n      ),\n    );\n  }\n\n  void _saveCover() async {\n    try {\n      final imageStream = widget.imageProvider.resolve(\n        const ImageConfiguration(),\n      );\n      final completer = Completer<Uint8List>();\n\n      imageStream.addListener(\n        ImageStreamListener((ImageInfo info, bool _) async {\n          final byteData = await info.image.toByteData(\n            format: ImageByteFormat.png,\n          );\n          if (byteData != null) {\n            completer.complete(byteData.buffer.asUint8List());\n          }\n        }),\n      );\n\n      final data = await completer.future;\n      final fileType = detectFileType(data);\n      await saveFile(filename: \"cover_${widget.title}${fileType.ext}\", data: data);\n    } catch (e) {\n      if (mounted) {\n        context.showMessage(message: \"Error\".tl);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/favorite.dart",
    "content": "part of 'comic_page.dart';\n\nclass _FavoritePanel extends StatefulWidget {\n  const _FavoritePanel({\n    required this.cid,\n    required this.type,\n    required this.isFavorite,\n    required this.onFavorite,\n    required this.favoriteItem,\n    this.updateTime,\n  });\n\n  final String cid;\n\n  final ComicType type;\n\n  /// whether the comic is in the network favorite list\n  ///\n  /// if null, the comic source does not support favorite or support multiple favorite lists\n  final bool? isFavorite;\n\n  final void Function(bool?, bool?) onFavorite;\n\n  final FavoriteItem favoriteItem;\n\n  final String? updateTime;\n\n  @override\n  State<_FavoritePanel> createState() => _FavoritePanelState();\n}\n\nclass _FavoritePanelState extends State<_FavoritePanel>\n    with SingleTickerProviderStateMixin {\n  late ComicSource comicSource;\n\n  late bool hasNetwork;\n\n  late List<String> localFolders;\n\n  late List<String> added;\n\n  @override\n  void initState() {\n    comicSource = widget.type.comicSource!;\n    localFolders = LocalFavoritesManager().folderNames;\n    added = LocalFavoritesManager().find(widget.cid, widget.type);\n    hasNetwork = comicSource.favoriteData != null && comicSource.isLogged;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(title: Text(\"Favorite\".tl)),\n      body: _FavoriteList(\n        cid: widget.cid,\n        type: widget.type,\n        isFavorite: widget.isFavorite,\n        onFavorite: widget.onFavorite,\n        favoriteItem: widget.favoriteItem,\n        updateTime: widget.updateTime,\n        comicSource: comicSource,\n        hasNetwork: hasNetwork,\n        localFolders: localFolders,\n        added: added,\n      ),\n    );\n  }\n}\n\nclass _FavoriteList extends StatefulWidget {\n  const _FavoriteList({\n    required this.cid,\n    required this.type,\n    required this.isFavorite,\n    required this.onFavorite,\n    required this.favoriteItem,\n    this.updateTime,\n    required this.comicSource,\n    required this.hasNetwork,\n    required this.localFolders,\n    required this.added,\n  });\n\n  final String cid;\n  final ComicType type;\n  final bool? isFavorite;\n  final void Function(bool?, bool?) onFavorite;\n  final FavoriteItem favoriteItem;\n  final String? updateTime;\n  final ComicSource comicSource;\n  final bool hasNetwork;\n  final List<String> localFolders;\n  final List<String> added;\n\n  @override\n  State<_FavoriteList> createState() => _FavoriteListState();\n}\n\nclass _FavoriteListState extends State<_FavoriteList> {\n  @override\n  Widget build(BuildContext context) {\n    final localFavoritesFirst = appdata.settings['localFavoritesFirst'] ?? true;\n\n    final localSection = _LocalSection(\n      cid: widget.cid,\n      type: widget.type,\n      favoriteItem: widget.favoriteItem,\n      updateTime: widget.updateTime,\n      localFolders: widget.localFolders,\n      added: widget.added,\n      onFavorite: (local) {\n        widget.onFavorite(local, null);\n      },\n    );\n\n    final networkSection = widget.hasNetwork\n        ? _NetworkSection(\n            cid: widget.cid,\n            comicSource: widget.comicSource,\n            isFavorite: widget.isFavorite,\n            onFavorite: (network) {\n              widget.onFavorite(null, network);\n            },\n          )\n        : null;\n\n    final divider = widget.hasNetwork\n        ? Container(\n            height: 1,\n            margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n            color: context.colorScheme.outlineVariant.withValues(alpha: 0.3),\n          )\n        : null;\n\n    return ListView(\n      children: [\n        if (localFavoritesFirst) ...[\n          localSection,\n          if (widget.hasNetwork) ...[divider!, networkSection!],\n        ] else ...[\n          if (widget.hasNetwork) ...[networkSection!, divider!],\n          localSection,\n        ],\n      ],\n    );\n  }\n}\n\nclass _NetworkSection extends StatefulWidget {\n  const _NetworkSection({\n    required this.cid,\n    required this.comicSource,\n    required this.isFavorite,\n    required this.onFavorite,\n  });\n\n  final String cid;\n  final ComicSource comicSource;\n  final bool? isFavorite;\n  final void Function(bool) onFavorite;\n\n  @override\n  State<_NetworkSection> createState() => _NetworkSectionState();\n}\n\nclass _NetworkSectionState extends State<_NetworkSection> {\n  bool isLoading = false;\n  Map<String, String>? folders;\n  var addedFolders = <String>{};\n  var isLoadingFolders = true;\n  bool? localIsFavorite;\n  final Map<String, bool> _itemLoading = {};\n  late List<double> _skeletonWidths;\n\n  @override\n  void initState() {\n    super.initState();\n    localIsFavorite = widget.isFavorite;\n    _skeletonWidths = List.generate(3, (_) => 0.3 + math.Random().nextDouble() * 0.5);\n    if (widget.comicSource.favoriteData!.loadFolders != null) {\n      loadFolders();\n    } else {\n      isLoadingFolders = false;\n    }\n  }\n\n  void loadFolders() async {\n    var res = await widget.comicSource.favoriteData!.loadFolders!(widget.cid);\n    if (res.error) {\n      context.showMessage(message: res.errorMessage!);\n      setState(() {\n        isLoadingFolders = false;\n      });\n    } else {\n      folders = res.data;\n      if (res.subData is List) {\n        final list = List<String>.from(res.subData);\n        if (list.isNotEmpty) {\n          addedFolders = list.toSet();\n          localIsFavorite = true;\n        } else {\n          addedFolders.clear();\n          localIsFavorite = false;\n        }\n      } else {\n        addedFolders.clear();\n        localIsFavorite = false;\n      }\n      setState(() {\n        isLoadingFolders = false;\n      });\n    }\n  }\n\n  Widget _buildLoadingSkeleton() {\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n          child: Text(\n            \"Network Favorites\".tl,\n            style: ts.s14.copyWith(\n              fontWeight: FontWeight.w600,\n              color: context.colorScheme.primary,\n            ),\n          ),\n        ),\n        Shimmer(\n          child: Column(\n            children: List.generate(3, (index) {\n              return ListTile(\n                title: Container(\n                  height: 20,\n                  width: double.infinity,\n                  margin: const EdgeInsets.only(right: 16),\n                  child: FractionallySizedBox(\n                    widthFactor: _skeletonWidths[index],\n                    alignment: Alignment.centerLeft,\n                    child: Container(\n                      decoration: BoxDecoration(\n                        color: context.colorScheme.surfaceContainerLow,\n                        borderRadius: BorderRadius.circular(4),\n                      ),\n                    ),\n                  ),\n                ),\n                trailing: Container(\n                  height: 28,\n                  width: 60 + (index * 2),\n                  decoration: BoxDecoration(\n                    color: context.colorScheme.surfaceContainerLow,\n                    borderRadius: BorderRadius.circular(12),\n                  ),\n                ),\n              );\n            }),\n          ),\n        ),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (isLoadingFolders) {\n      return _buildLoadingSkeleton();\n    }\n\n    bool isMultiFolder = widget.comicSource.favoriteData!.loadFolders != null;\n\n    if (isMultiFolder) {\n      return _buildMultiFolder();\n    } else {\n      return _buildSingleFolder();\n    }\n  }\n\n  Widget _buildSingleFolder() {\n    var isFavorite = localIsFavorite ?? false;\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n          child: Text(\n            \"Network Favorites\".tl,\n            style: ts.s14.copyWith(\n              fontWeight: FontWeight.w600,\n              color: context.colorScheme.primary,\n            ),\n          ),\n        ),\n        ListTile(\n          title: Row(\n            children: [\n              Text(\"Network Favorites\".tl),\n              const SizedBox(width: 8),\n              if (isFavorite)\n                Container(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 8,\n                    vertical: 4,\n                  ),\n                  decoration: BoxDecoration(\n                    color: context.colorScheme.primaryContainer,\n                    borderRadius: BorderRadius.circular(12),\n                  ),\n                  child: Text(\"Added\".tl, style: ts.s12),\n                ),\n            ],\n          ),\n          trailing: isLoading\n              ? const SizedBox(\n                  width: 20,\n                  height: 20,\n                  child: CircularProgressIndicator(strokeWidth: 2),\n                )\n              : _HoverButton(\n                  isFavorite: isFavorite,\n                  onTap: () async {\n                    setState(() {\n                      isLoading = true;\n                    });\n\n                    var res = await widget\n                        .comicSource\n                        .favoriteData!\n                        .addOrDelFavorite!(widget.cid, '', !isFavorite, null);\n                    if (res.success) {\n                      setState(() {\n                        localIsFavorite = !isFavorite;\n                      });\n                      widget.onFavorite(!isFavorite);\n                      App.rootContext.showMessage(\n                        message: isFavorite ? \"Removed\".tl : \"Added\".tl,\n                      );\n                      if (appdata.settings['autoCloseFavoritePanel'] ?? false) {\n                        context.pop();\n                      }\n                    } else {\n                      context.showMessage(message: res.errorMessage!);\n                    }\n                    setState(() {\n                      isLoading = false;\n                    });\n                  },\n                ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildMultiFolder() {\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n          child: Text(\n            \"Network Favorites\".tl,\n            style: ts.s14.copyWith(\n              fontWeight: FontWeight.w600,\n              color: context.colorScheme.primary,\n            ),\n          ),\n        ),\n        ...folders!.entries.map((entry) {\n          var name = entry.value;\n          var id = entry.key;\n          var isAdded = addedFolders.contains(id);\n          // When `singleFolderForSingleComic` is `false`, all add and remove buttons are clickable.\n          // When `singleFolderForSingleComic` is `true`, the remove button is always clickable, \n          // while the add button is only clickable if the comic has not been added to any list.\n          var enabled = !(widget.comicSource.favoriteData!.singleFolderForSingleComic && addedFolders.isNotEmpty && !isAdded);\n\n          return ListTile(\n            title: Row(\n              children: [\n                Text(name),\n                const SizedBox(width: 8),\n                if (isAdded)\n                  Container(\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 8,\n                      vertical: 4,\n                    ),\n                    decoration: BoxDecoration(\n                      color: context.colorScheme.primaryContainer,\n                      borderRadius: BorderRadius.circular(12),\n                    ),\n                    child: Text(\"Added\".tl, style: ts.s12),\n                  ),\n              ],\n            ),\n            trailing: (_itemLoading[id] ?? false)\n                ? const SizedBox(\n                    width: 20,\n                    height: 20,\n                    child: CircularProgressIndicator(strokeWidth: 2),\n                  )\n                : _HoverButton(\n                    isFavorite: isAdded,\n                    enabled: enabled,\n                    onTap: () async {\n                      setState(() {\n                        _itemLoading[id] = true;\n                      });\n                      var res = await widget\n                          .comicSource\n                          .favoriteData!\n                          .addOrDelFavorite!(widget.cid, id, !isAdded, null);\n                      if (res.success) {\n                        // Invalidate network cache so folders/pages reload with fresh data\n                        NetworkCacheManager().clear();\n                        setState(() {\n                          if (isAdded) {\n                            addedFolders.remove(id);\n                          } else {\n                            addedFolders.add(id);\n                          }\n                          // sync local flag for single-folder-per-comic logic and parent\n                          localIsFavorite = addedFolders.isNotEmpty;\n                        });\n                        // notify parent so page state updates when closing and reopening panel\n                        widget.onFavorite(addedFolders.isNotEmpty);\n                        context.showMessage(message: \"Success\".tl);\n                        if (appdata.settings['autoCloseFavoritePanel'] ?? false) {\n                          context.pop();\n                        }\n                      } else {\n                        context.showMessage(message: res.errorMessage!);\n                      }\n                      setState(() {\n                        _itemLoading[id] = false;\n                      });\n                    },\n                  ),\n          );\n        }),\n      ],\n    );\n  }\n}\n\nclass _LocalSection extends StatefulWidget {\n  const _LocalSection({\n    required this.cid,\n    required this.type,\n    required this.favoriteItem,\n    this.updateTime,\n    required this.localFolders,\n    required this.added,\n    required this.onFavorite,\n  });\n\n  final String cid;\n  final ComicType type;\n  final FavoriteItem favoriteItem;\n  final String? updateTime;\n  final List<String> localFolders;\n  final List<String> added;\n  final void Function(bool) onFavorite;\n\n  @override\n  State<_LocalSection> createState() => _LocalSectionState();\n}\n\nclass _LocalSectionState extends State<_LocalSection> {\n  late List<String> localFolders;\n  late Set<String> localAdded;\n\n  @override\n  void initState() {\n    super.initState();\n    localFolders = widget.localFolders;\n    localAdded = widget.added.toSet();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Padding(\n          padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),\n          child: Text(\n            \"Local Favorites\".tl,\n            style: ts.s14.copyWith(\n              fontWeight: FontWeight.w600,\n              color: context.colorScheme.primary,\n            ),\n          ),\n        ),\n        ...localFolders.map((folder) {\n          var isAdded = localAdded.contains(folder);\n\n          return ListTile(\n            title: Row(\n              children: [\n                Text(folder),\n                const SizedBox(width: 8),\n                if (isAdded)\n                  Container(\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 8,\n                      vertical: 4,\n                    ),\n                    decoration: BoxDecoration(\n                      color: context.colorScheme.primaryContainer,\n                      borderRadius: BorderRadius.circular(12),\n                    ),\n                    child: Text(\"Added\".tl, style: ts.s12),\n                  ),\n              ],\n            ),\n            trailing: _HoverButton(\n              isFavorite: isAdded,\n              onTap: () {\n                if (isAdded) {\n                  LocalFavoritesManager().deleteComicWithId(\n                    folder,\n                    widget.cid,\n                    widget.type,\n                  );\n                  setState(() {\n                    localAdded.remove(folder);\n                  });\n                  widget.onFavorite(false);\n                } else {\n                  LocalFavoritesManager().addComic(\n                    folder,\n                    widget.favoriteItem,\n                    null,\n                    widget.updateTime,\n                  );\n                  setState(() {\n                    localAdded.add(folder);\n                  });\n                  widget.onFavorite(true);\n                }\n                if (appdata.settings['autoCloseFavoritePanel'] ?? false) {\n                  context.pop();\n                }\n              },\n            ),\n          );\n        }),\n        // New folder button\n        ListTile(\n          title: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              const Icon(Icons.add, size: 20),\n              const SizedBox(width: 4),\n              Text(\"New Folder\".tl),\n            ],\n          ),\n          onTap: () {\n            newFolder().then((v) {\n              setState(() {\n                localFolders = LocalFavoritesManager().folderNames;\n              });\n            });\n          },\n        ),\n      ],\n    );\n  }\n}\n\nclass _HoverButton extends StatefulWidget {\n  const _HoverButton({\n    required this.isFavorite,\n    required this.onTap,\n    this.enabled = true,\n  });\n\n  final bool isFavorite;\n  final VoidCallback onTap;\n  final bool enabled;\n\n  @override\n  State<_HoverButton> createState() => _HoverButtonState();\n}\n\nclass _HoverButtonState extends State<_HoverButton> {\n  bool isHovered = false;\n\n  @override\n  Widget build(BuildContext context) {\n    final removeColor = context.colorScheme.error;\n    final removeHoverColor = Color.lerp(removeColor, Colors.black, 0.2)!;\n    final addColor = context.colorScheme.primary;\n    final addHoverColor = Color.lerp(addColor, Colors.black, 0.2)!;\n    \n    return MouseRegion(\n      onEnter: widget.enabled ? (_) => setState(() => isHovered = true) : null,\n      onExit: widget.enabled ? (_) => setState(() => isHovered = false) : null,\n      child: GestureDetector(\n        onTap: widget.enabled ? widget.onTap : null,\n        child: AnimatedContainer(\n          duration: const Duration(milliseconds: 200),\n          padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n          decoration: BoxDecoration(\n            color: widget.enabled\n                ? (widget.isFavorite\n                      ? (isHovered ? removeHoverColor : removeColor)\n                      : (isHovered ? addHoverColor : addColor))\n                : context.colorScheme.surfaceContainerLow,\n            borderRadius: BorderRadius.circular(12),\n          ),\n          child: Text(\n            widget.isFavorite ? \"Remove\".tl : \"Add\".tl,\n            style: ts.s12.copyWith(\n              color: widget.enabled\n                  ? context.colorScheme.onPrimary\n                  : context.colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_details_page/thumbnails.dart",
    "content": "part of 'comic_page.dart';\n\nclass _ComicThumbnails extends StatefulWidget {\n  const _ComicThumbnails();\n\n  @override\n  State<_ComicThumbnails> createState() => _ComicThumbnailsState();\n}\n\nclass _ComicThumbnailsState extends State<_ComicThumbnails> {\n  late _ComicPageState state;\n\n  late List<String> thumbnails;\n\n  bool isInitialLoading = true;\n\n  String? next;\n\n  String? error;\n\n  bool isLoading = false;\n\n  @override\n  void didChangeDependencies() {\n    state = context.findAncestorStateOfType<_ComicPageState>()!;\n    loadNext();\n    thumbnails = List.from(state.comic.thumbnails ?? []);\n    super.didChangeDependencies();\n  }\n\n  void loadNext() async {\n    if (state.comicSource.loadComicThumbnail == null) return;\n    if (!isInitialLoading && next == null) {\n      return;\n    }\n    if (isLoading) return;\n    Future.microtask(() {\n      setState(() {\n        isLoading = true;\n      });\n    });\n    var res = await state.comicSource.loadComicThumbnail!(state.comic.id, next);\n    if (res.success) {\n      thumbnails.addAll(res.data);\n      next = res.subData;\n      isInitialLoading = false;\n    } else {\n      error = res.errorMessage;\n    }\n    if (mounted) {\n      setState(() {\n        isLoading = false;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MultiSliver(\n      children: [\n        SliverToBoxAdapter(\n          child: ListTile(\n            title: Text(\"Preview\".tl),\n          ),\n        ),\n        SliverGrid(\n          delegate: SliverChildBuilderDelegate(\n            childCount: thumbnails.length,\n                (context, index) {\n              if (index == thumbnails.length - 1 && error == null) {\n                loadNext();\n              }\n              var url = thumbnails[index];\n              ImagePart? part;\n              if (url.contains('@')) {\n                var params = url.split('@')[1].split('&');\n                url = url.split('@')[0];\n                double? x1, y1, x2, y2;\n                try {\n                  for (var p in params) {\n                    if (p.startsWith('x')) {\n                      var r = p.split('=')[1];\n                      x1 = double.parse(r.split('-')[0]);\n                      x2 = double.parse(r.split('-')[1]);\n                    }\n                    if (p.startsWith('y')) {\n                      var r = p.split('=')[1];\n                      y1 = double.parse(r.split('-')[0]);\n                      y2 = double.parse(r.split('-')[1]);\n                    }\n                  }\n                } catch (_) {\n                  // ignore\n                }\n                part = ImagePart(x1: x1, y1: y1, x2: x2, y2: y2);\n              }\n              return Padding(\n                padding: context.width < changePoint\n                    ? const EdgeInsets.all(4)\n                    : const EdgeInsets.all(8),\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Expanded(\n                      child: InkWell(\n                        onTap: () => state.read(null, index + 1),\n                        borderRadius:\n                        const BorderRadius.all(Radius.circular(8)),\n                        child: Container(\n                          foregroundDecoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(8),\n                            border: Border.all(\n                              color: Theme.of(context).colorScheme.outline,\n                            ),\n                          ),\n                          decoration: BoxDecoration(\n                            borderRadius: BorderRadius.circular(8),\n                          ),\n                          width: double.infinity,\n                          height: double.infinity,\n                          clipBehavior: Clip.antiAlias,\n                          child: AnimatedImage(\n                            image: CachedImageProvider(\n                              url,\n                              sourceKey: state.widget.sourceKey,\n                            ),\n                            fit: BoxFit.contain,\n                            width: double.infinity,\n                            height: double.infinity,\n                            part: part,\n                          ),\n                        ),\n                      ),\n                    ),\n                    const SizedBox(\n                      height: 4,\n                    ),\n                    Text((index + 1).toString()),\n                  ],\n                ),\n              );\n            },\n          ),\n          gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(\n            maxCrossAxisExtent: 200,\n            childAspectRatio: 0.68,\n          ),\n        ),\n        if (error != null)\n          SliverToBoxAdapter(\n            child: Column(\n              children: [\n                Text(error!),\n                Button.outlined(\n                  onPressed: loadNext,\n                  child: Text(\"Retry\".tl),\n                )\n              ],\n            ),\n          )\n        else if (isLoading)\n          const SliverListLoadingIndicator(),\n        const SliverToBoxAdapter(\n          child: Divider(),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/comic_source_page.dart",
    "content": "import 'dart:convert';\nimport 'dart:io' as io;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/network/app_dio.dart';\nimport 'package:venera/network/cookie_jar.dart';\nimport 'package:venera/pages/webview.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/translations.dart';\n\nclass ComicSourcePage extends StatelessWidget {\n  const ComicSourcePage({super.key});\n\n  static Future<void> update(\n    ComicSource source, [\n    bool showLoading = true,\n  ]) async {\n    if (!source.url.isURL) {\n      if (showLoading) {\n        App.rootContext.showMessage(message: \"Invalid url config\");\n        return;\n      } else {\n        throw Exception(\"Invalid url config\");\n      }\n    }\n    ComicSourceManager().remove(source.key);\n    bool cancel = false;\n    LoadingDialogController? controller;\n    if (showLoading) {\n      controller = showLoadingDialog(\n        App.rootContext,\n        onCancel: () => cancel = true,\n        barrierDismissible: false,\n      );\n    }\n    try {\n      var res = await AppDio().get<String>(\n        source.url,\n        options: Options(\n          responseType: ResponseType.plain,\n          headers: {\"cache-time\": \"no\"},\n        ),\n      );\n      if (cancel) return;\n      controller?.close();\n      await ComicSourceParser().parse(res.data!, source.filePath);\n      await io.File(source.filePath).writeAsString(res.data!);\n      if (ComicSourceManager().availableUpdates.containsKey(source.key)) {\n        ComicSourceManager().availableUpdates.remove(source.key);\n      }\n    } catch (e) {\n      if (cancel) return;\n      if (showLoading) {\n        App.rootContext.showMessage(message: e.toString());\n      } else {\n        rethrow;\n      }\n    }\n    await ComicSourceManager().reload();\n    if (showLoading) {\n      App.forceRebuild();\n    }\n  }\n\n  static Future<int> checkComicSourceUpdate() async {\n    if (ComicSource.all().isEmpty) {\n      return 0;\n    }\n    var dio = AppDio();\n    var res = await dio.get<String>(appdata.settings['comicSourceListUrl']);\n    if (res.statusCode != 200) {\n      return -1;\n    }\n    var list = jsonDecode(res.data!) as List;\n    var versions = <String, String>{};\n    for (var source in list) {\n      versions[source['key']] = source['version'];\n    }\n    var shouldUpdate = <String>[];\n    for (var source in ComicSource.all()) {\n      if (versions.containsKey(source.key) &&\n          compareSemVer(versions[source.key]!, source.version)) {\n        shouldUpdate.add(source.key);\n      }\n    }\n    if (shouldUpdate.isNotEmpty) {\n      var updates = <String, String>{};\n      for (var key in shouldUpdate) {\n        updates[key] = versions[key]!;\n      }\n      ComicSourceManager().updateAvailableUpdates(updates);\n    }\n    return shouldUpdate.length;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(body: const _Body());\n  }\n}\n\nclass _Body extends StatefulWidget {\n  const _Body();\n\n  @override\n  State<_Body> createState() => _BodyState();\n}\n\nclass _BodyState extends State<_Body> {\n  var url = \"\";\n\n  void updateUI() {\n    setState(() {});\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    ComicSourceManager().addListener(updateUI);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    ComicSourceManager().removeListener(updateUI);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text('Comic Source'.tl), style: AppbarStyle.shadow),\n        buildCard(context),\n        for (var source in ComicSource.all())\n          _SliverComicSource(\n            key: ValueKey(source.key),\n            source: source,\n            edit: edit,\n            update: update,\n            delete: delete,\n          ),\n        SliverPadding(padding: EdgeInsets.only(bottom: context.padding.bottom)),\n      ],\n    );\n  }\n\n  void delete(ComicSource source) {\n    showConfirmDialog(\n      context: App.rootContext,\n      title: \"Delete\".tl,\n      content: \"Delete comic source '@n' ?\".tlParams({\"n\": source.name}),\n      btnColor: context.colorScheme.error,\n      onConfirm: () {\n        var file = File(source.filePath);\n        file.delete();\n        ComicSourceManager().remove(source.key);\n        _validatePages();\n        App.forceRebuild();\n      },\n    );\n  }\n\n  void edit(ComicSource source) async {\n    if (App.isDesktop) {\n      try {\n        await Process.run(\"code\", [source.filePath], runInShell: true);\n        await showDialog(\n          context: App.rootContext,\n          builder: (context) => AlertDialog(\n            title: const Text(\"Reload Configs\"),\n            actions: [\n              TextButton(\n                onPressed: () => Navigator.pop(context),\n                child: const Text(\"cancel\"),\n              ),\n              TextButton(\n                onPressed: () async {\n                  await ComicSourceManager().reload();\n                  App.forceRebuild();\n                },\n                child: const Text(\"continue\"),\n              ),\n            ],\n          ),\n        );\n        return;\n      } catch (e) {\n        //\n      }\n    }\n    context.to(\n      () => _EditFilePage(source.filePath, () async {\n        await ComicSourceManager().reload();\n        setState(() {});\n      }),\n    );\n  }\n\n  void update(ComicSource source, [bool showLoading = true]) {\n    ComicSourcePage.update(source, showLoading);\n  }\n\n  Widget buildCard(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: SizedBox(\n        width: double.infinity,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              title: Text(\"Add comic source\".tl),\n              leading: const Icon(Icons.dashboard_customize),\n            ),\n            TextField(\n              decoration: InputDecoration(\n                hintText: \"URL\",\n                border: const UnderlineInputBorder(),\n                contentPadding: const EdgeInsets.symmetric(horizontal: 12),\n                suffix: IconButton(\n                  onPressed: () => handleAddSource(url),\n                  icon: const Icon(Icons.check),\n                ),\n              ),\n              onChanged: (value) {\n                url = value;\n              },\n              onSubmitted: handleAddSource,\n            ).paddingHorizontal(16).paddingBottom(8),\n            Wrap(\n              spacing: 8,\n              runSpacing: 8,\n              children: [\n                FilledButton.tonalIcon(\n                  icon: Icon(Icons.article_outlined),\n                  label: Text(\"Comic Source list\".tl),\n                  onPressed: () {\n                    showPopUpWidget(\n                      App.rootContext,\n                      _ComicSourceList(handleAddSource),\n                    );\n                  },\n                ),\n                FilledButton.tonalIcon(\n                  icon: Icon(Icons.file_open_outlined),\n                  label: Text(\"Use a config file\".tl),\n                  onPressed: _selectFile,\n                ),\n                FilledButton.tonalIcon(\n                  icon: Icon(Icons.help_outline),\n                  label: Text(\"Help\".tl),\n                  onPressed: help,\n                ),\n                _CheckUpdatesButton(),\n              ],\n            ).paddingHorizontal(12).paddingVertical(8),\n            const SizedBox(height: 8),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void _selectFile() async {\n    final file = await selectFile(ext: [\"js\"]);\n    if (file == null) return;\n    try {\n      var fileName = file.name;\n      var bytes = await file.readAsBytes();\n      var content = utf8.decode(bytes);\n      await addSource(content, fileName);\n    } catch (e, s) {\n      App.rootContext.showMessage(message: e.toString());\n      Log.error(\"Add comic source\", \"$e\\n$s\");\n    }\n  }\n\n  void help() {\n    launchUrlString(\n      \"https://github.com/venera-app/venera/blob/master/doc/comic_source.md\",\n    );\n  }\n\n  Future<void> handleAddSource(String url) async {\n    if (url.isEmpty) {\n      return;\n    }\n    var splits = url.split(\"/\");\n    splits.removeWhere((element) => element == \"\");\n    var fileName = splits.last;\n    bool cancel = false;\n    var controller = showLoadingDialog(\n      App.rootContext,\n      onCancel: () => cancel = true,\n      barrierDismissible: false,\n    );\n    try {\n      var res = await AppDio().get<String>(\n        url,\n        options: Options(\n          responseType: ResponseType.plain,\n          headers: {\"cache-time\": \"no\"},\n        ),\n      );\n      if (cancel) return;\n      controller.close();\n      await addSource(res.data!, fileName);\n    } catch (e, s) {\n      if (cancel) return;\n      context.showMessage(message: e.toString());\n      Log.error(\"Add comic source\", \"$e\\n$s\");\n    }\n  }\n\n  Future<void> addSource(String js, String fileName) async {\n    var comicSource = await ComicSourceParser().createAndParse(js, fileName);\n    ComicSourceManager().add(comicSource);\n    _addAllPagesWithComicSource(comicSource);\n    appdata.saveData();\n    App.forceRebuild();\n  }\n}\n\nclass _ComicSourceList extends StatefulWidget {\n  const _ComicSourceList(this.onAdd);\n\n  final Future<void> Function(String) onAdd;\n\n  @override\n  State<_ComicSourceList> createState() => _ComicSourceListState();\n}\n\nclass _ComicSourceListState extends State<_ComicSourceList> {\n  List? json;\n  bool changed = false;\n  var controller = TextEditingController();\n\n  void load() async {\n    if (json != null) {\n      setState(() {\n        json = null;\n      });\n    }\n    if (controller.text.isEmpty) {\n      setState(() {\n        json = [];\n      });\n      return;\n    }\n    var dio = AppDio();\n    try {\n      var res = await dio.get<String>(controller.text);\n      if (res.statusCode != 200) {\n        throw \"error\";\n      }\n      if (mounted) {\n        setState(() {\n          json = jsonDecode(res.data!);\n        });\n      }\n    } catch (e) {\n      context.showMessage(message: \"Network error\".tl);\n      if (mounted) {\n        setState(() {\n          json = [];\n        });\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    controller.text = appdata.settings['comicSourceListUrl'];\n    load();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    if (changed) {\n      appdata.settings['comicSourceListUrl'] = controller.text;\n      appdata.saveData();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopUpWidgetScaffold(title: \"Comic Source\".tl, body: buildBody());\n  }\n\n  Widget buildBody() {\n    var currentKey = ComicSource.all().map((e) => e.key).toList();\n\n    return ListView.builder(\n      itemCount: (json?.length ?? 1) + 1,\n      itemBuilder: (context, index) {\n        if (index == 0) {\n          return Container(\n            margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n            decoration: BoxDecoration(\n              border: Border.all(\n                color: Theme.of(context).colorScheme.outlineVariant,\n                width: 0.6,\n              ),\n              borderRadius: BorderRadius.circular(8),\n            ),\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                ListTile(\n                  leading: Icon(Icons.source_outlined),\n                  title: Text(\"Repo URL\".tl),\n                ),\n                TextField(\n                  controller: controller,\n                  decoration: InputDecoration(\n                    hintText: \"URL\",\n                    border: const UnderlineInputBorder(),\n                    contentPadding: const EdgeInsets.symmetric(horizontal: 12),\n                  ),\n                  onChanged: (value) {\n                    changed = true;\n                  },\n                ).paddingHorizontal(16).paddingBottom(8),\n                Text(\n                  \"The URL should point to a 'index.json' file\".tl,\n                ).paddingLeft(16),\n                Text(\n                  \"Do not report any issues related to sources to App repo.\".tl,\n                ).paddingLeft(16),\n                const SizedBox(height: 8),\n                Row(\n                  mainAxisAlignment: MainAxisAlignment.end,\n                  children: [\n                    TextButton(\n                      onPressed: () {\n                        launchUrlString(\n                          \"https://github.com/venera-app/venera/blob/master/doc/comic_source.md\",\n                        );\n                      },\n                      child: Text(\"Help\".tl),\n                    ),\n                    FilledButton.tonal(\n                      onPressed: load,\n                      child: Text(\"Refresh\".tl),\n                    ),\n                    const SizedBox(width: 16),\n                  ],\n                ),\n                const SizedBox(height: 16),\n              ],\n            ),\n          );\n        }\n\n        if (index == 1 && json == null) {\n          return Center(\n            child: CircularProgressIndicator(\n              strokeWidth: 2,\n            ).fixWidth(24).fixHeight(24),\n          );\n        }\n\n        index--;\n\n        var key = json![index][\"key\"];\n        var action = currentKey.contains(key)\n            ? const Icon(Icons.check, size: 20).paddingRight(8)\n            : Button.filled(\n                child: Text(\"Add\".tl),\n                onPressed: () async {\n                  var fileName = json![index][\"fileName\"];\n                  var url = json![index][\"url\"];\n                  if (url == null || !(url.toString()).isURL) {\n                    var listUrl =\n                        appdata.settings['comicSourceListUrl'] as String;\n                    if (listUrl\n                        .replaceFirst(\"https://\", \"\")\n                        .replaceFirst(\"http://\", \"\")\n                        .contains(\"/\")) {\n                      url =\n                          listUrl.substring(0, listUrl.lastIndexOf(\"/\") + 1) +\n                          fileName;\n                    } else {\n                      url = '$listUrl/$fileName';\n                    }\n                  }\n                  await widget.onAdd(url);\n                  setState(() {});\n                },\n              ).fixHeight(32);\n\n        var description = json![index][\"version\"];\n        if (json![index][\"description\"] != null) {\n          description = \"$description\\n${json![index][\"description\"]}\";\n        }\n\n        return ListTile(\n          title: Text(json![index][\"name\"]),\n          subtitle: Text(description),\n          trailing: action,\n        );\n      },\n    );\n  }\n}\n\nvoid _validatePages() {\n  List explorePages = appdata.settings['explore_pages'];\n  List categoryPages = appdata.settings['categories'];\n  List networkFavorites = appdata.settings['favorites'];\n\n  var totalExplorePages = ComicSource.all()\n      .map((e) => e.explorePages.map((e) => e.title))\n      .expand((element) => element)\n      .toList();\n  var totalCategoryPages = ComicSource.all()\n      .map((e) => e.categoryData?.key)\n      .where((element) => element != null)\n      .map((e) => e!)\n      .toList();\n  var totalNetworkFavorites = ComicSource.all()\n      .map((e) => e.favoriteData?.key)\n      .where((element) => element != null)\n      .map((e) => e!)\n      .toList();\n\n  for (var page in List.from(explorePages)) {\n    if (!totalExplorePages.contains(page)) {\n      explorePages.remove(page);\n    }\n  }\n  for (var page in List.from(categoryPages)) {\n    if (!totalCategoryPages.contains(page)) {\n      categoryPages.remove(page);\n    }\n  }\n  for (var page in List.from(networkFavorites)) {\n    if (!totalNetworkFavorites.contains(page)) {\n      networkFavorites.remove(page);\n    }\n  }\n\n  appdata.settings['explore_pages'] = explorePages.toSet().toList();\n  appdata.settings['categories'] = categoryPages.toSet().toList();\n  appdata.settings['favorites'] = networkFavorites.toSet().toList();\n\n  appdata.saveData();\n}\n\nvoid _addAllPagesWithComicSource(ComicSource source) {\n  var explorePages = appdata.settings['explore_pages'];\n  var categoryPages = appdata.settings['categories'];\n  var networkFavorites = appdata.settings['favorites'];\n  var searchPages = appdata.settings['searchSources'];\n\n  if (source.explorePages.isNotEmpty) {\n    for (var page in source.explorePages) {\n      if (!explorePages.contains(page.title)) {\n        explorePages.add(page.title);\n      }\n    }\n  }\n  if (source.categoryData != null &&\n      !categoryPages.contains(source.categoryData!.key)) {\n    categoryPages.add(source.categoryData!.key);\n  }\n  if (source.favoriteData != null &&\n      !networkFavorites.contains(source.favoriteData!.key)) {\n    networkFavorites.add(source.favoriteData!.key);\n  }\n  if (source.searchPageData != null && !searchPages.contains(source.key)) {\n    searchPages.add(source.key);\n  }\n\n  appdata.settings['explore_pages'] = explorePages.toSet().toList();\n  appdata.settings['categories'] = categoryPages.toSet().toList();\n  appdata.settings['favorites'] = networkFavorites.toSet().toList();\n  appdata.settings['searchSources'] = searchPages.toSet().toList();\n\n  appdata.saveData();\n}\n\nclass _EditFilePage extends StatefulWidget {\n  const _EditFilePage(this.path, this.onExit);\n\n  final String path;\n\n  final void Function() onExit;\n\n  @override\n  State<_EditFilePage> createState() => __EditFilePageState();\n}\n\nclass __EditFilePageState extends State<_EditFilePage> {\n  var current = '';\n\n  @override\n  void initState() {\n    super.initState();\n    current = File(widget.path).readAsStringSync();\n  }\n\n  @override\n  void dispose() {\n    File(widget.path).writeAsStringSync(current);\n    widget.onExit();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(title: Text(\"Edit\".tl)),\n      body: Column(\n        children: [\n          Container(height: 0.6, color: context.colorScheme.outlineVariant),\n          Expanded(\n            child: CodeEditor(\n              initialValue: current,\n              onChanged: (value) => current = value,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _CheckUpdatesButton extends StatefulWidget {\n  const _CheckUpdatesButton();\n\n  @override\n  State<_CheckUpdatesButton> createState() => _CheckUpdatesButtonState();\n}\n\nclass _CheckUpdatesButtonState extends State<_CheckUpdatesButton> {\n  bool isLoading = false;\n\n  void check() async {\n    setState(() {\n      isLoading = true;\n    });\n    var count = await ComicSourcePage.checkComicSourceUpdate();\n    if (count == -1) {\n      context.showMessage(message: \"Network error\".tl);\n    } else if (count == 0) {\n      context.showMessage(message: \"No updates\".tl);\n    } else {\n      showUpdateDialog();\n    }\n    setState(() {\n      isLoading = false;\n    });\n  }\n\n  void showUpdateDialog() async {\n    var text = ComicSourceManager().availableUpdates.entries\n        .map((e) {\n          return \"${ComicSource.find(e.key)!.name}: ${e.value}\";\n        })\n        .join(\"\\n\");\n    bool doUpdate = false;\n    await showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        return ContentDialog(\n          title: \"Updates\".tl,\n          content: Text(text).paddingHorizontal(16),\n          actions: [\n            FilledButton(\n              onPressed: () {\n                doUpdate = true;\n                context.pop();\n              },\n              child: Text(\"Update\".tl),\n            ),\n          ],\n        );\n      },\n    );\n    if (doUpdate) {\n      var loadingController = showLoadingDialog(\n        context,\n        message: \"Updating\".tl,\n        withProgress: true,\n      );\n      int current = 0;\n      int total = ComicSourceManager().availableUpdates.length;\n      try {\n        var shouldUpdate = ComicSourceManager().availableUpdates.keys.toList();\n        for (var key in shouldUpdate) {\n          var source = ComicSource.find(key)!;\n          await ComicSourcePage.update(source, false);\n          current++;\n          loadingController.setProgress(current / total);\n        }\n      } catch (e) {\n        context.showMessage(message: e.toString());\n      }\n      loadingController.close();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return FilledButton.tonalIcon(\n      icon: isLoading\n          ? SizedBox(\n              width: 18,\n              height: 18,\n              child: CircularProgressIndicator(strokeWidth: 2),\n            )\n          : Icon(Icons.update),\n      label: Text(\"Check updates\".tl),\n      onPressed: check,\n    );\n  }\n}\n\nclass _CallbackSetting extends StatefulWidget {\n  const _CallbackSetting({required this.setting, required this.sourceKey});\n\n  final MapEntry<String, Map<String, dynamic>> setting;\n\n  final String sourceKey;\n\n  @override\n  State<_CallbackSetting> createState() => _CallbackSettingState();\n}\n\nclass _CallbackSettingState extends State<_CallbackSetting> {\n  String get key => widget.setting.key;\n\n  String get buttonText => widget.setting.value['buttonText'] ?? \"Click\";\n\n  String get title => widget.setting.value['title'] ?? key;\n\n  bool isLoading = false;\n\n  Future<void> onClick() async {\n    var func = widget.setting.value['callback'];\n    var result = func([]);\n    if (result is Future) {\n      setState(() {\n        isLoading = true;\n      });\n      try {\n        await result;\n      } finally {\n        setState(() {\n          isLoading = false;\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      title: Text(title.ts(widget.sourceKey)),\n      trailing: Button.normal(\n        onPressed: onClick,\n        isLoading: isLoading,\n        child: Text(buttonText.ts(widget.sourceKey)),\n      ).fixHeight(32),\n    );\n  }\n}\n\nclass _SliverComicSource extends StatefulWidget {\n  const _SliverComicSource({\n    super.key,\n    required this.source,\n    required this.edit,\n    required this.update,\n    required this.delete,\n  });\n\n  final ComicSource source;\n\n  final void Function(ComicSource source) edit;\n  final void Function(ComicSource source) update;\n  final void Function(ComicSource source) delete;\n\n  @override\n  State<_SliverComicSource> createState() => _SliverComicSourceState();\n}\n\nclass _SliverComicSourceState extends State<_SliverComicSource> {\n  ComicSource get source => widget.source;\n\n  @override\n  Widget build(BuildContext context) {\n    var newVersion = ComicSourceManager().availableUpdates[source.key];\n    bool hasUpdate =\n        newVersion != null && compareSemVer(newVersion, source.version);\n\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverPadding(padding: const EdgeInsets.only(top: 16)),\n        SliverToBoxAdapter(\n          child: ListTile(\n            title: Row(\n              children: [\n                Text(source.name, style: ts.s18),\n                const SizedBox(width: 6),\n                Container(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 8,\n                    vertical: 2,\n                  ),\n                  decoration: BoxDecoration(\n                    color: context.colorScheme.surfaceContainer,\n                    borderRadius: BorderRadius.circular(8),\n                  ),\n                  child: Text(\n                    source.version,\n                    style: const TextStyle(fontSize: 13),\n                  ),\n                ),\n                if (hasUpdate)\n                  Tooltip(\n                    message: newVersion,\n                    child: Container(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: 6,\n                        vertical: 2,\n                      ),\n                      decoration: BoxDecoration(\n                        color: context.colorScheme.primaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child: Text(\n                        \"New Version\".tl,\n                        style: const TextStyle(fontSize: 13),\n                      ),\n                    ),\n                  ).paddingLeft(4),\n              ],\n            ),\n            trailing: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Tooltip(\n                  message: \"Edit\".tl,\n                  child: IconButton(\n                    onPressed: () => widget.edit(source),\n                    icon: const Icon(Icons.edit_note),\n                  ),\n                ),\n                Tooltip(\n                  message: \"Update\".tl,\n                  child: IconButton(\n                    onPressed: () => widget.update(source),\n                    icon: const Icon(Icons.update),\n                  ),\n                ),\n                Tooltip(\n                  message: \"Delete\".tl,\n                  child: IconButton(\n                    onPressed: () => widget.delete(source),\n                    icon: const Icon(Icons.delete),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n        SliverToBoxAdapter(\n          child: Container(\n            margin: const EdgeInsets.symmetric(horizontal: 8),\n            decoration: BoxDecoration(\n              border: Border(\n                bottom: BorderSide(\n                  color: context.colorScheme.outlineVariant,\n                  width: 0.6,\n                ),\n              ),\n            ),\n          ),\n        ),\n        SliverToBoxAdapter(\n          child: Column(children: buildSourceSettings().toList()),\n        ),\n        SliverToBoxAdapter(child: Column(children: _buildAccount().toList())),\n      ],\n    );\n  }\n\n  Iterable<Widget> buildSourceSettings() sync* {\n    if (source.settings == null) {\n      return;\n    } else if (source.data['settings'] == null) {\n      source.data['settings'] = {};\n    }\n    for (var item in source.settings!.entries) {\n      var key = item.key;\n      String type = item.value['type'];\n      try {\n        if (type == \"select\") {\n          var current = source.data['settings'][key];\n          if (current == null) {\n            var d = item.value['default'];\n            for (var option in item.value['options']) {\n              if (option['value'] == d) {\n                current = option['text'] ?? option['value'];\n                break;\n              }\n            }\n          } else {\n            current =\n                item.value['options'].firstWhere(\n                  (e) => e['value'] == current,\n                )['text'] ??\n                current;\n          }\n          yield ListTile(\n            title: Text((item.value['title'] as String).ts(source.key)),\n            trailing: Select(\n              current: (current as String).ts(source.key),\n              values: (item.value['options'] as List)\n                  .map<String>(\n                    (e) => ((e['text'] ?? e['value']) as String).ts(source.key),\n                  )\n                  .toList(),\n              onTap: (i) {\n                source.data['settings'][key] =\n                    item.value['options'][i]['value'];\n                source.saveData();\n                setState(() {});\n              },\n            ),\n          );\n        } else if (type == \"switch\") {\n          var current = source.data['settings'][key] ?? item.value['default'];\n          yield ListTile(\n            title: Text((item.value['title'] as String).ts(source.key)),\n            trailing: Switch(\n              value: current,\n              onChanged: (v) {\n                source.data['settings'][key] = v;\n                source.saveData();\n                setState(() {});\n              },\n            ),\n          );\n        } else if (type == \"input\") {\n          var current =\n              source.data['settings'][key] ?? item.value['default'] ?? '';\n          yield ListTile(\n            title: Text((item.value['title'] as String).ts(source.key)),\n            subtitle: Text(\n              current,\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n            trailing: IconButton(\n              icon: const Icon(Icons.edit),\n              onPressed: () {\n                showInputDialog(\n                  context: context,\n                  title: (item.value['title'] as String).ts(source.key),\n                  initialValue: current,\n                  inputValidator: item.value['validator'] == null\n                      ? null\n                      : RegExp(item.value['validator']),\n                  onConfirm: (value) {\n                    source.data['settings'][key] = value;\n                    source.saveData();\n                    setState(() {});\n                    return null;\n                  },\n                );\n              },\n            ),\n          );\n        } else if (type == \"callback\") {\n          yield _CallbackSetting(setting: item, sourceKey: source.key);\n        }\n      } catch (e, s) {\n        Log.error(\"ComicSourcePage\", \"Failed to build a setting\\n$e\\n$s\");\n      }\n    }\n  }\n\n  final _reLogin = <String, bool>{};\n\n  Iterable<Widget> _buildAccount() sync* {\n    if (source.account == null) return;\n    final bool logged = source.isLogged;\n    if (!logged) {\n      yield ListTile(\n        title: Text(\"Log in\".tl),\n        trailing: const Icon(Icons.arrow_right),\n        onTap: () async {\n          await context.to(\n            () => _LoginPage(config: source.account!, source: source),\n          );\n          source.saveData();\n          setState(() {});\n        },\n      );\n    }\n    if (logged) {\n      for (var item in source.account!.infoItems) {\n        if (item.builder != null) {\n          yield item.builder!(context);\n        } else {\n          yield ListTile(\n            title: Text(item.title.tl),\n            subtitle: item.data == null ? null : Text(item.data!()),\n            onTap: item.onTap,\n          );\n        }\n      }\n      if (source.data[\"account\"] is List) {\n        bool loading = _reLogin[source.key] == true;\n        yield ListTile(\n          title: Text(\"Re-login\".tl),\n          subtitle: Text(\"Click if login expired\".tl),\n          onTap: () async {\n            if (source.data[\"account\"] == null) {\n              context.showMessage(message: \"No data\".tl);\n              return;\n            }\n            setState(() {\n              _reLogin[source.key] = true;\n            });\n            final List account = source.data[\"account\"];\n            var res = await source.account!.login!(account[0], account[1]);\n            if (res.error) {\n              context.showMessage(message: res.errorMessage!);\n            } else {\n              context.showMessage(message: \"Success\".tl);\n            }\n            setState(() {\n              _reLogin[source.key] = false;\n            });\n          },\n          trailing: loading\n              ? const SizedBox.square(\n                  dimension: 24,\n                  child: CircularProgressIndicator(strokeWidth: 2),\n                )\n              : const Icon(Icons.refresh),\n        );\n      }\n      yield ListTile(\n        title: Text(\"Log out\".tl),\n        onTap: () {\n          source.data[\"account\"] = null;\n          source.account?.logout();\n          source.saveData();\n          ComicSourceManager().notifyStateChange();\n          setState(() {});\n        },\n        trailing: const Icon(Icons.logout),\n      );\n    }\n  }\n}\n\nclass _LoginPage extends StatefulWidget {\n  const _LoginPage({required this.config, required this.source});\n\n  final AccountConfig config;\n\n  final ComicSource source;\n\n  @override\n  State<_LoginPage> createState() => _LoginPageState();\n}\n\nclass _LoginPageState extends State<_LoginPage> {\n  String username = \"\";\n  String password = \"\";\n  bool loading = false;\n\n  final Map<String, String> _cookies = {};\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: const Appbar(title: Text('')),\n      body: Center(\n        child: Container(\n          padding: const EdgeInsets.all(16),\n          constraints: const BoxConstraints(maxWidth: 400),\n          child: AutofillGroup(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Text(\"Login\".tl, style: const TextStyle(fontSize: 24)),\n                const SizedBox(height: 32),\n                if (widget.config.cookieFields == null)\n                  TextField(\n                    decoration: InputDecoration(\n                      labelText: \"Username\".tl,\n                      border: const OutlineInputBorder(),\n                    ),\n                    enabled: widget.config.login != null,\n                    onChanged: (s) {\n                      username = s;\n                    },\n                    autofillHints: const [AutofillHints.username],\n                  ).paddingBottom(16),\n                if (widget.config.cookieFields == null)\n                  TextField(\n                    decoration: InputDecoration(\n                      labelText: \"Password\".tl,\n                      border: const OutlineInputBorder(),\n                    ),\n                    obscureText: true,\n                    enabled: widget.config.login != null,\n                    onChanged: (s) {\n                      password = s;\n                    },\n                    onSubmitted: (s) => login(),\n                    autofillHints: const [AutofillHints.password],\n                  ).paddingBottom(16),\n                for (var field in widget.config.cookieFields ?? <String>[])\n                  TextField(\n                    decoration: InputDecoration(\n                      labelText: field,\n                      border: const OutlineInputBorder(),\n                    ),\n                    obscureText: true,\n                    enabled: widget.config.validateCookies != null,\n                    onChanged: (s) {\n                      _cookies[field] = s;\n                    },\n                  ).paddingBottom(16),\n                if (widget.config.login == null &&\n                    widget.config.cookieFields == null)\n                  Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      const Icon(Icons.error_outline),\n                      const SizedBox(width: 8),\n                      Text(\"Login with password is disabled\".tl),\n                    ],\n                  )\n                else\n                  Button.filled(\n                    isLoading: loading,\n                    onPressed: login,\n                    child: Text(\"Continue\".tl),\n                  ),\n                const SizedBox(height: 24),\n                if (widget.config.loginWebsite != null)\n                  TextButton(\n                    onPressed: () {\n                      if (App.isLinux) {\n                        loginWithWebview2();\n                      } else {\n                        loginWithWebview();\n                      }\n                    },\n                    child: Text(\"Login with webview\".tl),\n                  ),\n                const SizedBox(height: 8),\n                if (widget.config.registerWebsite != null)\n                  TextButton(\n                    onPressed: () =>\n                        launchUrlString(widget.config.registerWebsite!),\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        const Icon(Icons.link),\n                        const SizedBox(width: 8),\n                        Text(\"Create Account\".tl),\n                      ],\n                    ),\n                  ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void login() {\n    if (widget.config.login != null) {\n      if (username.isEmpty || password.isEmpty) {\n        showToast(\n          message: \"Cannot be empty\".tl,\n          icon: const Icon(Icons.error_outline),\n          context: context,\n        );\n        return;\n      }\n      setState(() {\n        loading = true;\n      });\n      widget.config.login!(username, password).then((value) {\n        if (value.error) {\n          context.showMessage(message: value.errorMessage!);\n          setState(() {\n            loading = false;\n          });\n        } else {\n          if (mounted) {\n            context.pop();\n          }\n        }\n      });\n    } else if (widget.config.validateCookies != null) {\n      setState(() {\n        loading = true;\n      });\n      var cookies = widget.config.cookieFields!\n          .map((e) => _cookies[e] ?? '')\n          .toList();\n      widget.config.validateCookies!(cookies).then((value) {\n        if (value) {\n          widget.source.data['account'] = 'ok';\n          widget.source.saveData();\n          context.pop();\n        } else {\n          context.showMessage(message: \"Invalid cookies\".tl);\n          setState(() {\n            loading = false;\n          });\n        }\n      });\n    }\n  }\n\n  void loginWithWebview() async {\n    var url = widget.config.loginWebsite!;\n    var title = '';\n    bool success = false;\n\n    void validate(InAppWebViewController c) async {\n      if (widget.config.checkLoginStatus != null &&\n          widget.config.checkLoginStatus!(url, title)) {\n        var cookies = (await c.getCookies(url)) ?? [];\n        var localStorageItems = await c.webStorage.localStorage.getItems();\n        var mappedLocalStorage = <String, dynamic>{};\n        for (var item in localStorageItems) {\n          if (item.key != null) {\n            mappedLocalStorage[item.key!] = item.value;\n          }\n        }\n        widget.source.data['_localStorage'] = mappedLocalStorage;\n        await widget.source.saveData();\n        SingleInstanceCookieJar.instance?.saveFromResponse(\n          Uri.parse(url),\n          cookies,\n        );\n        success = true;\n        widget.config.onLoginWithWebviewSuccess?.call();\n        App.mainNavigatorKey?.currentContext?.pop();\n      }\n    }\n\n    await context.to(\n      () => AppWebview(\n        initialUrl: widget.config.loginWebsite!,\n        onNavigation: (u, c) {\n          url = u;\n          validate(c);\n          return false;\n        },\n        onTitleChange: (t, c) {\n          title = t;\n          validate(c);\n        },\n      ),\n    );\n    if (success) {\n      widget.source.data['account'] = 'ok';\n      widget.source.saveData();\n      context.pop();\n    }\n  }\n\n  // for linux\n  void loginWithWebview2() async {\n    if (!await DesktopWebview.isAvailable()) {\n      context.showMessage(message: \"Webview is not available\".tl);\n    }\n\n    var url = widget.config.loginWebsite!;\n    var title = '';\n    bool success = false;\n\n    void onClose() {\n      if (success) {\n        widget.source.data['account'] = 'ok';\n        widget.source.saveData();\n        context.pop();\n      }\n    }\n\n    void validate(DesktopWebview webview) async {\n      if (widget.config.checkLoginStatus != null &&\n          widget.config.checkLoginStatus!(url, title)) {\n        var cookiesMap = await webview.getCookies(url);\n        var cookies = <io.Cookie>[];\n        cookiesMap.forEach((key, value) {\n          cookies.add(io.Cookie(key, value));\n        });\n        SingleInstanceCookieJar.instance?.saveFromResponse(\n          Uri.parse(url),\n          cookies,\n        );\n        var localStorageJson = await webview.evaluateJavascript(\n          \"JSON.stringify(window.localStorage);\",\n        );\n        var localStorage = <String, dynamic>{};\n        try {\n          var decoded = jsonDecode(localStorageJson ?? '');\n          if (decoded is Map<String, dynamic>) {\n            localStorage = decoded;\n          }\n        } catch (e) {\n          Log.error(\"ComicSourcePage\", \"Failed to parse localStorage JSON\\n$e\");\n        }\n        widget.source.data['_localStorage'] = localStorage;\n        await widget.source.saveData();\n        success = true;\n        widget.config.onLoginWithWebviewSuccess?.call();\n        webview.close();\n        onClose();\n      }\n    }\n\n    var webview = DesktopWebview(\n      initialUrl: widget.config.loginWebsite!,\n      onTitleChange: (t, webview) {\n        title = t;\n        validate(webview);\n      },\n      onNavigation: (u, webview) {\n        url = u;\n        validate(webview);\n      },\n      onClose: onClose,\n    );\n\n    webview.open();\n  }\n}\n"
  },
  {
    "path": "lib/pages/downloading_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/image_provider/cached_image.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/network/download.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/translations.dart';\n\nclass DownloadingPage extends StatefulWidget {\n  const DownloadingPage({super.key});\n\n  @override\n  State<DownloadingPage> createState() => _DownloadingPageState();\n}\n\nclass _DownloadingPageState extends State<DownloadingPage> {\n  DownloadTask? firstTask;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    firstTask = LocalManager().downloadingTasks.firstOrNull;\n    firstTask?.addListener(update);\n  }\n\n  @override\n  void initState() {\n    LocalManager().addListener(update);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    LocalManager().removeListener(update);\n    firstTask?.removeListener(update);\n    super.dispose();\n  }\n\n  void update() {\n    var currentFirstTask = LocalManager().downloadingTasks.firstOrNull;\n    if (currentFirstTask != firstTask) {\n      firstTask?.removeListener(update);\n      firstTask = currentFirstTask;\n      firstTask?.addListener(update);\n    }\n    if(mounted) {\n      setState(() {});\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopUpWidgetScaffold(\n      title: \"\",\n      body: ListView.builder(\n        itemCount: LocalManager().downloadingTasks.length + 1,\n        itemBuilder: (BuildContext context, int i) {\n          if (i == 0) {\n            return buildTop();\n          }\n          i--;\n\n          return _DownloadTaskTile(\n            key: ValueKey(LocalManager().downloadingTasks[i]),\n            task: LocalManager().downloadingTasks[i],\n          );\n        },\n      ),\n    );\n  }\n\n  Widget buildTop() {\n    int speed = 0;\n    if (LocalManager().downloadingTasks.isNotEmpty) {\n      speed = LocalManager().downloadingTasks.first.speed;\n    }\n    var first = LocalManager().downloadingTasks.firstOrNull;\n    return Container(\n      height: 48,\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Row(\n        children: [\n          if (first?.isPaused == true)\n            Text(\n              \"Paused\".tl,\n              style: ts.s18.bold,\n            )\n          else if (first?.isError == true)\n            Text(\n              \"Error\".tl,\n              style: ts.s18.bold,\n            )\n          else\n            Text(\n              \"${bytesToReadableString(speed)}/s\",\n              style: ts.s18.bold,\n            ),\n          const Spacer(),\n          if (first?.isPaused == true || first?.isError == true)\n            OutlinedButton(\n              child: Row(\n                children: [\n                  const Icon(Icons.play_arrow, size: 18),\n                  const SizedBox(width: 4),\n                  Text(\"Start\".tl),\n                ],\n              ),\n              onPressed: () {\n                first!.resume();\n              },\n            )\n          else if (first != null)\n            OutlinedButton(\n              child: Row(\n                children: [\n                  const Icon(Icons.pause, size: 18),\n                  const SizedBox(width: 4),\n                  Text(\"Pause\".tl),\n                ],\n              ),\n              onPressed: () {\n                first.pause();\n              },\n            ),\n        ],\n      ).paddingHorizontal(16),\n    );\n  }\n}\n\nclass _DownloadTaskTile extends StatefulWidget {\n  const _DownloadTaskTile({required this.task, super.key});\n\n  final DownloadTask task;\n\n  @override\n  State<_DownloadTaskTile> createState() => _DownloadTaskTileState();\n}\n\nclass _DownloadTaskTileState extends State<_DownloadTaskTile> {\n  late DownloadTask task;\n\n  @override\n  void initState() {\n    task = widget.task;\n    task.addListener(update);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    task.removeListener(update);\n    super.dispose();\n  }\n\n  @override\n  void didUpdateWidget(covariant _DownloadTaskTile oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.task != widget.task) {\n      task.removeListener(update);\n      task = widget.task;\n      task.addListener(update);\n    }\n  }\n\n  void update() {\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      height: 136,\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),\n      child: Row(\n        children: [\n          Container(\n            width: 82,\n            height: double.infinity,\n            decoration: BoxDecoration(\n              borderRadius: BorderRadius.circular(8),\n              color: context.colorScheme.primaryContainer,\n            ),\n            clipBehavior: Clip.antiAlias,\n            child: widget.task.cover == null\n                ? null\n                : Image(\n                    image: CachedImageProvider(widget.task.cover!),\n                    filterQuality: FilterQuality.medium,\n                    fit: BoxFit.cover,\n                  ),\n          ),\n          const SizedBox(width: 12),\n          Expanded(\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Row(\n                  children: [\n                    Expanded(\n                      child: Text(\n                        widget.task.title,\n                        style: Theme.of(context).textTheme.bodyMedium,\n                        maxLines: 2,\n                      ),\n                    ),\n                    MenuButton(\n                      entries: [\n                        MenuEntry(\n                          icon: Icons.close,\n                          text: \"Cancel\".tl,\n                          onClick: () {\n                            widget.task.cancel();\n                          },\n                        ),\n                        MenuEntry(\n                          icon: Icons.vertical_align_top,\n                          text: \"Move To First\".tl,\n                          onClick: () {\n                            LocalManager().moveToFirst(widget.task);\n                          },\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n                const Spacer(),\n                if (!widget.task.isPaused || widget.task.isError)\n                  Text(\n                    widget.task.message,\n                    style: ts.s12,\n                    maxLines: 3,\n                  ),\n                const SizedBox(height: 4),\n                LinearProgressIndicator(\n                  value: widget.task.progress,\n                ),\n                const SizedBox(height: 8),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/explore_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/global_state.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/pages/comic_source_page.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/translations.dart';\n\nclass ExplorePage extends StatefulWidget {\n  const ExplorePage({super.key});\n\n  @override\n  State<ExplorePage> createState() => _ExplorePageState();\n}\n\nclass _ExplorePageState extends State<ExplorePage>\n    with TickerProviderStateMixin, AutomaticKeepAliveClientMixin<ExplorePage> {\n  late TabController controller;\n\n  bool showFB = true;\n\n  double location = 0;\n\n  late List<String> pages;\n\n  void onSettingsChanged() {\n    var explorePages = List<String>.from(appdata.settings[\"explore_pages\"]);\n    var all = ComicSource.all()\n        .map((e) => e.explorePages)\n        .expand((e) => e.map((e) => e.title))\n        .toList();\n    explorePages = explorePages.where((e) => all.contains(e)).toList();\n    if (!pages.isEqualTo(explorePages)) {\n      setState(() {\n        pages = explorePages;\n        controller = TabController(\n          length: pages.length,\n          vsync: this,\n        );\n      });\n    }\n  }\n\n  void onNaviItemTapped(int index) {\n    if (index == 2) {\n      int page = controller.index;\n      String currentPageId = pages[page];\n      GlobalState.find<_SingleExplorePageState>(currentPageId).toTop();\n    }\n  }\n\n  void addPage() {\n    showPopUpWidget(App.rootContext, setExplorePagesWidget());\n  }\n\n  NaviPaneState? naviPane;\n\n  @override\n  void initState() {\n    pages = List<String>.from(appdata.settings[\"explore_pages\"]);\n    var all = ComicSource.all()\n        .map((e) => e.explorePages)\n        .expand((e) => e.map((e) => e.title))\n        .toList();\n    pages = pages.where((e) => all.contains(e)).toList();\n    controller = TabController(\n      length: pages.length,\n      vsync: this,\n    );\n    appdata.settings.addListener(onSettingsChanged);\n    NaviPane.of(context).addNaviItemTapListener(onNaviItemTapped);\n    super.initState();\n  }\n\n  @override\n  void didChangeDependencies() {\n    naviPane = NaviPane.of(context);\n    super.didChangeDependencies();\n  }\n\n  @override\n  void dispose() {\n    controller.dispose();\n    appdata.settings.removeListener(onSettingsChanged);\n    naviPane?.removeNaviItemTapListener(onNaviItemTapped);\n    super.dispose();\n  }\n\n  void refresh() {\n    int page = controller.index;\n    String currentPageId = pages[page];\n    GlobalState.find<_SingleExplorePageState>(currentPageId).refresh();\n  }\n\n  Widget buildFAB() => Material(\n        color: Colors.transparent,\n        child: FloatingActionButton(\n          key: const Key(\"FAB\"),\n          onPressed: refresh,\n          child: const Icon(Icons.refresh),\n        ),\n      );\n\n  Tab buildTab(String i) {\n    var comicSource = ComicSource.all()\n        .firstWhere((e) => e.explorePages.any((e) => e.title == i));\n    return Tab(text: i.ts(comicSource.key), key: Key(i));\n  }\n\n  Widget buildBody(String i) => Material(\n        child: _SingleExplorePage(i, key: PageStorageKey(i)),\n      );\n\n  Widget buildEmpty() {\n    var msg = \"No Explore Pages\".tl;\n    msg += '\\n';\n    VoidCallback onTap;\n    if (ComicSource.isEmpty) {\n      msg += \"Please add some sources\".tl;\n      onTap = () {\n        context.to(() => ComicSourcePage());\n      };\n    } else {\n      msg += \"Please check your settings\".tl;\n      onTap = addPage;\n    }\n    return NetworkError(\n      message: msg,\n      retry: onTap,\n      withAppbar: false,\n      buttonText: \"Manage\".tl,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    if (pages.isEmpty) {\n      return buildEmpty();\n    }\n\n    Widget tabBar = Material(\n      child: AppTabBar(\n        key: PageStorageKey(pages.toString()),\n        tabs: pages.map((e) => buildTab(e)).toList(),\n        controller: controller,\n        actionButton: TabActionButton(\n          icon: const Icon(Icons.add),\n          text: \"Add\".tl,\n          onPressed: addPage,\n        ),\n      ),\n    ).paddingTop(context.padding.top);\n\n    return Stack(\n      children: [\n        Positioned.fill(\n          child: Column(\n            children: [\n              tabBar,\n              Expanded(\n                child: NotificationListener<ScrollNotification>(\n                  onNotification: (notifications) {\n                    if (notifications.metrics.axis == Axis.horizontal) {\n                      if (!showFB) {\n                        setState(() {\n                          showFB = true;\n                        });\n                      }\n                      return true;\n                    }\n\n                    var current = notifications.metrics.pixels;\n                    var overflow = notifications.metrics.outOfRange;\n                    if (current > location && current != 0 && showFB) {\n                      setState(() {\n                        showFB = false;\n                      });\n                    } else if ((current < location - 50 || current == 0) &&\n                        !showFB) {\n                      setState(() {\n                        showFB = true;\n                      });\n                    }\n                    if ((current > location || current < location - 50) &&\n                        !overflow) {\n                      location = current;\n                    }\n                    return false;\n                  },\n                  child: MediaQuery.removePadding(\n                    context: context,\n                    removeTop: true,\n                    child: TabBarView(\n                      controller: controller,\n                      children: pages.map((e) => buildBody(e)).toList(),\n                    ),\n                  ),\n                ),\n              )\n            ],\n          ),\n        ),\n        Positioned(\n          right: 16,\n          bottom: 16,\n          child: AnimatedSwitcher(\n            duration: const Duration(milliseconds: 150),\n            reverseDuration: const Duration(milliseconds: 150),\n            child: showFB ? buildFAB() : const SizedBox(),\n            transitionBuilder: (widget, animation) {\n              var tween = Tween<Offset>(\n                  begin: const Offset(0, 1), end: const Offset(0, 0));\n              return SlideTransition(\n                position: tween.animate(animation),\n                child: widget,\n              );\n            },\n          ),\n        )\n      ],\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n\nclass _SingleExplorePage extends StatefulWidget {\n  const _SingleExplorePage(this.title, {super.key});\n\n  final String title;\n\n  @override\n  State<_SingleExplorePage> createState() => _SingleExplorePageState();\n}\n\nclass _SingleExplorePageState extends AutomaticGlobalState<_SingleExplorePage>\n    with AutomaticKeepAliveClientMixin<_SingleExplorePage> {\n  late final ExplorePageData data;\n\n  late final String comicSourceKey;\n\n  bool _wantKeepAlive = true;\n\n  var scrollController = ScrollController();\n\n  VoidCallback? refreshHandler;\n\n  void onSettingsChanged() {\n    var explorePages = appdata.settings[\"explore_pages\"];\n    if (!explorePages.contains(widget.title)) {\n      _wantKeepAlive = false;\n      updateKeepAlive();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    for (var source in ComicSource.all()) {\n      for (var d in source.explorePages) {\n        if (d.title == widget.title) {\n          data = d;\n          comicSourceKey = source.key;\n          return;\n        }\n      }\n    }\n    appdata.settings.addListener(onSettingsChanged);\n    throw \"Explore Page ${widget.title} Not Found!\";\n  }\n\n  @override\n  void dispose() {\n    appdata.settings.removeListener(onSettingsChanged);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    if (data.loadMultiPart != null) {\n      return _MultiPartExplorePage(\n        key: const PageStorageKey(\"comic_list\"),\n        data: data,\n        controller: scrollController,\n        comicSourceKey: comicSourceKey,\n        refreshHandlerCallback: (c) {\n          refreshHandler = c;\n        },\n      );\n    } else if (data.loadPage != null || data.loadNext != null) {\n      return ComicList(\n        enablePageStorage: true,\n        loadPage: data.loadPage,\n        loadNext: data.loadNext,\n        key: const PageStorageKey(\"comic_list\"),\n        controller: scrollController,\n        refreshHandlerCallback: (c) {\n          refreshHandler = c;\n        },\n      );\n    } else if (data.loadMixed != null) {\n      return _MixedExplorePage(\n        data,\n        comicSourceKey,\n        key: const PageStorageKey(\"comic_list\"),\n        controller: scrollController,\n        refreshHandlerCallback: (c) {\n          refreshHandler = c;\n        },\n      );\n    } else {\n      return const Center(\n        child: Text(\"Empty Page\"),\n      );\n    }\n  }\n\n  @override\n  Object? get key => widget.title;\n\n  @override\n  void refresh() {\n    refreshHandler?.call();\n  }\n\n  @override\n  bool get wantKeepAlive => _wantKeepAlive;\n\n  void toTop() {\n    if (scrollController.hasClients) {\n      scrollController.animateTo(\n        scrollController.position.minScrollExtent,\n        duration: const Duration(milliseconds: 200),\n        curve: Curves.easeInOut,\n      );\n    }\n  }\n}\n\nclass _MixedExplorePage extends StatefulWidget {\n  const _MixedExplorePage(this.data, this.sourceKey,\n      {super.key, this.controller, required this.refreshHandlerCallback});\n\n  final ExplorePageData data;\n\n  final String sourceKey;\n\n  final ScrollController? controller;\n\n  final void Function(VoidCallback c) refreshHandlerCallback;\n\n  @override\n  State<_MixedExplorePage> createState() => _MixedExplorePageState();\n}\n\nclass _MixedExplorePageState\n    extends MultiPageLoadingState<_MixedExplorePage, Object> {\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    widget.refreshHandlerCallback(refresh);\n  }\n\n  void refresh() {\n    reset();\n  }\n\n  Iterable<Widget> buildSlivers(BuildContext context, List<Object> data) sync* {\n    List<Comic> cache = [];\n    for (var part in data) {\n      if (part is ExplorePagePart) {\n        if (cache.isNotEmpty) {\n          yield SliverGridComics(\n            comics: (cache),\n          );\n          yield const SliverToBoxAdapter(child: Divider());\n          cache.clear();\n        }\n        yield* _buildExplorePagePart(part, widget.sourceKey);\n        yield const SliverToBoxAdapter(child: Divider());\n      } else {\n        cache.addAll(part as List<Comic>);\n      }\n    }\n    if (cache.isNotEmpty) {\n      yield SliverGridComics(\n        comics: (cache),\n      );\n    }\n  }\n\n  @override\n  Widget buildContent(BuildContext context, List<Object> data) {\n    return SmoothCustomScrollView(\n      controller: widget.controller,\n      slivers: [\n        ...buildSlivers(context, data),\n        const SliverListLoadingIndicator(),\n      ],\n    );\n  }\n\n  @override\n  Future<Res<List<Object>>> loadData(int page) async {\n    var res = await widget.data.loadMixed!(page);\n    if (res.error) {\n      return res;\n    }\n    for (var element in res.data) {\n      if (element is! ExplorePagePart && element is! List<Comic>) {\n        return const Res.error(\"function loadMixed return invalid data\");\n      }\n    }\n    return res;\n  }\n}\n\nIterable<Widget> _buildExplorePagePart(\n    ExplorePagePart part, String sourceKey) sync* {\n  Widget buildTitle(ExplorePagePart part) {\n    return SliverToBoxAdapter(\n      child: SizedBox(\n        height: 60,\n        child: Padding(\n          padding: const EdgeInsets.fromLTRB(16, 10, 5, 10),\n          child: Row(\n            children: [\n              Text(\n                part.title,\n                style:\n                    const TextStyle(fontSize: 20, fontWeight: FontWeight.w500),\n              ),\n              const Spacer(),\n              if (part.viewMore != null)\n                TextButton(\n                  onPressed: () {\n                    var context = App.mainNavigatorKey!.currentContext!;\n                    part.viewMore!.jump(context);\n                  },\n                  child: Text(\"View more\".tl),\n                )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildComics(ExplorePagePart part) {\n    return SliverGridComics(comics: part.comics);\n  }\n\n  yield buildTitle(part);\n  yield buildComics(part);\n}\n\nclass _MultiPartExplorePage extends StatefulWidget {\n  const _MultiPartExplorePage({\n    super.key,\n    required this.data,\n    required this.controller,\n    required this.comicSourceKey,\n    required this.refreshHandlerCallback,\n  });\n\n  final ExplorePageData data;\n\n  final ScrollController controller;\n\n  final String comicSourceKey;\n\n  final void Function(VoidCallback c) refreshHandlerCallback;\n\n  @override\n  State<_MultiPartExplorePage> createState() => _MultiPartExplorePageState();\n}\n\nclass _MultiPartExplorePageState extends State<_MultiPartExplorePage> {\n  late final ExplorePageData data;\n\n  List<ExplorePagePart>? parts;\n\n  bool loading = true;\n\n  String? message;\n\n  Map<String, dynamic> get state => {\n        \"loading\": loading,\n        \"message\": message,\n        \"parts\": parts,\n      };\n\n  void restoreState(dynamic state) {\n    if (state == null) return;\n    loading = state[\"loading\"];\n    message = state[\"message\"];\n    parts = state[\"parts\"];\n  }\n\n  void storeState() {\n    PageStorage.of(context).writeState(context, state);\n  }\n\n  void refresh() {\n    setState(() {\n      loading = true;\n      message = null;\n      parts = null;\n    });\n    storeState();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    data = widget.data;\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    restoreState(PageStorage.of(context).readState(context));\n    widget.refreshHandlerCallback(refresh);\n  }\n\n  void load() async {\n    var res = await data.loadMultiPart!();\n    loading = false;\n    if (mounted) {\n      setState(() {\n        if (res.error) {\n          message = res.errorMessage;\n        } else {\n          parts = res.data;\n        }\n      });\n      storeState();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (loading) {\n      load();\n      return const Center(\n        child: CircularProgressIndicator(),\n      );\n    } else if (message != null) {\n      return NetworkError(\n        message: message!,\n        retry: () {\n          setState(() {\n            loading = true;\n            message = null;\n          });\n        },\n        withAppbar: false,\n      );\n    } else {\n      return buildPage();\n    }\n  }\n\n  Widget buildPage() {\n    return SmoothCustomScrollView(\n      key: const PageStorageKey('scroll'),\n      controller: widget.controller,\n      slivers: _buildPage().toList(),\n    );\n  }\n\n  Iterable<Widget> _buildPage() sync* {\n    for (var part in parts!) {\n      yield* _buildExplorePagePart(part, widget.comicSourceKey);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/favorites/favorite_actions.dart",
    "content": "part of 'favorites_page.dart';\n\n/// Open a dialog to create a new favorite folder.\nFuture<void> newFolder() async {\n  return showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        var controller = TextEditingController();\n        String? error;\n\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"New Folder\".tl,\n            content: Column(\n              children: [\n                TextField(\n                  controller: controller,\n                  decoration: InputDecoration(\n                    hintText: \"Folder Name\".tl,\n                    errorText: error,\n                  ),\n                  onChanged: (s) {\n                    if (error != null) {\n                      setState(() {\n                        error = null;\n                      });\n                    }\n                  },\n                ),\n              ],\n            ).paddingHorizontal(16),\n            actions: [\n              TextButton(\n                child: Text(\"Import from file\".tl),\n                onPressed: () async {\n                  var file = await selectFile(ext: ['json']);\n                  if (file == null) return;\n                  var data = await file.readAsBytes();\n                  try {\n                    LocalFavoritesManager().fromJson(utf8.decode(data));\n                  } catch (e) {\n                    context.showMessage(message: \"Failed to import\".tl);\n                    return;\n                  }\n                  context.pop();\n                },\n              ).paddingRight(4),\n              FilledButton(\n                onPressed: () {\n                  var e = validateFolderName(controller.text);\n                  if (e != null) {\n                    setState(() {\n                      error = e;\n                    });\n                  } else {\n                    LocalFavoritesManager().createFolder(controller.text);\n                    context.pop();\n                  }\n                },\n                child: Text(\"Create\".tl),\n              ),\n            ],\n          );\n        });\n      });\n}\n\nString? validateFolderName(String newFolderName) {\n  var folders = LocalFavoritesManager().folderNames;\n  if (newFolderName.isEmpty) {\n    return \"Folder name cannot be empty\".tl;\n  } else if (newFolderName.length > 50) {\n    return \"Folder name is too long\".tl;\n  } else if (folders.contains(newFolderName)) {\n    return \"Folder already exists\".tl;\n  }\n  return null;\n}\n\nvoid addFavorite(List<Comic> comics) {\n  var folders = LocalFavoritesManager().folderNames;\n\n  showDialog(\n    context: App.rootContext,\n    builder: (context) {\n      String? selectedFolder = appdata.settings['quickFavorite'];\n\n      return StatefulBuilder(builder: (context, setState) {\n        return ContentDialog(\n          title: \"Select a folder\".tl,\n          content: ListTile(\n            title: Text(\"Folder\".tl),\n            trailing: Select(\n              current: selectedFolder,\n              values: folders,\n              minWidth: 112,\n              onTap: (v) {\n                setState(() {\n                  selectedFolder = folders[v];\n                });\n              },\n            ),\n          ),\n          actions: [\n            FilledButton(\n              onPressed: () {\n                if (selectedFolder != null) {\n                  for (var comic in comics) {\n                    LocalFavoritesManager().addComic(\n                      selectedFolder!,\n                      FavoriteItem(\n                        id: comic.id,\n                        name: comic.title,\n                        coverPath: comic.cover,\n                        author: comic.subtitle ?? '',\n                        type: ComicType((comic.sourceKey == 'local'\n                            ? 0\n                            : comic.sourceKey.hashCode)),\n                        tags: comic.tags ?? [],\n                      ),\n                    );\n                  }\n                  context.pop();\n                }\n              },\n              child: Text(\"Confirm\".tl),\n            ),\n          ],\n        );\n      });\n    },\n  );\n}\n\nFuture<List<FavoriteItem>> updateComicsInfo(String folder) async {\n  var comics = LocalFavoritesManager().getFolderComics(folder);\n\n  Future<void> updateSingleComic(int index) async {\n    int retry = 3;\n\n    while (true) {\n      try {\n        var c = comics[index];\n        var comicSource = c.type.comicSource;\n        if (comicSource == null) return;\n\n        var newInfo = (await comicSource.loadComicInfo!(c.id)).data;\n\n        var newTags = <String>[];\n        for (var entry in newInfo.tags.entries) {\n          const shouldIgnore = ['author', 'artist', 'time'];\n          var namespace = entry.key;\n          if (shouldIgnore.contains(namespace.toLowerCase())) {\n            continue;\n          }\n          for (var tag in entry.value) {\n            newTags.add(\"$namespace:$tag\");\n          }\n        }\n\n        comics[index] = FavoriteItem(\n          id: c.id,\n          name: newInfo.title,\n          coverPath: newInfo.cover,\n          author: newInfo.subTitle ??\n              newInfo.tags['author']?.firstOrNull ??\n              c.author,\n          type: c.type,\n          tags: newTags,\n        );\n\n        LocalFavoritesManager().updateInfo(folder, comics[index]);\n        return;\n      } catch (e) {\n        retry--;\n        if (retry == 0) {\n          rethrow;\n        }\n        continue;\n      }\n    }\n  }\n\n  var finished = ValueNotifier(0);\n\n  var errors = 0;\n\n  var index = 0;\n\n  bool isCanceled = false;\n\n  showDialog(\n    context: App.rootContext,\n    builder: (context) {\n      return ValueListenableBuilder(\n        valueListenable: finished,\n        builder: (context, value, child) {\n          var isFinished = value == comics.length;\n          return ContentDialog(\n            title: isFinished ? \"Finished\".tl : \"Updating\".tl,\n            content: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                const SizedBox(height: 4),\n                LinearProgressIndicator(\n                  value: value / comics.length,\n                ),\n                const SizedBox(height: 4),\n                Text(\"$value/${comics.length}\"),\n                const SizedBox(height: 4),\n                if (errors > 0) Text(\"Errors: $errors\"),\n              ],\n            ).paddingHorizontal(16),\n            actions: [\n              Button.filled(\n                color: isFinished ? null : context.colorScheme.error,\n                onPressed: () {\n                  isCanceled = true;\n                  context.pop();\n                },\n                child: isFinished ? Text(\"OK\".tl) : Text(\"Cancel\".tl),\n              ),\n            ],\n          );\n        },\n      );\n    },\n  ).then((_) {\n    isCanceled = true;\n  });\n\n  while (index < comics.length) {\n    var futures = <Future>[];\n    const maxConcurrency = 4;\n\n    if (isCanceled) {\n      return comics;\n    }\n\n    for (var i = 0; i < maxConcurrency; i++) {\n      if (index + i >= comics.length) break;\n      futures.add(updateSingleComic(index + i).then((v) {\n        finished.value++;\n      }, onError: (_) {\n        errors++;\n        finished.value++;\n      }));\n    }\n\n    await Future.wait(futures);\n    index += maxConcurrency;\n  }\n\n  return comics;\n}\n\nFuture<void> sortFolders() async {\n  var folders = LocalFavoritesManager().folderNames;\n\n  await showPopUpWidget(\n    App.rootContext,\n    StatefulBuilder(builder: (context, setState) {\n      return PopUpWidgetScaffold(\n        title: \"Sort\".tl,\n        tailing: [\n          Tooltip(\n            message: \"Help\".tl,\n            child: IconButton(\n              icon: const Icon(Icons.help_outline),\n              onPressed: () {\n                showInfoDialog(\n                  context: context,\n                  title: \"Reorder\".tl,\n                  content: \"Long press and drag to reorder.\".tl,\n                );\n              },\n            ),\n          )\n        ],\n        body: ReorderableListView.builder(\n          onReorder: (oldIndex, newIndex) {\n            if (oldIndex < newIndex) {\n              newIndex--;\n            }\n            setState(() {\n              var item = folders.removeAt(oldIndex);\n              folders.insert(newIndex, item);\n            });\n          },\n          itemCount: folders.length,\n          itemBuilder: (context, index) {\n            return ListTile(\n              key: ValueKey(folders[index]),\n              title: Text(folders[index]),\n            );\n          },\n        ),\n      );\n    }),\n  );\n\n  LocalFavoritesManager().updateOrder(folders);\n}\n\nFuture<void> importNetworkFolder(\n  String source,\n  int updatePageNum,\n  String? folder,\n  String? folderID,\n) async {\n  var comicSource = ComicSource.find(source);\n  if (comicSource == null) {\n    return;\n  }\n  if (folder != null && folder.isEmpty) {\n    folder = null;\n  }\n  var resultName = folder ?? comicSource.name;\n  var exists = LocalFavoritesManager().existsFolder(resultName);\n  if (exists) {\n    if (!LocalFavoritesManager()\n        .isLinkedToNetworkFolder(resultName, source, folderID ?? \"\")) {\n      App.rootContext.showMessage(message: \"Folder already exists\".tl);\n      return;\n    }\n  }\n  if (!exists) {\n    LocalFavoritesManager().createFolder(resultName);\n    LocalFavoritesManager().linkFolderToNetwork(\n      resultName,\n      source,\n      folderID ?? \"\",\n    );\n  }\n  bool isOldToNewSort = comicSource.favoriteData?.isOldToNewSort ?? false;\n  var current = 0;\n  int receivedComics = 0;\n  int requestCount = 0;\n  var isFinished = false;\n  int maxPage = 1;\n  List<FavoriteItem> comics = [];\n  String? next;\n  // 如果是从旧到新, 先取一下maxPage\n  if (isOldToNewSort) {\n    var res = await comicSource.favoriteData?.loadComic!(1, folderID);\n    maxPage = res?.subData ?? 1;\n  }\n  Future<void> fetchNext() async {\n    var retry = 3;\n    while (updatePageNum > requestCount && !isFinished) {\n      try {\n        if (comicSource.favoriteData?.loadComic != null) {\n          // 从旧到新的情况下, 假设有10页, 更新3页, 则从第8页开始, 8, 9, 10 三页\n          next ??=\n              isOldToNewSort ? (maxPage - updatePageNum + 1).toString() : '1';\n          var page = int.parse(next!);\n          var res = await comicSource.favoriteData!.loadComic!(page, folderID);\n          var count = 0;\n          receivedComics += res.data.length;\n          for (var c in res.data) {\n            if (!LocalFavoritesManager()\n                .comicExists(resultName, c.id, ComicType(source.hashCode))) {\n              count++;\n              comics.add(FavoriteItem(\n                id: c.id,\n                name: c.title,\n                coverPath: c.cover,\n                type: ComicType(source.hashCode),\n                author: c.subtitle ?? '',\n                tags: c.tags ?? [],\n              ));\n            }\n          }\n          requestCount++;\n          current += count;\n          if (res.data.isEmpty || res.subData == page) {\n            isFinished = true;\n            next = null;\n          } else {\n            next = (page + 1).toString();\n          }\n        } else if (comicSource.favoriteData?.loadNext != null) {\n          var res = await comicSource.favoriteData!.loadNext!(next, folderID);\n          var count = 0;\n          receivedComics += res.data.length;\n          for (var c in res.data) {\n            if (!LocalFavoritesManager()\n                .comicExists(resultName, c.id, ComicType(source.hashCode))) {\n              count++;\n              comics.add(FavoriteItem(\n                id: c.id,\n                name: c.title,\n                coverPath: c.cover,\n                type: ComicType(source.hashCode),\n                author: c.subtitle ?? '',\n                tags: c.tags ?? [],\n              ));\n            }\n          }\n          requestCount++;\n          current += count;\n          if (res.data.isEmpty || res.subData == null) {\n            isFinished = true;\n            next = null;\n          } else {\n            next = res.subData;\n          }\n        } else {\n          throw \"Unsupported source\";\n        }\n        return;\n      } catch (e) {\n        retry--;\n        if (retry == 0) {\n          rethrow;\n        }\n        continue;\n      }\n    }\n    // 跳出循环, 表示已经完成, 强制为 true, 避免死循环\n    isFinished = true;\n  }\n\n  bool isCanceled = false;\n  String? errorMsg;\n  bool isErrored() => errorMsg != null;\n\n  void Function()? updateDialog;\n  void Function()? closeDialog;\n\n  showDialog(\n    context: App.rootContext,\n    builder: (context) {\n      return StatefulBuilder(\n        builder: (context, setState) {\n          updateDialog = () => setState(() {});\n          closeDialog = () => Navigator.pop(context);\n          return ContentDialog(\n            title: isFinished\n                ? \"Finished\".tl\n                : isErrored()\n                    ? \"Error\".tl\n                    : \"Importing\".tl,\n            content: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                const SizedBox(height: 4),\n                LinearProgressIndicator(\n                  value: isFinished ? 1 : null,\n                ),\n                const SizedBox(height: 4),\n                Text(\"Imported @a comics, loaded @b pages, received @c comics\"\n                    .tlParams({\n                  \"a\": current,\n                  \"b\": requestCount,\n                  \"c\": receivedComics,\n                })),\n                const SizedBox(height: 4),\n                if (isErrored()) Text(\"Error: $errorMsg\"),\n              ],\n            ).paddingHorizontal(16),\n            actions: [\n              Button.filled(\n                color: (isFinished || isErrored())\n                    ? null\n                    : context.colorScheme.error,\n                onPressed: () {\n                  isCanceled = true;\n                  context.pop();\n                },\n                child: (isFinished || isErrored())\n                    ? Text(\"OK\".tl)\n                    : Text(\"Cancel\".tl),\n              ),\n            ],\n          );\n        },\n      );\n    },\n  ).then((_) {\n    isCanceled = true;\n  });\n\n  while (!isFinished && !isCanceled) {\n    try {\n      await fetchNext();\n      updateDialog?.call();\n    } catch (e) {\n      errorMsg = e.toString();\n      updateDialog?.call();\n      break;\n    }\n  }\n  try {\n    if (appdata.settings['newFavoriteAddTo'] == \"start\" && !isOldToNewSort) {\n      // 如果是插到最前, 并且是从新到旧, 反转一下\n      comics = comics.reversed.toList();\n    }\n    for (var c in comics) {\n      LocalFavoritesManager().addComic(resultName, c);\n    }\n    // 延迟一点, 让用户看清楚到底新增了多少\n    await Future.delayed(const Duration(milliseconds: 500));\n    closeDialog?.call();\n  } catch (e, stackTrace) {\n    Log.error(\"Unhandled Exception\", e.toString(), stackTrace);\n  }\n}\n"
  },
  {
    "path": "lib/pages/favorites/favorites_page.dart",
    "content": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_reorderable_grid_view/widgets/reorderable_builder.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/network/download.dart';\nimport 'package:venera/network/cache.dart';\nimport 'package:venera/pages/comic_details_page/comic_page.dart';\nimport 'package:venera/pages/reader/reader.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/opencc.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\n\npart 'favorite_actions.dart';\npart 'side_bar.dart';\npart 'local_favorites_page.dart';\npart 'network_favorites_page.dart';\n\nconst _kLeftBarWidth = 256.0;\n\nconst _kTwoPanelChangeWidth = 720.0;\n\nclass FavoritesPage extends StatefulWidget {\n  const FavoritesPage({super.key});\n\n  @override\n  State<FavoritesPage> createState() => _FavoritesPageState();\n}\n\nclass _FavoritesPageState extends State<FavoritesPage> {\n  String? folder;\n\n  bool isNetwork = false;\n\n  FolderList? folderList;\n\n  void setFolder(bool isNetwork, String? folder) {\n    setState(() {\n      this.isNetwork = isNetwork;\n      this.folder = folder;\n    });\n    folderList?.update();\n    appdata.implicitData['favoriteFolder'] = {\n      'name': folder,\n      'isNetwork': isNetwork,\n    };\n    appdata.writeImplicitData();\n  }\n\n  @override\n  void initState() {\n    var data = appdata.implicitData['favoriteFolder'];\n    if (data != null) {\n      folder = data['name'];\n      isNetwork = data['isNetwork'] ?? false;\n    }\n    if (folder != null\n        && !isNetwork\n        && !LocalFavoritesManager().existsFolder(folder!)) {\n      folder = null;\n    }\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return IconTheme(\n      data: IconThemeData(color: Theme.of(context).colorScheme.secondary),\n      child: Stack(\n        children: [\n          AnimatedPositioned(\n            left: context.width <= _kTwoPanelChangeWidth ? -_kLeftBarWidth : 0,\n            top: 0,\n            bottom: 0,\n            duration: const Duration(milliseconds: 200),\n            child: (const _LeftBar()).fixWidth(_kLeftBarWidth),\n          ),\n          Positioned(\n            top: 0,\n            left: context.width <= _kTwoPanelChangeWidth ? 0 : _kLeftBarWidth,\n            right: 0,\n            bottom: 0,\n            child: buildBody(),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void showFolderSelector() {\n    Navigator.of(App.rootContext).push(PageRouteBuilder(\n      barrierDismissible: true,\n      fullscreenDialog: true,\n      opaque: false,\n      barrierColor: Colors.black.toOpacity(0.36),\n      pageBuilder: (context, animation, secondary) {\n        return Align(\n          alignment: Alignment.centerLeft,\n          child: Material(\n            child: SizedBox(\n              width: min(300, context.width - 16),\n              child: _LeftBar(\n                withAppbar: true,\n                favPage: this,\n                onSelected: () {\n                  context.pop();\n                },\n              ),\n            ),\n          ),\n        );\n      },\n      transitionsBuilder: (context, animation, secondary, child) {\n        var offset =\n            Tween<Offset>(begin: const Offset(-1, 0), end: const Offset(0, 0));\n        return SlideTransition(\n          position: offset.animate(CurvedAnimation(\n            parent: animation,\n            curve: Curves.fastOutSlowIn,\n          )),\n          child: child,\n        );\n      },\n    ));\n  }\n\n  Widget buildBody() {\n    if (folder == null) {\n      return CustomScrollView(\n        slivers: [\n          SliverAppbar(\n            leading: Tooltip(\n              message: \"Folders\".tl,\n              child: context.width <= _kTwoPanelChangeWidth\n                  ? IconButton(\n                      icon: const Icon(Icons.menu),\n                      color: context.colorScheme.primary,\n                      onPressed: showFolderSelector,\n                    )\n                  : null,\n            ),\n            title: GestureDetector(\n              onTap: context.width < _kTwoPanelChangeWidth\n                  ? showFolderSelector\n                  : null,\n              child: Text(\"Unselected\".tl),\n            ),\n          ),\n        ],\n      );\n    }\n    if (!isNetwork) {\n      return _LocalFavoritesPage(\n          folder: folder!, key: PageStorageKey(\"local_$folder\"));\n    } else {\n      var favoriteData = getFavoriteDataOrNull(folder!);\n      if (favoriteData == null) {\n        folder = null;\n        return buildBody();\n      } else {\n        return NetworkFavoritePage(favoriteData,\n            key: PageStorageKey(\"network_$folder\"));\n      }\n    }\n  }\n}\n\nabstract interface class FolderList {\n  void update();\n\n  void updateFolders();\n}\n"
  },
  {
    "path": "lib/pages/favorites/local_favorites_page.dart",
    "content": "part of 'favorites_page.dart';\n\nconst _localAllFolderLabel = '^_^[%local_all%]^_^';\n\n/// If the number of comics in a folder exceeds this limit, it will be\n/// fetched asynchronously.\nconst _asyncDataFetchLimit = 500;\n\nclass _LocalFavoritesPage extends StatefulWidget {\n  const _LocalFavoritesPage({required this.folder, super.key});\n\n  final String folder;\n\n  @override\n  State<_LocalFavoritesPage> createState() => _LocalFavoritesPageState();\n}\n\nclass _LocalFavoritesPageState extends State<_LocalFavoritesPage> {\n  late _FavoritesPageState favPage;\n\n  late List<FavoriteItem> comics;\n\n  String? networkSource;\n  String? networkFolder;\n\n  Map<Comic, bool> selectedComics = {};\n\n  var selectedLocalFolders = <String>{};\n\n  late List<String> added = [];\n\n  String keyword = \"\";\n  bool searchHasUpper = false;\n\n  bool searchMode = false;\n\n  bool multiSelectMode = false;\n\n  int? lastSelectedIndex;\n\n  bool get isAllFolder => widget.folder == _localAllFolderLabel;\n\n  LocalFavoritesManager get manager => LocalFavoritesManager();\n\n  bool isLoading = false;\n\n  late String readFilterSelect;\n\n  var searchResults = <FavoriteItem>[];\n\n  void updateSearchResult() {\n    setState(() {\n      if (keyword.trim().isEmpty) {\n        searchResults = comics;\n      } else {\n        searchResults = [];\n        for (var comic in comics) {\n          if (matchKeyword(keyword, comic) ||\n              matchKeywordT(keyword, comic) ||\n              matchKeywordS(keyword, comic)) {\n            searchResults.add(comic);\n          }\n        }\n      }\n    });\n  }\n\n  void updateComics() {\n    if (isLoading) return;\n    if (isAllFolder) {\n      var totalComics = manager.totalComics;\n      if (totalComics < _asyncDataFetchLimit) {\n        comics = manager.getAllComics();\n      } else {\n        isLoading = true;\n        manager\n            .getAllComicsAsync()\n            .minTime(const Duration(milliseconds: 200))\n            .then((value) {\n          if (mounted) {\n            setState(() {\n              isLoading = false;\n              comics = value;\n            });\n          }\n        });\n      }\n    } else {\n      var folderComics = manager.folderComics(widget.folder);\n      if (folderComics < _asyncDataFetchLimit) {\n        comics = manager.getFolderComics(widget.folder);\n      } else {\n        isLoading = true;\n        manager\n            .getFolderComicsAsync(widget.folder)\n            .minTime(const Duration(milliseconds: 200))\n            .then((value) {\n          if (mounted) {\n            setState(() {\n              isLoading = false;\n              comics = value;\n            });\n          }\n        });\n      }\n    }\n    setState(() {});\n  }\n\n  List<FavoriteItem> filterComics(List<FavoriteItem> curComics) {\n    return curComics.where((comic) {\n      var history =\n          HistoryManager().find(comic.id, ComicType(comic.sourceKey.hashCode));\n      if (readFilterSelect == \"UnCompleted\") {\n        return history == null || history.page != history.maxPage;\n      } else if (readFilterSelect == \"Completed\") {\n        return history != null && history.page == history.maxPage;\n      }\n      return true;\n    }).toList();\n  }\n\n  bool matchKeyword(String keyword, FavoriteItem comic) {\n    var list = keyword.split(\" \");\n    for (var k in list) {\n      if (k.isEmpty) continue;\n      if (checkKeyWordMatch(k, comic.title, false)) {\n        continue;\n      } else if (comic.subtitle != null && checkKeyWordMatch(k, comic.subtitle!, false)) {\n        continue;\n      } else if (comic.tags.any((tag) {\n        if (checkKeyWordMatch(k, tag, true)) {\n          return true;\n        } else if (tag.contains(':') && checkKeyWordMatch(k, tag.split(':')[1], true)) {\n          return true;\n        } else if (App.locale.languageCode != 'en' &&\n            checkKeyWordMatch(k, tag.translateTagsToCN, true)) {\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      } else if (checkKeyWordMatch(k, comic.author, true)) {\n        continue;\n      }\n      return false;\n    }\n    return true;\n  }\n\n  bool checkKeyWordMatch(String keyword, String compare, bool needEqual) {\n    String temp = compare;\n    // 没有大写的话, 就转成小写比较, 避免搜索需要注意大小写\n    if (!searchHasUpper) {\n      temp = temp.toLowerCase();\n    }\n    if (needEqual) {\n      return  keyword == temp;\n    }\n    return temp.contains(keyword);\n  }\n  // Convert keyword to traditional Chinese to match comics\n  bool matchKeywordT(String keyword, FavoriteItem comic) {\n    if (!OpenCC.hasChineseSimplified(keyword)) {\n      return false;\n    }\n    keyword = OpenCC.simplifiedToTraditional(keyword);\n    return matchKeyword(keyword, comic);\n  }\n\n  // Convert keyword to simplified Chinese to match comics\n  bool matchKeywordS(String keyword, FavoriteItem comic) {\n    if (!OpenCC.hasChineseTraditional(keyword)) {\n      return false;\n    }\n    keyword = OpenCC.traditionalToSimplified(keyword);\n    return matchKeyword(keyword, comic);\n  }\n  @override\n  void initState() {\n    readFilterSelect = appdata.implicitData[\"local_favorites_read_filter\"] ??\n        readFilterList[0];\n    favPage = context.findAncestorStateOfType<_FavoritesPageState>()!;\n    if (!isAllFolder) {\n      var (a, b) = LocalFavoritesManager().findLinked(widget.folder);\n      networkSource = a;\n      networkFolder = b;\n    } else {\n      networkSource = null;\n      networkFolder = null;\n    }\n    comics = [];\n    updateComics();\n    LocalFavoritesManager().addListener(updateComics);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    LocalFavoritesManager().removeListener(updateComics);\n  }\n\n  void selectAll() {\n    setState(() {\n      if (searchMode) {\n        selectedComics = searchResults.asMap().map((k, v) => MapEntry(v, true));\n      } else {\n        selectedComics = comics.asMap().map((k, v) => MapEntry(v, true));\n      }\n    });\n  }\n\n  void invertSelection() {\n    setState(() {\n      if (searchMode) {\n        for (var c in searchResults) {\n          if (selectedComics.containsKey(c)) {\n            selectedComics.remove(c);\n          } else {\n            selectedComics[c] = true;\n          }\n        }\n      } else {\n        for (var c in comics) {\n          if (selectedComics.containsKey(c)) {\n            selectedComics.remove(c);\n          } else {\n            selectedComics[c] = true;\n          }\n        }\n      }\n    });\n  }\n\n  bool downloadComic(FavoriteItem c) {\n    var source = c.type.comicSource;\n    if (source != null) {\n      bool isDownloaded = LocalManager().isDownloaded(\n        c.id,\n        (c).type,\n      );\n      if (isDownloaded) {\n        return false;\n      }\n      LocalManager().addTask(ImagesDownloadTask(\n        source: source,\n        comicId: c.id,\n        comicTitle: c.title,\n      ));\n      return true;\n    }\n    return false;\n  }\n\n  void downloadSelected() {\n    int count = 0;\n    for (var c in selectedComics.keys) {\n      if (downloadComic(c as FavoriteItem)) {\n        count++;\n      }\n    }\n    if (count > 0) {\n      context.showMessage(\n        message: \"Added @c comics to download queue.\".tlParams({\"c\": count}),\n      );\n    }\n  }\n\n  var scrollController = ScrollController();\n\n  @override\n  Widget build(BuildContext context) {\n    var title = favPage.folder ?? \"Unselected\".tl;\n    if (title == _localAllFolderLabel) {\n      title = \"All\".tl;\n    }\n\n    Widget body = SmoothCustomScrollView(\n      controller: scrollController,\n      slivers: [\n        if (!searchMode && !multiSelectMode)\n          SliverAppbar(\n            style: context.width < changePoint\n                ? AppbarStyle.shadow\n                : AppbarStyle.blur,\n            leading: Tooltip(\n              message: \"Folders\".tl,\n              child: context.width <= _kTwoPanelChangeWidth\n                  ? IconButton(\n                      icon: const Icon(Icons.menu),\n                      color: context.colorScheme.primary,\n                      onPressed: favPage.showFolderSelector,\n                    )\n                  : const SizedBox(),\n            ),\n            title: GestureDetector(\n              onTap: context.width < _kTwoPanelChangeWidth\n                  ? favPage.showFolderSelector\n                  : null,\n              child: Text(title),\n            ),\n            actions: [\n              if (networkSource != null && !isAllFolder)\n                Tooltip(\n                  message: \"Sync\".tl,\n                  child: Flyout(\n                    flyoutBuilder: (context) {\n                      final GlobalKey<_SelectUpdatePageNumState>\n                          selectUpdatePageNumKey =\n                          GlobalKey<_SelectUpdatePageNumState>();\n                      var updatePageWidget = _SelectUpdatePageNum(\n                        networkSource: networkSource!,\n                        networkFolder: networkFolder,\n                        key: selectUpdatePageNumKey,\n                      );\n                      return FlyoutContent(\n                        title: \"Sync\".tl,\n                        content: updatePageWidget,\n                        actions: [\n                          Button.filled(\n                            child: Text(\"Update\".tl),\n                            onPressed: () {\n                              context.pop();\n                              importNetworkFolder(\n                                networkSource!,\n                                selectUpdatePageNumKey\n                                    .currentState!.updatePageNum,\n                                widget.folder,\n                                networkFolder!,\n                              ).then(\n                                (value) {\n                                  updateComics();\n                                },\n                              );\n                            },\n                          ),\n                        ],\n                      );\n                    },\n                    child: Builder(builder: (context) {\n                      return IconButton(\n                        icon: const Icon(Icons.sync),\n                        onPressed: () {\n                          Flyout.of(context).show();\n                        },\n                      );\n                    }),\n                  ),\n                ),\n              Tooltip(\n                message: \"Filter\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.sort_rounded),\n                  color: readFilterSelect != readFilterList[0]\n                      ? context.colorScheme.primaryContainer\n                      : null,\n                  onPressed: () {\n                    showDialog(\n                      context: context,\n                      builder: (context) {\n                        return _LocalFavoritesFilterDialog(\n                          initReadFilterSelect: readFilterSelect,\n                          updateConfig: (readFilter) {\n                            setState(() {\n                              readFilterSelect = readFilter;\n                            });\n                            updateComics();\n                          },\n                        );\n                      },\n                    );\n                  },\n                ),\n              ),\n              Tooltip(\n                message: \"Search\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.search),\n                  onPressed: () {\n                    setState(() {\n                      keyword = \"\";\n                      searchMode = true;\n                      updateSearchResult();\n                    });\n                  },\n                ),\n              ),\n              if (!isAllFolder)\n                MenuButton(\n                  entries: [\n                    MenuEntry(\n                      icon: Icons.edit_outlined,\n                      text: \"Rename\".tl,\n                      onClick: () {\n                        showInputDialog(\n                          context: App.rootContext,\n                          title: \"Rename\".tl,\n                          hintText: \"New Name\".tl,\n                          onConfirm: (value) {\n                            var err = validateFolderName(value.toString());\n                            if (err != null) {\n                              return err;\n                            }\n                            LocalFavoritesManager().rename(\n                              widget.folder,\n                              value.toString(),\n                            );\n                            favPage.folderList?.updateFolders();\n                            favPage.setFolder(false, value.toString());\n                            return null;\n                          },\n                        );\n                      },\n                    ),\n                    MenuEntry(\n                      icon: Icons.reorder,\n                      text: \"Reorder\".tl,\n                      onClick: () {\n                        context.to(\n                          () {\n                            return _ReorderComicsPage(\n                              widget.folder,\n                              (comics) {\n                                this.comics = comics;\n                              },\n                            );\n                          },\n                        ).then(\n                          (value) {\n                            if (mounted) {\n                              setState(() {});\n                            }\n                          },\n                        );\n                      },\n                    ),\n                    MenuEntry(\n                      icon: Icons.upload_file,\n                      text: \"Export\".tl,\n                      onClick: () {\n                        var json = LocalFavoritesManager().folderToJson(\n                          widget.folder,\n                        );\n                        saveFile(\n                          data: utf8.encode(json),\n                          filename: \"${widget.folder}.json\",\n                        );\n                      },\n                    ),\n                    MenuEntry(\n                      icon: Icons.update,\n                      text: \"Update Comics Info\".tl,\n                      onClick: () {\n                        updateComicsInfo(widget.folder).then((newComics) {\n                          if (mounted) {\n                            setState(() {\n                              comics = newComics;\n                            });\n                          }\n                        });\n                      },\n                    ),\n                    MenuEntry(\n                      icon: Icons.delete_outline,\n                      text: \"Delete Folder\".tl,\n                      color: context.colorScheme.error,\n                      onClick: () {\n                        showConfirmDialog(\n                          context: App.rootContext,\n                          title: \"Delete\".tl,\n                          content: \"Delete folder '@f' ?\".tlParams({\n                            \"f\": widget.folder,\n                          }),\n                          btnColor: context.colorScheme.error,\n                          onConfirm: () {\n                            favPage.setFolder(false, null);\n                            LocalFavoritesManager().deleteFolder(widget.folder);\n                            favPage.folderList?.updateFolders();\n                          },\n                        );\n                      },\n                    ),\n                  ],\n                ),\n            ],\n          )\n        else if (multiSelectMode)\n          SliverAppbar(\n            style: context.width < changePoint\n                ? AppbarStyle.shadow\n                : AppbarStyle.blur,\n            leading: Tooltip(\n              message: \"Cancel\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.close),\n                onPressed: () {\n                  setState(() {\n                    multiSelectMode = false;\n                    selectedComics.clear();\n                  });\n                },\n              ),\n            ),\n            title: Text(\n                \"Selected @c comics\".tlParams({\"c\": selectedComics.length})),\n            actions: [\n              MenuButton(entries: [\n                if (!isAllFolder)\n                  MenuEntry(\n                      icon: Icons.drive_file_move,\n                      text: \"Move to folder\".tl,\n                      onClick: () => favoriteOption('move')),\n                if (!isAllFolder)\n                  MenuEntry(\n                      icon: Icons.copy,\n                      text: \"Copy to folder\".tl,\n                      onClick: () => favoriteOption('add')),\n                MenuEntry(\n                    icon: Icons.select_all,\n                    text: \"Select All\".tl,\n                    onClick: selectAll),\n                MenuEntry(\n                    icon: Icons.deselect,\n                    text: \"Deselect\".tl,\n                    onClick: _cancel),\n                MenuEntry(\n                    icon: Icons.flip,\n                    text: \"Invert Selection\".tl,\n                    onClick: invertSelection),\n                if (!isAllFolder)\n                  MenuEntry(\n                      icon: Icons.delete_outline,\n                      text: \"Delete Comic\".tl,\n                      color: context.colorScheme.error,\n                      onClick: () {\n                        showConfirmDialog(\n                          context: context,\n                          title: \"Delete\".tl,\n                          content: \"Delete @c comics?\"\n                              .tlParams({\"c\": selectedComics.length}),\n                          btnColor: context.colorScheme.error,\n                          onConfirm: () {\n                            _deleteComicWithId();\n                          },\n                        );\n                      }),\n                MenuEntry(\n                  icon: Icons.download,\n                  text: \"Download\".tl,\n                  onClick: downloadSelected,\n                ),\n                if (selectedComics.length == 1)\n                  MenuEntry(\n                    icon: Icons.copy,\n                    text: \"Copy Title\".tl,\n                    onClick: () {\n                      Clipboard.setData(\n                        ClipboardData(\n                          text: selectedComics.keys.first.title,\n                        ),\n                      );\n                      context.showMessage(\n                        message: \"Copied\".tl,\n                      );\n                    },\n                  ),\n                if (selectedComics.length == 1)\n                  MenuEntry(\n                    icon: Icons.chrome_reader_mode_outlined,\n                    text: \"Read\".tl,\n                    onClick: () {\n                      final c = selectedComics.keys.first as FavoriteItem;\n                      App.rootContext.to(() => ReaderWithLoading(\n                            id: c.id,\n                            sourceKey: c.sourceKey,\n                          )\n                      );\n                    },\n                  ),\n                if (selectedComics.length == 1)\n                  MenuEntry(\n                    icon: Icons.arrow_forward_ios,\n                    text: \"Jump to Detail\".tl,\n                    onClick: () {\n                      final c = selectedComics.keys.first as FavoriteItem;\n                      App.mainNavigatorKey?.currentContext?.to(() => ComicPage(\n                            id: c.id,\n                            sourceKey: c.sourceKey,\n                          )\n                      );\n                    },\n                  ),\n              ]),\n            ],\n          )\n        else if (searchMode)\n          SliverAppbar(\n            style: context.width < changePoint\n                ? AppbarStyle.shadow\n                : AppbarStyle.blur,\n            leading: Tooltip(\n              message: \"Cancel\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.close),\n                onPressed: () {\n                  setState(() {\n                    setState(() {\n                      searchMode = false;\n                    });\n                  });\n                },\n              ),\n            ),\n            title: TextField(\n              autofocus: true,\n              decoration: InputDecoration(\n                hintText: \"Search\".tl,\n                border: UnderlineInputBorder(),\n              ),\n              onChanged: (v) {\n                keyword = v;\n                searchHasUpper = keyword.contains(RegExp(r'[A-Z]'));\n                updateSearchResult();\n              },\n            ).paddingBottom(8).paddingRight(8),\n          ),\n        if (isLoading)\n          SliverToBoxAdapter(\n            child: SizedBox(\n              height: 200,\n              child: const Center(\n                child: CircularProgressIndicator(),\n              ),\n            ),\n          )\n        else\n          SliverGridComics(\n            comics: searchMode ? searchResults : filterComics(comics),\n            selections: selectedComics,\n            menuBuilder: (c) {\n              return [\n                if (!isAllFolder)\n                  MenuEntry(\n                    icon: Icons.delete,\n                    text: \"Delete\".tl,\n                    onClick: () {\n                      LocalFavoritesManager().deleteComicWithId(\n                        widget.folder,\n                        c.id,\n                        (c as FavoriteItem).type,\n                      );\n                    },\n                  ),\n                MenuEntry(\n                  icon: Icons.check,\n                  text: \"Select\".tl,\n                  onClick: () {\n                    setState(() {\n                      if (!multiSelectMode) {\n                        multiSelectMode = true;\n                      }\n                      if (selectedComics.containsKey(c as FavoriteItem)) {\n                        selectedComics.remove(c);\n                        _checkExitSelectMode();\n                      } else {\n                        selectedComics[c] = true;\n                      }\n                      lastSelectedIndex = comics.indexOf(c);\n                    });\n                  },\n                ),\n                MenuEntry(\n                  icon: Icons.download,\n                  text: \"Download\".tl,\n                  onClick: () {\n                    downloadComic(c as FavoriteItem);\n                    context.showMessage(\n                      message: \"Download started\".tl,\n                    );\n                  },\n                ),\n                if (appdata.settings[\"onClickFavorite\"] == \"viewDetail\")\n                  MenuEntry(\n                    icon: Icons.menu_book_outlined,\n                    text: \"Read\".tl,\n                    onClick: () {\n                      App.mainNavigatorKey?.currentContext?.to(\n                        () => ReaderWithLoading(\n                          id: c.id,\n                          sourceKey: c.sourceKey,\n                        )\n                      );\n                    },\n                  ),\n              ];\n            },\n            onTap: (c, heroID) {\n              if (multiSelectMode) {\n                setState(() {\n                  if (selectedComics.containsKey(c as FavoriteItem)) {\n                    selectedComics.remove(c);\n                    _checkExitSelectMode();\n                  } else {\n                    selectedComics[c] = true;\n                  }\n                  lastSelectedIndex = comics.indexOf(c);\n                });\n              } else if (appdata.settings[\"onClickFavorite\"] == \"viewDetail\") {\n                App.mainNavigatorKey?.currentContext?.to(\n                  () => ComicPage(\n                    id: c.id,\n                    sourceKey: c.sourceKey,\n                    cover: c.cover,\n                    title: c.title,\n                    heroID: heroID,\n                  )\n                );\n              } else {\n                App.mainNavigatorKey?.currentContext?.to(\n                  () => ReaderWithLoading(id: c.id, sourceKey: c.sourceKey),\n                );\n              }\n            },\n            onLongPressed: (c, heroID) {\n              setState(() {\n                if (!multiSelectMode) {\n                  multiSelectMode = true;\n                  if (!selectedComics.containsKey(c as FavoriteItem)) {\n                    selectedComics[c] = true;\n                  }\n                  lastSelectedIndex = comics.indexOf(c);\n                } else {\n                  if (lastSelectedIndex != null) {\n                    int start = lastSelectedIndex!;\n                    int end = comics.indexOf(c as FavoriteItem);\n                    if (start > end) {\n                      int temp = start;\n                      start = end;\n                      end = temp;\n                    }\n\n                    for (int i = start; i <= end; i++) {\n                      if (i == lastSelectedIndex) continue;\n\n                      var comic = comics[i];\n                      if (selectedComics.containsKey(comic)) {\n                        selectedComics.remove(comic);\n                      } else {\n                        selectedComics[comic] = true;\n                      }\n                    }\n                  }\n                  lastSelectedIndex = comics.indexOf(c as FavoriteItem);\n                }\n                _checkExitSelectMode();\n              });\n            },\n          ),\n      ],\n    );\n    body = AppScrollBar(\n      topPadding: 48,\n      controller: scrollController,\n      child: ScrollConfiguration(\n        behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),\n        child: body,\n      ),\n    );\n    return PopScope(\n      canPop: !multiSelectMode && !searchMode,\n      onPopInvokedWithResult: (didPop, result) {\n        if (multiSelectMode) {\n          setState(() {\n            multiSelectMode = false;\n            selectedComics.clear();\n          });\n        } else if (searchMode) {\n          setState(() {\n            searchMode = false;\n            keyword = \"\";\n            updateComics();\n          });\n        }\n      },\n      child: body,\n    );\n  }\n\n  void favoriteOption(String option) {\n    var targetFolders = LocalFavoritesManager()\n        .folderNames\n        .where((folder) => folder != favPage.folder)\n        .toList();\n\n    showPopUpWidget(\n      App.rootContext,\n      StatefulBuilder(\n        builder: (context, setState) {\n          return PopUpWidgetScaffold(\n            title: favPage.folder ?? \"Unselected\".tl,\n            body: Padding(\n              padding: EdgeInsets.only(bottom: context.padding.bottom + 16),\n              child: Container(\n                constraints:\n                    const BoxConstraints(maxHeight: 700, maxWidth: 500),\n                child: Column(\n                  children: [\n                    Expanded(\n                      child: ListView.builder(\n                        itemCount: targetFolders.length + 1,\n                        itemBuilder: (context, index) {\n                          if (index == targetFolders.length) {\n                            return SizedBox(\n                              height: 36,\n                              child: Center(\n                                child: TextButton(\n                                  onPressed: () {\n                                    newFolder().then((v) {\n                                      setState(() {\n                                        targetFolders = LocalFavoritesManager()\n                                            .folderNames\n                                            .where((folder) =>\n                                                folder != favPage.folder)\n                                            .toList();\n                                      });\n                                    });\n                                  },\n                                  child: Row(\n                                    mainAxisSize: MainAxisSize.min,\n                                    children: [\n                                      const Icon(Icons.add, size: 20),\n                                      const SizedBox(width: 4),\n                                      Text(\"New Folder\".tl),\n                                    ],\n                                  ),\n                                ),\n                              ),\n                            );\n                          }\n                          var folder = targetFolders[index];\n                          var disabled = false;\n                          if (selectedLocalFolders.isNotEmpty) {\n                            if (added.contains(folder) &&\n                                !added.contains(selectedLocalFolders.first)) {\n                              disabled = true;\n                            } else if (!added.contains(folder) &&\n                                added.contains(selectedLocalFolders.first)) {\n                              disabled = true;\n                            }\n                          }\n                          return CheckboxListTile(\n                            title: Row(\n                              children: [\n                                Text(folder),\n                                const SizedBox(width: 8),\n                              ],\n                            ),\n                            value: selectedLocalFolders.contains(folder),\n                            onChanged: disabled\n                                ? null\n                                : (v) {\n                                    setState(() {\n                                      if (v!) {\n                                        selectedLocalFolders.add(folder);\n                                      } else {\n                                        selectedLocalFolders.remove(folder);\n                                      }\n                                    });\n                                  },\n                          );\n                        },\n                      ),\n                    ),\n                    Center(\n                      child: FilledButton(\n                        onPressed: () {\n                          if (selectedLocalFolders.isEmpty) {\n                            return;\n                          }\n                          if (option == 'move') {\n                            var comics = selectedComics.keys\n                                .map((e) => e as FavoriteItem)\n                                .toList();\n                            for (var f in selectedLocalFolders) {\n                              LocalFavoritesManager().batchMoveFavorites(\n                                favPage.folder as String,\n                                f,\n                                comics,\n                              );\n                            }\n                          } else {\n                            var comics = selectedComics.keys\n                                .map((e) => e as FavoriteItem)\n                                .toList();\n                            for (var f in selectedLocalFolders) {\n                              LocalFavoritesManager().batchCopyFavorites(\n                                favPage.folder as String,\n                                f,\n                                comics,\n                              );\n                            }\n                          }\n                          App.rootContext.pop();\n                          updateComics();\n                          _cancel();\n                        },\n                        child: Text(option == 'move' ? \"Move\".tl : \"Add\".tl),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  void _checkExitSelectMode() {\n    if (selectedComics.isEmpty) {\n      setState(() {\n        multiSelectMode = false;\n      });\n    }\n  }\n\n  void _cancel() {\n    setState(() {\n      selectedComics.clear();\n      multiSelectMode = false;\n    });\n  }\n\n  void _deleteComicWithId() {\n    var toBeDeleted = selectedComics.keys.map((e) => e as FavoriteItem).toList();\n    LocalFavoritesManager().batchDeleteComics(widget.folder, toBeDeleted);\n    _cancel();\n  }\n}\n\nclass _ReorderComicsPage extends StatefulWidget {\n  const _ReorderComicsPage(this.name, this.onReorder);\n\n  final String name;\n\n  final void Function(List<FavoriteItem>) onReorder;\n\n  @override\n  State<_ReorderComicsPage> createState() => _ReorderComicsPageState();\n}\n\nclass _ReorderComicsPageState extends State<_ReorderComicsPage> {\n  final _key = GlobalKey();\n  var reorderWidgetKey = UniqueKey();\n  final _scrollController = ScrollController();\n  late var comics = LocalFavoritesManager().getFolderComics(widget.name);\n  bool changed = false;\n\n  static int _floatToInt8(double x) {\n    return (x * 255.0).round() & 0xff;\n  }\n\n  Color lightenColor(Color color, double lightenValue) {\n    int red =\n        (_floatToInt8(color.r) + ((255 - color.r) * lightenValue)).round();\n    int green = (_floatToInt8(color.g) * 255 + ((255 - color.g) * lightenValue))\n        .round();\n    int blue = (_floatToInt8(color.b) * 255 + ((255 - color.b) * lightenValue))\n        .round();\n\n    return Color.fromARGB(_floatToInt8(color.a), red, green, blue);\n  }\n\n  @override\n  void dispose() {\n    if (changed) {\n      // Delay to ensure navigation is completed\n      Future.delayed(const Duration(milliseconds: 200), () {\n        LocalFavoritesManager().reorder(comics, widget.name);\n      });\n    }\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var type = appdata.settings['comicDisplayMode'];\n    var tiles = comics.map(\n      (e) {\n        var comicSource = e.type.comicSource;\n        return ComicTile(\n          key: Key(e.hashCode.toString()),\n          enableLongPressed: false,\n          comic: Comic(\n            e.name,\n            e.coverPath,\n            e.id,\n            e.author,\n            e.tags,\n            type == 'detailed'\n                ? \"${e.time} | ${comicSource?.name ?? \"Unknown\"}\"\n                : \"${e.type.comicSource?.name ?? \"Unknown\"} | ${e.time}\",\n            comicSource?.key ??\n                (e.type == ComicType.local ? \"local\" : \"Unknown\"),\n            null,\n            null,\n          ),\n        );\n      },\n    ).toList();\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"Reorder\".tl),\n        actions: [\n          Tooltip(\n            message: \"Information\".tl,\n            child: IconButton(\n              icon: const Icon(Icons.info_outline),\n              onPressed: () {\n                showInfoDialog(\n                  context: context,\n                  title: \"Reorder\".tl,\n                  content: \"Long press and drag to reorder.\".tl,\n                );\n              },\n            ),\n          ),\n          Tooltip(\n            message: \"Reverse\".tl,\n            child: IconButton(\n              icon: const Icon(Icons.swap_vert),\n              onPressed: () {\n                setState(() {\n                  comics = comics.reversed.toList();\n                  changed = true;\n                });\n              },\n            ),\n          )\n        ],\n      ),\n      body: ReorderableBuilder<FavoriteItem>(\n        key: reorderWidgetKey,\n        scrollController: _scrollController,\n        longPressDelay: App.isDesktop\n            ? const Duration(milliseconds: 100)\n            : const Duration(milliseconds: 500),\n        onReorder: (reorderFunc) {\n          changed = true;\n          setState(() {\n            comics = reorderFunc(comics);\n          });\n          widget.onReorder(comics);\n        },\n        dragChildBoxDecoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(16),\n          color: lightenColor(\n            Theme.of(context).splashColor.withAlpha(255),\n            0.2,\n          ),\n        ),\n        builder: (children) {\n          return GridView(\n            key: _key,\n            controller: _scrollController,\n            gridDelegate: SliverGridDelegateWithComics(),\n            children: children,\n          );\n        },\n        children: tiles,\n      ),\n    );\n  }\n}\n\nclass _SelectUpdatePageNum extends StatefulWidget {\n  const _SelectUpdatePageNum({\n    required this.networkSource,\n    this.networkFolder,\n    super.key,\n  });\n\n  final String? networkFolder;\n  final String networkSource;\n\n  @override\n  State<_SelectUpdatePageNum> createState() => _SelectUpdatePageNumState();\n}\n\nclass _SelectUpdatePageNumState extends State<_SelectUpdatePageNum> {\n  int updatePageNum = 9999999;\n\n  String get _allPageText => 'All'.tl;\n\n  List<String> get pageNumList =>\n      ['1', '2', '3', '5', '10', '20', '50', '100', '200', _allPageText];\n\n  @override\n  void initState() {\n    updatePageNum =\n        appdata.implicitData[\"local_favorites_update_page_num\"] ?? 9999999;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var source = ComicSource.find(widget.networkSource);\n    var sourceName = source?.name ?? widget.networkSource;\n    var text = \"The folder is Linked to @source\".tlParams({\n      \"source\": sourceName,\n    });\n    if (widget.networkFolder != null && widget.networkFolder!.isNotEmpty) {\n      text += \"\\n${\"Source Folder\".tl}: ${widget.networkFolder}\";\n    }\n\n    return Column(\n      children: [\n        Row(\n          children: [Text(text)],\n        ),\n        Row(\n          children: [\n            Text(\"Update the page number by the latest collection\".tl),\n            Spacer(),\n            Select(\n              current: updatePageNum.toString() == '9999999'\n                  ? _allPageText\n                  : updatePageNum.toString(),\n              values: pageNumList,\n              minWidth: 48,\n              onTap: (index) {\n                setState(() {\n                  updatePageNum = int.parse(pageNumList[index] == _allPageText\n                      ? '9999999'\n                      : pageNumList[index]);\n                  appdata.implicitData[\"local_favorites_update_page_num\"] =\n                      updatePageNum;\n                  appdata.writeImplicitData();\n                });\n              },\n            )\n          ],\n        ),\n      ],\n    );\n  }\n}\n\nclass _LocalFavoritesFilterDialog extends StatefulWidget {\n  const _LocalFavoritesFilterDialog({\n    required this.initReadFilterSelect,\n    required this.updateConfig,\n  });\n\n  final String initReadFilterSelect;\n  final Function updateConfig;\n\n  @override\n  State<_LocalFavoritesFilterDialog> createState() =>\n      _LocalFavoritesFilterDialogState();\n}\n\nconst readFilterList = ['All', 'UnCompleted', 'Completed'];\n\nclass _LocalFavoritesFilterDialogState\n    extends State<_LocalFavoritesFilterDialog> {\n  List<String> optionTypes = ['Filter'];\n  late var readFilter = widget.initReadFilterSelect;\n  @override\n  Widget build(BuildContext context) {\n    Widget tabBar = Material(\n      borderRadius: BorderRadius.circular(8),\n      child: AppTabBar(\n        key: PageStorageKey(optionTypes),\n        tabs: optionTypes.map((e) => Tab(text: e.tl, key: Key(e))).toList(),\n      ),\n    ).paddingTop(context.padding.top);\n    return ContentDialog(\n      content: DefaultTabController(\n        length: 2,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            tabBar,\n            TabViewBody(children: [\n              Column(\n                children: [\n                  ListTile(\n                    title: Text(\"Filter reading status\".tl),\n                    trailing: Select(\n                      current: readFilter.tl,\n                      values: readFilterList.map((e) => e.tl).toList(),\n                      minWidth: 64,\n                      onTap: (index) {\n                        setState(() {\n                          readFilter = readFilterList[index];\n                        });\n                      },\n                    ),\n                  )\n                ],\n              )\n            ]),\n          ],\n        ),\n      ),\n      actions: [\n        FilledButton(\n          onPressed: () {\n            appdata.implicitData[\"local_favorites_read_filter\"] = readFilter;\n            appdata.writeImplicitData();\n            if (mounted) {\n              Navigator.pop(context);\n              widget.updateConfig(readFilter);\n            }\n          },\n          child: Text(\"Confirm\".tl),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/favorites/network_favorites_page.dart",
    "content": "part of 'favorites_page.dart';\n\nFuture<bool> _deleteComic(\n  String cid,\n  String? fid,\n  String sourceKey,\n  String? favId,\n) async {\n  var source = ComicSource.find(sourceKey);\n  if (source == null) {\n    return false;\n  }\n\n  var result = false;\n\n  await showDialog(\n    context: App.rootContext,\n    builder: (context) {\n      bool loading = false;\n      return StatefulBuilder(builder: (context, setState) {\n        return ContentDialog(\n          title: \"Remove\".tl,\n          content: Text(\"Remove comic from favorite?\".tl).paddingHorizontal(16),\n          actions: [\n            Button.filled(\n              isLoading: loading,\n              color: context.colorScheme.error,\n              onPressed: () async {\n                setState(() {\n                  loading = true;\n                });\n                var res = await source.favoriteData!.addOrDelFavorite!(\n                  cid,\n                  fid ?? '',\n                  false,\n                  favId,\n                );\n                if (res.success) {\n                  // Invalidate network cache so next loads fetch fresh data\n                  NetworkCacheManager().clear();\n                  context.showMessage(message: \"Deleted\".tl);\n                  result = true;\n                  context.pop();\n                } else {\n                  setState(() {\n                    loading = false;\n                  });\n                  context.showMessage(message: res.errorMessage!);\n                }\n              },\n              child: Text(\"Confirm\".tl),\n            ),\n          ],\n        );\n      });\n    },\n  );\n\n  return result;\n}\n\nclass NetworkFavoritePage extends StatelessWidget {\n  const NetworkFavoritePage(this.data, {super.key});\n\n  final FavoriteData data;\n\n  @override\n  Widget build(BuildContext context) {\n    return data.multiFolder\n        ? _MultiFolderFavoritesPage(data)\n        : _NormalFavoritePage(data);\n  }\n}\n\nclass _NormalFavoritePage extends StatefulWidget {\n  const _NormalFavoritePage(this.data);\n\n  final FavoriteData data;\n\n  @override\n  State<_NormalFavoritePage> createState() => _NormalFavoritePageState();\n}\n\nclass _NormalFavoritePageState extends State<_NormalFavoritePage> {\n  final comicListKey = GlobalKey<ComicListState>();\n\n  void showFolders() {\n    context\n        .findAncestorStateOfType<_FavoritesPageState>()!\n        .showFolderSelector();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ComicList(\n      key: comicListKey,\n      leadingSliver: SliverAppbar(\n        style:\n            context.width < changePoint ? AppbarStyle.shadow : AppbarStyle.blur,\n        leading: Tooltip(\n          message: \"Folders\".tl,\n          child: context.width <= _kTwoPanelChangeWidth\n              ? IconButton(\n                  icon: const Icon(Icons.menu),\n                  color: context.colorScheme.primary,\n                  onPressed: showFolders,\n                )\n              : null,\n        ),\n        title: GestureDetector(\n          onTap: context.width < _kTwoPanelChangeWidth ? showFolders : null,\n          child: Text(widget.data.title),\n        ),\n        actions: [\n          Tooltip(\n            message: \"Refresh\".tl,\n            child: IconButton(\n              icon: const Icon(Icons.refresh),\n              onPressed: () {\n                // Force refresh bypassing cache\n                NetworkCacheManager().clear();\n                comicListKey.currentState!.refresh();\n              },\n            ),\n          ),\n          MenuButton(entries: [\n            MenuEntry(\n              icon: Icons.sync,\n              text: \"Convert to local\".tl,\n              onClick: () {\n                importNetworkFolder(widget.data.key, 9999999, null, null);\n              },\n            )\n          ]),\n        ],\n      ),\n      errorLeading: Appbar(\n        leading: Tooltip(\n          message: \"Folders\".tl,\n          child: context.width <= _kTwoPanelChangeWidth\n              ? IconButton(\n                  icon: const Icon(Icons.menu),\n                  color: context.colorScheme.primary,\n                  onPressed: context\n                      .findAncestorStateOfType<_FavoritesPageState>()!\n                      .showFolderSelector,\n                )\n              : null,\n        ),\n        title: GestureDetector(\n          onTap: context.width < _kTwoPanelChangeWidth ? showFolders : null,\n          child: Text(widget.data.title),\n        ),\n      ),\n      loadPage: widget.data.loadComic == null\n          ? null\n          : (i) => widget.data.loadComic!(i),\n      loadNext: widget.data.loadNext == null\n          ? null\n          : (next) => widget.data.loadNext!(next),\n      menuBuilder: (comic) {\n        return [\n          MenuEntry(\n            icon: Icons.delete_outline,\n            text: \"Remove\".tl,\n            onClick: () async {\n              var res = await _deleteComic(\n                comic.id,\n                null,\n                comic.sourceKey,\n                comic.favoriteId,\n              );\n              if (res) {\n                comicListKey.currentState!.remove(comic);\n              }\n            },\n          ),\n        ];\n      },\n      enablePageStorage: true,\n    );\n  }\n}\n\nclass _MultiFolderFavoritesPage extends StatefulWidget {\n  const _MultiFolderFavoritesPage(this.data);\n\n  final FavoriteData data;\n\n  @override\n  State<_MultiFolderFavoritesPage> createState() =>\n      _MultiFolderFavoritesPageState();\n}\n\nclass _MultiFolderFavoritesPageState extends State<_MultiFolderFavoritesPage> {\n  bool _loading = true;\n\n  String? _errorMessage;\n\n  Map<String, String>? folders;\n\n  void showFolders() {\n    context\n        .findAncestorStateOfType<_FavoritesPageState>()!\n        .showFolderSelector();\n  }\n\n  void loadPage() async {\n    var res = await widget.data.loadFolders!();\n    _loading = false;\n    if (res.error) {\n      setState(() {\n        _errorMessage = res.errorMessage;\n      });\n    } else {\n      setState(() {\n        folders = res.data;\n      });\n    }\n  }\n\n  void openFolder(String key, String title) {\n    context.to(() => _FavoriteFolder(widget.data, key, title));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var sliverAppBar = SliverAppbar(\n      style:\n          context.width < changePoint ? AppbarStyle.shadow : AppbarStyle.blur,\n      leading: Tooltip(\n        message: \"Folders\".tl,\n        child: context.width <= _kTwoPanelChangeWidth\n            ? IconButton(\n                icon: const Icon(Icons.menu),\n                color: context.colorScheme.primary,\n                onPressed: showFolders,\n              )\n            : null,\n      ),\n      title: GestureDetector(\n        onTap: context.width < _kTwoPanelChangeWidth ? showFolders : null,\n        child: Text(widget.data.title),\n      ),\n    );\n\n    var appBar = Appbar(\n      leading: Tooltip(\n        message: \"Folders\".tl,\n        child: context.width <= _kTwoPanelChangeWidth\n            ? IconButton(\n                icon: const Icon(Icons.menu),\n                color: context.colorScheme.primary,\n                onPressed: showFolders,\n              )\n            : null,\n      ),\n      title: GestureDetector(\n        onTap: context.width < _kTwoPanelChangeWidth ? showFolders : null,\n        child: Text(widget.data.title),\n      ),\n    );\n\n    if (_loading) {\n      loadPage();\n      return Column(\n        children: [\n          appBar,\n          const Expanded(\n            child: Center(\n              child: CircularProgressIndicator(),\n            ),\n          ),\n        ],\n      );\n    } else if (_errorMessage != null) {\n      return Column(\n        children: [\n          appBar,\n          Expanded(\n            child: NetworkError(\n              message: _errorMessage!,\n              withAppbar: false,\n              retry: () {\n                setState(() {\n                  _loading = true;\n                  _errorMessage = null;\n                });\n              },\n            ),\n          )\n        ],\n      );\n    } else {\n      var length = folders!.length;\n      if (widget.data.allFavoritesId != null) length++;\n      final keys = folders!.keys.toList();\n\n      return SmoothCustomScrollView(\n        slivers: [\n          sliverAppBar,\n          SliverGridViewWithFixedItemHeight(\n            delegate:\n                SliverChildBuilderDelegate(childCount: length, (context, i) {\n              if (widget.data.allFavoritesId != null) {\n                if (i == 0) {\n                  return _FolderTile(\n                      name: \"All\".tl,\n                      onTap: () =>\n                          openFolder(widget.data.allFavoritesId!, \"All\".tl));\n                } else {\n                  i--;\n                  return _FolderTile(\n                    name: folders![keys[i]]!,\n                    onTap: () => openFolder(keys[i], folders![keys[i]]!),\n                    deleteFolder: widget.data.deleteFolder == null\n                        ? null\n                        : () => widget.data.deleteFolder!(keys[i]),\n                    updateState: () => setState(() {\n                      _loading = true;\n                    }),\n                  );\n                }\n              } else {\n                return _FolderTile(\n                  name: folders![keys[i]]!,\n                  onTap: () => openFolder(keys[i], folders![keys[i]]!),\n                  deleteFolder: widget.data.deleteFolder == null\n                      ? null\n                      : () => widget.data.deleteFolder!(keys[i]),\n                  updateState: () => setState(() {\n                    _loading = true;\n                  }),\n                );\n              }\n            }),\n            maxCrossAxisExtent: 450,\n            itemHeight: 52,\n          ),\n          if (widget.data.addFolder != null)\n            SliverToBoxAdapter(\n              child: SizedBox(\n                height: 60,\n                width: double.infinity,\n                child: Center(\n                  child: TextButton(\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Text(\"Create a folder\".tl),\n                        const Icon(\n                          Icons.add,\n                          size: 18,\n                        ),\n                      ],\n                    ),\n                    onPressed: () {\n                      showDialog(\n                        context: context,\n                        builder: (context) {\n                          return _CreateFolderDialog(\n                            widget.data,\n                            () => setState(() {\n                              _loading = true;\n                            }),\n                          );\n                        },\n                      );\n                    },\n                  ),\n                ),\n              ),\n            )\n        ],\n      );\n    }\n  }\n}\n\nclass _FolderTile extends StatelessWidget {\n  const _FolderTile(\n      {required this.name,\n      required this.onTap,\n      this.deleteFolder,\n      this.updateState});\n\n  final String name;\n\n  final Future<Res<bool>> Function()? deleteFolder;\n\n  final void Function()? updateState;\n\n  final void Function() onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      child: InkWell(\n        onTap: onTap,\n        child: Padding(\n          padding: const EdgeInsets.fromLTRB(16, 8, 16, 8),\n          child: Row(\n            children: [\n              Icon(\n                Icons.folder,\n                size: 28,\n                color: Theme.of(context).colorScheme.secondary,\n              ),\n              const SizedBox(\n                width: 16,\n              ),\n              Expanded(\n                child: Align(\n                  alignment: Alignment.centerLeft,\n                  child: Text(\n                    name,\n                    style: const TextStyle(\n                        fontSize: 16, fontWeight: FontWeight.w500),\n                  ),\n                ),\n              ),\n              if (deleteFolder != null)\n                IconButton(\n                  icon: const Icon(Icons.delete_outline),\n                  onPressed: () => onDeleteFolder(context),\n                )\n              else\n                const Icon(Icons.arrow_right),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void onDeleteFolder(BuildContext context) {\n    showDialog(\n      context: context,\n      builder: (context) {\n        bool loading = false;\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"Delete\".tl,\n            content: Text(\"Delete folder?\".tl).paddingHorizontal(16),\n            actions: [\n              Button.filled(\n                isLoading: loading,\n                color: context.colorScheme.error,\n                onPressed: () async {\n                  setState(() {\n                    loading = true;\n                  });\n                  var res = await deleteFolder!();\n                  if (res.success) {\n                    context.showMessage(message: \"Deleted\".tl);\n                    context.pop();\n                    updateState?.call();\n                  } else {\n                    setState(() {\n                      loading = false;\n                    });\n                    context.showMessage(message: res.errorMessage!);\n                  }\n                },\n                child: Text(\"Confirm\".tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n  }\n}\n\nclass _CreateFolderDialog extends StatefulWidget {\n  const _CreateFolderDialog(this.data, this.updateState);\n\n  final FavoriteData data;\n\n  final void Function() updateState;\n\n  @override\n  State<_CreateFolderDialog> createState() => _CreateFolderDialogState();\n}\n\nclass _CreateFolderDialogState extends State<_CreateFolderDialog> {\n  var controller = TextEditingController();\n  bool loading = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return ContentDialog(\n      title: \"Create a folder\".tl,\n      content: Column(\n        children: [\n          Padding(\n            padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),\n            child: TextField(\n              controller: controller,\n              decoration: InputDecoration(\n                border: const OutlineInputBorder(),\n                labelText: \"name\".tl,\n              ),\n            ),\n          ),\n          const SizedBox(\n            height: 16\n          ),\n        ],\n      ),\n      actions: [\n        Button.filled(\n          isLoading: loading,\n          onPressed: () {\n            setState(() {\n              loading = true;\n            });\n            widget.data.addFolder!(controller.text).then((b) {\n              if (b.error) {\n                context.showMessage(message: b.errorMessage!);\n                setState(() {\n                  loading = false;\n                });\n              } else {\n                context.pop();\n                context.showMessage(message: \"Created successfully\".tl);\n                widget.updateState();\n              }\n            });\n          },\n          child: Text(\"Submit\".tl),\n        )\n      ],\n    );\n  }\n}\n\nclass _FavoriteFolder extends StatelessWidget {\n  _FavoriteFolder(this.data, this.folderID, this.title);\n\n  final FavoriteData data;\n\n  final String folderID;\n\n  final String title;\n\n  final comicListKey = GlobalKey<ComicListState>();\n\n  @override\n  Widget build(BuildContext context) {\n    return ComicList(\n      key: comicListKey,\n      enablePageStorage: true,\n      leadingSliver: SliverAppbar(\n        title: Text(title),\n        actions: [\n          MenuButton(entries: [\n            MenuEntry(\n              icon: Icons.sync,\n              text: \"Convert to local\".tl,\n              onClick: () {\n                importNetworkFolder(data.key, 9999999, title, folderID);\n              },\n            )\n          ]),\n        ],\n      ),\n      errorLeading: Appbar(\n        title: Text(title),\n      ),\n      loadPage:\n          data.loadComic == null ? null : (i) => data.loadComic!(i, folderID),\n      loadNext: data.loadNext == null\n          ? null\n          : (next) => data.loadNext!(next, folderID),\n      menuBuilder: (comic) {\n        return [\n          MenuEntry(\n            icon: Icons.delete_outline,\n            text: \"Remove\".tl,\n            onClick: () async {\n              var res = await _deleteComic(\n                comic.id,\n                null,\n                comic.sourceKey,\n                comic.favoriteId,\n              );\n              if (res) {\n                comicListKey.currentState!.remove(comic);\n              }\n            },\n          ),\n        ];\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/favorites/side_bar.dart",
    "content": "part of 'favorites_page.dart';\n\nclass _LeftBar extends StatefulWidget {\n  const _LeftBar({this.favPage, this.onSelected, this.withAppbar = false});\n\n  final _FavoritesPageState? favPage;\n\n  final VoidCallback? onSelected;\n\n  final bool withAppbar;\n\n  @override\n  State<_LeftBar> createState() => _LeftBarState();\n}\n\nclass _LeftBarState extends State<_LeftBar> implements FolderList {\n  late _FavoritesPageState favPage;\n\n  var folders = <String>[];\n\n  var networkFolders = <String>[];\n\n  void findNetworkFolders() {\n    networkFolders.clear();\n    var all = ComicSource.all()\n        .where((e) => e.favoriteData != null)\n        .map((e) => e.favoriteData!.key)\n        .toList();\n    var settings = appdata.settings['favorites'] as List;\n    for (var p in settings) {\n      if (all.contains(p) && !networkFolders.contains(p)) {\n        networkFolders.add(p);\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    favPage = widget.favPage ??\n        context.findAncestorStateOfType<_FavoritesPageState>()!;\n    favPage.folderList = this;\n    folders = LocalFavoritesManager().folderNames;\n    findNetworkFolders();\n    appdata.settings.addListener(updateFolders);\n    LocalFavoritesManager().addListener(updateFolders);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    appdata.settings.removeListener(updateFolders);\n    LocalFavoritesManager().removeListener(updateFolders);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      width: double.infinity,\n      height: double.infinity,\n      decoration: BoxDecoration(\n        border: Border(\n          right: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Column(\n        children: [\n          if (widget.withAppbar)\n            SizedBox(\n              height: 56,\n              child: Row(\n                children: [\n                  const SizedBox(width: 8),\n                  const CloseButton(),\n                  const SizedBox(width: 8),\n                  Text(\n                    \"Folders\".tl,\n                    style: ts.s18,\n                  ),\n                ],\n              ),\n            ).paddingTop(context.padding.top),\n          Expanded(\n            child: ListView.builder(\n              padding: widget.withAppbar\n                  ? EdgeInsets.zero\n                  : EdgeInsets.only(top: context.padding.top),\n              itemCount: folders.length + networkFolders.length + 3,\n              itemBuilder: (context, index) {\n                if (index == 0) {\n                  return buildLocalTitle();\n                }\n                index--;\n                if (index == 0) {\n                  return buildLocalFolder(_localAllFolderLabel);\n                }\n                index--;\n                if (index < folders.length) {\n                  return buildLocalFolder(folders[index]);\n                }\n                index -= folders.length;\n                if (index == 0) {\n                  return buildNetworkTitle();\n                }\n                index--;\n                return buildNetworkFolder(networkFolders[index]);\n              },\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget buildLocalTitle() {\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8),\n      child: Row(\n        children: [\n          Icon(\n            Icons.local_activity,\n            color: context.colorScheme.secondary,\n          ),\n          const SizedBox(width: 12),\n          Text(\"Local\".tl),\n          const Spacer(),\n          MenuButton(\n            entries: [\n              MenuEntry(\n                icon: Icons.add,\n                text: 'Create Folder'.tl,\n                onClick: () {\n                  newFolder().then((value) {\n                    setState(() {\n                      folders = LocalFavoritesManager().folderNames;\n                    });\n                  });\n                },\n              ),\n              MenuEntry(\n                icon: Icons.reorder,\n                text: 'Sort'.tl,\n                onClick: () {\n                  sortFolders().then((value) {\n                    setState(() {\n                      folders = LocalFavoritesManager().folderNames;\n                    });\n                  });\n                },\n              ),\n            ],\n          ),\n        ],\n      ).paddingHorizontal(16),\n    );\n  }\n\n  Widget buildNetworkTitle() {\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 12),\n      margin: const EdgeInsets.only(top: 8),\n      decoration: BoxDecoration(\n        border: Border(\n          top: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Row(\n        children: [\n          Icon(\n            Icons.cloud,\n            color: context.colorScheme.secondary,\n          ),\n          const SizedBox(width: 12),\n          Text(\"Network\".tl),\n          const Spacer(),\n          IconButton(\n            icon: const Icon(Icons.settings),\n            onPressed: () {\n              showPopUpWidget(\n                App.rootContext,\n                setFavoritesPagesWidget(),\n              );\n            },\n          ),\n        ],\n      ).paddingHorizontal(16),\n    );\n  }\n\n  Widget buildLocalFolder(String name) {\n    bool isSelected = name == favPage.folder && !favPage.isNetwork;\n    int count = 0;\n    if (name == _localAllFolderLabel) {\n      count = LocalFavoritesManager().totalComics;\n    } else {\n      count = LocalFavoritesManager().folderComics(name);\n    }\n    var folderName = name == _localAllFolderLabel\n        ? \"All\".tl\n        : getFavoriteDataOrNull(name)?.title ?? name;\n    return InkWell(\n      onTap: () {\n        if (isSelected) {\n          return;\n        }\n        favPage.setFolder(false, name);\n        widget.onSelected?.call();\n      },\n      child: Container(\n        height: 42,\n        alignment: Alignment.centerLeft,\n        decoration: BoxDecoration(\n          color: isSelected\n              ? context.colorScheme.primaryContainer.toOpacity(0.36)\n              : null,\n          border: Border(\n            left: BorderSide(\n              color:\n                  isSelected ? context.colorScheme.primary : Colors.transparent,\n              width: 2,\n            ),\n          ),\n        ),\n        padding: const EdgeInsets.only(left: 16),\n        child: Row(\n          children: [\n            Expanded(\n              child: Text(folderName),\n            ),\n            Container(\n              margin: EdgeInsets.only(right: 8),\n              padding: EdgeInsets.symmetric(\n                horizontal: 8,\n                vertical: 2,\n              ),\n              decoration: BoxDecoration(\n                color: context.colorScheme.surfaceContainer,\n                borderRadius: BorderRadius.circular(8),\n              ),\n              child: Text(count.toString()),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildNetworkFolder(String key) {\n    var data = getFavoriteDataOrNull(key);\n    if (data == null) {\n      return const SizedBox();\n    }\n    bool isSelected = key == favPage.folder && favPage.isNetwork;\n    return InkWell(\n      onTap: () {\n        if (isSelected) {\n          return;\n        }\n        favPage.setFolder(true, key);\n        widget.onSelected?.call();\n      },\n      child: Container(\n        height: 42,\n        alignment: Alignment.centerLeft,\n        decoration: BoxDecoration(\n          color: isSelected\n              ? context.colorScheme.primaryContainer.toOpacity(0.36)\n              : null,\n          border: Border(\n            left: BorderSide(\n              color:\n                  isSelected ? context.colorScheme.primary : Colors.transparent,\n              width: 2,\n            ),\n          ),\n        ),\n        padding: const EdgeInsets.only(left: 16),\n        child: Text(data.title),\n      ),\n    );\n  }\n\n  @override\n  void update() {\n    if (!mounted) return;\n    setState(() {});\n  }\n\n  @override\n  void updateFolders() {\n    if (!mounted) return;\n    setState(() {\n      folders = LocalFavoritesManager().folderNames;\n      findNetworkFolders();\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow_updates_page.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/utils/translations.dart';\nimport '../foundation/global_state.dart';\nimport 'package:venera/foundation/follow_updates.dart';\n\nclass FollowUpdatesWidget extends StatefulWidget {\n  const FollowUpdatesWidget({super.key});\n\n  @override\n  State<FollowUpdatesWidget> createState() => _FollowUpdatesWidgetState();\n}\n\nclass _FollowUpdatesWidgetState\n    extends AutomaticGlobalState<FollowUpdatesWidget> {\n  int _count = 0;\n\n  String? get folder => appdata.settings[\"followUpdatesFolder\"];\n\n  void getCount() {\n    if (folder == null) {\n      _count = 0;\n      return;\n    }\n    if (!LocalFavoritesManager().folderNames.contains(folder)) {\n      _count = 0;\n      appdata.settings[\"followUpdatesFolder\"] = null;\n      Future.microtask(() {\n        appdata.saveData();\n      });\n    } else {\n      _count = LocalFavoritesManager().countUpdates(folder!);\n    }\n  }\n\n  void updateCount() {\n    setState(() {\n      getCount();\n    });\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    getCount();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: () {\n            context.to(() => FollowUpdatesPage());\n          },\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              SizedBox(\n                height: 56,\n                child: Row(\n                  children: [\n                    Center(\n                      child: Text('Follow Updates'.tl, style: ts.s18),\n                    ),\n                    const Spacer(),\n                    const Icon(Icons.arrow_right),\n                  ],\n                ),\n              ).paddingHorizontal(16),\n              if (_count > 0)\n                Container(\n                  padding:\n                      const EdgeInsets.symmetric(horizontal: 16, vertical: 2),\n                  margin: const EdgeInsets.only(bottom: 16, left: 16),\n                  decoration: BoxDecoration(\n                    borderRadius: BorderRadius.circular(8),\n                    color: Theme.of(context).colorScheme.primaryContainer,\n                  ),\n                  child: Text(\n                    '@c updates'.tlParams({\n                      'c': _count,\n                    }),\n                    style: ts.s16,\n                  ),\n                ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  Object? get key => 'FollowUpdatesWidget';\n}\n\nclass FollowUpdatesPage extends StatefulWidget {\n  const FollowUpdatesPage({super.key});\n\n  @override\n  State<FollowUpdatesPage> createState() => _FollowUpdatesPageState();\n}\n\nclass _FollowUpdatesPageState extends AutomaticGlobalState<FollowUpdatesPage> {\n  String? get folder => appdata.settings[\"followUpdatesFolder\"];\n\n  var updatedComics = <FavoriteItemWithUpdateInfo>[];\n  var allComics = <FavoriteItemWithUpdateInfo>[];\n\n  /// Sort comics by update time in descending order with nulls at the end.\n  void sortComics() {\n    allComics.sort((a, b) {\n      if (a.updateTime == null && b.updateTime == null) {\n        return 0;\n      } else if (a.updateTime == null) {\n        return -1;\n      } else if (b.updateTime == null) {\n        return 1;\n      }\n      try {\n        var aNums = a.updateTime!.split('-').map(int.parse).toList();\n        var bNums = b.updateTime!.split('-').map(int.parse).toList();\n        for (int i = 0; i < aNums.length; i++) {\n          if (aNums[i] != bNums[i]) {\n            return bNums[i] - aNums[i];\n          }\n        }\n        return 0;\n      } catch (_) {\n        return 0;\n      }\n    });\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    if (folder != null) {\n      allComics = LocalFavoritesManager().getComicsWithUpdatesInfo(folder!);\n      sortComics();\n      updatedComics = allComics.where((c) => c.hasNewUpdate).toList();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: SmoothCustomScrollView(\n        slivers: [\n          SliverAppbar(title: Text('Follow Updates'.tl)),\n          if (folder == null)\n            buildNotConfigured(context)\n          else\n            buildConfigured(context),\n          SliverPadding(padding: const EdgeInsets.only(top: 8)),\n          buildUpdatedComics(),\n          buildAllComics(),\n        ],\n      ),\n    );\n  }\n\n  Widget buildNotConfigured(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            ListTile(\n              leading: Icon(Icons.info_outline),\n              title: Text(\"Not Configured\".tl),\n            ),\n            Text(\n              \"Choose a folder to follow updates.\".tl,\n              style: ts.s16,\n            ).paddingHorizontal(16),\n            const SizedBox(height: 8),\n            FilledButton.tonal(\n              onPressed: showSelector,\n              child: Text(\"Choose Folder\".tl),\n            ).paddingHorizontal(16).toAlign(Alignment.centerRight),\n            const SizedBox(height: 16),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildConfigured(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            ListTile(\n              leading: Icon(Icons.stars_outlined),\n              title: Text(folder!),\n            ),\n            Text(\n              \"Automatic update checking enabled.\".tl,\n              style: ts.s14,\n            ).paddingHorizontal(16),\n            Text(\n              \"The app will check for updates at most once a day.\".tl,\n              style: ts.s14,\n            ).paddingHorizontal(16),\n            const SizedBox(height: 8),\n            Row(\n              mainAxisAlignment: MainAxisAlignment.end,\n              children: [\n                TextButton(\n                  onPressed: showSelector,\n                  child: Text(\"Change Folder\".tl),\n                ),\n                FilledButton.tonal(\n                  onPressed: checkNow,\n                  child: Text(\"Check Now\".tl),\n                ),\n                const SizedBox(width: 16),\n              ],\n            ),\n            const SizedBox(height: 16),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildUpdatedComics() {\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverToBoxAdapter(\n          child: Container(\n            margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n            padding: const EdgeInsets.symmetric(vertical: 4),\n            decoration: BoxDecoration(\n              border: Border(\n                bottom: BorderSide(\n                  color: Theme.of(context).colorScheme.outlineVariant,\n                  width: 0.6,\n                ),\n              ),\n            ),\n            child: Row(\n              children: [\n                Icon(Icons.update),\n                const SizedBox(width: 8),\n                Text(\n                  \"Updates\".tl,\n                  style: ts.s18,\n                ),\n                const Spacer(),\n                if (updatedComics.isNotEmpty)\n                  IconButton(\n                    icon: Icon(Icons.clear_all),\n                    onPressed: () {\n                      showConfirmDialog(\n                        context: App.rootContext,\n                        title: \"Mark all as read\".tl,\n                        content: \"Do you want to mark all as read?\".tl,\n                        onConfirm: () {\n                          for (var comic in updatedComics) {\n                            LocalFavoritesManager().markAsRead(\n                              comic.id,\n                              comic.type,\n                            );\n                          }\n                          updateFollowUpdatesUI();\n                          appdata.saveData();\n                        },\n                      );\n                    },\n                  ),\n              ],\n            ),\n          ),\n        ),\n        if (updatedComics.isNotEmpty)\n          SliverToBoxAdapter(\n            child: Text(\n                    \"The comic will be marked as no updates as soon as you read it.\"\n                        .tl)\n                .paddingHorizontal(16)\n                .paddingVertical(4),\n          ),\n        if (updatedComics.isNotEmpty)\n          SliverGridComics(comics: updatedComics)\n        else\n          SliverToBoxAdapter(\n            child: Row(\n              children: [\n                Container(\n                  margin:\n                      const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n                  padding:\n                      const EdgeInsets.symmetric(horizontal: 12, vertical: 4),\n                  decoration: BoxDecoration(\n                    color: Theme.of(context).colorScheme.surfaceContainerLow,\n                    borderRadius: BorderRadius.circular(16),\n                  ),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Text(\n                        \"No updates found\".tl,\n                        style: ts.s16,\n                      ),\n                    ],\n                  ),\n                )\n              ],\n            ),\n          ),\n      ],\n    );\n  }\n\n  Widget buildAllComics() {\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverToBoxAdapter(\n          child: Container(\n            margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n            padding: const EdgeInsets.symmetric(vertical: 4),\n            decoration: BoxDecoration(\n              border: Border(\n                bottom: BorderSide(\n                  color: Theme.of(context).colorScheme.outlineVariant,\n                  width: 0.6,\n                ),\n              ),\n            ),\n            child: Row(\n              children: [\n                Icon(Icons.list),\n                const SizedBox(width: 8),\n                Text(\n                  \"All Comics\".tl,\n                  style: ts.s18,\n                ),\n              ],\n            ),\n          ),\n        ),\n        SliverGridComics(comics: allComics),\n      ],\n    );\n  }\n\n  void showSelector() {\n    var folders = LocalFavoritesManager().folderNames;\n    if (folders.isEmpty) {\n      context.showMessage(message: \"No folders available\".tl);\n      return;\n    }\n    String? selectedFolder;\n    showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"Choose Folder\".tl,\n            content: Column(\n              children: [\n                ListTile(\n                  title: Text(\"Folder\".tl),\n                  trailing: Select(\n                    minWidth: 120,\n                    current: selectedFolder,\n                    values: folders,\n                    onTap: (i) {\n                      setState(() {\n                        selectedFolder = folders[i];\n                      });\n                    },\n                  ),\n                ),\n              ],\n            ),\n            actions: [\n              if (appdata.settings[\"followUpdatesFolder\"] != null)\n                TextButton(\n                  onPressed: () {\n                    disable();\n                    context.pop();\n                  },\n                  child: Text(\"Disable\".tl),\n                ),\n              FilledButton(\n                onPressed: selectedFolder == null\n                    ? null\n                    : () {\n                        context.pop();\n                        setFolder(selectedFolder!);\n                      },\n                child: Text(\"Confirm\".tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n  }\n\n  void disable() {\n    appdata.settings[\"followUpdatesFolder\"] = null;\n    appdata.saveData();\n    updateFollowUpdatesUI();\n  }\n\n  void setFolder(String folder) async {\n    FollowUpdatesService._cancelChecking?.call();\n    LocalFavoritesManager().prepareTableForFollowUpdates(folder);\n\n    var count = LocalFavoritesManager().count(folder);\n\n    if (count > 0) {\n      bool isCanceled = false;\n      void onCancel() {\n        isCanceled = true;\n      }\n\n      var loadingController = showLoadingDialog(\n        App.rootContext,\n        withProgress: true,\n        cancelButtonText: \"Cancel\".tl,\n        onCancel: onCancel,\n        message: \"Updating comics...\".tl,\n      );\n\n      await for (var progress in updateFolder(folder, true)) {\n        if (isCanceled) {\n          return;\n        }\n        loadingController.setProgress(progress.current / progress.total);\n      }\n\n      loadingController.close();\n    }\n\n    setState(() {\n      appdata.settings[\"followUpdatesFolder\"] = folder;\n      updatedComics = [];\n      allComics = LocalFavoritesManager().getComicsWithUpdatesInfo(folder);\n      sortComics();\n    });\n    appdata.saveData();\n  }\n\n  void checkNow() async {\n    FollowUpdatesService._cancelChecking?.call();\n\n    bool isCanceled = false;\n    void onCancel() {\n      isCanceled = true;\n    }\n\n    var loadingController = showLoadingDialog(\n      App.rootContext,\n      withProgress: true,\n      cancelButtonText: \"Cancel\".tl,\n      onCancel: onCancel,\n      message: \"Updating comics...\".tl,\n    );\n\n    int updated = 0;\n\n    await for (var progress in updateFolder(folder!, true)) {\n      if (isCanceled) {\n        return;\n      }\n      loadingController.setProgress(progress.current / progress.total);\n      updated = progress.updated;\n    }\n\n    loadingController.close();\n\n    if (updated > 0) {\n      GlobalState.findOrNull<_FollowUpdatesWidgetState>()?.updateCount();\n      updateComics();\n    }\n  }\n\n  void updateComics() {\n    if (folder == null) {\n      setState(() {\n        allComics = [];\n        updatedComics = [];\n      });\n      return;\n    }\n    setState(() {\n      allComics = LocalFavoritesManager().getComicsWithUpdatesInfo(folder!);\n      sortComics();\n      updatedComics = allComics.where((c) => c.hasNewUpdate).toList();\n    });\n  }\n\n  @override\n  Object? get key => 'FollowUpdatesPage';\n}\n\n/// Background service for checking updates\nabstract class FollowUpdatesService {\n  static bool _isChecking = false;\n\n  static void Function()? _cancelChecking;\n\n  static bool _isInitialized = false;\n\n  static void _check() async {\n    if (_isChecking) {\n      return;\n    }\n    var folder = appdata.settings[\"followUpdatesFolder\"];\n    if (folder == null) {\n      return;\n    }\n    bool isCanceled = false;\n    _cancelChecking = () {\n      isCanceled = true;\n    };\n\n    _isChecking = true;\n\n    while (DataSync().isDownloading) {\n      await Future.delayed(const Duration(milliseconds: 100));\n    }\n\n    int updated = 0;\n    try {\n      await for (var progress in updateFolder(folder, false)) {\n        if (isCanceled) {\n          return;\n        }\n        updated = progress.updated;\n      }\n    } finally {\n      _cancelChecking = null;\n      _isChecking = false;\n      if (updated > 0) {\n        updateFollowUpdatesUI();\n      }\n    }\n  }\n\n  /// Initialize the checker.\n  static void initChecker() {\n    if (_isInitialized) return;\n    _isInitialized = true;\n    _check();\n    DataSync().addListener(updateFollowUpdatesUI);\n    // A short interval will not affect the performance since every comic has a check time.\n    Timer.periodic(const Duration(minutes: 10), (timer) {\n      _check();\n    });\n  }\n}\n\n/// Update the UI of follow updates.\nvoid updateFollowUpdatesUI() {\n  GlobalState.findOrNull<_FollowUpdatesWidgetState>()?.updateCount();\n  GlobalState.findOrNull<_FollowUpdatesPageState>()?.updateComics();\n}\n"
  },
  {
    "path": "lib/pages/history_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/utils/translations.dart';\n\nclass HistoryPage extends StatefulWidget {\n  const HistoryPage({super.key});\n\n  @override\n  State<HistoryPage> createState() => _HistoryPageState();\n}\n\nclass _HistoryPageState extends State<HistoryPage> {\n  @override\n  void initState() {\n    HistoryManager().addListener(onUpdate);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    HistoryManager().removeListener(onUpdate);\n    super.dispose();\n  }\n\n  void onUpdate() {\n    setState(() {\n      comics = HistoryManager().getAll();\n      if (multiSelectMode) {\n        selectedComics.removeWhere((comic, _) => !comics.contains(comic));\n        if (selectedComics.isEmpty) {\n          multiSelectMode = false;\n        }\n      }\n    });\n  }\n\n  var comics = HistoryManager().getAll();\n  var controller = FlyoutController();\n\n  bool multiSelectMode = false;\n  Map<History, bool> selectedComics = {};\n\n  void selectAll() {\n    setState(() {\n      selectedComics = comics.asMap().map((k, v) => MapEntry(v, true));\n    });\n  }\n\n  void deSelect() {\n    setState(() {\n      selectedComics.clear();\n    });\n  }\n\n  void invertSelection() {\n    setState(() {\n      comics.asMap().forEach((k, v) {\n        selectedComics[v] = !selectedComics.putIfAbsent(v, () => false);\n      });\n      selectedComics.removeWhere((k, v) => !v);\n    });\n  }\n\n  void _removeHistory(History comic) {\n    if (comic.sourceKey.startsWith(\"Unknown\")) {\n      HistoryManager().remove(\n        comic.id,\n        ComicType(int.parse(comic.sourceKey.split(':')[1])),\n      );\n    } else if (comic.sourceKey == 'local') {\n      HistoryManager().remove(\n        comic.id,\n        ComicType.local,\n      );\n    } else {\n      HistoryManager().remove(\n        comic.id,\n        ComicType(comic.sourceKey.hashCode),\n      );\n    }\n  }\n\n  void _refreshHistory(History comic) async {\n    var result = await HistoryManager().refreshHistoryInfo(comic);\n    if (result) {\n      if (mounted) {\n        App.rootContext.showMessage(message: \"Refresh Success\".tl);\n      }\n    } else {\n      if (mounted) {\n        App.rootContext.showMessage(message: \"Refresh Failed\".tl);\n      }\n    }\n  }\n\n  void _refreshAllHistories() async {\n    bool isCanceled = false;\n    void onCancel() {\n      isCanceled = true;\n    }\n\n    var loadingController = showLoadingDialog(\n      App.rootContext,\n      withProgress: true,\n      cancelButtonText: \"Cancel\".tl,\n      onCancel: onCancel,\n      message: \"Refreshing Histories\".tl,\n    );\n\n    int success = 0;\n    int failed = 0;\n    int skipped = 0;\n\n    await for (var progress\n        in HistoryManager().refreshAllHistoriesStream()) {\n      if (isCanceled) {\n        return;\n      }\n      if (progress.total > 0) {\n        loadingController.setProgress(progress.current / progress.total);\n      }\n      success = progress.success;\n      failed = progress.failed;\n      skipped = progress.skipped;\n    }\n\n    loadingController.close();\n\n    if (mounted) {\n      App.rootContext.showMessage(\n        message:\n            \"Refresh Completed: Success @success, Failed @failed, Skipped @skipped\"\n                .tlParams({\n          'success': success,\n          'failed': failed,\n          'skipped': skipped,\n        }),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    List<Widget> selectActions = [\n      IconButton(\n          icon: const Icon(Icons.select_all),\n          tooltip: \"Select All\".tl,\n          onPressed: selectAll\n      ),\n      IconButton(\n          icon: const Icon(Icons.deselect),\n          tooltip: \"Deselect\".tl,\n          onPressed: deSelect\n      ),\n      IconButton(\n          icon: const Icon(Icons.flip),\n          tooltip: \"Invert Selection\".tl,\n          onPressed: invertSelection\n      ),\n      IconButton(\n        icon: const Icon(Icons.delete),\n        tooltip: \"Delete\".tl,\n        onPressed: selectedComics.isEmpty\n            ? null\n            : () {\n                final comicsToDelete = List<History>.from(selectedComics.keys);\n                setState(() {\n                  multiSelectMode = false;\n                  selectedComics.clear();\n                });\n\n                for (final comic in comicsToDelete) {\n                  _removeHistory(comic);\n                }\n              },\n      ),\n    ];\n\n    List<Widget> normalActions = [\n      IconButton(\n        icon: const Icon(Icons.refresh),\n        tooltip: 'Refresh All Histories'.tl,\n        onPressed: _refreshAllHistories,\n      ),\n      IconButton(\n        icon: const Icon(Icons.checklist),\n        tooltip: multiSelectMode ? \"Exit Multi-Select\".tl : \"Multi-Select\".tl,\n        onPressed: () {\n          setState(() {\n            multiSelectMode = !multiSelectMode;\n          });\n        },\n      ),\n      Tooltip(\n        message: 'Clear History'.tl,\n        child: Flyout(\n          controller: controller,\n          flyoutBuilder: (context) {\n            return FlyoutContent(\n              title: 'Clear History'.tl,\n              content: Text('Are you sure you want to clear your history?'.tl),\n              actions: [\n                Button.outlined(\n                  onPressed: () {\n                    HistoryManager().clearUnfavoritedHistory();\n                    context.pop();\n                  },\n                  child: Text('Clear Unfavorited'.tl),\n                ),\n                const SizedBox(width: 4),\n                Button.filled(\n                  color: context.colorScheme.error,\n                  onPressed: () {\n                    HistoryManager().clearHistory();\n                    context.pop();\n                  },\n                  child: Text('Clear'.tl),\n                ),\n              ],\n            );\n          },\n          child: IconButton(\n            icon: const Icon(Icons.clear_all),\n            onPressed: () {\n              controller.show();\n            },\n          ),\n        ),\n      ),\n    ];\n\n    return PopScope(\n      canPop: !multiSelectMode,\n      onPopInvokedWithResult: (didPop, result) {\n        if (multiSelectMode) {\n          setState(() {\n            multiSelectMode = false;\n            selectedComics.clear();\n          });\n        }\n      },\n      child: Scaffold(\n        body: SmoothCustomScrollView(\n          slivers: [\n            SliverAppbar(\n              leading: Tooltip(\n                message: multiSelectMode ? \"Cancel\".tl : \"Back\".tl,\n                child: IconButton(\n                  onPressed: () {\n                    if (multiSelectMode) {\n                      setState(() {\n                        multiSelectMode = false;\n                        selectedComics.clear();\n                      });\n                    } else {\n                      context.pop();\n                    }\n                  },\n                  icon: multiSelectMode\n                      ? const Icon(Icons.close)\n                      : const Icon(Icons.arrow_back),\n                ),\n              ),\n              title: multiSelectMode\n                  ? Text(selectedComics.length.toString())\n                  : Text('History'.tl),\n              actions: multiSelectMode ? selectActions : normalActions,\n            ),\n            SliverGridComics(\n              comics: comics,\n              selections: selectedComics,\n              onLongPressed: null,\n              onTap: multiSelectMode\n                  ? (c, heroID) {\n                      setState(() {\n                        if (selectedComics.containsKey(c as History)) {\n                          selectedComics.remove(c);\n                        } else {\n                          selectedComics[c] = true;\n                        }\n                        if (selectedComics.isEmpty) {\n                          multiSelectMode = false;\n                        }\n                      });\n                    }\n                  : null,\n              badgeBuilder: (c) {\n                return ComicSource.find(c.sourceKey)?.name;\n              },\n              menuBuilder: (c) {\n                return [\n                  MenuEntry(\n                    icon: Icons.refresh,\n                    text: 'Refresh Info'.tl,\n                    onClick: () {\n                      _refreshHistory(c as History);\n                    },\n                  ),\n                  MenuEntry(\n                    icon: Icons.remove,\n                    text: 'Remove'.tl,\n                    color: context.colorScheme.error,\n                    onClick: () {\n                      _removeHistory(c as History);\n                    },\n                  ),\n                ];\n              },\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  String getDescription(History h) {\n    var res = \"\";\n    if (h.ep >= 1) {\n      res += \"Chapter @ep\".tlParams({\n        \"ep\": h.ep,\n      });\n    }\n    if (h.page >= 1) {\n      if (h.ep >= 1) {\n        res += \" - \";\n      }\n      res += \"Page @page\".tlParams({\n        \"page\": h.page,\n      });\n    }\n    return res;\n  }\n}\n"
  },
  {
    "path": "lib/pages/home_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:sliver_tools/sliver_tools.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/pages/comic_details_page/comic_page.dart';\nimport 'package:venera/pages/comic_source_page.dart';\nimport 'package:venera/pages/downloading_page.dart';\nimport 'package:venera/pages/follow_updates_page.dart';\nimport 'package:venera/pages/history_page.dart';\nimport 'package:venera/pages/image_favorites_page/image_favorites_page.dart';\nimport 'package:venera/pages/search_page.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/utils/import_comic.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\n\nimport 'local_comics_page.dart';\n\nclass HomePage extends StatelessWidget {\n  const HomePage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    var widget = SmoothCustomScrollView(\n      slivers: [\n        SliverPadding(padding: EdgeInsets.only(top: context.padding.top)),\n        const _SearchBar(),\n        const _SyncDataWidget(),\n        const _History(),\n        const _Local(),\n        const FollowUpdatesWidget(),\n        const _ComicSourceWidget(),\n        const ImageFavorites(),\n        SliverPadding(padding: EdgeInsets.only(top: context.padding.bottom)),\n      ],\n    );\n    return context.width > changePoint ? widget.paddingHorizontal(8) : widget;\n  }\n}\n\nclass _SearchBar extends StatelessWidget {\n  const _SearchBar();\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        height: App.isMobile ? 52 : 46,\n        width: double.infinity,\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        child: Material(\n          color: context.colorScheme.surfaceContainerHigh,\n          borderRadius: BorderRadius.circular(32),\n          child: InkWell(\n            borderRadius: BorderRadius.circular(32),\n            onTap: () {\n              context.to(() => const SearchPage());\n            },\n            child: Row(\n              children: [\n                const SizedBox(width: 16),\n                const Icon(Icons.search),\n                const SizedBox(width: 8),\n                Text('Search'.tl, style: ts.s16),\n                const Spacer(),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass _SyncDataWidget extends StatefulWidget {\n  const _SyncDataWidget();\n\n  @override\n  State<_SyncDataWidget> createState() => _SyncDataWidgetState();\n}\n\nclass _SyncDataWidgetState extends State<_SyncDataWidget>\n    with WidgetsBindingObserver {\n  @override\n  void initState() {\n    super.initState();\n    DataSync().addListener(update);\n    WidgetsBinding.instance.addObserver(this);\n    lastCheck = DateTime.now();\n  }\n\n  void update() {\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    DataSync().removeListener(update);\n    WidgetsBinding.instance.removeObserver(this);\n  }\n\n  late DateTime lastCheck;\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    super.didChangeAppLifecycleState(state);\n    if (state == AppLifecycleState.resumed) {\n      if (DateTime.now().difference(lastCheck) > const Duration(minutes: 10)) {\n        lastCheck = DateTime.now();\n        DataSync().downloadData();\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n    if (!DataSync().isEnabled) {\n      child = const SliverPadding(padding: EdgeInsets.zero);\n    } else if (DataSync().isUploading || DataSync().isDownloading) {\n      child = SliverToBoxAdapter(\n        child: Container(\n          margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n          decoration: BoxDecoration(\n            border: Border.all(\n              color: Theme.of(context).colorScheme.primary,\n            ),\n            borderRadius: BorderRadius.circular(8),\n          ),\n          child: ListTile(\n            leading: const Icon(Icons.sync),\n            title: Text('Syncing Data'.tl),\n            trailing: const CircularProgressIndicator(strokeWidth: 2)\n                .fixWidth(18)\n                .fixHeight(18),\n          ),\n        ),\n      );\n    } else {\n      child = SliverToBoxAdapter(\n        child: Container(\n          margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n          decoration: BoxDecoration(\n            border: Border.all(\n              color: Theme.of(context).colorScheme.outlineVariant,\n            ),\n            borderRadius: BorderRadius.circular(8),\n          ),\n          child: ListTile(\n            leading: const Icon(Icons.sync),\n            title: Text('Sync Data'.tl),\n            trailing: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                if (DataSync().lastError != null)\n                  InkWell(\n                    borderRadius: BorderRadius.circular(16),\n                    onTap: () {\n                      showDialogMessage(\n                        App.rootContext,\n                        \"Error\".tl,\n                        DataSync().lastError!,\n                      );\n                    },\n                    child: Container(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: 8,\n                        vertical: 4,\n                      ),\n                      decoration: BoxDecoration(\n                        color: context.colorScheme.errorContainer,\n                        borderRadius: BorderRadius.circular(16),\n                      ),\n                      child: Row(\n                        children: [\n                          Icon(\n                            Icons.error_outline,\n                            color: Colors.red,\n                            size: 18,\n                          ),\n                          const SizedBox(width: 4),\n                          Text('Error'.tl, style: ts.s12),\n                        ],\n                      ),\n                    ),\n                  ).paddingRight(4),\n                IconButton(\n                  icon: const Icon(Icons.cloud_upload_outlined),\n                  onPressed: () async {\n                    DataSync().uploadData();\n                  },\n                ),\n                IconButton(\n                  icon: const Icon(Icons.cloud_download_outlined),\n                  onPressed: () async {\n                    DataSync().downloadData();\n                  },\n                ),\n              ],\n            ),\n          ),\n        ),\n      );\n    }\n    return SliverAnimatedPaintExtent(\n      duration: const Duration(milliseconds: 200),\n      child: child,\n    );\n  }\n}\n\nclass _History extends StatefulWidget {\n  const _History();\n\n  @override\n  State<_History> createState() => _HistoryState();\n}\n\nclass _HistoryState extends State<_History> {\n  late List<History> history;\n  late int count;\n\n  void onHistoryChange() {\n    if (mounted) {\n      setState(() {\n        history = HistoryManager().getRecent();\n        count = HistoryManager().count();\n      });\n    }\n  }\n\n  @override\n  void initState() {\n    history = HistoryManager().getRecent();\n    count = HistoryManager().count();\n    HistoryManager().addListener(onHistoryChange);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    HistoryManager().removeListener(onHistoryChange);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: () {\n            context.to(() => const HistoryPage());\n          },\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SizedBox(\n                height: 56,\n                child: Row(\n                  children: [\n                    Center(\n                      child: Text('History'.tl, style: ts.s18),\n                    ),\n                    Container(\n                      margin: const EdgeInsets.symmetric(horizontal: 8),\n                      padding: const EdgeInsets.symmetric(\n                          horizontal: 8, vertical: 2),\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child: Text(count.toString(), style: ts.s12),\n                    ),\n                    const Spacer(),\n                    const Icon(Icons.arrow_right),\n                  ],\n                ),\n              ).paddingHorizontal(16),\n              if (history.isNotEmpty)\n                SizedBox(\n                  height: 136,\n                  child: ListView.builder(\n                    scrollDirection: Axis.horizontal,\n                    itemCount: history.length,\n                    itemBuilder: (context, index) {\n                      final heroID = history[index].id.hashCode;\n                      return SimpleComicTile(\n                        comic: history[index],\n                        heroID: heroID,\n                        onTap: () {\n                          context.to(\n                            () => ComicPage(\n                              id: history[index].id,\n                              sourceKey: history[index].type.sourceKey,\n                              cover: history[index].cover,\n                              title: history[index].title,\n                              heroID: heroID,\n                            ),\n                          );\n                        },\n                      ).paddingHorizontal(8).paddingVertical(2);\n                    },\n                  ),\n                ).paddingHorizontal(8).paddingBottom(16),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass _Local extends StatefulWidget {\n  const _Local();\n\n  @override\n  State<_Local> createState() => _LocalState();\n}\n\nclass _LocalState extends State<_Local> {\n  late List<LocalComic> local;\n  late int count;\n\n  void onLocalComicsChange() {\n    setState(() {\n      local = LocalManager().getRecent();\n      count = LocalManager().count;\n    });\n  }\n\n  @override\n  void initState() {\n    local = LocalManager().getRecent();\n    count = LocalManager().count;\n    LocalManager().addListener(onLocalComicsChange);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    LocalManager().removeListener(onLocalComicsChange);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: () {\n            context.to(() => const LocalComicsPage());\n          },\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SizedBox(\n                height: 56,\n                child: Row(\n                  children: [\n                    Center(\n                      child: Text('Local'.tl, style: ts.s18),\n                    ),\n                    Container(\n                      margin: const EdgeInsets.symmetric(horizontal: 8),\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: 8,\n                        vertical: 2,\n                      ),\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child: Text(count.toString(), style: ts.s12),\n                    ),\n                    const Spacer(),\n                    const Icon(Icons.arrow_right),\n                  ],\n                ),\n              ).paddingHorizontal(16),\n              if (local.isNotEmpty)\n                SizedBox(\n                  height: 136,\n                  child: ListView.builder(\n                    scrollDirection: Axis.horizontal,\n                    itemCount: local.length,\n                    itemBuilder: (context, index) {\n                      final heroID = local[index].id.hashCode;\n                      return SimpleComicTile(\n                        comic: local[index],\n                        heroID: heroID,\n                        onTap: () {\n                          context.to(\n                            () => ComicPage(\n                              id: local[index].id,\n                              sourceKey: local[index].sourceKey,\n                              cover: local[index].cover,\n                              title: local[index].title,\n                              heroID: heroID,\n                            ),\n                          );\n                        },\n                      ).paddingHorizontal(8).paddingVertical(2);\n                    },\n                  ),\n                ).paddingHorizontal(8),\n              Row(\n                children: [\n                  if (LocalManager().downloadingTasks.isNotEmpty)\n                    Button.outlined(\n                      child: Row(\n                        children: [\n                          if (LocalManager().downloadingTasks.first.isPaused)\n                            const Icon(Icons.pause_circle_outline, size: 18)\n                          else\n                            const _AnimatedDownloadingIcon(),\n                          const SizedBox(width: 8),\n                          Text(\"@a Tasks\".tlParams({\n                            'a': LocalManager().downloadingTasks.length,\n                          })),\n                        ],\n                      ),\n                      onPressed: () {\n                        showPopUpWidget(context, const DownloadingPage());\n                      },\n                    ),\n                  const Spacer(),\n                  Button.filled(\n                    onPressed: import,\n                    child: Text(\"Import\".tl),\n                  ),\n                ],\n              ).paddingHorizontal(16).paddingVertical(8),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void import() {\n    showDialog(\n      barrierDismissible: false,\n      context: App.rootContext,\n      builder: (context) {\n        return const _ImportComicsWidget();\n      },\n    );\n  }\n}\n\nclass _ImportComicsWidget extends StatefulWidget {\n  const _ImportComicsWidget();\n\n  @override\n  State<_ImportComicsWidget> createState() => _ImportComicsWidgetState();\n}\n\nclass _ImportComicsWidgetState extends State<_ImportComicsWidget> {\n  int type = 0;\n\n  bool loading = false;\n\n  var key = GlobalKey();\n\n  var height = 200.0;\n\n  var folders = LocalFavoritesManager().folderNames;\n\n  String? selectedFolder;\n\n  bool copyToLocalFolder = true;\n\n  bool cancelled = false;\n\n  @override\n  void dispose() {\n    loading = false;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    String info = [\n      \"Select a directory which contains the comic files.\".tl,\n      \"Select a directory which contains the comic directories.\".tl,\n      \"Select an archive file (cbz, zip, 7z, cb7)\".tl,\n      \"Select a directory which contains multiple archive files.\".tl,\n      \"Select an EhViewer database and a download folder.\".tl,\n      \"Scan the current local path and restore the local database.\".tl,\n    ][type];\n    List<String> importMethods = [\n      \"Single Comic\".tl,\n      \"Multiple Comics\".tl,\n      \"An archive file\".tl,\n      \"Multiple archive files\".tl,\n      \"EhViewer downloads\".tl,\n      \"Restore local downloads\".tl,\n    ];\n\n    return ContentDialog(\n      dismissible: !loading,\n      title: \"Import Comics\".tl,\n      content: loading\n          ? SizedBox(\n              width: 600,\n              height: height,\n              child: const Center(\n                child: CircularProgressIndicator(),\n              ),\n            )\n          : RadioGroup<int>(\n              groupValue: type,\n              onChanged: (value) {\n                setState(() {\n                  type = value ?? type;\n                  if (type == 5) {\n                    selectedFolder = null;\n                  }\n                });\n              },\n              child: Column(\n                key: key,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  const SizedBox(width: 600),\n                  ...List.generate(importMethods.length, (index) {\n                    return RadioListTile<int>(\n                      title: Text(importMethods[index]),\n                      value: index,\n                    );\n                  }),\n                  if (type != 4 && type != 5)\n                    ListTile(\n                      title: Text(\"Add to favorites\".tl),\n                      trailing: Select(\n                        current: selectedFolder,\n                        values: folders,\n                        minWidth: 112,\n                        onTap: (v) {\n                          setState(() {\n                            selectedFolder = folders[v];\n                          });\n                        },\n                      ),\n                    ).paddingHorizontal(8),\n                  if (!App.isIOS &&\n                      !App.isMacOS &&\n                      type != 2 &&\n                      type != 3 &&\n                      type != 5)\n                    CheckboxListTile(\n                        enabled: true,\n                        title: Text(\"Copy to app local path\".tl),\n                        value: copyToLocalFolder,\n                        onChanged: (v) {\n                          setState(() {\n                            copyToLocalFolder = !copyToLocalFolder;\n                          });\n                        }).paddingHorizontal(8),\n                  const SizedBox(height: 8),\n                  Text(info).paddingHorizontal(24),\n                ],\n              ),\n          ),\n      actions: [\n        Button.text(\n          child: Row(\n            children: [\n              Icon(\n                Icons.help_outline,\n                size: 18,\n                color: context.colorScheme.primary,\n              ),\n              const SizedBox(width: 8),\n              Text(\"help\".tl),\n            ],\n          ),\n          onPressed: () {\n            launchUrlString(\n                \"https://github.com/venera-app/venera/blob/master/doc/import_comic.md\");\n          },\n        ).fixWidth(90).paddingRight(8),\n        Button.filled(\n          isLoading: loading,\n          onPressed: selectAndImport,\n          child: Text(\"Select\".tl),\n        )\n      ],\n    );\n  }\n\n  void selectAndImport() async {\n    height = key.currentContext!.size!.height;\n\n    setState(() {\n      loading = true;\n    });\n    var importer = ImportComic(\n        selectedFolder: selectedFolder, copyToLocal: copyToLocalFolder);\n    var result = switch (type) {\n      0 => await importer.directory(true),\n      1 => await importer.directory(false),\n      2 => await importer.cbz(),\n      3 => await importer.multipleCbz(),\n      4 => await importer.ehViewer(),\n      5 => await importer.localDownloads(),\n      int() => true,\n    };\n    if (result) {\n      context.pop();\n    } else {\n      setState(() {\n        loading = false;\n      });\n    }\n  }\n}\n\nclass _ComicSourceWidget extends StatefulWidget {\n  const _ComicSourceWidget();\n\n  @override\n  State<_ComicSourceWidget> createState() => _ComicSourceWidgetState();\n}\n\nclass _ComicSourceWidgetState extends State<_ComicSourceWidget> {\n  late List<String> comicSources;\n\n  void onComicSourceChange() {\n    setState(() {\n      comicSources = ComicSource.all().map((e) => e.name).toList();\n    });\n  }\n\n  @override\n  void initState() {\n    comicSources = ComicSource.all().map((e) => e.name).toList();\n    ComicSourceManager().addListener(onComicSourceChange);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    ComicSourceManager().removeListener(onComicSourceChange);\n    super.dispose();\n  }\n\n  int get _availableUpdates {\n    int c = 0;\n    ComicSourceManager().availableUpdates.forEach((key, version) {\n      var source = ComicSource.find(key);\n      if (source != null) {\n        if (compareSemVer(version, source.version)) {\n          c++;\n        }\n      }\n    });\n    return c;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: () {\n            context.to(() => const ComicSourcePage());\n          },\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SizedBox(\n                height: 56,\n                child: Row(\n                  children: [\n                    Center(\n                      child: Text('Comic Source'.tl, style: ts.s18),\n                    ),\n                    Container(\n                      margin: const EdgeInsets.symmetric(horizontal: 8),\n                      padding: const EdgeInsets.symmetric(\n                          horizontal: 8, vertical: 2),\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.secondaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child:\n                          Text(comicSources.length.toString(), style: ts.s12),\n                    ),\n                    const Spacer(),\n                    const Icon(Icons.arrow_right),\n                  ],\n                ),\n              ).paddingHorizontal(16),\n              if (comicSources.isNotEmpty)\n                SizedBox(\n                  width: double.infinity,\n                  child: Wrap(\n                    runSpacing: 8,\n                    spacing: 8,\n                    children: comicSources.map((e) {\n                      return Container(\n                        padding: const EdgeInsets.symmetric(\n                            horizontal: 8, vertical: 2),\n                        decoration: BoxDecoration(\n                          color:\n                              Theme.of(context).colorScheme.secondaryContainer,\n                          borderRadius: BorderRadius.circular(8),\n                        ),\n                        child: Text(e),\n                      );\n                    }).toList(),\n                  ).paddingHorizontal(16).paddingBottom(16),\n                ),\n              if (_availableUpdates > 0)\n                Container(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 8,\n                    vertical: 4,\n                  ),\n                  decoration: BoxDecoration(\n                    border: Border.all(\n                      color: context.colorScheme.outlineVariant,\n                      width: 0.6,\n                    ),\n                    borderRadius: BorderRadius.circular(12),\n                  ),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(\n                        Icons.update,\n                        color: context.colorScheme.primary,\n                        size: 20,\n                      ),\n                      const SizedBox(width: 8),\n                      Text(\n                        \"@c updates\".tlParams({\n                          'c': _availableUpdates,\n                        }),\n                        style: ts.withColor(context.colorScheme.primary),\n                      ),\n                    ],\n                  ),\n                )\n                    .toAlign(Alignment.centerLeft)\n                    .paddingHorizontal(16)\n                    .paddingBottom(8),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass _AnimatedDownloadingIcon extends StatefulWidget {\n  const _AnimatedDownloadingIcon();\n\n  @override\n  State<_AnimatedDownloadingIcon> createState() =>\n      __AnimatedDownloadingIconState();\n}\n\nclass __AnimatedDownloadingIconState extends State<_AnimatedDownloadingIcon>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(\n      lowerBound: -1,\n      vsync: this,\n      duration: const Duration(milliseconds: 2000),\n    )..repeat();\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnimatedBuilder(\n      animation: _controller,\n      builder: (context, child) {\n        return Container(\n          width: 18,\n          height: 18,\n          decoration: BoxDecoration(\n            border: Border(\n              bottom: BorderSide(\n                color: Theme.of(context).colorScheme.primary,\n                width: 2,\n              ),\n            ),\n          ),\n          clipBehavior: Clip.hardEdge,\n          child: Transform.translate(\n            offset: Offset(0, 18 * _controller.value),\n            child: Icon(\n              Icons.arrow_downward,\n              size: 16,\n              color: Theme.of(context).colorScheme.primary,\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n\nclass ImageFavorites extends StatefulWidget {\n  const ImageFavorites({super.key});\n\n  @override\n  State<ImageFavorites> createState() => _ImageFavoritesState();\n}\n\nclass _ImageFavoritesState extends State<ImageFavorites> {\n  ImageFavoritesComputed? imageFavoritesCompute;\n\n  int displayType = 0;\n\n  void refreshImageFavorites() async {\n    try {\n      imageFavoritesCompute =\n          await ImageFavoriteManager.computeImageFavorites();\n      if (mounted) {\n        setState(() {});\n      }\n    } catch (e, stackTrace) {\n      Log.error(\"Unhandled Exception\", e.toString(), stackTrace);\n    }\n  }\n\n  @override\n  void initState() {\n    refreshImageFavorites();\n    ImageFavoriteManager().addListener(refreshImageFavorites);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    ImageFavoriteManager().removeListener(refreshImageFavorites);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    bool hasData =\n        imageFavoritesCompute != null && !imageFavoritesCompute!.isEmpty;\n    return SliverToBoxAdapter(\n      child: Container(\n        margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n        decoration: BoxDecoration(\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: InkWell(\n          borderRadius: BorderRadius.circular(8),\n          onTap: () {\n            context.to(\n              () => const ImageFavoritesPage()\n            );\n          },\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              SizedBox(\n                height: 56,\n                child: Row(\n                  children: [\n                    Center(\n                      child: Text('Image Favorites'.tl, style: ts.s18),\n                    ),\n                    if (hasData)\n                      Container(\n                        margin: const EdgeInsets.symmetric(horizontal: 8),\n                        padding: const EdgeInsets.symmetric(\n                            horizontal: 8, vertical: 2),\n                        decoration: BoxDecoration(\n                          color:\n                              Theme.of(context).colorScheme.secondaryContainer,\n                          borderRadius: BorderRadius.circular(8),\n                        ),\n                        child: Text(\n                          imageFavoritesCompute!.count.toString(),\n                          style: ts.s12,\n                        ),\n                      ),\n                    const Spacer(),\n                    const Icon(Icons.arrow_right),\n                  ],\n                ),\n              ).paddingHorizontal(16),\n              if (hasData)\n                Row(\n                  children: [\n                    const Spacer(),\n                    buildTypeButton(0, \"Tags\".tl),\n                    const Spacer(),\n                    buildTypeButton(1, \"Authors\".tl),\n                    const Spacer(),\n                    buildTypeButton(2, \"Comics\".tl),\n                    const Spacer(),\n                  ],\n                ),\n              if (hasData) const SizedBox(height: 8),\n              if (hasData)\n                buildChart(switch (displayType) {\n                  0 => imageFavoritesCompute!.tags,\n                  1 => imageFavoritesCompute!.authors,\n                  2 => imageFavoritesCompute!.comics,\n                  _ => [],\n                })\n                    .paddingHorizontal(16)\n                    .paddingBottom(16),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildTypeButton(int type, String text) {\n    const radius = 24.0;\n    return InkWell(\n      borderRadius: BorderRadius.circular(radius),\n      onTap: () async {\n        setState(() {\n          displayType = type;\n        });\n        await Future.delayed(const Duration(milliseconds: 20));\n        var scrollController = ScrollState.of(context).controller;\n        scrollController.animateTo(\n          scrollController.position.maxScrollExtent,\n          duration: const Duration(milliseconds: 200),\n          curve: Curves.ease,\n        );\n      },\n      child: AnimatedContainer(\n        width: 96,\n        padding: const EdgeInsets.symmetric(vertical: 4),\n        decoration: BoxDecoration(\n          color:\n              displayType == type ? context.colorScheme.primaryContainer : null,\n          border: Border.all(\n            color: Theme.of(context).colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n          borderRadius: BorderRadius.circular(radius),\n        ),\n        duration: const Duration(milliseconds: 200),\n        child: Center(\n          child: Text(\n            text,\n            style: ts.s16,\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildChart(List<TextWithCount> data) {\n    if (data.isEmpty) {\n      return const SizedBox();\n    }\n    var maxCount = data.map((e) => e.count).reduce((a, b) => a > b ? a : b);\n    return ConstrainedBox(\n      constraints: BoxConstraints(\n        maxHeight: 164,\n      ),\n      child: SingleChildScrollView(\n        child: Column(\n          key: ValueKey(displayType),\n          children: data.map((e) {\n            return _ChartLine(\n              text: e.text,\n              count: e.count,\n              maxCount: maxCount,\n              enableTranslation: displayType != 2,\n              onTap: (text) {\n                context.to(\n                  () => ImageFavoritesPage(initialKeyword: text),\n                );\n              },\n            );\n          }).toList(),\n        ),\n      ),\n    );\n  }\n}\n\nclass _ChartLine extends StatefulWidget {\n  const _ChartLine({\n    required this.text,\n    required this.count,\n    required this.maxCount,\n    required this.enableTranslation,\n    this.onTap,\n  });\n\n  final String text;\n\n  final int count;\n\n  final int maxCount;\n\n  final bool enableTranslation;\n\n  final void Function(String text)? onTap;\n\n  @override\n  State<_ChartLine> createState() => __ChartLineState();\n}\n\nclass __ChartLineState extends State<_ChartLine>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 200),\n      value: 0,\n    )..forward();\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var text = widget.text;\n    var enableTranslation =\n        App.locale.countryCode == 'CN' && widget.enableTranslation;\n    if (enableTranslation) {\n      text = text.translateTagsToCN;\n    }\n    if (widget.enableTranslation && text.contains(':')) {\n      text = text.split(':').last;\n    }\n    return Row(\n      children: [\n        InkWell(\n          borderRadius: BorderRadius.circular(4),\n          onTap: () {\n            widget.onTap?.call(widget.text);\n          },\n          child: Text(\n            text,\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n          )\n              .paddingHorizontal(4)\n              .toAlign(Alignment.centerLeft)\n              .fixWidth(context.width > 600 ? 120 : 80)\n              .fixHeight(double.infinity),\n        ),\n        const SizedBox(width: 8),\n        Expanded(\n          child: LayoutBuilder(builder: (context, constrains) {\n            var width = constrains.maxWidth * widget.count / widget.maxCount;\n            return AnimatedBuilder(\n              animation: _controller,\n              builder: (context, child) {\n                return Container(\n                  width: width * _controller.value,\n                  height: 18,\n                  decoration: BoxDecoration(\n                    borderRadius: BorderRadius.circular(2),\n                    gradient: LinearGradient(\n                      colors: context.isDarkMode\n                          ? [\n                              Colors.blue.shade800,\n                              Colors.blue.shade500,\n                            ]\n                          : [\n                              Colors.blue.shade300,\n                              Colors.blue.shade600,\n                            ],\n                    ),\n                  ),\n                ).toAlign(Alignment.centerLeft);\n              },\n            );\n          }),\n        ),\n        const SizedBox(width: 8),\n        Text(\n          widget.count.toString(),\n          style: ts.s12,\n        ).fixWidth(context.width > 600 ? 60 : 30),\n      ],\n    ).fixHeight(28);\n  }\n}\n"
  },
  {
    "path": "lib/pages/image_favorites_page/image_favorites_item.dart",
    "content": "part of 'image_favorites_page.dart';\n\nclass _ImageFavoritesItem extends StatefulWidget {\n  const _ImageFavoritesItem({\n    required this.imageFavoritesComic,\n    required this.selectedImageFavorites,\n    required this.addSelected,\n    required this.multiSelectMode,\n    required this.finalImageFavoritesComicList,\n  });\n\n  final ImageFavoritesComic imageFavoritesComic;\n  final Function(ImageFavorite) addSelected;\n  final Map<ImageFavorite, bool> selectedImageFavorites;\n  final List<ImageFavoritesComic> finalImageFavoritesComicList;\n  final bool multiSelectMode;\n\n  @override\n  State<_ImageFavoritesItem> createState() => _ImageFavoritesItemState();\n}\n\nclass _ImageFavoritesItemState extends State<_ImageFavoritesItem> {\n  late final imageFavorites = widget.imageFavoritesComic.images.toList();\n\n  void goComicInfo(ImageFavoritesComic comic) {\n    App.mainNavigatorKey?.currentContext?.to(() => ComicPage(\n          id: comic.id,\n          sourceKey: comic.sourceKey,\n        ));\n  }\n\n  void goReaderPage(ImageFavoritesComic comic, int ep, int page) {\n    App.rootContext.to(\n      () => ReaderWithLoading(\n        id: comic.id,\n        sourceKey: comic.sourceKey,\n        initialEp: ep,\n        initialPage: page,\n      ),\n    );\n  }\n\n  void goPhotoView(ImageFavorite imageFavorite) {\n    Navigator.of(App.rootContext).push(MaterialPageRoute(\n        builder: (context) => ImageFavoritesPhotoView(\n              comic: widget.imageFavoritesComic,\n              imageFavorite: imageFavorite,\n            )));\n  }\n\n  void copyTitle() {\n    Clipboard.setData(ClipboardData(text: widget.imageFavoritesComic.title));\n    App.rootContext.showMessage(message: 'Copy the title successfully'.tl);\n  }\n\n  void onLongPress() {\n    var renderBox = context.findRenderObject() as RenderBox;\n    var size = renderBox.size;\n    var location = renderBox.localToGlobal(\n      Offset((size.width - 242) / 2, size.height / 2),\n    );\n    showMenu(location, context);\n  }\n\n  void onSecondaryTap(TapDownDetails details) {\n    showMenu(details.globalPosition, context);\n  }\n\n  void showMenu(Offset location, BuildContext context) {\n    showMenuX(\n      App.rootContext,\n      location,\n      [\n        MenuEntry(\n          icon: Icons.chrome_reader_mode_outlined,\n          text: 'Details'.tl,\n          onClick: () {\n            goComicInfo(widget.imageFavoritesComic);\n          },\n        ),\n        MenuEntry(\n          icon: Icons.copy,\n          text: 'Copy Title'.tl,\n          onClick: () {\n            copyTitle();\n          },\n        ),\n        MenuEntry(\n          icon: Icons.select_all,\n          text: 'Select All'.tl,\n          onClick: () {\n            for (var ele in widget.imageFavoritesComic.images) {\n              widget.addSelected(ele);\n            }\n          },\n        ),\n        MenuEntry(\n          icon: Icons.read_more,\n          text: 'Photo View'.tl,\n          onClick: () {\n            goPhotoView(widget.imageFavoritesComic.images.first);\n          },\n        ),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n      decoration: BoxDecoration(\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n        borderRadius: BorderRadius.circular(8),\n      ),\n      child: InkWell(\n        borderRadius: BorderRadius.circular(8),\n        onSecondaryTapDown: onSecondaryTap,\n        onLongPress: onLongPress,\n        onTap: () {\n          if (widget.multiSelectMode) {\n            for (var ele in widget.imageFavoritesComic.images) {\n              widget.addSelected(ele);\n            }\n          } else {\n            // 单击跳转漫画详情\n            goComicInfo(widget.imageFavoritesComic);\n          }\n        },\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            buildTop(),\n            SizedBox(\n              height: 145,\n              child: ListView.builder(\n                scrollDirection: Axis.horizontal,\n                itemBuilder: buildItem,\n                itemCount: imageFavorites.length,\n              ),\n            ).paddingHorizontal(8),\n            buildBottom(),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildItem(BuildContext context, int index) {\n    var image = imageFavorites[index];\n    bool isSelected = widget.selectedImageFavorites[image] ?? false;\n    int curPage = image.page;\n    String pageText = curPage == firstPage\n        ? '@a Cover'.tlParams({\"a\": image.epName})\n        : curPage.toString();\n\n    return InkWell(\n      onTap: () {\n        // 单击去阅读页面, 跳转到当前点击的page\n        if (widget.multiSelectMode) {\n          widget.addSelected(image);\n        } else {\n          goReaderPage(widget.imageFavoritesComic, image.ep, curPage);\n        }\n      },\n      onLongPress: () {\n        goPhotoView(image);\n      },\n      borderRadius: BorderRadius.circular(8),\n      child: Container(\n        width: 98,\n        height: 128,\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(8),\n          color: isSelected\n              ? Theme.of(context).colorScheme.primaryContainer\n              : null,\n        ),\n        padding: const EdgeInsets.symmetric(horizontal: 4),\n        child: Column(\n          children: [\n            Container(\n              height: 128,\n              decoration: BoxDecoration(\n                borderRadius: BorderRadius.circular(8),\n                color: Theme.of(context).colorScheme.secondaryContainer,\n              ),\n              clipBehavior: Clip.antiAlias,\n              child: Hero(\n                tag: \"${image.sourceKey}${image.ep}${image.page}\",\n                child: AnimatedImage(\n                  image: ImageFavoritesProvider(image),\n                  width: 96,\n                  height: 128,\n                  fit: BoxFit.cover,\n                  filterQuality: FilterQuality.medium,\n                ),\n              ),\n            ),\n            Text(\n              pageText,\n              style: ts.s10,\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            )\n          ],\n        ),\n      ),\n    ).paddingHorizontal(4);\n  }\n\n  Widget buildTop() {\n    return Row(\n      children: [\n        Expanded(\n          child: Text(\n            widget.imageFavoritesComic.title,\n            style: const TextStyle(\n              fontWeight: FontWeight.w500,\n              fontSize: 16.0,\n            ),\n            maxLines: 2,\n            overflow: TextOverflow.ellipsis,\n            softWrap: true,\n          ),\n        ),\n        Container(\n          padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),\n          decoration: BoxDecoration(\n            color: Theme.of(context).colorScheme.secondaryContainer,\n            borderRadius: BorderRadius.circular(8),\n          ),\n          child: Text(\n              \"${imageFavorites.length}/${widget.imageFavoritesComic.maxPageFromEp}\",\n              style: ts.s12),\n        ),\n      ],\n    ).paddingHorizontal(16).paddingVertical(8);\n  }\n\n  Widget buildBottom() {\n    var enableTranslate = App.locale.languageCode == 'zh';\n    String time =\n        DateFormat('yyyy-MM-dd').format(widget.imageFavoritesComic.time);\n    List<String> tags = [];\n    for (var tag in widget.imageFavoritesComic.tags) {\n      var text = enableTranslate ? tag.translateTagsToCN : tag;\n      if (text.contains(':')) {\n        text = text.split(':').last;\n      }\n      tags.add(text);\n      if (tags.length == 5) {\n        break;\n      }\n    }\n    var comicSource = ComicSource.find(widget.imageFavoritesComic.sourceKey);\n    return Row(\n      children: [\n        Text(\n          \"$time | ${comicSource?.name ?? \"Unknown\"}\",\n          textAlign: TextAlign.left,\n          style: const TextStyle(\n            fontSize: 12.0,\n          ),\n        ).paddingRight(8),\n        if (tags.isNotEmpty)\n          Expanded(\n            child: Text(\n              tags\n                  .map((e) => enableTranslate ? e.translateTagsToCN : e)\n                  .join(\" \"),\n              textAlign: TextAlign.right,\n              style: const TextStyle(\n                fontSize: 12.0,\n                overflow: TextOverflow.ellipsis,\n              ),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n          )\n      ],\n    ).paddingHorizontal(8).paddingBottom(8);\n  }\n}\n"
  },
  {
    "path": "lib/pages/image_favorites_page/image_favorites_page.dart",
    "content": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:intl/intl.dart';\nimport 'package:photo_view/photo_view.dart';\nimport 'package:photo_view/photo_view_gallery.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/image_provider/image_favorites_provider.dart';\nimport 'package:venera/pages/comic_details_page/comic_page.dart';\nimport 'package:venera/pages/image_favorites_page/type.dart';\nimport 'package:venera/pages/reader/reader.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/file_type.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\n\npart \"image_favorites_item.dart\";\n\npart \"image_favorites_photo_view.dart\";\n\nclass ImageFavoritesPage extends StatefulWidget {\n  const ImageFavoritesPage({super.key, this.initialKeyword});\n\n  final String? initialKeyword;\n\n  @override\n  State<ImageFavoritesPage> createState() => _ImageFavoritesPageState();\n}\n\nclass _ImageFavoritesPageState extends State<ImageFavoritesPage> {\n  late ImageFavoriteSortType sortType;\n  late TimeRange timeFilterSelect;\n  late int numFilterSelect;\n\n  // 所有的图片收藏\n  List<ImageFavoritesComic> comics = [];\n\n  late var controller =\n      TextEditingController(text: widget.initialKeyword ?? \"\");\n\n  String get keyword => controller.text;\n\n  // 进入关键词搜索模式\n  bool searchMode = false;\n\n  bool multiSelectMode = false;\n\n  // 多选的时候选中的图片\n  Map<ImageFavorite, bool> selectedImageFavorites = {};\n\n  void update() {\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  void updateImageFavorites() async {\n    comics = searchMode\n        ? ImageFavoriteManager().search(keyword)\n        : ImageFavoriteManager().getAll();\n    sortImageFavorites();\n    update();\n  }\n\n  void sortImageFavorites() {\n    comics = searchMode\n        ? ImageFavoriteManager().search(keyword)\n        : ImageFavoriteManager().getAll();\n    // 筛选到最终列表\n    comics = comics.where((ele) {\n      bool isFilter = true;\n      if (timeFilterSelect != TimeRange.all) {\n        isFilter = timeFilterSelect.contains(ele.time);\n      }\n      if (numFilterSelect != numFilterList[0]) {\n        isFilter = ele.images.length > numFilterSelect;\n      }\n      return isFilter;\n    }).toList();\n    // 给列表排序\n    switch (sortType) {\n      case ImageFavoriteSortType.title:\n        comics.sort((a, b) => a.title.compareTo(b.title));\n      case ImageFavoriteSortType.timeAsc:\n        comics.sort((a, b) => a.time.compareTo(b.time));\n      case ImageFavoriteSortType.timeDesc:\n        comics.sort((a, b) => b.time.compareTo(a.time));\n      case ImageFavoriteSortType.maxFavorites:\n        comics.sort((a, b) => b.images.length\n            .compareTo(a.images.length));\n      case ImageFavoriteSortType.favoritesCompareComicPages:\n        comics.sort((a, b) {\n          double tempA = a.images.length / a.maxPageFromEp;\n          double tempB = b.images.length / b.maxPageFromEp;\n          return tempB.compareTo(tempA);\n        });\n    }\n  }\n\n  @override\n  void initState() {\n    if (widget.initialKeyword != null) {\n      searchMode = true;\n    }\n    sortType = ImageFavoriteSortType.values.firstWhereOrNull(\n            (e) => e.value == appdata.implicitData[\"image_favorites_sort\"]) ??\n        ImageFavoriteSortType.title;\n    timeFilterSelect = TimeRange.fromString(\n        appdata.implicitData[\"image_favorites_time_filter\"]);\n    numFilterSelect = appdata.implicitData[\"image_favorites_number_filter\"] ??\n        numFilterList[0];\n    updateImageFavorites();\n    ImageFavoriteManager().addListener(updateImageFavorites);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    ImageFavoriteManager().removeListener(updateImageFavorites);\n    scrollController.dispose();\n    super.dispose();\n  }\n\n  Widget buildMultiSelectMenu() {\n    return MenuButton(entries: [\n      MenuEntry(\n        icon: Icons.delete_outline,\n        text: \"Delete\".tl,\n        onClick: () {\n          ImageFavoriteManager()\n              .deleteImageFavorite(selectedImageFavorites.keys);\n          setState(() {\n            multiSelectMode = false;\n            selectedImageFavorites.clear();\n          });\n        },\n      )\n    ]);\n  }\n\n  var scrollController = ScrollController();\n\n  void selectAll() {\n    for (var c in comics) {\n      for (var i in c.images) {\n        selectedImageFavorites[i] = true;\n      }\n    }\n    update();\n  }\n\n  void deSelect() {\n    setState(() {\n      selectedImageFavorites.clear();\n    });\n  }\n\n  void addSelected(ImageFavorite i) {\n    if (selectedImageFavorites[i] == null) {\n      selectedImageFavorites[i] = true;\n    } else {\n      selectedImageFavorites.remove(i);\n    }\n    if (selectedImageFavorites.isEmpty) {\n      multiSelectMode = false;\n    } else {\n      multiSelectMode = true;\n    }\n    update();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    List<Widget> selectActions = [\n      IconButton(\n          icon: const Icon(Icons.select_all),\n          tooltip: \"Select All\".tl,\n          onPressed: selectAll),\n      IconButton(\n          icon: const Icon(Icons.deselect),\n          tooltip: \"Deselect\".tl,\n          onPressed: deSelect),\n      buildMultiSelectMenu(),\n    ];\n\n    var scrollWidget = SmoothCustomScrollView(\n      controller: scrollController,\n      slivers: [\n        if (!searchMode && !multiSelectMode)\n          SliverAppbar(\n            title: Text(\"Image Favorites\".tl),\n            actions: [\n              Tooltip(\n                message: \"Search\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.search),\n                  onPressed: () {\n                    setState(() {\n                      searchMode = true;\n                    });\n                  },\n                ),\n              ),\n              Tooltip(\n                message: \"Sort\".tl,\n                child: IconButton(\n                  isSelected: timeFilterSelect != TimeRange.all ||\n                      numFilterSelect != numFilterList[0],\n                  icon: const Icon(Icons.sort_rounded),\n                  onPressed: sort,\n                ),\n              ),\n              Tooltip(\n                message: multiSelectMode\n                    ? \"Exit Multi-Select\".tl\n                    : \"Multi-Select\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.checklist),\n                  onPressed: () {\n                    setState(() {\n                      multiSelectMode = !multiSelectMode;\n                    });\n                  },\n                ),\n              ),\n            ],\n          )\n        else if (multiSelectMode)\n          SliverAppbar(\n            leading: Tooltip(\n              message: \"Cancel\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.close),\n                onPressed: () {\n                  setState(() {\n                    multiSelectMode = false;\n                    selectedImageFavorites.clear();\n                  });\n                },\n              ),\n            ),\n            title: Text(selectedImageFavorites.length.toString()),\n            actions: selectActions,\n          )\n        else if (searchMode)\n          SliverAppbar(\n            leading: Tooltip(\n              message: \"Cancel\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.close),\n                onPressed: () {\n                  controller.clear();\n                  setState(() {\n                    searchMode = false;\n                    controller.clear();\n                    updateImageFavorites();\n                  });\n                },\n              ),\n            ),\n            title: TextField(\n              autofocus: true,\n              controller: controller,\n              decoration: InputDecoration(\n                hintText: \"Search\".tl,\n                border: InputBorder.none,\n              ),\n              onChanged: (v) {\n                updateImageFavorites();\n              },\n            ),\n          ),\n        SliverList(\n          delegate: SliverChildBuilderDelegate(\n            (context, index) {\n              return _ImageFavoritesItem(\n                imageFavoritesComic: comics[index],\n                selectedImageFavorites: selectedImageFavorites,\n                addSelected: addSelected,\n                multiSelectMode: multiSelectMode,\n                finalImageFavoritesComicList: comics,\n              );\n            },\n            childCount: comics.length,\n          ),\n        ),\n        SliverPadding(padding: EdgeInsets.only(top: context.padding.bottom)),\n      ],\n    );\n    Widget body = Scrollbar(\n      controller: scrollController,\n      thickness: App.isDesktop ? 8 : 12,\n      radius: const Radius.circular(8),\n      interactive: true,\n      child: ScrollConfiguration(\n        behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),\n        child: context.width > changePoint\n            ? scrollWidget.paddingHorizontal(8)\n            : scrollWidget,\n      ),\n    );\n    return PopScope(\n      canPop: !multiSelectMode && !searchMode,\n      onPopInvokedWithResult: (didPop, result) {\n        if (multiSelectMode) {\n          setState(() {\n            multiSelectMode = false;\n            selectedImageFavorites.clear();\n          });\n        } else if (searchMode) {\n          controller.clear();\n          searchMode = false;\n          updateImageFavorites();\n        }\n      },\n      child: body,\n    );\n  }\n\n  void sort() {\n    showDialog(\n      context: context,\n      builder: (context) {\n        return _ImageFavoritesDialog(\n          initSortType: sortType,\n          initTimeFilterSelect: timeFilterSelect,\n          initNumFilterSelect: numFilterSelect,\n          updateConfig: (sortType, timeFilter, numFilter) {\n            setState(() {\n              this.sortType = sortType;\n              timeFilterSelect = timeFilter;\n              numFilterSelect = numFilter;\n            });\n            sortImageFavorites();\n          },\n        );\n      },\n    );\n  }\n}\n\nclass _ImageFavoritesDialog extends StatefulWidget {\n  const _ImageFavoritesDialog({\n    required this.initSortType,\n    required this.initTimeFilterSelect,\n    required this.initNumFilterSelect,\n    required this.updateConfig,\n  });\n\n  final ImageFavoriteSortType initSortType;\n  final TimeRange initTimeFilterSelect;\n  final int initNumFilterSelect;\n  final Function updateConfig;\n\n  @override\n  State<_ImageFavoritesDialog> createState() => _ImageFavoritesDialogState();\n}\n\nclass _ImageFavoritesDialogState extends State<_ImageFavoritesDialog> {\n  List<String> optionTypes = ['Sort', 'Filter'];\n  late var sortType = widget.initSortType;\n  late var numFilter = widget.initNumFilterSelect;\n  late TimeRangeType timeRangeType;\n  DateTime? start;\n  DateTime? end;\n\n  @override\n  void initState() {\n    super.initState();\n    timeRangeType = switch (widget.initTimeFilterSelect) {\n      TimeRange.all => TimeRangeType.all,\n      TimeRange.lastWeek => TimeRangeType.lastWeek,\n      TimeRange.lastMonth => TimeRangeType.lastMonth,\n      TimeRange.lastHalfYear => TimeRangeType.lastHalfYear,\n      TimeRange.lastYear => TimeRangeType.lastYear,\n      _ => TimeRangeType.custom,\n    };\n    if (timeRangeType == TimeRangeType.custom) {\n      end = widget.initTimeFilterSelect.end;\n      start = end!.subtract(widget.initTimeFilterSelect.duration);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget tabBar = Material(\n      borderRadius: BorderRadius.circular(8),\n      child: AppTabBar(\n        key: PageStorageKey(optionTypes),\n        tabs: optionTypes.map((e) => Tab(text: e.tl, key: Key(e))).toList(),\n      ),\n    ).paddingTop(context.padding.top);\n    return ContentDialog(\n      content: DefaultTabController(\n        length: 2,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            tabBar,\n            TabViewBody(children: [\n              RadioGroup<ImageFavoriteSortType>(\n                groupValue: sortType,\n                onChanged: (v) {\n                  setState(() {\n                    sortType = v ?? sortType;\n                  });\n                },\n                child: Column(\n                  children: ImageFavoriteSortType.values\n                      .map(\n                        (e) => RadioListTile<ImageFavoriteSortType>(\n                          title: Text(e.value.tl),\n                          value: e,\n                        ),\n                      )\n                      .toList(),\n                ),\n              ),\n              Column(\n                children: [\n                  ListTile(\n                    title: Text(\"Time Filter\".tl),\n                    trailing: Select(\n                      current: timeRangeType.value.tl,\n                      values:\n                          TimeRangeType.values.map((e) => e.value.tl).toList(),\n                      minWidth: 64,\n                      onTap: (index) {\n                        setState(() {\n                          timeRangeType = TimeRangeType.values[index];\n                        });\n                      },\n                    ),\n                  ),\n                  if (timeRangeType == TimeRangeType.custom)\n                    Column(\n                      children: [\n                        ListTile(\n                          title: Text(\"Start Time\".tl),\n                          trailing: TextButton(\n                            onPressed: () async {\n                              final date = await showDatePicker(\n                                context: context,\n                                initialDate: start ?? DateTime.now(),\n                                firstDate: DateTime(2000),\n                                lastDate: end ?? DateTime.now(),\n                              );\n                              if (date != null) {\n                                setState(() {\n                                  start = date;\n                                });\n                              }\n                            },\n                            child: Text(start == null\n                                ? \"Select Date\".tl\n                                : DateFormat(\"yyyy-MM-dd\").format(start!)),\n                          ),\n                        ),\n                        ListTile(\n                          title: Text(\"End Time\".tl),\n                          trailing: TextButton(\n                            onPressed: () async {\n                              final date = await showDatePicker(\n                                context: context,\n                                initialDate: end ?? DateTime.now(),\n                                firstDate: start ?? DateTime(2000),\n                                lastDate: DateTime.now(),\n                              );\n                              if (date != null) {\n                                setState(() {\n                                  end = date;\n                                });\n                              }\n                            },\n                            child: Text(end == null\n                                ? \"Select Date\".tl\n                                : DateFormat(\"yyyy-MM-dd\").format(end!)),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ListTile(\n                    title: Text(\"Image Favorites Greater Than\".tl),\n                    trailing: Select(\n                      current: numFilter.toString(),\n                      values: numFilterList.map((e) => e.toString()).toList(),\n                      minWidth: 64,\n                      onTap: (index) {\n                        setState(() {\n                          numFilter = numFilterList[index];\n                        });\n                      },\n                    ),\n                  )\n                ],\n              )\n            ]),\n          ],\n        ),\n      ),\n      actions: [\n        FilledButton(\n          onPressed: () {\n            appdata.implicitData[\"image_favorites_sort\"] = sortType.value;\n            TimeRange timeRange;\n            if (timeRangeType == TimeRangeType.custom) {\n              timeRange = TimeRange(\n                end: end,\n                duration: end!.difference(start!),\n              );\n            } else {\n              timeRange = switch (timeRangeType) {\n                TimeRangeType.all => TimeRange.all,\n                TimeRangeType.lastWeek => TimeRange.lastWeek,\n                TimeRangeType.lastMonth => TimeRange.lastMonth,\n                TimeRangeType.lastHalfYear => TimeRange.lastHalfYear,\n                TimeRangeType.lastYear => TimeRange.lastYear,\n                _ => TimeRange.all,\n              };\n            }\n            appdata.implicitData[\"image_favorites_time_filter\"] =\n                timeRange.toString();\n            appdata.implicitData[\"image_favorites_number_filter\"] = numFilter;\n            appdata.writeImplicitData();\n            if (mounted) {\n              Navigator.pop(context);\n              widget.updateConfig(sortType, timeRange, numFilter);\n            }\n          },\n          child: Text(\"Confirm\".tl),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/image_favorites_page/image_favorites_photo_view.dart",
    "content": "part of 'image_favorites_page.dart';\n\nclass ImageFavoritesPhotoView extends StatefulWidget {\n  const ImageFavoritesPhotoView({\n    super.key,\n    required this.comic,\n    required this.imageFavorite,\n  });\n\n  final ImageFavoritesComic comic;\n  final ImageFavorite imageFavorite;\n\n  @override\n  State<ImageFavoritesPhotoView> createState() =>\n      _ImageFavoritesPhotoViewState();\n}\n\nclass _ImageFavoritesPhotoViewState extends State<ImageFavoritesPhotoView> {\n  late PageController controller;\n  Map<ImageFavorite, bool> cancelImageFavorites = {};\n\n  var images = <ImageFavorite>[];\n\n  int currentPage = 0;\n\n  bool isAppBarShow = false;\n\n  @override\n  void initState() {\n    var current = 0;\n    for (var ep in widget.comic.imageFavoritesEp) {\n      for (var image in ep.imageFavorites) {\n        images.add(image);\n        if (image == widget.imageFavorite) {\n          current = images.length - 1;\n        }\n      }\n    }\n    currentPage = current;\n    controller = PageController(initialPage: current);\n    super.initState();\n  }\n\n  void onPop() {\n    List<ImageFavorite> tempList = cancelImageFavorites.entries\n        .where((e) => e.value == true)\n        .map((e) => e.key)\n        .toList();\n    if (tempList.isNotEmpty) {\n      ImageFavoriteManager().deleteImageFavorite(tempList);\n      showToast(\n          message: \"Delete @a images\".tlParams({'a': tempList.length}),\n          context: context);\n    }\n  }\n\n  PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index) {\n    var image = images[index];\n    return PhotoViewGalleryPageOptions(\n      // 图片加载器 支持本地、网络\n      imageProvider: ImageFavoritesProvider(image),\n      // 初始化大小 全部展示\n      minScale: PhotoViewComputedScale.contained * 1.0,\n      maxScale: PhotoViewComputedScale.covered * 10.0,\n      onTapUp: (context, details, controllerValue) {\n        setState(() {\n          isAppBarShow = !isAppBarShow;\n        });\n      },\n      heroAttributes: PhotoViewHeroAttributes(\n        tag: \"${image.sourceKey}${image.ep}${image.page}\",\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopScope(\n      onPopInvokedWithResult: (bool didPop, Object? result) async {\n        if (didPop) {\n          onPop();\n        }\n      },\n      child: Listener(\n        onPointerSignal: (event) {\n          if (HardwareKeyboard.instance.isControlPressed) {\n            return;\n          }\n          if (event is PointerScrollEvent) {\n            if (event.scrollDelta.dy > 0) {\n              if (controller.page! >= images.length - 1) {\n                return;\n              }\n              controller.nextPage(\n                  duration: Duration(milliseconds: 180), curve: Curves.ease);\n            } else {\n              if (controller.page! <= 0) {\n                return;\n              }\n              controller.previousPage(\n                  duration: Duration(milliseconds: 180), curve: Curves.ease);\n            }\n          }\n        },\n        child: Stack(children: [\n          Positioned.fill(\n            child: PhotoViewGallery.builder(\n              backgroundDecoration: BoxDecoration(\n                color: context.colorScheme.surface,\n              ),\n              builder: _buildItem,\n              itemCount: images.length,\n              loadingBuilder: (context, event) => Center(\n                child: SizedBox(\n                  width: 20.0,\n                  height: 20.0,\n                  child: CircularProgressIndicator(\n                    backgroundColor: context.colorScheme.surfaceContainerHigh,\n                    value: event == null || event.expectedTotalBytes == null\n                        ? null\n                        : event.cumulativeBytesLoaded /\n                            event.expectedTotalBytes!,\n                  ),\n                ),\n              ),\n              pageController: controller,\n              onPageChanged: (index) {\n                setState(() {\n                  currentPage = index;\n                });\n              },\n            ),\n          ),\n          buildPageInfo(),\n          AnimatedPositioned(\n            top: isAppBarShow ? 0 : -(context.padding.top + 52),\n            left: 0,\n            right: 0,\n            duration: Duration(milliseconds: 180),\n            child: buildAppBar(),\n          ),\n        ]),\n      ),\n    );\n  }\n\n  Widget buildPageInfo() {\n    var text = \"${currentPage + 1}/${images.length}\";\n    return Positioned(\n      height: 40,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      child: Center(\n        child: Stack(\n          children: [\n            Text(\n              text,\n              style: TextStyle(\n                fontSize: 14,\n                foreground: Paint()\n                  ..style = PaintingStyle.stroke\n                  ..strokeWidth = 1.4\n                  ..color = context.colorScheme.onInverseSurface,\n              ),\n            ),\n            Text(text),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildAppBar() {\n    return Material(\n      color: context.colorScheme.surface.toOpacity(0.72),\n      child: BlurEffect(\n        child: Container(\n          decoration: BoxDecoration(\n            border: Border(\n              bottom: BorderSide(\n                color: context.colorScheme.outlineVariant,\n                width: 0.5,\n              ),\n            ),\n          ),\n          height: 52,\n          child: Row(\n            children: [\n              const SizedBox(width: 8),\n              IconButton(\n                icon: Icon(Icons.close),\n                onPressed: () {\n                  Navigator.of(context).pop();\n                },\n              ),\n              const SizedBox(width: 8),\n              Expanded(\n                child: Text(\n                  widget.comic.title,\n                  style: TextStyle(fontSize: 18),\n                ),\n              ),\n              IconButton(\n                icon: Icon(Icons.more_vert),\n                onPressed: showMenu,\n              ),\n              const SizedBox(width: 8),\n            ],\n          ),\n        ).paddingTop(context.padding.top),\n      ),\n    );\n  }\n\n  void showMenu() {\n    showMenuX(\n      context,\n      Offset(context.width, context.padding.top),\n      [\n        MenuEntry(\n          icon: Icons.image_outlined,\n          text: \"Save Image\".tl,\n          onClick: () async {\n            var temp = images[currentPage];\n            var imageProvider = ImageFavoritesProvider(temp);\n            var data = await imageProvider.load(null, null);\n            var fileType = detectFileType(data);\n            var fileName = \"${currentPage + 1}.${fileType.ext}\";\n            await saveFile(filename: fileName, data: data);\n          },\n        ),\n        MenuEntry(\n          icon: Icons.menu_book_outlined,\n          text: \"Read\".tl,\n          onClick: () async {\n            var comic = widget.comic;\n            var ep = images[currentPage].ep;\n            var page = images[currentPage].page;\n            App.rootContext.to(\n              () => ReaderWithLoading(\n                id: comic.id,\n                sourceKey: comic.sourceKey,\n                initialEp: ep,\n                initialPage: page,\n              )\n            );\n          },\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/image_favorites_page/type.dart",
    "content": "import 'package:venera/utils/ext.dart';\n\nenum ImageFavoriteSortType {\n  title(\"Title\"),\n  timeAsc(\"Time Asc\"),\n  timeDesc(\"Time Desc\"),\n  maxFavorites(\"Favorite Num\"), // 单本收藏数最多排序\n  favoritesCompareComicPages(\"Favorite Num Compare Comic Pages\"); // 单本收藏数比上总页数\n\n  final String value;\n\n  const ImageFavoriteSortType(this.value);\n}\n\nconst numFilterList = [0, 1, 2, 5, 10, 20, 50, 100];\n\nclass TimeRange {\n  /// End of the range, null means now\n  final DateTime? end;\n\n  /// Duration of the range\n  final Duration duration;\n\n  /// Create a time range\n  const TimeRange({this.end, required this.duration});\n\n  static const all = TimeRange(end: null, duration: Duration.zero);\n\n  static const lastWeek = TimeRange(end: null, duration: Duration(days: 7));\n\n  static const lastMonth = TimeRange(end: null, duration: Duration(days: 30));\n\n  static const lastHalfYear =\n      TimeRange(end: null, duration: Duration(days: 180));\n\n  static const lastYear = TimeRange(end: null, duration: Duration(days: 365));\n\n  @override\n  String toString() {\n    return \"${end?.millisecond}:${duration.inMilliseconds}\";\n  }\n\n  /// Parse a time range from a string, return [TimeRange.all] if failed\n  factory TimeRange.fromString(String? str) {\n    if (str == null) {\n      return TimeRange.all;\n    }\n    final parts = str.split(\":\");\n    if (parts.length != 2 || !parts[0].isInt || !parts[1].isInt) {\n      return TimeRange.all;\n    }\n    final end = parts[0] == \"null\"\n        ? null\n        : DateTime.fromMillisecondsSinceEpoch(int.parse(parts[0]));\n    final duration = Duration(milliseconds: int.parse(parts[1]));\n    return TimeRange(end: end, duration: duration);\n  }\n\n  /// Check if a time is in the range\n  bool contains(DateTime time) {\n    if (end != null && time.isAfter(end!)) {\n      return false;\n    }\n    if (duration == Duration.zero) {\n      return true;\n    }\n    final start = end == null\n        ? DateTime.now().subtract(duration)\n        : end!.subtract(duration);\n    return time.isAfter(start);\n  }\n\n  @override\n  bool operator ==(Object other) {\n    return other is TimeRange && other.end == end && other.duration == duration;\n  }\n\n  @override\n  int get hashCode => end.hashCode ^ duration.hashCode;\n\n  static const List<TimeRange> values = [\n    all,\n    lastWeek,\n    lastMonth,\n    lastHalfYear,\n    lastYear,\n  ];\n}\n\nenum TimeRangeType {\n  all(\"All\"),\n  lastWeek(\"Last Week\"),\n  lastMonth(\"Last Month\"),\n  lastHalfYear(\"Last Half Year\"),\n  lastYear(\"Last Year\"),\n  custom(\"Custom\");\n\n  final String value;\n\n  const TimeRangeType(this.value);\n}\n"
  },
  {
    "path": "lib/pages/local_comics_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/pages/comic_details_page/comic_page.dart';\nimport 'package:venera/pages/downloading_page.dart';\nimport 'package:venera/pages/favorites/favorites_page.dart';\nimport 'package:venera/utils/cbz.dart';\nimport 'package:venera/utils/epub.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/pdf.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\n\nclass LocalComicsPage extends StatefulWidget {\n  const LocalComicsPage({super.key});\n\n  @override\n  State<LocalComicsPage> createState() => _LocalComicsPageState();\n}\n\nclass _LocalComicsPageState extends State<LocalComicsPage> {\n  late List<LocalComic> comics;\n\n  late LocalSortType sortType;\n\n  String keyword = \"\";\n\n  bool searchMode = false;\n\n  bool multiSelectMode = false;\n\n  Map<LocalComic, bool> selectedComics = {};\n\n  void update() {\n    if (keyword.isEmpty) {\n      setState(() {\n        comics = LocalManager().getComics(sortType);\n      });\n    } else {\n      setState(() {\n        comics = LocalManager().search(keyword);\n      });\n    }\n  }\n\n  @override\n  void initState() {\n    var sort = appdata.implicitData[\"local_sort\"] ?? \"name\";\n    sortType = LocalSortType.fromString(sort);\n    comics = LocalManager().getComics(sortType);\n    LocalManager().addListener(update);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    LocalManager().removeListener(update);\n    super.dispose();\n  }\n\n  void sort() {\n    showDialog(\n      context: context,\n      builder: (context) {\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"Sort\".tl,\n            content: RadioGroup<LocalSortType>(\n              groupValue: sortType,\n              onChanged: (v) {\n                setState(() {\n                  sortType = v ?? sortType;\n                });\n              },\n              child: Column(\n                children: [\n                  RadioListTile<LocalSortType>(\n                    title: Text(\"Name\".tl),\n                    value: LocalSortType.name,\n                  ),\n                  RadioListTile<LocalSortType>(\n                    title: Text(\"Date\".tl),\n                    value: LocalSortType.timeAsc,\n                  ),\n                  RadioListTile<LocalSortType>(\n                    title: Text(\"Date Desc\".tl),\n                    value: LocalSortType.timeDesc,\n                  ),\n                ],\n              ),\n            ),\n            actions: [\n              FilledButton(\n                onPressed: () {\n                  appdata.implicitData[\"local_sort\"] = sortType.value;\n                  appdata.writeImplicitData();\n                  Navigator.pop(context);\n                  update();\n                },\n                child: Text(\"Confirm\".tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n  }\n\n  Widget buildMultiSelectMenu() {\n    return MenuButton(entries: [\n      MenuEntry(\n        icon: Icons.delete_outline,\n        text: \"Delete\".tl,\n        onClick: () {\n          deleteComics(selectedComics.keys.toList()).then((value) {\n            if (value) {\n              setState(() {\n                multiSelectMode = false;\n                selectedComics.clear();\n              });\n            }\n          });\n        },\n      ),\n      MenuEntry(\n        icon: Icons.favorite_border,\n        text: \"Add to favorites\".tl,\n        onClick: () {\n          addFavorite(selectedComics.keys.toList());\n        },\n      ),\n      if (selectedComics.length == 1)\n        MenuEntry(\n          icon: Icons.folder_open,\n          text: \"Open Folder\".tl,\n          onClick: () {\n            openComicFolder(selectedComics.keys.first);\n          },\n        ),\n      if (selectedComics.length == 1)\n        MenuEntry(\n          icon: Icons.chrome_reader_mode_outlined,\n          text: \"View Detail\".tl,\n          onClick: () {\n            context.to(() => ComicPage(\n                  id: selectedComics.keys.first.id,\n                  sourceKey: selectedComics.keys.first.sourceKey,\n                ));\n          },\n        ),\n      if (selectedComics.isNotEmpty)\n        ...exportActions(selectedComics.keys.toList()),\n    ]);\n  }\n\n  void selectAll() {\n    setState(() {\n      selectedComics = comics.asMap().map((k, v) => MapEntry(v, true));\n    });\n  }\n\n  void deSelect() {\n    setState(() {\n      selectedComics.clear();\n    });\n  }\n\n  void invertSelection() {\n    setState(() {\n      comics.asMap().forEach((k, v) {\n        selectedComics[v] = !selectedComics.putIfAbsent(v, () => false);\n      });\n      selectedComics.removeWhere((k, v) => !v);\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    List<Widget> selectActions = [\n      IconButton(\n          icon: const Icon(Icons.select_all),\n          tooltip: \"Select All\".tl,\n          onPressed: selectAll),\n      IconButton(\n          icon: const Icon(Icons.deselect),\n          tooltip: \"Deselect\".tl,\n          onPressed: deSelect),\n      IconButton(\n          icon: const Icon(Icons.flip),\n          tooltip: \"Invert Selection\".tl,\n          onPressed: invertSelection),\n      buildMultiSelectMenu(),\n    ];\n\n    List<Widget> normalActions = [\n      Tooltip(\n        message: \"Search\".tl,\n        child: IconButton(\n          icon: const Icon(Icons.search),\n          onPressed: () {\n            setState(() {\n              searchMode = true;\n            });\n          },\n        ),\n      ),\n      Tooltip(\n        message: \"Sort\".tl,\n        child: IconButton(\n          icon: const Icon(Icons.sort),\n          onPressed: sort,\n        ),\n      ),\n      Tooltip(\n        message: \"Downloading\".tl,\n        child: IconButton(\n          icon: const Icon(Icons.download),\n          onPressed: () {\n            showPopUpWidget(context, const DownloadingPage());\n          },\n        ),\n      ),\n    ];\n\n    var body = Scaffold(\n      body: SmoothCustomScrollView(\n        slivers: [\n          if (!searchMode)\n            SliverAppbar(\n              leading: Tooltip(\n                message: multiSelectMode ? \"Cancel\".tl : \"Back\".tl,\n                child: IconButton(\n                  onPressed: () {\n                    if (multiSelectMode) {\n                      setState(() {\n                        multiSelectMode = false;\n                        selectedComics.clear();\n                      });\n                    } else {\n                      context.pop();\n                    }\n                  },\n                  icon: multiSelectMode\n                      ? const Icon(Icons.close)\n                      : const Icon(Icons.arrow_back),\n                ),\n              ),\n              title: multiSelectMode\n                  ? Text(selectedComics.length.toString())\n                  : Text(\"Local\".tl),\n              actions: multiSelectMode ? selectActions : normalActions,\n            )\n          else if (searchMode)\n            SliverAppbar(\n              leading: Tooltip(\n                message: multiSelectMode ? \"Cancel\".tl : \"Cancel\".tl,\n                child: IconButton(\n                  icon: multiSelectMode\n                      ? const Icon(Icons.close)\n                      : const Icon(Icons.close),\n                  onPressed: () {\n                    if (multiSelectMode) {\n                      setState(() {\n                        multiSelectMode = false;\n                        selectedComics.clear();\n                      });\n                    } else {\n                      setState(() {\n                        searchMode = false;\n                        keyword = \"\";\n                        update();\n                      });\n                    }\n                  },\n                ),\n              ),\n              title: multiSelectMode\n                  ? Text(selectedComics.length.toString())\n                  : TextField(\n                      autofocus: true,\n                      decoration: InputDecoration(\n                        hintText: \"Search\".tl,\n                        border: InputBorder.none,\n                      ),\n                      onChanged: (v) {\n                        keyword = v;\n                        update();\n                      },\n                    ),\n              actions: multiSelectMode ? selectActions : null,\n            ),\n          SliverGridComics(\n            comics: comics,\n            selections: selectedComics,\n            onLongPressed: (c, heroID) {\n              setState(() {\n                multiSelectMode = true;\n                selectedComics[c as LocalComic] = true;\n              });\n            },\n            onTap: (c, heroID) {\n              if (multiSelectMode) {\n                setState(() {\n                  if (selectedComics.containsKey(c as LocalComic)) {\n                    selectedComics.remove(c);\n                  } else {\n                    selectedComics[c] = true;\n                  }\n                  if (selectedComics.isEmpty) {\n                    multiSelectMode = false;\n                  }\n                });\n              } else {\n                // prevent dirty data\n                var comic =\n                    LocalManager().find(c.id, ComicType.fromKey(c.sourceKey))!;\n                comic.read();\n              }\n            },\n            menuBuilder: (c) {\n              return [\n                MenuEntry(\n                  icon: Icons.folder_open,\n                  text: \"Open Folder\".tl,\n                  onClick: () {\n                    openComicFolder(c as LocalComic);\n                  },\n                ),\n                MenuEntry(\n                  icon: Icons.delete,\n                  text: \"Delete\".tl,\n                  onClick: () {\n                    deleteComics([c as LocalComic]).then((value) {\n                      if (value && multiSelectMode) {\n                        setState(() {\n                          multiSelectMode = false;\n                          selectedComics.clear();\n                        });\n                      }\n                    });\n                  },\n                ),\n                ...exportActions([c as LocalComic]),\n              ];\n            },\n          ),\n        ],\n      ),\n    );\n\n    return PopScope(\n      canPop: !multiSelectMode && !searchMode,\n      onPopInvokedWithResult: (didPop, result) {\n        if (didPop) return;\n        if (multiSelectMode) {\n          setState(() {\n            multiSelectMode = false;\n            selectedComics.clear();\n          });\n        } else if (searchMode) {\n          setState(() {\n            searchMode = false;\n            keyword = \"\";\n            update();\n          });\n        }\n      },\n      child: body,\n    );\n  }\n\n  Future<bool> deleteComics(List<LocalComic> comics) async {\n    bool isDeleted = false;\n    await showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        bool removeComicFile = true;\n        bool removeFavoriteAndHistory = true;\n        return StatefulBuilder(builder: (context, state) {\n          return ContentDialog(\n            title: \"Delete\".tl,\n            content: Column(\n              children: [\n                CheckboxListTile(\n                  title: Text(\"Remove local favorite and history\".tl),\n                  value: removeFavoriteAndHistory,\n                  onChanged: (v) {\n                    state(() {\n                      removeFavoriteAndHistory = !removeFavoriteAndHistory;\n                    });\n                  },\n                ),\n                CheckboxListTile(\n                  title: Text(\"Also remove files on disk\".tl),\n                  value: removeComicFile,\n                  onChanged: (v) {\n                    state(() {\n                      removeComicFile = !removeComicFile;\n                    });\n                  },\n                )\n              ],\n            ),\n            actions: [\n              if (comics.length == 1 && comics.first.hasChapters)\n                TextButton(\n                  child: Text(\"Delete Chapters\".tl),\n                  onPressed: () {\n                    context.pop();\n                    showDeleteChaptersPopWindow(context, comics.first);\n                  },\n                ),\n              FilledButton(\n                onPressed: () {\n                  context.pop();\n                  LocalManager().batchDeleteComics(\n                    comics,\n                    removeComicFile,\n                    removeFavoriteAndHistory,\n                  );\n                  isDeleted = true;\n                },\n                child: Text(\"Confirm\".tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n    return isDeleted;\n  }\n\n  List<MenuEntry> exportActions(List<LocalComic> comics) {\n    return [\n      MenuEntry(\n        icon: Icons.outbox_outlined,\n        text: \"Export as cbz\".tl,\n        onClick: () {\n          exportComics(comics, CBZ.export, \".cbz\");\n        },\n      ),\n      MenuEntry(\n        icon: Icons.picture_as_pdf_outlined,\n        text: \"Export as pdf\".tl,\n        onClick: () async {\n          exportComics(comics, createPdfFromComicIsolate, \".pdf\");\n        },\n      ),\n      MenuEntry(\n        icon: Icons.import_contacts_outlined,\n        text: \"Export as epub\".tl,\n        onClick: () async {\n          exportComics(comics, createEpubWithLocalComic, \".epub\");\n        },\n      )\n    ];\n  }\n\n  /// Export given comics to a file\n  void exportComics(\n      List<LocalComic> comics, ExportComicFunc export, String ext) async {\n    var current = 0;\n    var cacheDir = FilePath.join(App.cachePath, 'comics_export');\n    var outFile = FilePath.join(App.cachePath, 'comics_export.zip');\n    bool canceled = false;\n    if (Directory(cacheDir).existsSync()) {\n      Directory(cacheDir).deleteSync(recursive: true);\n    }\n    Directory(cacheDir).createSync();\n    var loadingController = showLoadingDialog(\n      context,\n      allowCancel: true,\n      message: \"${\"Exporting\".tl} $current/${comics.length}\",\n      withProgress: comics.length > 1,\n      onCancel: () {\n        canceled = true;\n      },\n    );\n    try {\n      var fileName = \"\";\n      // For each comic, export it to a file\n      for (var comic in comics) {\n        fileName = FilePath.join(\n          cacheDir,\n          sanitizeFileName(comic.title, maxLength: 100) + ext,\n        );\n        await export(comic, fileName);\n        current++;\n        if (comics.length > 1) {\n          loadingController\n              .setMessage(\"${\"Exporting\".tl} $current/${comics.length}\");\n          loadingController.setProgress(current / comics.length);\n        }\n        if (canceled) {\n          return;\n        }\n      }\n      // For single comic, just save the file\n      if (comics.length == 1) {\n        await saveFile(\n          file: File(fileName),\n          filename: File(fileName).name,\n        );\n        Directory(cacheDir).deleteSync(recursive: true);\n        loadingController.close();\n        return;\n      }\n      // For multiple comics, compress the folder\n      loadingController.setProgress(null);\n      loadingController.setMessage(\"Compressing\".tl);\n      await ZipFile.compressFolderAsync(cacheDir, outFile);\n      if (canceled) {\n        File(outFile).deleteIgnoreError();\n        return;\n      }\n    } catch (e, s) {\n      Log.error(\"Export Comics\", e, s);\n      context.showMessage(message: e.toString());\n      loadingController.close();\n      return;\n    } finally {\n      Directory(cacheDir).deleteIgnoreError(recursive: true);\n    }\n    await saveFile(\n      file: File(outFile),\n      filename: \"comics_export.zip\",\n    );\n    loadingController.close();\n    File(outFile).deleteIgnoreError();\n  }\n}\n\ntypedef ExportComicFunc = Future<File> Function(\n    LocalComic comic, String outFilePath);\n\n/// Opens the folder containing the comic in the system file explorer\nFuture<void> openComicFolder(LocalComic comic) async {\n  try {\n    final folderPath = comic.baseDir;\n\n    if (App.isWindows) {\n      await Process.run('explorer', [folderPath]);\n    } else if (App.isMacOS) {\n      await Process.run('open', [folderPath]);\n    } else if (App.isLinux) {\n      // Try different file managers commonly found on Linux\n      try {\n        await Process.run('xdg-open', [folderPath]);\n      } catch (e) {\n        // Fallback to other common file managers\n        try {\n          await Process.run('nautilus', [folderPath]);\n        } catch (e) {\n          try {\n            await Process.run('dolphin', [folderPath]);\n          } catch (e) {\n            try {\n              await Process.run('thunar', [folderPath]);\n            } catch (e) {\n              // Last resort: use the URL launcher with file:// protocol\n              await launchUrlString('file://$folderPath');\n            }\n          }\n        }\n      }\n    } else {\n      // For mobile platforms, use the URL launcher with file:// protocol\n      await launchUrlString('file://$folderPath');\n    }\n  } catch (e, s) {\n    Log.error(\"Open Folder\", \"Failed to open comic folder: $e\", s);\n    // Show error message to user\n    if (App.rootContext.mounted) {\n      App.rootContext.showMessage(message: \"Failed to open folder: $e\");\n    }\n  }\n}\n\nvoid showDeleteChaptersPopWindow(BuildContext context, LocalComic comic) {\n  var chapters = <String>[];\n\n  showPopUpWidget(\n    context,\n    PopUpWidgetScaffold(\n      title: \"Delete Chapters\".tl,\n      body: StatefulBuilder(builder: (context, setState) {\n        return Column(\n          children: [\n            Expanded(\n              child: ListView.builder(\n                itemCount: comic.downloadedChapters.length,\n                itemBuilder: (context, index) {\n                  var id = comic.downloadedChapters[index];\n                  var chapter = comic.chapters![id] ?? \"Unknown Chapter\";\n                  return CheckboxListTile(\n                    title: Text(chapter),\n                    value: chapters.contains(id),\n                    onChanged: (v) {\n                      setState(() {\n                        if (v == true) {\n                          chapters.add(id);\n                        } else {\n                          chapters.remove(id);\n                        }\n                      });\n                    },\n                  );\n                },\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.all(8.0),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.end,\n                children: [\n                  FilledButton(\n                    onPressed: () {\n                      Future.delayed(const Duration(milliseconds: 200), () {\n                        LocalManager().deleteComicChapters(comic, chapters);\n                      });\n                      App.rootContext.pop();\n                    },\n                    child: Text(\"Submit\".tl),\n                  )\n                ],\n              ),\n            )\n          ],\n        );\n      }),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/main_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/pages/categories_page.dart';\nimport 'package:venera/pages/search_page.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/translations.dart';\n\nimport '../components/components.dart';\nimport '../foundation/app.dart';\nimport 'explore_page.dart';\nimport 'favorites/favorites_page.dart';\nimport 'home_page.dart';\n\nclass MainPage extends StatefulWidget {\n  const MainPage({super.key});\n\n  @override\n  State<MainPage> createState() => _MainPageState();\n}\n\nclass _MainPageState extends State<MainPage> {\n  late final NaviObserver _observer;\n\n  GlobalKey<NavigatorState>? _navigatorKey;\n\n  void to(Widget Function() widget, {bool preventDuplicate = false}) async {\n    if (preventDuplicate) {\n      var page = widget();\n      if (\"/${page.runtimeType}\" == _observer.routes.last.toString()) return;\n    }\n    _navigatorKey!.currentContext!.to(widget);\n  }\n\n  void back() {\n    _navigatorKey!.currentContext!.pop();\n  }\n\n  @override\n  void initState() {\n    _observer = NaviObserver();\n    _navigatorKey = GlobalKey();\n    App.mainNavigatorKey = _navigatorKey;\n    index = int.tryParse(appdata.settings['initialPage'].toString()) ?? 0;\n    super.initState();\n  }\n\n  final _pages = [\n    const HomePage(),\n    const FavoritesPage(\n      key: PageStorageKey('favorites'),\n    ),\n    const ExplorePage(\n      key: PageStorageKey('explore'),\n    ),\n    const CategoriesPage(\n      key: PageStorageKey('categories'),\n    ),\n  ];\n\n  var index = 0;\n\n  @override\n  Widget build(BuildContext context) {\n    return NaviPane(\n      initialPage: index,\n      observer: _observer,\n      navigatorKey: _navigatorKey!,\n      paneItems: [\n        PaneItemEntry(\n          label: 'Home'.tl,\n          icon: Icons.home_outlined,\n          activeIcon: Icons.home,\n        ),\n        PaneItemEntry(\n          label: 'Favorites'.tl,\n          icon: Icons.local_activity_outlined,\n          activeIcon: Icons.local_activity,\n        ),\n        PaneItemEntry(\n          label: 'Explore'.tl,\n          icon: Icons.explore_outlined,\n          activeIcon: Icons.explore,\n        ),\n        PaneItemEntry(\n          label: 'Categories'.tl,\n          icon: Icons.category_outlined,\n          activeIcon: Icons.category,\n        ),\n      ],\n      onPageChanged: (i) {\n        setState(() {\n          index = i;\n        });\n      },\n      paneActions: [\n        if(index != 0)\n          PaneActionEntry(\n            icon: Icons.search,\n            label: \"Search\".tl,\n            onTap: () {\n              to(() => const SearchPage(), preventDuplicate: true);\n            },\n          ),\n        PaneActionEntry(\n          icon: Icons.settings,\n          label: \"Settings\".tl,\n          onTap: () {\n            to(() => const SettingsPage(), preventDuplicate: true);\n          },\n        )\n      ],\n      pageBuilder: (index) {\n        return _pages[index];\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/ranking_page.dart",
    "content": "import \"package:flutter/material.dart\";\nimport \"package:venera/components/components.dart\";\nimport \"package:venera/foundation/app.dart\";\nimport \"package:venera/foundation/comic_source/comic_source.dart\";\nimport \"package:venera/utils/translations.dart\";\n\nclass RankingPage extends StatefulWidget {\n  const RankingPage({required this.categoryKey, super.key});\n\n  final String categoryKey;\n\n  @override\n  State<RankingPage> createState() => _RankingPageState();\n}\n\nclass _RankingPageState extends State<RankingPage> {\n  late final CategoryComicsData data;\n  late final Map<String, String> options;\n  late String optionValue;\n\n  void findData() {\n    for (final source in ComicSource.all()) {\n      if (source.categoryData?.key == widget.categoryKey) {\n        data = source.categoryComicsData!;\n        options = data.rankingData!.options;\n        optionValue = options.keys.first;\n        return;\n      }\n    }\n    throw \"${widget.categoryKey} Not found\";\n  }\n\n  @override\n  void initState() {\n    findData();\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var topPadding = context.padding.top + 56;\n    return Scaffold(\n      extendBodyBehindAppBar: true,\n      appBar: Appbar(\n        title: Text(\"Ranking\".tl),\n      ),\n      body: ComicList(\n        key: Key(optionValue),\n        errorLeading: SizedBox(height: topPadding),\n        leadingSliver:\n            buildOptions().sliverPadding(EdgeInsets.only(top: topPadding)),\n        loadPage: data.rankingData!.load == null\n            ? null\n            : (i) => data.rankingData!.load!(optionValue, i),\n        loadNext: data.rankingData!.loadWithNext == null\n            ? null\n            : (i) => data.rankingData!.loadWithNext!(optionValue, i),\n      ),\n    );\n  }\n\n  Widget buildOptionItem(String text, String value, BuildContext context) {\n    return OptionChip(\n      text: text,\n      isSelected: value == optionValue,\n      onTap: () {\n        if (value == optionValue) return;\n        setState(() {\n          optionValue = value;\n        });\n      },\n    );\n  }\n\n  Widget buildOptions() {\n    List<Widget> children = [];\n    children.add(Wrap(\n      spacing: 8,\n      runSpacing: 8,\n      children: [\n        for (var option in options.entries)\n          buildOptionItem(option.value.tl, option.key, context)\n      ],\n    ));\n    return SliverToBoxAdapter(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [...children, const Divider()],\n      ).paddingLeft(8).paddingRight(8),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/chapter_comments.dart",
    "content": "part of 'reader.dart';\n\nbool _shouldBlockComment(Comment comment) {\n  var blockedWords = appdata.settings[\"blockedCommentWords\"] as List;\n  if (blockedWords.isEmpty) return false;\n  \n  var content = comment.content.toLowerCase();\n  for (var word in blockedWords) {\n    if (content.contains(word.toString().toLowerCase())) {\n      return true;\n    }\n  }\n  return false;\n}\n\nclass ChapterCommentsPage extends StatefulWidget {\n  const ChapterCommentsPage({\n    super.key,\n    required this.comicId,\n    required this.epId,\n    required this.source,\n    required this.comicTitle,\n    required this.chapterTitle,\n    this.replyComment,\n  });\n\n  final String comicId;\n  final String epId;\n  final ComicSource source;\n  final String comicTitle;\n  final String chapterTitle;\n  final Comment? replyComment;\n\n  @override\n  State<ChapterCommentsPage> createState() => _ChapterCommentsPageState();\n}\n\nclass _ChapterCommentsPageState extends State<ChapterCommentsPage> {\n  bool _loading = true;\n  List<Comment>? _comments;\n  String? _error;\n  int _page = 1;\n  int? maxPage;\n  var controller = TextEditingController();\n  bool sending = false;\n\n  void firstLoad() async {\n    var res = await widget.source.chapterCommentsLoader!(\n      widget.comicId,\n      widget.epId,\n      1,\n      widget.replyComment?.id,\n    );\n    if (res.error) {\n      setState(() {\n        _error = res.errorMessage;\n        _loading = false;\n      });\n    } else if (mounted) {\n      var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();\n      setState(() {\n        _comments = filteredComments;\n        _loading = false;\n        maxPage = res.subData;\n      });\n    }\n  }\n\n  void loadMore() async {\n    var res = await widget.source.chapterCommentsLoader!(\n      widget.comicId,\n      widget.epId,\n      _page + 1,\n      widget.replyComment?.id,\n    );\n    if (res.error) {\n      context.showMessage(message: res.errorMessage ?? \"Unknown Error\");\n    } else {\n      var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();\n      setState(() {\n        _comments!.addAll(filteredComments);\n        _page++;\n        if (maxPage == null && res.data.isEmpty) {\n          maxPage = _page;\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: Appbar(\n        title: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Text(\"Chapter Comments\".tl, style: ts.s18),\n            Text(widget.chapterTitle, style: ts.s12),\n          ],\n        ),\n        style: AppbarStyle.shadow,\n      ),\n      body: buildBody(context),\n    );\n  }\n\n  Widget buildBody(BuildContext context) {\n    if (_loading) {\n      firstLoad();\n      return const Center(child: CircularProgressIndicator());\n    } else if (_error != null) {\n      return NetworkError(\n        message: _error!,\n        retry: () {\n          setState(() {\n            _loading = true;\n          });\n        },\n        withAppbar: false,\n      );\n    } else {\n      var showAvatar =\n          _comments!.any((e) {\n            return e.avatar != null;\n          }) ||\n          (widget.replyComment?.avatar != null);\n      return Column(\n        children: [\n          Expanded(\n            child: SmoothScrollProvider(\n              builder: (context, controller, physics) {\n                return ListView.builder(\n                  controller: controller,\n                  physics: physics,\n                  primary: false,\n                  padding: EdgeInsets.zero,\n                  itemCount: _comments!.length + 2,\n                  itemBuilder: (context, index) {\n                    if (index == 0) {\n                      if (widget.replyComment != null) {\n                        return Column(\n                          children: [\n                            _ChapterCommentTile(\n                              comment: widget.replyComment!,\n                              source: widget.source,\n                              comicId: widget.comicId,\n                              epId: widget.epId,\n                              showAvatar: showAvatar,\n                              showActions: false,\n                            ),\n                            const SizedBox(height: 8),\n                            Container(\n                              alignment: Alignment.centerLeft,\n                              padding: const EdgeInsets.all(16),\n                              decoration: BoxDecoration(\n                                border: Border(\n                                  top: BorderSide(\n                                    color: context.colorScheme.outlineVariant,\n                                    width: 0.6,\n                                  ),\n                                ),\n                              ),\n                              child: Text(\"Replies\".tl, style: ts.s18),\n                            ),\n                          ],\n                        );\n                      } else {\n                        return const SizedBox();\n                      }\n                    }\n                    index--;\n\n                    if (index == _comments!.length) {\n                      if (_page < (maxPage ?? _page + 1)) {\n                        loadMore();\n                        return const ListLoadingIndicator();\n                      } else {\n                        return const SizedBox();\n                      }\n                    }\n\n                    return _ChapterCommentTile(\n                      comment: _comments![index],\n                      source: widget.source,\n                      comicId: widget.comicId,\n                      epId: widget.epId,\n                      showAvatar: showAvatar,\n                    );\n                  },\n                );\n              },\n            ),\n          ),\n          buildBottom(context),\n        ],\n      );\n    }\n  }\n\n  Widget buildBottom(BuildContext context) {\n    if (widget.source.sendChapterCommentFunc == null) {\n      return const SizedBox(height: 0);\n    }\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),\n      decoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surface,\n        border: Border(\n          top: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Material(\n        color: context.colorScheme.surfaceContainer,\n        borderRadius: BorderRadius.circular(24),\n        child: Row(\n          children: [\n            Expanded(\n              child: TextField(\n                controller: controller,\n                decoration: InputDecoration(\n                  border: InputBorder.none,\n                  isCollapsed: true,\n                  hintText: \"Comment\".tl,\n                ),\n                minLines: 1,\n                maxLines: 5,\n              ),\n            ),\n            if (sending)\n              const Padding(\n                padding: EdgeInsets.all(8),\n                child: SizedBox(\n                  width: 24,\n                  height: 24,\n                  child: CircularProgressIndicator(strokeWidth: 2),\n                ),\n              )\n            else\n              IconButton(\n                onPressed: () async {\n                  if (controller.text.isEmpty) {\n                    return;\n                  }\n                  setState(() {\n                    sending = true;\n                  });\n                  var b = await widget.source.sendChapterCommentFunc!(\n                    widget.comicId,\n                    widget.epId,\n                    controller.text,\n                    widget.replyComment?.id,\n                  );\n                  if (!b.error) {\n                    controller.text = \"\";\n                    setState(() {\n                      sending = false;\n                      _loading = true;\n                      _comments?.clear();\n                      _page = 1;\n                      maxPage = null;\n                    });\n                  } else {\n                    context.showMessage(message: b.errorMessage ?? \"Error\");\n                    setState(() {\n                      sending = false;\n                    });\n                  }\n                },\n                icon: Icon(\n                  Icons.send,\n                  color: Theme.of(context).colorScheme.secondary,\n                ),\n              ),\n          ],\n        ).paddingLeft(16).paddingRight(4),\n      ),\n    );\n  }\n}\n\nclass _ChapterCommentTile extends StatefulWidget {\n  const _ChapterCommentTile({\n    required this.comment,\n    required this.source,\n    required this.comicId,\n    required this.epId,\n    required this.showAvatar,\n    this.showActions = true,\n  });\n\n  final Comment comment;\n  final ComicSource source;\n  final String comicId;\n  final String epId;\n  final bool showAvatar;\n  final bool showActions;\n\n  @override\n  State<_ChapterCommentTile> createState() => _ChapterCommentTileState();\n}\n\nclass _ChapterCommentTileState extends State<_ChapterCommentTile> {\n  @override\n  void initState() {\n    likes = widget.comment.score ?? 0;\n    isLiked = widget.comment.isLiked ?? false;\n    voteStatus = widget.comment.voteStatus;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          if (widget.showAvatar)\n            Container(\n              width: 36,\n              height: 36,\n              clipBehavior: Clip.antiAlias,\n              decoration: BoxDecoration(\n                borderRadius: BorderRadius.circular(18),\n                color: Theme.of(context).colorScheme.secondaryContainer,\n              ),\n              child: widget.comment.avatar == null\n                  ? null\n                  : AnimatedImage(\n                      image: CachedImageProvider(\n                        widget.comment.avatar!,\n                        sourceKey: widget.source.key,\n                      ),\n                    ),\n            ).paddingRight(8),\n          Expanded(\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Text(widget.comment.userName, style: ts.bold),\n                if (widget.comment.time != null)\n                  Text(widget.comment.time!, style: ts.s12),\n                const SizedBox(height: 4),\n                _CommentContent(text: widget.comment.content),\n                buildActions(),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget buildActions() {\n    if (!widget.showActions) {\n      return const SizedBox();\n    }\n    if (widget.comment.score == null && widget.comment.replyCount == null) {\n      return const SizedBox();\n    }\n    return SizedBox(\n      height: 36,\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.end,\n        children: [\n          if (widget.comment.score != null &&\n              widget.source.voteCommentFunc != null)\n            buildVote(),\n          if (widget.comment.score != null &&\n              widget.source.likeCommentFunc != null)\n            buildLike(),\n          // Only show reply button if comment has both id and replyCount\n          if (widget.comment.replyCount != null && widget.comment.id != null) \n            buildReply(),\n        ],\n      ),\n    ).paddingTop(8);\n  }\n\n  Widget buildReply() {\n    return Container(\n      margin: const EdgeInsets.only(left: 8),\n      decoration: BoxDecoration(\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n        borderRadius: BorderRadius.circular(16),\n      ),\n      child: InkWell(\n        borderRadius: BorderRadius.circular(16),\n        onTap: () {\n          // Get the parent page's widget to access comicTitle and chapterTitle\n          var parentState = context.findAncestorStateOfType<_ChapterCommentsPageState>();\n          showSideBar(\n            context,\n            ChapterCommentsPage(\n              comicId: widget.comicId,\n              epId: widget.epId,\n              source: widget.source,\n              comicTitle: parentState?.widget.comicTitle ?? '',\n              chapterTitle: parentState?.widget.chapterTitle ?? '',\n              replyComment: widget.comment,\n            ),\n            showBarrier: false,\n          );\n        },\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            const Icon(Icons.insert_comment_outlined, size: 16),\n            const SizedBox(width: 8),\n            Text(widget.comment.replyCount.toString()),\n          ],\n        ).padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 4)),\n      ),\n    );\n  }\n\n  bool isLiking = false;\n  bool isLiked = false;\n  var likes = 0;\n\n  Widget buildLike() {\n    return Container(\n      margin: const EdgeInsets.only(left: 8),\n      decoration: BoxDecoration(\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n        borderRadius: BorderRadius.circular(16),\n      ),\n      child: InkWell(\n        borderRadius: BorderRadius.circular(16),\n        onTap: () async {\n          if (isLiking) return;\n          setState(() {\n            isLiking = true;\n          });\n          var res = await widget.source.likeCommentFunc!(\n            widget.comicId,\n            widget.epId,\n            widget.comment.id!,\n            !isLiked,\n          );\n          if (res.success) {\n            isLiked = !isLiked;\n            likes += isLiked ? 1 : -1;\n          } else {\n            context.showMessage(message: res.errorMessage ?? \"Error\");\n          }\n          setState(() {\n            isLiking = false;\n          });\n        },\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            if (isLiking)\n              const SizedBox(\n                width: 16,\n                height: 16,\n                child: CircularProgressIndicator(),\n              )\n            else if (isLiked)\n              Icon(\n                Icons.favorite,\n                size: 16,\n                color: context.useTextColor(Colors.red),\n              )\n            else\n              const Icon(Icons.favorite_border, size: 16),\n            const SizedBox(width: 8),\n            Text(likes.toString()),\n          ],\n        ).padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 4)),\n      ),\n    );\n  }\n\n  int? voteStatus;\n  bool isVotingUp = false;\n  bool isVotingDown = false;\n\n  void vote(bool isUp) async {\n    if (isVotingUp || isVotingDown) return;\n    setState(() {\n      if (isUp) {\n        isVotingUp = true;\n      } else {\n        isVotingDown = true;\n      }\n    });\n    var isCancel = (isUp && voteStatus == 1) || (!isUp && voteStatus == -1);\n    var res = await widget.source.voteCommentFunc!(\n      widget.comicId,\n      widget.epId,\n      widget.comment.id!,\n      isUp,\n      isCancel,\n    );\n    if (res.success) {\n      if (isCancel) {\n        voteStatus = 0;\n      } else {\n        if (isUp) {\n          voteStatus = 1;\n        } else {\n          voteStatus = -1;\n        }\n      }\n      widget.comment.voteStatus = voteStatus;\n      widget.comment.score = res.data ?? widget.comment.score;\n    } else {\n      context.showMessage(message: res.errorMessage ?? \"Error\");\n    }\n    setState(() {\n      isVotingUp = false;\n      isVotingDown = false;\n    });\n  }\n\n  Widget buildVote() {\n    var upColor = context.colorScheme.outline;\n    if (voteStatus == 1) {\n      upColor = context.useTextColor(Colors.red);\n    }\n    var downColor = context.colorScheme.outline;\n    if (voteStatus == -1) {\n      downColor = context.useTextColor(Colors.blue);\n    }\n\n    return Container(\n      margin: const EdgeInsets.only(left: 8),\n      decoration: BoxDecoration(\n        borderRadius: BorderRadius.circular(16),\n        border: Border.all(\n          color: Theme.of(context).colorScheme.outlineVariant,\n          width: 0.6,\n        ),\n      ),\n      child: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Button.icon(\n            isLoading: isVotingUp,\n            icon: const Icon(Icons.arrow_upward),\n            size: 18,\n            color: upColor,\n            onPressed: () => vote(true),\n          ),\n          const SizedBox(width: 4),\n          Text(widget.comment.score.toString()),\n          const SizedBox(width: 4),\n          Button.icon(\n            isLoading: isVotingDown,\n            icon: const Icon(Icons.arrow_downward),\n            size: 18,\n            color: downColor,\n            onPressed: () => vote(false),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _CommentContent extends StatelessWidget {\n  const _CommentContent({required this.text});\n\n  final String text;\n\n  @override\n  Widget build(BuildContext context) {\n    if (!text.contains('<') && !text.contains('http')) {\n      return SelectableText(text);\n    } else {\n      return RichCommentContent(text: text);\n    }\n  }\n}\n\n/// Embedded chapter comments page for displaying at end of chapter in gallery mode.\nclass _EmbeddedChapterCommentsPage extends StatefulWidget {\n  const _EmbeddedChapterCommentsPage({\n    required this.comicId,\n    required this.epId,\n    required this.source,\n    required this.comicTitle,\n    required this.chapterTitle,\n  });\n\n  final String comicId;\n  final String epId;\n  final ComicSource source;\n  final String comicTitle;\n  final String chapterTitle;\n\n  @override\n  State<_EmbeddedChapterCommentsPage> createState() =>\n      _EmbeddedChapterCommentsPageState();\n}\n\nclass _EmbeddedChapterCommentsPageState\n    extends State<_EmbeddedChapterCommentsPage> {\n  bool _loading = true;\n  List<Comment>? _comments;\n  String? _error;\n  int _page = 1;\n  int? maxPage;\n  var textController = TextEditingController();\n  bool sending = false;\n\n  @override\n  void dispose() {\n    textController.dispose();\n    super.dispose();\n  }\n\n  void firstLoad() async {\n    var res = await widget.source.chapterCommentsLoader!(\n      widget.comicId,\n      widget.epId,\n      1,\n      null,\n    );\n    if (res.error) {\n      if (mounted) {\n        setState(() {\n          _error = res.errorMessage;\n          _loading = false;\n        });\n      }\n    } else if (mounted) {\n      var filteredComments =\n          res.data.where((c) => !_shouldBlockComment(c)).toList();\n      setState(() {\n        _comments = filteredComments;\n        _loading = false;\n        maxPage = res.subData;\n      });\n    }\n  }\n\n  void loadMore() async {\n    var res = await widget.source.chapterCommentsLoader!(\n      widget.comicId,\n      widget.epId,\n      _page + 1,\n      null,\n    );\n    if (res.error) {\n      if (mounted) {\n        context.showMessage(message: res.errorMessage ?? \"Unknown Error\");\n      }\n    } else if (mounted) {\n      var filteredComments =\n          res.data.where((c) => !_shouldBlockComment(c)).toList();\n      setState(() {\n        _comments!.addAll(filteredComments);\n        _page++;\n        if (maxPage == null && res.data.isEmpty) {\n          maxPage = _page;\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final bottomInset = MediaQuery.of(context).viewInsets.bottom;\n    return Container(\n      color: context.colorScheme.surface,\n      child: SafeArea(\n        child: Column(\n          children: [\n            _buildHeader(),\n            Expanded(child: _buildBody()),\n            _buildBottom(),\n            SizedBox(height: bottomInset),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildHeader() {\n    return Container(\n      padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Row(\n        children: [\n          IconButton(\n            icon: const Icon(Icons.arrow_back),\n            onPressed: () {\n              Navigator.of(context).pop();\n            },\n            tooltip: \"Exit\".tl,\n          ),\n          const SizedBox(width: 4),\n          Icon(Icons.comment, size: 24),\n          const SizedBox(width: 12),\n          Expanded(\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Text(\"Chapter Comments\".tl, style: ts.s18),\n                Text(widget.chapterTitle, style: ts.s12),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody() {\n    if (_loading) {\n      firstLoad();\n      return const Center(child: CircularProgressIndicator());\n    } else if (_error != null) {\n      return NetworkError(\n        message: _error!,\n        retry: () {\n          setState(() {\n            _loading = true;\n            _error = null;\n          });\n        },\n        withAppbar: false,\n      );\n    } else if (_comments == null || _comments!.isEmpty) {\n      return Center(\n        child: Text(\"No comments yet\".tl, style: ts.s14),\n      );\n    } else {\n      var showAvatar = _comments!.any((e) => e.avatar != null);\n      return _buildCommentsList(showAvatar);\n    }\n  }\n\n  Widget _buildCommentsList(bool showAvatar) {\n    final isLandscape = MediaQuery.of(context).orientation == Orientation.landscape;\n    final crossAxisCount = isLandscape ? 2 : 1;\n    final scrollController = ScrollController();\n    \n    return Scrollbar(\n      controller: scrollController,\n      thumbVisibility: true,\n      thickness: 8,\n      child: MasonryGridView.count(\n        controller: scrollController,\n        crossAxisCount: crossAxisCount,\n        mainAxisSpacing: 0,\n        crossAxisSpacing: 0,\n        padding: const EdgeInsets.symmetric(horizontal: 8),\n        itemCount: _comments!.length + 1,\n        itemBuilder: (context, index) {\n          if (index == _comments!.length) {\n            if (_page < (maxPage ?? _page + 1)) {\n              loadMore();\n              return const ListLoadingIndicator();\n            } else {\n              return const SizedBox();\n            }\n          }\n          return _ChapterCommentTile(\n            comment: _comments![index],\n            source: widget.source,\n            comicId: widget.comicId,\n            epId: widget.epId,\n            showAvatar: showAvatar,\n          );\n        },\n      ),\n    );\n  }\n\n  Widget _buildBottom() {\n    if (widget.source.sendChapterCommentFunc == null) {\n      return const SizedBox(height: 0);\n    }\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),\n      decoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surface,\n        border: Border(\n          top: BorderSide(\n            color: context.colorScheme.outlineVariant,\n            width: 0.6,\n          ),\n        ),\n      ),\n      child: Material(\n        color: context.colorScheme.surfaceContainer,\n        borderRadius: BorderRadius.circular(24),\n        child: Row(\n          children: [\n            Expanded(\n              child: TextField(\n                controller: textController,\n                decoration: InputDecoration(\n                  border: InputBorder.none,\n                  isCollapsed: true,\n                  hintText: \"Comment\".tl,\n                ),\n                minLines: 1,\n                maxLines: 5,\n              ),\n            ),\n            if (sending)\n              const Padding(\n                padding: EdgeInsets.all(8),\n                child: SizedBox(\n                  width: 24,\n                  height: 24,\n                  child: CircularProgressIndicator(strokeWidth: 2),\n                ),\n              )\n            else\n              IconButton(\n                onPressed: () async {\n                  if (textController.text.isEmpty) {\n                    return;\n                  }\n                  setState(() {\n                    sending = true;\n                  });\n                  var b = await widget.source.sendChapterCommentFunc!(\n                    widget.comicId,\n                    widget.epId,\n                    textController.text,\n                    null,\n                  );\n                  if (!b.error) {\n                    textController.text = \"\";\n                    setState(() {\n                      sending = false;\n                      _loading = true;\n                      _comments?.clear();\n                      _page = 1;\n                      maxPage = null;\n                    });\n                  } else {\n                    if (mounted) {\n                      context.showMessage(message: b.errorMessage ?? \"Error\");\n                    }\n                    setState(() {\n                      sending = false;\n                    });\n                  }\n                },\n                icon: Icon(\n                  Icons.send,\n                  color: Theme.of(context).colorScheme.secondary,\n                ),\n              ),\n          ],\n        ).paddingLeft(16).paddingRight(4),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/chapters.dart",
    "content": "part of 'reader.dart';\n\nclass _ChaptersView extends StatefulWidget {\n  const _ChaptersView(this.reader);\n\n  final _ReaderState reader;\n\n  @override\n  State<_ChaptersView> createState() => _ChaptersViewState();\n}\n\nclass _ChaptersViewState extends State<_ChaptersView> {\n  bool desc = false;\n\n  late final ScrollController _scrollController;\n\n  var downloaded = <String>[];\n\n  @override\n  void initState() {\n    super.initState();\n    int epIndex = widget.reader.chapter - 2;\n    _scrollController = ScrollController(\n      initialScrollOffset: (epIndex * 48.0 + 52).clamp(0, double.infinity),\n    );\n    var local = LocalManager().find(widget.reader.cid, widget.reader.type);\n    if (local != null) {\n      downloaded = local.downloadedChapters;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var chapters = widget.reader.widget.chapters!;\n    var current = widget.reader.chapter - 1;\n    return Scaffold(\n      body: SmoothCustomScrollView(\n        controller: _scrollController,\n        slivers: [\n          SliverAppbar(\n            style: AppbarStyle.shadow,\n            title: Text(\"Chapters\".tl),\n            actions: [\n              Tooltip(\n                message: \"Click to change the order\".tl,\n                child: TextButton.icon(\n                  icon: Icon(\n                    !desc ? Icons.arrow_upward : Icons.arrow_downward,\n                    size: 18,\n                  ),\n                  label: Text(!desc ? \"Ascending\".tl : \"Descending\".tl),\n                  onPressed: () {\n                    setState(() {\n                      desc = !desc;\n                    });\n                  },\n                ),\n              ),\n            ],\n          ),\n          SliverList(\n            delegate: SliverChildBuilderDelegate(\n              (context, index) {\n                if (desc) {\n                  index = chapters.length - 1 - index;\n                }\n                var chapter = chapters.titles.elementAt(index);\n                return _ChapterListTile(\n                  onTap: () {\n                    widget.reader.toChapter(index + 1);\n                    Navigator.of(context).pop();\n                  },\n                  title: chapter,\n                  isActive: current == index,\n                  isDownloaded:\n                      downloaded.contains(chapters.ids.elementAt(index)),\n                );\n              },\n              childCount: chapters.length,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _GroupedChaptersView extends StatefulWidget {\n  const _GroupedChaptersView(this.reader);\n\n  final _ReaderState reader;\n\n  @override\n  State<_GroupedChaptersView> createState() => _GroupedChaptersViewState();\n}\n\nclass _GroupedChaptersViewState extends State<_GroupedChaptersView>\n    with SingleTickerProviderStateMixin {\n  ComicChapters get chapters => widget.reader.widget.chapters!;\n\n  late final TabController tabController;\n\n  late final ScrollController _scrollController;\n\n  late final String initialGroupName;\n\n  var downloaded = <String>[];\n\n  @override\n  void initState() {\n    super.initState();\n    int index = 0;\n    int epIndex = widget.reader.chapter - 1;\n    while (epIndex >= 0) {\n      epIndex -= chapters.getGroupByIndex(index).length;\n      index++;\n    }\n    tabController = TabController(\n      length: chapters.groups.length,\n      vsync: this,\n      initialIndex: index - 1,\n    );\n    initialGroupName = chapters.groups.elementAt(index - 1);\n    var epIndexAtGroup = widget.reader.chapter - 1;\n    for (var i = 0; i < index - 1; i++) {\n      epIndexAtGroup -= chapters.getGroupByIndex(i).length;\n    }\n    _scrollController = ScrollController(\n      initialScrollOffset: (epIndexAtGroup * 48.0).clamp(0, double.infinity),\n    );\n    var local = LocalManager().find(widget.reader.cid, widget.reader.type);\n    if (local != null) {\n      downloaded = local.downloadedChapters;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        Appbar(title: Text(\"Chapters\".tl)),\n        AppTabBar(\n          controller: tabController,\n          tabs: chapters.groups.map((e) => Tab(text: e)).toList(),\n        ),\n        Expanded(\n          child: TabViewBody(\n            controller: tabController,\n            children: chapters.groups.map(buildGroup).toList(),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildGroup(String groupName) {\n    var group = chapters.getGroup(groupName);\n    return SmoothCustomScrollView(\n      controller: initialGroupName == groupName ? _scrollController : null,\n      slivers: [\n        SliverList(\n          delegate: SliverChildBuilderDelegate(\n            (context, index) {\n              var name = group.values.elementAt(index);\n              var i = 0;\n              for (var g in chapters.groups) {\n                if (g == groupName) {\n                  break;\n                }\n                i += chapters.getGroup(g).length;\n              }\n              i += index + 1;\n              return _ChapterListTile(\n                onTap: () {\n                  widget.reader.toChapter(i);\n                  context.pop();\n                },\n                title: name,\n                isActive: widget.reader.chapter == i,\n                isDownloaded: downloaded.contains(group.keys.elementAt(index)),\n              );\n            },\n            childCount: group.length,\n          ),\n        ),\n      ],\n    );\n  }\n}\n\nclass _ChapterListTile extends StatelessWidget {\n  const _ChapterListTile({\n    required this.title,\n    required this.isActive,\n    required this.isDownloaded,\n    required this.onTap,\n  });\n\n  final String title;\n\n  final bool isActive;\n\n  final bool isDownloaded;\n\n  final VoidCallback onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return InkWell(\n      onTap: onTap,\n      child: Container(\n        height: 48,\n        padding: const EdgeInsets.symmetric(horizontal: 16),\n        decoration: BoxDecoration(\n          border: Border(\n            left: BorderSide(\n              color:\n                  isActive ? context.colorScheme.primary : Colors.transparent,\n              width: 4,\n            ),\n          ),\n        ),\n        child: Row(\n          children: [\n            Text(\n              title,\n              style: isActive\n                  ? ts.withColor(context.colorScheme.primary).bold.s16\n                  : ts.s16,\n            ),\n            const Spacer(),\n            if (isDownloaded)\n              Icon(\n                Icons.download_done_rounded,\n                color: context.colorScheme.secondary,\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/comic_image.dart",
    "content": "part of 'reader.dart';\n\nclass ComicImage extends StatefulWidget {\n  /// Modified from flutter Image\n  ComicImage({\n    required ImageProvider image,\n    super.key,\n    double scale = 1.0,\n    this.semanticLabel,\n    this.excludeFromSemantics = false,\n    this.width,\n    this.height,\n    this.color,\n    this.opacity,\n    this.colorBlendMode,\n    this.fit,\n    this.alignment = Alignment.center,\n    this.repeat = ImageRepeat.noRepeat,\n    this.centerSlice,\n    this.matchTextDirection = false,\n    this.gaplessPlayback = false,\n    this.filterQuality = FilterQuality.medium,\n    this.isAntiAlias = false,\n    Map<String, String>? headers,\n    int? cacheWidth,\n    int? cacheHeight,\n    this.onInit,\n    this.onDispose,\n  })  : image = ResizeImage.resizeIfNeeded(cacheWidth, cacheHeight, image),\n        assert(cacheWidth == null || cacheWidth > 0),\n        assert(cacheHeight == null || cacheHeight > 0);\n\n  final ImageProvider image;\n\n  final String? semanticLabel;\n\n  final bool excludeFromSemantics;\n\n  final double? width;\n\n  final double? height;\n\n  final bool gaplessPlayback;\n\n  final bool matchTextDirection;\n\n  final Rect? centerSlice;\n\n  final ImageRepeat repeat;\n\n  final AlignmentGeometry alignment;\n\n  final BoxFit? fit;\n\n  final BlendMode? colorBlendMode;\n\n  final FilterQuality filterQuality;\n\n  final Animation<double>? opacity;\n\n  final Color? color;\n\n  final bool isAntiAlias;\n\n  final void Function(State<ComicImage> state)? onInit;\n\n  final void Function(State<ComicImage> state)? onDispose;\n\n  static void clear() => _ComicImageState.clear();\n\n  @override\n  State<ComicImage> createState() => _ComicImageState();\n}\n\nclass _ComicImageState extends State<ComicImage> with WidgetsBindingObserver {\n  ImageStream? _imageStream;\n  ImageInfo? _imageInfo;\n  ImageChunkEvent? _loadingProgress;\n  bool _isListeningToStream = false;\n  late bool _invertColors;\n  int? _frameNumber;\n  bool _wasSynchronouslyLoaded = false;\n  late DisposableBuildContext<State<ComicImage>> _scrollAwareContext;\n  Object? _lastException;\n  ImageStreamCompleterHandle? _completerHandle;\n\n  static final Map<int, Size> _cache = {};\n\n  static clear() => _cache.clear();\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _scrollAwareContext = DisposableBuildContext<State<ComicImage>>(this);\n    widget.onInit?.call(this);\n  }\n\n  @override\n  void dispose() {\n    assert(_imageStream != null);\n    WidgetsBinding.instance.removeObserver(this);\n    _stopListeningToStream();\n    _completerHandle?.dispose();\n    _scrollAwareContext.dispose();\n    _replaceImage(info: null);\n    widget.onDispose?.call(this);\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    _updateInvertColors();\n    _resolveImage();\n\n    if (TickerMode.of(context)) {\n      _listenToStream();\n    } else {\n      _stopListeningToStream(keepStreamAlive: true);\n    }\n\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(ComicImage oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.image != oldWidget.image) {\n      _resolveImage();\n    }\n  }\n\n  @override\n  void didChangeAccessibilityFeatures() {\n    super.didChangeAccessibilityFeatures();\n    setState(() {\n      _updateInvertColors();\n    });\n  }\n\n  @override\n  void reassemble() {\n    _resolveImage(); // in case the image cache was flushed\n    super.reassemble();\n  }\n\n  bool containsPoint(Offset point) {\n    if (!mounted) {\n      return false;\n    }\n    var renderBox = context.findRenderObject() as RenderBox;\n    var localPoint = renderBox.globalToLocal(point);\n    return renderBox.paintBounds.contains(localPoint);\n  }\n\n  void _updateInvertColors() {\n    _invertColors = MediaQuery.maybeInvertColorsOf(context) ??\n        SemanticsBinding.instance.accessibilityFeatures.invertColors;\n  }\n\n  void _resolveImage() {\n    final ScrollAwareImageProvider provider = ScrollAwareImageProvider<Object>(\n      context: _scrollAwareContext,\n      imageProvider: widget.image,\n    );\n    final ImageStream newStream =\n        provider.resolve(createLocalImageConfiguration(\n      context,\n      size: widget.width != null && widget.height != null\n          ? Size(widget.width!, widget.height!)\n          : null,\n    ));\n    _updateSourceStream(newStream);\n  }\n\n  ImageStreamListener? _imageStreamListener;\n\n  ImageStreamListener _getListener({bool recreateListener = false}) {\n    if (_imageStreamListener == null || recreateListener) {\n      _lastException = null;\n      _imageStreamListener = ImageStreamListener(\n        _handleImageFrame,\n        onChunk: _handleImageChunk,\n        onError: (Object error, StackTrace? stackTrace) {\n          setState(() {\n            _lastException = error;\n          });\n        },\n      );\n    }\n    return _imageStreamListener!;\n  }\n\n  void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {\n    setState(() {\n      _replaceImage(info: imageInfo);\n      _loadingProgress = null;\n      _lastException = null;\n      _frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;\n      _wasSynchronouslyLoaded = _wasSynchronouslyLoaded | synchronousCall;\n    });\n  }\n\n  void _handleImageChunk(ImageChunkEvent event) {\n    setState(() {\n      _loadingProgress = event;\n      _lastException = null;\n    });\n  }\n\n  void _replaceImage({required ImageInfo? info}) {\n    final ImageInfo? oldImageInfo = _imageInfo;\n    SchedulerBinding.instance\n        .addPostFrameCallback((_) => oldImageInfo?.dispose());\n    _imageInfo = info;\n  }\n\n  // Updates _imageStream to newStream, and moves the stream listener\n  // registration from the old stream to the new stream (if a listener was\n  // registered).\n  void _updateSourceStream(ImageStream newStream) {\n    if (_imageStream?.key == newStream.key) {\n      return;\n    }\n\n    if (_isListeningToStream) {\n      _imageStream!.removeListener(_getListener());\n    }\n\n    if (!widget.gaplessPlayback) {\n      setState(() {\n        _replaceImage(info: null);\n      });\n    }\n\n    setState(() {\n      _loadingProgress = null;\n      _frameNumber = null;\n      _wasSynchronouslyLoaded = false;\n    });\n\n    _imageStream = newStream;\n    if (_isListeningToStream) {\n      _imageStream!.addListener(_getListener());\n    }\n  }\n\n  void _listenToStream() {\n    if (_isListeningToStream) {\n      return;\n    }\n\n    _imageStream!.addListener(_getListener());\n    _completerHandle?.dispose();\n    _completerHandle = null;\n\n    _isListeningToStream = true;\n  }\n\n  /// Stops listening to the image stream, if this state object has attached a\n  /// listener.\n  ///\n  /// If the listener from this state is the last listener on the stream, the\n  /// stream will be disposed. To keep the stream alive, set `keepStreamAlive`\n  /// to true, which create [ImageStreamCompleterHandle] to keep the completer\n  /// alive and is compatible with the [TickerMode] being off.\n  void _stopListeningToStream({bool keepStreamAlive = false}) {\n    if (!_isListeningToStream) {\n      return;\n    }\n\n    if (keepStreamAlive &&\n        _completerHandle == null &&\n        _imageStream?.completer != null) {\n      _completerHandle = _imageStream!.completer!.keepAlive();\n    }\n\n    _imageStream!.removeListener(_getListener());\n    _isListeningToStream = false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (_lastException != null) {\n      // display error and retry button on screen\n      return SizedBox(\n        height: widget.height == null ? 300 : null,\n        width: widget.width == null ? 300 : null,\n        child: Center(\n          child: SizedBox(\n            height: 300,\n            child: Column(\n              children: [\n                Expanded(\n                  child: Center(\n                    child: Text(\n                      _lastException.toString(),\n                      maxLines: 3,\n                    ),\n                  ),\n                ),\n                const SizedBox(\n                  height: 4,\n                ),\n                MouseRegion(\n                  cursor: SystemMouseCursors.click,\n                  child: Listener(\n                    onPointerDown: (details) {\n                      GlobalState.find<_ReaderGestureDetectorState>().ignoreNextTap();\n                      setState(() {\n                        _loadingProgress = null;\n                        _lastException = null;\n                      });\n                      _resolveImage();\n                    },\n                    child: SizedBox(\n                      width: 84,\n                      height: 36,\n                      child: Center(\n                        child: Text(\n                          \"Retry\".tl,\n                          style: TextStyle(color: Colors.blue),\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n                const SizedBox(\n                  height: 16,\n                ),\n              ],\n            ),\n          ),\n        ),\n      );\n    }\n\n    return LayoutBuilder(builder: (context, constrains) {\n      var width = widget.width;\n      var height = widget.height;\n\n      if (_imageInfo != null) {\n        // Record the height and the width of the image\n        _cache[widget.image.hashCode] = Size(_imageInfo!.image.width.toDouble(),\n            _imageInfo!.image.height.toDouble());\n      }\n\n      Size? cacheSize = _cache[widget.image.hashCode];\n      if (cacheSize != null) {\n        if (width == double.infinity) {\n          width = constrains.maxWidth;\n          height = width * cacheSize.height / cacheSize.width;\n        } else if (height == double.infinity) {\n          height = constrains.maxHeight;\n          width = height * cacheSize.width / cacheSize.height;\n        }\n      } else {\n        if (width == double.infinity) {\n          width = constrains.maxWidth;\n          height = 300;\n        } else if (height == double.infinity) {\n          height = constrains.maxHeight;\n          width = 300;\n        }\n      }\n\n      if (_imageInfo != null) {\n        // build image\n        Widget result = RawImage(\n          // Do not clone the image, because RawImage is a stateless wrapper.\n          // The image will be disposed by this state object when it is not needed\n          // anymore, such as when it is unmounted or when the image stream pushes\n          // a new image.\n          image: _imageInfo?.image,\n          debugImageLabel: _imageInfo?.debugLabel,\n          width: width,\n          height: height,\n          scale: _imageInfo?.scale ?? 1.0,\n          color: widget.color,\n          opacity: widget.opacity,\n          colorBlendMode: widget.colorBlendMode,\n          fit: widget.fit,\n          alignment: widget.alignment,\n          repeat: widget.repeat,\n          centerSlice: widget.centerSlice,\n          matchTextDirection: widget.matchTextDirection,\n          invertColors: _invertColors,\n          isAntiAlias: widget.isAntiAlias,\n          filterQuality: widget.filterQuality,\n        );\n\n        if (!widget.excludeFromSemantics) {\n          result = Semantics(\n            container: widget.semanticLabel != null,\n            image: true,\n            label: widget.semanticLabel ?? '',\n            child: result,\n          );\n        }\n        result = SizedBox(\n          width: width,\n          height: height,\n          child: Center(\n            child: result,\n          ),\n        );\n        return result;\n      } else {\n        // build progress\n        return SizedBox(\n          width: width,\n          height: height,\n          child: Center(\n            child: SizedBox(\n              width: 24,\n              height: 24,\n              child: CircularProgressIndicator(\n                strokeWidth: 3,\n                backgroundColor: context.colorScheme.surfaceContainer,\n                value: (_loadingProgress != null &&\n                        _loadingProgress!.expectedTotalBytes != null &&\n                        _loadingProgress!.expectedTotalBytes! != 0)\n                    ? _loadingProgress!.cumulativeBytesLoaded /\n                        _loadingProgress!.expectedTotalBytes!\n                    : 0,\n              ),\n            ),\n          ),\n        );\n      }\n    });\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder description) {\n    super.debugFillProperties(description);\n    description.add(DiagnosticsProperty<ImageStream>('stream', _imageStream));\n    description.add(DiagnosticsProperty<ImageInfo>('pixels', _imageInfo));\n    description.add(DiagnosticsProperty<ImageChunkEvent>(\n        'loadingProgress', _loadingProgress));\n    description.add(DiagnosticsProperty<int>('frameNumber', _frameNumber));\n    description.add(DiagnosticsProperty<bool>(\n        'wasSynchronouslyLoaded', _wasSynchronouslyLoaded));\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/gesture.dart",
    "content": "part of 'reader.dart';\n\nclass _ReaderGestureDetector extends StatefulWidget {\n  const _ReaderGestureDetector({required this.child});\n\n  final Widget child;\n\n  @override\n  State<_ReaderGestureDetector> createState() => _ReaderGestureDetectorState();\n}\n\nclass _ReaderGestureDetectorState extends AutomaticGlobalState<_ReaderGestureDetector> {\n  late TapGestureRecognizer _tapGestureRecognizer;\n\n  static const _kDoubleTapMaxTime = Duration(milliseconds: 200);\n\n  static const _kLongPressMinTime = Duration(milliseconds: 250);\n\n  static const _kDoubleTapMaxDistanceSquared = 20.0 * 20.0;\n\n  static const _kTapToTurnPagePercent = 0.3;\n\n  final _dragListeners = <_DragListener>[];\n\n  int fingers = 0;\n\n  late _ReaderState reader;\n\n  bool ignoreNextTag = false;\n\n  void ignoreNextTap() {\n    ignoreNextTag = true;\n  }\n\n  void clearIgnoreNextTap() {\n    ignoreNextTag = false;\n  }\n\n  @override\n  void initState() {\n    _tapGestureRecognizer = TapGestureRecognizer()\n      ..onTapUp = onTapUp\n      ..onSecondaryTapUp = (details) {\n        onSecondaryTapUp(details.globalPosition);\n      };\n    super.initState();\n    context.readerScaffold._gestureDetectorState = this;\n    reader = context.reader;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      behavior: HitTestBehavior.translucent,\n      onPointerDown: (event) {\n        if (event.position == Offset.zero) {\n          _previousEvent = null;\n          return;\n        }\n        fingers++;\n        if (ignoreNextTag) {\n          ignoreNextTag = false;\n          return;\n        }\n        _lastTapPointer = event.pointer;\n        _lastTapMoveDistance = Offset.zero;\n        _tapGestureRecognizer.addPointer(event);\n        if (_dragInProgress) {\n          for (var dragListener in _dragListeners) {\n            dragListener.onStart?.call(event.position);\n          }\n          _dragInProgress = false;\n        }\n        Future.delayed(_kLongPressMinTime, () {\n          if (_lastTapPointer == event.pointer && fingers == 1) {\n            if (_lastTapMoveDistance!.distanceSquared < 20.0 * 20.0) {\n              onLongPressedDown(event.position);\n              _longPressInProgress = true;\n            } else {\n              _dragInProgress = true;\n              for (var dragListener in _dragListeners) {\n                dragListener.onStart?.call(event.position);\n                dragListener.onMove?.call(_lastTapMoveDistance!);\n              }\n            }\n          }\n        });\n      },\n      onPointerMove: (event) {\n        if (event.pointer == _lastTapPointer) {\n          _lastTapMoveDistance = event.delta + _lastTapMoveDistance!;\n        }\n        if (_dragInProgress) {\n          for (var dragListener in _dragListeners) {\n            dragListener.onMove?.call(event.delta);\n          }\n        }\n      },\n      onPointerUp: (event) {\n        fingers--;\n        if (_longPressInProgress) {\n          onLongPressedUp(event.position);\n        }\n        if (_dragInProgress) {\n          for (var dragListener in _dragListeners) {\n            dragListener.onEnd?.call();\n          }\n          _dragInProgress = false;\n        }\n        _lastTapPointer = null;\n        _lastTapMoveDistance = null;\n      },\n      onPointerCancel: (event) {\n        fingers--;\n        if (_longPressInProgress) {\n          onLongPressedUp(event.position);\n        }\n        if (_dragInProgress) {\n          for (var dragListener in _dragListeners) {\n            dragListener.onEnd?.call();\n          }\n          _dragInProgress = false;\n        }\n        _lastTapPointer = null;\n        _lastTapMoveDistance = null;\n      },\n      onPointerSignal: (event) {\n        if (event is PointerScrollEvent) {\n          onMouseWheel(event.scrollDelta.dy > 0);\n        }\n      },\n      child: widget.child,\n    );\n  }\n\n  void onMouseWheel(bool forward) {\n    if (HardwareKeyboard.instance.isControlPressed) {\n      return;\n    }\n    if (context.reader.mode.key.startsWith('gallery')) {\n      if (forward) {\n        if (!context.reader.toNextPage() && !context.reader.isLastChapterOfGroup) {\n          context.reader.toNextChapter();\n        }\n      } else {\n        if (!context.reader.toPrevPage() && !context.reader.isFirstChapterOfGroup) {\n          context.reader.toPrevChapter(toLastPage: true);\n        }\n      }\n    }\n  }\n\n  TapUpDetails? _previousEvent;\n\n  int? _lastTapPointer;\n\n  Offset? _lastTapMoveDistance;\n\n  bool _longPressInProgress = false;\n\n  bool _dragInProgress = false;\n\n  bool get _enableDoubleTapToZoom =>\n      appdata.settings.getReaderSetting(reader.cid, reader.type.sourceKey, 'enableDoubleTapToZoom');\n\n  void onTapUp(TapUpDetails event) {\n    if (event.globalPosition == Offset.zero &&\n        event.localPosition == Offset.zero) {\n      _previousEvent = null;\n      return;\n    }\n    if (_longPressInProgress) {\n      _longPressInProgress = false;\n      return;\n    }\n    final location = event.globalPosition;\n    if (!_enableDoubleTapToZoom) {\n      onTap(location);\n      return;\n    }\n    final previousLocation = _previousEvent?.globalPosition;\n    if (previousLocation != null) {\n      if ((location - previousLocation).distanceSquared <\n          _kDoubleTapMaxDistanceSquared) {\n        onDoubleTap(location);\n        _previousEvent = null;\n        return;\n      } else {\n        onTap(previousLocation);\n      }\n    }\n    _previousEvent = event;\n    Future.delayed(_kDoubleTapMaxTime, () {\n      if (_previousEvent == event) {\n        onTap(location);\n        _previousEvent = null;\n      }\n    });\n  }\n\n  void onTap(Offset location) {\n    if (reader._imageViewController!.handleOnTap(location)) {\n      return;\n    } else if (context.readerScaffold.isOpen) {\n      context.readerScaffold.openOrClose();\n    } else {\n      // Don't open toolbar on chapter comments page\n      if (reader.isOnChapterCommentsPage) {\n        return;\n      }\n      if (appdata.settings.getReaderSetting(\n          reader.cid, reader.type.sourceKey, 'enableTapToTurnPages')) {\n        bool isLeft = false, isRight = false, isTop = false, isBottom = false;\n        final width = context.width;\n        final height = context.height;\n        final x = location.dx;\n        final y = location.dy;\n        if (x < width * _kTapToTurnPagePercent) {\n          isLeft = true;\n        } else if (x > width * (1 - _kTapToTurnPagePercent)) {\n          isRight = true;\n        }\n        if (y < height * _kTapToTurnPagePercent) {\n          isTop = true;\n        } else if (y > height * (1 - _kTapToTurnPagePercent)) {\n          isBottom = true;\n        }\n        bool isCenter = false;\n        var prev = () => context.reader.toPrevPage();\n        var next = () => context.reader.toNextPage();\n        if (appdata.settings.getReaderSetting(\n            reader.cid, reader.type.sourceKey, 'reverseTapToTurnPages')) {\n          prev = () => context.reader.toNextPage();\n          next = () => context.reader.toPrevPage();\n        }\n        switch (context.reader.mode) {\n          case ReaderMode.galleryLeftToRight:\n          case ReaderMode.continuousLeftToRight:\n            if (isLeft) {\n              prev();\n            } else if (isRight) {\n              next();\n            } else {\n              isCenter = true;\n            }\n          case ReaderMode.galleryRightToLeft:\n          case ReaderMode.continuousRightToLeft:\n            if (isLeft) {\n              next();\n            } else if (isRight) {\n              prev();\n            } else {\n              isCenter = true;\n            }\n          case ReaderMode.galleryTopToBottom:\n          case ReaderMode.continuousTopToBottom:\n            if (isTop) {\n              prev();\n            } else if (isBottom) {\n              next();\n            } else {\n              isCenter = true;\n            }\n        }\n        if (!isCenter) {\n          return;\n        }\n      }\n      context.readerScaffold.openOrClose();\n    }\n  }\n\n  void onDoubleTap(Offset location) {\n    context.reader._imageViewController?.handleDoubleTap(location);\n  }\n\n  void onSecondaryTapUp(Offset location) {\n    showMenuX(\n      context,\n      location,\n      [\n        MenuEntry(\n          icon: Icons.settings,\n          text: \"Settings\".tl,\n          onClick: () {\n            context.readerScaffold.openSetting();\n          },\n        ),\n        MenuEntry(\n          icon: Icons.menu,\n          text: \"Chapters\".tl,\n          onClick: () {\n            context.readerScaffold.openChapterDrawer();\n          },\n        ),\n        MenuEntry(\n          icon: Icons.fullscreen,\n          text: \"Fullscreen\".tl,\n          onClick: () {\n            context.reader.fullscreen();\n          },\n        ),\n        MenuEntry(\n          icon: Icons.exit_to_app,\n          text: \"Exit\".tl,\n          onClick: () {\n            context.pop();\n          },\n        ),\n        if (App.isDesktop && !reader.isLoading)\n          MenuEntry(\n            icon: Icons.copy,\n            text: \"Copy Image\".tl,\n            onClick: () => copyImage(location),\n          ),\n        if (!reader.isLoading)\n          MenuEntry(\n            icon: Icons.download_outlined,\n            text: \"Save Image\".tl,\n            onClick: () => saveImage(location),\n          ),\n      ],\n    );\n  }\n\n  void onLongPressedUp(Offset location) {\n    context.reader._imageViewController?.handleLongPressUp(location);\n  }\n\n  void onLongPressedDown(Offset location) {\n    context.reader._imageViewController?.handleLongPressDown(location);\n  }\n\n  void addDragListener(_DragListener listener) {\n    _dragListeners.add(listener);\n  }\n\n  void removeDragListener(_DragListener listener) {\n    _dragListeners.remove(listener);\n  }\n\n  @override\n  Object? get key => \"reader_gesture\";\n\n  void copyImage(Offset location) async {\n    var controller = reader._imageViewController;\n    var image = await controller!.getImageByOffset(location);\n    if (image != null) {\n      writeImageToClipboard(image);\n    } else {\n      context.showMessage(message: \"No Image\");\n    }\n  }\n\n  void saveImage(Offset location) async {\n    var controller = reader._imageViewController;\n    var image = await controller!.getImageByOffset(location);\n    if (image != null) {\n      var filetype = detectFileType(image);\n      saveFile(filename: \"image${filetype.ext}\", data: image);\n    } else {\n      context.showMessage(message: \"No Image\");\n    }\n  }\n}\n\nclass _DragListener {\n  void Function(Offset point)? onStart;\n  void Function(Offset offset)? onMove;\n  void Function()? onEnd;\n\n  _DragListener({this.onMove, this.onEnd});\n}\n"
  },
  {
    "path": "lib/pages/reader/images.dart",
    "content": "part of 'reader.dart';\n\nclass _ReaderImages extends StatefulWidget {\n  const _ReaderImages({super.key});\n\n  @override\n  State<_ReaderImages> createState() => _ReaderImagesState();\n}\n\nclass _ReaderImagesState extends State<_ReaderImages> {\n  String? error;\n\n  bool inProgress = false;\n\n  late _ReaderState reader;\n\n  @override\n  void initState() {\n    reader = context.reader;\n    reader.isLoading = true;\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    ImageDownloader.cancelAllLoadingImages();\n  }\n\n  /// Handle jumping to last page when _jumpToLastPageOnLoad is true\n  void _handleJumpToLastPage() {\n    if (reader._jumpToLastPageOnLoad) {\n      reader._page = reader.maxPage;\n      reader._jumpToLastPageOnLoad = false;\n    }\n  }\n\n  void load() async {\n    if (inProgress) return;\n    inProgress = true;\n    if (reader.type == ComicType.local ||\n        (LocalManager().isDownloaded(\n          reader.cid,\n          reader.type,\n          reader.chapter,\n          reader.widget.chapters,\n        ))) {\n      try {\n        var images = await LocalManager().getImages(\n          reader.cid,\n          reader.type,\n          reader.chapter,\n        );\n        setState(() {\n          reader.images = images;\n          reader.isLoading = false;\n          inProgress = false;\n          _handleJumpToLastPage();\n          Future.microtask(() {\n            reader.updateHistory();\n          });\n        });\n      } catch (e) {\n        setState(() {\n          error = e.toString();\n          reader.isLoading = false;\n          inProgress = false;\n        });\n      }\n    } else {\n      var cp = reader.widget.chapters?.ids.elementAtOrNull(reader.chapter - 1);\n      var res = await reader.type.comicSource!.loadComicPages!(\n        reader.widget.cid,\n        cp,\n      );\n      if (res.error) {\n        setState(() {\n          error = res.errorMessage;\n          reader.isLoading = false;\n          inProgress = false;\n        });\n      } else {\n        setState(() {\n          reader.images = res.data;\n          reader.isLoading = false;\n          inProgress = false;\n          _handleJumpToLastPage();\n          Future.microtask(() {\n            reader.updateHistory();\n          });\n        });\n      }\n    }\n    context.readerScaffold.update();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (reader.isLoading) {\n      load();\n      return const Center(child: CircularProgressIndicator());\n    } else if (error != null) {\n      return GestureDetector(\n        onTap: () {\n          context.readerScaffold.openOrClose();\n        },\n        child: SizedBox.expand(\n          child: NetworkError(\n            message: error!,\n            retry: () {\n              setState(() {\n                reader.isLoading = true;\n                error = null;\n              });\n            },\n          ),\n        ),\n      );\n    } else {\n      if (reader.mode.isGallery) {\n        var showComments =\n            appdata.settings.getReaderSetting(\n              reader.cid,\n              reader.type.sourceKey,\n              'showChapterComments',\n            ) ==\n            true;\n        var showCommentsAtEnd =\n            appdata.settings.getReaderSetting(\n              reader.cid,\n              reader.type.sourceKey,\n              'showChapterCommentsAtEnd',\n            ) ==\n            true;\n        return _GalleryMode(\n          key: Key(\n            '${reader.mode.key}_${reader.imagesPerPage}_${showComments}_$showCommentsAtEnd',\n          ),\n        );\n      } else {\n        return _ContinuousMode(key: Key(reader.mode.key));\n      }\n    }\n  }\n}\n\nclass _GalleryMode extends StatefulWidget {\n  const _GalleryMode({super.key});\n\n  @override\n  State<_GalleryMode> createState() => _GalleryModeState();\n}\n\nclass _GalleryModeState extends State<_GalleryMode>\n    implements _ImageViewController {\n  late PageController controller;\n\n  int get preCacheCount => appdata.settings[\"preloadImageCount\"];\n\n  var photoViewControllers = <int, PhotoViewController>{};\n\n  late _ReaderState reader;\n\n  bool get showChapterCommentsAtEnd {\n    if (reader.mode != ReaderMode.galleryLeftToRight &&\n        reader.mode != ReaderMode.galleryRightToLeft) {\n      return false;\n    }\n    if (reader.widget.chapters == null) return false;\n    var source = ComicSource.find(reader.type.sourceKey);\n    if (source?.chapterCommentsLoader == null) return false;\n    return appdata.settings.getReaderSetting(\n              reader.cid,\n              reader.type.sourceKey,\n              'showChapterComments',\n            ) ==\n            true &&\n        appdata.settings.getReaderSetting(\n              reader.cid,\n              reader.type.sourceKey,\n              'showChapterCommentsAtEnd',\n            ) ==\n            true;\n  }\n\n  int get totalImagePages {\n    return !reader.showSingleImageOnFirstPage()\n        ? (reader.images!.length / reader.imagesPerPage).ceil()\n        : 1 + ((reader.images!.length - 1) / reader.imagesPerPage).ceil();\n  }\n\n  int get totalPages => reader.totalPages;\n\n  bool isChapterCommentsPage(int pageIndex) {\n    return showChapterCommentsAtEnd && pageIndex == totalImagePages + 1;\n  }\n\n  var imageStates = <State<ComicImage>>{};\n\n  bool isLongPressing = false;\n\n  int fingers = 0;\n\n  @override\n  void initState() {\n    reader = context.reader;\n    controller = PageController(initialPage: reader.page);\n    reader._imageViewController = this;\n    Future.microtask(() {\n      context.readerScaffold.setFloatingButton(0);\n    });\n    super.initState();\n  }\n\n  /// Get the range of images for the given page. [page] is 1-based.\n  (int start, int end) getPageImagesRange(int page) {\n    var imagesPerPage = reader.imagesPerPage;\n    if (reader.showSingleImageOnFirstPage()) {\n      if (page == 1) {\n        return (0, 1);\n      } else {\n        int startIndex = (page - 2) * imagesPerPage + 1;\n        int endIndex = math.min(\n          startIndex + imagesPerPage,\n          reader.images!.length,\n        );\n        return (startIndex, endIndex);\n      }\n    } else {\n      int startIndex = (page - 1) * imagesPerPage;\n      int endIndex = math.min(\n        startIndex + imagesPerPage,\n        reader.images!.length,\n      );\n      return (startIndex, endIndex);\n    }\n  }\n\n  /// Get the image indices for current page. Returns null if no images.\n  /// Returns a single index if only one image, or a range if multiple images.\n  (int, int)? getCurrentPageImageRange() {\n    if (reader.images == null || reader.images!.isEmpty) {\n      return null;\n    }\n    var (startIndex, endIndex) = getPageImagesRange(reader.page);\n    return (startIndex, endIndex);\n  }\n\n  void cache(int startPage) {\n    for (int i = startPage - 1; i <= startPage + preCacheCount; i++) {\n      if (i == startPage ||\n          i <= 0 ||\n          i > totalPages ||\n          isChapterCommentsPage(i)) {\n        continue;\n      }\n      _cachePage(i, i == startPage + 1 || i == startPage - 1);\n    }\n  }\n\n  void _cachePage(int page, bool shouldPreCache) {\n    if (isChapterCommentsPage(page)) return;\n    var (startIndex, endIndex) = getPageImagesRange(page);\n    for (int i = startIndex; i < endIndex; i++) {\n      shouldPreCache\n          ? _precacheImage(i + 1, context)\n          : _preDownloadImage(i + 1, context);\n    }\n  }\n\n  Widget _buildChapterCommentsPage() {\n    var source = ComicSource.find(reader.type.sourceKey);\n    var chapters = reader.widget.chapters;\n    if (source == null || chapters == null) return const SizedBox();\n    var chapterIndex = reader.chapter - 1;\n    return _EmbeddedChapterCommentsPage(\n      comicId: reader.cid,\n      epId: chapters.ids.elementAt(chapterIndex),\n      source: source,\n      comicTitle: reader.widget.name,\n      chapterTitle: chapters.titles.elementAt(chapterIndex),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      onPointerDown: (event) {\n        fingers++;\n      },\n      onPointerUp: (event) {\n        fingers--;\n      },\n      onPointerCancel: (event) {\n        fingers--;\n      },\n      onPointerMove: (event) {\n        if (isLongPressing) {\n          var controller = photoViewControllers[reader.page]!;\n          Offset value = event.delta;\n          if (isLongPressing) {\n            controller.updateMultiple(position: controller.position + value);\n          }\n        }\n      },\n      child: PhotoViewGallery.builder(\n        backgroundDecoration: BoxDecoration(color: context.colorScheme.surface),\n        reverse: reader.mode == ReaderMode.galleryRightToLeft,\n        scrollDirection: reader.mode == ReaderMode.galleryTopToBottom\n            ? Axis.vertical\n            : Axis.horizontal,\n        itemCount: totalPages + 2,\n        builder: (BuildContext context, int index) {\n          if (index == 0 || index == totalPages + 1) {\n            return PhotoViewGalleryPageOptions.customChild(\n              child: const SizedBox(),\n            );\n          } else if (isChapterCommentsPage(index)) {\n            return PhotoViewGalleryPageOptions.customChild(\n              child: _buildChapterCommentsPage(),\n            );\n          } else {\n            var (startIndex, endIndex) = getPageImagesRange(index);\n            List<String> pageImages = reader.images!.sublist(\n              startIndex,\n              endIndex,\n            );\n\n            cache(index);\n\n            photoViewControllers[index] ??= PhotoViewController();\n\n            if (reader.imagesPerPage == 1 || pageImages.length == 1) {\n              return PhotoViewGalleryPageOptions(\n                filterQuality: FilterQuality.medium,\n                controller: photoViewControllers[index],\n                imageProvider: _createImageProviderFromKey(\n                  pageImages[0],\n                  context,\n                  startIndex + 1,\n                ),\n                fit: BoxFit.contain,\n                errorBuilder: (_, error, s, retry) {\n                  return NetworkError(message: error.toString(), retry: retry);\n                },\n              );\n            }\n\n            final viewportSize = MediaQuery.of(context).size;\n            return PhotoViewGalleryPageOptions.customChild(\n              childSize: viewportSize,\n              controller: photoViewControllers[index],\n              minScale: PhotoViewComputedScale.contained * 1.0,\n              maxScale: PhotoViewComputedScale.covered * 10.0,\n              child: buildPageImages(pageImages, startIndex),\n            );\n          }\n        },\n        pageController: controller,\n        loadingBuilder: (context, event) {\n          return PhotoView.customChild(\n            childSize: MediaQuery.of(context).size,\n            initialScale: PhotoViewComputedScale.contained,\n            minScale: PhotoViewComputedScale.contained * 1.0,\n            maxScale: PhotoViewComputedScale.covered * 10.0,\n            backgroundDecoration: BoxDecoration(\n              color: context.colorScheme.surface,\n            ),\n            child: Center(\n              child: SizedBox(\n                width: 20.0,\n                height: 20.0,\n                child: CircularProgressIndicator(\n                  backgroundColor: context.colorScheme.surfaceContainerHigh,\n                  value: event == null || event.expectedTotalBytes == null\n                      ? null\n                      : event.cumulativeBytesLoaded / event.expectedTotalBytes!,\n                ),\n              ),\n            ),\n          );\n        },\n        onPageChanged: (i) {\n          if (i == 0) {\n            if (reader.isFirstChapterOfGroup || !reader.toPrevChapter(toLastPage: true)) {\n              controller.jumpToPage(1);\n            }\n          } else if (i == totalPages + 1) {\n            if (reader.isLastChapterOfGroup || !reader.toNextChapter()) {\n              controller.jumpToPage(totalPages);\n            }\n          } else {\n            reader.setPage(i);\n            context.readerScaffold.update();\n            // Auto close toolbar when entering chapter comments page\n            if (isChapterCommentsPage(i) && context.readerScaffold.isOpen) {\n              context.readerScaffold.openOrClose();\n            }\n          }\n          // Remove other pages' controllers to reset their state.\n          var keys = photoViewControllers.keys.toList();\n          for (var key in keys) {\n            if (key != i) {\n              photoViewControllers.remove(key);\n            }\n          }\n        },\n      ),\n    );\n  }\n\n  Widget buildPageImages(List<String> images, int startIndex) {\n    Axis axis = (reader.mode == ReaderMode.galleryTopToBottom)\n        ? Axis.vertical\n        : Axis.horizontal;\n\n    bool reverse = reader.mode == ReaderMode.galleryRightToLeft;\n    if (reverse) {\n      images = images.reversed.toList();\n    }\n\n    List<Widget> imageWidgets;\n\n    if (images.length == 2) {\n      imageWidgets = [\n        Expanded(\n          child: ComicImage(\n            width: double.infinity,\n            height: double.infinity,\n            image: _createImageProviderFromKey(\n              images[0],\n              context,\n              startIndex + 1,\n            ),\n            fit: BoxFit.contain,\n            alignment: axis == Axis.vertical\n                ? Alignment.bottomCenter\n                : Alignment.centerRight,\n            onInit: (state) => imageStates.add(state),\n            onDispose: (state) => imageStates.remove(state),\n          ),\n        ),\n        Expanded(\n          child: ComicImage(\n            width: double.infinity,\n            height: double.infinity,\n            image: _createImageProviderFromKey(\n              images[1],\n              context,\n              startIndex + 2,\n            ),\n            fit: BoxFit.contain,\n            alignment: axis == Axis.vertical\n                ? Alignment.topCenter\n                : Alignment.centerLeft,\n            onInit: (state) => imageStates.add(state),\n            onDispose: (state) => imageStates.remove(state),\n          ),\n        ),\n      ];\n    } else {\n      imageWidgets = images.map((imageKey) {\n        startIndex++;\n        ImageProvider imageProvider = _createImageProviderFromKey(\n          imageKey,\n          context,\n          startIndex,\n        );\n        return Expanded(\n          child: ComicImage(\n            image: imageProvider,\n            fit: BoxFit.contain,\n            onInit: (state) => imageStates.add(state),\n            onDispose: (state) => imageStates.remove(state),\n          ),\n        );\n      }).toList();\n    }\n\n    return axis == Axis.vertical\n        ? Column(children: imageWidgets)\n        : Row(children: imageWidgets);\n  }\n\n  @override\n  Future<void> animateToPage(int page) {\n    if ((page - controller.page!.round()).abs() > 1) {\n      controller.jumpToPage(page > controller.page! ? page - 1 : page + 1);\n    }\n    return controller.animateToPage(\n      page,\n      duration: const Duration(milliseconds: 200),\n      curve: Curves.ease,\n    );\n  }\n\n  @override\n  void toPage(int page) {\n    controller.jumpToPage(page);\n  }\n\n  @override\n  void handleDoubleTap(Offset location) {\n    if (appdata.settings['quickCollectImage'] == 'DoubleTap') {\n      context.readerScaffold.addImageFavorite();\n      return;\n    }\n    var controller = photoViewControllers[reader.page]!;\n    controller.onDoubleClick?.call();\n  }\n\n  @override\n  void handleLongPressDown(Offset location) {\n    if (!appdata.settings['enableLongPressToZoom'] || fingers != 1) {\n      return;\n    }\n    var photoViewController = photoViewControllers[reader.page]!;\n    double target = photoViewController.getInitialScale!.call()! * 1.75;\n    var size = reader.size;\n    Offset zoomPosition;\n    if (appdata.settings['longPressZoomPosition'] != 'center') {\n      zoomPosition = Offset(\n        size.width / 2 - location.dx,\n        size.height / 2 - location.dy,\n      );\n    } else {\n      zoomPosition = Offset(0, 0);\n    }\n    photoViewController.animateScale?.call(target, zoomPosition);\n    isLongPressing = true;\n  }\n\n  @override\n  void handleLongPressUp(Offset location) {\n    if (!appdata.settings['enableLongPressToZoom'] || !isLongPressing) {\n      return;\n    }\n    var photoViewController = photoViewControllers[reader.page]!;\n    double target = photoViewController.getInitialScale!.call()!;\n    photoViewController.animateScale?.call(target);\n    isLongPressing = false;\n  }\n\n  Timer? keyRepeatTimer;\n\n  @override\n  void handleKeyEvent(KeyEvent event) {\n    bool? forward;\n    if (reader.mode == ReaderMode.galleryLeftToRight &&\n        event.logicalKey == LogicalKeyboardKey.arrowRight) {\n      forward = true;\n    } else if (reader.mode == ReaderMode.galleryRightToLeft &&\n        event.logicalKey == LogicalKeyboardKey.arrowLeft) {\n      forward = true;\n    } else if (reader.mode == ReaderMode.galleryTopToBottom &&\n        event.logicalKey == LogicalKeyboardKey.arrowDown) {\n      forward = true;\n    } else if (reader.mode == ReaderMode.galleryTopToBottom &&\n        event.logicalKey == LogicalKeyboardKey.arrowUp) {\n      forward = false;\n    } else if (reader.mode == ReaderMode.galleryLeftToRight &&\n        event.logicalKey == LogicalKeyboardKey.arrowLeft) {\n      forward = false;\n    } else if (reader.mode == ReaderMode.galleryRightToLeft &&\n        event.logicalKey == LogicalKeyboardKey.arrowRight) {\n      forward = false;\n    }\n    if (event is KeyDownEvent) {\n      if (keyRepeatTimer != null) {\n        keyRepeatTimer!.cancel();\n        keyRepeatTimer = null;\n      }\n      if (forward == true) {\n        reader.toPage(reader.page + 1);\n      } else if (forward == false) {\n        reader.toPage(reader.page - 1);\n      }\n    }\n    if (event is KeyRepeatEvent && keyRepeatTimer == null) {\n      keyRepeatTimer = Timer.periodic(\n        reader.enablePageAnimation(reader.cid, reader.type)\n            ? const Duration(milliseconds: 200)\n            : const Duration(milliseconds: 50),\n        (timer) {\n          if (!mounted) {\n            timer.cancel();\n            return;\n          } else if (forward == true) {\n            reader.toPage(reader.page + 1);\n          } else if (forward == false) {\n            reader.toPage(reader.page - 1);\n          }\n        },\n      );\n    }\n    if (event is KeyUpEvent && keyRepeatTimer != null) {\n      keyRepeatTimer!.cancel();\n      keyRepeatTimer = null;\n    }\n  }\n\n  @override\n  bool handleOnTap(Offset location) {\n    return false;\n  }\n\n  @override\n  Future<Uint8List?> getImageByOffset(Offset offset) async {\n    var imageKey = getImageKeyByOffset(offset);\n    if (imageKey == null) return null;\n    if (imageKey.startsWith(\"file://\")) {\n      return await File(imageKey.substring(7)).readAsBytes();\n    } else {\n      return (await CacheManager().findCache(\n        \"$imageKey@${context.reader.type.sourceKey}@${context.reader.cid}@${context.reader.eid}\",\n      ))!.readAsBytes();\n    }\n  }\n\n  @override\n  String? getImageKeyByOffset(Offset offset) {\n    var range = getCurrentPageImageRange();\n    if (range == null) return null;\n\n    var (startIndex, endIndex) = range;\n    int actualImageCount = endIndex - startIndex;\n\n    if (actualImageCount == 1) {\n      return reader.images![startIndex];\n    }\n\n    for (var imageState in imageStates) {\n      if ((imageState as _ComicImageState).containsPoint(offset)) {\n        var imageKey =\n            (imageState.widget.image as ReaderImageProvider).imageKey;\n        int index = reader.images!.indexOf(imageKey);\n        if (index >= startIndex && index < endIndex) {\n          return imageKey;\n        }\n      }\n    }\n\n    return reader.images![startIndex];\n  }\n}\n\nconst Set<PointerDeviceKind> _kTouchLikeDeviceTypes = <PointerDeviceKind>{\n  PointerDeviceKind.touch,\n  PointerDeviceKind.mouse,\n  PointerDeviceKind.stylus,\n  PointerDeviceKind.invertedStylus,\n  PointerDeviceKind.unknown,\n};\n\nconst double _kChangeChapterOffset = 160;\n\nclass _ContinuousMode extends StatefulWidget {\n  const _ContinuousMode({super.key});\n\n  @override\n  State<_ContinuousMode> createState() => _ContinuousModeState();\n}\n\nclass _ContinuousModeState extends State<_ContinuousMode>\n    implements _ImageViewController {\n  late _ReaderState reader;\n\n  var itemScrollController = ItemScrollController();\n  var itemPositionsListener = ItemPositionsListener.create();\n  var photoViewController = PhotoViewController();\n  ScrollController? _scrollController;\n\n  ScrollController get scrollController => _scrollController!;\n\n  var isCTRLPressed = false;\n  static var _isMouseScrolling = false;\n  var fingers = 0;\n  bool disableScroll = false;\n\n  late List<bool> cached;\n\n  int get preCacheCount => appdata.settings[\"preloadImageCount\"];\n\n  /// Whether the user was scrolling the page.\n  /// The gesture detector has a delay to detect tap event.\n  /// To handle the tap event, we need to know if the user was scrolling before the delay.\n  bool delayedIsScrolling = false;\n\n  var imageStates = <State<ComicImage>>{};\n\n  void delayedSetIsScrolling(bool value) {\n    Future.delayed(\n      const Duration(milliseconds: 300),\n      () => delayedIsScrolling = value,\n    );\n  }\n\n  bool prepareToPrevChapter = false;\n  bool prepareToNextChapter = false;\n  bool jumpToNextChapter = false;\n  bool jumpToPrevChapter = false;\n\n  bool isZoomedIn = false;\n  bool isLongPressing = false;\n\n  @override\n  void initState() {\n    reader = context.reader;\n    reader._imageViewController = this;\n    itemPositionsListener.itemPositions.addListener(onPositionChanged);\n    cached = List.filled(reader.maxPage + 2, false);\n    Future.delayed(\n      const Duration(milliseconds: 100),\n      () => cacheImages(reader.page),\n    );\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    itemPositionsListener.itemPositions.removeListener(onPositionChanged);\n    super.dispose();\n  }\n\n  void onPositionChanged() {\n    if (itemPositionsListener.itemPositions.value.isEmpty) {\n      return;\n    }\n    var page = itemPositionsListener.itemPositions.value.first.index;\n    page = page.clamp(1, reader.maxPage);\n    if (page != reader.page) {\n      reader.setPage(page);\n      context.readerScaffold.update();\n    }\n    cacheImages(page);\n  }\n\n  double? _futurePosition;\n\n  void smoothTo(double offset) {\n    if (HardwareKeyboard.instance.isShiftPressed) {\n      return;\n    }\n    var currentLocation = scrollController.position.pixels;\n    var old = _futurePosition;\n    _futurePosition ??= currentLocation;\n    double k = (_futurePosition! - currentLocation).abs() / 1600 + 1;\n    final customSpeed = appdata.settings.getReaderSetting(\n      context.reader.cid,\n      context.reader.type.sourceKey,\n      \"readerScrollSpeed\",\n    );\n    if (customSpeed is num) {\n      k *= customSpeed;\n    }\n    _futurePosition = _futurePosition! + offset * k;\n    var beforeOffset = (_futurePosition! - currentLocation).abs();\n    _futurePosition = _futurePosition!.clamp(\n      scrollController.position.minScrollExtent,\n      scrollController.position.maxScrollExtent,\n    );\n    var afterOffset = (_futurePosition! - currentLocation).abs();\n    if (_futurePosition == old) return;\n    var target = _futurePosition!;\n    var duration = const Duration(milliseconds: 160);\n    if (afterOffset < beforeOffset) {\n      duration = duration * (afterOffset / beforeOffset);\n      if (duration < Duration(milliseconds: 10)) {\n        duration = Duration(milliseconds: 10);\n      }\n    }\n    scrollController\n        .animateTo(_futurePosition!, duration: duration, curve: Curves.linear)\n        .then((_) {\n          var current = scrollController.position.pixels;\n          if (current == target && current == _futurePosition) {\n            _futurePosition = null;\n          }\n        });\n  }\n\n  void onPointerSignal(PointerSignalEvent event) {\n    if (event is PointerScrollEvent) {\n      if (!_isMouseScrolling) {\n        setState(() {\n          _isMouseScrolling = true;\n        });\n      }\n      if (isCTRLPressed) {\n        return;\n      }\n      smoothTo(event.scrollDelta.dy);\n    }\n  }\n\n  void cacheImages(int current) {\n    for (int i = current + 1; i <= current + preCacheCount; i++) {\n      if (i <= reader.maxPage && !cached[i]) {\n        _preDownloadImage(i, context);\n        cached[i] = true;\n      }\n    }\n  }\n\n  void onScroll() {\n    if (prepareToPrevChapter) {\n      jumpToNextChapter = false;\n      jumpToPrevChapter =\n          scrollController.offset <\n          scrollController.position.minScrollExtent - _kChangeChapterOffset;\n    } else if (prepareToNextChapter) {\n      jumpToNextChapter =\n          scrollController.offset >\n          scrollController.position.maxScrollExtent + _kChangeChapterOffset;\n      jumpToPrevChapter = false;\n    }\n  }\n\n  bool onScaleUpdate([double? scale]) {\n    if (prepareToNextChapter || prepareToPrevChapter) {\n      setState(() {\n        prepareToPrevChapter = false;\n        prepareToNextChapter = false;\n      });\n      context.readerScaffold.setFloatingButton(0);\n    }\n    var isZoomedIn = (scale ?? photoViewController.scale) != 1.0;\n    if (isZoomedIn != this.isZoomedIn) {\n      setState(() {\n        this.isZoomedIn = isZoomedIn;\n      });\n    }\n    return false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    Widget widget = ScrollablePositionedList.builder(\n      initialScrollIndex: reader.page,\n      itemScrollController: itemScrollController,\n      itemPositionsListener: itemPositionsListener,\n      scrollControllerCallback: (scrollController) {\n        if (_scrollController != null) {\n          _scrollController!.removeListener(onScroll);\n        }\n        _scrollController = scrollController;\n        _scrollController!.addListener(onScroll);\n      },\n      itemCount: reader.maxPage + 2,\n      addSemanticIndexes: false,\n      scrollDirection: reader.mode == ReaderMode.continuousTopToBottom\n          ? Axis.vertical\n          : Axis.horizontal,\n      reverse: reader.mode == ReaderMode.continuousRightToLeft,\n      physics: isCTRLPressed || _isMouseScrolling || disableScroll\n          ? const NeverScrollableScrollPhysics()\n          : isZoomedIn\n          ? const ClampingScrollPhysics()\n          : const BouncingScrollPhysics(),\n      itemBuilder: (context, index) {\n        if (index == 0 || index == reader.maxPage + 1) {\n          return const SizedBox();\n        }\n        double? width, height;\n        if (reader.mode == ReaderMode.continuousLeftToRight ||\n            reader.mode == ReaderMode.continuousRightToLeft) {\n          height = double.infinity;\n        } else {\n          width = double.infinity;\n        }\n\n        ImageProvider image = _createImageProvider(index, context);\n\n        return ColoredBox(\n          color: context.colorScheme.surface,\n          child: ComicImage(\n            filterQuality: FilterQuality.medium,\n            image: image,\n            width: width,\n            height: height,\n            fit: BoxFit.contain,\n            onInit: (state) => imageStates.add(state),\n            onDispose: (state) => imageStates.remove(state),\n          ),\n        );\n      },\n      scrollBehavior: const MaterialScrollBehavior().copyWith(\n        scrollbars: false,\n        dragDevices: _kTouchLikeDeviceTypes,\n      ),\n    );\n\n    widget = Stack(\n      children: [\n        Positioned.fill(child: buildBackground(context)),\n        Positioned.fill(child: widget),\n      ],\n    );\n\n    widget = Listener(\n      onPointerDown: (event) {\n        fingers++;\n        if (fingers > 1 && !disableScroll) {\n          setState(() {\n            disableScroll = true;\n          });\n        }\n        _futurePosition = null;\n        if (_isMouseScrolling) {\n          setState(() {\n            _isMouseScrolling = false;\n          });\n        }\n      },\n      onPointerUp: (event) {\n        fingers--;\n        if (fingers <= 1 && disableScroll) {\n          setState(() {\n            disableScroll = false;\n          });\n        }\n        if (fingers == 0) {\n          if (jumpToPrevChapter) {\n            context.readerScaffold.setFloatingButton(0);\n            reader.toPrevChapter(toLastPage: true);\n          } else if (jumpToNextChapter) {\n            context.readerScaffold.setFloatingButton(0);\n            reader.toNextChapter();\n          }\n        }\n      },\n      onPointerCancel: (event) {\n        fingers--;\n        if (fingers <= 1 && disableScroll) {\n          setState(() {\n            disableScroll = false;\n          });\n        }\n      },\n      onPointerPanZoomUpdate: (event) {\n        if (event.scale == 1.0) {\n          smoothTo(0 - event.panDelta.dy);\n        }\n      },\n      onPointerMove: (event) {\n        Offset value = event.delta;\n        if (photoViewController.scale == 1 || fingers != 1) {\n          return;\n        }\n        Offset offset;\n        var sp = scrollController.position;\n        if (sp.pixels <= sp.minScrollExtent ||\n            sp.pixels >= sp.maxScrollExtent) {\n          offset = Offset(value.dx, value.dy);\n        } else {\n          if (reader.mode == ReaderMode.continuousTopToBottom) {\n            offset = Offset(value.dx, 0);\n          } else {\n            offset = Offset(0, value.dy);\n          }\n        }\n        if (isLongPressing) {\n          offset += value;\n        }\n        photoViewController.updateMultiple(\n          position: photoViewController.position + offset,\n        );\n      },\n      onPointerSignal: onPointerSignal,\n      child: widget,\n    );\n\n    widget = NotificationListener<ScrollNotification>(\n      onNotification: (notification) {\n        if (notification is ScrollStartNotification) {\n          delayedSetIsScrolling(true);\n        } else if (notification is ScrollEndNotification) {\n          delayedSetIsScrolling(false);\n        }\n\n        var scale = photoViewController.scale ?? 1.0;\n\n        if (notification is ScrollUpdateNotification &&\n            (scale - 1).abs() < 0.05) {\n          if (!scrollController.hasClients) return false;\n          if (scrollController.position.pixels <=\n                  scrollController.position.minScrollExtent &&\n              !reader.isFirstChapterOfGroup) {\n            if (!prepareToPrevChapter) {\n              jumpToPrevChapter = false;\n              jumpToNextChapter = false;\n              context.readerScaffold.setFloatingButton(-1);\n              setState(() {\n                prepareToPrevChapter = true;\n              });\n            }\n          } else if (scrollController.position.pixels >=\n                  scrollController.position.maxScrollExtent &&\n              !reader.isLastChapterOfGroup) {\n            if (!prepareToNextChapter) {\n              jumpToPrevChapter = false;\n              jumpToNextChapter = false;\n              context.readerScaffold.setFloatingButton(1);\n              setState(() {\n                prepareToNextChapter = true;\n              });\n            }\n          } else {\n            context.readerScaffold.setFloatingButton(0);\n            if (prepareToPrevChapter || prepareToNextChapter) {\n              jumpToPrevChapter = false;\n              jumpToNextChapter = false;\n              setState(() {\n                prepareToPrevChapter = false;\n                prepareToNextChapter = false;\n              });\n            }\n          }\n        }\n\n        return true;\n      },\n      child: widget,\n    );\n    var width = reader.size.width;\n    var height = reader.size.height;\n    if (appdata.settings['limitImageWidth'] &&\n        width / height > 0.7 &&\n        reader.mode == ReaderMode.continuousTopToBottom) {\n      width = height * 0.7;\n    }\n\n    return PhotoView.customChild(\n      backgroundDecoration: BoxDecoration(color: context.colorScheme.surface),\n      childSize: Size(width, height),\n      minScale: 1.0,\n      maxScale: 2.5,\n      strictScale: true,\n      controller: photoViewController,\n      onScaleUpdate: onScaleUpdate,\n      child: SizedBox(width: width, height: height, child: widget),\n    );\n  }\n\n  Widget buildBackground(BuildContext context) {\n    return Column(\n      children: [\n        SizedBox(height: context.padding.top + 16),\n        if (prepareToPrevChapter)\n          _SwipeChangeChapterProgress(\n            controller: scrollController,\n            isPrev: true,\n          ),\n        const Spacer(),\n        if (prepareToNextChapter)\n          _SwipeChangeChapterProgress(\n            controller: scrollController,\n            isPrev: false,\n          ),\n        SizedBox(height: 36),\n      ],\n    );\n  }\n\n  @override\n  Future<void> animateToPage(int page) {\n    return itemScrollController.scrollTo(\n      index: page,\n      duration: const Duration(milliseconds: 200),\n      curve: Curves.ease,\n    );\n  }\n\n  @override\n  void handleDoubleTap(Offset location) {\n    if (appdata.settings['quickCollectImage'] == 'DoubleTap') {\n      context.readerScaffold.addImageFavorite();\n      return;\n    }\n    double target;\n    if (photoViewController.scale !=\n        photoViewController.getInitialScale?.call()) {\n      target = photoViewController.getInitialScale!.call()!;\n    } else {\n      target = photoViewController.getInitialScale!.call()! * 1.75;\n    }\n    var size = MediaQuery.of(context).size;\n    photoViewController.animateScale?.call(\n      target,\n      Offset(size.width / 2 - location.dx, size.height / 2 - location.dy),\n    );\n    onScaleUpdate(target);\n  }\n\n  @override\n  void handleLongPressDown(Offset location) {\n    if (!appdata.settings['enableLongPressToZoom'] || delayedIsScrolling) {\n      return;\n    }\n    double target = photoViewController.getInitialScale!.call()! * 1.75;\n    var size = reader.size;\n    Offset zoomPosition;\n    if (appdata.settings['longPressZoomPosition'] != 'center') {\n      zoomPosition = Offset(\n        size.width / 2 - location.dx,\n        size.height / 2 - location.dy,\n      );\n    } else {\n      zoomPosition = Offset(0, 0);\n    }\n    photoViewController.animateScale?.call(target, zoomPosition);\n    onScaleUpdate(target);\n    isLongPressing = true;\n  }\n\n  @override\n  void handleLongPressUp(Offset location) {\n    if (!appdata.settings['enableLongPressToZoom']) {\n      return;\n    }\n    double target = photoViewController.getInitialScale!.call()!;\n    photoViewController.animateScale?.call(target);\n    onScaleUpdate(target);\n    isLongPressing = false;\n  }\n\n  @override\n  void toPage(int page) {\n    itemScrollController.jumpTo(index: page);\n    _futurePosition = null;\n  }\n\n  @override\n  void handleKeyEvent(KeyEvent event) {\n    if (event.logicalKey == LogicalKeyboardKey.controlLeft ||\n        event.logicalKey == LogicalKeyboardKey.controlRight) {\n      setState(() {\n        if (event is KeyDownEvent) {\n          isCTRLPressed = true;\n        } else if (event is KeyUpEvent) {\n          isCTRLPressed = false;\n        }\n      });\n    }\n    if (event is KeyUpEvent) {\n      return;\n    }\n    bool? forward;\n    if (reader.mode == ReaderMode.continuousLeftToRight &&\n        event.logicalKey == LogicalKeyboardKey.arrowRight) {\n      forward = true;\n    } else if (reader.mode == ReaderMode.continuousRightToLeft &&\n        event.logicalKey == LogicalKeyboardKey.arrowLeft) {\n      forward = true;\n    } else if (reader.mode == ReaderMode.continuousTopToBottom &&\n        event.logicalKey == LogicalKeyboardKey.arrowDown) {\n      forward = true;\n    } else if (reader.mode == ReaderMode.continuousTopToBottom &&\n        event.logicalKey == LogicalKeyboardKey.arrowUp) {\n      forward = false;\n    } else if (reader.mode == ReaderMode.continuousLeftToRight &&\n        event.logicalKey == LogicalKeyboardKey.arrowLeft) {\n      forward = false;\n    } else if (reader.mode == ReaderMode.continuousRightToLeft &&\n        event.logicalKey == LogicalKeyboardKey.arrowRight) {\n      forward = false;\n    }\n    if (forward == true) {\n      scrollController.animateTo(\n        scrollController.offset + context.height * 0.25,\n        duration: const Duration(milliseconds: 200),\n        curve: Curves.ease,\n      );\n    } else if (forward == false) {\n      scrollController.animateTo(\n        scrollController.offset - context.height * 0.25,\n        duration: const Duration(milliseconds: 200),\n        curve: Curves.ease,\n      );\n    }\n  }\n\n  @override\n  bool handleOnTap(Offset location) {\n    if (delayedIsScrolling) {\n      return true;\n    }\n    return false;\n  }\n\n  @override\n  Future<Uint8List?> getImageByOffset(Offset offset) async {\n    var imageKey = getImageKeyByOffset(offset);\n    if (imageKey == null) return null;\n    if (imageKey.startsWith(\"file://\")) {\n      return await File(imageKey.substring(7)).readAsBytes();\n    } else {\n      return (await CacheManager().findCache(\n        \"$imageKey@${context.reader.type.sourceKey}@${context.reader.cid}@${context.reader.eid}\",\n      ))!.readAsBytes();\n    }\n  }\n\n  @override\n  String? getImageKeyByOffset(Offset offset) {\n    String? imageKey;\n    for (var imageState in imageStates) {\n      if ((imageState as _ComicImageState).containsPoint(offset)) {\n        imageKey = (imageState.widget.image as ReaderImageProvider).imageKey;\n      }\n    }\n    return imageKey;\n  }\n}\n\nImageProvider _createImageProviderFromKey(\n  String imageKey,\n  BuildContext context,\n  int page,\n) {\n  var reader = context.reader;\n  return ReaderImageProvider(\n    imageKey,\n    reader.type.comicSource?.key,\n    reader.cid,\n    reader.eid,\n    reader.page,\n    enableResize: reader.mode.isContinuous, // For continuous mode, we need to resize the image to improve performance\n  );\n}\n\nImageProvider _createImageProvider(int page, BuildContext context) {\n  var reader = context.reader;\n  var imageKey = reader.images![page - 1];\n  return _createImageProviderFromKey(imageKey, context, page);\n}\n\n/// [_precacheImage] is used to precache the image for the given page.\n/// The image is cached using the flutter's [precacheImage] method.\n/// The image will be downloaded and decoded into memory.\nvoid _precacheImage(int page, BuildContext context) {\n  if (page <= 0 || page > context.reader.images!.length) {\n    return;\n  }\n  precacheImage(_createImageProvider(page, context), context);\n}\n\n/// [_preDownloadImage] is used to download the image for the given page.\n/// The image is downloaded using the [CacheManager] and saved to the local storage.\nvoid _preDownloadImage(int page, BuildContext context) {\n  if (page <= 0 || page > context.reader.images!.length) {\n    return;\n  }\n  var reader = context.reader;\n  var imageKey = reader.images![page - 1];\n  if (imageKey.startsWith(\"file://\")) {\n    return;\n  }\n  var cid = reader.cid;\n  var eid = reader.eid;\n  var sourceKey = reader.type.comicSource?.key;\n  ImageDownloader.loadComicImage(imageKey, sourceKey, cid, eid);\n}\n\nclass _SwipeChangeChapterProgress extends StatefulWidget {\n  const _SwipeChangeChapterProgress({this.controller, required this.isPrev});\n\n  final ScrollController? controller;\n\n  final bool isPrev;\n\n  @override\n  State<_SwipeChangeChapterProgress> createState() =>\n      _SwipeChangeChapterProgressState();\n}\n\nclass _SwipeChangeChapterProgressState\n    extends State<_SwipeChangeChapterProgress> {\n  double value = 0;\n\n  late final isPrev = widget.isPrev;\n\n  ScrollController? controller;\n\n  @override\n  void initState() {\n    super.initState();\n    if (widget.controller != null) {\n      controller = widget.controller;\n      controller!.addListener(onScroll);\n    }\n  }\n\n  @override\n  void didUpdateWidget(covariant _SwipeChangeChapterProgress oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.controller != widget.controller) {\n      controller?.removeListener(onScroll);\n      controller = widget.controller;\n      controller?.addListener(onScroll);\n      if (value != 0) {\n        setState(() {\n          value = 0;\n        });\n      }\n    }\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    controller?.removeListener(onScroll);\n  }\n\n  void onScroll() {\n    var position = controller!.position.pixels;\n    var offset = isPrev\n        ? controller!.position.minScrollExtent - position\n        : position - controller!.position.maxScrollExtent;\n    var newValue = offset / _kChangeChapterOffset;\n    newValue = newValue.clamp(0.0, 1.0);\n    if (newValue != value) {\n      setState(() {\n        value = newValue;\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final msg = widget.isPrev\n        ? \"Swipe down for previous chapter\".tl\n        : \"Swipe up for next chapter\".tl;\n\n    return CustomPaint(\n      painter: _ProgressPainter(\n        value: value,\n        backgroundColor: context.colorScheme.surfaceContainerLow,\n        color: context.colorScheme.surfaceContainerHighest,\n      ),\n      child: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Icon(\n            widget.isPrev ? Icons.arrow_downward : Icons.arrow_upward,\n            color: context.colorScheme.onSurface,\n            size: 16,\n          ),\n          const SizedBox(width: 4),\n          Text(msg),\n        ],\n      ).paddingVertical(6).paddingHorizontal(16),\n    );\n  }\n}\n\nclass _ProgressPainter extends CustomPainter {\n  final double value;\n\n  final Color backgroundColor;\n\n  final Color color;\n\n  const _ProgressPainter({\n    required this.value,\n    required this.backgroundColor,\n    required this.color,\n  });\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    final paint = Paint()\n      ..color = backgroundColor\n      ..style = PaintingStyle.fill;\n    canvas.drawRRect(\n      RRect.fromLTRBR(0, 0, size.width, size.height, Radius.circular(16)),\n      paint,\n    );\n\n    paint.color = color;\n    canvas.drawRRect(\n      RRect.fromLTRBR(\n        0,\n        0,\n        size.width * value,\n        size.height,\n        Radius.circular(16),\n      ),\n      paint,\n    );\n  }\n\n  @override\n  bool shouldRepaint(covariant CustomPainter oldDelegate) {\n    return oldDelegate is! _ProgressPainter ||\n        oldDelegate.value != value ||\n        oldDelegate.backgroundColor != backgroundColor ||\n        oldDelegate.color != color;\n  }\n}\n"
  },
  {
    "path": "lib/pages/reader/loading.dart",
    "content": "part of 'reader.dart';\n\nclass ReaderWithLoading extends StatefulWidget {\n  const ReaderWithLoading({\n    super.key,\n    required this.id,\n    required this.sourceKey,\n    this.initialEp,\n    this.initialPage,\n  });\n\n  final String id;\n\n  final String sourceKey;\n\n  final int? initialEp;\n\n  final int? initialPage;\n\n  @override\n  State<ReaderWithLoading> createState() => _ReaderWithLoadingState();\n}\n\nclass _ReaderWithLoadingState\n    extends LoadingState<ReaderWithLoading, ReaderProps> {\n  @override\n  Widget buildContent(BuildContext context, ReaderProps data) {\n    return Reader(\n      type: data.type,\n      cid: data.cid,\n      name: data.name,\n      chapters: data.chapters,\n      history: data.history,\n      initialChapter: widget.initialEp ?? data.history.ep,\n      initialPage: widget.initialPage ?? data.history.page,\n      initialChapterGroup: data.history.group,\n      author: data.author,\n      tags: data.tags,\n    );\n  }\n\n  @override\n  Future<Res<ReaderProps>> loadData() async {\n    var comicSource = ComicSource.find(widget.sourceKey);\n    var history = HistoryManager().find(\n      widget.id,\n      ComicType.fromKey(widget.sourceKey),\n    );\n    if (comicSource == null) {\n      var localComic = LocalManager().find(\n        widget.id,\n        ComicType.fromKey(widget.sourceKey),\n      );\n      if (localComic == null) {\n        return Res.error(\"comic not found\");\n      }\n      return Res(\n        ReaderProps(\n          type: ComicType.fromKey(widget.sourceKey),\n          cid: widget.id,\n          name: localComic.title,\n          chapters: localComic.chapters,\n          history: history ??\n              History.fromModel(\n                model: localComic,\n                ep: 0,\n                page: 0,\n              ),\n          author: localComic.subtitle,\n          tags: localComic.tags,\n        ),\n      );\n    } else {\n      var comic = await comicSource.loadComicInfo!(widget.id);\n      if (comic.error) {\n        return Res.fromErrorRes(comic);\n      }\n      return Res(\n        ReaderProps(\n          type: ComicType.fromKey(widget.sourceKey),\n          cid: widget.id,\n          name: comic.data.title,\n          chapters: comic.data.chapters,\n          history: history ??\n              History.fromModel(\n                model: comic.data,\n                ep: 0,\n                page: 0,\n              ),\n          author: comic.data.findAuthor() ?? \"\",\n          tags: comic.data.plainTags,\n        ),\n      );\n    }\n  }\n}\n\nclass ReaderProps {\n  final ComicType type;\n\n  final String cid;\n\n  final String name;\n\n  final ComicChapters? chapters;\n\n  final History history;\n\n  final String author;\n\n  final List<String> tags;\n\n  const ReaderProps({\n    required this.type,\n    required this.cid,\n    required this.name,\n    required this.chapters,\n    required this.history,\n    required this.author,\n    required this.tags,\n  });\n}\n"
  },
  {
    "path": "lib/pages/reader/reader.dart",
    "content": "library;\n\nimport 'dart:async';\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_memory_info/flutter_memory_info.dart';\nimport 'package:photo_view/photo_view.dart';\nimport 'package:photo_view/photo_view_gallery.dart';\nimport 'package:scrollable_positioned_list/scrollable_positioned_list.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/components/custom_slider.dart';\nimport 'package:venera/components/rich_comment_content.dart';\nimport 'package:venera/components/window_frame.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/cache_manager.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/consts.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/global_state.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/image_provider/cached_image.dart';\nimport 'package:venera/foundation/image_provider/reader_image.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/network/images.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/clipboard_image.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/file_type.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'package:venera/utils/volume.dart';\nimport 'package:window_manager/window_manager.dart';\nimport 'package:battery_plus/battery_plus.dart';\nimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';\n\npart 'scaffold.dart';\n\npart 'images.dart';\n\npart 'gesture.dart';\n\npart 'comic_image.dart';\n\npart 'loading.dart';\n\npart 'chapters.dart';\n\npart 'chapter_comments.dart';\n\nextension _ReaderContext on BuildContext {\n  _ReaderState get reader => findAncestorStateOfType<_ReaderState>()!;\n\n  _ReaderScaffoldState get readerScaffold =>\n      findAncestorStateOfType<_ReaderScaffoldState>()!;\n}\n\nclass Reader extends StatefulWidget {\n  const Reader({\n    super.key,\n    required this.type,\n    required this.cid,\n    required this.name,\n    required this.chapters,\n    required this.history,\n    this.initialPage,\n    this.initialChapter,\n    this.initialChapterGroup,\n    required this.author,\n    required this.tags,\n  });\n\n  final ComicType type;\n\n  final String author;\n\n  final List<String> tags;\n\n  final String cid;\n\n  final String name;\n\n  final ComicChapters? chapters;\n\n  /// Starts from 1, invalid values equal to 1\n  final int? initialPage;\n\n  /// Starts from 1, invalid values equal to 1\n  final int? initialChapter;\n\n  /// Starts from 1, invalid values equal to 1\n  final int? initialChapterGroup;\n\n  final History history;\n\n  @override\n  State<Reader> createState() => _ReaderState();\n}\n\nclass _ReaderState extends State<Reader>\n    with _ReaderLocation, _ReaderWindow, _VolumeListener, _ImagePerPageHandler {\n  @override\n  void update() {\n    setState(() {});\n  }\n\n  /// The maximum page number for images only (excluding chapter comments page).\n  /// This is used for display purposes and history recording.\n  @override\n  int get maxPage {\n    if (images == null) return 1;\n    return !showSingleImageOnFirstPage()\n        ? (images!.length / imagesPerPage).ceil()\n        : 1 + ((images!.length - 1) / imagesPerPage).ceil();\n  }\n\n  /// Total pages including chapter comments page (used for internal page control).\n  @override\n  int get totalPages {\n    var pages = maxPage;\n    if (_shouldShowChapterCommentsAtEnd) pages++;\n    return pages;\n  }\n\n  /// Whether the current page is the chapter comments page.\n  @override\n  bool get isOnChapterCommentsPage {\n    return _shouldShowChapterCommentsAtEnd && _page > maxPage;\n  }\n\n  bool get _shouldShowChapterCommentsAtEnd {\n    if (mode != ReaderMode.galleryLeftToRight &&\n        mode != ReaderMode.galleryRightToLeft) {\n      return false;\n    }\n    if (widget.chapters == null) return false;\n    var source = ComicSource.find(type.sourceKey);\n    if (source?.chapterCommentsLoader == null) return false;\n    return appdata.settings.getReaderSetting(\n              cid,\n              type.sourceKey,\n              'showChapterComments',\n            ) ==\n            true &&\n        appdata.settings.getReaderSetting(\n              cid,\n              type.sourceKey,\n              'showChapterCommentsAtEnd',\n            ) ==\n            true;\n  }\n\n  @override\n  ComicType get type => widget.type;\n\n  @override\n  String get cid => widget.cid;\n\n  String get eid => widget.chapters?.ids.elementAtOrNull(chapter - 1) ?? '0';\n\n  @override\n  List<String>? images;\n\n  @override\n  late ReaderMode mode;\n\n  @override\n  bool get isPortrait =>\n      MediaQuery.of(context).orientation == Orientation.portrait;\n\n  History? history;\n\n  @override\n  bool isLoading = false;\n\n  var focusNode = FocusNode();\n\n  @override\n  void initState() {\n    page = widget.initialPage ?? 1;\n    if (page < 1) {\n      page = 1;\n    }\n    chapter = widget.initialChapter ?? 1;\n    if (chapter < 1) {\n      chapter = 1;\n    }\n    if (widget.initialChapterGroup != null) {\n      for (int i = 0; i < (widget.initialChapterGroup! - 1); i++) {\n        chapter += widget.chapters!.getGroupByIndex(i).length;\n      }\n    }\n    if (widget.initialPage != null) {\n      page = widget.initialPage!;\n      if (page < 1) {\n        page = 1;\n      }\n    }\n    // mode = ReaderMode.fromKey(appdata.settings['readerMode']);\n    mode = ReaderMode.fromKey(\n      appdata.settings.getReaderSetting(cid, type.sourceKey, 'readerMode'),\n    );\n    history = widget.history;\n    if (!appdata.settings.getReaderSetting(\n      cid,\n      type.sourceKey,\n      'showSystemStatusBar',\n    )) {\n      SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);\n    }\n    if (appdata.settings.getReaderSetting(\n      cid,\n      type.sourceKey,\n      'enableTurnPageByVolumeKey',\n    )) {\n      handleVolumeEvent();\n    }\n    setImageCacheSize();\n    Future.delayed(const Duration(milliseconds: 200), () {\n      LocalFavoritesManager().onRead(cid, type);\n    });\n    super.initState();\n  }\n\n  bool _isInitialized = false;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    if (!_isInitialized) {\n      initImagesPerPage(widget.initialPage ?? 1);\n      _isInitialized = true;\n    } else {\n      // For orientation changed\n      _checkImagesPerPageChange();\n    }\n    initReaderWindow();\n  }\n\n  void setImageCacheSize() async {\n    var availableRAM = await MemoryInfo.getFreePhysicalMemorySize();\n    if (availableRAM == null) return;\n    int maxImageCacheSize;\n    if (availableRAM < 1 << 30) {\n      maxImageCacheSize = 100 << 20;\n    } else if (availableRAM < 2 << 30) {\n      maxImageCacheSize = 200 << 20;\n    } else if (availableRAM < 4 << 30) {\n      maxImageCacheSize = 300 << 20;\n    } else {\n      maxImageCacheSize = 500 << 20;\n    }\n    Log.info(\n      \"Reader\",\n      \"Detect available RAM: $availableRAM, set image cache size to $maxImageCacheSize\",\n    );\n    PaintingBinding.instance.imageCache.maximumSizeBytes = maxImageCacheSize;\n  }\n\n  @override\n  void dispose() {\n    if (isFullscreen) {\n      fullscreen();\n    }\n    autoPageTurningTimer?.cancel();\n    focusNode.dispose();\n    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n    stopVolumeEvent();\n    Future.microtask(() {\n      DataSync().onDataChanged();\n    });\n    PaintingBinding.instance.imageCache.maximumSizeBytes = 100 << 20;\n    disposeReaderWindow();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    _checkImagesPerPageChange();\n    return KeyboardListener(\n      focusNode: focusNode,\n      autofocus: true,\n      onKeyEvent: onKeyEvent,\n      child: Overlay(\n        initialEntries: [\n          OverlayEntry(\n            builder: (context) {\n              return _ReaderScaffold(\n                child: _ReaderGestureDetector(\n                  child: _ReaderImages(key: Key(chapter.toString())),\n                ),\n              );\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  void onKeyEvent(KeyEvent event) {\n    if (event.logicalKey == LogicalKeyboardKey.f12 && event is KeyUpEvent) {\n      fullscreen();\n    }\n    _imageViewController?.handleKeyEvent(event);\n  }\n\n  @override\n  int get maxChapter => widget.chapters?.length ?? 1;\n\n  @override\n  void onPageChanged() {\n    updateHistory();\n  }\n\n  /// Prevent multiple history updates in a short time.\n  /// `HistoryManager().addHistoryAsync` is a high-cost operation because it creates a new isolate.\n  Timer? _updateHistoryTimer;\n\n  void updateHistory() {\n    if (history != null) {\n      // page >= maxPage handles both last image page and chapter comments page\n      if (page >= maxPage) {\n        /// Record the last image of chapter\n        history!.page = images?.length ?? 1;\n      } else {\n        /// Record the first image of the page\n        if (!showSingleImageOnFirstPage() || imagesPerPage == 1) {\n          history!.page = (page - 1) * imagesPerPage + 1;\n        } else {\n          if (page == 1) {\n            history!.page = 1;\n          } else {\n            history!.page = (page - 2) * imagesPerPage + 2;\n          }\n        }\n      }\n      history!.maxPage = images?.length ?? 1;\n      if (widget.chapters?.isGrouped ?? false) {\n        int g = 0;\n        int c = chapter;\n        while (c > widget.chapters!.getGroupByIndex(g).length) {\n          c -= widget.chapters!.getGroupByIndex(g).length;\n          g++;\n        }\n        history!.readEpisode.add('${g + 1}-$c');\n        history!.ep = c;\n        history!.group = g + 1;\n      } else {\n        history!.readEpisode.add(chapter.toString());\n        history!.ep = chapter;\n      }\n      history!.time = DateTime.now();\n      _updateHistoryTimer?.cancel();\n      _updateHistoryTimer = Timer(const Duration(seconds: 1), () {\n        HistoryManager().addHistoryAsync(history!);\n        _updateHistoryTimer = null;\n      });\n    }\n  }\n\n  bool get isFirstChapterOfGroup {\n    if (widget.chapters?.isGrouped ?? false) {\n      int c = chapter - 1;\n      int g = 1;\n      while (c > 0) {\n        c -= widget.chapters!.getGroupByIndex(g - 1).length;\n        g++;\n      }\n      if (c == 0) {\n        return true;\n      } else {\n        return false;\n      }\n    }\n    return chapter == 1;\n  }\n\n  bool get isLastChapterOfGroup {\n    if (widget.chapters?.isGrouped ?? false) {\n      int c = chapter;\n      int g = 1;\n      while (c > 0) {\n        c -= widget.chapters!.getGroupByIndex(g - 1).length;\n        g++;\n      }\n      if (c == 0) {\n        return true;\n      } else {\n        return false;\n      }\n    }\n    return chapter == maxChapter;\n  }\n\n  /// Get the size of the reader.\n  /// The size is not always the same as the size of the screen.\n  Size get size {\n    var renderBox = context.findRenderObject() as RenderBox;\n    return renderBox.size;\n  }\n}\n\nabstract mixin class _ImagePerPageHandler {\n  late int _lastImagesPerPage;\n\n  late bool _lastOrientation;\n  \n  /// Track if we were on the chapter comments page before orientation change\n  bool _wasOnCommentsPage = false;\n\n  bool get isPortrait;\n\n  int get page;\n\n  set page(int value);\n\n  ReaderMode get mode;\n\n  String get cid;\n\n  ComicType get type;\n  \n  /// Whether the current page is the chapter comments page\n  bool get isOnChapterCommentsPage;\n  \n  /// Get the max page (excluding comments page)\n  int get maxPage;\n  \n  /// Get images list for calculating maxPage\n  List<String>? get images;\n\n  void initImagesPerPage(int initialPage) {\n    _lastImagesPerPage = imagesPerPage;\n    _lastOrientation = isPortrait;\n    _wasOnCommentsPage = false;\n    if (imagesPerPage != 1) {\n      if (showSingleImageOnFirstPage()) {\n        page = ((initialPage - 1) / imagesPerPage).ceil() + 1;\n      } else {\n        page = (initialPage / imagesPerPage).ceil();\n      }\n    }\n  }\n\n  bool showSingleImageOnFirstPage() => appdata.settings.getReaderSetting(\n    cid,\n    type.sourceKey,\n    'showSingleImageOnFirstPage',\n  );\n\n  /// The number of images displayed on one screen\n  int get imagesPerPage {\n    if (mode.isContinuous) return 1;\n    if (isPortrait) {\n      return appdata.settings.getReaderSetting(\n            cid,\n            type.sourceKey,\n            'readerScreenPicNumberForPortrait',\n          ) ??\n          1;\n    } else {\n      return appdata.settings.getReaderSetting(\n            cid,\n            type.sourceKey,\n            'readerScreenPicNumberForLandscape',\n          ) ??\n          1;\n    }\n  }\n  \n  /// Calculate maxPage with a specific imagesPerPage value\n  int _calcMaxPage(int imagesPerPageValue) {\n    if (images == null) return 1;\n    return !showSingleImageOnFirstPage()\n        ? (images!.length / imagesPerPageValue).ceil()\n        : 1 + ((images!.length - 1) / imagesPerPageValue).ceil();\n  }\n\n  /// Check if the number of images per page has changed\n  void _checkImagesPerPageChange() {\n    int currentImagesPerPage = imagesPerPage;\n    bool currentOrientation = isPortrait;\n\n    if (_lastImagesPerPage != currentImagesPerPage ||\n        _lastOrientation != currentOrientation) {\n      // Calculate old maxPage using old imagesPerPage to correctly determine\n      // if we were on the comments page before the orientation change\n      int oldMaxPage = _calcMaxPage(_lastImagesPerPage);\n      _wasOnCommentsPage = page > oldMaxPage;\n      \n      _adjustPageForImagesPerPageChange(\n        _lastImagesPerPage,\n        currentImagesPerPage,\n      );\n      _lastImagesPerPage = currentImagesPerPage;\n      _lastOrientation = currentOrientation;\n    }\n  }\n\n  /// Adjust the page number when the number of images per page changes\n  void _adjustPageForImagesPerPageChange(\n    int oldImagesPerPage,\n    int newImagesPerPage,\n  ) {\n    int previousImageIndex = 1;\n    if (!showSingleImageOnFirstPage() || oldImagesPerPage == 1) {\n      previousImageIndex = (page - 1) * oldImagesPerPage + 1;\n    } else {\n      if (page == 1) {\n        previousImageIndex = 1;\n      } else {\n        previousImageIndex = (page - 2) * oldImagesPerPage + 2;\n      }\n    }\n\n    int newPage;\n    if (newImagesPerPage != 1) {\n      if (showSingleImageOnFirstPage()) {\n        newPage = ((previousImageIndex - 1) / newImagesPerPage).ceil() + 1;\n      } else {\n        newPage = (previousImageIndex / newImagesPerPage).ceil();\n      }\n    } else {\n      newPage = previousImageIndex;\n    }\n\n    // Clamp to valid range (1 to maxPage)\n    newPage = newPage.clamp(1, maxPage);\n    \n    // If we were on the comments page, stay on the comments page\n    if (_wasOnCommentsPage) {\n      page = maxPage + 1;\n    } else {\n      page = newPage;\n    }\n  }\n}\n\nabstract mixin class _VolumeListener {\n  bool toNextPage();\n\n  bool toPrevPage();\n\n  bool toNextChapter();\n\n  bool toPrevChapter({bool toLastPage = false});\n\n  VolumeListener? volumeListener;\n\n  void onDown() {\n    if (!toNextPage()) {\n      toNextChapter();\n    }\n  }\n\n  void onUp() {\n    if (!toPrevPage()) {\n      toPrevChapter(toLastPage: true);\n    }\n  }\n\n  void handleVolumeEvent() {\n    if (!App.isAndroid) {\n      // Currently only support Android\n      return;\n    }\n    if (volumeListener != null) {\n      volumeListener?.cancel();\n    }\n    volumeListener = VolumeListener(onDown: onDown, onUp: onUp)..listen();\n  }\n\n  void stopVolumeEvent() {\n    if (volumeListener != null) {\n      volumeListener?.cancel();\n      volumeListener = null;\n    }\n  }\n}\n\nabstract mixin class _ReaderLocation {\n  int _page = 1;\n  int? _pendingPage;\n\n  /// Flag to indicate that the page should jump to the last page after images are loaded.\n  bool _jumpToLastPageOnLoad = false;\n\n  int get page => _page;\n\n  set page(int value) {\n    _page = value;\n    onPageChanged();\n  }\n\n  int chapter = 1;\n\n  int get maxPage;\n\n  /// Total pages including chapter comments page (for internal page control).\n  int get totalPages;\n\n  int get maxChapter;\n\n  bool get isLoading;\n\n  String get cid;\n\n  ComicType get type;\n\n  void update();\n\n  bool enablePageAnimation(String cid, ComicType type) => appdata.settings\n      .getReaderSetting(cid, type.sourceKey, 'enablePageAnimation');\n\n  _ImageViewController? _imageViewController;\n\n  void onPageChanged();\n\n  void setPage(int page) {\n    // Prevent page change during animation\n    if (_animationCount > 0 && _pendingPage != null && page != _pendingPage) {\n      return;\n    }\n    this.page = page;\n  }\n\n  bool _validatePage(int page) {\n    return page >= 1 && page <= totalPages;\n  }\n\n  /// Returns true if the page is changed\n  bool toNextPage() {\n    return toPage(page + 1);\n  }\n\n  /// Returns true if the page is changed\n  bool toPrevPage() {\n    return toPage(page - 1);\n  }\n\n  int _animationCount = 0;\n\n  bool toPage(int page) {\n    if (_validatePage(page)) {\n      if (page == this.page && page != 1 && page != totalPages) {\n        return false;\n      }\n      final hasAnimation = enablePageAnimation(cid, type);\n      if (hasAnimation) {\n        _pendingPage = page;\n        _animationCount++;\n        update();\n        _imageViewController!.animateToPage(page).then((_) {\n          _animationCount--;\n          if (_pendingPage == page) {\n            _pendingPage = null;\n          }\n          update();\n        });\n      } else {\n        this.page = page;\n        update();\n        _imageViewController!.toPage(page);\n      }\n      return true;\n    }\n    return false;\n  }\n\n  bool get isPageAnimating => _animationCount > 0;\n\n  bool _validateChapter(int chapter) {\n    return chapter >= 1 && chapter <= maxChapter;\n  }\n\n  /// Returns true if the chapter is changed\n  bool toNextChapter() {\n    return toChapter(chapter + 1);\n  }\n\n  /// Returns true if the chapter is changed\n  /// If [toLastPage] is true, the page will be set to the last page of the previous chapter.\n  bool toPrevChapter({bool toLastPage = false}) {\n    return toChapter(chapter - 1, toLastPage: toLastPage);\n  }\n\n  bool toChapter(int c, {bool toLastPage = false}) {\n    if (_validateChapter(c) && !isLoading) {\n      chapter = c;\n      page = 1;\n      _jumpToLastPageOnLoad = toLastPage;\n      update();\n      return true;\n    }\n    return false;\n  }\n\n  Timer? autoPageTurningTimer;\n\n  void autoPageTurning(String cid, ComicType type) {\n    if (autoPageTurningTimer != null) {\n      autoPageTurningTimer!.cancel();\n      autoPageTurningTimer = null;\n    } else {\n      int interval = appdata.settings.getReaderSetting(\n        cid,\n        type.sourceKey,\n        'autoPageTurningInterval',\n      );\n      autoPageTurningTimer = Timer.periodic(Duration(seconds: interval), (_) {\n        if (page == maxPage) {\n          autoPageTurningTimer!.cancel();\n        }\n        toNextPage();\n      });\n    }\n  }\n}\n\nmixin class _ReaderWindow {\n  bool isFullscreen = false;\n\n  late WindowFrameController windowFrame;\n\n  bool _isInit = false;\n\n  void initReaderWindow() {\n    if (!App.isDesktop || _isInit) return;\n    windowFrame = WindowFrame.of(App.rootContext);\n    windowFrame.addCloseListener(onWindowClose);\n    _isInit = true;\n  }\n\n  void fullscreen() async {\n    if (!App.isDesktop) return;\n    await windowManager.hide();\n    await windowManager.setFullScreen(!isFullscreen);\n    await windowManager.show();\n    isFullscreen = !isFullscreen;\n    WindowFrame.of(App.rootContext).setWindowFrame(!isFullscreen);\n  }\n\n  bool onWindowClose() {\n    if (Navigator.of(App.rootContext).canPop()) {\n      Navigator.of(App.rootContext).pop();\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  void disposeReaderWindow() {\n    if (!App.isDesktop) return;\n    windowFrame.removeCloseListener(onWindowClose);\n  }\n}\n\nenum ReaderMode {\n  galleryLeftToRight('galleryLeftToRight'),\n  galleryRightToLeft('galleryRightToLeft'),\n  galleryTopToBottom('galleryTopToBottom'),\n  continuousTopToBottom('continuousTopToBottom'),\n  continuousLeftToRight('continuousLeftToRight'),\n  continuousRightToLeft('continuousRightToLeft');\n\n  final String key;\n\n  bool get isGallery => key.startsWith('gallery');\n\n  bool get isContinuous => key.startsWith('continuous');\n\n  const ReaderMode(this.key);\n\n  static ReaderMode fromKey(String key) {\n    for (var mode in values) {\n      if (mode.key == key) {\n        return mode;\n      }\n    }\n    return galleryLeftToRight;\n  }\n}\n\nabstract interface class _ImageViewController {\n  void toPage(int page);\n\n  Future<void> animateToPage(int page);\n\n  void handleDoubleTap(Offset location);\n\n  void handleLongPressDown(Offset location);\n\n  void handleLongPressUp(Offset location);\n\n  void handleKeyEvent(KeyEvent event);\n\n  /// Returns true if the event is handled.\n  bool handleOnTap(Offset location);\n\n  Future<Uint8List?> getImageByOffset(Offset offset);\n\n  String? getImageKeyByOffset(Offset offset);\n}\n"
  },
  {
    "path": "lib/pages/reader/scaffold.dart",
    "content": "part of 'reader.dart';\n\nclass _ReaderScaffold extends StatefulWidget {\n  const _ReaderScaffold({required this.child});\n\n  final Widget child;\n\n  @override\n  State<_ReaderScaffold> createState() => _ReaderScaffoldState();\n}\n\nclass _ReaderScaffoldState extends State<_ReaderScaffold> {\n  bool _isOpen = false;\n\n  static const kTopBarHeight = 56.0;\n\n  static const kBottomBarHeight = 105.0;\n\n  bool get isOpen => _isOpen;\n\n  bool get isReversed =>\n      context.reader.mode == ReaderMode.galleryRightToLeft ||\n      context.reader.mode == ReaderMode.continuousRightToLeft;\n\n  int showFloatingButtonValue = 0;\n\n  var lastValue = 0;\n\n  _ReaderGestureDetectorState? _gestureDetectorState;\n\n  void setFloatingButton(int value) {\n    lastValue = showFloatingButtonValue;\n    if (value == 0) {\n      if (showFloatingButtonValue != 0) {\n        showFloatingButtonValue = 0;\n        update();\n      }\n    }\n    if (value == 1 && showFloatingButtonValue == 0) {\n      showFloatingButtonValue = 1;\n      update();\n    } else if (value == -1 && showFloatingButtonValue == 0) {\n      showFloatingButtonValue = -1;\n      update();\n    }\n  }\n\n  _DragListener? _imageFavoriteDragListener;\n\n  void addDragListener() async {\n    if (!mounted) return;\n    var readerMode = context.reader.mode;\n\n    // 横向阅读的时候, 如果纵向滑就触发收藏, 纵向阅读的时候, 如果横向滑动就触发收藏\n    if (appdata.settings['quickCollectImage'] == 'Swipe') {\n      if (_imageFavoriteDragListener == null) {\n        double distance = 0;\n        _imageFavoriteDragListener = _DragListener(\n          onMove: (offset) {\n            switch (readerMode) {\n              case ReaderMode.continuousTopToBottom:\n              case ReaderMode.galleryTopToBottom:\n                distance += offset.dx;\n              case ReaderMode.continuousLeftToRight:\n              case ReaderMode.galleryLeftToRight:\n              case ReaderMode.galleryRightToLeft:\n              case ReaderMode.continuousRightToLeft:\n                distance += offset.dy;\n            }\n          },\n          onEnd: () {\n            if (distance.abs() > 150) {\n              addImageFavorite();\n            }\n            distance = 0;\n          },\n        );\n      }\n      _gestureDetectorState!.addDragListener(_imageFavoriteDragListener!);\n    } else if (_imageFavoriteDragListener != null) {\n      _gestureDetectorState!.removeDragListener(_imageFavoriteDragListener!);\n    }\n  }\n\n  @override\n  void initState() {\n    sliderFocus.canRequestFocus = false;\n    sliderFocus.addListener(() {\n      if (sliderFocus.hasFocus) {\n        sliderFocus.nextFocus();\n      }\n    });\n    if (rotation != null) {\n      SystemChrome.setPreferredOrientations(DeviceOrientation.values);\n    }\n    super.initState();\n    Future.delayed(const Duration(milliseconds: 200), addDragListener);\n  }\n\n  @override\n  void dispose() {\n    sliderFocus.dispose();\n    super.dispose();\n  }\n\n  void openOrClose() {\n    if (!_isOpen) {\n      SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n    } else {\n      if (!appdata.settings['showSystemStatusBar']) {\n        SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);\n      } else {\n        SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n      }\n    }\n    setState(() {\n      _isOpen = !_isOpen;\n    });\n  }\n\n  bool? rotation;\n\n  void update() {\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final isOnChapterCommentsPage = context.reader.isOnChapterCommentsPage;\n    return Stack(\n      children: [\n        Positioned.fill(\n          child: AbsorbPointer(\n            absorbing: context.reader.isPageAnimating,\n            child: widget.child,\n          ),\n        ),\n        if (appdata.settings['showPageNumberInReader'] == true && !isOnChapterCommentsPage)\n          buildPageInfoText(),\n        if (!isOnChapterCommentsPage)\n          buildStatusInfo(),\n        AnimatedPositioned(\n          duration: const Duration(milliseconds: 180),\n          right: 16,\n          bottom: showFloatingButtonValue == 0 ? -58 : 36,\n          child: buildEpChangeButton(),\n        ),\n        AnimatedPositioned(\n          duration: const Duration(milliseconds: 180),\n          top: _isOpen ? 0 : -(kTopBarHeight + context.padding.top),\n          left: 0,\n          right: 0,\n          height: kTopBarHeight + context.padding.top,\n          child: buildTop(),\n        ),\n        AnimatedPositioned(\n          duration: const Duration(milliseconds: 180),\n          bottom: _isOpen\n              ? 0\n              : -(kBottomBarHeight + MediaQuery.of(context).padding.bottom),\n          left: 0,\n          right: 0,\n          child: buildBottom(),\n        ),\n      ],\n    );\n  }\n\n  Widget buildTop() {\n    final epName =\n      context.reader.widget.chapters?.titles.elementAtOrNull(\n        context.reader.chapter - 1,\n      );\n\n    return BlurEffect(\n      child: Container(\n        padding: EdgeInsets.only(top: context.padding.top),\n        decoration: BoxDecoration(\n          color: context.colorScheme.surface.toOpacity(0.92),\n          border: Border(\n            bottom: BorderSide(\n              color: Colors.grey.toOpacity(0.5),\n              width: 0.5,\n            ),\n          ),\n        ),\n        child: Padding(\n          padding: EdgeInsets.only(\n            left: context.padding.left,\n            right: context.padding.right,\n          ),\n          child: Row(\n            children: [\n              const SizedBox(width: 8),\n              const BackButton(),\n              const SizedBox(width: 8),\n              Expanded(\n                child: epName == null ? Text(\n                  context.reader.widget.name,\n                  style: ts.s18,\n                  maxLines: 1,\n                  overflow: TextOverflow.ellipsis,\n                ) : Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: [\n                    Text(\n                      context.reader.widget.name,\n                      style: ts.s16,\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    Text(\n                      epName,\n                      style: ts.s12,\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                  ],\n                ),\n              ),\n              const SizedBox(width: 8),\n              if (shouldShowChapterComments())\n                Tooltip(\n                  message: \"Chapter Comments\".tl,\n                  child: IconButton(\n                    icon: const Icon(Icons.comment),\n                    onPressed: openChapterComments,\n                  ),\n                ),\n              Tooltip(\n                message: \"Settings\".tl,\n                child: IconButton(\n                  icon: const Icon(Icons.settings),\n                  onPressed: openSetting,\n                ),\n              ),\n              const SizedBox(width: 8),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  bool isLiked() {\n    return ImageFavoriteManager().has(\n      context.reader.cid,\n      context.reader.type.sourceKey,\n      context.reader.eid,\n      context.reader.page,\n      context.reader.chapter,\n    );\n  }\n\n  void addImageFavorite() async {\n    try {\n      if (context.reader.images![0].contains('file://')) {\n        showToast(\n          message: \"Local comic collection is not supported at present\".tl,\n          context: context,\n        );\n        return;\n      }\n      String id = context.reader.cid;\n      int ep = context.reader.chapter;\n      String eid = context.reader.eid;\n      String title = context.reader.history!.title;\n      String subTitle = context.reader.history!.subtitle;\n      int maxPage = context.reader.images!.length;\n      int? page = await selectImage();\n      if (page == null) return;\n      page += 1;\n      String sourceKey = context.reader.type.sourceKey;\n      String imageKey = context.reader.images![page - 1];\n      List<String> tags = context.reader.widget.tags;\n      String author = context.reader.widget.author;\n\n      var epName =\n          context.reader.widget.chapters?.titles.elementAtOrNull(\n            context.reader.chapter - 1,\n          ) ??\n          \"E${context.reader.chapter}\";\n      var translatedTags = tags.map((e) => e.translateTagsToCN).toList();\n\n      if (isLiked()) {\n        if (page == firstPage) {\n          showToast(\n            message: \"The cover cannot be uncollected here\".tl,\n            context: context,\n          );\n          return;\n        }\n        ImageFavoriteManager().deleteImageFavorite([\n          ImageFavorite(page, imageKey, null, eid, id, ep, sourceKey, epName),\n        ]);\n        showToast(\n          message: \"Uncollected the image\".tl,\n          context: context,\n          seconds: 1,\n        );\n      } else {\n        var imageFavoritesComic =\n            ImageFavoriteManager().find(id, sourceKey) ??\n            ImageFavoritesComic(\n              id,\n              [],\n              title,\n              sourceKey,\n              tags,\n              translatedTags,\n              DateTime.now(),\n              author,\n              {},\n              subTitle,\n              maxPage,\n            );\n        ImageFavorite imageFavorite = ImageFavorite(\n          page,\n          imageKey,\n          null,\n          eid,\n          id,\n          ep,\n          sourceKey,\n          epName,\n        );\n        ImageFavoritesEp? imageFavoritesEp = imageFavoritesComic\n            .imageFavoritesEp\n            .firstWhereOrNull((e) {\n              return e.ep == ep;\n            });\n        if (imageFavoritesEp == null) {\n          if (page != firstPage) {\n            var copy = imageFavorite.copyWith(\n              page: firstPage,\n              isAutoFavorite: true,\n              imageKey: context.reader.images![0],\n            );\n            // 不是第一页的话, 自动塞一个封面进去\n            imageFavoritesEp = ImageFavoritesEp(\n              eid,\n              ep,\n              [copy, imageFavorite],\n              epName,\n              maxPage,\n            );\n          } else {\n            imageFavoritesEp = ImageFavoritesEp(\n              eid,\n              ep,\n              [imageFavorite],\n              epName,\n              maxPage,\n            );\n          }\n          imageFavoritesComic.imageFavoritesEp.add(imageFavoritesEp);\n        } else {\n          if (imageFavoritesEp.eid != eid) {\n            // 空字符串说明是从pica导入的, 那我们就手动刷一遍保证一致\n            if (imageFavoritesEp.eid == \"\") {\n              imageFavoritesEp.eid == eid;\n            } else {\n              // 避免多章节漫画源的章节顺序发生变化, 如果情况比较多, 做一个以eid为准更新ep的功能\n              showToast(\n                message:\n                    \"The chapter order of the comic may have changed, temporarily not supported for collection\"\n                        .tl,\n                context: context,\n              );\n              return;\n            }\n          }\n          imageFavoritesEp.imageFavorites.add(imageFavorite);\n        }\n\n        ImageFavoriteManager().addOrUpdateOrDelete(imageFavoritesComic);\n        showToast(\n          message: \"Successfully collected\".tl,\n          context: context,\n          seconds: 1,\n        );\n      }\n      update();\n    } catch (e, stackTrace) {\n      Log.error(\"Image Favorite\", e, stackTrace);\n      showToast(message: e.toString(), context: context, seconds: 1);\n    }\n  }\n\n  Widget buildBottom() {\n    // Use maxPage for display (excluding chapter comments page)\n    final displayPage = context.reader.page.clamp(1, context.reader.maxPage);\n    var text = \"E${context.reader.chapter} : P$displayPage\";\n    if (context.reader.widget.chapters == null) {\n      text = \"P$displayPage\";\n    }\n\n    final buttons = [\n      Tooltip(\n        message: \"Collect the image\".tl,\n        child: IconButton(\n          icon: Icon(isLiked() ? Icons.favorite : Icons.favorite_border),\n          onPressed: addImageFavorite,\n        ),\n      ),\n      if (App.isDesktop)\n        Tooltip(\n          message: \"${\"Full Screen\".tl}(F12)\",\n          child: IconButton(\n            icon: const Icon(Icons.fullscreen),\n            onPressed: () {\n              context.reader.fullscreen();\n            },\n          ),\n        ),\n      if (App.isAndroid)\n        Tooltip(\n          message: \"Screen Rotation\".tl,\n          child: IconButton(\n            icon: () {\n              if (rotation == null) {\n                return const Icon(Icons.screen_rotation);\n              } else if (rotation == false) {\n                return const Icon(Icons.screen_lock_portrait);\n              } else {\n                return const Icon(Icons.screen_lock_landscape);\n              }\n            }.call(),\n            onPressed: () {\n              if (rotation == null) {\n                setState(() {\n                  rotation = false;\n                });\n                SystemChrome.setPreferredOrientations([\n                  DeviceOrientation.portraitUp,\n                  DeviceOrientation.portraitDown,\n                ]);\n              } else if (rotation == false) {\n                setState(() {\n                  rotation = true;\n                });\n                SystemChrome.setPreferredOrientations([\n                  DeviceOrientation.landscapeLeft,\n                  DeviceOrientation.landscapeRight,\n                ]);\n              } else {\n                setState(() {\n                  rotation = null;\n                });\n                SystemChrome.setPreferredOrientations(DeviceOrientation.values);\n              }\n            },\n          ),\n        ),\n      Tooltip(\n        message: \"Auto Page Turning\".tl,\n        child: IconButton(\n          icon: context.reader.autoPageTurningTimer != null\n              ? const Icon(Icons.timer)\n              : const Icon(Icons.timer_sharp),\n          onPressed: () {\n            context.reader.autoPageTurning(\n              context.reader.cid,\n              context.reader.type,\n            );\n            update();\n          },\n        ),\n      ),\n      if (context.reader.widget.chapters != null)\n        Tooltip(\n          message: \"Chapters\".tl,\n          child: IconButton(\n            icon: const Icon(Icons.library_books),\n            onPressed: openChapterDrawer,\n          ),\n        ),\n      Tooltip(\n        message: \"Save Image\".tl,\n        child: IconButton(\n          icon: const Icon(Icons.download),\n          onPressed: saveCurrentImage,\n        ),\n      ),\n      Tooltip(\n        message: \"Share\".tl,\n        child: IconButton(icon: const Icon(Icons.share), onPressed: share),\n      ),\n    ];\n\n    Widget child = SizedBox(\n      height: kBottomBarHeight,\n      child: Column(\n        children: [\n          const SizedBox(height: 8),\n          Row(\n            children: [\n              const SizedBox(width: 8),\n              IconButton.filledTonal(\n                onPressed: () => !isReversed\n                    ? context.reader.chapter > 1\n                          ? context.reader.toPrevChapter()\n                          : context.reader.toPage(1)\n                    : context.reader.chapter < context.reader.maxChapter\n                    ? context.reader.toNextChapter()\n                    : context.reader.toPage(context.reader.maxPage),\n                icon: const Icon(Icons.first_page),\n              ),\n              Expanded(child: buildSlider()),\n              IconButton.filledTonal(\n                onPressed: () => !isReversed\n                    ? context.reader.chapter < context.reader.maxChapter\n                          ? context.reader.toNextChapter()\n                          : context.reader.toPage(context.reader.maxPage)\n                    : context.reader.chapter > 1\n                    ? context.reader.toPrevChapter()\n                    : context.reader.toPage(1),\n                icon: const Icon(Icons.last_page),\n              ),\n              const SizedBox(width: 8),\n            ],\n          ),\n          LayoutBuilder(\n            builder: (context, constrains) {\n              final small = (constrains.maxWidth - buttons.length * 50) < 120;\n              return Row(\n                children: [\n                  if (!small)\n                    Container(\n                      height: 24,\n                      padding: const EdgeInsets.fromLTRB(6, 2, 6, 0),\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.tertiaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child: Center(child: Text(text)),\n                    ).paddingLeft(16),\n                  const Spacer(),\n                  for (var button in buttons)\n                    if (!small)\n                      button.paddingHorizontal(4)\n                    else\n                      ...[button, const Spacer()],\n                  if (!small)\n                    const SizedBox(width: 4),\n                ],\n              );\n            },\n          ),\n        ],\n      ),\n    );\n\n    return BlurEffect(\n      child: Container(\n        decoration: BoxDecoration(\n          color: context.colorScheme.surface.toOpacity(0.92),\n          border: isOpen\n              ? Border(\n                  top: BorderSide(\n                    color: Colors.grey.toOpacity(0.5),\n                    width: 0.5,\n                  ),\n                )\n              : null,\n        ),\n        padding: EdgeInsets.only(bottom: context.padding.bottom),\n        child: Padding(\n          padding: EdgeInsets.only(\n            left: context.padding.left,\n            right: context.padding.right,\n          ),\n          child: child,\n        ),\n      ),\n    );\n  }\n\n  var sliderFocus = FocusNode();\n\n  Widget buildSlider() {\n    // Clamp page to maxPage (excluding chapter comments page)\n    final displayPage = context.reader.page.clamp(1, context.reader.maxPage);\n    return CustomSlider(\n      focusNode: sliderFocus,\n      value: displayPage.toDouble(),\n      min: 1,\n      max: context.reader.maxPage\n          .clamp(displayPage, 1 << 16)\n          .toDouble(),\n      reversed: isReversed,\n      divisions: (context.reader.maxPage - 1).clamp(2, 1 << 16),\n      onChanged: (i) {\n        context.reader.toPage(i.toInt());\n      },\n    );\n  }\n\n  Widget buildPageInfoText() {\n    var epName =\n        context.reader.widget.chapters?.titles.elementAtOrNull(\n          context.reader.chapter - 1,\n        ) ??\n        \"E${context.reader.chapter}\";\n    if (epName.length > 8) {\n      epName = \"${epName.substring(0, 8)}...\";\n    }\n    var pageText = \"${context.reader.page}/${context.reader.maxPage}\";\n    var text = context.reader.widget.chapters != null\n        ? \"$epName : $pageText\"\n        : pageText;\n\n    return Positioned(\n      bottom: 13,\n      left: 25,\n      child: Stack(\n        children: [\n          Text(\n            text,\n            style: TextStyle(\n              fontSize: 14,\n              foreground: Paint()\n                ..style = PaintingStyle.stroke\n                ..strokeWidth = 1.4\n                ..color = context.colorScheme.onInverseSurface,\n            ),\n          ),\n          Text(text),\n        ],\n      ),\n    );\n  }\n\n  Widget buildStatusInfo() {\n    if (appdata.settings['enableClockAndBatteryInfoInReader']) {\n      return Positioned(\n        bottom: 13,\n        right: 25,\n        child: Row(\n          children: [\n            _ClockWidget(),\n            const SizedBox(width: 10),\n            _BatteryWidget(),\n          ],\n        ),\n      );\n    } else {\n      return const SizedBox.shrink();\n    }\n  }\n\n  void openChapterDrawer() {\n    _openSideBar(\n      context.reader.widget.chapters!.isGrouped\n          ? _GroupedChaptersView(context.reader)\n          : _ChaptersView(context.reader),\n      width: 400,\n    );\n  }\n\n  void saveCurrentImage() async {\n    var result = await selectImageToData();\n    if (result == null) {\n      return;\n    }\n    var (imageIndex, data) = result;\n    var fileType = detectFileType(data);\n    // Save file name: ComicName_EP{chapter}_P{page}.{ext} to avoid conflict.\n    // The chapter index of different group is continuous, so we use chapter number is enough.\n    var filename =\n        \"${context.reader.widget.name}_EP${context.reader.chapter}_P${imageIndex + 1}${fileType.ext}\";\n    saveFile(data: data, filename: filename);\n  }\n\n  void share() async {\n    var result = await selectImageToData();\n    if (result == null) {\n      return;\n    }\n    var (imageIndex, data) = result;\n    var fileType = detectFileType(data);\n    var filename =\n        \"${context.reader.widget.name}_EP${context.reader.chapter}_P${imageIndex + 1}${fileType.ext}\";\n    Share.shareFile(data: data, filename: filename, mime: fileType.mime);\n  }\n\n  void openSetting() {\n    _openSideBar(\n      ReaderSettings(\n        comicId: context.reader.cid,\n        comicSource: context.reader.type.sourceKey,\n        onChanged: (key) {\n          if (key == \"readerMode\") {\n            context.reader.mode = ReaderMode.fromKey(\n              appdata.settings.getReaderSetting(\n                context.reader.cid,\n                context.reader.type.sourceKey,\n                key,\n              ),\n            );\n          }\n          if (key == \"enableTurnPageByVolumeKey\") {\n            if (appdata.settings.getReaderSetting(\n              context.reader.cid,\n              context.reader.type.sourceKey,\n              key,\n            )) {\n              context.reader.handleVolumeEvent();\n            } else {\n              context.reader.stopVolumeEvent();\n            }\n          }\n          if (key == \"quickCollectImage\") {\n            addDragListener();\n          }\n          if (key == \"showChapterComments\" || key == \"showChapterCommentsAtEnd\") {\n            update();\n          }\n          context.reader.update();\n        },\n      ),\n      width: 400,\n    );\n  }\n\n  void _openSideBar(Widget widget, {double width = 400}) {\n    _gestureDetectorState?.ignoreNextTap();\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      if (!mounted) return;\n      showSideBar(\n        context,\n        widget,\n        width: width,\n        dismissible: true,\n      ).whenComplete(() {\n        _gestureDetectorState?.clearIgnoreNextTap();\n      });\n    });\n  }\n\n  bool shouldShowChapterComments() {\n    // Check if chapters exist\n    if (context.reader.widget.chapters == null) return false;\n\n    // Check if setting is enabled\n    var showChapterComments = appdata.settings.getReaderSetting(\n      context.reader.cid,\n      context.reader.type.sourceKey,\n      'showChapterComments',\n    );\n    if (showChapterComments != true) return false;\n\n    // Check if comic source supports chapter comments\n    var source = ComicSource.find(context.reader.type.sourceKey);\n    if (source == null || source.chapterCommentsLoader == null) return false;\n\n    return true;\n  }\n\n  void openChapterComments() {\n    var source = ComicSource.find(context.reader.type.sourceKey);\n    if (source == null) return;\n\n    var chapters = context.reader.widget.chapters;\n    if (chapters == null) return;\n\n    var chapterIndex = context.reader.chapter - 1;\n    var epId = chapters.ids.elementAt(chapterIndex);\n    var chapterTitle = chapters.titles.elementAt(chapterIndex);\n\n    showSideBar(\n      context,\n      ChapterCommentsPage(\n        comicId: context.reader.cid,\n        epId: epId,\n        source: source,\n        comicTitle: context.reader.widget.name,\n        chapterTitle: chapterTitle,\n      ),\n    );\n  }\n\n  Widget buildEpChangeButton() {\n    final extraWidth = context.padding.left + context.padding.right;\n    if (context.reader.widget.chapters == null) return const SizedBox();\n    switch (showFloatingButtonValue) {\n      case 0:\n        return Container(\n          width: 58 + extraWidth,\n          height: 58,\n          clipBehavior: Clip.antiAlias,\n          decoration: BoxDecoration(\n            color: Theme.of(context).colorScheme.primaryContainer,\n            borderRadius: BorderRadius.circular(16),\n          ),\n          child: Icon(\n            lastValue == 1\n                ? Icons.arrow_forward_ios\n                : Icons.arrow_back_ios_outlined,\n            size: 24,\n            color: Theme.of(context).colorScheme.onPrimaryContainer,\n          ),\n        );\n      case -1:\n      case 1:\n        return SizedBox(\n          width: 58 + extraWidth,\n          height: 58,\n          child: Material(\n            color: Theme.of(context).colorScheme.primaryContainer,\n            borderRadius: BorderRadius.circular(16),\n            elevation: 2,\n            child: InkWell(\n              onTap: () {\n                if (showFloatingButtonValue == 1) {\n                  context.reader.toNextChapter();\n                } else if (showFloatingButtonValue == -1) {\n                  context.reader.toPrevChapter();\n                }\n                setFloatingButton(0);\n              },\n              borderRadius: BorderRadius.circular(16),\n              child: Center(\n                child: Icon(\n                  _getArrowIcon(\n                    isReversed,\n                    showFloatingButtonValue,\n                  ),\n                  size: 24,\n                  color: Theme.of(context).colorScheme.onPrimaryContainer,\n                ),\n              ),\n            ),\n          ),\n        );\n    }\n    return const SizedBox();\n  }\n\n  IconData _getArrowIcon(bool reversed, int value) {\n    if (reversed) {\n      return value == 1 ? Icons.arrow_back_ios_outlined : Icons.arrow_forward_ios;\n    } else {\n      return value == 1 ? Icons.arrow_forward_ios : Icons.arrow_back_ios_outlined;\n    }\n  }\n\n  /// If there is only one image on screen, return it.\n  ///\n  /// If there are multiple images on screen,\n  /// show an overlay to let the user select an image.\n  ///\n  /// The return value is the index of the selected image.\n  Future<int?> selectImage() async {\n    var reader = context.reader;\n    var imageViewController = context.reader._imageViewController;\n\n    bool needsSelection = false;\n    int? singleImageIndex;\n\n    if (imageViewController is _GalleryModeState) {\n      var range = imageViewController.getCurrentPageImageRange();\n      if (range != null) {\n        var (startIndex, endIndex) = range;\n        int actualImageCount = endIndex - startIndex;\n        if (actualImageCount == 1) {\n          needsSelection = false;\n          singleImageIndex = startIndex;\n        } else {\n          needsSelection = true;\n        }\n      }\n    } else if (imageViewController is _ContinuousModeState) {\n      needsSelection = false;\n      singleImageIndex = reader.page - 1;\n    }\n\n    if (!needsSelection && singleImageIndex != null) {\n      return singleImageIndex;\n    } else {\n      var location = await _showSelectImageOverlay();\n      if (location == null) {\n        return null;\n      }\n      var imageKey = imageViewController!.getImageKeyByOffset(location);\n      if (imageKey == null) {\n        return null;\n      }\n      return reader.images!.indexOf(imageKey);\n    }\n  }\n\n  /// Same as [selectImage], but return the image data with its index.\n  /// Returns (imageIndex, imageData) or null if cancelled.\n  Future<(int, Uint8List)?> selectImageToData() async {\n    var i = await selectImage();\n    if (i == null) {\n      return null;\n    }\n    var imageKey = context.reader.images![i];\n    Uint8List data;\n    if (imageKey.startsWith(\"file://\")) {\n      data = await File(imageKey.substring(7)).readAsBytes();\n    } else {\n      data = await (await CacheManager().findCache(\n        \"$imageKey@${context.reader.type.sourceKey}@${context.reader.cid}@${context.reader.eid}\",\n      ))!.readAsBytes();\n    }\n    return (i, data);\n  }\n\n  Future<Offset?> _showSelectImageOverlay() {\n    if (_isOpen) {\n      openOrClose();\n    }\n\n    var completer = Completer<Offset?>();\n\n    var overlay = Overlay.of(context);\n    OverlayEntry? entry;\n    entry = OverlayEntry(\n      builder: (context) {\n        return Positioned.fill(\n          child: _SelectImageOverlayContent(\n            onTap: (offset) {\n              completer.complete(offset);\n              entry!.remove();\n            },\n            onDispose: () {\n              if (!completer.isCompleted) {\n                completer.complete(null);\n              }\n            },\n          ),\n        );\n      },\n    );\n    overlay.insert(entry);\n\n    return completer.future;\n  }\n}\n\nclass _BatteryWidget extends StatefulWidget {\n  @override\n  _BatteryWidgetState createState() => _BatteryWidgetState();\n}\n\nclass _BatteryWidgetState extends State<_BatteryWidget> {\n  late Battery _battery;\n  late int _batteryLevel = 100;\n  Timer? _timer;\n  bool _hasBattery = false;\n  BatteryState state = BatteryState.unknown;\n\n  @override\n  void initState() {\n    super.initState();\n    _battery = Battery();\n    _checkBatteryAvailability();\n  }\n\n  void _checkBatteryAvailability() async {\n    try {\n      _batteryLevel = await _battery.batteryLevel;\n      state = await _battery.batteryState;\n      if (_batteryLevel > 0 && state != BatteryState.unknown) {\n        setState(() {\n          _hasBattery = true;\n        });\n        _timer = Timer.periodic(const Duration(seconds: 1), (timer) {\n          _battery.batteryLevel.then((level) {\n            if (_batteryLevel != level) {\n              setState(() {\n                _batteryLevel = level;\n              });\n            }\n          });\n        });\n      }\n    } catch (_) {\n      // ignore\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (!_hasBattery) {\n      return const SizedBox.shrink(); //Empty Widget\n    }\n    return _batteryInfo(_batteryLevel);\n  }\n\n  @override\n  void dispose() {\n    _timer?.cancel();\n    super.dispose();\n  }\n\n  Widget _batteryInfo(int batteryLevel) {\n    IconData batteryIcon;\n    Color batteryColor = context.colorScheme.onSurface;\n\n    if (state == BatteryState.charging) {\n      batteryIcon = Icons.battery_charging_full;\n    } else if (batteryLevel >= 96) {\n      batteryIcon = Icons.battery_full_sharp;\n    } else if (batteryLevel >= 84) {\n      batteryIcon = Icons.battery_6_bar_sharp;\n    } else if (batteryLevel >= 72) {\n      batteryIcon = Icons.battery_5_bar_sharp;\n    } else if (batteryLevel >= 60) {\n      batteryIcon = Icons.battery_4_bar_sharp;\n    } else if (batteryLevel >= 48) {\n      batteryIcon = Icons.battery_3_bar_sharp;\n    } else if (batteryLevel >= 36) {\n      batteryIcon = Icons.battery_2_bar_sharp;\n    } else if (batteryLevel >= 24) {\n      batteryIcon = Icons.battery_1_bar_sharp;\n    } else if (batteryLevel >= 12) {\n      batteryIcon = Icons.battery_0_bar_sharp;\n    } else {\n      batteryIcon = Icons.battery_alert_sharp;\n      batteryColor = Colors.red;\n    }\n\n    return Row(\n      children: [\n        Icon(\n          batteryIcon,\n          size: 16,\n          color: batteryColor,\n          // Stroke\n          shadows: List.generate(9, (index) {\n            if (index == 4) {\n              return null;\n            }\n            double offsetX = (index % 3 - 1) * 0.8;\n            double offsetY = ((index / 3).floor() - 1) * 0.8;\n            return Shadow(\n              color: context.colorScheme.onInverseSurface,\n              offset: Offset(offsetX, offsetY),\n            );\n          }).whereType<Shadow>().toList(),\n        ),\n        Stack(\n          children: [\n            Text(\n              '$batteryLevel%',\n              style: TextStyle(\n                fontSize: 14,\n                foreground: Paint()\n                  ..style = PaintingStyle.stroke\n                  ..strokeWidth = 1.4\n                  ..color = context.colorScheme.onInverseSurface,\n              ),\n            ),\n            Text('$batteryLevel%'),\n          ],\n        ),\n      ],\n    );\n  }\n}\n\nclass _ClockWidget extends StatefulWidget {\n  @override\n  _ClockWidgetState createState() => _ClockWidgetState();\n}\n\nclass _ClockWidgetState extends State<_ClockWidget> {\n  late String _currentTime;\n  late Timer _timer;\n\n  @override\n  void initState() {\n    super.initState();\n    _currentTime = _getCurrentTime();\n    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {\n      final time = _getCurrentTime();\n      if (_currentTime != time) {\n        setState(() {\n          _currentTime = time;\n        });\n      }\n    });\n  }\n\n  String _getCurrentTime() {\n    final now = DateTime.now();\n    return \"${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}\";\n  }\n\n  @override\n  void dispose() {\n    _timer.cancel();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Stack(\n      children: [\n        Text(\n          _currentTime,\n          style: TextStyle(\n            fontSize: 14,\n            foreground: Paint()\n              ..style = PaintingStyle.stroke\n              ..strokeWidth = 1.4\n              ..color = context.colorScheme.onInverseSurface,\n          ),\n        ),\n        Text(_currentTime),\n      ],\n    );\n  }\n}\n\nclass _SelectImageOverlayContent extends StatefulWidget {\n  const _SelectImageOverlayContent({\n    required this.onTap,\n    required this.onDispose,\n  });\n\n  final void Function(Offset) onTap;\n\n  final void Function() onDispose;\n\n  @override\n  State<_SelectImageOverlayContent> createState() =>\n      _SelectImageOverlayContentState();\n}\n\nclass _SelectImageOverlayContentState\n    extends State<_SelectImageOverlayContent> {\n  @override\n  void dispose() {\n    widget.onDispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTapUp: (details) {\n        widget.onTap(details.globalPosition);\n      },\n      child: Container(\n        color: Colors.black.withAlpha(50),\n        child: Align(\n          alignment: Alignment(0, -0.8),\n          child: Container(\n            width: 232,\n            height: 42,\n            decoration: BoxDecoration(\n              color: context.colorScheme.surface,\n              borderRadius: BorderRadius.circular(8),\n              border: Border.all(color: context.colorScheme.outlineVariant),\n            ),\n            child: Row(\n              children: [\n                const SizedBox(width: 8),\n                const Icon(Icons.info_outline),\n                const SizedBox(width: 16),\n                Text(\n                  \"Click to select an image\".tl,\n                  style: TextStyle(\n                    fontSize: 16,\n                    color: context.colorScheme.onSurface,\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_page.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:sliver_tools/sliver_tools.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/global_state.dart';\nimport 'package:venera/pages/aggregated_search_page.dart';\nimport 'package:venera/pages/search_result_page.dart';\nimport 'package:venera/pages/settings/settings_page.dart';\nimport 'package:venera/utils/app_links.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\n\nimport 'comic_details_page/comic_page.dart';\nimport 'comic_source_page.dart';\n\nclass SearchPage extends StatefulWidget {\n  const SearchPage({super.key});\n\n  @override\n  State<SearchPage> createState() => _SearchPageState();\n}\n\nclass _SearchPageState extends State<SearchPage> {\n  late final SearchBarController controller;\n\n  late List<String> searchSources;\n\n  String searchTarget = \"\";\n\n  SearchPageData get currentSearchPageData =>\n      ComicSource.find(searchTarget)!.searchPageData!;\n\n  bool aggregatedSearch = false;\n\n  var focusNode = FocusNode();\n\n  var options = <String>[];\n\n  void update() {\n    setState(() {});\n  }\n\n  void search([String? text]) {\n    if (aggregatedSearch) {\n      context\n          .to(\n            () => AggregatedSearchPage(keyword: text ?? controller.text)\n          )\n          .then((_) => update());\n    } else {\n      context\n          .to(\n            () => SearchResultPage(\n              text: text ?? controller.text,\n              sourceKey: searchTarget,\n              options: options,\n            )\n          )\n          .then((_) => update());\n    }\n  }\n\n  var suggestions = <Pair<String, TranslationType>>[];\n\n  bool canHandleUrl(String text) {\n    if (!text.isURL) return false;\n    for (var source in ComicSource.all()) {\n      if (source.linkHandler != null) {\n        var uri = Uri.parse(text);\n        if (source.linkHandler!.domains.contains(uri.host)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  void findSuggestions() {\n    var text = controller.text.split(\" \").last;\n    var suggestions = this.suggestions;\n\n    suggestions.clear();\n\n    if (canHandleUrl(controller.text)) {\n      suggestions.add(Pair(\"**URL**\", TranslationType.other));\n    } else {\n      var text = controller.text;\n\n      for (var comicSource in ComicSource.all()) {\n        if (comicSource.idMatcher?.hasMatch(text) ?? false) {\n          suggestions.add(Pair(\n            \"**${comicSource.key}**\",\n            TranslationType.other,\n          ));\n        }\n      }\n    }\n\n    if (!ComicSource.find(searchTarget)!.enableTagsSuggestions) {\n      update();\n      return;\n    }\n\n    bool check(String text, String key, String value) {\n      if (text.removeAllBlank == \"\") {\n        return false;\n      }\n      if (key.length >= text.length && key.substring(0, text.length) == text ||\n          (key.contains(\" \") &&\n              key.split(\" \").last.length >= text.length &&\n              key.split(\" \").last.substring(0, text.length) == text)) {\n        return true;\n      } else if (value.length >= text.length && value.contains(text)) {\n        return true;\n      }\n      return false;\n    }\n\n    void find(Map<String, String> map, TranslationType type) {\n      for (var element in map.entries) {\n        if (suggestions.length > 100) {\n          break;\n        }\n        if (check(text, element.key, element.value)) {\n          suggestions.add(Pair(element.key, type));\n        }\n      }\n    }\n\n    find(TagsTranslation.femaleTags, TranslationType.female);\n    find(TagsTranslation.maleTags, TranslationType.male);\n    find(TagsTranslation.parodyTags, TranslationType.parody);\n    find(TagsTranslation.characterTranslations, TranslationType.character);\n    find(TagsTranslation.otherTags, TranslationType.other);\n    find(TagsTranslation.mixedTags, TranslationType.mixed);\n    find(TagsTranslation.languageTranslations, TranslationType.language);\n    find(TagsTranslation.artistTags, TranslationType.artist);\n    find(TagsTranslation.groupTags, TranslationType.group);\n    find(TagsTranslation.cosplayerTags, TranslationType.cosplayer);\n    update();\n  }\n\n  @override\n  void initState() {\n    findSearchSources();\n    var defaultSearchTarget = appdata.settings['defaultSearchTarget'];\n    if (defaultSearchTarget == \"_aggregated_\") {\n      aggregatedSearch = true;\n    } else if (defaultSearchTarget != null &&\n        searchSources.contains(defaultSearchTarget)) {\n      searchTarget = defaultSearchTarget;\n    }\n    controller = SearchBarController(\n      onSearch: search,\n    );\n    appdata.settings.addListener(updateSearchSourcesIfNeeded);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    focusNode.dispose();\n    appdata.settings.removeListener(updateSearchSourcesIfNeeded);\n    super.dispose();\n  }\n\n  void findSearchSources() {\n    var all = ComicSource.all()\n        .where((e) => e.searchPageData != null)\n        .map((e) => e.key)\n        .toList();\n    var settings = appdata.settings['searchSources'] as List;\n    var sources = <String>[];\n    for (var source in settings) {\n      if (all.contains(source)) {\n        sources.add(source);\n      }\n    }\n    searchSources = sources;\n    if (!searchSources.contains(searchTarget)) {\n      searchTarget = searchSources.firstOrNull ?? \"\";\n    }\n  }\n\n  void updateSearchSourcesIfNeeded() {\n    var old = searchSources;\n    findSearchSources();\n    if (old.isEqualTo(searchSources)) {\n      return;\n    }\n    setState(() {});\n  }\n\n  void manageSearchSources() {\n    showPopUpWidget(App.rootContext, setSearchSourcesWidget());\n  }\n\n  Widget buildEmpty() {\n    var msg = \"No Search Sources\".tl;\n    msg += '\\n';\n    VoidCallback onTap;\n    if (ComicSource.isEmpty) {\n      msg += \"Please add some sources\".tl;\n      onTap = () {\n        context.to(() => ComicSourcePage());\n      };\n    } else {\n      msg += \"Please check your settings\".tl;\n      onTap = manageSearchSources;\n    }\n    return NetworkError(\n      message: msg,\n      retry: onTap,\n      withAppbar: true,\n      buttonText: \"Manage\".tl,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (searchSources.isEmpty) {\n      return buildEmpty();\n    }\n    return Scaffold(\n      body: SmoothCustomScrollView(\n        slivers: buildSlivers().toList(),\n      ),\n    );\n  }\n\n  Iterable<Widget> buildSlivers() sync* {\n    yield SliverSearchBar(\n      controller: controller,\n      onChanged: (s) {\n        findSuggestions();\n      },\n      focusNode: focusNode,\n    );\n    if (suggestions.isNotEmpty) {\n      yield buildSuggestions(context);\n    } else {\n      yield buildSearchTarget();\n      yield SliverAnimatedPaintExtent(\n        duration: const Duration(milliseconds: 200),\n        child: buildSearchOptions(),\n      );\n      yield _SearchHistory(search);\n    }\n  }\n\n  Widget buildSearchTarget() {\n    var sources = searchSources.map((e) => ComicSource.find(e)!).toList();\n    return SliverToBoxAdapter(\n      child: Container(\n        width: double.infinity,\n        padding: const EdgeInsets.symmetric(horizontal: 16),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            ListTile(\n              contentPadding: EdgeInsets.zero,\n              leading: const Icon(Icons.search),\n              title: Text(\"Search in\".tl),\n              trailing: IconButton(\n                icon: const Icon(Icons.settings),\n                onPressed: manageSearchSources,\n              ),\n            ),\n            Wrap(\n              spacing: 8,\n              runSpacing: 8,\n              children: sources.map((e) {\n                return OptionChip(\n                  text: e.name,\n                  isSelected: searchTarget == e.key || aggregatedSearch,\n                  onTap: () {\n                    if (aggregatedSearch) return;\n                    setState(() {\n                      searchTarget = e.key;\n                      useDefaultOptions();\n                    });\n                  },\n                );\n              }).toList(),\n            ),\n            ListTile(\n              contentPadding: EdgeInsets.zero,\n              title: Text(\"Aggregated Search\".tl),\n              leading: Checkbox(\n                value: aggregatedSearch,\n                onChanged: (value) {\n                  setState(() {\n                    aggregatedSearch = value ?? false;\n                  });\n                },\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void useDefaultOptions() {\n    final searchOptions = currentSearchPageData.searchOptions ?? [];\n    options = searchOptions.map((e) => e.defaultValue).toList();\n  }\n\n  Widget buildSearchOptions() {\n    if (aggregatedSearch) {\n      return const SliverToBoxAdapter(child: SizedBox());\n    }\n\n    var children = <Widget>[];\n\n    final searchOptions = currentSearchPageData.searchOptions ?? [];\n    if (searchOptions.length != options.length) {\n      useDefaultOptions();\n    }\n    if (searchOptions.isEmpty) {\n      return const SliverToBoxAdapter(child: SizedBox());\n    }\n    for (int i = 0; i < searchOptions.length; i++) {\n      final option = searchOptions[i];\n      children.add(SearchOptionWidget(\n        option: option,\n        value: options[i],\n        onChanged: (value) {\n          options[i] = value;\n          update();\n        },\n        sourceKey: searchTarget,\n      ));\n    }\n\n    return SliverToBoxAdapter(\n      child: Container(\n        width: double.infinity,\n        padding: const EdgeInsets.symmetric(horizontal: 16),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: children,\n        ),\n      ),\n    );\n  }\n\n  Widget buildSuggestions(BuildContext context) {\n    bool check(String text, String key, String value) {\n      if (text.removeAllBlank == \"\") {\n        return false;\n      }\n      if (key.length >= text.length && key.substring(0, text.length) == text ||\n          (key.contains(\" \") &&\n              key.split(\" \").last.length >= text.length &&\n              key.split(\" \").last.substring(0, text.length) == text)) {\n        return true;\n      } else if (value.length >= text.length && value.contains(text)) {\n        return true;\n      }\n      return false;\n    }\n\n    void onSelected(String text, TranslationType? type) {\n      var words = controller.text.split(\" \");\n      if (words.length >= 2 &&\n          check(\"${words[words.length - 2]} ${words[words.length - 1]}\", text,\n              text.translateTagsToCN)) {\n        controller.text = controller.text.replaceLast(\n            \"${words[words.length - 2]} ${words[words.length - 1]}\", \"\");\n      } else {\n        controller.text =\n            controller.text.replaceLast(words[words.length - 1], \"\");\n      }\n      final source = ComicSource.find(searchTarget);\n      String insert;\n      if (source?.onTagSuggestionSelected != null) {\n        insert = source!.onTagSuggestionSelected!(type?.name ?? '', text);\n      } else {\n        var t = text;\n        if (t.contains(' ')) t = \"'$t'\";\n        insert = type != null ? \"${type.name}:$t\" : t;\n      }\n      controller.text += \"$insert \";\n      suggestions.clear();\n      update();\n      focusNode.requestFocus();\n    }\n\n    bool showMethod = MediaQuery.of(context).size.width < 600;\n    bool showTranslation = App.locale.languageCode == \"zh\";\n    Widget buildItem(Pair<String, TranslationType> value) {\n      if (value.left == \"**URL**\") {\n        return ListTile(\n          leading: const Icon(Icons.link),\n          title: Text(\"Open link\".tl),\n          subtitle: Text(\n            controller.text,\n            maxLines: 1,\n            overflow: TextOverflow.fade,\n          ),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () {\n            setState(() {\n              suggestions.clear();\n            });\n            handleAppLink(Uri.parse(controller.text));\n          },\n        );\n      }\n\n      if (RegExp(r\"^\\*\\*.*\\*\\*$\").hasMatch(value.left)) {\n        var key = value.left.substring(2, value.left.length - 2);\n        var comicSource = ComicSource.find(key);\n        if (comicSource == null) {\n          return const SizedBox();\n        }\n        return ListTile(\n          leading: const Icon(Icons.link),\n          title: Text(\"${\"Open comic\".tl}: ${comicSource.name}\"),\n          subtitle: Text(\n            controller.text,\n            maxLines: 1,\n            overflow: TextOverflow.fade,\n          ),\n          trailing: const Icon(Icons.arrow_right),\n          onTap: () {\n            context.to(\n              () => ComicPage(\n                sourceKey: key,\n                id: controller.text,\n              ),\n            );\n          },\n        );\n      }\n\n      var subTitle = TagsTranslation.translationTagWithNamespace(\n          value.left, value.right.name);\n      return ListTile(\n        title: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Expanded(\n              child: Text(value.left),\n            ),\n            if (!showMethod)\n              const SizedBox(\n                width: 12,\n              ),\n            if (!showMethod && showTranslation)\n              Text(\n                subTitle,\n                style: TextStyle(\n                  fontSize: 14,\n                  color: Theme.of(context).colorScheme.outline,\n                ),\n              )\n          ],\n        ),\n        subtitle: (showMethod && showTranslation) ? Text(subTitle) : null,\n        trailing: Text(\n          value.right.name,\n          style: const TextStyle(fontSize: 13),\n        ),\n        onTap: () => onSelected(value.left, value.right),\n      );\n    }\n\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverToBoxAdapter(\n          child: ListTile(\n            leading: const Icon(Icons.hub_outlined),\n            title: Text(\"Suggestions\".tl),\n            trailing: Tooltip(\n              message: \"Clear\".tl,\n              child: IconButton(\n                icon: const Icon(Icons.clear_all),\n                onPressed: () {\n                  suggestions.clear();\n                  update();\n                },\n              ),\n            ),\n          ),\n        ),\n        SliverList(\n          delegate: SliverChildBuilderDelegate(\n            (context, index) {\n              return buildItem(suggestions[index]);\n            },\n            childCount: suggestions.length,\n          ),\n        ),\n      ],\n    );\n  }\n}\n\nclass SearchOptionWidget extends StatelessWidget {\n  const SearchOptionWidget({\n    super.key,\n    required this.option,\n    required this.value,\n    required this.onChanged,\n    required this.sourceKey,\n  });\n\n  final SearchOptions option;\n\n  final String value;\n\n  final void Function(String) onChanged;\n\n  final String sourceKey;\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        ListTile(\n          contentPadding: EdgeInsets.zero,\n          title: Text(option.label.ts(sourceKey)),\n        ),\n        if (option.type == 'select')\n          Wrap(\n            runSpacing: 8,\n            spacing: 8,\n            children: option.options.entries.map((e) {\n              return OptionChip(\n                text: e.value.ts(sourceKey),\n                isSelected: value == e.key,\n                onTap: () {\n                  onChanged(e.key);\n                },\n              );\n            }).toList(),\n          ),\n        if (option.type == 'multi-select')\n          Wrap(\n            runSpacing: 8,\n            spacing: 8,\n            children: option.options.entries.map((e) {\n              return OptionChip(\n                text: e.value.ts(sourceKey),\n                isSelected: (jsonDecode(value) as List).contains(e.key),\n                onTap: () {\n                  var list = jsonDecode(value) as List;\n                  if (list.contains(e.key)) {\n                    list.remove(e.key);\n                  } else {\n                    list.add(e.key);\n                  }\n                  onChanged(jsonEncode(list));\n                },\n              );\n            }).toList(),\n          ),\n        if (option.type == 'dropdown')\n          Select(\n            current: option.options[value],\n            values: option.options.values.toList(),\n            onTap: (index) {\n              onChanged(option.options.keys.elementAt(index));\n            },\n            minWidth: 96,\n          )\n      ],\n    );\n  }\n}\n\nclass _SearchHistory extends StatefulWidget {\n  const _SearchHistory(this.search);\n\n  final void Function(String) search;\n\n  @override\n  State<_SearchHistory> createState() => _SearchHistoryState();\n}\n\nclass _SearchHistoryState extends State<_SearchHistory> {\n  @override\n  Widget build(BuildContext context) {\n    return SliverList(\n      delegate: SliverChildBuilderDelegate(\n        (context, index) {\n          if (index == 0) {\n            return const SizedBox(\n              height: 16,\n            );\n          }\n          if (index == 1) {\n            return ListTile(\n              leading: const Icon(Icons.history),\n              contentPadding: EdgeInsets.zero,\n              title: Text(\"Search History\".tl),\n              trailing: Flyout(\n                flyoutBuilder: (context) {\n                  return FlyoutContent(\n                    title: \"Clear Search History\".tl,\n                    actions: [\n                      FilledButton(\n                        child: Text(\"Clear\".tl),\n                        onPressed: () {\n                          appdata.clearSearchHistory();\n                          context.pop();\n                          setState(() {});\n                        },\n                      )\n                    ],\n                  );\n                },\n                child: Builder(\n                  builder: (context) {\n                    return Tooltip(\n                      message: \"Clear\".tl,\n                      child: IconButton(\n                        icon: const Icon(Icons.clear_all),\n                        onPressed: () {\n                          context\n                              .findAncestorStateOfType<FlyoutState>()!\n                              .show();\n                        },\n                      ),\n                    );\n                  },\n                ),\n              ),\n            );\n          }\n          return buildItem(index - 2);\n        },\n        childCount: 2 + appdata.searchHistory.length,\n      ),\n    ).sliverPaddingHorizontal(16);\n  }\n\n  Widget buildItem(int index) {\n    void showMenu(Offset offset) {\n      showMenuX(\n        context,\n        offset,\n        [\n          MenuEntry(\n            icon: Icons.copy,\n            text: 'Copy'.tl,\n            onClick: () {\n              Clipboard.setData(\n                  ClipboardData(text: appdata.searchHistory[index]));\n            },\n          ),\n          MenuEntry(\n            icon: Icons.delete,\n            text: 'Delete'.tl,\n            onClick: () {\n              appdata.removeSearchHistory(appdata.searchHistory[index]);\n              appdata.saveData();\n              setState(() {});\n            },\n          ),\n        ],\n      );\n    }\n\n    return Builder(builder: (context) {\n      return InkWell(\n        onTap: () {\n          widget.search(appdata.searchHistory[index]);\n        },\n        onLongPress: () {\n          var renderBox = context.findRenderObject() as RenderBox;\n          var offset = renderBox.localToGlobal(Offset.zero);\n          showMenu(Offset(\n            offset.dx + renderBox.size.width / 2 - 121,\n            offset.dy + renderBox.size.height - 8,\n          ));\n        },\n        onSecondaryTapUp: (details) {\n          showMenu(details.globalPosition);\n        },\n        child: Container(\n          decoration: BoxDecoration(\n            // color: context.colorScheme.surfaceContainer,\n            border: Border(\n              left: BorderSide(\n                color: context.colorScheme.outlineVariant,\n                width: 2,\n              ),\n            ),\n          ),\n          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),\n          child: Text(appdata.searchHistory[index], style: ts.s14),\n        ),\n      ).paddingBottom(8).paddingHorizontal(4);\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_result_page.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/global_state.dart';\nimport 'package:venera/pages/search_page.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/tags_translation.dart';\nimport 'package:venera/utils/translations.dart';\n\nclass SearchResultPage extends StatefulWidget {\n  const SearchResultPage({\n    super.key,\n    required this.text,\n    required this.sourceKey,\n    this.options,\n  });\n\n  final String text;\n\n  final String sourceKey;\n\n  final List<String>? options;\n\n  @override\n  State<SearchResultPage> createState() => _SearchResultPageState();\n}\n\nclass _SearchResultPageState extends State<SearchResultPage> {\n  late SearchBarController controller;\n\n  late String sourceKey;\n\n  late List<String> options;\n\n  late String text;\n\n  OverlayEntry? get suggestionOverlay => suggestionsController.entry;\n\n  late _SuggestionsController suggestionsController;\n\n  void search([String? text]) {\n    if (text != null) {\n      if (suggestionsController.entry != null) {\n        suggestionsController.remove();\n      }\n      text = checkAutoLanguage(text);\n      setState(() {\n        this.text = text!;\n      });\n      appdata.addSearchHistory(text);\n      controller.currentText = text;\n    }\n  }\n\n  void onChanged(String s) {\n    if (!ComicSource.find(sourceKey)!.enableTagsSuggestions) {\n      return;\n    }\n    suggestionsController.findSuggestions();\n    if (suggestionOverlay != null) {\n      if (suggestionsController.suggestions.isEmpty) {\n        suggestionsController.remove();\n      } else {\n        suggestionsController.updateWidget();\n      }\n    } else if (suggestionsController.suggestions.isNotEmpty) {\n      suggestionsController.entry = OverlayEntry(\n        builder: (context) {\n          return Positioned(\n            top: context.padding.top + 56,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            child: Material(\n              child: _Suggestions(\n                controller: suggestionsController,\n              ),\n            ),\n          );\n        },\n      );\n      Overlay.of(context).insert(suggestionOverlay!);\n    }\n  }\n\n  @override\n  void dispose() {\n    Future.microtask(() {\n      suggestionsController.remove();\n    });\n    super.dispose();\n  }\n\n  String checkAutoLanguage(String text) {\n    var setting = appdata.settings[\"autoAddLanguageFilter\"] ?? 'none';\n    if (setting == 'none') {\n      return text;\n    }\n    var searchSource = sourceKey;\n    // TODO: Move it to a better place\n    const enabledSources = [\n      'nhentai',\n      'ehentai',\n    ];\n    if (!enabledSources.contains(searchSource)) {\n      return text;\n    }\n    if (!text.contains('language:')) {\n      return '$text language:$setting';\n    }\n    return text;\n  }\n\n  @override\n  void initState() {\n    sourceKey = widget.sourceKey;\n    text = checkAutoLanguage(widget.text);\n    controller = SearchBarController(\n      currentText: text,\n      onSearch: search,\n    );\n    options = widget.options ?? const [];\n    validateOptions();\n    appdata.addSearchHistory(text);\n    suggestionsController = _SuggestionsController(controller, sourceKey);\n    super.initState();\n  }\n\n  void validateOptions() {\n    var source = ComicSource.find(sourceKey);\n    if (source == null) {\n      return;\n    }\n    var searchOptions = source.searchPageData!.searchOptions;\n    if (searchOptions == null) {\n      return;\n    }\n    if (options.length != searchOptions.length) {\n      options = searchOptions.map((e) => e.defaultValue).toList();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var source = ComicSource.find(sourceKey);\n    return ComicList(\n      key: Key(text + options.toString() + sourceKey),\n      errorLeading: AppSearchBar(\n        controller: controller,\n        action: buildAction(),\n      ),\n      leadingSliver: SliverSearchBar(\n        controller: controller,\n        onChanged: onChanged,\n        action: buildAction(),\n      ),\n      loadPage: source!.searchPageData!.loadPage == null\n          ? null\n          : (i) {\n              return source.searchPageData!.loadPage!(\n                text,\n                i,\n                options,\n              );\n            },\n      loadNext: source.searchPageData!.loadNext == null\n          ? null\n          : (i) {\n              return source.searchPageData!.loadNext!(\n                text,\n                i,\n                options,\n              );\n            },\n    );\n  }\n\n  Widget buildAction() {\n    return Tooltip(\n      message: \"Settings\".tl,\n      child: IconButton(\n        icon: const Icon(Icons.tune),\n        onPressed: () async {\n          if (suggestionOverlay != null) {\n            suggestionsController.remove();\n          }\n\n          var previousOptions = List<String>.from(options);\n          var previousSourceKey = sourceKey;\n          await showDialog(\n            context: context,\n            useRootNavigator: true,\n            builder: (context) {\n              return _SearchSettingsDialog(state: this);\n            },\n          );\n          if (!previousOptions.isEqualTo(options) ||\n              previousSourceKey != sourceKey) {\n            text = checkAutoLanguage(controller.text);\n            controller.currentText = text;\n            setState(() {});\n          }\n        },\n      ),\n    );\n  }\n}\n\nclass _SuggestionsController {\n  _SuggestionsState? _state;\n\n  final SearchBarController controller;\n\n  final String sourceKey;\n\n  OverlayEntry? entry;\n\n  void updateWidget() {\n    _state?.update();\n  }\n\n  void remove() {\n    entry?.remove();\n    entry = null;\n  }\n\n  var suggestions = <Pair<String, TranslationType>>[];\n\n  void findSuggestions() {\n    var text = controller.text.split(\" \").last;\n    var suggestions = this.suggestions;\n\n    suggestions.clear();\n\n    bool check(String text, String key, String value) {\n      if (text.removeAllBlank == \"\") {\n        return false;\n      }\n      if (key.length >= text.length && key.substring(0, text.length) == text ||\n          (key.contains(\" \") &&\n              key.split(\" \").last.length >= text.length &&\n              key.split(\" \").last.substring(0, text.length) == text)) {\n        return true;\n      } else if (value.length >= text.length && value.contains(text)) {\n        return true;\n      }\n      return false;\n    }\n\n    void find(Map<String, String> map, TranslationType type) {\n      for (var element in map.entries) {\n        if (suggestions.length > 200) {\n          break;\n        }\n        if (check(text, element.key, element.value)) {\n          suggestions.add(Pair(element.key, type));\n        }\n      }\n    }\n\n    find(TagsTranslation.femaleTags, TranslationType.female);\n    find(TagsTranslation.maleTags, TranslationType.male);\n    find(TagsTranslation.parodyTags, TranslationType.parody);\n    find(TagsTranslation.characterTranslations, TranslationType.character);\n    find(TagsTranslation.otherTags, TranslationType.other);\n    find(TagsTranslation.mixedTags, TranslationType.mixed);\n    find(TagsTranslation.languageTranslations, TranslationType.language);\n    find(TagsTranslation.artistTags, TranslationType.artist);\n    find(TagsTranslation.groupTags, TranslationType.group);\n    find(TagsTranslation.cosplayerTags, TranslationType.cosplayer);\n  }\n\n  _SuggestionsController(this.controller, this.sourceKey);\n}\n\nclass _Suggestions extends StatefulWidget {\n  const _Suggestions({required this.controller});\n\n  final _SuggestionsController controller;\n\n  @override\n  State<_Suggestions> createState() => _SuggestionsState();\n}\n\nclass _SuggestionsState extends State<_Suggestions> {\n  void update() {\n    setState(() {});\n  }\n\n  @override\n  void initState() {\n    widget.controller._state = this;\n    super.initState();\n  }\n\n  @override\n  void didUpdateWidget(covariant _Suggestions oldWidget) {\n    if (oldWidget.controller != widget.controller) {\n      oldWidget.controller._state = null;\n      widget.controller._state = this;\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return buildSuggestions(context);\n  }\n\n  Widget buildSuggestions(BuildContext context) {\n    bool showMethod = MediaQuery.of(context).size.width < 600;\n    bool showTranslation = App.locale.languageCode == \"zh\";\n\n    Widget buildItem(Pair<String, TranslationType> value) {\n      var subTitle = TagsTranslation.translationTagWithNamespace(\n          value.left, value.right.name);\n      return ListTile(\n        title: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Expanded(\n              child: Text(\n                value.left,\n                maxLines: 2,\n              ),\n            ),\n            if (!showMethod)\n              const SizedBox(\n                width: 12,\n              ),\n            if (!showMethod && showTranslation)\n              Text(\n                subTitle,\n                style: TextStyle(\n                    fontSize: 14, color: Theme.of(context).colorScheme.outline),\n              )\n          ],\n        ),\n        subtitle: (showMethod && showTranslation) ? Text(subTitle) : null,\n        trailing: Text(\n          value.right.name,\n          style: const TextStyle(fontSize: 13),\n        ),\n        onTap: () => onSelected(value.left, value.right),\n      );\n    }\n\n    return Column(\n      children: [\n        ListTile(\n          leading: const Icon(Icons.hub_outlined),\n          title: Text(\"Suggestions\".tl),\n          trailing: Tooltip(\n            message: \"Clear\".tl,\n            child: IconButton(\n              icon: const Icon(Icons.clear_all),\n              onPressed: () {\n                widget.controller.suggestions.clear();\n                widget.controller.remove();\n              },\n            ),\n          ),\n        ),\n        Expanded(\n          child: ListView.builder(\n            padding: const EdgeInsets.symmetric(horizontal: 16),\n            itemCount: widget.controller.suggestions.length,\n            itemBuilder: (context, index) =>\n                buildItem(widget.controller.suggestions[index]),\n          ),\n        )\n      ],\n    );\n  }\n\n  bool check(String text, String key, String value) {\n    if (text.removeAllBlank == \"\") {\n      return false;\n    }\n    if (key.length >= text.length && key.substring(0, text.length) == text ||\n        (key.contains(\" \") &&\n            key.split(\" \").last.length >= text.length &&\n            key.split(\" \").last.substring(0, text.length) == text)) {\n      return true;\n    } else if (value.length >= text.length && value.contains(text)) {\n      return true;\n    }\n    return false;\n  }\n\n  void onSelected(String text, TranslationType? type) {\n    var controller = widget.controller.controller;\n    var words = controller.text.split(\" \");\n    if (words.length >= 2 &&\n        check(\"${words[words.length - 2]} ${words[words.length - 1]}\", text,\n            text.translateTagsToCN)) {\n      controller.text = controller.text.replaceLast(\n          \"${words[words.length - 2]} ${words[words.length - 1]}\", \"\");\n    } else {\n      controller.text =\n          controller.text.replaceLast(words[words.length - 1], \"\");\n    }\n    final source = ComicSource.find(widget.controller.sourceKey);\n    String insert;\n    if (source?.onTagSuggestionSelected != null) {\n      insert = source!.onTagSuggestionSelected!(type?.name ?? '', text);\n    } else {\n      var t = text;\n      if (t.contains(' ')) t = \"'$t'\";\n      insert = type != null ? \"${type.name}:$t\" : t;\n    }\n    controller.text += \"$insert \";\n    widget.controller.suggestions.clear();\n    widget.controller.remove();\n  }\n}\n\nclass _SearchSettingsDialog extends StatefulWidget {\n  const _SearchSettingsDialog({required this.state});\n\n  final _SearchResultPageState state;\n\n  @override\n  State<_SearchSettingsDialog> createState() => _SearchSettingsDialogState();\n}\n\nclass _SearchSettingsDialogState extends State<_SearchSettingsDialog> {\n  late String searchTarget;\n\n  late List<String> options;\n\n  @override\n  void initState() {\n    searchTarget = widget.state.sourceKey;\n    options = widget.state.options;\n    super.initState();\n  }\n\n  void onChanged() {\n    widget.state.sourceKey = searchTarget;\n    widget.state.options = options;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    var sources = ComicSource.all();\n    var enabled = appdata.settings['searchSources'] as List;\n    sources.removeWhere((e) {\n      return !enabled.contains(e.key);\n    });\n    return ContentDialog(\n      title: \"Settings\".tl,\n      content: Column(\n        children: [\n          ListTile(\n            contentPadding: const EdgeInsets.symmetric(horizontal: 16),\n            title: Text(\"Search in\".tl),\n          ),\n          Wrap(\n            spacing: 8,\n            runSpacing: 8,\n            children: sources.map((e) {\n              return OptionChip(\n                text: e.name.tl,\n                isSelected: searchTarget == e.key,\n                onTap: () {\n                  setState(() {\n                    searchTarget = e.key;\n                    options.clear();\n                    final searchOptions = ComicSource.find(searchTarget)!\n                            .searchPageData!\n                            .searchOptions ??\n                        <SearchOptions>[];\n                    options = searchOptions.map((e) => e.defaultValue).toList();\n                    onChanged();\n                  });\n                },\n              );\n            }).toList(),\n          ).fixWidth(double.infinity).paddingHorizontal(16),\n          buildSearchOptions(),\n          const SizedBox(height: 24),\n          FilledButton(\n            child: Text(\"Confirm\".tl),\n            onPressed: () {\n              context.pop();\n            },\n          ),\n        ],\n      ).fixWidth(double.infinity),\n    );\n  }\n\n  Widget buildSearchOptions() {\n    var children = <Widget>[];\n\n    final searchOptions =\n        ComicSource.find(searchTarget)!.searchPageData!.searchOptions ??\n            <SearchOptions>[];\n    if (searchOptions.length != options.length) {\n      options = searchOptions.map((e) => e.defaultValue).toList();\n    }\n    if (searchOptions.isEmpty) {\n      return const SizedBox();\n    }\n    for (int i = 0; i < searchOptions.length; i++) {\n      final option = searchOptions[i];\n      children.add(SearchOptionWidget(\n        option: option,\n        value: options[i],\n        onChanged: (value) {\n          setState(() {\n            options[i] = value;\n          });\n        },\n        sourceKey: searchTarget,\n      ));\n    }\n\n    return Container(\n      width: double.infinity,\n      padding: const EdgeInsets.symmetric(horizontal: 16),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        mainAxisSize: MainAxisSize.min,\n        children: children,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/about.dart",
    "content": "part of 'settings_page.dart';\n\nclass AboutSettings extends StatefulWidget {\n  const AboutSettings({super.key});\n\n  @override\n  State<AboutSettings> createState() => _AboutSettingsState();\n}\n\nclass _AboutSettingsState extends State<AboutSettings> {\n  bool isCheckingUpdate = false;\n\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"About\".tl)),\n        SizedBox(\n          height: 112,\n          width: double.infinity,\n          child: Center(\n            child: Container(\n              width: 112,\n              height: 112,\n              decoration: BoxDecoration(\n                borderRadius: BorderRadius.circular(136),\n              ),\n              clipBehavior: Clip.antiAlias,\n              child: const Image(\n                image: AssetImage(\"assets/app_icon.png\"),\n                filterQuality: FilterQuality.medium,\n              ),\n            ),\n          ),\n        ).paddingTop(16).toSliver(),\n        Column(\n          children: [\n            const SizedBox(height: 8),\n            Text(\n              \"V${App.version}\",\n              style: const TextStyle(fontSize: 16),\n            ),\n            Text(\"Venera is a free and open-source app for comic reading.\".tl),\n            const SizedBox(height: 8),\n          ],\n        ).toSliver(),\n        ListTile(\n          title: Text(\"Check for updates\".tl),\n          trailing: Button.filled(\n            isLoading: isCheckingUpdate,\n            child: Text(\"Check\".tl),\n            onPressed: () {\n              setState(() {\n                isCheckingUpdate = true;\n              });\n              checkUpdateUi().then((value) {\n                setState(() {\n                  isCheckingUpdate = false;\n                });\n              });\n            },\n          ).fixHeight(32),\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Check for updates on startup\".tl,\n          settingKey: \"checkUpdateOnStart\",\n        ).toSliver(),\n        ListTile(\n          title: const Text(\"Github\"),\n          trailing: const Icon(Icons.open_in_new),\n          onTap: () {\n            launchUrlString(\"https://github.com/venera-app/venera\");\n          },\n        ).toSliver(),\n        ListTile(\n          title: const Text(\"Telegram\"),\n          trailing: const Icon(Icons.open_in_new),\n          onTap: () {\n            launchUrlString(\"https://t.me/venera_release\");\n          },\n        ).toSliver(),\n      ],\n    );\n  }\n}\n\nFuture<bool> checkUpdate() async {\n  var res = await AppDio()\n      .get(\"https://cdn.jsdelivr.net/gh/venera-app/venera@master/pubspec.yaml\");\n  if (res.statusCode == 200) {\n    var data = loadYaml(res.data);\n    if (data[\"version\"] != null) {\n      return _compareVersion(data[\"version\"].split(\"+\")[0], App.version);\n    }\n  }\n  return false;\n}\n\nFuture<void> checkUpdateUi([bool showMessageIfNoUpdate = true, bool delay = false]) async {\n  try {\n    var value = await checkUpdate();\n    if (value) {\n      if (delay) {\n        await Future.delayed(const Duration(seconds: 2));\n      }\n      showDialog(\n          context: App.rootContext,\n          builder: (context) {\n            return ContentDialog(\n              title: \"New version available\".tl,\n              content: Text(\n                      \"A new version is available. Do you want to update now?\"\n                          .tl)\n                  .paddingHorizontal(16),\n              actions: [\n                Button.text(\n                  onPressed: () {\n                    Navigator.pop(context);\n                    launchUrlString(\n                        \"https://github.com/venera-app/venera/releases\");\n                  },\n                  child: Text(\"Update\".tl),\n                ),\n              ],\n            );\n          });\n    } else if (showMessageIfNoUpdate) {\n      App.rootContext.showMessage(message: \"No new version available\".tl);\n    }\n  } catch (e, s) {\n    Log.error(\"Check Update\", e.toString(), s);\n  }\n}\n\n/// return true if version1 > version2\nbool _compareVersion(String version1, String version2) {\n  var v1 = version1.split(\".\");\n  var v2 = version2.split(\".\");\n  for (var i = 0; i < v1.length; i++) {\n    if (int.parse(v1[i]) > int.parse(v2[i])) {\n      return true;\n    }\n    if (int.parse(v1[i]) < int.parse(v2[i])) {\n      return false;\n    }\n  }\n  return false;\n}\n"
  },
  {
    "path": "lib/pages/settings/app.dart",
    "content": "part of 'settings_page.dart';\n\nclass AppSettings extends StatefulWidget {\n  const AppSettings({super.key});\n\n  @override\n  State<AppSettings> createState() => _AppSettingsState();\n}\n\nclass _AppSettingsState extends State<AppSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"App\".tl)),\n        _SettingPartTitle(\n          title: \"Data\".tl,\n          icon: Icons.storage,\n        ),\n        ListTile(\n          title: Text(\"Storage Path for local comics\".tl),\n          subtitle: Text(LocalManager().path, softWrap: false),\n          trailing: IconButton(\n            icon: const Icon(Icons.copy),\n            onPressed: () {\n              Clipboard.setData(ClipboardData(text: LocalManager().path));\n              context.showMessage(message: \"Path copied to clipboard\".tl);\n            },\n          ),\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Set New Storage Path\".tl,\n          actionTitle: \"Set\".tl,\n          callback: () async {\n            String? result;\n            if (App.isAndroid) {\n              var picker = DirectoryPicker();\n              result = (await picker.pickDirectory())?.path;\n            } else if (App.isIOS) {\n              result = await selectDirectoryIOS();\n            } else {\n              result = await selectDirectory();\n            }\n            if (result == null) return;\n            var loadingDialog = showLoadingDialog(\n              App.rootContext,\n              barrierDismissible: false,\n              allowCancel: false,\n            );\n            var res = await LocalManager().setNewPath(result);\n            loadingDialog.close();\n            if (res != null) {\n              context.showMessage(message: res);\n            } else {\n              context.showMessage(message: \"Path set successfully\".tl);\n              setState(() {});\n            }\n          },\n        ).toSliver(),\n        ListTile(\n          title: Text(\"Cache Size\".tl),\n          subtitle: Text(bytesToReadableString(CacheManager().currentSize)),\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Clear Cache\".tl,\n          actionTitle: \"Clear\".tl,\n          callback: () async {\n            var loadingDialog = showLoadingDialog(\n              App.rootContext,\n              barrierDismissible: false,\n              allowCancel: false,\n            );\n            await CacheManager().clear();\n            loadingDialog.close();\n            context.showMessage(message: \"Cache cleared\".tl);\n            setState(() {});\n          },\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Cache Limit\".tl,\n          subtitle: \"${appdata.settings['cacheSize']} MB\",\n          callback: () {\n            showInputDialog(\n              context: context,\n              title: \"Set Cache Limit\".tl,\n              hintText: \"Size in MB\".tl,\n              inputValidator: RegExp(r\"^\\d+$\"),\n              onConfirm: (value) {\n                appdata.settings['cacheSize'] = int.parse(value);\n                appdata.saveData();\n                setState(() {});\n                CacheManager().setLimitSize(appdata.settings['cacheSize']);\n                return null;\n              },\n            );\n          },\n          actionTitle: 'Set'.tl,\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Export App Data\".tl,\n          callback: () async {\n            var controller = showLoadingDialog(context);\n            var file = await exportAppData(false);\n            await saveFile(filename: \"data.venera\", file: file);\n            controller.close();\n          },\n          actionTitle: 'Export'.tl,\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Import App Data\".tl,\n          callback: () async {\n            var controller = showLoadingDialog(context);\n            var file = await selectFile(ext: ['venera', 'picadata']);\n            if (file != null) {\n              var cacheFile =\n                  File(FilePath.join(App.cachePath, \"import_data_temp\"));\n              await file.saveTo(cacheFile.path);\n              try {\n                if (file.name.endsWith('picadata')) {\n                  await importPicaData(cacheFile);\n                } else {\n                  await importAppData(cacheFile);\n                }\n              } catch (e, s) {\n                Log.error(\"Import data\", e.toString(), s);\n                context.showMessage(message: \"Failed to import data\".tl);\n              } finally {\n                cacheFile.deleteIgnoreError();\n                App.forceRebuild();\n              }\n            }\n            controller.close();\n          },\n          actionTitle: 'Import'.tl,\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Data Sync\".tl,\n          callback: () async {\n            showPopUpWidget(context, const _WebdavSetting());\n          },\n          actionTitle: 'Set'.tl,\n        ).toSliver(),\n        _SettingPartTitle(\n          title: \"User\".tl,\n          icon: Icons.person_outline,\n        ),\n        SelectSetting(\n          title: \"Language\".tl,\n          settingKey: \"language\",\n          optionTranslation: const {\n            \"system\": \"System\",\n            \"zh-CN\": \"简体中文\",\n            \"zh-TW\": \"繁體中文\",\n            \"en-US\": \"English\",\n          },\n          onChanged: () {\n            App.forceRebuild();\n          },\n        ).toSliver(),\n        if (!App.isLinux)\n          _SwitchSetting(\n            title: \"Authorization Required\".tl,\n            settingKey: \"authorizationRequired\",\n            onChanged: () async {\n              var current = appdata.settings['authorizationRequired'];\n              if (current) {\n                final auth = LocalAuthentication();\n                final bool canAuthenticateWithBiometrics =\n                    await auth.canCheckBiometrics;\n                final bool canAuthenticate = canAuthenticateWithBiometrics ||\n                    await auth.isDeviceSupported();\n                if (!canAuthenticate) {\n                  context.showMessage(message: \"Biometrics not supported\".tl);\n                  setState(() {\n                    appdata.settings['authorizationRequired'] = false;\n                  });\n                  appdata.saveData();\n                  return;\n                }\n              }\n            },\n          ).toSliver(),\n      ],\n    );\n  }\n}\n\nclass LogsPage extends StatefulWidget {\n  const LogsPage({super.key});\n\n  @override\n  State<LogsPage> createState() => _LogsPageState();\n}\n\nclass _LogsPageState extends State<LogsPage> {\n  String logLevelToShow = \"all\";\n\n  @override\n  Widget build(BuildContext context) {\n    var logToShow = logLevelToShow == \"all\"\n        ? Log.logs\n        : Log.logs.where((log) => log.level.name == logLevelToShow).toList();\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"Logs\".tl),\n        actions: [\n          IconButton(\n              onPressed: () => setState(() {\n                    final RelativeRect position = RelativeRect.fromLTRB(\n                      MediaQuery.of(context).size.width,\n                      MediaQuery.of(context).padding.top + kToolbarHeight,\n                      0.0,\n                      0.0,\n                    );\n                    showMenu(context: context, position: position, items: [\n                      PopupMenuItem(\n                          child: Text(\"all\"),\n                          onTap: () => setState(() => logLevelToShow = \"all\")\n                      ),\n                      PopupMenuItem(\n                          child: Text(\"info\"),\n                          onTap: () => setState(() => logLevelToShow = \"info\")\n                      ),\n                      PopupMenuItem(\n                          child: Text(\"warning\"),\n                          onTap: () => setState(() => logLevelToShow = \"warning\")\n                      ),\n                      PopupMenuItem(\n                          child: Text(\"error\"),\n                          onTap: () => setState(() => logLevelToShow = \"error\")\n                      ),\n                    ]);\n              }),\n              icon: const Icon(Icons.filter_list_outlined)\n          ),\n          IconButton(\n              onPressed: () => setState(() {\n                    final RelativeRect position = RelativeRect.fromLTRB(\n                      MediaQuery.of(context).size.width,\n                      MediaQuery.of(context).padding.top + kToolbarHeight,\n                      0.0,\n                      0.0,\n                    );\n                    showMenu(context: context, position: position, items: [\n                      PopupMenuItem(\n                        child: Text(\"Clear\".tl),\n                        onTap: () => setState(() => Log.clear()),\n                      ),\n                      PopupMenuItem(\n                        child: Text(\"Disable Length Limitation\".tl),\n                        onTap: () {\n                          Log.ignoreLimitation = true;\n                          context.showMessage(\n                              message: \"Only valid for this run\".tl);\n                        },\n                      ),\n                      PopupMenuItem(\n                        child: Text(\"Export\".tl),\n                        onTap: () => saveLog(Log().toString()),\n                      ),\n                    ]);\n                  }),\n              icon: const Icon(Icons.more_horiz))\n        ],\n      ),\n      body: ListView.builder(\n        reverse: true,\n        controller: ScrollController(),\n        itemCount: logToShow.length,\n        itemBuilder: (context, index) {\n          index = logToShow.length - index - 1;\n          return Padding(\n            padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),\n            child: SelectionArea(\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Row(\n                    children: [\n                      Container(\n                        decoration: BoxDecoration(\n                          color: Theme.of(context)\n                              .colorScheme\n                              .surfaceContainerHighest,\n                          borderRadius:\n                              const BorderRadius.all(Radius.circular(16)),\n                        ),\n                        child: Padding(\n                          padding: const EdgeInsets.fromLTRB(5, 0, 5, 1),\n                          child: Text(logToShow[index].title),\n                        ),\n                      ),\n                      const SizedBox(\n                        width: 3,\n                      ),\n                      Container(\n                        decoration: BoxDecoration(\n                          color: [\n                            Theme.of(context).colorScheme.error,\n                            Theme.of(context).colorScheme.errorContainer,\n                            Theme.of(context).colorScheme.primaryContainer\n                          ][logToShow[index].level.index],\n                          borderRadius:\n                              const BorderRadius.all(Radius.circular(16)),\n                        ),\n                        child: Padding(\n                          padding: const EdgeInsets.fromLTRB(5, 0, 5, 1),\n                          child: Text(\n                            logToShow[index].level.name,\n                            style: TextStyle(\n                                color: logToShow[index].level.index == 0\n                                    ? Colors.white\n                                    : Colors.black),\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                  Text(logToShow[index].content),\n                  Text(logToShow[index].time\n                      .toString()\n                      .replaceAll(RegExp(r\"\\.\\w+\"), \"\")),\n                  TextButton(\n                    onPressed: () {\n                      Clipboard.setData(\n                          ClipboardData(text: logToShow[index].content));\n                    },\n                    child: Text(\"Copy\".tl),\n                  ),\n                  const Divider(),\n                ],\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  void saveLog(String log) async {\n    saveFile(data: utf8.encode(log), filename: 'log.txt');\n  }\n}\n\nclass _WebdavSetting extends StatefulWidget {\n  const _WebdavSetting();\n\n  @override\n  State<_WebdavSetting> createState() => _WebdavSettingState();\n}\n\nclass _WebdavSettingState extends State<_WebdavSetting> {\n  String url = \"\";\n  String user = \"\";\n  String pass = \"\";\n  String disableSync = \"\";\n\n  bool autoSync = true;\n\n  bool isTesting = false;\n  bool upload = true;\n\n  @override\n  void initState() {\n    super.initState();\n    if (appdata.settings['webdav'] is! List) {\n      appdata.settings['webdav'] = [];\n    }\n    if (appdata.settings['disableSyncFields'].trim().isNotEmpty) {\n      disableSync = appdata.settings['disableSyncFields'];\n    }\n    var configs = appdata.settings['webdav'] as List;\n    if (configs.whereType<String>().length != 3) {\n      return;\n    }\n    url = configs[0];\n    user = configs[1];\n    pass = configs[2];\n    autoSync = appdata.implicitData['webdavAutoSync'] ?? true;\n  }\n\n  void onAutoSyncChanged(bool value) {\n    setState(() {\n      autoSync = value;\n      appdata.implicitData['webdavAutoSync'] = value;\n      appdata.writeImplicitData();\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopUpWidgetScaffold(\n      title: \"Webdav\",\n      body: SingleChildScrollView(\n        child: Column(\n          children: [\n            const SizedBox(height: 12),\n            TextField(\n              decoration: InputDecoration(\n                labelText: \"URL\",\n                hintText: \"A valid WebDav directory URL\".tl,\n                border: OutlineInputBorder(),\n              ),\n              controller: TextEditingController(text: url),\n              onChanged: (value) => url = value,\n            ),\n            const SizedBox(height: 12),\n            TextField(\n              decoration: InputDecoration(\n                labelText: \"Username\".tl,\n                border: const OutlineInputBorder(),\n              ),\n              controller: TextEditingController(text: user),\n              onChanged: (value) => user = value,\n            ),\n            const SizedBox(height: 12),\n            TextField(\n              decoration: InputDecoration(\n                labelText: \"Password\".tl,\n                border: const OutlineInputBorder(),\n              ),\n              controller: TextEditingController(text: pass),\n              onChanged: (value) => pass = value,\n            ),\n            const SizedBox(height: 12),\n            TextField(\n              decoration: InputDecoration(\n                labelText: \"Skip Setting Fields (Optional)\".tl,\n                hintText: \"field0, field1, field2, ...\",\n                hintStyle: TextStyle(color: Theme.of(context).hintColor),\n                border: OutlineInputBorder(),\n                suffixIcon: IconButton(\n                  icon: Icon(Icons.help_outline),\n                  onPressed: () {\n                    showDialog(\n                      context: context,\n                      builder: (_) => AlertDialog(\n                        title: Text(\"Skip Setting Fields\".tl),\n                        content: Column(\n                          mainAxisSize: MainAxisSize.min,\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            Text(\n                              \"When sync data, skip certain setting fields, which means these won't be uploaded / override.\".tl,\n                            ),\n                            const SizedBox(height: 12),\n                            Row(\n                              children: [\n                                Expanded(\n                                  child: Text(\n                                    \"See source code for available fields.\".tl,\n                                  ),\n                                ),\n                                Align(\n                                  alignment: Alignment.centerRight,\n                                  child: IconButton(\n                                    icon: const Icon(Icons.open_in_new),\n                                    onPressed: () {\n                                      launchUrlString(\"https://github.com/venera-app/venera/blob/b08f11f6ac49bd07d34b4fcde233ed07e86efbc9/lib/foundation/appdata.dart#L138\");\n                                    },\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ],\n                        ),\n                      ),\n                    );\n                  },\n                ),\n              ),\n              controller: TextEditingController(text: disableSync),\n              onChanged: (value) => disableSync = value,\n            ),\n            const SizedBox(height: 12),\n            ListTile(\n              leading: Icon(Icons.sync),\n              title: Text(\"Auto Sync Data\".tl),\n              contentPadding: EdgeInsets.zero,\n              trailing: Switch(\n                value: autoSync,\n                onChanged: onAutoSyncChanged,\n              ),\n            ),\n            const SizedBox(height: 12),\n            RadioGroup<bool>(\n              groupValue: upload,\n              onChanged: (value) {\n                setState(() {\n                  upload = value ?? upload;\n                });\n              },\n              child: Row(\n                children: [\n                  Text(\"Operation\".tl),\n                  Radio<bool>(\n                    value: true,\n                  ),\n                  Text(\"Upload\".tl),\n                  Radio<bool>(\n                    value: false,\n                  ),\n                  Text(\"Download\".tl),\n                ],\n              ),\n            ),\n            const SizedBox(height: 16),\n            AnimatedSize(\n              duration: const Duration(milliseconds: 200),\n              child: autoSync\n                  ? Container(\n                      padding: const EdgeInsets.all(8),\n                      decoration: BoxDecoration(\n                        color: Theme.of(context).colorScheme.primaryContainer,\n                        borderRadius: BorderRadius.circular(8),\n                      ),\n                      child: Row(\n                        children: [\n                          const Icon(Icons.info_outline, size: 20),\n                          const SizedBox(width: 8),\n                          Expanded(\n                            child: Text(\n                                \"Once the operation is successful, app will automatically sync data with the server.\"\n                                    .tl),\n                          ),\n                        ],\n                      ),\n                    )\n                  : const SizedBox.shrink(),\n            ),\n            const SizedBox(height: 16),\n            Center(\n              child: Button.filled(\n                isLoading: isTesting,\n                onPressed: () async {\n                  var oldConfig = appdata.settings['webdav'];\n                  var oldAutoSync = appdata.implicitData['webdavAutoSync'];\n\n                  if (url.trim().isEmpty &&\n                      user.trim().isEmpty &&\n                      pass.trim().isEmpty) {\n                    appdata.settings['webdav'] = [];\n                    appdata.implicitData['webdavAutoSync'] = false;\n                    appdata.writeImplicitData();\n                    appdata.saveData();\n                    context.showMessage(message: \"Saved\".tl);\n                    App.rootPop();\n                    return;\n                  }\n\n                  appdata.settings['webdav'] = [url, user, pass];\n                  appdata.settings['disableSyncFields'] = disableSync;\n                  appdata.implicitData['webdavAutoSync'] = autoSync;\n                  appdata.writeImplicitData();\n\n                  if (!autoSync) {\n                    appdata.saveData();\n                    context.showMessage(message: \"Saved\".tl);\n                    App.rootPop();\n                    return;\n                  }\n\n                  setState(() {\n                    isTesting = true;\n                  });\n                  var testResult = upload\n                      ? await DataSync().uploadData()\n                      : await DataSync().downloadData();\n                  if (testResult.error) {\n                    setState(() {\n                      isTesting = false;\n                    });\n                    appdata.settings['webdav'] = oldConfig;\n                    appdata.implicitData['webdavAutoSync'] = oldAutoSync;\n                    appdata.writeImplicitData();\n                    appdata.saveData();\n                    context.showMessage(message: testResult.errorMessage!);\n                    context.showMessage(message: \"Saved Failed\".tl);\n                  } else {\n                    appdata.saveData();\n                    context.showMessage(message: \"Saved\".tl);\n                    App.rootPop();\n                  }\n                },\n                child: Text(\"Continue\".tl),\n              ),\n            )\n          ],\n        ).paddingHorizontal(16),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/appearance.dart",
    "content": "part of 'settings_page.dart';\n\nclass AppearanceSettings extends StatefulWidget {\n  const AppearanceSettings({super.key});\n\n  @override\n  State<AppearanceSettings> createState() => _AppearanceSettingsState();\n}\n\nclass _AppearanceSettingsState extends State<AppearanceSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"Appearance\".tl)),\n        SelectSetting(\n          title: \"Theme Mode\".tl,\n          settingKey: \"theme_mode\",\n          optionTranslation: {\n            \"system\": \"System\".tl,\n            \"light\": \"Light\".tl,\n            \"dark\": \"Dark\".tl,\n          },\n          onChanged: () async {\n            App.forceRebuild();\n          },\n        ).toSliver(),\n        SelectSetting(\n          title: \"Theme Color\".tl,\n          settingKey: \"color\",\n          optionTranslation: {\n            \"system\": \"System\".tl,\n            \"red\": \"Red\".tl,\n            \"pink\": \"Pink\".tl,\n            \"purple\": \"Purple\".tl,\n            \"green\": \"Green\".tl,\n            \"orange\": \"Orange\".tl,\n            \"blue\": \"Blue\".tl,\n          },\n          onChanged: () async {\n            await App.init();\n            App.forceRebuild();\n          },\n        ).toSliver(),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/debug.dart",
    "content": "part of 'settings_page.dart';\n\nclass DebugPage extends StatefulWidget {\n  const DebugPage({super.key});\n\n  @override\n  State<DebugPage> createState() => DebugPageState();\n}\n\nclass DebugPageState extends State<DebugPage> {\n  final controller = TextEditingController();\n\n  var result = \"\";\n\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"Debug\".tl)),\n        _CallbackSetting(\n          title: \"Reload Configs\".tl,\n          actionTitle: \"Reload\".tl,\n          callback: () {\n            ComicSourceManager().reload();\n          },\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Open Log\".tl,\n          callback: () {\n            context.to(() => const LogsPage());\n          },\n          actionTitle: 'Open'.tl,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Ignore Certificate Errors\".tl,\n          settingKey: \"ignoreBadCertificate\",\n        ).toSliver(),\n        SliverToBoxAdapter(\n          child: Column(\n            children: [\n              const SizedBox(height: 8),\n              const Text(\n                \"JS Evaluator\",\n                style: TextStyle(fontSize: 16),\n              ).toAlign(Alignment.centerLeft).paddingLeft(16),\n              Container(\n                width: double.infinity,\n                height: 200,\n                margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n                child: TextField(\n                  controller: controller,\n                  maxLines: null,\n                  expands: true,\n                  textAlign: TextAlign.start,\n                  textAlignVertical: TextAlignVertical.top,\n                  decoration: InputDecoration(\n                    border: const OutlineInputBorder(),\n                    contentPadding: const EdgeInsets.all(8),\n                  ),\n                ),\n              ),\n              TextButton(\n                onPressed: () {\n                  try {\n                    var res = JsEngine().runCode(controller.text, \"<debug>\");\n                    setState(() {\n                      result = res.toString();\n                    });\n                  } catch (e) {\n                    setState(() {\n                      result = e.toString();\n                    });\n                  }\n                },\n                child: const Text(\"Run\"),\n              ).toAlign(Alignment.centerRight).paddingRight(16),\n              const Text(\n                \"Result\",\n                style: TextStyle(fontSize: 16),\n              ).toAlign(Alignment.centerLeft).paddingLeft(16),\n              Container(\n                width: double.infinity,\n                height: 200,\n                margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),\n                decoration: BoxDecoration(\n                  border: Border.all(color: context.colorScheme.outline),\n                  borderRadius: BorderRadius.circular(4),\n                ),\n                child: SingleChildScrollView(\n                  child: Text(result).paddingAll(4),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/explore_settings.dart",
    "content": "part of 'settings_page.dart';\n\nclass ExploreSettings extends StatefulWidget {\n  const ExploreSettings({super.key});\n\n  @override\n  State<ExploreSettings> createState() => _ExploreSettingsState();\n}\n\nclass _ExploreSettingsState extends State<ExploreSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"Explore\".tl)),\n        SelectSetting(\n          title: \"Display mode of comic tile\".tl,\n          settingKey: \"comicDisplayMode\",\n          optionTranslation: {\n            \"detailed\": \"Detailed\".tl,\n            \"brief\": \"Brief\".tl,\n          },\n        ).toSliver(),\n        _SliderSetting(\n          title: \"Size of comic tile\".tl,\n          settingsIndex: \"comicTileScale\",\n          interval: 0.05,\n          min: 0.5,\n          max: 1.5,\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"Explore Pages\".tl,\n          builder: setExplorePagesWidget,\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"Category Pages\".tl,\n          builder: setCategoryPagesWidget,\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"Network Favorite Pages\".tl,\n          builder: setFavoritesPagesWidget,\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"Search Sources\".tl,\n          builder: setSearchSourcesWidget,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Show favorite status on comic tile\".tl,\n          settingKey: \"showFavoriteStatusOnTile\",\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Show history on comic tile\".tl,\n          settingKey: \"showHistoryStatusOnTile\",\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Reverse default chapter order\".tl,\n          settingKey: \"reverseChapterOrder\",\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"Keyword blocking\".tl,\n          builder: () => const _ManageBlockingWordView(),\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"Comment keyword blocking\".tl,\n          builder: () => const _ManageBlockingCommentWordView(),\n        ).toSliver(),\n        SelectSetting(\n          title: \"Default Search Target\".tl,\n          settingKey: \"defaultSearchTarget\",\n          optionTranslation: {\n            '_aggregated_': \"Aggregated\".tl,\n            ...((){\n              var map = <String, String>{};\n              for (var c in ComicSource.all()) {\n                map[c.key] = c.name;\n              }\n              return map;\n            }()),\n          },\n        ).toSliver(),\n        SelectSetting(\n          title: \"Auto Language Filters\".tl,\n          settingKey: \"autoAddLanguageFilter\",\n          optionTranslation: {\n            'none': \"None\".tl,\n            'chinese': \"Chinese\",\n            'english': \"English\",\n            'japanese': \"Japanese\",\n          },\n        ).toSliver(),\n        SelectSetting(\n          title: \"Initial Page\".tl,\n          settingKey: \"initialPage\",\n          optionTranslation: {\n            '0': \"Home Page\".tl,\n            '1': \"Favorites Page\".tl,\n            '2': \"Explore Page\".tl,\n            '3': \"Categories Page\".tl,\n          },\n        ).toSliver(),\n        SelectSetting(\n          title: \"Display mode of comic list\".tl,\n          settingKey: \"comicListDisplayMode\",\n          optionTranslation: {\n            \"paging\": \"Paging\".tl,\n            \"Continuous\": \"Continuous\".tl,\n          },\n        ).toSliver(),\n      ],\n    );\n  }\n}\n\nclass _ManageBlockingWordView extends StatefulWidget {\n  const _ManageBlockingWordView();\n\n  @override\n  State<_ManageBlockingWordView> createState() =>\n      _ManageBlockingWordViewState();\n}\n\nclass _ManageBlockingWordViewState extends State<_ManageBlockingWordView> {\n  @override\n  Widget build(BuildContext context) {\n    assert(appdata.settings[\"blockedWords\"] is List);\n    return PopUpWidgetScaffold(\n      title: \"Keyword blocking\".tl,\n      tailing: [\n        TextButton.icon(\n          icon: const Icon(Icons.add),\n          label: Text(\"Add\".tl),\n          onPressed: add,\n        ),\n      ],\n      body: ListView.builder(\n        itemCount: appdata.settings[\"blockedWords\"].length,\n        itemBuilder: (context, index) {\n          return ListTile(\n            title: Text(appdata.settings[\"blockedWords\"][index]),\n            trailing: IconButton(\n              icon: const Icon(Icons.close),\n              onPressed: () {\n                appdata.settings[\"blockedWords\"].removeAt(index);\n                appdata.saveData();\n                setState(() {});\n              },\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  void add() {\n    showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        var controller = TextEditingController();\n        String? error;\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"Add keyword\".tl,\n            content: TextField(\n              controller: controller,\n              decoration: InputDecoration(\n                border: const OutlineInputBorder(),\n                label: Text(\"Keyword\".tl),\n                errorText: error,\n              ),\n              onChanged: (s) {\n                if (error != null) {\n                  setState(() {\n                    error = null;\n                  });\n                }\n              },\n            ).paddingHorizontal(12),\n            actions: [\n              Button.filled(\n                onPressed: () {\n                  if (appdata.settings[\"blockedWords\"]\n                      .contains(controller.text)) {\n                    setState(() {\n                      error = \"Keyword already exists\".tl;\n                    });\n                    return;\n                  }\n                  appdata.settings[\"blockedWords\"].add(controller.text);\n                  appdata.saveData();\n                  this.setState(() {});\n                  context.pop();\n                },\n                child: Text(\"Add\".tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n  }\n}\n\nWidget setExplorePagesWidget() {\n  var pages = <String, String>{};\n  for (var c in ComicSource.all()) {\n    for (var page in c.explorePages) {\n      pages[page.title] = page.title.ts(c.key);\n    }\n  }\n  return _MultiPagesFilter(\n    title: \"Explore Pages\".tl,\n    settingsIndex: \"explore_pages\",\n    pages: pages,\n  );\n}\n\nWidget setCategoryPagesWidget() {\n  var pages = <String, String>{};\n  for (var c in ComicSource.all()) {\n    if (c.categoryData != null) {\n      pages[c.categoryData!.key] = c.categoryData!.title;\n    }\n  }\n  return _MultiPagesFilter(\n    title: \"Category Pages\".tl,\n    settingsIndex: \"categories\",\n    pages: pages,\n  );\n}\n\nWidget setFavoritesPagesWidget() {\n  var pages = <String, String>{};\n  for (var c in ComicSource.all()) {\n    if (c.favoriteData != null) {\n      pages[c.favoriteData!.key] = c.favoriteData!.title;\n    }\n  }\n  return _MultiPagesFilter(\n    title: \"Network Favorite Pages\".tl,\n    settingsIndex: \"favorites\",\n    pages: pages,\n  );\n}\n\nWidget setSearchSourcesWidget() {\n  var pages = <String, String>{};\n  for (var c in ComicSource.all()) {\n    if (c.searchPageData != null) {\n      pages[c.key] = c.name;\n    }\n  }\n  return _MultiPagesFilter(\n    title: \"Search Sources\".tl,\n    settingsIndex: \"searchSources\",\n    pages: pages,\n  );\n}\n\nclass _ManageBlockingCommentWordView extends StatefulWidget {\n  const _ManageBlockingCommentWordView();\n\n  @override\n  State<_ManageBlockingCommentWordView> createState() =>\n      _ManageBlockingCommentWordViewState();\n}\n\nclass _ManageBlockingCommentWordViewState extends State<_ManageBlockingCommentWordView> {\n  @override\n  Widget build(BuildContext context) {\n    assert(appdata.settings[\"blockedCommentWords\"] is List);\n    return PopUpWidgetScaffold(\n      title: \"Comment keyword blocking\".tl,\n      tailing: [\n        TextButton.icon(\n          icon: const Icon(Icons.add),\n          label: Text(\"Add\".tl),\n          onPressed: add,\n        ),\n      ],\n      body: ListView.builder(\n        itemCount: appdata.settings[\"blockedCommentWords\"].length,\n        itemBuilder: (context, index) {\n          return ListTile(\n            title: Text(appdata.settings[\"blockedCommentWords\"][index]),\n            trailing: IconButton(\n              icon: const Icon(Icons.close),\n              onPressed: () {\n                appdata.settings[\"blockedCommentWords\"].removeAt(index);\n                appdata.saveData();\n                setState(() {});\n              },\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  void add() {\n    showDialog(\n      context: App.rootContext,\n      builder: (context) {\n        var controller = TextEditingController();\n        String? error;\n        return StatefulBuilder(builder: (context, setState) {\n          return ContentDialog(\n            title: \"Add keyword\".tl,\n            content: TextField(\n              controller: controller,\n              decoration: InputDecoration(\n                border: const OutlineInputBorder(),\n                label: Text(\"Keyword\".tl),\n                errorText: error,\n              ),\n              onChanged: (s) {\n                if (error != null) {\n                  setState(() {\n                    error = null;\n                  });\n                }\n              },\n            ).paddingHorizontal(12),\n            actions: [\n              Button.filled(\n                onPressed: () {\n                  if (appdata.settings[\"blockedCommentWords\"]\n                      .contains(controller.text)) {\n                    setState(() {\n                      error = \"Keyword already exists\".tl;\n                    });\n                    return;\n                  }\n                  appdata.settings[\"blockedCommentWords\"].add(controller.text);\n                  appdata.saveData();\n                  this.setState(() {});\n                  context.pop();\n                },\n                child: Text(\"Add\".tl),\n              ),\n            ],\n          );\n        });\n      },\n    );\n  }\n}"
  },
  {
    "path": "lib/pages/settings/local_favorites.dart",
    "content": "part of 'settings_page.dart';\n\nclass LocalFavoritesSettings extends StatefulWidget {\n  const LocalFavoritesSettings({super.key});\n\n  @override\n  State<LocalFavoritesSettings> createState() => _LocalFavoritesSettingsState();\n}\n\nclass _LocalFavoritesSettingsState extends State<LocalFavoritesSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"Local Favorites\".tl)),\n        _SwitchSetting(\n          title: \"Show local favorites before network favorites\".tl,\n          settingKey: \"localFavoritesFirst\",\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Auto close favorite panel after operation\".tl,\n          settingKey: \"autoCloseFavoritePanel\",\n        ).toSliver(),\n        SelectSetting(\n          title: \"Add new favorite to\".tl,\n          settingKey: \"newFavoriteAddTo\",\n          optionTranslation: {\n            \"start\": \"Start\".tl,\n            \"end\": \"End\".tl,\n          },\n        ).toSliver(),\n        SelectSetting(\n          title: \"Move favorite after reading\".tl,\n          settingKey: \"moveFavoriteAfterRead\",\n          optionTranslation: {\n            \"none\": \"None\".tl,\n            \"end\": \"End\".tl,\n            \"start\": \"Start\".tl,\n          },\n        ).toSliver(),\n        SelectSetting(\n          title: \"Quick Favorite\".tl,\n          settingKey: \"quickFavorite\",\n          help:\n              \"Long press on the favorite button to quickly add to this folder\"\n                  .tl,\n          optionTranslation: {\n            for (var e in LocalFavoritesManager().folderNames) e: e\n          },\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Delete all unavailable local favorite items\".tl,\n          callback: () async {\n            var controller = showLoadingDialog(context);\n            var count = await LocalFavoritesManager().removeInvalid();\n            controller.close();\n            context.showMessage(\n                message: \"Deleted @a favorite items\".tlParams({'a': count}));\n          },\n          actionTitle: 'Delete'.tl,\n        ).toSliver(),\n        SelectSetting(\n          title: \"Click favorite\".tl,\n          settingKey: \"onClickFavorite\",\n          optionTranslation: {\n            \"viewDetail\": \"View Detail\".tl,\n            \"read\": \"Read\".tl,\n          },\n        ).toSliver(),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/network.dart",
    "content": "part of 'settings_page.dart';\n\nclass NetworkSettings extends StatefulWidget {\n  const NetworkSettings({super.key});\n\n  @override\n  State<NetworkSettings> createState() => _NetworkSettingsState();\n}\n\nclass _NetworkSettingsState extends State<NetworkSettings> {\n  @override\n  Widget build(BuildContext context) {\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"Network\".tl)),\n        _PopupWindowSetting(\n          title: \"Proxy\".tl,\n          builder: () => const _ProxySettingView(),\n        ).toSliver(),\n        _PopupWindowSetting(\n          title: \"DNS Overrides\".tl,\n          builder: () => const _DNSOverrides(),\n        ).toSliver(),\n        _SliderSetting(\n          title: \"Download Threads\".tl,\n          settingsIndex: 'downloadThreads',\n          interval: 1,\n          min: 1,\n          max: 16,\n        ).toSliver(),\n      ],\n    );\n  }\n}\n\nclass _ProxySettingView extends StatefulWidget {\n  const _ProxySettingView();\n\n  @override\n  State<_ProxySettingView> createState() => _ProxySettingViewState();\n}\n\nclass _ProxySettingViewState extends State<_ProxySettingView> {\n  String type = '';\n  String host = '';\n  String port = '';\n  String username = '';\n  String password = '';\n\n  // USERNAME:PASSWORD@HOST:PORT\n  String toProxyStr() {\n    if (type == 'direct') {\n      return 'direct';\n    } else if (type == 'system') {\n      return 'system';\n    }\n    var res = '';\n    if (username.isNotEmpty) {\n      res += username;\n      if (password.isNotEmpty) {\n        res += ':$password';\n      }\n      res += '@';\n    }\n    res += host;\n    if (port.isNotEmpty) {\n      res += ':$port';\n    }\n    return res;\n  }\n\n  void parseProxyString(String proxy) {\n    if (proxy == 'direct') {\n      type = 'direct';\n      return;\n    } else if (proxy == 'system') {\n      type = 'system';\n      return;\n    }\n    type = 'manual';\n    var parts = proxy.split('@');\n    if (parts.length == 2) {\n      var auth = parts[0].split(':');\n      if (auth.length == 2) {\n        username = auth[0];\n        password = auth[1];\n      }\n      parts = parts[1].split(':');\n      if (parts.length == 2) {\n        host = parts[0];\n        port = parts[1];\n      }\n    } else {\n      parts = proxy.split(':');\n      if (parts.length == 2) {\n        host = parts[0];\n        port = parts[1];\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    var proxy = appdata.settings['proxy'];\n    parseProxyString(proxy);\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopUpWidgetScaffold(\n      title: \"Proxy\".tl,\n      body: SingleChildScrollView(\n        child: RadioGroup<String>(\n          groupValue: type,\n          onChanged: (v) {\n            setState(() {\n              type = v ?? type;\n            });\n            if (type != 'manual') {\n              appdata.settings['proxy'] = toProxyStr();\n              appdata.saveData();\n            }\n          },\n          child: Column(\n            children: [\n              RadioListTile<String>(\n                title: Text(\"Direct\".tl),\n                value: 'direct',\n              ),\n              RadioListTile<String>(\n                title: Text(\"System\".tl),\n                value: 'system',\n              ),\n              RadioListTile(\n                title: Text(\"Manual\".tl),\n                value: 'manual',\n              ),\n              if (type == 'manual') buildManualProxy(),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  var formKey = GlobalKey<FormState>();\n\n  Widget buildManualProxy() {\n    return Form(\n      key: formKey,\n      child: Column(\n        children: [\n          TextFormField(\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"Host\".tl,\n            ),\n            controller: TextEditingController(text: host),\n            onChanged: (v) {\n              host = v;\n            },\n            validator: (v) {\n              if (v?.isEmpty ?? false) {\n                return \"Host cannot be empty\".tl;\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 8),\n          TextFormField(\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"Port\".tl,\n            ),\n            controller: TextEditingController(text: port),\n            onChanged: (v) {\n              port = v;\n            },\n            validator: (v) {\n              if (v?.isEmpty ?? true) {\n                return null;\n              }\n              if (int.tryParse(v!) == null) {\n                return \"Port must be a number\".tl;\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 8),\n          TextFormField(\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"Username\".tl,\n            ),\n            controller: TextEditingController(text: username),\n            onChanged: (v) {\n              username = v;\n            },\n            validator: (v) {\n              if ((v?.isEmpty ?? false) && password.isNotEmpty) {\n                return \"Username cannot be empty\".tl;\n              }\n              return null;\n            },\n          ),\n          const SizedBox(height: 8),\n          TextFormField(\n            decoration: InputDecoration(\n              border: const OutlineInputBorder(),\n              labelText: \"Password\".tl,\n            ),\n            controller: TextEditingController(text: password),\n            onChanged: (v) {\n              password = v;\n            },\n          ),\n          const SizedBox(height: 16),\n          FilledButton(\n            onPressed: () {\n              if (formKey.currentState?.validate() ?? false) {\n                appdata.settings['proxy'] = toProxyStr();\n                appdata.saveData();\n                App.rootContext.pop();\n              }\n            },\n            child: Text(\"Save\".tl),\n          ),\n        ],\n      ),\n    ).paddingHorizontal(16).paddingTop(16);\n  }\n}\n\nclass _DNSOverrides extends StatefulWidget {\n  const _DNSOverrides();\n\n  @override\n  State<_DNSOverrides> createState() => __DNSOverridesState();\n}\n\nclass __DNSOverridesState extends State<_DNSOverrides> {\n  var overrides = <(TextEditingController, TextEditingController)>[];\n\n  @override\n  void initState() {\n    for (var entry in (appdata.settings['dnsOverrides'] as Map).entries) {\n      if (entry.key is String && entry.value is String) {\n        overrides.add((\n          TextEditingController(text: entry.key),\n          TextEditingController(text: entry.value)\n        ));\n      }\n    }\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    var map = <String, String>{};\n    for (var entry in overrides) {\n      map[entry.$1.text] = entry.$2.text;\n    }\n    appdata.settings['dnsOverrides'] = map;\n    appdata.saveData();\n    JsEngine().resetDio();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopUpWidgetScaffold(\n      title: \"DNS Overrides\".tl,\n      body: SingleChildScrollView(\n        child: Column(\n          children: [\n            _SwitchSetting(\n              title: \"Enable DNS Overrides\".tl,\n              settingKey: \"enableDnsOverrides\",\n            ),\n            _SwitchSetting(\n              title: \"Server Name Indication\",\n              settingKey: \"sni\",\n            ),\n            const SizedBox(height: 8),\n            Container(\n              height: 1,\n              margin: EdgeInsets.symmetric(horizontal: 8),\n              color: context.colorScheme.outlineVariant,\n            ),\n            for (var i = 0; i < overrides.length; i++) buildOverride(i),\n            const SizedBox(height: 8),\n            TextButton.icon(\n              onPressed: () {\n                setState(() {\n                  overrides\n                      .add((TextEditingController(), TextEditingController()));\n                });\n              },\n              icon: const Icon(Icons.add),\n              label: Text(\"Add\".tl),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildOverride(int index) {\n    var entry = overrides[index];\n    return Container(\n      key: ValueKey(index),\n      height: 48,\n      margin: EdgeInsets.symmetric(horizontal: 8),\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            color: context.colorScheme.outlineVariant,\n          ),\n          left: BorderSide(\n            color: context.colorScheme.outlineVariant,\n          ),\n          right: BorderSide(\n            color: context.colorScheme.outlineVariant,\n          ),\n        ),\n      ),\n      child: Row(\n        children: [\n          Expanded(\n            child: TextField(\n              decoration: InputDecoration(\n                border: InputBorder.none,\n                hintText: \"Domain\".tl,\n              ),\n              controller: entry.$1,\n            ).paddingHorizontal(8),\n          ),\n          Container(\n            width: 1,\n            color: context.colorScheme.outlineVariant,\n          ),\n          Expanded(\n            child: TextField(\n              decoration: InputDecoration(\n                border: InputBorder.none,\n                hintText: \"IP\".tl,\n              ),\n              controller: entry.$2,\n            ).paddingHorizontal(8),\n          ),\n          Container(\n            width: 1,\n            color: context.colorScheme.outlineVariant,\n          ),\n          IconButton(\n            icon: const Icon(Icons.delete_outline),\n            onPressed: () {\n              setState(() {\n                overrides.removeAt(index);\n              });\n            },\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/reader.dart",
    "content": "part of 'settings_page.dart';\n\nclass ReaderSettings extends StatefulWidget {\n  const ReaderSettings({\n    super.key,\n    this.onChanged,\n    this.comicId,\n    this.comicSource,\n  });\n\n  final void Function(String key)? onChanged;\n  final String? comicId;\n  final String? comicSource;\n\n  @override\n  State<ReaderSettings> createState() => _ReaderSettingsState();\n}\n\nclass _ReaderSettingsState extends State<ReaderSettings> {\n  bool _isChapterCommentsAtEndSupported() {\n    String? readerMode;\n    bool? showChapterComments;\n\n    if (widget.comicId != null &&\n        widget.comicSource != null &&\n        appdata.settings.isComicSpecificSettingsEnabled(\n          widget.comicId,\n          widget.comicSource,\n        )) {\n      readerMode = appdata.settings.getReaderSetting(\n        widget.comicId!,\n        widget.comicSource!,\n        'readerMode',\n      );\n      showChapterComments = appdata.settings.getReaderSetting(\n        widget.comicId!,\n        widget.comicSource!,\n        'showChapterComments',\n      );\n    } else {\n      readerMode = appdata.settings['readerMode'] as String?;\n      showChapterComments = appdata.settings['showChapterComments'] as bool?;\n    }\n\n    // Must have showChapterComments enabled and be in gallery mode\n    if (showChapterComments != true) return false;\n\n    return readerMode == 'galleryLeftToRight' ||\n        readerMode == 'galleryRightToLeft';\n  }\n\n  void _onShowChapterCommentsChanged() {\n    // When showChapterComments is turned off, also turn off showChapterCommentsAtEnd\n    bool? showChapterComments;\n\n    if (widget.comicId != null &&\n        widget.comicSource != null &&\n        appdata.settings.isComicSpecificSettingsEnabled(\n          widget.comicId,\n          widget.comicSource,\n        )) {\n      showChapterComments = appdata.settings.getReaderSetting(\n        widget.comicId!,\n        widget.comicSource!,\n        'showChapterComments',\n      );\n      if (showChapterComments != true) {\n        appdata.settings.setReaderSetting(\n          widget.comicId!,\n          widget.comicSource!,\n          'showChapterCommentsAtEnd',\n          false,\n        );\n      }\n    } else {\n      showChapterComments = appdata.settings['showChapterComments'] as bool?;\n      if (showChapterComments != true) {\n        appdata.settings['showChapterCommentsAtEnd'] = false;\n      }\n    }\n\n    setState(() {});\n    widget.onChanged?.call(\"showChapterComments\");\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final comicId = widget.comicId;\n    final sourceKey = widget.comicSource;\n    final key = \"$comicId@$sourceKey\";\n\n    bool isEnabledSpecificSettings =\n        comicId != null &&\n        appdata.settings.isComicSpecificSettingsEnabled(comicId, sourceKey);\n    bool useDeviceSpecificSettings =\n        !isEnabledSpecificSettings &&\n        appdata.settings.isDeviceSpecificSettingsEnabled();\n\n    return SmoothCustomScrollView(\n      slivers: [\n        SliverAppbar(title: Text(\"Reading\".tl)),\n        if (comicId != null && sourceKey != null)\n          SliverMainAxisGroup(\n            slivers: [\n              SwitchListTile(\n                title: Text(\"Enable comic specific settings\".tl),\n                value: isEnabledSpecificSettings,\n                onChanged: (b) {\n                  setState(() {\n                    appdata.settings.setEnabledComicSpecificSettings(\n                      comicId,\n                      sourceKey,\n                      b,\n                    );\n                  });\n                },\n              ).toSliver(),\n              if (isEnabledSpecificSettings)\n                Center(\n                  child: TextButton(\n                    onPressed: () {\n                      setState(() {\n                        appdata.settings.resetComicReaderSettings(key);\n                      });\n                    },\n                    child: Text(\n                      \"Clear specific reader settings for this comic\".tl,\n                    ),\n                  ),\n                ).toSliver(),\n              Divider().toSliver(),\n            ],\n          ),\n        if (comicId == null)\n          SliverMainAxisGroup(\n            slivers: [\n              SwitchListTile(\n                title: Text(\"Enable device specific settings\".tl),\n                value: useDeviceSpecificSettings,\n                onChanged: (b) {\n                  setState(() {\n                    appdata.settings.setEnabledDeviceSpecificSettings(b);\n                  });\n                  appdata.saveData();\n                },\n              ).toSliver(),\n              if (useDeviceSpecificSettings)\n                Center(\n                  child: TextButton(\n                    onPressed: () {\n                      setState(() {\n                        appdata.settings.resetDeviceReaderSettings();\n                      });\n                      appdata.saveData();\n                    },\n                    child: Text(\n                      \"Clear specific reader settings for this device\".tl,\n                    ),\n                  ),\n                ).toSliver(),\n              Divider().toSliver(),\n            ],\n          ),\n        _SwitchSetting(\n          title: \"Tap to turn Pages\".tl,\n          settingKey: \"enableTapToTurnPages\",\n          onChanged: () {\n            widget.onChanged?.call(\"enableTapToTurnPages\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Reverse tap to turn Pages\".tl,\n          settingKey: \"reverseTapToTurnPages\",\n          onChanged: () {\n            widget.onChanged?.call(\"reverseTapToTurnPages\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Page animation\".tl,\n          settingKey: \"enablePageAnimation\",\n          onChanged: () {\n            widget.onChanged?.call(\"enablePageAnimation\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        SelectSetting(\n          title: \"Reading mode\".tl,\n          settingKey: \"readerMode\",\n          optionTranslation: {\n            \"galleryLeftToRight\": \"Gallery (Left to Right)\".tl,\n            \"galleryRightToLeft\": \"Gallery (Right to Left)\".tl,\n            \"galleryTopToBottom\": \"Gallery (Top to Bottom)\".tl,\n            \"continuousLeftToRight\": \"Continuous (Left to Right)\".tl,\n            \"continuousRightToLeft\": \"Continuous (Right to Left)\".tl,\n            \"continuousTopToBottom\": \"Continuous (Top to Bottom)\".tl,\n          },\n          onChanged: () {\n            setState(() {});\n            var readerMode = appdata.settings['readerMode'];\n            if (readerMode?.toLowerCase().startsWith('continuous') ?? false) {\n              appdata.settings['readerScreenPicNumberForLandscape'] = 1;\n              widget.onChanged?.call('readerScreenPicNumberForLandscape');\n              appdata.settings['readerScreenPicNumberForPortrait'] = 1;\n              widget.onChanged?.call('readerScreenPicNumberForPortrait');\n            }\n            widget.onChanged?.call(\"readerMode\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SliderSetting(\n          title: \"Auto page turning interval\".tl,\n          settingsIndex: \"autoPageTurningInterval\",\n          interval: 1,\n          min: 1,\n          max: 20,\n          onChanged: () {\n            setState(() {});\n            widget.onChanged?.call(\"autoPageTurningInterval\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        SliverAnimatedVisibility(\n          visible: appdata.settings['readerMode']!.startsWith('gallery'),\n          child: _SliderSetting(\n            title:\n                \"The number of pic in screen for landscape (Only Gallery Mode)\"\n                    .tl,\n            settingsIndex: \"readerScreenPicNumberForLandscape\",\n            interval: 1,\n            min: 1,\n            max: 5,\n            onChanged: () {\n              setState(() {});\n              widget.onChanged?.call(\"readerScreenPicNumberForLandscape\");\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ),\n        ),\n        SliverAnimatedVisibility(\n          visible: appdata.settings['readerMode']!.startsWith('gallery'),\n          child: _SliderSetting(\n            title:\n                \"The number of pic in screen for portrait (Only Gallery Mode)\"\n                    .tl,\n            settingsIndex: \"readerScreenPicNumberForPortrait\",\n            interval: 1,\n            min: 1,\n            max: 5,\n            onChanged: () {\n              widget.onChanged?.call(\"readerScreenPicNumberForPortrait\");\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ),\n        ),\n        SliverAnimatedVisibility(\n          visible:\n              appdata.settings['readerMode']!.startsWith('gallery') &&\n              (appdata.settings['readerScreenPicNumberForLandscape'] > 1 ||\n                  appdata.settings['readerScreenPicNumberForPortrait'] > 1),\n          child: _SwitchSetting(\n            title: \"Show single image on first page\".tl,\n            settingKey: \"showSingleImageOnFirstPage\",\n            onChanged: () {\n              widget.onChanged?.call(\"showSingleImageOnFirstPage\");\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ),\n        ),\n        SliverAnimatedVisibility(\n          visible: appdata.settings['readerMode']!.startsWith('continuous'),\n          child: _SliderSetting(\n            title: \"Mouse scroll speed\".tl,\n            settingsIndex: \"readerScrollSpeed\",\n            interval: 0.1,\n            min: 0.5,\n            max: 3,\n            onChanged: () {\n              widget.onChanged?.call(\"readerScrollSpeed\");\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ),\n        ),\n        _SwitchSetting(\n          title: 'Double tap to zoom'.tl,\n          settingKey: 'enableDoubleTapToZoom',\n          onChanged: () {\n            setState(() {});\n            widget.onChanged?.call('enableDoubleTapToZoom');\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SwitchSetting(\n          title: 'Long press to zoom'.tl,\n          settingKey: 'enableLongPressToZoom',\n          onChanged: () {\n            setState(() {});\n            widget.onChanged?.call('enableLongPressToZoom');\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        SliverAnimatedVisibility(\n          visible: appdata.settings['enableLongPressToZoom'] == true,\n          child: SelectSetting(\n            title: \"Long press zoom position\".tl,\n            settingKey: \"longPressZoomPosition\",\n            optionTranslation: {\n              \"press\": \"Press position\".tl,\n              \"center\": \"Screen center\".tl,\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ),\n        ),\n        _SwitchSetting(\n          title: 'Limit image width'.tl,\n          subtitle: 'When using Continuous(Top to Bottom) mode'.tl,\n          settingKey: 'limitImageWidth',\n          onChanged: () {\n            widget.onChanged?.call('limitImageWidth');\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        if (App.isAndroid)\n          _SwitchSetting(\n            title: 'Turn page by volume keys'.tl,\n            settingKey: 'enableTurnPageByVolumeKey',\n            onChanged: () {\n              widget.onChanged?.call('enableTurnPageByVolumeKey');\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ).toSliver(),\n        _SwitchSetting(\n          title: \"Display time & battery info in reader\".tl,\n          settingKey: \"enableClockAndBatteryInfoInReader\",\n          onChanged: () {\n            widget.onChanged?.call(\"enableClockAndBatteryInfoInReader\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Show system status bar\".tl,\n          settingKey: \"showSystemStatusBar\",\n          onChanged: () {\n            widget.onChanged?.call(\"showSystemStatusBar\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        SelectSetting(\n          title: \"Quick collect image\".tl,\n          settingKey: \"quickCollectImage\",\n          optionTranslation: {\n            \"No\": \"Not enable\".tl,\n            \"DoubleTap\": \"Double Tap\".tl,\n            \"Swipe\": \"Swipe\".tl,\n          },\n          onChanged: () {\n            widget.onChanged?.call(\"quickCollectImage\");\n          },\n          help:\n              \"On the image browsing page, you can quickly collect images by sliding horizontally or vertically according to your reading mode\"\n                  .tl,\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _CallbackSetting(\n          title: \"Custom Image Processing\".tl,\n          callback: () => context.to(() => _CustomImageProcessing()),\n          actionTitle: \"Edit\".tl,\n        ).toSliver(),\n        _SliderSetting(\n          title: \"Number of images preloaded\".tl,\n          settingsIndex: \"preloadImageCount\",\n          interval: 1,\n          min: 1,\n          max: 16,\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Show Page Number\".tl,\n          settingKey: \"showPageNumberInReader\",\n          onChanged: () {\n            widget.onChanged?.call(\"showPageNumberInReader\");\n          },\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        _SwitchSetting(\n          title: \"Show Chapter Comments\".tl,\n          settingKey: \"showChapterComments\",\n          onChanged: _onShowChapterCommentsChanged,\n          comicId: isEnabledSpecificSettings ? widget.comicId : null,\n          comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n          useDeviceSettings: useDeviceSpecificSettings,\n        ).toSliver(),\n        SliverAnimatedVisibility(\n          visible: _isChapterCommentsAtEndSupported(),\n          child: _SwitchSetting(\n            title: \"Show Comments at Chapter End\".tl,\n            settingKey: \"showChapterCommentsAtEnd\",\n            onChanged: () {\n              widget.onChanged?.call(\"showChapterCommentsAtEnd\");\n            },\n            comicId: isEnabledSpecificSettings ? widget.comicId : null,\n            comicSource: isEnabledSpecificSettings ? widget.comicSource : null,\n            useDeviceSettings: useDeviceSpecificSettings,\n          ),\n        ),\n      ],\n    );\n  }\n}\n\nclass _CustomImageProcessing extends StatefulWidget {\n  const _CustomImageProcessing();\n\n  @override\n  State<_CustomImageProcessing> createState() => __CustomImageProcessingState();\n}\n\nclass __CustomImageProcessingState extends State<_CustomImageProcessing> {\n  var current = '';\n\n  @override\n  void initState() {\n    super.initState();\n    current = appdata.settings['customImageProcessing'];\n  }\n\n  @override\n  void dispose() {\n    appdata.settings['customImageProcessing'] = current;\n    appdata.saveData();\n    super.dispose();\n  }\n\n  int resetKey = 0;\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: Appbar(\n        title: Text(\"Custom Image Processing\".tl),\n        actions: [\n          TextButton(\n            onPressed: () {\n              current = defaultCustomImageProcessing;\n              appdata.settings['customImageProcessing'] = current;\n              resetKey++;\n              setState(() {});\n            },\n            child: Text(\"Reset\".tl),\n          ),\n        ],\n      ),\n      body: Column(\n        children: [\n          _SwitchSetting(\n            title: \"Enable\".tl,\n            settingKey: \"enableCustomImageProcessing\",\n          ),\n          Expanded(\n            child: Container(\n              margin: EdgeInsets.all(8),\n              decoration: BoxDecoration(\n                borderRadius: BorderRadius.circular(4),\n                border: Border.all(color: context.colorScheme.outlineVariant),\n              ),\n              child: SizedBox.expand(\n                child: CodeEditor(\n                  key: ValueKey(resetKey),\n                  initialValue: appdata.settings['customImageProcessing'],\n                  onChanged: (value) {\n                    current = value;\n                  },\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/setting_components.dart",
    "content": "part of 'settings_page.dart';\n\nclass _SwitchSetting extends StatefulWidget {\n  const _SwitchSetting({\n    required this.title,\n    required this.settingKey,\n    this.onChanged,\n    this.subtitle,\n    this.comicId,\n    this.comicSource,\n    this.useDeviceSettings = false,\n  });\n\n  final String title;\n\n  final String settingKey;\n\n  final VoidCallback? onChanged;\n\n  final String? subtitle;\n\n  final String? comicId;\n\n  final String? comicSource;\n\n  final bool useDeviceSettings;\n\n  @override\n  State<_SwitchSetting> createState() => _SwitchSettingState();\n}\n\nclass _SwitchSettingState extends State<_SwitchSetting> {\n  @override\n  Widget build(BuildContext context) {\n    var value = widget.comicId != null\n        ? appdata.settings.getReaderSetting(\n            widget.comicId!,\n            widget.comicSource!,\n            widget.settingKey,\n          )\n        : widget.useDeviceSettings\n        ? appdata.settings.getDeviceReaderSetting(widget.settingKey)\n        : appdata.settings[widget.settingKey];\n\n    assert(value is bool);\n\n    return ListTile(\n      title: Text(widget.title),\n      subtitle: widget.subtitle == null ? null : Text(widget.subtitle!),\n      trailing: Switch(\n        value: value,\n        onChanged: (value) {\n          setState(() {\n            if (widget.comicId != null) {\n              appdata.settings.setReaderSetting(\n                widget.comicId!,\n                widget.comicSource!,\n                widget.settingKey,\n                value,\n              );\n            } else if (widget.useDeviceSettings) {\n              appdata.settings.setDeviceReaderSetting(widget.settingKey, value);\n            } else {\n              appdata.settings[widget.settingKey] = value;\n            }\n          });\n          appdata.saveData().then((_) {\n            widget.onChanged?.call();\n          });\n        },\n      ),\n    );\n  }\n}\n\nclass SelectSetting extends StatelessWidget {\n  const SelectSetting({\n    super.key,\n    required this.title,\n    required this.settingKey,\n    required this.optionTranslation,\n    this.onChanged,\n    this.help,\n    this.comicId,\n    this.comicSource,\n    this.useDeviceSettings = false,\n  });\n\n  final String title;\n\n  final String settingKey;\n\n  final Map<String, String> optionTranslation;\n\n  final VoidCallback? onChanged;\n\n  final String? help;\n\n  final String? comicId;\n\n  final String? comicSource;\n\n  final bool useDeviceSettings;\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      width: double.infinity,\n      child: LayoutBuilder(\n        builder: (context, constraints) {\n          if (constraints.maxWidth < 450) {\n            return _DoubleLineSelectSettings(\n              title: title,\n              settingKey: settingKey,\n              optionTranslation: optionTranslation,\n              onChanged: onChanged,\n              help: help,\n              comicId: comicId,\n              comicSource: comicSource,\n              useDeviceSettings: useDeviceSettings,\n            );\n          } else {\n            return _EndSelectorSelectSetting(\n              title: title,\n              settingKey: settingKey,\n              optionTranslation: optionTranslation,\n              onChanged: onChanged,\n              help: help,\n              comicId: comicId,\n              comicSource: comicSource,\n              useDeviceSettings: useDeviceSettings,\n            );\n          }\n        },\n      ),\n    );\n  }\n}\n\nclass _DoubleLineSelectSettings extends StatefulWidget {\n  const _DoubleLineSelectSettings({\n    required this.title,\n    required this.settingKey,\n    required this.optionTranslation,\n    this.onChanged,\n    this.help,\n    this.comicId,\n    this.comicSource,\n    this.useDeviceSettings = false,\n  });\n\n  final String title;\n\n  final String settingKey;\n\n  final Map<String, String> optionTranslation;\n\n  final VoidCallback? onChanged;\n\n  final String? help;\n\n  final String? comicId;\n\n  final String? comicSource;\n\n  final bool useDeviceSettings;\n\n  @override\n  State<_DoubleLineSelectSettings> createState() =>\n      _DoubleLineSelectSettingsState();\n}\n\nclass _DoubleLineSelectSettingsState extends State<_DoubleLineSelectSettings> {\n  @override\n  Widget build(BuildContext context) {\n    var value = widget.comicId != null\n        ? appdata.settings.getReaderSetting(\n            widget.comicId!,\n            widget.comicSource!,\n            widget.settingKey,\n          )\n        : widget.useDeviceSettings\n        ? appdata.settings.getDeviceReaderSetting(widget.settingKey)\n        : appdata.settings[widget.settingKey];\n\n    return ListTile(\n      title: Row(\n        children: [\n          Text(widget.title),\n          const SizedBox(width: 4),\n          if (widget.help != null)\n            Button.icon(\n              size: 18,\n              icon: const Icon(Icons.help_outline),\n              onPressed: () {\n                showDialog(\n                  context: context,\n                  builder: (context) {\n                    return ContentDialog(\n                      title: \"Help\".tl,\n                      content: Text(\n                        widget.help!,\n                      ).paddingHorizontal(16).fixWidth(double.infinity),\n                      actions: [\n                        Button.filled(\n                          onPressed: context.pop,\n                          child: Text(\"OK\".tl),\n                        ),\n                      ],\n                    );\n                  },\n                );\n              },\n            ),\n        ],\n      ),\n      subtitle: Text(widget.optionTranslation[value] ?? \"None\"),\n      trailing: const Icon(Icons.arrow_drop_down),\n      onTap: () {\n        var renderBox = context.findRenderObject() as RenderBox;\n        var offset = renderBox.localToGlobal(Offset.zero);\n        var size = renderBox.size;\n        var rect = offset & size;\n        showMenu(\n          elevation: 3,\n          color: context.brightness == Brightness.light\n              ? const Color(0xFFF6F6F6)\n              : const Color(0xFF1E1E1E),\n          context: context,\n          position: RelativeRect.fromRect(\n            rect,\n            Offset.zero & MediaQuery.of(context).size,\n          ),\n          items: widget.optionTranslation.keys\n              .map(\n                (key) => PopupMenuItem(\n                  value: key,\n                  height: App.isMobile ? 46 : 40,\n                  child: Text(widget.optionTranslation[key]!),\n                ),\n              )\n              .toList(),\n        ).then((value) {\n          if (value != null) {\n            setState(() {\n              if (widget.comicId != null) {\n                appdata.settings.setReaderSetting(\n                  widget.comicId!,\n                  widget.comicSource!,\n                  widget.settingKey,\n                  value,\n                );\n              } else if (widget.useDeviceSettings) {\n                appdata.settings.setDeviceReaderSetting(\n                  widget.settingKey,\n                  value,\n                );\n              } else {\n                appdata.settings[widget.settingKey] = value;\n              }\n            });\n            appdata.saveData();\n            widget.onChanged?.call();\n          }\n        });\n      },\n    );\n  }\n}\n\nclass _EndSelectorSelectSetting extends StatefulWidget {\n  const _EndSelectorSelectSetting({\n    required this.title,\n    required this.settingKey,\n    required this.optionTranslation,\n    this.onChanged,\n    this.help,\n    this.comicId,\n    this.comicSource,\n    this.useDeviceSettings = false,\n  });\n\n  final String title;\n\n  final String settingKey;\n\n  final Map<String, String> optionTranslation;\n\n  final VoidCallback? onChanged;\n\n  final String? help;\n\n  final String? comicId;\n\n  final String? comicSource;\n\n  final bool useDeviceSettings;\n\n  @override\n  State<_EndSelectorSelectSetting> createState() =>\n      _EndSelectorSelectSettingState();\n}\n\nclass _EndSelectorSelectSettingState extends State<_EndSelectorSelectSetting> {\n  @override\n  Widget build(BuildContext context) {\n    var options = widget.optionTranslation;\n    var value = widget.comicId != null\n        ? appdata.settings.getReaderSetting(\n            widget.comicId!,\n            widget.comicSource!,\n            widget.settingKey,\n          )\n        : widget.useDeviceSettings\n        ? appdata.settings.getDeviceReaderSetting(widget.settingKey)\n        : appdata.settings[widget.settingKey];\n    return ListTile(\n      title: Row(\n        children: [\n          Text(widget.title),\n          const SizedBox(width: 4),\n          if (widget.help != null)\n            Button.icon(\n              size: 18,\n              icon: const Icon(Icons.help_outline),\n              onPressed: () {\n                showDialog(\n                  context: context,\n                  builder: (context) {\n                    return ContentDialog(\n                      title: \"Help\".tl,\n                      content: Text(\n                        widget.help!,\n                      ).paddingHorizontal(16).fixWidth(double.infinity),\n                      actions: [\n                        Button.filled(\n                          onPressed: context.pop,\n                          child: Text(\"OK\".tl),\n                        ),\n                      ],\n                    );\n                  },\n                );\n              },\n            ),\n        ],\n      ),\n      trailing: Select(\n        current: options[value],\n        values: options.values.toList(),\n        minWidth: 64,\n        onTap: (index) {\n          setState(() {\n            var value = options.keys.elementAt(index);\n            if (widget.comicId != null) {\n              appdata.settings.setReaderSetting(\n                widget.comicId!,\n                widget.comicSource!,\n                widget.settingKey,\n                value,\n              );\n            } else if (widget.useDeviceSettings) {\n              appdata.settings.setDeviceReaderSetting(widget.settingKey, value);\n            } else {\n              appdata.settings[widget.settingKey] = value;\n            }\n          });\n          appdata.saveData();\n          widget.onChanged?.call();\n        },\n      ),\n    );\n  }\n}\n\nclass _SliderSetting extends StatefulWidget {\n  const _SliderSetting({\n    required this.title,\n    required this.settingsIndex,\n    required this.interval,\n    required this.min,\n    required this.max,\n    this.onChanged,\n    this.comicId,\n    this.comicSource,\n    this.useDeviceSettings = false,\n  });\n\n  final String title;\n\n  final String settingsIndex;\n\n  final double interval;\n\n  final double min;\n\n  final double max;\n\n  final VoidCallback? onChanged;\n\n  final String? comicId;\n\n  final String? comicSource;\n\n  final bool useDeviceSettings;\n\n  @override\n  State<_SliderSetting> createState() => _SliderSettingState();\n}\n\nclass _SliderSettingState extends State<_SliderSetting> {\n  @override\n  Widget build(BuildContext context) {\n    var value =\n        (widget.comicId != null\n                ? appdata.settings.getReaderSetting(\n                    widget.comicId!,\n                    widget.comicSource!,\n                    widget.settingsIndex,\n                  )\n                : widget.useDeviceSettings\n                ? appdata.settings.getDeviceReaderSetting(widget.settingsIndex)\n                : appdata.settings[widget.settingsIndex])\n            .toDouble();\n    return ListTile(\n      title: Text(widget.title, softWrap: true, maxLines: 2),\n      trailing: Text(value.toString(), style: ts.s12),\n      subtitle: Slider(\n        value: value,\n        onChanged: (value) {\n          if (value.toInt() == value) {\n            setState(() {\n              if (widget.comicId != null) {\n                appdata.settings.setReaderSetting(\n                  widget.comicId!,\n                  widget.comicSource!,\n                  widget.settingsIndex,\n                  value.toInt(),\n                );\n              } else if (widget.useDeviceSettings) {\n                appdata.settings.setDeviceReaderSetting(\n                  widget.settingsIndex,\n                  value.toInt(),\n                );\n              } else {\n                appdata.settings[widget.settingsIndex] = value.toInt();\n              }\n              appdata.saveData();\n            });\n          } else {\n            setState(() {\n              if (widget.comicId != null) {\n                appdata.settings.setReaderSetting(\n                  widget.comicId!,\n                  widget.comicSource!,\n                  widget.settingsIndex,\n                  value,\n                );\n              } else if (widget.useDeviceSettings) {\n                appdata.settings.setDeviceReaderSetting(\n                  widget.settingsIndex,\n                  value,\n                );\n              } else {\n                appdata.settings[widget.settingsIndex] = value;\n              }\n              appdata.saveData();\n            });\n          }\n          widget.onChanged?.call();\n        },\n        divisions: ((widget.max - widget.min) / widget.interval).toInt(),\n        min: widget.min,\n        max: widget.max,\n      ),\n    );\n  }\n}\n\nclass _PopupWindowSetting extends StatelessWidget {\n  const _PopupWindowSetting({required this.title, required this.builder});\n\n  final Widget Function() builder;\n\n  final String title;\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      title: Text(title),\n      trailing: const Icon(Icons.arrow_right),\n      onTap: () {\n        showPopUpWidget(App.rootContext, builder());\n      },\n    );\n  }\n}\n\nclass _MultiPagesFilter extends StatefulWidget {\n  const _MultiPagesFilter({\n    required this.title,\n    required this.settingsIndex,\n    required this.pages,\n  });\n\n  final String title;\n\n  final String settingsIndex;\n\n  // key - name\n  final Map<String, String> pages;\n\n  @override\n  State<_MultiPagesFilter> createState() => _MultiPagesFilterState();\n}\n\nclass _MultiPagesFilterState extends State<_MultiPagesFilter> {\n  late List<String> keys;\n\n  @override\n  void initState() {\n    keys = List.from(appdata.settings[widget.settingsIndex]);\n    keys.remove(\"\");\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    Future.microtask(() {\n      updateSetting();\n    });\n  }\n\n  var reorderWidgetKey = UniqueKey();\n  var scrollController = ScrollController();\n  final _key = GlobalKey();\n\n  @override\n  Widget build(BuildContext context) {\n    var tiles = keys.map((e) => buildItem(e)).toList();\n\n    var view = ReorderableBuilder<String>(\n      key: reorderWidgetKey,\n      scrollController: scrollController,\n      longPressDelay: App.isDesktop\n          ? const Duration(milliseconds: 100)\n          : const Duration(milliseconds: 500),\n      dragChildBoxDecoration: BoxDecoration(\n        color: Theme.of(context).colorScheme.surfaceContainer,\n        boxShadow: const [\n          BoxShadow(\n            color: Colors.black12,\n            blurRadius: 5,\n            offset: Offset(0, 2),\n            spreadRadius: 2,\n          ),\n        ],\n      ),\n      onReorder: (reorderFunc) {\n        setState(() {\n          keys = List.from(reorderFunc(keys));\n        });\n      },\n      children: tiles,\n      builder: (children) {\n        return GridView(\n          key: _key,\n          controller: scrollController,\n          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(\n            crossAxisCount: 1,\n            mainAxisExtent: 48,\n          ),\n          children: children,\n        );\n      },\n    );\n\n    return PopUpWidgetScaffold(\n      title: widget.title,\n      tailing: [\n        if (keys.length < widget.pages.length)\n          TextButton.icon(\n            label: Text(\"Add\".tl),\n            icon: const Icon(Icons.add),\n            onPressed: showAddDialog,\n          ),\n      ],\n      body: view,\n    );\n  }\n\n  Widget buildItem(String key) {\n    Widget removeButton = Padding(\n      padding: const EdgeInsets.only(right: 8),\n      child: IconButton(\n        onPressed: () {\n          setState(() {\n            keys.remove(key);\n          });\n        },\n        icon: const Icon(Icons.delete_outline),\n      ),\n    );\n\n    return ListTile(\n      title: Text(widget.pages[key] ?? \"(Invalid) $key\"),\n      key: Key(key),\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [removeButton, const Icon(Icons.drag_handle)],\n      ),\n    );\n  }\n\n  void showAddDialog() {\n    var canAdd = <String, String>{};\n    widget.pages.forEach((key, value) {\n      if (!keys.contains(key)) {\n        canAdd[key] = value;\n      }\n    });\n    var selected = <String>[];\n    showDialog(\n      context: context,\n      builder: (context) {\n        return StatefulBuilder(\n          builder: (context, setState) {\n            return ContentDialog(\n              title: \"Add\".tl,\n              content: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: canAdd.entries\n                    .map(\n                      (e) => CheckboxListTile(\n                        value: selected.contains(e.key),\n                        title: Text(e.value),\n                        key: Key(e.key),\n                        onChanged: (value) {\n                          setState(() {\n                            if (value!) {\n                              selected.add(e.key);\n                            } else {\n                              selected.remove(e.key);\n                            }\n                          });\n                        },\n                      ),\n                    )\n                    .toList(),\n              ),\n              actions: [\n                if (selected.length < canAdd.length)\n                  TextButton(\n                    child: Text(\"Select All\".tl),\n                    onPressed: () {\n                      setState(() {\n                        selected = canAdd.keys.toList();\n                      });\n                    },\n                  )\n                else\n                  TextButton(\n                    child: Text(\"Deselect All\".tl),\n                    onPressed: () {\n                      setState(() {\n                        selected.clear();\n                      });\n                    },\n                  ),\n                const SizedBox(width: 8),\n                FilledButton(\n                  onPressed: selected.isNotEmpty\n                      ? () {\n                          this.setState(() {\n                            keys.addAll(selected);\n                          });\n                          Navigator.pop(context);\n                        }\n                      : null,\n                  child: Text(\"Add\".tl),\n                ),\n              ],\n            );\n          },\n        );\n      },\n    );\n  }\n\n  void updateSetting() {\n    appdata.settings[widget.settingsIndex] = keys;\n    appdata.saveData();\n  }\n}\n\nclass _CallbackSetting extends StatelessWidget {\n  const _CallbackSetting({\n    required this.title,\n    required this.callback,\n    required this.actionTitle,\n    this.subtitle,\n  });\n\n  final String title;\n\n  final String? subtitle;\n\n  final VoidCallback callback;\n\n  final String actionTitle;\n\n  @override\n  Widget build(BuildContext context) {\n    return ListTile(\n      title: Text(title),\n      subtitle: subtitle == null ? null : Text(subtitle!),\n      trailing: Button.normal(\n        onPressed: callback,\n        child: Text(actionTitle),\n      ).fixHeight(28),\n      onTap: callback,\n    );\n  }\n}\n\nclass _SettingPartTitle extends StatelessWidget {\n  const _SettingPartTitle({required this.title, required this.icon});\n\n  final String title;\n\n  final IconData icon;\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverToBoxAdapter(\n      child: Container(\n        padding: const EdgeInsets.only(left: 16, top: 16, bottom: 8),\n        decoration: BoxDecoration(\n          border: Border(\n            bottom: BorderSide(\n              color: context.colorScheme.onSurface.withValues(alpha: 0.1),\n            ),\n          ),\n        ),\n        child: Row(\n          children: [\n            Icon(icon, size: 24),\n            const SizedBox(width: 8),\n            Text(title, style: ts.s18),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings/settings_page.dart",
    "content": "import 'dart:convert';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_reorderable_grid_view/widgets/reorderable_builder.dart';\nimport 'package:local_auth/local_auth.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/cache_manager.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/js_engine.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/network/app_dio.dart';\nimport 'package:venera/utils/data.dart';\nimport 'package:venera/utils/data_sync.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'package:yaml/yaml.dart';\n\npart 'reader.dart';\npart 'explore_settings.dart';\npart 'setting_components.dart';\npart 'appearance.dart';\npart 'local_favorites.dart';\npart 'app.dart';\npart 'about.dart';\npart 'network.dart';\npart 'debug.dart';\n\nclass SettingsPage extends StatefulWidget {\n  const SettingsPage({this.initialPage = -1, super.key});\n\n  final int initialPage;\n\n  @override\n  State<SettingsPage> createState() => _SettingsPageState();\n}\n\nclass _SettingsPageState extends State<SettingsPage> {\n  int currentPage = -1;\n\n  ColorScheme get colors => Theme.of(context).colorScheme;\n\n  bool get enableTwoViews => context.width > 720;\n\n  final categories = <String>[\n    \"Explore\",\n    \"Reading\",\n    \"Appearance\",\n    \"Local Favorites\",\n    \"APP\",\n    \"Network\",\n    \"About\",\n    \"Debug\"\n  ];\n\n  final icons = <IconData>[\n    Icons.explore,\n    Icons.book,\n    Icons.color_lens,\n    Icons.collections_bookmark_rounded,\n    Icons.apps,\n    Icons.public,\n    Icons.info,\n    Icons.bug_report,\n  ];\n\n  @override\n  void initState() {\n    currentPage = widget.initialPage;\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      child: buildBody(),\n    );\n  }\n\n  Widget buildBody() {\n    if (enableTwoViews) {\n      return Row(\n        children: [\n          SizedBox(\n            width: 280,\n            height: double.infinity,\n            child: buildLeft(),\n          ),\n          Container(\n            height: double.infinity,\n            decoration: BoxDecoration(\n              border: Border(\n                left: BorderSide(\n                  color: context.colorScheme.outlineVariant,\n                  width: 0.6,\n                ),\n              ),\n            ),\n          ),\n          Expanded(\n            child: AnimatedSwitcher(\n              duration: const Duration(milliseconds: 200),\n              transitionBuilder: (child, animation) {\n                return LayoutBuilder(\n                  builder: (context, constrains) {\n                    return AnimatedBuilder(\n                      animation: animation,\n                      builder: (context, _) {\n                        var width = constrains.maxWidth;\n                        var value = animation.isForwardOrCompleted\n                            ? 1 - animation.value\n                            : 1;\n                        var left = width * value;\n                        return Stack(\n                          children: [\n                            Positioned(\n                              top: 0,\n                              bottom: 0,\n                              left: left,\n                              width: width,\n                              child: child,\n                            ),\n                          ],\n                        );\n                      },\n                    );\n                  },\n                );\n              },\n              child: buildRight(),\n            ),\n          )\n        ],\n      );\n    } else {\n      return buildLeft();\n    }\n  }\n\n  Widget buildLeft() {\n    return Material(\n      child: Column(\n        children: [\n          SizedBox(\n            height: MediaQuery.of(context).padding.top,\n          ),\n          SizedBox(\n            height: 56,\n            child: Row(children: [\n              const SizedBox(\n                width: 8,\n              ),\n              Tooltip(\n                message: \"Back\",\n                child: IconButton(\n                  icon: const Icon(Icons.arrow_back),\n                  onPressed: context.pop,\n                ),\n              ),\n              const SizedBox(\n                width: 24,\n              ),\n              Text(\n                \"Settings\".tl,\n                style: ts.s20,\n              )\n            ]),\n          ),\n          const SizedBox(\n            height: 4,\n          ),\n          Expanded(\n            child: buildCategories(),\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget buildCategories() {\n    Widget buildItem(String name, int id) {\n      final bool selected = id == currentPage;\n\n      Widget content = AnimatedContainer(\n        key: ValueKey(id),\n        duration: const Duration(milliseconds: 200),\n        width: double.infinity,\n        height: 46,\n        padding: const EdgeInsets.fromLTRB(12, 0, 12, 0),\n        decoration: BoxDecoration(\n          color: selected ? colors.primaryContainer.toOpacity(0.36) : null,\n          border: Border(\n            left: BorderSide(\n              color: selected ? colors.primary : Colors.transparent,\n              width: 2,\n            ),\n          ),\n        ),\n        child: Row(children: [\n          Icon(icons[id]),\n          const SizedBox(width: 16),\n          Text(\n            name,\n            style: ts.s16,\n          ),\n          const Spacer(),\n          if (selected) const Icon(Icons.arrow_right)\n        ]),\n      );\n\n      return Padding(\n        padding: enableTwoViews\n            ? const EdgeInsets.fromLTRB(8, 0, 8, 0)\n            : EdgeInsets.zero,\n        child: InkWell(\n          onTap: () {\n            if (enableTwoViews) {\n              setState(() => currentPage = id);\n            } else {\n              context.to(() => _SettingsDetailPage(pageIndex: id));\n            }\n          },\n          child: content,\n        ).paddingVertical(4),\n      );\n    }\n\n    return ListView.builder(\n      padding: EdgeInsets.zero,\n      itemCount: categories.length,\n      itemBuilder: (context, index) => buildItem(categories[index].tl, index),\n    );\n  }\n\n  Widget buildRight() {\n    if (currentPage == -1) {\n      return const SizedBox();\n    }\n    return Navigator(\n      onGenerateRoute: (settings) {\n        return PageRouteBuilder(\n          pageBuilder: (context, animation, secondaryAnimation) {\n            return _buildSettingsContent(currentPage);\n          },\n          transitionDuration: Duration.zero,\n        );\n      },\n    );\n  }\n\n  Widget _buildSettingsContent(int pageIndex) {\n    return switch (pageIndex) {\n      0 => const ExploreSettings(),\n      1 => const ReaderSettings(),\n      2 => const AppearanceSettings(),\n      3 => const LocalFavoritesSettings(),\n      4 => const AppSettings(),\n      5 => const NetworkSettings(),\n      6 => const AboutSettings(),\n      7 => const DebugPage(),\n      _ => throw UnimplementedError()\n    };\n  }\n\n}\n\nclass _SettingsDetailPage extends StatelessWidget {\n  const _SettingsDetailPage({required this.pageIndex});\n\n  final int pageIndex;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      child: _buildPage(),\n    );\n  }\n\n  Widget _buildPage() {\n    return switch (pageIndex) {\n      0 => const ExploreSettings(),\n      1 => const ReaderSettings(),\n      2 => const AppearanceSettings(),\n      3 => const LocalFavoritesSettings(),\n      4 => const AppSettings(),\n      5 => const NetworkSettings(),\n      6 => const AboutSettings(),\n      7 => const DebugPage(),\n      _ => throw UnimplementedError()\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/webview.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:desktop_webview_window/desktop_webview_window.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:url_launcher/url_launcher_string.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/network/proxy.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'dart:io' as io;\n\nexport 'package:flutter_inappwebview/flutter_inappwebview.dart'\n    show WebUri, URLRequest;\n\nextension WebviewExtension on InAppWebViewController {\n  Future<List<io.Cookie>?> getCookies(String url) async {\n    if (url.contains(\"https://\")) {\n      url.replaceAll(\"https://\", \"\");\n    }\n    if (url[url.length - 1] == '/') {\n      url = url.substring(0, url.length - 1);\n    }\n    CookieManager cookieManager = CookieManager.instance(\n      webViewEnvironment: AppWebview.webViewEnvironment,\n    );\n    final cookies = await cookieManager.getCookies(\n      url: WebUri(url),\n      webViewController: this,\n    );\n    var res = <io.Cookie>[];\n    for (var cookie in cookies) {\n      var c = io.Cookie(cookie.name, cookie.value);\n      c.domain = cookie.domain;\n      res.add(c);\n    }\n    return res;\n  }\n\n  Future<String?> getUA() async {\n    var res = await evaluateJavascript(source: \"navigator.userAgent\");\n    if (res is String) {\n      if (res[0] == \"'\" || res[0] == \"\\\"\") {\n        res = res.substring(1, res.length - 1);\n      }\n    }\n    return res is String ? res : null;\n  }\n}\n\nclass AppWebview extends StatefulWidget {\n  const AppWebview(\n      {required this.initialUrl,\n      this.onTitleChange,\n      this.onNavigation,\n      this.singlePage = false,\n      this.onStarted,\n      this.onLoadStop,\n      super.key});\n\n  final String initialUrl;\n\n  final void Function(String title, InAppWebViewController controller)?\n      onTitleChange;\n\n  final bool Function(String url, InAppWebViewController controller)?\n      onNavigation;\n\n  final void Function(InAppWebViewController controller)? onStarted;\n\n  final void Function(InAppWebViewController controller)? onLoadStop;\n\n  final bool singlePage;\n\n  static WebViewEnvironment? webViewEnvironment;\n\n  @override\n  State<AppWebview> createState() => _AppWebviewState();\n}\n\nclass _AppWebviewState extends State<AppWebview> {\n  InAppWebViewController? controller;\n\n  String title = \"Webview\";\n\n  double _progress = 0;\n\n  late var future = _createWebviewEnvironment();\n\n  Future<bool> _createWebviewEnvironment() async {\n    var proxy = appdata.settings['proxy'].toString();\n    if (proxy != \"system\" && proxy != \"direct\") {\n      var proxyAvailable = await WebViewFeature.isFeatureSupported(\n        WebViewFeature.PROXY_OVERRIDE,\n      );\n      if (proxyAvailable) {\n        ProxyController proxyController = ProxyController.instance();\n        await proxyController.clearProxyOverride();\n        if (!proxy.contains(\"://\")) {\n          proxy = \"http://$proxy\";\n        }\n        await proxyController.setProxyOverride(\n          settings: ProxySettings(\n            proxyRules: [ProxyRule(url: proxy)],\n          ),\n        );\n      }\n    }\n    if (!App.isWindows) {\n      return true;\n    }\n    AppWebview.webViewEnvironment = await WebViewEnvironment.create(\n      settings: WebViewEnvironmentSettings(\n        userDataFolder: \"${App.dataPath}\\\\webview\",\n      ),\n    );\n    return true;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final actions = [\n      Tooltip(\n        message: \"More\",\n        child: IconButton(\n          icon: const Icon(Icons.more_horiz),\n          onPressed: () {\n            showMenuX(\n              context,\n              Offset(context.width, context.padding.top),\n              [\n                MenuEntry(\n                  icon: Icons.open_in_browser,\n                  text: \"Open in browser\".tl,\n                  onClick: () async =>\n                      launchUrlString((await controller?.getUrl())!.toString()),\n                ),\n                MenuEntry(\n                  icon: Icons.copy,\n                  text: \"Copy link\".tl,\n                  onClick: () async => Clipboard.setData(ClipboardData(\n                      text: (await controller?.getUrl())!.toString())),\n                ),\n                MenuEntry(\n                  icon: Icons.refresh,\n                  text: \"Reload\".tl,\n                  onClick: () => controller?.reload(),\n                ),\n              ],\n            );\n          },\n        ),\n      )\n    ];\n\n    Widget body = FutureBuilder(\n      future: future,\n      builder: (context, e) {\n        if (e.error != null) {\n          return Center(child: Text(\"Error: ${e.error}\"));\n        }\n        if (!e.hasData) {\n          return const SizedBox();\n        }\n        return createWebviewWithEnvironment(\n          AppWebview.webViewEnvironment,\n        );\n      },\n    );\n\n    body = Stack(\n      children: [\n        Positioned.fill(child: body),\n        if (_progress < 1.0)\n          const Positioned.fill(\n              child: Center(child: CircularProgressIndicator()))\n      ],\n    );\n\n    return Scaffold(\n        appBar: Appbar(\n          title: Text(\n            title,\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n          ),\n          actions: actions,\n        ),\n        body: body);\n  }\n\n  Widget createWebviewWithEnvironment(WebViewEnvironment? e) {\n    return InAppWebView(\n      webViewEnvironment: e,\n      initialSettings: InAppWebViewSettings(\n        isInspectable: true,\n      ),\n      initialUrlRequest: URLRequest(url: WebUri(widget.initialUrl)),\n      onTitleChanged: (c, t) {\n        if (mounted) {\n          setState(() {\n            title = t ?? \"Webview\";\n          });\n        }\n        widget.onTitleChange?.call(title, controller!);\n      },\n      shouldOverrideUrlLoading: (c, r) async {\n        var res =\n            widget.onNavigation?.call(r.request.url?.toString() ?? \"\", c) ??\n                false;\n        if (res) {\n          return NavigationActionPolicy.CANCEL;\n        } else {\n          return NavigationActionPolicy.ALLOW;\n        }\n      },\n      onWebViewCreated: (c) {\n        controller = c;\n        widget.onStarted?.call(c);\n      },\n      onLoadStop: (c, r) {\n        widget.onLoadStop?.call(c);\n      },\n      onProgressChanged: (c, p) {\n        if (mounted) {\n          setState(() {\n            _progress = p / 100;\n          });\n        }\n      },\n    );\n  }\n}\n\nclass DesktopWebview {\n  static Future<bool> isAvailable() => WebviewWindow.isWebviewAvailable();\n\n  final String initialUrl;\n\n  final void Function(String title, DesktopWebview controller)? onTitleChange;\n\n  final void Function(String url, DesktopWebview webview)? onNavigation;\n\n  final void Function(DesktopWebview controller)? onStarted;\n\n  final void Function()? onClose;\n\n  DesktopWebview(\n      {required this.initialUrl,\n      this.onTitleChange,\n      this.onNavigation,\n      this.onStarted,\n      this.onClose});\n\n  Webview? _webview;\n\n  String? _ua;\n\n  String? title;\n\n  void onMessage(String message) {\n    var json = jsonDecode(message);\n    if (json is Map) {\n      if (json[\"id\"] == \"document_created\") {\n        title = json[\"data\"][\"title\"];\n        _ua = json[\"data\"][\"ua\"];\n        onTitleChange?.call(title!, this);\n      }\n    }\n  }\n\n  String? get userAgent => _ua;\n\n  Timer? timer;\n\n  void _runTimer() {\n    timer ??= Timer.periodic(const Duration(seconds: 2), (t) async {\n      const js = '''\n        function collect() {\n          if(document.readyState === 'loading') {\n            return '';\n          }\n          let data = {\n            id: \"document_created\",\n            data: {\n              title: document.title,\n              url: location.href,\n              ua: navigator.userAgent\n            }\n          };\n          return data;\n        }\n        collect();\n      ''';\n      if (_webview != null) {\n        onMessage(await evaluateJavascript(js) ?? '');\n      }\n    });\n  }\n\n  void open() async {\n    _webview = await WebviewWindow.create(\n        configuration: CreateConfiguration(\n      useWindowPositionAndSize: true,\n      userDataFolderWindows: \"${App.dataPath}\\\\webview\",\n      title: \"webview\",\n      proxy: await getProxy(),\n    ));\n    _webview!.addOnWebMessageReceivedCallback(onMessage);\n    _webview!.setOnNavigation((s) {\n      s = s.substring(1, s.length - 1);\n      return onNavigation?.call(s, this);\n    });\n    _webview!.launch(initialUrl, triggerOnUrlRequestEvent: false);\n    _runTimer();\n    _webview!.onClose.then((value) {\n      _webview = null;\n      timer?.cancel();\n      timer = null;\n      onClose?.call();\n    });\n    Future.delayed(const Duration(milliseconds: 200), () {\n      onStarted?.call(this);\n    });\n  }\n\n  Future<String?> evaluateJavascript(String source) {\n    return _webview!.evaluateJavaScript(source);\n  }\n\n  Future<Map<String, String>> getCookies(String url) async {\n    var allCookies = await _webview!.getAllCookies();\n    var res = <String, String>{};\n    for (var c in allCookies) {\n      if (_cookieMatch(url, c.domain)) {\n        res[_removeCode0(c.name)] = _removeCode0(c.value);\n      }\n    }\n    return res;\n  }\n\n  String _removeCode0(String s) {\n    var codeUints = List<int>.from(s.codeUnits);\n    codeUints.removeWhere((e) => e == 0);\n    return String.fromCharCodes(codeUints);\n  }\n\n  bool _cookieMatch(String url, String domain) {\n    domain = _removeCode0(domain);\n    var host = Uri.parse(url).host;\n    var acceptedHost = _getAcceptedDomains(host);\n    return acceptedHost.contains(domain.removeAllBlank);\n  }\n\n  List<String> _getAcceptedDomains(String host) {\n    var acceptedDomains = <String>[host];\n    var hostParts = host.split(\".\");\n    for (var i = 0; i < hostParts.length - 1; i++) {\n      acceptedDomains.add(\".${hostParts.sublist(i).join(\".\")}\");\n    }\n    return acceptedDomains;\n  }\n\n  void close() {\n    _webview?.close();\n    _webview = null;\n  }\n}\n"
  },
  {
    "path": "lib/utils/app_links.dart",
    "content": "import 'package:app_links/app_links.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/pages/comic_details_page/comic_page.dart';\n\nvoid handleLinks() {\n  final appLinks = AppLinks();\n  appLinks.uriLinkStream.listen((uri) {\n    handleAppLink(uri);\n  });\n}\n\nFuture<bool> handleAppLink(Uri uri) async {\n  for(var source in ComicSource.all()) {\n    if(source.linkHandler != null) {\n      if(source.linkHandler!.domains.contains(uri.host)) {\n        var id = source.linkHandler!.linkToId(uri.toString());\n        if(id != null) {\n          if(App.mainNavigatorKey == null) {\n            await Future.delayed(const Duration(milliseconds: 200));\n          }\n          App.mainNavigatorKey!.currentContext?.to(() {\n            return ComicPage(id: id, sourceKey: source.key);\n          });\n          return true;\n        }\n        return false;\n      }\n    }\n  }\n  return false;\n}"
  },
  {
    "path": "lib/utils/cbz.dart",
    "content": "import 'dart:convert';\nimport 'package:flutter_7zip/flutter_7zip.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/file_type.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\n\nclass ComicMetaData {\n  final String title;\n\n  final String author;\n\n  final List<String> tags;\n\n  final List<ComicChapter>? chapters;\n\n  Map<String, dynamic> toJson() => {\n        'title': title,\n        'author': author,\n        'tags': tags,\n        'chapters': chapters?.map((e) => e.toJson()).toList()\n      };\n\n  ComicMetaData.fromJson(Map<String, dynamic> json)\n      : title = json['title'],\n        author = json['author'],\n        tags = List<String>.from(json['tags']),\n        chapters = json['chapters'] == null\n            ? null\n            : List<ComicChapter>.from(\n                json['chapters'].map((e) => ComicChapter.fromJson(e)));\n\n  ComicMetaData({\n    required this.title,\n    required this.author,\n    required this.tags,\n    this.chapters,\n  });\n}\n\nclass ComicChapter {\n  final String title;\n\n  final int start;\n\n  final int end;\n\n  Map<String, dynamic> toJson() => {'title': title, 'start': start, 'end': end};\n\n  ComicChapter.fromJson(Map<String, dynamic> json)\n      : title = json['title'],\n        start = json['start'],\n        end = json['end'];\n\n  ComicChapter({required this.title, required this.start, required this.end});\n}\n\n/// Comic Book Archive. Currently supports CBZ, ZIP and 7Z formats.\nabstract class CBZ {\n  static Future<FileType> checkType(File file) async {\n    var header = <int>[];\n    await for (var bytes in file.openRead()) {\n      header.addAll(bytes);\n      if (header.length >= 32) break;\n    }\n    return detectFileType(header);\n  }\n\n  static Future<void> extractArchive(File file, Directory out) async {\n    var fileType = await checkType(file);\n    if (fileType.mime == 'application/zip') {\n      await ZipFile.openAndExtractAsync(file.path, out.path, 4);\n    } else if (fileType.mime == \"application/x-7z-compressed\") {\n      await SZArchive.extractIsolates(file.path, out.path, 4);\n    } else {\n      throw Exception('Unsupported archive type');\n    }\n  }\n\n  static Future<LocalComic> import(File file) async {\n    var cache = Directory(FilePath.join(App.cachePath, 'cbz_import'));\n    if (cache.existsSync()) cache.deleteSync(recursive: true);\n    cache.createSync();\n    await extractArchive(file, cache);\n    var f = cache.listSync();\n    if (f.length == 1 && f.first is Directory) {\n      cache = f.first as Directory;\n    }\n    var metaDataFile = File(FilePath.join(cache.path, 'metadata.json'));\n    ComicMetaData? metaData;\n    if (metaDataFile.existsSync()) {\n      try {\n        metaData =\n            ComicMetaData.fromJson(jsonDecode(metaDataFile.readAsStringSync()));\n      } catch (_) {}\n    }\n    metaData ??= ComicMetaData(\n      title: file.name.substring(0, file.name.lastIndexOf('.')),\n      author: \"\",\n      tags: [],\n    );\n    var old = LocalManager().findByName(metaData.title);\n    if (old != null) {\n      throw Exception('Comic with name ${metaData.title} already exists');\n    }\n    var files = cache.listSync().whereType<File>().toList();\n    files.removeWhere((e) {\n      var ext = e.path.split('.').last;\n      return !['jpg', 'jpeg', 'png', 'webp', 'gif', 'jpe'].contains(ext);\n    });\n    if (files.isEmpty) {\n      cache.deleteSync(recursive: true);\n      throw Exception('No images found in the archive');\n    }\n    files.sort((a, b) {\n      var aName = a.basenameWithoutExt;\n      var bName = b.basenameWithoutExt;\n      var aIndex = int.tryParse(aName);\n      var bIndex = int.tryParse(bName);\n      if (aIndex != null && bIndex != null) {\n        return aIndex.compareTo(bIndex);\n      } else {\n        return a.path.compareTo(b.path);\n      }\n    });\n    var coverFile = files.firstWhereOrNull(\n      (element) =>\n          element.path.endsWith('cover.${element.path.split('.').last}'),\n    );\n    if (coverFile != null) {\n      files.remove(coverFile);\n    } else {\n      coverFile = files.first;\n    }\n    Map<String, String>? cpMap;\n    var dest = Directory(\n      FilePath.join(LocalManager().path, sanitizeFileName(metaData.title)),\n    );\n    dest.createSync();\n    coverFile.copyMem(FilePath.join(dest.path, 'cover.${coverFile.extension}'));\n    if (metaData.chapters == null) {\n      for (var i = 0; i < files.length; i++) {\n        var src = files[i];\n        var dst = File(\n            FilePath.join(dest.path, '${i + 1}.${src.path.split('.').last}'));\n        await src.copyMem(dst.path);\n      }\n    } else {\n      dest.createSync();\n      var chapters = <String, List<File>>{};\n      for (var chapter in metaData.chapters!) {\n        chapters[chapter.title] = files.sublist(chapter.start - 1, chapter.end);\n      }\n      int i = 0;\n      cpMap = <String, String>{};\n      for (var chapter in chapters.entries) {\n        cpMap[i.toString()] = chapter.key;\n        var chapterDir = Directory(FilePath.join(dest.path, i.toString()));\n        chapterDir.createSync();\n        for (var i = 0; i < chapter.value.length; i++) {\n          var src = chapter.value[i];\n          var dst = File(FilePath.join(\n              chapterDir.path, '${i + 1}.${src.path.split('.').last}'));\n          await src.copyMem(dst.path);\n        }\n      }\n    }\n    var comic = LocalComic(\n      id: LocalManager().findValidId(ComicType.local),\n      title: metaData.title,\n      subtitle: metaData.author,\n      tags: metaData.tags,\n      comicType: ComicType.local,\n      directory: dest.name,\n      chapters: ComicChapters.fromJsonOrNull(cpMap),\n      downloadedChapters: cpMap?.keys.toList() ?? [],\n      cover: 'cover.${coverFile.extension}',\n      createdAt: DateTime.now(),\n    );\n    await cache.delete(recursive: true);\n    return comic;\n  }\n\n  static Future<File> export(LocalComic comic, String outFilePath) async {\n    var cache = Directory(FilePath.join(App.cachePath, 'cbz_export'));\n    if (cache.existsSync()) cache.deleteSync(recursive: true);\n    cache.createSync();\n    List<ComicChapter>? chapters;\n    if (comic.chapters == null) {\n      var images = await LocalManager().getImages(comic.id, comic.comicType, 1);\n      int i = 1;\n      for (var image in images) {\n        var src = File(image.replaceFirst('file://', ''));\n        var width = images.length.toString().length;\n        var dstName =\n            '${i.toString().padLeft(width, '0')}.${image.split('.').last}';\n        var dst = File(FilePath.join(cache.path, dstName));\n        await src.copyMem(dst.path);\n        i++;\n      }\n    } else {\n      chapters = [];\n      var allImages = <String>[];\n      for (var c in comic.downloadedChapters) {\n        var chapterName = comic.chapters![c];\n        var images = await LocalManager().getImages(\n          comic.id,\n          comic.comicType,\n          c,\n        );\n        allImages.addAll(images);\n        var chapter = ComicChapter(\n          title: chapterName!,\n          start: chapters.length + 1,\n          end: chapters.length + images.length,\n        );\n        chapters.add(chapter);\n      }\n      int i = 1;\n      for (var image in allImages) {\n        var src = File(image);\n        var width = allImages.length.toString().length;\n        var dstName =\n            '${i.toString().padLeft(width, '0')}.${image.split('.').last}';\n        var dst = File(FilePath.join(cache.path, dstName));\n        await src.copyMem(dst.path);\n        i++;\n      }\n    }\n    var cover = comic.coverFile;\n    await cover.copyMem(\n        FilePath.join(cache.path, 'cover.${cover.path.split('.').last}'));\n    final metaData = ComicMetaData(\n      title: comic.title,\n      author: comic.subtitle,\n      tags: comic.tags,\n      chapters: chapters,\n    );\n    await File(FilePath.join(cache.path, 'metadata.json')).writeAsString(\n      jsonEncode(metaData),\n    );\n    await File(FilePath.join(cache.path, 'ComicInfo.xml')).writeAsString(\n      _buildComicInfoXml(metaData),\n    );\n    var cbz = File(outFilePath);\n    if (cbz.existsSync()) cbz.deleteSync();\n    await _compress(cache.path, cbz.path);\n    cache.deleteSync(recursive: true);\n    return cbz;\n  }\n\n  static String _buildComicInfoXml(ComicMetaData data) {\n    final buffer = StringBuffer();\n    buffer.writeln('<?xml version=\"1.0\" encoding=\"utf-8\"?>');\n    buffer.writeln('<ComicInfo xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">');\n\n    buffer.writeln('  <Title>${_escapeXml(data.title)}</Title>');\n    buffer.writeln('  <Series>${_escapeXml(data.title)}</Series>');\n\n    if (data.author.isNotEmpty) {\n      buffer.writeln('  <Writer>${_escapeXml(data.author)}</Writer>');\n    }\n\n    if (data.tags.isNotEmpty) {\n      var tags = data.tags;\n      if (tags.length > 5) {\n        tags = tags.sublist(0, 5);\n      }\n      buffer.writeln('  <Genre>${_escapeXml(tags.join(', '))}</Genre>');\n    }\n\n    if (data.chapters != null && data.chapters!.isNotEmpty) {\n      final chaptersInfo = data.chapters!.map((chapter) =>\n        '${_escapeXml(chapter.title)}: ${chapter.start}-${chapter.end}'\n      ).join('; ');\n      buffer.writeln('  <Notes>Chapters: $chaptersInfo</Notes>');\n    }\n\n    buffer.writeln('  <Manga>Unknown</Manga>');\n    buffer.writeln('  <BlackAndWhite>Unknown</BlackAndWhite>');\n\n    final now = DateTime.now();\n    buffer.writeln('  <Year>${now.year}</Year>');\n\n    buffer.writeln('</ComicInfo>');\n    return buffer.toString();\n  }\n\n  static String _escapeXml(String text) {\n    return text\n      .replaceAll('&', '&amp;')\n      .replaceAll('<', '&lt;')\n      .replaceAll('>', '&gt;')\n      .replaceAll('\"', '&quot;')\n      .replaceAll(\"'\", '&apos;');\n  }\n\n  static _compress(String src, String dst) async {\n    await ZipFile.compressFolderAsync(src, dst, 4);\n  }\n}\n\n"
  },
  {
    "path": "lib/utils/channel.dart",
    "content": "import 'dart:async';\nimport 'dart:collection';\n\nclass Channel<T> {\n  final Queue<T> _queue;\n\n  final int size;\n\n  Channel(this.size) : _queue = Queue<T>();\n\n  Completer? _releaseCompleter;\n\n  Completer? _pushCompleter;\n\n  var currentSize = 0;\n\n  var isClosed = false;\n\n  Future<void> push(T item) async {\n    if (currentSize >= size) {\n      _releaseCompleter ??= Completer();\n      return _releaseCompleter!.future.then((_) {\n        if (isClosed) {\n          return;\n        }\n        _queue.addLast(item);\n        currentSize++;\n      });\n    }\n    _queue.addLast(item);\n    currentSize++;\n    _pushCompleter?.complete();\n    _pushCompleter = null;\n  }\n\n  Future<T?> pop() async {\n    while (_queue.isEmpty) {\n      if (isClosed) {\n        return null;\n      }\n      _pushCompleter ??= Completer();\n      await _pushCompleter!.future;\n    }\n    var item = _queue.removeFirst();\n    currentSize--;\n    if (_releaseCompleter != null && currentSize < size) {\n      _releaseCompleter!.complete();\n      _releaseCompleter = null;\n    }\n    return item;\n  }\n\n  void close() {\n    isClosed = true;\n    _pushCompleter?.complete();\n    _releaseCompleter?.complete();\n  }\n}"
  },
  {
    "path": "lib/utils/clipboard_image.dart",
    "content": "import 'dart:io';\nimport 'dart:ui';\n\nimport 'package:flutter/services.dart';\n\nFuture<void> writeImageToClipboard(Uint8List imageBytes) async {\n  const channel = MethodChannel(\"venera/clipboard\");\n  if (Platform.isWindows || Platform.isLinux) {\n    var image = await instantiateImageCodec(imageBytes);\n    var frame = await image.getNextFrame();\n    var data = await frame.image.toByteData(format: ImageByteFormat.rawRgba);\n    await channel.invokeMethod(\"writeImageToClipboard\", {\n      \"width\": frame.image.width,\n      \"height\": frame.image.height,\n      \"data\": Uint8List.view(data!.buffer)\n    });\n    image.dispose();\n  } else if (Platform.isMacOS) {\n    await channel.invokeMethod(\"writeImageToClipboard\", {\n      \"data\": imageBytes,\n    });\n  } else {\n    throw UnsupportedError(\"Clipboard image is not supported on this platform\");\n  }\n}\n"
  },
  {
    "path": "lib/utils/data.dart",
    "content": "import 'dart:convert';\nimport 'dart:isolate';\n\nimport 'package:sqlite3/sqlite3.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/history.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/network/cookie_jar.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\n\nimport 'io.dart';\n\nFuture<File> exportAppData([bool sync = true]) async {\n  var time = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n  var cacheFilePath = FilePath.join(App.cachePath, '$time.venera');\n  var cacheFile = File(cacheFilePath);\n  var dataPath = App.dataPath;\n  if (await cacheFile.exists()) {\n    await cacheFile.delete();\n  }\n  await Isolate.run(() {\n    var zipFile = ZipFile.open(cacheFilePath);\n    var historyFile = FilePath.join(dataPath, \"history.db\");\n    var localFavoriteFile = FilePath.join(dataPath, \"local_favorite.db\");\n    var appdata = FilePath.join(dataPath, sync ? \"syncdata.json\" : \"appdata.json\");\n    var cookies = FilePath.join(dataPath, \"cookie.db\");\n    zipFile.addFile(\"history.db\", historyFile);\n    zipFile.addFile(\"local_favorite.db\", localFavoriteFile);\n    zipFile.addFile(\"appdata.json\", appdata);\n    zipFile.addFile(\"cookie.db\", cookies);\n    for (var file\n        in Directory(FilePath.join(dataPath, \"comic_source\")).listSync()) {\n      if (file is File) {\n        zipFile.addFile(\"comic_source/${file.name}\", file.path);\n      }\n    }\n    zipFile.close();\n  });\n  return cacheFile;\n}\n\nFuture<void> importAppData(File file, [bool checkVersion = false]) async {\n  var cacheDirPath = FilePath.join(App.cachePath, 'temp_data');\n  var cacheDir = Directory(cacheDirPath);\n  if (cacheDir.existsSync()) {\n    cacheDir.deleteSync(recursive: true);\n  }\n  cacheDir.createSync();\n  try {\n    await Isolate.run(() {\n      ZipFile.openAndExtract(file.path, cacheDirPath);\n    });\n    var historyFile = cacheDir.joinFile(\"history.db\");\n    var localFavoriteFile = cacheDir.joinFile(\"local_favorite.db\");\n    var appdataFile = cacheDir.joinFile(\"appdata.json\");\n    var cookieFile = cacheDir.joinFile(\"cookie.db\");\n    if (checkVersion && appdataFile.existsSync()) {\n      var data = jsonDecode(await appdataFile.readAsString());\n      var version = data[\"settings\"][\"dataVersion\"];\n      if (version is int && version <= appdata.settings[\"dataVersion\"]) {\n        return;\n      }\n    }\n    if (await historyFile.exists()) {\n      HistoryManager().close();\n      File(FilePath.join(App.dataPath, \"history.db\")).deleteIfExistsSync();\n      historyFile.renameSync(FilePath.join(App.dataPath, \"history.db\"));\n      HistoryManager().init();\n    }\n    if (await localFavoriteFile.exists()) {\n      LocalFavoritesManager().close();\n      File(FilePath.join(App.dataPath, \"local_favorite.db\"))\n          .deleteIfExistsSync();\n      localFavoriteFile\n          .renameSync(FilePath.join(App.dataPath, \"local_favorite.db\"));\n      LocalFavoritesManager().init();\n    }\n    if (await appdataFile.exists()) {\n      var content = await appdataFile.readAsString();\n      var data = jsonDecode(content);\n      appdata.syncData(data);\n    }\n    if (await cookieFile.exists()) {\n      SingleInstanceCookieJar.instance?.dispose();\n      File(FilePath.join(App.dataPath, \"cookie.db\")).deleteIfExistsSync();\n      cookieFile.renameSync(FilePath.join(App.dataPath, \"cookie.db\"));\n      SingleInstanceCookieJar.instance =\n          SingleInstanceCookieJar(FilePath.join(App.dataPath, \"cookie.db\"))\n            ..init();\n    }\n    var comicSourceDir = FilePath.join(cacheDirPath, \"comic_source\");\n    if (Directory(comicSourceDir).existsSync()) {\n      Directory(FilePath.join(App.dataPath, \"comic_source\"))\n          .deleteIfExistsSync(recursive: true);\n      Directory(FilePath.join(App.dataPath, \"comic_source\")).createSync();\n      for (var file in Directory(comicSourceDir).listSync()) {\n        if (file is File) {\n          var targetFile =\n              FilePath.join(App.dataPath, \"comic_source\", file.name);\n          await file.copy(targetFile);\n        }\n      }\n      await ComicSourceManager().reload();\n    }\n  } finally {\n    cacheDir.deleteIgnoreError(recursive: true);\n  }\n}\n\nFuture<void> importPicaData(File file) async {\n  var cacheDirPath = FilePath.join(App.cachePath, 'temp_data');\n  var cacheDir = Directory(cacheDirPath);\n  if (cacheDir.existsSync()) {\n    cacheDir.deleteSync(recursive: true);\n  }\n  cacheDir.createSync();\n  try {\n    await Isolate.run(() {\n      ZipFile.openAndExtract(file.path, cacheDirPath);\n    });\n    var localFavoriteFile = cacheDir.joinFile(\"local_favorite.db\");\n    if (localFavoriteFile.existsSync()) {\n      var db = sqlite3.open(localFavoriteFile.path);\n      try {\n        var folderNames = db\n            .select(\"SELECT name FROM sqlite_master WHERE type='table';\")\n            .map((e) => e[\"name\"] as String)\n            .toList();\n        folderNames\n            .removeWhere((e) => e == \"folder_order\" || e == \"folder_sync\");\n        for (var folderSyncValue in db.select(\"SELECT * FROM folder_sync;\")) {\n          var folderName = folderSyncValue[\"folder_name\"];\n          String sourceKey = folderSyncValue[\"key\"];\n          sourceKey =\n              sourceKey.toLowerCase() == \"htmanga\" ? \"wnacg\" : sourceKey;\n          // 有值就跳过\n          if (LocalFavoritesManager().findLinked(folderName).$1 != null) {\n            continue;\n          }\n          try {\n            LocalFavoritesManager().linkFolderToNetwork(folderName, sourceKey,\n                jsonDecode(folderSyncValue[\"sync_data\"])[\"folderId\"]);\n          } catch (e, stack) {\n            Log.error(e.toString(), stack);\n          }\n        }\n        for (var folderName in folderNames) {\n          if (!LocalFavoritesManager().existsFolder(folderName)) {\n            LocalFavoritesManager().createFolder(folderName);\n          }\n          for (var comic in db.select(\"SELECT * FROM \\\"$folderName\\\";\")) {\n            LocalFavoritesManager().addComic(\n              folderName,\n              FavoriteItem(\n                id: comic['target'],\n                name: comic['name'],\n                coverPath: comic['cover_path'],\n                author: comic['author'],\n                type: ComicType(switch (comic['type']) {\n                  0 => 'picacg'.hashCode,\n                  1 => 'ehentai'.hashCode,\n                  2 => 'jm'.hashCode,\n                  3 => 'hitomi'.hashCode,\n                  4 => 'wnacg'.hashCode,\n                  6 => 'nhentai'.hashCode,\n                  _ => comic['type']\n                }),\n                tags: comic['tags'].split(','),\n              ),\n            );\n          }\n        }\n      } catch (e) {\n        Log.error(\"Import Data\", \"Failed to import local favorite: $e\");\n      } finally {\n        db.dispose();\n      }\n    }\n    var historyFile = cacheDir.joinFile(\"history.db\");\n    if (historyFile.existsSync()) {\n      var db = sqlite3.open(historyFile.path);\n      try {\n        for (var comic in db.select(\"SELECT * FROM history;\")) {\n          HistoryManager().addHistory(\n            History.fromMap({\n              \"type\": switch (comic['type']) {\n                0 => 'picacg'.hashCode,\n                1 => 'ehentai'.hashCode,\n                2 => 'jm'.hashCode,\n                3 => 'hitomi'.hashCode,\n                4 => 'wnacg'.hashCode,\n                5 => 'nhentai'.hashCode,\n                _ => comic['type']\n              },\n              \"id\": comic['target'],\n              \"max_page\": comic[\"max_page\"],\n              \"ep\": comic[\"ep\"],\n              \"page\": comic[\"page\"],\n              \"time\": comic[\"time\"],\n              \"title\": comic[\"title\"],\n              \"subtitle\": comic[\"subtitle\"],\n              \"cover\": comic[\"cover\"],\n              \"readEpisode\": [comic[\"ep\"]],\n            }),\n          );\n        }\n        List<ImageFavoritesComic> imageFavoritesComicList =\n            ImageFavoriteManager().comics;\n        for (var comic in db.select(\"SELECT * FROM image_favorites;\")) {\n          String sourceKey = comic[\"id\"].split(\"-\")[0];\n          // 换名字了, 绅士漫画\n          if (sourceKey.toLowerCase() == \"htmanga\") {\n            sourceKey = \"wnacg\";\n          }\n          if (ComicSource.find(sourceKey) == null) {\n            continue;\n          }\n          String id = comic[\"id\"].split(\"-\")[1];\n          int page = comic[\"page\"];\n          // 章节和page是从1开始的, pica 可能有从 0 开始的, 得转一下\n          int ep = comic[\"ep\"] == 0 ? 1 : comic[\"ep\"];\n          String title = comic[\"title\"];\n          String epName = \"\";\n          ImageFavoritesComic? tempComic = imageFavoritesComicList\n              .firstWhereOrNull((e) => e.id == id && e.sourceKey == sourceKey);\n          ImageFavorite curImageFavorite =\n              ImageFavorite(page, \"\", null, \"\", id, ep, sourceKey, epName);\n          if (tempComic == null) {\n            tempComic = ImageFavoritesComic(id, [], title, sourceKey, [], [],\n                DateTime.now(), \"\", {}, \"\", 1);\n            tempComic.imageFavoritesEp = [\n              ImageFavoritesEp(\"\", ep, [curImageFavorite], epName, 1)\n            ];\n            imageFavoritesComicList.add(tempComic);\n          } else {\n            ImageFavoritesEp? tempEp =\n                tempComic.imageFavoritesEp.firstWhereOrNull((e) => e.ep == ep);\n            if (tempEp == null) {\n              tempComic.imageFavoritesEp\n                  .add(ImageFavoritesEp(\"\", ep, [curImageFavorite], epName, 1));\n            } else {\n              // 如果已经有这个page了, 就不添加了\n              if (tempEp.imageFavorites\n                      .firstWhereOrNull((e) => e.page == page) ==\n                  null) {\n                tempEp.imageFavorites.add(curImageFavorite);\n              }\n            }\n          }\n        }\n        for (var temp in imageFavoritesComicList) {\n          ImageFavoriteManager().addOrUpdateOrDelete(\n            temp,\n            temp == imageFavoritesComicList.last,\n          );\n        }\n      } catch (e, stack) {\n        Log.error(\"Import Data\", \"Failed to import history: $e\", stack);\n      } finally {\n        db.dispose();\n      }\n    }\n  } finally {\n    cacheDir.deleteIgnoreError(recursive: true);\n  }\n}\n"
  },
  {
    "path": "lib/utils/data_sync.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/components/window_frame.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/appdata.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:venera/foundation/res.dart';\nimport 'package:venera/network/app_dio.dart';\nimport 'package:venera/utils/data.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:webdav_client/webdav_client.dart' hide File;\nimport 'package:venera/utils/translations.dart';\n\nimport 'io.dart';\n\nclass DataSync with ChangeNotifier {\n  DataSync._() {\n    if (isEnabled) {\n      downloadData();\n    }\n    LocalFavoritesManager().addListener(onDataChanged);\n    ComicSourceManager().addListener(onDataChanged);\n    if (App.isDesktop) {\n      Future.delayed(const Duration(seconds: 1), () {\n        var controller = WindowFrame.of(App.rootContext);\n        controller.addCloseListener(_handleWindowClose);\n      });\n    }\n  }\n\n  void onDataChanged() {\n    if (isEnabled) {\n      uploadData();\n    }\n  }\n\n  bool _handleWindowClose() {\n    if (_isUploading) {\n      _showWindowCloseDialog();\n      return false;\n    }\n    return true;\n  }\n\n  void _showWindowCloseDialog() async {\n    showLoadingDialog(\n      App.rootContext,\n      cancelButtonText: \"Shut Down\".tl,\n      onCancel: () => exit(0),\n      barrierDismissible: false,\n      message: \"Uploading data...\".tl,\n    );\n    while (_isUploading) {\n      await Future.delayed(const Duration(milliseconds: 50));\n    }\n    exit(0);\n  }\n\n  static DataSync? instance;\n\n  factory DataSync() => instance ?? (instance = DataSync._());\n\n  bool _isDownloading = false;\n\n  bool get isDownloading => _isDownloading;\n\n  bool _isUploading = false;\n\n  bool get isUploading => _isUploading;\n\n  bool _haveWaitingTask = false;\n\n  String? _lastError;\n\n  String? get lastError => _lastError;\n\n  bool get isEnabled {\n    var config = appdata.settings['webdav'];\n    var autoSync = appdata.implicitData['webdavAutoSync'] ?? false;\n    return autoSync && config is List && config.isNotEmpty;\n  }\n\n  List<String>? _validateConfig() {\n    var config = appdata.settings['webdav'];\n    if (config is! List) {\n      return null;\n    }\n    if (config.isEmpty) {\n      return [];\n    }\n    if (config.length != 3 || config.whereType<String>().length != 3) {\n      return null;\n    }\n    return List.from(config);\n  }\n\n  Future<Res<bool>> uploadData() async {\n    if (isDownloading) return const Res(true);\n    if (_haveWaitingTask) return const Res(true);\n    while (isUploading) {\n      _haveWaitingTask = true;\n      await Future.delayed(const Duration(milliseconds: 100));\n    }\n    _haveWaitingTask = false;\n    _isUploading = true;\n    _lastError = null;\n    notifyListeners();\n    try {\n      var config = _validateConfig();\n      if (config == null) {\n        _lastError = 'Invalid WebDAV configuration';\n        return const Res.error('Invalid WebDAV configuration');\n      }\n      if (config.isEmpty) {\n        return const Res(true);\n      }\n      String url = config[0];\n      String user = config[1];\n      String pass = config[2];\n\n      var client = newClient(\n        url,\n        user: user,\n        password: pass,\n        adapter: RHttpAdapter(),\n      );\n\n      try {\n        appdata.settings['dataVersion']++;\n        await appdata.saveData(false);\n        var data = await exportAppData(\n            appdata.settings['disableSyncFields'].toString().isNotEmpty\n        );\n        var time =\n            (DateTime.now().millisecondsSinceEpoch ~/ 86400000).toString();\n        var filename = time;\n        filename += '-';\n        filename += appdata.settings['dataVersion'].toString();\n        filename += '.venera';\n        var files = await client.readDir('/');\n        files = files.where((e) => e.name!.endsWith('.venera')).toList();\n        var old = files.firstWhereOrNull((e) => e.name!.startsWith(\"$time-\"));\n        if (old != null) {\n          await client.remove(old.name!);\n        }\n        if (files.length >= 10) {\n          files.sort((a, b) => a.name!.compareTo(b.name!));\n          await client.remove(files.first.name!);\n        }\n        await client.write(filename, await data.readAsBytes());\n        data.deleteIgnoreError();\n        Log.info(\"Upload Data\", \"Data uploaded successfully\");\n        return const Res(true);\n      } catch (e, s) {\n        Log.error(\"Upload Data\", e, s);\n        _lastError = e.toString();\n        return Res.error(e.toString());\n      }\n    } finally {\n      _isUploading = false;\n      notifyListeners();\n    }\n  }\n\n  Future<Res<bool>> downloadData() async {\n    if (_haveWaitingTask) return const Res(true);\n    while (isDownloading || isUploading) {\n      _haveWaitingTask = true;\n      await Future.delayed(const Duration(milliseconds: 100));\n    }\n    _haveWaitingTask = false;\n    _isDownloading = true;\n    _lastError = null;\n    notifyListeners();\n    try {\n      var config = _validateConfig();\n      if (config == null) {\n        _lastError = 'Invalid WebDAV configuration';\n        return const Res.error('Invalid WebDAV configuration');\n      }\n      if (config.isEmpty) {\n        return const Res(true);\n      }\n      String url = config[0];\n      String user = config[1];\n      String pass = config[2];\n\n      var client = newClient(\n        url,\n        user: user,\n        password: pass,\n        adapter: RHttpAdapter(),\n      );\n\n      try {\n        var files = await client.readDir('/');\n        files.sort((a, b) => b.name!.compareTo(a.name!));\n        var file = files.firstWhereOrNull((e) => e.name!.endsWith('.venera'));\n        if (file == null) {\n          throw 'No data file found';\n        }\n        var version =\n            file.name!.split('-').elementAtOrNull(1)?.split('.').first;\n        if (version != null && int.tryParse(version) != null) {\n          var currentVersion = appdata.settings['dataVersion'];\n          if (currentVersion != null && int.parse(version) <= currentVersion) {\n            Log.info(\"Data Sync\", 'No new data to download');\n            return const Res(true);\n          }\n        }\n        Log.info(\"Data Sync\", \"Downloading data from WebDAV server\");\n        var localFile = File(FilePath.join(App.cachePath, file.name!));\n        await client.read2File(file.name!, localFile.path);\n        await importAppData(localFile, true);\n        await localFile.delete();\n        Log.info(\"Data Sync\", \"Data downloaded successfully\");\n        return const Res(true);\n      } catch (e, s) {\n        Log.error(\"Data Sync\", e, s);\n        _lastError = e.toString();\n        return Res.error(e.toString());\n      }\n    } finally {\n      _isDownloading = false;\n      notifyListeners();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/epub.dart",
    "content": "import 'dart:isolate';\n\nimport 'package:uuid/uuid.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/utils/file_type.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\n\nclass EpubData {\n  final String title;\n\n  final String author;\n\n  final File cover;\n\n  final Map<String, List<File>> chapters;\n\n  const EpubData({\n    required this.title,\n    required this.author,\n    required this.cover,\n    required this.chapters,\n  });\n}\n\nFuture<File> createEpubComic(\n    EpubData data, String cacheDir, String outFilePath) async {\n  final workingDir = Directory(FilePath.join(cacheDir, 'epub'));\n  if (workingDir.existsSync()) {\n    workingDir.deleteSync(recursive: true);\n  }\n  workingDir.createSync(recursive: true);\n\n  // mimetype\n  workingDir.joinFile('mimetype').writeAsStringSync('application/epub+zip');\n\n  // META-INF\n  Directory(FilePath.join(workingDir.path, 'META-INF')).createSync();\n  File(FilePath.join(workingDir.path, 'META-INF', 'container.xml'))\n      .writeAsStringSync('''\n<?xml version=\"1.0\"?>\n<container version=\"1.0\" xmlns=\"urn:oasis:names:tc:opendocument:xmlns:container\">\n  <rootfiles>\n    <rootfile full-path=\"content.opf\" media-type=\"application/oebps-package+xml\"/>\n  </rootfiles>\n</container>\n  ''');\n\n  Directory(FilePath.join(workingDir.path, 'OEBPS')).createSync();\n\n  // copy images, create html files\n  final imageDir = Directory(FilePath.join(workingDir.path, 'OEBPS', 'images'));\n  imageDir.createSync();\n  final coverExt = data.cover.extension;\n  final coverMime = FileType.fromExtension(coverExt).mime;\n  imageDir\n      .joinFile('cover.$coverExt')\n      .writeAsBytesSync(data.cover.readAsBytesSync());\n  int imgIndex = 0;\n  int chapterIndex = 0;\n  var manifestStrBuilder = StringBuffer();\n  manifestStrBuilder.writeln(\n      '        <item id=\"cover_image\" href=\"OEBPS/images/cover.$coverExt\" media-type=\"$coverMime\"/>');\n  manifestStrBuilder.writeln(\n      '        <item id=\"toc\" href=\"toc.ncx\" media-type=\"application/x-dtbncx+xml\"/>');\n  for (final chapter in data.chapters.keys) {\n    var images = <String>[];\n    for (final image in data.chapters[chapter]!) {\n      final ext = image.extension;\n      imageDir\n          .joinFile('img$imgIndex.$ext')\n          .writeAsBytesSync(image.readAsBytesSync());\n      images.add('images/img$imgIndex.$ext');\n      var mime = FileType.fromExtension(ext).mime;\n      manifestStrBuilder.writeln(\n          '        <item id=\"img$imgIndex\" href=\"OEBPS/images/img$imgIndex$ext\" media-type=\"$mime\"/>');\n      imgIndex++;\n    }\n    var html =\n        File(FilePath.join(workingDir.path, 'OEBPS', '$chapterIndex.html'));\n    html.writeAsStringSync('''\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \n    \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <title>$chapter</title>\n    <style type=\"text/css\">\n        img { \n            max-width: 100%;\n            height: auto;\n        }\n        body {\n            margin: 0;\n            padding: 0;\n        }\n    </style>\n</head>\n<body>\n    <h1>$chapter</h1>\n    <div>\n${images.map((e) => '        <img src=\"$e\" alt=\"$e\"/>').join('\\n')}\n    </div>\n</body>\n</html>\n    ''');\n    manifestStrBuilder.writeln(\n        '        <item id=\"chapter$chapterIndex\" href=\"OEBPS/$chapterIndex.html\" media-type=\"application/xhtml+xml\"/>');\n    chapterIndex++;\n  }\n\n  // content.opf\n  final contentOpf = File(FilePath.join(workingDir.path, 'content.opf'));\n  final uuid = const Uuid().v4();\n  var spineStrBuilder = StringBuffer();\n  for (var i = 0; i < chapterIndex; i++) {\n    var idRef = 'idref=\"chapter$i\"';\n    spineStrBuilder.writeln('        <itemref $idRef/>');\n  }\n  contentOpf.writeAsStringSync('''\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<package version=\"3.0\" \n    xmlns=\"http://www.idpf.org/2007/opf\"\n    xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n    <metadata>\n        <dc:title>${data.title}</dc:title>\n        <dc:creator>${data.author}</dc:creator>\n        <dc:identifier id=\"book_id\">urn:uuid:$uuid</dc:identifier>\n        <meta name=\"cover\" content=\"cover_image\"/>\n    </metadata>\n    <manifest>\n${manifestStrBuilder.toString()}       \n    </manifest>\n    <spine toc=\"toc\">\n${spineStrBuilder.toString()}\n    </spine>\n</package>\n  ''');\n\n  // toc.ncx\n  final tocNcx = File(FilePath.join(workingDir.path, 'toc.ncx'));\n  var navMapStrBuilder = StringBuffer();\n  var playOrder = 2;\n  final chapterNames = data.chapters.keys.toList();\n  for (var i = 0; i < chapterIndex; i++) {\n    navMapStrBuilder\n        .writeln('        <navPoint id=\"chapter$i\" playOrder=\"$playOrder\">');\n    navMapStrBuilder.writeln(\n        '            <navLabel><text>${chapterNames[i]}</text></navLabel>');\n    navMapStrBuilder.writeln('            <content src=\"OEBPS/$i.html\"/>');\n    navMapStrBuilder.writeln('        </navPoint>');\n    playOrder++;\n  }\n\n  tocNcx.writeAsStringSync('''\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE ncx PUBLIC \"-//NISO//DTD ncx 2005-1//EN\" \"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd\">\n<ncx xmlns=\"http://www.daisy.org/z3986/2005/ncx\" version=\"2005-1\">\n    <head>\n        <meta name=\"dtb:uid\" content=\"urn:uuid:$uuid\"/>\n        <meta name=\"dtb:depth\" content=\"1\"/>\n        <meta name=\"dtb:totalPageCount\" content=\"0\"/>\n        <meta name=\"dtb:maxPageNumber\" content=\"0\"/>\n    </head>\n    <docTitle>\n        <text>${data.title}</text>\n    </docTitle>\n    <navMap>\n${navMapStrBuilder.toString()}\n    </navMap>\n</ncx>\n  ''');\n\n  ZipFile.compressFolder(workingDir.path, outFilePath);\n\n  workingDir.deleteSync(recursive: true);\n\n  return File(outFilePath);\n}\n\nFuture<File> createEpubWithLocalComic(\n    LocalComic comic, String outFilePath) async {\n  var chapters = <String, List<File>>{};\n  if (comic.chapters == null) {\n    chapters[comic.title] =\n        (await LocalManager().getImages(comic.id, comic.comicType, 0))\n            .map((e) => File(e))\n            .toList();\n  } else {\n    for (var chapter in comic.downloadedChapters) {\n      chapters[comic.chapters![chapter]!] =\n          (await LocalManager().getImages(comic.id, comic.comicType, chapter))\n              .map((e) => File(e))\n              .toList();\n    }\n  }\n  var data = EpubData(\n    title: comic.title,\n    author: comic.subtitle,\n    cover: comic.coverFile,\n    chapters: chapters,\n  );\n\n  final cacheDir = App.cachePath;\n\n  return Isolate.run(() => overrideIO(() async {\n        return createEpubComic(data, cacheDir, outFilePath);\n      }));\n}\n"
  },
  {
    "path": "lib/utils/ext.dart",
    "content": "extension ListExt<T> on List<T>{\n  /// Remove all blank value and return the list.\n  List<T> getNoBlankList(){\n    List<T> newList = [];\n    for(var value in this){\n      if(value.toString() != \"\"){\n        newList.add(value);\n      }\n    }\n    return newList;\n  }\n\n  T? firstWhereOrNull(bool Function(T element) test){\n    for(var element in this){\n      if(test(element)){\n        return element;\n      }\n    }\n    return null;\n  }\n\n  void addIfNotNull(T? value){\n    if(value != null){\n      add(value);\n    }\n  }\n\n  /// Compare every element of this list with another list.\n  /// Return true if all elements are equal.\n  bool isEqualTo(List<T> list){\n    if(length != list.length){\n      return false;\n    }\n    for(int i=0; i<length; i++){\n      if(this[i] != list[i]){\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\nextension StringExt on String{\n  ///Remove all value that would display blank on the screen.\n  String get removeAllBlank => replaceAll(\"\\n\", \"\").replaceAll(\" \", \"\").replaceAll(\"\\t\", \"\");\n\n  /// convert this to a one-element list.\n  List<String> toList() => [this];\n\n  String _nums(){\n    String res = \"\";\n    for(int i=0; i<length; i++){\n      res += this[i].isNum?this[i]:\"\";\n    }\n    return res;\n  }\n\n  String get nums => _nums();\n\n  String setValueAt(String value, int index){\n    return replaceRange(index, index+1, value);\n  }\n\n  String? subStringOrNull(int start, [int? end]){\n    if(start < 0 || (end != null && end > length)){\n      return null;\n    }\n    return substring(start, end);\n  }\n\n  String replaceLast(String from, String to) {\n    if (isEmpty || from.isEmpty) {\n      return this;\n    }\n\n    final lastIndex = lastIndexOf(from);\n    if (lastIndex == -1) {\n      return this;\n    }\n\n    final before = substring(0, lastIndex);\n    final after = substring(lastIndex + from.length);\n    return '$before$to$after';\n  }\n\n  bool _isURL(){\n    final regex = RegExp(\n        r'^((http|https|ftp)://)[\\w-]+(\\.[\\w-]+)+([\\w.,@?^=%&:/~+#-|]*[\\w@?^=%&/~+#-])?$',\n        caseSensitive: false);\n    return regex.hasMatch(this);\n  }\n\n  bool get isURL => _isURL();\n\n  bool get isNum => double.tryParse(this) != null;\n\n  bool get isInt => int.tryParse(this) != null;\n}\n\nabstract class ListOrNull{\n  static List<T>? from<T>(Iterable<dynamic>? i){\n    return i == null ? null : List.from(i);\n  }\n}\n\nabstract class MapOrNull{\n  static Map<K, V>? from<K, V>(Map<dynamic, dynamic>? i){\n    return i == null ? null : Map<K, V>.from(i);\n  }\n}\n\nextension FutureExt<T> on Future<T>{\n  /// Wrap the future to make sure it will return at least the duration.\n  Future<T> minTime(Duration duration) async {\n    var res = await Future.wait([\n      this,\n      Future.delayed(duration),\n    ]);\n    return res[0];\n  }\n}"
  },
  {
    "path": "lib/utils/file_type.dart",
    "content": "import 'package:mime/mime.dart';\n\nclass FileType {\n  final String ext;\n  final String mime;\n\n  const FileType(this.ext, this.mime);\n\n  static FileType fromExtension(String ext) {\n    if(ext.startsWith('.')) {\n      ext = ext.substring(1);\n    }\n    var mime = lookupMimeType('no-file.$ext') ?? 'application/octet-stream';\n    // Android doesn't support some mime types\n    mime = switch(mime) {\n      'text/javascript' => 'application/octet-stream',\n      'application/x-cbr' => 'application/octet-stream',\n      _ => mime,\n    };\n    return FileType(\".$ext\", mime);\n  }\n}\n\nfinal _resolver = MimeTypeResolver()\n  // zip\n  ..addMagicNumber([0x50, 0x4B], 'application/zip')\n  // 7z\n  ..addMagicNumber([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], 'application/x-7z-compressed')\n  // rar\n  ..addMagicNumber([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07], 'application/vnd.rar')\n  // avif\n  ..addMagicNumber([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66], 'image/avif')\n;\n\nFileType detectFileType(List<int> data) {\n  var mime = _resolver.lookup('no-file', headerBytes: data);\n  var ext = mime == null ? '' : extensionFromMime(mime);\n  if(ext == 'jpe') {\n    ext = 'jpg';\n  }\n  return FileType(\".$ext\", mime ?? 'application/octet-stream');\n}"
  },
  {
    "path": "lib/utils/handle_text_share.dart",
    "content": "import 'package:flutter/services.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/pages/aggregated_search_page.dart';\n\nbool _isHandling = false;\n\n/// Handle text share event.\n/// App will navigate to [AggregatedSearchPage] with the shared text as keyword.\nvoid handleTextShare() async {\n  if (_isHandling) return;\n  _isHandling = true;\n\n  var channel = EventChannel('venera/text_share');\n  await for (var event in channel.receiveBroadcastStream()) {\n    if (App.mainNavigatorKey == null) {\n      await Future.delayed(const Duration(milliseconds: 200));\n    }\n    if (event is String) {\n      App.rootContext.to(() => AggregatedSearchPage(keyword: event));\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/image.dart",
    "content": "import 'dart:ffi';\nimport 'dart:isolate';\nimport 'dart:typed_data';\nimport 'dart:ui' as ui;\nimport 'package:flutter/services.dart';\nimport 'package:flutter_qjs/flutter_qjs.dart';\nimport 'package:lodepng_flutter/lodepng_flutter.dart' as lodepng;\n\nclass Image {\n  final Uint32List _data;\n\n  final int width;\n\n  final int height;\n\n  Image(this._data, this.width, this.height) {\n    if (_data.length != width * height) {\n      throw ArgumentError(\n          'Invalid argument: data length must be equal to width * height.');\n    }\n  }\n\n  Image.empty(this.width, this.height) : _data = Uint32List(width * height);\n\n  static Future<Image> decodeImage(Uint8List data) async {\n    var codec = await ui.instantiateImageCodec(data);\n    var frame = await codec.getNextFrame();\n    codec.dispose();\n    var info = await frame.image.toByteData(format: ui.ImageByteFormat.rawStraightRgba);\n    if (info == null) {\n      throw Exception('Failed to decode image');\n    }\n    var image = Image(\n      info.buffer.asUint32List(),\n      frame.image.width,\n      frame.image.height,\n    );\n    frame.image.dispose();\n    return image;\n  }\n\n  Color getPixelAtIndex(int index) {\n    if (index < 0 || index >= _data.length) {\n      throw ArgumentError(\n          'Invalid argument: index must be in the range of [0, ${_data.length}).');\n    }\n    return Color.fromValue(_data[index]);\n  }\n\n  Image copyRange(int x, int y, int width, int height) {\n    if (width + x > this.width) {\n      throw ArgumentError('''\n        Invalid argument: x + width must be less than or equal to the image width.\n        x: $x, width: $width, image width: ${this.width}\n      '''\n          .trim());\n    }\n    if (height + y > this.height) {\n      throw ArgumentError('''\n        Invalid argument: y + height must be less than or equal to the image height.\n        y: $y, height: $height, image height: ${this.height}\n      '''\n          .trim());\n    }\n    var data = Uint32List(width * height);\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++) {\n        data[j * width + i] = _data[(j + y) * this.width + i + x];\n      }\n    }\n    return Image(data, width, height);\n  }\n\n  void fillImageAt(int x, int y, Image image) {\n    if (x + image.width > width) {\n      throw ArgumentError('''\n        Invalid argument: x + image width must be less than or equal to the image width.\n        x: $x, image width: ${image.width}, image width: $width\n      '''\n          .trim());\n    }\n    if (y + image.height > height) {\n      throw ArgumentError('''\n        Invalid argument: y + image height must be less than or equal to the image height.\n        y: $y, image height: ${image.height}, image height: $height\n      '''\n          .trim());\n    }\n    for (var j = 0; j < image.height && (j + y) < height; j++) {\n      for (var i = 0; i < image.width && (i + x) < width; i++) {\n        _data[(j + y) * width + i + x] = image._data[j * image.width + i];\n      }\n    }\n  }\n\n  void fillImageRangeAt(\n      int x, int y, Image image, int srcX, int srcY, int width, int height) {\n    if (x + width > this.width) {\n      throw ArgumentError('''\n        Invalid argument: x + width must be less than or equal to the image width.\n        x: $x, width: $width, image width: ${this.width}\n      '''\n          .trim());\n    }\n    if (y + height > this.height) {\n      throw ArgumentError('''\n        Invalid argument: y + height must be less than or equal to the image height.\n        y: $y, height: $height, image height: ${this.height}\n      '''\n          .trim());\n    }\n    if (srcX + width > image.width) {\n      throw ArgumentError('''\n        Invalid argument: srcX + width must be less than or equal to the image width.\n        srcX: $srcX, width: $width, image width: ${image.width}\n      '''\n          .trim());\n    }\n    if (srcY + height > image.height) {\n      throw ArgumentError('''\n        Invalid argument: srcY + height must be less than or equal to the image height.\n        srcY: $srcY, height: $height, image height: ${image.height}\n      '''\n          .trim());\n    }\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++) {\n        _data[(j + y) * this.width + i + x] =\n            image._data[(j + srcY) * image.width + i + srcX];\n      }\n    }\n  }\n\n  Image copyAndRotate90() {\n    var data = Uint32List(width * height);\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++) {\n        data[i * height + height - j - 1] = _data[j * width + i];\n      }\n    }\n    return Image(data, height, width);\n  }\n\n  Color getPixel(int x, int y) {\n    if (x < 0 || x >= width) {\n      throw ArgumentError(\n          'Invalid argument: x must be in the range of [0, $width).');\n    }\n    if (y < 0 || y >= height) {\n      throw ArgumentError(\n          'Invalid argument: y must be in the range of [0, $height).');\n    }\n    return Color.fromValue(_data[y * width + x]);\n  }\n\n  void setPixel(int x, int y, Color color) {\n    if (x < 0 || x >= width) {\n      throw ArgumentError(\n          'Invalid argument: x must be in the range of [0, $width).');\n    }\n    if (y < 0 || y >= height) {\n      throw ArgumentError(\n          'Invalid argument: y must be in the range of [0, $height).');\n    }\n    _data[y * width + x] = color.value;\n  }\n\n  Uint8List encodePng() {\n    var data = lodepng.encodePngToPointer(lodepng.Image(\n      _data.buffer.asUint8List(),\n      width,\n      height,\n    ));\n    return Pointer<Uint8>.fromAddress(data.address).asTypedList(data.length,\n        finalizer: lodepng.ByteBuffer.finalizer);\n  }\n}\n\nclass Color {\n  final int value;\n\n  Color(int r, int g, int b, [int a = 255])\n      : value = (a << 24) | (r << 16) | (g << 8) | b;\n\n  Color.fromValue(this.value);\n\n  int get r => value & 0xFF;\n\n  int get g => (value >> 8) & 0xFF;\n\n  int get b => (value >> 16) & 0xFF;\n\n  int get a => (value >> 24) & 0xFF;\n}\n\nclass JsEngine {\n  static final JsEngine _instance = JsEngine._();\n\n  factory JsEngine() => _instance;\n\n  JsEngine._() {\n    _engine = FlutterQjs();\n    _engine!.dispatch();\n    var setGlobalFunc =\n        _engine!.evaluate(\"(key, value) => { this[key] = value; }\");\n    (setGlobalFunc as JSInvokable)([\"sendMessage\", _messageReceiver]);\n    setGlobalFunc.free();\n  }\n\n  FlutterQjs? _engine;\n\n  dynamic runCode(String js, [String? name]) {\n    return _engine!.evaluate(js, name: name);\n  }\n\n  var images = <int, Image>{};\n\n  int _key = 0;\n\n  int setImage(Image image) {\n    var key = _key++;\n    images[key] = image;\n    return key;\n  }\n\n  Object? _messageReceiver(dynamic message) {\n    if (message is! Map) return null;\n    var method = message['method'];\n    if (method == 'image') {\n      switch (message['function']) {\n        case 'copyRange':\n          var key = message['key'];\n          var image = images[key];\n          if (image == null) return null;\n          var x = message['x'];\n          var y = message['y'];\n          var width = message['width'];\n          var height = message['height'];\n          var newImage = image.copyRange(x, y, width, height);\n          return setImage(newImage);\n        case 'copyAndRotate90':\n          var key = message['key'];\n          var image = images[key];\n          if (image == null) return null;\n          var newImage = image.copyAndRotate90();\n          return setImage(newImage);\n        case 'fillImageAt':\n          var key = message['key'];\n          var image = images[key];\n          if (image == null) return null;\n          var x = message['x'];\n          var y = message['y'];\n          var key2 = message['image'];\n          var image2 = images[key2];\n          if (image2 == null) return null;\n          image.fillImageAt(x, y, image2);\n          return null;\n        case 'fillImageRangeAt':\n          var key = message['key'];\n          var image = images[key];\n          if (image == null) return null;\n          var x = message['x'];\n          var y = message['y'];\n          var key2 = message['image'];\n          var image2 = images[key2];\n          if (image2 == null) return null;\n          var srcX = message['srcX'];\n          var srcY = message['srcY'];\n          var width = message['width'];\n          var height = message['height'];\n          image.fillImageRangeAt(x, y, image2, srcX, srcY, width, height);\n          return null;\n        case 'getWidth':\n          var key = message['key'];\n          var image = images[key];\n          if (image == null) return null;\n          return image.width;\n        case 'getHeight':\n          var key = message['key'];\n          var image = images[key];\n          if (image == null) return null;\n          return image.height;\n        case 'emptyImage':\n          var width = message['width'];\n          var height = message['height'];\n          var newImage = Image.empty(width, height);\n          return setImage(newImage);\n      }\n    }\n    return null;\n  }\n}\n\nvar _tasksCount = 0;\n\nFuture<Uint8List> modifyImageWithScript(Uint8List data, String script) async {\n  while (_tasksCount > 3) {\n    await Future.delayed(const Duration(milliseconds: 200));\n  }\n  _tasksCount++;\n  try {\n    var image = await Image.decodeImage(data);\n    var initJs = await rootBundle.loadString('assets/init.js');\n    return await Isolate.run(() {\n      var jsEngine = JsEngine();\n      jsEngine.runCode(initJs, '<init>');\n      jsEngine.runCode(script);\n      var key = jsEngine.setImage(image);\n      var res = jsEngine.runCode('''\n        let func = () => {\n          let image = new Image($key);\n          let result = modifyImage(image);\n          return result.key;\n        }\n        func();\n      ''');\n      var newImage = jsEngine.images[res];\n      var data = newImage!.encodePng();\n      return Uint8List.fromList(data);\n    });\n  } finally {\n    _tasksCount--;\n  }\n}\n"
  },
  {
    "path": "lib/utils/import_comic.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:venera/components/components.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport 'package:venera/foundation/comic_type.dart';\nimport 'package:venera/foundation/favorites.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/foundation/log.dart';\nimport 'package:sqlite3/sqlite3.dart' as sql;\nimport 'package:venera/utils/ext.dart';\nimport 'package:venera/utils/translations.dart';\nimport 'cbz.dart';\nimport 'io.dart';\n\nclass ImportComic {\n  final String? selectedFolder;\n  final bool copyToLocal;\n\n  const ImportComic({this.selectedFolder, this.copyToLocal = true});\n\n  Future<bool> cbz() async {\n    var file = await selectFile(ext: ['cbz', 'zip', '7z', 'cb7']);\n    Map<String?, List<LocalComic>> imported = {};\n    if (file == null) {\n      return false;\n    }\n    var controller = showLoadingDialog(App.rootContext, allowCancel: false);\n    try {\n      var comic = await CBZ.import(File(file.path));\n      imported[selectedFolder] = [comic];\n    } catch (e, s) {\n      Log.error(\"Import Comic\", e.toString(), s);\n      App.rootContext.showMessage(message: e.toString());\n    }\n    controller.close();\n    return registerComics(imported, false);\n  }\n\n  Future<bool> multipleCbz() async {\n    var picker = DirectoryPicker();\n    var dir = await picker.pickDirectory(directAccess: true);\n    if (dir != null) {\n      var files = (await dir.list().toList()).whereType<File>().toList();\n      const supportedExtensions = ['cbz', 'zip', '7z', 'cb7'];\n      files.removeWhere((e) => !supportedExtensions.contains(e.extension));\n      Map<String?, List<LocalComic>> imported = {};\n      var controller = showLoadingDialog(App.rootContext, allowCancel: false);\n      var comics = <LocalComic>[];\n      for (var file in files) {\n        try {\n          var comic = await CBZ.import(file);\n          comics.add(comic);\n        } catch (e, s) {\n          Log.error(\"Import Comic\", e.toString(), s);\n        }\n      }\n      if (comics.isEmpty) {\n        App.rootContext.showMessage(message: \"No valid comics found\".tl);\n      }\n      imported[selectedFolder] = comics;\n      controller.close();\n      return registerComics(imported, false);\n    }\n    return false;\n  }\n\n  Future<bool> ehViewer() async {\n    var dbFile = await selectFile(ext: ['db']);\n    final picker = DirectoryPicker();\n    final comicSrc = await picker.pickDirectory();\n    Map<String?, List<LocalComic>> imported = {};\n    if (dbFile == null || comicSrc == null) {\n      return false;\n    }\n\n    bool cancelled = false;\n    var controller = showLoadingDialog(App.rootContext, onCancel: () {\n      cancelled = true;\n    });\n\n    try {\n      var db = sql.sqlite3.open(dbFile.path);\n\n      Future<List<LocalComic>> validateComics(List<sql.Row> comics) async {\n        List<LocalComic> imported = [];\n        for (var comic in comics) {\n          if (cancelled) {\n            return imported;\n          }\n          var comicDir = Directory(\n              FilePath.join(comicSrc.path, comic['DIRNAME'] as String));\n          String titleJP =\n              comic['TITLE_JPN'] == null ? \"\" : comic['TITLE_JPN'] as String;\n          String title = titleJP == \"\" ? comic['TITLE'] as String : titleJP;\n          int timeStamp = comic['TIME'] as int;\n          DateTime downloadTime = timeStamp != 0\n              ? DateTime.fromMillisecondsSinceEpoch(timeStamp)\n              : DateTime.now();\n          var comicObj = await _checkSingleComic(comicDir,\n              title: title,\n              tags: [\n                //1 >> x\n                [\n                  \"MISC\",\n                  \"DOUJINSHI\",\n                  \"MANGA\",\n                  \"ARTISTCG\",\n                  \"GAMECG\",\n                  \"IMAGE SET\",\n                  \"COSPLAY\",\n                  \"ASIAN PORN\",\n                  \"NON-H\",\n                  \"WESTERN\",\n                ][(log(comic['CATEGORY'] as int) / ln2).floor()]\n              ],\n              createTime: downloadTime);\n          if (comicObj == null) {\n            continue;\n          }\n          imported.add(comicObj);\n        }\n        return imported;\n      }\n\n      var tags = <String>[\"\"];\n      tags.addAll(db.select(\"\"\"\n            SELECT * FROM DOWNLOAD_LABELS LB\n            ORDER BY  LB.TIME DESC;\n          \"\"\").map((r) => r['LABEL'] as String).toList());\n\n      for (var tag in tags) {\n        if (cancelled) {\n          break;\n        }\n        var folderName = tag == '' ? '(EhViewer)Default'.tl : '(EhViewer)$tag';\n        var comicList = db.select(\"\"\"\n              SELECT * \n              FROM DOWNLOAD_DIRNAME DN\n              LEFT JOIN DOWNLOADS DL\n              ON DL.GID = DN.GID\n              WHERE DL.LABEL ${tag == '' ? 'IS NULL' : '= \\'$tag\\''} AND DL.STATE = 3\n              ORDER BY DL.TIME DESC\n            \"\"\").toList();\n\n        var validComics = await validateComics(comicList);\n        imported[folderName] = validComics;\n        if (validComics.isNotEmpty &&\n            !LocalFavoritesManager().existsFolder(folderName)) {\n          LocalFavoritesManager().createFolder(folderName);\n        }\n      }\n      db.dispose();\n\n      //Android specific\n      var cache = FilePath.join(App.cachePath, dbFile.name);\n      await File(cache).deleteIgnoreError();\n    } catch (e, s) {\n      Log.error(\"Import Comic\", e.toString(), s);\n      App.rootContext.showMessage(message: e.toString());\n    }\n    controller.close();\n    if (cancelled) return false;\n    return registerComics(imported, copyToLocal);\n  }\n\n  Future<bool> directory(bool single) async {\n    final picker = DirectoryPicker();\n    final path = await picker.pickDirectory();\n    if (path == null) {\n      return false;\n    }\n    Map<String?, List<LocalComic>> imported = {selectedFolder: []};\n    try {\n      if (single) {\n        var result = await _checkSingleComic(path);\n        if (result != null) {\n          imported[selectedFolder]!.add(result);\n        } else {\n          App.rootContext.showMessage(message: \"Invalid Comic\".tl);\n          return false;\n        }\n      } else {\n        await for (var entry in path.list()) {\n          if (entry is Directory) {\n            var result = await _checkSingleComic(entry);\n            if (result != null) {\n              imported[selectedFolder]!.add(result);\n            }\n          }\n        }\n      }\n    } catch (e, s) {\n      Log.error(\"Import Comic\", e.toString(), s);\n      App.rootContext.showMessage(message: e.toString());\n    }\n    return registerComics(imported, copyToLocal);\n  }\n\n  Future<bool> localDownloads() async {\n    var localDir = LocalManager().directory;\n    Map<String?, List<LocalComic>> imported = {null: []};\n    bool cancelled = false;\n    var controller = showLoadingDialog(App.rootContext, onCancel: () {\n      cancelled = true;\n    });\n    try {\n      if (!await localDir.exists()) {\n        App.rootContext.showMessage(message: \"Local path not found\".tl);\n        controller.close();\n        return false;\n      }\n      await for (var entry in localDir.list()) {\n        if (cancelled) {\n          break;\n        }\n        if (entry is Directory) {\n          var stat = await entry.stat();\n          var result = await _checkSingleComic(\n            entry,\n            createTime: stat.modified,\n            useRelativePath: true,\n          );\n          if (result != null) {\n            imported[null]!.add(result);\n          }\n        }\n      }\n      if (!cancelled && imported[null]!.isEmpty) {\n        App.rootContext.showMessage(message: \"No valid comics found\".tl);\n      }\n    } catch (e, s) {\n      Log.error(\"Import Comic\", e.toString(), s);\n      App.rootContext.showMessage(message: e.toString());\n    }\n    controller.close();\n    if (cancelled) return false;\n    return registerComics(imported, false);\n  }\n\n  //Automatically search for cover image and chapters\n  Future<LocalComic?> _checkSingleComic(Directory directory,\n      {String? id,\n      String? title,\n      String? subtitle,\n      List<String>? tags,\n      DateTime? createTime,\n      bool useRelativePath = false}) async {\n    if (!(await directory.exists())) return null;\n    var name = title ?? directory.name;\n    if (LocalManager().findByName(name) != null) {\n      Log.info(\"Import Comic\", \"Comic already exists: $name\");\n      return null;\n    }\n    bool hasChapters = false;\n    var chapters = <String>[];\n    var coverPath = ''; // relative path to the cover image\n    var fileList = <String>[];\n    await for (var entry in directory.list()) {\n      if (entry is Directory) {\n        hasChapters = true;\n        chapters.add(entry.name);\n        await for (var file in entry.list()) {\n          if (file is Directory) {\n            Log.info(\"Import Comic\",\n                \"Invalid Chapter: ${entry.name}\\nA directory is found in the chapter directory.\");\n            return null;\n          }\n        }\n      } else if (entry is File) {\n        const imageExtensions = ['jpg', 'jpeg', 'png', 'webp', 'gif', 'jpe'];\n        if (imageExtensions.contains(entry.extension)) {\n          fileList.add(entry.name);\n        }\n      }\n    }\n\n    if (fileList.isEmpty) {\n      return null;\n    }\n\n    fileList.sort();\n    coverPath = fileList.firstWhereOrNull((l) => l.startsWith('cover')) ??\n        fileList.first;\n\n    chapters.sort();\n    if (hasChapters && coverPath == '') {\n      // use the first image in the first chapter as the cover\n      var firstChapter = Directory('${directory.path}/${chapters.first}');\n      await for (var entry in firstChapter.list()) {\n        if (entry is File) {\n          coverPath = entry.name;\n          break;\n        }\n      }\n    }\n    if (coverPath == '') {\n      Log.info(\"Import Comic\", \"Invalid Comic: $name\\nNo cover image found.\");\n      return null;\n    }\n    var directoryPath = useRelativePath ? directory.name : directory.path;\n    return LocalComic(\n      id: id ?? '0',\n      title: name,\n      subtitle: subtitle ?? '',\n      tags: tags ?? [],\n      directory: directoryPath,\n      chapters: hasChapters\n          ? ComicChapters(Map.fromIterables(chapters, chapters))\n          : null,\n      cover: coverPath,\n      comicType: ComicType.local,\n      downloadedChapters: chapters,\n      createdAt: createTime ?? DateTime.now(),\n    );\n  }\n\n  static Future<Map<String, String>> _copyDirectories(\n      Map<String, dynamic> data) async {\n    return overrideIO(() async {\n      var toBeCopied = data['toBeCopied'] as List<String>;\n      var destination = data['destination'] as String;\n      Map<String, String> result = {};\n      for (var dir in toBeCopied) {\n        var source = Directory(dir);\n        var dest = Directory(\"$destination/${source.name}\");\n        if (dest.existsSync()) {\n          // The destination directory already exists, and it is not managed by the app.\n          // Rename the old directory to avoid conflicts.\n          Log.info(\"Import Comic\",\n              \"Directory already exists: ${source.name}\\nRenaming the old directory.\");\n          dest.renameSync(\n              findValidDirectoryName(dest.parent.path, \"${dest.path}_old\"));\n        }\n        dest.createSync();\n        await copyDirectory(source, dest);\n        result[source.path] = dest.path;\n      }\n      return result;\n    });\n  }\n\n  Future<Map<String?, List<LocalComic>>> _copyComicsToLocalDir(\n      Map<String?, List<LocalComic>> comics) async {\n    var destPath = LocalManager().path;\n    Map<String?, List<LocalComic>> result = {};\n    for (var favoriteFolder in comics.keys) {\n      result[favoriteFolder] = comics[favoriteFolder]!\n          .where((c) => c.directory.startsWith(destPath))\n          .toList();\n      comics[favoriteFolder]!\n          .removeWhere((c) => c.directory.startsWith(destPath));\n\n      if (comics[favoriteFolder]!.isEmpty) {\n        continue;\n      }\n\n      try {\n        // copy the comics to the local directory\n        var pathMap = await compute<Map<String, dynamic>, Map<String, String>>(\n            _copyDirectories, {\n          'toBeCopied':\n              comics[favoriteFolder]!.map((e) => e.directory).toList(),\n          'destination': destPath,\n        });\n        //Construct a new object since LocalComic.directory is a final String\n        for (var c in comics[favoriteFolder]!) {\n          result[favoriteFolder]!.add(LocalComic(\n            id: c.id,\n            title: c.title,\n            subtitle: c.subtitle,\n            tags: c.tags,\n            directory: pathMap[c.directory]!,\n            chapters: c.chapters,\n            cover: c.cover,\n            comicType: c.comicType,\n            downloadedChapters: c.downloadedChapters,\n            createdAt: c.createdAt,\n          ));\n        }\n      } catch (e, s) {\n        App.rootContext.showMessage(message: \"Failed to copy comics\".tl);\n        Log.error(\"Import Comic\", e.toString(), s);\n        return result;\n      }\n    }\n    return result;\n  }\n\n  Future<bool> registerComics(\n      Map<String?, List<LocalComic>> importedComics, bool copy) async {\n    try {\n      if (copy) {\n        importedComics = await _copyComicsToLocalDir(importedComics);\n      }\n      int importedCount = 0;\n      for (var folder in importedComics.keys) {\n        for (var comic in importedComics[folder]!) {\n          var id = LocalManager().findValidId(ComicType.local);\n          LocalManager().add(comic, id);\n          importedCount++;\n          if (folder != null) {\n            LocalFavoritesManager().addComic(\n                folder,\n                FavoriteItem(\n                    id: id,\n                    name: comic.title,\n                    coverPath: comic.cover,\n                    author: comic.subtitle,\n                    type: comic.comicType,\n                    tags: comic.tags,\n                    favoriteTime: comic.createdAt));\n          }\n        }\n      }\n      App.rootContext.showMessage(\n          message: \"Imported @a comics\".tlParams({\n        'a': importedCount,\n      }));\n    } catch (e, s) {\n      App.rootContext.showMessage(message: \"Failed to register comics\".tl);\n      Log.error(\"Import Comic\", e.toString(), s);\n      return false;\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "lib/utils/init.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\n\n/// A mixin class that provides a way to ensure the class is initialized.\nabstract mixin class Init {\n  bool _isInit = false;\n\n  final _initCompleter = <Completer<void>>[];\n\n  /// Ensure the class is initialized.\n  Future<void> ensureInit() async {\n    if (_isInit) {\n      return;\n    }\n    var completer = Completer<void>();\n    _initCompleter.add(completer);\n    return completer.future;\n  }\n\n  Future<void> _markInit() async {\n    _isInit = true;\n    for (var completer in _initCompleter) {\n      completer.complete();\n    }\n    _initCompleter.clear();\n  }\n\n  @protected\n  Future<void> doInit();\n\n  /// Initialize the class.\n  Future<void> init() async {\n    if (_isInit) {\n      return;\n    }\n    await doInit();\n    await _markInit();\n  }\n}"
  },
  {
    "path": "lib/utils/io.dart",
    "content": "import 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:flutter/services.dart';\nimport 'package:flutter_file_dialog/flutter_file_dialog.dart';\nimport 'package:flutter_saf/flutter_saf.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/utils/ext.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:share_plus/share_plus.dart' as s;\nimport 'package:file_selector/file_selector.dart' as file_selector;\nimport 'package:venera/utils/file_type.dart';\n\nexport 'dart:io';\nexport 'dart:typed_data';\n\nclass IO {\n  /// A global flag used to indicate whether the app is selecting files.\n  ///\n  /// Select file and other similar file operations will launch external programs,\n  /// causing the app to lose focus. AppLifecycleState will be set to paused.\n  static bool get isSelectingFiles => _isSelectingFiles;\n\n  static bool _isSelectingFiles = false;\n}\n\nclass FilePath {\n  const FilePath._();\n\n  static String join(String path1, String path2,\n      [String? path3, String? path4, String? path5]) {\n    return p.join(path1, path2, path3, path4, path5);\n  }\n}\n\nextension FileSystemEntityExt on FileSystemEntity {\n  /// Get the base name of the file or directory.\n  String get name {\n    return p.basename(path);\n  }\n\n  /// Delete the file or directory and ignore errors.\n  Future<void> deleteIgnoreError({bool recursive = false}) async {\n    try {\n      await delete(recursive: recursive);\n    } catch (e) {\n      // ignore\n    }\n  }\n\n  /// Delete the file or directory if it exists.\n  Future<void> deleteIfExists({bool recursive = false}) async {\n    if (existsSync()) {\n      await delete(recursive: recursive);\n    }\n  }\n\n  /// Delete the file or directory if it exists.\n  void deleteIfExistsSync({bool recursive = false}) {\n    if (existsSync()) {\n      deleteSync(recursive: recursive);\n    }\n  }\n}\n\nextension FileExtension on File {\n  /// Get the file extension, not including the dot.\n  String get extension => path.split('.').last;\n\n  /// Copy the file to the specified path using memory.\n  ///\n  /// This method prevents errors caused by files from different file systems.\n  Future<void> copyMem(String newPath) async {\n    var newFile = File(newPath);\n    // Stream is not usable since [AndroidFile] does not support [openRead].\n    await newFile.writeAsBytes(await readAsBytes());\n  }\n\n  /// Get the base name of the file without the extension.\n  String get basenameWithoutExt {\n    return p.basenameWithoutExtension(path);\n  }\n}\n\nextension DirectoryExtension on Directory {\n  /// Calculate the size of the directory.\n  Future<int> get size async {\n    if (!existsSync()) return 0;\n    int total = 0;\n    for (var f in listSync(recursive: true)) {\n      if (FileSystemEntity.typeSync(f.path) == FileSystemEntityType.file) {\n        total += await File(f.path).length();\n      }\n    }\n    return total;\n  }\n\n  /// Change the base name of the directory.\n  Directory renameX(String newName) {\n    newName = sanitizeFileName(newName);\n    return renameSync(path.replaceLast(name, newName));\n  }\n\n  File joinFile(String name) {\n    return File(FilePath.join(path, name));\n  }\n\n  /// Delete the contents of the directory.\n  void deleteContentsSync({recursive = true}) {\n    if (!existsSync()) return;\n    for (var f in listSync()) {\n      f.deleteIfExistsSync(recursive: recursive);\n    }\n  }\n\n  /// Delete the contents of the directory.\n  Future<void> deleteContents({recursive = true}) async {\n    if (!existsSync()) return;\n    for (var f in listSync()) {\n      await f.deleteIfExists(recursive: recursive);\n    }\n  }\n\n  /// Create the directory. If the directory already exists, delete it first.\n  void forceCreateSync() {\n    if (existsSync()) {\n      deleteSync(recursive: true);\n    }\n    createSync(recursive: true);\n  }\n}\n\n/// Sanitize the file name. Remove invalid characters and trim the file name.\nString sanitizeFileName(String fileName, {String? dir, int? maxLength}) {\n  while (fileName.endsWith('.')) {\n    fileName = fileName.substring(0, fileName.length - 1);\n  }\n  var length = maxLength ?? 255;\n  if (dir != null) {\n    if (!dir.endsWith('/') && !dir.endsWith('\\\\')) {\n      dir = \"$dir/\";\n    }\n    length -= dir.length;\n  }\n  final invalidChars = RegExp(r'[<>:\"/\\\\|?*]');\n  final sanitizedFileName = fileName.replaceAll(invalidChars, ' ');\n  var trimmedFileName = sanitizedFileName.trim();\n  if (trimmedFileName.isEmpty) {\n    throw Exception('Invalid File Name: Empty length.');\n  }\n  if (length <= 0) {\n    throw Exception('Invalid File Name: Max length is less than 0.');\n  }\n  if (trimmedFileName.length > length) {\n    trimmedFileName = trimmedFileName.substring(0, length);\n  }\n  return trimmedFileName;\n}\n\n/// Copy the **contents** of the source directory to the destination directory.\nFuture<void> copyDirectory(Directory source, Directory destination) async {\n  List<FileSystemEntity> contents = source.listSync();\n  for (FileSystemEntity content in contents) {\n    String newPath = FilePath.join(destination.path, content.name);\n\n    if (content is File) {\n      var resultFile = File(newPath);\n      resultFile.createSync();\n      var data = content.readAsBytesSync();\n      resultFile.writeAsBytesSync(data);\n    } else if (content is Directory) {\n      Directory newDirectory = Directory(newPath);\n      newDirectory.createSync();\n      copyDirectory(content.absolute, newDirectory.absolute);\n    }\n  }\n}\n\n/// Copy the **contents** of the source directory to the destination directory.\n/// This function is executed in an isolate to prevent the UI from freezing.\nFuture<void> copyDirectoryIsolate(\n    Directory source, Directory destination) async {\n  await Isolate.run(() => overrideIO(() => copyDirectory(source, destination)));\n}\n\nString findValidDirectoryName(String path, String directory) {\n  var name = sanitizeFileName(directory);\n  var dir = Directory(\"$path/$name\");\n  var i = 1;\n  while (dir.existsSync() && dir.listSync().isNotEmpty) {\n    name = sanitizeFileName(\"$directory($i)\");\n    dir = Directory(\"$path/$name\");\n    i++;\n  }\n  return name;\n}\n\nclass DirectoryPicker {\n  /// Pick a directory.\n  ///\n  /// The directory may not be usable after the instance is GCed.\n  DirectoryPicker();\n\n  static final _finalizer = Finalizer<String>((path) {\n    if (path.startsWith(App.cachePath)) {\n      Directory(path).deleteIgnoreError();\n    }\n    if (App.isIOS || App.isMacOS) {\n      _methodChannel.invokeMethod(\"stopAccessingSecurityScopedResource\");\n    }\n  });\n\n  static const _methodChannel = MethodChannel(\"venera/method_channel\");\n\n  Future<Directory?> pickDirectory({bool directAccess = false}) async {\n    IO._isSelectingFiles = true;\n    try {\n      String? directory;\n      if (App.isWindows || App.isLinux) {\n        directory = await file_selector.getDirectoryPath();\n      } else if (App.isAndroid) {\n        directory = (await AndroidDirectory.pickDirectory())?.path;\n        if (directory != null && directAccess) {\n          // Native library does not have access to the directory. Copy it to cache.\n          var cache = FilePath.join(App.cachePath, \"selected_directory\");\n          if (Directory(cache).existsSync()) {\n            Directory(cache).deleteSync(recursive: true);\n          }\n          Directory(cache).createSync();\n          await copyDirectoryIsolate(Directory(directory), Directory(cache));\n          directory = cache;\n        }\n      } else {\n        // ios, macos\n        directory =\n            await _methodChannel.invokeMethod<String?>(\"getDirectoryPath\");\n      }\n      if (directory == null) return null;\n      _finalizer.attach(this, directory);\n      return Directory(directory);\n    } finally {\n      Future.delayed(const Duration(milliseconds: 100), () {\n        IO._isSelectingFiles = false;\n      });\n    }\n  }\n}\n\nclass IOSDirectoryPicker {\n  static const MethodChannel _channel = MethodChannel(\"venera/method_channel\");\n\n  // 调用 iOS 目录选择方法\n  static Future<String?> selectDirectory() async {\n    IO._isSelectingFiles = true;\n    try {\n      final String? path = await _channel.invokeMethod('selectDirectory');\n      return path;\n    } catch (e) {\n      // 返回报错信息\n      return e.toString();\n    } finally {\n      Future.delayed(const Duration(milliseconds: 100), () {\n        IO._isSelectingFiles = false;\n      });\n    }\n  }\n}\n\nFuture<FileSelectResult?> selectFile({required List<String> ext}) async {\n  IO._isSelectingFiles = true;\n  try {\n    var extensions = App.isMacOS || App.isIOS ? null : ext;\n    file_selector.XTypeGroup typeGroup = file_selector.XTypeGroup(\n      label: 'files',\n      extensions: extensions,\n    );\n    FileSelectResult? file;\n    if (App.isAndroid) {\n      const selectFileChannel = MethodChannel(\"venera/select_file\");\n      String mimeType = \"*/*\";\n      if (ext.length == 1) {\n        mimeType = FileType.fromExtension(ext[0]).mime;\n        if (mimeType == \"application/octet-stream\") {\n          mimeType = \"*/*\";\n        }\n      }\n      var filePath = await selectFileChannel.invokeMethod(\n        \"selectFile\",\n        mimeType,\n      );\n      if (filePath == null) return null;\n      file = FileSelectResult(filePath);\n    } else {\n      var xFile = await file_selector.openFile(\n        acceptedTypeGroups: <file_selector.XTypeGroup>[typeGroup],\n      );\n      if (xFile == null) return null;\n      file = FileSelectResult(xFile.path);\n    }\n    if (!ext.contains(file.path.split(\".\").last)) {\n      App.rootContext.showMessage(\n        message: \"Invalid file type: ${file.path.split(\".\").last}\",\n      );\n      return null;\n    }\n    return file;\n  } finally {\n    Future.delayed(const Duration(milliseconds: 100), () {\n      IO._isSelectingFiles = false;\n    });\n  }\n}\n\nFuture<String?> selectDirectory() async {\n  IO._isSelectingFiles = true;\n  try {\n    var path = await file_selector.getDirectoryPath();\n    return path;\n  } finally {\n    Future.delayed(const Duration(milliseconds: 100), () {\n      IO._isSelectingFiles = false;\n    });\n  }\n}\n\n// selectDirectoryIOS\nFuture<String?> selectDirectoryIOS() async {\n  return IOSDirectoryPicker.selectDirectory();\n}\n\nFuture<void> saveFile(\n    {Uint8List? data, required String filename, File? file}) async {\n  if (data == null && file == null) {\n    throw Exception(\"data and file cannot be null at the same time\");\n  }\n  IO._isSelectingFiles = true;\n  try {\n    if (data != null) {\n      var cache = FilePath.join(App.cachePath, filename);\n      if (File(cache).existsSync()) {\n        File(cache).deleteSync();\n      }\n      await File(cache).writeAsBytes(data);\n      file = File(cache);\n    }\n    if (App.isMobile) {\n      final params = SaveFileDialogParams(sourceFilePath: file!.path);\n      await FlutterFileDialog.saveFile(params: params);\n    } else {\n      final result = await file_selector.getSaveLocation(\n        suggestedName: filename,\n      );\n      if (result != null) {\n        var xFile = file_selector.XFile(file!.path);\n        await xFile.saveTo(result.path);\n      }\n    }\n  } finally {\n    Future.delayed(const Duration(milliseconds: 100), () {\n      IO._isSelectingFiles = false;\n    });\n  }\n}\n\nfinal class _IOOverrides extends IOOverrides {\n  @override\n  Directory createDirectory(String path) {\n    if (App.isAndroid) {\n      var dir = AndroidDirectory.fromPathSync(path);\n      if (dir == null) {\n        return super.createDirectory(path);\n      }\n      return dir;\n    } else {\n      return super.createDirectory(path);\n    }\n  }\n\n  @override\n  File createFile(String path) {\n    if (path.startsWith(\"file://\")) {\n      path = path.substring(7);\n    }\n    if (App.isAndroid) {\n      var f = AndroidFile.fromPathSync(path);\n      if (f == null) {\n        return super.createFile(path);\n      }\n      return f;\n    } else {\n      return super.createFile(path);\n    }\n  }\n}\n\nT overrideIO<T>(T Function() f) {\n  return IOOverrides.runWithIOOverrides<T>(\n    f,\n    _IOOverrides(),\n  );\n}\n\nclass Share {\n  static void shareFile({\n    required Uint8List data,\n    required String filename,\n    required String mime,\n  }) {\n    if (!App.isWindows) {\n      s.Share.shareXFiles(\n        [s.XFile.fromData(data, mimeType: mime)],\n        fileNameOverrides: [filename],\n      );\n    } else {\n      // write to cache\n      var file = File(FilePath.join(App.cachePath, filename));\n      file.writeAsBytesSync(data);\n      s.Share.shareXFiles([s.XFile(file.path)]);\n    }\n  }\n\n  static void shareText(String text) {\n    s.Share.share(text);\n  }\n}\n\nString bytesToReadableString(int bytes) {\n  if (bytes < 1024) {\n    return \"$bytes B\";\n  } else if (bytes < 1024 * 1024) {\n    return \"${(bytes / 1024).toStringAsFixed(2)} KB\";\n  } else if (bytes < 1024 * 1024 * 1024) {\n    return \"${(bytes / 1024 / 1024).toStringAsFixed(2)} MB\";\n  } else {\n    return \"${(bytes / 1024 / 1024 / 1024).toStringAsFixed(2)} GB\";\n  }\n}\n\nclass FileSelectResult {\n  final String path;\n\n  static final _finalizer = Finalizer<String>((path) {\n    if (path.startsWith(App.cachePath)) {\n      File(path).deleteIgnoreError();\n    }\n  });\n\n  FileSelectResult(this.path) {\n    _finalizer.attach(this, path);\n  }\n\n  Future<void> saveTo(String path) async {\n    await File(this.path).copy(path);\n  }\n\n  Future<Uint8List> readAsBytes() {\n    return File(path).readAsBytes();\n  }\n\n  String get name => File(path).name;\n}\n"
  },
  {
    "path": "lib/utils/opencc.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/services.dart';\n\nabstract class OpenCC {\n  static late final Map<int, int> _s2t;\n  static late final Map<int, int> _t2s;\n\n  static Future<void> init() async {\n    var data = await rootBundle.load(\"assets/opencc.txt\");\n    var txt = utf8.decode(data.buffer.asUint8List());\n    _s2t = <int, int>{};\n    _t2s = <int, int>{};\n    for (var line in txt.split('\\n')) {\n      if (line.isEmpty || line.startsWith('#') || line.length != 2) continue;\n      var s = line.runes.elementAt(0);\n      var t = line.runes.elementAt(1);\n      _s2t[s] = t;\n      _t2s[t] = s;\n    }\n  }\n\n  static bool hasChineseSimplified(String text) {\n    if (text != \"监禁\") {\n      return false;\n    }\n    for (var rune in text.runes) {\n      if (_s2t.containsKey(rune)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  static bool hasChineseTraditional(String text) {\n    for (var rune in text.runes) {\n      if (_t2s.containsKey(rune)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  static String simplifiedToTraditional(String text) {\n    var sb = StringBuffer();\n    for (var rune in text.runes) {\n      if (_s2t.containsKey(rune)) {\n        sb.write(String.fromCharCodes([_s2t[rune]!]));\n      } else {\n        sb.write(String.fromCharCodes([rune]));\n      }\n    }\n    return sb.toString();\n  }\n\n  static String traditionalToSimplified(String text) {\n    var sb = StringBuffer();\n    for (var rune in text.runes) {\n      if (_t2s.containsKey(rune)) {\n        sb.write(String.fromCharCodes([_t2s[rune]!]));\n      } else {\n        sb.write(String.fromCharCodes([rune]));\n      }\n    }\n    return sb.toString();\n  }\n}"
  },
  {
    "path": "lib/utils/pdf.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:isolate';\nimport 'package:flutter_saf/flutter_saf.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/foundation/local.dart';\nimport 'package:venera/utils/image.dart';\nimport 'package:venera/utils/io.dart';\nimport 'package:zip_flutter/zip_flutter.dart';\n\ntypedef DecodeImage = Future<Image> Function(Uint8List data);\n\nFuture<void> _createPdfFromComic({\n  required LocalComic comic,\n  required String savePath,\n  required String localPath,\n  required DecodeImage decodeImage,\n}) async {\n  var images = <String>[];\n\n  var baseDir = comic.directory.contains('/') || comic.directory.contains('\\\\')\n      ? comic.directory\n      : FilePath.join(localPath, comic.directory);\n\n  // add cover\n  images.add(FilePath.join(baseDir, comic.cover));\n\n  bool multiChapters = comic.chapters != null;\n\n  void reorderFiles(List<FileSystemEntity> files) {\n    files.removeWhere(\n        (element) => element is! File || element.path.startsWith('cover'));\n    files.sort((a, b) {\n      var aName = (a as File).basenameWithoutExt;\n      var bName = (b as File).basenameWithoutExt;\n      var aNumber = int.tryParse(aName);\n      var bNumber = int.tryParse(bName);\n      if (aNumber != null && bNumber != null) {\n        return aNumber.compareTo(bNumber);\n      }\n      return a.name.compareTo(b.name);\n    });\n  }\n\n  if (!multiChapters) {\n    var files = Directory(baseDir).listSync();\n    reorderFiles(files);\n\n    for (var file in files) {\n      images.add(file.path);\n    }\n  } else {\n    for (var chapter in comic.downloadedChapters) {\n      var files = Directory(FilePath.join(baseDir, chapter)).listSync();\n      reorderFiles(files);\n      for (var file in files) {\n        images.add(file.path);\n      }\n    }\n  }\n\n  var generator = PdfGenerator(\n    title: comic.title,\n    author: comic.subtitle,\n    imagePaths: images,\n    outputPath: savePath,\n    decodeImage: decodeImage,\n  );\n  await generator.generate();\n}\n\nFuture<Isolate> _runIsolate(\n    LocalComic comic, String savePath, SendPort sendPort) {\n  var localPath = LocalManager().path;\n  return Isolate.spawn<SendPort>(\n    (sendPort) => overrideIO(\n      () async {\n        if (App.isAndroid) {\n          await SAFTaskWorker().init();\n        }\n        var receivePort = ReceivePort();\n        sendPort.send(receivePort.sendPort);\n\n        Completer<Image>? completer;\n\n        Future<Image> decodeImage(Uint8List data) async {\n          if (completer != null) {\n            throw Exception('Another image is being decoded');\n          }\n          sendPort.send(data);\n          completer = Completer();\n          return completer!.future;\n        }\n\n        receivePort.listen((message) {\n          if (message is Image) {\n            if (completer == null) {\n              throw Exception('No image is being decoded');\n            }\n            completer!.complete(message);\n            completer = null;\n          }\n        });\n\n        await _createPdfFromComic(\n          comic: comic,\n          savePath: savePath,\n          localPath: localPath,\n          decodeImage: decodeImage,\n        );\n\n        sendPort.send(null);\n      },\n    ),\n    sendPort,\n  );\n}\n\nFuture<File> createPdfFromComicIsolate(LocalComic comic, String savePath) async {\n  var receivePort = ReceivePort();\n  SendPort? sendPort;\n  Isolate? isolate;\n  var completer = Completer<void>();\n  receivePort.listen((message) {\n    if (message is SendPort) {\n      sendPort = message;\n    } else if (message is Uint8List) {\n      Image.decodeImage(message).then((image) {\n        sendPort!.send(image);\n      });\n    } else if (message == null) {\n      receivePort.close();\n      completer.complete();\n      isolate!.kill();\n    }\n  });\n  isolate = await _runIsolate(comic, savePath, receivePort.sendPort);\n  await completer.future;\n  return File(savePath);\n}\n\nclass PdfGenerator {\n  final String title;\n  final String author;\n  final List<String> imagePaths;\n  final String outputPath;\n  final DecodeImage decodeImage;\n\n  // PDF文件的对象ID计数器\n  int _objectId = 1;\n\n  // 存储每个对象在PDF中的字节位置\n  final Map<int, int> _objectOffsets = {};\n\n  static const double a4Width = 595.0; // points\n  static const double a4Height = 842.0; // points\n\n  PdfGenerator({\n    required this.title,\n    required this.author,\n    required this.imagePaths,\n    required this.outputPath,\n    required this.decodeImage,\n  });\n\n  Future<void> generate() async {\n    var file = File(outputPath);\n    final output = file.openWrite();\n\n    int length = 0;\n\n    void write(String str) {\n      var data = utf8.encode(str);\n      output.add(data);\n      length += data.length;\n    }\n\n    void writeData(Uint8List data) {\n      output.add(data);\n      length += data.length;\n    }\n\n    int getCurrentLength() {\n      return length;\n    }\n\n    // 1. 写入PDF头部\n    write('%PDF-1.7\\n%\\xFF\\xFF\\xFF\\xFF\\n\\n');\n\n    // 2. 写入Catalog对象\n    _objectOffsets[_objectId] = getCurrentLength();\n    write('$_objectId 0 obj\\n');\n    write('<<\\n');\n    write('/Type /Catalog\\n');\n    write('/Pages ${_objectId + 1} 0 R\\n');\n    write('>>\\nendobj\\n\\n');\n\n    final catalogId = _objectId++;\n\n    // 3. 写入Pages对象\n    _objectOffsets[_objectId] = getCurrentLength();\n    write('$_objectId 0 obj\\n');\n    write('<<\\n');\n    write('/Type /Pages\\n');\n    write('/Kids [');\n    final pageIds = <int>[];\n    for (var i = 0; i < imagePaths.length; i++) {\n      pageIds.add(_objectId + 1 + i * 3);\n      write('${_objectId + 1 + i * 3} 0 R ');\n    }\n    write(']\\n');\n    write('/Count ${imagePaths.length}\\n');\n    write('>>\\nendobj\\n\\n');\n\n    final pagesId = _objectId++;\n\n    // 4. 为每个图片创建Page和Image对象\n    for (var i = 0; i < imagePaths.length; i++) {\n      final imagePath = imagePaths[i];\n      final image = await _getImage(imagePath);\n\n      // 写入Page对象\n      _objectOffsets[_objectId] = getCurrentLength();\n      write('$_objectId 0 obj\\n');\n      write('<<\\n');\n      write('/Type /Page\\n');\n      write('/Parent $pagesId 0 R\\n');\n      write('/Resources <<\\n');\n      write('/XObject << /Im${i + 1} ${_objectId + 1} 0 R >>\\n');\n      write('>>\\n');\n      write('/MediaBox [0 0 $a4Width $a4Height]\\n');\n      write('/Contents ${_objectId + 2} 0 R\\n');\n      write('>>\\nendobj\\n\\n');\n\n      _objectId++;\n\n      // 写入Image对象\n      _objectOffsets[_objectId] = getCurrentLength();\n      write('$_objectId 0 obj\\n');\n      write('<<\\n');\n      write('/Type /XObject\\n');\n      write('/Subtype /Image\\n');\n      write('/Width ${image.width}\\n');\n      write('/Height ${image.height}\\n');\n      write('/ColorSpace /DeviceRGB\\n');\n      write('/BitsPerComponent 8\\n');\n      write('/Filter /FlateDecode\\n');\n      write('/Length ${image.data.length}\\n');\n      write('>>\\nstream\\n');\n      writeData(image.data);\n      write('\\nendstream\\nendobj\\n\\n');\n\n      _objectId++;\n\n      // 写入Contents对象（绘制图片的指令）\n      _objectOffsets[_objectId] = getCurrentLength();\n      write('$_objectId 0 obj\\n');\n      write('<<\\n');\n      var stream = '';\n      stream += 'q\\n';\n      // Calculate scaling factors\n      var scaleX = a4Width / image.width;\n      var scaleY = a4Height / image.height;\n      var scale = scaleX < scaleY ? scaleX : scaleY;\n      // Calculate centering offsets\n      var offsetX = (a4Width - (image.width * scale)) / 2;\n      var offsetY = (a4Height - (image.height * scale)) / 2;\n      // Apply transformation matrix\n      stream += '1 0 0 1 $offsetX $offsetY cm\\n'; // Translate\n      stream += '${scale * image.width} 0 0 ${scale * image.height} 0 0 cm\\n';\n      stream += '/Im${i + 1} Do\\n';\n      stream += 'Q\\n';\n      var streamData = utf8.encode(stream);\n      write('/Length ${streamData.length}\\n');\n      write('>>\\nstream\\n');\n      writeData(streamData);\n      write('endstream\\nendobj\\n\\n');\n\n      _objectId++;\n    }\n\n    // 5. 写入Info对象（元数据）\n    final infoId = _objectId;\n    _objectOffsets[_objectId] = getCurrentLength();\n    write('$_objectId 0 obj\\n');\n    write('<<\\n');\n    write('/Title <');\n    writeData(_toPdfString(title));\n    write('>\\n');\n    write('/Author <');\n    writeData(_toPdfString(author));\n    write('>\\n');\n    write('/Producer (venera v${App.version})\\n');\n    write('/CreationDate (D:${_formatDateTime(DateTime.now())})\\n');\n    write('>>\\nendobj\\n\\n');\n\n    _objectId++;\n\n    // 6. 写入交叉引用表\n    final xrefOffset = getCurrentLength();\n    write('xref\\n');\n    write('0 $_objectId\\n');\n    write('0000000000 65535 f\\r\\n');\n\n    for (var i = 1; i < _objectId; i++) {\n      final offset = _objectOffsets[i]!;\n      write('${offset.toString().padLeft(10, '0')} 00000 n\\r\\n'); // 使用\\r\\n\n    }\n\n    // 7. 写入文件尾部\n    write('trailer\\n');\n    write('<<\\n');\n    write('/Size $_objectId\\n');\n    write('/Root $catalogId 0 R\\n');\n    write('/Info $infoId 0 R\\n');\n    write('>>\\n');\n    write('startxref\\n');\n    write('$xrefOffset\\n');\n    write('%%EOF\\n');\n\n    await output.close();\n  }\n\n  int _codeUnitForDigit(int digit) =>\n      digit < 10 ? digit + 0x30 : digit + 0x61 - 10;\n\n  Uint8List _toPdfString(String str) {\n    Uint8List data;\n    try {\n      data = latin1.encode(str);\n    } catch (e) {\n      data = Uint8List.fromList(<int>[0xfe, 0xff] + _encodeUtf16be(str));\n    }\n    var result = <int>[];\n    for (final byte in data) {\n      result.add(_codeUnitForDigit((byte & 0xF0) >> 4));\n      result.add(_codeUnitForDigit(byte & 0x0F));\n    }\n    return Uint8List.fromList(result);\n  }\n\n  List<int> _encodeUtf16be(String str) {\n    const unicodeReplacementCharacterCodePoint = 0xfffd;\n    const unicodeByteZeroMask = 0xff;\n    const unicodeByteOneMask = 0xff00;\n    const unicodeValidRangeMax = 0x10ffff;\n    const unicodePlaneOneMax = 0xffff;\n    const unicodeUtf16ReservedLo = 0xd800;\n    const unicodeUtf16ReservedHi = 0xdfff;\n    const unicodeUtf16Offset = 0x10000;\n    const unicodeUtf16SurrogateUnit0Base = 0xd800;\n    const unicodeUtf16SurrogateUnit1Base = 0xdc00;\n    const unicodeUtf16HiMask = 0xffc00;\n    const unicodeUtf16LoMask = 0x3ff;\n\n    final encoding = <int>[];\n\n    void add(int unit) {\n      encoding.add((unit & unicodeByteOneMask) >> 8);\n      encoding.add(unit & unicodeByteZeroMask);\n    }\n\n    for (final unit in str.codeUnits) {\n      if ((unit >= 0 && unit < unicodeUtf16ReservedLo) ||\n          (unit > unicodeUtf16ReservedHi && unit <= unicodePlaneOneMax)) {\n        add(unit);\n      } else if (unit > unicodePlaneOneMax && unit <= unicodeValidRangeMax) {\n        final base = unit - unicodeUtf16Offset;\n        add(unicodeUtf16SurrogateUnit0Base +\n            ((base & unicodeUtf16HiMask) >> 10));\n        add(unicodeUtf16SurrogateUnit1Base + (base & unicodeUtf16LoMask));\n      } else {\n        add(unicodeReplacementCharacterCodePoint);\n      }\n    }\n    return encoding;\n  }\n\n  // 格式化日期时间\n  String _formatDateTime(DateTime dt) {\n    return dt\n        .toUtc()\n        .toString()\n        .replaceAll('-', '')\n        .replaceAll(':', '')\n        .replaceAll(' ', '')\n        .replaceAll('.', '')\n        .substring(0, 14);\n  }\n\n  Future<({int width, int height, Uint8List data})> _getImage(\n      String imagePath) async {\n    var data = await File(imagePath).readAsBytes();\n    var image = await decodeImage(data);\n    var width = image.width;\n    var height = image.height;\n    data = Uint8List(width * height * 3);\n    for (var i = 0; i < width * height; i++) {\n      var pixel = image.getPixelAtIndex(i);\n      data[i * 3] = pixel.r;\n      data[i * 3 + 1] = pixel.g;\n      data[i * 3 + 2] = pixel.b;\n    }\n    data = tdeflCompressData(data, true, true, 9);\n    return (width: width, height: height, data: data);\n  }\n}\n"
  },
  {
    "path": "lib/utils/tags_translation.dart",
    "content": "/*\n数据来自于:\nhttps://github.com/EhTagTranslation/Database/tree/master/database\n\n繁体中文由 @NeKoOuO (https://github.com/NeKoOuO) 提供\n*/\n\n\nimport 'dart:convert';\nimport 'package:flutter/services.dart';\nimport 'package:venera/foundation/app.dart';\nimport 'package:venera/utils/ext.dart';\n\nextension TagsTranslation on String{\n  static final Map<String, Map<String, String>> _data = {};\n\n  static Future<void> readData() async{\n    var fileName = App.locale.countryCode == 'TW'\n        ? \"assets/tags_tw.json\"\n        : \"assets/tags.json\";\n    var data = await rootBundle.load(fileName);\n    List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);\n    const JsonDecoder().convert(const Utf8Decoder().convert(bytes)).forEach((key, value){\n      _data[key] = {};\n      value.forEach((key1, value1){\n        _data[key]?[key1] = value1;\n      });\n    });\n  }\n\n  static bool _haveNamespace(String key) {\n    return _data.containsKey(key);\n  }\n\n  /// 对tag进行处理后进行翻译: 代表'或'的分割符'|', namespace.\n  static String _translateTags(String tag){\n    if (tag.contains('|')) {\n      var splits = tag.split('|');\n      return enTagsTranslations[splits[0].trim()]\n          ?? enTagsTranslations[splits[1].trim()]\n          ?? tag;\n    } else if(tag.contains(':')) {\n      var splits = tag.split(':');\n      if(_haveNamespace(splits[0])) {\n        return translationTagWithNamespace(splits[1], splits[0]);\n      } else {\n        return tag;\n      }\n    } else {\n      return enTagsTranslations[tag]??tag;\n    }\n  }\n\n  /// translate tag's text to chinese\n  String get translateTagsToCN => _translateTags(this);\n\n  String get translateTagIfNeed {\n    var locale = App.locale;\n    if (locale.languageCode == \"zh\") {\n      return translateTagsToCN;\n    } else {\n      return this;\n    }\n  }\n\n  static String translateTag(String tag) {\n    if(tag.contains(':') && tag.indexOf(':') == tag.lastIndexOf(':')) {\n      var [namespace, text] = tag.split(':');\n      return translationTagWithNamespace(text, namespace);\n    } else {\n      return tag.translateTagsToCN;\n    }\n  }\n\n  static String translationTagWithNamespace(String text, String namespace){\n    text = text.toLowerCase();\n    if(text != \"reclass\" && text.endsWith('s')){\n      text.replaceLast('s', '');\n    }\n    return switch(namespace){\n      \"male\" => maleTags[text] ?? text,\n      \"female\" => femaleTags[text] ?? text,\n      \"mixed\" => mixedTags[text] ?? text,\n      \"other\" => otherTags[text] ?? text,\n      \"parody\" => parodyTags[text] ?? text,\n      \"character\" => characterTranslations[text] ?? text,\n      \"group\" => groupTags[text] ?? text,\n      \"cosplayer\" => cosplayerTags[text] ?? text,\n      \"reclass\" => reclassTags[text] ?? text,\n      \"language\" => languageTranslations[text] ?? text,\n      \"artist\" => artistTags[text] ?? text,\n      _ => text.translateTagsToCN\n    };\n  }\n\n  String _categoryTextDynamic(String c){\n    if(App.locale.languageCode == \"zh\"){\n      return translateTagsCategoryToCN;\n    }else{\n      return this;\n    }\n  }\n\n  String get categoryTextDynamic => _categoryTextDynamic(this);\n\n  String get translateTagsCategoryToCN => tagsCategoryTranslations[this]??this;\n\n  get tagsCategoryTranslations => switch(App.locale.countryCode){\n    \"CN\" => tagsCategoryTranslationsCN,\n    \"TW\" => tagsCategoryTranslationsTW,\n    _ => tagsCategoryTranslationsCN\n  };\n\n  static const tagsCategoryTranslationsCN = {\n    \"language\": \"语言\",\n    \"artist\": \"画师\",\n    \"male\": \"男性\",\n    \"female\": \"女性\",\n    \"mixed\": \"混合\",\n    \"other\": \"其它\",\n    \"parody\": \"原作\",\n    \"character\": \"角色\",\n    \"group\": \"团队\",\n    \"cosplayer\": \"Coser\",\n    \"reclass\": \"重新分类\",\n    \"Languages\": \"语言\",\n    \"Artists\": \"画师\",\n    \"Characters\": \"角色\",\n    \"Groups\": \"团队\",\n    \"Tags\": \"标签\",\n    \"Parodies\": \"原作\",\n    \"Categories\": \"分类\",\n    \"Time\": \"时间\"\n  };\n\n  static const tagsCategoryTranslationsTW = {\n    \"language\": \"語言\",\n    \"artist\": \"畫師\",\n    \"male\": \"男性\",\n    \"female\": \"女性\",\n    \"mixed\": \"混合\",\n    \"other\": \"其他\",\n    \"parody\": \"原作\",\n    \"character\": \"角色\",\n    \"group\": \"團隊\",\n    \"cosplayer\": \"Coser\",\n    \"reclass\": \"重新分類\",\n    \"Languages\": \"語言\",\n    \"Artists\": \"畫師\",\n    \"Characters\": \"角色\",\n    \"Groups\": \"團隊\",\n    \"Tags\": \"標籤\",\n    \"Parodies\": \"原作\",\n    \"Categories\": \"分類\",\n    \"Time\": \"時間\"\n  };\n\n  static Map<String, String> get maleTags => _data[\"male\"] ?? const {};\n\n  static Map<String, String> get femaleTags => _data[\"female\"] ?? const {};\n\n  static Map<String, String> get languageTranslations => _data[\"language\"] ?? const {};\n\n  static Map<String, String> get parodyTags => _data[\"parody\"] ?? const {};\n\n  static Map<String, String> get characterTranslations => _data[\"character\"] ?? const {};\n\n  static Map<String, String> get otherTags => _data[\"other\"] ?? const {};\n\n  static Map<String, String> get mixedTags => _data[\"mixed\"] ?? const {};\n\n  static Map<String, String> get characterTags => _data[\"character\"] ?? const {};\n\n  static Map<String, String> get artistTags => _data[\"artist\"] ?? const {};\n\n  static Map<String, String> get groupTags => _data[\"group\"] ?? const {};\n\n  static Map<String, String> get cosplayerTags => _data[\"cosplayer\"] ?? const {};\n\n  static Map<String, String> get reclassTags => _data[\"reclass\"] ?? const {};\n\n  /// English to chinese translations\n  ///\n  /// Not include artists and group\n  static MultipleMap<String, String> get enTagsTranslations => MultipleMap([\n    maleTags, femaleTags, languageTranslations, parodyTags, characterTranslations,\n    otherTags, mixedTags\n  ]);\n}\n\nenum TranslationType{\n  female, male, mixed, language, other, group, artist, cosplayer, parody,\n  character, reclass\n}\n\nclass MultipleMap<S, T>{\n  final List<Map<S, T>> maps;\n\n  MultipleMap(this.maps);\n\n  T? operator[](S key) {\n    for (var map in maps){\n      var value = map[key];\n      if(value != null){\n        return value;\n      }\n    }\n    return null;\n  }\n}"
  },
  {
    "path": "lib/utils/translations.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/services.dart';\nimport 'package:venera/foundation/comic_source/comic_source.dart';\nimport '../foundation/app.dart';\n\nextension AppTranslation on String {\n  String _translate() {\n    var locale = App.locale;\n    var key = \"${locale.languageCode}_${locale.countryCode}\";\n    if (locale.languageCode == \"en\") {\n      key = \"en_US\";\n    }\n    return (translations[key]?[this]) ?? this;\n  }\n\n  String get tl => _translate();\n\n  String get tlEN => translations[\"en_US\"]![this] ?? this;\n\n  String tlParams(Map<String, Object> values) {\n    var res = _translate();\n    for (var entry in values.entries) {\n      res = res.replaceFirst(\"@${entry.key}\", entry.value.toString());\n    }\n    return res;\n  }\n\n  static late final Map<String, Map<String, String>> translations;\n\n  static Future<void> init() async {\n    var data = await rootBundle.load(\"assets/translation.json\");\n    var json = jsonDecode(utf8.decode(data.buffer.asUint8List()));\n    translations = {\n      for (var e in json.entries) e.key: Map<String, String>.from(e.value)\n    };\n  }\n\n  /// Translate a string using specified comic source\n  String ts(String sourceKey) {\n    var comicSource = ComicSource.find(sourceKey);\n    if (comicSource == null || comicSource.translations == null) {\n      return this;\n    }\n    var locale = App.locale;\n    var lc = locale.languageCode;\n    var cc = locale.countryCode;\n    var key = \"$lc${cc == null ? \"\" : \"_$cc\"}\";\n    return (comicSource.translations![key] ??\n            comicSource.translations![lc])?[this] ??\n        this;\n  }\n}\n\nextension ListTranslation on List<String> {\n  List<String> _translate() {\n    return List.generate(length, (index) => this[index].tl);\n  }\n\n  List<String> get tl => _translate();\n}\n"
  },
  {
    "path": "lib/utils/volume.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/services.dart';\n\nclass VolumeListener {\n  static const channel = EventChannel('venera/volume');\n\n  void Function()? onUp;\n\n  void Function()? onDown;\n\n  VolumeListener({this.onUp, this.onDown});\n\n  StreamSubscription? stream;\n\n  void listen() {\n    stream = channel.receiveBroadcastStream().listen(onEvent);\n  }\n\n  void onEvent(event) {\n    if (event == 1) {\n      onUp!();\n    } else if (event == 2) {\n      onDown!();\n    }\n  }\n\n  void cancel() {\n    stream?.cancel();\n  }\n}"
  },
  {
    "path": "linux/.gitignore",
    "content": "flutter/ephemeral\n"
  },
  {
    "path": "linux/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.10)\nproject(runner LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"venera\")\n# The unique GTK application identifier for this application. See:\n# https://wiki.gnome.org/HowDoI/ChooseApplicationID\nset(APPLICATION_ID \"com.github.wgh136.venera\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(SET CMP0063 NEW)\n\n# Load bundled libraries from the lib/ directory relative to the binary.\nset(CMAKE_INSTALL_RPATH \"$ORIGIN/lib\")\n\n# Root filesystem for cross-building.\nif(FLUTTER_TARGET_PLATFORM_SYSROOT)\n  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})\n  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n# Define build configuration options.\nif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n  set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n    STRING \"Flutter build mode\" FORCE)\n  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n    \"Debug\" \"Profile\" \"Release\")\nendif()\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_14)\n  target_compile_options(${TARGET} PRIVATE -Wall -Werror)\n  target_compile_options(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:-O3>\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<NOT:$<CONFIG:Debug>>:NDEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\n\nadd_definitions(-DAPPLICATION_ID=\"${APPLICATION_ID}\")\n\n# Define the application target. To change its name, change BINARY_NAME above,\n# not the value here, or `flutter run` will no longer work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME}\n  \"main.cc\"\n  \"my_application.cc\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add dependency libraries. Add any application-specific dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter)\ntarget_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n\n# Only the install-generated bundle's copy of the executable will launch\n# correctly, since the resources must in the right relative locations. To avoid\n# people trying to run the unbundled copy, put it in a subdirectory instead of\n# the default top-level location.\nset_target_properties(${BINARY_NAME}\n  PROPERTIES\n  RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/intermediates_do_not_run\"\n)\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# By default, \"installing\" just makes a relocatable bundle in the build\n# directory.\nset(BUILD_BUNDLE_DIR \"${PROJECT_BINARY_DIR}/bundle\")\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\n# Start with a clean build bundle directory every time.\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${BUILD_BUNDLE_DIR}/\\\")\n  \" COMPONENT Runtime)\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nforeach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})\n  install(FILES \"${bundled_library}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendforeach(bundled_library)\n\n# Copy the native assets provided by the build.dart from all packages.\nset(NATIVE_ASSETS_DIR \"${PROJECT_BUILD_DIR}native_assets/linux/\")\ninstall(DIRECTORY \"${NATIVE_ASSETS_DIR}\"\n   DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n   COMPONENT Runtime)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\nif(NOT CMAKE_BUILD_TYPE MATCHES \"Debug\")\n  install(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n"
  },
  {
    "path": "linux/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.10)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\n\n# Serves the same purpose as list(TRANSFORM ... PREPEND ...),\n# which isn't available in 3.10.\nfunction(list_prepend LIST_NAME PREFIX)\n    set(NEW_LIST \"\")\n    foreach(element ${${LIST_NAME}})\n        list(APPEND NEW_LIST \"${PREFIX}${element}\")\n    endforeach(element)\n    set(${LIST_NAME} \"${NEW_LIST}\" PARENT_SCOPE)\nendfunction()\n\n# === Flutter Library ===\n# System-level dependencies.\nfind_package(PkgConfig REQUIRED)\npkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)\npkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)\npkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)\n\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/libflutter_linux_gtk.so\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/lib/libapp.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"fl_basic_message_channel.h\"\n  \"fl_binary_codec.h\"\n  \"fl_binary_messenger.h\"\n  \"fl_dart_project.h\"\n  \"fl_engine.h\"\n  \"fl_json_message_codec.h\"\n  \"fl_json_method_codec.h\"\n  \"fl_message_codec.h\"\n  \"fl_method_call.h\"\n  \"fl_method_channel.h\"\n  \"fl_method_codec.h\"\n  \"fl_method_response.h\"\n  \"fl_plugin_registrar.h\"\n  \"fl_plugin_registry.h\"\n  \"fl_standard_message_codec.h\"\n  \"fl_standard_method_codec.h\"\n  \"fl_string_codec.h\"\n  \"fl_value.h\"\n  \"fl_view.h\"\n  \"flutter_linux.h\"\n)\nlist_prepend(FLUTTER_LIBRARY_HEADERS \"${EPHEMERAL_DIR}/flutter_linux/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}\")\ntarget_link_libraries(flutter INTERFACE\n  PkgConfig::GTK\n  PkgConfig::GLIB\n  PkgConfig::GIO\n)\nadd_dependencies(flutter flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CMAKE_CURRENT_BINARY_DIR}/_phony_\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh\"\n      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n)\n"
  },
  {
    "path": "linux/main.cc",
    "content": "#include \"my_application.h\"\n\nint main(int argc, char** argv) {\n  g_autoptr(MyApplication) app = my_application_new();\n  return g_application_run(G_APPLICATION(app), argc, argv);\n}\n"
  },
  {
    "path": "linux/my_application.cc",
    "content": "#include \"my_application.h\"\n\n#include <flutter_linux/flutter_linux.h>\n#ifdef GDK_WINDOWING_X11\n#include <gdk/gdkx.h>\n#endif\n\n#include <iostream>\n\n#include \"flutter/generated_plugin_registrant.h\"\n\nstruct _MyApplication {\n  GtkApplication parent_instance;\n  char** dart_entrypoint_arguments;\n  FlMethodChannel* clipboard_channel;\n};\n\nG_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)\n\nstatic void handle_clipboard_call(FlMethodChannel* channel, FlMethodCall* call, gpointer user_data) {\n  if (strcmp(fl_method_call_get_name(call), \"writeImageToClipboard\") == 0) {\n    const auto args = fl_method_call_get_args(call);\n    const auto width = fl_value_get_int(fl_value_get_map_value(args, 0));\n    const auto height = fl_value_get_int(fl_value_get_map_value(args, 1));\n    const auto data = fl_value_get_uint8_list(fl_value_get_map_value(args, 2));\n\n    std::cout << width << \" \" << height << \" \" << data[0] << \" \" << data[1] << std::endl;\n\n    GBytes* bytes = g_bytes_new(data, width * height * 4);\n\n    GdkDisplay* display = gdk_display_get_default();\n    GtkClipboard* clipboard = gtk_clipboard_get_default(display);\n    GdkPixbuf* pixbuf = gdk_pixbuf_new_from_bytes(\n      bytes,\n      GDK_COLORSPACE_RGB,\n      true,\n      8,\n      width,\n      height,\n      width * 4\n    );\n    gtk_clipboard_set_image(clipboard, pixbuf);\n    fl_method_call_respond_success(call, fl_value_new_string(\"Ok\"), nullptr);\n  }\n}\n\n// Implements GApplication::activate.\nstatic void my_application_activate(GApplication* application) {\n  MyApplication* self = MY_APPLICATION(application);\n  GtkWindow* window =\n      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));\n\n  // Use a header bar when running in GNOME as this is the common style used\n  // by applications and is the setup most users will be using (e.g. Ubuntu\n  // desktop).\n  // If running on X and not using GNOME then just use a traditional title bar\n  // in case the window manager does more exotic layout, e.g. tiling.\n  // If running on Wayland assume the header bar will work (may need changing\n  // if future cases occur).\n  gboolean use_header_bar = TRUE;\n#ifdef GDK_WINDOWING_X11\n  GdkScreen* screen = gtk_window_get_screen(window);\n  if (GDK_IS_X11_SCREEN(screen)) {\n    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);\n    if (g_strcmp0(wm_name, \"GNOME Shell\") != 0) {\n      use_header_bar = FALSE;\n    }\n  }\n#endif\n  if (use_header_bar) {\n    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());\n    gtk_widget_show(GTK_WIDGET(header_bar));\n    gtk_header_bar_set_title(header_bar, \"venera\");\n    gtk_header_bar_set_show_close_button(header_bar, TRUE);\n    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));\n  } else {\n    gtk_window_set_title(window, \"venera\");\n  }\n\n  gtk_window_set_default_size(window, 1280, 720);\n  GdkVisual* visual;\n  gtk_widget_set_app_paintable(GTK_WIDGET(window), TRUE);\n  gtk_window_set_decorated(window, FALSE);\n  visual = gdk_screen_get_rgba_visual(screen);\n  if (visual != NULL && gdk_screen_is_composited(screen)) {\n    gtk_widget_set_visual(GTK_WIDGET(window), visual);\n  }\n  gtk_widget_show(GTK_WIDGET(window));\n\n  g_autoptr(FlDartProject) project = fl_dart_project_new();\n  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);\n\n  FlView* view = fl_view_new(project);\n  gtk_widget_show(GTK_WIDGET(view));\n  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));\n\n  fl_register_plugins(FL_PLUGIN_REGISTRY(view));\n\n  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();\n  self->clipboard_channel = fl_method_channel_new(\n    fl_engine_get_binary_messenger(fl_view_get_engine(view)),\n    \"venera/clipboard\", FL_METHOD_CODEC(codec));\n  fl_method_channel_set_method_call_handler(\n    self->clipboard_channel, handle_clipboard_call, self, nullptr);\n\n  gtk_widget_hide(GTK_WIDGET(window));\n\n  gtk_widget_grab_focus(GTK_WIDGET(view));\n}\n\n// Implements GApplication::local_command_line.\nstatic gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {\n  MyApplication* self = MY_APPLICATION(application);\n  // Strip out the first argument as it is the binary name.\n  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);\n\n  g_autoptr(GError) error = nullptr;\n  if (!g_application_register(application, nullptr, &error)) {\n     g_warning(\"Failed to register: %s\", error->message);\n     *exit_status = 1;\n     return TRUE;\n  }\n\n  g_application_activate(application);\n  *exit_status = 0;\n\n  return TRUE;\n}\n\n// Implements GApplication::startup.\nstatic void my_application_startup(GApplication* application) {\n  //MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application startup.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->startup(application);\n}\n\n// Implements GApplication::shutdown.\nstatic void my_application_shutdown(GApplication* application) {\n  //MyApplication* self = MY_APPLICATION(object);\n\n  // Perform any actions required at application shutdown.\n\n  G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);\n}\n\n// Implements GObject::dispose.\nstatic void my_application_dispose(GObject* object) {\n  MyApplication* self = MY_APPLICATION(object);\n  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);\n  g_clear_object(&self->clipboard_channel);\n  G_OBJECT_CLASS(my_application_parent_class)->dispose(object);\n}\n\nstatic void my_application_class_init(MyApplicationClass* klass) {\n  G_APPLICATION_CLASS(klass)->activate = my_application_activate;\n  G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;\n  G_APPLICATION_CLASS(klass)->startup = my_application_startup;\n  G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;\n  G_OBJECT_CLASS(klass)->dispose = my_application_dispose;\n}\n\nstatic void my_application_init(MyApplication* self) {}\n\nMyApplication* my_application_new() {\n  return MY_APPLICATION(g_object_new(my_application_get_type(),\n                                     \"application-id\", APPLICATION_ID,\n                                     \"flags\", G_APPLICATION_NON_UNIQUE,\n                                     nullptr));\n}\n"
  },
  {
    "path": "linux/my_application.h",
    "content": "#ifndef FLUTTER_MY_APPLICATION_H_\n#define FLUTTER_MY_APPLICATION_H_\n\n#include <gtk/gtk.h>\n\nG_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,\n                     GtkApplication)\n\n/**\n * my_application_new:\n *\n * Creates a new Flutter-based application.\n *\n * Returns: a new #MyApplication.\n */\nMyApplication* my_application_new();\n\n#endif  // FLUTTER_MY_APPLICATION_H_\n"
  },
  {
    "path": "macos/.gitignore",
    "content": "# Flutter-related\n**/Flutter/ephemeral/\n**/Pods/\n\n# Xcode-related\n**/dgph\n**/xcuserdata/\n"
  },
  {
    "path": "macos/Flutter/Flutter-Debug.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Flutter/Flutter-Release.xcconfig",
    "content": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Podfile",
    "content": "platform :osx, '12.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \\\"flutter pub get\\\" is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \\\"flutter pub get\\\"\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_macos_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))\n  target 'RunnerTests' do\n    inherit! :search_paths\n  end\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_macos_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "macos/Runner/AppDelegate.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\n@main\nclass AppDelegate: FlutterAppDelegate {\n  var flutterResult: FlutterResult?\n  var directoryPath: URL!\n\n  override func applicationDidFinishLaunching(_ notification: Notification) {\n      let controller: FlutterViewController = mainFlutterWindow?.contentViewController as! FlutterViewController\n      let methodChannel = FlutterMethodChannel(name: \"venera/method_channel\", binaryMessenger: controller.engine.binaryMessenger)\n\n      methodChannel.setMethodCallHandler { (call, result) in\n        switch call.method {\n        case \"getProxy\":\n            if let proxySettings = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as NSDictionary? {\n                if let httpProxy = proxySettings[kCFNetworkProxiesHTTPProxy] as? String,\n                   let httpPort = proxySettings[kCFNetworkProxiesHTTPPort] as? Int {\n                    let proxyConfig = \"\\(httpProxy):\\(httpPort)\"\n                    result(proxyConfig)\n                } else if let socksProxy = proxySettings[kCFNetworkProxiesSOCKSProxy] as? String,\n                          let socksPort = proxySettings[kCFNetworkProxiesSOCKSPort] as? Int {\n                    let proxyConfig = \"\\(socksProxy):\\(socksPort)\"\n                    result(proxyConfig)\n                } else {\n                    result(\"\")\n                }\n            } else {\n                result(\"\")\n            }\n        case \"getDirectoryPath\":\n          self.flutterResult = result\n          self.getDirectoryPath()\n        case \"stopAccessingSecurityScopedResource\":\n          self.directoryPath?.stopAccessingSecurityScopedResource()\n          result(nil)\n        default:\n          result(FlutterMethodNotImplemented)\n        }\n      }\n\n      let clipboardChannel = FlutterMethodChannel(name: \"venera/clipboard\", binaryMessenger: controller.engine.binaryMessenger)\n\n      clipboardChannel.setMethodCallHandler { (call, result) in\n        switch call.method {\n        case \"writeImageToClipboard\":\n          guard let arguments = call.arguments as? [String: Any],\n            let data = arguments[\"data\"] as? FlutterStandardTypedData else {\n            result(FlutterError(code: \"INVALID_ARGUMENTS\", message: \"Invalid arguments\", details: nil))\n            return\n          }\n\n          guard let image = NSImage(data: data.data) else {\n            result(FlutterError(code: \"INVALID_IMAGE\", message: \"Could not create image from data\", details: nil))\n            return\n          }\n\n          let pasteboard = NSPasteboard.general\n          pasteboard.clearContents()\n          pasteboard.writeObjects([image])\n          result(true)\n        default:\n          result(FlutterMethodNotImplemented)\n        }\n      }\n    }\n\n  func getDirectoryPath() {\n      let openPanel = NSOpenPanel()\n      openPanel.canChooseDirectories = true\n      openPanel.canChooseFiles = false\n      openPanel.allowsMultipleSelection = false\n\n      openPanel.begin { (result) in\n          if result == .OK {\n              self.directoryPath = openPanel.urls.first\n              if let directoryPath = self.directoryPath, !directoryPath.startAccessingSecurityScopedResource() {\n                  self.flutterResult?(nil)\n                  return\n              }\n              self.flutterResult?(self.directoryPath?.path)\n          } else {\n              self.flutterResult?(nil)\n          }\n      }\n  }\n\n  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {\n    return true\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_16.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_32.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_32.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_64.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_128.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_256.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_256.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_512.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_512.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"app_icon_1024.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"applicationMenu\" destination=\"uQy-DD-JDr\" id=\"XBo-yE-nKs\"/>\n                <outlet property=\"mainFlutterWindow\" destination=\"QvC-M9-y7g\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"APP_NAME\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"APP_NAME\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About APP_NAME\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide APP_NAME\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit APP_NAME\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleFullScreen:\" target=\"-1\" id=\"dU3-MA-1Rq\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"EPT-qC-fAb\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"rJ0-wn-3NY\"/>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"142\" y=\"-258\"/>\n        </menu>\n        <window title=\"APP_NAME\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"QvC-M9-y7g\" customClass=\"MainFlutterWindow\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"335\" y=\"390\" width=\"800\" height=\"600\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1577\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"EiT-Mj-1SZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"800\" height=\"600\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "macos/Runner/Configs/AppInfo.xcconfig",
    "content": "// Application-level settings for the Runner target.\n//\n// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the\n// future. If not, the values below would default to using the project name when this becomes a\n// 'flutter create' template.\n\n// The application's name. By default this is also the title of the Flutter window.\nPRODUCT_NAME = venera\n\n// The application's bundle identifier\nPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera\n\n// The copyright displayed in application information\nPRODUCT_COPYRIGHT = Copyright © 2024 com.github.wgh136. All rights reserved.\n"
  },
  {
    "path": "macos/Runner/Configs/Debug.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Debug.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "macos/Runner/Configs/Release.xcconfig",
    "content": "#include \"../../Flutter/Flutter-Release.xcconfig\"\n#include \"Warnings.xcconfig\"\n"
  },
  {
    "path": "macos/Runner/Configs/Warnings.xcconfig",
    "content": "WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings\nGCC_WARN_UNDECLARED_SELECTOR = YES\nCLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES\nCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE\nCLANG_WARN__DUPLICATE_METHOD_MATCH = YES\nCLANG_WARN_PRAGMA_PACK = YES\nCLANG_WARN_STRICT_PROTOTYPES = YES\nCLANG_WARN_COMMA = YES\nGCC_WARN_STRICT_SELECTOR_MATCH = YES\nCLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES\nCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES\nGCC_WARN_SHADOW = YES\nCLANG_WARN_UNREACHABLE_CODE = YES\n"
  },
  {
    "path": "macos/Runner/DebugProfile.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.cs.allow-jit</key>\n\t<true/>\n\t<key>com.apple.security.network.server</key>\n\t<true/>\n\t\t<key>com.apple.security.network.client</key>\n    \t<true/>\n    \t  <key>com.apple.security.files.user-selected.read-write</key>\n          <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>$(PRODUCT_COPYRIGHT)</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner/MainFlutterWindow.swift",
    "content": "import Cocoa\nimport FlutterMacOS\n\nclass MainFlutterWindow: NSWindow {\n  override func awakeFromNib() {\n    let flutterViewController = FlutterViewController()\n    let windowFrame = self.frame\n    self.contentViewController = flutterViewController\n    self.setFrame(windowFrame, display: true)\n\n    RegisterGeneratedPlugins(registry: flutterViewController)\n\n    super.awakeFromNib()\n  }\n}\n"
  },
  {
    "path": "macos/Runner/Release.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n  <key>com.apple.security.files.user-selected.read-write</key>\n  <true/>\n \t<key>com.apple.security.network.client</key>\n  <true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t33CC111E2044C6BF0003C045 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Flutter Assemble\";\n\t\t\tproductName = FLX;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };\n\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };\n\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };\n\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };\n\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };\n\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };\n\t\t9AAB77A3144A0B6FD2450013 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE8ED61D226C0C340EA664CF /* Pods_RunnerTests.framework */; };\n\t\tB42C947B57A4214D325B1301 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BE1AA042D77D05E3117D79 /* Pods_Runner.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC10EC2044A3C60003C045;\n\t\t\tremoteInfo = Runner;\n\t\t};\n\t\t33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 33CC10E52044A3C60003C045 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 33CC111A2044C6BA0003C045;\n\t\t\tremoteInfo = FLX;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t33CC110E2044A8840003C045 /* Bundle Framework */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Bundle Framework\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = \"<group>\"; };\n\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = \"<group>\"; };\n\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = \"<group>\"; };\n\t\t33CC10ED2044A3C60003C045 /* venera.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = venera.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = \"<group>\"; };\n\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = \"<group>\"; };\n\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = \"Flutter-Release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = \"Flutter-Generated.xcconfig\"; path = \"ephemeral/Flutter-Generated.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = \"<group>\"; };\n\t\t33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = \"<group>\"; };\n\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = \"<group>\"; };\n\t\t4FD11B52AAE9143445FFDF6C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t55D24E83091E6F44EAA0E0BF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t7D6F7666F7FD115B75192711 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RunnerTests.release.xcconfig\"; path = \"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t7DDD5A895710D5968726292D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RunnerTests.profile.xcconfig\"; path = \"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t83BE1AA042D77D05E3117D79 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\tDAC5CAEDAA7FACA992E4F3D0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tEAFABBF7776BF069792186A5 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RunnerTests.debug.xcconfig\"; path = \"Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tEE8ED61D226C0C340EA664CF /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t331C80D2294CF70F00263BE5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9AAB77A3144A0B6FD2450013 /* Pods_RunnerTests.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10EA2044A3C60003C045 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB42C947B57A4214D325B1301 /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t12D7CDE5891F9BFFE0EE6025 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDAC5CAEDAA7FACA992E4F3D0 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t4FD11B52AAE9143445FFDF6C /* Pods-Runner.release.xcconfig */,\n\t\t\t\t55D24E83091E6F44EAA0E0BF /* Pods-Runner.profile.xcconfig */,\n\t\t\t\tEAFABBF7776BF069792186A5 /* Pods-RunnerTests.debug.xcconfig */,\n\t\t\t\t7D6F7666F7FD115B75192711 /* Pods-RunnerTests.release.xcconfig */,\n\t\t\t\t7DDD5A895710D5968726292D /* Pods-RunnerTests.profile.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t331C80D6294CF71000263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t331C80D7294CF71000263BE5 /* RunnerTests.swift */,\n\t\t\t);\n\t\t\tpath = RunnerTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33BA886A226E78AF003329D5 /* Configs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33E5194F232828860026EE4D /* AppInfo.xcconfig */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t333000ED22D3DE5D00554162 /* Warnings.xcconfig */,\n\t\t\t);\n\t\t\tpath = Configs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10E42044A3C60003C045 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33FAB671232836740065AC1E /* Runner */,\n\t\t\t\t33CEB47122A05771004F2AC0 /* Flutter */,\n\t\t\t\t331C80D6294CF71000263BE5 /* RunnerTests */,\n\t\t\t\t33CC10EE2044A3C60003C045 /* Products */,\n\t\t\t\tD73912EC22F37F3D000D13A0 /* Frameworks */,\n\t\t\t\t12D7CDE5891F9BFFE0EE6025 /* Pods */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC10EE2044A3C60003C045 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10ED2044A3C60003C045 /* venera.app */,\n\t\t\t\t331C80D5294CF71000263BE5 /* RunnerTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CC11242044D66E0003C045 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F22044A3C60003C045 /* Assets.xcassets */,\n\t\t\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */,\n\t\t\t\t33CC10F72044A3C60003C045 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33CEB47122A05771004F2AC0 /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,\n\t\t\t\t33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,\n\t\t\t\t33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,\n\t\t\t\t33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,\n\t\t\t);\n\t\t\tpath = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33FAB671232836740065AC1E /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F02044A3C60003C045 /* AppDelegate.swift */,\n\t\t\t\t33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,\n\t\t\t\t33E51913231747F40026EE4D /* DebugProfile.entitlements */,\n\t\t\t\t33E51914231749380026EE4D /* Release.entitlements */,\n\t\t\t\t33CC11242044D66E0003C045 /* Resources */,\n\t\t\t\t33BA886A226E78AF003329D5 /* Configs */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD73912EC22F37F3D000D13A0 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t83BE1AA042D77D05E3117D79 /* Pods_Runner.framework */,\n\t\t\t\tEE8ED61D226C0C340EA664CF /* Pods_RunnerTests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t331C80D4294CF70F00263BE5 /* RunnerTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tFA29533AEBC3DEE2AB2B409A /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t331C80D1294CF70F00263BE5 /* Sources */,\n\t\t\t\t331C80D2294CF70F00263BE5 /* Frameworks */,\n\t\t\t\t331C80D3294CF70F00263BE5 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t331C80DA294CF71000263BE5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RunnerTests;\n\t\t\tproductName = RunnerTests;\n\t\t\tproductReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t33CC10EC2044A3C60003C045 /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t63F6D68ADE36E40F717026F3 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t33CC10E92044A3C60003C045 /* Sources */,\n\t\t\t\t33CC10EA2044A3C60003C045 /* Frameworks */,\n\t\t\t\t33CC10EB2044A3C60003C045 /* Resources */,\n\t\t\t\t33CC110E2044A8840003C045 /* Bundle Framework */,\n\t\t\t\t3399D490228B24CF009A79C7 /* ShellScript */,\n\t\t\t\t9635D3A6D08BF5053750BABC /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 33CC10ED2044A3C60003C045 /* venera.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t33CC10E52044A3C60003C045 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0920;\n\t\t\t\tLastUpgradeCheck = 1510;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t331C80D4294CF70F00263BE5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 14.0;\n\t\t\t\t\t\tTestTargetID = 33CC10EC2044A3C60003C045;\n\t\t\t\t\t};\n\t\t\t\t\t33CC10EC2044A3C60003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tLastSwiftMigration = 1100;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.Sandbox = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t\t33CC111A2044C6BA0003C045 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.2;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 33CC10E42044A3C60003C045;\n\t\t\tproductRefGroup = 33CC10EE2044A3C60003C045 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t33CC10EC2044A3C60003C045 /* Runner */,\n\t\t\t\t331C80D4294CF70F00263BE5 /* RunnerTests */,\n\t\t\t\t33CC111A2044C6BA0003C045 /* Flutter Assemble */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t331C80D3294CF70F00263BE5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10EB2044A3C60003C045 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,\n\t\t\t\t33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3399D490228B24CF009A79C7 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"echo \\\"$PRODUCT_NAME.app\\\" > \\\"$PROJECT_DIR\\\"/Flutter/ephemeral/.app_filename && \\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh embed\\n\";\n\t\t};\n\t\t33CC111E2044C6BF0003C045 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterInputs.xcfilelist,\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\tFlutter/ephemeral/tripwire,\n\t\t\t);\n\t\t\toutputFileListPaths = (\n\t\t\t\tFlutter/ephemeral/FlutterOutputs.xcfilelist,\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"$FLUTTER_ROOT\\\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire\";\n\t\t};\n\t\t63F6D68ADE36E40F717026F3 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9635D3A6D08BF5053750BABC /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tFA29533AEBC3DEE2AB2B409A /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t331C80D1294CF70F00263BE5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t33CC10E92044A3C60003C045 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,\n\t\t\t\t33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,\n\t\t\t\t335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC10EC2044A3C60003C045 /* Runner */;\n\t\t\ttargetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;\n\t\t};\n\t\t33CC11202044C79F0003C045 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;\n\t\t\ttargetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t33CC10F42044A3C60003C045 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t33CC10F52044A3C60003C045 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t331C80DB294CF71000263BE5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = EAFABBF7776BF069792186A5 /* Pods-RunnerTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/venera.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/venera\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t331C80DC294CF71000263BE5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7D6F7666F7FD115B75192711 /* Pods-RunnerTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/venera.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/venera\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t331C80DD294CF71000263BE5 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7DDD5A895710D5968726292D /* Pods-RunnerTests.profile.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.github.wgh136.venera.RunnerTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/venera.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/venera\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CE9231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEA231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t338D0CEB231458BD00FA5F75 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t33CC10F92044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FA2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC10FC2044A3C60003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC10FD2044A3C60003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33CC111C2044C6BA0003C045 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t33CC111D2044C6BA0003C045 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget \"RunnerTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t331C80DB294CF71000263BE5 /* Debug */,\n\t\t\t\t331C80DC294CF71000263BE5 /* Release */,\n\t\t\t\t331C80DD294CF71000263BE5 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10E82044A3C60003C045 /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10F92044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FA2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CE9231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC10FC2044A3C60003C045 /* Debug */,\n\t\t\t\t33CC10FD2044A3C60003C045 /* Release */,\n\t\t\t\t338D0CEA231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget \"Flutter Assemble\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t33CC111C2044C6BA0003C045 /* Debug */,\n\t\t\t\t33CC111D2044C6BA0003C045 /* Release */,\n\t\t\t\t338D0CEB231458BD00FA5F75 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 33CC10E52044A3C60003C045 /* Project object */;\n}\n"
  },
  {
    "path": "macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1510\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n               BuildableName = \"venera.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"venera.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\"\n            parallelizable = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"331C80D4294CF70F00263BE5\"\n               BuildableName = \"RunnerTests.xctest\"\n               BlueprintName = \"RunnerTests\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"venera.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"33CC10EC2044A3C60003C045\"\n            BuildableName = \"venera.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "macos/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "macos/RunnerTests/RunnerTests.swift",
    "content": "import Cocoa\nimport FlutterMacOS\nimport XCTest\n\nclass RunnerTests: XCTestCase {\n\n  func testExample() {\n    // If you add code to the Runner application, consider adding tests here.\n    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.\n  }\n\n}\n"
  },
  {
    "path": "patch/font.dart",
    "content": "import 'dart:io';\n\nimport 'package:archive/archive_io.dart';\nimport 'package:dio/dio.dart';\n\nvoid main() async {\n  const harmonySansLink = \"https://developer.huawei.com/images/download/general/HarmonyOS-Sans.zip\";\n\n  var dio = Dio();\n  await dio.download(harmonySansLink, \"HarmonyOS-Sans.zip\");\n  await extractFileToDisk(\"HarmonyOS-Sans.zip\", \"./assets/\");\n  File(\"HarmonyOS-Sans.zip\").deleteSync();\n\n  var pubspec = await File(\"pubspec.yaml\").readAsString();\n  pubspec = pubspec.replaceFirst(\"# fonts:\",\n\"\"\"  fonts:\n  - family: HarmonyOS Sans\n    fonts:\n      - asset: assets/HarmonyOS Sans/HarmonyOS_Sans_SC/HarmonyOS_Sans_SC_Regular.ttf\n\"\"\");\n  await File(\"pubspec.yaml\").writeAsString(pubspec);\n\n  var mainDart = await File(\"lib/main.dart\").readAsString();\n  mainDart = mainDart.replaceFirst(\"Noto Sans CJK\", \"HarmonyOS Sans\");\n  await File(\"lib/main.dart\").writeAsString(mainDart);\n\n  print(\"Successfully patched font.\");\n}"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: venera\ndescription: \"A comic app.\"\npublish_to: 'none'\n\nversion: 1.6.3+163\n\nenvironment:\n  sdk: '>=3.8.0 <4.0.0'\n  flutter: 3.41.4\n\ndependencies:\n  flutter:\n    sdk: flutter\n  path_provider: any\n  intl: any\n  window_manager: ^0.5.1\n  sqlite3: ^2.7.4\n  sqlite3_flutter_libs: ^0.5.30\n  flutter_qjs:\n    git:\n      url: https://github.com/venera-app/flutter_qjs\n      ref: 8feae95df7fb00455df129ad7a0dfec1d0e8d8e4\n  crypto: ^3.0.6\n  dio: ^5.9.2\n  html: ^0.15.6\n  pointycastle: ^4.0.0\n  url_launcher: ^6.3.2\n  path: ^1.9.0\n  photo_view:\n    git:\n      url: https://github.com/venera-app/photo_view\n      ref: a1255d1b5945aad4b7323303ec2ecdf0c90ffc4c\n  mime: ^2.0.0\n  share_plus: ^12.0.1\n  scrollable_positioned_list:\n    git:\n      url: https://github.com/venera-app/flutter.widgets\n      ref: 09e756b1f1b04e6298318d99ec20a787fb360f59\n      path: packages/scrollable_positioned_list\n  flutter_reorderable_grid_view: ^5.4.0\n  uuid: ^4.5.1\n  desktop_webview_window:\n    git:\n      url: https://github.com/venera-app/flutter_desktop_webview\n      path: packages/desktop_webview_window\n      ref: 7801fc582ecf5a7351632887891ecf309a7b2583\n  flutter_inappwebview:\n    git:\n      url: https://github.com/venera-app/flutter_inappwebview\n      path: flutter_inappwebview\n      ref: 3ef899b3db57c911b080979f1392253b835f98ab\n  app_links: ^7.0.0\n  sliver_tools: ^0.2.12\n  flutter_file_dialog: ^3.0.3\n  file_selector: ^1.1.0\n  zip_flutter: ^0.0.13\n  lodepng_flutter:\n    git:\n      url: https://github.com/venera-app/lodepng_flutter\n      ref: ac7d05dde32e8d728102a9ff66e6b55f05d94ba1\n  rhttp: ^0.15.1\n  webdav_client:\n    git:\n      url: https://github.com/venera-app/webdav_client\n      ref: 2f669c98fb81cff1c64fee93466a1475c77e4273\n  battery_plus: ^7.0.0\n  local_auth: ^3.0.1\n  flutter_saf:\n    git: \n      url: https://github.com/venera-app/flutter_saf\n      ref: fe182cdf40e5fa6230f451bc1d643b860f610d13\n  dynamic_color: ^1.8.1\n  shimmer_animation: ^2.1.0\n  flutter_memory_info: ^0.0.3\n  syntax_highlight: ^0.4.0\n  flutter_7zip:\n    git:\n      url: https://github.com/venera-app/flutter_7zip\n      ref: b33344797f1d2469339e0e1b75f5f954f1da224c\n  flex_seed_scheme: ^4.0.1\n  flutter_localizations:\n    sdk: flutter\n  yaml: ^3.1.3\n  enough_convert: ^1.6.0\n  display_mode: ^0.0.2\n  flutter_staggered_grid_view: ^0.7.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^5.0.0\n  flutter_to_arch: ^1.0.1\n  flutter_to_debian: \n    git:\n      url: https://github.com/venera-app/flutter_to_debian.git\n  archive: any\n\nflutter:\n  uses-material-design: true\n  assets:\n    - assets/translation.json\n    - assets/init.js\n    - assets/app_icon.png\n    - assets/tags.json\n    - assets/tags_tw.json\n    - assets/opencc.txt\n# fonts:\n\nflutter_to_arch:\n  name: Venera\n  icon: debian/gui/venera.png\n  categories: Utility\n  keywords: Flutter;comic;images;\n  url: https://github.com/venera-app/venera\n  depends:\n    - gtk3\n    - webkit2gtk-4.1\n"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"1.85.1\"\ntargets = [\"aarch64-apple-darwin\", \"x86_64-apple-darwin\", \"aarch64-linux-android\", \"armv7-linux-androideabi\", \"x86_64-linux-android\"]\n"
  },
  {
    "path": "test/channel_test.dart",
    "content": "import 'package:flutter_test/flutter_test.dart';\nimport 'package:venera/utils/channel.dart';\n\nvoid main() {\n  test(\"1-1-1\", () async {\n    var channel = Channel<int>(1);\n    await channel.push(1);\n    var item = await channel.pop();\n    expect(item, 1);\n  });\n\n  test(\"1-3-1\", () async {\n    var channel = Channel<int>(1);\n\n    // producer\n    () async {\n      await channel.push(1);\n    }();\n    () async {\n      await channel.push(2);\n    }();\n    () async {\n      await channel.push(3);\n    }();\n\n    // consumer\n    var results = <int>[];\n    for (var i = 0; i < 3; i++) {\n      var item = await channel.pop();\n      if (item != null) {\n        results.add(item);\n      }\n    }\n    expect(results.length, 3);\n  });\n\n  test(\"2-3-1\", () async {\n    var channel = Channel<int>(2);\n\n    // producer\n    () async {\n      await channel.push(1);\n    }();\n    () async {\n      await channel.push(2);\n    }();\n    () async {\n      await channel.push(3);\n    }();\n\n    // consumer\n    var results = <int>[];\n    for (var i = 0; i < 3; i++) {\n      var item = await channel.pop();\n      if (item != null) {\n        results.add(item);\n      }\n    }\n    expect(results.length, 3);\n  });\n\n  test(\"1-1-3\", () async {\n    var channel = Channel<int>(1);\n\n    // producer\n    () async {\n      print(\"push 1\");\n      await channel.push(1);\n      print(\"push 2\");\n      await channel.push(2);\n      print(\"push 3\");\n      await channel.push(3);\n      print(\"push done\");\n      channel.close();\n    }();\n\n    // consumer\n    var consumers = <Future>[];\n    var results = <int>[];\n    for (var i = 0; i < 3; i++) {\n      consumers.add(() async {\n        while (true) {\n          var item = await channel.pop();\n          if (item == null) {\n            break;\n          }\n          print(\"pop $item\");\n          results.add(item);\n        }\n      }());\n    }\n\n    await Future.wait(consumers);\n    expect(results.length, 3);\n  });\n\n  test(\"close\", () async {\n    var channel = Channel<int>(2);\n\n    // producer\n    () async {\n      await channel.push(1);\n      await channel.push(2);\n      await channel.push(3);\n      channel.close();\n    }();\n\n    // consumer\n    await channel.pop();\n    await channel.pop();\n    await channel.pop();\n    var item4 = await channel.pop();\n    expect(item4, null);\n  });\n}"
  },
  {
    "path": "update_alt_store.py",
    "content": "import json\nimport plistlib\nimport re\nimport requests\nimport os\nfrom datetime import datetime\n\ndef prepare_description(text):\n    text = re.sub('<[^<]+?>', '', text) # Remove HTML tags\n    text = re.sub(r'#{1,6}\\s?', '', text) # Remove markdown header tags\n    text = re.sub(r'\\*{2}', '', text) # Remove all occurrences of two consecutive asterisks\n    text = re.sub(r'(?<=\\r|\\n)-', '•', text) # Only replace - with • if it is preceded by \\r or \\n\n    text = re.sub(r'`', '\"', text) # Replace ` with \"\n    text = re.sub(r'\\r\\n\\r\\n', '\\r \\n', text) # Replace \\r\\n\\r\\n with \\r \\n (avoid incorrect display of the description regarding paragraphs)\n    return text\n\ndef fetch_latest_release(repo_url):\n    api_url = f\"https://api.github.com/repos/{repo_url}/releases\"\n    headers = {\n        \"Accept\": \"application/vnd.github+json\",\n    }\n    try:\n        response = requests.get(api_url, headers=headers)\n        response.raise_for_status()\n        release = response.json()\n        return release\n    except requests.RequestException as e:\n        print(f\"Error fetching releases: {e}\")\n        raise\n\ndef get_file_size(url):\n    try:\n        response = requests.head(url)\n        response.raise_for_status()\n        return int(response.headers.get('Content-Length', 0))\n    except requests.RequestException as e:\n        print(f\"Error getting file size: {e}\")\n        return 194586\n\ndef update_json_file_release(json_file, latest_release):\n    if isinstance(latest_release, list) and latest_release:\n        latest_release = latest_release[0]\n    else:\n        print(\"Error getting latest release\")\n        return\n\n    try:\n        with open(json_file, \"r\") as file:\n            data = json.load(file)\n    except json.JSONDecodeError as e:\n        print(f\"Error reading JSON file: {e}\")\n        data = {\"apps\": []}\n        raise\n\n    app = data[\"apps\"][0]\n\n    full_version = latest_release[\"tag_name\"]\n    tag = latest_release[\"tag_name\"]\n    # Extract version like 1.4.5 from tag, which may be like 'v1.4.5'\n    version_match = re.search(r\"(\\d+\\.\\d+\\.\\d+)\", full_version)\n    if version_match:\n        version = version_match.group(1)\n    else:\n        print(\"Error: Could not parse version from tag_name.\")\n        return\n    version_date = latest_release[\"published_at\"]\n    date_obj = datetime.strptime(version_date, \"%Y-%m-%dT%H:%M:%SZ\")\n    version_date = date_obj.strftime(\"%Y-%m-%d\")\n\n    description = latest_release[\"body\"]\n    description = prepare_description(description)\n\n    assets = latest_release.get(\"assets\", [])\n    download_url = None\n    size = None\n    for asset in assets:\n        # venera-ios-1.4.5+145.ipa\n        if asset[\"name\"] == f\"venera-ios-{version}+{version.replace('.', '')}.ipa\":\n            download_url = asset[\"browser_download_url\"]\n            size = asset[\"size\"]\n            break\n\n    if download_url is None or size is None:\n        print(\"Error: IPA file not found in release assets.\")\n        return\n\n    version_entry = {\n        \"version\": version,\n        \"date\": version_date,\n        \"localizedDescription\": description,\n        \"downloadURL\": download_url,\n        \"size\": size\n    }\n\n    duplicate_entries = [item for item in app[\"versions\"] if item[\"version\"] == version]\n    if duplicate_entries:\n        app[\"versions\"].remove(duplicate_entries[0])\n\n    app[\"versions\"].insert(0, version_entry)\n\n    app.update({\n        \"version\": version,\n        \"versionDate\": version_date,\n        \"versionDescription\": description,\n        \"downloadURL\": download_url,\n        \"size\": size\n    })\n\n    if \"news\" not in data:\n        data[\"news\"] = []\n\n    news_identifier = f\"release-{full_version}\"\n    date_string = date_obj.strftime(\"%d/%m/%y\")\n    news_entry = {\n        \"appID\": \"com.github.wgh136.venera\",\n        \"caption\": f\"Update of Venera just got released!\",\n        \"date\": latest_release[\"published_at\"],\n        \"identifier\": news_identifier,\n        \"notify\": True,\n        \"tintColor\": \"#0784FC\",\n        \"title\": f\"{full_version} - Venera  {date_string}\",\n        \"url\": f\"https://github.com/venera-app/venera/releases/tag/{tag}\"\n    }\n\n    news_entry_exists = any(item[\"identifier\"] == news_identifier for item in data[\"news\"])\n    if not news_entry_exists:\n        data[\"news\"].append(news_entry)\n\n    try:\n        with open(json_file, \"w\") as file:\n            json.dump(data, file, indent=2)\n        print(\"JSON file updated successfully.\")\n    except IOError as e:\n        print(f\"Error writing to JSON file: {e}\")\n        raise\n\ndef main():\n    repo_url = \"venera-app/venera\"\n    is_nightly = \"NIGHTLY_LINK\" in os.environ\n\n    try:\n        fetched_data_latest = fetch_latest_release(repo_url)\n        json_file = \"alt_store.json\"\n        update_json_file_release(json_file, fetched_data_latest)\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n        raise\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "windows/.gitignore",
    "content": "flutter/ephemeral/\n\n# Visual Studio user-specific files.\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# Visual Studio build-related files.\nx64/\nx86/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n/ChineseSimplified.isl\n"
  },
  {
    "path": "windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(venera LANGUAGES CXX)\n\n# The name of the executable created for the application. Change this to change\n# the on-disk name of your application.\nset(BINARY_NAME \"venera\")\n\n# Explicitly opt in to modern CMake behaviors to avoid warnings with recent\n# versions of CMake.\ncmake_policy(VERSION 3.14...3.25)\n\n# Define build configuration option.\nget_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)\nif(IS_MULTICONFIG)\n  set(CMAKE_CONFIGURATION_TYPES \"Debug;Profile;Release\"\n    CACHE STRING \"\" FORCE)\nelse()\n  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)\n    set(CMAKE_BUILD_TYPE \"Debug\" CACHE\n      STRING \"Flutter build mode\" FORCE)\n    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS\n      \"Debug\" \"Profile\" \"Release\")\n  endif()\nendif()\n# Define settings for the Profile build mode.\nset(CMAKE_EXE_LINKER_FLAGS_PROFILE \"${CMAKE_EXE_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_SHARED_LINKER_FLAGS_PROFILE \"${CMAKE_SHARED_LINKER_FLAGS_RELEASE}\")\nset(CMAKE_C_FLAGS_PROFILE \"${CMAKE_C_FLAGS_RELEASE}\")\nset(CMAKE_CXX_FLAGS_PROFILE \"${CMAKE_CXX_FLAGS_RELEASE}\")\n\n# Use Unicode for all projects.\nadd_definitions(-DUNICODE -D_UNICODE)\n\n# Compilation settings that should be applied to most targets.\n#\n# Be cautious about adding new options here, as plugins use this function by\n# default. In most cases, you should add new options to specific targets instead\n# of modifying this function.\nfunction(APPLY_STANDARD_SETTINGS TARGET)\n  target_compile_features(${TARGET} PUBLIC cxx_std_17)\n  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd\"4100\" /wd4267)\n  target_compile_options(${TARGET} PRIVATE /EHsc)\n  target_compile_definitions(${TARGET} PRIVATE \"_HAS_EXCEPTIONS=0\")\n  target_compile_definitions(${TARGET} PRIVATE \"$<$<CONFIG:Debug>:_DEBUG>\")\nendfunction()\n\n# Flutter library and tool build rules.\nset(FLUTTER_MANAGED_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/flutter\")\nadd_subdirectory(${FLUTTER_MANAGED_DIR})\n\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\n\n\n# Generated plugin build rules, which manage building the plugins and adding\n# them to the application.\ninclude(flutter/generated_plugins.cmake)\n\n\n# === Installation ===\n# Support files are copied into place next to the executable, so that it can\n# run in place. This is done instead of making a separate bundle (as on Linux)\n# so that building and running from within Visual Studio will work.\nset(BUILD_BUNDLE_DIR \"$<TARGET_FILE_DIR:${BINARY_NAME}>\")\n# Make the \"install\" step default, as it's required to run.\nset(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)\nif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)\n  set(CMAKE_INSTALL_PREFIX \"${BUILD_BUNDLE_DIR}\" CACHE PATH \"...\" FORCE)\nendif()\n\nset(INSTALL_BUNDLE_DATA_DIR \"${CMAKE_INSTALL_PREFIX}/data\")\nset(INSTALL_BUNDLE_LIB_DIR \"${CMAKE_INSTALL_PREFIX}\")\n\ninstall(TARGETS ${BINARY_NAME} RUNTIME DESTINATION \"${CMAKE_INSTALL_PREFIX}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_ICU_DATA_FILE}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  COMPONENT Runtime)\n\ninstall(FILES \"${FLUTTER_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n  COMPONENT Runtime)\n\nif(PLUGIN_BUNDLED_LIBRARIES)\n  install(FILES \"${PLUGIN_BUNDLED_LIBRARIES}\"\n    DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n    COMPONENT Runtime)\nendif()\n\n# Copy the native assets provided by the build.dart from all packages.\nset(NATIVE_ASSETS_DIR \"${PROJECT_BUILD_DIR}native_assets/windows/\")\ninstall(DIRECTORY \"${NATIVE_ASSETS_DIR}\"\n   DESTINATION \"${INSTALL_BUNDLE_LIB_DIR}\"\n   COMPONENT Runtime)\n\n# Fully re-copy the assets directory on each build to avoid having stale files\n# from a previous install.\nset(FLUTTER_ASSET_DIR_NAME \"flutter_assets\")\ninstall(CODE \"\n  file(REMOVE_RECURSE \\\"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\\\")\n  \" COMPONENT Runtime)\ninstall(DIRECTORY \"${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}\"\n  DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\" COMPONENT Runtime)\n\n# Install the AOT library on non-Debug builds only.\ninstall(FILES \"${AOT_LIBRARY}\" DESTINATION \"${INSTALL_BUNDLE_DATA_DIR}\"\n  CONFIGURATIONS Profile;Release\n  COMPONENT Runtime)\n"
  },
  {
    "path": "windows/build.iss",
    "content": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!\n\n#define MyAppName \"Venera\"\n#define MyAppVersion \"{{version}}\"\n#define MyAppPublisher \"nyne\"\n#define MyAppURL \"https://github.com/venera-app/venera\"\n#define MyAppExeName \"venera.exe\"\n#define RootPath \"{{root_path}}\"\n\n[Code]\nprocedure CurStepChanged(CurStep: TSetupStep);\nvar\n  OldVersionPath, ShortcutPath: string;\nbegin\n  if CurStep = ssInstall then\n  begin\n    OldVersionPath := 'C:\\Program Files (x86)\\Venera';\n    if DirExists(OldVersionPath) then\n    begin\n      DelTree(OldVersionPath, True, True, True);\n      ShortcutPath := GetEnv('USERPROFILE') + '\\Desktop\\Venera.lnk';\n      if FileExists(ShortcutPath) then\n      begin\n        DeleteFile(ShortcutPath);\n      end;\n      ShortcutPath := 'C:\\Users\\Public\\Desktop\\Venera.lnk';\n      if FileExists(ShortcutPath) then\n      begin\n        DeleteFile(ShortcutPath);\n      end;\n    end;\n  end;\nend;\n\n[Setup]\n; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.\n; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)\nAppId={{1A39CB64-0A5B-478E-9590-978614C804A8}\nAppName={#MyAppName}\nAppVersion={#MyAppVersion}\n;AppVerName={#MyAppName} {#MyAppVersion}\nAppPublisher={#MyAppPublisher}\nAppPublisherURL={#MyAppURL}\nAppSupportURL={#MyAppURL}\nAppUpdatesURL={#MyAppURL}\nDefaultDirName={autopf}\\{#MyAppName}\nDisableProgramGroupPage=yes\n; Uncomment the following line to run in non administrative install mode (install for current user only.)\n;PrivilegesRequired=lowest\nPrivilegesRequiredOverridesAllowed=dialog\nOutputDir={#RootPath}\\build\\windows\nOutputBaseFilename=Venera-{#MyAppVersion}-windows-installer\nSetupIconFile={#RootPath}\\windows\\runner\\resources\\app_icon.ico\nCompression=lzma\nSolidCompression=yes\nWizardStyle=modern\nArchitecturesInstallIn64BitMode=x64compatible\nArchitecturesAllowed=x64compatible\n\n[Languages]\nName: \"english\"; MessagesFile: \"compiler:Default.isl\"\nName: \"chinesesimplified\"; MessagesFile: \"{#RootPath}\\windows\\ChineseSimplified.isl\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\{#MyAppExeName}\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\flutter_inappwebview_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\file_selector_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\app_links_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\sqlite3.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\sqlite3_flutter_libs_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\flutter_windows.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\flutter_qjs_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\desktop_webview_window_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\WebView2Loader.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\share_plus_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\url_launcher_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\battery_plus_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\screen_retriever_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\window_manager_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\local_auth_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\zip_flutter.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\rhttp.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\lodepng_flutter.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\dynamic_color_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\flutter_7zip.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\x64\\runner\\Release\\data\\*\"; DestDir: \"{app}\\data\"; Flags: ignoreversion recursesubdirs createallsubdirs\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Icons]\nName: \"{autoprograms}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"\nName: \"{autodesktop}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; Tasks: desktopicon\n\n[Run]\nFilename: \"{app}\\{#MyAppExeName}\"; Description: \"{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}\"; Flags: nowait postinstall\n"
  },
  {
    "path": "windows/build.py",
    "content": "import subprocess\nimport os\nimport httpx\n\nfile = open('pubspec.yaml', 'r')\ncontent = file.read()\nfile.close()\n\nsubprocess.run([\"flutter\", \"build\", \"windows\"], shell=True)\n\nif os.path.exists(\"build/app-windows.zip\"):\n    os.remove(\"build/app-windows.zip\")\n\nversion = str.split(str.split(content, 'version: ')[1], '+')[0]\n\nsubprocess.run([\"tar\", \"-a\", \"-c\", \"-f\", f\"build/windows/Venera-{version}-windows.zip\", \"-C\", \"build/windows/x64/runner/Release\", \"*\"]\n               , shell=True)\n\nissContent = \"\"\nfile = open('windows/build.iss', 'r')\nissContent = file.read()\nnewContent = issContent\nnewContent = newContent.replace(\"{{version}}\", version)\nnewContent = newContent.replace(\"{{root_path}}\", os.getcwd())\nfile.close()\nfile = open('windows/build.iss', 'w')\nfile.write(newContent)\nfile.close()\n\nif not os.path.exists(\"windows/ChineseSimplified.isl\"):\n    # download ChineseSimplified.isl\n    url = \"https://cdn.jsdelivr.net/gh/kira-96/Inno-Setup-Chinese-Simplified-Translation@latest/ChineseSimplified.isl\"\n    response = httpx.get(url)\n    with open('windows/ChineseSimplified.isl', 'wb') as file:\n        file.write(response.content)\n\nsubprocess.run([\"iscc\", \"windows/build.iss\"], shell=True)\n\nwith open('windows/build.iss', 'w') as file:\n    file.write(issContent)"
  },
  {
    "path": "windows/build_arm64.iss",
    "content": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!\n\n#define MyAppName \"Venera\"\n#define MyAppVersion \"{{version}}\"\n#define MyAppPublisher \"nyne\"\n#define MyAppURL \"https://github.com/venera-app/venera\"\n#define MyAppExeName \"venera.exe\"\n#define RootPath \"{{root_path}}\"\n\n[Setup]\n; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.\n; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)\nAppId={{1A39CB64-0A5B-478E-9590-978614C804A8}\nAppName={#MyAppName}\nAppVersion={#MyAppVersion}\n;AppVerName={#MyAppName} {#MyAppVersion}\nAppPublisher={#MyAppPublisher}\nAppPublisherURL={#MyAppURL}\nAppSupportURL={#MyAppURL}\nAppUpdatesURL={#MyAppURL}\nDefaultDirName={autopf}\\{#MyAppName}\nDisableProgramGroupPage=yes\n; Uncomment the following line to run in non administrative install mode (install for current user only.)\n;PrivilegesRequired=lowest\nPrivilegesRequiredOverridesAllowed=dialog\nOutputDir={#RootPath}\\build\\windows\nOutputBaseFilename=Venera-{#MyAppVersion}-windows-arm64-installer\nSetupIconFile={#RootPath}\\windows\\runner\\resources\\app_icon.ico\nCompression=lzma\nSolidCompression=yes\nWizardStyle=modern\nArchitecturesInstallIn64BitMode=arm64\nArchitecturesAllowed=arm64\n\n[Languages]\nName: \"english\"; MessagesFile: \"compiler:Default.isl\"\nName: \"chinesesimplified\"; MessagesFile: \"{#RootPath}\\windows\\ChineseSimplified.isl\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\{#MyAppExeName}\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\flutter_inappwebview_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\file_selector_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\app_links_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\sqlite3.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\sqlite3_flutter_libs_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\flutter_windows.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\flutter_qjs_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\desktop_webview_window_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\WebView2Loader.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\share_plus_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\url_launcher_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\battery_plus_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\screen_retriever_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\window_manager_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\local_auth_windows_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\zip_flutter.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\rhttp.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\lodepng_flutter.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\dynamic_color_plugin.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\flutter_7zip.dll\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"{#RootPath}\\build\\windows\\arm64\\runner\\Release\\data\\*\"; DestDir: \"{app}\\data\"; Flags: ignoreversion recursesubdirs createallsubdirs\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Icons]\nName: \"{autoprograms}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"\nName: \"{autodesktop}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; Tasks: desktopicon\n\n[Run]\nFilename: \"{app}\\{#MyAppExeName}\"; Description: \"{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}\"; Flags: nowait postinstall\n"
  },
  {
    "path": "windows/build_arm64.py",
    "content": "import platform\nimport subprocess\nimport os\nimport httpx\n\nfile = open('pubspec.yaml', 'r')\ncontent = file.read()\nfile.close()\n\nsubprocess.run([\"flutter\", \"build\", \"windows\"], shell=True)\n\nif os.path.exists(\"build/app-windows.zip\"):\n    os.remove(\"build/app-windows.zip\")\n\nversion = str.split(str.split(content, 'version: ')[1], '+')[0]\n\nsubprocess.run([\"tar\", \"-a\", \"-c\", \"-f\", f\"build/windows/Venera-{version}-windows-arm64.zip\", \"-C\", \"build/windows/x64/runner/Release\", \"*\"]\n               , shell=True)\n\nissPath = \"windows/build_arm64.iss\"\n\nissContent = \"\"\nfile = open(issPath, 'r')\nissContent = file.read()\nnewContent = issContent\nnewContent = newContent.replace(\"{{version}}\", version)\nnewContent = newContent.replace(\"{{root_path}}\", os.getcwd())\nfile.close()\nfile = open(issPath, 'w')\nfile.write(newContent)\nfile.close()\n\nif not os.path.exists(\"windows/ChineseSimplified.isl\"):\n    # download ChineseSimplified.isl\n    url = \"https://cdn.jsdelivr.net/gh/kira-96/Inno-Setup-Chinese-Simplified-Translation@latest/ChineseSimplified.isl\"\n    response = httpx.get(url)\n    with open('windows/ChineseSimplified.isl', 'wb') as file:\n        file.write(response.content)\n\nsubprocess.run([\"iscc\", issPath], shell=True)\n\nwith open(issPath, 'w') as file:\n    file.write(issContent)"
  },
  {
    "path": "windows/flutter/CMakeLists.txt",
    "content": "# This file controls Flutter-level build steps. It should not be edited.\ncmake_minimum_required(VERSION 3.14)\n\nset(EPHEMERAL_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/ephemeral\")\n\n# Configuration provided via flutter tool.\ninclude(${EPHEMERAL_DIR}/generated_config.cmake)\n\n# TODO: Move the rest of this into files in ephemeral. See\n# https://github.com/flutter/flutter/issues/57146.\nset(WRAPPER_ROOT \"${EPHEMERAL_DIR}/cpp_client_wrapper\")\n\n# Set fallback configurations for older versions of the flutter tool.\nif (NOT DEFINED FLUTTER_TARGET_PLATFORM)\n  set(FLUTTER_TARGET_PLATFORM \"windows-x64\")\nendif()\n\n# === Flutter Library ===\nset(FLUTTER_LIBRARY \"${EPHEMERAL_DIR}/flutter_windows.dll\")\n\n# Published to parent scope for install step.\nset(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)\nset(FLUTTER_ICU_DATA_FILE \"${EPHEMERAL_DIR}/icudtl.dat\" PARENT_SCOPE)\nset(PROJECT_BUILD_DIR \"${PROJECT_DIR}/build/\" PARENT_SCOPE)\nset(AOT_LIBRARY \"${PROJECT_DIR}/build/windows/app.so\" PARENT_SCOPE)\n\nlist(APPEND FLUTTER_LIBRARY_HEADERS\n  \"flutter_export.h\"\n  \"flutter_windows.h\"\n  \"flutter_messenger.h\"\n  \"flutter_plugin_registrar.h\"\n  \"flutter_texture_registrar.h\"\n)\nlist(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND \"${EPHEMERAL_DIR}/\")\nadd_library(flutter INTERFACE)\ntarget_include_directories(flutter INTERFACE\n  \"${EPHEMERAL_DIR}\"\n)\ntarget_link_libraries(flutter INTERFACE \"${FLUTTER_LIBRARY}.lib\")\nadd_dependencies(flutter flutter_assemble)\n\n# === Wrapper ===\nlist(APPEND CPP_WRAPPER_SOURCES_CORE\n  \"core_implementations.cc\"\n  \"standard_codec.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_PLUGIN\n  \"plugin_registrar.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND \"${WRAPPER_ROOT}/\")\nlist(APPEND CPP_WRAPPER_SOURCES_APP\n  \"flutter_engine.cc\"\n  \"flutter_view_controller.cc\"\n)\nlist(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND \"${WRAPPER_ROOT}/\")\n\n# Wrapper sources needed for a plugin.\nadd_library(flutter_wrapper_plugin STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n)\napply_standard_settings(flutter_wrapper_plugin)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  POSITION_INDEPENDENT_CODE ON)\nset_target_properties(flutter_wrapper_plugin PROPERTIES\n  CXX_VISIBILITY_PRESET hidden)\ntarget_link_libraries(flutter_wrapper_plugin PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_plugin PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_plugin flutter_assemble)\n\n# Wrapper sources needed for the runner.\nadd_library(flutter_wrapper_app STATIC\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\napply_standard_settings(flutter_wrapper_app)\ntarget_link_libraries(flutter_wrapper_app PUBLIC flutter)\ntarget_include_directories(flutter_wrapper_app PUBLIC\n  \"${WRAPPER_ROOT}/include\"\n)\nadd_dependencies(flutter_wrapper_app flutter_assemble)\n\n# === Flutter tool backend ===\n# _phony_ is a non-existent file to force this command to run every time,\n# since currently there's no way to get a full input/output list from the\n# flutter tool.\nset(PHONY_OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/_phony_\")\nset_source_files_properties(\"${PHONY_OUTPUT}\" PROPERTIES SYMBOLIC TRUE)\nadd_custom_command(\n  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}\n    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}\n    ${CPP_WRAPPER_SOURCES_APP}\n    ${PHONY_OUTPUT}\n  COMMAND ${CMAKE_COMMAND} -E env\n    ${FLUTTER_TOOL_ENVIRONMENT}\n    \"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat\"\n      ${FLUTTER_TARGET_PLATFORM} $<CONFIG>\n  VERBATIM\n)\nadd_custom_target(flutter_assemble DEPENDS\n  \"${FLUTTER_LIBRARY}\"\n  ${FLUTTER_LIBRARY_HEADERS}\n  ${CPP_WRAPPER_SOURCES_CORE}\n  ${CPP_WRAPPER_SOURCES_PLUGIN}\n  ${CPP_WRAPPER_SOURCES_APP}\n)\n"
  },
  {
    "path": "windows/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(runner LANGUAGES CXX)\n\n# Define the application target. To change its name, change BINARY_NAME in the\n# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer\n# work.\n#\n# Any new source files that you add to the application should be added here.\nadd_executable(${BINARY_NAME} WIN32\n  \"flutter_window.cpp\"\n  \"main.cpp\"\n  \"utils.cpp\"\n  \"win32_window.cpp\"\n  \"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc\"\n  \"Runner.rc\"\n  \"runner.exe.manifest\"\n)\n\n# Apply the standard set of build settings. This can be removed for applications\n# that need different build settings.\napply_standard_settings(${BINARY_NAME})\n\n# Add preprocessor definitions for the build version.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION=\\\"${FLUTTER_VERSION}\\\"\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}\")\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}\")\n\n# Disable Windows macros that collide with C++ standard library functions.\ntarget_compile_definitions(${BINARY_NAME} PRIVATE \"NOMINMAX\")\n\n# Add dependency libraries and include directories. Add any application-specific\n# dependencies here.\ntarget_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)\ntarget_link_libraries(${BINARY_NAME} PRIVATE \"dwmapi.lib\")\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n\n# Run the Flutter tool portions of the build. This must not be removed.\nadd_dependencies(${BINARY_NAME} flutter_assemble)\n"
  },
  {
    "path": "windows/runner/Runner.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#pragma code_page(65001)\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE\nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE\nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_APP_ICON            ICON                    \"resources\\\\app_icon.ico\"\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\n#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)\n#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD\n#else\n#define VERSION_AS_NUMBER 1,0,0,0\n#endif\n\n#if defined(FLUTTER_VERSION)\n#define VERSION_AS_STRING FLUTTER_VERSION\n#else\n#define VERSION_AS_STRING \"1.0.0\"\n#endif\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION VERSION_AS_NUMBER\n PRODUCTVERSION VERSION_AS_NUMBER\n FILEFLAGSMASK VS_FFI_FILEFLAGSMASK\n#ifdef _DEBUG\n FILEFLAGS VS_FF_DEBUG\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904e4\"\n        BEGIN\n            VALUE \"CompanyName\", \"com.github.wgh136\" \"\\0\"\n            VALUE \"FileDescription\", \"venera\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"venera\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2024 com.github.wgh136. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"venera.exe\" \"\\0\"\n            VALUE \"ProductName\", \"venera\" \"\\0\"\n            VALUE \"ProductVersion\", VERSION_AS_STRING \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1252\n    END\nEND\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "windows/runner/flutter_window.cpp",
    "content": "#pragma comment(lib, \"winhttp.lib\")\n#include \"flutter_window.h\"\n#include <optional>\n#include <winhttp.h>\n#include <Windows.h>\n#include <winbase.h>\n#include <flutter/method_channel.h>\n#include <flutter/event_channel.h>\n#include <flutter/event_sink.h>\n#include <flutter/event_stream_handler_functions.h>\n#include <flutter/standard_method_codec.h>\n#include \"flutter/generated_plugin_registrant.h\"\n#include <thread>\n\n#define _CRT_SECURE_NO_WARNINGS\n\nstd::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& mouseEvents = nullptr;\n\nstd::atomic<bool> mainThreadAlive(true);\nstd::atomic<std::chrono::steady_clock::time_point> lastHeartbeat(std::chrono::steady_clock::now());\nstd::thread* monitorThread = nullptr;\n\nchar* wideCharToMultiByte(wchar_t* pWCStrKey)\n{\n    size_t pSize = WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), NULL, 0, NULL, NULL);\n    char* pCStrKey = new char[pSize + 1];\n    WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), pCStrKey, pSize, NULL, NULL);\n    pCStrKey[pSize] = '\\0';\n    GlobalFree(pWCStrKey);\n    return pCStrKey;\n}\n\nchar* getProxy() {\n    _WINHTTP_CURRENT_USER_IE_PROXY_CONFIG net;\n    WinHttpGetIEProxyConfigForCurrentUser(&net);\n    if (net.lpszProxy == nullptr) {\n        GlobalFree(net.lpszAutoConfigUrl);\n        GlobalFree(net.lpszProxyBypass);\n        return nullptr;\n    }\n    else {\n        GlobalFree(net.lpszAutoConfigUrl);\n        GlobalFree(net.lpszProxyBypass);\n        return wideCharToMultiByte(net.lpszProxy);\n    }\n}\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\n\nvoid monitorUIThread() {\n    const auto timeout = std::chrono::seconds(5);\n\n    while (mainThreadAlive.load()) {\n        auto now = std::chrono::steady_clock::now();\n        auto duration = now - lastHeartbeat.load();\n\n        if (duration > timeout) {\n            std::cerr << \"The UI thread is dead. Terminate the application.\";\n            std::exit(0);\n        }\n\n        std::this_thread::sleep_for(std::chrono::seconds(1));\n    }\n}\n\nbool FlutterWindow::OnCreate() {\n  if (!Win32Window::OnCreate()) {\n    return false;\n  }\n\n  RECT frame = GetClientArea();\n\n  // The size here must match the window dimensions to avoid unnecessary surface\n  // creation / destruction in the startup path.\n  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(\n      frame.right - frame.left, frame.bottom - frame.top, project_);\n  // Ensure that basic setup of the controller was successful.\n  if (!flutter_controller_->engine() || !flutter_controller_->view()) {\n    return false;\n  }\n  RegisterPlugins(flutter_controller_->engine());\n\n  const flutter::MethodChannel<> channel(\n      flutter_controller_->engine()->messenger(), \"venera/method_channel\",\n      &flutter::StandardMethodCodec::GetInstance()\n  );\n  channel.SetMethodCallHandler(\n    [](const flutter::MethodCall<>& call,const std::unique_ptr<flutter::MethodResult<>>& result) {\n      if(call.method_name() == \"getProxy\"){\n        const auto res = getProxy();\n        if (res != nullptr){\n          std::string s = res;\n          result->Success(s);\n          }\n        else\n          result->Success(flutter::EncodableValue(\"No Proxy\"));\n        delete(res);\n        return;\n      }\n#ifdef NDEBUG\n      else if (call.method_name() == \"heartBeat\") {\n\n          if (monitorThread == nullptr) {\n              monitorThread = new std::thread{ monitorUIThread };\n          }\n          lastHeartbeat = std::chrono::steady_clock::now();\n          result->Success();\n          return;\n      }\n#endif\n      result->Success(); // Default response for unhandled method calls\n  });\n\n  flutter::EventChannel<> channel2(\n    flutter_controller_->engine()->messenger(), \"venera/mouse\",\n    &flutter::StandardMethodCodec::GetInstance()\n  );\n\n  auto eventHandler = std::make_unique<\n    flutter::StreamHandlerFunctions<flutter::EncodableValue>>(\n    [](\n      const flutter::EncodableValue* arguments,\n      std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events){\n        mouseEvents = std::move(events);\n        return nullptr;\n    },\n    [](const flutter::EncodableValue* arguments)\n      -> std::unique_ptr<flutter::StreamHandlerError<flutter::EncodableValue>> {\n        mouseEvents = nullptr;\n        return nullptr;\n    }\n  );\n\n  channel2.SetStreamHandler(std::move(eventHandler));\n\n  const flutter::MethodChannel<> channel3(\n    flutter_controller_->engine()->messenger(), \"venera/clipboard\",\n    &flutter::StandardMethodCodec::GetInstance()\n  );\n  channel3.SetMethodCallHandler(\n    [](const flutter::MethodCall<>& call,const std::unique_ptr<flutter::MethodResult<>>& result) {\n      if(call.method_name() == \"writeImageToClipboard\"){\n          flutter::EncodableMap arguments = std::get<flutter::EncodableMap>(*call.arguments());\n          std::vector<uint8_t> data = std::get<std::vector<uint8_t>>(arguments[\"data\"]);\n          std::int32_t width = std::get<std::int32_t>(arguments[\"width\"]);\n          std::int32_t height = std::get<std::int32_t>(arguments[\"height\"]);\n\n          // convert rgba to bgra\n          for (int i = 0; i < data.size()/4; i++) {\n              uint8_t temp = data[i * 4];\n              data[i * 4] = data[i * 4 + 2];\n              data[i * 4 + 2] = temp;\n          }\n          \n          auto bitmap = CreateBitmap((int)width, (int)height, 1, 32, data.data());\n\n          if (!bitmap) {\n              result->Error(\"0\", \"Invalid Image Data\");\n              return;\n          }\n\n          if (OpenClipboard(NULL))\n          {\n              EmptyClipboard();\n              SetClipboardData(CF_BITMAP, bitmap);\n              CloseClipboard();\n              result->Success();\n          }\n          else {\n              result->Error(\"Failed to open clipboard\");\n          }\n\n          DeleteObject(bitmap);\n      }\n  });\n\n  SetChildContent(flutter_controller_->view()->GetNativeWindow());\n\n  flutter_controller_->engine()->SetNextFrameCallback([&]() {\n    // this->Show();\n  });\n\n  // Flutter can complete the first frame before the \"show window\" callback is\n  // registered. The following call ensures a frame is pending to ensure the\n  // window is shown. It is a no-op if the first frame hasn't completed yet.\n  flutter_controller_->ForceRedraw();\n\n  return true;\n}\n\nvoid FlutterWindow::OnDestroy() {\n  if (flutter_controller_) {\n    flutter_controller_ = nullptr;\n  }\n\n  Win32Window::OnDestroy();\n  if (monitorThread != nullptr) {\n      mainThreadAlive = false;\n      monitorThread->join();\n  }\n}\n\nvoid mouse_side_button_listener(unsigned int input)\n{\n    if(mouseEvents != nullptr)\n    {\n        mouseEvents->Success(static_cast<int>(input));\n    }\n}\n\nLRESULT\nFlutterWindow::MessageHandler(HWND hwnd, UINT const message,\n                              WPARAM const wparam,\n                              LPARAM const lparam) noexcept {\n  // Give Flutter, including plugins, an opportunity to handle window messages.\n    UINT button = GET_XBUTTON_WPARAM(wparam);\n    if (button == XBUTTON1 && message == 528)\n    {\n        mouse_side_button_listener(0);\n    }\n    else if (button == XBUTTON2 && message == 528)\n    {\n        mouse_side_button_listener(1);\n    }\n    if (flutter_controller_) {\n        std::optional<LRESULT> result =\n            flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,\n                                                      lparam);\n        if (result) {\n          return *result;\n        }\n    }\n\n    switch (message) {\n      case WM_FONTCHANGE:\n          flutter_controller_->engine()->ReloadSystemFonts();\n          break;\n    }\n\n  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);\n}\n"
  },
  {
    "path": "windows/runner/flutter_window.h",
    "content": "#ifndef RUNNER_FLUTTER_WINDOW_H_\n#define RUNNER_FLUTTER_WINDOW_H_\n\n#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n\n#include <memory>\n\n#include \"win32_window.h\"\n\n// A window that does nothing but host a Flutter view.\nclass FlutterWindow : public Win32Window {\n public:\n  // Creates a new FlutterWindow hosting a Flutter view running |project|.\n  explicit FlutterWindow(const flutter::DartProject& project);\n  virtual ~FlutterWindow();\n\n protected:\n  // Win32Window:\n  bool OnCreate() override;\n  void OnDestroy() override;\n  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,\n                         LPARAM const lparam) noexcept override;\n\n private:\n  // The project to run.\n  flutter::DartProject project_;\n\n  // The Flutter instance hosted by this window.\n  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;\n};\n\n#endif  // RUNNER_FLUTTER_WINDOW_H_\n"
  },
  {
    "path": "windows/runner/main.cpp",
    "content": "#include <flutter/dart_project.h>\n#include <flutter/flutter_view_controller.h>\n#include <windows.h>\n\n#include \"flutter_window.h\"\n#include \"utils.h\"\n\nint APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,\n                      _In_ wchar_t *command_line, _In_ int show_command) {\n  // Attach to console when present (e.g., 'flutter run') or create a\n  // new console when running with a debugger.\n  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {\n    CreateAndAttachConsole();\n  }\n\n  // Initialize COM, so that it is available for use in the library and/or\n  // plugins.\n  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n  flutter::DartProject project(L\"data\");\n\n  std::vector<std::string> command_line_arguments =\n      GetCommandLineArguments();\n\n  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));\n\n  FlutterWindow window(project);\n  Win32Window::Point origin(10, 10);\n  Win32Window::Size size(1280, 720);\n  if (!window.Create(L\"venera\", origin, size)) {\n    return EXIT_FAILURE;\n  }\n  window.SetQuitOnClose(true);\n\n  ::MSG msg;\n  while (::GetMessage(&msg, nullptr, 0, 0)) {\n    ::TranslateMessage(&msg);\n    ::DispatchMessage(&msg);\n  }\n\n  ::CoUninitialize();\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "windows/runner/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by Runner.rc\n//\n#define IDI_APP_ICON                    101\n\n// Next default values for new objects\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "windows/runner/runner.exe.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2</dpiAwareness>\n    </windowsSettings>\n  </application>\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Windows 10 and Windows 11 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\"/>\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/>\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/>\n    </application>\n  </compatibility>\n</assembly>\n"
  },
  {
    "path": "windows/runner/utils.cpp",
    "content": "#include \"utils.h\"\n\n#include <flutter_windows.h>\n#include <io.h>\n#include <stdio.h>\n#include <windows.h>\n\n#include <iostream>\n\nvoid CreateAndAttachConsole() {\n  if (::AllocConsole()) {\n    FILE *unused;\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stdout)) {\n      _dup2(_fileno(stdout), 1);\n    }\n    if (freopen_s(&unused, \"CONOUT$\", \"w\", stderr)) {\n      _dup2(_fileno(stdout), 2);\n    }\n    std::ios::sync_with_stdio();\n    FlutterDesktopResyncOutputStreams();\n  }\n}\n\nstd::vector<std::string> GetCommandLineArguments() {\n  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.\n  int argc;\n  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);\n  if (argv == nullptr) {\n    return std::vector<std::string>();\n  }\n\n  std::vector<std::string> command_line_arguments;\n\n  // Skip the first argument as it's the binary name.\n  for (int i = 1; i < argc; i++) {\n    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));\n  }\n\n  ::LocalFree(argv);\n\n  return command_line_arguments;\n}\n\nstd::string Utf8FromUtf16(const wchar_t* utf16_string) {\n  if (utf16_string == nullptr) {\n    return std::string();\n  }\n  unsigned int target_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      -1, nullptr, 0, nullptr, nullptr)\n    -1; // remove the trailing null character\n  int input_length = (int)wcslen(utf16_string);\n  std::string utf8_string;\n  if (target_length == 0 || target_length > utf8_string.max_size()) {\n    return utf8_string;\n  }\n  utf8_string.resize(target_length);\n  int converted_length = ::WideCharToMultiByte(\n      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,\n      input_length, utf8_string.data(), target_length, nullptr, nullptr);\n  if (converted_length == 0) {\n    return std::string();\n  }\n  return utf8_string;\n}\n"
  },
  {
    "path": "windows/runner/utils.h",
    "content": "#ifndef RUNNER_UTILS_H_\n#define RUNNER_UTILS_H_\n\n#include <string>\n#include <vector>\n\n// Creates a console for the process, and redirects stdout and stderr to\n// it for both the runner and the Flutter library.\nvoid CreateAndAttachConsole();\n\n// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string\n// encoded in UTF-8. Returns an empty std::string on failure.\nstd::string Utf8FromUtf16(const wchar_t* utf16_string);\n\n// Gets the command line arguments passed in as a std::vector<std::string>,\n// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.\nstd::vector<std::string> GetCommandLineArguments();\n\n#endif  // RUNNER_UTILS_H_\n"
  },
  {
    "path": "windows/runner/win32_window.cpp",
    "content": "#include \"win32_window.h\"\n\n#include <dwmapi.h>\n#include <flutter_windows.h>\n\n#include \"resource.h\"\n\nnamespace {\n\n/// Window attribute that enables dark mode window decorations.\n///\n/// Redefined in case the developer's machine has a Windows SDK older than\n/// version 10.0.22000.0.\n/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute\n#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE\n#define DWMWA_USE_IMMERSIVE_DARK_MODE 20\n#endif\n\nconstexpr const wchar_t kWindowClassName[] = L\"FLUTTER_RUNNER_WIN32_WINDOW\";\n\n/// Registry key for app theme preference.\n///\n/// A value of 0 indicates apps should use dark mode. A non-zero or missing\n/// value indicates apps should use light mode.\nconstexpr const wchar_t kGetPreferredBrightnessRegKey[] =\n  L\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\";\nconstexpr const wchar_t kGetPreferredBrightnessRegValue[] = L\"AppsUseLightTheme\";\n\n// The number of Win32Window objects that currently exist.\nstatic int g_active_window_count = 0;\n\nusing EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);\n\n// Scale helper to convert logical scaler values to physical using passed in\n// scale factor\nint Scale(int source, double scale_factor) {\n  return static_cast<int>(source * scale_factor);\n}\n\n// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.\n// This API is only needed for PerMonitor V1 awareness mode.\nvoid EnableFullDpiSupportIfAvailable(HWND hwnd) {\n  HMODULE user32_module = LoadLibraryA(\"User32.dll\");\n  if (!user32_module) {\n    return;\n  }\n  auto enable_non_client_dpi_scaling =\n      reinterpret_cast<EnableNonClientDpiScaling*>(\n          GetProcAddress(user32_module, \"EnableNonClientDpiScaling\"));\n  if (enable_non_client_dpi_scaling != nullptr) {\n    enable_non_client_dpi_scaling(hwnd);\n  }\n  FreeLibrary(user32_module);\n}\n\n}  // namespace\n\n// Manages the Win32Window's window class registration.\nclass WindowClassRegistrar {\n public:\n  ~WindowClassRegistrar() = default;\n\n  // Returns the singleton registrar instance.\n  static WindowClassRegistrar* GetInstance() {\n    if (!instance_) {\n      instance_ = new WindowClassRegistrar();\n    }\n    return instance_;\n  }\n\n  // Returns the name of the window class, registering the class if it hasn't\n  // previously been registered.\n  const wchar_t* GetWindowClass();\n\n  // Unregisters the window class. Should only be called if there are no\n  // instances of the window.\n  void UnregisterWindowClass();\n\n private:\n  WindowClassRegistrar() = default;\n\n  static WindowClassRegistrar* instance_;\n\n  bool class_registered_ = false;\n};\n\nWindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;\n\nconst wchar_t* WindowClassRegistrar::GetWindowClass() {\n  if (!class_registered_) {\n    WNDCLASS window_class{};\n    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);\n    window_class.lpszClassName = kWindowClassName;\n    window_class.style = CS_HREDRAW | CS_VREDRAW;\n    window_class.cbClsExtra = 0;\n    window_class.cbWndExtra = 0;\n    window_class.hInstance = GetModuleHandle(nullptr);\n    window_class.hIcon =\n        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));\n    window_class.hbrBackground = 0;\n    window_class.lpszMenuName = nullptr;\n    window_class.lpfnWndProc = Win32Window::WndProc;\n    RegisterClass(&window_class);\n    class_registered_ = true;\n  }\n  return kWindowClassName;\n}\n\nvoid WindowClassRegistrar::UnregisterWindowClass() {\n  UnregisterClass(kWindowClassName, nullptr);\n  class_registered_ = false;\n}\n\nWin32Window::Win32Window() {\n  ++g_active_window_count;\n}\n\nWin32Window::~Win32Window() {\n  --g_active_window_count;\n  Destroy();\n}\n\nbool Win32Window::Create(const std::wstring& title,\n                         const Point& origin,\n                         const Size& size) {\n  HWND hwnd = ::FindWindow(kWindowClassName, title.c_str());\n  if (hwnd) {\n    WINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) };\n    GetWindowPlacement(hwnd, &place);\n    SetForegroundWindow(hwnd);\n    switch (place.showCmd) {\n    case SW_SHOWMAXIMIZED:\n        ShowWindow(hwnd, SW_SHOWMAXIMIZED);\n        break;\n    case SW_SHOWMINIMIZED:\n        ShowWindow(hwnd, SW_RESTORE);\n        break;\n    default:\n        ShowWindow(hwnd, SW_NORMAL);\n        break;\n    }\n\n    SetWindowPos(0, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);\n    return false;\n  }\n  Destroy();\n\n  const wchar_t* window_class =\n      WindowClassRegistrar::GetInstance()->GetWindowClass();\n\n  const POINT target_point = {static_cast<LONG>(origin.x),\n                              static_cast<LONG>(origin.y)};\n  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);\n  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);\n  double scale_factor = dpi / 96.0;\n\n  HWND window = CreateWindow(\n      window_class, title.c_str(), WS_OVERLAPPEDWINDOW,\n      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),\n      Scale(size.width, scale_factor), Scale(size.height, scale_factor),\n      nullptr, nullptr, GetModuleHandle(nullptr), this);\n\n  if (!window) {\n    return false;\n  }\n\n  UpdateTheme(window);\n\n  return OnCreate();\n}\n\nbool Win32Window::Show() {\n  return ShowWindow(window_handle_, SW_SHOWNORMAL);\n}\n\n// static\nLRESULT CALLBACK Win32Window::WndProc(HWND const window,\n                                      UINT const message,\n                                      WPARAM const wparam,\n                                      LPARAM const lparam) noexcept {\n  if (message == WM_NCCREATE) {\n    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);\n    SetWindowLongPtr(window, GWLP_USERDATA,\n                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));\n\n    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);\n    EnableFullDpiSupportIfAvailable(window);\n    that->window_handle_ = window;\n  } else if (Win32Window* that = GetThisFromHandle(window)) {\n    return that->MessageHandler(window, message, wparam, lparam);\n  }\n\n  return DefWindowProc(window, message, wparam, lparam);\n}\n\nLRESULT\nWin32Window::MessageHandler(HWND hwnd,\n                            UINT const message,\n                            WPARAM const wparam,\n                            LPARAM const lparam) noexcept {\n  switch (message) {\n    case WM_DESTROY:\n      window_handle_ = nullptr;\n      Destroy();\n      if (quit_on_close_) {\n        PostQuitMessage(0);\n      }\n      return 0;\n\n    case WM_DPICHANGED: {\n      auto newRectSize = reinterpret_cast<RECT*>(lparam);\n      LONG newWidth = newRectSize->right - newRectSize->left;\n      LONG newHeight = newRectSize->bottom - newRectSize->top;\n\n      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,\n                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);\n\n      return 0;\n    }\n    case WM_SIZE: {\n      RECT rect = GetClientArea();\n      if (child_content_ != nullptr) {\n        // Size and position the child window.\n        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,\n                   rect.bottom - rect.top, TRUE);\n      }\n      return 0;\n    }\n\n    case WM_ACTIVATE:\n      if (child_content_ != nullptr) {\n        SetFocus(child_content_);\n      }\n      return 0;\n\n    case WM_DWMCOLORIZATIONCOLORCHANGED:\n      UpdateTheme(hwnd);\n      return 0;\n  }\n\n  return DefWindowProc(window_handle_, message, wparam, lparam);\n}\n\nvoid Win32Window::Destroy() {\n  OnDestroy();\n\n  if (window_handle_) {\n    DestroyWindow(window_handle_);\n    window_handle_ = nullptr;\n  }\n  if (g_active_window_count == 0) {\n    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();\n  }\n}\n\nWin32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {\n  return reinterpret_cast<Win32Window*>(\n      GetWindowLongPtr(window, GWLP_USERDATA));\n}\n\nvoid Win32Window::SetChildContent(HWND content) {\n  child_content_ = content;\n  SetParent(content, window_handle_);\n  RECT frame = GetClientArea();\n\n  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,\n             frame.bottom - frame.top, true);\n\n  SetFocus(child_content_);\n}\n\nRECT Win32Window::GetClientArea() {\n  RECT frame;\n  GetClientRect(window_handle_, &frame);\n  return frame;\n}\n\nHWND Win32Window::GetHandle() {\n  return window_handle_;\n}\n\nvoid Win32Window::SetQuitOnClose(bool quit_on_close) {\n  quit_on_close_ = quit_on_close;\n}\n\nbool Win32Window::OnCreate() {\n  // No-op; provided for subclasses.\n  return true;\n}\n\nvoid Win32Window::OnDestroy() {\n  // No-op; provided for subclasses.\n}\n\nvoid Win32Window::UpdateTheme(HWND const window) {\n  DWORD light_mode;\n  DWORD light_mode_size = sizeof(light_mode);\n  LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,\n                               kGetPreferredBrightnessRegValue,\n                               RRF_RT_REG_DWORD, nullptr, &light_mode,\n                               &light_mode_size);\n\n  if (result == ERROR_SUCCESS) {\n    BOOL enable_dark_mode = light_mode == 0;\n    DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,\n                          &enable_dark_mode, sizeof(enable_dark_mode));\n  }\n}\n"
  },
  {
    "path": "windows/runner/win32_window.h",
    "content": "#ifndef RUNNER_WIN32_WINDOW_H_\n#define RUNNER_WIN32_WINDOW_H_\n\n#include <windows.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\n// A class abstraction for a high DPI-aware Win32 Window. Intended to be\n// inherited from by classes that wish to specialize with custom\n// rendering and input handling\nclass Win32Window {\n public:\n  struct Point {\n    unsigned int x;\n    unsigned int y;\n    Point(unsigned int x, unsigned int y) : x(x), y(y) {}\n  };\n\n  struct Size {\n    unsigned int width;\n    unsigned int height;\n    Size(unsigned int width, unsigned int height)\n        : width(width), height(height) {}\n  };\n\n  Win32Window();\n  virtual ~Win32Window();\n\n  // Creates a win32 window with |title| that is positioned and sized using\n  // |origin| and |size|. New windows are created on the default monitor. Window\n  // sizes are specified to the OS in physical pixels, hence to ensure a\n  // consistent size this function will scale the inputted width and height as\n  // as appropriate for the default monitor. The window is invisible until\n  // |Show| is called. Returns true if the window was created successfully.\n  bool Create(const std::wstring& title, const Point& origin, const Size& size);\n\n  // Show the current window. Returns true if the window was successfully shown.\n  bool Show();\n\n  // Release OS resources associated with window.\n  void Destroy();\n\n  // Inserts |content| into the window tree.\n  void SetChildContent(HWND content);\n\n  // Returns the backing Window handle to enable clients to set icon and other\n  // window properties. Returns nullptr if the window has been destroyed.\n  HWND GetHandle();\n\n  // If true, closing this window will quit the application.\n  void SetQuitOnClose(bool quit_on_close);\n\n  // Return a RECT representing the bounds of the current client area.\n  RECT GetClientArea();\n\n protected:\n  // Processes and route salient window messages for mouse handling,\n  // size change and DPI. Delegates handling of these to member overloads that\n  // inheriting classes can handle.\n  virtual LRESULT MessageHandler(HWND window,\n                                 UINT const message,\n                                 WPARAM const wparam,\n                                 LPARAM const lparam) noexcept;\n\n  // Called when CreateAndShow is called, allowing subclass window-related\n  // setup. Subclasses should return false if setup fails.\n  virtual bool OnCreate();\n\n  // Called when Destroy is called.\n  virtual void OnDestroy();\n\n private:\n  friend class WindowClassRegistrar;\n\n  // OS callback called by message pump. Handles the WM_NCCREATE message which\n  // is passed when the non-client area is being created and enables automatic\n  // non-client DPI scaling so that the non-client area automatically\n  // responds to changes in DPI. All other messages are handled by\n  // MessageHandler.\n  static LRESULT CALLBACK WndProc(HWND const window,\n                                  UINT const message,\n                                  WPARAM const wparam,\n                                  LPARAM const lparam) noexcept;\n\n  // Retrieves a class instance pointer for |window|\n  static Win32Window* GetThisFromHandle(HWND const window) noexcept;\n\n  // Update the window frame's theme to match the system theme.\n  static void UpdateTheme(HWND const window);\n\n  bool quit_on_close_ = false;\n\n  // window handle for top level window.\n  HWND window_handle_ = nullptr;\n\n  // window handle for hosted content.\n  HWND child_content_ = nullptr;\n};\n\n#endif  // RUNNER_WIN32_WINDOW_H_\n"
  }
]